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