Jacek Caban : jscript: Better handling of to_integer result in Array.splice .

Alexandre Julliard julliard at winehq.org
Thu May 3 14:23:49 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu May  3 10:40:04 2012 +0200

jscript: Better handling of to_integer result in Array.splice.

---

 dlls/jscript/array.c      |   22 +++++++++++++---------
 dlls/jscript/tests/api.js |   22 ++++++++++++++++++++++
 2 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c
index fe8d751..e288525 100644
--- a/dlls/jscript/array.c
+++ b/dlls/jscript/array.c
@@ -853,6 +853,8 @@ static HRESULT Array_splice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPP
 {
     DWORD length, start=0, delete_cnt=0, argc, i, add_args = 0;
     jsdisp_t *ret_array = NULL, *jsthis;
+    double d;
+    int n;
     VARIANT v;
     HRESULT hres = S_OK;
 
@@ -867,14 +869,15 @@ static HRESULT Array_splice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPP
         hres = to_integer(ctx, get_arg(dp,0), ei, &v);
         if(FAILED(hres))
             return hres;
+        d = num_val(&v);
 
-        if(V_VT(&v) == VT_I4) {
-            if(V_I4(&v) >= 0)
-                start = min(V_I4(&v), length);
+        if(is_int32(d)) {
+            if((n = d) >= 0)
+                start = min(n, length);
             else
-                start = -V_I4(&v) > length ? 0 : length + V_I4(&v);
+                start = -n > length ? 0 : length + n;
         }else {
-            start = V_R8(&v) < 0.0 ? 0 : length;
+            start = d < 0.0 ? 0 : length;
         }
     }
 
@@ -882,11 +885,12 @@ static HRESULT Array_splice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPP
         hres = to_integer(ctx, get_arg(dp,1), ei, &v);
         if(FAILED(hres))
             return hres;
+        d = num_val(&v);
 
-        if(V_VT(&v) == VT_I4) {
-            if(V_I4(&v) > 0)
-                delete_cnt = min(V_I4(&v), length-start);
-        }else if(V_R8(&v) > 0.0) {
+        if(is_int32(d)) {
+            if((n = d) > 0)
+                delete_cnt = min(n, length-start);
+        }else if(d > 0.0) {
             delete_cnt = length-start;
         }
 
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index e81bb3f..c1ae808 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -18,6 +18,8 @@
 
 var tmp, i;
 
+var bigInt = Math.pow(2,40);
+
 ok(ScriptEngine() === "JScript", "ScriptEngine() = " + ScriptEngine());
 ok(ScriptEngine(3) === "JScript", "ScriptEngine(3) = " + ScriptEngine(3));
 ok(ScriptEngineMajorVersion() === ScriptEngineMajorVersion(2), "ScriptEngineMajorVersion() !== ScriptEngineMajorVersion(2)");
@@ -996,6 +998,26 @@ tmp = arr.splice();
 ok(tmp.toString() == "", "arr.splice(2,-1) returned " + tmp.toString());
 ok(arr.toString() == "1,2,3,4,5", "arr.splice(2,-1) is " + arr.toString());
 
+arr = [1,2,3,4,5];
+tmp = arr.splice(bigInt);
+ok(tmp.toString() == "", "arr.splice(bigInt) returned " + tmp.toString());
+ok(arr.toString() == "1,2,3,4,5", "arr.splice(bigInt) is " + arr.toString());
+
+arr = [1,2,3,4,5];
+tmp = arr.splice(-bigInt);
+ok(tmp.toString() == "", "arr.splice(-bigInt) returned " + tmp.toString());
+ok(arr.toString() == "1,2,3,4,5", "arr.splice(-bigInt) is " + arr.toString());
+
+arr = [1,2,3,4,5];
+tmp = arr.splice(2, bigInt);
+ok(tmp.toString() == "3,4,5", "arr.splice(2, bigInt) returned " + tmp.toString());
+ok(arr.toString() == "1,2", "arr.splice(2, bigInt) is " + arr.toString());
+
+arr = [1,2,3,4,5];
+tmp = arr.splice(2, -bigInt);
+ok(tmp.toString() == "", "arr.splice(2, bigInt) returned " + tmp.toString());
+ok(arr.toString() == "1,2,3,4,5", "arr.splice(2, bigInt) is " + arr.toString());
+
 obj = new Object();
 obj.length = 3;
 obj[0] = 1;




More information about the wine-cvs mailing list