[BigInt] Literal parsing is crashing when used inside a Object Literal
authorticaiolima@gmail.com <ticaiolima@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 Jan 2019 00:39:28 +0000 (00:39 +0000)
committerticaiolima@gmail.com <ticaiolima@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 Jan 2019 00:39:28 +0000 (00:39 +0000)
https://bugs.webkit.org/show_bug.cgi?id=193404

Reviewed by Yusuke Suzuki.

JSTests:

* stress/big-int-literal-inside-literal-object.js: Added.

Source/JavaScriptCore:

Former implementation was relying into token.m_data.radix after the
call of `next()` into Parser.cpp. This is not safe because next
clobbers token.m_data.radix in some cases (e.g is CLOSEBRACE).
Now we get radix value before calling `next()` into parser and store
in a local variable.

* parser/Parser.cpp:
(JSC::Parser<LexerType>::parsePrimaryExpression):

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

JSTests/ChangeLog
JSTests/stress/big-int-literal-inside-literal-object.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/Parser.cpp

index b1f15c1..64b0722 100644 (file)
@@ -1,3 +1,12 @@
+2019-01-14  Caio Lima  <ticaiolima@gmail.com>
+
+        [BigInt] Literal parsing is crashing when used inside a Object Literal
+        https://bugs.webkit.org/show_bug.cgi?id=193404
+
+        Reviewed by Yusuke Suzuki.
+
+        * stress/big-int-literal-inside-literal-object.js: Added.
+
 2019-01-14  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
 
         [JSC] Do not use asArrayModes() with Structures because it discards TypedArray information
diff --git a/JSTests/stress/big-int-literal-inside-literal-object.js b/JSTests/stress/big-int-literal-inside-literal-object.js
new file mode 100644 (file)
index 0000000..d1f9072
--- /dev/null
@@ -0,0 +1,21 @@
+//@ runBigIntEnabled
+
+var assert = {
+    sameValue: function (input, expected) {
+        if (input !== expected)
+            throw new Error('Expected: ' + expected + ' but got: ' + input);
+    }
+};
+
+var x = {y:1n}
+assert.sameValue(x.y, 1n);
+
+x = {y:{z:1n}};
+assert.sameValue(x.y.z, 1n);
+
+x = {y:-1212n}
+assert.sameValue(x.y, -1212n);
+
+x = {y:{z:-22312n}};
+assert.sameValue(x.y.z, -22312n);
+
index cc5b392..be7b7f2 100644 (file)
@@ -1,3 +1,19 @@
+2019-01-14  Caio Lima  <ticaiolima@gmail.com>
+
+        [BigInt] Literal parsing is crashing when used inside a Object Literal
+        https://bugs.webkit.org/show_bug.cgi?id=193404
+
+        Reviewed by Yusuke Suzuki.
+
+        Former implementation was relying into token.m_data.radix after the
+        call of `next()` into Parser.cpp. This is not safe because next
+        clobbers token.m_data.radix in some cases (e.g is CLOSEBRACE).
+        Now we get radix value before calling `next()` into parser and store
+        in a local variable.
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parsePrimaryExpression):
+
 2019-01-14  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
 
         [JSC] Do not use asArrayModes() with Structures because it discards TypedArray information
index 922f41d..4b840d3 100644 (file)
@@ -4519,9 +4519,10 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parsePrimaryExpre
     }
     case BIGINT: {
         const Identifier* ident = m_token.m_data.bigIntString;
+        uint8_t radix = m_token.m_data.radix;
         JSTokenLocation location(tokenLocation());
         next();
-        return context.createBigInt(location, ident, m_token.m_data.radix);
+        return context.createBigInt(location, ident, radix);
     }
     case STRING: {
         const Identifier* ident = m_token.m_data.ident;