Home | History | Annotate | Download | only in parser
      1 /*
      2  *  Copyright (C) 2009 Apple Inc. All rights reserved.
      3  *
      4  *  This library is free software; you can redistribute it and/or
      5  *  modify it under the terms of the GNU Library General Public
      6  *  License as published by the Free Software Foundation; either
      7  *  version 2 of the License, or (at your option) any later version.
      8  *
      9  *  This library is distributed in the hope that it will be useful,
     10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12  *  Library General Public License for more details.
     13  *
     14  *  You should have received a copy of the GNU Library General Public License
     15  *  along with this library; see the file COPYING.LIB.  If not, write to
     16  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     17  *  Boston, MA 02110-1301, USA.
     18  *
     19  */
     20 
     21 #ifndef NodeConstructors_h
     22 #define NodeConstructors_h
     23 
     24 #include "Nodes.h"
     25 #include "Lexer.h"
     26 #include "Parser.h"
     27 
     28 namespace JSC {
     29 
     30     inline void* ParserArenaFreeable::operator new(size_t size, JSGlobalData* globalData)
     31     {
     32         return globalData->parser->arena().allocateFreeable(size);
     33     }
     34 
     35     inline void* ParserArenaDeletable::operator new(size_t size, JSGlobalData* globalData)
     36     {
     37         return globalData->parser->arena().allocateDeletable(size);
     38     }
     39 
     40     inline ParserArenaRefCounted::ParserArenaRefCounted(JSGlobalData* globalData)
     41     {
     42         globalData->parser->arena().derefWithArena(adoptRef(this));
     43     }
     44 
     45     inline Node::Node(JSGlobalData* globalData)
     46         : m_line(globalData->lexer->lastLineNumber())
     47     {
     48     }
     49 
     50     inline ExpressionNode::ExpressionNode(JSGlobalData* globalData, ResultType resultType)
     51         : Node(globalData)
     52         , m_resultType(resultType)
     53     {
     54     }
     55 
     56     inline StatementNode::StatementNode(JSGlobalData* globalData)
     57         : Node(globalData)
     58         , m_lastLine(-1)
     59     {
     60     }
     61 
     62     inline NullNode::NullNode(JSGlobalData* globalData)
     63         : ExpressionNode(globalData, ResultType::nullType())
     64     {
     65     }
     66 
     67     inline BooleanNode::BooleanNode(JSGlobalData* globalData, bool value)
     68         : ExpressionNode(globalData, ResultType::booleanType())
     69         , m_value(value)
     70     {
     71     }
     72 
     73     inline NumberNode::NumberNode(JSGlobalData* globalData, double value)
     74         : ExpressionNode(globalData, ResultType::numberType())
     75         , m_value(value)
     76     {
     77     }
     78 
     79     inline StringNode::StringNode(JSGlobalData* globalData, const Identifier& value)
     80         : ExpressionNode(globalData, ResultType::stringType())
     81         , m_value(value)
     82     {
     83     }
     84 
     85     inline RegExpNode::RegExpNode(JSGlobalData* globalData, const Identifier& pattern, const Identifier& flags)
     86         : ExpressionNode(globalData)
     87         , m_pattern(pattern)
     88         , m_flags(flags)
     89     {
     90     }
     91 
     92     inline ThisNode::ThisNode(JSGlobalData* globalData)
     93         : ExpressionNode(globalData)
     94     {
     95     }
     96 
     97     inline ResolveNode::ResolveNode(JSGlobalData* globalData, const Identifier& ident, int startOffset)
     98         : ExpressionNode(globalData)
     99         , m_ident(ident)
    100         , m_startOffset(startOffset)
    101     {
    102     }
    103 
    104     inline ElementNode::ElementNode(JSGlobalData*, int elision, ExpressionNode* node)
    105         : m_next(0)
    106         , m_elision(elision)
    107         , m_node(node)
    108     {
    109     }
    110 
    111     inline ElementNode::ElementNode(JSGlobalData*, ElementNode* l, int elision, ExpressionNode* node)
    112         : m_next(0)
    113         , m_elision(elision)
    114         , m_node(node)
    115     {
    116         l->m_next = this;
    117     }
    118 
    119     inline ArrayNode::ArrayNode(JSGlobalData* globalData, int elision)
    120         : ExpressionNode(globalData)
    121         , m_element(0)
    122         , m_elision(elision)
    123         , m_optional(true)
    124     {
    125     }
    126 
    127     inline ArrayNode::ArrayNode(JSGlobalData* globalData, ElementNode* element)
    128         : ExpressionNode(globalData)
    129         , m_element(element)
    130         , m_elision(0)
    131         , m_optional(false)
    132     {
    133     }
    134 
    135     inline ArrayNode::ArrayNode(JSGlobalData* globalData, int elision, ElementNode* element)
    136         : ExpressionNode(globalData)
    137         , m_element(element)
    138         , m_elision(elision)
    139         , m_optional(true)
    140     {
    141     }
    142 
    143     inline PropertyNode::PropertyNode(JSGlobalData*, const Identifier& name, ExpressionNode* assign, Type type)
    144         : m_name(name)
    145         , m_assign(assign)
    146         , m_type(type)
    147     {
    148     }
    149 
    150     inline PropertyNode::PropertyNode(JSGlobalData* globalData, double name, ExpressionNode* assign, Type type)
    151         : m_name(globalData->parser->arena().identifierArena().makeNumericIdentifier(globalData, name))
    152         , m_assign(assign)
    153         , m_type(type)
    154     {
    155     }
    156 
    157     inline PropertyListNode::PropertyListNode(JSGlobalData* globalData, PropertyNode* node)
    158         : Node(globalData)
    159         , m_node(node)
    160         , m_next(0)
    161     {
    162     }
    163 
    164     inline PropertyListNode::PropertyListNode(JSGlobalData* globalData, PropertyNode* node, PropertyListNode* list)
    165         : Node(globalData)
    166         , m_node(node)
    167         , m_next(0)
    168     {
    169         list->m_next = this;
    170     }
    171 
    172     inline ObjectLiteralNode::ObjectLiteralNode(JSGlobalData* globalData)
    173         : ExpressionNode(globalData)
    174         , m_list(0)
    175     {
    176     }
    177 
    178     inline ObjectLiteralNode::ObjectLiteralNode(JSGlobalData* globalData, PropertyListNode* list)
    179         : ExpressionNode(globalData)
    180         , m_list(list)
    181     {
    182     }
    183 
    184     inline BracketAccessorNode::BracketAccessorNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments)
    185         : ExpressionNode(globalData)
    186         , m_base(base)
    187         , m_subscript(subscript)
    188         , m_subscriptHasAssignments(subscriptHasAssignments)
    189     {
    190     }
    191 
    192     inline DotAccessorNode::DotAccessorNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident)
    193         : ExpressionNode(globalData)
    194         , m_base(base)
    195         , m_ident(ident)
    196     {
    197     }
    198 
    199     inline ArgumentListNode::ArgumentListNode(JSGlobalData* globalData, ExpressionNode* expr)
    200         : Node(globalData)
    201         , m_next(0)
    202         , m_expr(expr)
    203     {
    204     }
    205 
    206     inline ArgumentListNode::ArgumentListNode(JSGlobalData* globalData, ArgumentListNode* listNode, ExpressionNode* expr)
    207         : Node(globalData)
    208         , m_next(0)
    209         , m_expr(expr)
    210     {
    211         listNode->m_next = this;
    212     }
    213 
    214     inline ArgumentsNode::ArgumentsNode(JSGlobalData*)
    215         : m_listNode(0)
    216     {
    217     }
    218 
    219     inline ArgumentsNode::ArgumentsNode(JSGlobalData*, ArgumentListNode* listNode)
    220         : m_listNode(listNode)
    221     {
    222     }
    223 
    224     inline NewExprNode::NewExprNode(JSGlobalData* globalData, ExpressionNode* expr)
    225         : ExpressionNode(globalData)
    226         , m_expr(expr)
    227         , m_args(0)
    228     {
    229     }
    230 
    231     inline NewExprNode::NewExprNode(JSGlobalData* globalData, ExpressionNode* expr, ArgumentsNode* args)
    232         : ExpressionNode(globalData)
    233         , m_expr(expr)
    234         , m_args(args)
    235     {
    236     }
    237 
    238     inline EvalFunctionCallNode::EvalFunctionCallNode(JSGlobalData* globalData, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
    239         : ExpressionNode(globalData)
    240         , ThrowableExpressionData(divot, startOffset, endOffset)
    241         , m_args(args)
    242     {
    243     }
    244 
    245     inline FunctionCallValueNode::FunctionCallValueNode(JSGlobalData* globalData, ExpressionNode* expr, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
    246         : ExpressionNode(globalData)
    247         , ThrowableExpressionData(divot, startOffset, endOffset)
    248         , m_expr(expr)
    249         , m_args(args)
    250     {
    251     }
    252 
    253     inline FunctionCallResolveNode::FunctionCallResolveNode(JSGlobalData* globalData, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
    254         : ExpressionNode(globalData)
    255         , ThrowableExpressionData(divot, startOffset, endOffset)
    256         , m_ident(ident)
    257         , m_args(args)
    258     {
    259     }
    260 
    261     inline FunctionCallBracketNode::FunctionCallBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
    262         : ExpressionNode(globalData)
    263         , ThrowableSubExpressionData(divot, startOffset, endOffset)
    264         , m_base(base)
    265         , m_subscript(subscript)
    266         , m_args(args)
    267     {
    268     }
    269 
    270     inline FunctionCallDotNode::FunctionCallDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
    271         : ExpressionNode(globalData)
    272         , ThrowableSubExpressionData(divot, startOffset, endOffset)
    273         , m_base(base)
    274         , m_ident(ident)
    275         , m_args(args)
    276     {
    277     }
    278 
    279     inline CallFunctionCallDotNode::CallFunctionCallDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
    280         : FunctionCallDotNode(globalData, base, ident, args, divot, startOffset, endOffset)
    281     {
    282     }
    283 
    284     inline ApplyFunctionCallDotNode::ApplyFunctionCallDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
    285         : FunctionCallDotNode(globalData, base, ident, args, divot, startOffset, endOffset)
    286     {
    287     }
    288 
    289     inline PrePostResolveNode::PrePostResolveNode(JSGlobalData* globalData, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
    290         : ExpressionNode(globalData, ResultType::numberType()) // could be reusable for pre?
    291         , ThrowableExpressionData(divot, startOffset, endOffset)
    292         , m_ident(ident)
    293     {
    294     }
    295 
    296     inline PostfixResolveNode::PostfixResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
    297         : PrePostResolveNode(globalData, ident, divot, startOffset, endOffset)
    298         , m_operator(oper)
    299     {
    300     }
    301 
    302     inline PostfixBracketNode::PostfixBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
    303         : ExpressionNode(globalData)
    304         , ThrowableSubExpressionData(divot, startOffset, endOffset)
    305         , m_base(base)
    306         , m_subscript(subscript)
    307         , m_operator(oper)
    308     {
    309     }
    310 
    311     inline PostfixDotNode::PostfixDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
    312         : ExpressionNode(globalData)
    313         , ThrowableSubExpressionData(divot, startOffset, endOffset)
    314         , m_base(base)
    315         , m_ident(ident)
    316         , m_operator(oper)
    317     {
    318     }
    319 
    320     inline PostfixErrorNode::PostfixErrorNode(JSGlobalData* globalData, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
    321         : ExpressionNode(globalData)
    322         , ThrowableSubExpressionData(divot, startOffset, endOffset)
    323         , m_expr(expr)
    324         , m_operator(oper)
    325     {
    326     }
    327 
    328     inline DeleteResolveNode::DeleteResolveNode(JSGlobalData* globalData, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
    329         : ExpressionNode(globalData)
    330         , ThrowableExpressionData(divot, startOffset, endOffset)
    331         , m_ident(ident)
    332     {
    333     }
    334 
    335     inline DeleteBracketNode::DeleteBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, unsigned divot, unsigned startOffset, unsigned endOffset)
    336         : ExpressionNode(globalData)
    337         , ThrowableExpressionData(divot, startOffset, endOffset)
    338         , m_base(base)
    339         , m_subscript(subscript)
    340     {
    341     }
    342 
    343     inline DeleteDotNode::DeleteDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
    344         : ExpressionNode(globalData)
    345         , ThrowableExpressionData(divot, startOffset, endOffset)
    346         , m_base(base)
    347         , m_ident(ident)
    348     {
    349     }
    350 
    351     inline DeleteValueNode::DeleteValueNode(JSGlobalData* globalData, ExpressionNode* expr)
    352         : ExpressionNode(globalData)
    353         , m_expr(expr)
    354     {
    355     }
    356 
    357     inline VoidNode::VoidNode(JSGlobalData* globalData, ExpressionNode* expr)
    358         : ExpressionNode(globalData)
    359         , m_expr(expr)
    360     {
    361     }
    362 
    363     inline TypeOfResolveNode::TypeOfResolveNode(JSGlobalData* globalData, const Identifier& ident)
    364         : ExpressionNode(globalData, ResultType::stringType())
    365         , m_ident(ident)
    366     {
    367     }
    368 
    369     inline TypeOfValueNode::TypeOfValueNode(JSGlobalData* globalData, ExpressionNode* expr)
    370         : ExpressionNode(globalData, ResultType::stringType())
    371         , m_expr(expr)
    372     {
    373     }
    374 
    375     inline PrefixResolveNode::PrefixResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
    376         : PrePostResolveNode(globalData, ident, divot, startOffset, endOffset)
    377         , m_operator(oper)
    378     {
    379     }
    380 
    381     inline PrefixBracketNode::PrefixBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
    382         : ExpressionNode(globalData)
    383         , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset)
    384         , m_base(base)
    385         , m_subscript(subscript)
    386         , m_operator(oper)
    387     {
    388     }
    389 
    390     inline PrefixDotNode::PrefixDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
    391         : ExpressionNode(globalData)
    392         , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset)
    393         , m_base(base)
    394         , m_ident(ident)
    395         , m_operator(oper)
    396     {
    397     }
    398 
    399     inline PrefixErrorNode::PrefixErrorNode(JSGlobalData* globalData, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
    400         : ExpressionNode(globalData)
    401         , ThrowableExpressionData(divot, startOffset, endOffset)
    402         , m_expr(expr)
    403         , m_operator(oper)
    404     {
    405     }
    406 
    407     inline UnaryOpNode::UnaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr, OpcodeID opcodeID)
    408         : ExpressionNode(globalData, type)
    409         , m_expr(expr)
    410         , m_opcodeID(opcodeID)
    411     {
    412     }
    413 
    414     inline UnaryPlusNode::UnaryPlusNode(JSGlobalData* globalData, ExpressionNode* expr)
    415         : UnaryOpNode(globalData, ResultType::numberType(), expr, op_to_jsnumber)
    416     {
    417     }
    418 
    419     inline NegateNode::NegateNode(JSGlobalData* globalData, ExpressionNode* expr)
    420         : UnaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr, op_negate)
    421     {
    422     }
    423 
    424     inline BitwiseNotNode::BitwiseNotNode(JSGlobalData* globalData, ExpressionNode* expr)
    425         : UnaryOpNode(globalData, ResultType::forBitOp(), expr, op_bitnot)
    426     {
    427     }
    428 
    429     inline LogicalNotNode::LogicalNotNode(JSGlobalData* globalData, ExpressionNode* expr)
    430         : UnaryOpNode(globalData, ResultType::booleanType(), expr, op_not)
    431     {
    432     }
    433 
    434     inline BinaryOpNode::BinaryOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
    435         : ExpressionNode(globalData)
    436         , m_expr1(expr1)
    437         , m_expr2(expr2)
    438         , m_opcodeID(opcodeID)
    439         , m_rightHasAssignments(rightHasAssignments)
    440     {
    441     }
    442 
    443     inline BinaryOpNode::BinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
    444         : ExpressionNode(globalData, type)
    445         , m_expr1(expr1)
    446         , m_expr2(expr2)
    447         , m_opcodeID(opcodeID)
    448         , m_rightHasAssignments(rightHasAssignments)
    449     {
    450     }
    451 
    452     inline ReverseBinaryOpNode::ReverseBinaryOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
    453         : BinaryOpNode(globalData, expr1, expr2, opcodeID, rightHasAssignments)
    454     {
    455     }
    456 
    457     inline ReverseBinaryOpNode::ReverseBinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
    458         : BinaryOpNode(globalData, type, expr1, expr2, opcodeID, rightHasAssignments)
    459     {
    460     }
    461 
    462     inline MultNode::MultNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    463         : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, op_mul, rightHasAssignments)
    464     {
    465     }
    466 
    467     inline DivNode::DivNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    468         : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, op_div, rightHasAssignments)
    469     {
    470     }
    471 
    472 
    473     inline ModNode::ModNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    474         : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, op_mod, rightHasAssignments)
    475     {
    476     }
    477 
    478     inline AddNode::AddNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    479         : BinaryOpNode(globalData, ResultType::forAdd(expr1->resultDescriptor(), expr2->resultDescriptor()), expr1, expr2, op_add, rightHasAssignments)
    480     {
    481     }
    482 
    483     inline SubNode::SubNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    484         : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, op_sub, rightHasAssignments)
    485     {
    486     }
    487 
    488     inline LeftShiftNode::LeftShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    489         : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, op_lshift, rightHasAssignments)
    490     {
    491     }
    492 
    493     inline RightShiftNode::RightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    494         : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, op_rshift, rightHasAssignments)
    495     {
    496     }
    497 
    498     inline UnsignedRightShiftNode::UnsignedRightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    499         : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, op_urshift, rightHasAssignments)
    500     {
    501     }
    502 
    503     inline LessNode::LessNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    504         : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_less, rightHasAssignments)
    505     {
    506     }
    507 
    508     inline GreaterNode::GreaterNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    509         : ReverseBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_less, rightHasAssignments)
    510     {
    511     }
    512 
    513     inline LessEqNode::LessEqNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    514         : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_lesseq, rightHasAssignments)
    515     {
    516     }
    517 
    518     inline GreaterEqNode::GreaterEqNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    519         : ReverseBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_lesseq, rightHasAssignments)
    520     {
    521     }
    522 
    523     inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
    524         : BinaryOpNode(globalData, type, expr1, expr2, opcodeID, rightHasAssignments)
    525     {
    526     }
    527 
    528     inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
    529         : BinaryOpNode(globalData, expr1, expr2, opcodeID, rightHasAssignments)
    530     {
    531     }
    532 
    533     inline InstanceOfNode::InstanceOfNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    534         : ThrowableBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_instanceof, rightHasAssignments)
    535     {
    536     }
    537 
    538     inline InNode::InNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    539         : ThrowableBinaryOpNode(globalData, expr1, expr2, op_in, rightHasAssignments)
    540     {
    541     }
    542 
    543     inline EqualNode::EqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    544         : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_eq, rightHasAssignments)
    545     {
    546     }
    547 
    548     inline NotEqualNode::NotEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    549         : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_neq, rightHasAssignments)
    550     {
    551     }
    552 
    553     inline StrictEqualNode::StrictEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    554         : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_stricteq, rightHasAssignments)
    555     {
    556     }
    557 
    558     inline NotStrictEqualNode::NotStrictEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    559         : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_nstricteq, rightHasAssignments)
    560     {
    561     }
    562 
    563     inline BitAndNode::BitAndNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    564         : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, op_bitand, rightHasAssignments)
    565     {
    566     }
    567 
    568     inline BitOrNode::BitOrNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    569         : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, op_bitor, rightHasAssignments)
    570     {
    571     }
    572 
    573     inline BitXOrNode::BitXOrNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    574         : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, op_bitxor, rightHasAssignments)
    575     {
    576     }
    577 
    578     inline LogicalOpNode::LogicalOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper)
    579         : ExpressionNode(globalData, ResultType::booleanType())
    580         , m_expr1(expr1)
    581         , m_expr2(expr2)
    582         , m_operator(oper)
    583     {
    584     }
    585 
    586     inline ConditionalNode::ConditionalNode(JSGlobalData* globalData, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2)
    587         : ExpressionNode(globalData)
    588         , m_logical(logical)
    589         , m_expr1(expr1)
    590         , m_expr2(expr2)
    591     {
    592     }
    593 
    594     inline ReadModifyResolveNode::ReadModifyResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, ExpressionNode*  right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
    595         : ExpressionNode(globalData)
    596         , ThrowableExpressionData(divot, startOffset, endOffset)
    597         , m_ident(ident)
    598         , m_right(right)
    599         , m_operator(oper)
    600         , m_rightHasAssignments(rightHasAssignments)
    601     {
    602     }
    603 
    604     inline AssignResolveNode::AssignResolveNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments)
    605         : ExpressionNode(globalData)
    606         , m_ident(ident)
    607         , m_right(right)
    608         , m_rightHasAssignments(rightHasAssignments)
    609     {
    610     }
    611 
    612     inline ReadModifyBracketNode::ReadModifyBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
    613         : ExpressionNode(globalData)
    614         , ThrowableSubExpressionData(divot, startOffset, endOffset)
    615         , m_base(base)
    616         , m_subscript(subscript)
    617         , m_right(right)
    618         , m_operator(oper)
    619         , m_subscriptHasAssignments(subscriptHasAssignments)
    620         , m_rightHasAssignments(rightHasAssignments)
    621     {
    622     }
    623 
    624     inline AssignBracketNode::AssignBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
    625         : ExpressionNode(globalData)
    626         , ThrowableExpressionData(divot, startOffset, endOffset)
    627         , m_base(base)
    628         , m_subscript(subscript)
    629         , m_right(right)
    630         , m_subscriptHasAssignments(subscriptHasAssignments)
    631         , m_rightHasAssignments(rightHasAssignments)
    632     {
    633     }
    634 
    635     inline AssignDotNode::AssignDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
    636         : ExpressionNode(globalData)
    637         , ThrowableExpressionData(divot, startOffset, endOffset)
    638         , m_base(base)
    639         , m_ident(ident)
    640         , m_right(right)
    641         , m_rightHasAssignments(rightHasAssignments)
    642     {
    643     }
    644 
    645     inline ReadModifyDotNode::ReadModifyDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
    646         : ExpressionNode(globalData)
    647         , ThrowableSubExpressionData(divot, startOffset, endOffset)
    648         , m_base(base)
    649         , m_ident(ident)
    650         , m_right(right)
    651         , m_operator(oper)
    652         , m_rightHasAssignments(rightHasAssignments)
    653     {
    654     }
    655 
    656     inline AssignErrorNode::AssignErrorNode(JSGlobalData* globalData, ExpressionNode* left, Operator oper, ExpressionNode* right, unsigned divot, unsigned startOffset, unsigned endOffset)
    657         : ExpressionNode(globalData)
    658         , ThrowableExpressionData(divot, startOffset, endOffset)
    659         , m_left(left)
    660         , m_operator(oper)
    661         , m_right(right)
    662     {
    663     }
    664 
    665     inline CommaNode::CommaNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2)
    666         : ExpressionNode(globalData)
    667     {
    668         m_expressions.append(expr1);
    669         m_expressions.append(expr2);
    670     }
    671 
    672     inline ConstStatementNode::ConstStatementNode(JSGlobalData* globalData, ConstDeclNode* next)
    673         : StatementNode(globalData)
    674         , m_next(next)
    675     {
    676     }
    677 
    678     inline SourceElements::SourceElements(JSGlobalData*)
    679     {
    680     }
    681 
    682     inline EmptyStatementNode::EmptyStatementNode(JSGlobalData* globalData)
    683         : StatementNode(globalData)
    684     {
    685     }
    686 
    687     inline DebuggerStatementNode::DebuggerStatementNode(JSGlobalData* globalData)
    688         : StatementNode(globalData)
    689     {
    690     }
    691 
    692     inline ExprStatementNode::ExprStatementNode(JSGlobalData* globalData, ExpressionNode* expr)
    693         : StatementNode(globalData)
    694         , m_expr(expr)
    695     {
    696     }
    697 
    698     inline VarStatementNode::VarStatementNode(JSGlobalData* globalData, ExpressionNode* expr)
    699         : StatementNode(globalData)
    700         , m_expr(expr)
    701     {
    702     }
    703 
    704     inline IfNode::IfNode(JSGlobalData* globalData, ExpressionNode* condition, StatementNode* ifBlock)
    705         : StatementNode(globalData)
    706         , m_condition(condition)
    707         , m_ifBlock(ifBlock)
    708     {
    709     }
    710 
    711     inline IfElseNode::IfElseNode(JSGlobalData* globalData, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock)
    712         : IfNode(globalData, condition, ifBlock)
    713         , m_elseBlock(elseBlock)
    714     {
    715     }
    716 
    717     inline DoWhileNode::DoWhileNode(JSGlobalData* globalData, StatementNode* statement, ExpressionNode* expr)
    718         : StatementNode(globalData)
    719         , m_statement(statement)
    720         , m_expr(expr)
    721     {
    722     }
    723 
    724     inline WhileNode::WhileNode(JSGlobalData* globalData, ExpressionNode* expr, StatementNode* statement)
    725         : StatementNode(globalData)
    726         , m_expr(expr)
    727         , m_statement(statement)
    728     {
    729     }
    730 
    731     inline ForNode::ForNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement, bool expr1WasVarDecl)
    732         : StatementNode(globalData)
    733         , m_expr1(expr1)
    734         , m_expr2(expr2)
    735         , m_expr3(expr3)
    736         , m_statement(statement)
    737         , m_expr1WasVarDecl(expr1 && expr1WasVarDecl)
    738     {
    739         ASSERT(statement);
    740     }
    741 
    742     inline ContinueNode::ContinueNode(JSGlobalData* globalData)
    743         : StatementNode(globalData)
    744         , m_ident(globalData->propertyNames->nullIdentifier)
    745     {
    746     }
    747 
    748     inline ContinueNode::ContinueNode(JSGlobalData* globalData, const Identifier& ident)
    749         : StatementNode(globalData)
    750         , m_ident(ident)
    751     {
    752     }
    753 
    754     inline BreakNode::BreakNode(JSGlobalData* globalData)
    755         : StatementNode(globalData)
    756         , m_ident(globalData->propertyNames->nullIdentifier)
    757     {
    758     }
    759 
    760     inline BreakNode::BreakNode(JSGlobalData* globalData, const Identifier& ident)
    761         : StatementNode(globalData)
    762         , m_ident(ident)
    763     {
    764     }
    765 
    766     inline ReturnNode::ReturnNode(JSGlobalData* globalData, ExpressionNode* value)
    767         : StatementNode(globalData)
    768         , m_value(value)
    769     {
    770     }
    771 
    772     inline WithNode::WithNode(JSGlobalData* globalData, ExpressionNode* expr, StatementNode* statement, uint32_t divot, uint32_t expressionLength)
    773         : StatementNode(globalData)
    774         , m_expr(expr)
    775         , m_statement(statement)
    776         , m_divot(divot)
    777         , m_expressionLength(expressionLength)
    778     {
    779     }
    780 
    781     inline LabelNode::LabelNode(JSGlobalData* globalData, const Identifier& name, StatementNode* statement)
    782         : StatementNode(globalData)
    783         , m_name(name)
    784         , m_statement(statement)
    785     {
    786     }
    787 
    788     inline ThrowNode::ThrowNode(JSGlobalData* globalData, ExpressionNode* expr)
    789         : StatementNode(globalData)
    790         , m_expr(expr)
    791     {
    792     }
    793 
    794     inline TryNode::TryNode(JSGlobalData* globalData, StatementNode* tryBlock, const Identifier& exceptionIdent, bool catchHasEval, StatementNode* catchBlock, StatementNode* finallyBlock)
    795         : StatementNode(globalData)
    796         , m_tryBlock(tryBlock)
    797         , m_exceptionIdent(exceptionIdent)
    798         , m_catchBlock(catchBlock)
    799         , m_finallyBlock(finallyBlock)
    800         , m_catchHasEval(catchHasEval)
    801     {
    802     }
    803 
    804     inline ParameterNode::ParameterNode(JSGlobalData*, const Identifier& ident)
    805         : m_ident(ident)
    806         , m_next(0)
    807     {
    808     }
    809 
    810     inline ParameterNode::ParameterNode(JSGlobalData*, ParameterNode* l, const Identifier& ident)
    811         : m_ident(ident)
    812         , m_next(0)
    813     {
    814         l->m_next = this;
    815     }
    816 
    817     inline FuncExprNode::FuncExprNode(JSGlobalData* globalData, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
    818         : ExpressionNode(globalData)
    819         , m_body(body)
    820     {
    821         m_body->finishParsing(source, parameter, ident);
    822     }
    823 
    824     inline FuncDeclNode::FuncDeclNode(JSGlobalData* globalData, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
    825         : StatementNode(globalData)
    826         , m_body(body)
    827     {
    828         m_body->finishParsing(source, parameter, ident);
    829     }
    830 
    831     inline CaseClauseNode::CaseClauseNode(JSGlobalData*, ExpressionNode* expr, SourceElements* statements)
    832         : m_expr(expr)
    833         , m_statements(statements)
    834     {
    835     }
    836 
    837     inline ClauseListNode::ClauseListNode(JSGlobalData*, CaseClauseNode* clause)
    838         : m_clause(clause)
    839         , m_next(0)
    840     {
    841     }
    842 
    843     inline ClauseListNode::ClauseListNode(JSGlobalData*, ClauseListNode* clauseList, CaseClauseNode* clause)
    844         : m_clause(clause)
    845         , m_next(0)
    846     {
    847         clauseList->m_next = this;
    848     }
    849 
    850     inline CaseBlockNode::CaseBlockNode(JSGlobalData*, ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2)
    851         : m_list1(list1)
    852         , m_defaultClause(defaultClause)
    853         , m_list2(list2)
    854     {
    855     }
    856 
    857     inline SwitchNode::SwitchNode(JSGlobalData* globalData, ExpressionNode* expr, CaseBlockNode* block)
    858         : StatementNode(globalData)
    859         , m_expr(expr)
    860         , m_block(block)
    861     {
    862     }
    863 
    864     inline ConstDeclNode::ConstDeclNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* init)
    865         : ExpressionNode(globalData)
    866         , m_ident(ident)
    867         , m_next(0)
    868         , m_init(init)
    869     {
    870     }
    871 
    872     inline BlockNode::BlockNode(JSGlobalData* globalData, SourceElements* statements)
    873         : StatementNode(globalData)
    874         , m_statements(statements)
    875     {
    876     }
    877 
    878     inline ForInNode::ForInNode(JSGlobalData* globalData, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement)
    879         : StatementNode(globalData)
    880         , m_ident(globalData->propertyNames->nullIdentifier)
    881         , m_init(0)
    882         , m_lexpr(l)
    883         , m_expr(expr)
    884         , m_statement(statement)
    885         , m_identIsVarDecl(false)
    886     {
    887     }
    888 
    889     inline ForInNode::ForInNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* in, ExpressionNode* expr, StatementNode* statement, int divot, int startOffset, int endOffset)
    890         : StatementNode(globalData)
    891         , m_ident(ident)
    892         , m_init(0)
    893         , m_lexpr(new (globalData) ResolveNode(globalData, ident, divot - startOffset))
    894         , m_expr(expr)
    895         , m_statement(statement)
    896         , m_identIsVarDecl(true)
    897     {
    898         if (in) {
    899             AssignResolveNode* node = new (globalData) AssignResolveNode(globalData, ident, in, true);
    900             node->setExceptionSourceCode(divot, divot - startOffset, endOffset - divot);
    901             m_init = node;
    902         }
    903         // for( var foo = bar in baz )
    904     }
    905 
    906 } // namespace JSC
    907 
    908 #endif // NodeConstructors_h
    909