ChakraCore/test/Function/apply3.js is resulting wrong result in x86_64
authorticaiolima@gmail.com <ticaiolima@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Oct 2017 18:15:09 +0000 (18:15 +0000)
committerticaiolima@gmail.com <ticaiolima@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Oct 2017 18:15:09 +0000 (18:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=175642

Reviewed by Darin Adler.

JSTests:

* ChakraCore/test/Function/apply3.baseline-jsc:

Source/JavaScriptCore:

According JS spec, the ToLength operation[1] has a range of 0..(2^53)
- 1. In Interpreter.cpp::sizeFrameForVarargs, the call to
sizeOfVarargs() was being assigned to "unsigned length", forcing a
type cast that results in different value among architectures JSC supports.
For instance, in x86_64 "4294967295 + 1" results in 0, while in ARMv6 it
results 4294967295. This patch is changing "sizeOfVarargs" to clamp the
result from "toLength" to unsigned and then get desired behavior for
all supported platforms.

[1] - https://tc39.github.io/ecma262/#sec-tolength

* interpreter/Interpreter.cpp:
(JSC::sizeOfVarargs):
* interpreter/Interpreter.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@222724 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChakraCore/test/Function/apply3.baseline-jsc
JSTests/ChangeLog
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/interpreter/Interpreter.cpp

index 1203a54..ab47610 100644 (file)
@@ -19,7 +19,7 @@ Called with this: object[[object Object]], args: []
 Called with this: object[[object Object]], args: []
 Called with this: object[[object Object]], args: []
 Called with this: object[[object Object]], args: []
-Called with this: object[[object Object]], args: []
+Exception: RangeError : Maximum call stack size exceeded.
 Called with this: object[[object Object]], args: []
 
 --- f.apply(x, arr), arr.length is huge ---
index 61e30f3..4ec2304 100644 (file)
@@ -1,3 +1,12 @@
+2017-10-02  Caio Lima  <ticaiolima@gmail.com>
+
+        ChakraCore/test/Function/apply3.js is resulting wrong result in x86_64
+        https://bugs.webkit.org/show_bug.cgi?id=175642
+
+        Reviewed by Darin Adler.
+
+        * ChakraCore/test/Function/apply3.baseline-jsc:
+
 2017-10-01  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, rolling out r222564.
index a9f3ace..89aaaba 100644 (file)
@@ -1,3 +1,25 @@
+2017-10-02  Caio Lima  <ticaiolima@gmail.com>
+
+        ChakraCore/test/Function/apply3.js is resulting wrong result in x86_64
+        https://bugs.webkit.org/show_bug.cgi?id=175642
+
+        Reviewed by Darin Adler.
+
+        According JS spec, the ToLength operation[1] has a range of 0..(2^53)
+        - 1. In Interpreter.cpp::sizeFrameForVarargs, the call to
+        sizeOfVarargs() was being assigned to "unsigned length", forcing a
+        type cast that results in different value among architectures JSC supports.
+        For instance, in x86_64 "4294967295 + 1" results in 0, while in ARMv6 it
+        results 4294967295. This patch is changing "sizeOfVarargs" to clamp the
+        result from "toLength" to unsigned and then get desired behavior for
+        all supported platforms.
+
+        [1] - https://tc39.github.io/ecma262/#sec-tolength
+
+        * interpreter/Interpreter.cpp:
+        (JSC::sizeOfVarargs):
+        * interpreter/Interpreter.h:
+
 2017-10-02  Saam Barati  <sbarati@apple.com>
 
         Unreviewed. Fix debug assertion after r222671. 
index a2218b3..3d011ad 100644 (file)
@@ -206,7 +206,7 @@ unsigned sizeOfVarargs(CallFrame* callFrame, JSValue arguments, uint32_t firstVa
         
     default:
         RELEASE_ASSERT(arguments.isObject());
-        length = toLength(callFrame, jsCast<JSObject*>(cell));
+        length = clampToUnsigned(toLength(callFrame, jsCast<JSObject*>(cell)));
         break;
     }
     RETURN_IF_EXCEPTION(scope, 0);