From 28013dfa6faf4655d653c22ae5349d4b5a3cdca1 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 8 Dec 2011 12:03:22 +0100 Subject: [PATCH] jscript: Use bytecode for '>>' expression. --- dlls/jscript/compile.c | 2 ++ dlls/jscript/engine.c | 23 +++++++++++++++++++++++ dlls/jscript/engine.h | 2 +- dlls/jscript/parser.y | 2 +- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c index 0acf483f106..2fa72759b70 100644 --- a/dlls/jscript/compile.c +++ b/dlls/jscript/compile.c @@ -689,6 +689,8 @@ static HRESULT compile_expression_noret(compiler_ctx_t *ctx, expression_t *expr, return compile_increment_expression(ctx, (unary_expression_t*)expr, OP_preinc, -1); case EXPR_PREINC: return compile_increment_expression(ctx, (unary_expression_t*)expr, OP_preinc, 1); + case EXPR_RSHIFT: + return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_rshift); case EXPR_SUB: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_sub); case EXPR_THIS: diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 81033f2470f..f6b9762fd13 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -174,6 +174,11 @@ static inline HRESULT stack_pop_int(exec_ctx_t *ctx, INT *r) return to_int32(ctx->parser->script, stack_pop(ctx), &ctx->ei, r); } +static inline HRESULT stack_pop_uint(exec_ctx_t *ctx, DWORD *r) +{ + return to_uint32(ctx->parser->script, stack_pop(ctx), &ctx->ei, r); +} + static inline IDispatch *stack_pop_objid(exec_ctx_t *ctx, DISPID *id) { assert(V_VT(stack_top(ctx)) == VT_INT && V_VT(stack_topn(ctx, 1)) == VT_DISPATCH); @@ -3134,6 +3139,24 @@ static HRESULT rshift_eval(script_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsex return S_OK; } +/* ECMA-262 3rd Edition 11.7.2 */ +static HRESULT interp_rshift(exec_ctx_t *ctx) +{ + DWORD r; + INT l; + HRESULT hres; + + hres = stack_pop_uint(ctx, &r); + if(FAILED(hres)) + return hres; + + hres = stack_pop_int(ctx, &l); + if(FAILED(hres)) + return hres; + + return stack_push_int(ctx, l >> (r&0x1f)); +} + /* ECMA-262 3rd Edition 11.7.2 */ HRESULT right_shift_expression_eval(script_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) { diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h index 9758377b685..504462c4d8e 100644 --- a/dlls/jscript/engine.h +++ b/dlls/jscript/engine.h @@ -82,6 +82,7 @@ typedef struct _func_stack { X(postinc, 1, ARG_INT, 0) \ X(preinc, 1, ARG_INT, 0) \ X(regexp, 1, ARG_STR, ARG_INT) \ + X(rshift, 1, 0,0) \ X(str, 1, ARG_STR, 0) \ X(this, 1, 0,0) \ X(throw, 0, ARG_UINT, 0) \ @@ -566,7 +567,6 @@ HRESULT instanceof_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t* HRESULT delete_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; HRESULT typeof_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; HRESULT left_shift_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; -HRESULT right_shift_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; HRESULT right2_shift_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; HRESULT assign_lshift_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; HRESULT assign_rshift_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y index 6a973070ca0..5d42ef05401 100644 --- a/dlls/jscript/parser.y +++ b/dlls/jscript/parser.y @@ -1337,7 +1337,7 @@ static const expression_eval_t expression_eval_table[] = { compiled_expression_eval, compiled_expression_eval, left_shift_expression_eval, - right_shift_expression_eval, + compiled_expression_eval, right2_shift_expression_eval, compiled_expression_eval, assign_lshift_expression_eval,