From 02ff8d18539455cfda8efa2c0b719e9998dea396 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 28 Dec 2011 12:06:17 +0100 Subject: [PATCH] jscript: Use bytecode for throw statement. --- dlls/jscript/compile.c | 14 ++++++++++++++ dlls/jscript/engine.c | 12 ++---------- dlls/jscript/engine.h | 2 +- dlls/jscript/parser.y | 2 +- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c index c02db254828..9e8cb471e15 100644 --- a/dlls/jscript/compile.c +++ b/dlls/jscript/compile.c @@ -1299,6 +1299,18 @@ static HRESULT compile_switch_statement(compiler_ctx_t *ctx, switch_statement_t return S_OK; } +/* ECMA-262 3rd Edition 12.13 */ +static HRESULT compile_throw_statement(compiler_ctx_t *ctx, expression_statement_t *stat) +{ + HRESULT hres; + + hres = compile_expression(ctx, stat->expr); + if(FAILED(hres)) + return hres; + + return push_instr(ctx, OP_throw) == -1 ? E_OUTOFMEMORY : S_OK; +} + static HRESULT compile_statement(compiler_ctx_t *ctx, statement_t *stat) { switch(stat->type) { @@ -1318,6 +1330,8 @@ static HRESULT compile_statement(compiler_ctx_t *ctx, statement_t *stat) return push_instr(ctx, OP_label) == -1 ? E_OUTOFMEMORY : S_OK; /* FIXME */ case STAT_SWITCH: return compile_switch_statement(ctx, (switch_statement_t*)stat); + case STAT_THROW: + return compile_throw_statement(ctx, (expression_statement_t*)stat); case STAT_VAR: return compile_var_statement(ctx, (var_statement_t*)stat); case STAT_WHILE: diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 5c4852b5c0c..b7b3248a1ef 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -1234,19 +1234,11 @@ HRESULT switch_statement_eval(script_ctx_t *ctx, statement_t *_stat, return_type } /* ECMA-262 3rd Edition 12.13 */ -HRESULT throw_statement_eval(script_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret) +static HRESULT interp_throw(exec_ctx_t *ctx) { - expression_statement_t *stat = (expression_statement_t*)_stat; - VARIANT val; - HRESULT hres; - TRACE("\n"); - hres = expr_eval(ctx, stat->expr, &rt->ei, &val); - if(FAILED(hres)) - return hres; - - rt->ei.var = val; + ctx->rt->ei.var = *stack_pop(ctx); return DISP_E_EXCEPTION; } diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h index 147bcadde5f..9aa56166e03 100644 --- a/dlls/jscript/engine.h +++ b/dlls/jscript/engine.h @@ -99,6 +99,7 @@ typedef struct _func_stack { X(rshift2, 1, 0,0) \ X(str, 1, ARG_STR, 0) \ X(this, 1, 0,0) \ + X(throw, 0, 0,0) \ X(throw_ref, 0, ARG_UINT, 0) \ X(throw_type, 0, ARG_UINT, ARG_STR) \ X(tonum, 1, 0,0) \ @@ -413,7 +414,6 @@ HRESULT break_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) HRESULT return_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN; HRESULT with_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN; HRESULT switch_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN; -HRESULT throw_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN; HRESULT try_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN; typedef struct { diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y index a1842028053..570eb5b55d7 100644 --- a/dlls/jscript/parser.y +++ b/dlls/jscript/parser.y @@ -847,7 +847,7 @@ static const statement_eval_t stat_eval_table[] = { compiled_statement_eval, return_statement_eval, compiled_statement_eval, - throw_statement_eval, + compiled_statement_eval, try_statement_eval, compiled_statement_eval, compiled_statement_eval,