Module: wine Branch: master Commit: e2eb099a943f82f18a9efeea5a6175ccb88680de URL: https://source.winehq.org/git/wine.git/?a=commit;h=e2eb099a943f82f18a9efeea5...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Fri Nov 8 18:19:06 2019 +0100
vbscript: Implement script persistence.
Persistent code has to be re-executed if the script is uninitialized and then reinitialized and restarted.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/vbscript/compile.c | 5 ++++- dlls/vbscript/vbscript.c | 12 ++++++++++++ dlls/vbscript/vbscript.h | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c index 9c18e2bf27..de45961ad6 100644 --- a/dlls/vbscript/compile.c +++ b/dlls/vbscript/compile.c @@ -1997,8 +1997,11 @@ 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; }
+ code->is_persistent = (flags & SCRIPTTEXT_ISPERSISTENT) != 0; + if(TRACE_ON(vbscript_disas)) dump_code(&ctx);
@@ -2016,7 +2019,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 47fa4562f4..07763fa3d7 100644 --- a/dlls/vbscript/vbscript.c +++ b/dlls/vbscript/vbscript.c @@ -130,6 +130,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;
@@ -148,6 +149,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 9f14e147ba..04a9b8372d 100644 --- a/dlls/vbscript/vbscript.h +++ b/dlls/vbscript/vbscript.h @@ -341,6 +341,7 @@ struct _vbscode_t { BOOL option_explicit;
BOOL pending_exec; + BOOL is_persistent; function_t main_code; IDispatch *context;
@@ -349,6 +350,8 @@ struct _vbscode_t { unsigned bstr_cnt; heap_pool_t heap;
+ class_desc_t *last_class; + struct list entry; };