Source/JavaScriptCore: Implement ES6 spread operator
[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     
207     inline SpreadExpressionNode::SpreadExpressionNode(const JSTokenLocation& location, ExpressionNode* expression)
208         : ExpressionNode(location)
209         , m_expression(expression)
210     {
211     }
212
213     inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ExpressionNode* expr)
214         : ExpressionNode(location)
215         , m_next(0)
216         , m_expr(expr)
217     {
218     }
219
220     inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ArgumentListNode* listNode, ExpressionNode* expr)
221         : ExpressionNode(location)
222         , m_next(0)
223         , m_expr(expr)
224     {
225         listNode->m_next = this;
226     }
227
228     inline ArgumentsNode::ArgumentsNode()
229         : m_listNode(0)
230     {
231     }
232
233     inline ArgumentsNode::ArgumentsNode(ArgumentListNode* listNode)
234         : m_listNode(listNode)
235     {
236     }
237
238     inline NewExprNode::NewExprNode(const JSTokenLocation& location, ExpressionNode* expr)
239         : ExpressionNode(location)
240         , m_expr(expr)
241         , m_args(0)
242     {
243     }
244
245     inline NewExprNode::NewExprNode(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* args)
246         : ExpressionNode(location)
247         , m_expr(expr)
248         , m_args(args)
249     {
250     }
251
252     inline EvalFunctionCallNode::EvalFunctionCallNode(const JSTokenLocation& location, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
253         : ExpressionNode(location)
254         , ThrowableExpressionData(divot, divotStart, divotEnd)
255         , m_args(args)
256     {
257     }
258
259     inline FunctionCallValueNode::FunctionCallValueNode(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
260         : ExpressionNode(location)
261         , ThrowableExpressionData(divot, divotStart, divotEnd)
262         , m_expr(expr)
263         , m_args(args)
264     {
265         ASSERT(divot.offset >= divotStart.offset);
266     }
267
268     inline FunctionCallResolveNode::FunctionCallResolveNode(const JSTokenLocation& location, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
269         : ExpressionNode(location)
270         , ThrowableExpressionData(divot, divotStart, divotEnd)
271         , m_ident(ident)
272         , m_args(args)
273     {
274     }
275
276     inline FunctionCallBracketNode::FunctionCallBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
277         : ExpressionNode(location)
278         , ThrowableSubExpressionData(divot, divotStart, divotEnd)
279         , m_base(base)
280         , m_subscript(subscript)
281         , m_args(args)
282     {
283     }
284
285     inline FunctionCallDotNode::FunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
286         : ExpressionNode(location)
287         , ThrowableSubExpressionData(divot, divotStart, divotEnd)
288         , m_base(base)
289         , m_ident(ident)
290         , m_args(args)
291     {
292     }
293
294     inline CallFunctionCallDotNode::CallFunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
295         : FunctionCallDotNode(location, base, ident, args, divot, divotStart, divotEnd)
296     {
297     }
298
299     inline ApplyFunctionCallDotNode::ApplyFunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
300         : FunctionCallDotNode(location, base, ident, args, divot, divotStart, divotEnd)
301     {
302     }
303
304     inline PostfixNode::PostfixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator oper, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
305         : PrefixNode(location, expr, oper, divot, divotStart, divotEnd)
306     {
307     }
308
309     inline DeleteResolveNode::DeleteResolveNode(const JSTokenLocation& location, const Identifier& ident, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
310         : ExpressionNode(location)
311         , ThrowableExpressionData(divot, divotStart, divotEnd)
312         , m_ident(ident)
313     {
314     }
315
316     inline DeleteBracketNode::DeleteBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
317         : ExpressionNode(location)
318         , ThrowableExpressionData(divot, divotStart, divotEnd)
319         , m_base(base)
320         , m_subscript(subscript)
321     {
322     }
323
324     inline DeleteDotNode::DeleteDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
325         : ExpressionNode(location)
326         , ThrowableExpressionData(divot, divotStart, divotEnd)
327         , m_base(base)
328         , m_ident(ident)
329     {
330     }
331
332     inline DeleteValueNode::DeleteValueNode(const JSTokenLocation& location, ExpressionNode* expr)
333         : ExpressionNode(location)
334         , m_expr(expr)
335     {
336     }
337
338     inline VoidNode::VoidNode(const JSTokenLocation& location, ExpressionNode* expr)
339         : ExpressionNode(location)
340         , m_expr(expr)
341     {
342     }
343
344     inline TypeOfResolveNode::TypeOfResolveNode(const JSTokenLocation& location, const Identifier& ident)
345         : ExpressionNode(location, ResultType::stringType())
346         , m_ident(ident)
347     {
348     }
349
350     inline TypeOfValueNode::TypeOfValueNode(const JSTokenLocation& location, ExpressionNode* expr)
351         : ExpressionNode(location, ResultType::stringType())
352         , m_expr(expr)
353     {
354     }
355
356     inline PrefixNode::PrefixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator oper, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
357         : ExpressionNode(location)
358         , ThrowablePrefixedSubExpressionData(divot, divotStart, divotEnd)
359         , m_expr(expr)
360         , m_operator(oper)
361     {
362     }
363
364     inline UnaryOpNode::UnaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr, OpcodeID opcodeID)
365         : ExpressionNode(location, type)
366         , m_expr(expr)
367         , m_opcodeID(opcodeID)
368     {
369     }
370
371     inline UnaryPlusNode::UnaryPlusNode(const JSTokenLocation& location, ExpressionNode* expr)
372         : UnaryOpNode(location, ResultType::numberType(), expr, op_to_number)
373     {
374     }
375
376     inline NegateNode::NegateNode(const JSTokenLocation& location, ExpressionNode* expr)
377         : UnaryOpNode(location, ResultType::numberType(), expr, op_negate)
378     {
379     }
380
381     inline BitwiseNotNode::BitwiseNotNode(const JSTokenLocation& location, ExpressionNode* expr)
382         : ExpressionNode(location, ResultType::forBitOp())
383         , m_expr(expr)
384     {
385     }
386
387     inline LogicalNotNode::LogicalNotNode(const JSTokenLocation& location, ExpressionNode* expr)
388         : UnaryOpNode(location, ResultType::booleanType(), expr, op_not)
389     {
390     }
391
392     inline BinaryOpNode::BinaryOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
393         : ExpressionNode(location)
394         , m_expr1(expr1)
395         , m_expr2(expr2)
396         , m_opcodeID(opcodeID)
397         , m_rightHasAssignments(rightHasAssignments)
398     {
399     }
400
401     inline BinaryOpNode::BinaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
402         : ExpressionNode(location, type)
403         , m_expr1(expr1)
404         , m_expr2(expr2)
405         , m_opcodeID(opcodeID)
406         , m_rightHasAssignments(rightHasAssignments)
407     {
408     }
409
410     inline MultNode::MultNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
411         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mul, rightHasAssignments)
412     {
413     }
414
415     inline DivNode::DivNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
416         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_div, rightHasAssignments)
417     {
418     }
419
420
421     inline ModNode::ModNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
422         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mod, rightHasAssignments)
423     {
424     }
425
426     inline AddNode::AddNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
427         : BinaryOpNode(location, ResultType::forAdd(expr1->resultDescriptor(), expr2->resultDescriptor()), expr1, expr2, op_add, rightHasAssignments)
428     {
429     }
430
431     inline SubNode::SubNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
432         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_sub, rightHasAssignments)
433     {
434     }
435
436     inline LeftShiftNode::LeftShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
437         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_lshift, rightHasAssignments)
438     {
439     }
440
441     inline RightShiftNode::RightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
442         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_rshift, rightHasAssignments)
443     {
444     }
445
446     inline UnsignedRightShiftNode::UnsignedRightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
447         : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_urshift, rightHasAssignments)
448     {
449     }
450
451     inline LessNode::LessNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
452         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_less, rightHasAssignments)
453     {
454     }
455
456     inline GreaterNode::GreaterNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
457         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_greater, rightHasAssignments)
458     {
459     }
460
461     inline LessEqNode::LessEqNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
462         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_lesseq, rightHasAssignments)
463     {
464     }
465
466     inline GreaterEqNode::GreaterEqNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
467         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_greatereq, rightHasAssignments)
468     {
469     }
470
471     inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
472         : BinaryOpNode(location, type, expr1, expr2, opcodeID, rightHasAssignments)
473     {
474     }
475
476     inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
477         : BinaryOpNode(location, expr1, expr2, opcodeID, rightHasAssignments)
478     {
479     }
480
481     inline InstanceOfNode::InstanceOfNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
482         : ThrowableBinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_instanceof, rightHasAssignments)
483     {
484     }
485
486     inline InNode::InNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
487         : ThrowableBinaryOpNode(location, expr1, expr2, op_in, rightHasAssignments)
488     {
489     }
490
491     inline EqualNode::EqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
492         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_eq, rightHasAssignments)
493     {
494     }
495
496     inline NotEqualNode::NotEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
497         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_neq, rightHasAssignments)
498     {
499     }
500
501     inline StrictEqualNode::StrictEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
502         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_stricteq, rightHasAssignments)
503     {
504     }
505
506     inline NotStrictEqualNode::NotStrictEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
507         : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_nstricteq, rightHasAssignments)
508     {
509     }
510
511     inline BitAndNode::BitAndNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
512         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitand, rightHasAssignments)
513     {
514     }
515
516     inline BitOrNode::BitOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
517         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitor, rightHasAssignments)
518     {
519     }
520
521     inline BitXOrNode::BitXOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
522         : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitxor, rightHasAssignments)
523     {
524     }
525
526     inline LogicalOpNode::LogicalOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper)
527         : ExpressionNode(location, ResultType::booleanType())
528         , m_expr1(expr1)
529         , m_expr2(expr2)
530         , m_operator(oper)
531     {
532     }
533
534     inline ConditionalNode::ConditionalNode(const JSTokenLocation& location, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2)
535         : ExpressionNode(location)
536         , m_logical(logical)
537         , m_expr1(expr1)
538         , m_expr2(expr2)
539     {
540     }
541
542     inline ReadModifyResolveNode::ReadModifyResolveNode(const JSTokenLocation& location, const Identifier& ident, Operator oper, ExpressionNode*  right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
543         : ExpressionNode(location)
544         , ThrowableExpressionData(divot, divotStart, divotEnd)
545         , m_ident(ident)
546         , m_right(right)
547         , m_operator(oper)
548         , m_rightHasAssignments(rightHasAssignments)
549     {
550     }
551
552     inline AssignResolveNode::AssignResolveNode(const JSTokenLocation& location, const Identifier& ident, ExpressionNode* right)
553         : ExpressionNode(location)
554         , m_ident(ident)
555         , m_right(right)
556     {
557     }
558
559
560     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)
561         : ExpressionNode(location)
562         , ThrowableSubExpressionData(divot, divotStart, divotEnd)
563         , m_base(base)
564         , m_subscript(subscript)
565         , m_right(right)
566         , m_operator(oper)
567         , m_subscriptHasAssignments(subscriptHasAssignments)
568         , m_rightHasAssignments(rightHasAssignments)
569     {
570     }
571
572     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)
573         : ExpressionNode(location)
574         , ThrowableExpressionData(divot, divotStart, divotEnd)
575         , m_base(base)
576         , m_subscript(subscript)
577         , m_right(right)
578         , m_subscriptHasAssignments(subscriptHasAssignments)
579         , m_rightHasAssignments(rightHasAssignments)
580     {
581     }
582
583     inline AssignDotNode::AssignDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
584         : ExpressionNode(location)
585         , ThrowableExpressionData(divot, divotStart, divotEnd)
586         , m_base(base)
587         , m_ident(ident)
588         , m_right(right)
589         , m_rightHasAssignments(rightHasAssignments)
590     {
591     }
592
593     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)
594         : ExpressionNode(location)
595         , ThrowableSubExpressionData(divot, divotStart, divotEnd)
596         , m_base(base)
597         , m_ident(ident)
598         , m_right(right)
599         , m_operator(oper)
600         , m_rightHasAssignments(rightHasAssignments)
601     {
602     }
603
604     inline AssignErrorNode::AssignErrorNode(const JSTokenLocation& location, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
605         : ExpressionNode(location)
606         , ThrowableExpressionData(divot, divotStart, divotEnd)
607     {
608     }
609
610     inline CommaNode::CommaNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2)
611         : ExpressionNode(location)
612     {
613         ASSERT(expr1);
614         ASSERT(expr2);
615         m_expressions.append(expr1);
616         m_expressions.append(expr2);
617     }
618
619     inline ConstStatementNode::ConstStatementNode(const JSTokenLocation& location, ConstDeclNode* next)
620         : StatementNode(location)
621         , m_next(next)
622     {
623     }
624
625     inline SourceElements::SourceElements()
626     {
627     }
628
629     inline EmptyStatementNode::EmptyStatementNode(const JSTokenLocation& location)
630         : StatementNode(location)
631     {
632     }
633
634     inline DebuggerStatementNode::DebuggerStatementNode(const JSTokenLocation& location)
635         : StatementNode(location)
636     {
637     }
638     
639     inline ExprStatementNode::ExprStatementNode(const JSTokenLocation& location, ExpressionNode* expr)
640         : StatementNode(location)
641         , m_expr(expr)
642     {
643     }
644
645     inline VarStatementNode::VarStatementNode(const JSTokenLocation& location, ExpressionNode* expr)
646         : StatementNode(location)
647         , m_expr(expr)
648     {
649     }
650     
651     inline IfElseNode::IfElseNode(const JSTokenLocation& location, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock)
652         : StatementNode(location)
653         , m_condition(condition)
654         , m_ifBlock(ifBlock)
655         , m_elseBlock(elseBlock)
656     {
657     }
658
659     inline DoWhileNode::DoWhileNode(const JSTokenLocation& location, StatementNode* statement, ExpressionNode* expr)
660         : StatementNode(location)
661         , m_statement(statement)
662         , m_expr(expr)
663     {
664     }
665
666     inline WhileNode::WhileNode(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement)
667         : StatementNode(location)
668         , m_expr(expr)
669         , m_statement(statement)
670     {
671     }
672
673     inline ForNode::ForNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement)
674         : StatementNode(location)
675         , m_expr1(expr1)
676         , m_expr2(expr2)
677         , m_expr3(expr3)
678         , m_statement(statement)
679     {
680         ASSERT(statement);
681     }
682
683     inline ContinueNode::ContinueNode(VM* vm, const JSTokenLocation& location)
684         : StatementNode(location)
685         , m_ident(vm->propertyNames->nullIdentifier)
686     {
687     }
688
689     inline ContinueNode::ContinueNode(const JSTokenLocation& location, const Identifier& ident)
690         : StatementNode(location)
691         , m_ident(ident)
692     {
693     }
694     
695     inline BreakNode::BreakNode(VM* vm, const JSTokenLocation& location)
696         : StatementNode(location)
697         , m_ident(vm->propertyNames->nullIdentifier)
698     {
699     }
700
701     inline BreakNode::BreakNode(const JSTokenLocation& location, const Identifier& ident)
702         : StatementNode(location)
703         , m_ident(ident)
704     {
705     }
706     
707     inline ReturnNode::ReturnNode(const JSTokenLocation& location, ExpressionNode* value)
708         : StatementNode(location)
709         , m_value(value)
710     {
711     }
712
713     inline WithNode::WithNode(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement, const JSTextPosition& divot, uint32_t expressionLength)
714         : StatementNode(location)
715         , m_expr(expr)
716         , m_statement(statement)
717         , m_divot(divot)
718         , m_expressionLength(expressionLength)
719     {
720     }
721
722     inline LabelNode::LabelNode(const JSTokenLocation& location, const Identifier& name, StatementNode* statement)
723         : StatementNode(location)
724         , m_name(name)
725         , m_statement(statement)
726     {
727     }
728
729     inline ThrowNode::ThrowNode(const JSTokenLocation& location, ExpressionNode* expr)
730         : StatementNode(location)
731         , m_expr(expr)
732     {
733     }
734
735     inline TryNode::TryNode(const JSTokenLocation& location, StatementNode* tryBlock, const Identifier& exceptionIdent, StatementNode* catchBlock, StatementNode* finallyBlock)
736         : StatementNode(location)
737         , m_tryBlock(tryBlock)
738         , m_exceptionIdent(exceptionIdent)
739         , m_catchBlock(catchBlock)
740         , m_finallyBlock(finallyBlock)
741     {
742     }
743
744     inline ParameterNode::ParameterNode(PassRefPtr<DeconstructionPatternNode> pattern)
745         : m_pattern(pattern)
746         , m_next(0)
747     {
748         ASSERT(m_pattern);
749     }
750
751     inline ParameterNode::ParameterNode(ParameterNode* l, PassRefPtr<DeconstructionPatternNode> pattern)
752         : m_pattern(pattern)
753         , m_next(0)
754     {
755         l->m_next = this;
756         ASSERT(m_pattern);
757         ASSERT(l->m_pattern);
758     }
759
760     inline FuncExprNode::FuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
761         : ExpressionNode(location)
762         , m_body(body)
763     {
764         m_body->finishParsing(source, parameter, ident, FunctionNameIsInScope);
765     }
766
767     inline FuncDeclNode::FuncDeclNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
768         : StatementNode(location)
769         , m_body(body)
770     {
771         m_body->finishParsing(source, parameter, ident, FunctionNameIsNotInScope);
772     }
773
774     inline CaseClauseNode::CaseClauseNode(ExpressionNode* expr, SourceElements* statements)
775         : m_expr(expr)
776         , m_statements(statements)
777     {
778     }
779
780     inline ClauseListNode::ClauseListNode(CaseClauseNode* clause)
781         : m_clause(clause)
782         , m_next(0)
783     {
784     }
785
786     inline ClauseListNode::ClauseListNode(ClauseListNode* clauseList, CaseClauseNode* clause)
787         : m_clause(clause)
788         , m_next(0)
789     {
790         clauseList->m_next = this;
791     }
792
793     inline CaseBlockNode::CaseBlockNode(ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2)
794         : m_list1(list1)
795         , m_defaultClause(defaultClause)
796         , m_list2(list2)
797     {
798     }
799
800     inline SwitchNode::SwitchNode(const JSTokenLocation& location, ExpressionNode* expr, CaseBlockNode* block)
801         : StatementNode(location)
802         , m_expr(expr)
803         , m_block(block)
804     {
805     }
806
807     inline ConstDeclNode::ConstDeclNode(const JSTokenLocation& location, const Identifier& ident, ExpressionNode* init)
808         : ExpressionNode(location)
809         , m_ident(ident)
810         , m_next(0)
811         , m_init(init)
812     {
813     }
814
815     inline BlockNode::BlockNode(const JSTokenLocation& location, SourceElements* statements)
816         : StatementNode(location)
817         , m_statements(statements)
818     {
819     }
820
821     inline EnumerationNode::EnumerationNode(const JSTokenLocation& location, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement)
822         : StatementNode(location)
823         , m_lexpr(l)
824         , m_expr(expr)
825         , m_statement(statement)
826     {
827         ASSERT(l);
828     }
829     
830     inline EnumerationNode::EnumerationNode(VM* vm, const JSTokenLocation& location, DeconstructionPatternNode* pattern, ExpressionNode* expr, StatementNode* statement)
831         : StatementNode(location)
832         , m_lexpr(new (vm) DeconstructingAssignmentNode(location, pattern, 0))
833         , m_expr(expr)
834         , m_statement(statement)
835     {
836         ASSERT(pattern);
837     }
838     
839     inline ForInNode::ForInNode(const JSTokenLocation& location, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement)
840         : EnumerationNode(location, l, expr, statement)
841     {
842     }
843     
844     inline ForInNode::ForInNode(VM* vm, const JSTokenLocation& location, DeconstructionPatternNode* pattern, ExpressionNode* expr, StatementNode* statement)
845         : EnumerationNode(vm, location, pattern, expr, statement)
846     {
847     }
848     
849     inline ForOfNode::ForOfNode(const JSTokenLocation& location, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement)
850         : EnumerationNode(location, l, expr, statement)
851     {
852     }
853     
854     inline ForOfNode::ForOfNode(VM* vm, const JSTokenLocation& location, DeconstructionPatternNode* pattern, ExpressionNode* expr, StatementNode* statement)
855         : EnumerationNode(vm, location, pattern, expr, statement)
856     {
857     }
858     
859     inline DeconstructionPatternNode::DeconstructionPatternNode(VM*)
860     {
861     }
862
863     inline ArrayPatternNode::ArrayPatternNode(VM* vm)
864         : DeconstructionPatternNode(vm)
865     {
866     }
867     
868     inline PassRefPtr<ArrayPatternNode> ArrayPatternNode::create(VM* vm)
869     {
870         return adoptRef(new ArrayPatternNode(vm));
871     }
872     
873     inline ObjectPatternNode::ObjectPatternNode(VM* vm)
874         : DeconstructionPatternNode(vm)
875     {
876     }
877     
878     inline PassRefPtr<ObjectPatternNode> ObjectPatternNode::create(VM* vm)
879     {
880         return adoptRef(new ObjectPatternNode(vm));
881     }
882
883     inline PassRefPtr<BindingNode> BindingNode::create(VM* vm, const Identifier& boundProperty, const JSTextPosition& divot, const JSTextPosition& start, const JSTextPosition& end)
884     {
885         return adoptRef(new BindingNode(vm, boundProperty, divot, start, end));
886     }
887     
888     inline BindingNode::BindingNode(VM* vm, const Identifier& boundProperty, const JSTextPosition& divot, const JSTextPosition& start, const JSTextPosition& end)
889         : DeconstructionPatternNode(vm)
890         , ThrowableExpressionData(divot, start, end)
891         , m_boundProperty(boundProperty)
892     {
893     }
894     
895     inline DeconstructingAssignmentNode::DeconstructingAssignmentNode(const JSTokenLocation& location, PassRefPtr<DeconstructionPatternNode> bindings, ExpressionNode* initializer)
896         : ExpressionNode(location)
897         , m_bindings(bindings)
898         , m_initializer(initializer)
899     {
900     }
901     
902 } // namespace JSC
903
904 #endif // NodeConstructors_h