Jacek Caban : jscript: Correctly handle NaN and Infinity in to_int32 and to_uint32.

Alexandre Julliard julliard at winehq.org
Fri Dec 4 09:11:27 CST 2009


Module: wine
Branch: master
Commit: efda5561d01c68f54c27b4c0ab9558ab09dbc085
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=efda5561d01c68f54c27b4c0ab9558ab09dbc085

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Dec  4 02:56:04 2009 +0100

jscript: Correctly handle NaN and Infinity in to_int32 and to_uint32.

---

 dlls/jscript/jsutils.c     |   10 ++++++++--
 dlls/jscript/tests/lang.js |   12 ++++++++++++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index 80cce59..304980d 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -467,7 +467,10 @@ HRESULT to_int32(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, INT *ret)
     if(FAILED(hres))
         return hres;
 
-    *ret = V_VT(&num) == VT_I4 ? V_I4(&num) : (INT)V_R8(&num);
+    if(V_VT(&num) == VT_I4)
+        *ret = V_I4(&num);
+    else
+        *ret = isnan(V_R8(&num)) || isinf(V_R8(&num)) ? 0 : (INT)V_R8(&num);
     return S_OK;
 }
 
@@ -481,7 +484,10 @@ HRESULT to_uint32(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, DWORD *ret)
     if(FAILED(hres))
         return hres;
 
-    *ret = V_VT(&num) == VT_I4 ? V_I4(&num) : (DWORD)V_R8(&num);
+    if(V_VT(&num) == VT_I4)
+        *ret = V_I4(&num);
+    else
+        *ret = isnan(V_R8(&num)) || isinf(V_R8(&num)) ? 0 : (DWORD)V_R8(&num);
     return S_OK;
 }
 
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index bd22c52..1359e05 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -346,6 +346,15 @@ tmp = -3.5 | 0;
 ok(tmp === -3, "-3.5 | 0 !== -3");
 ok(getVT(tmp) === "VT_I4", "getVT(3.5|0) = " + getVT(tmp));
 
+tmp = 0 | NaN;
+ok(tmp === 0, "0 | NaN = " + tmp);
+
+tmp = 0 | Infinity;
+ok(tmp === 0, "0 | NaN = " + tmp);
+
+tmp = 0 | (-Infinity);
+ok(tmp === 0, "0 | NaN = " + tmp);
+
 tmp = 10;
 ok((tmp |= 0x10) === 26, "tmp(10) |= 0x10 !== 26");
 ok(getVT(tmp) === "VT_I4", "getVT(tmp |= 10) = " + getVT(tmp));
@@ -380,6 +389,9 @@ ok(tmp === 2, "8 >> 2 = " + tmp);
 tmp = -64 >>> 4;
 ok(tmp === 0x0ffffffc, "-64 >>> 4 = " + tmp);
 
+tmp = 4 >>> NaN;
+ok(tmp === 4, "4 >>> NaN = " + tmp);
+
 tmp = 10;
 ok((tmp &= 8) === 8, "tmp(10) &= 8 !== 8");
 ok(getVT(tmp) === "VT_I4", "getVT(tmp &= 8) = " + getVT(tmp));




More information about the wine-cvs mailing list