]> git.saurik.com Git - apple/javascriptcore.git/blob - parser/Nodes.h
JavaScriptCore-903.tar.gz
[apple/javascriptcore.git] / parser / Nodes.h
1 /*
2 * Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
3 * Copyright (C) 2001 Peter Kelly (pmk@post.com)
4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
5 * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca)
6 * Copyright (C) 2007 Maks Orlovich
7 * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Library General Public License for more details.
18 *
19 * You should have received a copy of the GNU Library General Public License
20 * along with this library; see the file COPYING.LIB. If not, write to
21 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301, USA.
23 *
24 */
25
26 #ifndef Nodes_h
27 #define Nodes_h
28
29 #include "Error.h"
30 #include "JITCode.h"
31 #include "Opcode.h"
32 #include "ParserArena.h"
33 #include "ResultType.h"
34 #include "SourceCode.h"
35 #include "SymbolTable.h"
36 #include <wtf/MathExtras.h>
37
38 namespace JSC {
39
40 class ArgumentListNode;
41 class BytecodeGenerator;
42 class FunctionBodyNode;
43 class Label;
44 class PropertyListNode;
45 class ReadModifyResolveNode;
46 class RegisterID;
47 class ScopeChainNode;
48 class ScopeNode;
49
50 typedef unsigned CodeFeatures;
51
52 const CodeFeatures NoFeatures = 0;
53 const CodeFeatures EvalFeature = 1 << 0;
54 const CodeFeatures ClosureFeature = 1 << 1;
55 const CodeFeatures AssignFeature = 1 << 2;
56 const CodeFeatures ArgumentsFeature = 1 << 3;
57 const CodeFeatures WithFeature = 1 << 4;
58 const CodeFeatures CatchFeature = 1 << 5;
59 const CodeFeatures ThisFeature = 1 << 6;
60 const CodeFeatures StrictModeFeature = 1 << 7;
61 const CodeFeatures ShadowsArgumentsFeature = 1 << 8;
62
63
64 const CodeFeatures AllFeatures = EvalFeature | ClosureFeature | AssignFeature | ArgumentsFeature | WithFeature | CatchFeature | ThisFeature | StrictModeFeature | ShadowsArgumentsFeature;
65
66 enum Operator {
67 OpEqual,
68 OpPlusEq,
69 OpMinusEq,
70 OpMultEq,
71 OpDivEq,
72 OpPlusPlus,
73 OpMinusMinus,
74 OpAndEq,
75 OpXOrEq,
76 OpOrEq,
77 OpModEq,
78 OpLShift,
79 OpRShift,
80 OpURShift
81 };
82
83 enum LogicalOperator {
84 OpLogicalAnd,
85 OpLogicalOr
86 };
87
88 typedef HashSet<RefPtr<StringImpl>, IdentifierRepHash> IdentifierSet;
89
90 namespace DeclarationStacks {
91 enum VarAttrs { IsConstant = 1, HasInitializer = 2 };
92 typedef Vector<std::pair<const Identifier*, unsigned> > VarStack;
93 typedef Vector<FunctionBodyNode*> FunctionStack;
94 }
95
96 struct SwitchInfo {
97 enum SwitchType { SwitchNone, SwitchImmediate, SwitchCharacter, SwitchString };
98 uint32_t bytecodeOffset;
99 SwitchType switchType;
100 };
101
102 class ParserArenaFreeable {
103 public:
104 // ParserArenaFreeable objects are are freed when the arena is deleted.
105 // Destructors are not called. Clients must not call delete on such objects.
106 void* operator new(size_t, JSGlobalData*);
107 };
108
109 class ParserArenaDeletable {
110 public:
111 virtual ~ParserArenaDeletable() { }
112
113 // ParserArenaDeletable objects are deleted when the arena is deleted.
114 // Clients must not call delete directly on such objects.
115 void* operator new(size_t, JSGlobalData*);
116 };
117
118 class ParserArenaRefCounted : public RefCounted<ParserArenaRefCounted> {
119 protected:
120 ParserArenaRefCounted(JSGlobalData*);
121
122 public:
123 virtual ~ParserArenaRefCounted()
124 {
125 ASSERT(deletionHasBegun());
126 }
127 };
128
129 class Node : public ParserArenaFreeable {
130 protected:
131 Node(JSGlobalData*);
132
133 public:
134 virtual ~Node() { }
135
136 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* destination = 0) = 0;
137
138 int lineNo() const { return m_line; }
139
140 protected:
141 int m_line;
142 };
143
144 class ExpressionNode : public Node {
145 protected:
146 ExpressionNode(JSGlobalData*, ResultType = ResultType::unknownType());
147
148 public:
149 virtual bool isNumber() const { return false; }
150 virtual bool isString() const { return false; }
151 virtual bool isNull() const { return false; }
152 virtual bool isPure(BytecodeGenerator&) const { return false; }
153 virtual bool isLocation() const { return false; }
154 virtual bool isResolveNode() const { return false; }
155 virtual bool isBracketAccessorNode() const { return false; }
156 virtual bool isDotAccessorNode() const { return false; }
157 virtual bool isFuncExprNode() const { return false; }
158 virtual bool isCommaNode() const { return false; }
159 virtual bool isSimpleArray() const { return false; }
160 virtual bool isAdd() const { return false; }
161 virtual bool isSubtract() const { return false; }
162 virtual bool hasConditionContextCodegen() const { return false; }
163
164 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label*, Label*, bool) { ASSERT_NOT_REACHED(); }
165
166 virtual ExpressionNode* stripUnaryPlus() { return this; }
167
168 ResultType resultDescriptor() const { return m_resultType; }
169
170 private:
171 ResultType m_resultType;
172 };
173
174 class StatementNode : public Node {
175 protected:
176 StatementNode(JSGlobalData*);
177
178 public:
179 void setLoc(int firstLine, int lastLine);
180 int firstLine() const { return lineNo(); }
181 int lastLine() const { return m_lastLine; }
182
183 virtual bool isEmptyStatement() const { return false; }
184 virtual bool isReturnNode() const { return false; }
185 virtual bool isExprStatement() const { return false; }
186
187 virtual bool isBlock() const { return false; }
188
189 private:
190 int m_lastLine;
191 };
192
193 class NullNode : public ExpressionNode {
194 public:
195 NullNode(JSGlobalData*);
196
197 private:
198 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
199
200 virtual bool isNull() const { return true; }
201 };
202
203 class BooleanNode : public ExpressionNode {
204 public:
205 BooleanNode(JSGlobalData*, bool value);
206
207 private:
208 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
209
210 virtual bool isPure(BytecodeGenerator&) const { return true; }
211
212 bool m_value;
213 };
214
215 class NumberNode : public ExpressionNode {
216 public:
217 NumberNode(JSGlobalData*, double value);
218
219 double value() const { return m_value; }
220 void setValue(double value) { m_value = value; }
221
222 private:
223 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
224
225 virtual bool isNumber() const { return true; }
226 virtual bool isPure(BytecodeGenerator&) const { return true; }
227
228 double m_value;
229 };
230
231 class StringNode : public ExpressionNode {
232 public:
233 StringNode(JSGlobalData*, const Identifier&);
234
235 const Identifier& value() { return m_value; }
236
237 private:
238 virtual bool isPure(BytecodeGenerator&) const { return true; }
239
240 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
241
242 virtual bool isString() const { return true; }
243
244 const Identifier& m_value;
245 };
246
247 class ThrowableExpressionData {
248 public:
249 ThrowableExpressionData()
250 : m_divot(static_cast<uint32_t>(-1))
251 , m_startOffset(static_cast<uint16_t>(-1))
252 , m_endOffset(static_cast<uint16_t>(-1))
253 {
254 }
255
256 ThrowableExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset)
257 : m_divot(divot)
258 , m_startOffset(startOffset)
259 , m_endOffset(endOffset)
260 {
261 }
262
263 void setExceptionSourceCode(unsigned divot, unsigned startOffset, unsigned endOffset)
264 {
265 m_divot = divot;
266 m_startOffset = startOffset;
267 m_endOffset = endOffset;
268 }
269
270 uint32_t divot() const { return m_divot; }
271 uint16_t startOffset() const { return m_startOffset; }
272 uint16_t endOffset() const { return m_endOffset; }
273
274 protected:
275 RegisterID* emitThrowReferenceError(BytecodeGenerator&, const UString& message);
276
277 private:
278 uint32_t m_divot;
279 uint16_t m_startOffset;
280 uint16_t m_endOffset;
281 };
282
283 class ThrowableSubExpressionData : public ThrowableExpressionData {
284 public:
285 ThrowableSubExpressionData()
286 : m_subexpressionDivotOffset(0)
287 , m_subexpressionEndOffset(0)
288 {
289 }
290
291 ThrowableSubExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset)
292 : ThrowableExpressionData(divot, startOffset, endOffset)
293 , m_subexpressionDivotOffset(0)
294 , m_subexpressionEndOffset(0)
295 {
296 }
297
298 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset)
299 {
300 ASSERT(subexpressionDivot <= divot());
301 if ((divot() - subexpressionDivot) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot
302 return;
303 m_subexpressionDivotOffset = divot() - subexpressionDivot;
304 m_subexpressionEndOffset = subexpressionOffset;
305 }
306
307 protected:
308 uint16_t m_subexpressionDivotOffset;
309 uint16_t m_subexpressionEndOffset;
310 };
311
312 class ThrowablePrefixedSubExpressionData : public ThrowableExpressionData {
313 public:
314 ThrowablePrefixedSubExpressionData()
315 : m_subexpressionDivotOffset(0)
316 , m_subexpressionStartOffset(0)
317 {
318 }
319
320 ThrowablePrefixedSubExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset)
321 : ThrowableExpressionData(divot, startOffset, endOffset)
322 , m_subexpressionDivotOffset(0)
323 , m_subexpressionStartOffset(0)
324 {
325 }
326
327 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset)
328 {
329 ASSERT(subexpressionDivot >= divot());
330 if ((subexpressionDivot - divot()) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot
331 return;
332 m_subexpressionDivotOffset = subexpressionDivot - divot();
333 m_subexpressionStartOffset = subexpressionOffset;
334 }
335
336 protected:
337 uint16_t m_subexpressionDivotOffset;
338 uint16_t m_subexpressionStartOffset;
339 };
340
341 class RegExpNode : public ExpressionNode, public ThrowableExpressionData {
342 public:
343 RegExpNode(JSGlobalData*, const Identifier& pattern, const Identifier& flags);
344
345 private:
346 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
347
348 const Identifier& m_pattern;
349 const Identifier& m_flags;
350 };
351
352 class ThisNode : public ExpressionNode {
353 public:
354 ThisNode(JSGlobalData*);
355
356 private:
357 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
358 };
359
360 class ResolveNode : public ExpressionNode {
361 public:
362 ResolveNode(JSGlobalData*, const Identifier&, int startOffset);
363
364 const Identifier& identifier() const { return m_ident; }
365
366 private:
367 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
368
369 virtual bool isPure(BytecodeGenerator&) const ;
370 virtual bool isLocation() const { return true; }
371 virtual bool isResolveNode() const { return true; }
372
373 const Identifier& m_ident;
374 int32_t m_startOffset;
375 };
376
377 class ElementNode : public ParserArenaFreeable {
378 public:
379 ElementNode(JSGlobalData*, int elision, ExpressionNode*);
380 ElementNode(JSGlobalData*, ElementNode*, int elision, ExpressionNode*);
381
382 int elision() const { return m_elision; }
383 ExpressionNode* value() { return m_node; }
384 ElementNode* next() { return m_next; }
385
386 private:
387 ElementNode* m_next;
388 int m_elision;
389 ExpressionNode* m_node;
390 };
391
392 class ArrayNode : public ExpressionNode {
393 public:
394 ArrayNode(JSGlobalData*, int elision);
395 ArrayNode(JSGlobalData*, ElementNode*);
396 ArrayNode(JSGlobalData*, int elision, ElementNode*);
397
398 ArgumentListNode* toArgumentList(JSGlobalData*) const;
399
400 private:
401 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
402
403 virtual bool isSimpleArray() const ;
404
405 ElementNode* m_element;
406 int m_elision;
407 bool m_optional;
408 };
409
410 class PropertyNode : public ParserArenaFreeable {
411 public:
412 enum Type { Constant = 1, Getter = 2, Setter = 4 };
413
414 PropertyNode(JSGlobalData*, const Identifier& name, ExpressionNode* value, Type);
415 PropertyNode(JSGlobalData*, double name, ExpressionNode* value, Type);
416
417 const Identifier& name() const { return m_name; }
418 Type type() const { return m_type; }
419
420 private:
421 friend class PropertyListNode;
422 const Identifier& m_name;
423 ExpressionNode* m_assign;
424 Type m_type;
425 };
426
427 class PropertyListNode : public Node {
428 public:
429 PropertyListNode(JSGlobalData*, PropertyNode*);
430 PropertyListNode(JSGlobalData*, PropertyNode*, PropertyListNode*);
431
432 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
433
434 private:
435 PropertyNode* m_node;
436 PropertyListNode* m_next;
437 };
438
439 class ObjectLiteralNode : public ExpressionNode {
440 public:
441 ObjectLiteralNode(JSGlobalData*);
442 ObjectLiteralNode(JSGlobalData*, PropertyListNode*);
443
444 private:
445 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
446
447 PropertyListNode* m_list;
448 };
449
450 class BracketAccessorNode : public ExpressionNode, public ThrowableExpressionData {
451 public:
452 BracketAccessorNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments);
453
454 ExpressionNode* base() const { return m_base; }
455 ExpressionNode* subscript() const { return m_subscript; }
456
457 private:
458 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
459
460 virtual bool isLocation() const { return true; }
461 virtual bool isBracketAccessorNode() const { return true; }
462
463 ExpressionNode* m_base;
464 ExpressionNode* m_subscript;
465 bool m_subscriptHasAssignments;
466 };
467
468 class DotAccessorNode : public ExpressionNode, public ThrowableExpressionData {
469 public:
470 DotAccessorNode(JSGlobalData*, ExpressionNode* base, const Identifier&);
471
472 ExpressionNode* base() const { return m_base; }
473 const Identifier& identifier() const { return m_ident; }
474
475 private:
476 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
477
478 virtual bool isLocation() const { return true; }
479 virtual bool isDotAccessorNode() const { return true; }
480
481 ExpressionNode* m_base;
482 const Identifier& m_ident;
483 };
484
485 class ArgumentListNode : public Node {
486 public:
487 ArgumentListNode(JSGlobalData*, ExpressionNode*);
488 ArgumentListNode(JSGlobalData*, ArgumentListNode*, ExpressionNode*);
489
490 ArgumentListNode* m_next;
491 ExpressionNode* m_expr;
492
493 private:
494 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
495 };
496
497 class ArgumentsNode : public ParserArenaFreeable {
498 public:
499 ArgumentsNode(JSGlobalData*);
500 ArgumentsNode(JSGlobalData*, ArgumentListNode*);
501
502 ArgumentListNode* m_listNode;
503 };
504
505 class NewExprNode : public ExpressionNode, public ThrowableExpressionData {
506 public:
507 NewExprNode(JSGlobalData*, ExpressionNode*);
508 NewExprNode(JSGlobalData*, ExpressionNode*, ArgumentsNode*);
509
510 private:
511 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
512
513 ExpressionNode* m_expr;
514 ArgumentsNode* m_args;
515 };
516
517 class EvalFunctionCallNode : public ExpressionNode, public ThrowableExpressionData {
518 public:
519 EvalFunctionCallNode(JSGlobalData*, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
520
521 private:
522 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
523
524 ArgumentsNode* m_args;
525 };
526
527 class FunctionCallValueNode : public ExpressionNode, public ThrowableExpressionData {
528 public:
529 FunctionCallValueNode(JSGlobalData*, ExpressionNode*, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
530
531 private:
532 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
533
534 ExpressionNode* m_expr;
535 ArgumentsNode* m_args;
536 };
537
538 class FunctionCallResolveNode : public ExpressionNode, public ThrowableExpressionData {
539 public:
540 FunctionCallResolveNode(JSGlobalData*, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
541
542 private:
543 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
544
545 const Identifier& m_ident;
546 ArgumentsNode* m_args;
547 size_t m_index; // Used by LocalVarFunctionCallNode.
548 size_t m_scopeDepth; // Used by ScopedVarFunctionCallNode and NonLocalVarFunctionCallNode
549 };
550
551 class FunctionCallBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
552 public:
553 FunctionCallBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
554
555 private:
556 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
557
558 ExpressionNode* m_base;
559 ExpressionNode* m_subscript;
560 ArgumentsNode* m_args;
561 };
562
563 class FunctionCallDotNode : public ExpressionNode, public ThrowableSubExpressionData {
564 public:
565 FunctionCallDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
566
567 private:
568 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
569
570 protected:
571 ExpressionNode* m_base;
572 const Identifier& m_ident;
573 ArgumentsNode* m_args;
574 };
575
576 class CallFunctionCallDotNode : public FunctionCallDotNode {
577 public:
578 CallFunctionCallDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
579
580 private:
581 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
582 };
583
584 class ApplyFunctionCallDotNode : public FunctionCallDotNode {
585 public:
586 ApplyFunctionCallDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
587
588 private:
589 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
590 };
591
592 class PrePostResolveNode : public ExpressionNode, public ThrowableExpressionData {
593 public:
594 PrePostResolveNode(JSGlobalData*, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
595
596 protected:
597 const Identifier& m_ident;
598 };
599
600 class PostfixResolveNode : public PrePostResolveNode {
601 public:
602 PostfixResolveNode(JSGlobalData*, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
603
604 private:
605 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
606
607 Operator m_operator;
608 };
609
610 class PostfixBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
611 public:
612 PostfixBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
613
614 private:
615 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
616
617 ExpressionNode* m_base;
618 ExpressionNode* m_subscript;
619 Operator m_operator;
620 };
621
622 class PostfixDotNode : public ExpressionNode, public ThrowableSubExpressionData {
623 public:
624 PostfixDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
625
626 private:
627 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
628
629 ExpressionNode* m_base;
630 const Identifier& m_ident;
631 Operator m_operator;
632 };
633
634 class PostfixErrorNode : public ExpressionNode, public ThrowableSubExpressionData {
635 public:
636 PostfixErrorNode(JSGlobalData*, ExpressionNode*, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
637
638 private:
639 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
640
641 ExpressionNode* m_expr;
642 Operator m_operator;
643 };
644
645 class DeleteResolveNode : public ExpressionNode, public ThrowableExpressionData {
646 public:
647 DeleteResolveNode(JSGlobalData*, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
648
649 private:
650 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
651
652 const Identifier& m_ident;
653 };
654
655 class DeleteBracketNode : public ExpressionNode, public ThrowableExpressionData {
656 public:
657 DeleteBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, unsigned divot, unsigned startOffset, unsigned endOffset);
658
659 private:
660 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
661
662 ExpressionNode* m_base;
663 ExpressionNode* m_subscript;
664 };
665
666 class DeleteDotNode : public ExpressionNode, public ThrowableExpressionData {
667 public:
668 DeleteDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
669
670 private:
671 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
672
673 ExpressionNode* m_base;
674 const Identifier& m_ident;
675 };
676
677 class DeleteValueNode : public ExpressionNode {
678 public:
679 DeleteValueNode(JSGlobalData*, ExpressionNode*);
680
681 private:
682 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
683
684 ExpressionNode* m_expr;
685 };
686
687 class VoidNode : public ExpressionNode {
688 public:
689 VoidNode(JSGlobalData*, ExpressionNode*);
690
691 private:
692 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
693
694 ExpressionNode* m_expr;
695 };
696
697 class TypeOfResolveNode : public ExpressionNode {
698 public:
699 TypeOfResolveNode(JSGlobalData*, const Identifier&);
700
701 const Identifier& identifier() const { return m_ident; }
702
703 private:
704 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
705
706 const Identifier& m_ident;
707 };
708
709 class TypeOfValueNode : public ExpressionNode {
710 public:
711 TypeOfValueNode(JSGlobalData*, ExpressionNode*);
712
713 private:
714 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
715
716 ExpressionNode* m_expr;
717 };
718
719 class PrefixResolveNode : public PrePostResolveNode {
720 public:
721 PrefixResolveNode(JSGlobalData*, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
722
723 private:
724 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
725
726 Operator m_operator;
727 };
728
729 class PrefixBracketNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
730 public:
731 PrefixBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
732
733 private:
734 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
735
736 ExpressionNode* m_base;
737 ExpressionNode* m_subscript;
738 Operator m_operator;
739 };
740
741 class PrefixDotNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
742 public:
743 PrefixDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
744
745 private:
746 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
747
748 ExpressionNode* m_base;
749 const Identifier& m_ident;
750 Operator m_operator;
751 };
752
753 class PrefixErrorNode : public ExpressionNode, public ThrowableExpressionData {
754 public:
755 PrefixErrorNode(JSGlobalData*, ExpressionNode*, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
756
757 private:
758 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
759
760 ExpressionNode* m_expr;
761 Operator m_operator;
762 };
763
764 class UnaryOpNode : public ExpressionNode {
765 public:
766 UnaryOpNode(JSGlobalData*, ResultType, ExpressionNode*, OpcodeID);
767
768 protected:
769 ExpressionNode* expr() { return m_expr; }
770 const ExpressionNode* expr() const { return m_expr; }
771
772 private:
773 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
774
775 OpcodeID opcodeID() const { return m_opcodeID; }
776
777 ExpressionNode* m_expr;
778 OpcodeID m_opcodeID;
779 };
780
781 class UnaryPlusNode : public UnaryOpNode {
782 public:
783 UnaryPlusNode(JSGlobalData*, ExpressionNode*);
784
785 private:
786 virtual ExpressionNode* stripUnaryPlus() { return expr(); }
787 };
788
789 class NegateNode : public UnaryOpNode {
790 public:
791 NegateNode(JSGlobalData*, ExpressionNode*);
792 };
793
794 class BitwiseNotNode : public UnaryOpNode {
795 public:
796 BitwiseNotNode(JSGlobalData*, ExpressionNode*);
797 };
798
799 class LogicalNotNode : public UnaryOpNode {
800 public:
801 LogicalNotNode(JSGlobalData*, ExpressionNode*);
802 private:
803 void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue);
804 virtual bool hasConditionContextCodegen() const { return expr()->hasConditionContextCodegen(); }
805 };
806
807 class BinaryOpNode : public ExpressionNode {
808 public:
809 BinaryOpNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
810 BinaryOpNode(JSGlobalData*, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
811
812 RegisterID* emitStrcat(BytecodeGenerator& generator, RegisterID* destination, RegisterID* lhs = 0, ReadModifyResolveNode* emitExpressionInfoForMe = 0);
813
814 ExpressionNode* lhs() { return m_expr1; };
815 ExpressionNode* rhs() { return m_expr2; };
816
817 private:
818 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
819
820 protected:
821 OpcodeID opcodeID() const { return m_opcodeID; }
822
823 protected:
824 ExpressionNode* m_expr1;
825 ExpressionNode* m_expr2;
826 private:
827 OpcodeID m_opcodeID;
828 protected:
829 bool m_rightHasAssignments;
830 };
831
832 class ReverseBinaryOpNode : public BinaryOpNode {
833 public:
834 ReverseBinaryOpNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
835 ReverseBinaryOpNode(JSGlobalData*, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
836
837 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
838 };
839
840 class MultNode : public BinaryOpNode {
841 public:
842 MultNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
843 };
844
845 class DivNode : public BinaryOpNode {
846 public:
847 DivNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
848 };
849
850 class ModNode : public BinaryOpNode {
851 public:
852 ModNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
853 };
854
855 class AddNode : public BinaryOpNode {
856 public:
857 AddNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
858
859 virtual bool isAdd() const { return true; }
860 };
861
862 class SubNode : public BinaryOpNode {
863 public:
864 SubNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
865
866 virtual bool isSubtract() const { return true; }
867 };
868
869 class LeftShiftNode : public BinaryOpNode {
870 public:
871 LeftShiftNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
872 };
873
874 class RightShiftNode : public BinaryOpNode {
875 public:
876 RightShiftNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
877 };
878
879 class UnsignedRightShiftNode : public BinaryOpNode {
880 public:
881 UnsignedRightShiftNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
882 };
883
884 class LessNode : public BinaryOpNode {
885 public:
886 LessNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
887 };
888
889 class GreaterNode : public ReverseBinaryOpNode {
890 public:
891 GreaterNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
892 };
893
894 class LessEqNode : public BinaryOpNode {
895 public:
896 LessEqNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
897 };
898
899 class GreaterEqNode : public ReverseBinaryOpNode {
900 public:
901 GreaterEqNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
902 };
903
904 class ThrowableBinaryOpNode : public BinaryOpNode, public ThrowableExpressionData {
905 public:
906 ThrowableBinaryOpNode(JSGlobalData*, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
907 ThrowableBinaryOpNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
908
909 private:
910 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
911 };
912
913 class InstanceOfNode : public ThrowableBinaryOpNode {
914 public:
915 InstanceOfNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
916
917 private:
918 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
919 };
920
921 class InNode : public ThrowableBinaryOpNode {
922 public:
923 InNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
924 };
925
926 class EqualNode : public BinaryOpNode {
927 public:
928 EqualNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
929
930 private:
931 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
932 };
933
934 class NotEqualNode : public BinaryOpNode {
935 public:
936 NotEqualNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
937 };
938
939 class StrictEqualNode : public BinaryOpNode {
940 public:
941 StrictEqualNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
942
943 private:
944 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
945 };
946
947 class NotStrictEqualNode : public BinaryOpNode {
948 public:
949 NotStrictEqualNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
950 };
951
952 class BitAndNode : public BinaryOpNode {
953 public:
954 BitAndNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
955 };
956
957 class BitOrNode : public BinaryOpNode {
958 public:
959 BitOrNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
960 };
961
962 class BitXOrNode : public BinaryOpNode {
963 public:
964 BitXOrNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
965 };
966
967 // m_expr1 && m_expr2, m_expr1 || m_expr2
968 class LogicalOpNode : public ExpressionNode {
969 public:
970 LogicalOpNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator);
971
972 private:
973 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
974 void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue);
975 virtual bool hasConditionContextCodegen() const { return true; }
976
977 ExpressionNode* m_expr1;
978 ExpressionNode* m_expr2;
979 LogicalOperator m_operator;
980 };
981
982 // The ternary operator, "m_logical ? m_expr1 : m_expr2"
983 class ConditionalNode : public ExpressionNode {
984 public:
985 ConditionalNode(JSGlobalData*, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2);
986
987 private:
988 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
989
990 ExpressionNode* m_logical;
991 ExpressionNode* m_expr1;
992 ExpressionNode* m_expr2;
993 };
994
995 class ReadModifyResolveNode : public ExpressionNode, public ThrowableExpressionData {
996 public:
997 ReadModifyResolveNode(JSGlobalData*, const Identifier&, Operator, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
998
999 private:
1000 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1001
1002 const Identifier& m_ident;
1003 ExpressionNode* m_right;
1004 size_t m_index; // Used by ReadModifyLocalVarNode.
1005 Operator m_operator;
1006 bool m_rightHasAssignments;
1007 };
1008
1009 class AssignResolveNode : public ExpressionNode, public ThrowableExpressionData {
1010 public:
1011 AssignResolveNode(JSGlobalData*, const Identifier&, ExpressionNode* right, bool rightHasAssignments);
1012
1013 private:
1014 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1015
1016 const Identifier& m_ident;
1017 ExpressionNode* m_right;
1018 size_t m_index; // Used by ReadModifyLocalVarNode.
1019 bool m_rightHasAssignments;
1020 };
1021
1022 class ReadModifyBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
1023 public:
1024 ReadModifyBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, Operator, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1025
1026 private:
1027 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1028
1029 ExpressionNode* m_base;
1030 ExpressionNode* m_subscript;
1031 ExpressionNode* m_right;
1032 Operator m_operator : 30;
1033 bool m_subscriptHasAssignments : 1;
1034 bool m_rightHasAssignments : 1;
1035 };
1036
1037 class AssignBracketNode : public ExpressionNode, public ThrowableExpressionData {
1038 public:
1039 AssignBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1040
1041 private:
1042 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1043
1044 ExpressionNode* m_base;
1045 ExpressionNode* m_subscript;
1046 ExpressionNode* m_right;
1047 bool m_subscriptHasAssignments : 1;
1048 bool m_rightHasAssignments : 1;
1049 };
1050
1051 class AssignDotNode : public ExpressionNode, public ThrowableExpressionData {
1052 public:
1053 AssignDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1054
1055 private:
1056 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1057
1058 ExpressionNode* m_base;
1059 const Identifier& m_ident;
1060 ExpressionNode* m_right;
1061 bool m_rightHasAssignments;
1062 };
1063
1064 class ReadModifyDotNode : public ExpressionNode, public ThrowableSubExpressionData {
1065 public:
1066 ReadModifyDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, Operator, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1067
1068 private:
1069 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1070
1071 ExpressionNode* m_base;
1072 const Identifier& m_ident;
1073 ExpressionNode* m_right;
1074 Operator m_operator : 31;
1075 bool m_rightHasAssignments : 1;
1076 };
1077
1078 class AssignErrorNode : public ExpressionNode, public ThrowableExpressionData {
1079 public:
1080 AssignErrorNode(JSGlobalData*, ExpressionNode* left, Operator, ExpressionNode* right, unsigned divot, unsigned startOffset, unsigned endOffset);
1081
1082 private:
1083 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1084
1085 ExpressionNode* m_left;
1086 Operator m_operator;
1087 ExpressionNode* m_right;
1088 };
1089
1090 typedef Vector<ExpressionNode*, 8> ExpressionVector;
1091
1092 class CommaNode : public ExpressionNode, public ParserArenaDeletable {
1093 public:
1094 CommaNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2);
1095
1096 using ParserArenaDeletable::operator new;
1097
1098 void append(ExpressionNode* expr) { m_expressions.append(expr); }
1099
1100 private:
1101 virtual bool isCommaNode() const { return true; }
1102 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1103
1104 ExpressionVector m_expressions;
1105 };
1106
1107 class ConstDeclNode : public ExpressionNode {
1108 public:
1109 ConstDeclNode(JSGlobalData*, const Identifier&, ExpressionNode*);
1110
1111 bool hasInitializer() const { return m_init; }
1112 const Identifier& ident() { return m_ident; }
1113
1114 private:
1115 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1116 virtual RegisterID* emitCodeSingle(BytecodeGenerator&);
1117
1118 const Identifier& m_ident;
1119
1120 public:
1121 ConstDeclNode* m_next;
1122
1123 private:
1124 ExpressionNode* m_init;
1125 };
1126
1127 class ConstStatementNode : public StatementNode {
1128 public:
1129 ConstStatementNode(JSGlobalData*, ConstDeclNode* next);
1130
1131 private:
1132 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1133
1134 ConstDeclNode* m_next;
1135 };
1136
1137 class SourceElements : public ParserArenaDeletable {
1138 public:
1139 SourceElements(JSGlobalData*);
1140
1141 void append(StatementNode*);
1142
1143 StatementNode* singleStatement() const;
1144 StatementNode* lastStatement() const;
1145
1146 void emitBytecode(BytecodeGenerator&, RegisterID* destination);
1147
1148 private:
1149 Vector<StatementNode*> m_statements;
1150 };
1151
1152 class BlockNode : public StatementNode {
1153 public:
1154 BlockNode(JSGlobalData*, SourceElements* = 0);
1155
1156 StatementNode* singleStatement() const;
1157 StatementNode* lastStatement() const;
1158
1159 private:
1160 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1161
1162 virtual bool isBlock() const { return true; }
1163
1164 SourceElements* m_statements;
1165 };
1166
1167 class EmptyStatementNode : public StatementNode {
1168 public:
1169 EmptyStatementNode(JSGlobalData*);
1170
1171 private:
1172 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1173
1174 virtual bool isEmptyStatement() const { return true; }
1175 };
1176
1177 class DebuggerStatementNode : public StatementNode {
1178 public:
1179 DebuggerStatementNode(JSGlobalData*);
1180
1181 private:
1182 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1183 };
1184
1185 class ExprStatementNode : public StatementNode {
1186 public:
1187 ExprStatementNode(JSGlobalData*, ExpressionNode*);
1188
1189 ExpressionNode* expr() const { return m_expr; }
1190
1191 private:
1192 virtual bool isExprStatement() const { return true; }
1193
1194 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1195
1196 ExpressionNode* m_expr;
1197 };
1198
1199 class VarStatementNode : public StatementNode {
1200 public:
1201 VarStatementNode(JSGlobalData*, ExpressionNode*);
1202
1203 private:
1204 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1205
1206 ExpressionNode* m_expr;
1207 };
1208
1209 class IfNode : public StatementNode {
1210 public:
1211 IfNode(JSGlobalData*, ExpressionNode* condition, StatementNode* ifBlock);
1212
1213 protected:
1214 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1215
1216 ExpressionNode* m_condition;
1217 StatementNode* m_ifBlock;
1218 };
1219
1220 class IfElseNode : public IfNode {
1221 public:
1222 IfElseNode(JSGlobalData*, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock);
1223
1224 private:
1225 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1226
1227 StatementNode* m_elseBlock;
1228 };
1229
1230 class DoWhileNode : public StatementNode {
1231 public:
1232 DoWhileNode(JSGlobalData*, StatementNode* statement, ExpressionNode*);
1233
1234 private:
1235 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1236
1237 StatementNode* m_statement;
1238 ExpressionNode* m_expr;
1239 };
1240
1241 class WhileNode : public StatementNode {
1242 public:
1243 WhileNode(JSGlobalData*, ExpressionNode*, StatementNode* statement);
1244
1245 private:
1246 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1247
1248 ExpressionNode* m_expr;
1249 StatementNode* m_statement;
1250 };
1251
1252 class ForNode : public StatementNode {
1253 public:
1254 ForNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement, bool expr1WasVarDecl);
1255
1256 private:
1257 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1258
1259 ExpressionNode* m_expr1;
1260 ExpressionNode* m_expr2;
1261 ExpressionNode* m_expr3;
1262 StatementNode* m_statement;
1263 bool m_expr1WasVarDecl;
1264 };
1265
1266 class ForInNode : public StatementNode, public ThrowableExpressionData {
1267 public:
1268 ForInNode(JSGlobalData*, ExpressionNode*, ExpressionNode*, StatementNode*);
1269 ForInNode(JSGlobalData*, const Identifier&, ExpressionNode*, ExpressionNode*, StatementNode*, int divot, int startOffset, int endOffset);
1270
1271 private:
1272 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1273
1274 const Identifier& m_ident;
1275 ExpressionNode* m_init;
1276 ExpressionNode* m_lexpr;
1277 ExpressionNode* m_expr;
1278 StatementNode* m_statement;
1279 bool m_identIsVarDecl;
1280 };
1281
1282 class ContinueNode : public StatementNode, public ThrowableExpressionData {
1283 public:
1284 ContinueNode(JSGlobalData*);
1285 ContinueNode(JSGlobalData*, const Identifier&);
1286
1287 private:
1288 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1289
1290 const Identifier& m_ident;
1291 };
1292
1293 class BreakNode : public StatementNode, public ThrowableExpressionData {
1294 public:
1295 BreakNode(JSGlobalData*);
1296 BreakNode(JSGlobalData*, const Identifier&);
1297
1298 private:
1299 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1300
1301 const Identifier& m_ident;
1302 };
1303
1304 class ReturnNode : public StatementNode, public ThrowableExpressionData {
1305 public:
1306 ReturnNode(JSGlobalData*, ExpressionNode* value);
1307
1308 ExpressionNode* value() { return m_value; }
1309
1310 private:
1311 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1312
1313 virtual bool isReturnNode() const { return true; }
1314
1315 ExpressionNode* m_value;
1316 };
1317
1318 class WithNode : public StatementNode {
1319 public:
1320 WithNode(JSGlobalData*, ExpressionNode*, StatementNode*, uint32_t divot, uint32_t expressionLength);
1321
1322 private:
1323 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1324
1325 ExpressionNode* m_expr;
1326 StatementNode* m_statement;
1327 uint32_t m_divot;
1328 uint32_t m_expressionLength;
1329 };
1330
1331 class LabelNode : public StatementNode, public ThrowableExpressionData {
1332 public:
1333 LabelNode(JSGlobalData*, const Identifier& name, StatementNode*);
1334
1335 private:
1336 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1337
1338 const Identifier& m_name;
1339 StatementNode* m_statement;
1340 };
1341
1342 class ThrowNode : public StatementNode, public ThrowableExpressionData {
1343 public:
1344 ThrowNode(JSGlobalData*, ExpressionNode*);
1345
1346 private:
1347 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1348
1349 ExpressionNode* m_expr;
1350 };
1351
1352 class TryNode : public StatementNode {
1353 public:
1354 TryNode(JSGlobalData*, StatementNode* tryBlock, const Identifier& exceptionIdent, bool catchHasEval, StatementNode* catchBlock, StatementNode* finallyBlock);
1355
1356 private:
1357 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1358
1359 StatementNode* m_tryBlock;
1360 const Identifier& m_exceptionIdent;
1361 StatementNode* m_catchBlock;
1362 StatementNode* m_finallyBlock;
1363 bool m_catchHasEval;
1364 };
1365
1366 class ParameterNode : public ParserArenaFreeable {
1367 public:
1368 ParameterNode(JSGlobalData*, const Identifier&);
1369 ParameterNode(JSGlobalData*, ParameterNode*, const Identifier&);
1370
1371 const Identifier& ident() const { return m_ident; }
1372 ParameterNode* nextParam() const { return m_next; }
1373
1374 private:
1375 const Identifier& m_ident;
1376 ParameterNode* m_next;
1377 };
1378
1379 struct ScopeNodeData {
1380 WTF_MAKE_FAST_ALLOCATED;
1381 public:
1382 typedef DeclarationStacks::VarStack VarStack;
1383 typedef DeclarationStacks::FunctionStack FunctionStack;
1384
1385 ScopeNodeData(ParserArena&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, int numConstants);
1386
1387 ParserArena m_arena;
1388 VarStack m_varStack;
1389 FunctionStack m_functionStack;
1390 int m_numConstants;
1391 SourceElements* m_statements;
1392 IdentifierSet m_capturedVariables;
1393 };
1394
1395 class ScopeNode : public StatementNode, public ParserArenaRefCounted {
1396 public:
1397 typedef DeclarationStacks::VarStack VarStack;
1398 typedef DeclarationStacks::FunctionStack FunctionStack;
1399
1400 ScopeNode(JSGlobalData*, bool inStrictContext);
1401 ScopeNode(JSGlobalData*, const SourceCode&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, CodeFeatures, int numConstants);
1402
1403 using ParserArenaRefCounted::operator new;
1404
1405 ScopeNodeData* data() const { return m_data.get(); }
1406 void destroyData() { m_data.clear(); }
1407
1408 const SourceCode& source() const { return m_source; }
1409 const UString& sourceURL() const { return m_source.provider()->url(); }
1410 intptr_t sourceID() const { return m_source.provider()->asID(); }
1411
1412 void setFeatures(CodeFeatures features) { m_features = features; }
1413 CodeFeatures features() { return m_features; }
1414
1415 bool usesEval() const { return m_features & EvalFeature; }
1416 bool usesArguments() const { return (m_features & ArgumentsFeature) && !(m_features & ShadowsArgumentsFeature); }
1417 bool isStrictMode() const { return m_features & StrictModeFeature; }
1418 void setUsesArguments() { m_features |= ArgumentsFeature; }
1419 bool usesThis() const { return m_features & ThisFeature; }
1420 bool needsActivationForMoreThanVariables() const { ASSERT(m_data); return m_features & (EvalFeature | WithFeature | CatchFeature); }
1421 bool needsActivation() const { ASSERT(m_data); return (hasCapturedVariables()) || (m_features & (EvalFeature | WithFeature | CatchFeature)); }
1422 bool hasCapturedVariables() const { return !!m_data->m_capturedVariables.size(); }
1423 size_t capturedVariableCount() const { return m_data->m_capturedVariables.size(); }
1424 bool captures(const Identifier& ident) { return m_data->m_capturedVariables.contains(ident.impl()); }
1425
1426 VarStack& varStack() { ASSERT(m_data); return m_data->m_varStack; }
1427 FunctionStack& functionStack() { ASSERT(m_data); return m_data->m_functionStack; }
1428
1429 int neededConstants()
1430 {
1431 ASSERT(m_data);
1432 // We may need 2 more constants than the count given by the parser,
1433 // because of the various uses of jsUndefined() and jsNull().
1434 return m_data->m_numConstants + 2;
1435 }
1436
1437 StatementNode* singleStatement() const;
1438
1439 void emitStatementsBytecode(BytecodeGenerator&, RegisterID* destination);
1440
1441 protected:
1442 void setSource(const SourceCode& source) { m_source = source; }
1443
1444 private:
1445 OwnPtr<ScopeNodeData> m_data;
1446 CodeFeatures m_features;
1447 SourceCode m_source;
1448 };
1449
1450 class ProgramNode : public ScopeNode {
1451 public:
1452 static const bool isFunctionNode = false;
1453 static PassRefPtr<ProgramNode> create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1454
1455 static const bool scopeIsFunction = false;
1456
1457 private:
1458 ProgramNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1459
1460 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1461 };
1462
1463 class EvalNode : public ScopeNode {
1464 public:
1465 static const bool isFunctionNode = false;
1466 static PassRefPtr<EvalNode> create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1467
1468 static const bool scopeIsFunction = false;
1469
1470 private:
1471 EvalNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1472
1473 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1474 };
1475
1476 class FunctionParameters : public Vector<Identifier>, public RefCounted<FunctionParameters> {
1477 WTF_MAKE_FAST_ALLOCATED;
1478 public:
1479 static PassRefPtr<FunctionParameters> create(ParameterNode* firstParameter) { return adoptRef(new FunctionParameters(firstParameter)); }
1480
1481 private:
1482 FunctionParameters(ParameterNode*);
1483 };
1484
1485 class FunctionBodyNode : public ScopeNode {
1486 public:
1487 static const bool isFunctionNode = true;
1488 static FunctionBodyNode* create(JSGlobalData*, bool isStrictMode);
1489 static PassRefPtr<FunctionBodyNode> create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1490
1491 FunctionParameters* parameters() const { return m_parameters.get(); }
1492 size_t parameterCount() const { return m_parameters->size(); }
1493
1494 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1495
1496 void finishParsing(const SourceCode&, ParameterNode*, const Identifier&);
1497 void finishParsing(PassRefPtr<FunctionParameters>, const Identifier&);
1498
1499 const Identifier& ident() { return m_ident; }
1500
1501 static const bool scopeIsFunction = true;
1502
1503 private:
1504 FunctionBodyNode(JSGlobalData*, bool inStrictContext);
1505 FunctionBodyNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1506
1507 Identifier m_ident;
1508 RefPtr<FunctionParameters> m_parameters;
1509 };
1510
1511 class FuncExprNode : public ExpressionNode {
1512 public:
1513 FuncExprNode(JSGlobalData*, const Identifier&, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter = 0);
1514
1515 FunctionBodyNode* body() { return m_body; }
1516
1517 private:
1518 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1519
1520 virtual bool isFuncExprNode() const { return true; }
1521
1522 FunctionBodyNode* m_body;
1523 };
1524
1525 class FuncDeclNode : public StatementNode {
1526 public:
1527 FuncDeclNode(JSGlobalData*, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0);
1528
1529 FunctionBodyNode* body() { return m_body; }
1530
1531 private:
1532 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1533
1534 FunctionBodyNode* m_body;
1535 };
1536
1537 class CaseClauseNode : public ParserArenaFreeable {
1538 public:
1539 CaseClauseNode(JSGlobalData*, ExpressionNode*, SourceElements* = 0);
1540
1541 ExpressionNode* expr() const { return m_expr; }
1542
1543 void emitBytecode(BytecodeGenerator&, RegisterID* destination);
1544
1545 private:
1546 ExpressionNode* m_expr;
1547 SourceElements* m_statements;
1548 };
1549
1550 class ClauseListNode : public ParserArenaFreeable {
1551 public:
1552 ClauseListNode(JSGlobalData*, CaseClauseNode*);
1553 ClauseListNode(JSGlobalData*, ClauseListNode*, CaseClauseNode*);
1554
1555 CaseClauseNode* getClause() const { return m_clause; }
1556 ClauseListNode* getNext() const { return m_next; }
1557
1558 private:
1559 CaseClauseNode* m_clause;
1560 ClauseListNode* m_next;
1561 };
1562
1563 class CaseBlockNode : public ParserArenaFreeable {
1564 public:
1565 CaseBlockNode(JSGlobalData*, ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2);
1566
1567 RegisterID* emitBytecodeForBlock(BytecodeGenerator&, RegisterID* input, RegisterID* destination);
1568
1569 private:
1570 SwitchInfo::SwitchType tryOptimizedSwitch(Vector<ExpressionNode*, 8>& literalVector, int32_t& min_num, int32_t& max_num);
1571 ClauseListNode* m_list1;
1572 CaseClauseNode* m_defaultClause;
1573 ClauseListNode* m_list2;
1574 };
1575
1576 class SwitchNode : public StatementNode {
1577 public:
1578 SwitchNode(JSGlobalData*, ExpressionNode*, CaseBlockNode*);
1579
1580 private:
1581 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1582
1583 ExpressionNode* m_expr;
1584 CaseBlockNode* m_block;
1585 };
1586
1587 struct ElementList {
1588 ElementNode* head;
1589 ElementNode* tail;
1590 };
1591
1592 struct PropertyList {
1593 PropertyListNode* head;
1594 PropertyListNode* tail;
1595 };
1596
1597 struct ArgumentList {
1598 ArgumentListNode* head;
1599 ArgumentListNode* tail;
1600 };
1601
1602 struct ConstDeclList {
1603 ConstDeclNode* head;
1604 ConstDeclNode* tail;
1605 };
1606
1607 struct ParameterList {
1608 ParameterNode* head;
1609 ParameterNode* tail;
1610 };
1611
1612 struct ClauseList {
1613 ClauseListNode* head;
1614 ClauseListNode* tail;
1615 };
1616
1617 } // namespace JSC
1618
1619 #endif // Nodes_h