From d2de1d310375d0fa97ff7f5b0b0cb93e1eca8d6b Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 17 Sep 2008 23:31:38 +0200 Subject: [PATCH] jscript: Added '&' expression implementation. --- dlls/jscript/engine.c | 29 ++++++++++++++++++++++++++--- dlls/jscript/parser.y | 8 ++++---- dlls/jscript/tests/lang.js | 12 ++++++++++++ 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index ee394a3f52..975a9bde31 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -1519,10 +1519,33 @@ HRESULT binary_xor_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD fl return E_NOTIMPL; } -HRESULT binary_and_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +/* ECMA-262 3rd Edition 11.10 */ +static HRESULT bitand_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, VARIANT *retv) { - FIXME("\n"); - return E_NOTIMPL; + INT li, ri; + HRESULT hres; + + hres = to_int32(ctx->parser->script, lval, ei, &li); + if(FAILED(hres)) + return hres; + + hres = to_int32(ctx->parser->script, rval, ei, &ri); + if(FAILED(hres)) + return hres; + + V_VT(retv) = VT_I4; + V_I4(retv) = li&ri; + return S_OK; +} + +/* ECMA-262 3rd Edition 11.10 */ +HRESULT binary_and_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + binary_expression_t *expr = (binary_expression_t*)_expr; + + TRACE("\n"); + + return binary_expr_eval(ctx, expr, bitand_eval, ei, ret); } HRESULT instanceof_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y index 5cef648431..d8b876edfd 100644 --- a/dlls/jscript/parser.y +++ b/dlls/jscript/parser.y @@ -566,27 +566,27 @@ BitwiseORExpressionNoIn BitwiseXORExpression : BitwiseANDExpression { $$ = $1; } | BitwiseXORExpression '^' BitwiseANDExpression - { new_binary_expression(ctx, EXPR_BXOR, $1, $3); } + { $$ = new_binary_expression(ctx, EXPR_BXOR, $1, $3); } /* ECMA-262 3rd Edition 11.10 */ BitwiseXORExpressionNoIn : BitwiseANDExpressionNoIn { $$ = $1; } | BitwiseXORExpressionNoIn '^' BitwiseANDExpressionNoIn - { new_binary_expression(ctx, EXPR_BXOR, $1, $3); } + { $$ = new_binary_expression(ctx, EXPR_BXOR, $1, $3); } /* ECMA-262 3rd Edition 11.10 */ BitwiseANDExpression : EqualityExpression { $$ = $1; } | BitwiseANDExpression '&' EqualityExpression - { new_binary_expression(ctx, EXPR_BAND, $1, $3); } + { $$ = new_binary_expression(ctx, EXPR_BAND, $1, $3); } /* ECMA-262 3rd Edition 11.10 */ BitwiseANDExpressionNoIn : EqualityExpressionNoIn { $$ = $1; } | BitwiseANDExpressionNoIn '&' EqualityExpressionNoIn - { new_binary_expression(ctx, EXPR_BAND, $1, $3); } + { $$ = new_binary_expression(ctx, EXPR_BAND, $1, $3); } /* ECMA-262 3rd Edition 11.9 */ EqualityExpression diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index 9d645058cd..4cb42ecbbe 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -277,6 +277,18 @@ tmp = 10; ok((tmp |= 0x10) === 26, "tmp(10) |= 0x10 !== 26"); ok(getVT(tmp) === "VT_I4", "getVT(tmp |= 10) = " + getVT(tmp)); +tmp = 3 & 5; +ok(tmp === 1, "3 & 5 !== 1"); +ok(getVT(tmp) === "VT_I4", "getVT(3|5) = " + getVT(tmp)); + +tmp = 3.5 & 0xffff; +ok(tmp === 3, "3.5 & 0xffff !== 3 "); +ok(getVT(tmp) === "VT_I4", "getVT(3.5&0xffff) = " + getVT(tmp)); + +tmp = (-3.5) & 0xffffffff; +ok(tmp === -3, "-3.5 & 0xffff !== -3"); +ok(getVT(tmp) === "VT_I4", "getVT(3.5&0xffff) = " + getVT(tmp)); + ok(1 < 3.4, "1 < 3.4 failed"); ok(!(3.4 < 1), "3.4 < 1"); ok("abc" < "abcd", "abc < abcd failed");