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