[JSC] Use jsNontrivialString agressively for ToString(Int52)
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 24 Mar 2017 14:30:13 +0000 (14:30 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 24 Mar 2017 14:30:13 +0000 (14:30 +0000)
https://bugs.webkit.org/show_bug.cgi?id=170002

Reviewed by Sam Weinig.

JSTests:

* stress/to-string-int52.js: Added.
(shouldBe):
(toString10):
(expected):

Source/JavaScriptCore:

We use the same logic used for Int32 to use jsNontvirialString.
After single character check, produced string is always longer than 1.
Thus, we can use jsNontrivialString.

* runtime/NumberPrototype.cpp:
(JSC::int52ToString):

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

JSTests/ChangeLog
JSTests/stress/to-string-int52.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/NumberPrototype.cpp

index bbcdcc7..45f9d9a 100644 (file)
@@ -1,5 +1,17 @@
 2017-03-23  Yusuke Suzuki  <utatane.tea@gmail.com>
 
+        [JSC] Use jsNontrivialString agressively for ToString(Int52)
+        https://bugs.webkit.org/show_bug.cgi?id=170002
+
+        Reviewed by Sam Weinig.
+
+        * stress/to-string-int52.js: Added.
+        (shouldBe):
+        (toString10):
+        (expected):
+
+2017-03-23  Yusuke Suzuki  <utatane.tea@gmail.com>
+
         [JSC][DFG] Make addShouldSpeculateAnyInt more conservative to avoid regression caused by Double <-> Int52 conversions
         https://bugs.webkit.org/show_bug.cgi?id=169998
 
diff --git a/JSTests/stress/to-string-int52.js b/JSTests/stress/to-string-int52.js
new file mode 100644 (file)
index 0000000..e1f323f
--- /dev/null
@@ -0,0 +1,59 @@
+function shouldBe(actual, expected)
+{
+    if (actual !== expected)
+        throw new Error(`bad value: expected:(${expected}),actual:(${actual})`);
+}
+
+function toString(value, radix)
+{
+    return fiatInt52(value).toString(radix);
+}
+noInline(toString);
+
+function toString10(value)
+{
+    return `${fiatInt52(value)}`;
+}
+noInline(toString10);
+
+function expected(num, radix)
+{
+    let characters = "0123456789abcdefghijklmnopqrstuvwxyz";
+    let result = "";
+    let negative = false;
+    if (num < 0) {
+        negative = true;
+        num = -num;
+    }
+
+    do {
+        const index = num % radix;
+        result = characters[index] + result;
+        num = (num - index) / radix;
+    } while (num);
+
+    if (negative)
+        return '-' + result;
+    return result;
+}
+
+for (var i = 0; i < 1e4; ++i) {
+    toString(i, 10);
+    toString(i, 36);
+    toString10(i);
+}
+
+for (var radix = 2; radix < 37; ++radix) {
+    for (var lessThanRadix = -2000; lessThanRadix < radix; ++lessThanRadix)
+        shouldBe(toString(lessThanRadix, radix), expected(lessThanRadix, radix));
+    for (var greaterThanRadix = radix; greaterThanRadix < 2000; ++greaterThanRadix)
+        shouldBe(toString(greaterThanRadix, radix), expected(greaterThanRadix, radix));
+}
+
+{
+    var radix = 10;
+    for (var lessThanRadix = -2000; lessThanRadix < radix; ++lessThanRadix)
+        shouldBe(toString10(lessThanRadix), expected(lessThanRadix, radix));
+    for (var greaterThanRadix = radix; greaterThanRadix < 2000; ++greaterThanRadix)
+        shouldBe(toString10(greaterThanRadix), expected(greaterThanRadix, radix));
+}
index cd44bd2..b2890e5 100644 (file)
@@ -1,5 +1,19 @@
 2017-03-23  Yusuke Suzuki  <utatane.tea@gmail.com>
 
+        [JSC] Use jsNontrivialString agressively for ToString(Int52)
+        https://bugs.webkit.org/show_bug.cgi?id=170002
+
+        Reviewed by Sam Weinig.
+
+        We use the same logic used for Int32 to use jsNontvirialString.
+        After single character check, produced string is always longer than 1.
+        Thus, we can use jsNontrivialString.
+
+        * runtime/NumberPrototype.cpp:
+        (JSC::int52ToString):
+
+2017-03-23  Yusuke Suzuki  <utatane.tea@gmail.com>
+
         [JSC] Use WeakRandom for SamplingProfiler interval fluctuation
         https://bugs.webkit.org/show_bug.cgi?id=170045
 
index 6d1ec0f..9b38682 100644 (file)
@@ -542,8 +542,15 @@ JSString* int32ToString(VM& vm, int32_t value, int32_t radix)
 JSString* int52ToString(VM& vm, int64_t value, int32_t radix)
 {
     ASSERT(!(radix < 2 || radix > 36));
+    // A negative value casted to unsigned would be bigger than 36 (the max radix).
+    if (static_cast<uint64_t>(value) < static_cast<uint64_t>(radix)) {
+        ASSERT(value <= 36);
+        ASSERT(value >= 0);
+        return vm.smallStrings.singleCharacterString(radixDigits[value]);
+    }
+
     if (radix == 10)
-        return jsString(&vm, vm.numericStrings.add(static_cast<double>(value)));
+        return jsNontrivialString(&vm, vm.numericStrings.add(static_cast<double>(value)));
 
     // Position the decimal point at the center of the string, set
     // the startOfResultString pointer to point at the decimal point.
@@ -552,7 +559,7 @@ JSString* int52ToString(VM& vm, int64_t value, int32_t radix)
     char* startOfResultString = decimalPoint;
     *decimalPoint = '\0';
 
-    return jsString(&vm, int52ToStringWithRadix(startOfResultString, value, radix));
+    return jsNontrivialString(&vm, int52ToStringWithRadix(startOfResultString, value, radix));
 }
 
 JSString* numberToString(VM& vm, double doubleValue, int32_t radix)