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