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