Jacek Caban : vbscript: Added interp_assign_ident implementation.

Alexandre Julliard julliard at winehq.org
Mon Sep 12 11:43:00 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Sep 12 12:33:03 2011 +0200

vbscript: Added interp_assign_ident implementation.

---

 dlls/vbscript/interp.c   |   38 ++++++++++++++++++++++++++++++++++++--
 dlls/vbscript/vbdisp.c   |   22 ++++++++++++++++++++++
 dlls/vbscript/vbscript.h |    1 +
 3 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index 1e84afa..4099642 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -217,10 +217,44 @@ static HRESULT interp_icallv(exec_ctx_t *ctx)
     return do_icall(ctx, NULL);
 }
 
+static HRESULT assign_ident(exec_ctx_t *ctx, BSTR name, VARIANT *val, BOOL own_val)
+{
+    ref_t ref;
+    HRESULT hres;
+
+    hres = lookup_identifier(ctx, name, &ref);
+    if(FAILED(hres))
+        return hres;
+
+    switch(ref.type) {
+    case REF_DISP:
+        hres = disp_propput(ctx->script, ref.u.d.disp, ref.u.d.id, val);
+        if(own_val)
+            VariantClear(val);
+        break;
+    case REF_NONE:
+        FIXME("%s not found\n", debugstr_w(name));
+        if(own_val)
+            VariantClear(val);
+        return DISP_E_UNKNOWNNAME;
+    }
+
+    return hres;
+}
+
 static HRESULT interp_assign_ident(exec_ctx_t *ctx)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    const BSTR arg = ctx->instr->arg1.bstr;
+    variant_val_t v;
+    HRESULT hres;
+
+    TRACE("%s\n", debugstr_w(arg));
+
+    hres = stack_pop_val(ctx, &v);
+    if(FAILED(hres))
+        return hres;
+
+    return assign_ident(ctx, arg, v.v, v.owned);
 }
 
 static HRESULT interp_ret(exec_ctx_t *ctx)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index c115199..9cfdab2 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -246,3 +246,25 @@ HRESULT disp_call(script_ctx_t *ctx, IDispatch *disp, DISPID id, DISPPARAMS *dp,
     IDispatchEx_Release(dispex);
     return hres;
 }
+
+HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, VARIANT *val)
+{
+    DISPID propput_dispid = DISPID_PROPERTYPUT;
+    DISPPARAMS dp  = {val, &propput_dispid, 1, 1};
+    IDispatchEx *dispex;
+    EXCEPINFO ei = {0};
+    HRESULT hres;
+
+    hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
+    if(SUCCEEDED(hres)) {
+        hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL /* FIXME! */);
+        IDispatchEx_Release(dispex);
+    }else {
+        ULONG err = 0;
+
+        TRACE("using IDispatch\n");
+        hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, &err);
+    }
+
+    return hres;
+}
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index 070fdbb..49b2cfa 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -63,6 +63,7 @@ typedef struct {
 
 HRESULT disp_get_id(IDispatch*,BSTR,DISPID*);
 HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,DISPPARAMS*,VARIANT*);
+HRESULT disp_propput(script_ctx_t*,IDispatch*,DISPID,VARIANT*);
 
 struct _script_ctx_t {
     IActiveScriptSite *site;




More information about the wine-cvs mailing list