1 /*
2  *  Copyright (C) 2009 Apple Inc. All rights reserved.
3  *
4  *  This library is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU Library General Public
6  *  License as published by the Free Software Foundation; either
7  *  version 2 of the License, or (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Library General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Library General Public License
15  *  along with this library; see the file COPYING.LIB.  If not, write to
16  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  *  Boston, MA 02110-1301, USA.
18  *
19  */
20 
21 #ifndef NodeConstructors_h
22 #define NodeConstructors_h
23 
24 #include "Nodes.h"
25 #include "Lexer.h"
26 #include "Parser.h"
27 
28 namespace JSC {
29 
ParserArenaRefCounted(JSGlobalData * globalData)30     inline ParserArenaRefCounted::ParserArenaRefCounted(JSGlobalData* globalData)
31     {
32         globalData->parser->arena().derefWithArena(adoptRef(this));
33     }
34 
Node(JSGlobalData * globalData)35     inline Node::Node(JSGlobalData* globalData)
36         : m_line(globalData->lexer->lineNumber())
37     {
38     }
39 
ExpressionNode(JSGlobalData * globalData,ResultType resultType)40     inline ExpressionNode::ExpressionNode(JSGlobalData* globalData, ResultType resultType)
41         : Node(globalData)
42         , m_resultType(resultType)
43     {
44     }
45 
StatementNode(JSGlobalData * globalData)46     inline StatementNode::StatementNode(JSGlobalData* globalData)
47         : Node(globalData)
48         , m_lastLine(-1)
49     {
50     }
51 
NullNode(JSGlobalData * globalData)52     inline NullNode::NullNode(JSGlobalData* globalData)
53         : ExpressionNode(globalData, ResultType::nullType())
54     {
55     }
56 
BooleanNode(JSGlobalData * globalData,bool value)57     inline BooleanNode::BooleanNode(JSGlobalData* globalData, bool value)
58         : ExpressionNode(globalData, ResultType::booleanType())
59         , m_value(value)
60     {
61     }
62 
NumberNode(JSGlobalData * globalData,double value)63     inline NumberNode::NumberNode(JSGlobalData* globalData, double value)
64         : ExpressionNode(globalData, ResultType::numberType())
65         , m_value(value)
66     {
67     }
68 
StringNode(JSGlobalData * globalData,const Identifier & value)69     inline StringNode::StringNode(JSGlobalData* globalData, const Identifier& value)
70         : ExpressionNode(globalData, ResultType::stringType())
71         , m_value(value)
72     {
73     }
74 
RegExpNode(JSGlobalData * globalData,const Identifier & pattern,const Identifier & flags)75     inline RegExpNode::RegExpNode(JSGlobalData* globalData, const Identifier& pattern, const Identifier& flags)
76         : ExpressionNode(globalData)
77         , m_pattern(pattern)
78         , m_flags(flags)
79     {
80     }
81 
ThisNode(JSGlobalData * globalData)82     inline ThisNode::ThisNode(JSGlobalData* globalData)
83         : ExpressionNode(globalData)
84     {
85     }
86 
ResolveNode(JSGlobalData * globalData,const Identifier & ident,int startOffset)87     inline ResolveNode::ResolveNode(JSGlobalData* globalData, const Identifier& ident, int startOffset)
88         : ExpressionNode(globalData)
89         , m_ident(ident)
90         , m_startOffset(startOffset)
91     {
92     }
93 
ElementNode(JSGlobalData *,int elision,ExpressionNode * node)94     inline ElementNode::ElementNode(JSGlobalData*, int elision, ExpressionNode* node)
95         : m_next(0)
96         , m_elision(elision)
97         , m_node(node)
98     {
99     }
100 
ElementNode(JSGlobalData *,ElementNode * l,int elision,ExpressionNode * node)101     inline ElementNode::ElementNode(JSGlobalData*, ElementNode* l, int elision, ExpressionNode* node)
102         : m_next(0)
103         , m_elision(elision)
104         , m_node(node)
105     {
106         l->m_next = this;
107     }
108 
ArrayNode(JSGlobalData * globalData,int elision)109     inline ArrayNode::ArrayNode(JSGlobalData* globalData, int elision)
110         : ExpressionNode(globalData)
111         , m_element(0)
112         , m_elision(elision)
113         , m_optional(true)
114     {
115     }
116 
ArrayNode(JSGlobalData * globalData,ElementNode * element)117     inline ArrayNode::ArrayNode(JSGlobalData* globalData, ElementNode* element)
118         : ExpressionNode(globalData)
119         , m_element(element)
120         , m_elision(0)
121         , m_optional(false)
122     {
123     }
124 
ArrayNode(JSGlobalData * globalData,int elision,ElementNode * element)125     inline ArrayNode::ArrayNode(JSGlobalData* globalData, int elision, ElementNode* element)
126         : ExpressionNode(globalData)
127         , m_element(element)
128         , m_elision(elision)
129         , m_optional(true)
130     {
131     }
132 
PropertyNode(JSGlobalData *,const Identifier & name,ExpressionNode * assign,Type type)133     inline PropertyNode::PropertyNode(JSGlobalData*, const Identifier& name, ExpressionNode* assign, Type type)
134         : m_name(name)
135         , m_assign(assign)
136         , m_type(type)
137     {
138     }
139 
PropertyNode(JSGlobalData * globalData,double name,ExpressionNode * assign,Type type)140     inline PropertyNode::PropertyNode(JSGlobalData* globalData, double name, ExpressionNode* assign, Type type)
141         : m_name(globalData->parser->arena().identifierArena().makeNumericIdentifier(globalData, name))
142         , m_assign(assign)
143         , m_type(type)
144     {
145     }
146 
PropertyListNode(JSGlobalData * globalData,PropertyNode * node)147     inline PropertyListNode::PropertyListNode(JSGlobalData* globalData, PropertyNode* node)
148         : Node(globalData)
149         , m_node(node)
150         , m_next(0)
151     {
152     }
153 
PropertyListNode(JSGlobalData * globalData,PropertyNode * node,PropertyListNode * list)154     inline PropertyListNode::PropertyListNode(JSGlobalData* globalData, PropertyNode* node, PropertyListNode* list)
155         : Node(globalData)
156         , m_node(node)
157         , m_next(0)
158     {
159         list->m_next = this;
160     }
161 
ObjectLiteralNode(JSGlobalData * globalData)162     inline ObjectLiteralNode::ObjectLiteralNode(JSGlobalData* globalData)
163         : ExpressionNode(globalData)
164         , m_list(0)
165     {
166     }
167 
ObjectLiteralNode(JSGlobalData * globalData,PropertyListNode * list)168     inline ObjectLiteralNode::ObjectLiteralNode(JSGlobalData* globalData, PropertyListNode* list)
169         : ExpressionNode(globalData)
170         , m_list(list)
171     {
172     }
173 
BracketAccessorNode(JSGlobalData * globalData,ExpressionNode * base,ExpressionNode * subscript,bool subscriptHasAssignments)174     inline BracketAccessorNode::BracketAccessorNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments)
175         : ExpressionNode(globalData)
176         , m_base(base)
177         , m_subscript(subscript)
178         , m_subscriptHasAssignments(subscriptHasAssignments)
179     {
180     }
181 
DotAccessorNode(JSGlobalData * globalData,ExpressionNode * base,const Identifier & ident)182     inline DotAccessorNode::DotAccessorNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident)
183         : ExpressionNode(globalData)
184         , m_base(base)
185         , m_ident(ident)
186     {
187     }
188 
ArgumentListNode(JSGlobalData * globalData,ExpressionNode * expr)189     inline ArgumentListNode::ArgumentListNode(JSGlobalData* globalData, ExpressionNode* expr)
190         : Node(globalData)
191         , m_next(0)
192         , m_expr(expr)
193     {
194     }
195 
ArgumentListNode(JSGlobalData * globalData,ArgumentListNode * listNode,ExpressionNode * expr)196     inline ArgumentListNode::ArgumentListNode(JSGlobalData* globalData, ArgumentListNode* listNode, ExpressionNode* expr)
197         : Node(globalData)
198         , m_next(0)
199         , m_expr(expr)
200     {
201         listNode->m_next = this;
202     }
203 
ArgumentsNode(JSGlobalData *)204     inline ArgumentsNode::ArgumentsNode(JSGlobalData*)
205         : m_listNode(0)
206     {
207     }
208 
ArgumentsNode(JSGlobalData *,ArgumentListNode * listNode)209     inline ArgumentsNode::ArgumentsNode(JSGlobalData*, ArgumentListNode* listNode)
210         : m_listNode(listNode)
211     {
212     }
213 
NewExprNode(JSGlobalData * globalData,ExpressionNode * expr)214     inline NewExprNode::NewExprNode(JSGlobalData* globalData, ExpressionNode* expr)
215         : ExpressionNode(globalData)
216         , m_expr(expr)
217         , m_args(0)
218     {
219     }
220 
NewExprNode(JSGlobalData * globalData,ExpressionNode * expr,ArgumentsNode * args)221     inline NewExprNode::NewExprNode(JSGlobalData* globalData, ExpressionNode* expr, ArgumentsNode* args)
222         : ExpressionNode(globalData)
223         , m_expr(expr)
224         , m_args(args)
225     {
226     }
227 
EvalFunctionCallNode(JSGlobalData * globalData,ArgumentsNode * args,unsigned divot,unsigned startOffset,unsigned endOffset)228     inline EvalFunctionCallNode::EvalFunctionCallNode(JSGlobalData* globalData, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
229         : ExpressionNode(globalData)
230         , ThrowableExpressionData(divot, startOffset, endOffset)
231         , m_args(args)
232     {
233     }
234 
FunctionCallValueNode(JSGlobalData * globalData,ExpressionNode * expr,ArgumentsNode * args,unsigned divot,unsigned startOffset,unsigned endOffset)235     inline FunctionCallValueNode::FunctionCallValueNode(JSGlobalData* globalData, ExpressionNode* expr, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
236         : ExpressionNode(globalData)
237         , ThrowableExpressionData(divot, startOffset, endOffset)
238         , m_expr(expr)
239         , m_args(args)
240     {
241     }
242 
FunctionCallResolveNode(JSGlobalData * globalData,const Identifier & ident,ArgumentsNode * args,unsigned divot,unsigned startOffset,unsigned endOffset)243     inline FunctionCallResolveNode::FunctionCallResolveNode(JSGlobalData* globalData, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
244         : ExpressionNode(globalData)
245         , ThrowableExpressionData(divot, startOffset, endOffset)
246         , m_ident(ident)
247         , m_args(args)
248     {
249     }
250 
FunctionCallBracketNode(JSGlobalData * globalData,ExpressionNode * base,ExpressionNode * subscript,ArgumentsNode * args,unsigned divot,unsigned startOffset,unsigned endOffset)251     inline FunctionCallBracketNode::FunctionCallBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
252         : ExpressionNode(globalData)
253         , ThrowableSubExpressionData(divot, startOffset, endOffset)
254         , m_base(base)
255         , m_subscript(subscript)
256         , m_args(args)
257     {
258     }
259 
FunctionCallDotNode(JSGlobalData * globalData,ExpressionNode * base,const Identifier & ident,ArgumentsNode * args,unsigned divot,unsigned startOffset,unsigned endOffset)260     inline FunctionCallDotNode::FunctionCallDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
261         : ExpressionNode(globalData)
262         , ThrowableSubExpressionData(divot, startOffset, endOffset)
263         , m_base(base)
264         , m_ident(ident)
265         , m_args(args)
266     {
267     }
268 
CallFunctionCallDotNode(JSGlobalData * globalData,ExpressionNode * base,const Identifier & ident,ArgumentsNode * args,unsigned divot,unsigned startOffset,unsigned endOffset)269     inline CallFunctionCallDotNode::CallFunctionCallDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
270         : FunctionCallDotNode(globalData, base, ident, args, divot, startOffset, endOffset)
271     {
272     }
273 
ApplyFunctionCallDotNode(JSGlobalData * globalData,ExpressionNode * base,const Identifier & ident,ArgumentsNode * args,unsigned divot,unsigned startOffset,unsigned endOffset)274     inline ApplyFunctionCallDotNode::ApplyFunctionCallDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
275         : FunctionCallDotNode(globalData, base, ident, args, divot, startOffset, endOffset)
276     {
277     }
278 
PrePostResolveNode(JSGlobalData * globalData,const Identifier & ident,unsigned divot,unsigned startOffset,unsigned endOffset)279     inline PrePostResolveNode::PrePostResolveNode(JSGlobalData* globalData, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
280         : ExpressionNode(globalData, ResultType::numberType()) // could be reusable for pre?
281         , ThrowableExpressionData(divot, startOffset, endOffset)
282         , m_ident(ident)
283     {
284     }
285 
PostfixResolveNode(JSGlobalData * globalData,const Identifier & ident,Operator oper,unsigned divot,unsigned startOffset,unsigned endOffset)286     inline PostfixResolveNode::PostfixResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
287         : PrePostResolveNode(globalData, ident, divot, startOffset, endOffset)
288         , m_operator(oper)
289     {
290     }
291 
PostfixBracketNode(JSGlobalData * globalData,ExpressionNode * base,ExpressionNode * subscript,Operator oper,unsigned divot,unsigned startOffset,unsigned endOffset)292     inline PostfixBracketNode::PostfixBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
293         : ExpressionNode(globalData)
294         , ThrowableSubExpressionData(divot, startOffset, endOffset)
295         , m_base(base)
296         , m_subscript(subscript)
297         , m_operator(oper)
298     {
299     }
300 
PostfixDotNode(JSGlobalData * globalData,ExpressionNode * base,const Identifier & ident,Operator oper,unsigned divot,unsigned startOffset,unsigned endOffset)301     inline PostfixDotNode::PostfixDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
302         : ExpressionNode(globalData)
303         , ThrowableSubExpressionData(divot, startOffset, endOffset)
304         , m_base(base)
305         , m_ident(ident)
306         , m_operator(oper)
307     {
308     }
309 
PostfixErrorNode(JSGlobalData * globalData,ExpressionNode * expr,Operator oper,unsigned divot,unsigned startOffset,unsigned endOffset)310     inline PostfixErrorNode::PostfixErrorNode(JSGlobalData* globalData, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
311         : ExpressionNode(globalData)
312         , ThrowableSubExpressionData(divot, startOffset, endOffset)
313         , m_expr(expr)
314         , m_operator(oper)
315     {
316     }
317 
DeleteResolveNode(JSGlobalData * globalData,const Identifier & ident,unsigned divot,unsigned startOffset,unsigned endOffset)318     inline DeleteResolveNode::DeleteResolveNode(JSGlobalData* globalData, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
319         : ExpressionNode(globalData)
320         , ThrowableExpressionData(divot, startOffset, endOffset)
321         , m_ident(ident)
322     {
323     }
324 
DeleteBracketNode(JSGlobalData * globalData,ExpressionNode * base,ExpressionNode * subscript,unsigned divot,unsigned startOffset,unsigned endOffset)325     inline DeleteBracketNode::DeleteBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, unsigned divot, unsigned startOffset, unsigned endOffset)
326         : ExpressionNode(globalData)
327         , ThrowableExpressionData(divot, startOffset, endOffset)
328         , m_base(base)
329         , m_subscript(subscript)
330     {
331     }
332 
DeleteDotNode(JSGlobalData * globalData,ExpressionNode * base,const Identifier & ident,unsigned divot,unsigned startOffset,unsigned endOffset)333     inline DeleteDotNode::DeleteDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
334         : ExpressionNode(globalData)
335         , ThrowableExpressionData(divot, startOffset, endOffset)
336         , m_base(base)
337         , m_ident(ident)
338     {
339     }
340 
DeleteValueNode(JSGlobalData * globalData,ExpressionNode * expr)341     inline DeleteValueNode::DeleteValueNode(JSGlobalData* globalData, ExpressionNode* expr)
342         : ExpressionNode(globalData)
343         , m_expr(expr)
344     {
345     }
346 
VoidNode(JSGlobalData * globalData,ExpressionNode * expr)347     inline VoidNode::VoidNode(JSGlobalData* globalData, ExpressionNode* expr)
348         : ExpressionNode(globalData)
349         , m_expr(expr)
350     {
351     }
352 
TypeOfResolveNode(JSGlobalData * globalData,const Identifier & ident)353     inline TypeOfResolveNode::TypeOfResolveNode(JSGlobalData* globalData, const Identifier& ident)
354         : ExpressionNode(globalData, ResultType::stringType())
355         , m_ident(ident)
356     {
357     }
358 
TypeOfValueNode(JSGlobalData * globalData,ExpressionNode * expr)359     inline TypeOfValueNode::TypeOfValueNode(JSGlobalData* globalData, ExpressionNode* expr)
360         : ExpressionNode(globalData, ResultType::stringType())
361         , m_expr(expr)
362     {
363     }
364 
PrefixResolveNode(JSGlobalData * globalData,const Identifier & ident,Operator oper,unsigned divot,unsigned startOffset,unsigned endOffset)365     inline PrefixResolveNode::PrefixResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
366         : PrePostResolveNode(globalData, ident, divot, startOffset, endOffset)
367         , m_operator(oper)
368     {
369     }
370 
PrefixBracketNode(JSGlobalData * globalData,ExpressionNode * base,ExpressionNode * subscript,Operator oper,unsigned divot,unsigned startOffset,unsigned endOffset)371     inline PrefixBracketNode::PrefixBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
372         : ExpressionNode(globalData)
373         , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset)
374         , m_base(base)
375         , m_subscript(subscript)
376         , m_operator(oper)
377     {
378     }
379 
PrefixDotNode(JSGlobalData * globalData,ExpressionNode * base,const Identifier & ident,Operator oper,unsigned divot,unsigned startOffset,unsigned endOffset)380     inline PrefixDotNode::PrefixDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
381         : ExpressionNode(globalData)
382         , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset)
383         , m_base(base)
384         , m_ident(ident)
385         , m_operator(oper)
386     {
387     }
388 
PrefixErrorNode(JSGlobalData * globalData,ExpressionNode * expr,Operator oper,unsigned divot,unsigned startOffset,unsigned endOffset)389     inline PrefixErrorNode::PrefixErrorNode(JSGlobalData* globalData, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
390         : ExpressionNode(globalData)
391         , ThrowableExpressionData(divot, startOffset, endOffset)
392         , m_expr(expr)
393         , m_operator(oper)
394     {
395     }
396 
UnaryOpNode(JSGlobalData * globalData,ResultType type,ExpressionNode * expr,OpcodeID opcodeID)397     inline UnaryOpNode::UnaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr, OpcodeID opcodeID)
398         : ExpressionNode(globalData, type)
399         , m_expr(expr)
400         , m_opcodeID(opcodeID)
401     {
402     }
403 
UnaryPlusNode(JSGlobalData * globalData,ExpressionNode * expr)404     inline UnaryPlusNode::UnaryPlusNode(JSGlobalData* globalData, ExpressionNode* expr)
405         : UnaryOpNode(globalData, ResultType::numberType(), expr, op_to_jsnumber)
406     {
407     }
408 
NegateNode(JSGlobalData * globalData,ExpressionNode * expr)409     inline NegateNode::NegateNode(JSGlobalData* globalData, ExpressionNode* expr)
410         : UnaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr, op_negate)
411     {
412     }
413 
BitwiseNotNode(JSGlobalData * globalData,ExpressionNode * expr)414     inline BitwiseNotNode::BitwiseNotNode(JSGlobalData* globalData, ExpressionNode* expr)
415         : UnaryOpNode(globalData, ResultType::forBitOp(), expr, op_bitnot)
416     {
417     }
418 
LogicalNotNode(JSGlobalData * globalData,ExpressionNode * expr)419     inline LogicalNotNode::LogicalNotNode(JSGlobalData* globalData, ExpressionNode* expr)
420         : UnaryOpNode(globalData, ResultType::booleanType(), expr, op_not)
421     {
422     }
423 
BinaryOpNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,OpcodeID opcodeID,bool rightHasAssignments)424     inline BinaryOpNode::BinaryOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
425         : ExpressionNode(globalData)
426         , m_expr1(expr1)
427         , m_expr2(expr2)
428         , m_opcodeID(opcodeID)
429         , m_rightHasAssignments(rightHasAssignments)
430     {
431     }
432 
BinaryOpNode(JSGlobalData * globalData,ResultType type,ExpressionNode * expr1,ExpressionNode * expr2,OpcodeID opcodeID,bool rightHasAssignments)433     inline BinaryOpNode::BinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
434         : ExpressionNode(globalData, type)
435         , m_expr1(expr1)
436         , m_expr2(expr2)
437         , m_opcodeID(opcodeID)
438         , m_rightHasAssignments(rightHasAssignments)
439     {
440     }
441 
ReverseBinaryOpNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,OpcodeID opcodeID,bool rightHasAssignments)442     inline ReverseBinaryOpNode::ReverseBinaryOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
443         : BinaryOpNode(globalData, expr1, expr2, opcodeID, rightHasAssignments)
444     {
445     }
446 
ReverseBinaryOpNode(JSGlobalData * globalData,ResultType type,ExpressionNode * expr1,ExpressionNode * expr2,OpcodeID opcodeID,bool rightHasAssignments)447     inline ReverseBinaryOpNode::ReverseBinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
448         : BinaryOpNode(globalData, type, expr1, expr2, opcodeID, rightHasAssignments)
449     {
450     }
451 
MultNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)452     inline MultNode::MultNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
453         : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, op_mul, rightHasAssignments)
454     {
455     }
456 
DivNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)457     inline DivNode::DivNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
458         : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, op_div, rightHasAssignments)
459     {
460     }
461 
462 
ModNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)463     inline ModNode::ModNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
464         : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, op_mod, rightHasAssignments)
465     {
466     }
467 
AddNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)468     inline AddNode::AddNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
469         : BinaryOpNode(globalData, ResultType::forAdd(expr1->resultDescriptor(), expr2->resultDescriptor()), expr1, expr2, op_add, rightHasAssignments)
470     {
471     }
472 
SubNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)473     inline SubNode::SubNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
474         : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, op_sub, rightHasAssignments)
475     {
476     }
477 
LeftShiftNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)478     inline LeftShiftNode::LeftShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
479         : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, op_lshift, rightHasAssignments)
480     {
481     }
482 
RightShiftNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)483     inline RightShiftNode::RightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
484         : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, op_rshift, rightHasAssignments)
485     {
486     }
487 
UnsignedRightShiftNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)488     inline UnsignedRightShiftNode::UnsignedRightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
489         : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, op_urshift, rightHasAssignments)
490     {
491     }
492 
LessNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)493     inline LessNode::LessNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
494         : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_less, rightHasAssignments)
495     {
496     }
497 
GreaterNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)498     inline GreaterNode::GreaterNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
499         : ReverseBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_less, rightHasAssignments)
500     {
501     }
502 
LessEqNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)503     inline LessEqNode::LessEqNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
504         : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_lesseq, rightHasAssignments)
505     {
506     }
507 
GreaterEqNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)508     inline GreaterEqNode::GreaterEqNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
509         : ReverseBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_lesseq, rightHasAssignments)
510     {
511     }
512 
ThrowableBinaryOpNode(JSGlobalData * globalData,ResultType type,ExpressionNode * expr1,ExpressionNode * expr2,OpcodeID opcodeID,bool rightHasAssignments)513     inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
514         : BinaryOpNode(globalData, type, expr1, expr2, opcodeID, rightHasAssignments)
515     {
516     }
517 
ThrowableBinaryOpNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,OpcodeID opcodeID,bool rightHasAssignments)518     inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
519         : BinaryOpNode(globalData, expr1, expr2, opcodeID, rightHasAssignments)
520     {
521     }
522 
InstanceOfNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)523     inline InstanceOfNode::InstanceOfNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
524         : ThrowableBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_instanceof, rightHasAssignments)
525     {
526     }
527 
InNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)528     inline InNode::InNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
529         : ThrowableBinaryOpNode(globalData, expr1, expr2, op_in, rightHasAssignments)
530     {
531     }
532 
EqualNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)533     inline EqualNode::EqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
534         : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_eq, rightHasAssignments)
535     {
536     }
537 
NotEqualNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)538     inline NotEqualNode::NotEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
539         : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_neq, rightHasAssignments)
540     {
541     }
542 
StrictEqualNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)543     inline StrictEqualNode::StrictEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
544         : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_stricteq, rightHasAssignments)
545     {
546     }
547 
NotStrictEqualNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)548     inline NotStrictEqualNode::NotStrictEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
549         : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, op_nstricteq, rightHasAssignments)
550     {
551     }
552 
BitAndNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)553     inline BitAndNode::BitAndNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
554         : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, op_bitand, rightHasAssignments)
555     {
556     }
557 
BitOrNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)558     inline BitOrNode::BitOrNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
559         : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, op_bitor, rightHasAssignments)
560     {
561     }
562 
BitXOrNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)563     inline BitXOrNode::BitXOrNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
564         : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, op_bitxor, rightHasAssignments)
565     {
566     }
567 
LogicalOpNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,LogicalOperator oper)568     inline LogicalOpNode::LogicalOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper)
569         : ExpressionNode(globalData, ResultType::booleanType())
570         , m_expr1(expr1)
571         , m_expr2(expr2)
572         , m_operator(oper)
573     {
574     }
575 
ConditionalNode(JSGlobalData * globalData,ExpressionNode * logical,ExpressionNode * expr1,ExpressionNode * expr2)576     inline ConditionalNode::ConditionalNode(JSGlobalData* globalData, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2)
577         : ExpressionNode(globalData)
578         , m_logical(logical)
579         , m_expr1(expr1)
580         , m_expr2(expr2)
581     {
582     }
583 
ReadModifyResolveNode(JSGlobalData * globalData,const Identifier & ident,Operator oper,ExpressionNode * right,bool rightHasAssignments,unsigned divot,unsigned startOffset,unsigned endOffset)584     inline ReadModifyResolveNode::ReadModifyResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, ExpressionNode*  right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
585         : ExpressionNode(globalData)
586         , ThrowableExpressionData(divot, startOffset, endOffset)
587         , m_ident(ident)
588         , m_right(right)
589         , m_operator(oper)
590         , m_rightHasAssignments(rightHasAssignments)
591     {
592     }
593 
AssignResolveNode(JSGlobalData * globalData,const Identifier & ident,ExpressionNode * right,bool rightHasAssignments)594     inline AssignResolveNode::AssignResolveNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments)
595         : ExpressionNode(globalData)
596         , m_ident(ident)
597         , m_right(right)
598         , m_rightHasAssignments(rightHasAssignments)
599     {
600     }
601 
ReadModifyBracketNode(JSGlobalData * globalData,ExpressionNode * base,ExpressionNode * subscript,Operator oper,ExpressionNode * right,bool subscriptHasAssignments,bool rightHasAssignments,unsigned divot,unsigned startOffset,unsigned endOffset)602     inline ReadModifyBracketNode::ReadModifyBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
603         : ExpressionNode(globalData)
604         , ThrowableSubExpressionData(divot, startOffset, endOffset)
605         , m_base(base)
606         , m_subscript(subscript)
607         , m_right(right)
608         , m_operator(oper)
609         , m_subscriptHasAssignments(subscriptHasAssignments)
610         , m_rightHasAssignments(rightHasAssignments)
611     {
612     }
613 
AssignBracketNode(JSGlobalData * globalData,ExpressionNode * base,ExpressionNode * subscript,ExpressionNode * right,bool subscriptHasAssignments,bool rightHasAssignments,unsigned divot,unsigned startOffset,unsigned endOffset)614     inline AssignBracketNode::AssignBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
615         : ExpressionNode(globalData)
616         , ThrowableExpressionData(divot, startOffset, endOffset)
617         , m_base(base)
618         , m_subscript(subscript)
619         , m_right(right)
620         , m_subscriptHasAssignments(subscriptHasAssignments)
621         , m_rightHasAssignments(rightHasAssignments)
622     {
623     }
624 
AssignDotNode(JSGlobalData * globalData,ExpressionNode * base,const Identifier & ident,ExpressionNode * right,bool rightHasAssignments,unsigned divot,unsigned startOffset,unsigned endOffset)625     inline AssignDotNode::AssignDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
626         : ExpressionNode(globalData)
627         , ThrowableExpressionData(divot, startOffset, endOffset)
628         , m_base(base)
629         , m_ident(ident)
630         , m_right(right)
631         , m_rightHasAssignments(rightHasAssignments)
632     {
633     }
634 
ReadModifyDotNode(JSGlobalData * globalData,ExpressionNode * base,const Identifier & ident,Operator oper,ExpressionNode * right,bool rightHasAssignments,unsigned divot,unsigned startOffset,unsigned endOffset)635     inline ReadModifyDotNode::ReadModifyDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
636         : ExpressionNode(globalData)
637         , ThrowableSubExpressionData(divot, startOffset, endOffset)
638         , m_base(base)
639         , m_ident(ident)
640         , m_right(right)
641         , m_operator(oper)
642         , m_rightHasAssignments(rightHasAssignments)
643     {
644     }
645 
AssignErrorNode(JSGlobalData * globalData,ExpressionNode * left,Operator oper,ExpressionNode * right,unsigned divot,unsigned startOffset,unsigned endOffset)646     inline AssignErrorNode::AssignErrorNode(JSGlobalData* globalData, ExpressionNode* left, Operator oper, ExpressionNode* right, unsigned divot, unsigned startOffset, unsigned endOffset)
647         : ExpressionNode(globalData)
648         , ThrowableExpressionData(divot, startOffset, endOffset)
649         , m_left(left)
650         , m_operator(oper)
651         , m_right(right)
652     {
653     }
654 
CommaNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2)655     inline CommaNode::CommaNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2)
656         : ExpressionNode(globalData)
657     {
658         m_expressions.append(expr1);
659         m_expressions.append(expr2);
660     }
661 
ConstStatementNode(JSGlobalData * globalData,ConstDeclNode * next)662     inline ConstStatementNode::ConstStatementNode(JSGlobalData* globalData, ConstDeclNode* next)
663         : StatementNode(globalData)
664         , m_next(next)
665     {
666     }
667 
SourceElements(JSGlobalData *)668     inline SourceElements::SourceElements(JSGlobalData*)
669     {
670     }
671 
EmptyStatementNode(JSGlobalData * globalData)672     inline EmptyStatementNode::EmptyStatementNode(JSGlobalData* globalData)
673         : StatementNode(globalData)
674     {
675     }
676 
DebuggerStatementNode(JSGlobalData * globalData)677     inline DebuggerStatementNode::DebuggerStatementNode(JSGlobalData* globalData)
678         : StatementNode(globalData)
679     {
680     }
681 
ExprStatementNode(JSGlobalData * globalData,ExpressionNode * expr)682     inline ExprStatementNode::ExprStatementNode(JSGlobalData* globalData, ExpressionNode* expr)
683         : StatementNode(globalData)
684         , m_expr(expr)
685     {
686     }
687 
VarStatementNode(JSGlobalData * globalData,ExpressionNode * expr)688     inline VarStatementNode::VarStatementNode(JSGlobalData* globalData, ExpressionNode* expr)
689         : StatementNode(globalData)
690         , m_expr(expr)
691     {
692     }
693 
IfNode(JSGlobalData * globalData,ExpressionNode * condition,StatementNode * ifBlock)694     inline IfNode::IfNode(JSGlobalData* globalData, ExpressionNode* condition, StatementNode* ifBlock)
695         : StatementNode(globalData)
696         , m_condition(condition)
697         , m_ifBlock(ifBlock)
698     {
699     }
700 
IfElseNode(JSGlobalData * globalData,ExpressionNode * condition,StatementNode * ifBlock,StatementNode * elseBlock)701     inline IfElseNode::IfElseNode(JSGlobalData* globalData, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock)
702         : IfNode(globalData, condition, ifBlock)
703         , m_elseBlock(elseBlock)
704     {
705     }
706 
DoWhileNode(JSGlobalData * globalData,StatementNode * statement,ExpressionNode * expr)707     inline DoWhileNode::DoWhileNode(JSGlobalData* globalData, StatementNode* statement, ExpressionNode* expr)
708         : StatementNode(globalData)
709         , m_statement(statement)
710         , m_expr(expr)
711     {
712     }
713 
WhileNode(JSGlobalData * globalData,ExpressionNode * expr,StatementNode * statement)714     inline WhileNode::WhileNode(JSGlobalData* globalData, ExpressionNode* expr, StatementNode* statement)
715         : StatementNode(globalData)
716         , m_expr(expr)
717         , m_statement(statement)
718     {
719     }
720 
ForNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,ExpressionNode * expr3,StatementNode * statement,bool expr1WasVarDecl)721     inline ForNode::ForNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement, bool expr1WasVarDecl)
722         : StatementNode(globalData)
723         , m_expr1(expr1)
724         , m_expr2(expr2)
725         , m_expr3(expr3)
726         , m_statement(statement)
727         , m_expr1WasVarDecl(expr1 && expr1WasVarDecl)
728     {
729         ASSERT(statement);
730     }
731 
ContinueNode(JSGlobalData * globalData)732     inline ContinueNode::ContinueNode(JSGlobalData* globalData)
733         : StatementNode(globalData)
734         , m_ident(globalData->propertyNames->nullIdentifier)
735     {
736     }
737 
ContinueNode(JSGlobalData * globalData,const Identifier & ident)738     inline ContinueNode::ContinueNode(JSGlobalData* globalData, const Identifier& ident)
739         : StatementNode(globalData)
740         , m_ident(ident)
741     {
742     }
743 
BreakNode(JSGlobalData * globalData)744     inline BreakNode::BreakNode(JSGlobalData* globalData)
745         : StatementNode(globalData)
746         , m_ident(globalData->propertyNames->nullIdentifier)
747     {
748     }
749 
BreakNode(JSGlobalData * globalData,const Identifier & ident)750     inline BreakNode::BreakNode(JSGlobalData* globalData, const Identifier& ident)
751         : StatementNode(globalData)
752         , m_ident(ident)
753     {
754     }
755 
ReturnNode(JSGlobalData * globalData,ExpressionNode * value)756     inline ReturnNode::ReturnNode(JSGlobalData* globalData, ExpressionNode* value)
757         : StatementNode(globalData)
758         , m_value(value)
759     {
760     }
761 
WithNode(JSGlobalData * globalData,ExpressionNode * expr,StatementNode * statement,uint32_t divot,uint32_t expressionLength)762     inline WithNode::WithNode(JSGlobalData* globalData, ExpressionNode* expr, StatementNode* statement, uint32_t divot, uint32_t expressionLength)
763         : StatementNode(globalData)
764         , m_expr(expr)
765         , m_statement(statement)
766         , m_divot(divot)
767         , m_expressionLength(expressionLength)
768     {
769     }
770 
LabelNode(JSGlobalData * globalData,const Identifier & name,StatementNode * statement)771     inline LabelNode::LabelNode(JSGlobalData* globalData, const Identifier& name, StatementNode* statement)
772         : StatementNode(globalData)
773         , m_name(name)
774         , m_statement(statement)
775     {
776     }
777 
ThrowNode(JSGlobalData * globalData,ExpressionNode * expr)778     inline ThrowNode::ThrowNode(JSGlobalData* globalData, ExpressionNode* expr)
779         : StatementNode(globalData)
780         , m_expr(expr)
781     {
782     }
783 
TryNode(JSGlobalData * globalData,StatementNode * tryBlock,const Identifier & exceptionIdent,bool catchHasEval,StatementNode * catchBlock,StatementNode * finallyBlock)784     inline TryNode::TryNode(JSGlobalData* globalData, StatementNode* tryBlock, const Identifier& exceptionIdent, bool catchHasEval, StatementNode* catchBlock, StatementNode* finallyBlock)
785         : StatementNode(globalData)
786         , m_tryBlock(tryBlock)
787         , m_exceptionIdent(exceptionIdent)
788         , m_catchBlock(catchBlock)
789         , m_finallyBlock(finallyBlock)
790         , m_catchHasEval(catchHasEval)
791     {
792     }
793 
ParameterNode(JSGlobalData *,const Identifier & ident)794     inline ParameterNode::ParameterNode(JSGlobalData*, const Identifier& ident)
795         : m_ident(ident)
796         , m_next(0)
797     {
798     }
799 
ParameterNode(JSGlobalData *,ParameterNode * l,const Identifier & ident)800     inline ParameterNode::ParameterNode(JSGlobalData*, ParameterNode* l, const Identifier& ident)
801         : m_ident(ident)
802         , m_next(0)
803     {
804         l->m_next = this;
805     }
806 
FuncExprNode(JSGlobalData * globalData,const Identifier & ident,FunctionBodyNode * body,const SourceCode & source,ParameterNode * parameter)807     inline FuncExprNode::FuncExprNode(JSGlobalData* globalData, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
808         : ExpressionNode(globalData)
809         , m_body(body)
810     {
811         m_body->finishParsing(source, parameter, ident);
812     }
813 
FuncDeclNode(JSGlobalData * globalData,const Identifier & ident,FunctionBodyNode * body,const SourceCode & source,ParameterNode * parameter)814     inline FuncDeclNode::FuncDeclNode(JSGlobalData* globalData, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
815         : StatementNode(globalData)
816         , m_body(body)
817     {
818         m_body->finishParsing(source, parameter, ident);
819     }
820 
CaseClauseNode(JSGlobalData *,ExpressionNode * expr,SourceElements * statements)821     inline CaseClauseNode::CaseClauseNode(JSGlobalData*, ExpressionNode* expr, SourceElements* statements)
822         : m_expr(expr)
823         , m_statements(statements)
824     {
825     }
826 
ClauseListNode(JSGlobalData *,CaseClauseNode * clause)827     inline ClauseListNode::ClauseListNode(JSGlobalData*, CaseClauseNode* clause)
828         : m_clause(clause)
829         , m_next(0)
830     {
831     }
832 
ClauseListNode(JSGlobalData *,ClauseListNode * clauseList,CaseClauseNode * clause)833     inline ClauseListNode::ClauseListNode(JSGlobalData*, ClauseListNode* clauseList, CaseClauseNode* clause)
834         : m_clause(clause)
835         , m_next(0)
836     {
837         clauseList->m_next = this;
838     }
839 
CaseBlockNode(JSGlobalData *,ClauseListNode * list1,CaseClauseNode * defaultClause,ClauseListNode * list2)840     inline CaseBlockNode::CaseBlockNode(JSGlobalData*, ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2)
841         : m_list1(list1)
842         , m_defaultClause(defaultClause)
843         , m_list2(list2)
844     {
845     }
846 
SwitchNode(JSGlobalData * globalData,ExpressionNode * expr,CaseBlockNode * block)847     inline SwitchNode::SwitchNode(JSGlobalData* globalData, ExpressionNode* expr, CaseBlockNode* block)
848         : StatementNode(globalData)
849         , m_expr(expr)
850         , m_block(block)
851     {
852     }
853 
ConstDeclNode(JSGlobalData * globalData,const Identifier & ident,ExpressionNode * init)854     inline ConstDeclNode::ConstDeclNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* init)
855         : ExpressionNode(globalData)
856         , m_ident(ident)
857         , m_next(0)
858         , m_init(init)
859     {
860     }
861 
BlockNode(JSGlobalData * globalData,SourceElements * statements)862     inline BlockNode::BlockNode(JSGlobalData* globalData, SourceElements* statements)
863         : StatementNode(globalData)
864         , m_statements(statements)
865     {
866     }
867 
ForInNode(JSGlobalData * globalData,ExpressionNode * l,ExpressionNode * expr,StatementNode * statement)868     inline ForInNode::ForInNode(JSGlobalData* globalData, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement)
869         : StatementNode(globalData)
870         , m_ident(globalData->propertyNames->nullIdentifier)
871         , m_init(0)
872         , m_lexpr(l)
873         , m_expr(expr)
874         , m_statement(statement)
875         , m_identIsVarDecl(false)
876     {
877     }
878 
ForInNode(JSGlobalData * globalData,const Identifier & ident,ExpressionNode * in,ExpressionNode * expr,StatementNode * statement,int divot,int startOffset,int endOffset)879     inline ForInNode::ForInNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* in, ExpressionNode* expr, StatementNode* statement, int divot, int startOffset, int endOffset)
880         : StatementNode(globalData)
881         , m_ident(ident)
882         , m_init(0)
883         , m_lexpr(new (globalData) ResolveNode(globalData, ident, divot - startOffset))
884         , m_expr(expr)
885         , m_statement(statement)
886         , m_identIsVarDecl(true)
887     {
888         if (in) {
889             AssignResolveNode* node = new (globalData) AssignResolveNode(globalData, ident, in, true);
890             node->setExceptionSourceCode(divot, divot - startOffset, endOffset - divot);
891             m_init = node;
892         }
893         // for( var foo = bar in baz )
894     }
895 
896 } // namespace JSC
897 
898 #endif // NodeConstructors_h
899