[PATCH v5 4/7] vbscript: Append to the global lists when the code is executed, rather than compiled.

Gabriel Ivăncescu gabrielopcode at gmail.com
Thu Nov 7 07:28:14 CST 2019


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/vbscript/compile.c  | 91 +++++++++++++---------------------------
 dlls/vbscript/vbscript.c | 69 ++++++++++++++++++++++++++++++
 dlls/vbscript/vbscript.h |  3 ++
 3 files changed, 100 insertions(+), 63 deletions(-)

diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 40e8091..fd46af8 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -1787,6 +1787,7 @@ static HRESULT compile_class(compile_ctx_t *ctx, class_decl_t *class_decl)
 static BOOL lookup_script_identifier(script_ctx_t *script, const WCHAR *identifier)
 {
     class_desc_t *class;
+    vbscode_t *code;
     unsigned i;
 
     for(i = 0; i < script->global_vars_cnt; i++) {
@@ -1804,6 +1805,29 @@ static BOOL lookup_script_identifier(script_ctx_t *script, const WCHAR *identifi
             return TRUE;
     }
 
+    LIST_FOR_EACH_ENTRY(code, &script->code_list, vbscode_t, entry) {
+        dynamic_var_t *var;
+        function_t *func;
+
+        if(!code->pending_exec)
+            continue;
+
+        for(var = code->global_vars; var; var = var->next) {
+            if(!wcsicmp(var->name, identifier))
+                return TRUE;
+        }
+
+        for(func = code->funcs; func; func = func->next) {
+            if(!wcsicmp(func->name, identifier))
+                return TRUE;
+        }
+
+        for(class = code->classes; class; class = class->next) {
+            if(!wcsicmp(class->name, identifier))
+                return TRUE;
+        }
+    }
+
     return FALSE;
 }
 
@@ -1891,13 +1915,11 @@ static void release_compiler(compile_ctx_t *ctx)
 
 HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *delimiter, DWORD flags, vbscode_t **ret)
 {
-    function_t *new_func, *func_iter;
     function_decl_t *func_decl;
     class_decl_t *class_decl;
-    dynamic_var_t *var_iter;
+    function_t *new_func;
     compile_ctx_t ctx;
     vbscode_t *code;
-    size_t cnt;
     HRESULT hres;
 
     if (!src) src = L"";
@@ -1952,66 +1974,9 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli
         return compile_error(script, hres);
     }
 
-    cnt = script->global_vars_cnt;
-    for(var_iter = ctx.global_vars; var_iter; var_iter = var_iter->next)
-        cnt++;
-    if(cnt > script->global_vars_size) {
-        dynamic_var_t **new_vars;
-        if(script->global_vars)
-            new_vars = heap_realloc(script->global_vars, cnt * sizeof(*new_vars));
-        else
-            new_vars = heap_alloc(cnt * sizeof(*new_vars));
-        if(!new_vars)
-            return compile_error(script, E_OUTOFMEMORY);
-        script->global_vars = new_vars;
-        script->global_vars_size = cnt;
-    }
-
-    cnt = script->global_funcs_cnt;
-    for(func_iter = ctx.funcs; func_iter; func_iter = func_iter->next)
-        cnt++;
-    if(cnt > script->global_funcs_size) {
-        function_t **new_funcs;
-        if(script->global_funcs)
-            new_funcs = heap_realloc(script->global_funcs, cnt * sizeof(*new_funcs));
-        else
-            new_funcs = heap_alloc(cnt * sizeof(*new_funcs));
-        if(!new_funcs)
-            return compile_error(script, E_OUTOFMEMORY);
-        script->global_funcs = new_funcs;
-        script->global_funcs_size = cnt;
-    }
-
-    for(var_iter = ctx.global_vars; var_iter; var_iter = var_iter->next)
-        script->global_vars[script->global_vars_cnt++] = var_iter;
-
-    for(func_iter = ctx.funcs; func_iter; func_iter = func_iter->next) {
-        unsigned i;
-        for(i = 0; i < script->global_funcs_cnt; i++) {
-            if(!wcsicmp(script->global_funcs[i]->name, func_iter->name)) {
-                /* global function already exists, replace it */
-                script->global_funcs[i] = func_iter;
-                break;
-            }
-        }
-        if(i == script->global_funcs_cnt)
-            script->global_funcs[script->global_funcs_cnt++] = func_iter;
-    }
-
-    if(ctx.classes) {
-        class_desc_t *class = ctx.classes;
-
-        while(1) {
-            class->ctx = script;
-            if(!class->next)
-                break;
-            class = class->next;
-        }
-
-        class->next = script->classes;
-        script->classes = ctx.classes;
-        code->last_class = class;
-    }
+    code->global_vars = ctx.global_vars;
+    code->funcs = ctx.funcs;
+    code->classes = ctx.classes;
 
     if(TRACE_ON(vbscript_disas))
         dump_code(&ctx);
diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c
index 6c3da44..f55cd5b 100644
--- a/dlls/vbscript/vbscript.c
+++ b/dlls/vbscript/vbscript.c
@@ -82,6 +82,75 @@ static inline BOOL is_started(VBScript *This)
 
 static HRESULT exec_global_code(script_ctx_t *ctx, vbscode_t *code, VARIANT *res)
 {
+    dynamic_var_t *var_iter, **new_vars;
+    function_t *func_iter, **new_funcs;
+    size_t cnt, i;
+
+    cnt = ctx->global_vars_cnt;
+    for (var_iter = code->global_vars; var_iter; var_iter = var_iter->next)
+        cnt++;
+    if (cnt > ctx->global_vars_size)
+    {
+        if (ctx->global_vars)
+            new_vars = heap_realloc(ctx->global_vars, cnt * sizeof(*new_vars));
+        else
+            new_vars = heap_alloc(cnt * sizeof(*new_vars));
+        if (!new_vars)
+            return E_OUTOFMEMORY;
+        ctx->global_vars = new_vars;
+        ctx->global_vars_size = cnt;
+    }
+
+    cnt = ctx->global_funcs_cnt;
+    for (func_iter = code->funcs; func_iter; func_iter = func_iter->next)
+        cnt++;
+    if (cnt > ctx->global_funcs_size)
+    {
+        if (ctx->global_funcs)
+            new_funcs = heap_realloc(ctx->global_funcs, cnt * sizeof(*new_funcs));
+        else
+            new_funcs = heap_alloc(cnt * sizeof(*new_funcs));
+        if (!new_funcs)
+            return E_OUTOFMEMORY;
+        ctx->global_funcs = new_funcs;
+        ctx->global_funcs_size = cnt;
+    }
+
+    for (var_iter = code->global_vars; var_iter; var_iter = var_iter->next)
+        ctx->global_vars[ctx->global_vars_cnt++] = var_iter;
+
+    for (func_iter = code->funcs; func_iter; func_iter = func_iter->next)
+    {
+        for (i = 0; i < ctx->global_funcs_cnt; i++)
+        {
+            if (!wcsicmp(ctx->global_funcs[i]->name, func_iter->name))
+            {
+                /* global function already exists, replace it */
+                ctx->global_funcs[i] = func_iter;
+                break;
+            }
+        }
+        if (i == ctx->global_funcs_cnt)
+            ctx->global_funcs[ctx->global_funcs_cnt++] = func_iter;
+    }
+
+    if (code->classes)
+    {
+        class_desc_t *class = code->classes;
+
+        while (1)
+        {
+            class->ctx = ctx;
+            if (!class->next)
+                break;
+            class = class->next;
+        }
+
+        class->next = ctx->classes;
+        ctx->classes = code->classes;
+        code->last_class = class;
+    }
+
     code->pending_exec = FALSE;
     return exec_script(ctx, TRUE, &code->main_code, NULL, NULL, res);
 }
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index 04a9b83..efc3585 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -350,6 +350,9 @@ struct _vbscode_t {
     unsigned bstr_cnt;
     heap_pool_t heap;
 
+    dynamic_var_t *global_vars;
+    function_t *funcs;
+    class_desc_t *classes;
     class_desc_t *last_class;
 
     struct list entry;
-- 
2.21.0




More information about the wine-devel mailing list