Persistent code has to be re-executed if the script is uninitialized and then reinitialized and restarted. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> --- This patch uses a flag as suggested, to keep the ordering proper, since it is required. However, a separate list will also be needed later to tie its lifetime to the script dispatch object. dlls/vbscript/compile.c | 6 +++++- dlls/vbscript/vbscript.c | 12 ++++++++++++ dlls/vbscript/vbscript.h | 3 +++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c index 3f700a4..48f9073 100644 --- a/dlls/vbscript/compile.c +++ b/dlls/vbscript/compile.c @@ -2008,6 +2008,7 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli class->next = script->classes; script->classes = ctx.classes; + code->last_class = class; } if(TRACE_ON(vbscript_disas)) @@ -2016,6 +2017,9 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli ctx.code = NULL; release_compiler(&ctx); + if(flags & SCRIPTTEXT_ISPERSISTENT) + code->is_persistent = TRUE; + list_add_tail(&script->code_list, &code->entry); *ret = code; return S_OK; @@ -2027,7 +2031,7 @@ HRESULT compile_procedure(script_ctx_t *script, const WCHAR *src, const WCHAR *d vbscode_t *code; HRESULT hres; - hres = compile_script(script, src, delimiter, flags, &code); + hres = compile_script(script, src, delimiter, flags & ~SCRIPTTEXT_ISPERSISTENT, &code); if(FAILED(hres)) return hres; diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c index 31f2d79..9477757 100644 --- a/dlls/vbscript/vbscript.c +++ b/dlls/vbscript/vbscript.c @@ -157,6 +157,7 @@ IDispatch *lookup_named_item(script_ctx_t *ctx, const WCHAR *name, unsigned flag static void release_script(script_ctx_t *ctx) { + vbscode_t *code, *code_next; class_desc_t *class_desc; unsigned i; @@ -175,6 +176,17 @@ static void release_script(script_ctx_t *ctx) ctx->global_funcs_cnt = 0; ctx->global_funcs_size = 0; + LIST_FOR_EACH_ENTRY_SAFE(code, code_next, &ctx->code_list, vbscode_t, entry) + { + if(code->is_persistent) + { + code->pending_exec = TRUE; + if(code->last_class) code->last_class->next = NULL; + } + else + release_vbscode(code); + } + while(!list_empty(&ctx->named_items)) { named_item_t *iter = LIST_ENTRY(list_head(&ctx->named_items), named_item_t, entry); diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h index 71cf68b..0cb0626 100644 --- a/dlls/vbscript/vbscript.h +++ b/dlls/vbscript/vbscript.h @@ -340,6 +340,7 @@ struct _vbscode_t { BOOL option_explicit; BOOL pending_exec; + BOOL is_persistent; function_t main_code; IDispatch *context; @@ -348,6 +349,8 @@ struct _vbscode_t { unsigned bstr_cnt; heap_pool_t heap; + class_desc_t *last_class; + struct list entry; }; -- 2.21.0