Jacek Caban : vbscript: Directly access 'this' object properties in interpreter.
Alexandre Julliard
julliard at winehq.org
Fri Mar 7 11:02:58 CST 2014
Module: wine
Branch: master
Commit: 70628f80c0a52e2051c6a154ecfbb9394ca239f5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=70628f80c0a52e2051c6a154ecfbb9394ca239f5
Author: Jacek Caban <jacek at 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 {
More information about the wine-cvs
mailing list