13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_AST_H_ 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_AST_H_ 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/assembler.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ast-value-factory.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/bailout-reason.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/factory.h" 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/feedback-slots.h" 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/interface.h" 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/isolate.h" 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/jsregexp.h" 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/list-inl.h" 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/runtime.h" 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/small-pointer-list.h" 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/smart-pointers.h" 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/token.h" 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/types.h" 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/utils.h" 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/variables.h" 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/zone-inl.h" 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The abstract syntax tree is an intermediate, light-weight 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// representation of the parsed JavaScript code suitable for 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// compilation to native code. 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Nodes are allocated in a separate zone, which allows faster 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// allocation and constant-time deallocation of the entire syntax 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// tree. 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------------- 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Nodes of the abstract syntax tree. Only concrete classes are 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// enumerated here. 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARATION_NODE_LIST(V) \ 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(VariableDeclaration) \ 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FunctionDeclaration) \ 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ModuleDeclaration) \ 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ImportDeclaration) \ 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ExportDeclaration) 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define MODULE_NODE_LIST(V) \ 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(ModuleLiteral) \ 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(ModuleVariable) \ 543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(ModulePath) \ 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(ModuleUrl) 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define STATEMENT_NODE_LIST(V) \ 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V(Block) \ 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ModuleStatement) \ 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V(ExpressionStatement) \ 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V(EmptyStatement) \ 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V(IfStatement) \ 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V(ContinueStatement) \ 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V(BreakStatement) \ 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V(ReturnStatement) \ 6669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch V(WithStatement) \ 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V(SwitchStatement) \ 683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block V(DoWhileStatement) \ 693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block V(WhileStatement) \ 703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block V(ForStatement) \ 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V(ForInStatement) \ 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ForOfStatement) \ 733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block V(TryCatchStatement) \ 743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block V(TryFinallyStatement) \ 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V(DebuggerStatement) 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define EXPRESSION_NODE_LIST(V) \ 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FunctionLiteral) \ 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ClassLiteral) \ 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(NativeFunctionLiteral) \ 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Conditional) \ 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(VariableProxy) \ 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Literal) \ 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(RegExpLiteral) \ 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ObjectLiteral) \ 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ArrayLiteral) \ 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Assignment) \ 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Yield) \ 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Throw) \ 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Property) \ 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Call) \ 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CallNew) \ 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CallRuntime) \ 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(UnaryOperation) \ 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CountOperation) \ 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BinaryOperation) \ 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CompareOperation) \ 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ThisFunction) \ 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SuperReference) \ 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CaseClause) 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define AST_NODE_LIST(V) \ 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARATION_NODE_LIST(V) \ 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MODULE_NODE_LIST(V) \ 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STATEMENT_NODE_LIST(V) \ 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EXPRESSION_NODE_LIST(V) 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Forward declarations 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass AstConstructionVisitor; 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<class> class AstNodeFactory; 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass AstVisitor; 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass Declaration; 1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass Module; 1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass BreakableStatement; 1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass Expression; 1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass IterationStatement; 117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass MaterializedLiteral; 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass OStream; 1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass Statement; 120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass TargetCollector; 121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass TypeFeedbackOracle; 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass RegExpAlternative; 1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass RegExpAssertion; 1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass RegExpAtom; 1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass RegExpBackReference; 1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass RegExpCapture; 1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass RegExpCharacterClass; 1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass RegExpCompiler; 1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass RegExpDisjunction; 1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass RegExpEmpty; 1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass RegExpLookahead; 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass RegExpQuantifier; 1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass RegExpText; 1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define DEF_FORWARD_DECLARATION(type) class type; 137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAST_NODE_LIST(DEF_FORWARD_DECLARATION) 138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef DEF_FORWARD_DECLARATION 139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Typedef only introduced to avoid unreadable code. 142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Please do appreciate the required space in "> >". 143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktypedef ZoneList<Handle<String> > ZoneStringList; 144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktypedef ZoneList<Handle<Object> > ZoneObjectList; 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_NODE_TYPE(type) \ 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void Accept(AstVisitor* v) OVERRIDE; \ 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual AstNode::NodeType node_type() const FINAL OVERRIDE { \ 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AstNode::k##type; \ 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class> friend class AstNodeFactory; 1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum AstPropertiesFlag { 1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kDontSelfOptimize, 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kDontSoftInline, 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kDontCache 1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AstProperties FINAL BASE_EMBEDDED { 1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch class Flags : public EnumSet<AstPropertiesFlag, int> {}; 1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAstProperties() : node_count_(0), feedback_slots_(0) {} 1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Flags* flags() { return &flags_; } 1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int node_count() { return node_count_; } 1703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void add_node_count(int count) { node_count_ += count; } 1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int feedback_slots() const { return feedback_slots_; } 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void increase_feedback_slots(int count) { 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch feedback_slots_ += count; 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Flags flags_; 1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int node_count_; 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int feedback_slots_; 1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 1825d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 1835d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass AstNode: public ZoneObject { 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For generating IDs for AstNodes. 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IdGen { 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit IdGen(int id = 0) : id_(id) {} 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int GetNextId() { return ReserveIdRange(1); } 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int ReserveIdRange(int n) { 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int tmp = id_; 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch id_ += n; 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return tmp; 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int id_; 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 202f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch#define DECLARE_TYPE_ENUM(type) k##type, 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum NodeType { 204f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch AST_NODE_LIST(DECLARE_TYPE_ENUM) 205f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch kInvalid = -1 206f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch }; 207f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch#undef DECLARE_TYPE_ENUM 208f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 2093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void* operator new(size_t size, Zone* zone) { 2103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return zone->New(static_cast<int>(size)); 21144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit AstNode(int position): position_(position) {} 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual ~AstNode() {} 215f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void Accept(AstVisitor* v) = 0; 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual NodeType node_type() const = 0; 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int position() const { return position_; } 219f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 220f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // Type testing & conversion functions overridden by concrete subclasses. 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_NODE_FUNCTIONS(type) \ 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool Is##type() const { return node_type() == AstNode::k##type; } \ 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type* As##type() { \ 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Is##type() ? reinterpret_cast<type*>(this) : NULL; \ 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const type* As##type() const { \ 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Is##type() ? reinterpret_cast<const type*>(this) : NULL; \ 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 229f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 230f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch#undef DECLARE_NODE_FUNCTIONS 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual TargetCollector* AsTargetCollector() { return NULL; } 233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual BreakableStatement* AsBreakableStatement() { return NULL; } 234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual IterationStatement* AsIterationStatement() { return NULL; } 235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } 236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Some nodes re-use bailout IDs for type feedback. 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static TypeFeedbackId reuse(BailoutId id) { 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return TypeFeedbackId(id.ToInt()); 24144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 2423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Hidden to prevent accidental usage. It would have to load the 2463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // current zone from the TLS. 2473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void* operator new(size_t size); 24844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 24944f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class CaseClause; // Generates AST IDs. 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int position_; 252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Statement : public AstNode { 256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit Statement(Zone* zone, int position) : AstNode(position) {} 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool IsEmpty() { return AsEmptyStatement() != NULL; } 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsJump() const { return false; } 261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SmallMapList FINAL { 26569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch public: 26669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SmallMapList() {} 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {} 26869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Reserve(int capacity, Zone* zone) { list_.Reserve(capacity, zone); } 27069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch void Clear() { list_.Clear(); } 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Sort() { list_.Sort(); } 27269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 27369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch bool is_empty() const { return list_.is_empty(); } 27469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch int length() const { return list_.length(); } 27569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddMapIfMissing(Handle<Map> map, Zone* zone) { 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!Map::TryUpdate(map).ToHandle(&map)) return; 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < length(); ++i) { 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (at(i).is_identical_to(map)) return; 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Add(map, zone); 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void FilterForPossibleTransitions(Map* root_map) { 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = list_.length() - 1; i >= 0; i--) { 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (at(i)->FindRootMap() != root_map) { 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch list_.RemoveElement(list_.at(i)); 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Add(Handle<Map> handle, Zone* zone) { 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch list_.Add(handle.location(), zone); 29469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 29569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 29669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Handle<Map> at(int i) const { 29769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return Handle<Map>(list_.at(i)); 29869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 29969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 30069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Handle<Map> first() const { return at(0); } 30169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Handle<Map> last() const { return at(length() - 1); } 30269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 30369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private: 30469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // The list stores pointers to Map*, that is Map**, so it's GC safe. 30569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SmallPointerList<Map*> list_; 30669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 30769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch DISALLOW_COPY_AND_ASSIGN(SmallMapList); 30869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}; 30969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 31069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Expression : public AstNode { 312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Context { 314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Not assigned a context yet, or else will not be visited during 315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // code generation. 316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kUninitialized, 317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Evaluated for its side effects. 318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kEffect, 319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Evaluated for its value (and side effects). 320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kValue, 321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Evaluated for control flow (and side effects). 322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTest 323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsValidReferenceExpression() const { return false; } 326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Helpers for ToBoolean conversion. 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool ToBooleanIsTrue() const { return false; } 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool ToBooleanIsFalse() const { return false; } 330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 331e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Symbols that cannot be parsed as array indices are considered property 332e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // names. We do not treat symbols that can be array indexes as property 333e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // names because [] for string objects is handled only by keyed ICs. 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsPropertyName() const { return false; } 335e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 33680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen // True iff the result can be safely overwritten (to avoid allocation). 33780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen // False for operations that can return one of their operands. 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool ResultOverwriteAllowed() const { return false; } 33980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 34080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen // True iff the expression is a literal represented as a smi. 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsSmiLiteral() const; 3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // True iff the expression is a string literal. 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsStringLiteral() const; 3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // True iff the expression is the null literal. 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsNullLiteral() const; 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // True if we can prove that the expression is the undefined literal. 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUndefinedLiteral(Isolate* isolate) const; 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Expression type bounds 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Bounds bounds() const { return bounds_; } 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_bounds(Bounds bounds) { bounds_ = bounds; } 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Whether the expression is parenthesized 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned parenthesization_level() const { return parenthesization_level_; } 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_parenthesized() const { return parenthesization_level_ > 0; } 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void increase_parenthesization_level() { ++parenthesization_level_; } 36080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Type feedback information for assignments and properties. 362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsMonomorphic() { 363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNREACHABLE(); 364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return false; 365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 36669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch virtual SmallMapList* GetReceiverTypes() { 367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNREACHABLE(); 368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual KeyedAccessStoreMode GetStoreMode() { 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return STANDARD_STORE; 373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(rossberg): this should move to its own AST node eventually. 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte to_boolean_types() const { return to_boolean_types_; } 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId id() const { return id_; } 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackId test_id() const { return test_id_; } 381402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression(Zone* zone, int pos, IdGen* id_gen) 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : AstNode(pos), 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bounds_(Bounds::Unbounded(zone)), 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch parenthesization_level_(0), 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch id_(id_gen->GetNextId()), 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch test_id_(id_gen->GetNextId()) {} 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_to_boolean_types(byte types) { to_boolean_types_ = types; } 3903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Bounds bounds_; 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte to_boolean_types_; 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned parenthesization_level_; 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId id_; 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const TypeFeedbackId test_id_; 398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass BreakableStatement : public Statement { 402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum BreakableType { 404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block TARGET_FOR_ANONYMOUS, 405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block TARGET_FOR_NAMED_ONLY 406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The labels associated with this statement. May be NULL; 409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // if it is != NULL, guaranteed to contain at least one entry. 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<const AstRawString*>* labels() const { return labels_; } 411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Type testing & conversion. 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BreakableStatement* AsBreakableStatement() FINAL OVERRIDE { 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return this; 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Code generation 4188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Label* break_target() { return &break_target_; } 419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Testers. 421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_target_for_anonymous() const { 422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return breakable_type_ == TARGET_FOR_ANONYMOUS; 423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId EntryId() const { return entry_id_; } 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId ExitId() const { return exit_id_; } 427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected: 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels, 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BreakableType breakable_type, int position, IdGen* id_gen) 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Statement(zone, position), 432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch labels_(labels), 433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch breakable_type_(breakable_type), 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch entry_id_(id_gen->GetNextId()), 435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch exit_id_(id_gen->GetNextId()) { 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(labels == NULL || labels->length() > 0); 4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<const AstRawString*>* labels_; 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BreakableType breakable_type_; 4438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Label break_target_; 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId entry_id_; 445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId exit_id_; 446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Block FINAL : public BreakableStatement { 450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 451592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch DECLARE_NODE_TYPE(Block) 4526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddStatement(Statement* statement, Zone* zone) { 454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch statements_.Add(statement, zone); 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<Statement*>* statements() { return &statements_; } 4580d5e116f6aee03185f237311a943491bb079a768Kristian Monsen bool is_initializer_block() const { return is_initializer_block_; } 459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId DeclsId() const { return decls_id_; } 46169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsJump() const OVERRIDE { 463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !statements_.is_empty() && statements_.last()->IsJump() 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && labels() == NULL; // Good enough as an approximation... 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope() const { return scope_; } 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_scope(Scope* scope) { scope_ = scope; } 4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity, 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_initializer_block, int pos, IdGen* id_gen) 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : BreakableStatement(zone, labels, TARGET_FOR_NAMED_ONLY, pos, id_gen), 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch statements_(capacity, zone), 4753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch is_initializer_block_(is_initializer_block), 476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch decls_id_(id_gen->GetNextId()), 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scope_(NULL) {} 4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<Statement*> statements_; 481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_initializer_block_; 482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId decls_id_; 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope_; 484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Declaration : public AstNode { 488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 4893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableProxy* proxy() const { return proxy_; } 4903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableMode mode() const { return mode_; } 4913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Scope* scope() const { return scope_; } 4923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual InitializationFlag initialization() const = 0; 4933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual bool IsInlineable() const; 4943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Declaration(Zone* zone, 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* proxy, 4983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableMode mode, 499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope, 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : AstNode(pos), 502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch proxy_(proxy), 503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block mode_(mode), 504589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch scope_(scope) { 505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsDeclaredVariableMode(mode)); 5065d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch } 5075d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 5093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableProxy* proxy_; 5103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableMode mode_; 5115d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Nested scope from which the declaration originated. 5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Scope* scope_; 5143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 5153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass VariableDeclaration FINAL : public Declaration { 5183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 5193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(VariableDeclaration) 5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual InitializationFlag initialization() const OVERRIDE { 5223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; 5233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableDeclaration(Zone* zone, 527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* proxy, 5283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableMode mode, 529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope, 530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Declaration(zone, proxy, mode, scope, pos) { 5323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 5343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass FunctionDeclaration FINAL : public Declaration { 5373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 5383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(FunctionDeclaration) 5393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FunctionLiteral* fun() const { return fun_; } 541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual InitializationFlag initialization() const OVERRIDE { 5423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return kCreatedInitialized; 5433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsInlineable() const OVERRIDE; 5453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionDeclaration(Zone* zone, 548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* proxy, 5493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableMode mode, 5503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FunctionLiteral* fun, 551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope, 552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) 553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Declaration(zone, proxy, mode, scope, pos), 5543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fun_(fun) { 5553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // At the moment there are no "const functions" in JavaScript... 556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(mode == VAR || mode == LET); 557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(fun != NULL); 5583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5595d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 5605d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch private: 56185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch FunctionLiteral* fun_; 5623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 5635d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 5643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ModuleDeclaration FINAL : public Declaration { 5663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 5673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(ModuleDeclaration) 5683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Module* module() const { return module_; } 570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual InitializationFlag initialization() const OVERRIDE { 5713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return kCreatedInitialized; 5723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModuleDeclaration(Zone* zone, 576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* proxy, 5773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Module* module, 578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope, 579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) 580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Declaration(zone, proxy, MODULE, scope, pos), 5813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch module_(module) { 5823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Module* module_; 5863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 5873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ImportDeclaration FINAL : public Declaration { 5903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 5913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(ImportDeclaration) 5923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Module* module() const { return module_; } 594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual InitializationFlag initialization() const OVERRIDE { 5953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return kCreatedInitialized; 5963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ImportDeclaration(Zone* zone, 600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* proxy, 6013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Module* module, 602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope, 603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) 604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Declaration(zone, proxy, LET, scope, pos), 6053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch module_(module) { 6063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 6093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Module* module_; 6103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 6113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ExportDeclaration FINAL : public Declaration { 6143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 6153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(ExportDeclaration) 6163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual InitializationFlag initialization() const OVERRIDE { 6183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return kCreatedInitialized; 6193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExportDeclaration(Zone* zone, VariableProxy* proxy, Scope* scope, int pos) 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Declaration(zone, proxy, LET, scope, pos) {} 6243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 6253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Module : public AstNode { 6283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 6293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Interface* interface() const { return interface_; } 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Block* body() const { return body_; } 6313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Module(Zone* zone, int pos) 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : AstNode(pos), 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch interface_(Interface::NewModule(zone)), 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch body_(NULL) {} 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Module(Zone* zone, Interface* interface, int pos, Block* body = NULL) 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : AstNode(pos), 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch interface_(interface), 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch body_(body) {} 6413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 6433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Interface* interface_; 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Block* body_; 6453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 6463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ModuleLiteral FINAL : public Module { 6493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 6503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(ModuleLiteral) 6513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModuleLiteral(Zone* zone, Block* body, Interface* interface, int pos) 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Module(zone, interface, pos, body) {} 6553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 6563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ModuleVariable FINAL : public Module { 6593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 6603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(ModuleVariable) 6613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableProxy* proxy() const { return proxy_; } 6633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline ModuleVariable(Zone* zone, VariableProxy* proxy, int pos); 6663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 6683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableProxy* proxy_; 6693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 6703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ModulePath FINAL : public Module { 6733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 6743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(ModulePath) 6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Module* module() const { return module_; } 677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name() const { return name_->string(); } 6783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModulePath(Zone* zone, Module* module, const AstRawString* name, int pos) 681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Module(zone, pos), module_(module), name_(name) {} 6823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 6843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Module* module_; 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* name_; 6863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 6873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ModuleUrl FINAL : public Module { 6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 6913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(ModuleUrl) 6923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<String> url() const { return url_; } 6943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModuleUrl(Zone* zone, Handle<String> url, int pos) 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Module(zone, pos), url_(url) { 6983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 7013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<String> url_; 7025d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch}; 7035d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 7045d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ModuleStatement FINAL : public Statement { 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_NODE_TYPE(ModuleStatement) 708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* proxy() const { return proxy_; } 710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Block* body() const { return body_; } 711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModuleStatement(Zone* zone, VariableProxy* proxy, Block* body, int pos) 714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Statement(zone, pos), 715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch proxy_(proxy), 716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch body_(body) { 717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* proxy_; 721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Block* body_; 722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass IterationStatement : public BreakableStatement { 726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Type testing & conversion. 728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual IterationStatement* AsIterationStatement() FINAL OVERRIDE { 729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return this; 730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Statement* body() const { return body_; } 733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId OsrEntryId() const { return osr_entry_id_; } 735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BailoutId ContinueId() const = 0; 736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BailoutId StackCheckId() const = 0; 737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Code generation 7398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Label* continue_target() { return &continue_target_; } 740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected: 742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IterationStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IdGen* id_gen) 744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, id_gen), 7453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch body_(NULL), 746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch osr_entry_id_(id_gen->GetNextId()) {} 747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Initialize(Statement* body) { 749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block body_ = body; 750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Statement* body_; 7548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Label continue_target_; 755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId osr_entry_id_; 757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass DoWhileStatement FINAL : public IterationStatement { 761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 762f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(DoWhileStatement) 763f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 7643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block void Initialize(Expression* cond, Statement* body) { 7653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block IterationStatement::Initialize(body); 7663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block cond_ = cond; 7673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 7683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 7693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block Expression* cond() const { return cond_; } 7703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BailoutId ContinueId() const OVERRIDE { return continue_id_; } 772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BailoutId StackCheckId() const OVERRIDE { return back_edge_id_; } 773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId BackEdgeId() const { return back_edge_id_; } 774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IdGen* id_gen) 778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : IterationStatement(zone, labels, pos, id_gen), 7793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cond_(NULL), 780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch continue_id_(id_gen->GetNextId()), 781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch back_edge_id_(id_gen->GetNextId()) {} 7828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 7833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block private: 7843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block Expression* cond_; 785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId continue_id_; 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId back_edge_id_; 7883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}; 7893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 7903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass WhileStatement FINAL : public IterationStatement { 7923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block public: 793f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(WhileStatement) 794f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 7953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block void Initialize(Expression* cond, Statement* body) { 7963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block IterationStatement::Initialize(body); 7973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block cond_ = cond; 7983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 7993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 8003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block Expression* cond() const { return cond_; } 8013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block bool may_have_function_literal() const { 8023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return may_have_function_literal_; 8033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 80480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen void set_may_have_function_literal(bool value) { 80580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen may_have_function_literal_ = value; 80680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen } 8073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BailoutId ContinueId() const OVERRIDE { return EntryId(); } 809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BailoutId StackCheckId() const OVERRIDE { return body_id_; } 810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId BodyId() const { return body_id_; } 811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IdGen* id_gen) 815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : IterationStatement(zone, labels, pos, id_gen), 8163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cond_(NULL), 8173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch may_have_function_literal_(true), 818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch body_id_(id_gen->GetNextId()) {} 8193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block private: 8213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block Expression* cond_; 822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // True if there is a function literal subexpression in the condition. 8243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block bool may_have_function_literal_; 825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId body_id_; 8273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}; 8283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 8293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ForStatement FINAL : public IterationStatement { 8313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block public: 832f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(ForStatement) 833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Initialize(Statement* init, 835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* cond, 836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Statement* next, 837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Statement* body) { 838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block IterationStatement::Initialize(body); 839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block init_ = init; 840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block cond_ = cond; 841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block next_ = next; 842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8440d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Statement* init() const { return init_; } 8450d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Expression* cond() const { return cond_; } 8460d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Statement* next() const { return next_; } 84780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool may_have_function_literal() const { 849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return may_have_function_literal_; 850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 85180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen void set_may_have_function_literal(bool value) { 85280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen may_have_function_literal_ = value; 85380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen } 854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BailoutId ContinueId() const OVERRIDE { return continue_id_; } 856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BailoutId StackCheckId() const OVERRIDE { return body_id_; } 857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId BodyId() const { return body_id_; } 858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block bool is_fast_smi_loop() { return loop_variable_ != NULL; } 8606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Variable* loop_variable() { return loop_variable_; } 8616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void set_loop_variable(Variable* var) { loop_variable_ = var; } 8623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IdGen* id_gen) 866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : IterationStatement(zone, labels, pos, id_gen), 8673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch init_(NULL), 8683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cond_(NULL), 8693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_(NULL), 8703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch may_have_function_literal_(true), 8713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch loop_variable_(NULL), 872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch continue_id_(id_gen->GetNextId()), 873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch body_id_(id_gen->GetNextId()) {} 8746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Statement* init_; 877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* cond_; 878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Statement* next_; 879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // True if there is a function literal subexpression in the condition. 881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool may_have_function_literal_; 8826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Variable* loop_variable_; 883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId continue_id_; 885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId body_id_; 886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ForEachStatement : public IterationStatement { 890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum VisitMode { 892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ENUMERATE, // for (each in subject) body; 893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ITERATE // for (each of subject) body; 894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 895f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Initialize(Expression* each, Expression* subject, Statement* body) { 897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block IterationStatement::Initialize(body); 898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block each_ = each; 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch subject_ = subject; 900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* each() const { return each_; } 903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* subject() const { return subject_; } 9043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IdGen* id_gen) 908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : IterationStatement(zone, labels, pos, id_gen), 9093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch each_(NULL), 910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch subject_(NULL) {} 9115d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 9125d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch private: 9135d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch Expression* each_; 914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* subject_; 915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ForInStatement FINAL : public ForEachStatement, 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public FeedbackSlotInterface { 920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_NODE_TYPE(ForInStatement) 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* enumerable() const { 924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return subject(); 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Type feedback information. 928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int ComputeFeedbackSlotCount() { return 1; } 929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void SetFirstFeedbackSlot(int slot) { for_in_feedback_slot_ = slot; } 930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int ForInFeedbackSlot() { 932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(for_in_feedback_slot_ != kInvalidFeedbackSlot); 933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return for_in_feedback_slot_; 934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; 937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ForInType for_in_type() const { return for_in_type_; } 938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_for_in_type(ForInType type) { for_in_type_ = type; } 939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId BodyId() const { return body_id_; } 941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId PrepareId() const { return prepare_id_; } 942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BailoutId ContinueId() const OVERRIDE { return EntryId(); } 943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BailoutId StackCheckId() const OVERRIDE { return body_id_; } 944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IdGen* id_gen) 948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : ForEachStatement(zone, labels, pos, id_gen), 949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for_in_type_(SLOW_FOR_IN), 950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for_in_feedback_slot_(kInvalidFeedbackSlot), 951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch body_id_(id_gen->GetNextId()), 952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch prepare_id_(id_gen->GetNextId()) {} 953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ForInType for_in_type_; 955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int for_in_feedback_slot_; 956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId body_id_; 957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId prepare_id_; 958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ForOfStatement FINAL : public ForEachStatement { 962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_NODE_TYPE(ForOfStatement) 964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Initialize(Expression* each, 966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* subject, 967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Statement* body, 968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* assign_iterator, 969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* next_result, 970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* result_done, 971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* assign_each) { 972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ForEachStatement::Initialize(each, subject, body); 973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assign_iterator_ = assign_iterator; 974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch next_result_ = next_result; 975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result_done_ = result_done; 976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assign_each_ = assign_each; 977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* iterable() const { 980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return subject(); 981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // var iterator = subject[Symbol.iterator](); 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* assign_iterator() const { 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return assign_iterator_; 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // var result = iterator.next(); 989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* next_result() const { 990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return next_result_; 991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // result.done 994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* result_done() const { 995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result_done_; 996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // each = result.value 999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* assign_each() const { 1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return assign_each_; 1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BailoutId ContinueId() const OVERRIDE { return EntryId(); } 1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual BailoutId StackCheckId() const OVERRIDE { return BackEdgeId(); } 1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId BackEdgeId() const { return back_edge_id_; } 1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IdGen* id_gen) 1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : ForEachStatement(zone, labels, pos, id_gen), 1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assign_iterator_(NULL), 1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch next_result_(NULL), 1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result_done_(NULL), 1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assign_each_(NULL), 1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch back_edge_id_(id_gen->GetNextId()) {} 1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* assign_iterator_; 1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* next_result_; 1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* result_done_; 1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* assign_each_; 1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId back_edge_id_; 1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ExpressionStatement FINAL : public Statement { 1027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1028f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(ExpressionStatement) 1029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 103085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch void set_expression(Expression* e) { expression_ = e; } 103185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch Expression* expression() const { return expression_; } 1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsJump() const OVERRIDE { return expression_->IsThrow(); } 10335d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 10343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExpressionStatement(Zone* zone, Expression* expression, int pos) 1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Statement(zone, pos), expression_(expression) { } 10373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* expression_; 1040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JumpStatement : public Statement { 1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsJump() const FINAL OVERRIDE { return true; } 1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit JumpStatement(Zone* zone, int pos) : Statement(zone, pos) {} 1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ContinueStatement FINAL : public JumpStatement { 1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1054f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(ContinueStatement) 1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10560d5e116f6aee03185f237311a943491bb079a768Kristian Monsen IterationStatement* target() const { return target_; } 10573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit ContinueStatement(Zone* zone, IterationStatement* target, int pos) 1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : JumpStatement(zone, pos), target_(target) { } 1061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block IterationStatement* target_; 1064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass BreakStatement FINAL : public JumpStatement { 1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1069f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(BreakStatement) 1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10710d5e116f6aee03185f237311a943491bb079a768Kristian Monsen BreakableStatement* target() const { return target_; } 10723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit BreakStatement(Zone* zone, BreakableStatement* target, int pos) 1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : JumpStatement(zone, pos), target_(target) { } 1076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block BreakableStatement* target_; 1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ReturnStatement FINAL : public JumpStatement { 1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1084f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(ReturnStatement) 1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Expression* expression() const { return expression_; } 10873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit ReturnStatement(Zone* zone, Expression* expression, int pos) 1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : JumpStatement(zone, pos), expression_(expression) { } 1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* expression_; 1094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass WithStatement FINAL : public Statement { 1098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 109969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch DECLARE_NODE_TYPE(WithStatement) 1100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope() { return scope_; } 11020d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Expression* expression() const { return expression_; } 110369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Statement* statement() const { return statement_; } 1104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WithStatement( 1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone* zone, Scope* scope, 1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* expression, Statement* statement, int pos) 1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Statement(zone, pos), 1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scope_(scope), 1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expression_(expression), 11123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch statement_(statement) { } 1113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope_; 1116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* expression_; 111769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Statement* statement_; 1118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CaseClause FINAL : public Expression { 1122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_NODE_TYPE(CaseClause) 1124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11250d5e116f6aee03185f237311a943491bb079a768Kristian Monsen bool is_default() const { return label_ == NULL; } 11260d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Expression* label() const { 1127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CHECK(!is_default()); 1128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return label_; 1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 11308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Label* body_target() { return &body_target_; } 11310d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ZoneList<Statement*>* statements() const { return statements_; } 1132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId EntryId() const { return entry_id_; } 113444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Type feedback information. 1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackId CompareId() { return compare_id_; } 1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Type* compare_type() { return compare_type_; } 1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_compare_type(Type* type) { compare_type_ = type; } 1139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CaseClause(Zone* zone, Expression* label, ZoneList<Statement*>* statements, 1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos, IdGen* id_gen); 1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* label_; 11458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Label body_target_; 1146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<Statement*>* statements_; 1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Type* compare_type_; 1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const TypeFeedbackId compare_id_; 1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId entry_id_; 1151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SwitchStatement FINAL : public BreakableStatement { 1155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1156f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(SwitchStatement) 1157f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 1158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) { 1159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block tag_ = tag; 1160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block cases_ = cases; 1161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11630d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Expression* tag() const { return tag_; } 11640d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ZoneList<CaseClause*>* cases() const { return cases_; } 11653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SwitchStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IdGen* id_gen) 1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, id_gen), 11703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch tag_(NULL), 1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cases_(NULL) {} 1172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* tag_; 1175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<CaseClause*>* cases_; 1176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// If-statements always have non-null references to their then- and 1180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// else-parts. When parsing if-statements with no explicit else-part, 1181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the parser implicitly creates an empty statement. Use the 1182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HasThenStatement() and HasElseStatement() functions to check if a 1183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// given if-statement has a then- or an else-part containing code. 1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass IfStatement FINAL : public Statement { 1185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 118685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch DECLARE_NODE_TYPE(IfStatement) 118785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 118885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch bool HasThenStatement() const { return !then_statement()->IsEmpty(); } 118985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch bool HasElseStatement() const { return !else_statement()->IsEmpty(); } 119085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 119185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch Expression* condition() const { return condition_; } 119285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch Statement* then_statement() const { return then_statement_; } 119385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch Statement* else_statement() const { return else_statement_; } 119485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsJump() const OVERRIDE { 1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HasThenStatement() && then_statement()->IsJump() 1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && HasElseStatement() && else_statement()->IsJump(); 1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 119985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId IfId() const { return if_id_; } 1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId ThenId() const { return then_id_; } 1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId ElseId() const { return else_id_; } 12033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IfStatement(Zone* zone, Expression* condition, Statement* then_statement, 1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Statement* else_statement, int pos, IdGen* id_gen) 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Statement(zone, pos), 1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch condition_(condition), 12093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch then_statement_(then_statement), 12103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch else_statement_(else_statement), 1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if_id_(id_gen->GetNextId()), 1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch then_id_(id_gen->GetNextId()), 1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else_id_(id_gen->GetNextId()) {} 12143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* condition_; 1217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Statement* then_statement_; 1218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Statement* else_statement_; 1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId if_id_; 1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId then_id_; 1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId else_id_; 1222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// NOTE: TargetCollectors are represented as nodes to fit in the target 1226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// stack in the compiler; this should probably be reworked. 1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass TargetCollector FINAL : public AstNode { 1228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit TargetCollector(Zone* zone) 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : AstNode(RelocInfo::kNoPosition), targets_(0, zone) { } 1231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Adds a jump target to the collector. The collector stores a pointer not 1233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // a copy of the target to make binding work, so make sure not to pass in 1234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // references to something on the stack. 1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddTarget(Label* target, Zone* zone); 1236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Virtual behaviour. TargetCollectors are never part of the AST. 1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void Accept(AstVisitor* v) OVERRIDE { UNREACHABLE(); } 1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual NodeType node_type() const OVERRIDE { return kInvalid; } 1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual TargetCollector* AsTargetCollector() OVERRIDE { return this; } 1241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 12423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ZoneList<Label*>* targets() { return &targets_; } 1243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 12453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ZoneList<Label*> targets_; 1246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass TryStatement : public Statement { 1250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 12518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch void set_escaping_targets(ZoneList<Label*>* targets) { 1252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block escaping_targets_ = targets; 1253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 12553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int index() const { return index_; } 1256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Block* try_block() const { return try_block_; } 12578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ZoneList<Label*>* escaping_targets() const { return escaping_targets_; } 12583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TryStatement(Zone* zone, int index, Block* try_block, int pos) 1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Statement(zone, pos), 1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch index_(index), 12633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try_block_(try_block), 12643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch escaping_targets_(NULL) { } 1265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 12673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Unique (per-function) index of this handler. This is not an AST ID. 12683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int index_; 12693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Block* try_block_; 12718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ZoneList<Label*>* escaping_targets_; 1272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass TryCatchStatement FINAL : public TryStatement { 1276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 12773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(TryCatchStatement) 12783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Scope* scope() { return scope_; } 12803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Variable* variable() { return variable_; } 12813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Block* catch_block() const { return catch_block_; } 12823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TryCatchStatement(Zone* zone, 1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index, 12863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Block* try_block, 12873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Scope* scope, 12883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Variable* variable, 1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Block* catch_block, 1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) 1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : TryStatement(zone, index, try_block, pos), 12923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch scope_(scope), 12933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch variable_(variable), 1294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block catch_block_(catch_block) { 1295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 12983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Scope* scope_; 12993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Variable* variable_; 1300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Block* catch_block_; 1301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass TryFinallyStatement FINAL : public TryStatement { 1305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1306f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(TryFinallyStatement) 1307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Block* finally_block() const { return finally_block_; } 13093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TryFinallyStatement( 1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone* zone, int index, Block* try_block, Block* finally_block, int pos) 1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : TryStatement(zone, index, try_block, pos), 13143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch finally_block_(finally_block) { } 1315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Block* finally_block_; 1318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass DebuggerStatement FINAL : public Statement { 1322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1323f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(DebuggerStatement) 13243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId DebugBreakId() const { return debugger_id_; } 1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit DebuggerStatement(Zone* zone, int pos, IdGen* id_gen) 1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Statement(zone, pos), debugger_id_(id_gen->GetNextId()) {} 13303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId debugger_id_; 1333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass EmptyStatement FINAL : public Statement { 1337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1338f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(EmptyStatement) 1339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit EmptyStatement(Zone* zone, int pos): Statement(zone, pos) {} 1342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Literal FINAL : public Expression { 1346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1347f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(Literal) 1348f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsPropertyName() const OVERRIDE { 1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value_->IsPropertyName(); 1351e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke } 1352e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> AsPropertyName() { 1354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsPropertyName()); 1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<String>::cast(value()); 1356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* AsRawPropertyName() { 1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsPropertyName()); 1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value_->AsString(); 136144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool ToBooleanIsTrue() const OVERRIDE { 1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value()->BooleanValue(); 136544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool ToBooleanIsFalse() const OVERRIDE { 1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !value()->BooleanValue(); 1368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value() const { return value_->value(); } 1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstValue* raw_value() const { return value_; } 13723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Support for using Literal as a HashMap key. NOTE: Currently, this works 13743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // only for string and number literals! 13753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uint32_t Hash() { return ToString()->Hash(); } 13763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static bool Match(void* literal1, void* literal2) { 13783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<String> s1 = static_cast<Literal*>(literal1)->ToString(); 13793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<String> s2 = static_cast<Literal*>(literal2)->ToString(); 1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return String::Equals(s1, s2); 13813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackId LiteralFeedbackId() const { return reuse(id()); } 13843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal(Zone* zone, const AstValue* value, int position, IdGen* id_gen) 1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, position, id_gen), 1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value_(value), 1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate_(zone->isolate()) {} 1390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 13923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<String> ToString(); 13933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstValue* value_; 1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(dcarney): remove. this is only needed for Match and Hash. 1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate_; 1397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Base class for literals that needs space in the corresponding JSFunction. 1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass MaterializedLiteral : public Expression { 1402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual MaterializedLiteral* AsMaterializedLiteral() { return this; } 1404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int literal_index() { return literal_index_; } 1406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int depth() const { 1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // only callable after initialization. 1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(depth_ >= 1); 1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return depth_; 1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MaterializedLiteral(Zone* zone, int literal_index, int pos, IdGen* id_gen) 1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), 1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch literal_index_(literal_index), 1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch is_simple_(false), 1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch depth_(0) {} 1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // A materialized literal is simple if the values consist of only 1421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // constants and simple object and array literals. 1422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_simple() const { return is_simple_; } 1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_is_simple(bool is_simple) { is_simple_ = is_simple; } 1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class CompileTimeValue; 1425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_depth(int depth) { 1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(depth >= 1); 1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch depth_ = depth; 1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 14303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Populate the constant properties/elements fixed array. 1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void BuildConstants(Isolate* isolate); 1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class ArrayLiteral; 1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class ObjectLiteral; 1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If the expression is a literal, return the literal value; 1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // if the expression is a materialized literal and is simple return a 1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // compile time value as encoded by CompileTimeValue::GetValue(). 1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Otherwise, return undefined literal as the placeholder 1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // in the object literal boilerplate. 1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate); 1442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int literal_index_; 1445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_simple_; 1446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int depth_; 1447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Property is used for passing information 1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// about an object literal's properties from the parser 1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// to the code generator. 1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ObjectLiteralProperty FINAL : public ZoneObject { 1454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Kind { 1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CONSTANT, // Property with constant value (compile time). 1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch COMPUTED, // Property with computed value (execution time). 1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MATERIALIZED_LITERAL, // Property value is a materialized literal. 1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GETTER, SETTER, // Property is an accessor function. 1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PROTOTYPE // Property is __proto__. 1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ObjectLiteralProperty(Zone* zone, AstValueFactory* ast_value_factory, 1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* key, Expression* value, bool is_static); 1465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* key() { return key_; } 1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* value() { return value_; } 1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind kind() { return kind_; } 1469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Type feedback information. 1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RecordTypeFeedback(TypeFeedbackOracle* oracle); 1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsMonomorphic() { return !receiver_type_.is_null(); } 1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> GetReceiverType() { return receiver_type_; } 14743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsCompileTimeValue(); 1476d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_emit_store(bool emit_store); 1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool emit_store(); 14793e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class> friend class AstNodeFactory; 14823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ObjectLiteralProperty(Zone* zone, bool is_getter, FunctionLiteral* value, 1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_static); 1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_key(Literal* key) { key_ = key; } 14863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* key_; 1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* value_; 1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind kind_; 1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool emit_store_; 1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_static_; 1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> receiver_type_; 1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// An object literal has a boilerplate object that is used 1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// for minimizing the work when constructing it at runtime. 1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ObjectLiteral FINAL : public MaterializedLiteral { 1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef ObjectLiteralProperty Property; 1502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1503f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(ObjectLiteral) 1504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<FixedArray> constant_properties() const { 1506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return constant_properties_; 1507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<Property*>* properties() const { return properties_; } 15096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block bool fast_elements() const { return fast_elements_; } 1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool may_store_doubles() const { return may_store_doubles_; } 1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_function() const { return has_function_; } 15126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Decide if a property should be in the object boilerplate. 1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool IsBoilerplateProperty(Property* property); 1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Populate the constant properties fixed array. 1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void BuildConstantProperties(Isolate* isolate); 15183e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 15193e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu // Mark all computed expressions that are bound to a key that 15203e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu // is shadowed by a later occurrence of the same key. For the 15213e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu // marked expressions, no store code is emitted. 1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CalculateEmitStore(Zone* zone); 1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Assemble bitfield of flags for the CreateObjectLiteral helper. 1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int ComputeFlags() const { 1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int flags = fast_elements() ? kFastElements : kNoFlags; 1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags |= has_function() ? kHasFunction : kNoFlags; 1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return flags; 1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 15303e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 153144f0eee88ff00398ff7f715fab053374d808c90dSteve Block enum Flags { 153244f0eee88ff00398ff7f715fab053374d808c90dSteve Block kNoFlags = 0, 153344f0eee88ff00398ff7f715fab053374d808c90dSteve Block kFastElements = 1, 153444f0eee88ff00398ff7f715fab053374d808c90dSteve Block kHasFunction = 1 << 1 153544f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 153644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch struct Accessors: public ZoneObject { 15383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Accessors() : getter(NULL), setter(NULL) { } 15393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* getter; 15403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* setter; 15413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 15423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, 1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int boilerplate_properties, bool has_function, int pos, 1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IdGen* id_gen) 1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : MaterializedLiteral(zone, literal_index, pos, id_gen), 15483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch properties_(properties), 1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch boilerplate_properties_(boilerplate_properties), 1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fast_elements_(false), 1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch may_store_doubles_(false), 15523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch has_function_(has_function) {} 15533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<FixedArray> constant_properties_; 1556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<Property*>* properties_; 1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int boilerplate_properties_; 15586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block bool fast_elements_; 1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool may_store_doubles_; 156044f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool has_function_; 1561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Node for capturing a regexp literal. 1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpLiteral FINAL : public MaterializedLiteral { 1566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 15673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(RegExpLiteral) 15683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> pattern() const { return pattern_->string(); } 1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> flags() const { return flags_->string(); } 15713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpLiteral(Zone* zone, const AstRawString* pattern, 1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* flags, int literal_index, int pos, 1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IdGen* id_gen) 1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : MaterializedLiteral(zone, literal_index, pos, id_gen), 1577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pattern_(pattern), 1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags_(flags) { 1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_depth(1); 1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* pattern_; 1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* flags_; 1585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// An array literal has a literals object that is used 1589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// for minimizing the work when constructing it at runtime. 1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ArrayLiteral FINAL : public MaterializedLiteral { 1591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 15923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(ArrayLiteral) 15933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<FixedArray> constant_elements() const { return constant_elements_; } 15953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ZoneList<Expression*>* values() const { return values_; } 15963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return an AST id for an element that is used in simulate instructions. 1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId GetIdForElement(int i) { 1599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return BailoutId(first_element_id_.ToInt() + i); 1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 16013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Populate the constant elements fixed array. 1603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void BuildConstantElements(Isolate* isolate); 1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Assemble bitfield of flags for the CreateArrayLiteral helper. 1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int ComputeFlags() const { 1607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int flags = depth() == 1 ? kShallowElements : kNoFlags; 1608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags |= ArrayLiteral::kDisableMementos; 1609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return flags; 1610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Flags { 1613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNoFlags = 0, 1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kShallowElements = 1, 1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kDisableMementos = 1 << 1 1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 16173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, int literal_index, 1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos, IdGen* id_gen) 1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : MaterializedLiteral(zone, literal_index, pos, id_gen), 1622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_(values), 1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch first_element_id_(id_gen->ReserveIdRange(values->length())) {} 1624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1626e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke Handle<FixedArray> constant_elements_; 1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<Expression*>* values_; 1628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId first_element_id_; 1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass VariableProxy FINAL : public Expression, public FeedbackSlotInterface { 1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1634f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(VariableProxy) 1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsValidReferenceExpression() const OVERRIDE { 1637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return var_ == NULL ? true : var_->IsValidReference(); 16383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 16393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsArguments() const { return var_ != NULL && var_->is_arguments(); } 1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name() const { return name_->string(); } 1643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* raw_name() const { return name_; } 16440d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Variable* var() const { return var_; } 16450d5e116f6aee03185f237311a943491bb079a768Kristian Monsen bool is_this() const { return is_this_; } 16463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Interface* interface() const { return interface_; } 16473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_assigned() const { return is_assigned_; } 1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_is_assigned() { is_assigned_ = true; } 16506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bind this proxy to the variable var. Interfaces must match. 1652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void BindTo(Variable* var); 1653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; } 1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void SetFirstFeedbackSlot(int slot) { 1656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch variable_feedback_slot_ = slot; 1657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int VariableFeedbackSlot() { return variable_feedback_slot_; } 166085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy(Zone* zone, Variable* var, int position, IdGen* id_gen); 166385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy(Zone* zone, const AstRawString* name, bool is_this, 1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Interface* interface, int position, IdGen* id_gen); 1666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* name_; 16683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Variable* var_; // resolved variable, or NULL 16693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool is_this_; 1670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_assigned_; 16713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Interface* interface_; 1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int variable_feedback_slot_; 1673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Property FINAL : public Expression, public FeedbackSlotInterface { 1677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1678f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(Property) 1679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsValidReferenceExpression() const OVERRIDE { return true; } 1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* obj() const { return obj_; } 1683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* key() const { return key_; } 1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId LoadId() const { return load_id_; } 1686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 168744f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool IsStringAccess() const { return is_string_access_; } 16889fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 1689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Type feedback information. 1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsMonomorphic() OVERRIDE { 1691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return receiver_types_.length() == 1; 1692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual SmallMapList* GetReceiverTypes() OVERRIDE { 1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return &receiver_types_; 1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual KeyedAccessStoreMode GetStoreMode() OVERRIDE { 1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return STANDARD_STORE; 1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUninitialized() { return !is_for_call_ && is_uninitialized_; } 1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasNoTypeInformation() { 1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return is_uninitialized_; 1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_is_uninitialized(bool b) { is_uninitialized_ = b; } 1704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_is_string_access(bool b) { is_string_access_ = b; } 1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void mark_for_call() { is_for_call_ = true; } 1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsForCall() { return is_for_call_; } 17073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsSuperAccess() { 1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return obj()->IsSuperReference(); 1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackId PropertyFeedbackId() { return reuse(id()); } 1713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; } 1715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void SetFirstFeedbackSlot(int slot) { 1716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch property_feedback_slot_ = slot; 1717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int PropertyFeedbackSlot() const { return property_feedback_slot_; } 17203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Property(Zone* zone, Expression* obj, Expression* key, int pos, IdGen* id_gen) 1723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), 17243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch obj_(obj), 17253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key_(key), 1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch load_id_(id_gen->GetNextId()), 1727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch property_feedback_slot_(kInvalidFeedbackSlot), 1728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch is_for_call_(false), 17293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch is_uninitialized_(false), 1730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch is_string_access_(false) {} 1731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* obj_; 1734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* key_; 1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId load_id_; 1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int property_feedback_slot_; 1737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 173869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SmallMapList receiver_types_; 1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_for_call_ : 1; 17403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool is_uninitialized_ : 1; 174144f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool is_string_access_ : 1; 1742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Call FINAL : public Expression, public FeedbackSlotInterface { 1746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1747f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(Call) 1748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* expression() const { return expression_; } 1750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<Expression*>* arguments() const { return arguments_; } 1751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Type feedback information. 1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int ComputeFeedbackSlotCount() { return 1; } 1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void SetFirstFeedbackSlot(int slot) { 1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch call_feedback_slot_ = slot; 1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasCallFeedbackSlot() const { 1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return call_feedback_slot_ != kInvalidFeedbackSlot; 1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int CallFeedbackSlot() const { return call_feedback_slot_; } 1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual SmallMapList* GetReceiverTypes() OVERRIDE { 1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (expression()->IsProperty()) { 1765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return expression()->AsProperty()->GetReceiverTypes(); 1766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 1768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsMonomorphic() OVERRIDE { 1771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (expression()->IsProperty()) { 1772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return expression()->AsProperty()->IsMonomorphic(); 1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !target_.is_null(); 1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool global_call() const { 1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* proxy = expression_->AsVariableProxy(); 1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return proxy != NULL && proxy->var()->IsUnallocated(); 1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool known_global_function() const { 1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return global_call() && !target_.is_null(); 1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target() { return target_; } 1787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Cell> cell() { return cell_; } 1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> allocation_site() { return allocation_site_; } 1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_target(Handle<JSFunction> target) { target_ = target; } 1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_allocation_site(Handle<AllocationSite> site) { 1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch allocation_site_ = site; 1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ComputeGlobalTarget(Handle<GlobalObject> global, LookupIterator* it); 1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId ReturnId() const { return return_id_; } 1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum CallType { 1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch POSSIBLY_EVAL_CALL, 1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GLOBAL_CALL, 1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOOKUP_SLOT_CALL, 1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PROPERTY_CALL, 1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OTHER_CALL 1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Helpers to determine how to handle the call. 1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallType GetCallType(Isolate* isolate) const; 1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUsingCallFeedbackSlot(Isolate* isolate) const; 1811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 1813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Used to assert that the FullCodeGenerator records the return site. 1814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool return_is_recorded_; 1815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 18173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos, IdGen* id_gen) 1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), 18213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch expression_(expression), 18223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arguments_(arguments), 1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch call_feedback_slot_(kInvalidFeedbackSlot), 1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return_id_(id_gen->GetNextId()) { 1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (expression->IsProperty()) { 1826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expression->AsProperty()->mark_for_call(); 1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 18293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* expression_; 1832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<Expression*>* arguments_; 1833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target_; 1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Cell> cell_; 1836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> allocation_site_; 1837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int call_feedback_slot_; 1838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId return_id_; 184044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 184144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 184244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CallNew FINAL : public Expression, public FeedbackSlotInterface { 1844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 18453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(CallNew) 18463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* expression() const { return expression_; } 18483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ZoneList<Expression*>* arguments() const { return arguments_; } 1849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Type feedback information. 1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int ComputeFeedbackSlotCount() { 1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return FLAG_pretenuring_call_new ? 2 : 1; 1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void SetFirstFeedbackSlot(int slot) { 1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch callnew_feedback_slot_ = slot; 1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int CallNewFeedbackSlot() { 1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(callnew_feedback_slot_ != kInvalidFeedbackSlot); 1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return callnew_feedback_slot_; 1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int AllocationSiteFeedbackSlot() { 1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(callnew_feedback_slot_ != kInvalidFeedbackSlot); 1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(FLAG_pretenuring_call_new); 1865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return callnew_feedback_slot_ + 1; 1866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 18673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void RecordTypeFeedback(TypeFeedbackOracle* oracle); 1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsMonomorphic() OVERRIDE { return is_monomorphic_; } 1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> target() const { return target_; } 1871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind() const { return elements_kind_; } 1872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> allocation_site() const { 1873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return allocation_site_; 1874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 18753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int feedback_slots() { return 1; } 18773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId ReturnId() const { return return_id_; } 18793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 1882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos, IdGen* id_gen) 1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), 18843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch expression_(expression), 18853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch arguments_(arguments), 18863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch is_monomorphic_(false), 1887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements_kind_(GetInitialFastElementsKind()), 1888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch callnew_feedback_slot_(kInvalidFeedbackSlot), 1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return_id_(id_gen->GetNextId()) {} 1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* expression_; 1893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<Expression*>* arguments_; 18943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool is_monomorphic_; 18963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<JSFunction> target_; 1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind_; 1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> allocation_site_; 1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int callnew_feedback_slot_; 19003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId return_id_; 1902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The CallRuntime class does not represent any official JavaScript 1906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// language construct. Instead it is used to call a C or JS function 1907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with a set of arguments. This is used from the builtins that are 1908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// implemented in JavaScript (see "v8natives.js"). 1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CallRuntime FINAL : public Expression, public FeedbackSlotInterface { 1910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 19113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(CallRuntime) 19123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name() const { return raw_name_->string(); } 1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* raw_name() const { return raw_name_; } 19153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const Runtime::Function* function() const { return function_; } 19163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ZoneList<Expression*>* arguments() const { return arguments_; } 19173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool is_jsruntime() const { return function_ == NULL; } 19183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Type feedback information. 1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int ComputeFeedbackSlotCount() { 1921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (FLAG_vector_ics && is_jsruntime()) ? 1 : 0; 1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void SetFirstFeedbackSlot(int slot) { 1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch callruntime_feedback_slot_ = slot; 1925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 19263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int CallRuntimeFeedbackSlot() { 1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!is_jsruntime() || 1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch callruntime_feedback_slot_ != kInvalidFeedbackSlot); 1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return callruntime_feedback_slot_; 1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackId CallRuntimeFeedbackId() const { return reuse(id()); } 1934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallRuntime(Zone* zone, const AstRawString* name, 193744f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* function, 1938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<Expression*>* arguments, int pos, IdGen* id_gen) 1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), 1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch raw_name_(name), 19413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch function_(function), 1942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch arguments_(arguments) {} 1943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* raw_name_; 194644f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* function_; 1947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<Expression*>* arguments_; 1948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int callruntime_feedback_slot_; 1949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass UnaryOperation FINAL : public Expression { 1953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 19545d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch DECLARE_NODE_TYPE(UnaryOperation) 19555d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 19565d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch Token::Value op() const { return op_; } 19575d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch Expression* expression() const { return expression_; } 19585d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 1959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId MaterializeTrueId() { return materialize_true_id_; } 1960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId MaterializeFalseId() { return materialize_false_id_; } 19613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void RecordToBooleanTypeFeedback( 1963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackOracle* oracle) OVERRIDE; 19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos, 1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IdGen* id_gen) 1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), 19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op_(op), 19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch expression_(expression), 1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch materialize_true_id_(id_gen->GetNextId()), 1972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch materialize_false_id_(id_gen->GetNextId()) { 1973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Token::IsUnaryOp(op)); 19743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Token::Value op_; 1978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* expression_; 19793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // For unary not (Token::NOT), the AST ids where true and false will 19813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // actually be materialized, respectively. 1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId materialize_true_id_; 1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId materialize_false_id_; 1984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass BinaryOperation FINAL : public Expression { 1988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1989f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(BinaryOperation) 1990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool ResultOverwriteAllowed() const OVERRIDE; 1992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Token::Value op() const { return op_; } 1994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* left() const { return left_; } 1995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* right() const { return right_; } 1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> allocation_site() const { return allocation_site_; } 1997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_allocation_site(Handle<AllocationSite> allocation_site) { 1998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch allocation_site_ = allocation_site; 1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId RightId() const { return right_id_; } 2002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackId BinaryOperationFeedbackId() const { return reuse(id()); } 2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Maybe<int> fixed_right_arg() const { return fixed_right_arg_; } 2005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_fixed_right_arg(Maybe<int> arg) { fixed_right_arg_ = arg; } 2006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void RecordToBooleanTypeFeedback( 2008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackOracle* oracle) OVERRIDE; 20093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BinaryOperation(Zone* zone, Token::Value op, Expression* left, 2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* right, int pos, IdGen* id_gen) 2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), 2014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch op_(op), 2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_(left), 2016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right_(right), 2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right_id_(id_gen->GetNextId()) { 2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Token::IsBinaryOp(op)); 20193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Token::Value op_; 2023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* left_; 2024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* right_; 2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> allocation_site_; 2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(rossberg): the fixed arg should probably be represented as a Constant 2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // type for the RHS. 2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Maybe<int> fixed_right_arg_; 2030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The short-circuit logical operations need an AST ID for their 2032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // right-hand subexpression. 2033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId right_id_; 2034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CountOperation FINAL : public Expression { 203880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen public: 2039f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(CountOperation) 20406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_prefix() const { return is_prefix_; } 2042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_postfix() const { return !is_prefix_; } 204380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 20448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Token::Value op() const { return op_; } 2045e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke Token::Value binary_op() { 204680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen return (op() == Token::INC) ? Token::ADD : Token::SUB; 2047e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke } 204880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 20498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Expression* expression() const { return expression_; } 2050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsMonomorphic() OVERRIDE { 2052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return receiver_types_.length() == 1; 2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual SmallMapList* GetReceiverTypes() OVERRIDE { 2055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return &receiver_types_; 2056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual KeyedAccessStoreMode GetStoreMode() OVERRIDE { 2058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return store_mode_; 2059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Type* type() const { return type_; } 2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_store_mode(KeyedAccessStoreMode mode) { store_mode_ = mode; } 2062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_type(Type* type) { type_ = type; } 2063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId AssignmentId() const { return assignment_id_; } 20658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackId CountBinOpFeedbackId() const { return count_id_; } 2067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackId CountStoreFeedbackId() const { return reuse(id()); } 2068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 20693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 2070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, 2071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos, IdGen* id_gen) 2072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), 20733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op_(op), 20743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch is_prefix_(is_prefix), 2075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch store_mode_(STANDARD_STORE), 20763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch expression_(expr), 2077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assignment_id_(id_gen->GetNextId()), 2078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch count_id_(id_gen->GetNextId()) {} 20793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 20818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Token::Value op_; 2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_prefix_ : 1; 2083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, 2084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // must have extra bit. 2085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Type* type_; 2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 20878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Expression* expression_; 2088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId assignment_id_; 2089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const TypeFeedbackId count_id_; 209069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SmallMapList receiver_types_; 2091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CompareOperation FINAL : public Expression { 2095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 209685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch DECLARE_NODE_TYPE(CompareOperation) 209785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 209885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch Token::Value op() const { return op_; } 209985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch Expression* left() const { return left_; } 210085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch Expression* right() const { return right_; } 210185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 210285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch // Type feedback information. 2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackId CompareOperationFeedbackId() const { return reuse(id()); } 2104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Type* combined_type() const { return combined_type_; } 2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_combined_type(Type* type) { combined_type_ = type; } 210685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 210785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch // Match special cases. 210885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); 2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsLiteralCompareUndefined(Expression** expr, Isolate* isolate); 21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool IsLiteralCompareNull(Expression** expr); 21113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CompareOperation(Zone* zone, Token::Value op, Expression* left, 2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* right, int pos, IdGen* id_gen) 2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), 21163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op_(op), 21173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch left_(left), 21183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch right_(right), 2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch combined_type_(Type::None(zone)) { 2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Token::IsCompareOp(op)); 21213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 212285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 2123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Token::Value op_; 2125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* left_; 2126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* right_; 2127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Type* combined_type_; 212980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}; 213080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 213180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 2132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Conditional FINAL : public Expression { 21335d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch public: 21343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_NODE_TYPE(Conditional) 21355d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 21363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* condition() const { return condition_; } 21373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* then_expression() const { return then_expression_; } 21383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* else_expression() const { return else_expression_; } 21395d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId ThenId() const { return then_id_; } 2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId ElseId() const { return else_id_; } 21425d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 21433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Conditional(Zone* zone, Expression* condition, Expression* then_expression, 2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* else_expression, int position, IdGen* id_gen) 2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, position, id_gen), 21473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch condition_(condition), 2148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block then_expression_(then_expression), 21497f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch else_expression_(else_expression), 2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch then_id_(id_gen->GetNextId()), 2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else_id_(id_gen->GetNextId()) {} 21527f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 2153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* condition_; 2155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* then_expression_; 2156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* else_expression_; 2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId then_id_; 2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId else_id_; 2159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Assignment FINAL : public Expression { 2163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2164f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(Assignment) 2165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 21666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } 21676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Token::Value binary_op() const; 2169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Token::Value op() const { return op_; } 2171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* target() const { return target_; } 2172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* value() const { return value_; } 2173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch BinaryOperation* binary_operation() const { return binary_operation_; } 2174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2175e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // This check relies on the definition order of token in token.h. 2176e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke bool is_compound() const { return op() > Token::ASSIGN; } 2177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId AssignmentId() const { return assignment_id_; } 2179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Type feedback information. 2181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackId AssignmentFeedbackId() { return reuse(id()); } 2182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsMonomorphic() OVERRIDE { 2183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return receiver_types_.length() == 1; 2184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUninitialized() { return is_uninitialized_; } 2186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasNoTypeInformation() { 2187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return is_uninitialized_; 2188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual SmallMapList* GetReceiverTypes() OVERRIDE { 2190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return &receiver_types_; 2191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual KeyedAccessStoreMode GetStoreMode() OVERRIDE { 2193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return store_mode_; 2194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_is_uninitialized(bool b) { is_uninitialized_ = b; } 2196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_store_mode(KeyedAccessStoreMode mode) { store_mode_ = mode; } 2197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 21983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 2199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Assignment(Zone* zone, Token::Value op, Expression* target, Expression* value, 2200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos, IdGen* id_gen); 22013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch template<class Visitor> 2203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Init(Zone* zone, AstNodeFactory<Visitor>* factory) { 2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Token::IsAssignmentOp(op_)); 22053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (is_compound()) { 2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch binary_operation_ = factory->NewBinaryOperation( 2207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch binary_op(), target_, value_, position() + 1); 22083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Token::Value op_; 2213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* target_; 2214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* value_; 2215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch BinaryOperation* binary_operation_; 2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BailoutId assignment_id_; 2217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_uninitialized_ : 1; 2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, 2220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // must have extra bit. 222169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SmallMapList receiver_types_; 2222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Yield FINAL : public Expression, public FeedbackSlotInterface { 2226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 2227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_NODE_TYPE(Yield) 2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Kind { 2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kInitial, // The initial yield that returns the unboxed generator object. 2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSuspend, // A normal yield: { value: EXPRESSION, done: false } 2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kDelegating, // A yield*. 2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFinal // A return: { value: EXPRESSION, done: true } 2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* generator_object() const { return generator_object_; } 2237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* expression() const { return expression_; } 2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind yield_kind() const { return yield_kind_; } 2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Delegating yield surrounds the "yield" in a "try/catch". This index 2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // locates the catch handler in the handler table, and is equivalent to 2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TryCatchStatement::index(). 2243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index() const { 2244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(kDelegating, yield_kind()); 2245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return index_; 2246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_index(int index) { 2248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(kDelegating, yield_kind()); 2249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch index_ = index; 2250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Type feedback information. 2253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int ComputeFeedbackSlotCount() { 2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (FLAG_vector_ics && yield_kind() == kDelegating) ? 3 : 0; 2255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void SetFirstFeedbackSlot(int slot) { 2257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch yield_first_feedback_slot_ = slot; 2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int KeyedLoadFeedbackSlot() { 2261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(yield_first_feedback_slot_ != kInvalidFeedbackSlot); 2262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return yield_first_feedback_slot_; 2263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int DoneFeedbackSlot() { 2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(yield_first_feedback_slot_ != kInvalidFeedbackSlot); 2267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return yield_first_feedback_slot_ + 1; 2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int ValueFeedbackSlot() { 2271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(yield_first_feedback_slot_ != kInvalidFeedbackSlot); 2272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return yield_first_feedback_slot_ + 2; 2273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Yield(Zone* zone, Expression* generator_object, Expression* expression, 2277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind yield_kind, int pos, IdGen* id_gen) 2278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), 2279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch generator_object_(generator_object), 2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expression_(expression), 2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch yield_kind_(yield_kind), 2282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch index_(-1), 2283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch yield_first_feedback_slot_(kInvalidFeedbackSlot) {} 2284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* generator_object_; 2287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* expression_; 2288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind yield_kind_; 2289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index_; 2290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int yield_first_feedback_slot_; 2291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 2292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Throw FINAL : public Expression { 2295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2296f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(Throw) 22976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* exception() const { return exception_; } 22993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 2301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Throw(Zone* zone, Expression* exception, int pos, IdGen* id_gen) 2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), exception_(exception) {} 2303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Expression* exception_; 2306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass FunctionLiteral FINAL : public Expression { 2310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum FunctionType { 23123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ANONYMOUS_EXPRESSION, 23133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch NAMED_EXPRESSION, 23143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARATION 23153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }; 23163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 23173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum ParameterFlag { 23183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kNoDuplicateParameters = 0, 23193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kHasDuplicateParameters = 1 23203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 23213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum IsFunctionFlag { 23233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kGlobalOrEval, 23243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kIsFunction 23253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 2326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum IsParenthesizedFlag { 2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsParenthesized, 2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNotParenthesized 2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 2331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum ArityRestriction { 2333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NORMAL_ARITY, 2334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GETTER_ARITY, 2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETTER_ARITY 2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 2337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2338f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(FunctionLiteral) 2339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name() const { return raw_name_->string(); } 2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* raw_name() const { return raw_name_; } 23420d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Scope* scope() const { return scope_; } 23430d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ZoneList<Statement*>* body() const { return body_; } 2344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void set_function_token_position(int pos) { function_token_position_ = pos; } 2345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int function_token_position() const { return function_token_position_; } 23463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int start_position() const; 23473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int end_position() const; 23483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int SourceSize() const { return end_position() - start_position(); } 23493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool is_expression() const { return IsExpression::decode(bitfield_); } 23503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool is_anonymous() const { return IsAnonymous::decode(bitfield_); } 2351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrictMode strict_mode() const; 2352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int materialized_literal_count() { return materialized_literal_count_; } 2354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int expected_property_count() { return expected_property_count_; } 23553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int handler_count() { return handler_count_; } 23563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int parameter_count() { return parameter_count_; } 2357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool AllowsLazyCompilation(); 2359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool AllowsLazyCompilationWithoutContext(); 2360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void InitializeSharedInfo(Handle<Code> code); 2362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2363f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch Handle<String> debug_name() const { 2364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (raw_name_ != NULL && !raw_name_->IsEmpty()) { 2365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return raw_name_->string(); 2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2367f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch return inferred_name(); 2368f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch } 2369f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 2370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> inferred_name() const { 2371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!inferred_name_.is_null()) { 2372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(raw_inferred_name_ == NULL); 2373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return inferred_name_; 2374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (raw_inferred_name_ != NULL) { 2376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return raw_inferred_name_->string(); 2377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 2379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<String>(); 2380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Only one of {set_inferred_name, set_raw_inferred_name} should be called. 2383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void set_inferred_name(Handle<String> inferred_name) { 2384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!inferred_name.is_null()); 2385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inferred_name_ = inferred_name; 2386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(raw_inferred_name_== NULL || raw_inferred_name_->IsEmpty()); 2387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch raw_inferred_name_ = NULL; 2388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_raw_inferred_name(const AstString* raw_inferred_name) { 2391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(raw_inferred_name != NULL); 2392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch raw_inferred_name_ = raw_inferred_name; 2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(inferred_name_.is_null()); 2394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inferred_name_ = Handle<String>(); 2395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // shared_info may be null if it's not cached in full code. 2398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SharedFunctionInfo> shared_info() { return shared_info_; } 2399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 24003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool pretenure() { return Pretenure::decode(bitfield_); } 24013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void set_pretenure() { bitfield_ |= Pretenure::encode(true); } 24023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool has_duplicate_parameters() { 24043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HasDuplicateParameters::decode(bitfield_); 24053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 24063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool is_function() { return IsFunction::decode(bitfield_) == kIsFunction; } 24083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This is used as a heuristic on when to eagerly compile a function 2410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // literal. We consider the following constructs as hints that the 2411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // function will be called immediately: 2412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - (function() { ... })(); 2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // - var x = function() { ... }(); 2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_parenthesized() { 2415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsParenthesized::decode(bitfield_) == kIsParenthesized; 2416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_parenthesized() { 2418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bitfield_ = IsParenthesized::update(bitfield_, kIsParenthesized); 2419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionKind kind() { return FunctionKindBits::decode(bitfield_); } 2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_arrow() { 2423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsArrowFunction(FunctionKindBits::decode(bitfield_)); 2424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_generator() { 2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsGeneratorFunction(FunctionKindBits::decode(bitfield_)); 2427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_concise_method() { 2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsConciseMethod(FunctionKindBits::decode(bitfield_)); 2430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 24323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int ast_node_count() { return ast_properties_.node_count(); } 24333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AstProperties::Flags* flags() { return ast_properties_.flags(); } 24343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void set_ast_properties(AstProperties* ast_properties) { 24353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ast_properties_ = *ast_properties; 24363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int slot_count() { 2438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ast_properties_.feedback_slots(); 2439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool dont_optimize() { return dont_optimize_reason_ != kNoReason; } 2441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutReason dont_optimize_reason() { return dont_optimize_reason_; } 2442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_dont_optimize_reason(BailoutReason reason) { 2443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dont_optimize_reason_ = reason; 2444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 24455d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 24463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 2447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionLiteral(Zone* zone, const AstRawString* name, 2448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AstValueFactory* ast_value_factory, Scope* scope, 2449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<Statement*>* body, int materialized_literal_count, 2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected_property_count, int handler_count, 2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int parameter_count, FunctionType function_type, 24523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ParameterFlag has_duplicate_parameters, 2453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsFunctionFlag is_function, 2454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsParenthesizedFlag is_parenthesized, FunctionKind kind, 2455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int position, IdGen* id_gen) 2456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, position, id_gen), 2457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch raw_name_(name), 24583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch scope_(scope), 24593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch body_(body), 2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch raw_inferred_name_(ast_value_factory->empty_string()), 2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dont_optimize_reason_(kNoReason), 24623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch materialized_literal_count_(materialized_literal_count), 24633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch expected_property_count_(expected_property_count), 24643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch handler_count_(handler_count), 24653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch parameter_count_(parameter_count), 24663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch function_token_position_(RelocInfo::kNoPosition) { 2467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bitfield_ = IsExpression::encode(function_type != DECLARATION) | 2468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsAnonymous::encode(function_type == ANONYMOUS_EXPRESSION) | 2469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Pretenure::encode(false) | 2470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HasDuplicateParameters::encode(has_duplicate_parameters) | 2471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsFunction::encode(is_function) | 2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsParenthesized::encode(is_parenthesized) | 2473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionKindBits::encode(kind); 2474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValidFunctionKind(kind)); 24753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 24765d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 2477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* raw_name_; 2479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<String> name_; 2480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SharedFunctionInfo> shared_info_; 2481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Scope* scope_; 2482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<Statement*>* body_; 2483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstString* raw_inferred_name_; 24843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<String> inferred_name_; 24853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AstProperties ast_properties_; 2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutReason dont_optimize_reason_; 24873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int materialized_literal_count_; 2489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int expected_property_count_; 24903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int handler_count_; 24913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int parameter_count_; 2492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int function_token_position_; 24933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch unsigned bitfield_; 2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IsExpression : public BitField<bool, 0, 1> {}; 2496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IsAnonymous : public BitField<bool, 1, 1> {}; 2497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class Pretenure : public BitField<bool, 2, 1> {}; 2498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class HasDuplicateParameters : public BitField<ParameterFlag, 3, 1> {}; 2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IsFunction : public BitField<IsFunctionFlag, 4, 1> {}; 2500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IsParenthesized : public BitField<IsParenthesizedFlag, 5, 1> {}; 2501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class FunctionKindBits : public BitField<FunctionKind, 6, 3> {}; 2502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ClassLiteral FINAL : public Expression { 2506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef ObjectLiteralProperty Property; 2508f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 2509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_NODE_TYPE(ClassLiteral) 2510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name() const { return raw_name_->string(); } 2512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* raw_name() const { return raw_name_; } 2513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* extends() const { return extends_; } 2514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* constructor() const { return constructor_; } 2515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<Property*>* properties() const { return properties_; } 25163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 2518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClassLiteral(Zone* zone, const AstRawString* name, Expression* extends, 2519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* constructor, ZoneList<Property*>* properties, 2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int position, IdGen* id_gen) 2521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, position, id_gen), 2522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch raw_name_(name), 2523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch extends_(extends), 2524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch constructor_(constructor), 2525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch properties_(properties) {} 2526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* raw_name_; 2529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* extends_; 2530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* constructor_; 2531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<Property*>* properties_; 2532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 2533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass NativeFunctionLiteral FINAL : public Expression { 2536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 2537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_NODE_TYPE(NativeFunctionLiteral) 25383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name() const { return name_->string(); } 2540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::Extension* extension() const { return extension_; } 2541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 2543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NativeFunctionLiteral(Zone* zone, const AstRawString* name, 2544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::Extension* extension, int pos, IdGen* id_gen) 2545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), name_(name), extension_(extension) {} 2546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* name_; 2549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::Extension* extension_; 2550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ThisFunction FINAL : public Expression { 2554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2555f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch DECLARE_NODE_TYPE(ThisFunction) 25563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 2558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ThisFunction(Zone* zone, int pos, IdGen* id_gen) 2559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen) {} 2560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 2561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SuperReference FINAL : public Expression { 2564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 2565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_NODE_TYPE(SuperReference) 2566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* this_var() const { return this_var_; } 25683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackId HomeObjectFeedbackId() { return reuse(id()); } 2570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 2572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SuperReference(Zone* zone, VariableProxy* this_var, int pos, IdGen* id_gen) 2573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Expression(zone, pos, id_gen), this_var_(this_var) { 2574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(this_var->is_this()); 2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* this_var_; 2578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 25813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECLARE_NODE_TYPE 25823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------------- 2585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Regular expressions 2586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass RegExpVisitor BASE_EMBEDDED { 2589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual ~RegExpVisitor() { } 2591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_CASE(Name) \ 2592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void* Visit##Name(RegExp##Name*, void* data) = 0; 2593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE) 2594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_CASE 2595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpTree : public ZoneObject { 2599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInfinity = kMaxInt; 2601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual ~RegExpTree() {} 2602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void* Accept(RegExpVisitor* visitor, void* data) = 0; 2603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpNode* on_success) = 0; 2605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual bool IsTextElement() { return false; } 2606f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch virtual bool IsAnchoredAtStart() { return false; } 2607f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch virtual bool IsAnchoredAtEnd() { return false; } 2608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual int min_match() = 0; 2609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual int max_match() = 0; 2610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the interval of registers used for captures within this 2611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // expression. 2612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual Interval CaptureRegisters() { return Interval::Empty(); } 2613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void AppendToText(RegExpText* text, Zone* zone); 2614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OStream& Print(OStream& os, Zone* zone); // NOLINT 2615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_ASTYPE(Name) \ 2616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExp##Name* As##Name(); \ 2617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual bool Is##Name(); 2618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FOR_EACH_REG_EXP_TREE_TYPE(MAKE_ASTYPE) 2619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_ASTYPE 2620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpDisjunction FINAL : public RegExpTree { 2624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit RegExpDisjunction(ZoneList<RegExpTree*>* alternatives); 2626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpNode* on_success) OVERRIDE; 2629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual RegExpDisjunction* AsDisjunction() OVERRIDE; 2630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Interval CaptureRegisters() OVERRIDE; 2631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDisjunction() OVERRIDE; 2632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsAnchoredAtStart() OVERRIDE; 2633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsAnchoredAtEnd() OVERRIDE; 2634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int min_match() OVERRIDE { return min_match_; } 2635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int max_match() OVERRIDE { return max_match_; } 2636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<RegExpTree*>* alternatives() { return alternatives_; } 2637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<RegExpTree*>* alternatives_; 2639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int min_match_; 2640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int max_match_; 2641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpAlternative FINAL : public RegExpTree { 2645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit RegExpAlternative(ZoneList<RegExpTree*>* nodes); 2647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpNode* on_success) OVERRIDE; 2650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual RegExpAlternative* AsAlternative() OVERRIDE; 2651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Interval CaptureRegisters() OVERRIDE; 2652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsAlternative() OVERRIDE; 2653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsAnchoredAtStart() OVERRIDE; 2654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsAnchoredAtEnd() OVERRIDE; 2655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int min_match() OVERRIDE { return min_match_; } 2656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int max_match() OVERRIDE { return max_match_; } 2657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<RegExpTree*>* nodes() { return nodes_; } 2658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<RegExpTree*>* nodes_; 2660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int min_match_; 2661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int max_match_; 2662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpAssertion FINAL : public RegExpTree { 2666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum AssertionType { 2668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block START_OF_LINE, 2669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block START_OF_INPUT, 2670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block END_OF_LINE, 2671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block END_OF_INPUT, 2672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block BOUNDARY, 2673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block NON_BOUNDARY 2674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 2675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit RegExpAssertion(AssertionType type) : assertion_type_(type) { } 2676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpNode* on_success) OVERRIDE; 2679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual RegExpAssertion* AsAssertion() OVERRIDE; 2680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsAssertion() OVERRIDE; 2681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsAnchoredAtStart() OVERRIDE; 2682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsAnchoredAtEnd() OVERRIDE; 2683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int min_match() OVERRIDE { return 0; } 2684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int max_match() OVERRIDE { return 0; } 2685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AssertionType assertion_type() { return assertion_type_; } 2686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AssertionType assertion_type_; 2688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CharacterSet FINAL BASE_EMBEDDED { 2692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit CharacterSet(uc16 standard_set_type) 2694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : ranges_(NULL), 2695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block standard_set_type_(standard_set_type) {} 2696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit CharacterSet(ZoneList<CharacterRange>* ranges) 2697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : ranges_(ranges), 2698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block standard_set_type_(0) {} 2699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<CharacterRange>* ranges(Zone* zone); 2700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uc16 standard_set_type() { return standard_set_type_; } 2701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void set_standard_set_type(uc16 special_set_type) { 2702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block standard_set_type_ = special_set_type; 2703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_standard() { return standard_set_type_ != 0; } 2705e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke void Canonicalize(); 2706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<CharacterRange>* ranges_; 2708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If non-zero, the value represents a standard set (e.g., all whitespace 2709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // characters) without having to expand the ranges. 2710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uc16 standard_set_type_; 2711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpCharacterClass FINAL : public RegExpTree { 2715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpCharacterClass(ZoneList<CharacterRange>* ranges, bool is_negated) 2717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : set_(ranges), 2718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_negated_(is_negated) { } 2719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit RegExpCharacterClass(uc16 type) 2720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : set_(type), 2721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_negated_(false) { } 2722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpNode* on_success) OVERRIDE; 2725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual RegExpCharacterClass* AsCharacterClass() OVERRIDE; 2726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsCharacterClass() OVERRIDE; 2727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsTextElement() OVERRIDE { return true; } 2728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int min_match() OVERRIDE { return 1; } 2729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int max_match() OVERRIDE { return 1; } 2730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void AppendToText(RegExpText* text, Zone* zone) OVERRIDE; 2731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CharacterSet character_set() { return set_; } 2732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // TODO(lrn): Remove need for complex version if is_standard that 2733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // recognizes a mangled standard set and just do { return set_.is_special(); } 2734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_standard(Zone* zone); 2735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns a value representing the standard character set if is_standard() 2736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // returns true. 2737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Currently used values are: 2738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // s : unicode whitespace 2739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // S : unicode non-whitespace 2740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // w : ASCII word character (digit, letter, underscore) 2741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // W : non-ASCII word character 2742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // d : ASCII digit 2743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // D : non-ASCII digit 2744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // . : non-unicode non-newline 2745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // * : All characters 2746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uc16 standard_type() { return set_.standard_set_type(); } 2747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<CharacterRange>* ranges(Zone* zone) { return set_.ranges(zone); } 2748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_negated() { return is_negated_; } 27493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CharacterSet set_; 2752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_negated_; 2753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpAtom FINAL : public RegExpTree { 2757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit RegExpAtom(Vector<const uc16> data) : data_(data) { } 2759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpNode* on_success) OVERRIDE; 2762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual RegExpAtom* AsAtom() OVERRIDE; 2763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsAtom() OVERRIDE; 2764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsTextElement() OVERRIDE { return true; } 2765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int min_match() OVERRIDE { return data_.length(); } 2766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int max_match() OVERRIDE { return data_.length(); } 2767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void AppendToText(RegExpText* text, Zone* zone) OVERRIDE; 2768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Vector<const uc16> data() { return data_; } 2769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length() { return data_.length(); } 2770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Vector<const uc16> data_; 2772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpText FINAL : public RegExpTree { 2776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit RegExpText(Zone* zone) : elements_(2, zone), length_(0) {} 2778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpNode* on_success) OVERRIDE; 2781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual RegExpText* AsText() OVERRIDE; 2782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsText() OVERRIDE; 2783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsTextElement() OVERRIDE { return true; } 2784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int min_match() OVERRIDE { return length_; } 2785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int max_match() OVERRIDE { return length_; } 2786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void AppendToText(RegExpText* text, Zone* zone) OVERRIDE; 2787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddElement(TextElement elm, Zone* zone) { 2788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements_.Add(elm, zone); 2789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block length_ += elm.length(); 27909ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick } 2791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<TextElement>* elements() { return &elements_; } 2792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ZoneList<TextElement> elements_; 2794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length_; 2795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpQuantifier FINAL : public RegExpTree { 2799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum QuantifierType { GREEDY, NON_GREEDY, POSSESSIVE }; 2801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpQuantifier(int min, int max, QuantifierType type, RegExpTree* body) 2802e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke : body_(body), 2803e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke min_(min), 2804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block max_(max), 2805e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke min_match_(min * body->min_match()), 2806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch quantifier_type_(type) { 2807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (max > 0 && body->max_match() > kInfinity / max) { 2808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block max_match_ = kInfinity; 2809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 2810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block max_match_ = max * body->max_match(); 2811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpNode* on_success) OVERRIDE; 2816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static RegExpNode* ToNode(int min, 2817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int max, 2818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_greedy, 2819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpTree* body, 2820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpCompiler* compiler, 2821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpNode* on_success, 2822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool not_at_start = false); 2823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual RegExpQuantifier* AsQuantifier() OVERRIDE; 2824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Interval CaptureRegisters() OVERRIDE; 2825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsQuantifier() OVERRIDE; 2826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int min_match() OVERRIDE { return min_match_; } 2827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int max_match() OVERRIDE { return max_match_; } 2828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int min() { return min_; } 2829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int max() { return max_; } 2830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_possessive() { return quantifier_type_ == POSSESSIVE; } 2831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_non_greedy() { return quantifier_type_ == NON_GREEDY; } 2832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_greedy() { return quantifier_type_ == GREEDY; } 2833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpTree* body() { return body_; } 28343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2836e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke RegExpTree* body_; 2837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int min_; 2838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int max_; 2839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int min_match_; 2840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int max_match_; 2841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch QuantifierType quantifier_type_; 2842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpCapture FINAL : public RegExpTree { 2846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit RegExpCapture(RegExpTree* body, int index) 2848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : body_(body), index_(index) { } 2849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpNode* on_success) OVERRIDE; 2852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static RegExpNode* ToNode(RegExpTree* body, 2853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int index, 2854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpCompiler* compiler, 2855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpNode* on_success); 2856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual RegExpCapture* AsCapture() OVERRIDE; 2857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsAnchoredAtStart() OVERRIDE; 2858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsAnchoredAtEnd() OVERRIDE; 2859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Interval CaptureRegisters() OVERRIDE; 2860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsCapture() OVERRIDE; 2861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int min_match() OVERRIDE { return body_->min_match(); } 2862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int max_match() OVERRIDE { return body_->max_match(); } 2863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpTree* body() { return body_; } 2864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int index() { return index_; } 2865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int StartRegister(int index) { return index * 2; } 2866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int EndRegister(int index) { return index * 2 + 1; } 28673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpTree* body_; 2870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int index_; 2871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpLookahead FINAL : public RegExpTree { 2875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpLookahead(RegExpTree* body, 2877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_positive, 2878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int capture_count, 2879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int capture_from) 2880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : body_(body), 2881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_positive_(is_positive), 2882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block capture_count_(capture_count), 2883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block capture_from_(capture_from) { } 2884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpNode* on_success) OVERRIDE; 2888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual RegExpLookahead* AsLookahead() OVERRIDE; 2889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Interval CaptureRegisters() OVERRIDE; 2890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsLookahead() OVERRIDE; 2891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsAnchoredAtStart() OVERRIDE; 2892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int min_match() OVERRIDE { return 0; } 2893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int max_match() OVERRIDE { return 0; } 2894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpTree* body() { return body_; } 2895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_positive() { return is_positive_; } 2896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int capture_count() { return capture_count_; } 2897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int capture_from() { return capture_from_; } 28983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpTree* body_; 2901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_positive_; 2902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int capture_count_; 2903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int capture_from_; 2904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpBackReference FINAL : public RegExpTree { 2908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit RegExpBackReference(RegExpCapture* capture) 2910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : capture_(capture) { } 2911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpNode* on_success) OVERRIDE; 2914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual RegExpBackReference* AsBackReference() OVERRIDE; 2915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsBackReference() OVERRIDE; 2916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int min_match() OVERRIDE { return 0; } 2917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int max_match() OVERRIDE { return capture_->max_match(); } 2918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int index() { return capture_->index(); } 2919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpCapture* capture() { return capture_; } 2920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpCapture* capture_; 2922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RegExpEmpty FINAL : public RegExpTree { 2926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegExpEmpty() { } 2928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpNode* on_success) OVERRIDE; 2931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual RegExpEmpty* AsEmpty() OVERRIDE; 2932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsEmpty() OVERRIDE; 2933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int min_match() OVERRIDE { return 0; } 2934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int max_match() OVERRIDE { return 0; } 29353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static RegExpEmpty* GetInstance() { 29363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static RegExpEmpty* instance = ::new RegExpEmpty(); 29373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instance; 29383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------------- 29433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Out-of-line inline constructors (to side-step cyclic dependencies). 29443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline ModuleVariable::ModuleVariable(Zone* zone, VariableProxy* proxy, int pos) 2946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Module(zone, proxy->interface(), pos), 29473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch proxy_(proxy) { 29483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 29493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 29503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 29513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ---------------------------------------------------------------------------- 2952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Basic visitor 2953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - leaf node visitors are abstract. 2954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass AstVisitor BASE_EMBEDDED { 2956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AstVisitor() {} 2958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual ~AstVisitor() {} 2959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 29606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Stack overflow check and dynamic dispatch. 2961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void Visit(AstNode* node) = 0; 2962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 29636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Iteration left-to-right. 29643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block virtual void VisitDeclarations(ZoneList<Declaration*>* declarations); 2965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void VisitStatements(ZoneList<Statement*>* statements); 2966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void VisitExpressions(ZoneList<Expression*>* expressions); 2967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Individual AST nodes. 2969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define DEF_VISIT(type) \ 2970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void Visit##type(type* node) = 0; 2971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block AST_NODE_LIST(DEF_VISIT) 2972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef DEF_VISIT 2973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 2974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 297544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DEFINE_AST_VISITOR_SUBCLASS_MEMBERS() \ 2977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochpublic: \ 2978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void Visit(AstNode* node) FINAL OVERRIDE { \ 2979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!CheckStackOverflow()) node->Accept(this); \ 2980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 2981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 2982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetStackOverflow() { stack_overflow_ = true; } \ 2983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ClearStackOverflow() { stack_overflow_ = false; } \ 2984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasStackOverflow() const { return stack_overflow_; } \ 2985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 2986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CheckStackOverflow() { \ 2987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (stack_overflow_) return true; \ 2988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StackLimitCheck check(zone_->isolate()); \ 2989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!check.HasOverflowed()) return false; \ 2990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (stack_overflow_ = true); \ 2991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 2992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 2993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochprivate: \ 2994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void InitializeAstVisitor(Zone* zone) { \ 2995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone_ = zone; \ 2996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack_overflow_ = false; \ 2997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 2998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone* zone() { return zone_; } \ 2999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate() { return zone_->isolate(); } \ 3000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 3001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone* zone_; \ 3002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool stack_overflow_ 3003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 300444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 30053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ---------------------------------------------------------------------------- 30063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Construction time visitor. 30073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass AstConstructionVisitor BASE_EMBEDDED { 30093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 3010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AstConstructionVisitor() 3011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : dont_crankshaft_reason_(kNoReason), dont_turbofan_reason_(kNoReason) {} 30123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AstProperties* ast_properties() { return &properties_; } 3014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutReason dont_optimize_reason() { 3015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (dont_turbofan_reason_ != kNoReason) { 3016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return dont_turbofan_reason_; 3017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 3018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return dont_crankshaft_reason_; 3019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 30213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 30233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch template<class> friend class AstNodeFactory; 30243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Node visitors. 30263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DEF_VISIT(type) \ 30273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void Visit##type(type* node); 30283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AST_NODE_LIST(DEF_VISIT) 30293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DEF_VISIT 30303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void increase_node_count() { properties_.add_node_count(1); } 30323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void add_flag(AstPropertiesFlag flag) { properties_.flags()->Add(flag); } 3033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_dont_crankshaft_reason(BailoutReason reason) { 3034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dont_crankshaft_reason_ = reason; 3035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_dont_turbofan_reason(BailoutReason reason) { 3037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dont_turbofan_reason_ = reason; 3038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void add_slot_node(FeedbackSlotInterface* slot_node) { 3041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int count = slot_node->ComputeFeedbackSlotCount(); 3042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (count > 0) { 3043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slot_node->SetFirstFeedbackSlot(properties_.feedback_slots()); 3044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch properties_.increase_feedback_slots(count); 3045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 30473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AstProperties properties_; 3049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutReason dont_crankshaft_reason_; 3050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutReason dont_turbofan_reason_; 30513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 30523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass AstNullVisitor BASE_EMBEDDED { 30553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 30563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Node visitors. 30573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DEF_VISIT(type) \ 30583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void Visit##type(type* node) {} 30593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AST_NODE_LIST(DEF_VISIT) 30603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DEF_VISIT 30613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 30623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ---------------------------------------------------------------------------- 30663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// AstNode factory 30673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<class Visitor> 3069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AstNodeFactory FINAL BASE_EMBEDDED { 30703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 3071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AstNodeFactory(Zone* zone, AstValueFactory* ast_value_factory, 3072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AstNode::IdGen* id_gen) 3073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : zone_(zone), ast_value_factory_(ast_value_factory), id_gen_(id_gen) {} 30743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Visitor* visitor() { return &visitor_; } 30763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define VISIT_AND_RETURN(NodeType, node) \ 30783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch visitor_.Visit##NodeType((node)); \ 30793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return node; 30803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableDeclaration* NewVariableDeclaration(VariableProxy* proxy, 30823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableMode mode, 3083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope, 3084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 30853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableDeclaration* decl = 3086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone_) VariableDeclaration(zone_, proxy, mode, scope, pos); 30873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(VariableDeclaration, decl) 30883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 30893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FunctionDeclaration* NewFunctionDeclaration(VariableProxy* proxy, 30913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableMode mode, 30923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FunctionLiteral* fun, 3093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope, 3094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 30953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FunctionDeclaration* decl = 3096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone_) FunctionDeclaration(zone_, proxy, mode, fun, scope, pos); 30973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(FunctionDeclaration, decl) 30983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 30993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 31003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ModuleDeclaration* NewModuleDeclaration(VariableProxy* proxy, 31013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Module* module, 3102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope, 3103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 31043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ModuleDeclaration* decl = 3105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone_) ModuleDeclaration(zone_, proxy, module, scope, pos); 31063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ModuleDeclaration, decl) 31073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 31083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 31093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ImportDeclaration* NewImportDeclaration(VariableProxy* proxy, 31103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Module* module, 3111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope, 3112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 31133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ImportDeclaration* decl = 3114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone_) ImportDeclaration(zone_, proxy, module, scope, pos); 31153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ImportDeclaration, decl) 31163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 31173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 31183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ExportDeclaration* NewExportDeclaration(VariableProxy* proxy, 3119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope, 3120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 31213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ExportDeclaration* decl = 3122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone_) ExportDeclaration(zone_, proxy, scope, pos); 31233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ExportDeclaration, decl) 31243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 31253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModuleLiteral* NewModuleLiteral(Block* body, Interface* interface, int pos) { 3127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModuleLiteral* module = 3128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone_) ModuleLiteral(zone_, body, interface, pos); 31293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ModuleLiteral, module) 31303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 31313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModuleVariable* NewModuleVariable(VariableProxy* proxy, int pos) { 3133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModuleVariable* module = new(zone_) ModuleVariable(zone_, proxy, pos); 31343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ModuleVariable, module) 31353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 31363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModulePath* NewModulePath(Module* origin, const AstRawString* name, int pos) { 3138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModulePath* module = new (zone_) ModulePath(zone_, origin, name, pos); 31393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ModulePath, module) 31403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 31413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModuleUrl* NewModuleUrl(Handle<String> url, int pos) { 3143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModuleUrl* module = new(zone_) ModuleUrl(zone_, url, pos); 31443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ModuleUrl, module) 31453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 31463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Block* NewBlock(ZoneList<const AstRawString*>* labels, 31483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int capacity, 3149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_initializer_block, 3150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 3151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Block* block = new (zone_) 3152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Block(zone_, labels, capacity, is_initializer_block, pos, id_gen_); 31533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(Block, block) 31543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 31553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define STATEMENT_WITH_LABELS(NodeType) \ 3157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NodeType* New##NodeType(ZoneList<const AstRawString*>* labels, int pos) { \ 3158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NodeType* stmt = new (zone_) NodeType(zone_, labels, pos, id_gen_); \ 3159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(NodeType, stmt); \ 31603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 31613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch STATEMENT_WITH_LABELS(DoWhileStatement) 31623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch STATEMENT_WITH_LABELS(WhileStatement) 31633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch STATEMENT_WITH_LABELS(ForStatement) 31643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch STATEMENT_WITH_LABELS(SwitchStatement) 31653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef STATEMENT_WITH_LABELS 31663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ForEachStatement* NewForEachStatement(ForEachStatement::VisitMode visit_mode, 3168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<const AstRawString*>* labels, 3169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 3170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (visit_mode) { 3171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case ForEachStatement::ENUMERATE: { 3172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ForInStatement* stmt = 3173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) ForInStatement(zone_, labels, pos, id_gen_); 3174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(ForInStatement, stmt); 3175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case ForEachStatement::ITERATE: { 3177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ForOfStatement* stmt = 3178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) ForOfStatement(zone_, labels, pos, id_gen_); 3179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(ForOfStatement, stmt); 3180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 3183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 3184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModuleStatement* NewModuleStatement( 3187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* proxy, Block* body, int pos) { 3188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ModuleStatement* stmt = new(zone_) ModuleStatement(zone_, proxy, body, pos); 3189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(ModuleStatement, stmt) 3190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExpressionStatement* NewExpressionStatement(Expression* expression, int pos) { 3193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExpressionStatement* stmt = 3194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone_) ExpressionStatement(zone_, expression, pos); 31953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ExpressionStatement, stmt) 31963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 31973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ContinueStatement* NewContinueStatement(IterationStatement* target, int pos) { 3199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ContinueStatement* stmt = new(zone_) ContinueStatement(zone_, target, pos); 32003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ContinueStatement, stmt) 32013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 32023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BreakStatement* NewBreakStatement(BreakableStatement* target, int pos) { 3204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BreakStatement* stmt = new(zone_) BreakStatement(zone_, target, pos); 32053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(BreakStatement, stmt) 32063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 32073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ReturnStatement* NewReturnStatement(Expression* expression, int pos) { 3209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ReturnStatement* stmt = new(zone_) ReturnStatement(zone_, expression, pos); 32103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ReturnStatement, stmt) 32113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 32123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WithStatement* NewWithStatement(Scope* scope, 3214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* expression, 3215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Statement* statement, 3216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 3217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WithStatement* stmt = new(zone_) WithStatement( 3218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone_, scope, expression, statement, pos); 32193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(WithStatement, stmt) 32203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 32213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 32223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch IfStatement* NewIfStatement(Expression* condition, 32233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Statement* then_statement, 3224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Statement* else_statement, 3225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 3226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IfStatement* stmt = new (zone_) IfStatement( 3227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone_, condition, then_statement, else_statement, pos, id_gen_); 32283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(IfStatement, stmt) 32293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 32303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 32313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TryCatchStatement* NewTryCatchStatement(int index, 32323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Block* try_block, 32333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Scope* scope, 32343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Variable* variable, 3235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Block* catch_block, 3236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 32373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TryCatchStatement* stmt = new(zone_) TryCatchStatement( 3238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone_, index, try_block, scope, variable, catch_block, pos); 32393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(TryCatchStatement, stmt) 32403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 32413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 32423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TryFinallyStatement* NewTryFinallyStatement(int index, 32433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Block* try_block, 3244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Block* finally_block, 3245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 3246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TryFinallyStatement* stmt = new(zone_) TryFinallyStatement( 3247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone_, index, try_block, finally_block, pos); 32483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(TryFinallyStatement, stmt) 32493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 32503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DebuggerStatement* NewDebuggerStatement(int pos) { 3252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DebuggerStatement* stmt = 3253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) DebuggerStatement(zone_, pos, id_gen_); 32543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(DebuggerStatement, stmt) 32553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 32563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EmptyStatement* NewEmptyStatement(int pos) { 3258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone_) EmptyStatement(zone_, pos); 3259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CaseClause* NewCaseClause( 3262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* label, ZoneList<Statement*>* statements, int pos) { 3263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CaseClause* clause = 3264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) CaseClause(zone_, label, statements, pos, id_gen_); 3265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(CaseClause, clause) 3266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* NewStringLiteral(const AstRawString* string, int pos) { 3269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* lit = new (zone_) 3270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal(zone_, ast_value_factory_->NewString(string), pos, id_gen_); 3271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(Literal, lit) 3272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A JavaScript symbol (ECMA-262 edition 6). 3275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* NewSymbolLiteral(const char* name, int pos) { 3276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* lit = new (zone_) 3277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal(zone_, ast_value_factory_->NewSymbol(name), pos, id_gen_); 3278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(Literal, lit) 3279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* NewNumberLiteral(double number, int pos) { 3282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* lit = new (zone_) 3283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal(zone_, ast_value_factory_->NewNumber(number), pos, id_gen_); 3284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(Literal, lit) 3285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* NewSmiLiteral(int number, int pos) { 3288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* lit = new (zone_) 3289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal(zone_, ast_value_factory_->NewSmi(number), pos, id_gen_); 3290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(Literal, lit) 3291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* NewBooleanLiteral(bool b, int pos) { 3294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* lit = new (zone_) 3295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal(zone_, ast_value_factory_->NewBoolean(b), pos, id_gen_); 3296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(Literal, lit) 3297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* NewStringListLiteral(ZoneList<const AstRawString*>* strings, 3300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 3301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* lit = new (zone_) Literal( 3302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone_, ast_value_factory_->NewStringList(strings), pos, id_gen_); 3303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(Literal, lit) 3304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* NewNullLiteral(int pos) { 3307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* lit = 3308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) Literal(zone_, ast_value_factory_->NewNull(), pos, id_gen_); 3309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(Literal, lit) 33103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 33113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* NewUndefinedLiteral(int pos) { 3313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* lit = new (zone_) 3314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal(zone_, ast_value_factory_->NewUndefined(), pos, id_gen_); 33153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(Literal, lit) 33163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 33173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* NewTheHoleLiteral(int pos) { 3319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal* lit = new (zone_) 3320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Literal(zone_, ast_value_factory_->NewTheHole(), pos, id_gen_); 3321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(Literal, lit) 33223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 33233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 33243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ObjectLiteral* NewObjectLiteral( 33253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ZoneList<ObjectLiteral::Property*>* properties, 33263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int literal_index, 3327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int boilerplate_properties, 3328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_function, 3329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 3330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ObjectLiteral* lit = new (zone_) 3331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ObjectLiteral(zone_, properties, literal_index, boilerplate_properties, 3332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_function, pos, id_gen_); 33333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ObjectLiteral, lit) 33343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 33353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ObjectLiteral::Property* NewObjectLiteralProperty(Literal* key, 3337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* value, 3338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_static) { 3339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new (zone_) ObjectLiteral::Property(zone_, ast_value_factory_, key, 3340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value, is_static); 3341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 33433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ObjectLiteral::Property* NewObjectLiteralProperty(bool is_getter, 3344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionLiteral* value, 3345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos, bool is_static) { 33463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ObjectLiteral::Property* prop = 3347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) ObjectLiteral::Property(zone_, is_getter, value, is_static); 3348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch prop->set_key(NewStringLiteral(value->raw_name(), pos)); 33493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return prop; // Not an AST node, will not be visited. 33503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 33513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpLiteral* NewRegExpLiteral(const AstRawString* pattern, 3353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* flags, 3354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int literal_index, 3355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 3356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpLiteral* lit = new (zone_) 3357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RegExpLiteral(zone_, pattern, flags, literal_index, pos, id_gen_); 33583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(RegExpLiteral, lit); 33593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 33603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ArrayLiteral* NewArrayLiteral(ZoneList<Expression*>* values, 33623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int literal_index, 3363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 3364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ArrayLiteral* lit = 3365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) ArrayLiteral(zone_, values, literal_index, pos, id_gen_); 33663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ArrayLiteral, lit) 33673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 33683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* NewVariableProxy(Variable* var, 3370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos = RelocInfo::kNoPosition) { 3371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* proxy = new (zone_) VariableProxy(zone_, var, pos, id_gen_); 33723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(VariableProxy, proxy) 33733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 33743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* NewVariableProxy(const AstRawString* name, 33763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool is_this, 3377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Interface* interface = Interface::NewValue(), 3378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int position = RelocInfo::kNoPosition) { 3379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy* proxy = new (zone_) 3380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableProxy(zone_, name, is_this, interface, position, id_gen_); 33813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(VariableProxy, proxy) 33823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 33833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 33843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Property* NewProperty(Expression* obj, Expression* key, int pos) { 3385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Property* prop = new (zone_) Property(zone_, obj, key, pos, id_gen_); 33863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(Property, prop) 33873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 33883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 33893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Call* NewCall(Expression* expression, 33903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ZoneList<Expression*>* arguments, 33913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int pos) { 3392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Call* call = new (zone_) Call(zone_, expression, arguments, pos, id_gen_); 33933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(Call, call) 33943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 33953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 33963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CallNew* NewCallNew(Expression* expression, 33973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ZoneList<Expression*>* arguments, 33983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int pos) { 3399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallNew* call = 3400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) CallNew(zone_, expression, arguments, pos, id_gen_); 34013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(CallNew, call) 34023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 34033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallRuntime* NewCallRuntime(const AstRawString* name, 34053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const Runtime::Function* function, 3406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<Expression*>* arguments, 3407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 34083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CallRuntime* call = 3409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) CallRuntime(zone_, name, function, arguments, pos, id_gen_); 34103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(CallRuntime, call) 34113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 34123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UnaryOperation* NewUnaryOperation(Token::Value op, 34143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* expression, 34153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int pos) { 34163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UnaryOperation* node = 3417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) UnaryOperation(zone_, op, expression, pos, id_gen_); 34183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(UnaryOperation, node) 34193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 34203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch BinaryOperation* NewBinaryOperation(Token::Value op, 34223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* left, 34233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* right, 34243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int pos) { 34253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch BinaryOperation* node = 3426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) BinaryOperation(zone_, op, left, right, pos, id_gen_); 34273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(BinaryOperation, node) 34283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 34293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CountOperation* NewCountOperation(Token::Value op, 34313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool is_prefix, 34323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* expr, 34333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int pos) { 34343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CountOperation* node = 3435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) CountOperation(zone_, op, is_prefix, expr, pos, id_gen_); 34363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(CountOperation, node) 34373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 34383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CompareOperation* NewCompareOperation(Token::Value op, 34403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* left, 34413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* right, 34423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int pos) { 34433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CompareOperation* node = 3444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) CompareOperation(zone_, op, left, right, pos, id_gen_); 34453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(CompareOperation, node) 34463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 34473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Conditional* NewConditional(Expression* condition, 34493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* then_expression, 34503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* else_expression, 3451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int position) { 3452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Conditional* cond = new (zone_) Conditional( 3453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone_, condition, then_expression, else_expression, position, id_gen_); 34543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(Conditional, cond) 34553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 34563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Assignment* NewAssignment(Token::Value op, 34583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* target, 34593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Expression* value, 34603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int pos) { 34613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Assignment* assign = 3462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) Assignment(zone_, op, target, value, pos, id_gen_); 3463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assign->Init(zone_, this); 34643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(Assignment, assign) 34653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 34663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Yield* NewYield(Expression *generator_object, 3468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* expression, 3469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Yield::Kind yield_kind, 3470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 3471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!expression) expression = NewUndefinedLiteral(pos); 3472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Yield* yield = new (zone_) 3473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Yield(zone_, generator_object, expression, yield_kind, pos, id_gen_); 3474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(Yield, yield) 3475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 34773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Throw* NewThrow(Expression* exception, int pos) { 3478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Throw* t = new (zone_) Throw(zone_, exception, pos, id_gen_); 34793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(Throw, t) 34803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 34813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FunctionLiteral* NewFunctionLiteral( 3483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const AstRawString* name, AstValueFactory* ast_value_factory, 3484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Scope* scope, ZoneList<Statement*>* body, int materialized_literal_count, 3485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int expected_property_count, int handler_count, int parameter_count, 34863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FunctionLiteral::ParameterFlag has_duplicate_parameters, 3487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionLiteral::FunctionType function_type, 3488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionLiteral::IsFunctionFlag is_function, 3489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionLiteral::IsParenthesizedFlag is_parenthesized, FunctionKind kind, 3490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int position) { 3491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionLiteral* lit = new (zone_) FunctionLiteral( 3492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone_, name, ast_value_factory, scope, body, materialized_literal_count, 3493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected_property_count, handler_count, parameter_count, function_type, 3494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_duplicate_parameters, is_function, is_parenthesized, kind, position, 3495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch id_gen_); 34963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Top-level literal doesn't count for the AST's properties. 34973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (is_function == FunctionLiteral::kIsFunction) { 34983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch visitor_.VisitFunctionLiteral(lit); 34993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 35003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return lit; 35013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 35023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClassLiteral* NewClassLiteral(const AstRawString* name, Expression* extends, 3504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Expression* constructor, 3505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<ObjectLiteral::Property*>* properties, 3506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int position) { 3507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClassLiteral* lit = new (zone_) ClassLiteral( 3508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone_, name, extends, constructor, properties, position, id_gen_); 3509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(ClassLiteral, lit) 3510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NativeFunctionLiteral* NewNativeFunctionLiteral(const AstRawString* name, 3513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::Extension* extension, 3514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos) { 3515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NativeFunctionLiteral* lit = 3516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) NativeFunctionLiteral(zone_, name, extension, pos, id_gen_); 3517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(NativeFunctionLiteral, lit) 35183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 35193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ThisFunction* NewThisFunction(int pos) { 3521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ThisFunction* fun = new (zone_) ThisFunction(zone_, pos, id_gen_); 35223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISIT_AND_RETURN(ThisFunction, fun) 35233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 35243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SuperReference* NewSuperReference(VariableProxy* this_var, int pos) { 3526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SuperReference* super = 3527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new (zone_) SuperReference(zone_, this_var, pos, id_gen_); 3528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VISIT_AND_RETURN(SuperReference, super); 3529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 35313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef VISIT_AND_RETURN 35323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 35333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 35343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Zone* zone_; 35353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Visitor visitor_; 3536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AstValueFactory* ast_value_factory_; 3537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AstNode::IdGen* id_gen_; 35383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 35393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 35403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 3542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_AST_H_ 3544