From ec6411a7fca04c41b843f4776a481d712bd4952b Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 17 Sep 2008 23:31:02 +0200 Subject: [PATCH] jscript: Added '|' expression implementation. --- dlls/jscript/engine.c | 29 ++++++++++++++++++++++++++--- dlls/jscript/jscript.h | 1 + dlls/jscript/jsutils.c | 14 ++++++++++++++ dlls/jscript/tests/lang.js | 12 ++++++++++++ 4 files changed, 53 insertions(+), 3 deletions(-) diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index ab9f434c94..fc4c1df650 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -1484,10 +1484,33 @@ HRESULT logical_and_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD return S_OK; } -HRESULT binary_or_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 bitor_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_or_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, bitor_eval, ei, ret); } HRESULT binary_xor_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 4b384c73db..7c0c07b20d 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -140,6 +140,7 @@ HRESULT create_number(script_ctx_t*,VARIANT*,DispatchEx**); HRESULT to_primitive(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*); HRESULT to_boolean(VARIANT*,VARIANT_BOOL*); HRESULT to_number(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*); +HRESULT to_int32(script_ctx_t*,VARIANT*,jsexcept_t*,INT*); HRESULT to_string(script_ctx_t*,VARIANT*,jsexcept_t*,BSTR*); HRESULT to_object(exec_ctx_t*,VARIANT*,IDispatch**); diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c index 616369e6f5..09eed5b158 100644 --- a/dlls/jscript/jsutils.c +++ b/dlls/jscript/jsutils.c @@ -231,6 +231,20 @@ HRESULT to_number(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret) return S_OK; } +/* ECMA-262 3rd Edition 9.5 */ +HRESULT to_int32(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, INT *ret) +{ + VARIANT num; + HRESULT hres; + + hres = to_number(ctx, v, ei, &num); + if(FAILED(hres)) + return hres; + + *ret = V_VT(&num) == VT_I4 ? V_I4(&num) : (INT)V_R8(&num); + return S_OK; +} + /* ECMA-262 3rd Edition 9.8 */ HRESULT to_string(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, BSTR *str) { diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index af865e57fd..c3362aa379 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -261,6 +261,18 @@ ok(tmp === "test", "true && \"test\" is not \"test\""); tmp = true && 0; ok(tmp === 0, "true && 0 is not 0"); +tmp = 3 | 4; +ok(tmp === 7, "3 | 4 !== 7"); +ok(getVT(tmp) === "VT_I4", "getVT(3|4) = " + getVT(tmp)); + +tmp = 3.5 | 0; +ok(tmp === 3, "3.5 | 0 !== 3"); +ok(getVT(tmp) === "VT_I4", "getVT(3.5|0) = " + getVT(tmp)); + +tmp = -3.5 | 0; +ok(tmp === -3, "-3.5 | 0 !== -3"); +ok(getVT(tmp) === "VT_I4", "getVT(3.5|0) = " + getVT(tmp)); + ok(1 < 3.4, "1 < 3.4 failed"); ok(!(3.4 < 1), "3.4 < 1"); ok("abc" < "abcd", "abc < abcd failed"); -- 2.32.0.93.g670b81a890