[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