jscript: Always use bytecode for try statement.
This commit is contained in:
parent
985c6a1943
commit
c6932d8069
|
@ -1432,12 +1432,10 @@ static HRESULT compile_try_statement(compiler_ctx_t *ctx, try_statement_t *stat)
|
|||
{
|
||||
statement_ctx_t try_ctx = {0, FALSE, TRUE, -1, -1}, catch_ctx = {0, TRUE, FALSE, -1, -1};
|
||||
statement_ctx_t finally_ctx = {2, FALSE, FALSE, -1, -1};
|
||||
unsigned off_backup, push_except;
|
||||
unsigned push_except;
|
||||
BSTR ident;
|
||||
HRESULT hres;
|
||||
|
||||
off_backup = ctx->code_off;
|
||||
|
||||
push_except = push_instr(ctx, OP_push_except);
|
||||
if(push_except == -1)
|
||||
return E_OUTOFMEMORY;
|
||||
|
@ -1456,11 +1454,6 @@ static HRESULT compile_try_statement(compiler_ctx_t *ctx, try_statement_t *stat)
|
|||
try_ctx.stack_use = 2;
|
||||
|
||||
hres = compile_statement(ctx, &try_ctx, stat->try_statement);
|
||||
if(hres == E_NOTIMPL) {
|
||||
ctx->code_off = off_backup;
|
||||
stat->stat.eval = try_statement_eval;
|
||||
return compile_interp_fallback(ctx, &stat->stat);
|
||||
}
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
|
@ -1477,11 +1470,6 @@ static HRESULT compile_try_statement(compiler_ctx_t *ctx, try_statement_t *stat)
|
|||
instr_ptr(ctx, push_except)->arg1.uint = ctx->code_off;
|
||||
|
||||
hres = compile_statement(ctx, &catch_ctx, stat->catch_block->statement);
|
||||
if(hres == E_NOTIMPL) {
|
||||
ctx->code_off = off_backup;
|
||||
stat->stat.eval = try_statement_eval;
|
||||
return compile_interp_fallback(ctx, &stat->stat);
|
||||
}
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
|
@ -1499,11 +1487,6 @@ static HRESULT compile_try_statement(compiler_ctx_t *ctx, try_statement_t *stat)
|
|||
return E_OUTOFMEMORY;
|
||||
|
||||
hres = compile_statement(ctx, stat->catch_block ? NULL : &finally_ctx, stat->finally_statement);
|
||||
if(hres == E_NOTIMPL) {
|
||||
ctx->code_off = off_backup;
|
||||
stat->stat.eval = try_statement_eval;
|
||||
return compile_interp_fallback(ctx, &stat->stat);
|
||||
}
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
|
|
|
@ -943,69 +943,6 @@ static HRESULT interp_throw_type(exec_ctx_t *ctx)
|
|||
return throw_type_error(ctx->parser->script, ctx->ei, hres, str);
|
||||
}
|
||||
|
||||
/* ECMA-262 3rd Edition 12.14 */
|
||||
static HRESULT catch_eval(script_ctx_t *ctx, catch_block_t *block, return_type_t *rt, VARIANT *ret)
|
||||
{
|
||||
jsdisp_t *var_disp;
|
||||
VARIANT ex, val;
|
||||
HRESULT hres;
|
||||
|
||||
ex = rt->ei.var;
|
||||
memset(&rt->ei, 0, sizeof(jsexcept_t));
|
||||
|
||||
hres = create_dispex(ctx, NULL, NULL, &var_disp);
|
||||
if(SUCCEEDED(hres)) {
|
||||
hres = jsdisp_propput_name(var_disp, block->identifier, &ex, &rt->ei, NULL/*FIXME*/);
|
||||
if(SUCCEEDED(hres)) {
|
||||
hres = scope_push(ctx->exec_ctx->scope_chain, var_disp, &ctx->exec_ctx->scope_chain);
|
||||
if(SUCCEEDED(hres)) {
|
||||
hres = stat_eval(ctx, block->statement, rt, &val);
|
||||
scope_pop(&ctx->exec_ctx->scope_chain);
|
||||
}
|
||||
}
|
||||
|
||||
jsdisp_release(var_disp);
|
||||
}
|
||||
|
||||
VariantClear(&ex);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
*ret = val;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/* ECMA-262 3rd Edition 12.14 */
|
||||
HRESULT try_statement_eval(script_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
|
||||
{
|
||||
try_statement_t *stat = (try_statement_t*)_stat;
|
||||
VARIANT val;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
hres = stat_eval(ctx, stat->try_statement, rt, &val);
|
||||
if(FAILED(hres)) {
|
||||
TRACE("EXCEPTION\n");
|
||||
if(!stat->catch_block)
|
||||
return hres;
|
||||
|
||||
hres = catch_eval(ctx, stat->catch_block, rt, &val);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
}
|
||||
|
||||
if(stat->finally_statement) {
|
||||
VariantClear(&val);
|
||||
hres = stat_eval(ctx, stat->finally_statement, rt, &val);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
}
|
||||
|
||||
*ret = val;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/* ECMA-262 3rd Edition 12.14 */
|
||||
static HRESULT interp_push_except(exec_ctx_t *ctx)
|
||||
{
|
||||
|
|
|
@ -417,7 +417,6 @@ HRESULT while_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*)
|
|||
HRESULT continue_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
|
||||
HRESULT break_statement_eval(script_ctx_t*,statement_t*,return_type_t*,VARIANT*) DECLSPEC_HIDDEN;
|
||||
HRESULT return_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 {
|
||||
enum {
|
||||
|
|
Loading…
Reference in New Issue