Module: wine Branch: master Commit: 70628f80c0a52e2051c6a154ecfbb9394ca239f5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=70628f80c0a52e2051c6a154ec...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Mar 7 14:27:35 2014 +0100
vbscript: Directly access 'this' object properties in interpreter.
---
dlls/vbscript/interp.c | 24 +++++++++++++++++++----- dlls/vbscript/tests/lang.vbs | 16 ++++++++-------- dlls/vbscript/vbdisp.c | 8 ++++---- dlls/vbscript/vbscript.h | 2 +- 4 files changed, 32 insertions(+), 18 deletions(-)
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index 75e17af..8f55563 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -32,6 +32,7 @@ typedef struct { script_ctx_t *script; function_t *func; IDispatch *this_obj; + vbdisp_t *vbthis;
VARIANT *args; VARIANT *vars; @@ -132,6 +133,17 @@ static HRESULT lookup_identifier(exec_ctx_t *ctx, BSTR name, vbdisp_invoke_type_ return S_OK;
if(ctx->func->type != FUNC_GLOBAL) { + if(ctx->vbthis) { + /* FIXME: Bind such identifier while generating bytecode. */ + for(i=0; i < ctx->vbthis->desc->prop_cnt; i++) { + if(!strcmpiW(ctx->vbthis->desc->props[i].name, name)) { + ref->type = REF_VAR; + ref->u.v = ctx->vbthis->props+i; + return S_OK; + } + } + } + hres = disp_get_id(ctx->this_obj, name, invoke_type, TRUE, &id); if(SUCCEEDED(hres)) { ref->type = REF_DISP; @@ -1986,7 +1998,7 @@ static void release_exec(exec_ctx_t *ctx) heap_free(ctx->stack); }
-HRESULT exec_script(script_ctx_t *ctx, function_t *func, IDispatch *this_obj, DISPPARAMS *dp, VARIANT *res) +HRESULT exec_script(script_ctx_t *ctx, function_t *func, vbdisp_t *vbthis, DISPPARAMS *dp, VARIANT *res) { exec_ctx_t exec = {func->code_ctx}; vbsop_t op; @@ -2048,12 +2060,14 @@ HRESULT exec_script(script_ctx_t *ctx, function_t *func, IDispatch *this_obj, DI return E_OUTOFMEMORY; }
- if(this_obj) - exec.this_obj = this_obj; - else if (ctx->host_global) + if(vbthis) { + exec.this_obj = (IDispatch*)&vbthis->IDispatchEx_iface; + exec.vbthis = vbthis; + }else if (ctx->host_global) { exec.this_obj = ctx->host_global; - else + }else { exec.this_obj = (IDispatch*)&ctx->script_obj->IDispatchEx_iface; + } IDispatch_AddRef(exec.this_obj);
exec.instr = exec.code->instrs + func->code_off; diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index 5d2b774..4c444f2 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -814,8 +814,8 @@ Class TestClass Public Sub Class_Initialize publicProp2 = 2 privateProp = true - 'todo_wine Call ok(getVT(privateProp) = "VT_BOOL*", "getVT(privateProp) = " & getVT(privateProp)) - 'todo_wine Call ok(getVT(publicProp2) = "VT_I2*", "getVT(publicProp2) = " & getVT(publicProp2)) + Call ok(getVT(privateProp) = "VT_BOOL*", "getVT(privateProp) = " & getVT(privateProp)) + Call ok(getVT(publicProp2) = "VT_I2*", "getVT(publicProp2) = " & getVT(publicProp2)) Call ok(getVT(Me.publicProp2) = "VT_I2", "getVT(Me.publicProp2) = " & getVT(Me.publicProp2)) End Sub End Class @@ -1054,12 +1054,12 @@ Class ArrClass Dim var
Private Sub Class_Initialize - 'todo_wine Call ok(getVT(classarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(classarr) = " & getVT(classarr)) - 'todo_wine Call testArray(-1, classnoarr) - 'classarr(0) = 1 - 'classarr(1) = 2 - 'classarr(2) = 3 - 'classarr(3) = 4 + Call ok(getVT(classarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(classarr) = " & getVT(classarr)) + Call testArray(-1, classnoarr) + classarr(0) = 1 + classarr(1) = 2 + classarr(2) = 3 + classarr(3) = 4 End Sub End Class
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index 351fcf8..e902e00 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -233,7 +233,7 @@ static BOOL run_terminator(vbdisp_t *This)
This->ref++; exec_script(This->desc->ctx, This->desc->funcs[This->desc->class_terminate_id].entries[VBDISP_CALLGET], - (IDispatch*)&This->IDispatchEx_iface, &dp, NULL); + This, &dp, NULL); return !--This->ref; }
@@ -397,7 +397,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc return DISP_E_MEMBERNOTFOUND; }
- return exec_script(This->desc->ctx, func, (IDispatch*)&This->IDispatchEx_iface, pdp, pvarRes); + return exec_script(This->desc->ctx, func, This, pdp, pvarRes); case DISPATCH_PROPERTYPUT: { VARIANT *put_val; DISPPARAMS dp = {NULL, NULL, 1, 0}; @@ -420,7 +420,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc return DISP_E_MEMBERNOTFOUND; }
- return exec_script(This->desc->ctx, func, (IDispatch*)&This->IDispatchEx_iface, &dp, NULL); + return exec_script(This->desc->ctx, func, This, &dp, NULL); } default: FIXME("flags %x\n", wFlags); @@ -562,7 +562,7 @@ HRESULT create_vbdisp(const class_desc_t *desc, vbdisp_t **ret) if(SUCCEEDED(hres) && desc->class_initialize_id) { DISPPARAMS dp = {0}; hres = exec_script(desc->ctx, desc->funcs[desc->class_initialize_id].entries[VBDISP_CALLGET], - (IDispatch*)&vbdisp->IDispatchEx_iface, &dp, NULL); + vbdisp, &dp, NULL); }
if(FAILED(hres)) { diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h index 051d37a..94139bb 100644 --- a/dlls/vbscript/vbscript.h +++ b/dlls/vbscript/vbscript.h @@ -347,7 +347,7 @@ struct _vbscode_t {
void release_vbscode(vbscode_t*) DECLSPEC_HIDDEN; HRESULT compile_script(script_ctx_t*,const WCHAR*,const WCHAR*,vbscode_t**) DECLSPEC_HIDDEN; -HRESULT exec_script(script_ctx_t*,function_t*,IDispatch*,DISPPARAMS*,VARIANT*) DECLSPEC_HIDDEN; +HRESULT exec_script(script_ctx_t*,function_t*,vbdisp_t*,DISPPARAMS*,VARIANT*) DECLSPEC_HIDDEN; void release_dynamic_vars(dynamic_var_t*) DECLSPEC_HIDDEN;
typedef struct {