From 4f6f8ef2d8a196e565488daa96198835ac6df40e Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 16 Oct 2008 14:31:30 -0500 Subject: [PATCH] jscript: Added NaN handling to relational operators. --- dlls/jscript/engine.c | 31 +++++++++++++++++++------------ dlls/jscript/tests/lang.js | 12 ++++++++++++ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 9c539515d1f..815d5fd6667 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -16,6 +16,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "config.h" +#include "wine/port.h" + #include #include "jscript.h" @@ -2599,7 +2602,7 @@ HRESULT not_equal2_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD f } /* ECMA-262 3rd Edition 11.8.5 */ -static HRESULT less_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, BOOL *ret) +static HRESULT less_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, BOOL greater, jsexcept_t *ei, BOOL *ret) { VARIANT l, r, ln, rn; HRESULT hres; @@ -2615,7 +2618,7 @@ static HRESULT less_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept } if(V_VT(&l) == VT_BSTR && V_VT(&r) == VT_BSTR) { - *ret = strcmpW(V_BSTR(&l), V_BSTR(&r)) < 0; + *ret = (strcmpW(V_BSTR(&l), V_BSTR(&r)) < 0) ^ greater; SysFreeString(V_BSTR(&l)); SysFreeString(V_BSTR(&r)); return S_OK; @@ -2629,10 +2632,14 @@ static HRESULT less_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept if(FAILED(hres)) return hres; - if(V_VT(&ln) == VT_I4 && V_VT(&rn) == VT_I4) - *ret = V_I4(&ln) < V_I4(&rn); - else - *ret = num_val(&ln) < num_val(&rn); + if(V_VT(&ln) == VT_I4 && V_VT(&rn) == VT_I4) { + *ret = (V_I4(&ln) < V_I4(&rn)) ^ greater; + }else { + DOUBLE ld = num_val(&ln); + DOUBLE rd = num_val(&rn); + + *ret = !isnan(ld) && !isnan(rd) && ((ld < rd) ^ greater); + } return S_OK; } @@ -2651,7 +2658,7 @@ HRESULT less_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, if(FAILED(hres)) return hres; - hres = less_eval(ctx, &lval, &rval, ei, &b); + hres = less_eval(ctx, &lval, &rval, FALSE, ei, &b); VariantClear(&lval); VariantClear(&rval); if(FAILED(hres)) @@ -2674,13 +2681,13 @@ HRESULT lesseq_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags if(FAILED(hres)) return hres; - hres = less_eval(ctx, &rval, &lval, ei, &b); + hres = less_eval(ctx, &rval, &lval, TRUE, ei, &b); VariantClear(&lval); VariantClear(&rval); if(FAILED(hres)) return hres; - return return_bool(ret, !b); + return return_bool(ret, b); } /* ECMA-262 3rd Edition 11.8.2 */ @@ -2697,7 +2704,7 @@ HRESULT greater_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flag if(FAILED(hres)) return hres; - hres = less_eval(ctx, &rval, &lval, ei, &b); + hres = less_eval(ctx, &rval, &lval, FALSE, ei, &b); VariantClear(&lval); VariantClear(&rval); if(FAILED(hres)) @@ -2720,13 +2727,13 @@ HRESULT greatereq_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD fl if(FAILED(hres)) return hres; - hres = less_eval(ctx, &lval, &rval, ei, &b); + hres = less_eval(ctx, &lval, &rval, TRUE, ei, &b); VariantClear(&lval); VariantClear(&rval); if(FAILED(hres)) return hres; - return return_bool(ret, !b); + return return_bool(ret, b); } /* ECMA-262 3rd Edition 11.4.8 */ diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index bbafb6ecb4b..2b92d68167b 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -801,4 +801,16 @@ ok(isFinite(0.5, NaN) === true, "isFinite(0.5, NaN) !== true"); ok(isFinite(NaN, 0.5) === false, "isFinite(NaN, 0.5) !== false"); ok(isFinite() === false, "isFinite() !== false"); +ok((1 < NaN) === false, "(1 < NaN) !== false"); +ok((1 > NaN) === false, "(1 > NaN) !== false"); +ok((1 <= NaN) === false, "(1 <= NaN) !== false"); +ok((1 >= NaN) === false, "(1 >= NaN) !== false"); +ok((NaN < 1) === false, "(NaN < 1) !== false"); +ok((NaN > 1) === false, "(NaN > 1) !== false"); +ok((NaN <= 1) === false, "(NaN <= 1) !== false"); +ok((NaN >= 1) === false, "(NaN >= 1) !== false"); +ok((Infinity < 2) === false, "(Infinity < 2) !== false"); +ok((Infinity > 2) === true, "(Infinity > 2) !== true"); +ok((-Infinity < 2) === true, "(-Infinity < 2) !== true"); + reportSuccess(); -- 2.11.4.GIT