[PATCH v2 2/8] vbscript: Store non-persistent code into the script dispatch object.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Wed Oct 30 07:57:20 CDT 2019
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
It's supposed to be local to the script dispatch and destroyed with it.
dlls/vbscript/compile.c | 3 ++-
dlls/vbscript/vbdisp.c | 5 +++++
dlls/vbscript/vbscript.c | 9 +++++++++
dlls/vbscript/vbscript.h | 1 +
4 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 417faf4..57d6dd2 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -1992,7 +1992,6 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli
ctx.code = NULL;
release_compiler(&ctx);
- list_add_tail(&script->code_list, &code->entry);
*ret = code;
return S_OK;
}
@@ -2019,6 +2018,8 @@ HRESULT compile_procedure(script_ctx_t *script, const WCHAR *src, const WCHAR *d
desc->next = script->procs;
script->procs = desc;
+ list_add_tail(&script->script_obj->code_list, &code->entry);
+
*ret = desc;
return S_OK;
}
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index 1dd6d4e..7859abf 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -616,6 +616,10 @@ static ULONG WINAPI ScriptDisp_Release(IDispatchEx *iface)
if(!ref) {
assert(!This->ctx);
+
+ while (!list_empty(&This->code_list))
+ release_vbscode(LIST_ENTRY(list_head(&This->code_list), vbscode_t, entry));
+
heap_free(This->ident_map);
heap_free(This);
}
@@ -827,6 +831,7 @@ HRESULT create_script_disp(script_ctx_t *ctx, ScriptDisp **ret)
script_disp->IDispatchEx_iface.lpVtbl = &ScriptDispVtbl;
script_disp->ref = 1;
script_disp->ctx = ctx;
+ list_init(&script_disp->code_list);
*ret = script_disp;
return S_OK;
diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c
index cff2ef5..a968f8d 100644
--- a/dlls/vbscript/vbscript.c
+++ b/dlls/vbscript/vbscript.c
@@ -94,6 +94,10 @@ static void exec_queued_code(script_ctx_t *ctx)
if(iter->pending_exec)
exec_global_code(ctx, iter, NULL);
}
+ LIST_FOR_EACH_ENTRY(iter, &ctx->script_obj->code_list, vbscode_t, entry) {
+ if(iter->pending_exec)
+ exec_global_code(ctx, iter, NULL);
+ }
}
IDispatch *lookup_named_item(script_ctx_t *ctx, const WCHAR *name, unsigned flags)
@@ -794,6 +798,11 @@ static HRESULT WINAPI VBScriptParse_ParseScriptText(IActiveScriptParse *iface,
if(FAILED(hres))
return hres;
+ if(dwFlags & SCRIPTTEXT_ISPERSISTENT)
+ list_add_tail(&This->ctx->code_list, &code->entry);
+ else
+ list_add_tail(&This->ctx->script_obj->code_list, &code->entry);
+
if(context)
IDispatch_AddRef(code->context = context);
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index cfc9f65..2bcbb37 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -131,6 +131,7 @@ typedef struct {
unsigned ident_map_size;
script_ctx_t *ctx;
+ struct list code_list;
} ScriptDisp;
typedef struct _builtin_prop_t builtin_prop_t;
--
2.21.0
More information about the wine-devel
mailing list