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