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