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