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, 2013, 2015 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 "ParserTokens.h"
34 #include "ResultType.h"
35 #include "SourceCode.h"
36 #include "SymbolTable.h"
37 #include "VariableEnvironment.h"
38 #include <wtf/MathExtras.h>
42 class ArgumentListNode;
43 class BytecodeGenerator;
44 class FunctionBodyNode;
45 class FunctionParameters;
47 class PropertyListNode;
48 class ReadModifyResolveNode;
70 enum LogicalOperator {
75 enum FallThroughMode {
76 FallThroughMeansTrue = 0,
77 FallThroughMeansFalse = 1
79 inline FallThroughMode invert(FallThroughMode fallThroughMode) { return static_cast<FallThroughMode>(!fallThroughMode); }
81 typedef HashSet<RefPtr<UniquedStringImpl>, IdentifierRepHash> IdentifierSet;
83 namespace DeclarationStacks {
84 typedef Vector<FunctionBodyNode*> FunctionStack;
88 enum SwitchType { SwitchNone, SwitchImmediate, SwitchCharacter, SwitchString };
89 uint32_t bytecodeOffset;
90 SwitchType switchType;
93 enum class AssignmentContext {
95 ConstDeclarationStatement,
99 class ParserArenaFreeable {
101 // ParserArenaFreeable objects are are freed when the arena is deleted.
102 // Destructors are not called. Clients must not call delete on such objects.
103 void* operator new(size_t, ParserArena&);
106 class ParserArenaDeletable {
108 virtual ~ParserArenaDeletable() { }
110 // ParserArenaDeletable objects are deleted when the arena is deleted.
111 // Clients must not call delete directly on such objects.
112 void* operator new(size_t, ParserArena&);
115 class ParserArenaRoot {
116 WTF_MAKE_FAST_ALLOCATED;
118 ParserArenaRoot(ParserArena&);
121 ParserArena& parserArena() { return m_arena; }
122 virtual ~ParserArenaRoot() { }
128 class Node : public ParserArenaFreeable {
130 Node(const JSTokenLocation&);
135 int firstLine() const { return m_position.line; }
136 int startOffset() const { return m_position.offset; }
137 int endOffset() const { return m_endOffset; }
138 int lineStartOffset() const { return m_position.lineStartOffset; }
139 const JSTextPosition& position() const { return m_position; }
140 void setEndOffset(int offset) { m_endOffset = offset; }
141 void setStartOffset(int offset) { m_position.offset = offset; }
144 JSTextPosition m_position;
148 class ExpressionNode : public Node {
150 ExpressionNode(const JSTokenLocation&, ResultType = ResultType::unknownType());
153 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* destination = 0) = 0;
155 virtual bool isNumber() const { return false; }
156 virtual bool isString() const { return false; }
157 virtual bool isNull() const { return false; }
158 virtual bool isPure(BytecodeGenerator&) const { return false; }
159 virtual bool isConstant() const { return false; }
160 virtual bool isLocation() const { return false; }
161 virtual bool isAssignmentLocation() const { return isLocation(); }
162 virtual bool isResolveNode() const { return false; }
163 virtual bool isBracketAccessorNode() const { return false; }
164 virtual bool isDotAccessorNode() const { return false; }
165 virtual bool isDestructuringNode() const { return false; }
166 virtual bool isFuncExprNode() const { return false; }
167 virtual bool isCommaNode() const { return false; }
168 virtual bool isSimpleArray() const { return false; }
169 virtual bool isAdd() const { return false; }
170 virtual bool isSubtract() const { return false; }
171 virtual bool isBoolean() const { return false; }
172 virtual bool isSpreadExpression() const { return false; }
173 virtual bool isSuperNode() const { return false; }
175 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label*, Label*, FallThroughMode);
177 virtual ExpressionNode* stripUnaryPlus() { return this; }
179 ResultType resultDescriptor() const { return m_resultType; }
182 ResultType m_resultType;
185 class StatementNode : public Node {
187 StatementNode(const JSTokenLocation&);
190 virtual void emitBytecode(BytecodeGenerator&, RegisterID* destination = 0) = 0;
192 void setLoc(unsigned firstLine, unsigned lastLine, int startOffset, int lineStartOffset);
193 unsigned lastLine() const { return m_lastLine; }
195 StatementNode* next() { return m_next; }
196 void setNext(StatementNode* next) { m_next = next; }
198 virtual bool isEmptyStatement() const { return false; }
199 virtual bool isReturnNode() const { return false; }
200 virtual bool isExprStatement() const { return false; }
201 virtual bool isBreak() const { return false; }
202 virtual bool isContinue() const { return false; }
203 virtual bool isBlock() const { return false; }
204 virtual bool isFuncDeclNode() const { return false; }
207 StatementNode* m_next;
211 class VariableEnvironmentNode {
213 VariableEnvironmentNode()
217 VariableEnvironmentNode(VariableEnvironment& lexicalDeclaredVariables);
219 VariableEnvironment& lexicalVariables() { return m_lexicalVariables; }
222 VariableEnvironment m_lexicalVariables;
225 class ConstantNode : public ExpressionNode {
227 ConstantNode(const JSTokenLocation&, ResultType);
228 virtual bool isPure(BytecodeGenerator&) const override { return true; }
229 virtual bool isConstant() const override { return true; }
230 virtual JSValue jsValue(BytecodeGenerator&) const = 0;
232 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
233 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, FallThroughMode) override;
236 class NullNode : public ConstantNode {
238 NullNode(const JSTokenLocation&);
241 virtual bool isNull() const override { return true; }
242 virtual JSValue jsValue(BytecodeGenerator&) const override { return jsNull(); }
245 class BooleanNode : public ConstantNode {
247 BooleanNode(const JSTokenLocation&, bool value);
248 bool value() { return m_value; }
251 virtual bool isBoolean() const override { return true; }
252 virtual JSValue jsValue(BytecodeGenerator&) const override { return jsBoolean(m_value); }
257 class NumberNode : public ConstantNode {
259 NumberNode(const JSTokenLocation&, double value);
260 double value() const { return m_value; }
261 virtual bool isIntegerNode() const = 0;
262 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override final;
265 virtual bool isNumber() const override final { return true; }
266 virtual JSValue jsValue(BytecodeGenerator&) const override { return jsNumber(m_value); }
271 class DoubleNode : public NumberNode {
273 DoubleNode(const JSTokenLocation&, double value);
276 virtual bool isIntegerNode() const override { return false; }
279 // An integer node represent a number represented as an integer (e.g. 42 instead of 42., 42.0, 42e0)
280 class IntegerNode : public DoubleNode {
282 IntegerNode(const JSTokenLocation&, double value);
283 virtual bool isIntegerNode() const override final { return true; }
286 class StringNode : public ConstantNode {
288 StringNode(const JSTokenLocation&, const Identifier&);
289 const Identifier& value() { return m_value; }
292 virtual bool isString() const override { return true; }
293 virtual JSValue jsValue(BytecodeGenerator&) const override;
295 const Identifier& m_value;
298 class ThrowableExpressionData {
300 ThrowableExpressionData()
301 : m_divot(-1, -1, -1)
302 , m_divotStart(-1, -1, -1)
303 , m_divotEnd(-1, -1, -1)
307 ThrowableExpressionData(const JSTextPosition& divot, const JSTextPosition& start, const JSTextPosition& end)
309 , m_divotStart(start)
312 ASSERT(m_divot.offset >= m_divot.lineStartOffset);
313 ASSERT(m_divotStart.offset >= m_divotStart.lineStartOffset);
314 ASSERT(m_divotEnd.offset >= m_divotEnd.lineStartOffset);
317 void setExceptionSourceCode(const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
319 ASSERT(divot.offset >= divot.lineStartOffset);
320 ASSERT(divotStart.offset >= divotStart.lineStartOffset);
321 ASSERT(divotEnd.offset >= divotEnd.lineStartOffset);
323 m_divotStart = divotStart;
324 m_divotEnd = divotEnd;
327 const JSTextPosition& divot() const { return m_divot; }
328 const JSTextPosition& divotStart() const { return m_divotStart; }
329 const JSTextPosition& divotEnd() const { return m_divotEnd; }
332 RegisterID* emitThrowReferenceError(BytecodeGenerator&, const String& message);
335 JSTextPosition m_divot;
336 JSTextPosition m_divotStart;
337 JSTextPosition m_divotEnd;
340 class ThrowableSubExpressionData : public ThrowableExpressionData {
342 ThrowableSubExpressionData()
343 : m_subexpressionDivotOffset(0)
344 , m_subexpressionEndOffset(0)
345 , m_subexpressionLineOffset(0)
346 , m_subexpressionLineStartOffset(0)
350 ThrowableSubExpressionData(const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
351 : ThrowableExpressionData(divot, divotStart, divotEnd)
352 , m_subexpressionDivotOffset(0)
353 , m_subexpressionEndOffset(0)
354 , m_subexpressionLineOffset(0)
355 , m_subexpressionLineStartOffset(0)
359 void setSubexpressionInfo(const JSTextPosition& subexpressionDivot, int subexpressionOffset)
361 ASSERT(subexpressionDivot.offset <= divot().offset);
362 // Overflow means we can't do this safely, so just point at the primary divot,
363 // divotLine, or divotLineStart.
364 if ((divot() - subexpressionDivot.offset) & ~0xFFFF)
366 if ((divot().line - subexpressionDivot.line) & ~0xFFFF)
368 if ((divot().lineStartOffset - subexpressionDivot.lineStartOffset) & ~0xFFFF)
370 if ((divotEnd() - subexpressionOffset) & ~0xFFFF)
372 m_subexpressionDivotOffset = divot() - subexpressionDivot.offset;
373 m_subexpressionEndOffset = divotEnd() - subexpressionOffset;
374 m_subexpressionLineOffset = divot().line - subexpressionDivot.line;
375 m_subexpressionLineStartOffset = divot().lineStartOffset - subexpressionDivot.lineStartOffset;
378 JSTextPosition subexpressionDivot()
380 int newLine = divot().line - m_subexpressionLineOffset;
381 int newOffset = divot().offset - m_subexpressionDivotOffset;
382 int newLineStartOffset = divot().lineStartOffset - m_subexpressionLineStartOffset;
383 return JSTextPosition(newLine, newOffset, newLineStartOffset);
385 JSTextPosition subexpressionStart() { return divotStart(); }
386 JSTextPosition subexpressionEnd() { return divotEnd() - static_cast<int>(m_subexpressionEndOffset); }
389 uint16_t m_subexpressionDivotOffset;
390 uint16_t m_subexpressionEndOffset;
391 uint16_t m_subexpressionLineOffset;
392 uint16_t m_subexpressionLineStartOffset;
395 class ThrowablePrefixedSubExpressionData : public ThrowableExpressionData {
397 ThrowablePrefixedSubExpressionData()
398 : m_subexpressionDivotOffset(0)
399 , m_subexpressionStartOffset(0)
400 , m_subexpressionLineOffset(0)
401 , m_subexpressionLineStartOffset(0)
405 ThrowablePrefixedSubExpressionData(const JSTextPosition& divot, const JSTextPosition& start, const JSTextPosition& end)
406 : ThrowableExpressionData(divot, start, end)
407 , m_subexpressionDivotOffset(0)
408 , m_subexpressionStartOffset(0)
409 , m_subexpressionLineOffset(0)
410 , m_subexpressionLineStartOffset(0)
414 void setSubexpressionInfo(const JSTextPosition& subexpressionDivot, int subexpressionOffset)
416 ASSERT(subexpressionDivot.offset >= divot().offset);
417 // Overflow means we can't do this safely, so just point at the primary divot,
418 // divotLine, or divotLineStart.
419 if ((subexpressionDivot.offset - divot()) & ~0xFFFF)
421 if ((subexpressionDivot.line - divot().line) & ~0xFFFF)
423 if ((subexpressionDivot.lineStartOffset - divot().lineStartOffset) & ~0xFFFF)
425 if ((subexpressionOffset - divotStart()) & ~0xFFFF)
427 m_subexpressionDivotOffset = subexpressionDivot.offset - divot();
428 m_subexpressionStartOffset = subexpressionOffset - divotStart();
429 m_subexpressionLineOffset = subexpressionDivot.line - divot().line;
430 m_subexpressionLineStartOffset = subexpressionDivot.lineStartOffset - divot().lineStartOffset;
433 JSTextPosition subexpressionDivot()
435 int newLine = divot().line + m_subexpressionLineOffset;
436 int newOffset = divot().offset + m_subexpressionDivotOffset;
437 int newLineStartOffset = divot().lineStartOffset + m_subexpressionLineStartOffset;
438 return JSTextPosition(newLine, newOffset, newLineStartOffset);
440 JSTextPosition subexpressionStart() { return divotStart() + static_cast<int>(m_subexpressionStartOffset); }
441 JSTextPosition subexpressionEnd() { return divotEnd(); }
444 uint16_t m_subexpressionDivotOffset;
445 uint16_t m_subexpressionStartOffset;
446 uint16_t m_subexpressionLineOffset;
447 uint16_t m_subexpressionLineStartOffset;
450 #if ENABLE(ES6_TEMPLATE_LITERAL_SYNTAX)
451 class TemplateExpressionListNode : public ParserArenaFreeable {
453 TemplateExpressionListNode(ExpressionNode*);
454 TemplateExpressionListNode(TemplateExpressionListNode*, ExpressionNode*);
456 ExpressionNode* value() { return m_node; }
457 TemplateExpressionListNode* next() { return m_next; }
460 TemplateExpressionListNode* m_next { nullptr };
461 ExpressionNode* m_node { nullptr };
464 class TemplateStringNode : public ExpressionNode {
466 TemplateStringNode(const JSTokenLocation&, const Identifier& cooked, const Identifier& raw);
468 const Identifier& cooked() { return m_cooked; }
469 const Identifier& raw() { return m_raw; }
472 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
474 const Identifier& m_cooked;
475 const Identifier& m_raw;
478 class TemplateStringListNode : public ParserArenaFreeable {
480 TemplateStringListNode(TemplateStringNode*);
481 TemplateStringListNode(TemplateStringListNode*, TemplateStringNode*);
483 TemplateStringNode* value() { return m_node; }
484 TemplateStringListNode* next() { return m_next; }
487 TemplateStringListNode* m_next { nullptr };
488 TemplateStringNode* m_node { nullptr };
491 class TemplateLiteralNode : public ExpressionNode {
493 TemplateLiteralNode(const JSTokenLocation&, TemplateStringListNode*);
494 TemplateLiteralNode(const JSTokenLocation&, TemplateStringListNode*, TemplateExpressionListNode*);
496 TemplateStringListNode* templateStrings() const { return m_templateStrings; }
497 TemplateExpressionListNode* templateExpressions() const { return m_templateExpressions; }
500 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
502 TemplateStringListNode* m_templateStrings;
503 TemplateExpressionListNode* m_templateExpressions;
506 class TaggedTemplateNode : public ExpressionNode, public ThrowableExpressionData {
508 TaggedTemplateNode(const JSTokenLocation&, ExpressionNode*, TemplateLiteralNode*);
510 TemplateLiteralNode* templateLiteral() const { return m_templateLiteral; }
513 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
515 ExpressionNode* m_tag;
516 TemplateLiteralNode* m_templateLiteral;
520 class RegExpNode : public ExpressionNode, public ThrowableExpressionData {
522 RegExpNode(const JSTokenLocation&, const Identifier& pattern, const Identifier& flags);
525 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
527 const Identifier& m_pattern;
528 const Identifier& m_flags;
531 class ThisNode : public ExpressionNode {
533 ThisNode(const JSTokenLocation&, ThisTDZMode);
536 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
538 bool m_shouldAlwaysEmitTDZCheck;
541 class SuperNode final : public ExpressionNode {
543 SuperNode(const JSTokenLocation&);
546 virtual bool isSuperNode() const override { return true; }
547 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
550 class NewTargetNode final : public ExpressionNode {
552 NewTargetNode(const JSTokenLocation&);
555 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
558 class ResolveNode : public ExpressionNode {
560 ResolveNode(const JSTokenLocation&, const Identifier&, const JSTextPosition& start);
562 const Identifier& identifier() const { return m_ident; }
565 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
567 virtual bool isPure(BytecodeGenerator&) const override;
568 virtual bool isLocation() const override { return true; }
569 virtual bool isResolveNode() const override { return true; }
571 const Identifier& m_ident;
572 JSTextPosition m_start;
575 class ElementNode : public ParserArenaFreeable {
577 ElementNode(int elision, ExpressionNode*);
578 ElementNode(ElementNode*, int elision, ExpressionNode*);
580 int elision() const { return m_elision; }
581 ExpressionNode* value() { return m_node; }
582 ElementNode* next() { return m_next; }
587 ExpressionNode* m_node;
590 class ArrayNode : public ExpressionNode {
592 ArrayNode(const JSTokenLocation&, int elision);
593 ArrayNode(const JSTokenLocation&, ElementNode*);
594 ArrayNode(const JSTokenLocation&, int elision, ElementNode*);
596 ArgumentListNode* toArgumentList(ParserArena&, int, int) const;
598 ElementNode* elements() const { ASSERT(isSimpleArray()); return m_element; }
600 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
602 virtual bool isSimpleArray() const override;
604 ElementNode* m_element;
609 class PropertyNode : public ParserArenaFreeable {
611 enum Type { Constant = 1, Getter = 2, Setter = 4, Computed = 8, Shorthand = 16 };
612 enum PutType { Unknown, KnownDirect };
614 PropertyNode(const Identifier&, ExpressionNode*, Type, PutType, SuperBinding);
615 PropertyNode(ExpressionNode* propertyName, ExpressionNode*, Type, PutType);
617 ExpressionNode* expressionName() const { return m_expression; }
618 const Identifier* name() const { return m_name; }
620 Type type() const { return static_cast<Type>(m_type); }
621 bool needsSuperBinding() const { return m_needsSuperBinding; }
622 PutType putType() const { return static_cast<PutType>(m_putType); }
625 friend class PropertyListNode;
626 const Identifier* m_name;
627 ExpressionNode* m_expression;
628 ExpressionNode* m_assign;
630 unsigned m_needsSuperBinding : 1;
631 unsigned m_putType : 1;
634 class PropertyListNode : public ExpressionNode {
636 PropertyListNode(const JSTokenLocation&, PropertyNode*);
637 PropertyListNode(const JSTokenLocation&, PropertyNode*, PropertyListNode*);
640 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
641 void emitPutConstantProperty(BytecodeGenerator&, RegisterID*, PropertyNode&);
643 PropertyNode* m_node;
644 PropertyListNode* m_next;
647 class ObjectLiteralNode : public ExpressionNode {
649 ObjectLiteralNode(const JSTokenLocation&);
650 ObjectLiteralNode(const JSTokenLocation&, PropertyListNode*);
653 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
655 PropertyListNode* m_list;
658 class BracketAccessorNode : public ExpressionNode, public ThrowableExpressionData {
660 BracketAccessorNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments);
662 ExpressionNode* base() const { return m_base; }
663 ExpressionNode* subscript() const { return m_subscript; }
665 bool subscriptHasAssignments() const { return m_subscriptHasAssignments; }
668 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
670 virtual bool isLocation() const override { return true; }
671 virtual bool isBracketAccessorNode() const override { return true; }
673 ExpressionNode* m_base;
674 ExpressionNode* m_subscript;
675 bool m_subscriptHasAssignments;
678 class DotAccessorNode : public ExpressionNode, public ThrowableExpressionData {
680 DotAccessorNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&);
682 ExpressionNode* base() const { return m_base; }
683 const Identifier& identifier() const { return m_ident; }
686 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
688 virtual bool isLocation() const override { return true; }
689 virtual bool isDotAccessorNode() const override { return true; }
691 ExpressionNode* m_base;
692 const Identifier& m_ident;
695 class SpreadExpressionNode : public ExpressionNode, public ThrowableExpressionData {
697 SpreadExpressionNode(const JSTokenLocation&, ExpressionNode*);
699 ExpressionNode* expression() const { return m_expression; }
702 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
704 virtual bool isSpreadExpression() const override { return true; }
705 ExpressionNode* m_expression;
708 class ArgumentListNode : public ExpressionNode {
710 ArgumentListNode(const JSTokenLocation&, ExpressionNode*);
711 ArgumentListNode(const JSTokenLocation&, ArgumentListNode*, ExpressionNode*);
713 ArgumentListNode* m_next;
714 ExpressionNode* m_expr;
717 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
720 class ArgumentsNode : public ParserArenaFreeable {
723 ArgumentsNode(ArgumentListNode*);
725 ArgumentListNode* m_listNode;
728 class NewExprNode : public ExpressionNode, public ThrowableExpressionData {
730 NewExprNode(const JSTokenLocation&, ExpressionNode*);
731 NewExprNode(const JSTokenLocation&, ExpressionNode*, ArgumentsNode*);
734 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
736 ExpressionNode* m_expr;
737 ArgumentsNode* m_args;
740 class EvalFunctionCallNode : public ExpressionNode, public ThrowableExpressionData {
742 EvalFunctionCallNode(const JSTokenLocation&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
745 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
747 ArgumentsNode* m_args;
750 class FunctionCallValueNode : public ExpressionNode, public ThrowableExpressionData {
752 FunctionCallValueNode(const JSTokenLocation&, ExpressionNode*, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
755 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
757 ExpressionNode* m_expr;
758 ArgumentsNode* m_args;
761 class FunctionCallResolveNode : public ExpressionNode, public ThrowableExpressionData {
763 FunctionCallResolveNode(const JSTokenLocation&, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
766 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
768 const Identifier& m_ident;
769 ArgumentsNode* m_args;
772 class FunctionCallBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
774 FunctionCallBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
777 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
779 ExpressionNode* m_base;
780 ExpressionNode* m_subscript;
781 ArgumentsNode* m_args;
782 bool m_subscriptHasAssignments;
785 class FunctionCallDotNode : public ExpressionNode, public ThrowableSubExpressionData {
787 FunctionCallDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
790 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
793 ExpressionNode* m_base;
794 const Identifier& m_ident;
795 ArgumentsNode* m_args;
798 class BytecodeIntrinsicNode : public ExpressionNode, public ThrowableExpressionData {
800 typedef RegisterID* (BytecodeIntrinsicNode::* EmitterType)(BytecodeGenerator&, RegisterID*);
802 BytecodeIntrinsicNode(const JSTokenLocation&, EmitterType, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
804 const Identifier& identifier() const { return m_ident; }
806 #define JSC_DECLARE_BYTECODE_INTRINSIC_FUNCTIONS(name) RegisterID* emit_intrinsic_##name(BytecodeGenerator&, RegisterID*);
807 JSC_COMMON_BYTECODE_INTRINSICS_EACH_NAME(JSC_DECLARE_BYTECODE_INTRINSIC_FUNCTIONS)
808 #undef JSC_DECLARE_BYTECODE_INTRINSIC_FUNCTIONS
811 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
813 EmitterType m_emitter;
814 const Identifier& m_ident;
815 ArgumentsNode* m_args;
818 class CallFunctionCallDotNode : public FunctionCallDotNode {
820 CallFunctionCallDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
823 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
826 class ApplyFunctionCallDotNode : public FunctionCallDotNode {
828 ApplyFunctionCallDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
831 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
834 class DeleteResolveNode : public ExpressionNode, public ThrowableExpressionData {
836 DeleteResolveNode(const JSTokenLocation&, const Identifier&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
839 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
841 const Identifier& m_ident;
844 class DeleteBracketNode : public ExpressionNode, public ThrowableExpressionData {
846 DeleteBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
849 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
851 ExpressionNode* m_base;
852 ExpressionNode* m_subscript;
855 class DeleteDotNode : public ExpressionNode, public ThrowableExpressionData {
857 DeleteDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
860 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
862 ExpressionNode* m_base;
863 const Identifier& m_ident;
866 class DeleteValueNode : public ExpressionNode {
868 DeleteValueNode(const JSTokenLocation&, ExpressionNode*);
871 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
873 ExpressionNode* m_expr;
876 class VoidNode : public ExpressionNode {
878 VoidNode(const JSTokenLocation&, ExpressionNode*);
881 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
883 ExpressionNode* m_expr;
886 class TypeOfResolveNode : public ExpressionNode {
888 TypeOfResolveNode(const JSTokenLocation&, const Identifier&);
890 const Identifier& identifier() const { return m_ident; }
893 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
895 const Identifier& m_ident;
898 class TypeOfValueNode : public ExpressionNode {
900 TypeOfValueNode(const JSTokenLocation&, ExpressionNode*);
903 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
905 ExpressionNode* m_expr;
908 class PrefixNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
910 PrefixNode(const JSTokenLocation&, ExpressionNode*, Operator, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
913 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
914 virtual RegisterID* emitResolve(BytecodeGenerator&, RegisterID* = 0);
915 virtual RegisterID* emitBracket(BytecodeGenerator&, RegisterID* = 0);
916 virtual RegisterID* emitDot(BytecodeGenerator&, RegisterID* = 0);
918 ExpressionNode* m_expr;
922 class PostfixNode : public PrefixNode {
924 PostfixNode(const JSTokenLocation&, ExpressionNode*, Operator, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
927 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
928 virtual RegisterID* emitResolve(BytecodeGenerator&, RegisterID* = 0) override;
929 virtual RegisterID* emitBracket(BytecodeGenerator&, RegisterID* = 0) override;
930 virtual RegisterID* emitDot(BytecodeGenerator&, RegisterID* = 0) override;
933 class UnaryOpNode : public ExpressionNode {
935 UnaryOpNode(const JSTokenLocation&, ResultType, ExpressionNode*, OpcodeID);
938 ExpressionNode* expr() { return m_expr; }
939 const ExpressionNode* expr() const { return m_expr; }
942 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
944 OpcodeID opcodeID() const { return m_opcodeID; }
946 ExpressionNode* m_expr;
950 class UnaryPlusNode : public UnaryOpNode {
952 UnaryPlusNode(const JSTokenLocation&, ExpressionNode*);
955 virtual ExpressionNode* stripUnaryPlus() override { return expr(); }
958 class NegateNode : public UnaryOpNode {
960 NegateNode(const JSTokenLocation&, ExpressionNode*);
963 class BitwiseNotNode : public ExpressionNode {
965 BitwiseNotNode(const JSTokenLocation&, ExpressionNode*);
968 ExpressionNode* expr() { return m_expr; }
969 const ExpressionNode* expr() const { return m_expr; }
972 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
974 ExpressionNode* m_expr;
977 class LogicalNotNode : public UnaryOpNode {
979 LogicalNotNode(const JSTokenLocation&, ExpressionNode*);
981 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, FallThroughMode) override;
984 class BinaryOpNode : public ExpressionNode {
986 BinaryOpNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
987 BinaryOpNode(const JSTokenLocation&, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
989 RegisterID* emitStrcat(BytecodeGenerator& generator, RegisterID* destination, RegisterID* lhs = 0, ReadModifyResolveNode* emitExpressionInfoForMe = 0);
990 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, FallThroughMode) override;
992 ExpressionNode* lhs() { return m_expr1; };
993 ExpressionNode* rhs() { return m_expr2; };
996 void tryFoldToBranch(BytecodeGenerator&, TriState& branchCondition, ExpressionNode*& branchExpression);
997 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1000 OpcodeID opcodeID() const { return m_opcodeID; }
1003 ExpressionNode* m_expr1;
1004 ExpressionNode* m_expr2;
1006 OpcodeID m_opcodeID;
1008 bool m_rightHasAssignments;
1011 class MultNode : public BinaryOpNode {
1013 MultNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1016 class DivNode : public BinaryOpNode {
1018 DivNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1021 class ModNode : public BinaryOpNode {
1023 ModNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1026 class AddNode : public BinaryOpNode {
1028 AddNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1030 virtual bool isAdd() const override { return true; }
1033 class SubNode : public BinaryOpNode {
1035 SubNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1037 virtual bool isSubtract() const override { return true; }
1040 class LeftShiftNode : public BinaryOpNode {
1042 LeftShiftNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1045 class RightShiftNode : public BinaryOpNode {
1047 RightShiftNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1050 class UnsignedRightShiftNode : public BinaryOpNode {
1052 UnsignedRightShiftNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1055 class LessNode : public BinaryOpNode {
1057 LessNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1060 class GreaterNode : public BinaryOpNode {
1062 GreaterNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1065 class LessEqNode : public BinaryOpNode {
1067 LessEqNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1070 class GreaterEqNode : public BinaryOpNode {
1072 GreaterEqNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1075 class ThrowableBinaryOpNode : public BinaryOpNode, public ThrowableExpressionData {
1077 ThrowableBinaryOpNode(const JSTokenLocation&, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
1078 ThrowableBinaryOpNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
1081 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1084 class InstanceOfNode : public ThrowableBinaryOpNode {
1086 InstanceOfNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1089 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1092 class InNode : public ThrowableBinaryOpNode {
1094 InNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1097 class EqualNode : public BinaryOpNode {
1099 EqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1102 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1105 class NotEqualNode : public BinaryOpNode {
1107 NotEqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1110 class StrictEqualNode : public BinaryOpNode {
1112 StrictEqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1115 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1118 class NotStrictEqualNode : public BinaryOpNode {
1120 NotStrictEqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1123 class BitAndNode : public BinaryOpNode {
1125 BitAndNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1128 class BitOrNode : public BinaryOpNode {
1130 BitOrNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1133 class BitXOrNode : public BinaryOpNode {
1135 BitXOrNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1138 // m_expr1 && m_expr2, m_expr1 || m_expr2
1139 class LogicalOpNode : public ExpressionNode {
1141 LogicalOpNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator);
1144 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1145 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, FallThroughMode) override;
1147 ExpressionNode* m_expr1;
1148 ExpressionNode* m_expr2;
1149 LogicalOperator m_operator;
1152 // The ternary operator, "m_logical ? m_expr1 : m_expr2"
1153 class ConditionalNode : public ExpressionNode {
1155 ConditionalNode(const JSTokenLocation&, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2);
1158 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1160 ExpressionNode* m_logical;
1161 ExpressionNode* m_expr1;
1162 ExpressionNode* m_expr2;
1165 class ReadModifyResolveNode : public ExpressionNode, public ThrowableExpressionData {
1167 ReadModifyResolveNode(const JSTokenLocation&, const Identifier&, Operator, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
1170 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1172 const Identifier& m_ident;
1173 ExpressionNode* m_right;
1174 Operator m_operator;
1175 bool m_rightHasAssignments;
1178 class AssignResolveNode : public ExpressionNode, public ThrowableExpressionData {
1180 AssignResolveNode(const JSTokenLocation&, const Identifier&, ExpressionNode* right, AssignmentContext);
1183 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1185 const Identifier& m_ident;
1186 ExpressionNode* m_right;
1187 AssignmentContext m_assignmentContext;
1190 class ReadModifyBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
1192 ReadModifyBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, Operator, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
1195 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1197 ExpressionNode* m_base;
1198 ExpressionNode* m_subscript;
1199 ExpressionNode* m_right;
1200 unsigned m_operator : 30;
1201 bool m_subscriptHasAssignments : 1;
1202 bool m_rightHasAssignments : 1;
1205 class AssignBracketNode : public ExpressionNode, public ThrowableExpressionData {
1207 AssignBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
1210 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1212 ExpressionNode* m_base;
1213 ExpressionNode* m_subscript;
1214 ExpressionNode* m_right;
1215 bool m_subscriptHasAssignments : 1;
1216 bool m_rightHasAssignments : 1;
1219 class AssignDotNode : public ExpressionNode, public ThrowableExpressionData {
1221 AssignDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
1224 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1226 ExpressionNode* m_base;
1227 const Identifier& m_ident;
1228 ExpressionNode* m_right;
1229 bool m_rightHasAssignments;
1232 class ReadModifyDotNode : public ExpressionNode, public ThrowableSubExpressionData {
1234 ReadModifyDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, Operator, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
1237 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1239 ExpressionNode* m_base;
1240 const Identifier& m_ident;
1241 ExpressionNode* m_right;
1242 unsigned m_operator : 31;
1243 bool m_rightHasAssignments : 1;
1246 class AssignErrorNode : public ExpressionNode, public ThrowableExpressionData {
1248 AssignErrorNode(const JSTokenLocation&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
1251 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1254 class CommaNode final : public ExpressionNode {
1256 CommaNode(const JSTokenLocation&, ExpressionNode*);
1258 void setNext(CommaNode* next) { m_next = next; }
1259 CommaNode* next() { return m_next; }
1262 virtual bool isCommaNode() const override { return true; }
1263 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1265 ExpressionNode* m_expr;
1269 class SourceElements final : public ParserArenaFreeable {
1273 void append(StatementNode*);
1275 StatementNode* singleStatement() const;
1276 StatementNode* lastStatement() const;
1278 void emitBytecode(BytecodeGenerator&, RegisterID* destination);
1281 StatementNode* m_head;
1282 StatementNode* m_tail;
1285 class BlockNode : public StatementNode, public VariableEnvironmentNode {
1287 BlockNode(const JSTokenLocation&, SourceElements*, VariableEnvironment&);
1289 StatementNode* singleStatement() const;
1290 StatementNode* lastStatement() const;
1293 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1295 virtual bool isBlock() const override { return true; }
1297 SourceElements* m_statements;
1300 class EmptyStatementNode : public StatementNode {
1302 EmptyStatementNode(const JSTokenLocation&);
1305 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1307 virtual bool isEmptyStatement() const override { return true; }
1310 class DebuggerStatementNode : public StatementNode {
1312 DebuggerStatementNode(const JSTokenLocation&);
1315 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1318 class ExprStatementNode : public StatementNode {
1320 ExprStatementNode(const JSTokenLocation&, ExpressionNode*);
1322 ExpressionNode* expr() const { return m_expr; }
1325 virtual bool isExprStatement() const override { return true; }
1327 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1329 ExpressionNode* m_expr;
1332 class DeclarationStatement : public StatementNode {
1334 DeclarationStatement(const JSTokenLocation&, ExpressionNode*);
1336 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1338 ExpressionNode* m_expr;
1341 class EmptyVarExpression : public ExpressionNode {
1343 EmptyVarExpression(const JSTokenLocation&, const Identifier&);
1346 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1348 const Identifier& m_ident;
1351 class EmptyLetExpression : public ExpressionNode {
1353 EmptyLetExpression(const JSTokenLocation&, const Identifier&);
1356 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1358 const Identifier& m_ident;
1361 class IfElseNode : public StatementNode {
1363 IfElseNode(const JSTokenLocation&, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock);
1366 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1367 bool tryFoldBreakAndContinue(BytecodeGenerator&, StatementNode* ifBlock,
1368 Label*& trueTarget, FallThroughMode&);
1370 ExpressionNode* m_condition;
1371 StatementNode* m_ifBlock;
1372 StatementNode* m_elseBlock;
1375 class DoWhileNode : public StatementNode {
1377 DoWhileNode(const JSTokenLocation&, StatementNode*, ExpressionNode*);
1380 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1382 StatementNode* m_statement;
1383 ExpressionNode* m_expr;
1386 class WhileNode : public StatementNode {
1388 WhileNode(const JSTokenLocation&, ExpressionNode*, StatementNode*);
1391 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1393 ExpressionNode* m_expr;
1394 StatementNode* m_statement;
1397 class ForNode : public StatementNode, public VariableEnvironmentNode {
1399 ForNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode*, VariableEnvironment&);
1402 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1404 ExpressionNode* m_expr1;
1405 ExpressionNode* m_expr2;
1406 ExpressionNode* m_expr3;
1407 StatementNode* m_statement;
1410 class DestructuringPatternNode;
1412 class EnumerationNode : public StatementNode, public ThrowableExpressionData, public VariableEnvironmentNode {
1414 EnumerationNode(const JSTokenLocation&, ExpressionNode*, ExpressionNode*, StatementNode*, VariableEnvironment&);
1417 ExpressionNode* m_lexpr;
1418 ExpressionNode* m_expr;
1419 StatementNode* m_statement;
1422 class ForInNode : public EnumerationNode {
1424 ForInNode(const JSTokenLocation&, ExpressionNode*, ExpressionNode*, StatementNode*, VariableEnvironment&);
1427 RegisterID* tryGetBoundLocal(BytecodeGenerator&);
1428 void emitLoopHeader(BytecodeGenerator&, RegisterID* propertyName);
1429 void emitMultiLoopBytecode(BytecodeGenerator&, RegisterID* dst);
1431 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1434 class ForOfNode : public EnumerationNode {
1436 ForOfNode(const JSTokenLocation&, ExpressionNode*, ExpressionNode*, StatementNode*, VariableEnvironment&);
1439 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1442 class ContinueNode : public StatementNode, public ThrowableExpressionData {
1444 ContinueNode(const JSTokenLocation&, const Identifier&);
1445 Label* trivialTarget(BytecodeGenerator&);
1448 virtual bool isContinue() const override { return true; }
1449 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1451 const Identifier& m_ident;
1454 class BreakNode : public StatementNode, public ThrowableExpressionData {
1456 BreakNode(const JSTokenLocation&, const Identifier&);
1457 Label* trivialTarget(BytecodeGenerator&);
1460 virtual bool isBreak() const override { return true; }
1461 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1463 const Identifier& m_ident;
1466 class ReturnNode : public StatementNode, public ThrowableExpressionData {
1468 ReturnNode(const JSTokenLocation&, ExpressionNode* value);
1470 ExpressionNode* value() { return m_value; }
1473 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1475 virtual bool isReturnNode() const override { return true; }
1477 ExpressionNode* m_value;
1480 class WithNode : public StatementNode {
1482 WithNode(const JSTokenLocation&, ExpressionNode*, StatementNode*, const JSTextPosition& divot, uint32_t expressionLength);
1485 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1487 ExpressionNode* m_expr;
1488 StatementNode* m_statement;
1489 JSTextPosition m_divot;
1490 uint32_t m_expressionLength;
1493 class LabelNode : public StatementNode, public ThrowableExpressionData {
1495 LabelNode(const JSTokenLocation&, const Identifier& name, StatementNode*);
1498 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1500 const Identifier& m_name;
1501 StatementNode* m_statement;
1504 class ThrowNode : public StatementNode, public ThrowableExpressionData {
1506 ThrowNode(const JSTokenLocation&, ExpressionNode*);
1509 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1511 ExpressionNode* m_expr;
1514 class TryNode : public StatementNode {
1516 TryNode(const JSTokenLocation&, StatementNode* tryBlock, const Identifier& exceptionIdent, StatementNode* catchBlock, VariableEnvironment& catchEnvironment, StatementNode* finallyBlock);
1519 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1521 StatementNode* m_tryBlock;
1522 const Identifier& m_thrownValueIdent;
1523 StatementNode* m_catchBlock;
1524 StatementNode* m_finallyBlock;
1525 VariableEnvironment m_catchEnvironment;
1528 class ScopeNode : public StatementNode, public ParserArenaRoot, public VariableEnvironmentNode {
1530 typedef DeclarationStacks::FunctionStack FunctionStack;
1532 ScopeNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, bool inStrictContext);
1533 ScopeNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, const SourceCode&, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, CodeFeatures, int numConstants);
1535 using ParserArenaRoot::operator new;
1537 const SourceCode& source() const { return m_source; }
1538 const String& sourceURL() const { return m_source.provider()->url(); }
1539 intptr_t sourceID() const { return m_source.providerID(); }
1541 int startLine() const { return m_startLineNumber; }
1542 int startStartOffset() const { return m_startStartOffset; }
1543 int startLineStartOffset() const { return m_startLineStartOffset; }
1545 void setFeatures(CodeFeatures features) { m_features = features; }
1546 CodeFeatures features() { return m_features; }
1548 bool usesEval() const { return m_features & EvalFeature; }
1549 bool usesArguments() const { return (m_features & ArgumentsFeature) && !(m_features & ShadowsArgumentsFeature); }
1550 bool modifiesParameter() const { return m_features & ModifiedParameterFeature; }
1551 bool modifiesArguments() const { return m_features & (EvalFeature | ModifiedArgumentsFeature); }
1552 bool isStrictMode() const { return m_features & StrictModeFeature; }
1553 void setUsesArguments() { m_features |= ArgumentsFeature; }
1554 bool usesThis() const { return m_features & ThisFeature; }
1555 bool needsActivationForMoreThanVariables() const { return m_features & (EvalFeature | WithFeature | CatchFeature); }
1556 bool needsActivation() const { return (hasCapturedVariables()) || (m_features & (EvalFeature | WithFeature | CatchFeature)); }
1557 bool hasCapturedVariables() const { return m_varDeclarations.hasCapturedVariables(); }
1558 bool captures(UniquedStringImpl* uid) { return m_varDeclarations.captures(uid); }
1559 bool captures(const Identifier& ident) { return captures(ident.impl()); }
1561 VariableEnvironment& varDeclarations() { return m_varDeclarations; }
1562 FunctionStack& functionStack() { return m_functionStack; }
1564 int neededConstants()
1566 // We may need 2 more constants than the count given by the parser,
1567 // because of the various uses of jsUndefined() and jsNull().
1568 return m_numConstants + 2;
1571 StatementNode* singleStatement() const;
1573 void emitStatementsBytecode(BytecodeGenerator&, RegisterID* destination);
1575 void setClosedVariables(Vector<RefPtr<UniquedStringImpl>>&&) { }
1578 int m_startLineNumber;
1579 unsigned m_startStartOffset;
1580 unsigned m_startLineStartOffset;
1583 CodeFeatures m_features;
1584 SourceCode m_source;
1585 VariableEnvironment m_varDeclarations;
1586 FunctionStack m_functionStack;
1588 SourceElements* m_statements;
1591 class ProgramNode : public ScopeNode {
1593 ProgramNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, FunctionParameters*, const SourceCode&, CodeFeatures, int numConstants);
1595 unsigned startColumn() const { return m_startColumn; }
1596 unsigned endColumn() const { return m_endColumn; }
1598 static const bool scopeIsFunction = false;
1600 void setClosedVariables(Vector<RefPtr<UniquedStringImpl>>&&);
1601 const Vector<RefPtr<UniquedStringImpl>>& closedVariables() const { return m_closedVariables; }
1604 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1605 Vector<RefPtr<UniquedStringImpl>> m_closedVariables;
1606 unsigned m_startColumn;
1607 unsigned m_endColumn;
1610 class EvalNode : public ScopeNode {
1612 EvalNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, FunctionParameters*, const SourceCode&, CodeFeatures, int numConstants);
1614 ALWAYS_INLINE unsigned startColumn() const { return 0; }
1615 unsigned endColumn() const { return m_endColumn; }
1617 static const bool scopeIsFunction = false;
1620 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1622 unsigned m_endColumn;
1625 class ModuleProgramNode : public ScopeNode {
1627 ModuleProgramNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, FunctionParameters*, const SourceCode&, CodeFeatures, int numConstants);
1629 unsigned startColumn() const { return m_startColumn; }
1630 unsigned endColumn() const { return m_endColumn; }
1632 static const bool scopeIsFunction = false;
1635 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1636 unsigned m_startColumn;
1637 unsigned m_endColumn;
1640 class ModuleSpecifierNode : public Node {
1642 ModuleSpecifierNode(const JSTokenLocation&, const Identifier& moduleName);
1644 const Identifier& moduleName() { return m_moduleName; }
1647 const Identifier& m_moduleName;
1650 class ImportSpecifierNode : public Node {
1652 ImportSpecifierNode(const JSTokenLocation&, const Identifier& importedName, const Identifier& localName);
1654 const Identifier& importedName() { return m_importedName; }
1655 const Identifier& localName() { return m_localName; }
1658 const Identifier& m_importedName;
1659 const Identifier& m_localName;
1662 class ImportSpecifierListNode : public ParserArenaDeletable {
1664 typedef Vector<ImportSpecifierNode*, 3> Specifiers;
1666 const Specifiers& specifiers() const { return m_specifiers; }
1667 void append(ImportSpecifierNode* specifier)
1669 m_specifiers.append(specifier);
1673 Specifiers m_specifiers;
1676 class ImportDeclarationNode : public StatementNode {
1678 ImportDeclarationNode(const JSTokenLocation&, ImportSpecifierListNode*, ModuleSpecifierNode*);
1680 ImportSpecifierListNode* specifierList() const { return m_specifierList; }
1681 ModuleSpecifierNode* moduleSpecifier() const { return m_moduleSpecifier; }
1684 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1686 ImportSpecifierListNode* m_specifierList;
1687 ModuleSpecifierNode* m_moduleSpecifier;
1690 class ExportAllDeclarationNode : public StatementNode {
1692 ExportAllDeclarationNode(const JSTokenLocation&, ModuleSpecifierNode*);
1694 ModuleSpecifierNode* moduleSpecifier() const { return m_moduleSpecifier; }
1697 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1698 ModuleSpecifierNode* m_moduleSpecifier;
1701 class ExportDefaultDeclarationNode : public StatementNode {
1703 ExportDefaultDeclarationNode(const JSTokenLocation&, StatementNode*);
1705 const StatementNode& declaration() const { return *m_declaration; }
1708 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1709 StatementNode* m_declaration;
1712 class ExportLocalDeclarationNode : public StatementNode {
1714 ExportLocalDeclarationNode(const JSTokenLocation&, StatementNode*);
1716 const StatementNode& declaration() const { return *m_declaration; }
1719 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1720 StatementNode* m_declaration;
1723 class ExportSpecifierNode : public Node {
1725 ExportSpecifierNode(const JSTokenLocation&, const Identifier& localName, const Identifier& exportedName);
1727 const Identifier& exportedName() { return m_exportedName; }
1728 const Identifier& localName() { return m_localName; }
1731 const Identifier& m_localName;
1732 const Identifier& m_exportedName;
1735 class ExportSpecifierListNode : public ParserArenaDeletable {
1737 typedef Vector<ExportSpecifierNode*, 3> Specifiers;
1739 const Specifiers& specifiers() const { return m_specifiers; }
1740 void append(ExportSpecifierNode* specifier)
1742 m_specifiers.append(specifier);
1746 Specifiers m_specifiers;
1749 class ExportNamedDeclarationNode : public StatementNode {
1751 ExportNamedDeclarationNode(const JSTokenLocation&, ExportSpecifierListNode*, ModuleSpecifierNode*);
1753 ExportSpecifierListNode* specifierList() const { return m_specifierList; }
1754 ModuleSpecifierNode* moduleSpecifier() const { return m_moduleSpecifier; }
1757 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1758 ExportSpecifierListNode* m_specifierList;
1759 ModuleSpecifierNode* m_moduleSpecifier { nullptr };
1762 class FunctionParameters : public ParserArenaDeletable {
1764 FunctionParameters();
1765 ALWAYS_INLINE unsigned size() const { return m_patterns.size(); }
1766 ALWAYS_INLINE std::pair<DestructuringPatternNode*, ExpressionNode*> at(unsigned index) { return m_patterns[index]; }
1767 bool hasDefaultParameterValues() const { return m_hasDefaultParameterValues; }
1768 ALWAYS_INLINE void append(DestructuringPatternNode* pattern, ExpressionNode* defaultValue)
1771 m_patterns.append(std::make_pair(pattern, defaultValue));
1773 m_hasDefaultParameterValues = true;
1778 Vector<std::pair<DestructuringPatternNode*, ExpressionNode*>, 3> m_patterns;
1779 bool m_hasDefaultParameterValues { false };
1782 class FunctionBodyNode final : public StatementNode, public ParserArenaDeletable {
1784 using ParserArenaDeletable::operator new;
1787 ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end,
1788 unsigned startColumn, unsigned endColumn, int functionKeywordStart,
1789 int functionNameStart, int parametersStart, bool isInStrictContext,
1790 ConstructorKind, unsigned, FunctionParseMode);
1792 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1794 void finishParsing(const SourceCode&, const Identifier&, FunctionMode);
1796 void overrideName(const Identifier& ident) { m_ident = ident; }
1797 const Identifier& ident() { return m_ident; }
1798 void setInferredName(const Identifier& inferredName) { ASSERT(!inferredName.isNull()); m_inferredName = inferredName; }
1799 const Identifier& inferredName() { return m_inferredName.isEmpty() ? m_ident : m_inferredName; }
1801 FunctionMode functionMode() { return m_functionMode; }
1803 int functionNameStart() const { return m_functionNameStart; }
1804 int functionKeywordStart() const { return m_functionKeywordStart; }
1805 int parametersStart() const { return m_parametersStart; }
1806 unsigned startColumn() const { return m_startColumn; }
1807 unsigned endColumn() const { return m_endColumn; }
1808 unsigned parameterCount() const { return m_parameterCount; }
1809 FunctionParseMode parseMode() const { return m_parseMode; }
1811 void setEndPosition(JSTextPosition);
1813 const SourceCode& source() const { return m_source; }
1815 int startStartOffset() const { return m_startStartOffset; }
1816 bool isInStrictContext() const { return m_isInStrictContext; }
1817 ConstructorKind constructorKind() { return static_cast<ConstructorKind>(m_constructorKind); }
1821 Identifier m_inferredName;
1822 FunctionMode m_functionMode;
1823 unsigned m_startColumn;
1824 unsigned m_endColumn;
1825 int m_functionKeywordStart;
1826 int m_functionNameStart;
1827 int m_parametersStart;
1828 SourceCode m_source;
1829 int m_startStartOffset;
1830 unsigned m_parameterCount;
1831 FunctionParseMode m_parseMode;
1832 unsigned m_isInStrictContext : 1;
1833 unsigned m_constructorKind : 2;
1836 class FunctionNode final : public ScopeNode {
1838 FunctionNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, FunctionParameters*, const SourceCode&, CodeFeatures, int numConstants);
1840 FunctionParameters* parameters() const { return m_parameters; }
1842 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1844 void finishParsing(const Identifier&, FunctionMode);
1846 const Identifier& ident() { return m_ident; }
1848 FunctionMode functionMode() { return m_functionMode; }
1850 unsigned startColumn() const { return m_startColumn; }
1851 unsigned endColumn() const { return m_endColumn; }
1853 static const bool scopeIsFunction = true;
1857 FunctionMode m_functionMode;
1858 FunctionParameters* m_parameters;
1859 unsigned m_startColumn;
1860 unsigned m_endColumn;
1863 class FuncExprNode : public ExpressionNode {
1865 FuncExprNode(const JSTokenLocation&, const Identifier&, FunctionBodyNode*, const SourceCode&);
1867 FunctionBodyNode* body() { return m_body; }
1870 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1872 virtual bool isFuncExprNode() const override { return true; }
1874 FunctionBodyNode* m_body;
1877 #if ENABLE(ES6_CLASS_SYNTAX)
1878 class ClassExprNode final : public ExpressionNode {
1880 ClassExprNode(const JSTokenLocation&, const Identifier&, ExpressionNode* constructorExpresssion,
1881 ExpressionNode* parentClass, PropertyListNode* instanceMethods, PropertyListNode* staticMethods);
1883 const Identifier& name() { return m_name; }
1886 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1888 const Identifier& m_name;
1889 ExpressionNode* m_constructorExpression;
1890 ExpressionNode* m_classHeritage;
1891 PropertyListNode* m_instanceMethods;
1892 PropertyListNode* m_staticMethods;
1896 class DestructuringPatternNode : public ParserArenaFreeable {
1898 virtual ~DestructuringPatternNode() { }
1899 virtual void collectBoundIdentifiers(Vector<Identifier>&) const = 0;
1900 virtual void bindValue(BytecodeGenerator&, RegisterID* source) const = 0;
1901 virtual void toString(StringBuilder&) const = 0;
1903 virtual bool isBindingNode() const { return false; }
1904 virtual RegisterID* emitDirectBinding(BytecodeGenerator&, RegisterID*, ExpressionNode*) { return 0; }
1907 DestructuringPatternNode();
1910 class ArrayPatternNode : public DestructuringPatternNode, public ThrowableExpressionData, public ParserArenaDeletable {
1912 using ParserArenaDeletable::operator new;
1915 enum class BindingType {
1921 void appendIndex(BindingType bindingType, const JSTokenLocation&, DestructuringPatternNode* node, ExpressionNode* defaultValue)
1923 m_targetPatterns.append({ bindingType, node, defaultValue });
1928 BindingType bindingType;
1929 DestructuringPatternNode* pattern;
1930 ExpressionNode* defaultValue;
1932 virtual void collectBoundIdentifiers(Vector<Identifier>&) const override;
1933 virtual void bindValue(BytecodeGenerator&, RegisterID*) const override;
1934 virtual RegisterID* emitDirectBinding(BytecodeGenerator&, RegisterID* dst, ExpressionNode*) override;
1935 virtual void toString(StringBuilder&) const override;
1937 Vector<Entry> m_targetPatterns;
1940 class ObjectPatternNode : public DestructuringPatternNode, public ParserArenaDeletable {
1942 using ParserArenaDeletable::operator new;
1944 ObjectPatternNode();
1945 void appendEntry(const JSTokenLocation&, const Identifier& identifier, bool wasString, DestructuringPatternNode* pattern, ExpressionNode* defaultValue)
1947 m_targetPatterns.append(Entry{ identifier, wasString, pattern, defaultValue });
1951 virtual void collectBoundIdentifiers(Vector<Identifier>&) const override;
1952 virtual void bindValue(BytecodeGenerator&, RegisterID*) const override;
1953 virtual void toString(StringBuilder&) const override;
1955 const Identifier& propertyName;
1957 DestructuringPatternNode* pattern;
1958 ExpressionNode* defaultValue;
1960 Vector<Entry> m_targetPatterns;
1963 class BindingNode : public DestructuringPatternNode {
1965 BindingNode(const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end, AssignmentContext);
1966 const Identifier& boundProperty() const { return m_boundProperty; }
1968 const JSTextPosition& divotStart() const { return m_divotStart; }
1969 const JSTextPosition& divotEnd() const { return m_divotEnd; }
1972 virtual void collectBoundIdentifiers(Vector<Identifier>&) const override;
1973 virtual void bindValue(BytecodeGenerator&, RegisterID*) const override;
1974 virtual void toString(StringBuilder&) const override;
1976 virtual bool isBindingNode() const override { return true; }
1978 JSTextPosition m_divotStart;
1979 JSTextPosition m_divotEnd;
1980 const Identifier& m_boundProperty;
1981 AssignmentContext m_bindingContext;
1984 class DestructuringAssignmentNode : public ExpressionNode {
1986 DestructuringAssignmentNode(const JSTokenLocation&, DestructuringPatternNode*, ExpressionNode*);
1987 DestructuringPatternNode* bindings() { return m_bindings; }
1990 virtual bool isAssignmentLocation() const override { return true; }
1991 virtual bool isDestructuringNode() const override { return true; }
1992 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1994 DestructuringPatternNode* m_bindings;
1995 ExpressionNode* m_initializer;
1998 class FuncDeclNode : public StatementNode {
2000 FuncDeclNode(const JSTokenLocation&, const Identifier&, FunctionBodyNode*, const SourceCode&);
2002 virtual bool isFuncDeclNode() const override { return true; }
2003 FunctionBodyNode* body() { return m_body; }
2006 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
2008 FunctionBodyNode* m_body;
2011 #if ENABLE(ES6_CLASS_SYNTAX)
2012 class ClassDeclNode final : public StatementNode {
2014 ClassDeclNode(const JSTokenLocation&, ExpressionNode* classExpression);
2017 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
2019 ExpressionNode* m_classDeclaration;
2023 class CaseClauseNode : public ParserArenaFreeable {
2025 CaseClauseNode(ExpressionNode*, SourceElements* = 0);
2027 ExpressionNode* expr() const { return m_expr; }
2029 void emitBytecode(BytecodeGenerator&, RegisterID* destination);
2030 void setStartOffset(int offset) { m_startOffset = offset; }
2033 ExpressionNode* m_expr;
2034 SourceElements* m_statements;
2038 class ClauseListNode : public ParserArenaFreeable {
2040 ClauseListNode(CaseClauseNode*);
2041 ClauseListNode(ClauseListNode*, CaseClauseNode*);
2043 CaseClauseNode* getClause() const { return m_clause; }
2044 ClauseListNode* getNext() const { return m_next; }
2047 CaseClauseNode* m_clause;
2048 ClauseListNode* m_next;
2051 class CaseBlockNode : public ParserArenaFreeable {
2053 CaseBlockNode(ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2);
2055 void emitBytecodeForBlock(BytecodeGenerator&, RegisterID* input, RegisterID* destination);
2058 SwitchInfo::SwitchType tryTableSwitch(Vector<ExpressionNode*, 8>& literalVector, int32_t& min_num, int32_t& max_num);
2059 static const size_t s_tableSwitchMinimum = 3;
2060 ClauseListNode* m_list1;
2061 CaseClauseNode* m_defaultClause;
2062 ClauseListNode* m_list2;
2065 class SwitchNode : public StatementNode, public VariableEnvironmentNode {
2067 SwitchNode(const JSTokenLocation&, ExpressionNode*, CaseBlockNode*, VariableEnvironment&);
2070 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
2072 ExpressionNode* m_expr;
2073 CaseBlockNode* m_block;
2076 struct ElementList {
2081 struct PropertyList {
2082 PropertyListNode* head;
2083 PropertyListNode* tail;
2086 struct ArgumentList {
2087 ArgumentListNode* head;
2088 ArgumentListNode* tail;
2092 ClauseListNode* head;
2093 ClauseListNode* tail;