[PATCH v4 06/10] vbscript: Implement script persistence.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Wed Nov 6 05:53:02 CST 2019
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>
---
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
More information about the wine-devel
mailing list