From 10c9931051158c7506c73b2c0162230db6e327b6 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 5 Feb 2010 23:15:46 +0100 Subject: [PATCH] jscript: Get value as VARIANT in prop_put. --- dlls/jscript/dispex.c | 71 ++++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index f2c22a9b8c0..c67fc41c2c4 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -350,19 +350,19 @@ static HRESULT prop_get(DispatchEx *This, dispex_prop_t *prop, DISPPARAMS *dp, return hres; } -static HRESULT prop_put(DispatchEx *This, dispex_prop_t *prop, DISPPARAMS *dp, +static HRESULT prop_put(DispatchEx *This, dispex_prop_t *prop, VARIANT *val, jsexcept_t *ei, IServiceProvider *caller) { - DWORD i; HRESULT hres; switch(prop->type) { case PROP_BUILTIN: if(!(prop->flags & PROPF_METHOD)) { + DISPPARAMS dp = {val, NULL, 1, 0}; vdisp_t vthis; set_jsdisp(&vthis, This); - hres = prop->u.p->invoke(This->ctx, &vthis, DISPATCH_PROPERTYPUT, dp, NULL, ei, caller); + hres = prop->u.p->invoke(This->ctx, &vthis, DISPATCH_PROPERTYPUT, &dp, NULL, ei, caller); vdisp_release(&vthis); return hres; } @@ -379,24 +379,14 @@ static HRESULT prop_put(DispatchEx *This, dispex_prop_t *prop, DISPPARAMS *dp, return E_FAIL; } - for(i=0; i < dp->cNamedArgs; i++) { - if(dp->rgdispidNamedArgs[i] == DISPID_PROPERTYPUT) - break; - } - - if(i == dp->cNamedArgs) { - TRACE("no value to set\n"); - return DISP_E_PARAMNOTOPTIONAL; - } - - hres = VariantCopy(&prop->u.var, dp->rgvarg+i); + hres = VariantCopy(&prop->u.var, val); if(FAILED(hres)) return hres; if(This->builtin_info->on_put) This->builtin_info->on_put(This, prop->name); - TRACE("%s = %s\n", debugstr_w(prop->name), debugstr_variant(dp->rgvarg+i)); + TRACE("%s = %s\n", debugstr_w(prop->name), debugstr_variant(val)); return S_OK; } @@ -589,9 +579,22 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc case DISPATCH_PROPERTYGET: hres = prop_get(This, prop, pdp, pvarRes, &jsexcept, pspCaller); break; - case DISPATCH_PROPERTYPUT: - hres = prop_put(This, prop, pdp, &jsexcept, pspCaller); + case DISPATCH_PROPERTYPUT: { + DWORD i; + + for(i=0; i < pdp->cNamedArgs; i++) { + if(pdp->rgdispidNamedArgs[i] == DISPID_PROPERTYPUT) + break; + } + + if(i == pdp->cNamedArgs) { + TRACE("no value to set\n"); + return DISP_E_PARAMNOTOPTIONAL; + } + + hres = prop_put(This, prop, pdp->rgvarg+i, &jsexcept, pspCaller); break; + } default: FIXME("Unimplemented flags %x\n", wFlags); return E_INVALIDARG; @@ -941,8 +944,6 @@ HRESULT disp_call(script_ctx_t *ctx, IDispatch *disp, DISPID id, WORD flags, DIS HRESULT jsdisp_propput_name(DispatchEx *obj, const WCHAR *name, VARIANT *val, jsexcept_t *ei, IServiceProvider *caller) { - DISPID named_arg = DISPID_PROPERTYPUT; - DISPPARAMS dp = {val, &named_arg, 1, 1}; dispex_prop_t *prop; HRESULT hres; @@ -950,7 +951,7 @@ HRESULT jsdisp_propput_name(DispatchEx *obj, const WCHAR *name, VARIANT *val, js if(FAILED(hres)) return hres; - return prop_put(obj, prop, &dp, ei, caller); + return prop_put(obj, prop, val, ei, caller); } HRESULT jsdisp_propput_idx(DispatchEx *obj, DWORD idx, VARIANT *val, jsexcept_t *ei, IServiceProvider *caller) @@ -965,9 +966,6 @@ HRESULT jsdisp_propput_idx(DispatchEx *obj, DWORD idx, VARIANT *val, jsexcept_t HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, VARIANT *val, jsexcept_t *ei, IServiceProvider *caller) { - DISPID dispid = DISPID_PROPERTYPUT; - DISPPARAMS dp = {val, &dispid, 1, 1}; - IDispatchEx *dispex; DispatchEx *jsdisp; HRESULT hres; @@ -977,25 +975,28 @@ HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, VARIANT *val prop = get_prop(jsdisp, id); if(prop) - hres = prop_put(jsdisp, prop, &dp, ei, caller); + hres = prop_put(jsdisp, prop, val, ei, caller); else hres = DISP_E_MEMBERNOTFOUND; jsdisp_release(jsdisp); - return hres; - } - - hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); - if(FAILED(hres)) { - ULONG err = 0; + }else { + DISPID dispid = DISPID_PROPERTYPUT; + DISPPARAMS dp = {val, &dispid, 1, 1}; + IDispatchEx *dispex; + + hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); + if(SUCCEEDED(hres)) { + hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, DISPATCH_PROPERTYPUT, &dp, NULL, &ei->ei, caller); + IDispatchEx_Release(dispex); + }else { + ULONG err = 0; - TRACE("using IDispatch\n"); - return IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, DISPATCH_PROPERTYPUT, &dp, NULL, &ei->ei, &err); + TRACE("using IDispatch\n"); + hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, DISPATCH_PROPERTYPUT, &dp, NULL, &ei->ei, &err); + } } - hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, DISPATCH_PROPERTYPUT, &dp, NULL, &ei->ei, caller); - - IDispatchEx_Release(dispex); return hres; } -- 2.11.4.GIT