Module: wine Branch: master Commit: ec6411a7fca04c41b843f4776a481d712bd4952b URL: http://source.winehq.org/git/wine.git/?a=commit;h=ec6411a7fca04c41b843f4776a...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Sep 17 23:31:02 2008 +0200
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 ab9f434..fc4c1df 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 4b384c7..7c0c07b 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 616369e..09eed5b 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 af865e5..c3362aa 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");