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>
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.
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.
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.
32 #include "ParserArena.h"
33 #include "ResultType.h"
34 #include "SourceCode.h"
35 #include "SymbolTable.h"
36 #include <wtf/MathExtras.h>
40 class ArgumentListNode;
41 class BytecodeGenerator;
42 class FunctionBodyNode;
44 class PropertyListNode;
45 class ReadModifyResolveNode;
50 typedef unsigned CodeFeatures;
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;
64 const CodeFeatures AllFeatures = EvalFeature | ClosureFeature | AssignFeature | ArgumentsFeature | WithFeature | CatchFeature | ThisFeature | StrictModeFeature | ShadowsArgumentsFeature;
83 enum LogicalOperator {
88 typedef HashSet<RefPtr<StringImpl>, IdentifierRepHash> IdentifierSet;
90 namespace DeclarationStacks {
91 enum VarAttrs { IsConstant = 1, HasInitializer = 2 };
92 typedef Vector<std::pair<const Identifier*, unsigned> > VarStack;
93 typedef Vector<FunctionBodyNode*> FunctionStack;
97 enum SwitchType { SwitchNone, SwitchImmediate, SwitchCharacter, SwitchString };
98 uint32_t bytecodeOffset;
99 SwitchType switchType;
102 class ParserArenaFreeable {
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*);
109 class ParserArenaDeletable {
111 virtual ~ParserArenaDeletable() { }
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*);
118 class ParserArenaRefCounted : public RefCounted<ParserArenaRefCounted> {
120 ParserArenaRefCounted(JSGlobalData*);
123 virtual ~ParserArenaRefCounted()
125 ASSERT(deletionHasBegun());
129 class Node : public ParserArenaFreeable {
136 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* destination = 0) = 0;
138 int lineNo() const { return m_line; }
144 class ExpressionNode : public Node {
146 ExpressionNode(JSGlobalData*, ResultType = ResultType::unknownType());
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; }
164 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label*, Label*, bool) { ASSERT_NOT_REACHED(); }
166 virtual ExpressionNode* stripUnaryPlus() { return this; }
168 ResultType resultDescriptor() const { return m_resultType; }
171 ResultType m_resultType;
174 class StatementNode : public Node {
176 StatementNode(JSGlobalData*);
179 void setLoc(int firstLine, int lastLine);
180 int firstLine() const { return lineNo(); }
181 int lastLine() const { return m_lastLine; }
183 virtual bool isEmptyStatement() const { return false; }
184 virtual bool isReturnNode() const { return false; }
185 virtual bool isExprStatement() const { return false; }
187 virtual bool isBlock() const { return false; }
193 class NullNode : public ExpressionNode {
195 NullNode(JSGlobalData*);
198 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
200 virtual bool isNull() const { return true; }
203 class BooleanNode : public ExpressionNode {
205 BooleanNode(JSGlobalData*, bool value);
208 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
210 virtual bool isPure(BytecodeGenerator&) const { return true; }
215 class NumberNode : public ExpressionNode {
217 NumberNode(JSGlobalData*, double value);
219 double value() const { return m_value; }
220 void setValue(double value) { m_value = value; }
223 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
225 virtual bool isNumber() const { return true; }
226 virtual bool isPure(BytecodeGenerator&) const { return true; }
231 class StringNode : public ExpressionNode {
233 StringNode(JSGlobalData*, const Identifier&);
235 const Identifier& value() { return m_value; }
238 virtual bool isPure(BytecodeGenerator&) const { return true; }
240 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
242 virtual bool isString() const { return true; }
244 const Identifier& m_value;
247 class ThrowableExpressionData {
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))
256 ThrowableExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset)
258 , m_startOffset(startOffset)
259 , m_endOffset(endOffset)
263 void setExceptionSourceCode(unsigned divot, unsigned startOffset, unsigned endOffset)
266 m_startOffset = startOffset;
267 m_endOffset = endOffset;
270 uint32_t divot() const { return m_divot; }
271 uint16_t startOffset() const { return m_startOffset; }
272 uint16_t endOffset() const { return m_endOffset; }
275 RegisterID* emitThrowReferenceError(BytecodeGenerator&, const UString& message);
279 uint16_t m_startOffset;
280 uint16_t m_endOffset;
283 class ThrowableSubExpressionData : public ThrowableExpressionData {
285 ThrowableSubExpressionData()
286 : m_subexpressionDivotOffset(0)
287 , m_subexpressionEndOffset(0)
291 ThrowableSubExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset)
292 : ThrowableExpressionData(divot, startOffset, endOffset)
293 , m_subexpressionDivotOffset(0)
294 , m_subexpressionEndOffset(0)
298 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset)
300 ASSERT(subexpressionDivot <= divot());
301 if ((divot() - subexpressionDivot) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot
303 m_subexpressionDivotOffset = divot() - subexpressionDivot;
304 m_subexpressionEndOffset = subexpressionOffset;
308 uint16_t m_subexpressionDivotOffset;
309 uint16_t m_subexpressionEndOffset;
312 class ThrowablePrefixedSubExpressionData : public ThrowableExpressionData {
314 ThrowablePrefixedSubExpressionData()
315 : m_subexpressionDivotOffset(0)
316 , m_subexpressionStartOffset(0)
320 ThrowablePrefixedSubExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset)
321 : ThrowableExpressionData(divot, startOffset, endOffset)
322 , m_subexpressionDivotOffset(0)
323 , m_subexpressionStartOffset(0)
327 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset)
329 ASSERT(subexpressionDivot >= divot());
330 if ((subexpressionDivot - divot()) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot
332 m_subexpressionDivotOffset = subexpressionDivot - divot();
333 m_subexpressionStartOffset = subexpressionOffset;
337 uint16_t m_subexpressionDivotOffset;
338 uint16_t m_subexpressionStartOffset;
341 class RegExpNode : public ExpressionNode, public ThrowableExpressionData {
343 RegExpNode(JSGlobalData*, const Identifier& pattern, const Identifier& flags);
346 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
348 const Identifier& m_pattern;
349 const Identifier& m_flags;
352 class ThisNode : public ExpressionNode {
354 ThisNode(JSGlobalData*);
357 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
360 class ResolveNode : public ExpressionNode {
362 ResolveNode(JSGlobalData*, const Identifier&, int startOffset);
364 const Identifier& identifier() const { return m_ident; }
367 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
369 virtual bool isPure(BytecodeGenerator&) const ;
370 virtual bool isLocation() const { return true; }
371 virtual bool isResolveNode() const { return true; }
373 const Identifier& m_ident;
374 int32_t m_startOffset;
377 class ElementNode : public ParserArenaFreeable {
379 ElementNode(JSGlobalData*, int elision, ExpressionNode*);
380 ElementNode(JSGlobalData*, ElementNode*, int elision, ExpressionNode*);
382 int elision() const { return m_elision; }
383 ExpressionNode* value() { return m_node; }
384 ElementNode* next() { return m_next; }
389 ExpressionNode* m_node;
392 class ArrayNode : public ExpressionNode {
394 ArrayNode(JSGlobalData*, int elision);
395 ArrayNode(JSGlobalData*, ElementNode*);
396 ArrayNode(JSGlobalData*, int elision, ElementNode*);
398 ArgumentListNode* toArgumentList(JSGlobalData*) const;
401 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
403 virtual bool isSimpleArray() const ;
405 ElementNode* m_element;
410 class PropertyNode : public ParserArenaFreeable {
412 enum Type { Constant = 1, Getter = 2, Setter = 4 };
414 PropertyNode(JSGlobalData*, const Identifier& name, ExpressionNode* value, Type);
415 PropertyNode(JSGlobalData*, double name, ExpressionNode* value, Type);
417 const Identifier& name() const { return m_name; }
418 Type type() const { return m_type; }
421 friend class PropertyListNode;
422 const Identifier& m_name;
423 ExpressionNode* m_assign;
427 class PropertyListNode : public Node {
429 PropertyListNode(JSGlobalData*, PropertyNode*);
430 PropertyListNode(JSGlobalData*, PropertyNode*, PropertyListNode*);
432 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
435 PropertyNode* m_node;
436 PropertyListNode* m_next;
439 class ObjectLiteralNode : public ExpressionNode {
441 ObjectLiteralNode(JSGlobalData*);
442 ObjectLiteralNode(JSGlobalData*, PropertyListNode*);
445 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
447 PropertyListNode* m_list;
450 class BracketAccessorNode : public ExpressionNode, public ThrowableExpressionData {
452 BracketAccessorNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments);
454 ExpressionNode* base() const { return m_base; }
455 ExpressionNode* subscript() const { return m_subscript; }
458 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
460 virtual bool isLocation() const { return true; }
461 virtual bool isBracketAccessorNode() const { return true; }
463 ExpressionNode* m_base;
464 ExpressionNode* m_subscript;
465 bool m_subscriptHasAssignments;
468 class DotAccessorNode : public ExpressionNode, public ThrowableExpressionData {
470 DotAccessorNode(JSGlobalData*, ExpressionNode* base, const Identifier&);
472 ExpressionNode* base() const { return m_base; }
473 const Identifier& identifier() const { return m_ident; }
476 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
478 virtual bool isLocation() const { return true; }
479 virtual bool isDotAccessorNode() const { return true; }
481 ExpressionNode* m_base;
482 const Identifier& m_ident;
485 class ArgumentListNode : public Node {
487 ArgumentListNode(JSGlobalData*, ExpressionNode*);
488 ArgumentListNode(JSGlobalData*, ArgumentListNode*, ExpressionNode*);
490 ArgumentListNode* m_next;
491 ExpressionNode* m_expr;
494 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
497 class ArgumentsNode : public ParserArenaFreeable {
499 ArgumentsNode(JSGlobalData*);
500 ArgumentsNode(JSGlobalData*, ArgumentListNode*);
502 ArgumentListNode* m_listNode;
505 class NewExprNode : public ExpressionNode, public ThrowableExpressionData {
507 NewExprNode(JSGlobalData*, ExpressionNode*);
508 NewExprNode(JSGlobalData*, ExpressionNode*, ArgumentsNode*);
511 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
513 ExpressionNode* m_expr;
514 ArgumentsNode* m_args;
517 class EvalFunctionCallNode : public ExpressionNode, public ThrowableExpressionData {
519 EvalFunctionCallNode(JSGlobalData*, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
522 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
524 ArgumentsNode* m_args;
527 class FunctionCallValueNode : public ExpressionNode, public ThrowableExpressionData {
529 FunctionCallValueNode(JSGlobalData*, ExpressionNode*, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
532 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
534 ExpressionNode* m_expr;
535 ArgumentsNode* m_args;
538 class FunctionCallResolveNode : public ExpressionNode, public ThrowableExpressionData {
540 FunctionCallResolveNode(JSGlobalData*, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
543 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
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
551 class FunctionCallBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
553 FunctionCallBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
556 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
558 ExpressionNode* m_base;
559 ExpressionNode* m_subscript;
560 ArgumentsNode* m_args;
563 class FunctionCallDotNode : public ExpressionNode, public ThrowableSubExpressionData {
565 FunctionCallDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
568 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
571 ExpressionNode* m_base;
572 const Identifier& m_ident;
573 ArgumentsNode* m_args;
576 class CallFunctionCallDotNode : public FunctionCallDotNode {
578 CallFunctionCallDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
581 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
584 class ApplyFunctionCallDotNode : public FunctionCallDotNode {
586 ApplyFunctionCallDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
589 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
592 class PrePostResolveNode : public ExpressionNode, public ThrowableExpressionData {
594 PrePostResolveNode(JSGlobalData*, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
597 const Identifier& m_ident;
600 class PostfixResolveNode : public PrePostResolveNode {
602 PostfixResolveNode(JSGlobalData*, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
605 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
610 class PostfixBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
612 PostfixBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
615 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
617 ExpressionNode* m_base;
618 ExpressionNode* m_subscript;
622 class PostfixDotNode : public ExpressionNode, public ThrowableSubExpressionData {
624 PostfixDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
627 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
629 ExpressionNode* m_base;
630 const Identifier& m_ident;
634 class PostfixErrorNode : public ExpressionNode, public ThrowableSubExpressionData {
636 PostfixErrorNode(JSGlobalData*, ExpressionNode*, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
639 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
641 ExpressionNode* m_expr;
645 class DeleteResolveNode : public ExpressionNode, public ThrowableExpressionData {
647 DeleteResolveNode(JSGlobalData*, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
650 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
652 const Identifier& m_ident;
655 class DeleteBracketNode : public ExpressionNode, public ThrowableExpressionData {
657 DeleteBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, unsigned divot, unsigned startOffset, unsigned endOffset);
660 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
662 ExpressionNode* m_base;
663 ExpressionNode* m_subscript;
666 class DeleteDotNode : public ExpressionNode, public ThrowableExpressionData {
668 DeleteDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
671 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
673 ExpressionNode* m_base;
674 const Identifier& m_ident;
677 class DeleteValueNode : public ExpressionNode {
679 DeleteValueNode(JSGlobalData*, ExpressionNode*);
682 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
684 ExpressionNode* m_expr;
687 class VoidNode : public ExpressionNode {
689 VoidNode(JSGlobalData*, ExpressionNode*);
692 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
694 ExpressionNode* m_expr;
697 class TypeOfResolveNode : public ExpressionNode {
699 TypeOfResolveNode(JSGlobalData*, const Identifier&);
701 const Identifier& identifier() const { return m_ident; }
704 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
706 const Identifier& m_ident;
709 class TypeOfValueNode : public ExpressionNode {
711 TypeOfValueNode(JSGlobalData*, ExpressionNode*);
714 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
716 ExpressionNode* m_expr;
719 class PrefixResolveNode : public PrePostResolveNode {
721 PrefixResolveNode(JSGlobalData*, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
724 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
729 class PrefixBracketNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
731 PrefixBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
734 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
736 ExpressionNode* m_base;
737 ExpressionNode* m_subscript;
741 class PrefixDotNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
743 PrefixDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
746 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
748 ExpressionNode* m_base;
749 const Identifier& m_ident;
753 class PrefixErrorNode : public ExpressionNode, public ThrowableExpressionData {
755 PrefixErrorNode(JSGlobalData*, ExpressionNode*, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
758 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
760 ExpressionNode* m_expr;
764 class UnaryOpNode : public ExpressionNode {
766 UnaryOpNode(JSGlobalData*, ResultType, ExpressionNode*, OpcodeID);
769 ExpressionNode* expr() { return m_expr; }
770 const ExpressionNode* expr() const { return m_expr; }
773 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
775 OpcodeID opcodeID() const { return m_opcodeID; }
777 ExpressionNode* m_expr;
781 class UnaryPlusNode : public UnaryOpNode {
783 UnaryPlusNode(JSGlobalData*, ExpressionNode*);
786 virtual ExpressionNode* stripUnaryPlus() { return expr(); }
789 class NegateNode : public UnaryOpNode {
791 NegateNode(JSGlobalData*, ExpressionNode*);
794 class BitwiseNotNode : public UnaryOpNode {
796 BitwiseNotNode(JSGlobalData*, ExpressionNode*);
799 class LogicalNotNode : public UnaryOpNode {
801 LogicalNotNode(JSGlobalData*, ExpressionNode*);
803 void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue);
804 virtual bool hasConditionContextCodegen() const { return expr()->hasConditionContextCodegen(); }
807 class BinaryOpNode : public ExpressionNode {
809 BinaryOpNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
810 BinaryOpNode(JSGlobalData*, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
812 RegisterID* emitStrcat(BytecodeGenerator& generator, RegisterID* destination, RegisterID* lhs = 0, ReadModifyResolveNode* emitExpressionInfoForMe = 0);
814 ExpressionNode* lhs() { return m_expr1; };
815 ExpressionNode* rhs() { return m_expr2; };
818 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
821 OpcodeID opcodeID() const { return m_opcodeID; }
824 ExpressionNode* m_expr1;
825 ExpressionNode* m_expr2;
829 bool m_rightHasAssignments;
832 class MultNode : public BinaryOpNode {
834 MultNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
837 class DivNode : public BinaryOpNode {
839 DivNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
842 class ModNode : public BinaryOpNode {
844 ModNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
847 class AddNode : public BinaryOpNode {
849 AddNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
851 virtual bool isAdd() const { return true; }
854 class SubNode : public BinaryOpNode {
856 SubNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
858 virtual bool isSubtract() const { return true; }
861 class LeftShiftNode : public BinaryOpNode {
863 LeftShiftNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
866 class RightShiftNode : public BinaryOpNode {
868 RightShiftNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
871 class UnsignedRightShiftNode : public BinaryOpNode {
873 UnsignedRightShiftNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
876 class LessNode : public BinaryOpNode {
878 LessNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
881 class GreaterNode : public BinaryOpNode {
883 GreaterNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
886 class LessEqNode : public BinaryOpNode {
888 LessEqNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
891 class GreaterEqNode : public BinaryOpNode {
893 GreaterEqNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
896 class ThrowableBinaryOpNode : public BinaryOpNode, public ThrowableExpressionData {
898 ThrowableBinaryOpNode(JSGlobalData*, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
899 ThrowableBinaryOpNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
902 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
905 class InstanceOfNode : public ThrowableBinaryOpNode {
907 InstanceOfNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
910 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
913 class InNode : public ThrowableBinaryOpNode {
915 InNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
918 class EqualNode : public BinaryOpNode {
920 EqualNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
923 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
926 class NotEqualNode : public BinaryOpNode {
928 NotEqualNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
931 class StrictEqualNode : public BinaryOpNode {
933 StrictEqualNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
936 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
939 class NotStrictEqualNode : public BinaryOpNode {
941 NotStrictEqualNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
944 class BitAndNode : public BinaryOpNode {
946 BitAndNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
949 class BitOrNode : public BinaryOpNode {
951 BitOrNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
954 class BitXOrNode : public BinaryOpNode {
956 BitXOrNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
959 // m_expr1 && m_expr2, m_expr1 || m_expr2
960 class LogicalOpNode : public ExpressionNode {
962 LogicalOpNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator);
965 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
966 void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue);
967 virtual bool hasConditionContextCodegen() const { return true; }
969 ExpressionNode* m_expr1;
970 ExpressionNode* m_expr2;
971 LogicalOperator m_operator;
974 // The ternary operator, "m_logical ? m_expr1 : m_expr2"
975 class ConditionalNode : public ExpressionNode {
977 ConditionalNode(JSGlobalData*, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2);
980 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
982 ExpressionNode* m_logical;
983 ExpressionNode* m_expr1;
984 ExpressionNode* m_expr2;
987 class ReadModifyResolveNode : public ExpressionNode, public ThrowableExpressionData {
989 ReadModifyResolveNode(JSGlobalData*, const Identifier&, Operator, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
992 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
994 const Identifier& m_ident;
995 ExpressionNode* m_right;
996 size_t m_index; // Used by ReadModifyLocalVarNode.
998 bool m_rightHasAssignments;
1001 class AssignResolveNode : public ExpressionNode, public ThrowableExpressionData {
1003 AssignResolveNode(JSGlobalData*, const Identifier&, ExpressionNode* right, bool rightHasAssignments);
1006 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1008 const Identifier& m_ident;
1009 ExpressionNode* m_right;
1010 size_t m_index; // Used by ReadModifyLocalVarNode.
1011 bool m_rightHasAssignments;
1014 class ReadModifyBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
1016 ReadModifyBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, Operator, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1019 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1021 ExpressionNode* m_base;
1022 ExpressionNode* m_subscript;
1023 ExpressionNode* m_right;
1024 Operator m_operator : 30;
1025 bool m_subscriptHasAssignments : 1;
1026 bool m_rightHasAssignments : 1;
1029 class AssignBracketNode : public ExpressionNode, public ThrowableExpressionData {
1031 AssignBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1034 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1036 ExpressionNode* m_base;
1037 ExpressionNode* m_subscript;
1038 ExpressionNode* m_right;
1039 bool m_subscriptHasAssignments : 1;
1040 bool m_rightHasAssignments : 1;
1043 class AssignDotNode : public ExpressionNode, public ThrowableExpressionData {
1045 AssignDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1048 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1050 ExpressionNode* m_base;
1051 const Identifier& m_ident;
1052 ExpressionNode* m_right;
1053 bool m_rightHasAssignments;
1056 class ReadModifyDotNode : public ExpressionNode, public ThrowableSubExpressionData {
1058 ReadModifyDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, Operator, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1061 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1063 ExpressionNode* m_base;
1064 const Identifier& m_ident;
1065 ExpressionNode* m_right;
1066 Operator m_operator : 31;
1067 bool m_rightHasAssignments : 1;
1070 class AssignErrorNode : public ExpressionNode, public ThrowableExpressionData {
1072 AssignErrorNode(JSGlobalData*, ExpressionNode* left, Operator, ExpressionNode* right, unsigned divot, unsigned startOffset, unsigned endOffset);
1075 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1077 ExpressionNode* m_left;
1078 Operator m_operator;
1079 ExpressionNode* m_right;
1082 typedef Vector<ExpressionNode*, 8> ExpressionVector;
1084 class CommaNode : public ExpressionNode, public ParserArenaDeletable {
1086 CommaNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2);
1088 using ParserArenaDeletable::operator new;
1090 void append(ExpressionNode* expr) { m_expressions.append(expr); }
1093 virtual bool isCommaNode() const { return true; }
1094 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1096 ExpressionVector m_expressions;
1099 class ConstDeclNode : public ExpressionNode {
1101 ConstDeclNode(JSGlobalData*, const Identifier&, ExpressionNode*);
1103 bool hasInitializer() const { return m_init; }
1104 const Identifier& ident() { return m_ident; }
1107 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1108 virtual RegisterID* emitCodeSingle(BytecodeGenerator&);
1110 const Identifier& m_ident;
1113 ConstDeclNode* m_next;
1116 ExpressionNode* m_init;
1119 class ConstStatementNode : public StatementNode {
1121 ConstStatementNode(JSGlobalData*, ConstDeclNode* next);
1124 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1126 ConstDeclNode* m_next;
1129 class SourceElements : public ParserArenaDeletable {
1131 SourceElements(JSGlobalData*);
1133 void append(StatementNode*);
1135 StatementNode* singleStatement() const;
1136 StatementNode* lastStatement() const;
1138 void emitBytecode(BytecodeGenerator&, RegisterID* destination);
1141 Vector<StatementNode*> m_statements;
1144 class BlockNode : public StatementNode {
1146 BlockNode(JSGlobalData*, SourceElements* = 0);
1148 StatementNode* singleStatement() const;
1149 StatementNode* lastStatement() const;
1152 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1154 virtual bool isBlock() const { return true; }
1156 SourceElements* m_statements;
1159 class EmptyStatementNode : public StatementNode {
1161 EmptyStatementNode(JSGlobalData*);
1164 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1166 virtual bool isEmptyStatement() const { return true; }
1169 class DebuggerStatementNode : public StatementNode {
1171 DebuggerStatementNode(JSGlobalData*);
1174 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1177 class ExprStatementNode : public StatementNode {
1179 ExprStatementNode(JSGlobalData*, ExpressionNode*);
1181 ExpressionNode* expr() const { return m_expr; }
1184 virtual bool isExprStatement() const { return true; }
1186 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1188 ExpressionNode* m_expr;
1191 class VarStatementNode : public StatementNode {
1193 VarStatementNode(JSGlobalData*, ExpressionNode*);
1196 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1198 ExpressionNode* m_expr;
1201 class IfNode : public StatementNode {
1203 IfNode(JSGlobalData*, ExpressionNode* condition, StatementNode* ifBlock);
1206 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1208 ExpressionNode* m_condition;
1209 StatementNode* m_ifBlock;
1212 class IfElseNode : public IfNode {
1214 IfElseNode(JSGlobalData*, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock);
1217 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1219 StatementNode* m_elseBlock;
1222 class DoWhileNode : public StatementNode {
1224 DoWhileNode(JSGlobalData*, StatementNode* statement, ExpressionNode*);
1227 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1229 StatementNode* m_statement;
1230 ExpressionNode* m_expr;
1233 class WhileNode : public StatementNode {
1235 WhileNode(JSGlobalData*, ExpressionNode*, StatementNode* statement);
1238 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1240 ExpressionNode* m_expr;
1241 StatementNode* m_statement;
1244 class ForNode : public StatementNode {
1246 ForNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement, bool expr1WasVarDecl);
1249 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1251 ExpressionNode* m_expr1;
1252 ExpressionNode* m_expr2;
1253 ExpressionNode* m_expr3;
1254 StatementNode* m_statement;
1255 bool m_expr1WasVarDecl;
1258 class ForInNode : public StatementNode, public ThrowableExpressionData {
1260 ForInNode(JSGlobalData*, ExpressionNode*, ExpressionNode*, StatementNode*);
1261 ForInNode(JSGlobalData*, const Identifier&, ExpressionNode*, ExpressionNode*, StatementNode*, int divot, int startOffset, int endOffset);
1264 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1266 const Identifier& m_ident;
1267 ExpressionNode* m_init;
1268 ExpressionNode* m_lexpr;
1269 ExpressionNode* m_expr;
1270 StatementNode* m_statement;
1271 bool m_identIsVarDecl;
1274 class ContinueNode : public StatementNode, public ThrowableExpressionData {
1276 ContinueNode(JSGlobalData*);
1277 ContinueNode(JSGlobalData*, const Identifier&);
1280 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1282 const Identifier& m_ident;
1285 class BreakNode : public StatementNode, public ThrowableExpressionData {
1287 BreakNode(JSGlobalData*);
1288 BreakNode(JSGlobalData*, const Identifier&);
1291 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1293 const Identifier& m_ident;
1296 class ReturnNode : public StatementNode, public ThrowableExpressionData {
1298 ReturnNode(JSGlobalData*, ExpressionNode* value);
1300 ExpressionNode* value() { return m_value; }
1303 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1305 virtual bool isReturnNode() const { return true; }
1307 ExpressionNode* m_value;
1310 class WithNode : public StatementNode {
1312 WithNode(JSGlobalData*, ExpressionNode*, StatementNode*, uint32_t divot, uint32_t expressionLength);
1315 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1317 ExpressionNode* m_expr;
1318 StatementNode* m_statement;
1320 uint32_t m_expressionLength;
1323 class LabelNode : public StatementNode, public ThrowableExpressionData {
1325 LabelNode(JSGlobalData*, const Identifier& name, StatementNode*);
1328 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1330 const Identifier& m_name;
1331 StatementNode* m_statement;
1334 class ThrowNode : public StatementNode, public ThrowableExpressionData {
1336 ThrowNode(JSGlobalData*, ExpressionNode*);
1339 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1341 ExpressionNode* m_expr;
1344 class TryNode : public StatementNode {
1346 TryNode(JSGlobalData*, StatementNode* tryBlock, const Identifier& exceptionIdent, bool catchHasEval, StatementNode* catchBlock, StatementNode* finallyBlock);
1349 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1351 StatementNode* m_tryBlock;
1352 const Identifier& m_exceptionIdent;
1353 StatementNode* m_catchBlock;
1354 StatementNode* m_finallyBlock;
1355 bool m_catchHasEval;
1358 class ParameterNode : public ParserArenaFreeable {
1360 ParameterNode(JSGlobalData*, const Identifier&);
1361 ParameterNode(JSGlobalData*, ParameterNode*, const Identifier&);
1363 const Identifier& ident() const { return m_ident; }
1364 ParameterNode* nextParam() const { return m_next; }
1367 const Identifier& m_ident;
1368 ParameterNode* m_next;
1371 struct ScopeNodeData {
1372 WTF_MAKE_FAST_ALLOCATED;
1374 typedef DeclarationStacks::VarStack VarStack;
1375 typedef DeclarationStacks::FunctionStack FunctionStack;
1377 ScopeNodeData(ParserArena&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, int numConstants);
1379 ParserArena m_arena;
1380 VarStack m_varStack;
1381 FunctionStack m_functionStack;
1383 SourceElements* m_statements;
1384 IdentifierSet m_capturedVariables;
1387 class ScopeNode : public StatementNode, public ParserArenaRefCounted {
1389 typedef DeclarationStacks::VarStack VarStack;
1390 typedef DeclarationStacks::FunctionStack FunctionStack;
1392 ScopeNode(JSGlobalData*, bool inStrictContext);
1393 ScopeNode(JSGlobalData*, const SourceCode&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, CodeFeatures, int numConstants);
1395 using ParserArenaRefCounted::operator new;
1397 ScopeNodeData* data() const { return m_data.get(); }
1398 void destroyData() { m_data.clear(); }
1400 const SourceCode& source() const { return m_source; }
1401 const UString& sourceURL() const { return m_source.provider()->url(); }
1402 intptr_t sourceID() const { return m_source.provider()->asID(); }
1404 void setFeatures(CodeFeatures features) { m_features = features; }
1405 CodeFeatures features() { return m_features; }
1407 bool usesEval() const { return m_features & EvalFeature; }
1408 bool usesArguments() const { return (m_features & ArgumentsFeature) && !(m_features & ShadowsArgumentsFeature); }
1409 bool isStrictMode() const { return m_features & StrictModeFeature; }
1410 void setUsesArguments() { m_features |= ArgumentsFeature; }
1411 bool usesThis() const { return m_features & ThisFeature; }
1412 bool needsActivationForMoreThanVariables() const { ASSERT(m_data); return m_features & (EvalFeature | WithFeature | CatchFeature); }
1413 bool needsActivation() const { ASSERT(m_data); return (hasCapturedVariables()) || (m_features & (EvalFeature | WithFeature | CatchFeature)); }
1414 bool hasCapturedVariables() const { return !!m_data->m_capturedVariables.size(); }
1415 size_t capturedVariableCount() const { return m_data->m_capturedVariables.size(); }
1416 bool captures(const Identifier& ident) { return m_data->m_capturedVariables.contains(ident.impl()); }
1418 VarStack& varStack() { ASSERT(m_data); return m_data->m_varStack; }
1419 FunctionStack& functionStack() { ASSERT(m_data); return m_data->m_functionStack; }
1421 int neededConstants()
1424 // We may need 2 more constants than the count given by the parser,
1425 // because of the various uses of jsUndefined() and jsNull().
1426 return m_data->m_numConstants + 2;
1429 StatementNode* singleStatement() const;
1431 void emitStatementsBytecode(BytecodeGenerator&, RegisterID* destination);
1434 void setSource(const SourceCode& source) { m_source = source; }
1437 OwnPtr<ScopeNodeData> m_data;
1438 CodeFeatures m_features;
1439 SourceCode m_source;
1442 class ProgramNode : public ScopeNode {
1444 static const bool isFunctionNode = false;
1445 static PassRefPtr<ProgramNode> create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1447 static const bool scopeIsFunction = false;
1450 ProgramNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1452 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1455 class EvalNode : public ScopeNode {
1457 static const bool isFunctionNode = false;
1458 static PassRefPtr<EvalNode> create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1460 static const bool scopeIsFunction = false;
1463 EvalNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1465 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1468 class FunctionParameters : public Vector<Identifier>, public RefCounted<FunctionParameters> {
1469 WTF_MAKE_FAST_ALLOCATED;
1471 static PassRefPtr<FunctionParameters> create(ParameterNode* firstParameter) { return adoptRef(new FunctionParameters(firstParameter)); }
1474 FunctionParameters(ParameterNode*);
1477 class FunctionBodyNode : public ScopeNode {
1479 static const bool isFunctionNode = true;
1480 static FunctionBodyNode* create(JSGlobalData*, bool isStrictMode);
1481 static PassRefPtr<FunctionBodyNode> create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1483 FunctionParameters* parameters() const { return m_parameters.get(); }
1484 size_t parameterCount() const { return m_parameters->size(); }
1486 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1488 void finishParsing(const SourceCode&, ParameterNode*, const Identifier&);
1489 void finishParsing(PassRefPtr<FunctionParameters>, const Identifier&);
1491 const Identifier& ident() { return m_ident; }
1493 static const bool scopeIsFunction = true;
1496 FunctionBodyNode(JSGlobalData*, bool inStrictContext);
1497 FunctionBodyNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1500 RefPtr<FunctionParameters> m_parameters;
1503 class FuncExprNode : public ExpressionNode {
1505 FuncExprNode(JSGlobalData*, const Identifier&, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter = 0);
1507 FunctionBodyNode* body() { return m_body; }
1510 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1512 virtual bool isFuncExprNode() const { return true; }
1514 FunctionBodyNode* m_body;
1517 class FuncDeclNode : public StatementNode {
1519 FuncDeclNode(JSGlobalData*, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0);
1521 FunctionBodyNode* body() { return m_body; }
1524 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1526 FunctionBodyNode* m_body;
1529 class CaseClauseNode : public ParserArenaFreeable {
1531 CaseClauseNode(JSGlobalData*, ExpressionNode*, SourceElements* = 0);
1533 ExpressionNode* expr() const { return m_expr; }
1535 void emitBytecode(BytecodeGenerator&, RegisterID* destination);
1538 ExpressionNode* m_expr;
1539 SourceElements* m_statements;
1542 class ClauseListNode : public ParserArenaFreeable {
1544 ClauseListNode(JSGlobalData*, CaseClauseNode*);
1545 ClauseListNode(JSGlobalData*, ClauseListNode*, CaseClauseNode*);
1547 CaseClauseNode* getClause() const { return m_clause; }
1548 ClauseListNode* getNext() const { return m_next; }
1551 CaseClauseNode* m_clause;
1552 ClauseListNode* m_next;
1555 class CaseBlockNode : public ParserArenaFreeable {
1557 CaseBlockNode(JSGlobalData*, ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2);
1559 RegisterID* emitBytecodeForBlock(BytecodeGenerator&, RegisterID* input, RegisterID* destination);
1562 SwitchInfo::SwitchType tryOptimizedSwitch(Vector<ExpressionNode*, 8>& literalVector, int32_t& min_num, int32_t& max_num);
1563 ClauseListNode* m_list1;
1564 CaseClauseNode* m_defaultClause;
1565 ClauseListNode* m_list2;
1568 class SwitchNode : public StatementNode {
1570 SwitchNode(JSGlobalData*, ExpressionNode*, CaseBlockNode*);
1573 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1575 ExpressionNode* m_expr;
1576 CaseBlockNode* m_block;
1579 struct ElementList {
1584 struct PropertyList {
1585 PropertyListNode* head;
1586 PropertyListNode* tail;
1589 struct ArgumentList {
1590 ArgumentListNode* head;
1591 ArgumentListNode* tail;
1594 struct ConstDeclList {
1595 ConstDeclNode* head;
1596 ConstDeclNode* tail;
1599 struct ParameterList {
1600 ParameterNode* head;
1601 ParameterNode* tail;
1605 ClauseListNode* head;
1606 ClauseListNode* tail;