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