Jacek Caban : jscript: Allow poping multiple stack values at the time.
Alexandre Julliard
julliard at winehq.org
Fri Dec 14 14:09:59 CST 2012
Module: wine
Branch: master
Commit: 0f0f76ce6badf9ab0d952b78fa846c05e2b81a44
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0f0f76ce6badf9ab0d952b78fa846c05e2b81a44
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Dec 14 11:06:43 2012 +0100
jscript: Allow poping multiple stack values at the time.
---
dlls/jscript/compile.c | 24 ++++++++++++------------
dlls/jscript/engine.c | 6 ++++--
dlls/jscript/engine.h | 2 +-
3 files changed, 17 insertions(+), 15 deletions(-)
diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c
index a3dab82..c37ec31 100644
--- a/dlls/jscript/compile.c
+++ b/dlls/jscript/compile.c
@@ -530,8 +530,9 @@ static HRESULT compile_conditional_expression(compiler_ctx_t *ctx, conditional_e
return E_OUTOFMEMORY;
set_arg_uint(ctx, jmp_false, ctx->code_off);
- if(!push_instr(ctx, OP_pop))
- return E_OUTOFMEMORY;
+ hres = push_instr_uint(ctx, OP_pop, 1);
+ if(FAILED(hres))
+ return hres;
hres = compile_expression(ctx, expr->false_expression, TRUE);
if(FAILED(hres))
@@ -1053,7 +1054,7 @@ static HRESULT compile_expression(compiler_ctx_t *ctx, expression_t *expr, BOOL
if(FAILED(hres))
return hres;
- return emit_ret || push_instr(ctx, OP_pop) ? S_OK : E_OUTOFMEMORY;
+ return emit_ret ? S_OK : push_instr_uint(ctx, OP_pop, 1);
}
static inline BOOL is_loop_statement(statement_type_t type)
@@ -1353,12 +1354,12 @@ static HRESULT pop_to_stat(compiler_ctx_t *ctx, BOOL var_stack, BOOL scope_stack
stack_pop += iter->stack_use;
}
- if(var_stack) {
- /* FIXME: optimize */
- while(stack_pop--) {
- if(!push_instr(ctx, OP_pop))
- return E_OUTOFMEMORY;
- }
+ if(var_stack && stack_pop) {
+ HRESULT hres;
+
+ hres = push_instr_uint(ctx, OP_pop, stack_pop);
+ if(FAILED(hres))
+ return hres;
}
return S_OK;
@@ -1579,12 +1580,11 @@ static HRESULT compile_switch_statement(compiler_ctx_t *ctx, switch_statement_t
}
if(SUCCEEDED(hres)) {
- if(push_instr(ctx, OP_pop)) {
+ hres = push_instr_uint(ctx, OP_pop, 1);
+ if(SUCCEEDED(hres)) {
default_jmp = push_instr(ctx, OP_jmp);
if(!default_jmp)
hres = E_OUTOFMEMORY;
- }else {
- hres = E_OUTOFMEMORY;
}
}
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index a7934fc..fbfa460 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -2339,9 +2339,11 @@ static HRESULT interp_jmp_z(exec_ctx_t *ctx)
static HRESULT interp_pop(exec_ctx_t *ctx)
{
- TRACE("\n");
+ const unsigned arg = get_op_uint(ctx, 0);
- stack_popn(ctx, 1);
+ TRACE("%u\n", arg);
+
+ stack_popn(ctx, arg);
return S_OK;
}
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index 3407c06..0e9ed3b 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -84,7 +84,7 @@ typedef struct {
X(null, 1, 0,0) \
X(obj_prop, 1, ARG_BSTR, 0) \
X(or, 1, 0,0) \
- X(pop, 1, 0,0) \
+ X(pop, 1, ARG_UINT, 0) \
X(pop_except, 1, 0,0) \
X(pop_scope, 1, 0,0) \
X(postinc, 1, ARG_INT, 0) \
More information about the wine-cvs
mailing list