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