Jacek Caban : jscript: Pass finally offset instead of catch ident to OP_push_except.

Alexandre Julliard julliard at winehq.org
Mon May 1 16:38:05 CDT 2017


Module: wine
Branch: master
Commit: 685cd437c9818b03e17393178f4beb7b0be61e52
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=685cd437c9818b03e17393178f4beb7b0be61e52

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon May  1 18:30:44 2017 +0200

jscript: Pass finally offset instead of catch ident to OP_push_except.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/compile.c |  7 +++++--
 dlls/jscript/engine.c  | 22 +++++++++++-----------
 dlls/jscript/engine.h  |  2 +-
 3 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c
index 6a818ac..f9f70f0 100644
--- a/dlls/jscript/compile.c
+++ b/dlls/jscript/compile.c
@@ -1690,7 +1690,7 @@ static HRESULT compile_try_statement(compiler_ctx_t *ctx, try_statement_t *stat)
 {
     statement_ctx_t try_ctx = {0, FALSE, TRUE}, catch_ctx = {0, TRUE, FALSE};
     statement_ctx_t finally_ctx = {2, FALSE, FALSE};
-    unsigned push_except;
+    unsigned push_except, finally_off = 0, catch_off = 0;
     BSTR ident;
     HRESULT hres;
 
@@ -1725,7 +1725,7 @@ static HRESULT compile_try_statement(compiler_ctx_t *ctx, try_statement_t *stat)
         if(!jmp_finally)
             return E_OUTOFMEMORY;
 
-        instr_ptr(ctx, push_except)->u.arg[0].uint = ctx->code_off;
+        catch_off = ctx->code_off;
 
         hres = push_instr_bstr(ctx, OP_enter_catch, ident);
         if(FAILED(hres))
@@ -1744,6 +1744,7 @@ static HRESULT compile_try_statement(compiler_ctx_t *ctx, try_statement_t *stat)
     }
 
     if(stat->finally_statement) {
+        finally_off = ctx->code_off;
         hres = compile_statement(ctx, stat->catch_block ? NULL : &finally_ctx, stat->finally_statement);
         if(FAILED(hres))
             return hres;
@@ -1752,6 +1753,8 @@ static HRESULT compile_try_statement(compiler_ctx_t *ctx, try_statement_t *stat)
             return E_OUTOFMEMORY;
     }
 
+    instr_ptr(ctx, push_except)->u.arg[0].uint = catch_off;
+    instr_ptr(ctx, push_except)->u.arg[1].uint = finally_off;
     return S_OK;
 }
 
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 4aee171..d012d7c 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -41,7 +41,7 @@ struct _except_frame_t {
     unsigned stack_top;
     scope_chain_t *scope;
     unsigned catch_off;
-    BSTR ident;
+    unsigned finally_off;
 
     except_frame_t *next;
 };
@@ -897,8 +897,8 @@ static HRESULT interp_throw_type(script_ctx_t *ctx)
 /* ECMA-262 3rd Edition    12.14 */
 static HRESULT interp_push_except(script_ctx_t *ctx)
 {
-    const unsigned arg1 = get_op_uint(ctx, 0);
-    const BSTR arg2 = get_op_bstr(ctx, 1);
+    const unsigned catch_off = get_op_uint(ctx, 0);
+    const unsigned finally_off = get_op_uint(ctx, 1);
     call_frame_t *frame = ctx->call_ctx;
     except_frame_t *except;
     unsigned stack_top;
@@ -907,7 +907,7 @@ static HRESULT interp_push_except(script_ctx_t *ctx)
 
     stack_top = ctx->stack_top;
 
-    if(!arg2) {
+    if(!catch_off) {
         HRESULT hres;
 
         hres = stack_push(ctx, jsval_bool(TRUE));
@@ -924,8 +924,8 @@ static HRESULT interp_push_except(script_ctx_t *ctx)
 
     except->stack_top = stack_top;
     except->scope = frame->scope;
-    except->catch_off = arg1;
-    except->ident = arg2;
+    except->catch_off = catch_off;
+    except->finally_off = finally_off;
     except->next = frame->except_frame;
     frame->except_frame = except;
     return S_OK;
@@ -2657,7 +2657,7 @@ static HRESULT unwind_exception(script_ctx_t *ctx, HRESULT exception_hres)
     except_frame_t *except_frame;
     call_frame_t *frame;
     jsval_t except_val;
-    BSTR ident;
+    unsigned catch_off;
     HRESULT hres;
 
     for(frame = ctx->call_ctx; !frame->except_frame; frame = ctx->call_ctx) {
@@ -2675,7 +2675,7 @@ static HRESULT unwind_exception(script_ctx_t *ctx, HRESULT exception_hres)
     }
 
     except_frame = frame->except_frame;
-    ident = except_frame->ident;
+    catch_off = except_frame->catch_off;
     frame->except_frame = except_frame->next;
 
     assert(except_frame->stack_top <= ctx->stack_top);
@@ -2684,8 +2684,8 @@ static HRESULT unwind_exception(script_ctx_t *ctx, HRESULT exception_hres)
     while(except_frame->scope != frame->scope)
         scope_pop(&frame->scope);
 
-    frame->ip = except_frame->catch_off;
-    if(ident) assert(frame->bytecode->instrs[frame->ip].op == OP_enter_catch);
+    frame->ip = catch_off ? catch_off : except_frame->finally_off;
+    if(catch_off) assert(frame->bytecode->instrs[frame->ip].op == OP_enter_catch);
 
     except_val = ctx->ei.val;
     ctx->ei.val = jsval_undefined();
@@ -2697,7 +2697,7 @@ static HRESULT unwind_exception(script_ctx_t *ctx, HRESULT exception_hres)
     if(FAILED(hres))
         return hres;
 
-    if(!ident)
+    if(!catch_off)
         hres = stack_push(ctx, jsval_bool(FALSE));
     return hres;
 }
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index bf74576..4992061 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -72,7 +72,7 @@
     X(pop_scope,  1, 0,0)                  \
     X(postinc,    1, ARG_INT,    0)        \
     X(preinc,     1, ARG_INT,    0)        \
-    X(push_except,1, ARG_ADDR,   ARG_BSTR) \
+    X(push_except,1, ARG_ADDR,   ARG_UINT) \
     X(push_ret,   1, 0,0)                  \
     X(push_scope, 1, 0,0)                  \
     X(regexp,     1, ARG_STR,    ARG_UINT) \




More information about the wine-cvs mailing list