Module: wine Branch: master Commit: 2083935c649f38f5b881d907d5999ce923b5c1d6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2083935c649f38f5b881d907d5...
Author: Jacek Caban jacek@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;