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