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