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;
46 class PropertyListNode;
47 class ReadModifyResolveNode;
69 enum LogicalOperator {
74 enum FallThroughMode {
75 FallThroughMeansTrue = 0,
76 FallThroughMeansFalse = 1
78 inline FallThroughMode invert(FallThroughMode fallThroughMode) { return static_cast<FallThroughMode>(!fallThroughMode); }
80 typedef HashSet<RefPtr<UniquedStringImpl>, IdentifierRepHash> IdentifierSet;
82 namespace DeclarationStacks {
83 typedef Vector<FunctionBodyNode*> FunctionStack;
87 enum SwitchType { SwitchNone, SwitchImmediate, SwitchCharacter, SwitchString };
88 uint32_t bytecodeOffset;
89 SwitchType switchType;
92 enum class AssignmentContext { DeclarationStatement, AssignmentExpression };
94 class ParserArenaFreeable {
96 // ParserArenaFreeable objects are are freed when the arena is deleted.
97 // Destructors are not called. Clients must not call delete on such objects.
98 void* operator new(size_t, ParserArena&);
101 class ParserArenaDeletable {
103 virtual ~ParserArenaDeletable() { }
105 // ParserArenaDeletable objects are deleted when the arena is deleted.
106 // Clients must not call delete directly on such objects.
107 void* operator new(size_t, ParserArena&);
110 class ParserArenaRoot {
111 WTF_MAKE_FAST_ALLOCATED;
113 ParserArenaRoot(ParserArena&);
116 ParserArena& parserArena() { return m_arena; }
117 virtual ~ParserArenaRoot() { }
123 class Node : public ParserArenaFreeable {
125 Node(const JSTokenLocation&);
130 int firstLine() const { return m_position.line; }
131 int startOffset() const { return m_position.offset; }
132 int endOffset() const { return m_endOffset; }
133 int lineStartOffset() const { return m_position.lineStartOffset; }
134 const JSTextPosition& position() const { return m_position; }
135 void setEndOffset(int offset) { m_endOffset = offset; }
136 void setStartOffset(int offset) { m_position.offset = offset; }
139 JSTextPosition m_position;
143 class ExpressionNode : public Node {
145 ExpressionNode(const JSTokenLocation&, ResultType = ResultType::unknownType());
148 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* destination = 0) = 0;
150 virtual bool isNumber() const { return false; }
151 virtual bool isString() const { return false; }
152 virtual bool isNull() const { return false; }
153 virtual bool isPure(BytecodeGenerator&) const { return false; }
154 virtual bool isConstant() const { return false; }
155 virtual bool isLocation() const { return false; }
156 virtual bool isAssignmentLocation() const { return isLocation(); }
157 virtual bool isResolveNode() const { return false; }
158 virtual bool isBracketAccessorNode() const { return false; }
159 virtual bool isDotAccessorNode() const { return false; }
160 virtual bool isDestructuringNode() const { return false; }
161 virtual bool isFuncExprNode() const { return false; }
162 virtual bool isCommaNode() const { return false; }
163 virtual bool isSimpleArray() const { return false; }
164 virtual bool isAdd() const { return false; }
165 virtual bool isSubtract() const { return false; }
166 virtual bool isBoolean() const { return false; }
167 virtual bool isSpreadExpression() const { return false; }
168 virtual bool isSuperNode() const { return false; }
170 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label*, Label*, FallThroughMode);
172 virtual ExpressionNode* stripUnaryPlus() { return this; }
174 ResultType resultDescriptor() const { return m_resultType; }
177 ResultType m_resultType;
180 class StatementNode : public Node {
182 StatementNode(const JSTokenLocation&);
185 virtual void emitBytecode(BytecodeGenerator&, RegisterID* destination = 0) = 0;
187 void setLoc(unsigned firstLine, unsigned lastLine, int startOffset, int lineStartOffset);
188 unsigned lastLine() const { return m_lastLine; }
190 StatementNode* next() { return m_next; }
191 void setNext(StatementNode* next) { m_next = next; }
193 virtual bool isEmptyStatement() const { return false; }
194 virtual bool isReturnNode() const { return false; }
195 virtual bool isExprStatement() const { return false; }
196 virtual bool isBreak() const { return false; }
197 virtual bool isContinue() const { return false; }
198 virtual bool isBlock() const { return false; }
199 virtual bool isFuncDeclNode() const { return false; }
202 StatementNode* m_next;
206 class VariableEnvironmentNode {
208 VariableEnvironmentNode()
212 VariableEnvironmentNode(VariableEnvironment& lexicalDeclaredVariables);
214 VariableEnvironment& lexicalVariables() { return m_lexicalVariables; }
217 VariableEnvironment m_lexicalVariables;
220 class ConstantNode : public ExpressionNode {
222 ConstantNode(const JSTokenLocation&, ResultType);
223 virtual bool isPure(BytecodeGenerator&) const override { return true; }
224 virtual bool isConstant() const override { return true; }
225 virtual JSValue jsValue(BytecodeGenerator&) const = 0;
227 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
228 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, FallThroughMode) override;
231 class NullNode : public ConstantNode {
233 NullNode(const JSTokenLocation&);
236 virtual bool isNull() const override { return true; }
237 virtual JSValue jsValue(BytecodeGenerator&) const override { return jsNull(); }
240 class BooleanNode : public ConstantNode {
242 BooleanNode(const JSTokenLocation&, bool value);
243 bool value() { return m_value; }
246 virtual bool isBoolean() const override { return true; }
247 virtual JSValue jsValue(BytecodeGenerator&) const override { return jsBoolean(m_value); }
252 class NumberNode : public ConstantNode {
254 NumberNode(const JSTokenLocation&, double value);
255 double value() const { return m_value; }
256 virtual bool isIntegerNode() const = 0;
257 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override final;
260 virtual bool isNumber() const override final { return true; }
261 virtual JSValue jsValue(BytecodeGenerator&) const override { return jsNumber(m_value); }
266 class DoubleNode : public NumberNode {
268 DoubleNode(const JSTokenLocation&, double value);
271 virtual bool isIntegerNode() const override { return false; }
274 // An integer node represent a number represented as an integer (e.g. 42 instead of 42., 42.0, 42e0)
275 class IntegerNode : public DoubleNode {
277 IntegerNode(const JSTokenLocation&, double value);
278 virtual bool isIntegerNode() const override final { return true; }
281 class StringNode : public ConstantNode {
283 StringNode(const JSTokenLocation&, const Identifier&);
284 const Identifier& value() { return m_value; }
287 virtual bool isString() const override { return true; }
288 virtual JSValue jsValue(BytecodeGenerator&) const override;
290 const Identifier& m_value;
293 class ThrowableExpressionData {
295 ThrowableExpressionData()
296 : m_divot(-1, -1, -1)
297 , m_divotStart(-1, -1, -1)
298 , m_divotEnd(-1, -1, -1)
302 ThrowableExpressionData(const JSTextPosition& divot, const JSTextPosition& start, const JSTextPosition& end)
304 , m_divotStart(start)
307 ASSERT(m_divot.offset >= m_divot.lineStartOffset);
308 ASSERT(m_divotStart.offset >= m_divotStart.lineStartOffset);
309 ASSERT(m_divotEnd.offset >= m_divotEnd.lineStartOffset);
312 void setExceptionSourceCode(const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
314 ASSERT(divot.offset >= divot.lineStartOffset);
315 ASSERT(divotStart.offset >= divotStart.lineStartOffset);
316 ASSERT(divotEnd.offset >= divotEnd.lineStartOffset);
318 m_divotStart = divotStart;
319 m_divotEnd = divotEnd;
322 const JSTextPosition& divot() const { return m_divot; }
323 const JSTextPosition& divotStart() const { return m_divotStart; }
324 const JSTextPosition& divotEnd() const { return m_divotEnd; }
327 RegisterID* emitThrowReferenceError(BytecodeGenerator&, const String& message);
330 JSTextPosition m_divot;
331 JSTextPosition m_divotStart;
332 JSTextPosition m_divotEnd;
335 class ThrowableSubExpressionData : public ThrowableExpressionData {
337 ThrowableSubExpressionData()
338 : m_subexpressionDivotOffset(0)
339 , m_subexpressionEndOffset(0)
340 , m_subexpressionLineOffset(0)
341 , m_subexpressionLineStartOffset(0)
345 ThrowableSubExpressionData(const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd)
346 : ThrowableExpressionData(divot, divotStart, divotEnd)
347 , m_subexpressionDivotOffset(0)
348 , m_subexpressionEndOffset(0)
349 , m_subexpressionLineOffset(0)
350 , m_subexpressionLineStartOffset(0)
354 void setSubexpressionInfo(const JSTextPosition& subexpressionDivot, int subexpressionOffset)
356 ASSERT(subexpressionDivot.offset <= divot().offset);
357 // Overflow means we can't do this safely, so just point at the primary divot,
358 // divotLine, or divotLineStart.
359 if ((divot() - subexpressionDivot.offset) & ~0xFFFF)
361 if ((divot().line - subexpressionDivot.line) & ~0xFFFF)
363 if ((divot().lineStartOffset - subexpressionDivot.lineStartOffset) & ~0xFFFF)
365 if ((divotEnd() - subexpressionOffset) & ~0xFFFF)
367 m_subexpressionDivotOffset = divot() - subexpressionDivot.offset;
368 m_subexpressionEndOffset = divotEnd() - subexpressionOffset;
369 m_subexpressionLineOffset = divot().line - subexpressionDivot.line;
370 m_subexpressionLineStartOffset = divot().lineStartOffset - subexpressionDivot.lineStartOffset;
373 JSTextPosition subexpressionDivot()
375 int newLine = divot().line - m_subexpressionLineOffset;
376 int newOffset = divot().offset - m_subexpressionDivotOffset;
377 int newLineStartOffset = divot().lineStartOffset - m_subexpressionLineStartOffset;
378 return JSTextPosition(newLine, newOffset, newLineStartOffset);
380 JSTextPosition subexpressionStart() { return divotStart(); }
381 JSTextPosition subexpressionEnd() { return divotEnd() - static_cast<int>(m_subexpressionEndOffset); }
384 uint16_t m_subexpressionDivotOffset;
385 uint16_t m_subexpressionEndOffset;
386 uint16_t m_subexpressionLineOffset;
387 uint16_t m_subexpressionLineStartOffset;
390 class ThrowablePrefixedSubExpressionData : public ThrowableExpressionData {
392 ThrowablePrefixedSubExpressionData()
393 : m_subexpressionDivotOffset(0)
394 , m_subexpressionStartOffset(0)
395 , m_subexpressionLineOffset(0)
396 , m_subexpressionLineStartOffset(0)
400 ThrowablePrefixedSubExpressionData(const JSTextPosition& divot, const JSTextPosition& start, const JSTextPosition& end)
401 : ThrowableExpressionData(divot, start, end)
402 , m_subexpressionDivotOffset(0)
403 , m_subexpressionStartOffset(0)
404 , m_subexpressionLineOffset(0)
405 , m_subexpressionLineStartOffset(0)
409 void setSubexpressionInfo(const JSTextPosition& subexpressionDivot, int subexpressionOffset)
411 ASSERT(subexpressionDivot.offset >= divot().offset);
412 // Overflow means we can't do this safely, so just point at the primary divot,
413 // divotLine, or divotLineStart.
414 if ((subexpressionDivot.offset - divot()) & ~0xFFFF)
416 if ((subexpressionDivot.line - divot().line) & ~0xFFFF)
418 if ((subexpressionDivot.lineStartOffset - divot().lineStartOffset) & ~0xFFFF)
420 if ((subexpressionOffset - divotStart()) & ~0xFFFF)
422 m_subexpressionDivotOffset = subexpressionDivot.offset - divot();
423 m_subexpressionStartOffset = subexpressionOffset - divotStart();
424 m_subexpressionLineOffset = subexpressionDivot.line - divot().line;
425 m_subexpressionLineStartOffset = subexpressionDivot.lineStartOffset - divot().lineStartOffset;
428 JSTextPosition subexpressionDivot()
430 int newLine = divot().line + m_subexpressionLineOffset;
431 int newOffset = divot().offset + m_subexpressionDivotOffset;
432 int newLineStartOffset = divot().lineStartOffset + m_subexpressionLineStartOffset;
433 return JSTextPosition(newLine, newOffset, newLineStartOffset);
435 JSTextPosition subexpressionStart() { return divotStart() + static_cast<int>(m_subexpressionStartOffset); }
436 JSTextPosition subexpressionEnd() { return divotEnd(); }
439 uint16_t m_subexpressionDivotOffset;
440 uint16_t m_subexpressionStartOffset;
441 uint16_t m_subexpressionLineOffset;
442 uint16_t m_subexpressionLineStartOffset;
445 #if ENABLE(ES6_TEMPLATE_LITERAL_SYNTAX)
446 class TemplateExpressionListNode : public ParserArenaFreeable {
448 TemplateExpressionListNode(ExpressionNode*);
449 TemplateExpressionListNode(TemplateExpressionListNode*, ExpressionNode*);
451 ExpressionNode* value() { return m_node; }
452 TemplateExpressionListNode* next() { return m_next; }
455 TemplateExpressionListNode* m_next { nullptr };
456 ExpressionNode* m_node { nullptr };
459 class TemplateStringNode : public ExpressionNode {
461 TemplateStringNode(const JSTokenLocation&, const Identifier& cooked, const Identifier& raw);
463 const Identifier& cooked() { return m_cooked; }
464 const Identifier& raw() { return m_raw; }
467 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
469 const Identifier& m_cooked;
470 const Identifier& m_raw;
473 class TemplateStringListNode : public ParserArenaFreeable {
475 TemplateStringListNode(TemplateStringNode*);
476 TemplateStringListNode(TemplateStringListNode*, TemplateStringNode*);
478 TemplateStringNode* value() { return m_node; }
479 TemplateStringListNode* next() { return m_next; }
482 TemplateStringListNode* m_next { nullptr };
483 TemplateStringNode* m_node { nullptr };
486 class TemplateLiteralNode : public ExpressionNode {
488 TemplateLiteralNode(const JSTokenLocation&, TemplateStringListNode*);
489 TemplateLiteralNode(const JSTokenLocation&, TemplateStringListNode*, TemplateExpressionListNode*);
491 TemplateStringListNode* templateStrings() const { return m_templateStrings; }
492 TemplateExpressionListNode* templateExpressions() const { return m_templateExpressions; }
495 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
497 TemplateStringListNode* m_templateStrings;
498 TemplateExpressionListNode* m_templateExpressions;
501 class TaggedTemplateNode : public ExpressionNode, public ThrowableExpressionData {
503 TaggedTemplateNode(const JSTokenLocation&, ExpressionNode*, TemplateLiteralNode*);
505 TemplateLiteralNode* templateLiteral() const { return m_templateLiteral; }
508 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
510 ExpressionNode* m_tag;
511 TemplateLiteralNode* m_templateLiteral;
515 class RegExpNode : public ExpressionNode, public ThrowableExpressionData {
517 RegExpNode(const JSTokenLocation&, const Identifier& pattern, const Identifier& flags);
520 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
522 const Identifier& m_pattern;
523 const Identifier& m_flags;
526 class ThisNode : public ExpressionNode {
528 ThisNode(const JSTokenLocation&, ThisTDZMode);
531 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
533 bool m_shouldAlwaysEmitTDZCheck;
536 class SuperNode final : public ExpressionNode {
538 SuperNode(const JSTokenLocation&);
541 virtual bool isSuperNode() const override { return true; }
542 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
545 class ResolveNode : public ExpressionNode {
547 ResolveNode(const JSTokenLocation&, const Identifier&, const JSTextPosition& start);
549 const Identifier& identifier() const { return m_ident; }
552 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
554 virtual bool isPure(BytecodeGenerator&) const override;
555 virtual bool isLocation() const override { return true; }
556 virtual bool isResolveNode() const override { return true; }
558 const Identifier& m_ident;
559 JSTextPosition m_start;
562 class ElementNode : public ParserArenaFreeable {
564 ElementNode(int elision, ExpressionNode*);
565 ElementNode(ElementNode*, int elision, ExpressionNode*);
567 int elision() const { return m_elision; }
568 ExpressionNode* value() { return m_node; }
569 ElementNode* next() { return m_next; }
574 ExpressionNode* m_node;
577 class ArrayNode : public ExpressionNode {
579 ArrayNode(const JSTokenLocation&, int elision);
580 ArrayNode(const JSTokenLocation&, ElementNode*);
581 ArrayNode(const JSTokenLocation&, int elision, ElementNode*);
583 ArgumentListNode* toArgumentList(ParserArena&, int, int) const;
585 ElementNode* elements() const { ASSERT(isSimpleArray()); return m_element; }
587 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
589 virtual bool isSimpleArray() const override;
591 ElementNode* m_element;
596 class PropertyNode : public ParserArenaFreeable {
598 enum Type { Constant = 1, Getter = 2, Setter = 4, Computed = 8, Shorthand = 16 };
599 enum PutType { Unknown, KnownDirect };
601 PropertyNode(const Identifier&, ExpressionNode*, Type, PutType, SuperBinding);
602 PropertyNode(ExpressionNode* propertyName, ExpressionNode*, Type, PutType);
604 ExpressionNode* expressionName() const { return m_expression; }
605 const Identifier* name() const { return m_name; }
607 Type type() const { return static_cast<Type>(m_type); }
608 bool needsSuperBinding() const { return m_needsSuperBinding; }
609 PutType putType() const { return static_cast<PutType>(m_putType); }
612 friend class PropertyListNode;
613 const Identifier* m_name;
614 ExpressionNode* m_expression;
615 ExpressionNode* m_assign;
617 unsigned m_needsSuperBinding : 1;
618 unsigned m_putType : 1;
621 class PropertyListNode : public ExpressionNode {
623 PropertyListNode(const JSTokenLocation&, PropertyNode*);
624 PropertyListNode(const JSTokenLocation&, PropertyNode*, PropertyListNode*);
627 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
628 void emitPutConstantProperty(BytecodeGenerator&, RegisterID*, PropertyNode&);
630 PropertyNode* m_node;
631 PropertyListNode* m_next;
634 class ObjectLiteralNode : public ExpressionNode {
636 ObjectLiteralNode(const JSTokenLocation&);
637 ObjectLiteralNode(const JSTokenLocation&, PropertyListNode*);
640 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
642 PropertyListNode* m_list;
645 class BracketAccessorNode : public ExpressionNode, public ThrowableExpressionData {
647 BracketAccessorNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments);
649 ExpressionNode* base() const { return m_base; }
650 ExpressionNode* subscript() const { return m_subscript; }
652 bool subscriptHasAssignments() const { return m_subscriptHasAssignments; }
655 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
657 virtual bool isLocation() const override { return true; }
658 virtual bool isBracketAccessorNode() const override { return true; }
660 ExpressionNode* m_base;
661 ExpressionNode* m_subscript;
662 bool m_subscriptHasAssignments;
665 class DotAccessorNode : public ExpressionNode, public ThrowableExpressionData {
667 DotAccessorNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&);
669 ExpressionNode* base() const { return m_base; }
670 const Identifier& identifier() const { return m_ident; }
673 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
675 virtual bool isLocation() const override { return true; }
676 virtual bool isDotAccessorNode() const override { return true; }
678 ExpressionNode* m_base;
679 const Identifier& m_ident;
682 class SpreadExpressionNode : public ExpressionNode, public ThrowableExpressionData {
684 SpreadExpressionNode(const JSTokenLocation&, ExpressionNode*);
686 ExpressionNode* expression() const { return m_expression; }
689 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
691 virtual bool isSpreadExpression() const override { return true; }
692 ExpressionNode* m_expression;
695 class ArgumentListNode : public ExpressionNode {
697 ArgumentListNode(const JSTokenLocation&, ExpressionNode*);
698 ArgumentListNode(const JSTokenLocation&, ArgumentListNode*, ExpressionNode*);
700 ArgumentListNode* m_next;
701 ExpressionNode* m_expr;
704 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
707 class ArgumentsNode : public ParserArenaFreeable {
710 ArgumentsNode(ArgumentListNode*);
712 ArgumentListNode* m_listNode;
715 class NewExprNode : public ExpressionNode, public ThrowableExpressionData {
717 NewExprNode(const JSTokenLocation&, ExpressionNode*);
718 NewExprNode(const JSTokenLocation&, ExpressionNode*, ArgumentsNode*);
721 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
723 ExpressionNode* m_expr;
724 ArgumentsNode* m_args;
727 class EvalFunctionCallNode : public ExpressionNode, public ThrowableExpressionData {
729 EvalFunctionCallNode(const JSTokenLocation&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
732 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
734 ArgumentsNode* m_args;
737 class FunctionCallValueNode : public ExpressionNode, public ThrowableExpressionData {
739 FunctionCallValueNode(const JSTokenLocation&, ExpressionNode*, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
742 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
744 ExpressionNode* m_expr;
745 ArgumentsNode* m_args;
748 class FunctionCallResolveNode : public ExpressionNode, public ThrowableExpressionData {
750 FunctionCallResolveNode(const JSTokenLocation&, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
753 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
755 const Identifier& m_ident;
756 ArgumentsNode* m_args;
759 class FunctionCallBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
761 FunctionCallBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
764 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
766 ExpressionNode* m_base;
767 ExpressionNode* m_subscript;
768 ArgumentsNode* m_args;
769 bool m_subscriptHasAssignments;
772 class FunctionCallDotNode : public ExpressionNode, public ThrowableSubExpressionData {
774 FunctionCallDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
777 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
780 ExpressionNode* m_base;
781 const Identifier& m_ident;
782 ArgumentsNode* m_args;
785 class BytecodeIntrinsicNode : public ExpressionNode, public ThrowableExpressionData {
787 typedef RegisterID* (BytecodeIntrinsicNode::* EmitterType)(BytecodeGenerator&, RegisterID*);
789 BytecodeIntrinsicNode(const JSTokenLocation&, EmitterType, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
791 const Identifier& identifier() const { return m_ident; }
793 #define JSC_DECLARE_BYTECODE_INTRINSIC_FUNCTIONS(name) RegisterID* emit_intrinsic_##name(BytecodeGenerator&, RegisterID*);
794 JSC_COMMON_BYTECODE_INTRINSICS_EACH_NAME(JSC_DECLARE_BYTECODE_INTRINSIC_FUNCTIONS)
795 #undef JSC_DECLARE_BYTECODE_INTRINSIC_FUNCTIONS
798 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
800 EmitterType m_emitter;
801 const Identifier& m_ident;
802 ArgumentsNode* m_args;
805 class CallFunctionCallDotNode : public FunctionCallDotNode {
807 CallFunctionCallDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
810 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
813 class ApplyFunctionCallDotNode : public FunctionCallDotNode {
815 ApplyFunctionCallDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
818 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
821 class DeleteResolveNode : public ExpressionNode, public ThrowableExpressionData {
823 DeleteResolveNode(const JSTokenLocation&, const Identifier&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
826 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
828 const Identifier& m_ident;
831 class DeleteBracketNode : public ExpressionNode, public ThrowableExpressionData {
833 DeleteBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
836 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
838 ExpressionNode* m_base;
839 ExpressionNode* m_subscript;
842 class DeleteDotNode : public ExpressionNode, public ThrowableExpressionData {
844 DeleteDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
847 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
849 ExpressionNode* m_base;
850 const Identifier& m_ident;
853 class DeleteValueNode : public ExpressionNode {
855 DeleteValueNode(const JSTokenLocation&, ExpressionNode*);
858 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
860 ExpressionNode* m_expr;
863 class VoidNode : public ExpressionNode {
865 VoidNode(const JSTokenLocation&, ExpressionNode*);
868 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
870 ExpressionNode* m_expr;
873 class TypeOfResolveNode : public ExpressionNode {
875 TypeOfResolveNode(const JSTokenLocation&, const Identifier&);
877 const Identifier& identifier() const { return m_ident; }
880 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
882 const Identifier& m_ident;
885 class TypeOfValueNode : public ExpressionNode {
887 TypeOfValueNode(const JSTokenLocation&, ExpressionNode*);
890 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
892 ExpressionNode* m_expr;
895 class PrefixNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
897 PrefixNode(const JSTokenLocation&, ExpressionNode*, Operator, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
900 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
901 virtual RegisterID* emitResolve(BytecodeGenerator&, RegisterID* = 0);
902 virtual RegisterID* emitBracket(BytecodeGenerator&, RegisterID* = 0);
903 virtual RegisterID* emitDot(BytecodeGenerator&, RegisterID* = 0);
905 ExpressionNode* m_expr;
909 class PostfixNode : public PrefixNode {
911 PostfixNode(const JSTokenLocation&, ExpressionNode*, Operator, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
914 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
915 virtual RegisterID* emitResolve(BytecodeGenerator&, RegisterID* = 0) override;
916 virtual RegisterID* emitBracket(BytecodeGenerator&, RegisterID* = 0) override;
917 virtual RegisterID* emitDot(BytecodeGenerator&, RegisterID* = 0) override;
920 class UnaryOpNode : public ExpressionNode {
922 UnaryOpNode(const JSTokenLocation&, ResultType, ExpressionNode*, OpcodeID);
925 ExpressionNode* expr() { return m_expr; }
926 const ExpressionNode* expr() const { return m_expr; }
929 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
931 OpcodeID opcodeID() const { return m_opcodeID; }
933 ExpressionNode* m_expr;
937 class UnaryPlusNode : public UnaryOpNode {
939 UnaryPlusNode(const JSTokenLocation&, ExpressionNode*);
942 virtual ExpressionNode* stripUnaryPlus() override { return expr(); }
945 class NegateNode : public UnaryOpNode {
947 NegateNode(const JSTokenLocation&, ExpressionNode*);
950 class BitwiseNotNode : public ExpressionNode {
952 BitwiseNotNode(const JSTokenLocation&, ExpressionNode*);
955 ExpressionNode* expr() { return m_expr; }
956 const ExpressionNode* expr() const { return m_expr; }
959 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
961 ExpressionNode* m_expr;
964 class LogicalNotNode : public UnaryOpNode {
966 LogicalNotNode(const JSTokenLocation&, ExpressionNode*);
968 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, FallThroughMode) override;
971 class BinaryOpNode : public ExpressionNode {
973 BinaryOpNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
974 BinaryOpNode(const JSTokenLocation&, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
976 RegisterID* emitStrcat(BytecodeGenerator& generator, RegisterID* destination, RegisterID* lhs = 0, ReadModifyResolveNode* emitExpressionInfoForMe = 0);
977 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, FallThroughMode) override;
979 ExpressionNode* lhs() { return m_expr1; };
980 ExpressionNode* rhs() { return m_expr2; };
983 void tryFoldToBranch(BytecodeGenerator&, TriState& branchCondition, ExpressionNode*& branchExpression);
984 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
987 OpcodeID opcodeID() const { return m_opcodeID; }
990 ExpressionNode* m_expr1;
991 ExpressionNode* m_expr2;
995 bool m_rightHasAssignments;
998 class MultNode : public BinaryOpNode {
1000 MultNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1003 class DivNode : public BinaryOpNode {
1005 DivNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1008 class ModNode : public BinaryOpNode {
1010 ModNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1013 class AddNode : public BinaryOpNode {
1015 AddNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1017 virtual bool isAdd() const override { return true; }
1020 class SubNode : public BinaryOpNode {
1022 SubNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1024 virtual bool isSubtract() const override { return true; }
1027 class LeftShiftNode : public BinaryOpNode {
1029 LeftShiftNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1032 class RightShiftNode : public BinaryOpNode {
1034 RightShiftNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1037 class UnsignedRightShiftNode : public BinaryOpNode {
1039 UnsignedRightShiftNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1042 class LessNode : public BinaryOpNode {
1044 LessNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1047 class GreaterNode : public BinaryOpNode {
1049 GreaterNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1052 class LessEqNode : public BinaryOpNode {
1054 LessEqNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1057 class GreaterEqNode : public BinaryOpNode {
1059 GreaterEqNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1062 class ThrowableBinaryOpNode : public BinaryOpNode, public ThrowableExpressionData {
1064 ThrowableBinaryOpNode(const JSTokenLocation&, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
1065 ThrowableBinaryOpNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
1068 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1071 class InstanceOfNode : public ThrowableBinaryOpNode {
1073 InstanceOfNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1076 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1079 class InNode : public ThrowableBinaryOpNode {
1081 InNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1084 class EqualNode : public BinaryOpNode {
1086 EqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1089 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1092 class NotEqualNode : public BinaryOpNode {
1094 NotEqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1097 class StrictEqualNode : public BinaryOpNode {
1099 StrictEqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1102 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1105 class NotStrictEqualNode : public BinaryOpNode {
1107 NotStrictEqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1110 class BitAndNode : public BinaryOpNode {
1112 BitAndNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1115 class BitOrNode : public BinaryOpNode {
1117 BitOrNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1120 class BitXOrNode : public BinaryOpNode {
1122 BitXOrNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
1125 // m_expr1 && m_expr2, m_expr1 || m_expr2
1126 class LogicalOpNode : public ExpressionNode {
1128 LogicalOpNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator);
1131 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1132 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, FallThroughMode) override;
1134 ExpressionNode* m_expr1;
1135 ExpressionNode* m_expr2;
1136 LogicalOperator m_operator;
1139 // The ternary operator, "m_logical ? m_expr1 : m_expr2"
1140 class ConditionalNode : public ExpressionNode {
1142 ConditionalNode(const JSTokenLocation&, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2);
1145 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1147 ExpressionNode* m_logical;
1148 ExpressionNode* m_expr1;
1149 ExpressionNode* m_expr2;
1152 class ReadModifyResolveNode : public ExpressionNode, public ThrowableExpressionData {
1154 ReadModifyResolveNode(const JSTokenLocation&, const Identifier&, Operator, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
1157 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1159 const Identifier& m_ident;
1160 ExpressionNode* m_right;
1161 Operator m_operator;
1162 bool m_rightHasAssignments;
1165 class AssignResolveNode : public ExpressionNode, public ThrowableExpressionData {
1167 AssignResolveNode(const JSTokenLocation&, const Identifier&, ExpressionNode* right, AssignmentContext);
1170 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1172 const Identifier& m_ident;
1173 ExpressionNode* m_right;
1174 AssignmentContext m_assignmentContext;
1177 class ReadModifyBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
1179 ReadModifyBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, Operator, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
1182 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1184 ExpressionNode* m_base;
1185 ExpressionNode* m_subscript;
1186 ExpressionNode* m_right;
1187 unsigned m_operator : 30;
1188 bool m_subscriptHasAssignments : 1;
1189 bool m_rightHasAssignments : 1;
1192 class AssignBracketNode : public ExpressionNode, public ThrowableExpressionData {
1194 AssignBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
1197 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1199 ExpressionNode* m_base;
1200 ExpressionNode* m_subscript;
1201 ExpressionNode* m_right;
1202 bool m_subscriptHasAssignments : 1;
1203 bool m_rightHasAssignments : 1;
1206 class AssignDotNode : public ExpressionNode, public ThrowableExpressionData {
1208 AssignDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
1211 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1213 ExpressionNode* m_base;
1214 const Identifier& m_ident;
1215 ExpressionNode* m_right;
1216 bool m_rightHasAssignments;
1219 class ReadModifyDotNode : public ExpressionNode, public ThrowableSubExpressionData {
1221 ReadModifyDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, Operator, 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 unsigned m_operator : 31;
1230 bool m_rightHasAssignments : 1;
1233 class AssignErrorNode : public ExpressionNode, public ThrowableExpressionData {
1235 AssignErrorNode(const JSTokenLocation&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
1238 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1241 class CommaNode final : public ExpressionNode {
1243 CommaNode(const JSTokenLocation&, ExpressionNode*);
1245 void setNext(CommaNode* next) { m_next = next; }
1246 CommaNode* next() { return m_next; }
1249 virtual bool isCommaNode() const override { return true; }
1250 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1252 ExpressionNode* m_expr;
1256 class ConstDeclNode : public ExpressionNode {
1258 ConstDeclNode(const JSTokenLocation&, const Identifier&, ExpressionNode*);
1260 bool hasInitializer() const { return m_init; }
1261 const Identifier& ident() { return m_ident; }
1264 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1265 virtual RegisterID* emitCodeSingle(BytecodeGenerator&);
1267 const Identifier& m_ident;
1270 ConstDeclNode* m_next;
1273 ExpressionNode* m_init;
1276 class ConstStatementNode : public StatementNode {
1278 ConstStatementNode(const JSTokenLocation&, ConstDeclNode* next);
1281 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1283 ConstDeclNode* m_next;
1286 class SourceElements final : public ParserArenaFreeable {
1290 void append(StatementNode*);
1292 StatementNode* singleStatement() const;
1293 StatementNode* lastStatement() const;
1295 void emitBytecode(BytecodeGenerator&, RegisterID* destination);
1298 StatementNode* m_head;
1299 StatementNode* m_tail;
1302 class BlockNode : public StatementNode, public VariableEnvironmentNode {
1304 BlockNode(const JSTokenLocation&, SourceElements*, VariableEnvironment&);
1306 StatementNode* singleStatement() const;
1307 StatementNode* lastStatement() const;
1310 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1312 virtual bool isBlock() const override { return true; }
1314 SourceElements* m_statements;
1317 class EmptyStatementNode : public StatementNode {
1319 EmptyStatementNode(const JSTokenLocation&);
1322 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1324 virtual bool isEmptyStatement() const override { return true; }
1327 class DebuggerStatementNode : public StatementNode {
1329 DebuggerStatementNode(const JSTokenLocation&);
1332 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1335 class ExprStatementNode : public StatementNode {
1337 ExprStatementNode(const JSTokenLocation&, ExpressionNode*);
1339 ExpressionNode* expr() const { return m_expr; }
1342 virtual bool isExprStatement() const override { return true; }
1344 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1346 ExpressionNode* m_expr;
1349 class DeclarationStatement : public StatementNode {
1351 DeclarationStatement(const JSTokenLocation&, ExpressionNode*);
1353 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1355 ExpressionNode* m_expr;
1358 class EmptyVarExpression : public ExpressionNode {
1360 EmptyVarExpression(const JSTokenLocation&, const Identifier&);
1363 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1365 const Identifier& m_ident;
1368 class EmptyLetExpression : public ExpressionNode {
1370 EmptyLetExpression(const JSTokenLocation&, const Identifier&);
1373 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1375 const Identifier& m_ident;
1378 class IfElseNode : public StatementNode {
1380 IfElseNode(const JSTokenLocation&, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock);
1383 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1384 bool tryFoldBreakAndContinue(BytecodeGenerator&, StatementNode* ifBlock,
1385 Label*& trueTarget, FallThroughMode&);
1387 ExpressionNode* m_condition;
1388 StatementNode* m_ifBlock;
1389 StatementNode* m_elseBlock;
1392 class DoWhileNode : public StatementNode {
1394 DoWhileNode(const JSTokenLocation&, StatementNode*, ExpressionNode*);
1397 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1399 StatementNode* m_statement;
1400 ExpressionNode* m_expr;
1403 class WhileNode : public StatementNode {
1405 WhileNode(const JSTokenLocation&, ExpressionNode*, StatementNode*);
1408 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1410 ExpressionNode* m_expr;
1411 StatementNode* m_statement;
1414 class ForNode : public StatementNode, public VariableEnvironmentNode {
1416 ForNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode*, VariableEnvironment&);
1419 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1421 ExpressionNode* m_expr1;
1422 ExpressionNode* m_expr2;
1423 ExpressionNode* m_expr3;
1424 StatementNode* m_statement;
1427 class DestructuringPatternNode;
1429 class EnumerationNode : public StatementNode, public ThrowableExpressionData, public VariableEnvironmentNode {
1431 EnumerationNode(const JSTokenLocation&, ExpressionNode*, ExpressionNode*, StatementNode*, VariableEnvironment&);
1434 ExpressionNode* m_lexpr;
1435 ExpressionNode* m_expr;
1436 StatementNode* m_statement;
1439 class ForInNode : public EnumerationNode {
1441 ForInNode(const JSTokenLocation&, ExpressionNode*, ExpressionNode*, StatementNode*, VariableEnvironment&);
1444 RegisterID* tryGetBoundLocal(BytecodeGenerator&);
1445 void emitLoopHeader(BytecodeGenerator&, RegisterID* propertyName);
1446 void emitMultiLoopBytecode(BytecodeGenerator&, RegisterID* dst);
1448 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1451 class ForOfNode : public EnumerationNode {
1453 ForOfNode(const JSTokenLocation&, ExpressionNode*, ExpressionNode*, StatementNode*, VariableEnvironment&);
1456 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1459 class ContinueNode : public StatementNode, public ThrowableExpressionData {
1461 ContinueNode(const JSTokenLocation&, const Identifier&);
1462 Label* trivialTarget(BytecodeGenerator&);
1465 virtual bool isContinue() const override { return true; }
1466 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1468 const Identifier& m_ident;
1471 class BreakNode : public StatementNode, public ThrowableExpressionData {
1473 BreakNode(const JSTokenLocation&, const Identifier&);
1474 Label* trivialTarget(BytecodeGenerator&);
1477 virtual bool isBreak() const override { return true; }
1478 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1480 const Identifier& m_ident;
1483 class ReturnNode : public StatementNode, public ThrowableExpressionData {
1485 ReturnNode(const JSTokenLocation&, ExpressionNode* value);
1487 ExpressionNode* value() { return m_value; }
1490 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1492 virtual bool isReturnNode() const override { return true; }
1494 ExpressionNode* m_value;
1497 class WithNode : public StatementNode {
1499 WithNode(const JSTokenLocation&, ExpressionNode*, StatementNode*, const JSTextPosition& divot, uint32_t expressionLength);
1502 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1504 ExpressionNode* m_expr;
1505 StatementNode* m_statement;
1506 JSTextPosition m_divot;
1507 uint32_t m_expressionLength;
1510 class LabelNode : public StatementNode, public ThrowableExpressionData {
1512 LabelNode(const JSTokenLocation&, const Identifier& name, StatementNode*);
1515 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1517 const Identifier& m_name;
1518 StatementNode* m_statement;
1521 class ThrowNode : public StatementNode, public ThrowableExpressionData {
1523 ThrowNode(const JSTokenLocation&, ExpressionNode*);
1526 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1528 ExpressionNode* m_expr;
1531 class TryNode : public StatementNode {
1533 TryNode(const JSTokenLocation&, StatementNode* tryBlock, const Identifier& exceptionIdent, StatementNode* catchBlock, StatementNode* finallyBlock);
1536 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1538 StatementNode* m_tryBlock;
1539 const Identifier& m_thrownValueIdent;
1540 StatementNode* m_catchBlock;
1541 StatementNode* m_finallyBlock;
1544 class ParameterNode : public ParserArenaDeletable {
1546 ParameterNode(PassRefPtr<DestructuringPatternNode>);
1547 ParameterNode(ParameterNode*, PassRefPtr<DestructuringPatternNode>);
1549 DestructuringPatternNode* pattern() const { return m_pattern.get(); }
1550 ParameterNode* nextParam() const { return m_next; }
1553 RefPtr<DestructuringPatternNode> m_pattern;
1554 ParameterNode* m_next;
1557 class ScopeNode : public StatementNode, public ParserArenaRoot, public VariableEnvironmentNode {
1559 typedef DeclarationStacks::FunctionStack FunctionStack;
1561 ScopeNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, bool inStrictContext);
1562 ScopeNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, const SourceCode&, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, CodeFeatures, int numConstants);
1564 using ParserArenaRoot::operator new;
1566 const SourceCode& source() const { return m_source; }
1567 const String& sourceURL() const { return m_source.provider()->url(); }
1568 intptr_t sourceID() const { return m_source.providerID(); }
1570 int startLine() const { return m_startLineNumber; }
1571 int startStartOffset() const { return m_startStartOffset; }
1572 int startLineStartOffset() const { return m_startLineStartOffset; }
1574 void setFeatures(CodeFeatures features) { m_features = features; }
1575 CodeFeatures features() { return m_features; }
1577 bool usesEval() const { return m_features & EvalFeature; }
1578 bool usesArguments() const { return (m_features & ArgumentsFeature) && !(m_features & ShadowsArgumentsFeature); }
1579 bool modifiesParameter() const { return m_features & ModifiedParameterFeature; }
1580 bool modifiesArguments() const { return m_features & (EvalFeature | ModifiedArgumentsFeature); }
1581 bool isStrictMode() const { return m_features & StrictModeFeature; }
1582 void setUsesArguments() { m_features |= ArgumentsFeature; }
1583 bool usesThis() const { return m_features & ThisFeature; }
1584 bool needsActivationForMoreThanVariables() const { return m_features & (EvalFeature | WithFeature | CatchFeature); }
1585 bool needsActivation() const { return (hasCapturedVariables()) || (m_features & (EvalFeature | WithFeature | CatchFeature)); }
1586 bool hasCapturedVariables() const { return m_varDeclarations.hasCapturedVariables(); }
1587 bool captures(UniquedStringImpl* uid) { return m_varDeclarations.captures(uid); }
1588 bool captures(const Identifier& ident) { return captures(ident.impl()); }
1590 VariableEnvironment& varDeclarations() { return m_varDeclarations; }
1591 FunctionStack& functionStack() { return m_functionStack; }
1593 int neededConstants()
1595 // We may need 2 more constants than the count given by the parser,
1596 // because of the various uses of jsUndefined() and jsNull().
1597 return m_numConstants + 2;
1600 StatementNode* singleStatement() const;
1602 void emitStatementsBytecode(BytecodeGenerator&, RegisterID* destination);
1604 void setClosedVariables(Vector<RefPtr<UniquedStringImpl>>&&) { }
1607 int m_startLineNumber;
1608 unsigned m_startStartOffset;
1609 unsigned m_startLineStartOffset;
1612 CodeFeatures m_features;
1613 SourceCode m_source;
1614 VariableEnvironment m_varDeclarations;
1615 FunctionStack m_functionStack;
1617 SourceElements* m_statements;
1620 class ProgramNode : public ScopeNode {
1622 ProgramNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, const SourceCode&, CodeFeatures, int numConstants);
1624 unsigned startColumn() const { return m_startColumn; }
1625 unsigned endColumn() const { return m_endColumn; }
1627 static const bool scopeIsFunction = false;
1629 void setClosedVariables(Vector<RefPtr<UniquedStringImpl>>&&);
1630 const Vector<RefPtr<UniquedStringImpl>>& closedVariables() const { return m_closedVariables; }
1633 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1634 Vector<RefPtr<UniquedStringImpl>> m_closedVariables;
1635 unsigned m_startColumn;
1636 unsigned m_endColumn;
1639 class EvalNode : public ScopeNode {
1641 EvalNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, const SourceCode&, CodeFeatures, int numConstants);
1643 ALWAYS_INLINE unsigned startColumn() const { return 0; }
1644 unsigned endColumn() const { return m_endColumn; }
1646 static const bool scopeIsFunction = false;
1649 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1651 unsigned m_endColumn;
1654 class FunctionParameters : public RefCounted<FunctionParameters> {
1655 WTF_MAKE_FAST_ALLOCATED;
1656 WTF_MAKE_NONCOPYABLE(FunctionParameters);
1658 static Ref<FunctionParameters> create(ParameterNode*);
1659 ~FunctionParameters();
1661 unsigned size() const { return m_size; }
1662 DestructuringPatternNode* at(unsigned index) { ASSERT(index < m_size); return patterns()[index]; }
1665 FunctionParameters(ParameterNode*, unsigned size);
1667 DestructuringPatternNode** patterns() { return &m_storage; }
1670 DestructuringPatternNode* m_storage;
1673 class FunctionBodyNode final : public StatementNode, public ParserArenaDeletable {
1675 using ParserArenaDeletable::operator new;
1678 ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end,
1679 unsigned startColumn, unsigned endColumn, int functionKeywordStart,
1680 int functionNameStart, int parametersStart, bool isInStrictContext,
1683 FunctionParameters* parameters() const { return m_parameters.get(); }
1685 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1687 void finishParsing(const SourceCode&, ParameterNode*, const Identifier&, FunctionMode);
1689 void overrideName(const Identifier& ident) { m_ident = ident; }
1690 const Identifier& ident() { return m_ident; }
1691 void setInferredName(const Identifier& inferredName) { ASSERT(!inferredName.isNull()); m_inferredName = inferredName; }
1692 const Identifier& inferredName() { return m_inferredName.isEmpty() ? m_ident : m_inferredName; }
1694 FunctionMode functionMode() { return m_functionMode; }
1696 int functionNameStart() const { return m_functionNameStart; }
1697 int functionKeywordStart() const { return m_functionKeywordStart; }
1698 int parametersStart() const { return m_parametersStart; }
1699 unsigned startColumn() const { return m_startColumn; }
1700 unsigned endColumn() const { return m_endColumn; }
1702 void setEndPosition(JSTextPosition);
1704 const SourceCode& source() const { return m_source; }
1706 int startStartOffset() const { return m_startStartOffset; }
1707 bool isInStrictContext() const { return m_isInStrictContext; }
1708 ConstructorKind constructorKind() { return static_cast<ConstructorKind>(m_constructorKind); }
1712 Identifier m_inferredName;
1713 FunctionMode m_functionMode;
1714 RefPtr<FunctionParameters> m_parameters;
1715 unsigned m_startColumn;
1716 unsigned m_endColumn;
1717 int m_functionKeywordStart;
1718 int m_functionNameStart;
1719 int m_parametersStart;
1720 SourceCode m_source;
1721 int m_startStartOffset;
1722 unsigned m_isInStrictContext : 1;
1723 unsigned m_constructorKind : 2;
1726 class FunctionNode final : public ScopeNode {
1728 FunctionNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VariableEnvironment&, FunctionStack&, VariableEnvironment&, const SourceCode&, CodeFeatures, int numConstants);
1730 FunctionParameters* parameters() const { return m_parameters.get(); }
1732 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1734 void finishParsing(PassRefPtr<FunctionParameters>, const Identifier&, FunctionMode);
1736 const Identifier& ident() { return m_ident; }
1738 FunctionMode functionMode() { return m_functionMode; }
1740 unsigned startColumn() const { return m_startColumn; }
1741 unsigned endColumn() const { return m_endColumn; }
1743 static const bool scopeIsFunction = true;
1747 FunctionMode m_functionMode;
1748 RefPtr<FunctionParameters> m_parameters;
1749 unsigned m_startColumn;
1750 unsigned m_endColumn;
1753 class FuncExprNode : public ExpressionNode {
1755 FuncExprNode(const JSTokenLocation&, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0);
1757 FunctionBodyNode* body() { return m_body; }
1760 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1762 virtual bool isFuncExprNode() const override { return true; }
1764 FunctionBodyNode* m_body;
1767 #if ENABLE(ES6_CLASS_SYNTAX)
1768 class ClassExprNode final : public ExpressionNode {
1770 ClassExprNode(const JSTokenLocation&, const Identifier&, ExpressionNode* constructorExpresssion,
1771 ExpressionNode* parentClass, PropertyListNode* instanceMethods, PropertyListNode* staticMethods);
1773 const Identifier& name() { return m_name; }
1776 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1778 const Identifier& m_name;
1779 ExpressionNode* m_constructorExpression;
1780 ExpressionNode* m_classHeritage;
1781 PropertyListNode* m_instanceMethods;
1782 PropertyListNode* m_staticMethods;
1786 class DestructuringPatternNode : public RefCounted<DestructuringPatternNode> {
1787 WTF_MAKE_NONCOPYABLE(DestructuringPatternNode);
1788 WTF_MAKE_FAST_ALLOCATED;
1791 virtual void collectBoundIdentifiers(Vector<Identifier>&) const = 0;
1792 virtual void bindValue(BytecodeGenerator&, RegisterID* source) const = 0;
1793 virtual void toString(StringBuilder&) const = 0;
1795 virtual bool isBindingNode() const { return false; }
1796 virtual RegisterID* emitDirectBinding(BytecodeGenerator&, RegisterID*, ExpressionNode*) { return 0; }
1798 virtual ~DestructuringPatternNode() = 0;
1801 DestructuringPatternNode();
1804 class ArrayPatternNode : public DestructuringPatternNode, public ThrowableExpressionData {
1806 enum class BindingType {
1812 static Ref<ArrayPatternNode> create();
1813 void appendIndex(BindingType bindingType, const JSTokenLocation&, DestructuringPatternNode* node, ExpressionNode* defaultValue)
1815 m_targetPatterns.append({ bindingType, node, defaultValue });
1820 BindingType bindingType;
1821 RefPtr<DestructuringPatternNode> pattern;
1822 ExpressionNode* defaultValue;
1825 virtual void collectBoundIdentifiers(Vector<Identifier>&) const override;
1826 virtual void bindValue(BytecodeGenerator&, RegisterID*) const override;
1827 virtual RegisterID* emitDirectBinding(BytecodeGenerator&, RegisterID* dst, ExpressionNode*) override;
1828 virtual void toString(StringBuilder&) const override;
1830 Vector<Entry> m_targetPatterns;
1833 class ObjectPatternNode : public DestructuringPatternNode {
1835 static Ref<ObjectPatternNode> create();
1836 void appendEntry(const JSTokenLocation&, const Identifier& identifier, bool wasString, DestructuringPatternNode* pattern, ExpressionNode* defaultValue)
1838 m_targetPatterns.append(Entry{ identifier, wasString, pattern, defaultValue });
1842 ObjectPatternNode();
1843 virtual void collectBoundIdentifiers(Vector<Identifier>&) const override;
1844 virtual void bindValue(BytecodeGenerator&, RegisterID*) const override;
1845 virtual void toString(StringBuilder&) const override;
1847 Identifier propertyName;
1849 RefPtr<DestructuringPatternNode> pattern;
1850 ExpressionNode* defaultValue;
1852 Vector<Entry> m_targetPatterns;
1855 class BindingNode : public DestructuringPatternNode {
1857 static Ref<BindingNode> create(const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end, AssignmentContext);
1858 const Identifier& boundProperty() const { return m_boundProperty; }
1860 const JSTextPosition& divotStart() const { return m_divotStart; }
1861 const JSTextPosition& divotEnd() const { return m_divotEnd; }
1864 BindingNode(const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end, AssignmentContext);
1866 virtual void collectBoundIdentifiers(Vector<Identifier>&) const override;
1867 virtual void bindValue(BytecodeGenerator&, RegisterID*) const override;
1868 virtual void toString(StringBuilder&) const override;
1870 virtual bool isBindingNode() const override { return true; }
1872 JSTextPosition m_divotStart;
1873 JSTextPosition m_divotEnd;
1874 Identifier m_boundProperty;
1875 AssignmentContext m_bindingContext;
1878 class DestructuringAssignmentNode : public ExpressionNode, public ParserArenaDeletable {
1880 DestructuringAssignmentNode(const JSTokenLocation&, PassRefPtr<DestructuringPatternNode>, ExpressionNode*);
1881 DestructuringPatternNode* bindings() { return m_bindings.get(); }
1883 using ParserArenaDeletable::operator new;
1886 virtual bool isAssignmentLocation() const override { return true; }
1887 virtual bool isDestructuringNode() const override { return true; }
1888 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1890 RefPtr<DestructuringPatternNode> m_bindings;
1891 ExpressionNode* m_initializer;
1894 class FuncDeclNode : public StatementNode {
1896 FuncDeclNode(const JSTokenLocation&, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0);
1898 virtual bool isFuncDeclNode() const override { return true; }
1899 FunctionBodyNode* body() { return m_body; }
1902 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1904 FunctionBodyNode* m_body;
1907 #if ENABLE(ES6_CLASS_SYNTAX)
1908 class ClassDeclNode final : public StatementNode {
1910 ClassDeclNode(const JSTokenLocation&, ExpressionNode* classExpression);
1913 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1915 ExpressionNode* m_classDeclaration;
1919 class CaseClauseNode : public ParserArenaFreeable {
1921 CaseClauseNode(ExpressionNode*, SourceElements* = 0);
1923 ExpressionNode* expr() const { return m_expr; }
1925 void emitBytecode(BytecodeGenerator&, RegisterID* destination);
1926 void setStartOffset(int offset) { m_startOffset = offset; }
1929 ExpressionNode* m_expr;
1930 SourceElements* m_statements;
1934 class ClauseListNode : public ParserArenaFreeable {
1936 ClauseListNode(CaseClauseNode*);
1937 ClauseListNode(ClauseListNode*, CaseClauseNode*);
1939 CaseClauseNode* getClause() const { return m_clause; }
1940 ClauseListNode* getNext() const { return m_next; }
1943 CaseClauseNode* m_clause;
1944 ClauseListNode* m_next;
1947 class CaseBlockNode : public ParserArenaFreeable {
1949 CaseBlockNode(ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2);
1951 void emitBytecodeForBlock(BytecodeGenerator&, RegisterID* input, RegisterID* destination);
1954 SwitchInfo::SwitchType tryTableSwitch(Vector<ExpressionNode*, 8>& literalVector, int32_t& min_num, int32_t& max_num);
1955 static const size_t s_tableSwitchMinimum = 3;
1956 ClauseListNode* m_list1;
1957 CaseClauseNode* m_defaultClause;
1958 ClauseListNode* m_list2;
1961 class SwitchNode : public StatementNode, public VariableEnvironmentNode {
1963 SwitchNode(const JSTokenLocation&, ExpressionNode*, CaseBlockNode*, VariableEnvironment&);
1966 virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
1968 ExpressionNode* m_expr;
1969 CaseBlockNode* m_block;
1972 struct ElementList {
1977 struct PropertyList {
1978 PropertyListNode* head;
1979 PropertyListNode* tail;
1982 struct ArgumentList {
1983 ArgumentListNode* head;
1984 ArgumentListNode* tail;
1987 struct ConstDeclList {
1988 ConstDeclNode* head;
1989 ConstDeclNode* tail;
1992 struct ParameterList {
1993 ParameterNode* head;
1994 ParameterNode* tail;
1998 ClauseListNode* head;
1999 ClauseListNode* tail;