ToT WebKit crashes while loading ES6 compatibility table
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 7 May 2015 05:15:56 +0000 (05:15 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 7 May 2015 05:15:56 +0000 (05:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=144726

Reviewed by Filip Pizlo.

Source/JavaScriptCore:

The bug was caused by parseClass superfluously avoiding to build up the string after seeing {.

Always build the identifier here as it could be a method name.

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

LayoutTests:

Added new test cases.

* js/class-syntax-string-and-numeric-names-expected.txt:
* js/script-tests/class-syntax-string-and-numeric-names.js:

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

LayoutTests/ChangeLog
LayoutTests/js/class-syntax-string-and-numeric-names-expected.txt
LayoutTests/js/script-tests/class-syntax-string-and-numeric-names.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/Parser.cpp

index 1466a2d..b47a64b 100644 (file)
@@ -1,3 +1,15 @@
+2015-05-06  Ryosuke Niwa  <rniwa@webkit.org>
+
+        ToT WebKit crashes while loading ES6 compatibility table
+        https://bugs.webkit.org/show_bug.cgi?id=144726
+
+        Reviewed by Filip Pizlo.
+
+        Added new test cases.
+
+        * js/class-syntax-string-and-numeric-names-expected.txt:
+        * js/script-tests/class-syntax-string-and-numeric-names.js:
+
 2015-05-06  Brent Fulgham  <bfulgham@apple.com>
 
         Scroll-snap points do not handle margins and padding propertly
index d4352d8..aa9fbd5 100644 (file)
@@ -40,6 +40,8 @@ PASS X = class { static set 6(x) { } static get 6() { return 26 } }; X[6] is 26
 PASS (new X)[6] is undefined
 PASS setterValue = 0; X = class { static set 7(x) { setterValue = x } static get 7() { } }; X[7] = 27; setterValue is 27
 PASS (new X)[7] = 28; setterValue is 27
+PASS function x() { return class { 'foo bar'() { return 29; } } }; (new (x()))['foo bar']() is 29
+PASS function x() { return class { 30() { return 30; } } }; (new (x()))[30]() is 30
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 1bc6a4c..6ed305b 100644 (file)
@@ -51,3 +51,6 @@ shouldBe("X = class { static set 6(x) { } static get 6() { return 26 } }; X[6]",
 shouldBe("(new X)[6]", "undefined");
 shouldBe("setterValue = 0; X = class { static set 7(x) { setterValue = x } static get 7() { } }; X[7] = 27; setterValue", "27");
 shouldBe("(new X)[7] = 28; setterValue", "27");
+
+shouldBe("function x() { return class { 'foo bar'() { return 29; } } }; (new (x()))['foo bar']()", "29");
+shouldBe("function x() { return class { 30() { return 30; } } }; (new (x()))[30]()", "30");
index 39d7099..11fa1c9 100644 (file)
@@ -1,3 +1,17 @@
+2015-05-06  Ryosuke Niwa  <rniwa@webkit.org>
+
+        ToT WebKit crashes while loading ES6 compatibility table
+        https://bugs.webkit.org/show_bug.cgi?id=144726
+
+        Reviewed by Filip Pizlo.
+
+        The bug was caused by parseClass superfluously avoiding to build up the string after seeing {.
+
+        Always build the identifier here as it could be a method name.
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parseClass):
+
 2015-05-05  Filip Pizlo  <fpizlo@apple.com>
 
         Sane chain and string watchpoints should be set in FixupPhase or the backend rather than WatchpointCollectionPhase
index 49bcd96..fd42445 100644 (file)
@@ -1529,7 +1529,7 @@ template <class TreeBuilder> TreeClassExpression Parser<LexerType>::parseClass(T
     }
     const ConstructorKind constructorKind = parentClass ? ConstructorKind::Derived : ConstructorKind::Base;
 
-    consumeOrFailWithFlags(OPENBRACE, TreeBuilder::DontBuildStrings, "Expected opening '{' at the start of a class body");
+    consumeOrFail(OPENBRACE, "Expected opening '{' at the start of a class body");
 
     TreeExpression constructor = 0;
     TreePropertyList staticMethods = 0;
@@ -1558,16 +1558,19 @@ template <class TreeBuilder> TreeClassExpression Parser<LexerType>::parseClass(T
         switch (m_token.m_type) {
         case STRING:
             ident = m_token.m_data.ident;
+            ASSERT(ident);
             next();
             break;
         case IDENT:
             ident = m_token.m_data.ident;
             isGetter = *ident == propertyNames.get;
             isSetter = *ident == propertyNames.set;
+            ASSERT(ident);
             break;
         case DOUBLE:
         case INTEGER:
             ident = &m_parserArena.identifierArena().makeNumericIdentifier(const_cast<VM*>(m_vm), m_token.m_data.doubleValue);
+            ASSERT(ident);
             next();
             break;
         default: