Changeset 181724 in webkit
- Timestamp:
- Mar 18, 2015, 8:27:00 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/js/class-syntax-extends-expected.txt (modified) (1 diff)
-
LayoutTests/js/script-tests/class-syntax-extends.js (modified) (1 diff)
-
Source/JavaScriptCore/ChangeLog (modified) (1 diff)
-
Source/JavaScriptCore/parser/Parser.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r181720 r181724 1 2015-03-18 Joseph Pecoraro <pecoraro@apple.com> 2 3 ES6 Classes: Extends should accept an expression without parenthesis 4 https://bugs.webkit.org/show_bug.cgi?id=142840 5 6 Reviewed by Ryosuke Niwa. 7 8 * js/class-syntax-extends-expected.txt: 9 * js/script-tests/class-syntax-extends.js: 10 Extend the test to test cases of extends with different types of expressions. 11 1 12 2015-03-18 Said Abou-Hallawa <sabouhallawa@apple.com> 2 13 -
trunk/LayoutTests/js/class-syntax-extends-expected.txt
r181618 r181724 26 26 PASS x = class extends baseWithBadPrototype { constructor() { } } threw exception TypeError: The superclass's prototype is not an object.. 27 27 PASS baseWithBadPrototype.prototype = null; x = class extends baseWithBadPrototype { constructor() { } } did not throw exception. 28 PASS x = 1; c = class extends ++x { constructor() { } }; threw exception SyntaxError: Unexpected token '++'. 29 PASS x = 1; c = class extends x++ { constructor() { } }; threw exception SyntaxError: Unexpected token '++'. Expected opening '{' at the start of a class body.. 30 PASS x = 1; c = class extends (++x) { constructor() { } }; threw exception TypeError: The superclass is not an object.. 31 PASS x = 1; c = class extends (x++) { constructor() { } }; threw exception TypeError: The superclass is not an object.. 32 PASS x = 1; try { c = class extends (++x) { constructor() { } } } catch (e) { }; x is 2 33 PASS x = 1; try { c = class extends (x++) { constructor() { } } } catch (e) { }; x is 2 34 PASS namespace = {}; namespace.A = class { }; namespace.B = class extends namespace.A { } did not throw exception. 35 PASS namespace = {}; namespace.A = class A { }; namespace.B = class B extends namespace.A { } did not throw exception. 36 PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends namespace.A { constructor() { } } did not throw exception. 37 PASS namespace = {}; namespace.A = class A { constructor() { } }; namespace.B = class B extends namespace.A { constructor() { } } did not throw exception. 38 PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends (namespace.A) { constructor() { } } did not throw exception. 39 PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends namespace["A"] { constructor() { } } did not throw exception. 40 PASS namespace = {}; namespace.A = class { constructor() { } }; function getClassA() { return namespace.A }; namespace.B = class extends getClassA() { constructor() { } } did not throw exception. 41 PASS namespace = {}; namespace.A = class { constructor() { } }; function getClass(prop) { return namespace[prop] }; namespace.B = class extends getClass("A") { constructor() { } } did not throw exception. 42 PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends (false||null||namespace.A) { constructor() { } } did not throw exception. 43 PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends false||null||namespace.A { constructor() { } } threw exception SyntaxError: Unexpected token '||'. Expected opening '{' at the start of a class body.. 44 PASS x = 1; namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends (x++, namespace.A) { constructor() { } }; did not throw exception. 45 PASS x = 1; namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends (namespace.A, x++) { constructor() { } }; threw exception TypeError: The superclass is not an object.. 46 PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends new namespace.A { constructor() { } } threw exception TypeError: The superclass's prototype is not an object.. 47 PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends new namespace.A() { constructor() { } } threw exception TypeError: The superclass's prototype is not an object.. 48 PASS x = 1; namespace = {}; namespace.A = class { constructor() { } }; try { namespace.B = class extends (x++, namespace.A) { constructor() { } } } catch (e) { } x is 2 49 PASS x = 1; namespace = {}; namespace.A = class { constructor() { } }; try { namespace.B = class extends (namespace.A, x++) { constructor() { } } } catch (e) { } x is 2 28 50 PASS successfullyParsed is true 29 51 -
trunk/LayoutTests/js/script-tests/class-syntax-extends.js
r181618 r181724 40 40 shouldNotThrow('baseWithBadPrototype.prototype = null; x = class extends baseWithBadPrototype { constructor() { } }'); 41 41 42 shouldThrow('x = 1; c = class extends ++x { constructor() { } };'); 43 shouldThrow('x = 1; c = class extends x++ { constructor() { } };'); 44 shouldThrow('x = 1; c = class extends (++x) { constructor() { } };'); 45 shouldThrow('x = 1; c = class extends (x++) { constructor() { } };'); 46 shouldBe('x = 1; try { c = class extends (++x) { constructor() { } } } catch (e) { }; x', '2'); 47 shouldBe('x = 1; try { c = class extends (x++) { constructor() { } } } catch (e) { }; x', '2'); 48 49 shouldNotThrow('namespace = {}; namespace.A = class { }; namespace.B = class extends namespace.A { }'); 50 shouldNotThrow('namespace = {}; namespace.A = class A { }; namespace.B = class B extends namespace.A { }'); 51 shouldNotThrow('namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends namespace.A { constructor() { } }'); 52 shouldNotThrow('namespace = {}; namespace.A = class A { constructor() { } }; namespace.B = class B extends namespace.A { constructor() { } }'); 53 shouldNotThrow('namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends (namespace.A) { constructor() { } }'); 54 shouldNotThrow('namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends namespace["A"] { constructor() { } }'); 55 shouldNotThrow('namespace = {}; namespace.A = class { constructor() { } }; function getClassA() { return namespace.A }; namespace.B = class extends getClassA() { constructor() { } }'); 56 shouldNotThrow('namespace = {}; namespace.A = class { constructor() { } }; function getClass(prop) { return namespace[prop] }; namespace.B = class extends getClass("A") { constructor() { } }'); 57 shouldNotThrow('namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends (false||null||namespace.A) { constructor() { } }'); 58 shouldThrow('namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends false||null||namespace.A { constructor() { } }'); 59 shouldNotThrow('x = 1; namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends (x++, namespace.A) { constructor() { } };'); 60 shouldThrow('x = 1; namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends (namespace.A, x++) { constructor() { } };'); 61 shouldThrow('namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends new namespace.A { constructor() { } }'); 62 shouldThrow('namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends new namespace.A() { constructor() { } }'); 63 shouldBe('x = 1; namespace = {}; namespace.A = class { constructor() { } }; try { namespace.B = class extends (x++, namespace.A) { constructor() { } } } catch (e) { } x', '2'); 64 shouldBe('x = 1; namespace = {}; namespace.A = class { constructor() { } }; try { namespace.B = class extends (namespace.A, x++) { constructor() { } } } catch (e) { } x', '2'); 65 42 66 var successfullyParsed = true; -
trunk/Source/JavaScriptCore/ChangeLog
r181722 r181724 1 2015-03-18 Joseph Pecoraro <pecoraro@apple.com> 2 3 ES6 Classes: Extends should accept an expression without parenthesis 4 https://bugs.webkit.org/show_bug.cgi?id=142840 5 6 Reviewed by Ryosuke Niwa. 7 8 * parser/Parser.cpp: 9 (JSC::Parser<LexerType>::parseClass): 10 "extends" allows a LeftHandExpression (new expression / call expression, 11 which includes a member expression), not a primary expression. Our 12 parseMemberExpression does all of these. 13 1 14 2015-03-18 Joseph Pecoraro <pecoraro@apple.com> 2 15 -
trunk/Source/JavaScriptCore/parser/Parser.cpp
r181664 r181724 1486 1486 TreeExpression parentClass = 0; 1487 1487 if (consume(EXTENDS)) { 1488 parentClass = parse PrimaryExpression(context);1488 parentClass = parseMemberExpression(context); 1489 1489 failIfFalse(parentClass, "Cannot parse the parent class name"); 1490 1490 }
Note:
See TracChangeset
for help on using the changeset viewer.