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/ASTBuilder.h

    r178888 r179371  
    105105    typedef ParameterNode* FormalParameterList;
    106106    typedef FunctionBodyNode* FunctionBody;
     107#if ENABLE(ES6_CLASS_SYNTAX)
     108    typedef ClassExprNode* ClassExpression;
     109#endif
    107110    typedef StatementNode* Statement;
    108111    typedef ClauseListNode* ClauseList;
     
    274277    }
    275278
     279#if ENABLE(ES6_CLASS_SYNTAX)
     280    ClassExprNode* createClassExpr(const JSTokenLocation& location, const Identifier& name, ExpressionNode* constructor,
     281        ExpressionNode* parentClass, PropertyListNode* instanceMethods, PropertyListNode* staticMethods)
     282    {
     283        return new (m_parserArena) ClassExprNode(location, name, constructor, parentClass, instanceMethods, staticMethods);
     284    }
     285#endif
     286
    276287    ExpressionNode* createFunctionExpr(const JSTokenLocation& location, const ParserFunctionInfo<ASTBuilder>& info, unsigned functionKeywordStart)
    277288    {
     
    353364        return decl;
    354365    }
     366
     367#if ENABLE(ES6_CLASS_SYNTAX)
     368    StatementNode* createClassDeclStatement(const JSTokenLocation& location, ClassExprNode* classExpression,
     369        const JSTextPosition& classStart, const JSTextPosition& classEnd, unsigned startLine, unsigned endLine)
     370    {
     371        // FIXME: Use "let" declaration.
     372        ExpressionNode* assign = createAssignResolve(location, classExpression->name(), classExpression, classStart, classStart + 1, classEnd);
     373        ClassDeclNode* decl = new (m_parserArena) ClassDeclNode(location, assign);
     374        decl->setLoc(startLine, endLine, location.startOffset, location.lineStartOffset);
     375        return decl;
     376    }
     377#endif
    355378
    356379    StatementNode* createBlockStatement(const JSTokenLocation& location, JSC::SourceElements* elements, int startLine, int endLine)
Note: See TracChangeset for help on using the changeset viewer.