Jacek Caban : jscript: Don't realloc interpreter stack.

Alexandre Julliard julliard at winehq.org
Thu Jun 4 16:08:02 CDT 2020


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jun  4 17:28:56 2020 +0200

jscript: Don't realloc interpreter stack.

We share the stack for all calls in script instance, so it no loner
makes sense.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/engine.c  | 27 ++++++++++-----------------
 dlls/jscript/jscript.h |  1 -
 2 files changed, 10 insertions(+), 18 deletions(-)

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index c39c59e3ab..548bc2560c 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -62,25 +62,12 @@ typedef struct {
     } u;
 } exprval_t;
 
+static const size_t stack_size = 0x4000;
+
 static HRESULT stack_push(script_ctx_t *ctx, jsval_t v)
 {
-    if(!ctx->stack_size) {
-        ctx->stack = heap_alloc(16*sizeof(*ctx->stack));
-        if(!ctx->stack)
-            return E_OUTOFMEMORY;
-        ctx->stack_size = 16;
-    }else if(ctx->stack_size == ctx->stack_top) {
-        jsval_t *new_stack;
-
-        new_stack = heap_realloc(ctx->stack, ctx->stack_size*2*sizeof(*new_stack));
-        if(!new_stack) {
-            jsval_release(v);
-            return E_OUTOFMEMORY;
-        }
-
-        ctx->stack = new_stack;
-        ctx->stack_size *= 2;
-    }
+    if(ctx->stack_top == stack_size)
+        return E_OUTOFMEMORY;
 
     ctx->stack[ctx->stack_top++] = v;
     return S_OK;
@@ -3006,6 +2993,12 @@ HRESULT exec_source(script_ctx_t *ctx, DWORD flags, bytecode_t *bytecode, functi
     unsigned i;
     HRESULT hres;
 
+    if(!ctx->stack) {
+        ctx->stack = heap_alloc(stack_size * sizeof(*ctx->stack));
+        if(!ctx->stack)
+            return E_OUTOFMEMORY;
+    }
+
     if(bytecode->named_item) {
         if(!bytecode->named_item->script_obj) {
             hres = create_named_item_script_obj(ctx, bytecode->named_item);
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 40b9f794ae..2a2250d3e9 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -425,7 +425,6 @@ struct _script_ctx_t {
     heap_pool_t tmp_heap;
 
     jsval_t *stack;
-    unsigned stack_size;
     unsigned stack_top;
     jsval_t acc;
 




More information about the wine-cvs mailing list