[ES7] Introduce exponentiation expression
[WebKit-https.git] / Source / JavaScriptCore / parser / NodeConstructors.h
1 /*
2  *  Copyright (C) 2009, 2013, 2015-2016 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)
161         : ExpressionNode(location)
162     {
163     }
164
165     inline SuperNode::SuperNode(const JSTokenLocation& location)
166         : ExpressionNode(location)
167     {
168     }
169
170     inline NewTargetNode::NewTargetNode(const JSTokenLocation& location)
171         : ExpressionNode(location)
172     {
173     }
174
175     inline ResolveNode::ResolveNode(const JSTokenLocation& location, const Identifier& ident, const JSTextPosition& start)
176         : ExpressionNode(location)
177         , m_ident(ident)
178         , m_start(start)
179     {
180         ASSERT(m_start.offset >= m_start.lineStartOffset);
181     }
182
183     inline ElementNode::ElementNode(int elision, ExpressionNode* node)
184         : m_next(0)
185         , m_elision(elision)
186         , m_node(node)
187     {
188     }
189
190     inline ElementNode::ElementNode(ElementNode* l, int elision, ExpressionNode* node)
191         : m_next(0)
192         , m_elision(elision)
193         , m_node(node)
194     {
195         l->m_next = this;
196     }
197
198     inline ArrayNode::ArrayNode(const JSTokenLocation& location, int elision)
199         : ExpressionNode(location)
200         , m_element(0)
201         , m_elision(elision)
202         , m_optional(true)
203     {
204     }
205
206     inline ArrayNode::ArrayNode(const JSTokenLocation& location, ElementNode* element)
207         : ExpressionNode(location)
208         , m_element(element)
209         , m_elision(0)
210         , m_optional(false)
211     {
212     }
213
214     inline ArrayNode::ArrayNode(const JSTokenLocation& location, int elision, ElementNode* element)
215         : ExpressionNode(location)
216         , m_element(element)
217         , m_elision(elision)
218         , m_optional(true)
219     {
220     }
221
222     inline PropertyNode::PropertyNode(const Identifier& name, ExpressionNode* assign, Type type, PutType putType, SuperBinding superBinding, bool isClassProperty)
223         : m_name(&name)
224         , m_assign(assign)
225         , m_type(type)
226         , m_needsSuperBinding(superBinding == SuperBinding::Needed)
227         , m_putType(putType)
228         , m_isClassProperty(isClassProperty)
229     {
230     }
231
232     inline PropertyNode::PropertyNode(ExpressionNode* name, ExpressionNode* assign, Type type, PutType putType, SuperBinding superBinding, bool isClassProperty)
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         , m_isClassProperty(isClassProperty)
240     {
241     }
242
243     inline PropertyListNode::PropertyListNode(const JSTokenLocation& location, PropertyNode* node)
244         : ExpressionNode(location)
245         , m_node(node)
246         , m_next(0)
247     {
248     }
249
250     inline PropertyListNode::PropertyListNode(const JSTokenLocation& location, PropertyNode* node, PropertyListNode* list)
251         : ExpressionNode(location)
252         , m_node(node)
253         , m_next(0)
254     {
255         list->m_next = this;
256     }
257
258     inline ObjectLiteralNode::ObjectLiteralNode(const JSTokenLocation& location)
259         : ExpressionNode(location)
260         , m_list(0)
261     {
262     }
263
264     inline ObjectLiteralNode::ObjectLiteralNode(const JSTokenLocation& location, PropertyListNode* list)
265         : ExpressionNode(location)
266         , m_list(list)
267     {
268     }
269
270     inline BracketAccessorNode::BracketAccessorNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments)
271         : ExpressionNode(location)
272         , m_base(base)
273         , m_subscript(subscript)
274         , m_subscriptHasAssignments(subscriptHasAssignments)
275     {
276     }
277
278     inline DotAccessorNode::DotAccessorNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident)
279         : ExpressionNode(location)
280         , m_base(base)
281         , m_ident(ident)
282     {
283     }
284     
285     
286     inline SpreadExpressionNode::SpreadExpressionNode(const JSTokenLocation& location, ExpressionNode* expression)
287         : ExpressionNode(location)
288         , m_expression(expression)
289     {
290     }
291
292     inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ExpressionNode* expr)
293         : ExpressionNode(location)
294         , m_next(0)
295         , m_expr(expr)
296     {
297     }
298
299     inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ArgumentListNode* listNode, ExpressionNode* expr)
300         : ExpressionNode(location)
301         , m_next(0)
302         , m_expr(expr)
303     {
304         listNode->m_next = this;
305     }
306
307     inline ArgumentsNode::ArgumentsNode()
308         : m_listNode(0)
309     {
310     }
311
312     inline ArgumentsNode::ArgumentsNode(ArgumentListNode* listNode)
313         : m_listNode(listNode)
314     {
315     }
316
317     inline NewExprNode::NewExprNode(const JSTokenLocation& location, ExpressionNode* expr)
318         : ExpressionNode(location)
319         , m_expr(expr)
320         , m_args(0)
321     {
322     }
323
324     inline NewExprNode::NewExprNode(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* args)
325         : ExpressionNode(location)
326         , m_expr(expr)
327         , m_args(args)
328     {
329     }
330
331     inline EvalFunctionCallNode::EvalFunctionCallNode(const JSTokenLocation& location, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
332         : ExpressionNode(location)
333         , ThrowableExpressionData(divot, divotStart, divotEnd)
334         , m_args(args)
335     {
336     }
337
338     inline FunctionCallValueNode::FunctionCallValueNode(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
339         : ExpressionNode(location)
340         , ThrowableExpressionData(divot, divotStart, divotEnd)
341         , m_expr(expr)
342         , m_args(args)
343     {
344         ASSERT(divot.offset >= divotStart.offset);
345     }
346
347     inline FunctionCallResolveNode::FunctionCallResolveNode(const JSTokenLocation& location, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
348         : ExpressionNode(location)
349         , ThrowableExpressionData(divot, divotStart, divotEnd)
350         , m_ident(ident)
351         , m_args(args)
352     {
353     }
354
355     inline FunctionCallBracketNode::FunctionCallBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
356         : ExpressionNode(location)
357         , ThrowableSubExpressionData(divot, divotStart, divotEnd)
358         , m_base(base)
359         , m_subscript(subscript)
360         , m_args(args)
361         , m_subscriptHasAssignments(subscriptHasAssignments)
362     {
363     }
364
365     inline FunctionCallDotNode::FunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
366         : ExpressionNode(location)
367         , ThrowableSubExpressionData(divot, divotStart, divotEnd)
368         , m_base(base)
369         , m_ident(ident)
370         , m_args(args)
371     {
372     }
373
374     inline BytecodeIntrinsicNode::BytecodeIntrinsicNode(Type type, const JSTokenLocation& location, EmitterType emitter, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
375         : ExpressionNode(location)
376         , ThrowableExpressionData(divot, divotStart, divotEnd)
377         , m_type(type)
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 PowNode::PowNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
501         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_pow, rightHasAssignments)
502     {
503     }
504
505     inline MultNode::MultNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
506         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mul, rightHasAssignments)
507     {
508     }
509
510     inline DivNode::DivNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
511         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_div, rightHasAssignments)
512     {
513     }
514
515
516     inline ModNode::ModNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
517         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mod, rightHasAssignments)
518     {
519     }
520
521     inline AddNode::AddNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
522         : BinaryOpNode(location, ResultType::forAdd(expr1->resultDescriptor(), expr2->resultDescriptor()), expr1, expr2, op_add, rightHasAssignments)
523     {
524     }
525
526     inline SubNode::SubNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
527         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_sub, rightHasAssignments)
528     {
529     }
530
531     inline LeftShiftNode::LeftShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
532         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_lshift, rightHasAssignments)
533     {
534     }
535
536     inline RightShiftNode::RightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
537         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_rshift, rightHasAssignments)
538     {
539     }
540
541     inline UnsignedRightShiftNode::UnsignedRightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
542         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_urshift, rightHasAssignments)
543     {
544     }
545
546     inline LessNode::LessNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
547         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_less, rightHasAssignments)
548     {
549     }
550
551     inline GreaterNode::GreaterNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
552         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_greater, rightHasAssignments)
553     {
554     }
555
556     inline LessEqNode::LessEqNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
557         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_lesseq, rightHasAssignments)
558     {
559     }
560
561     inline GreaterEqNode::GreaterEqNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
562         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_greatereq, rightHasAssignments)
563     {
564     }
565
566     inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
567         : BinaryOpNode(location, type, expr1, expr2, opcodeID, rightHasAssignments)
568     {
569     }
570
571     inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
572         : BinaryOpNode(location, expr1, expr2, opcodeID, rightHasAssignments)
573     {
574     }
575
576     inline InstanceOfNode::InstanceOfNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
577         : ThrowableBinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_instanceof, rightHasAssignments)
578     {
579     }
580
581     inline InNode::InNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
582         : ThrowableBinaryOpNode(location, expr1, expr2, op_in, rightHasAssignments)
583     {
584     }
585
586     inline EqualNode::EqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
587         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_eq, rightHasAssignments)
588     {
589     }
590
591     inline NotEqualNode::NotEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
592         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_neq, rightHasAssignments)
593     {
594     }
595
596     inline StrictEqualNode::StrictEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
597         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_stricteq, rightHasAssignments)
598     {
599     }
600
601     inline NotStrictEqualNode::NotStrictEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
602         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_nstricteq, rightHasAssignments)
603     {
604     }
605
606     inline BitAndNode::BitAndNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
607         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitand, rightHasAssignments)
608     {
609     }
610
611     inline BitOrNode::BitOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
612         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitor, rightHasAssignments)
613     {
614     }
615
616     inline BitXOrNode::BitXOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
617         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitxor, rightHasAssignments)
618     {
619     }
620
621     inline LogicalOpNode::LogicalOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper)
622         : ExpressionNode(location, ResultType::forLogicalOp(expr1->resultDescriptor(), expr2->resultDescriptor()))
623         , m_expr1(expr1)
624         , m_expr2(expr2)
625         , m_operator(oper)
626     {
627     }
628
629     inline ConditionalNode::ConditionalNode(const JSTokenLocation& location, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2)
630         : ExpressionNode(location)
631         , m_logical(logical)
632         , m_expr1(expr1)
633         , m_expr2(expr2)
634     {
635     }
636
637     inline ReadModifyResolveNode::ReadModifyResolveNode(const JSTokenLocation& location, const Identifier& ident, Operator oper, ExpressionNode*  right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
638         : ExpressionNode(location)
639         , ThrowableExpressionData(divot, divotStart, divotEnd)
640         , m_ident(ident)
641         , m_right(right)
642         , m_operator(oper)
643         , m_rightHasAssignments(rightHasAssignments)
644     {
645     }
646
647     inline AssignResolveNode::AssignResolveNode(const JSTokenLocation& location, const Identifier& ident, ExpressionNode* right, AssignmentContext assignmentContext)
648         : ExpressionNode(location)
649         , m_ident(ident)
650         , m_right(right)
651         , m_assignmentContext(assignmentContext)
652     {
653     }
654
655
656     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)
657         : ExpressionNode(location)
658         , ThrowableSubExpressionData(divot, divotStart, divotEnd)
659         , m_base(base)
660         , m_subscript(subscript)
661         , m_right(right)
662         , m_operator(oper)
663         , m_subscriptHasAssignments(subscriptHasAssignments)
664         , m_rightHasAssignments(rightHasAssignments)
665     {
666     }
667
668     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)
669         : ExpressionNode(location)
670         , ThrowableExpressionData(divot, divotStart, divotEnd)
671         , m_base(base)
672         , m_subscript(subscript)
673         , m_right(right)
674         , m_subscriptHasAssignments(subscriptHasAssignments)
675         , m_rightHasAssignments(rightHasAssignments)
676     {
677     }
678
679     inline AssignDotNode::AssignDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
680         : ExpressionNode(location)
681         , ThrowableExpressionData(divot, divotStart, divotEnd)
682         , m_base(base)
683         , m_ident(ident)
684         , m_right(right)
685         , m_rightHasAssignments(rightHasAssignments)
686     {
687     }
688
689     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)
690         : ExpressionNode(location)
691         , ThrowableSubExpressionData(divot, divotStart, divotEnd)
692         , m_base(base)
693         , m_ident(ident)
694         , m_right(right)
695         , m_operator(oper)
696         , m_rightHasAssignments(rightHasAssignments)
697     {
698     }
699
700     inline AssignErrorNode::AssignErrorNode(const JSTokenLocation& location, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
701         : ExpressionNode(location)
702         , ThrowableExpressionData(divot, divotStart, divotEnd)
703     {
704     }
705
706     inline CommaNode::CommaNode(const JSTokenLocation& location, ExpressionNode* expr)
707         : ExpressionNode(location)
708         , m_expr(expr)
709         , m_next(nullptr)
710     {
711     }
712
713     inline SourceElements::SourceElements()
714         : m_head(nullptr)
715         , m_tail(nullptr)
716     {
717     }
718
719     inline EmptyStatementNode::EmptyStatementNode(const JSTokenLocation& location)
720         : StatementNode(location)
721     {
722     }
723
724     inline DebuggerStatementNode::DebuggerStatementNode(const JSTokenLocation& location)
725         : StatementNode(location)
726     {
727     }
728     
729     inline ExprStatementNode::ExprStatementNode(const JSTokenLocation& location, ExpressionNode* expr)
730         : StatementNode(location)
731         , m_expr(expr)
732     {
733     }
734
735     inline DeclarationStatement::DeclarationStatement(const JSTokenLocation& location, ExpressionNode* expr)
736         : StatementNode(location)
737         , m_expr(expr)
738     {
739     }
740
741     inline ModuleDeclarationNode::ModuleDeclarationNode(const JSTokenLocation& location)
742         : StatementNode(location)
743     {
744     }
745
746     inline ModuleNameNode::ModuleNameNode(const JSTokenLocation& location, const Identifier& moduleName)
747         : Node(location)
748         , m_moduleName(moduleName)
749     {
750     }
751
752     inline ImportSpecifierNode::ImportSpecifierNode(const JSTokenLocation& location, const Identifier& importedName, const Identifier& localName)
753         : Node(location)
754         , m_importedName(importedName)
755         , m_localName(localName)
756     {
757     }
758
759     inline ImportDeclarationNode::ImportDeclarationNode(const JSTokenLocation& location, ImportSpecifierListNode* importSpecifierList, ModuleNameNode* moduleName)
760         : ModuleDeclarationNode(location)
761         , m_specifierList(importSpecifierList)
762         , m_moduleName(moduleName)
763     {
764     }
765
766     inline ExportAllDeclarationNode::ExportAllDeclarationNode(const JSTokenLocation& location, ModuleNameNode* moduleName)
767         : ModuleDeclarationNode(location)
768         , m_moduleName(moduleName)
769     {
770     }
771
772     inline ExportDefaultDeclarationNode::ExportDefaultDeclarationNode(const JSTokenLocation& location, StatementNode* declaration, const Identifier& localName)
773         : ModuleDeclarationNode(location)
774         , m_declaration(declaration)
775         , m_localName(localName)
776     {
777     }
778
779     inline ExportLocalDeclarationNode::ExportLocalDeclarationNode(const JSTokenLocation& location, StatementNode* declaration)
780         : ModuleDeclarationNode(location)
781         , m_declaration(declaration)
782     {
783     }
784
785     inline ExportNamedDeclarationNode::ExportNamedDeclarationNode(const JSTokenLocation& location, ExportSpecifierListNode* exportSpecifierList, ModuleNameNode* moduleName)
786         : ModuleDeclarationNode(location)
787         , m_specifierList(exportSpecifierList)
788         , m_moduleName(moduleName)
789     {
790     }
791
792     inline ExportSpecifierNode::ExportSpecifierNode(const JSTokenLocation& location, const Identifier& localName, const Identifier& exportedName)
793         : Node(location)
794         , m_localName(localName)
795         , m_exportedName(exportedName)
796     {
797     }
798
799     inline EmptyVarExpression::EmptyVarExpression(const JSTokenLocation& location, const Identifier& ident)
800         : ExpressionNode(location)
801         , m_ident(ident)
802     {
803     }
804
805     inline EmptyLetExpression::EmptyLetExpression(const JSTokenLocation& location, const Identifier& ident)
806         : ExpressionNode(location)
807         , m_ident(ident)
808     {
809     }
810     
811     inline IfElseNode::IfElseNode(const JSTokenLocation& location, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock)
812         : StatementNode(location)
813         , m_condition(condition)
814         , m_ifBlock(ifBlock)
815         , m_elseBlock(elseBlock)
816     {
817     }
818
819     inline DoWhileNode::DoWhileNode(const JSTokenLocation& location, StatementNode* statement, ExpressionNode* expr)
820         : StatementNode(location)
821         , m_statement(statement)
822         , m_expr(expr)
823     {
824     }
825
826     inline WhileNode::WhileNode(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement)
827         : StatementNode(location)
828         , m_expr(expr)
829         , m_statement(statement)
830     {
831     }
832
833     inline ForNode::ForNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement, VariableEnvironment& lexicalVariables)
834         : StatementNode(location)
835         , VariableEnvironmentNode(lexicalVariables)
836         , m_expr1(expr1)
837         , m_expr2(expr2)
838         , m_expr3(expr3)
839         , m_statement(statement)
840     {
841         ASSERT(statement);
842     }
843
844     inline ContinueNode::ContinueNode(const JSTokenLocation& location, const Identifier& ident)
845         : StatementNode(location)
846         , m_ident(ident)
847     {
848     }
849     
850     inline BreakNode::BreakNode(const JSTokenLocation& location, const Identifier& ident)
851         : StatementNode(location)
852         , m_ident(ident)
853     {
854     }
855     
856     inline ReturnNode::ReturnNode(const JSTokenLocation& location, ExpressionNode* value)
857         : StatementNode(location)
858         , m_value(value)
859     {
860     }
861
862     inline WithNode::WithNode(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement, const JSTextPosition& divot, uint32_t expressionLength)
863         : StatementNode(location)
864         , m_expr(expr)
865         , m_statement(statement)
866         , m_divot(divot)
867         , m_expressionLength(expressionLength)
868     {
869     }
870
871     inline LabelNode::LabelNode(const JSTokenLocation& location, const Identifier& name, StatementNode* statement)
872         : StatementNode(location)
873         , m_name(name)
874         , m_statement(statement)
875     {
876     }
877
878     inline ThrowNode::ThrowNode(const JSTokenLocation& location, ExpressionNode* expr)
879         : StatementNode(location)
880         , m_expr(expr)
881     {
882     }
883
884     inline TryNode::TryNode(const JSTokenLocation& location, StatementNode* tryBlock, DestructuringPatternNode* catchPattern, StatementNode* catchBlock, VariableEnvironment& catchEnvironment, StatementNode* finallyBlock)
885         : StatementNode(location)
886         , VariableEnvironmentNode(catchEnvironment)
887         , m_tryBlock(tryBlock)
888         , m_catchPattern(catchPattern)
889         , m_catchBlock(catchBlock)
890         , m_finallyBlock(finallyBlock)
891     {
892     }
893
894     inline FunctionParameters::FunctionParameters()
895     {
896     }
897
898     
899     inline BaseFuncExprNode::BaseFuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionMetadataNode* metadata, const SourceCode& source, FunctionMode functionMode)
900         : ExpressionNode(location)
901         , m_metadata(metadata)
902     {
903         m_metadata->finishParsing(source, ident, functionMode);
904     }
905
906     inline FuncExprNode::FuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionMetadataNode* metadata, const SourceCode& source)
907         : BaseFuncExprNode(location, ident, metadata, source, FunctionMode::FunctionExpression)
908     {
909     }
910
911     inline FuncExprNode::FuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionMetadataNode* metadata, const SourceCode& source, FunctionMode functionMode)
912         : BaseFuncExprNode(location, ident, metadata, source, functionMode)
913     {
914     }
915     
916     inline FuncDeclNode::FuncDeclNode(const JSTokenLocation& location, const Identifier& ident, FunctionMetadataNode* metadata, const SourceCode& source)
917         : StatementNode(location)
918         , m_metadata(metadata)
919     {
920         m_metadata->finishParsing(source, ident, FunctionMode::FunctionDeclaration);
921     }
922
923     inline ArrowFuncExprNode::ArrowFuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionMetadataNode* metadata, const SourceCode& source)
924         : BaseFuncExprNode(location, ident, metadata, source, FunctionMode::FunctionExpression)
925     {
926     }
927
928     inline MethodDefinitionNode::MethodDefinitionNode(const JSTokenLocation& location, const Identifier& ident, FunctionMetadataNode* metadata, const SourceCode& source)
929         : FuncExprNode(location, ident, metadata, source, FunctionMode::MethodDefinition)
930     {
931     }
932     
933     inline YieldExprNode::YieldExprNode(const JSTokenLocation& location, ExpressionNode* argument, bool delegate)
934         : ExpressionNode(location)
935         , m_argument(argument)
936         , m_delegate(delegate)
937     {
938     }
939
940     inline ClassDeclNode::ClassDeclNode(const JSTokenLocation& location, ExpressionNode* classDeclaration)
941         : StatementNode(location)
942         , m_classDeclaration(classDeclaration)
943     {
944     }
945
946     inline ClassExprNode::ClassExprNode(const JSTokenLocation& location, const Identifier& name, const SourceCode& classSource, VariableEnvironment& classEnvironment, ExpressionNode* constructorExpression, ExpressionNode* classHeritage, PropertyListNode* instanceMethods, PropertyListNode* staticMethods)
947         : ExpressionNode(location)
948         , VariableEnvironmentNode(classEnvironment)
949         , m_classSource(classSource)
950         , m_name(name)
951         , m_ecmaName(&name)
952         , m_constructorExpression(constructorExpression)
953         , m_classHeritage(classHeritage)
954         , m_instanceMethods(instanceMethods)
955         , m_staticMethods(staticMethods)
956     {
957     }
958
959     inline CaseClauseNode::CaseClauseNode(ExpressionNode* expr, SourceElements* statements)
960         : m_expr(expr)
961         , m_statements(statements)
962     {
963     }
964
965     inline ClauseListNode::ClauseListNode(CaseClauseNode* clause)
966         : m_clause(clause)
967         , m_next(0)
968     {
969     }
970
971     inline ClauseListNode::ClauseListNode(ClauseListNode* clauseList, CaseClauseNode* clause)
972         : m_clause(clause)
973         , m_next(0)
974     {
975         clauseList->m_next = this;
976     }
977
978     inline CaseBlockNode::CaseBlockNode(ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2)
979         : m_list1(list1)
980         , m_defaultClause(defaultClause)
981         , m_list2(list2)
982     {
983     }
984
985     inline SwitchNode::SwitchNode(const JSTokenLocation& location, ExpressionNode* expr, CaseBlockNode* block, VariableEnvironment& lexicalVariables, FunctionStack&& functionStack)
986         : StatementNode(location)
987         , VariableEnvironmentNode(lexicalVariables, WTFMove(functionStack))
988         , m_expr(expr)
989         , m_block(block)
990     {
991     }
992
993     inline BlockNode::BlockNode(const JSTokenLocation& location, SourceElements* statements, VariableEnvironment& lexicalVariables, FunctionStack&& functionStack)
994         : StatementNode(location)
995         , VariableEnvironmentNode(lexicalVariables, WTFMove(functionStack))
996         , m_statements(statements)
997     {
998     }
999
1000     inline EnumerationNode::EnumerationNode(const JSTokenLocation& location, ExpressionNode* lexpr, ExpressionNode* expr, StatementNode* statement, VariableEnvironment& lexicalVariables)
1001         : StatementNode(location)
1002         , VariableEnvironmentNode(lexicalVariables)
1003         , m_lexpr(lexpr)
1004         , m_expr(expr)
1005         , m_statement(statement)
1006     {
1007         ASSERT(lexpr);
1008     }
1009     
1010     inline ForInNode::ForInNode(const JSTokenLocation& location, ExpressionNode* lexpr, ExpressionNode* expr, StatementNode* statement, VariableEnvironment& lexicalVariables)
1011         : EnumerationNode(location, lexpr, expr, statement, lexicalVariables)
1012     {
1013     }
1014     
1015     inline ForOfNode::ForOfNode(const JSTokenLocation& location, ExpressionNode* lexpr, ExpressionNode* expr, StatementNode* statement, VariableEnvironment& lexicalVariables)
1016         : EnumerationNode(location, lexpr, expr, statement, lexicalVariables)
1017     {
1018     }
1019     
1020     inline DestructuringPatternNode::DestructuringPatternNode()
1021     {
1022     }
1023
1024     inline ArrayPatternNode::ArrayPatternNode()
1025         : DestructuringPatternNode()
1026     {
1027     }
1028     
1029     inline ObjectPatternNode::ObjectPatternNode()
1030         : DestructuringPatternNode()
1031     {
1032     }
1033     
1034     inline BindingNode::BindingNode(const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end, AssignmentContext context)
1035         : DestructuringPatternNode()
1036         , m_divotStart(start)
1037         , m_divotEnd(end)
1038         , m_boundProperty(boundProperty)
1039         , m_bindingContext(context)
1040     {
1041     }
1042
1043     inline AssignmentElementNode::AssignmentElementNode(ExpressionNode* assignmentTarget, const JSTextPosition& start, const JSTextPosition& end)
1044         : DestructuringPatternNode()
1045         , m_divotStart(start)
1046         , m_divotEnd(end)
1047         , m_assignmentTarget(assignmentTarget)
1048     {
1049     }
1050
1051     inline RestParameterNode::RestParameterNode(const Identifier& name, unsigned numParametersToSkip, const JSTextPosition& start, const JSTextPosition& end)
1052         : DestructuringPatternNode()
1053         , m_name(name)
1054         , m_numParametersToSkip(numParametersToSkip)
1055         , m_divotStart(start)
1056         , m_divotEnd(end)
1057     {
1058     }
1059
1060     inline DestructuringAssignmentNode::DestructuringAssignmentNode(const JSTokenLocation& location, DestructuringPatternNode* bindings, ExpressionNode* initializer)
1061         : ExpressionNode(location)
1062         , m_bindings(bindings)
1063         , m_initializer(initializer)
1064     {
1065     }
1066     
1067 } // namespace JSC
1068
1069 #endif // NodeConstructors_h