Changeset 233937 in webkit


Ignore:
Timestamp:
Jul 18, 2018 3:36:34 PM (6 years ago)
Author:
Yusuke Suzuki
Message:

[JSC] Reduce size of AST nodes
https://bugs.webkit.org/show_bug.cgi?id=187689

Reviewed by Mark Lam.

We clean up AST nodes to reduce size. By doing so, we can reduce the memory consumption
of ParserArena at peak state.

  1. Annotate final to AST nodes to make them solid. And it allows the compiler to

devirtualize a call to the function which are implemented in a final class.

  1. Use default member initializers more.
  1. And use nullptr instead of 0.
  1. Arrange the layout of AST nodes to reduce the size. It includes changing the order

of classes in multiple inheritance. In particular, StatementNode is decreased from 48
to 40. This decreases the sizes of all the derived Statement nodes.

  • parser/NodeConstructors.h:

(JSC::Node::Node):
(JSC::StatementNode::StatementNode):
(JSC::ElementNode::ElementNode):
(JSC::ArrayNode::ArrayNode):
(JSC::PropertyListNode::PropertyListNode):
(JSC::ObjectLiteralNode::ObjectLiteralNode):
(JSC::ArgumentListNode::ArgumentListNode):
(JSC::ArgumentsNode::ArgumentsNode):
(JSC::NewExprNode::NewExprNode):
(JSC::BytecodeIntrinsicNode::BytecodeIntrinsicNode):
(JSC::BinaryOpNode::BinaryOpNode):
(JSC::LogicalOpNode::LogicalOpNode):
(JSC::CommaNode::CommaNode):
(JSC::SourceElements::SourceElements):
(JSC::ClauseListNode::ClauseListNode):

  • parser/Nodes.cpp:

(JSC::FunctionMetadataNode::FunctionMetadataNode):
(JSC::FunctionMetadataNode::operator== const):
(JSC::FunctionMetadataNode::dump const):

  • parser/Nodes.h:

(JSC::BooleanNode::value): Deleted.
(JSC::StringNode::value): Deleted.
(JSC::TemplateExpressionListNode::value): Deleted.
(JSC::TemplateExpressionListNode::next): Deleted.
(JSC::TemplateStringNode::cooked): Deleted.
(JSC::TemplateStringNode::raw): Deleted.
(JSC::TemplateStringListNode::value): Deleted.
(JSC::TemplateStringListNode::next): Deleted.
(JSC::TemplateLiteralNode::templateStrings const): Deleted.
(JSC::TemplateLiteralNode::templateExpressions const): Deleted.
(JSC::TaggedTemplateNode::templateLiteral const): Deleted.
(JSC::ResolveNode::identifier const): Deleted.
(JSC::ElementNode::elision const): Deleted.
(JSC::ElementNode::value): Deleted.
(JSC::ElementNode::next): Deleted.
(JSC::ArrayNode::elements const): Deleted.
(JSC::PropertyNode::expressionName const): Deleted.
(JSC::PropertyNode::name const): Deleted.
(JSC::PropertyNode::type const): Deleted.
(JSC::PropertyNode::needsSuperBinding const): Deleted.
(JSC::PropertyNode::isClassProperty const): Deleted.
(JSC::PropertyNode::isStaticClassProperty const): Deleted.
(JSC::PropertyNode::isInstanceClassProperty const): Deleted.
(JSC::PropertyNode::isOverriddenByDuplicate const): Deleted.
(JSC::PropertyNode::setIsOverriddenByDuplicate): Deleted.
(JSC::PropertyNode::putType const): Deleted.
(JSC::BracketAccessorNode::base const): Deleted.
(JSC::BracketAccessorNode::subscript const): Deleted.
(JSC::BracketAccessorNode::subscriptHasAssignments const): Deleted.
(JSC::DotAccessorNode::base const): Deleted.
(JSC::DotAccessorNode::identifier const): Deleted.
(JSC::SpreadExpressionNode::expression const): Deleted.
(JSC::ObjectSpreadExpressionNode::expression const): Deleted.
(JSC::BytecodeIntrinsicNode::type const): Deleted.
(JSC::BytecodeIntrinsicNode::emitter const): Deleted.
(JSC::BytecodeIntrinsicNode::identifier const): Deleted.
(JSC::TypeOfResolveNode::identifier const): Deleted.
(JSC::BitwiseNotNode::expr): Deleted.
(JSC::BitwiseNotNode::expr const): Deleted.
(JSC::AssignResolveNode::identifier const): Deleted.
(JSC::ExprStatementNode::expr const): Deleted.
(JSC::ForOfNode::isForAwait const): Deleted.
(JSC::ReturnNode::value): Deleted.
(JSC::ProgramNode::startColumn const): Deleted.
(JSC::ProgramNode::endColumn const): Deleted.
(JSC::EvalNode::startColumn const): Deleted.
(JSC::EvalNode::endColumn const): Deleted.
(JSC::ModuleProgramNode::startColumn const): Deleted.
(JSC::ModuleProgramNode::endColumn const): Deleted.
(JSC::ModuleProgramNode::moduleScopeData): Deleted.
(JSC::ModuleNameNode::moduleName): Deleted.
(JSC::ImportSpecifierNode::importedName): Deleted.
(JSC::ImportSpecifierNode::localName): Deleted.
(JSC::ImportSpecifierListNode::specifiers const): Deleted.
(JSC::ImportSpecifierListNode::append): Deleted.
(JSC::ImportDeclarationNode::specifierList const): Deleted.
(JSC::ImportDeclarationNode::moduleName const): Deleted.
(JSC::ExportAllDeclarationNode::moduleName const): Deleted.
(JSC::ExportDefaultDeclarationNode::declaration const): Deleted.
(JSC::ExportDefaultDeclarationNode::localName const): Deleted.
(JSC::ExportLocalDeclarationNode::declaration const): Deleted.
(JSC::ExportSpecifierNode::exportedName): Deleted.
(JSC::ExportSpecifierNode::localName): Deleted.
(JSC::ExportSpecifierListNode::specifiers const): Deleted.
(JSC::ExportSpecifierListNode::append): Deleted.
(JSC::ExportNamedDeclarationNode::specifierList const): Deleted.
(JSC::ExportNamedDeclarationNode::moduleName const): Deleted.
(JSC::ArrayPatternNode::appendIndex): Deleted.
(JSC::ObjectPatternNode::appendEntry): Deleted.
(JSC::ObjectPatternNode::setContainsRestElement): Deleted.
(JSC::ObjectPatternNode::setContainsComputedProperty): Deleted.
(JSC::DestructuringAssignmentNode::bindings): Deleted.
(JSC::FunctionParameters::size const): Deleted.
(JSC::FunctionParameters::append): Deleted.
(JSC::FunctionParameters::isSimpleParameterList const): Deleted.
(JSC::FuncDeclNode::metadata): Deleted.
(JSC::CaseClauseNode::expr const): Deleted.
(JSC::CaseClauseNode::setStartOffset): Deleted.
(JSC::ClauseListNode::getClause const): Deleted.
(JSC::ClauseListNode::getNext const): Deleted.

  • runtime/ExceptionHelpers.cpp:
  • runtime/JSObject.cpp:
Location:
trunk/Source/JavaScriptCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r233924 r233937  
     12018-07-18  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        [JSC] Reduce size of AST nodes
     4        https://bugs.webkit.org/show_bug.cgi?id=187689
     5
     6        Reviewed by Mark Lam.
     7
     8        We clean up AST nodes to reduce size. By doing so, we can reduce the memory consumption
     9        of ParserArena at peak state.
     10
     11        1. Annotate `final` to AST nodes to make them solid. And it allows the compiler to
     12        devirtualize a call to the function which are implemented in a final class.
     13
     14        2. Use default member initializers more.
     15
     16        3. And use `nullptr` instead of `0`.
     17
     18        4. Arrange the layout of AST nodes to reduce the size. It includes changing the order
     19        of classes in multiple inheritance. In particular, StatementNode is decreased from 48
     20        to 40. This decreases the sizes of all the derived Statement nodes.
     21
     22        * parser/NodeConstructors.h:
     23        (JSC::Node::Node):
     24        (JSC::StatementNode::StatementNode):
     25        (JSC::ElementNode::ElementNode):
     26        (JSC::ArrayNode::ArrayNode):
     27        (JSC::PropertyListNode::PropertyListNode):
     28        (JSC::ObjectLiteralNode::ObjectLiteralNode):
     29        (JSC::ArgumentListNode::ArgumentListNode):
     30        (JSC::ArgumentsNode::ArgumentsNode):
     31        (JSC::NewExprNode::NewExprNode):
     32        (JSC::BytecodeIntrinsicNode::BytecodeIntrinsicNode):
     33        (JSC::BinaryOpNode::BinaryOpNode):
     34        (JSC::LogicalOpNode::LogicalOpNode):
     35        (JSC::CommaNode::CommaNode):
     36        (JSC::SourceElements::SourceElements):
     37        (JSC::ClauseListNode::ClauseListNode):
     38        * parser/Nodes.cpp:
     39        (JSC::FunctionMetadataNode::FunctionMetadataNode):
     40        (JSC::FunctionMetadataNode::operator== const):
     41        (JSC::FunctionMetadataNode::dump const):
     42        * parser/Nodes.h:
     43        (JSC::BooleanNode::value): Deleted.
     44        (JSC::StringNode::value): Deleted.
     45        (JSC::TemplateExpressionListNode::value): Deleted.
     46        (JSC::TemplateExpressionListNode::next): Deleted.
     47        (JSC::TemplateStringNode::cooked): Deleted.
     48        (JSC::TemplateStringNode::raw): Deleted.
     49        (JSC::TemplateStringListNode::value): Deleted.
     50        (JSC::TemplateStringListNode::next): Deleted.
     51        (JSC::TemplateLiteralNode::templateStrings const): Deleted.
     52        (JSC::TemplateLiteralNode::templateExpressions const): Deleted.
     53        (JSC::TaggedTemplateNode::templateLiteral const): Deleted.
     54        (JSC::ResolveNode::identifier const): Deleted.
     55        (JSC::ElementNode::elision const): Deleted.
     56        (JSC::ElementNode::value): Deleted.
     57        (JSC::ElementNode::next): Deleted.
     58        (JSC::ArrayNode::elements const): Deleted.
     59        (JSC::PropertyNode::expressionName const): Deleted.
     60        (JSC::PropertyNode::name const): Deleted.
     61        (JSC::PropertyNode::type const): Deleted.
     62        (JSC::PropertyNode::needsSuperBinding const): Deleted.
     63        (JSC::PropertyNode::isClassProperty const): Deleted.
     64        (JSC::PropertyNode::isStaticClassProperty const): Deleted.
     65        (JSC::PropertyNode::isInstanceClassProperty const): Deleted.
     66        (JSC::PropertyNode::isOverriddenByDuplicate const): Deleted.
     67        (JSC::PropertyNode::setIsOverriddenByDuplicate): Deleted.
     68        (JSC::PropertyNode::putType const): Deleted.
     69        (JSC::BracketAccessorNode::base const): Deleted.
     70        (JSC::BracketAccessorNode::subscript const): Deleted.
     71        (JSC::BracketAccessorNode::subscriptHasAssignments const): Deleted.
     72        (JSC::DotAccessorNode::base const): Deleted.
     73        (JSC::DotAccessorNode::identifier const): Deleted.
     74        (JSC::SpreadExpressionNode::expression const): Deleted.
     75        (JSC::ObjectSpreadExpressionNode::expression const): Deleted.
     76        (JSC::BytecodeIntrinsicNode::type const): Deleted.
     77        (JSC::BytecodeIntrinsicNode::emitter const): Deleted.
     78        (JSC::BytecodeIntrinsicNode::identifier const): Deleted.
     79        (JSC::TypeOfResolveNode::identifier const): Deleted.
     80        (JSC::BitwiseNotNode::expr): Deleted.
     81        (JSC::BitwiseNotNode::expr const): Deleted.
     82        (JSC::AssignResolveNode::identifier const): Deleted.
     83        (JSC::ExprStatementNode::expr const): Deleted.
     84        (JSC::ForOfNode::isForAwait const): Deleted.
     85        (JSC::ReturnNode::value): Deleted.
     86        (JSC::ProgramNode::startColumn const): Deleted.
     87        (JSC::ProgramNode::endColumn const): Deleted.
     88        (JSC::EvalNode::startColumn const): Deleted.
     89        (JSC::EvalNode::endColumn const): Deleted.
     90        (JSC::ModuleProgramNode::startColumn const): Deleted.
     91        (JSC::ModuleProgramNode::endColumn const): Deleted.
     92        (JSC::ModuleProgramNode::moduleScopeData): Deleted.
     93        (JSC::ModuleNameNode::moduleName): Deleted.
     94        (JSC::ImportSpecifierNode::importedName): Deleted.
     95        (JSC::ImportSpecifierNode::localName): Deleted.
     96        (JSC::ImportSpecifierListNode::specifiers const): Deleted.
     97        (JSC::ImportSpecifierListNode::append): Deleted.
     98        (JSC::ImportDeclarationNode::specifierList const): Deleted.
     99        (JSC::ImportDeclarationNode::moduleName const): Deleted.
     100        (JSC::ExportAllDeclarationNode::moduleName const): Deleted.
     101        (JSC::ExportDefaultDeclarationNode::declaration const): Deleted.
     102        (JSC::ExportDefaultDeclarationNode::localName const): Deleted.
     103        (JSC::ExportLocalDeclarationNode::declaration const): Deleted.
     104        (JSC::ExportSpecifierNode::exportedName): Deleted.
     105        (JSC::ExportSpecifierNode::localName): Deleted.
     106        (JSC::ExportSpecifierListNode::specifiers const): Deleted.
     107        (JSC::ExportSpecifierListNode::append): Deleted.
     108        (JSC::ExportNamedDeclarationNode::specifierList const): Deleted.
     109        (JSC::ExportNamedDeclarationNode::moduleName const): Deleted.
     110        (JSC::ArrayPatternNode::appendIndex): Deleted.
     111        (JSC::ObjectPatternNode::appendEntry): Deleted.
     112        (JSC::ObjectPatternNode::setContainsRestElement): Deleted.
     113        (JSC::ObjectPatternNode::setContainsComputedProperty): Deleted.
     114        (JSC::DestructuringAssignmentNode::bindings): Deleted.
     115        (JSC::FunctionParameters::size const): Deleted.
     116        (JSC::FunctionParameters::append): Deleted.
     117        (JSC::FunctionParameters::isSimpleParameterList const): Deleted.
     118        (JSC::FuncDeclNode::metadata): Deleted.
     119        (JSC::CaseClauseNode::expr const): Deleted.
     120        (JSC::CaseClauseNode::setStartOffset): Deleted.
     121        (JSC::ClauseListNode::getClause const): Deleted.
     122        (JSC::ClauseListNode::getNext const): Deleted.
     123        * runtime/ExceptionHelpers.cpp:
     124        * runtime/JSObject.cpp:
     125
    11262018-07-18  Yusuke Suzuki  <utatane.tea@gmail.com>
    2127
  • trunk/Source/JavaScriptCore/parser/NodeConstructors.h

    r232232 r233937  
    4444    inline Node::Node(const JSTokenLocation& location)
    4545        : m_position(location.line, location.startOffset, location.lineStartOffset)
    46         , m_endOffset(-1)
    4746    {
    4847        ASSERT(location.startOffset >= location.lineStartOffset);
     
    5756    inline StatementNode::StatementNode(const JSTokenLocation& location)
    5857        : Node(location)
    59         , m_next(nullptr)
    60         , m_lastLine(-1)
    6158    {
    6259    }
     
    214211
    215212    inline ElementNode::ElementNode(int elision, ExpressionNode* node)
    216         : m_next(0)
     213        : m_node(node)
    217214        , m_elision(elision)
    218         , m_node(node)
    219215    {
    220216    }
    221217
    222218    inline ElementNode::ElementNode(ElementNode* l, int elision, ExpressionNode* node)
    223         : m_next(0)
     219        : m_node(node)
    224220        , m_elision(elision)
    225         , m_node(node)
    226221    {
    227222        l->m_next = this;
     
    230225    inline ArrayNode::ArrayNode(const JSTokenLocation& location, int elision)
    231226        : ExpressionNode(location)
    232         , m_element(0)
     227        , m_element(nullptr)
    233228        , m_elision(elision)
    234229        , m_optional(true)
     
    289284        : ExpressionNode(location)
    290285        , m_node(node)
    291         , m_next(0)
    292286    {
    293287    }
     
    296290        : ExpressionNode(location)
    297291        , m_node(node)
    298         , m_next(0)
    299292    {
    300293        list->m_next = this;
     
    303296    inline ObjectLiteralNode::ObjectLiteralNode(const JSTokenLocation& location)
    304297        : ExpressionNode(location)
    305         , m_list(0)
     298        , m_list(nullptr)
    306299    {
    307300    }
     
    343336    inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ExpressionNode* expr)
    344337        : ExpressionNode(location)
    345         , m_next(0)
    346338        , m_expr(expr)
    347339    {
     
    350342    inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ArgumentListNode* listNode, ExpressionNode* expr)
    351343        : ExpressionNode(location)
    352         , m_next(0)
    353344        , m_expr(expr)
    354345    {
     
    357348
    358349    inline ArgumentsNode::ArgumentsNode()
    359         : m_listNode(0)
     350        : m_listNode(nullptr)
    360351    {
    361352    }
     
    369360        : ExpressionNode(location)
    370361        , m_expr(expr)
    371         , m_args(0)
     362        , m_args(nullptr)
    372363    {
    373364    }
     
    426417        : ExpressionNode(location)
    427418        , ThrowableExpressionData(divot, divotStart, divotEnd)
     419        , m_emitter(emitter)
     420        , m_ident(ident)
     421        , m_args(args)
    428422        , m_type(type)
    429         , m_emitter(emitter)
    430         , m_ident(ident)
    431         , m_args(args)
    432423    {
    433424    }
     
    535526    inline BinaryOpNode::BinaryOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
    536527        : ExpressionNode(location)
     528        , m_rightHasAssignments(rightHasAssignments)
     529        , m_opcodeID(opcodeID)
    537530        , m_expr1(expr1)
    538531        , m_expr2(expr2)
    539         , m_opcodeID(opcodeID)
    540         , m_rightHasAssignments(rightHasAssignments)
    541532    {
    542533    }
     
    544535    inline BinaryOpNode::BinaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
    545536        : ExpressionNode(location, type)
     537        , m_rightHasAssignments(rightHasAssignments)
     538        , m_opcodeID(opcodeID)
    546539        , m_expr1(expr1)
    547540        , m_expr2(expr2)
    548         , m_opcodeID(opcodeID)
    549         , m_rightHasAssignments(rightHasAssignments)
    550541    {
    551542    }
     
    674665    inline LogicalOpNode::LogicalOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper)
    675666        : ExpressionNode(location, ResultType::forLogicalOp(expr1->resultDescriptor(), expr2->resultDescriptor()))
     667        , m_operator(oper)
    676668        , m_expr1(expr1)
    677669        , m_expr2(expr2)
    678         , m_operator(oper)
    679670    {
    680671    }
     
    760751        : ExpressionNode(location)
    761752        , m_expr(expr)
    762         , m_next(nullptr)
    763753    {
    764754    }
    765755
    766756    inline SourceElements::SourceElements()
    767         : m_head(nullptr)
    768         , m_tail(nullptr)
    769757    {
    770758    }
     
    10231011    inline ClauseListNode::ClauseListNode(CaseClauseNode* clause)
    10241012        : m_clause(clause)
    1025         , m_next(0)
    10261013    {
    10271014    }
     
    10291016    inline ClauseListNode::ClauseListNode(ClauseListNode* clauseList, CaseClauseNode* clause)
    10301017        : m_clause(clause)
    1031         , m_next(0)
    10321018    {
    10331019        clauseList->m_next = this;
  • trunk/Source/JavaScriptCore/parser/Nodes.cpp

    r233377 r233937  
    198198    ConstructorKind constructorKind, SuperBinding superBinding, unsigned parameterCount, SourceParseMode mode, bool isArrowFunctionBodyExpression)
    199199        : Node(endLocation)
     200        , m_isInStrictContext(isInStrictContext)
     201        , m_superBinding(static_cast<unsigned>(superBinding))
     202        , m_constructorKind(static_cast<unsigned>(constructorKind))
     203        , m_isArrowFunctionBodyExpression(isArrowFunctionBodyExpression)
     204        , m_parseMode(mode)
    200205        , m_startColumn(startColumn)
    201206        , m_endColumn(endColumn)
     
    205210        , m_startStartOffset(startLocation.startOffset)
    206211        , m_parameterCount(parameterCount)
    207         , m_parseMode(mode)
    208         , m_isInStrictContext(isInStrictContext)
    209         , m_superBinding(static_cast<unsigned>(superBinding))
    210         , m_constructorKind(static_cast<unsigned>(constructorKind))
    211         , m_isArrowFunctionBodyExpression(isArrowFunctionBodyExpression)
    212212{
    213213    ASSERT(m_superBinding == static_cast<unsigned>(superBinding));
     
    221221    ConstructorKind constructorKind, SuperBinding superBinding, unsigned parameterCount, SourceParseMode mode, bool isArrowFunctionBodyExpression)
    222222        : Node(endLocation)
     223        , m_isInStrictContext(isInStrictContext)
     224        , m_superBinding(static_cast<unsigned>(superBinding))
     225        , m_constructorKind(static_cast<unsigned>(constructorKind))
     226        , m_isArrowFunctionBodyExpression(isArrowFunctionBodyExpression)
     227        , m_parseMode(mode)
    223228        , m_startColumn(startColumn)
    224229        , m_endColumn(endColumn)
     
    228233        , m_startStartOffset(startLocation.startOffset)
    229234        , m_parameterCount(parameterCount)
    230         , m_parseMode(mode)
    231         , m_isInStrictContext(isInStrictContext)
    232         , m_superBinding(static_cast<unsigned>(superBinding))
    233         , m_constructorKind(static_cast<unsigned>(constructorKind))
    234         , m_isArrowFunctionBodyExpression(isArrowFunctionBodyExpression)
    235235{
    236236    ASSERT(m_superBinding == static_cast<unsigned>(superBinding));
     
    253253bool FunctionMetadataNode::operator==(const FunctionMetadataNode& other) const
    254254{
    255     return m_ident == other.m_ident
     255    return m_parseMode== other.m_parseMode
     256        && m_isInStrictContext == other.m_isInStrictContext
     257        && m_superBinding == other.m_superBinding
     258        && m_constructorKind == other.m_constructorKind
     259        && m_isArrowFunctionBodyExpression == other.m_isArrowFunctionBodyExpression
     260        && m_ident == other.m_ident
    256261        && m_ecmaName == other.m_ecmaName
    257262        && m_inferredName == other.m_inferredName
     
    267272        && m_parameterCount== other.m_parameterCount
    268273        && m_lastLine== other.m_lastLine
    269         && m_parseMode== other.m_parseMode
    270         && m_isInStrictContext == other.m_isInStrictContext
    271         && m_superBinding == other.m_superBinding
    272         && m_constructorKind == other.m_constructorKind
    273         && m_isArrowFunctionBodyExpression == other.m_isArrowFunctionBodyExpression
    274274        && m_position == other.m_position;
    275275}
     
    277277void FunctionMetadataNode::dump(PrintStream& stream) const
    278278{
     279    stream.println("m_parseMode ", static_cast<uint32_t>(m_parseMode));
     280    stream.println("m_isInStrictContext ", m_isInStrictContext);
     281    stream.println("m_superBinding ", m_superBinding);
     282    stream.println("m_constructorKind ", m_constructorKind);
     283    stream.println("m_isArrowFunctionBodyExpression ", m_isArrowFunctionBodyExpression);
    279284    stream.println("m_ident ", m_ident);
    280285    stream.println("m_ecmaName ", m_ecmaName);
     
    290295    stream.println("m_parameterCount ", m_parameterCount);
    291296    stream.println("m_lastLine ", m_lastLine);
    292     stream.println("m_parseMode ", static_cast<uint32_t>(m_parseMode));
    293     stream.println("m_isInStrictContext ", m_isInStrictContext);
    294     stream.println("m_superBinding ", m_superBinding);
    295     stream.println("m_constructorKind ", m_constructorKind);
    296     stream.println("m_isArrowFunctionBodyExpression ", m_isArrowFunctionBodyExpression);
    297297    stream.println("position().line ", position().line);
    298298    stream.println("position().offset ", position().offset);
  • trunk/Source/JavaScriptCore/parser/Nodes.h

    r233377 r233937  
    5656    typedef SmallPtrSet<UniquedStringImpl*> UniquedStringImplPtrSet;
    5757
    58     enum Operator {
     58    enum Operator : uint8_t {
    5959        OpEqual,
    6060        OpPlusEq,
     
    7474    };
    7575   
    76     enum LogicalOperator {
     76    enum LogicalOperator : uint8_t {
    7777        OpLogicalAnd,
    7878        OpLogicalOr
    7979    };
    8080
    81     enum FallThroughMode {
     81    enum FallThroughMode : uint8_t {
    8282        FallThroughMeansTrue = 0,
    8383        FallThroughMeansFalse = 1
     
    9090
    9191    struct SwitchInfo {
    92         enum SwitchType { SwitchNone, SwitchImmediate, SwitchCharacter, SwitchString };
     92        enum SwitchType : uint8_t { SwitchNone, SwitchImmediate, SwitchCharacter, SwitchString };
    9393        uint32_t bytecodeOffset;
    9494        SwitchType switchType;
    9595    };
    9696
    97     enum class AssignmentContext {
     97    enum class AssignmentContext : uint8_t {
    9898        DeclarationStatement,
    9999        ConstDeclarationStatement,
     
    162162    protected:
    163163        JSTextPosition m_position;
    164         int m_endOffset;
     164        int m_endOffset { -1 };
    165165        bool m_needsDebugHook { false };
    166166    };
     
    246246
    247247    protected:
    248         StatementNode* m_next;
    249         int m_lastLine;
     248        int m_lastLine { -1 };
     249        StatementNode* m_next { nullptr };
    250250    };
    251251
     
    281281    };
    282282
    283     class NullNode : public ConstantNode {
     283    class NullNode final : public ConstantNode {
    284284    public:
    285285        NullNode(const JSTokenLocation&);
     
    290290    };
    291291
    292     class BooleanNode : public ConstantNode {
     292    class BooleanNode final : public ConstantNode {
    293293    public:
    294294        BooleanNode(const JSTokenLocation&, bool value);
     
    325325
    326326    // An integer node represent a number represented as an integer (e.g. 42 instead of 42., 42.0, 42e0)
    327     class IntegerNode : public DoubleNode {
     327    class IntegerNode final : public DoubleNode {
    328328    public:
    329329        IntegerNode(const JSTokenLocation&, double value);
     
    331331    };
    332332
    333     class StringNode : public ConstantNode {
     333    class StringNode final : public ConstantNode {
    334334    public:
    335335        StringNode(const JSTokenLocation&, const Identifier&);
     
    514514    };
    515515
    516     class TemplateExpressionListNode : public ParserArenaFreeable {
     516    class TemplateExpressionListNode final : public ParserArenaFreeable {
    517517    public:
    518518        TemplateExpressionListNode(ExpressionNode*);
     
    527527    };
    528528
    529     class TemplateStringNode : public ExpressionNode {
     529    class TemplateStringNode final : public ExpressionNode {
    530530    public:
    531531        TemplateStringNode(const JSTokenLocation&, const Identifier* cooked, const Identifier* raw);
     
    541541    };
    542542
    543     class TemplateStringListNode : public ParserArenaFreeable {
     543    class TemplateStringListNode final : public ParserArenaFreeable {
    544544    public:
    545545        TemplateStringListNode(TemplateStringNode*);
     
    554554    };
    555555
    556     class TemplateLiteralNode : public ExpressionNode {
     556    class TemplateLiteralNode final : public ExpressionNode {
    557557    public:
    558558        TemplateLiteralNode(const JSTokenLocation&, TemplateStringListNode*);
     
    569569    };
    570570
    571     class TaggedTemplateNode : public ExpressionNode, public ThrowableExpressionData {
     571    class TaggedTemplateNode final : public ExpressionNode, public ThrowableExpressionData {
    572572    public:
    573573        TaggedTemplateNode(const JSTokenLocation&, ExpressionNode*, TemplateLiteralNode*);
     
    582582    };
    583583
    584     class RegExpNode : public ExpressionNode, public ThrowableExpressionData {
     584    class RegExpNode final : public ExpressionNode, public ThrowableExpressionData {
    585585    public:
    586586        RegExpNode(const JSTokenLocation&, const Identifier& pattern, const Identifier& flags);
     
    593593    };
    594594
    595     class ThisNode : public ExpressionNode {
     595    class ThisNode final : public ExpressionNode {
    596596    public:
    597597        ThisNode(const JSTokenLocation&);
     
    610610    };
    611611
    612     class ImportNode : public ExpressionNode, public ThrowableExpressionData {
     612    class ImportNode final : public ExpressionNode, public ThrowableExpressionData {
    613613    public:
    614614        ImportNode(const JSTokenLocation&, ExpressionNode*);
     
    649649    };
    650650
    651     class ResolveNode : public ExpressionNode {
     651    class ResolveNode final : public ExpressionNode {
    652652    public:
    653653        ResolveNode(const JSTokenLocation&, const Identifier&, const JSTextPosition& start);
     
    666666    };
    667667
    668     class ElementNode : public ParserArenaFreeable {
     668    class ElementNode final : public ParserArenaFreeable {
    669669    public:
    670670        ElementNode(int elision, ExpressionNode*);
     
    676676
    677677    private:
    678         ElementNode* m_next;
     678        ElementNode* m_next { nullptr };
     679        ExpressionNode* m_node;
    679680        int m_elision;
    680         ExpressionNode* m_node;
    681     };
    682 
    683     class ArrayNode : public ExpressionNode {
     681    };
     682
     683    class ArrayNode final : public ExpressionNode {
    684684    public:
    685685        ArrayNode(const JSTokenLocation&, int elision);
     
    702702    };
    703703
    704     enum class ClassElementTag { No, Instance, Static, LastTag };
    705     class PropertyNode : public ParserArenaFreeable {
    706     public:
    707         enum Type { Constant = 1, Getter = 2, Setter = 4, Computed = 8, Shorthand = 16, Spread = 32 };
    708         enum PutType { Unknown, KnownDirect };
     704    enum class ClassElementTag : uint8_t { No, Instance, Static, LastTag };
     705    class PropertyNode final : public ParserArenaFreeable {
     706    public:
     707        enum Type : uint8_t { Constant = 1, Getter = 2, Setter = 4, Computed = 8, Shorthand = 16, Spread = 32 };
     708        enum PutType : uint8_t { Unknown, KnownDirect };
    709709
    710710        PropertyNode(const Identifier&, ExpressionNode*, Type, PutType, SuperBinding, ClassElementTag);
     
    737737    };
    738738
    739     class PropertyListNode : public ExpressionNode {
     739    class PropertyListNode final : public ExpressionNode {
    740740    public:
    741741        PropertyListNode(const JSTokenLocation&, PropertyNode*);
     
    754754
    755755        PropertyNode* m_node;
    756         PropertyListNode* m_next;
    757     };
    758 
    759     class ObjectLiteralNode : public ExpressionNode {
     756        PropertyListNode* m_next { nullptr };
     757    };
     758
     759    class ObjectLiteralNode final : public ExpressionNode {
    760760    public:
    761761        ObjectLiteralNode(const JSTokenLocation&);
     
    769769    };
    770770   
    771     class BracketAccessorNode : public ExpressionNode, public ThrowableExpressionData {
     771    class BracketAccessorNode final : public ExpressionNode, public ThrowableExpressionData {
    772772    public:
    773773        BracketAccessorNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments);
     
    789789    };
    790790
    791     class DotAccessorNode : public ExpressionNode, public ThrowableExpressionData {
     791    class DotAccessorNode final : public ExpressionNode, public ThrowableExpressionData {
    792792    public:
    793793        DotAccessorNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&);
     
    806806    };
    807807
    808     class SpreadExpressionNode : public ExpressionNode, public ThrowableExpressionData {
     808    class SpreadExpressionNode final : public ExpressionNode, public ThrowableExpressionData {
    809809    public:
    810810        SpreadExpressionNode(const JSTokenLocation&, ExpressionNode*);
     
    819819    };
    820820   
    821     class ObjectSpreadExpressionNode : public ExpressionNode, public ThrowableExpressionData {
     821    class ObjectSpreadExpressionNode final : public ExpressionNode, public ThrowableExpressionData {
    822822    public:
    823823        ObjectSpreadExpressionNode(const JSTokenLocation&, ExpressionNode*);
     
    831831    };
    832832
    833     class ArgumentListNode : public ExpressionNode {
     833    class ArgumentListNode final : public ExpressionNode {
    834834    public:
    835835        ArgumentListNode(const JSTokenLocation&, ExpressionNode*);
    836836        ArgumentListNode(const JSTokenLocation&, ArgumentListNode*, ExpressionNode*);
    837837
    838         ArgumentListNode* m_next;
     838        ArgumentListNode* m_next { nullptr };
    839839        ExpressionNode* m_expr;
    840840
     
    843843    };
    844844
    845     class ArgumentsNode : public ParserArenaFreeable {
     845    class ArgumentsNode final : public ParserArenaFreeable {
    846846    public:
    847847        ArgumentsNode();
     
    851851    };
    852852
    853     class NewExprNode : public ExpressionNode, public ThrowableExpressionData {
     853    class NewExprNode final : public ExpressionNode, public ThrowableExpressionData {
    854854    public:
    855855        NewExprNode(const JSTokenLocation&, ExpressionNode*);
     
    863863    };
    864864
    865     class EvalFunctionCallNode : public ExpressionNode, public ThrowableExpressionData {
     865    class EvalFunctionCallNode final : public ExpressionNode, public ThrowableExpressionData {
    866866    public:
    867867        EvalFunctionCallNode(const JSTokenLocation&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    873873    };
    874874
    875     class FunctionCallValueNode : public ExpressionNode, public ThrowableExpressionData {
     875    class FunctionCallValueNode final : public ExpressionNode, public ThrowableExpressionData {
    876876    public:
    877877        FunctionCallValueNode(const JSTokenLocation&, ExpressionNode*, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    884884    };
    885885
    886     class FunctionCallResolveNode : public ExpressionNode, public ThrowableExpressionData {
     886    class FunctionCallResolveNode final : public ExpressionNode, public ThrowableExpressionData {
    887887    public:
    888888        FunctionCallResolveNode(const JSTokenLocation&, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    895895    };
    896896   
    897     class FunctionCallBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
     897    class FunctionCallBracketNode final : public ExpressionNode, public ThrowableSubExpressionData {
    898898    public:
    899899        FunctionCallBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    921921    };
    922922
    923     class BytecodeIntrinsicNode : public ExpressionNode, public ThrowableExpressionData {
    924     public:
    925         enum class Type {
     923    class BytecodeIntrinsicNode final : public ExpressionNode, public ThrowableExpressionData {
     924    public:
     925        enum class Type : uint8_t {
    926926            Constant,
    927927            Function
     
    946946        RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
    947947
    948         Type m_type;
    949948        EmitterType m_emitter;
    950949        const Identifier& m_ident;
    951950        ArgumentsNode* m_args;
    952     };
    953 
    954     class CallFunctionCallDotNode : public FunctionCallDotNode {
     951        Type m_type;
     952    };
     953
     954    class CallFunctionCallDotNode final : public FunctionCallDotNode {
    955955    public:
    956956        CallFunctionCallDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd, size_t distanceToInnermostCallOrApply);
     
    961961    };
    962962   
    963     class ApplyFunctionCallDotNode : public FunctionCallDotNode {
     963    class ApplyFunctionCallDotNode final : public FunctionCallDotNode {
    964964    public:
    965965        ApplyFunctionCallDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd, size_t distanceToInnermostCallOrApply);
     
    970970    };
    971971
    972     class DeleteResolveNode : public ExpressionNode, public ThrowableExpressionData {
     972    class DeleteResolveNode final : public ExpressionNode, public ThrowableExpressionData {
    973973    public:
    974974        DeleteResolveNode(const JSTokenLocation&, const Identifier&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    980980    };
    981981
    982     class DeleteBracketNode : public ExpressionNode, public ThrowableExpressionData {
     982    class DeleteBracketNode final : public ExpressionNode, public ThrowableExpressionData {
    983983    public:
    984984        DeleteBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    991991    };
    992992
    993     class DeleteDotNode : public ExpressionNode, public ThrowableExpressionData {
     993    class DeleteDotNode final : public ExpressionNode, public ThrowableExpressionData {
    994994    public:
    995995        DeleteDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    10021002    };
    10031003
    1004     class DeleteValueNode : public ExpressionNode {
     1004    class DeleteValueNode final : public ExpressionNode {
    10051005    public:
    10061006        DeleteValueNode(const JSTokenLocation&, ExpressionNode*);
     
    10121012    };
    10131013
    1014     class VoidNode : public ExpressionNode {
     1014    class VoidNode final : public ExpressionNode {
    10151015    public:
    10161016        VoidNode(const JSTokenLocation&, ExpressionNode*);
     
    10221022    };
    10231023
    1024     class TypeOfResolveNode : public ExpressionNode {
     1024    class TypeOfResolveNode final : public ExpressionNode {
    10251025    public:
    10261026        TypeOfResolveNode(const JSTokenLocation&, const Identifier&);
     
    10341034    };
    10351035
    1036     class TypeOfValueNode : public ExpressionNode {
     1036    class TypeOfValueNode final : public ExpressionNode {
    10371037    public:
    10381038        TypeOfValueNode(const JSTokenLocation&, ExpressionNode*);
     
    10581058    };
    10591059
    1060     class PostfixNode : public PrefixNode {
     1060    class PostfixNode final : public PrefixNode {
    10611061    public:
    10621062        PostfixNode(const JSTokenLocation&, ExpressionNode*, Operator, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    10851085    };
    10861086
    1087     class UnaryPlusNode : public UnaryOpNode {
     1087    class UnaryPlusNode final : public UnaryOpNode {
    10881088    public:
    10891089        UnaryPlusNode(const JSTokenLocation&, ExpressionNode*);
     
    10951095    };
    10961096
    1097     class NegateNode : public UnaryOpNode {
     1097    class NegateNode final : public UnaryOpNode {
    10981098    public:
    10991099        NegateNode(const JSTokenLocation&, ExpressionNode*);
    11001100    };
    11011101
    1102     class BitwiseNotNode : public ExpressionNode {
     1102    class BitwiseNotNode final : public ExpressionNode {
    11031103    public:
    11041104        BitwiseNotNode(const JSTokenLocation&, ExpressionNode*);
     
    11141114    };
    11151115 
    1116     class LogicalNotNode : public UnaryOpNode {
     1116    class LogicalNotNode final : public UnaryOpNode {
    11171117    public:
    11181118        LogicalNotNode(const JSTokenLocation&, ExpressionNode*);
     
    11351135
    11361136    private:
    1137         enum class UInt32Result { UInt32, Constant, };
     1137        enum class UInt32Result : uint8_t { UInt32, Constant, };
    11381138
    11391139        void tryFoldToBranch(BytecodeGenerator&, TriState& branchCondition, ExpressionNode*& branchExpression);
     
    11431143        OpcodeID opcodeID() const { return m_opcodeID; }
    11441144
     1145    protected:
     1146        bool m_rightHasAssignments;
     1147        bool m_shouldToUnsignedResult { true };
     1148    private:
     1149        OpcodeID m_opcodeID;
    11451150    protected:
    11461151        ExpressionNode* m_expr1;
    11471152        ExpressionNode* m_expr2;
    1148     private:
    1149         OpcodeID m_opcodeID;
    1150     protected:
    1151         bool m_rightHasAssignments;
    1152         bool m_shouldToUnsignedResult { true };
    1153     };
    1154 
    1155     class PowNode : public BinaryOpNode {
     1153    };
     1154
     1155    class PowNode final : public BinaryOpNode {
    11561156    public:
    11571157        PowNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    11581158    };
    11591159
    1160     class MultNode : public BinaryOpNode {
     1160    class MultNode final : public BinaryOpNode {
    11611161    public:
    11621162        MultNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    11631163    };
    11641164
    1165     class DivNode : public BinaryOpNode {
     1165    class DivNode final : public BinaryOpNode {
    11661166    public:
    11671167        DivNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    11681168    };
    11691169
    1170     class ModNode : public BinaryOpNode {
     1170    class ModNode final : public BinaryOpNode {
    11711171    public:
    11721172        ModNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    11731173    };
    11741174
    1175     class AddNode : public BinaryOpNode {
     1175    class AddNode final : public BinaryOpNode {
    11761176    public:
    11771177        AddNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
     
    11801180    };
    11811181
    1182     class SubNode : public BinaryOpNode {
     1182    class SubNode final : public BinaryOpNode {
    11831183    public:
    11841184        SubNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
     
    11871187    };
    11881188
    1189     class LeftShiftNode : public BinaryOpNode {
     1189    class LeftShiftNode final : public BinaryOpNode {
    11901190    public:
    11911191        LeftShiftNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    11921192    };
    11931193
    1194     class RightShiftNode : public BinaryOpNode {
     1194    class RightShiftNode final : public BinaryOpNode {
    11951195    public:
    11961196        RightShiftNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    11971197    };
    11981198
    1199     class UnsignedRightShiftNode : public BinaryOpNode {
     1199    class UnsignedRightShiftNode final : public BinaryOpNode {
    12001200    public:
    12011201        UnsignedRightShiftNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    12021202    };
    12031203
    1204     class LessNode : public BinaryOpNode {
     1204    class LessNode final : public BinaryOpNode {
    12051205    public:
    12061206        LessNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    12071207    };
    12081208
    1209     class GreaterNode : public BinaryOpNode {
     1209    class GreaterNode final : public BinaryOpNode {
    12101210    public:
    12111211        GreaterNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    12121212    };
    12131213
    1214     class LessEqNode : public BinaryOpNode {
     1214    class LessEqNode final : public BinaryOpNode {
    12151215    public:
    12161216        LessEqNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    12171217    };
    12181218
    1219     class GreaterEqNode : public BinaryOpNode {
     1219    class GreaterEqNode final : public BinaryOpNode {
    12201220    public:
    12211221        GreaterEqNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
     
    12311231    };
    12321232   
    1233     class InstanceOfNode : public ThrowableBinaryOpNode {
     1233    class InstanceOfNode final : public ThrowableBinaryOpNode {
    12341234    public:
    12351235        InstanceOfNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
     
    12391239    };
    12401240
    1241     class InNode : public ThrowableBinaryOpNode {
     1241    class InNode final : public ThrowableBinaryOpNode {
    12421242    public:
    12431243        InNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
     
    12471247    };
    12481248
    1249     class EqualNode : public BinaryOpNode {
     1249    class EqualNode final : public BinaryOpNode {
    12501250    public:
    12511251        EqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
     
    12551255    };
    12561256
    1257     class NotEqualNode : public BinaryOpNode {
     1257    class NotEqualNode final : public BinaryOpNode {
    12581258    public:
    12591259        NotEqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    12601260    };
    12611261
    1262     class StrictEqualNode : public BinaryOpNode {
     1262    class StrictEqualNode final : public BinaryOpNode {
    12631263    public:
    12641264        StrictEqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
     
    12681268    };
    12691269
    1270     class NotStrictEqualNode : public BinaryOpNode {
     1270    class NotStrictEqualNode final : public BinaryOpNode {
    12711271    public:
    12721272        NotStrictEqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    12731273    };
    12741274
    1275     class BitAndNode : public BinaryOpNode {
     1275    class BitAndNode final : public BinaryOpNode {
    12761276    public:
    12771277        BitAndNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    12781278    };
    12791279
    1280     class BitOrNode : public BinaryOpNode {
     1280    class BitOrNode final : public BinaryOpNode {
    12811281    public:
    12821282        BitOrNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
    12831283    };
    12841284
    1285     class BitXOrNode : public BinaryOpNode {
     1285    class BitXOrNode final : public BinaryOpNode {
    12861286    public:
    12871287        BitXOrNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
     
    12891289
    12901290    // m_expr1 && m_expr2, m_expr1 || m_expr2
    1291     class LogicalOpNode : public ExpressionNode {
     1291    class LogicalOpNode final : public ExpressionNode {
    12921292    public:
    12931293        LogicalOpNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator);
     
    12971297        void emitBytecodeInConditionContext(BytecodeGenerator&, Label& trueTarget, Label& falseTarget, FallThroughMode) override;
    12981298
     1299        LogicalOperator m_operator;
    12991300        ExpressionNode* m_expr1;
    13001301        ExpressionNode* m_expr2;
    1301         LogicalOperator m_operator;
    13021302    };
    13031303
    13041304    // The ternary operator, "m_logical ? m_expr1 : m_expr2"
    1305     class ConditionalNode : public ExpressionNode {
     1305    class ConditionalNode final : public ExpressionNode {
    13061306    public:
    13071307        ConditionalNode(const JSTokenLocation&, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2);
     
    13151315    };
    13161316
    1317     class ReadModifyResolveNode : public ExpressionNode, public ThrowableExpressionData {
     1317    class ReadModifyResolveNode final : public ExpressionNode, public ThrowableExpressionData {
    13181318    public:
    13191319        ReadModifyResolveNode(const JSTokenLocation&, const Identifier&, Operator, ExpressionNode*  right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    13281328    };
    13291329
    1330     class AssignResolveNode : public ExpressionNode, public ThrowableExpressionData {
     1330    class AssignResolveNode final : public ExpressionNode, public ThrowableExpressionData {
    13311331    public:
    13321332        AssignResolveNode(const JSTokenLocation&, const Identifier&, ExpressionNode* right, AssignmentContext);
     
    13421342    };
    13431343
    1344     class ReadModifyBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
     1344    class ReadModifyBracketNode final : public ExpressionNode, public ThrowableSubExpressionData {
    13451345    public:
    13461346        ReadModifyBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, Operator, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    13571357    };
    13581358
    1359     class AssignBracketNode : public ExpressionNode, public ThrowableExpressionData {
     1359    class AssignBracketNode final : public ExpressionNode, public ThrowableExpressionData {
    13601360    public:
    13611361        AssignBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    13711371    };
    13721372
    1373     class AssignDotNode : public ExpressionNode, public ThrowableExpressionData {
     1373    class AssignDotNode final : public ExpressionNode, public ThrowableExpressionData {
    13741374    public:
    13751375        AssignDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    13841384    };
    13851385
    1386     class ReadModifyDotNode : public ExpressionNode, public ThrowableSubExpressionData {
     1386    class ReadModifyDotNode final : public ExpressionNode, public ThrowableSubExpressionData {
    13871387    public:
    13881388        ReadModifyDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, Operator, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    13981398    };
    13991399
    1400     class AssignErrorNode : public ExpressionNode, public ThrowableExpressionData {
     1400    class AssignErrorNode final : public ExpressionNode, public ThrowableExpressionData {
    14011401    public:
    14021402        AssignErrorNode(const JSTokenLocation&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     
    14181418
    14191419        ExpressionNode* m_expr;
    1420         CommaNode* m_next;
     1420        CommaNode* m_next { nullptr };
    14211421    };
    14221422   
     
    14371437
    14381438    private:
    1439         StatementNode* m_head;
    1440         StatementNode* m_tail;
    1441     };
    1442 
    1443     class BlockNode : public StatementNode, public VariableEnvironmentNode {
     1439        StatementNode* m_head { nullptr };
     1440        StatementNode* m_tail { nullptr };
     1441    };
     1442
     1443    class BlockNode final : public StatementNode, public VariableEnvironmentNode {
    14441444        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(BlockNode);
    14451445    public:
     
    14601460    };
    14611461
    1462     class EmptyStatementNode : public StatementNode {
     1462    class EmptyStatementNode final : public StatementNode {
    14631463    public:
    14641464        EmptyStatementNode(const JSTokenLocation&);
     
    14711471    };
    14721472   
    1473     class DebuggerStatementNode : public StatementNode {
     1473    class DebuggerStatementNode final : public StatementNode {
    14741474    public:
    14751475        DebuggerStatementNode(const JSTokenLocation&);
     
    14821482    };
    14831483
    1484     class ExprStatementNode : public StatementNode {
     1484    class ExprStatementNode final : public StatementNode {
    14851485    public:
    14861486        ExprStatementNode(const JSTokenLocation&, ExpressionNode*);
     
    14961496    };
    14971497
    1498     class DeclarationStatement : public StatementNode {
     1498    class DeclarationStatement final : public StatementNode {
    14991499    public:
    15001500        DeclarationStatement(const JSTokenLocation&, ExpressionNode*);
     
    15071507    };
    15081508
    1509     class EmptyVarExpression : public ExpressionNode {
     1509    class EmptyVarExpression final : public ExpressionNode {
    15101510    public:
    15111511        EmptyVarExpression(const JSTokenLocation&, const Identifier&);
     
    15171517    };
    15181518
    1519     class EmptyLetExpression : public ExpressionNode {
     1519    class EmptyLetExpression final : public ExpressionNode {
    15201520    public:
    15211521        EmptyLetExpression(const JSTokenLocation&, const Identifier&);
     
    15271527    };
    15281528
    1529     class IfElseNode : public StatementNode {
     1529    class IfElseNode final : public StatementNode {
    15301530    public:
    15311531        IfElseNode(const JSTokenLocation&, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock);
     
    15411541    };
    15421542
    1543     class DoWhileNode : public StatementNode {
     1543    class DoWhileNode final : public StatementNode {
    15441544    public:
    15451545        DoWhileNode(const JSTokenLocation&, StatementNode*, ExpressionNode*);
     
    15521552    };
    15531553
    1554     class WhileNode : public StatementNode {
     1554    class WhileNode final : public StatementNode {
    15551555    public:
    15561556        WhileNode(const JSTokenLocation&, ExpressionNode*, StatementNode*);
     
    15631563    };
    15641564
    1565     class ForNode : public StatementNode, public VariableEnvironmentNode {
     1565    class ForNode final : public StatementNode, public VariableEnvironmentNode {
    15661566        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ForNode);
    15671567    public:
     
    15931593    };
    15941594   
    1595     class ForInNode : public EnumerationNode {
     1595    class ForInNode final : public EnumerationNode {
    15961596        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ForInNode);
    15971597    public:
     
    16051605    };
    16061606   
    1607     class ForOfNode : public EnumerationNode {
     1607    class ForOfNode final : public EnumerationNode {
    16081608        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ForOfNode);
    16091609    public:
     
    16181618    };
    16191619
    1620     class ContinueNode : public StatementNode, public ThrowableExpressionData {
     1620    class ContinueNode final : public StatementNode, public ThrowableExpressionData {
    16211621    public:
    16221622        ContinueNode(const JSTokenLocation&, const Identifier&);
     
    16311631    };
    16321632
    1633     class BreakNode : public StatementNode, public ThrowableExpressionData {
     1633    class BreakNode final : public StatementNode, public ThrowableExpressionData {
    16341634    public:
    16351635        BreakNode(const JSTokenLocation&, const Identifier&);
     
    16441644    };
    16451645
    1646     class ReturnNode : public StatementNode, public ThrowableExpressionData {
     1646    class ReturnNode final : public StatementNode, public ThrowableExpressionData {
    16471647    public:
    16481648        ReturnNode(const JSTokenLocation&, ExpressionNode* value);
     
    16581658    };
    16591659
    1660     class WithNode : public StatementNode {
     1660    class WithNode final : public StatementNode {
    16611661    public:
    16621662        WithNode(const JSTokenLocation&, ExpressionNode*, StatementNode*, const JSTextPosition& divot, uint32_t expressionLength);
     
    16711671    };
    16721672
    1673     class LabelNode : public StatementNode, public ThrowableExpressionData {
     1673    class LabelNode final : public StatementNode, public ThrowableExpressionData {
    16741674    public:
    16751675        LabelNode(const JSTokenLocation&, const Identifier& name, StatementNode*);
     
    16851685    };
    16861686
    1687     class ThrowNode : public StatementNode, public ThrowableExpressionData {
     1687    class ThrowNode final : public StatementNode, public ThrowableExpressionData {
    16881688    public:
    16891689        ThrowNode(const JSTokenLocation&, ExpressionNode*);
     
    16951695    };
    16961696
    1697     class TryNode : public StatementNode, public VariableEnvironmentNode {
     1697    class TryNode final : public StatementNode, public VariableEnvironmentNode {
    16981698        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(TryNode);
    16991699    public:
     
    17871787    };
    17881788
    1789     class ProgramNode : public ScopeNode {
     1789    class ProgramNode final : public ScopeNode {
    17901790    public:
    17911791        ProgramNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&&, VariableEnvironment&, UniquedStringImplPtrSet&&, FunctionParameters*, const SourceCode&, CodeFeatures, InnerArrowFunctionCodeFeatures, int numConstants, RefPtr<ModuleScopeData>&&);
     
    18021802    };
    18031803
    1804     class EvalNode : public ScopeNode {
     1804    class EvalNode final : public ScopeNode {
    18051805    public:
    18061806        EvalNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&&, VariableEnvironment&, UniquedStringImplPtrSet&&, FunctionParameters*, const SourceCode&, CodeFeatures, InnerArrowFunctionCodeFeatures, int numConstants, RefPtr<ModuleScopeData>&&);
     
    18171817    };
    18181818
    1819     class ModuleProgramNode : public ScopeNode {
     1819    class ModuleProgramNode final : public ScopeNode {
    18201820    public:
    18211821        ModuleProgramNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&&, VariableEnvironment&, UniquedStringImplPtrSet&&, FunctionParameters*, const SourceCode&, CodeFeatures, InnerArrowFunctionCodeFeatures, int numConstants, RefPtr<ModuleScopeData>&&);
     
    18381838    };
    18391839
    1840     class ModuleNameNode : public Node {
     1840    class ModuleNameNode final : public Node {
    18411841    public:
    18421842        ModuleNameNode(const JSTokenLocation&, const Identifier& moduleName);
     
    18481848    };
    18491849
    1850     class ImportSpecifierNode : public Node {
     1850    class ImportSpecifierNode final : public Node {
    18511851    public:
    18521852        ImportSpecifierNode(const JSTokenLocation&, const Identifier& importedName, const Identifier& localName);
     
    18601860    };
    18611861
    1862     class ImportSpecifierListNode : public ParserArenaDeletable {
     1862    class ImportSpecifierListNode final : public ParserArenaDeletable {
    18631863        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ImportSpecifierListNode);
    18641864    public:
     
    18851885    };
    18861886
    1887     class ImportDeclarationNode : public ModuleDeclarationNode {
     1887    class ImportDeclarationNode final : public ModuleDeclarationNode {
    18881888    public:
    18891889        ImportDeclarationNode(const JSTokenLocation&, ImportSpecifierListNode*, ModuleNameNode*);
     
    19001900    };
    19011901
    1902     class ExportAllDeclarationNode : public ModuleDeclarationNode {
     1902    class ExportAllDeclarationNode final : public ModuleDeclarationNode {
    19031903    public:
    19041904        ExportAllDeclarationNode(const JSTokenLocation&, ModuleNameNode*);
     
    19131913    };
    19141914
    1915     class ExportDefaultDeclarationNode : public ModuleDeclarationNode {
     1915    class ExportDefaultDeclarationNode final : public ModuleDeclarationNode {
    19161916    public:
    19171917        ExportDefaultDeclarationNode(const JSTokenLocation&, StatementNode*, const Identifier& localName);
     
    19271927    };
    19281928
    1929     class ExportLocalDeclarationNode : public ModuleDeclarationNode {
     1929    class ExportLocalDeclarationNode final : public ModuleDeclarationNode {
    19301930    public:
    19311931        ExportLocalDeclarationNode(const JSTokenLocation&, StatementNode*);
     
    19391939    };
    19401940
    1941     class ExportSpecifierNode : public Node {
     1941    class ExportSpecifierNode final : public Node {
    19421942    public:
    19431943        ExportSpecifierNode(const JSTokenLocation&, const Identifier& localName, const Identifier& exportedName);
     
    19511951    };
    19521952
    1953     class ExportSpecifierListNode : public ParserArenaDeletable {
     1953    class ExportSpecifierListNode final : public ParserArenaDeletable {
    19541954        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ExportSpecifierListNode);
    19551955    public:
     
    19661966    };
    19671967
    1968     class ExportNamedDeclarationNode : public ModuleDeclarationNode {
     1968    class ExportNamedDeclarationNode final : public ModuleDeclarationNode {
    19691969    public:
    19701970        ExportNamedDeclarationNode(const JSTokenLocation&, ExportSpecifierListNode*, ModuleNameNode*);
     
    19801980    };
    19811981
    1982     class FunctionMetadataNode final : public Node, public ParserArenaDeletable {
     1982    class FunctionMetadataNode final : public ParserArenaDeletable, public Node {
    19831983        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(FunctionMetadataNode);
    19841984    public:
     
    20442044
    20452045    public:
     2046        unsigned m_isInStrictContext : 1;
     2047        unsigned m_superBinding : 1;
     2048        unsigned m_constructorKind : 2;
     2049        unsigned m_isArrowFunctionBodyExpression : 1;
     2050        SourceParseMode m_parseMode;
    20462051        Identifier m_ident;
    20472052        Identifier m_ecmaName;
     
    20582063        unsigned m_parameterCount;
    20592064        int m_lastLine;
    2060         SourceParseMode m_parseMode;
    2061         unsigned m_isInStrictContext : 1;
    2062         unsigned m_superBinding : 1;
    2063         unsigned m_constructorKind : 2;
    2064         unsigned m_isArrowFunctionBodyExpression : 1;
    20652065    };
    20662066
     
    21202120    };
    21212121
    2122     class ArrowFuncExprNode : public BaseFuncExprNode {
     2122    class ArrowFuncExprNode final : public BaseFuncExprNode {
    21232123    public:
    21242124        ArrowFuncExprNode(const JSTokenLocation&, const Identifier&, FunctionMetadataNode*, const SourceCode&);
     
    21302130    };
    21312131
    2132     class MethodDefinitionNode : public FuncExprNode {
     2132    class MethodDefinitionNode final : public FuncExprNode {
    21332133    public:
    21342134        MethodDefinitionNode(const JSTokenLocation&, const Identifier&, FunctionMetadataNode*, const SourceCode&);
     
    22062206    };
    22072207
    2208     class ArrayPatternNode : public DestructuringPatternNode, public ThrowableExpressionData, public ParserArenaDeletable {
     2208    class ArrayPatternNode final : public DestructuringPatternNode, public ParserArenaDeletable, public ThrowableExpressionData {
    22092209        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ArrayPatternNode);
    22102210    public:
    22112211        ArrayPatternNode();
    2212         enum class BindingType {
     2212        enum class BindingType : uint8_t {
    22132213            Elision,
    22142214            Element,
     
    22352235    };
    22362236   
    2237     class ObjectPatternNode : public DestructuringPatternNode, public ThrowableExpressionData, public ParserArenaDeletable {
     2237    class ObjectPatternNode final : public DestructuringPatternNode, public ParserArenaDeletable, public ThrowableExpressionData {
    22382238        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ObjectPatternNode);
    22392239    public:
    22402240        ObjectPatternNode();
    2241         enum class BindingType {
     2241        enum class BindingType : uint8_t {
    22422242            Element,
    22432243            RestElement
     
    23382338    };
    23392339
    2340     class DestructuringAssignmentNode : public ExpressionNode {
     2340    class DestructuringAssignmentNode final : public ExpressionNode {
    23412341    public:
    23422342        DestructuringAssignmentNode(const JSTokenLocation&, DestructuringPatternNode*, ExpressionNode*);
     
    23522352    };
    23532353
    2354     class FunctionParameters : public ParserArenaDeletable {
     2354    class FunctionParameters final : public ParserArenaDeletable {
    23552355        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(FunctionParameters);
    23562356    public:
     
    23832383    };
    23842384
    2385     class FuncDeclNode : public StatementNode {
     2385    class FuncDeclNode final : public StatementNode {
    23862386    public:
    23872387        FuncDeclNode(const JSTokenLocation&, const Identifier&, FunctionMetadataNode*, const SourceCode&);
     
    24092409    };
    24102410
    2411     class CaseClauseNode : public ParserArenaFreeable {
     2411    class CaseClauseNode final : public ParserArenaFreeable {
    24122412    public:
    24132413        CaseClauseNode(ExpressionNode*, SourceElements* = 0);
     
    24242424    };
    24252425
    2426     class ClauseListNode : public ParserArenaFreeable {
     2426    class ClauseListNode final : public ParserArenaFreeable {
    24272427    public:
    24282428        ClauseListNode(CaseClauseNode*);
     
    24342434    private:
    24352435        CaseClauseNode* m_clause;
    2436         ClauseListNode* m_next;
    2437     };
    2438 
    2439     class CaseBlockNode : public ParserArenaFreeable {
     2436        ClauseListNode* m_next { nullptr };
     2437    };
     2438
     2439    class CaseBlockNode final : public ParserArenaFreeable {
    24402440    public:
    24412441        CaseBlockNode(ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2);
     
    24512451    };
    24522452
    2453     class SwitchNode : public StatementNode, public VariableEnvironmentNode {
     2453    class SwitchNode final : public StatementNode, public VariableEnvironmentNode {
    24542454        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(SwitchNode);
    24552455    public:
  • trunk/Source/JavaScriptCore/runtime/ExceptionHelpers.cpp

    r233122 r233937  
    3838#include "JSCInlines.h"
    3939#include "JSGlobalObjectFunctions.h"
    40 #include "Nodes.h"
    4140#include "RuntimeType.h"
    4241#include <wtf/text/StringBuilder.h>
  • trunk/Source/JavaScriptCore/runtime/JSObject.cpp

    r233765 r233937  
    4141#include "Lookup.h"
    4242#include "NativeErrorConstructor.h"
    43 #include "Nodes.h"
    4443#include "ObjectPrototype.h"
    4544#include "PropertyDescriptor.h"
Note: See TracChangeset for help on using the changeset viewer.