Jacek Caban : jscript: Get value as VARIANT in prop_put.

Alexandre Julliard julliard at winehq.org
Mon Feb 8 11:06:05 CST 2010


Module: wine
Branch: master
Commit: 10c9931051158c7506c73b2c0162230db6e327b6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=10c9931051158c7506c73b2c0162230db6e327b6

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Feb  5 23:15:46 2010 +0100

jscript: Get value as VARIANT in prop_put.

---

 dlls/jscript/dispex.c |   71 +++++++++++++++++++++++++------------------------
 1 files changed, 36 insertions(+), 35 deletions(-)

diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index f2c22a9..c67fc41 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;
 }
 




More information about the wine-cvs mailing list