Gabriel Ivăncescu : vbscript: Implement script persistence.

Alexandre Julliard julliard at winehq.org
Fri Nov 8 17:25:25 CST 2019


Module: wine
Branch: master
Commit: e2eb099a943f82f18a9efeea5a6175ccb88680de
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e2eb099a943f82f18a9efeea5a6175ccb88680de

Author: Gabriel Ivăncescu <gabrielopcode at 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 at gmail.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
 };
 




More information about the wine-cvs mailing list