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