Ignore:
Timestamp:
Jan 29, 2015, 2:59:19 PM (10 years ago)
Author:
[email protected]
Message:

Implement ES6 class syntax without inheritance support
https://bugs.webkit.org/show_bug.cgi?id=140918

Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

Added the most basic support for ES6 class syntax. After this patch, we support basic class definition like:
class A {

constructor() { }
someMethod() { }

}

We'll add the support for "extends" keyword and automatically generating a constructor in follow up patches.
We also don't support block scoping of a class declaration.

We support both class declaration and class expression. A class expression is implemented by the newly added
ClassExprNode AST node. A class declaration is implemented by ClassDeclNode, which is a thin wrapper around
AssignResolveNode.

Tests: js/class-syntax-declaration.html

js/class-syntax-expression.html

  • bytecompiler/NodesCodegen.cpp:

(JSC::ObjectLiteralNode::emitBytecode): Create a new object instead of delegating the work to PropertyListNode.
Also fixed the 5-space indentation.
(JSC::PropertyListNode::emitBytecode): Don't create a new object now that ObjectLiteralNode does this.
(JSC::ClassDeclNode::emitBytecode): Added. Just let the AssignResolveNode node emit the byte code.
(JSC::ClassExprNode::emitBytecode): Create the class constructor and add static methods to the constructor by
emitting the byte code for PropertyListNode. Add instance methods to the class's prototype object the same way.

  • parser/ASTBuilder.h:

(JSC::ASTBuilder::createClassExpr): Added. Creates a ClassExprNode.
(JSC::ASTBuilder::createClassDeclStatement): Added. Creates a AssignResolveNode and wraps it by a ClassDeclNode.

  • parser/NodeConstructors.h:

(JSC::ClassDeclNode::ClassDeclNode): Added.
(JSC::ClassExprNode::ClassExprNode): Added.

  • parser/Nodes.h:

(JSC::ClassExprNode): Added.
(JSC::ClassDeclNode): Added.

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseStatement): Added the support for class declaration.
(JSC::stringForFunctionMode): Return "method" for MethodMode.
(JSC::Parser<LexerType>::parseClassDeclaration): Added. Uses parseClass to create a class expression and wraps
it with ClassDeclNode as described above.
(JSC::Parser<LexerType>::parseClass): Parses a class expression.
(JSC::Parser<LexerType>::parseProperty):
(JSC::Parser<LexerType>::parseGetterSetter): Extracted from parseProperty to share the code between parseProperty
and parseClass.
(JSC::Parser<LexerType>::parsePrimaryExpression): Added the support for class expression.

  • parser/Parser.h:

(FunctionParseMode): Added MethodMode.

  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::createClassExpr): Added.
(JSC::SyntaxChecker::createClassDeclStatement): Added.

LayoutTests:

Added two tests for class declarations and class expressions.

  • TestExpectations:
  • js/class-syntax-declaration-expected.txt: Added.
  • js/class-syntax-declaration.html: Added.
  • js/class-syntax-expression-expected.txt: Added.
  • js/class-syntax-expression.html: Added.
  • js/script-tests/class-syntax-declaration.js: Added.
  • js/script-tests/class-syntax-expression.js: Added.
File:
1 edited

Legend:

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

    r178918 r179371  
    16121612    };
    16131613
     1614#if ENABLE(ES6_CLASS_SYNTAX)
     1615    class ClassExprNode final : public ExpressionNode {
     1616    public:
     1617        ClassExprNode(const JSTokenLocation&, const Identifier&, ExpressionNode* constructorExpresssion,
     1618            ExpressionNode* parentClass, PropertyListNode* instanceMethods, PropertyListNode* staticMethods);
     1619
     1620        const Identifier& name() { return m_name; }
     1621
     1622    private:
     1623        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
     1624
     1625        const Identifier& m_name;
     1626        ExpressionNode* m_constructorExpression;
     1627        ExpressionNode* m_parentClassExpression;
     1628        PropertyListNode* m_instanceMethods;
     1629        PropertyListNode* m_staticMethods;
     1630    };
     1631#endif
     1632
    16141633    class DeconstructionPatternNode : public RefCounted<DeconstructionPatternNode> {
    16151634        WTF_MAKE_NONCOPYABLE(DeconstructionPatternNode);
     
    17251744    };
    17261745
     1746#if ENABLE(ES6_CLASS_SYNTAX)
     1747    class ClassDeclNode final : public StatementNode {
     1748    public:
     1749        ClassDeclNode(const JSTokenLocation&, ExpressionNode* classExpression);
     1750
     1751    private:
     1752        virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
     1753
     1754        ExpressionNode* m_classDeclaration;
     1755    };
     1756#endif
     1757
    17271758    class CaseClauseNode : public ParserArenaFreeable {
    17281759    public:
Note: See TracChangeset for help on using the changeset viewer.