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