From cf2fc11e318cfd165a5224a4b393dc57d72096aa Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 19 Dec 2011 14:59:51 +0100 Subject: [PATCH] jscript: Use compiler for handling if statement. --- dlls/jscript/compile.c | 43 ++++++++++++++++++++++++++++++++++++++++++ dlls/jscript/engine.c | 29 ---------------------------- dlls/jscript/engine.h | 1 - dlls/jscript/parser.y | 2 +- 4 files changed, 44 insertions(+), 31 deletions(-) diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c index b46ea59ca9b..9fdce33a0a1 100644 --- a/dlls/jscript/compile.c +++ b/dlls/jscript/compile.c @@ -882,6 +882,47 @@ static HRESULT compile_expression_statement(compiler_ctx_t *ctx, expression_stat return S_OK; } +/* ECMA-262 3rd Edition 12.5 */ +static HRESULT compile_if_statement(compiler_ctx_t *ctx, if_statement_t *stat) +{ + unsigned jmp_else, jmp_end; + HRESULT hres; + + hres = compile_expression(ctx, stat->expr); + if(FAILED(hres)) + return hres; + + jmp_else = push_instr(ctx, OP_jmp_z); + if(jmp_else == -1) + return E_OUTOFMEMORY; + + hres = compile_statement(ctx, stat->if_stat); + if(FAILED(hres)) + return hres; + + jmp_end = push_instr(ctx, OP_jmp); + if(jmp_end == -1) + return E_OUTOFMEMORY; + + instr_ptr(ctx, jmp_else)->arg1.uint = ctx->code_off; + + if(push_instr(ctx, OP_pop) == -1) + return E_OUTOFMEMORY; + + if(stat->else_stat) { + hres = compile_statement(ctx, stat->else_stat); + if(FAILED(hres)) + return hres; + }else { + /* FIXME: We could sometimes avoid it */ + if(push_instr(ctx, OP_undefined) == -1) + return E_OUTOFMEMORY; + } + + instr_ptr(ctx, jmp_end)->arg1.uint = ctx->code_off; + return S_OK; +} + static HRESULT compile_statement(compiler_ctx_t *ctx, statement_t *stat) { switch(stat->type) { @@ -889,6 +930,8 @@ static HRESULT compile_statement(compiler_ctx_t *ctx, statement_t *stat) return compile_block_statement(ctx, ((block_statement_t*)stat)->stat_list); case STAT_EXPR: return compile_expression_statement(ctx, (expression_statement_t*)stat); + case STAT_IF: + return compile_if_statement(ctx, (if_statement_t*)stat); default: return compile_interp_fallback(ctx, stat); } diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 664af868227..6ca10b3a395 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -712,35 +712,6 @@ HRESULT empty_statement_eval(script_ctx_t *ctx, statement_t *stat, return_type_t return S_OK; } -/* ECMA-262 3rd Edition 12.5 */ -HRESULT if_statement_eval(script_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret) -{ - if_statement_t *stat = (if_statement_t*)_stat; - VARIANT_BOOL b; - VARIANT v; - HRESULT hres; - - TRACE("\n"); - - hres = expr_eval(ctx, stat->expr, 0, &rt->ei, &v); - if(FAILED(hres)) - return hres; - - hres = to_boolean(&v, &b); - VariantClear(&v); - if(FAILED(hres)) - return hres; - - if(b) - hres = stat_eval(ctx, stat->if_stat, rt, ret); - else if(stat->else_stat) - hres = stat_eval(ctx, stat->else_stat, rt, ret); - else - V_VT(ret) = VT_EMPTY; - - return hres; -} - /* ECMA-262 3rd Edition 12.6.2 */ HRESULT while_statement_eval(script_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret) { diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h index 804713e593b..ebca7db5e20 100644 --- a/dlls/jscript/engine.h +++ b/dlls/jscript/engine.h @@ -400,7 +400,6 @@ typedef struct { HRESULT compiled_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN; HRESULT var_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN; HRESULT empty_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN; -HRESULT if_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN; HRESULT while_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN; HRESULT for_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN; HRESULT forin_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN; diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y index adbcb6eb95b..925b12d5c65 100644 --- a/dlls/jscript/parser.y +++ b/dlls/jscript/parser.y @@ -843,7 +843,7 @@ static const statement_eval_t stat_eval_table[] = { compiled_statement_eval, for_statement_eval, forin_statement_eval, - if_statement_eval, + compiled_statement_eval, labelled_statement_eval, return_statement_eval, switch_statement_eval,