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 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 "LabelStack.h"
34 #include "RegisterID.h"
35 #include "ResultType.h"
36 #include "SourceRange.h"
37 #include "SymbolTable.h"
39 #include <wtf/ListRefPtr.h>
40 #include <wtf/MathExtras.h>
41 #include <wtf/OwnPtr.h>
42 #include <wtf/UnusedParam.h>
43 #include <wtf/Vector.h>
45 #if PLATFORM(X86) && COMPILER(GCC)
46 #define JSC_FAST_CALL __attribute__((regparm(3)))
59 class ProgramCodeBlock;
60 class PropertyListNode;
63 typedef unsigned int CodeFeatures;
65 const CodeFeatures NoFeatures = 0;
66 const CodeFeatures EvalFeature = 1 << 0;
67 const CodeFeatures ClosureFeature = 1 << 1;
68 const CodeFeatures AssignFeature = 1 << 2;
69 const CodeFeatures ArgumentsFeature = 1 << 3;
70 const CodeFeatures WithFeature = 1 << 4;
71 const CodeFeatures CatchFeature = 1 << 5;
72 const CodeFeatures ThisFeature = 1 << 6;
73 const CodeFeatures AllFeatures = EvalFeature | ClosureFeature | AssignFeature | ArgumentsFeature | WithFeature | CatchFeature | ThisFeature;
92 enum LogicalOperator {
119 struct DeclarationStacks {
120 typedef Vector<Node*, 16> NodeStack;
121 enum { IsConstant = 1, HasInitializer = 2 } VarAttrs;
122 typedef Vector<std::pair<Identifier, unsigned>, 16> VarStack;
123 typedef Vector<RefPtr<FuncDeclNode>, 16> FunctionStack;
125 DeclarationStacks(ExecState* e, NodeStack& n, VarStack& v, FunctionStack& f)
134 NodeStack& nodeStack;
136 FunctionStack& functionStack;
140 enum SwitchType { SwitchNone, SwitchImmediate, SwitchCharacter, SwitchString };
141 uint32_t opcodeOffset;
142 SwitchType switchType;
145 class ParserRefCounted : Noncopyable {
147 ParserRefCounted(JSGlobalData*) JSC_FAST_CALL;
149 JSGlobalData* m_globalData;
152 void ref() JSC_FAST_CALL;
153 void deref() JSC_FAST_CALL;
154 bool hasOneRef() JSC_FAST_CALL;
156 static void deleteNewObjects(JSGlobalData*) JSC_FAST_CALL;
158 virtual ~ParserRefCounted();
161 class Node : public ParserRefCounted {
163 typedef DeclarationStacks::NodeStack NodeStack;
164 typedef DeclarationStacks::VarStack VarStack;
165 typedef DeclarationStacks::FunctionStack FunctionStack;
167 Node(JSGlobalData*) JSC_FAST_CALL;
170 Return value: The register holding the production's value.
171 dst: An optional parameter specifying the most efficient
172 destination at which to store the production's value.
173 The callee must honor dst.
175 dst provides for a crude form of copy propagation. For example,
188 because the assignment node, "x =", passes r[x] as dst to the number
191 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* dst = 0) JSC_FAST_CALL
193 ASSERT_WITH_MESSAGE(0, "Don't know how to generate code for:\n%s\n", toString().ascii());
196 } // FIXME: Make this pure virtual.
198 UString toString() const JSC_FAST_CALL;
199 int lineNo() const { return m_line; }
201 virtual bool isReturnNode() const JSC_FAST_CALL { return false; }
204 virtual void streamTo(SourceStream&) const JSC_FAST_CALL = 0;
205 virtual Precedence precedence() const = 0;
206 virtual bool needsParensIfLeftmost() const { return false; }
212 class ExpressionNode : public Node {
214 ExpressionNode(JSGlobalData* globalData, ResultType resultDesc = ResultType::unknown()) JSC_FAST_CALL
216 , m_resultDesc(resultDesc)
220 virtual bool isNumber() const JSC_FAST_CALL { return false; }
221 virtual bool isString() const JSC_FAST_CALL { return false; }
222 virtual bool isNull() const JSC_FAST_CALL { return false; }
223 virtual bool isPure(CodeGenerator&) const JSC_FAST_CALL { return false; }
224 virtual bool isLocation() const JSC_FAST_CALL { return false; }
225 virtual bool isResolveNode() const JSC_FAST_CALL { return false; }
226 virtual bool isBracketAccessorNode() const JSC_FAST_CALL { return false; }
227 virtual bool isDotAccessorNode() const JSC_FAST_CALL { return false; }
229 ResultType resultDescriptor() const JSC_FAST_CALL { return m_resultDesc; }
231 // This needs to be in public in order to compile using GCC 3.x
232 typedef enum { EvalOperator, FunctionCall } CallerType;
235 ResultType m_resultDesc;
238 class StatementNode : public Node {
240 StatementNode(JSGlobalData*) JSC_FAST_CALL;
241 void setLoc(int line0, int line1) JSC_FAST_CALL;
242 int firstLine() const JSC_FAST_CALL { return lineNo(); }
243 int lastLine() const JSC_FAST_CALL { return m_lastLine; }
245 virtual void pushLabel(const Identifier& ident) JSC_FAST_CALL { m_labelStack.push(ident); }
246 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
247 virtual bool isEmptyStatement() const JSC_FAST_CALL { return false; }
249 virtual bool isBlock() const JSC_FAST_CALL { return false; }
250 virtual bool isLoop() const JSC_FAST_CALL { return false; }
252 LabelStack m_labelStack;
258 class NullNode : public ExpressionNode {
260 NullNode(JSGlobalData* globalData) JSC_FAST_CALL
261 : ExpressionNode(globalData, ResultType::nullType())
265 virtual bool isNull() const JSC_FAST_CALL { return true; }
267 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
269 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
270 virtual Precedence precedence() const { return PrecPrimary; }
273 class BooleanNode : public ExpressionNode {
275 BooleanNode(JSGlobalData* globalData, bool value) JSC_FAST_CALL
276 : ExpressionNode(globalData, ResultType::boolean())
281 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
283 virtual bool isPure(CodeGenerator&) const JSC_FAST_CALL { return true; }
284 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
285 virtual Precedence precedence() const { return PrecPrimary; }
291 class NumberNode : public ExpressionNode {
293 NumberNode(JSGlobalData* globalData, double v) JSC_FAST_CALL
294 : ExpressionNode(globalData, ResultType::constNumber())
299 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
301 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
302 virtual Precedence precedence() const { return signbit(m_double) ? PrecUnary : PrecPrimary; }
304 virtual bool isNumber() const JSC_FAST_CALL { return true; }
305 virtual bool isPure(CodeGenerator&) const JSC_FAST_CALL { return true; }
306 double value() const JSC_FAST_CALL { return m_double; }
307 virtual void setValue(double d) JSC_FAST_CALL { m_double = d; }
313 class ImmediateNumberNode : public NumberNode {
315 ImmediateNumberNode(JSGlobalData* globalData, JSValue* v, double d) JSC_FAST_CALL
316 : NumberNode(globalData, d)
319 ASSERT(v == JSImmediate::from(d));
322 virtual void setValue(double d) JSC_FAST_CALL { m_double = d; m_value = JSImmediate::from(d); ASSERT(m_value); }
325 JSValue* m_value; // This is never a JSCell, only JSImmediate, thus no ProtectedPtr
328 class StringNode : public ExpressionNode {
330 StringNode(JSGlobalData* globalData, const Identifier& v) JSC_FAST_CALL
331 : ExpressionNode(globalData, ResultType::string())
336 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
338 virtual bool isString() const JSC_FAST_CALL { return true; }
339 const Identifier& value() { return m_value; }
340 virtual bool isPure(CodeGenerator&) const JSC_FAST_CALL { return true; }
341 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
342 virtual Precedence precedence() const { return PrecPrimary; }
348 class ThrowableExpressionData {
350 ThrowableExpressionData()
351 : m_divot(static_cast<uint32_t>(-1))
352 , m_startOffset(static_cast<uint16_t>(-1))
353 , m_endOffset(static_cast<uint16_t>(-1))
357 ThrowableExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset)
359 , m_startOffset(startOffset)
360 , m_endOffset(endOffset)
364 void setExceptionSourceRange(unsigned divot, unsigned startOffset, unsigned endOffset)
367 m_startOffset = startOffset;
368 m_endOffset = endOffset;
371 uint32_t divot() const { return m_divot; }
372 uint16_t startOffset() const { return m_startOffset; }
373 uint16_t endOffset() const { return m_endOffset; }
376 RegisterID* emitThrowError(CodeGenerator&, ErrorType, const char* msg);
377 RegisterID* emitThrowError(CodeGenerator&, ErrorType, const char* msg, const Identifier&);
379 uint16_t m_startOffset;
380 uint16_t m_endOffset;
383 class ThrowableSubExpressionData : public ThrowableExpressionData {
385 ThrowableSubExpressionData()
386 : ThrowableExpressionData()
387 , m_subexpressionDivotOffset(0)
388 , m_subexpressionEndOffset(0)
392 ThrowableSubExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset)
393 : ThrowableExpressionData(divot, startOffset, endOffset)
394 , m_subexpressionDivotOffset(0)
395 , m_subexpressionEndOffset(0)
399 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset) {
400 ASSERT(subexpressionDivot <= m_divot);
401 if ((m_divot - subexpressionDivot) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot
403 m_subexpressionDivotOffset = m_divot - subexpressionDivot;
404 m_subexpressionEndOffset = subexpressionOffset;
408 uint16_t m_subexpressionDivotOffset;
409 uint16_t m_subexpressionEndOffset;
412 class ThrowablePrefixedSubExpressionData : public ThrowableExpressionData {
414 ThrowablePrefixedSubExpressionData()
415 : ThrowableExpressionData()
416 , m_subexpressionDivotOffset(0)
417 , m_subexpressionStartOffset(0)
421 ThrowablePrefixedSubExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset)
422 : ThrowableExpressionData(divot, startOffset, endOffset)
423 , m_subexpressionDivotOffset(0)
424 , m_subexpressionStartOffset(0)
428 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset) {
429 ASSERT(subexpressionDivot >= m_divot);
430 if ((subexpressionDivot - m_divot) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot
432 m_subexpressionDivotOffset = subexpressionDivot - m_divot;
433 m_subexpressionStartOffset = subexpressionOffset;
437 uint16_t m_subexpressionDivotOffset;
438 uint16_t m_subexpressionStartOffset;
441 class RegExpNode : public ExpressionNode, public ThrowableExpressionData {
443 RegExpNode(JSGlobalData* globalData, const UString& pattern, const UString& flags) JSC_FAST_CALL
444 : ExpressionNode(globalData)
450 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
452 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
453 virtual Precedence precedence() const { return PrecPrimary; }
460 class ThisNode : public ExpressionNode {
462 ThisNode(JSGlobalData* globalData) JSC_FAST_CALL
463 : ExpressionNode(globalData)
467 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
469 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
470 virtual Precedence precedence() const { return PrecPrimary; }
473 class ResolveNode : public ExpressionNode {
475 ResolveNode(JSGlobalData* globalData, const Identifier& ident, int startOffset) JSC_FAST_CALL
476 : ExpressionNode(globalData)
478 , m_startOffset(startOffset)
482 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
484 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
485 virtual Precedence precedence() const { return PrecPrimary; }
487 virtual bool isPure(CodeGenerator&) const JSC_FAST_CALL;
488 virtual bool isLocation() const JSC_FAST_CALL { return true; }
489 virtual bool isResolveNode() const JSC_FAST_CALL { return true; }
490 const Identifier& identifier() const JSC_FAST_CALL { return m_ident; }
494 int32_t m_startOffset;
498 class ElementNode : public Node {
500 ElementNode(JSGlobalData* globalData, int elision, ExpressionNode* node) JSC_FAST_CALL
507 ElementNode(JSGlobalData* globalData, ElementNode* l, int elision, ExpressionNode* node) JSC_FAST_CALL
515 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
516 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
518 int elision() const { return m_elision; }
519 ExpressionNode* value() { return m_node.get(); }
521 ElementNode* next() { return m_next.get(); }
522 PassRefPtr<ElementNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }
525 ListRefPtr<ElementNode> m_next;
527 RefPtr<ExpressionNode> m_node;
530 class ArrayNode : public ExpressionNode {
532 ArrayNode(JSGlobalData* globalData, int elision) JSC_FAST_CALL
533 : ExpressionNode(globalData)
539 ArrayNode(JSGlobalData* globalData, ElementNode* element) JSC_FAST_CALL
540 : ExpressionNode(globalData)
547 ArrayNode(JSGlobalData* globalData, int elision, ElementNode* element) JSC_FAST_CALL
548 : ExpressionNode(globalData)
555 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
557 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
558 virtual Precedence precedence() const { return PrecPrimary; }
561 RefPtr<ElementNode> m_element;
566 class PropertyNode : public Node {
568 enum Type { Constant, Getter, Setter };
570 PropertyNode(JSGlobalData* globalData, const Identifier& name, ExpressionNode* assign, Type type) JSC_FAST_CALL
578 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
579 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
581 const Identifier& name() const { return m_name; }
584 friend class PropertyListNode;
586 RefPtr<ExpressionNode> m_assign;
590 class PropertyListNode : public Node {
592 PropertyListNode(JSGlobalData* globalData, PropertyNode* node) JSC_FAST_CALL
598 PropertyListNode(JSGlobalData* globalData, PropertyNode* node, PropertyListNode* list) JSC_FAST_CALL
605 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
606 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
607 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
609 PassRefPtr<PropertyListNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }
612 friend class ObjectLiteralNode;
613 RefPtr<PropertyNode> m_node;
614 ListRefPtr<PropertyListNode> m_next;
617 class ObjectLiteralNode : public ExpressionNode {
619 ObjectLiteralNode(JSGlobalData* globalData) JSC_FAST_CALL
620 : ExpressionNode(globalData)
624 ObjectLiteralNode(JSGlobalData* globalData, PropertyListNode* list) JSC_FAST_CALL
625 : ExpressionNode(globalData)
630 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
631 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
632 virtual Precedence precedence() const { return PrecPrimary; }
633 virtual bool needsParensIfLeftmost() const { return true; }
636 RefPtr<PropertyListNode> m_list;
639 class BracketAccessorNode : public ExpressionNode, public ThrowableExpressionData {
641 BracketAccessorNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments) JSC_FAST_CALL
642 : ExpressionNode(globalData)
644 , m_subscript(subscript)
645 , m_subscriptHasAssignments(subscriptHasAssignments)
649 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
651 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
652 virtual Precedence precedence() const { return PrecMember; }
654 virtual bool isLocation() const JSC_FAST_CALL { return true; }
655 virtual bool isBracketAccessorNode() const JSC_FAST_CALL { return true; }
656 ExpressionNode* base() JSC_FAST_CALL { return m_base.get(); }
657 ExpressionNode* subscript() JSC_FAST_CALL { return m_subscript.get(); }
660 RefPtr<ExpressionNode> m_base;
661 RefPtr<ExpressionNode> m_subscript;
662 bool m_subscriptHasAssignments;
665 class DotAccessorNode : public ExpressionNode, public ThrowableExpressionData {
667 DotAccessorNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident) JSC_FAST_CALL
668 : ExpressionNode(globalData)
674 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
675 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
676 virtual Precedence precedence() const { return PrecMember; }
678 virtual bool isLocation() const JSC_FAST_CALL { return true; }
679 virtual bool isDotAccessorNode() const JSC_FAST_CALL { return true; }
680 ExpressionNode* base() const JSC_FAST_CALL { return m_base.get(); }
681 const Identifier& identifier() const JSC_FAST_CALL { return m_ident; }
684 RefPtr<ExpressionNode> m_base;
688 class ArgumentListNode : public Node {
690 ArgumentListNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
696 ArgumentListNode(JSGlobalData* globalData, ArgumentListNode* listNode, ExpressionNode* expr) JSC_FAST_CALL
700 listNode->m_next = this;
703 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
704 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
705 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
707 PassRefPtr<ArgumentListNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }
709 ListRefPtr<ArgumentListNode> m_next;
710 RefPtr<ExpressionNode> m_expr;
713 class ArgumentsNode : public Node {
715 ArgumentsNode(JSGlobalData* globalData) JSC_FAST_CALL
720 ArgumentsNode(JSGlobalData* globalData, ArgumentListNode* listNode) JSC_FAST_CALL
722 , m_listNode(listNode)
726 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
727 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
729 RefPtr<ArgumentListNode> m_listNode;
732 class NewExprNode : public ExpressionNode, public ThrowableExpressionData {
734 NewExprNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
735 : ExpressionNode(globalData)
740 NewExprNode(JSGlobalData* globalData, ExpressionNode* expr, ArgumentsNode* args) JSC_FAST_CALL
741 : ExpressionNode(globalData)
747 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
749 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
750 virtual Precedence precedence() const { return PrecLeftHandSide; }
753 RefPtr<ExpressionNode> m_expr;
754 RefPtr<ArgumentsNode> m_args;
757 class EvalFunctionCallNode : public ExpressionNode, public ThrowableExpressionData {
759 EvalFunctionCallNode(JSGlobalData* globalData, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
760 : ExpressionNode(globalData)
761 , ThrowableExpressionData(divot, startOffset, endOffset)
766 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
767 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
768 virtual Precedence precedence() const { return PrecCall; }
771 RefPtr<ArgumentsNode> m_args;
774 class FunctionCallValueNode : public ExpressionNode, public ThrowableExpressionData {
776 FunctionCallValueNode(JSGlobalData* globalData, ExpressionNode* expr, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
777 : ExpressionNode(globalData)
778 , ThrowableExpressionData(divot, startOffset, endOffset)
784 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
785 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
786 virtual Precedence precedence() const { return PrecCall; }
789 RefPtr<ExpressionNode> m_expr;
790 RefPtr<ArgumentsNode> m_args;
793 class FunctionCallResolveNode : public ExpressionNode, public ThrowableExpressionData {
795 FunctionCallResolveNode(JSGlobalData* globalData, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
796 : ExpressionNode(globalData)
797 , ThrowableExpressionData(divot, startOffset, endOffset)
803 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
805 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
806 virtual Precedence precedence() const { return PrecCall; }
810 RefPtr<ArgumentsNode> m_args;
811 size_t m_index; // Used by LocalVarFunctionCallNode.
812 size_t m_scopeDepth; // Used by ScopedVarFunctionCallNode and NonLocalVarFunctionCallNode
815 class FunctionCallBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
817 FunctionCallBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
818 : ExpressionNode(globalData)
819 , ThrowableSubExpressionData(divot, startOffset, endOffset)
821 , m_subscript(subscript)
826 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
827 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
828 virtual Precedence precedence() const { return PrecCall; }
831 RefPtr<ExpressionNode> m_base;
832 RefPtr<ExpressionNode> m_subscript;
833 RefPtr<ArgumentsNode> m_args;
836 class FunctionCallDotNode : public ExpressionNode, public ThrowableSubExpressionData {
838 FunctionCallDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
839 : ExpressionNode(globalData)
840 , ThrowableSubExpressionData(divot, startOffset, endOffset)
847 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
848 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
849 virtual Precedence precedence() const { return PrecCall; }
852 RefPtr<ExpressionNode> m_base;
854 RefPtr<ArgumentsNode> m_args;
857 class PrePostResolveNode : public ExpressionNode, public ThrowableExpressionData {
859 PrePostResolveNode(JSGlobalData* globalData, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
860 : ExpressionNode(globalData, ResultType::constNumber()) // could be reusable for pre?
861 , ThrowableExpressionData(divot, startOffset, endOffset)
870 class PostfixResolveNode : public PrePostResolveNode {
872 PostfixResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
873 : PrePostResolveNode(globalData, ident, divot, startOffset, endOffset)
878 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
879 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
880 virtual Precedence precedence() const { return PrecPostfix; }
886 class PostfixBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
888 PostfixBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
889 : ExpressionNode(globalData)
890 , ThrowableSubExpressionData(divot, startOffset, endOffset)
892 , m_subscript(subscript)
897 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
898 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
899 virtual Precedence precedence() const { return PrecPostfix; }
902 RefPtr<ExpressionNode> m_base;
903 RefPtr<ExpressionNode> m_subscript;
907 class PostfixDotNode : public ExpressionNode, public ThrowableSubExpressionData {
909 PostfixDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
910 : ExpressionNode(globalData)
911 , ThrowableSubExpressionData(divot, startOffset, endOffset)
918 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
919 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
920 virtual Precedence precedence() const { return PrecPostfix; }
923 RefPtr<ExpressionNode> m_base;
928 class PostfixErrorNode : public ExpressionNode, public ThrowableSubExpressionData {
930 PostfixErrorNode(JSGlobalData* globalData, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
931 : ExpressionNode(globalData)
932 , ThrowableSubExpressionData(divot, startOffset, endOffset)
938 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
939 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
940 virtual Precedence precedence() const { return PrecPostfix; }
943 RefPtr<ExpressionNode> m_expr;
947 class DeleteResolveNode : public ExpressionNode, public ThrowableExpressionData {
949 DeleteResolveNode(JSGlobalData* globalData, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
950 : ExpressionNode(globalData)
951 , ThrowableExpressionData(divot, startOffset, endOffset)
956 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
958 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
959 virtual Precedence precedence() const { return PrecUnary; }
965 class DeleteBracketNode : public ExpressionNode, public ThrowableExpressionData {
967 DeleteBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
968 : ExpressionNode(globalData)
969 , ThrowableExpressionData(divot, startOffset, endOffset)
971 , m_subscript(subscript)
975 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
977 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
978 virtual Precedence precedence() const { return PrecUnary; }
981 RefPtr<ExpressionNode> m_base;
982 RefPtr<ExpressionNode> m_subscript;
985 class DeleteDotNode : public ExpressionNode, public ThrowableExpressionData {
987 DeleteDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
988 : ExpressionNode(globalData)
989 , ThrowableExpressionData(divot, startOffset, endOffset)
995 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
997 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
998 virtual Precedence precedence() const { return PrecUnary; }
1001 RefPtr<ExpressionNode> m_base;
1005 class DeleteValueNode : public ExpressionNode {
1007 DeleteValueNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
1008 : ExpressionNode(globalData)
1013 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1015 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1016 virtual Precedence precedence() const { return PrecUnary; }
1019 RefPtr<ExpressionNode> m_expr;
1022 class VoidNode : public ExpressionNode {
1024 VoidNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
1025 : ExpressionNode(globalData)
1030 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1032 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1033 virtual Precedence precedence() const { return PrecUnary; }
1036 RefPtr<ExpressionNode> m_expr;
1039 class TypeOfResolveNode : public ExpressionNode {
1041 TypeOfResolveNode(JSGlobalData* globalData, const Identifier& ident) JSC_FAST_CALL
1042 : ExpressionNode(globalData, ResultType::string())
1047 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1049 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1050 virtual Precedence precedence() const { return PrecUnary; }
1052 const Identifier& identifier() const JSC_FAST_CALL { return m_ident; }
1056 size_t m_index; // Used by LocalTypeOfNode.
1059 class TypeOfValueNode : public ExpressionNode {
1061 TypeOfValueNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
1062 : ExpressionNode(globalData, ResultType::string())
1067 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1069 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1070 virtual Precedence precedence() const { return PrecUnary; }
1073 RefPtr<ExpressionNode> m_expr;
1076 class PrefixResolveNode : public PrePostResolveNode {
1078 PrefixResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
1079 : PrePostResolveNode(globalData, ident, divot, startOffset, endOffset)
1084 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1086 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1087 virtual Precedence precedence() const { return PrecUnary; }
1090 Operator m_operator;
1093 class PrefixBracketNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
1095 PrefixBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
1096 : ExpressionNode(globalData)
1097 , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset)
1099 , m_subscript(subscript)
1104 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1105 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1106 virtual Precedence precedence() const { return PrecUnary; }
1109 RefPtr<ExpressionNode> m_base;
1110 RefPtr<ExpressionNode> m_subscript;
1111 Operator m_operator;
1114 class PrefixDotNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
1116 PrefixDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
1117 : ExpressionNode(globalData)
1118 , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset)
1125 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1126 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1127 virtual Precedence precedence() const { return PrecPostfix; }
1130 RefPtr<ExpressionNode> m_base;
1132 Operator m_operator;
1135 class PrefixErrorNode : public ExpressionNode, public ThrowableExpressionData {
1137 PrefixErrorNode(JSGlobalData* globalData, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
1138 : ExpressionNode(globalData)
1139 , ThrowableExpressionData(divot, startOffset, endOffset)
1145 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1146 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1147 virtual Precedence precedence() const { return PrecUnary; }
1150 RefPtr<ExpressionNode> m_expr;
1151 Operator m_operator;
1154 class UnaryOpNode : public ExpressionNode {
1156 UnaryOpNode(JSGlobalData* globalData, ExpressionNode* expr)
1157 : ExpressionNode(globalData)
1162 UnaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr)
1163 : ExpressionNode(globalData, type)
1168 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1169 virtual OpcodeID opcode() const JSC_FAST_CALL = 0;
1172 RefPtr<ExpressionNode> m_expr;
1175 class UnaryPlusNode : public UnaryOpNode {
1177 UnaryPlusNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
1178 : UnaryOpNode(globalData, ResultType::constNumber(), expr)
1182 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_to_jsnumber; }
1183 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1184 virtual Precedence precedence() const { return PrecUnary; }
1187 class NegateNode : public UnaryOpNode {
1189 NegateNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
1190 : UnaryOpNode(globalData, ResultType::reusableNumber(), expr)
1194 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_negate; }
1195 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1196 virtual Precedence precedence() const { return PrecUnary; }
1199 class BitwiseNotNode : public UnaryOpNode {
1201 BitwiseNotNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
1202 : UnaryOpNode(globalData, ResultType::reusableNumber(), expr)
1206 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_bitnot; }
1207 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1208 virtual Precedence precedence() const { return PrecUnary; }
1211 class LogicalNotNode : public UnaryOpNode {
1213 LogicalNotNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
1214 : UnaryOpNode(globalData, ResultType::boolean(), expr)
1218 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_not; }
1219 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1220 virtual Precedence precedence() const { return PrecUnary; }
1223 class BinaryOpNode : public ExpressionNode {
1225 BinaryOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
1226 : ExpressionNode(globalData)
1229 , m_rightHasAssignments(rightHasAssignments)
1233 BinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
1234 : ExpressionNode(globalData, type)
1237 , m_rightHasAssignments(rightHasAssignments)
1241 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1242 virtual OpcodeID opcode() const JSC_FAST_CALL = 0;
1245 RefPtr<ExpressionNode> m_expr1;
1246 RefPtr<ExpressionNode> m_expr2;
1247 bool m_rightHasAssignments;
1250 class ReverseBinaryOpNode : public ExpressionNode {
1252 ReverseBinaryOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
1253 : ExpressionNode(globalData)
1256 , m_rightHasAssignments(rightHasAssignments)
1260 ReverseBinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
1261 : ExpressionNode(globalData, type)
1264 , m_rightHasAssignments(rightHasAssignments)
1268 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1269 virtual OpcodeID opcode() const JSC_FAST_CALL = 0;
1272 RefPtr<ExpressionNode> m_expr1;
1273 RefPtr<ExpressionNode> m_expr2;
1274 bool m_rightHasAssignments;
1277 class MultNode : public BinaryOpNode {
1279 MultNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1280 : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
1284 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_mul; }
1285 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1286 virtual Precedence precedence() const { return PrecMultiplicative; }
1289 class DivNode : public BinaryOpNode {
1291 DivNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1292 : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
1296 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_div; }
1297 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1298 virtual Precedence precedence() const { return PrecMultiplicative; }
1301 class ModNode : public BinaryOpNode {
1303 ModNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1304 : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
1308 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_mod; }
1309 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1310 virtual Precedence precedence() const { return PrecMultiplicative; }
1313 class AddNode : public BinaryOpNode {
1315 AddNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1316 : BinaryOpNode(globalData, ResultType::forAdd(expr1->resultDescriptor(), expr2->resultDescriptor()), expr1, expr2, rightHasAssignments)
1320 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_add; }
1321 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1322 virtual Precedence precedence() const { return PrecAdditive; }
1325 class SubNode : public BinaryOpNode {
1327 SubNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1328 : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
1332 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_sub; }
1333 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1334 virtual Precedence precedence() const { return PrecAdditive; }
1337 class LeftShiftNode : public BinaryOpNode {
1339 LeftShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1340 : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
1344 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_lshift; }
1345 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1346 virtual Precedence precedence() const { return PrecShift; }
1349 class RightShiftNode : public BinaryOpNode {
1351 RightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1352 : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
1356 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_rshift; }
1357 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1358 virtual Precedence precedence() const { return PrecShift; }
1361 class UnsignedRightShiftNode : public BinaryOpNode {
1363 UnsignedRightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1364 : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
1368 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_urshift; }
1369 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1370 virtual Precedence precedence() const { return PrecShift; }
1373 class LessNode : public BinaryOpNode {
1375 LessNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1376 : BinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
1380 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_less; }
1381 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1382 virtual Precedence precedence() const { return PrecRelational; }
1385 class GreaterNode : public ReverseBinaryOpNode {
1387 GreaterNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1388 : ReverseBinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
1392 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_less; }
1393 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1394 virtual Precedence precedence() const { return PrecRelational; }
1397 class LessEqNode : public BinaryOpNode {
1399 LessEqNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1400 : BinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
1404 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_lesseq; }
1405 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1406 virtual Precedence precedence() const { return PrecRelational; }
1409 class GreaterEqNode : public ReverseBinaryOpNode {
1411 GreaterEqNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1412 : ReverseBinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
1416 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_lesseq; }
1417 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1418 virtual Precedence precedence() const { return PrecRelational; }
1421 class ThrowableBinaryOpNode : public BinaryOpNode, public ThrowableExpressionData {
1423 ThrowableBinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1424 : BinaryOpNode(globalData, type, expr1, expr2, rightHasAssignments)
1427 ThrowableBinaryOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1428 : BinaryOpNode(globalData, expr1, expr2, rightHasAssignments)
1431 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1434 class InstanceOfNode : public ThrowableBinaryOpNode {
1436 InstanceOfNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1437 : ThrowableBinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
1441 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_instanceof; }
1442 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1443 virtual Precedence precedence() const { return PrecRelational; }
1445 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1448 class InNode : public ThrowableBinaryOpNode {
1450 InNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1451 : ThrowableBinaryOpNode(globalData, expr1, expr2, rightHasAssignments)
1455 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_in; }
1456 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1457 virtual Precedence precedence() const { return PrecRelational; }
1460 class EqualNode : public BinaryOpNode {
1462 EqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1463 : BinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
1467 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1468 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_eq; }
1469 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1470 virtual Precedence precedence() const { return PrecEquality; }
1473 class NotEqualNode : public BinaryOpNode {
1475 NotEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1476 : BinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
1480 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_neq; }
1481 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1482 virtual Precedence precedence() const { return PrecEquality; }
1485 class StrictEqualNode : public BinaryOpNode {
1487 StrictEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1488 : BinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
1492 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1493 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_stricteq; }
1494 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1495 virtual Precedence precedence() const { return PrecEquality; }
1498 class NotStrictEqualNode : public BinaryOpNode {
1500 NotStrictEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1501 : BinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
1505 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_nstricteq; }
1506 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1507 virtual Precedence precedence() const { return PrecEquality; }
1510 class BitAndNode : public BinaryOpNode {
1512 BitAndNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1513 : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
1517 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_bitand; }
1518 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1519 virtual Precedence precedence() const { return PrecBitwiseAnd; }
1522 class BitOrNode : public BinaryOpNode {
1524 BitOrNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1525 : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
1529 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_bitor; }
1530 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1531 virtual Precedence precedence() const { return PrecBitwiseOr; }
1534 class BitXOrNode : public BinaryOpNode {
1536 BitXOrNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
1537 : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
1541 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_bitxor; }
1542 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1543 virtual Precedence precedence() const { return PrecBitwiseXor; }
1547 * m_expr1 && m_expr2, m_expr1 || m_expr2
1549 class LogicalOpNode : public ExpressionNode {
1551 LogicalOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper) JSC_FAST_CALL
1552 : ExpressionNode(globalData, ResultType::boolean())
1559 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1560 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1561 virtual Precedence precedence() const { return (m_operator == OpLogicalAnd) ? PrecLogicalAnd : PrecLogicalOr; }
1564 RefPtr<ExpressionNode> m_expr1;
1565 RefPtr<ExpressionNode> m_expr2;
1566 LogicalOperator m_operator;
1570 * The ternary operator, "m_logical ? m_expr1 : m_expr2"
1572 class ConditionalNode : public ExpressionNode {
1574 ConditionalNode(JSGlobalData* globalData, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2) JSC_FAST_CALL
1575 : ExpressionNode(globalData)
1576 , m_logical(logical)
1582 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1583 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1584 virtual Precedence precedence() const { return PrecConditional; }
1587 RefPtr<ExpressionNode> m_logical;
1588 RefPtr<ExpressionNode> m_expr1;
1589 RefPtr<ExpressionNode> m_expr2;
1592 class ReadModifyResolveNode : public ExpressionNode, public ThrowableExpressionData {
1594 ReadModifyResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
1595 : ExpressionNode(globalData)
1596 , ThrowableExpressionData(divot, startOffset, endOffset)
1600 , m_rightHasAssignments(rightHasAssignments)
1604 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1606 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1607 virtual Precedence precedence() const { return PrecAssignment; }
1611 RefPtr<ExpressionNode> m_right;
1612 size_t m_index; // Used by ReadModifyLocalVarNode.
1613 Operator m_operator : 31;
1614 bool m_rightHasAssignments : 1;
1617 class AssignResolveNode : public ExpressionNode, public ThrowableExpressionData {
1619 AssignResolveNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments) JSC_FAST_CALL
1620 : ExpressionNode(globalData)
1623 , m_rightHasAssignments(rightHasAssignments)
1627 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1629 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1630 virtual Precedence precedence() const { return PrecAssignment; }
1634 RefPtr<ExpressionNode> m_right;
1635 size_t m_index; // Used by ReadModifyLocalVarNode.
1636 bool m_rightHasAssignments;
1639 class ReadModifyBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
1641 ReadModifyBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
1642 : ExpressionNode(globalData)
1643 , ThrowableSubExpressionData(divot, startOffset, endOffset)
1645 , m_subscript(subscript)
1648 , m_subscriptHasAssignments(subscriptHasAssignments)
1649 , m_rightHasAssignments(rightHasAssignments)
1653 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1655 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1656 virtual Precedence precedence() const { return PrecAssignment; }
1659 RefPtr<ExpressionNode> m_base;
1660 RefPtr<ExpressionNode> m_subscript;
1661 RefPtr<ExpressionNode> m_right;
1662 Operator m_operator : 30;
1663 bool m_subscriptHasAssignments : 1;
1664 bool m_rightHasAssignments : 1;
1667 class AssignBracketNode : public ExpressionNode, public ThrowableExpressionData {
1669 AssignBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
1670 : ExpressionNode(globalData)
1671 , ThrowableExpressionData(divot, startOffset, endOffset)
1673 , m_subscript(subscript)
1675 , m_subscriptHasAssignments(subscriptHasAssignments)
1676 , m_rightHasAssignments(rightHasAssignments)
1680 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1682 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1683 virtual Precedence precedence() const { return PrecAssignment; }
1686 RefPtr<ExpressionNode> m_base;
1687 RefPtr<ExpressionNode> m_subscript;
1688 RefPtr<ExpressionNode> m_right;
1689 bool m_subscriptHasAssignments : 1;
1690 bool m_rightHasAssignments : 1;
1693 class AssignDotNode : public ExpressionNode, public ThrowableExpressionData {
1695 AssignDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
1696 : ExpressionNode(globalData)
1697 , ThrowableExpressionData(divot, startOffset, endOffset)
1701 , m_rightHasAssignments(rightHasAssignments)
1705 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1706 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1707 virtual Precedence precedence() const { return PrecAssignment; }
1710 RefPtr<ExpressionNode> m_base;
1712 RefPtr<ExpressionNode> m_right;
1713 bool m_rightHasAssignments;
1716 class ReadModifyDotNode : public ExpressionNode, public ThrowableSubExpressionData {
1718 ReadModifyDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
1719 : ExpressionNode(globalData)
1720 , ThrowableSubExpressionData(divot, startOffset, endOffset)
1725 , m_rightHasAssignments(rightHasAssignments)
1729 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1731 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1732 virtual Precedence precedence() const { return PrecAssignment; }
1735 RefPtr<ExpressionNode> m_base;
1737 RefPtr<ExpressionNode> m_right;
1738 Operator m_operator : 31;
1739 bool m_rightHasAssignments : 1;
1742 class AssignErrorNode : public ExpressionNode, public ThrowableExpressionData {
1744 AssignErrorNode(JSGlobalData* globalData, ExpressionNode* left, Operator oper, ExpressionNode* right, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
1745 : ExpressionNode(globalData)
1746 , ThrowableExpressionData(divot, startOffset, endOffset)
1753 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1754 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1755 virtual Precedence precedence() const { return PrecAssignment; }
1758 RefPtr<ExpressionNode> m_left;
1759 Operator m_operator;
1760 RefPtr<ExpressionNode> m_right;
1763 class CommaNode : public ExpressionNode {
1765 CommaNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2) JSC_FAST_CALL
1766 : ExpressionNode(globalData)
1772 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1773 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1774 virtual Precedence precedence() const { return PrecExpression; }
1777 RefPtr<ExpressionNode> m_expr1;
1778 RefPtr<ExpressionNode> m_expr2;
1781 class VarDeclCommaNode : public CommaNode {
1783 VarDeclCommaNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2) JSC_FAST_CALL
1784 : CommaNode(globalData, expr1, expr2)
1787 virtual Precedence precedence() const { return PrecAssignment; }
1790 class ConstDeclNode : public ExpressionNode {
1792 ConstDeclNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* in) JSC_FAST_CALL;
1794 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1795 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
1796 PassRefPtr<ConstDeclNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }
1799 ListRefPtr<ConstDeclNode> m_next;
1800 RefPtr<ExpressionNode> m_init;
1802 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1803 virtual RegisterID* emitCodeSingle(CodeGenerator&) JSC_FAST_CALL;
1806 class ConstStatementNode : public StatementNode {
1808 ConstStatementNode(JSGlobalData* globalData, ConstDeclNode* next) JSC_FAST_CALL
1809 : StatementNode(globalData)
1814 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1816 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1819 RefPtr<ConstDeclNode> m_next;
1822 typedef Vector<RefPtr<StatementNode> > StatementVector;
1824 class SourceElements : public ParserRefCounted {
1826 SourceElements(JSGlobalData* globalData) : ParserRefCounted(globalData) {}
1828 void append(PassRefPtr<StatementNode>);
1829 void releaseContentsIntoVector(StatementVector& destination)
1831 ASSERT(destination.isEmpty());
1832 m_statements.swap(destination);
1836 StatementVector m_statements;
1839 class BlockNode : public StatementNode {
1841 BlockNode(JSGlobalData*, SourceElements* children) JSC_FAST_CALL;
1843 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1844 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1846 StatementVector& children() { return m_children; }
1848 virtual bool isBlock() const JSC_FAST_CALL { return true; }
1850 StatementVector m_children;
1853 class EmptyStatementNode : public StatementNode {
1855 EmptyStatementNode(JSGlobalData* globalData) JSC_FAST_CALL // debug
1856 : StatementNode(globalData)
1860 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1862 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1863 virtual bool isEmptyStatement() const JSC_FAST_CALL { return true; }
1866 class DebuggerStatementNode : public StatementNode {
1868 DebuggerStatementNode(JSGlobalData* globalData) JSC_FAST_CALL
1869 : StatementNode(globalData)
1873 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1875 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1878 class ExprStatementNode : public StatementNode {
1880 ExprStatementNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
1881 : StatementNode(globalData)
1886 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1887 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1890 RefPtr<ExpressionNode> m_expr;
1893 class VarStatementNode : public StatementNode {
1895 VarStatementNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
1896 : StatementNode(globalData)
1901 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1903 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1906 RefPtr<ExpressionNode> m_expr;
1909 class IfNode : public StatementNode {
1911 IfNode(JSGlobalData* globalData, ExpressionNode* condition, StatementNode* ifBlock) JSC_FAST_CALL
1912 : StatementNode(globalData)
1913 , m_condition(condition)
1914 , m_ifBlock(ifBlock)
1918 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1919 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1922 RefPtr<ExpressionNode> m_condition;
1923 RefPtr<StatementNode> m_ifBlock;
1926 class IfElseNode : public IfNode {
1928 IfElseNode(JSGlobalData* globalData, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock) JSC_FAST_CALL
1929 : IfNode(globalData, condition, ifBlock)
1930 , m_elseBlock(elseBlock)
1934 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1935 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1938 RefPtr<StatementNode> m_elseBlock;
1941 class DoWhileNode : public StatementNode {
1943 DoWhileNode(JSGlobalData* globalData, StatementNode* statement, ExpressionNode* expr) JSC_FAST_CALL
1944 : StatementNode(globalData)
1945 , m_statement(statement)
1950 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1951 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1953 virtual bool isLoop() const JSC_FAST_CALL { return true; }
1955 RefPtr<StatementNode> m_statement;
1956 RefPtr<ExpressionNode> m_expr;
1959 class WhileNode : public StatementNode {
1961 WhileNode(JSGlobalData* globalData, ExpressionNode* expr, StatementNode* statement) JSC_FAST_CALL
1962 : StatementNode(globalData)
1964 , m_statement(statement)
1968 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1969 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1971 virtual bool isLoop() const JSC_FAST_CALL { return true; }
1973 RefPtr<ExpressionNode> m_expr;
1974 RefPtr<StatementNode> m_statement;
1977 class ForNode : public StatementNode {
1979 ForNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement, bool expr1WasVarDecl) JSC_FAST_CALL
1980 : StatementNode(globalData)
1984 , m_statement(statement)
1985 , m_expr1WasVarDecl(expr1 && expr1WasVarDecl)
1990 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
1991 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
1993 virtual bool isLoop() const JSC_FAST_CALL { return true; }
1995 RefPtr<ExpressionNode> m_expr1;
1996 RefPtr<ExpressionNode> m_expr2;
1997 RefPtr<ExpressionNode> m_expr3;
1998 RefPtr<StatementNode> m_statement;
1999 bool m_expr1WasVarDecl;
2002 class ForInNode : public StatementNode, public ThrowableExpressionData {
2004 ForInNode(JSGlobalData*, ExpressionNode*, ExpressionNode*, StatementNode*) JSC_FAST_CALL;
2005 ForInNode(JSGlobalData*, const Identifier&, ExpressionNode*, ExpressionNode*, StatementNode*, int divot, int startOffset, int endOffset) JSC_FAST_CALL;
2007 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2008 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2010 virtual bool isLoop() const JSC_FAST_CALL { return true; }
2013 RefPtr<ExpressionNode> m_init;
2014 RefPtr<ExpressionNode> m_lexpr;
2015 RefPtr<ExpressionNode> m_expr;
2016 RefPtr<StatementNode> m_statement;
2017 bool m_identIsVarDecl;
2020 class ContinueNode : public StatementNode, public ThrowableExpressionData {
2022 ContinueNode(JSGlobalData* globalData) JSC_FAST_CALL
2023 : StatementNode(globalData)
2027 ContinueNode(JSGlobalData* globalData, const Identifier& ident) JSC_FAST_CALL
2028 : StatementNode(globalData)
2033 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2034 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2040 class BreakNode : public StatementNode, public ThrowableExpressionData {
2042 BreakNode(JSGlobalData* globalData) JSC_FAST_CALL
2043 : StatementNode(globalData)
2047 BreakNode(JSGlobalData* globalData, const Identifier& ident) JSC_FAST_CALL
2048 : StatementNode(globalData)
2053 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2054 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2060 class ReturnNode : public StatementNode, public ThrowableExpressionData {
2062 ReturnNode(JSGlobalData* globalData, ExpressionNode* value) JSC_FAST_CALL
2063 : StatementNode(globalData)
2068 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2069 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2070 virtual bool isReturnNode() const JSC_FAST_CALL { return true; }
2073 RefPtr<ExpressionNode> m_value;
2076 class WithNode : public StatementNode {
2078 WithNode(JSGlobalData* globalData, ExpressionNode* expr, StatementNode* statement, uint32_t divot, uint32_t expressionLength) JSC_FAST_CALL
2079 : StatementNode(globalData)
2081 , m_statement(statement)
2083 , m_expressionLength(expressionLength)
2087 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2088 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2091 RefPtr<ExpressionNode> m_expr;
2092 RefPtr<StatementNode> m_statement;
2094 uint32_t m_expressionLength;
2097 class LabelNode : public StatementNode, public ThrowableExpressionData {
2099 LabelNode(JSGlobalData* globalData, const Identifier& label, StatementNode* statement) JSC_FAST_CALL
2100 : StatementNode(globalData)
2102 , m_statement(statement)
2106 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2107 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2108 virtual void pushLabel(const Identifier& ident) JSC_FAST_CALL { m_statement->pushLabel(ident); }
2112 RefPtr<StatementNode> m_statement;
2115 class ThrowNode : public StatementNode, public ThrowableExpressionData {
2117 ThrowNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
2118 : StatementNode(globalData)
2123 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2124 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2127 RefPtr<ExpressionNode> m_expr;
2130 class TryNode : public StatementNode {
2132 TryNode(JSGlobalData* globalData, StatementNode* tryBlock, const Identifier& exceptionIdent, StatementNode* catchBlock, StatementNode* finallyBlock) JSC_FAST_CALL
2133 : StatementNode(globalData)
2134 , m_tryBlock(tryBlock)
2135 , m_exceptionIdent(exceptionIdent)
2136 , m_catchBlock(catchBlock)
2137 , m_finallyBlock(finallyBlock)
2141 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2143 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* dst = 0) JSC_FAST_CALL;
2146 RefPtr<StatementNode> m_tryBlock;
2147 Identifier m_exceptionIdent;
2148 RefPtr<StatementNode> m_catchBlock;
2149 RefPtr<StatementNode> m_finallyBlock;
2152 class ParameterNode : public Node {
2154 ParameterNode(JSGlobalData* globalData, const Identifier& ident) JSC_FAST_CALL
2160 ParameterNode(JSGlobalData* globalData, ParameterNode* l, const Identifier& ident) JSC_FAST_CALL
2167 Identifier ident() JSC_FAST_CALL { return m_ident; }
2168 ParameterNode *nextParam() JSC_FAST_CALL { return m_next.get(); }
2169 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2170 PassRefPtr<ParameterNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }
2171 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
2174 friend class FuncDeclNode;
2175 friend class FuncExprNode;
2177 ListRefPtr<ParameterNode> m_next;
2180 class ScopeNode : public BlockNode {
2182 ScopeNode(JSGlobalData*, const SourceCode&, SourceElements*, VarStack*, FunctionStack*, CodeFeatures, int numConstants) JSC_FAST_CALL;
2184 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2186 void setSource(const SourceCode& source) { m_source = source; }
2187 const SourceCode& source() const { return m_source; }
2188 const UString& sourceURL() const JSC_FAST_CALL { return m_source.provider()->url(); }
2189 intptr_t sourceID() const { return m_source.provider()->asID(); }
2191 bool usesEval() const { return m_features & EvalFeature; }
2192 bool usesArguments() const { return m_features & ArgumentsFeature; }
2193 void setUsesArguments() { m_features |= ArgumentsFeature; }
2194 bool usesThis() const { return m_features & ThisFeature; }
2195 bool needsActivation() const { return m_features & (EvalFeature | ClosureFeature | WithFeature | CatchFeature); }
2197 VarStack& varStack() { return m_varStack; }
2198 FunctionStack& functionStack() { return m_functionStack; }
2200 int neededConstants()
2202 // We may need 1 more constant than the count given by the parser,
2203 // because of the various uses of jsUndefined().
2204 return m_numConstants + 1;
2208 VarStack m_varStack;
2209 FunctionStack m_functionStack;
2212 SourceCode m_source;
2213 CodeFeatures m_features;
2217 class ProgramNode : public ScopeNode {
2219 static ProgramNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants) JSC_FAST_CALL;
2221 ProgramCodeBlock& byteCode(ScopeChainNode* scopeChain) JSC_FAST_CALL
2224 generateCode(scopeChain);
2229 ProgramNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants) JSC_FAST_CALL;
2231 void generateCode(ScopeChainNode*) JSC_FAST_CALL;
2232 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2234 Vector<size_t> m_varIndexes; // Storage indexes belonging to the nodes in m_varStack. (Recorded to avoid double lookup.)
2235 Vector<size_t> m_functionIndexes; // Storage indexes belonging to the nodes in m_functionStack. (Recorded to avoid double lookup.)
2237 OwnPtr<ProgramCodeBlock> m_code;
2240 class EvalNode : public ScopeNode {
2242 static EvalNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants) JSC_FAST_CALL;
2244 EvalCodeBlock& byteCode(ScopeChainNode* scopeChain) JSC_FAST_CALL
2247 generateCode(scopeChain);
2252 EvalNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants) JSC_FAST_CALL;
2254 void generateCode(ScopeChainNode*) JSC_FAST_CALL;
2255 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2257 OwnPtr<EvalCodeBlock> m_code;
2260 class FunctionBodyNode : public ScopeNode {
2262 static FunctionBodyNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants) JSC_FAST_CALL;
2263 static FunctionBodyNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, CodeFeatures, int numConstants) JSC_FAST_CALL;
2264 ~FunctionBodyNode();
2266 const Identifier* parameters() const JSC_FAST_CALL { return m_parameters; }
2267 size_t parameterCount() { return m_parameterCount; }
2268 UString paramString() const JSC_FAST_CALL;
2270 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2272 SymbolTable& symbolTable() { return m_symbolTable; } // FIXME: Remove this
2274 CodeBlock& byteCode(ScopeChainNode* scopeChain) JSC_FAST_CALL
2278 generateCode(scopeChain);
2282 CodeBlock& generatedByteCode() JSC_FAST_CALL
2290 void finishParsing(const SourceCode&, ParameterNode*);
2291 void finishParsing(const SourceCode&, Identifier* parameters, size_t parameterCount);
2293 UString toSourceString() const JSC_FAST_CALL { return UString("{") + source().toString() + UString("}"); }
2295 // These objects are ref/deref'd a lot in the scope chain, so this is a faster ref/deref.
2296 // If the virtual machine changes so this doesn't happen as much we can change back.
2299 if (++m_refCount == 1)
2310 FunctionBodyNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, CodeFeatures, int numConstants) JSC_FAST_CALL;
2313 void generateCode(ScopeChainNode*) JSC_FAST_CALL;
2315 Identifier* m_parameters;
2316 size_t m_parameterCount;
2317 SymbolTable m_symbolTable;
2318 OwnPtr<CodeBlock> m_code;
2319 unsigned m_refCount;
2322 class FuncExprNode : public ExpressionNode {
2324 FuncExprNode(JSGlobalData* globalData, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter = 0) JSC_FAST_CALL
2325 : ExpressionNode(globalData)
2327 , m_parameter(parameter)
2330 m_body->finishParsing(source, m_parameter.get());
2333 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2334 JSFunction* makeFunction(ExecState*, ScopeChainNode*) JSC_FAST_CALL;
2335 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2336 virtual Precedence precedence() const { return PrecMember; }
2337 virtual bool needsParensIfLeftmost() const { return true; }
2339 FunctionBodyNode* body() { return m_body.get(); }
2342 // Used for streamTo
2343 friend class PropertyNode;
2345 RefPtr<ParameterNode> m_parameter;
2346 RefPtr<FunctionBodyNode> m_body;
2349 class FuncDeclNode : public StatementNode {
2351 FuncDeclNode(JSGlobalData* globalData, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter = 0) JSC_FAST_CALL
2352 : StatementNode(globalData)
2354 , m_parameter(parameter)
2357 m_body->finishParsing(source, m_parameter.get());
2360 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2362 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2363 JSFunction* makeFunction(ExecState*, ScopeChainNode*) JSC_FAST_CALL;
2367 FunctionBodyNode* body() { return m_body.get(); }
2370 RefPtr<ParameterNode> m_parameter;
2371 RefPtr<FunctionBodyNode> m_body;
2374 class CaseClauseNode : public Node {
2376 CaseClauseNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
2382 CaseClauseNode(JSGlobalData* globalData, ExpressionNode* expr, SourceElements* children) JSC_FAST_CALL
2387 children->releaseContentsIntoVector(m_children);
2390 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2391 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
2393 ExpressionNode* expr() const { return m_expr.get(); }
2394 StatementVector& children() { return m_children; }
2397 RefPtr<ExpressionNode> m_expr;
2398 StatementVector m_children;
2401 class ClauseListNode : public Node {
2403 ClauseListNode(JSGlobalData* globalData, CaseClauseNode* clause) JSC_FAST_CALL
2409 ClauseListNode(JSGlobalData* globalData, ClauseListNode* clauseList, CaseClauseNode* clause) JSC_FAST_CALL
2413 clauseList->m_next = this;
2416 CaseClauseNode* getClause() const JSC_FAST_CALL { return m_clause.get(); }
2417 ClauseListNode* getNext() const JSC_FAST_CALL { return m_next.get(); }
2418 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2419 PassRefPtr<ClauseListNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }
2420 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
2423 friend class CaseBlockNode;
2424 RefPtr<CaseClauseNode> m_clause;
2425 ListRefPtr<ClauseListNode> m_next;
2428 class CaseBlockNode : public Node {
2430 CaseBlockNode(JSGlobalData* globalData, ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2) JSC_FAST_CALL
2433 , m_defaultClause(defaultClause)
2438 RegisterID* emitCodeForBlock(CodeGenerator&, RegisterID* input, RegisterID* dst = 0) JSC_FAST_CALL;
2440 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2441 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
2444 SwitchInfo::SwitchType tryOptimizedSwitch(Vector<ExpressionNode*, 8>& literalVector, int32_t& min_num, int32_t& max_num);
2445 RefPtr<ClauseListNode> m_list1;
2446 RefPtr<CaseClauseNode> m_defaultClause;
2447 RefPtr<ClauseListNode> m_list2;
2450 class SwitchNode : public StatementNode {
2452 SwitchNode(JSGlobalData* globalData, ExpressionNode* expr, CaseBlockNode* block) JSC_FAST_CALL
2453 : StatementNode(globalData)
2459 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
2461 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
2464 RefPtr<ExpressionNode> m_expr;
2465 RefPtr<CaseBlockNode> m_block;
2468 struct ElementList {
2473 struct PropertyList {
2474 PropertyListNode* head;
2475 PropertyListNode* tail;
2478 struct ArgumentList {
2479 ArgumentListNode* head;
2480 ArgumentListNode* tail;
2483 struct ConstDeclList {
2484 ConstDeclNode* head;
2485 ConstDeclNode* tail;
2488 struct ParameterList {
2489 ParameterNode* head;
2490 ParameterNode* tail;
2494 ClauseListNode* head;
2495 ClauseListNode* tail;