Ignore:
Timestamp:
Oct 13, 2015, 8:56:53 PM (10 years ago)
Author:
Yusuke Suzuki
Message:

[ES6] Class expression should have lexical environment that has itself as an imutable binding
https://bugs.webkit.org/show_bug.cgi?id=150089

Reviewed by Geoffrey Garen.

According to ES6 spec, class expression has its own lexical environment that holds itself
as an immutable binding[1] (section 14.5.14 step 2, 3, 4, 23)

As a result, even if the binding declared in the outer scope is overridden, methods inside
class expression can refer its class by the class name.

[1]: http://ecma-international.org/ecma-262/6.0/#sec-runtime-semantics-classdefinitionevaluation

  • bytecompiler/NodesCodegen.cpp:

(JSC::ClassExprNode::emitBytecode):

  • parser/ASTBuilder.h:

(JSC::ASTBuilder::createClassExpr):

  • parser/NodeConstructors.h:

(JSC::ClassExprNode::ClassExprNode):

  • parser/Nodes.h:
  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseClass):

  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::createClassExpr):

  • tests/es6.yaml:
  • tests/stress/class-expression-generates-environment.js: Added.

(shouldBe):
(shouldThrow):
(prototype.method):
(staticMethod):
(A.prototype.method):
(A.staticMethod):
(A):

  • tests/stress/class-expression-should-be-tdz-in-heritage.js: Added.

(shouldThrow):
(shouldThrow.A):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/parser/Nodes.h

    r190014 r191030  
    19311931
    19321932#if ENABLE(ES6_CLASS_SYNTAX)
    1933     class ClassExprNode final : public ExpressionNode {
    1934     public:
    1935         ClassExprNode(const JSTokenLocation&, const Identifier&, ExpressionNode* constructorExpresssion,
     1933    class ClassExprNode final : public ExpressionNode, public VariableEnvironmentNode {
     1934    public:
     1935        using ParserArenaDeletable::operator new;
     1936
     1937        ClassExprNode(const JSTokenLocation&, const Identifier&, VariableEnvironment& classEnvironment, ExpressionNode* constructorExpresssion,
    19361938            ExpressionNode* parentClass, PropertyListNode* instanceMethods, PropertyListNode* staticMethods);
    19371939
Note: See TracChangeset for help on using the changeset viewer.