new super should be a syntax error
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 May 2015 19:21:28 +0000 (19:21 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 May 2015 19:21:28 +0000 (19:21 +0000)
https://bugs.webkit.org/show_bug.cgi?id=144282

Reviewed by Joseph Pecoraro.

Source/JavaScriptCore:

Disallow "new super" as ES6 spec doesn't allow this.

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

LayoutTests:

Rebaselined the test.

* js/class-syntax-super-expected.txt:
* js/script-tests/class-syntax-super.js:

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

LayoutTests/ChangeLog
LayoutTests/js/class-syntax-super-expected.txt
LayoutTests/js/script-tests/class-syntax-super.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/Parser.cpp

index d96bf566dc87b47402be9eed4f15c1796a71432f..c1a077ad77ed0608beb3f014261e0e597488959a 100644 (file)
@@ -1,3 +1,15 @@
+2015-05-04  Ryosuke Niwa  <rniwa@webkit.org>
+
+        new super should be a syntax error
+        https://bugs.webkit.org/show_bug.cgi?id=144282
+
+        Reviewed by Joseph Pecoraro.
+
+        Rebaselined the test.
+
+        * js/class-syntax-super-expected.txt:
+        * js/script-tests/class-syntax-super.js:
+
 2015-05-04  Simon Fraser  <simon.fraser@apple.com>
 
        Skip fast/images/animated-gif-body-outside-viewport.html on Windows. It
 2015-05-04  Simon Fraser  <simon.fraser@apple.com>
 
        Skip fast/images/animated-gif-body-outside-viewport.html on Windows. It
index 397e6d123f19f4311ca619afdbfaf3a2b1e85ccc..46efb35e688c12585a99654322734588d4434a8d 100644 (file)
@@ -16,9 +16,7 @@ PASS (new SecondDerived).chainMethod() is ["base", "derived", "secondDerived"]
 PASS x = class extends Base { constructor() { super(); } super() {} } threw exception SyntaxError: Unexpected keyword 'super'.
 PASS x = class extends Base { constructor() { super(); } method() { super() } } threw exception SyntaxError: Cannot call super() outside of a class constructor..
 PASS x = class extends Base { constructor() { super(); } method() { super } } threw exception SyntaxError: Cannot reference super..
 PASS x = class extends Base { constructor() { super(); } super() {} } threw exception SyntaxError: Unexpected keyword 'super'.
 PASS x = class extends Base { constructor() { super(); } method() { super() } } threw exception SyntaxError: Cannot call super() outside of a class constructor..
 PASS x = class extends Base { constructor() { super(); } method() { super } } threw exception SyntaxError: Cannot reference super..
-PASS x = class extends Base { constructor() { super(); } method() { return new super } } did not throw exception.
-PASS (new x).method() instanceof Base is true
-PASS (new x).method() instanceof x is false
+PASS x = class extends Base { constructor() { super(); } method() { return new super } } threw exception SyntaxError: Cannot use new with super..
 PASS x = class extends Base { constructor() { super(); } method1() { delete (super.foo) } method2() { delete super["foo"] } } did not throw exception.
 PASS (new x).method1() threw exception ReferenceError: Cannot delete a super property.
 PASS (new x).method2() threw exception ReferenceError: Cannot delete a super property.
 PASS x = class extends Base { constructor() { super(); } method1() { delete (super.foo) } method2() { delete super["foo"] } } did not throw exception.
 PASS (new x).method1() threw exception ReferenceError: Cannot delete a super property.
 PASS (new x).method2() threw exception ReferenceError: Cannot delete a super property.
index a3185ab1dc5244ae8f800e58b2c9cf0edcc3a214..e7114e18c49ed0591453c4f6cd451ea4f32677ad 100644 (file)
@@ -41,9 +41,7 @@ shouldThrow('x = class extends Base { constructor() { super(); } super() {} }',
 shouldThrow('x = class extends Base { constructor() { super(); } method() { super() } }',
     '"SyntaxError: Cannot call super() outside of a class constructor."');
 shouldThrow('x = class extends Base { constructor() { super(); } method() { super } }', '"SyntaxError: Cannot reference super."');
 shouldThrow('x = class extends Base { constructor() { super(); } method() { super() } }',
     '"SyntaxError: Cannot call super() outside of a class constructor."');
 shouldThrow('x = class extends Base { constructor() { super(); } method() { super } }', '"SyntaxError: Cannot reference super."');
-shouldNotThrow('x = class extends Base { constructor() { super(); } method() { return new super } }');
-shouldBeTrue('(new x).method() instanceof Base');
-shouldBeFalse('(new x).method() instanceof x');
+shouldThrow('x = class extends Base { constructor() { super(); } method() { return new super } }', '"SyntaxError: Cannot use new with super."');
 shouldNotThrow('x = class extends Base { constructor() { super(); } method1() { delete (super.foo) } method2() { delete super["foo"] } }');
 shouldThrow('(new x).method1()', '"ReferenceError: Cannot delete a super property"');
 shouldThrow('(new x).method2()', '"ReferenceError: Cannot delete a super property"');
 shouldNotThrow('x = class extends Base { constructor() { super(); } method1() { delete (super.foo) } method2() { delete super["foo"] } }');
 shouldThrow('(new x).method1()', '"ReferenceError: Cannot delete a super property"');
 shouldThrow('(new x).method2()', '"ReferenceError: Cannot delete a super property"');
index da43b877662577c0418c288e03f9380cea87df64..1aabd70a5c1420af30959c3ba05ee1e4a0ce0a2f 100644 (file)
@@ -1,3 +1,15 @@
+2015-05-04  Ryosuke Niwa  <rniwa@webkit.org>
+
+        new super should be a syntax error
+        https://bugs.webkit.org/show_bug.cgi?id=144282
+
+        Reviewed by Joseph Pecoraro.
+
+        Disallow "new super" as ES6 spec doesn't allow this.
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parseMemberExpression):
+
 2015-05-04  Saam Barati  <saambarati1@gmail.com>
 
         JSCallbackObject does not maintain symmetry between accesses for getOwnPropertySlot and put
 2015-05-04  Saam Barati  <saambarati1@gmail.com>
 
         JSCallbackObject does not maintain symmetry between accesses for getOwnPropertySlot and put
index ecaead9baf7b09342d0714c42ae0d831f64066a9..49bcd9654259bc262391b341b883448e6c0234c6 100644 (file)
@@ -2524,6 +2524,7 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parseMemberExpres
 
 #if ENABLE(ES6_CLASS_SYNTAX)
     bool baseIsSuper = match(SUPER);
 
 #if ENABLE(ES6_CLASS_SYNTAX)
     bool baseIsSuper = match(SUPER);
+    semanticFailIfTrue(baseIsSuper && newCount, "Cannot use new with super");
 #else
     bool baseIsSuper = false;
 #endif
 #else
     bool baseIsSuper = false;
 #endif
@@ -2587,7 +2588,7 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parseMemberExpres
         baseIsSuper = false;
     }
 endMemberExpression:
         baseIsSuper = false;
     }
 endMemberExpression:
-    semanticFailIfTrue(baseIsSuper && !newCount, "Cannot reference super");
+    semanticFailIfTrue(baseIsSuper, "Cannot reference super");
     while (newCount--)
         base = context.createNewExpr(location, base, expressionStart, lastTokenEndPosition());
     return base;
     while (newCount--)
         base = context.createNewExpr(location, base, expressionStart, lastTokenEndPosition());
     return base;