Jacek Caban : jscript: Simplify pop_to_stat implementation.
Module: wine Branch: master Commit: b7bb16673c75ef3e5f49493aa9deeb0255f822bd URL: http://source.winehq.org/git/wine.git/?a=commit;h=b7bb16673c75ef3e5f49493aa9... Author: Jacek Caban <jacek(a)codeweavers.com> Date: Mon May 1 18:29:53 2017 +0200 jscript: Simplify pop_to_stat implementation. We no longer need to do stack pops before return expression evaluation. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/jscript/compile.c | 24 +++++++++--------------- dlls/jscript/tests/lang.js | 11 +++++++++++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c index fe3e043..3770767 100644 --- a/dlls/jscript/compile.c +++ b/dlls/jscript/compile.c @@ -1383,22 +1383,20 @@ static HRESULT compile_forin_statement(compiler_ctx_t *ctx, forin_statement_t *s return S_OK; } -static HRESULT pop_to_stat(compiler_ctx_t *ctx, BOOL var_stack, BOOL scope_stack, statement_ctx_t *stat_ctx) +static HRESULT pop_to_stat(compiler_ctx_t *ctx, statement_ctx_t *stat_ctx) { unsigned stack_pop = 0; statement_ctx_t *iter; for(iter = ctx->stat_ctx; iter != stat_ctx; iter = iter->next) { - if(scope_stack) { - if(iter->using_scope && !push_instr(ctx, OP_pop_scope)) - return E_OUTOFMEMORY; - if(iter->using_except && !push_instr(ctx, OP_pop_except)) - return E_OUTOFMEMORY; - } + if(iter->using_scope && !push_instr(ctx, OP_pop_scope)) + return E_OUTOFMEMORY; + if(iter->using_except && !push_instr(ctx, OP_pop_except)) + return E_OUTOFMEMORY; stack_pop += iter->stack_use; } - if(var_stack && stack_pop) { + if(stack_pop) { HRESULT hres; hres = push_instr_uint(ctx, OP_pop, stack_pop); @@ -1455,7 +1453,7 @@ static HRESULT compile_continue_statement(compiler_ctx_t *ctx, branch_statement_ } } - hres = pop_to_stat(ctx, TRUE, TRUE, pop_ctx); + hres = pop_to_stat(ctx, pop_ctx); if(FAILED(hres)) return hres; @@ -1492,7 +1490,7 @@ static HRESULT compile_break_statement(compiler_ctx_t *ctx, branch_statement_t * } } - hres = pop_to_stat(ctx, TRUE, TRUE, pop_ctx->next); + hres = pop_to_stat(ctx, pop_ctx->next); if(FAILED(hres)) return hres; @@ -1509,10 +1507,6 @@ static HRESULT compile_return_statement(compiler_ctx_t *ctx, expression_statemen return JS_E_MISPLACED_RETURN; } - hres = pop_to_stat(ctx, TRUE, FALSE, NULL); - if(FAILED(hres)) - return hres; - if(stat->expr) { hres = compile_expression(ctx, stat->expr, TRUE); if(FAILED(hres)) @@ -1521,7 +1515,7 @@ static HRESULT compile_return_statement(compiler_ctx_t *ctx, expression_statemen return E_OUTOFMEMORY; } - hres = pop_to_stat(ctx, FALSE, TRUE, NULL); + hres = pop_to_stat(ctx, NULL); if(FAILED(hres)) return hres; diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index c179265..01d41d5 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -264,6 +264,8 @@ ok(tmp === 3, "tmp = " + tmp); eval("testRes(); testRes()"); tmp = eval("3; if(false) {4;} else {};;;") ok(tmp === 3, "tmp = " + tmp); +tmp = eval("try { 1; } finally { 2; }") +ok(tmp === 2, "tmp = " + tmp); testNoRes(); testRes() && testRes(); @@ -1597,6 +1599,15 @@ tmp = (function() { })(); ok(tmp, "tmp = " + tmp); +tmp = (function() { + for(var iter in [1,2,3,4]) { + var ret = false; + with({ret: true}) + return ret; + } +})(); +ok(tmp, "tmp = " + tmp); + (function() { ok(typeof(func) === "function", "typeof(func) = " + typeof(func)); with(new Object()) {
participants (1)
-
Alexandre Julliard