[PATCH v2 1/2] jscript: implement Enumerator()
Nikolay Sivov
nsivov at codeweavers.com
Mon May 6 06:04:38 CDT 2019
On 5/5/19 6:10 PM, Andreas Maier wrote:
> + /* Try to get a IEnumVARIANT by _NewEnum */
> + hres = IDispatch_Invoke(obj,
> + DISPID_NEWENUM, &IID_NULL, LOCALE_NEUTRAL,
> + DISPATCH_METHOD, &dispparams, &varresult,
> + NULL, NULL);
> + if (FAILED(hres))
> + {
> + ERR("Enumerator: no DISPID_NEWENUM.\n");
> + hres = E_INVALIDARG;
> + goto cleanuperr;
> + }
> + if (V_VT(&varresult) == VT_DISPATCH)
> + {
> + enumvar = (IEnumVARIANT*)V_DISPATCH(&varresult);
> + VariantClear(&varresult);
> + }
> + else if (V_VT(&varresult) == VT_UNKNOWN)
> + {
> + hres = IUnknown_QueryInterface(V_UNKNOWN(&varresult),
> + &IID_IEnumVARIANT, (void**)&enumvar);
> + if (FAILED(hres))
> + {
> + hres = E_INVALIDARG;
> + goto cleanuperr;
> + }
> + enumvar = (IEnumVARIANT*)V_DISPATCH(&varresult);
> + VariantClear(&varresult);
> + }
> + else
> + {
> + ERR("Enumerator: NewEnum unexpected type of varresult (%d).\n", V_VT(&varresult));
> + hres = E_INVALIDARG;
> + goto cleanuperr;
> + }
This looks too complicated, you don't need to handle VT_UNKNOWN vs
VT_DISPATCH differently, simply QI for IEnumVARIANT when you got either
of those. Also you immediately free varresult after assigning it, that's
wrong; for VT_UNKNOWN case you overwrite QI result with same original
pointer.
Additionally, 'isnull' field seems to be redundant.
More information about the wine-devel
mailing list