[ES6] Catch parameter should accept BindingPattern
[WebKit-https.git] / Source / JavaScriptCore / parser / NodeConstructors.h
1 /*
2  *  Copyright (C) 2009, 2013 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, ParserArena& parserArena)
31     {
32         return parserArena.allocateFreeable(size);
33     }
34
35     inline void* ParserArenaDeletable::operator new(size_t size, ParserArena& parserArena)
36     {
37         return parserArena.allocateDeletable(size);
38     }
39
40     inline ParserArenaRoot::ParserArenaRoot(ParserArena& parserArena)
41     {
42         m_arena.swap(parserArena);
43     }
44
45     inline Node::Node(const JSTokenLocation& location)
46         : m_position(location.line, location.startOffset, location.lineStartOffset)
47         , m_endOffset(-1)
48     {
49         ASSERT(location.startOffset >= location.lineStartOffset);
50     }
51
52     inline ExpressionNode::ExpressionNode(const JSTokenLocation& location, ResultType resultType)
53         : Node(location)
54         , m_resultType(resultType)
55     {
56     }
57
58     inline StatementNode::StatementNode(const JSTokenLocation& location)
59         : Node(location)
60         , m_next(nullptr)
61         , m_lastLine(-1)
62     {
63     }
64
65     inline ConstantNode::ConstantNode(const JSTokenLocation& location, ResultType resultType)
66         : ExpressionNode(location, resultType)
67     {
68     }
69
70     inline NullNode::NullNode(const JSTokenLocation& location)
71         : ConstantNode(location, ResultType::nullType())
72     {
73     }
74
75     inline BooleanNode::BooleanNode(const JSTokenLocation& location, bool value)
76         : ConstantNode(location, ResultType::booleanType())
77         , m_value(value)
78     {
79     }
80
81     inline NumberNode::NumberNode(const JSTokenLocation& location, double value)
82         : ConstantNode(location, JSValue(value).isInt32() ? ResultType::numberTypeIsInt32() : ResultType::numberType())
83         , m_value(value)
84     {
85     }
86
87     inline DoubleNode::DoubleNode(const JSTokenLocation& location, double value)
88         : NumberNode(location, value)
89     {
90     }
91
92     inline IntegerNode::IntegerNode(const JSTokenLocation& location, double value)
93         : DoubleNode(location, value)
94     {
95     }
96
97     inline StringNode::StringNode(const JSTokenLocation& location, const Identifier& value)
98         : ConstantNode(location, ResultType::stringType())
99         , m_value(value)
100     {
101     }
102
103     inline TemplateExpressionListNode::TemplateExpressionListNode(ExpressionNode* node)
104         : m_node(node)
105     {
106     }
107
108     inline TemplateExpressionListNode::TemplateExpressionListNode(TemplateExpressionListNode* previous, ExpressionNode* node)
109         : m_node(node)
110     {
111         previous->m_next = this;
112     }
113
114     inline TemplateStringNode::TemplateStringNode(const JSTokenLocation& location, const Identifier& cooked, const Identifier& raw)
115         : ExpressionNode(location)
116         , m_cooked(cooked)
117         , m_raw(raw)
118     {
119     }
120
121     inline TemplateStringListNode::TemplateStringListNode(TemplateStringNode* node)
122         : m_node(node)
123     {
124     }
125
126     inline TemplateStringListNode::TemplateStringListNode(TemplateStringListNode* previous, TemplateStringNode* node)
127         : m_node(node)
128     {
129         previous->m_next = this;
130     }
131
132     inline TemplateLiteralNode::TemplateLiteralNode(const JSTokenLocation& location, TemplateStringListNode* templateStrings)
133         : ExpressionNode(location)
134         , m_templateStrings(templateStrings)
135         , m_templateExpressions(nullptr)
136     {
137     }
138
139     inline TemplateLiteralNode::TemplateLiteralNode(const JSTokenLocation& location, TemplateStringListNode* templateStrings, TemplateExpressionListNode* templateExpressions)
140         : ExpressionNode(location)
141         , m_templateStrings(templateStrings)
142         , m_templateExpressions(templateExpressions)
143     {
144     }
145
146     inline TaggedTemplateNode::TaggedTemplateNode(const JSTokenLocation& location, ExpressionNode* tag, TemplateLiteralNode* templateLiteral)
147         : ExpressionNode(location)
148         , m_tag(tag)
149         , m_templateLiteral(templateLiteral)
150     {
151     }
152
153     inline RegExpNode::RegExpNode(const JSTokenLocation& location, const Identifier& pattern, const Identifier& flags)
154         : ExpressionNode(location)
155         , m_pattern(pattern)
156         , m_flags(flags)
157     {
158     }
159
160     inline ThisNode::ThisNode(const JSTokenLocation& location, ThisTDZMode thisTDZMode)
161         : ExpressionNode(location)
162         , m_shouldAlwaysEmitTDZCheck(thisTDZMode == ThisTDZMode::AlwaysCheck)
163     {
164     }
165
166     inline SuperNode::SuperNode(const JSTokenLocation& location)
167         : ExpressionNode(location)
168     {
169     }
170
171     inline NewTargetNode::NewTargetNode(const JSTokenLocation& location)
172         : ExpressionNode(location)
173     {
174     }
175
176     inline ResolveNode::ResolveNode(const JSTokenLocation& location, const Identifier& ident, const JSTextPosition& start)
177         : ExpressionNode(location)
178         , m_ident(ident)
179         , m_start(start)
180     {
181         ASSERT(m_start.offset >= m_start.lineStartOffset);
182     }
183
184     inline ElementNode::ElementNode(int elision, ExpressionNode* node)
185         : m_next(0)
186         , m_elision(elision)
187         , m_node(node)
188     {
189     }
190
191     inline ElementNode::ElementNode(ElementNode* l, int elision, ExpressionNode* node)
192         : m_next(0)
193         , m_elision(elision)
194         , m_node(node)
195     {
196         l->m_next = this;
197     }
198
199     inline ArrayNode::ArrayNode(const JSTokenLocation& location, int elision)
200         : ExpressionNode(location)
201         , m_element(0)
202         , m_elision(elision)
203         , m_optional(true)
204     {
205     }
206
207     inline ArrayNode::ArrayNode(const JSTokenLocation& location, ElementNode* element)
208         : ExpressionNode(location)
209         , m_element(element)
210         , m_elision(0)
211         , m_optional(false)
212     {
213     }
214
215     inline ArrayNode::ArrayNode(const JSTokenLocation& location, int elision, ElementNode* element)
216         : ExpressionNode(location)
217         , m_element(element)
218         , m_elision(elision)
219         , m_optional(true)
220     {
221     }
222
223     inline PropertyNode::PropertyNode(const Identifier& name, ExpressionNode* assign, Type type, PutType putType, SuperBinding superBinding = SuperBinding::NotNeeded)
224         : m_name(&name)
225         , m_assign(assign)
226         , m_type(type)
227         , m_needsSuperBinding(superBinding == SuperBinding::Needed)
228         , m_putType(putType)
229     {
230     }
231
232     inline PropertyNode::PropertyNode(ExpressionNode* name, ExpressionNode* assign, Type type, PutType putType, SuperBinding superBinding = SuperBinding::NotNeeded)
233         : m_name(0)
234         , m_expression(name)
235         , m_assign(assign)
236         , m_type(type)
237         , m_needsSuperBinding(superBinding == SuperBinding::Needed)
238         , m_putType(putType)
239     {
240     }
241
242     inline PropertyListNode::PropertyListNode(const JSTokenLocation& location, PropertyNode* node)
243         : ExpressionNode(location)
244         , m_node(node)
245         , m_next(0)
246     {
247     }
248
249     inline PropertyListNode::PropertyListNode(const JSTokenLocation& location, PropertyNode* node, PropertyListNode* list)
250         : ExpressionNode(location)
251         , m_node(node)
252         , m_next(0)
253     {
254         list->m_next = this;
255     }
256
257     inline ObjectLiteralNode::ObjectLiteralNode(const JSTokenLocation& location)
258         : ExpressionNode(location)
259         , m_list(0)
260     {
261     }
262
263     inline ObjectLiteralNode::ObjectLiteralNode(const JSTokenLocation& location, PropertyListNode* list)
264         : ExpressionNode(location)
265         , m_list(list)
266     {
267     }
268
269     inline BracketAccessorNode::BracketAccessorNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments)
270         : ExpressionNode(location)
271         , m_base(base)
272         , m_subscript(subscript)
273         , m_subscriptHasAssignments(subscriptHasAssignments)
274     {
275     }
276
277     inline DotAccessorNode::DotAccessorNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident)
278         : ExpressionNode(location)
279         , m_base(base)
280         , m_ident(ident)
281     {
282     }
283     
284     
285     inline SpreadExpressionNode::SpreadExpressionNode(const JSTokenLocation& location, ExpressionNode* expression)
286         : ExpressionNode(location)
287         , m_expression(expression)
288     {
289     }
290
291     inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ExpressionNode* expr)
292         : ExpressionNode(location)
293         , m_next(0)
294         , m_expr(expr)
295     {
296     }
297
298     inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ArgumentListNode* listNode, ExpressionNode* expr)
299         : ExpressionNode(location)
300         , m_next(0)
301         , m_expr(expr)
302     {
303         listNode->m_next = this;
304     }
305
306     inline ArgumentsNode::ArgumentsNode()
307         : m_listNode(0)
308     {
309     }
310
311     inline ArgumentsNode::ArgumentsNode(ArgumentListNode* listNode)
312         : m_listNode(listNode)
313     {
314     }
315
316     inline NewExprNode::NewExprNode(const JSTokenLocation& location, ExpressionNode* expr)
317         : ExpressionNode(location)
318         , m_expr(expr)
319         , m_args(0)
320     {
321     }
322
323     inline NewExprNode::NewExprNode(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* args)
324         : ExpressionNode(location)
325         , m_expr(expr)
326         , m_args(args)
327     {
328     }
329
330     inline EvalFunctionCallNode::EvalFunctionCallNode(const JSTokenLocation& location, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
331         : ExpressionNode(location)
332         , ThrowableExpressionData(divot, divotStart, divotEnd)
333         , m_args(args)
334     {
335     }
336
337     inline FunctionCallValueNode::FunctionCallValueNode(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
338         : ExpressionNode(location)
339         , ThrowableExpressionData(divot, divotStart, divotEnd)
340         , m_expr(expr)
341         , m_args(args)
342     {
343         ASSERT(divot.offset >= divotStart.offset);
344     }
345
346     inline FunctionCallResolveNode::FunctionCallResolveNode(const JSTokenLocation& location, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
347         : ExpressionNode(location)
348         , ThrowableExpressionData(divot, divotStart, divotEnd)
349         , m_ident(ident)
350         , m_args(args)
351     {
352     }
353
354     inline FunctionCallBracketNode::FunctionCallBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
355         : ExpressionNode(location)
356         , ThrowableSubExpressionData(divot, divotStart, divotEnd)
357         , m_base(base)
358         , m_subscript(subscript)
359         , m_args(args)
360         , m_subscriptHasAssignments(subscriptHasAssignments)
361     {
362     }
363
364     inline FunctionCallDotNode::FunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
365         : ExpressionNode(location)
366         , ThrowableSubExpressionData(divot, divotStart, divotEnd)
367         , m_base(base)
368         , m_ident(ident)
369         , m_args(args)
370     {
371     }
372
373     inline BytecodeIntrinsicNode::BytecodeIntrinsicNode(const JSTokenLocation& location, EmitterType emitter, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
374         : ExpressionNode(location)
375         , ThrowableExpressionData(divot, divotStart, divotEnd)
376         , m_emitter(emitter)
377         , m_ident(ident)
378         , m_args(args)
379     {
380     }
381
382     inline CallFunctionCallDotNode::CallFunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
383         : FunctionCallDotNode(location, base, ident, args, divot, divotStart, divotEnd)
384     {
385     }
386
387     inline ApplyFunctionCallDotNode::ApplyFunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
388         : FunctionCallDotNode(location, base, ident, args, divot, divotStart, divotEnd)
389     {
390     }
391
392     inline PostfixNode::PostfixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator oper, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
393         : PrefixNode(location, expr, oper, divot, divotStart, divotEnd)
394     {
395     }
396
397     inline DeleteResolveNode::DeleteResolveNode(const JSTokenLocation& location, const Identifier& ident, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
398         : ExpressionNode(location)
399         , ThrowableExpressionData(divot, divotStart, divotEnd)
400         , m_ident(ident)
401     {
402     }
403
404     inline DeleteBracketNode::DeleteBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
405         : ExpressionNode(location)
406         , ThrowableExpressionData(divot, divotStart, divotEnd)
407         , m_base(base)
408         , m_subscript(subscript)
409     {
410     }
411
412     inline DeleteDotNode::DeleteDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
413         : ExpressionNode(location)
414         , ThrowableExpressionData(divot, divotStart, divotEnd)
415         , m_base(base)
416         , m_ident(ident)
417     {
418     }
419
420     inline DeleteValueNode::DeleteValueNode(const JSTokenLocation& location, ExpressionNode* expr)
421         : ExpressionNode(location)
422         , m_expr(expr)
423     {
424     }
425
426     inline VoidNode::VoidNode(const JSTokenLocation& location, ExpressionNode* expr)
427         : ExpressionNode(location)
428         , m_expr(expr)
429     {
430     }
431
432     inline TypeOfResolveNode::TypeOfResolveNode(const JSTokenLocation& location, const Identifier& ident)
433         : ExpressionNode(location, ResultType::stringType())
434         , m_ident(ident)
435     {
436     }
437
438     inline TypeOfValueNode::TypeOfValueNode(const JSTokenLocation& location, ExpressionNode* expr)
439         : ExpressionNode(location, ResultType::stringType())
440         , m_expr(expr)
441     {
442     }
443
444     inline PrefixNode::PrefixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator oper, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
445         : ExpressionNode(location)
446         , ThrowablePrefixedSubExpressionData(divot, divotStart, divotEnd)
447         , m_expr(expr)
448         , m_operator(oper)
449     {
450     }
451
452     inline UnaryOpNode::UnaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr, OpcodeID opcodeID)
453         : ExpressionNode(location, type)
454         , m_expr(expr)
455         , m_opcodeID(opcodeID)
456     {
457     }
458
459     inline UnaryPlusNode::UnaryPlusNode(const JSTokenLocation& location, ExpressionNode* expr)
460         : UnaryOpNode(location, ResultType::numberType(), expr, op_to_number)
461     {
462     }
463
464     inline NegateNode::NegateNode(const JSTokenLocation& location, ExpressionNode* expr)
465         : UnaryOpNode(location, ResultType::numberType(), expr, op_negate)
466     {
467     }
468
469     inline BitwiseNotNode::BitwiseNotNode(const JSTokenLocation& location, ExpressionNode* expr)
470         : ExpressionNode(location, ResultType::forBitOp())
471         , m_expr(expr)
472     {
473     }
474
475     inline LogicalNotNode::LogicalNotNode(const JSTokenLocation& location, ExpressionNode* expr)
476         : UnaryOpNode(location, ResultType::booleanType(), expr, op_not)
477     {
478     }
479
480     inline BinaryOpNode::BinaryOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
481         : ExpressionNode(location)
482         , m_expr1(expr1)
483         , m_expr2(expr2)
484         , m_opcodeID(opcodeID)
485         , m_rightHasAssignments(rightHasAssignments)
486     {
487     }
488
489     inline BinaryOpNode::BinaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
490         : ExpressionNode(location, type)
491         , m_expr1(expr1)
492         , m_expr2(expr2)
493         , m_opcodeID(opcodeID)
494         , m_rightHasAssignments(rightHasAssignments)
495     {
496     }
497
498     inline MultNode::MultNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
499         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mul, rightHasAssignments)
500     {
501     }
502
503     inline DivNode::DivNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
504         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_div, rightHasAssignments)
505     {
506     }
507
508
509     inline ModNode::ModNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
510         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mod, rightHasAssignments)
511     {
512     }
513
514     inline AddNode::AddNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
515         : BinaryOpNode(location, ResultType::forAdd(expr1->resultDescriptor(), expr2->resultDescriptor()), expr1, expr2, op_add, rightHasAssignments)
516     {
517     }
518
519     inline SubNode::SubNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
520         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_sub, rightHasAssignments)
521     {
522     }
523
524     inline LeftShiftNode::LeftShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
525         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_lshift, rightHasAssignments)
526     {
527     }
528
529     inline RightShiftNode::RightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
530         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_rshift, rightHasAssignments)
531     {
532     }
533
534     inline UnsignedRightShiftNode::UnsignedRightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
535         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_urshift, rightHasAssignments)
536     {
537     }
538
539     inline LessNode::LessNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
540         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_less, rightHasAssignments)
541     {
542     }
543
544     inline GreaterNode::GreaterNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
545         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_greater, rightHasAssignments)
546     {
547     }
548
549     inline LessEqNode::LessEqNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
550         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_lesseq, rightHasAssignments)
551     {
552     }
553
554     inline GreaterEqNode::GreaterEqNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
555         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_greatereq, rightHasAssignments)
556     {
557     }
558
559     inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
560         : BinaryOpNode(location, type, expr1, expr2, opcodeID, rightHasAssignments)
561     {
562     }
563
564     inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
565         : BinaryOpNode(location, expr1, expr2, opcodeID, rightHasAssignments)
566     {
567     }
568
569     inline InstanceOfNode::InstanceOfNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
570         : ThrowableBinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_instanceof, rightHasAssignments)
571     {
572     }
573
574     inline InNode::InNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
575         : ThrowableBinaryOpNode(location, expr1, expr2, op_in, rightHasAssignments)
576     {
577     }
578
579     inline EqualNode::EqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
580         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_eq, rightHasAssignments)
581     {
582     }
583
584     inline NotEqualNode::NotEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
585         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_neq, rightHasAssignments)
586     {
587     }
588
589     inline StrictEqualNode::StrictEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
590         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_stricteq, rightHasAssignments)
591     {
592     }
593
594     inline NotStrictEqualNode::NotStrictEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
595         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_nstricteq, rightHasAssignments)
596     {
597     }
598
599     inline BitAndNode::BitAndNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
600         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitand, rightHasAssignments)
601     {
602     }
603
604     inline BitOrNode::BitOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
605         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitor, rightHasAssignments)
606     {
607     }
608
609     inline BitXOrNode::BitXOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
610         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitxor, rightHasAssignments)
611     {
612     }
613
614     inline LogicalOpNode::LogicalOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper)
615         : ExpressionNode(location, ResultType::forLogicalOp(expr1->resultDescriptor(), expr2->resultDescriptor()))
616         , m_expr1(expr1)
617         , m_expr2(expr2)
618         , m_operator(oper)
619     {
620     }
621
622     inline ConditionalNode::ConditionalNode(const JSTokenLocation& location, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2)
623         : ExpressionNode(location)
624         , m_logical(logical)
625         , m_expr1(expr1)
626         , m_expr2(expr2)
627     {
628     }
629
630     inline ReadModifyResolveNode::ReadModifyResolveNode(const JSTokenLocation& location, const Identifier& ident, Operator oper, ExpressionNode*  right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
631         : ExpressionNode(location)
632         , ThrowableExpressionData(divot, divotStart, divotEnd)
633         , m_ident(ident)
634         , m_right(right)
635         , m_operator(oper)
636         , m_rightHasAssignments(rightHasAssignments)
637     {
638     }
639
640     inline AssignResolveNode::AssignResolveNode(const JSTokenLocation& location, const Identifier& ident, ExpressionNode* right, AssignmentContext assignmentContext)
641         : ExpressionNode(location)
642         , m_ident(ident)
643         , m_right(right)
644         , m_assignmentContext(assignmentContext)
645     {
646     }
647
648
649     inline ReadModifyBracketNode::ReadModifyBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
650         : ExpressionNode(location)
651         , ThrowableSubExpressionData(divot, divotStart, divotEnd)
652         , m_base(base)
653         , m_subscript(subscript)
654         , m_right(right)
655         , m_operator(oper)
656         , m_subscriptHasAssignments(subscriptHasAssignments)
657         , m_rightHasAssignments(rightHasAssignments)
658     {
659     }
660
661     inline AssignBracketNode::AssignBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
662         : ExpressionNode(location)
663         , ThrowableExpressionData(divot, divotStart, divotEnd)
664         , m_base(base)
665         , m_subscript(subscript)
666         , m_right(right)
667         , m_subscriptHasAssignments(subscriptHasAssignments)
668         , m_rightHasAssignments(rightHasAssignments)
669     {
670     }
671
672     inline AssignDotNode::AssignDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
673         : ExpressionNode(location)
674         , ThrowableExpressionData(divot, divotStart, divotEnd)
675         , m_base(base)
676         , m_ident(ident)
677         , m_right(right)
678         , m_rightHasAssignments(rightHasAssignments)
679     {
680     }
681
682     inline ReadModifyDotNode::ReadModifyDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
683         : ExpressionNode(location)
684         , ThrowableSubExpressionData(divot, divotStart, divotEnd)
685         , m_base(base)
686         , m_ident(ident)
687         , m_right(right)
688         , m_operator(oper)
689         , m_rightHasAssignments(rightHasAssignments)
690     {
691     }
692
693     inline AssignErrorNode::AssignErrorNode(const JSTokenLocation& location, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
694         : ExpressionNode(location)
695         , ThrowableExpressionData(divot, divotStart, divotEnd)
696     {
697     }
698
699     inline CommaNode::CommaNode(const JSTokenLocation& location, ExpressionNode* expr)
700         : ExpressionNode(location)
701         , m_expr(expr)
702         , m_next(nullptr)
703     {
704     }
705
706     inline SourceElements::SourceElements()
707         : m_head(nullptr)
708         , m_tail(nullptr)
709     {
710     }
711
712     inline EmptyStatementNode::EmptyStatementNode(const JSTokenLocation& location)
713         : StatementNode(location)
714     {
715     }
716
717     inline DebuggerStatementNode::DebuggerStatementNode(const JSTokenLocation& location)
718         : StatementNode(location)
719     {
720     }
721     
722     inline ExprStatementNode::ExprStatementNode(const JSTokenLocation& location, ExpressionNode* expr)
723         : StatementNode(location)
724         , m_expr(expr)
725     {
726     }
727
728     inline DeclarationStatement::DeclarationStatement(const JSTokenLocation& location, ExpressionNode* expr)
729         : StatementNode(location)
730         , m_expr(expr)
731     {
732     }
733
734     inline ModuleDeclarationNode::ModuleDeclarationNode(const JSTokenLocation& location)
735         : StatementNode(location)
736     {
737     }
738
739     inline ModuleNameNode::ModuleNameNode(const JSTokenLocation& location, const Identifier& moduleName)
740         : Node(location)
741         , m_moduleName(moduleName)
742     {
743     }
744
745     inline ImportSpecifierNode::ImportSpecifierNode(const JSTokenLocation& location, const Identifier& importedName, const Identifier& localName)
746         : Node(location)
747         , m_importedName(importedName)
748         , m_localName(localName)
749     {
750     }
751
752     inline ImportDeclarationNode::ImportDeclarationNode(const JSTokenLocation& location, ImportSpecifierListNode* importSpecifierList, ModuleNameNode* moduleName)
753         : ModuleDeclarationNode(location)
754         , m_specifierList(importSpecifierList)
755         , m_moduleName(moduleName)
756     {
757     }
758
759     inline ExportAllDeclarationNode::ExportAllDeclarationNode(const JSTokenLocation& location, ModuleNameNode* moduleName)
760         : ModuleDeclarationNode(location)
761         , m_moduleName(moduleName)
762     {
763     }
764
765     inline ExportDefaultDeclarationNode::ExportDefaultDeclarationNode(const JSTokenLocation& location, StatementNode* declaration, const Identifier& localName)
766         : ModuleDeclarationNode(location)
767         , m_declaration(declaration)
768         , m_localName(localName)
769     {
770     }
771
772     inline ExportLocalDeclarationNode::ExportLocalDeclarationNode(const JSTokenLocation& location, StatementNode* declaration)
773         : ModuleDeclarationNode(location)
774         , m_declaration(declaration)
775     {
776     }
777
778     inline ExportNamedDeclarationNode::ExportNamedDeclarationNode(const JSTokenLocation& location, ExportSpecifierListNode* exportSpecifierList, ModuleNameNode* moduleName)
779         : ModuleDeclarationNode(location)
780         , m_specifierList(exportSpecifierList)
781         , m_moduleName(moduleName)
782     {
783     }
784
785     inline ExportSpecifierNode::ExportSpecifierNode(const JSTokenLocation& location, const Identifier& localName, const Identifier& exportedName)
786         : Node(location)
787         , m_localName(localName)
788         , m_exportedName(exportedName)
789     {
790     }
791
792     inline EmptyVarExpression::EmptyVarExpression(const JSTokenLocation& location, const Identifier& ident)
793         : ExpressionNode(location)
794         , m_ident(ident)
795     {
796     }
797
798     inline EmptyLetExpression::EmptyLetExpression(const JSTokenLocation& location, const Identifier& ident)
799         : ExpressionNode(location)
800         , m_ident(ident)
801     {
802     }
803     
804     inline IfElseNode::IfElseNode(const JSTokenLocation& location, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock)
805         : StatementNode(location)
806         , m_condition(condition)
807         , m_ifBlock(ifBlock)
808         , m_elseBlock(elseBlock)
809     {
810     }
811
812     inline DoWhileNode::DoWhileNode(const JSTokenLocation& location, StatementNode* statement, ExpressionNode* expr)
813         : StatementNode(location)
814         , m_statement(statement)
815         , m_expr(expr)
816     {
817     }
818
819     inline WhileNode::WhileNode(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement)
820         : StatementNode(location)
821         , m_expr(expr)
822         , m_statement(statement)
823     {
824     }
825
826     inline ForNode::ForNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement, VariableEnvironment& lexicalVariables)
827         : StatementNode(location)
828         , VariableEnvironmentNode(lexicalVariables)
829         , m_expr1(expr1)
830         , m_expr2(expr2)
831         , m_expr3(expr3)
832         , m_statement(statement)
833     {
834         ASSERT(statement);
835     }
836
837     inline ContinueNode::ContinueNode(const JSTokenLocation& location, const Identifier& ident)
838         : StatementNode(location)
839         , m_ident(ident)
840     {
841     }
842     
843     inline BreakNode::BreakNode(const JSTokenLocation& location, const Identifier& ident)
844         : StatementNode(location)
845         , m_ident(ident)
846     {
847     }
848     
849     inline ReturnNode::ReturnNode(const JSTokenLocation& location, ExpressionNode* value)
850         : StatementNode(location)
851         , m_value(value)
852     {
853     }
854
855     inline WithNode::WithNode(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement, const JSTextPosition& divot, uint32_t expressionLength)
856         : StatementNode(location)
857         , m_expr(expr)
858         , m_statement(statement)
859         , m_divot(divot)
860         , m_expressionLength(expressionLength)
861     {
862     }
863
864     inline LabelNode::LabelNode(const JSTokenLocation& location, const Identifier& name, StatementNode* statement)
865         : StatementNode(location)
866         , m_name(name)
867         , m_statement(statement)
868     {
869     }
870
871     inline ThrowNode::ThrowNode(const JSTokenLocation& location, ExpressionNode* expr)
872         : StatementNode(location)
873         , m_expr(expr)
874     {
875     }
876
877     inline TryNode::TryNode(const JSTokenLocation& location, StatementNode* tryBlock, DestructuringPatternNode* catchPattern, StatementNode* catchBlock, VariableEnvironment& catchEnvironment, StatementNode* finallyBlock)
878         : StatementNode(location)
879         , VariableEnvironmentNode(catchEnvironment)
880         , m_tryBlock(tryBlock)
881         , m_catchPattern(catchPattern)
882         , m_catchBlock(catchBlock)
883         , m_finallyBlock(finallyBlock)
884     {
885     }
886
887     inline FunctionParameters::FunctionParameters()
888     {
889     }
890
891     
892     inline BaseFuncExprNode::BaseFuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionMetadataNode* m_metadata, const SourceCode& source)
893         : ExpressionNode(location)
894         , m_metadata(m_metadata)
895     {
896         m_metadata->finishParsing(source, ident, FunctionExpression);
897     }
898
899     inline FuncExprNode::FuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionMetadataNode* m_metadata, const SourceCode& source)
900         : BaseFuncExprNode(location, ident, m_metadata, source)
901     {
902     }
903
904     inline FuncDeclNode::FuncDeclNode(const JSTokenLocation& location, const Identifier& ident, FunctionMetadataNode* m_metadata, const SourceCode& source)
905         : StatementNode(location)
906         , m_metadata(m_metadata)
907     {
908         m_metadata->finishParsing(source, ident, FunctionDeclaration);
909     }
910
911     inline ArrowFuncExprNode::ArrowFuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionMetadataNode* m_metadata, const SourceCode& source)
912         : BaseFuncExprNode(location, ident, m_metadata, source)
913     {
914     }
915
916     inline YieldExprNode::YieldExprNode(const JSTokenLocation& location, ExpressionNode* argument, bool delegate)
917         : ExpressionNode(location)
918         , m_argument(argument)
919         , m_delegate(delegate)
920     {
921     }
922
923     inline ClassDeclNode::ClassDeclNode(const JSTokenLocation& location, ExpressionNode* classDeclaration)
924         : StatementNode(location)
925         , m_classDeclaration(classDeclaration)
926     {
927     }
928
929     inline ClassExprNode::ClassExprNode(const JSTokenLocation& location, const Identifier& name, VariableEnvironment& classEnvironment, ExpressionNode* constructorExpression, ExpressionNode* classHeritage, PropertyListNode* instanceMethods, PropertyListNode* staticMethods)
930         : ExpressionNode(location)
931         , VariableEnvironmentNode(classEnvironment)
932         , m_name(name)
933         , m_constructorExpression(constructorExpression)
934         , m_classHeritage(classHeritage)
935         , m_instanceMethods(instanceMethods)
936         , m_staticMethods(staticMethods)
937     {
938     }
939
940     inline CaseClauseNode::CaseClauseNode(ExpressionNode* expr, SourceElements* statements)
941         : m_expr(expr)
942         , m_statements(statements)
943     {
944     }
945
946     inline ClauseListNode::ClauseListNode(CaseClauseNode* clause)
947         : m_clause(clause)
948         , m_next(0)
949     {
950     }
951
952     inline ClauseListNode::ClauseListNode(ClauseListNode* clauseList, CaseClauseNode* clause)
953         : m_clause(clause)
954         , m_next(0)
955     {
956         clauseList->m_next = this;
957     }
958
959     inline CaseBlockNode::CaseBlockNode(ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2)
960         : m_list1(list1)
961         , m_defaultClause(defaultClause)
962         , m_list2(list2)
963     {
964     }
965
966     inline SwitchNode::SwitchNode(const JSTokenLocation& location, ExpressionNode* expr, CaseBlockNode* block, VariableEnvironment& lexicalVariables)
967         : StatementNode(location)
968         , VariableEnvironmentNode(lexicalVariables)
969         , m_expr(expr)
970         , m_block(block)
971     {
972     }
973
974     inline BlockNode::BlockNode(const JSTokenLocation& location, SourceElements* statements, VariableEnvironment& lexicalVariables)
975         : StatementNode(location)
976         , VariableEnvironmentNode(lexicalVariables)
977         , m_statements(statements)
978     {
979     }
980
981     inline EnumerationNode::EnumerationNode(const JSTokenLocation& location, ExpressionNode* lexpr, ExpressionNode* expr, StatementNode* statement, VariableEnvironment& lexicalVariables)
982         : StatementNode(location)
983         , VariableEnvironmentNode(lexicalVariables)
984         , m_lexpr(lexpr)
985         , m_expr(expr)
986         , m_statement(statement)
987     {
988         ASSERT(lexpr);
989     }
990     
991     inline ForInNode::ForInNode(const JSTokenLocation& location, ExpressionNode* lexpr, ExpressionNode* expr, StatementNode* statement, VariableEnvironment& lexicalVariables)
992         : EnumerationNode(location, lexpr, expr, statement, lexicalVariables)
993     {
994     }
995     
996     inline ForOfNode::ForOfNode(const JSTokenLocation& location, ExpressionNode* lexpr, ExpressionNode* expr, StatementNode* statement, VariableEnvironment& lexicalVariables)
997         : EnumerationNode(location, lexpr, expr, statement, lexicalVariables)
998     {
999     }
1000     
1001     inline DestructuringPatternNode::DestructuringPatternNode()
1002     {
1003     }
1004
1005     inline ArrayPatternNode::ArrayPatternNode()
1006         : DestructuringPatternNode()
1007     {
1008     }
1009     
1010     inline ObjectPatternNode::ObjectPatternNode()
1011         : DestructuringPatternNode()
1012     {
1013     }
1014     
1015     inline BindingNode::BindingNode(const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end, AssignmentContext context)
1016         : DestructuringPatternNode()
1017         , m_divotStart(start)
1018         , m_divotEnd(end)
1019         , m_boundProperty(boundProperty)
1020         , m_bindingContext(context)
1021     {
1022     }
1023
1024     inline AssignmentElementNode::AssignmentElementNode(ExpressionNode* assignmentTarget, const JSTextPosition& start, const JSTextPosition& end)
1025         : DestructuringPatternNode()
1026         , m_divotStart(start)
1027         , m_divotEnd(end)
1028         , m_assignmentTarget(assignmentTarget)
1029     {
1030     }
1031
1032     inline RestParameterNode::RestParameterNode(const Identifier& name, unsigned numParametersToSkip, const JSTextPosition& start, const JSTextPosition& end)
1033         : DestructuringPatternNode()
1034         , m_name(name)
1035         , m_numParametersToSkip(numParametersToSkip)
1036         , m_divotStart(start)
1037         , m_divotEnd(end)
1038     {
1039     }
1040
1041     inline DestructuringAssignmentNode::DestructuringAssignmentNode(const JSTokenLocation& location, DestructuringPatternNode* bindings, ExpressionNode* initializer)
1042         : ExpressionNode(location)
1043         , m_bindings(bindings)
1044         , m_initializer(initializer)
1045     {
1046     }
1047     
1048 } // namespace JSC
1049
1050 #endif // NodeConstructors_h