Jacek Caban : jscript: Moved stack from execution context to script context.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Mar 28 09:12:35 CDT 2016
Module: wine
Branch: master
Commit: 0224f1829b34f260291e810706e69b7a1d6f0191
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0224f1829b34f260291e810706e69b7a1d6f0191
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Mar 25 17:49:24 2016 +0100
jscript: Moved stack from execution context to script context.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/jscript/engine.c | 42 ++++++++++++++++++------------------------
dlls/jscript/engine.h | 3 ---
dlls/jscript/jscript.c | 2 ++
dlls/jscript/jscript.h | 4 ++++
4 files changed, 24 insertions(+), 27 deletions(-)
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index d459939..c74aa75 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -61,15 +61,14 @@ typedef struct {
} u;
} exprval_t;
-static HRESULT stack_push(script_ctx_t *script_ctx, jsval_t v)
+static HRESULT stack_push(script_ctx_t *ctx, jsval_t v)
{
- exec_ctx_t *ctx = script_ctx->call_ctx->exec_ctx;
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->top) {
+ }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));
@@ -82,7 +81,7 @@ static HRESULT stack_push(script_ctx_t *script_ctx, jsval_t v)
ctx->stack_size *= 2;
}
- ctx->stack[ctx->top++] = v;
+ ctx->stack[ctx->stack_top++] = v;
return S_OK;
}
@@ -110,32 +109,28 @@ static HRESULT stack_push_objid(script_ctx_t *ctx, IDispatch *disp, DISPID id)
static inline jsval_t stack_top(script_ctx_t *ctx)
{
- exec_ctx_t *exec_ctx = ctx->call_ctx->exec_ctx;
- assert(exec_ctx->top > ctx->call_ctx->stack_base);
- return exec_ctx->stack[exec_ctx->top-1];
+ assert(ctx->stack_top > ctx->call_ctx->stack_base);
+ return ctx->stack[ctx->stack_top-1];
}
static inline jsval_t stack_topn(script_ctx_t *ctx, unsigned n)
{
- exec_ctx_t *exec_ctx = ctx->call_ctx->exec_ctx;
- assert(exec_ctx->top > ctx->call_ctx->stack_base+n);
- return exec_ctx->stack[exec_ctx->top-1-n];
+ assert(ctx->stack_top > ctx->call_ctx->stack_base+n);
+ return ctx->stack[ctx->stack_top-1-n];
}
-static inline jsval_t *stack_args(script_ctx_t *script_ctx, unsigned n)
+static inline jsval_t *stack_args(script_ctx_t *ctx, unsigned n)
{
- exec_ctx_t *ctx = script_ctx->call_ctx->exec_ctx;
if(!n)
return NULL;
- assert(ctx->top > script_ctx->call_ctx->stack_base+n-1);
- return ctx->stack + ctx->top-n;
+ assert(ctx->stack_top > ctx->call_ctx->stack_base+n-1);
+ return ctx->stack + ctx->stack_top-n;
}
static inline jsval_t stack_pop(script_ctx_t *ctx)
{
- exec_ctx_t *exec_ctx = ctx->call_ctx->exec_ctx;
- assert(exec_ctx->top > ctx->call_ctx->stack_base);
- return exec_ctx->stack[--exec_ctx->top];
+ assert(ctx->stack_top > ctx->call_ctx->stack_base);
+ return ctx->stack[--ctx->stack_top];
}
static void stack_popn(script_ctx_t *ctx, unsigned n)
@@ -355,7 +350,6 @@ void exec_release(exec_ctx_t *ctx)
if(ctx->script)
script_release(ctx->script);
jsval_release(ctx->ret);
- heap_free(ctx->stack);
heap_free(ctx);
}
@@ -778,7 +772,7 @@ static HRESULT interp_push_except(script_ctx_t *ctx)
TRACE("\n");
- stack_top = ctx->call_ctx->exec_ctx->top;
+ stack_top = ctx->stack_top;
if(!arg2) {
HRESULT hres;
@@ -2435,8 +2429,8 @@ static HRESULT unwind_exception(script_ctx_t *ctx)
except_frame = frame->except_frame;
frame->except_frame = except_frame->next;
- assert(except_frame->stack_top <= frame->exec_ctx->top);
- stack_popn(ctx, frame->exec_ctx->top - except_frame->stack_top);
+ assert(except_frame->stack_top <= ctx->stack_top);
+ stack_popn(ctx, ctx->stack_top - except_frame->stack_top);
while(except_frame->scope != frame->scope)
scope_pop(&frame->scope);
@@ -2509,10 +2503,10 @@ static HRESULT enter_bytecode(script_ctx_t *ctx, function_code_t *func, jsval_t
if(FAILED(hres)) {
while(frame->scope != frame->base_scope)
scope_pop(&frame->scope);
- stack_popn(ctx, exec_ctx->top-frame->stack_base);
+ stack_popn(ctx, ctx->stack_top-frame->stack_base);
}
- assert(exec_ctx->top == frame->stack_base);
+ assert(ctx->stack_top == frame->stack_base);
assert(frame->scope == frame->base_scope);
ctx->call_ctx = frame->prev_frame;
release_call_frame(frame);
@@ -2573,7 +2567,7 @@ static HRESULT setup_call_frame(exec_ctx_t *ctx, bytecode_t *bytecode, function_
frame->bytecode = bytecode;
frame->function = function;
frame->ip = function->instr_off;
- frame->stack_base = ctx->top;
+ frame->stack_base = ctx->script->stack_top;
if(scope)
frame->base_scope = frame->scope = scope_addref(scope);
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index 82ff4ed..6c738ebe 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -213,9 +213,6 @@ struct _exec_ctx_t {
IDispatch *this_obj;
BOOL is_global;
- jsval_t *stack;
- unsigned stack_size;
- unsigned top;
jsval_t ret;
};
diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index 13a5b47..c5c7705 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -74,6 +74,8 @@ void script_release(script_ctx_t *ctx)
heap_pool_free(&ctx->tmp_heap);
if(ctx->last_match)
jsstr_release(ctx->last_match);
+ assert(!ctx->stack_top);
+ heap_free(ctx->stack);
ctx->jscaller->ctx = NULL;
IServiceProvider_Release(&ctx->jscaller->IServiceProvider_iface);
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 18be0c1..1c7303e 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -400,6 +400,10 @@ struct _script_ctx_t {
IDispatch *host_global;
+ jsval_t *stack;
+ unsigned stack_size;
+ unsigned stack_top;
+
jsstr_t *last_match;
match_result_t match_parens[9];
DWORD last_match_index;
More information about the wine-cvs
mailing list