Jacek Caban : vbscript: Store only VBScript this objects in execution context.
Alexandre Julliard
julliard at winehq.org
Tue Nov 5 16:11:44 CST 2019
Module: wine
Branch: master
Commit: 708c1e865d8938973491fe44fcd25d658e218a71
URL: https://source.winehq.org/git/wine.git/?a=commit;h=708c1e865d8938973491fe44fcd25d658e218a71
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Nov 5 14:09:04 2019 +0100
vbscript: Store only VBScript this objects in execution context.
If it's an implicit this, we can handle that in interp_me.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/vbscript/interp.c | 24 +++++++++++++-----------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index a74c6c320e..211a5af5f8 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -31,7 +31,6 @@ typedef struct {
instr_t *instr;
script_ctx_t *script;
function_t *func;
- IDispatch *this_obj;
vbdisp_t *vbthis;
VARIANT *args;
@@ -1446,13 +1445,21 @@ static HRESULT interp_stop(exec_ctx_t *ctx)
static HRESULT interp_me(exec_ctx_t *ctx)
{
+ IDispatch *disp;
VARIANT v;
TRACE("\n");
- IDispatch_AddRef(ctx->this_obj);
+ if(ctx->vbthis)
+ disp = (IDispatch*)&ctx->vbthis->IDispatchEx_iface;
+ else if(ctx->script->host_global)
+ disp = ctx->script->host_global;
+ else
+ disp = (IDispatch*)&ctx->script->script_obj->IDispatchEx_iface;
+
+ IDispatch_AddRef(disp);
V_VT(&v) = VT_DISPATCH;
- V_DISPATCH(&v) = ctx->this_obj;
+ V_DISPATCH(&v) = disp;
return stack_push(ctx, &v);
}
@@ -2205,8 +2212,8 @@ static void release_exec(exec_ctx_t *ctx)
VariantClear(&ctx->ret_val);
release_dynamic_vars(ctx->dynamic_vars);
- if(ctx->this_obj)
- IDispatch_Release(ctx->this_obj);
+ if(ctx->vbthis)
+ IDispatchEx_Release(&ctx->vbthis->IDispatchEx_iface);
if(ctx->args) {
for(i=0; i < ctx->func->arg_cnt; i++)
@@ -2301,14 +2308,9 @@ HRESULT exec_script(script_ctx_t *ctx, BOOL extern_caller, function_t *func, vbd
IActiveScriptSite_OnEnterScript(ctx->site);
if(vbthis) {
- exec.this_obj = (IDispatch*)&vbthis->IDispatchEx_iface;
+ IDispatchEx_AddRef(&vbthis->IDispatchEx_iface);
exec.vbthis = vbthis;
- }else if (ctx->host_global) {
- exec.this_obj = ctx->host_global;
- }else {
- exec.this_obj = (IDispatch*)&ctx->script_obj->IDispatchEx_iface;
}
- IDispatch_AddRef(exec.this_obj);
exec.instr = exec.code->instrs + func->code_off;
exec.script = ctx;
More information about the wine-cvs
mailing list