1659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_AST_H_
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_AST_H_
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/assembler.h"
1108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#include "src/ast-value-factory.h"
12b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org#include "src/bailout-reason.h"
13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/factory.h"
14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/feedback-slots.h"
154b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/interface.h"
16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/isolate.h"
17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/jsregexp.h"
18196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/list-inl.h"
19196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/runtime.h"
20196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/small-pointer-list.h"
21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/smart-pointers.h"
22196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/token.h"
23196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/types.h"
24196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils.h"
25196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/variables.h"
26196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/zone-inl.h"
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
2971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The abstract syntax tree is an intermediate, light-weight
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// representation of the parsed JavaScript code suitable for
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// compilation to native code.
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Nodes are allocated in a separate zone, which allows faster
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// allocation and constant-time deallocation of the entire syntax
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// tree.
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Nodes of the abstract syntax tree. Only concrete classes are
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// enumerated here.
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#define DECLARATION_NODE_LIST(V) \
45a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(VariableDeclaration)         \
46a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(FunctionDeclaration)         \
47a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(ModuleDeclaration)           \
48a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(ImportDeclaration)           \
49a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(ExportDeclaration)
5078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
5178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org#define MODULE_NODE_LIST(V)                     \
5278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  V(ModuleLiteral)                              \
5378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  V(ModuleVariable)                             \
5478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  V(ModulePath)                                 \
5578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  V(ModuleUrl)
5678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
570b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org#define STATEMENT_NODE_LIST(V)                  \
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  V(Block)                                      \
598e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  V(ModuleStatement)                            \
6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  V(ExpressionStatement)                        \
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  V(EmptyStatement)                             \
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  V(IfStatement)                                \
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  V(ContinueStatement)                          \
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  V(BreakStatement)                             \
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  V(ReturnStatement)                            \
664acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  V(WithStatement)                              \
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  V(SwitchStatement)                            \
689d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  V(DoWhileStatement)                           \
699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  V(WhileStatement)                             \
709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  V(ForStatement)                               \
7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  V(ForInStatement)                             \
721fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  V(ForOfStatement)                             \
739d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  V(TryCatchStatement)                          \
749d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  V(TryFinallyStatement)                        \
750b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  V(DebuggerStatement)
760b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
77a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#define EXPRESSION_NODE_LIST(V) \
78a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(FunctionLiteral)            \
79a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(ClassLiteral)               \
80a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(NativeFunctionLiteral)      \
81a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(Conditional)                \
82a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(VariableProxy)              \
83a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(Literal)                    \
84a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(RegExpLiteral)              \
85a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(ObjectLiteral)              \
86a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(ArrayLiteral)               \
87a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(Assignment)                 \
88a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(Yield)                      \
89a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(Throw)                      \
90a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(Property)                   \
91a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(Call)                       \
92a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(CallNew)                    \
93a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(CallRuntime)                \
94a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(UnaryOperation)             \
95a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(CountOperation)             \
96a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(BinaryOperation)            \
97a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(CompareOperation)           \
98a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(ThisFunction)               \
99a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(SuperReference)             \
100a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  V(CaseClause)
101a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
1020b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org#define AST_NODE_LIST(V)                        \
10378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  DECLARATION_NODE_LIST(V)                      \
10478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  MODULE_NODE_LIST(V)                           \
1050b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  STATEMENT_NODE_LIST(V)                        \
1064f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  EXPRESSION_NODE_LIST(V)
10743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1087be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// Forward declarations
109b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgclass AstConstructionVisitor;
110b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgtemplate<class> class AstNodeFactory;
111659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass AstVisitor;
11278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgclass Declaration;
11378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgclass Module;
114659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass BreakableStatement;
115659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass Expression;
116659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass IterationStatement;
117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass MaterializedLiteral;
1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass OStream;
119659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass Statement;
120a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass TargetCollector;
121a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass TypeFeedbackOracle;
1227be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
123659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpAlternative;
124659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpAssertion;
125659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpAtom;
126659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpBackReference;
127659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpCapture;
128659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpCharacterClass;
129659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpCompiler;
130659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpDisjunction;
131659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpEmpty;
132659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpLookahead;
133659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpQuantifier;
134659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpText;
135659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define DEF_FORWARD_DECLARATION(type) class type;
1370b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgAST_NODE_LIST(DEF_FORWARD_DECLARATION)
13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef DEF_FORWARD_DECLARATION
13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Typedef only introduced to avoid unreadable code.
14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Please do appreciate the required space in "> >".
14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef ZoneList<Handle<String> > ZoneStringList;
144911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgtypedef ZoneList<Handle<Object> > ZoneObjectList;
14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org#define DECLARE_NODE_TYPE(type)                                 \
148ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void Accept(AstVisitor* v) OVERRIDE;                  \
149ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual AstNode::NodeType node_type() const FINAL OVERRIDE {  \
15032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return AstNode::k##type;                                    \
15132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }                                                             \
152355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  template<class> friend class AstNodeFactory;
153b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
154b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
155b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgenum AstPropertiesFlag {
156b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  kDontSelfOptimize,
15781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  kDontSoftInline,
15881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  kDontCache
159b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org};
160b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
161b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
162ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass AstProperties FINAL BASE_EMBEDDED {
163b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org public:
164b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  class Flags : public EnumSet<AstPropertiesFlag, int> {};
165b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
166a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgAstProperties() : node_count_(0), feedback_slots_(0) {}
167b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
168b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Flags* flags() { return &flags_; }
169b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  int node_count() { return node_count_; }
170b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  void add_node_count(int count) { node_count_ += count; }
171b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
172a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  int feedback_slots() const { return feedback_slots_; }
173a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  void increase_feedback_slots(int count) {
174a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    feedback_slots_ += count;
175a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  }
176a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
177b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org private:
178b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Flags flags_;
179b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  int node_count_;
180a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  int feedback_slots_;
181b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org};
182b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
183b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1840b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgclass AstNode: public ZoneObject {
18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
186a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  // For generating IDs for AstNodes.
187a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  class IdGen {
188a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org   public:
189a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    explicit IdGen(int id = 0) : id_(id) {}
190a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
191a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    int GetNextId() { return ReserveIdRange(1); }
192a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    int ReserveIdRange(int n) {
193a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      int tmp = id_;
194a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      id_ += n;
195a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      return tmp;
196a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    }
197a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
198a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org   private:
199a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    int id_;
200a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  };
201a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
202f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org#define DECLARE_TYPE_ENUM(type) k##type,
203dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  enum NodeType {
204f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org    AST_NODE_LIST(DECLARE_TYPE_ENUM)
205f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org    kInvalid = -1
206f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  };
207f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org#undef DECLARE_TYPE_ENUM
208f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org
20984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  void* operator new(size_t size, Zone* zone) {
21084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org    return zone->New(static_cast<int>(size));
211ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
212a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
213a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  explicit AstNode(int position): position_(position) {}
21432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  virtual ~AstNode() {}
215f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org
216a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual void Accept(AstVisitor* v) = 0;
217dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  virtual NodeType node_type() const = 0;
218a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  int position() const { return position_; }
219f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org
220f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  // Type testing & conversion functions overridden by concrete subclasses.
2214edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org#define DECLARE_NODE_FUNCTIONS(type) \
2224edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  bool Is##type() const { return node_type() == AstNode::k##type; } \
2234edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  type* As##type() { \
2244edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    return Is##type() ? reinterpret_cast<type*>(this) : NULL; \
2254edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  } \
2264edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  const type* As##type() const { \
2274edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    return Is##type() ? reinterpret_cast<const type*>(this) : NULL; \
2284edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  }
229f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
230f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org#undef DECLARE_NODE_FUNCTIONS
23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2327be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  virtual TargetCollector* AsTargetCollector() { return NULL; }
23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual BreakableStatement* AsBreakableStatement() { return NULL; }
23443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual IterationStatement* AsIterationStatement() { return NULL; }
235bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; }
236a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
237a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org protected:
238471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Some nodes re-use bailout IDs for type feedback.
239471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  static TypeFeedbackId reuse(BailoutId id) {
240471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    return TypeFeedbackId(id.ToInt());
241471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
242471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
243471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
24484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org private:
24584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  // Hidden to prevent accidental usage. It would have to load the
24684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  // current zone from the TLS.
24784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  void* operator new(size_t size);
24884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
2494d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  friend class CaseClause;  // Generates AST IDs.
250a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
251a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  int position_;
25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass Statement : public AstNode {
25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
2576d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  explicit Statement(Zone* zone, int position) : AstNode(position) {}
258c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool IsEmpty() { return AsEmptyStatement() != NULL; }
260594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  virtual bool IsJump() const { return false; }
26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
264ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass SmallMapList FINAL {
265ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org public:
266ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  SmallMapList() {}
2677028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {}
268ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
2697028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  void Reserve(int capacity, Zone* zone) { list_.Reserve(capacity, zone); }
270ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  void Clear() { list_.Clear(); }
2711456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  void Sort() { list_.Sort(); }
272ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
273ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  bool is_empty() const { return list_.is_empty(); }
274ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  int length() const { return list_.length(); }
275ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
27657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  void AddMapIfMissing(Handle<Map> map, Zone* zone) {
2779d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    if (!Map::TryUpdate(map).ToHandle(&map)) return;
27857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    for (int i = 0; i < length(); ++i) {
27957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      if (at(i).is_identical_to(map)) return;
28057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    }
28157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    Add(map, zone);
28257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
28357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
284639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  void FilterForPossibleTransitions(Map* root_map) {
285639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    for (int i = list_.length() - 1; i >= 0; i--) {
286639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      if (at(i)->FindRootMap() != root_map) {
287639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org        list_.RemoveElement(list_.at(i));
288639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      }
289639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    }
290639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
291639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
2927028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  void Add(Handle<Map> handle, Zone* zone) {
2937028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    list_.Add(handle.location(), zone);
294ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  }
295ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
296ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  Handle<Map> at(int i) const {
297ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org    return Handle<Map>(list_.at(i));
298ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  }
299ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
300ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  Handle<Map> first() const { return at(0); }
301ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  Handle<Map> last() const { return at(length() - 1); }
302ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
303ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org private:
304ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  // The list stores pointers to Map*, that is Map**, so it's GC safe.
305ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  SmallPointerList<Map*> list_;
306ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
307ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  DISALLOW_COPY_AND_ASSIGN(SmallMapList);
308ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org};
309ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
310ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
31132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass Expression : public AstNode {
31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
313a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  enum Context {
314a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Not assigned a context yet, or else will not be visited during
315a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // code generation.
316a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    kUninitialized,
317a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Evaluated for its side effects.
318a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    kEffect,
319a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Evaluated for its value (and side effects).
320a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    kValue,
321a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Evaluated for control flow (and side effects).
322a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    kTest
323a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  };
324a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3254edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  virtual bool IsValidReferenceExpression() const { return false; }
32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
327a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Helpers for ToBoolean conversion.
3284edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  virtual bool ToBooleanIsTrue() const { return false; }
3294edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  virtual bool ToBooleanIsFalse() const { return false; }
330a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3310c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  // Symbols that cannot be parsed as array indices are considered property
3320c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  // names.  We do not treat symbols that can be array indexes as property
3330c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  // names because [] for string objects is handled only by keyed ICs.
3344edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  virtual bool IsPropertyName() const { return false; }
3350c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
33665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  // True iff the result can be safely overwritten (to avoid allocation).
33765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  // False for operations that can return one of their operands.
3384edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  virtual bool ResultOverwriteAllowed() const { return false; }
33965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
340d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  // True iff the expression is a literal represented as a smi.
3414edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  bool IsSmiLiteral() const;
342d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org
343c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // True iff the expression is a string literal.
3444edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  bool IsStringLiteral() const;
345c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
346c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // True iff the expression is the null literal.
3474edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  bool IsNullLiteral() const;
348c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
34996a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org  // True if we can prove that the expression is the undefined literal.
3504edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  bool IsUndefinedLiteral(Isolate* isolate) const;
351ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
3521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // Expression type bounds
3534edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  Bounds bounds() const { return bounds_; }
354169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  void set_bounds(Bounds bounds) { bounds_ = bounds; }
355dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
3569bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  // Whether the expression is parenthesized
3579bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  unsigned parenthesization_level() const { return parenthesization_level_; }
3589bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  bool is_parenthesized() const { return parenthesization_level_ > 0; }
3599bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  void increase_parenthesization_level() { ++parenthesization_level_; }
3609bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
361a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Type feedback information for assignments and properties.
362a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  virtual bool IsMonomorphic() {
363a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    UNREACHABLE();
364a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return false;
365a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
366ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  virtual SmallMapList* GetReceiverTypes() {
367a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    UNREACHABLE();
368a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return NULL;
369a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
3707bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org  virtual KeyedAccessStoreMode GetStoreMode() {
3717bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org    UNREACHABLE();
3727bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org    return STANDARD_STORE;
3737bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org  }
374a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
375c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  // TODO(rossberg): this should move to its own AST node eventually.
3761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle);
377c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  byte to_boolean_types() const { return to_boolean_types_; }
378c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
379471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId id() const { return id_; }
380471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  TypeFeedbackId test_id() const { return test_id_; }
381d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
38278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected:
383a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Expression(Zone* zone, int pos, IdGen* id_gen)
384a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      : AstNode(pos),
3856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        bounds_(Bounds::Unbounded(zone)),
3869bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org        parenthesization_level_(0),
387a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        id_(id_gen->GetNextId()),
388a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        test_id_(id_gen->GetNextId()) {}
3891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  void set_to_boolean_types(byte types) { to_boolean_types_ = types; }
39078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
3919bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org private:
392169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  Bounds bounds_;
393c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  byte to_boolean_types_;
3949bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  unsigned parenthesization_level_;
395c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
396471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId id_;
397471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const TypeFeedbackId test_id_;
39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass BreakableStatement : public Statement {
40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
403dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  enum BreakableType {
40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    TARGET_FOR_ANONYMOUS,
40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    TARGET_FOR_NAMED_ONLY
40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // The labels associated with this statement. May be NULL;
40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // if it is != NULL, guaranteed to contain at least one entry.
41008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  ZoneList<const AstRawString*>* labels() const { return labels_; }
41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Type testing & conversion.
413ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual BreakableStatement* AsBreakableStatement() FINAL OVERRIDE {
41432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return this;
41532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
41643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Code generation
41844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  Label* break_target() { return &break_target_; }
41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Testers.
421dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  bool is_target_for_anonymous() const {
422dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org    return breakable_type_ == TARGET_FOR_ANONYMOUS;
423dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  }
42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
425471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId EntryId() const { return entry_id_; }
426471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId ExitId() const { return exit_id_; }
427a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen protected:
429a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels,
430a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                     BreakableType breakable_type, int position, IdGen* id_gen)
4316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : Statement(zone, position),
432a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org        labels_(labels),
433dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org        breakable_type_(breakable_type),
434a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        entry_id_(id_gen->GetNextId()),
435a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        exit_id_(id_gen->GetNextId()) {
436e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(labels == NULL || labels->length() > 0);
437c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  }
438c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
44108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  ZoneList<const AstRawString*>* labels_;
442dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  BreakableType breakable_type_;
44344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  Label break_target_;
444471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId entry_id_;
445471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId exit_id_;
44643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
449ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Block FINAL : public BreakableStatement {
45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
451f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(Block)
4525d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
453400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  void AddStatement(Statement* statement, Zone* zone) {
454400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org    statements_.Add(statement, zone);
455400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  }
45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<Statement*>* statements() { return &statements_; }
4584a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  bool is_initializer_block() const { return is_initializer_block_; }
45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4601e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  BailoutId DeclsId() const { return decls_id_; }
4611e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
462ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsJump() const OVERRIDE {
463594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    return !statements_.is_empty() && statements_.last()->IsJump()
464594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org        && labels() == NULL;  // Good enough as an approximation...
465594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
466594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
467ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  Scope* scope() const { return scope_; }
468ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  void set_scope(Scope* scope) { scope_ = scope; }
4694acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org
470b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
471a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity,
472a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        bool is_initializer_block, int pos, IdGen* id_gen)
473a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : BreakableStatement(zone, labels, TARGET_FOR_NAMED_ONLY, pos, id_gen),
4747028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        statements_(capacity, zone),
475b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        is_initializer_block_(is_initializer_block),
476a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        decls_id_(id_gen->GetNextId()),
477a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        scope_(NULL) {}
478b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<Statement*> statements_;
48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool is_initializer_block_;
4821e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  const BailoutId decls_id_;
483ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  Scope* scope_;
48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass Declaration : public AstNode {
48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
489b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  VariableProxy* proxy() const { return proxy_; }
490b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  VariableMode mode() const { return mode_; }
491b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Scope* scope() const { return scope_; }
492812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  virtual InitializationFlag initialization() const = 0;
49378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  virtual bool IsInlineable() const;
494b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
49578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected:
4966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Declaration(Zone* zone,
4976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org              VariableProxy* proxy,
498b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org              VariableMode mode,
499a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org              Scope* scope,
500a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org              int pos)
501a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      : AstNode(pos),
502a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org        proxy_(proxy),
503a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org        mode_(mode),
5041805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        scope_(scope) {
505e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(IsDeclaredVariableMode(mode));
50643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  VariableProxy* proxy_;
510b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org  VariableMode mode_;
5111805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
5121805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // Nested scope from which the declaration originated.
5131805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  Scope* scope_;
51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
51543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
517ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass VariableDeclaration FINAL : public Declaration {
51878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org public:
51978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  DECLARE_NODE_TYPE(VariableDeclaration)
52078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
521ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual InitializationFlag initialization() const OVERRIDE {
522812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return mode() == VAR ? kCreatedInitialized : kNeedsInitialization;
523812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
524812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
525812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org protected:
5266d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  VariableDeclaration(Zone* zone,
5276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org                      VariableProxy* proxy,
528812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                      VariableMode mode,
529a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                      Scope* scope,
530a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                      int pos)
5316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : Declaration(zone, proxy, mode, scope, pos) {
532812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
533812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org};
534812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
535812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
536ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass FunctionDeclaration FINAL : public Declaration {
537812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org public:
538812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  DECLARE_NODE_TYPE(FunctionDeclaration)
539812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
540812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  FunctionLiteral* fun() const { return fun_; }
541ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual InitializationFlag initialization() const OVERRIDE {
542812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return kCreatedInitialized;
543812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
544ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsInlineable() const OVERRIDE;
54578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
54678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected:
5476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  FunctionDeclaration(Zone* zone,
5486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org                      VariableProxy* proxy,
54978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org                      VariableMode mode,
55078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org                      FunctionLiteral* fun,
551a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                      Scope* scope,
552a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                      int pos)
5536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : Declaration(zone, proxy, mode, scope, pos),
55478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org        fun_(fun) {
555812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    // At the moment there are no "const functions" in JavaScript...
556e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(mode == VAR || mode == LET);
557e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(fun != NULL);
55878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  }
55978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
56078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org private:
56178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  FunctionLiteral* fun_;
56278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org};
56378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
56478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
565ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ModuleDeclaration FINAL : public Declaration {
56678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org public:
56778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  DECLARE_NODE_TYPE(ModuleDeclaration)
56878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
56978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Module* module() const { return module_; }
570ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual InitializationFlag initialization() const OVERRIDE {
571812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return kCreatedInitialized;
572812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
57378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
57478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected:
5756d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ModuleDeclaration(Zone* zone,
5766d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org                    VariableProxy* proxy,
57778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org                    Module* module,
578a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                    Scope* scope,
579a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                    int pos)
5806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : Declaration(zone, proxy, MODULE, scope, pos),
58178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org        module_(module) {
58278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  }
58378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
58478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org private:
58578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Module* module_;
58678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org};
58778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
58878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
589ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ImportDeclaration FINAL : public Declaration {
590812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org public:
591812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  DECLARE_NODE_TYPE(ImportDeclaration)
592812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
593812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Module* module() const { return module_; }
594ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual InitializationFlag initialization() const OVERRIDE {
595812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return kCreatedInitialized;
596812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
597812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
598812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org protected:
5996d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ImportDeclaration(Zone* zone,
6006d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org                    VariableProxy* proxy,
601812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                    Module* module,
602a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                    Scope* scope,
603a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                    int pos)
6046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : Declaration(zone, proxy, LET, scope, pos),
605812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org        module_(module) {
606812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
607812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
608812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org private:
609812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Module* module_;
610812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org};
611812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
612812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
613ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ExportDeclaration FINAL : public Declaration {
614812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org public:
615812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  DECLARE_NODE_TYPE(ExportDeclaration)
616812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
617ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual InitializationFlag initialization() const OVERRIDE {
618812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return kCreatedInitialized;
619812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
620812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
621812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org protected:
6226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ExportDeclaration(Zone* zone, VariableProxy* proxy, Scope* scope, int pos)
6236d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : Declaration(zone, proxy, LET, scope, pos) {}
624812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org};
625812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
626812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
62732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass Module : public AstNode {
628bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com public:
629bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  Interface* interface() const { return interface_; }
63081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  Block* body() const { return body_; }
631bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
63278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected:
633a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  Module(Zone* zone, int pos)
634a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      : AstNode(pos),
635a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org        interface_(Interface::NewModule(zone)),
63681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org        body_(NULL) {}
6376d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Module(Zone* zone, Interface* interface, int pos, Block* body = NULL)
638a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      : AstNode(pos),
639a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org        interface_(interface),
64081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org        body_(body) {}
641bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
642bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com private:
643bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  Interface* interface_;
64481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  Block* body_;
64578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org};
64678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
64778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
648ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ModuleLiteral FINAL : public Module {
64978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org public:
65078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  DECLARE_NODE_TYPE(ModuleLiteral)
65178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
65278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected:
6536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ModuleLiteral(Zone* zone, Block* body, Interface* interface, int pos)
6546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : Module(zone, interface, pos, body) {}
65578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org};
65678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
65778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
658ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ModuleVariable FINAL : public Module {
65978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org public:
66078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  DECLARE_NODE_TYPE(ModuleVariable)
66178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
662f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  VariableProxy* proxy() const { return proxy_; }
66378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
66478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected:
6656d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  inline ModuleVariable(Zone* zone, VariableProxy* proxy, int pos);
66678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
66778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org private:
668f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  VariableProxy* proxy_;
66978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org};
67078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
67178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
672ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ModulePath FINAL : public Module {
67378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org public:
67478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  DECLARE_NODE_TYPE(ModulePath)
67578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
67678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Module* module() const { return module_; }
67708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Handle<String> name() const { return name_->string(); }
67878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
67978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected:
68008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  ModulePath(Zone* zone, Module* module, const AstRawString* name, int pos)
68108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org      : Module(zone, pos), module_(module), name_(name) {}
68278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
68378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org private:
68478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Module* module_;
68508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstRawString* name_;
68678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org};
68778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
68878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
689ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ModuleUrl FINAL : public Module {
69078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org public:
69178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  DECLARE_NODE_TYPE(ModuleUrl)
69278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
69378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Handle<String> url() const { return url_; }
69478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
69578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected:
6966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ModuleUrl(Zone* zone, Handle<String> url, int pos)
697a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      : Module(zone, pos), url_(url) {
69878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  }
69978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
70078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org private:
70178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Handle<String> url_;
70278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org};
70378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
70478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
705ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ModuleStatement FINAL : public Statement {
7068e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org public:
7078e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  DECLARE_NODE_TYPE(ModuleStatement)
7088e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
7098e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  VariableProxy* proxy() const { return proxy_; }
7108e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  Block* body() const { return body_; }
7118e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
7128e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org protected:
7136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ModuleStatement(Zone* zone, VariableProxy* proxy, Block* body, int pos)
7146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : Statement(zone, pos),
715a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org        proxy_(proxy),
7168e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org        body_(body) {
7178e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  }
7188e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
7198e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org private:
7208e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  VariableProxy* proxy_;
7218e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  Block* body_;
7228e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org};
7238e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
7248e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
72532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass IterationStatement : public BreakableStatement {
72643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
72743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Type testing & conversion.
728ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual IterationStatement* AsIterationStatement() FINAL OVERRIDE {
72932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return this;
73032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Statement* body() const { return body_; }
73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
734471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId OsrEntryId() const { return osr_entry_id_; }
735471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  virtual BailoutId ContinueId() const = 0;
736471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  virtual BailoutId StackCheckId() const = 0;
737a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Code generation
73944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  Label* continue_target()  { return &continue_target_; }
74043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen protected:
742a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  IterationStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos,
743a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                     IdGen* id_gen)
744a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, id_gen),
745c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org        body_(NULL),
746a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        osr_entry_id_(id_gen->GetNextId()) {}
74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Initialize(Statement* body) {
74943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    body_ = body;
75043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
75143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
75343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Statement* body_;
75444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  Label continue_target_;
755c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
756471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId osr_entry_id_;
75743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
75843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
760ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass DoWhileStatement FINAL : public IterationStatement {
76143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
762f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(DoWhileStatement)
763f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org
7649d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  void Initialize(Expression* cond, Statement* body) {
7659d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    IterationStatement::Initialize(body);
7669d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    cond_ = cond;
7679d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
7689d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
7699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Expression* cond() const { return cond_; }
7709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
771ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual BailoutId ContinueId() const OVERRIDE { return continue_id_; }
772ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual BailoutId StackCheckId() const OVERRIDE { return back_edge_id_; }
773471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId BackEdgeId() const { return back_edge_id_; }
774a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
775b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
776a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos,
777a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                   IdGen* id_gen)
778a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : IterationStatement(zone, labels, pos, id_gen),
779b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        cond_(NULL),
780a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        continue_id_(id_gen->GetNextId()),
781a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        back_edge_id_(id_gen->GetNextId()) {}
782a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
7839d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com private:
7849d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Expression* cond_;
785c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
786471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId continue_id_;
787471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId back_edge_id_;
7889d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com};
7899d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
7909d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
791ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass WhileStatement FINAL : public IterationStatement {
7929d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com public:
793f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(WhileStatement)
794f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org
7959d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  void Initialize(Expression* cond, Statement* body) {
7969d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    IterationStatement::Initialize(body);
7979d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    cond_ = cond;
7989d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
7999d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
8009d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Expression* cond() const { return cond_; }
8019d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  bool may_have_function_literal() const {
8029d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    return may_have_function_literal_;
8039d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
80465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  void set_may_have_function_literal(bool value) {
80565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    may_have_function_literal_ = value;
80665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  }
8079d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
808ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual BailoutId ContinueId() const OVERRIDE { return EntryId(); }
809ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual BailoutId StackCheckId() const OVERRIDE { return body_id_; }
810471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId BodyId() const { return body_id_; }
811a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
812b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
813a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos,
814a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                 IdGen* id_gen)
815a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : IterationStatement(zone, labels, pos, id_gen),
816b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        cond_(NULL),
817b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        may_have_function_literal_(true),
818a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        body_id_(id_gen->GetNextId()) {}
819b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
8209d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com private:
8219d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Expression* cond_;
822c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
8239d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  // True if there is a function literal subexpression in the condition.
8249d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  bool may_have_function_literal_;
825c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
826471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId body_id_;
8279d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com};
8289d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
8299d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
830ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ForStatement FINAL : public IterationStatement {
8319d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com public:
832f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(ForStatement)
83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
83443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Initialize(Statement* init,
83543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                  Expression* cond,
83643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                  Statement* next,
83743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                  Statement* body) {
83843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    IterationStatement::Initialize(body);
83943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    init_ = init;
84043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    cond_ = cond;
84143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    next_ = next;
84243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
84343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8444a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  Statement* init() const { return init_; }
8454a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  Expression* cond() const { return cond_; }
8464a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  Statement* next() const { return next_; }
84765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
848f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  bool may_have_function_literal() const {
849f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    return may_have_function_literal_;
850f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  }
85165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  void set_may_have_function_literal(bool value) {
85265fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    may_have_function_literal_ = value;
85365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  }
85443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
855ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual BailoutId ContinueId() const OVERRIDE { return continue_id_; }
856ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual BailoutId StackCheckId() const OVERRIDE { return body_id_; }
857471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId BodyId() const { return body_id_; }
858a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
859f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  bool is_fast_smi_loop() { return loop_variable_ != NULL; }
860f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  Variable* loop_variable() { return loop_variable_; }
861f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  void set_loop_variable(Variable* var) { loop_variable_ = var; }
862b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
863b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
864a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos,
865a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org               IdGen* id_gen)
866a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : IterationStatement(zone, labels, pos, id_gen),
867b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        init_(NULL),
868b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        cond_(NULL),
869b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        next_(NULL),
870b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        may_have_function_literal_(true),
871b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        loop_variable_(NULL),
872a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        continue_id_(id_gen->GetNextId()),
873a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        body_id_(id_gen->GetNextId()) {}
874f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
87543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
87643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Statement* init_;
87743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* cond_;
87843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Statement* next_;
879c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
880bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  // True if there is a function literal subexpression in the condition.
881f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  bool may_have_function_literal_;
882f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  Variable* loop_variable_;
883c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
884471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId continue_id_;
885471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId body_id_;
88643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
88743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass ForEachStatement : public IterationStatement {
89043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
8911fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  enum VisitMode {
8921fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    ENUMERATE,   // for (each in subject) body;
8931fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    ITERATE      // for (each of subject) body;
8941fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  };
895f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org
8961fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  void Initialize(Expression* each, Expression* subject, Statement* body) {
89743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    IterationStatement::Initialize(body);
89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    each_ = each;
8991fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    subject_ = subject;
90043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
90143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
90243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* each() const { return each_; }
9031fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* subject() const { return subject_; }
90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9051fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org protected:
906a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos,
907a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                   IdGen* id_gen)
908a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : IterationStatement(zone, labels, pos, id_gen),
909a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        each_(NULL),
910a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        subject_(NULL) {}
9111fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
9121fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org private:
9131fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* each_;
9141fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* subject_;
9151fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org};
9161fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
9171fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
918ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ForInStatement FINAL : public ForEachStatement,
919f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    public FeedbackSlotInterface {
9201fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org public:
9211fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  DECLARE_NODE_TYPE(ForInStatement)
9221fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
9231fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* enumerable() const {
9241fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    return subject();
9251fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
926471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
927f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Type feedback information.
928a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  virtual int ComputeFeedbackSlotCount() { return 1; }
929f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  virtual void SetFirstFeedbackSlot(int slot) { for_in_feedback_slot_ = slot; }
930f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
931f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int ForInFeedbackSlot() {
932e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(for_in_feedback_slot_ != kInvalidFeedbackSlot);
933f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return for_in_feedback_slot_;
934f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
935f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
936c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  enum ForInType { FAST_FOR_IN, SLOW_FOR_IN };
937c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  ForInType for_in_type() const { return for_in_type_; }
9389f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  void set_for_in_type(ForInType type) { for_in_type_ = type; }
939a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
9401fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  BailoutId BodyId() const { return body_id_; }
9411fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  BailoutId PrepareId() const { return prepare_id_; }
942ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual BailoutId ContinueId() const OVERRIDE { return EntryId(); }
943ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual BailoutId StackCheckId() const OVERRIDE { return body_id_; }
9441fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
945b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
946a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos,
947a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                 IdGen* id_gen)
948a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : ForEachStatement(zone, labels, pos, id_gen),
9491fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org        for_in_type_(SLOW_FOR_IN),
950f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        for_in_feedback_slot_(kInvalidFeedbackSlot),
951a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        body_id_(id_gen->GetNextId()),
952a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        prepare_id_(id_gen->GetNextId()) {}
953b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
954c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  ForInType for_in_type_;
955f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int for_in_feedback_slot_;
956471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId body_id_;
957471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId prepare_id_;
95843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
95943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
96043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
961ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ForOfStatement FINAL : public ForEachStatement {
9621fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org public:
9631fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  DECLARE_NODE_TYPE(ForOfStatement)
9641fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
9651fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  void Initialize(Expression* each,
9661fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                  Expression* subject,
9671fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                  Statement* body,
9681fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                  Expression* assign_iterator,
9691fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                  Expression* next_result,
9701fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                  Expression* result_done,
9711fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                  Expression* assign_each) {
9721fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    ForEachStatement::Initialize(each, subject, body);
9731fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    assign_iterator_ = assign_iterator;
9741fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    next_result_ = next_result;
9751fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    result_done_ = result_done;
9761fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    assign_each_ = assign_each;
9771fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
9781fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
9791fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* iterable() const {
9801fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    return subject();
9811fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
9821fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
983f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  // var iterator = subject[Symbol.iterator]();
9841fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* assign_iterator() const {
9851fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    return assign_iterator_;
9861fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
9871fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
9881fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  // var result = iterator.next();
9891fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* next_result() const {
9901fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    return next_result_;
9911fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
9921fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
9931fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  // result.done
9941fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* result_done() const {
9951fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    return result_done_;
9961fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
9971fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
9981fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  // each = result.value
9991fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* assign_each() const {
10001fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    return assign_each_;
10011fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
10021fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
1003ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual BailoutId ContinueId() const OVERRIDE { return EntryId(); }
1004ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual BailoutId StackCheckId() const OVERRIDE { return BackEdgeId(); }
10051fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
10061fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  BailoutId BackEdgeId() const { return back_edge_id_; }
10071fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
10081fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org protected:
1009a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos,
1010a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                 IdGen* id_gen)
1011a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : ForEachStatement(zone, labels, pos, id_gen),
10121fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org        assign_iterator_(NULL),
10131fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org        next_result_(NULL),
10141fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org        result_done_(NULL),
10151fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org        assign_each_(NULL),
1016a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        back_edge_id_(id_gen->GetNextId()) {}
10171fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
10181fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* assign_iterator_;
10191fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* next_result_;
10201fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* result_done_;
10211fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Expression* assign_each_;
10221fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  const BailoutId back_edge_id_;
10231fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org};
10241fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
10251fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
1026ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ExpressionStatement FINAL : public Statement {
102743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1028f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(ExpressionStatement)
102943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void set_expression(Expression* e) { expression_ = e; }
1031a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Expression* expression() const { return expression_; }
1032ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsJump() const OVERRIDE { return expression_->IsThrow(); }
103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1034b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
10356d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ExpressionStatement(Zone* zone, Expression* expression, int pos)
10366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : Statement(zone, pos), expression_(expression) { }
1037b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
103843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
103943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* expression_;
104043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass JumpStatement : public Statement {
1044594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org public:
1045ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsJump() const FINAL OVERRIDE { return true; }
1046594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1047594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org protected:
10486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  explicit JumpStatement(Zone* zone, int pos) : Statement(zone, pos) {}
1049594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org};
1050594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1051594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1052ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ContinueStatement FINAL : public JumpStatement {
105343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1054f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(ContinueStatement)
105543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10564a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  IterationStatement* target() const { return target_; }
1057b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1058b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
10596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  explicit ContinueStatement(Zone* zone, IterationStatement* target, int pos)
10606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : JumpStatement(zone, pos), target_(target) { }
106143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
106243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
106343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  IterationStatement* target_;
106443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
106543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
106643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1067ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass BreakStatement FINAL : public JumpStatement {
106843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1069f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(BreakStatement)
107043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10714a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  BreakableStatement* target() const { return target_; }
1072b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1073b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
10746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  explicit BreakStatement(Zone* zone, BreakableStatement* target, int pos)
10756d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : JumpStatement(zone, pos), target_(target) { }
107643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
107743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
107843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  BreakableStatement* target_;
107943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
108043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
108143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1082ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ReturnStatement FINAL : public JumpStatement {
108343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1084f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(ReturnStatement)
108543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1086a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Expression* expression() const { return expression_; }
1087b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1088b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
10896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  explicit ReturnStatement(Zone* zone, Expression* expression, int pos)
10906d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : JumpStatement(zone, pos), expression_(expression) { }
109143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
109343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* expression_;
109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1097ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass WithStatement FINAL : public Statement {
109843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
10994acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  DECLARE_NODE_TYPE(WithStatement)
110043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1101ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  Scope* scope() { return scope_; }
11024a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  Expression* expression() const { return expression_; }
11034acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  Statement* statement() const { return statement_; }
110443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1105b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1106a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  WithStatement(
11076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      Zone* zone, Scope* scope,
11086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      Expression* expression, Statement* statement, int pos)
11096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : Statement(zone, pos),
1110a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org        scope_(scope),
1111ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org        expression_(expression),
1112b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        statement_(statement) { }
111337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
111443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
1115ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  Scope* scope_;
111643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* expression_;
11174acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  Statement* statement_;
111843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
111943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1121ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CaseClause FINAL : public Expression {
112243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1123a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  DECLARE_NODE_TYPE(CaseClause)
112443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11254a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  bool is_default() const { return label_ == NULL; }
11264a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  Expression* label() const {
112743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    CHECK(!is_default());
112843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return label_;
112943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
113044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  Label* body_target() { return &body_target_; }
11314a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  ZoneList<Statement*>* statements() const { return statements_; }
113243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1133471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId EntryId() const { return entry_id_; }
11344d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org
1135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Type feedback information.
1136471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  TypeFeedbackId CompareId() { return compare_id_; }
11376d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Type* compare_type() { return compare_type_; }
11386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void set_compare_type(Type* type) { compare_type_ = type; }
1139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
114043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
1141a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  CaseClause(Zone* zone, Expression* label, ZoneList<Statement*>* statements,
1142a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org             int pos, IdGen* id_gen);
1143a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
114443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* label_;
114544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  Label body_target_;
114643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<Statement*>* statements_;
11476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Type* compare_type_;
114841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
1149471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const TypeFeedbackId compare_id_;
1150471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId entry_id_;
115143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
115243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
115343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1154ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass SwitchStatement FINAL : public BreakableStatement {
115543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1156f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(SwitchStatement)
1157f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org
115843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) {
115943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    tag_ = tag;
116043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    cases_ = cases;
116143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
116243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11634a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  Expression* tag() const { return tag_; }
11644a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  ZoneList<CaseClause*>* cases() const { return cases_; }
1165b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1166b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1167a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  SwitchStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos,
1168a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                  IdGen* id_gen)
1169a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, id_gen),
1170b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        tag_(NULL),
1171a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        cases_(NULL) {}
117243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
117343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
117443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* tag_;
117543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<CaseClause*>* cases_;
117643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
117743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
117843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
117943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// If-statements always have non-null references to their then- and
118043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// else-parts. When parsing if-statements with no explicit else-part,
118143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the parser implicitly creates an empty statement. Use the
118243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// HasThenStatement() and HasElseStatement() functions to check if a
118343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// given if-statement has a then- or an else-part containing code.
1184ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass IfStatement FINAL : public Statement {
118543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1186f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(IfStatement)
118743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
118843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool HasThenStatement() const { return !then_statement()->IsEmpty(); }
118943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool HasElseStatement() const { return !else_statement()->IsEmpty(); }
119043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
119143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* condition() const { return condition_; }
119243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Statement* then_statement() const { return then_statement_; }
119343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Statement* else_statement() const { return else_statement_; }
11945f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
1195ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsJump() const OVERRIDE {
1196594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    return HasThenStatement() && then_statement()->IsJump()
1197594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org        && HasElseStatement() && else_statement()->IsJump();
1198594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
1199594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1200471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId IfId() const { return if_id_; }
1201471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId ThenId() const { return then_id_; }
1202471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId ElseId() const { return else_id_; }
120343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1204b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1205a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  IfStatement(Zone* zone, Expression* condition, Statement* then_statement,
1206a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org              Statement* else_statement, int pos, IdGen* id_gen)
12076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : Statement(zone, pos),
1208a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org        condition_(condition),
1209b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        then_statement_(then_statement),
1210b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        else_statement_(else_statement),
1211a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        if_id_(id_gen->GetNextId()),
1212a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        then_id_(id_gen->GetNextId()),
1213a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        else_id_(id_gen->GetNextId()) {}
1214b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
121543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
121643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* condition_;
121743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Statement* then_statement_;
121843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Statement* else_statement_;
1219471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId if_id_;
1220471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId then_id_;
1221471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId else_id_;
122243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
122343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
122443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12257be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// NOTE: TargetCollectors are represented as nodes to fit in the target
122643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// stack in the compiler; this should probably be reworked.
1227ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass TargetCollector FINAL : public AstNode {
122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1229a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  explicit TargetCollector(Zone* zone)
1230a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      : AstNode(RelocInfo::kNoPosition), targets_(0, zone) { }
123143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12327be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  // Adds a jump target to the collector. The collector stores a pointer not
12337be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  // a copy of the target to make binding work, so make sure not to pass in
12347be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  // references to something on the stack.
12357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  void AddTarget(Label* target, Zone* zone);
123643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12377be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  // Virtual behaviour. TargetCollectors are never part of the AST.
1238ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void Accept(AstVisitor* v) OVERRIDE { UNREACHABLE(); }
1239ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual NodeType node_type() const OVERRIDE { return kInvalid; }
1240ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual TargetCollector* AsTargetCollector() OVERRIDE { return this; }
124143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12426d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  ZoneList<Label*>* targets() { return &targets_; }
124343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
124443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
12456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  ZoneList<Label*> targets_;
124643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
124743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
124843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
124932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass TryStatement : public Statement {
125043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
125144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  void set_escaping_targets(ZoneList<Label*>* targets) {
12527be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    escaping_targets_ = targets;
125343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
125443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
125504e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org  int index() const { return index_; }
125643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Block* try_block() const { return try_block_; }
125744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  ZoneList<Label*>* escaping_targets() const { return escaping_targets_; }
1258b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1259b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
12606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TryStatement(Zone* zone, int index, Block* try_block, int pos)
12616d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : Statement(zone, pos),
1262a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org        index_(index),
1263b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        try_block_(try_block),
1264b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        escaping_targets_(NULL) { }
126543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
126643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
126704e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org  // Unique (per-function) index of this handler.  This is not an AST ID.
126804e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org  int index_;
126904e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org
127043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Block* try_block_;
127144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  ZoneList<Label*>* escaping_targets_;
127243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
127343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
127443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1275ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass TryCatchStatement FINAL : public TryStatement {
127643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1277b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  DECLARE_NODE_TYPE(TryCatchStatement)
1278b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1279b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Scope* scope() { return scope_; }
1280b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Variable* variable() { return variable_; }
1281b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Block* catch_block() const { return catch_block_; }
1282b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1283b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
12846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TryCatchStatement(Zone* zone,
12856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org                    int index,
128604e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org                    Block* try_block,
12874f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org                    Scope* scope,
12884f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org                    Variable* variable,
1289a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                    Block* catch_block,
1290a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                    int pos)
12916d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : TryStatement(zone, index, try_block, pos),
12924f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org        scope_(scope),
12934f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org        variable_(variable),
129443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        catch_block_(catch_block) {
129543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
129643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
129743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
12984f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  Scope* scope_;
12994f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  Variable* variable_;
130043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Block* catch_block_;
130143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
130243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
130343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1304ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass TryFinallyStatement FINAL : public TryStatement {
130543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1306f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(TryFinallyStatement)
130743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
130843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Block* finally_block() const { return finally_block_; }
1309b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1310b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1311a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  TryFinallyStatement(
13126d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      Zone* zone, int index, Block* try_block, Block* finally_block, int pos)
13136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      : TryStatement(zone, index, try_block, pos),
1314b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        finally_block_(finally_block) { }
131543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
131643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
131743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Block* finally_block_;
131843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
131943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
132043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1321ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass DebuggerStatement FINAL : public Statement {
132243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1323f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(DebuggerStatement)
1324b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1325a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  BailoutId DebugBreakId() const { return debugger_id_; }
1326a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
1327b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1328a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  explicit DebuggerStatement(Zone* zone, int pos, IdGen* id_gen)
1329a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Statement(zone, pos), debugger_id_(id_gen->GetNextId()) {}
1330a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
1331a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org private:
1332a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  const BailoutId debugger_id_;
133343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
133443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
133543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1336ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass EmptyStatement FINAL : public Statement {
133743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1338f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(EmptyStatement)
1339a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1340b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
13416d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  explicit EmptyStatement(Zone* zone, int pos): Statement(zone, pos) {}
134243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
134343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
134443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1345ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Literal FINAL : public Expression {
134643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1347f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(Literal)
1348f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org
1349ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsPropertyName() const OVERRIDE {
135008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    return value_->IsPropertyName();
13510c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  }
13520c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
1353a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Handle<String> AsPropertyName() {
1354e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(IsPropertyName());
135508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    return Handle<String>::cast(value());
135608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  }
135708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
135808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstRawString* AsRawPropertyName() {
1359e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(IsPropertyName());
136008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    return value_->AsString();
1361a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1362a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1363ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool ToBooleanIsTrue() const OVERRIDE {
136408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    return value()->BooleanValue();
136532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
1366ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool ToBooleanIsFalse() const OVERRIDE {
136708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    return !value()->BooleanValue();
136832cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
1369a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
137008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Handle<Object> value() const { return value_->value(); }
137108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstValue* raw_value() const { return value_; }
1372b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1373bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  // Support for using Literal as a HashMap key. NOTE: Currently, this works
1374bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  // only for string and number literals!
1375bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  uint32_t Hash() { return ToString()->Hash(); }
1376bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
1377bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  static bool Match(void* literal1, void* literal2) {
1378bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    Handle<String> s1 = static_cast<Literal*>(literal1)->ToString();
1379bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    Handle<String> s2 = static_cast<Literal*>(literal2)->ToString();
13802ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    return String::Equals(s1, s2);
1381bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  }
1382bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
1383471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  TypeFeedbackId LiteralFeedbackId() const { return reuse(id()); }
1384471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1385b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1386a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Literal(Zone* zone, const AstValue* value, int position, IdGen* id_gen)
1387a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, position, id_gen),
13888fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org        value_(value),
1389a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        isolate_(zone->isolate()) {}
139043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
139143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
1392bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  Handle<String> ToString();
1393bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
139408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstValue* value_;
13958fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org  // TODO(dcarney): remove.  this is only needed for Match and Hash.
13968fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org  Isolate* isolate_;
139743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
139843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
139943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
140043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Base class for literals that needs space in the corresponding JSFunction.
140132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass MaterializedLiteral : public Expression {
140243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1403bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  virtual MaterializedLiteral* AsMaterializedLiteral() { return this; }
1404bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
140543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int literal_index() { return literal_index_; }
1406bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
14077ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  int depth() const {
14087ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    // only callable after initialization.
1409e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(depth_ >= 1);
14107ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    return depth_;
14117ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  }
14127ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
1413b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1414a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  MaterializedLiteral(Zone* zone, int literal_index, int pos, IdGen* id_gen)
1415a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen),
1416b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        literal_index_(literal_index),
14177ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org        is_simple_(false),
14187ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org        depth_(0) {}
1419e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1420e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // A materialized literal is simple if the values consist of only
1421e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // constants and simple object and array literals.
1422e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  bool is_simple() const { return is_simple_; }
1423e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  void set_is_simple(bool is_simple) { is_simple_ = is_simple; }
1424e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  friend class CompileTimeValue;
1425e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
14267ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  void set_depth(int depth) {
1427e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(depth >= 1);
14287ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    depth_ = depth;
14297ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  }
14307ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
1431e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // Populate the constant properties/elements fixed array.
14327ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  void BuildConstants(Isolate* isolate);
1433e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  friend class ArrayLiteral;
1434e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  friend class ObjectLiteral;
1435e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1436e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // If the expression is a literal, return the literal value;
1437e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // if the expression is a materialized literal and is simple return a
1438e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // compile time value as encoded by CompileTimeValue::GetValue().
1439e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // Otherwise, return undefined literal as the placeholder
1440e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // in the object literal boilerplate.
1441e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate);
1442bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
144343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
144443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int literal_index_;
1445bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  bool is_simple_;
14467ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  int depth_;
144743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
144843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
144943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1450c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// Property is used for passing information
1451c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// about an object literal's properties from the parser
1452c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// to the code generator.
1453ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ObjectLiteralProperty FINAL : public ZoneObject {
1454c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org public:
1455c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  enum Kind {
1456c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    CONSTANT,              // Property with constant value (compile time).
1457c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    COMPUTED,              // Property with computed value (execution time).
1458c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    MATERIALIZED_LITERAL,  // Property value is a materialized literal.
1459c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    GETTER, SETTER,        // Property is an accessor function.
1460c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    PROTOTYPE              // Property is __proto__.
1461c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  };
1462c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
146308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  ObjectLiteralProperty(Zone* zone, AstValueFactory* ast_value_factory,
1464a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                        Literal* key, Expression* value, bool is_static);
1465c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
1466c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Literal* key() { return key_; }
1467c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Expression* value() { return value_; }
1468c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Kind kind() { return kind_; }
1469c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
1470c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  // Type feedback information.
1471c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1472c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  bool IsMonomorphic() { return !receiver_type_.is_null(); }
1473c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Handle<Map> GetReceiverType() { return receiver_type_; }
1474c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
1475c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  bool IsCompileTimeValue();
1476c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
1477c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  void set_emit_store(bool emit_store);
1478c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  bool emit_store();
1479c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
1480c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org protected:
1481c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  template<class> friend class AstNodeFactory;
1482c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
1483a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  ObjectLiteralProperty(Zone* zone, bool is_getter, FunctionLiteral* value,
1484a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                        bool is_static);
1485c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  void set_key(Literal* key) { key_ = key; }
1486c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
1487c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org private:
1488c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Literal* key_;
1489c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Expression* value_;
1490c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Kind kind_;
1491c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  bool emit_store_;
1492a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  bool is_static_;
1493c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Handle<Map> receiver_type_;
1494c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org};
1495c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
1496c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
149743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// An object literal has a boilerplate object that is used
149843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// for minimizing the work when constructing it at runtime.
1499ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ObjectLiteral FINAL : public MaterializedLiteral {
150043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1501c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  typedef ObjectLiteralProperty Property;
150243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1503f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(ObjectLiteral)
150443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
150543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<FixedArray> constant_properties() const {
150643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return constant_properties_;
150743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
150843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<Property*>* properties() const { return properties_; }
1509f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  bool fast_elements() const { return fast_elements_; }
151057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool may_store_doubles() const { return may_store_doubles_; }
151157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool has_function() const { return has_function_; }
1512e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
1513e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // Decide if a property should be in the object boilerplate.
1514e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  static bool IsBoilerplateProperty(Property* property);
1515e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1516e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // Populate the constant properties fixed array.
15177ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  void BuildConstantProperties(Isolate* isolate);
1518e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1519e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // Mark all computed expressions that are bound to a key that
1520e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // is shadowed by a later occurrence of the same key. For the
1521e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // marked expressions, no store code is emitted.
15227028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  void CalculateEmitStore(Zone* zone);
1523e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
15247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Assemble bitfield of flags for the CreateObjectLiteral helper.
15257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int ComputeFlags() const {
15267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    int flags = fast_elements() ? kFastElements : kNoFlags;
15277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    flags |= has_function() ? kHasFunction : kNoFlags;
15287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    return flags;
15297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
15307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1531ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  enum Flags {
1532ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    kNoFlags = 0,
1533ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    kFastElements = 1,
1534ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    kHasFunction = 1 << 1
1535ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  };
1536ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
15372c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  struct Accessors: public ZoneObject {
15382c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org    Accessors() : getter(NULL), setter(NULL) { }
15392c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org    Expression* getter;
15402c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org    Expression* setter;
15412c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  };
15422c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
1543b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1544a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index,
1545a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                int boilerplate_properties, bool has_function, int pos,
1546a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                IdGen* id_gen)
1547a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : MaterializedLiteral(zone, literal_index, pos, id_gen),
1548b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        properties_(properties),
1549e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org        boilerplate_properties_(boilerplate_properties),
1550e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org        fast_elements_(false),
1551e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org        may_store_doubles_(false),
1552b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        has_function_(has_function) {}
1553b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
155443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
155543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<FixedArray> constant_properties_;
155643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<Property*>* properties_;
1557e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  int boilerplate_properties_;
1558f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  bool fast_elements_;
155957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool may_store_doubles_;
1560ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool has_function_;
156143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
156243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
156343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
156443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Node for capturing a regexp literal.
1565ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpLiteral FINAL : public MaterializedLiteral {
156643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1567b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  DECLARE_NODE_TYPE(RegExpLiteral)
1568b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
156908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Handle<String> pattern() const { return pattern_->string(); }
157008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Handle<String> flags() const { return flags_->string(); }
1571b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1572b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1573a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  RegExpLiteral(Zone* zone, const AstRawString* pattern,
1574a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                const AstRawString* flags, int literal_index, int pos,
1575a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                IdGen* id_gen)
1576a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : MaterializedLiteral(zone, literal_index, pos, id_gen),
157743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        pattern_(pattern),
15787ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org        flags_(flags) {
15797ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    set_depth(1);
15807ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  }
158143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
158243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
158308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstRawString* pattern_;
158408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstRawString* flags_;
158543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
158643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1587a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
158843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// An array literal has a literals object that is used
158937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// for minimizing the work when constructing it at runtime.
1590ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ArrayLiteral FINAL : public MaterializedLiteral {
159143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1592b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  DECLARE_NODE_TYPE(ArrayLiteral)
1593b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1594b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Handle<FixedArray> constant_elements() const { return constant_elements_; }
1595b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  ZoneList<Expression*>* values() const { return values_; }
1596b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1597b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  // Return an AST id for an element that is used in simulate instructions.
1598471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId GetIdForElement(int i) {
1599471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    return BailoutId(first_element_id_.ToInt() + i);
1600471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
1601b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1602e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // Populate the constant elements fixed array.
16037ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  void BuildConstantElements(Isolate* isolate);
1604e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
16057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Assemble bitfield of flags for the CreateArrayLiteral helper.
16067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int ComputeFlags() const {
16077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    int flags = depth() == 1 ? kShallowElements : kNoFlags;
16087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    flags |= ArrayLiteral::kDisableMementos;
16097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    return flags;
16107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
16117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
161237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  enum Flags {
161337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    kNoFlags = 0,
161437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    kShallowElements = 1,
161537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    kDisableMementos = 1 << 1
161637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  };
161737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org
1618b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1619a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, int literal_index,
1620a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org               int pos, IdGen* id_gen)
1621a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : MaterializedLiteral(zone, literal_index, pos, id_gen),
1622a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        values_(values),
1623a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        first_element_id_(id_gen->ReserveIdRange(values->length())) {}
162443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
162543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
16260c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  Handle<FixedArray> constant_elements_;
162743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<Expression*>* values_;
1628471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId first_element_id_;
162943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
163043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
163143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1632ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass VariableProxy FINAL : public Expression, public FeedbackSlotInterface {
163343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1634f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(VariableProxy)
163543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1636ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsValidReferenceExpression() const OVERRIDE {
16374edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    return var_ == NULL ? true : var_->IsValidReference();
163843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
16393e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org
16404edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  bool IsArguments() const { return var_ != NULL && var_->is_arguments(); }
16413e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org
164208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Handle<String> name() const { return name_->string(); }
164308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstRawString* raw_name() const { return name_; }
16444a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  Variable* var() const { return var_; }
16454a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  bool is_this() const { return is_this_; }
1646bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  Interface* interface() const { return interface_; }
1647bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
1648248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  bool is_assigned() const { return is_assigned_; }
1649248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  void set_is_assigned() { is_assigned_ = true; }
1650086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
16518e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  // Bind this proxy to the variable var. Interfaces must match.
165243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void BindTo(Variable* var);
165343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16549d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; }
16559d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  virtual void SetFirstFeedbackSlot(int slot) {
16569d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    variable_feedback_slot_ = slot;
16579d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
16589d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
16599d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int VariableFeedbackSlot() { return variable_feedback_slot_; }
16609d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
166143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen protected:
1662a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  VariableProxy(Zone* zone, Variable* var, int position, IdGen* id_gen);
1663b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1664a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  VariableProxy(Zone* zone, const AstRawString* name, bool is_this,
1665a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                Interface* interface, int position, IdGen* id_gen);
1666b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
166708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstRawString* name_;
166843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Variable* var_;  // resolved variable, or NULL
166943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool is_this_;
1670248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  bool is_assigned_;
1671bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  Interface* interface_;
16729d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int variable_feedback_slot_;
167343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
167443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
167543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1676ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Property FINAL : public Expression, public FeedbackSlotInterface {
167743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1678f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(Property)
167943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1680ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsValidReferenceExpression() const OVERRIDE { return true; }
168143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
168243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* obj() const { return obj_; }
168343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* key() const { return key_; }
168443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1685471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId LoadId() const { return load_id_; }
1686ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org
1687b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  bool IsStringAccess() const { return is_string_access_; }
16889e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1689a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Type feedback information.
1690ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsMonomorphic() OVERRIDE {
1691113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org    return receiver_types_.length() == 1;
1692113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org  }
1693ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual SmallMapList* GetReceiverTypes() OVERRIDE {
169432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return &receiver_types_;
169532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
1696ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual KeyedAccessStoreMode GetStoreMode() OVERRIDE {
16977bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org    return STANDARD_STORE;
16987bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org  }
16998297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org  bool IsUninitialized() { return !is_for_call_ && is_uninitialized_; }
1700c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  bool HasNoTypeInformation() {
1701a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org    return is_uninitialized_;
1702c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  }
1703cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org  void set_is_uninitialized(bool b) { is_uninitialized_ = b; }
1704cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org  void set_is_string_access(bool b) { is_string_access_ = b; }
1705a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org  void mark_for_call() { is_for_call_ = true; }
1706a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org  bool IsForCall() { return is_for_call_; }
1707cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org
17085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  bool IsSuperAccess() {
17095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    return obj()->IsSuperReference();
17105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
17115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1712471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  TypeFeedbackId PropertyFeedbackId() { return reuse(id()); }
1713a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
17149d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; }
17159d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  virtual void SetFirstFeedbackSlot(int slot) {
17169d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    property_feedback_slot_ = slot;
17179d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
17189d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
17199d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int PropertyFeedbackSlot() const { return property_feedback_slot_; }
17209d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
1721b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1722a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Property(Zone* zone, Expression* obj, Expression* key, int pos, IdGen* id_gen)
1723a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen),
1724b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        obj_(obj),
1725b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        key_(key),
1726a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        load_id_(id_gen->GetNextId()),
17279d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org        property_feedback_slot_(kInvalidFeedbackSlot),
1728a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org        is_for_call_(false),
1729531dfe85209e15c3e292569c285a5be54910da7cjkummerow@chromium.org        is_uninitialized_(false),
173051e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org        is_string_access_(false) {}
1731b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
173243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
173343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* obj_;
173443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* key_;
1735471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId load_id_;
17369d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int property_feedback_slot_;
173743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1738ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  SmallMapList receiver_types_;
1739a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org  bool is_for_call_ : 1;
1740531dfe85209e15c3e292569c285a5be54910da7cjkummerow@chromium.org  bool is_uninitialized_ : 1;
1741b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  bool is_string_access_ : 1;
174243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
174343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
174443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1745ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Call FINAL : public Expression, public FeedbackSlotInterface {
174643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1747f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(Call)
174843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
174943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* expression() const { return expression_; }
175043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<Expression*>* arguments() const { return arguments_; }
175143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1752471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Type feedback information.
1753a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  virtual int ComputeFeedbackSlotCount() { return 1; }
1754f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  virtual void SetFirstFeedbackSlot(int slot) {
1755f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    call_feedback_slot_ = slot;
1756f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1757f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1758f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bool HasCallFeedbackSlot() const {
1759f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return call_feedback_slot_ != kInvalidFeedbackSlot;
1760f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1761f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int CallFeedbackSlot() const { return call_feedback_slot_; }
17626e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
1763ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual SmallMapList* GetReceiverTypes() OVERRIDE {
1764a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org    if (expression()->IsProperty()) {
1765a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org      return expression()->AsProperty()->GetReceiverTypes();
1766a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org    }
1767a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org    return NULL;
17686e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  }
17696e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
1770ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsMonomorphic() OVERRIDE {
1771a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org    if (expression()->IsProperty()) {
1772a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org      return expression()->AsProperty()->IsMonomorphic();
1773a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org    }
1774a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org    return !target_.is_null();
17756e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  }
17766e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
17777e6132b924829c353864933f29124419916db550machenbach@chromium.org  bool global_call() const {
17787e6132b924829c353864933f29124419916db550machenbach@chromium.org    VariableProxy* proxy = expression_->AsVariableProxy();
17797e6132b924829c353864933f29124419916db550machenbach@chromium.org    return proxy != NULL && proxy->var()->IsUnallocated();
17807e6132b924829c353864933f29124419916db550machenbach@chromium.org  }
17817e6132b924829c353864933f29124419916db550machenbach@chromium.org
17827e6132b924829c353864933f29124419916db550machenbach@chromium.org  bool known_global_function() const {
17837e6132b924829c353864933f29124419916db550machenbach@chromium.org    return global_call() && !target_.is_null();
17847e6132b924829c353864933f29124419916db550machenbach@chromium.org  }
17857e6132b924829c353864933f29124419916db550machenbach@chromium.org
1786a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Handle<JSFunction> target() { return target_; }
178799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
178841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  Handle<Cell> cell() { return cell_; }
1789a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
17907e6132b924829c353864933f29124419916db550machenbach@chromium.org  Handle<AllocationSite> allocation_site() { return allocation_site_; }
17917e6132b924829c353864933f29124419916db550machenbach@chromium.org
1792a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org  void set_target(Handle<JSFunction> target) { target_ = target; }
17937e6132b924829c353864933f29124419916db550machenbach@chromium.org  void set_allocation_site(Handle<AllocationSite> site) {
17947e6132b924829c353864933f29124419916db550machenbach@chromium.org    allocation_site_ = site;
17957e6132b924829c353864933f29124419916db550machenbach@chromium.org  }
17967dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org  bool ComputeGlobalTarget(Handle<GlobalObject> global, LookupIterator* it);
1797a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1798471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId ReturnId() const { return return_id_; }
1799a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
180043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  enum CallType {
180143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    POSSIBLY_EVAL_CALL,
180243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    GLOBAL_CALL,
180343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    LOOKUP_SLOT_CALL,
180443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    PROPERTY_CALL,
180543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    OTHER_CALL
180643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  };
180743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
180843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  // Helpers to determine how to handle the call.
180943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  CallType GetCallType(Isolate* isolate) const;
1810a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  bool IsUsingCallFeedbackSlot(Isolate* isolate) const;
181143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
1812a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#ifdef DEBUG
1813a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Used to assert that the FullCodeGenerator records the return site.
1814a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool return_is_recorded_;
1815a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif
1816a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1817b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1818a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments,
1819a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org       int pos, IdGen* id_gen)
1820a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen),
1821b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        expression_(expression),
1822b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        arguments_(arguments),
1823f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        call_feedback_slot_(kInvalidFeedbackSlot),
1824a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        return_id_(id_gen->GetNextId()) {
1825a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org    if (expression->IsProperty()) {
1826a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org      expression->AsProperty()->mark_for_call();
1827a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org    }
1828a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org  }
1829b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
183043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
183143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* expression_;
183243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<Expression*>* arguments_;
183343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1834a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Handle<JSFunction> target_;
183541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  Handle<Cell> cell_;
18367e6132b924829c353864933f29124419916db550machenbach@chromium.org  Handle<AllocationSite> allocation_site_;
1837f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int call_feedback_slot_;
1838a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1839471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId return_id_;
1840ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org};
1841ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1842ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1843ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CallNew FINAL : public Expression, public FeedbackSlotInterface {
184443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1845b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  DECLARE_NODE_TYPE(CallNew)
1846b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1847b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Expression* expression() const { return expression_; }
1848b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  ZoneList<Expression*>* arguments() const { return arguments_; }
1849b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1850471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Type feedback information.
1851a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  virtual int ComputeFeedbackSlotCount() {
185269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    return FLAG_pretenuring_call_new ? 2 : 1;
185369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  }
1854f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  virtual void SetFirstFeedbackSlot(int slot) {
1855f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    callnew_feedback_slot_ = slot;
1856f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1857f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1858f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int CallNewFeedbackSlot() {
1859e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(callnew_feedback_slot_ != kInvalidFeedbackSlot);
1860f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return callnew_feedback_slot_;
1861f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
186269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  int AllocationSiteFeedbackSlot() {
1863e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(callnew_feedback_slot_ != kInvalidFeedbackSlot);
1864e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(FLAG_pretenuring_call_new);
186569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    return callnew_feedback_slot_ + 1;
186669f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  }
1867f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1868967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org  void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1869ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsMonomorphic() OVERRIDE { return is_monomorphic_; }
1870c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Handle<JSFunction> target() const { return target_; }
1871c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  ElementsKind elements_kind() const { return elements_kind_; }
1872c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org  Handle<AllocationSite> allocation_site() const {
1873c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org    return allocation_site_;
18741fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
1875967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
1876f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  static int feedback_slots() { return 1; }
1877f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1878471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId ReturnId() const { return return_id_; }
1879967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
1880b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1881a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments,
1882a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org          int pos, IdGen* id_gen)
1883a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen),
1884717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org        expression_(expression),
1885717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org        arguments_(arguments),
1886967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org        is_monomorphic_(false),
1887c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org        elements_kind_(GetInitialFastElementsKind()),
1888f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        callnew_feedback_slot_(kInvalidFeedbackSlot),
1889a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        return_id_(id_gen->GetNextId()) {}
1890a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
1891a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
1892c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  Expression* expression_;
1893c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  ZoneList<Expression*>* arguments_;
1894967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
1895967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org  bool is_monomorphic_;
1896967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org  Handle<JSFunction> target_;
1897c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  ElementsKind elements_kind_;
1898c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org  Handle<AllocationSite> allocation_site_;
1899f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int callnew_feedback_slot_;
1900967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
1901471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId return_id_;
190243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
190343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
190443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
190543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The CallRuntime class does not represent any official JavaScript
190643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// language construct. Instead it is used to call a C or JS function
190743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// with a set of arguments. This is used from the builtins that are
190843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// implemented in JavaScript (see "v8natives.js").
1909ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CallRuntime FINAL : public Expression, public FeedbackSlotInterface {
191043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1911b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  DECLARE_NODE_TYPE(CallRuntime)
1912b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
191308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Handle<String> name() const { return raw_name_->string(); }
191408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstRawString* raw_name() const { return raw_name_; }
1915b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  const Runtime::Function* function() const { return function_; }
1916b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  ZoneList<Expression*>* arguments() const { return arguments_; }
1917b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  bool is_jsruntime() const { return function_ == NULL; }
1918b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
19199d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  // Type feedback information.
19209d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  virtual int ComputeFeedbackSlotCount() {
19219d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    return (FLAG_vector_ics && is_jsruntime()) ? 1 : 0;
19229d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
19239d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  virtual void SetFirstFeedbackSlot(int slot) {
19249d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    callruntime_feedback_slot_ = slot;
19259d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
19269d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
19279d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int CallRuntimeFeedbackSlot() {
1928e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!is_jsruntime() ||
19299d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org           callruntime_feedback_slot_ != kInvalidFeedbackSlot);
19309d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    return callruntime_feedback_slot_;
19319d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
19329d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
1933471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  TypeFeedbackId CallRuntimeFeedbackId() const { return reuse(id()); }
1934471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1935b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1936a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  CallRuntime(Zone* zone, const AstRawString* name,
1937ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org              const Runtime::Function* function,
1938a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org              ZoneList<Expression*>* arguments, int pos, IdGen* id_gen)
1939a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen),
194008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org        raw_name_(name),
1941717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org        function_(function),
1942a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        arguments_(arguments) {}
194343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
194443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
194508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstRawString* raw_name_;
1946ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  const Runtime::Function* function_;
194743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<Expression*>* arguments_;
19489d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int callruntime_feedback_slot_;
194943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
195043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
195143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1952ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass UnaryOperation FINAL : public Expression {
195343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1954b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  DECLARE_NODE_TYPE(UnaryOperation)
1955b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1956b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Token::Value op() const { return op_; }
1957b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Expression* expression() const { return expression_; }
1958b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1959471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId MaterializeTrueId() { return materialize_true_id_; }
1960471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId MaterializeFalseId() { return materialize_false_id_; }
1961471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
196232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  virtual void RecordToBooleanTypeFeedback(
1963ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org      TypeFeedbackOracle* oracle) OVERRIDE;
1964b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1965b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
1966a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos,
1967a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                 IdGen* id_gen)
1968a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen),
1969c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org        op_(op),
1970c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org        expression_(expression),
1971a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        materialize_true_id_(id_gen->GetNextId()),
1972a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        materialize_false_id_(id_gen->GetNextId()) {
1973e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(Token::IsUnaryOp(op));
197443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
197543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
197643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
197743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Token::Value op_;
197843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* expression_;
1979c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1980c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // For unary not (Token::NOT), the AST ids where true and false will
1981c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // actually be materialized, respectively.
1982471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId materialize_true_id_;
1983471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId materialize_false_id_;
198443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
198543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
198643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1987ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass BinaryOperation FINAL : public Expression {
198843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1989f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(BinaryOperation)
199043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1991ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool ResultOverwriteAllowed() const OVERRIDE;
199243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
199343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Token::Value op() const { return op_; }
199443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* left() const { return left_; }
199543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* right() const { return right_; }
19960f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  Handle<AllocationSite> allocation_site() const { return allocation_site_; }
19970f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  void set_allocation_site(Handle<AllocationSite> allocation_site) {
19980f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org    allocation_site_ = allocation_site;
19990f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  }
200043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2001471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId RightId() const { return right_id_; }
2002471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2003471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  TypeFeedbackId BinaryOperationFeedbackId() const { return reuse(id()); }
20041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Maybe<int> fixed_right_arg() const { return fixed_right_arg_; }
20051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  void set_fixed_right_arg(Maybe<int> arg) { fixed_right_arg_ = arg; }
20061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
200732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  virtual void RecordToBooleanTypeFeedback(
2008ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org      TypeFeedbackOracle* oracle) OVERRIDE;
20095f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
2010b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
2011a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  BinaryOperation(Zone* zone, Token::Value op, Expression* left,
2012a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                  Expression* right, int pos, IdGen* id_gen)
2013a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen),
2014304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org        op_(op),
2015304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org        left_(left),
2016304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org        right_(right),
2017a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        right_id_(id_gen->GetNextId()) {
2018e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(Token::IsBinaryOp(op));
2019b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
2020b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
202143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
202243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Token::Value op_;
202343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* left_;
202443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* right_;
20250f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  Handle<AllocationSite> allocation_site_;
2026c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
20271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // TODO(rossberg): the fixed arg should probably be represented as a Constant
20281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // type for the RHS.
20291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Maybe<int> fixed_right_arg_;
2030c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
2031304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  // The short-circuit logical operations need an AST ID for their
20325f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  // right-hand subexpression.
2033471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId right_id_;
203443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
203543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
203643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2037ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CountOperation FINAL : public Expression {
203865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org public:
2039f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(CountOperation)
2040f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
204143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool is_prefix() const { return is_prefix_; }
204243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool is_postfix() const { return !is_prefix_; }
204365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
204444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  Token::Value op() const { return op_; }
204574e4e5ea6d118c13967c54fe92c7782ebdcb6eb7kasperl@chromium.org  Token::Value binary_op() {
204665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    return (op() == Token::INC) ? Token::ADD : Token::SUB;
204774e4e5ea6d118c13967c54fe92c7782ebdcb6eb7kasperl@chromium.org  }
204865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
204944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  Expression* expression() const { return expression_; }
205043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2051ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsMonomorphic() OVERRIDE {
2052113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org    return receiver_types_.length() == 1;
2053113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org  }
2054ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual SmallMapList* GetReceiverTypes() OVERRIDE {
205532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return &receiver_types_;
205632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
2057ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual KeyedAccessStoreMode GetStoreMode() OVERRIDE {
20587bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org    return store_mode_;
20597bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org  }
20606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Type* type() const { return type_; }
20619f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  void set_store_mode(KeyedAccessStoreMode mode) { store_mode_ = mode; }
20626d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void set_type(Type* type) { type_ = type; }
206344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
2064471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId AssignmentId() const { return assignment_id_; }
2065471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2066471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  TypeFeedbackId CountBinOpFeedbackId() const { return count_id_; }
2067471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  TypeFeedbackId CountStoreFeedbackId() const { return reuse(id()); }
20685f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
2069b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
2070a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr,
2071a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                 int pos, IdGen* id_gen)
2072a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen),
2073b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        op_(op),
2074b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        is_prefix_(is_prefix),
20757bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org        store_mode_(STANDARD_STORE),
2076b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        expression_(expr),
2077a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        assignment_id_(id_gen->GetNextId()),
2078a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        count_id_(id_gen->GetNextId()) {}
2079b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
208043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
208144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  Token::Value op_;
20827bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org  bool is_prefix_ : 1;
2083e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  KeyedAccessStoreMode store_mode_ : 5;  // Windows treats as signed,
2084e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org                                         // must have extra bit.
20856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Type* type_;
2086c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
208744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  Expression* expression_;
2088471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId assignment_id_;
2089471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const TypeFeedbackId count_id_;
2090ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  SmallMapList receiver_types_;
209143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
209243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
209343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2094ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CompareOperation FINAL : public Expression {
2095b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org public:
2096f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(CompareOperation)
209743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
209843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Token::Value op() const { return op_; }
209943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* left() const { return left_; }
210043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* right() const { return right_; }
210143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Type feedback information.
2103471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  TypeFeedbackId CompareOperationFeedbackId() const { return reuse(id()); }
21046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Type* combined_type() const { return combined_type_; }
21056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void set_combined_type(Type* type) { combined_type_ = type; }
2106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
210704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  // Match special cases.
210804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check);
210996a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org  bool IsLiteralCompareUndefined(Expression** expr, Isolate* isolate);
2110c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  bool IsLiteralCompareNull(Expression** expr);
211104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
2112b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
2113a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  CompareOperation(Zone* zone, Token::Value op, Expression* left,
2114a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                   Expression* right, int pos, IdGen* id_gen)
2115a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen),
2116b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        op_(op),
2117b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        left_(left),
2118b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        right_(right),
21196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        combined_type_(Type::None(zone)) {
2120e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(Token::IsCompareOp(op));
2121b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
2122b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
212343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
212443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Token::Value op_;
212543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* left_;
212643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* right_;
2127c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
21286d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Type* combined_type_;
212965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org};
213065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
213165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
2132ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Conditional FINAL : public Expression {
213343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
2134b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  DECLARE_NODE_TYPE(Conditional)
2135b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
2136b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Expression* condition() const { return condition_; }
2137b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Expression* then_expression() const { return then_expression_; }
2138b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Expression* else_expression() const { return else_expression_; }
2139b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
2140471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId ThenId() const { return then_id_; }
2141471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId ElseId() const { return else_id_; }
2142b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
2143b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
2144a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Conditional(Zone* zone, Expression* condition, Expression* then_expression,
2145a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org              Expression* else_expression, int position, IdGen* id_gen)
2146a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, position, id_gen),
2147717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org        condition_(condition),
214843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        then_expression_(then_expression),
21492356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org        else_expression_(else_expression),
2150a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        then_id_(id_gen->GetNextId()),
2151a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        else_id_(id_gen->GetNextId()) {}
21522356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
215343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
215443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* condition_;
215543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* then_expression_;
215643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* else_expression_;
2157471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId then_id_;
2158471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId else_id_;
215943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
216043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
216143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2162ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Assignment FINAL : public Expression {
216343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
2164f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(Assignment)
216543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2166f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; }
2167f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
216843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Token::Value binary_op() const;
216943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
217043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Token::Value op() const { return op_; }
217143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* target() const { return target_; }
217243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* value() const { return value_; }
2173a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  BinaryOperation* binary_operation() const { return binary_operation_; }
2174a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
217513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  // This check relies on the definition order of token in token.h.
217613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  bool is_compound() const { return op() > Token::ASSIGN; }
217743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2178471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  BailoutId AssignmentId() const { return assignment_id_; }
2179471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2180a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Type feedback information.
2181471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  TypeFeedbackId AssignmentFeedbackId() { return reuse(id()); }
2182ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsMonomorphic() OVERRIDE {
2183113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org    return receiver_types_.length() == 1;
2184113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org  }
21851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  bool IsUninitialized() { return is_uninitialized_; }
2186c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  bool HasNoTypeInformation() {
2187a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org    return is_uninitialized_;
2188c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  }
2189ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual SmallMapList* GetReceiverTypes() OVERRIDE {
219032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return &receiver_types_;
219132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
2192ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual KeyedAccessStoreMode GetStoreMode() OVERRIDE {
21937bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org    return store_mode_;
21947bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org  }
2195ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  void set_is_uninitialized(bool b) { is_uninitialized_ = b; }
2196ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  void set_store_mode(KeyedAccessStoreMode mode) { store_mode_ = mode; }
2197a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2198b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
2199a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Assignment(Zone* zone, Token::Value op, Expression* target, Expression* value,
2200a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org             int pos, IdGen* id_gen);
2201b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
2202b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  template<class Visitor>
22036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void Init(Zone* zone, AstNodeFactory<Visitor>* factory) {
2204e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(Token::IsAssignmentOp(op_));
2205b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    if (is_compound()) {
2206a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      binary_operation_ = factory->NewBinaryOperation(
2207a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org          binary_op(), target_, value_, position() + 1);
2208b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    }
2209b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
2210b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
221143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
221243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Token::Value op_;
221343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* target_;
221443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* value_;
2215a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  BinaryOperation* binary_operation_;
2216471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  const BailoutId assignment_id_;
2217a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
22181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  bool is_uninitialized_ : 1;
2219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  KeyedAccessStoreMode store_mode_ : 5;  // Windows treats as signed,
2220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org                                         // must have extra bit.
2221ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  SmallMapList receiver_types_;
222243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
222343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
222443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2225ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Yield FINAL : public Expression, public FeedbackSlotInterface {
2226f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org public:
2227f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  DECLARE_NODE_TYPE(Yield)
2228f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
222977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  enum Kind {
2230ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    kInitial,  // The initial yield that returns the unboxed generator object.
2231ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    kSuspend,  // A normal yield: { value: EXPRESSION, done: false }
2232ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    kDelegating,  // A yield*.
2233ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    kFinal        // A return: { value: EXPRESSION, done: true }
223477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  };
223577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org
2236e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Expression* generator_object() const { return generator_object_; }
2237f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Expression* expression() const { return expression_; }
223877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  Kind yield_kind() const { return yield_kind_; }
2239f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
22404e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  // Delegating yield surrounds the "yield" in a "try/catch".  This index
22414e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  // locates the catch handler in the handler table, and is equivalent to
22424e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  // TryCatchStatement::index().
22434e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  int index() const {
2244ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    DCHECK_EQ(kDelegating, yield_kind());
22454e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    return index_;
22464e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  }
22474e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  void set_index(int index) {
2248ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    DCHECK_EQ(kDelegating, yield_kind());
22494e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    index_ = index;
22504e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  }
22514e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
22529d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  // Type feedback information.
22539d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  virtual int ComputeFeedbackSlotCount() {
2254ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    return (FLAG_vector_ics && yield_kind() == kDelegating) ? 3 : 0;
22559d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
22569d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  virtual void SetFirstFeedbackSlot(int slot) {
22579d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    yield_first_feedback_slot_ = slot;
22589d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
22599d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
22609d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int KeyedLoadFeedbackSlot() {
2261e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(yield_first_feedback_slot_ != kInvalidFeedbackSlot);
22629d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    return yield_first_feedback_slot_;
22639d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
22649d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
22659d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int DoneFeedbackSlot() {
2266e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(yield_first_feedback_slot_ != kInvalidFeedbackSlot);
22679d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    return yield_first_feedback_slot_ + 1;
22689d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
22699d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
22709d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int ValueFeedbackSlot() {
2271e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(yield_first_feedback_slot_ != kInvalidFeedbackSlot);
22729d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    return yield_first_feedback_slot_ + 2;
22739d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
22749d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
2275f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org protected:
2276a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Yield(Zone* zone, Expression* generator_object, Expression* expression,
2277a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        Kind yield_kind, int pos, IdGen* id_gen)
2278a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen),
2279e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        generator_object_(generator_object),
2280f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        expression_(expression),
228177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org        yield_kind_(yield_kind),
22829d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org        index_(-1),
2283a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        yield_first_feedback_slot_(kInvalidFeedbackSlot) {}
2284f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
2285f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org private:
2286e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Expression* generator_object_;
2287f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Expression* expression_;
228877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  Kind yield_kind_;
22894e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  int index_;
22909d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int yield_first_feedback_slot_;
2291f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org};
2292f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
2293f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
2294ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Throw FINAL : public Expression {
229543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
2296f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(Throw)
2297f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
229843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* exception() const { return exception_; }
2299b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
2300b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
2301a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Throw(Zone* zone, Expression* exception, int pos, IdGen* id_gen)
2302a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen), exception_(exception) {}
230343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
230443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
230543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* exception_;
230643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
230743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
230843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2309ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass FunctionLiteral FINAL : public Expression {
231043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
2311dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  enum FunctionType {
23127c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org    ANONYMOUS_EXPRESSION,
23137c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org    NAMED_EXPRESSION,
23147c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org    DECLARATION
23157c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  };
23167c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
231756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  enum ParameterFlag {
231856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org    kNoDuplicateParameters = 0,
231956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org    kHasDuplicateParameters = 1
232056454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  };
232156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org
232256454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  enum IsFunctionFlag {
232356454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org    kGlobalOrEval,
232456454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org    kIsFunction
232556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  };
232656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org
2327471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  enum IsParenthesizedFlag {
2328471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    kIsParenthesized,
2329471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    kNotParenthesized
2330471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  };
2331471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2332dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org  enum ArityRestriction {
2333dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org    NORMAL_ARITY,
2334dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org    GETTER_ARITY,
2335dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org    SETTER_ARITY
2336dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org  };
2337dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org
2338f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(FunctionLiteral)
233943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
234008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Handle<String> name() const { return raw_name_->string(); }
234108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstRawString* raw_name() const { return raw_name_; }
23424a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  Scope* scope() const { return scope_; }
23434a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  ZoneList<Statement*>* body() const { return body_; }
234443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void set_function_token_position(int pos) { function_token_position_ = pos; }
234543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int function_token_position() const { return function_token_position_; }
2346394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  int start_position() const;
2347394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  int end_position() const;
234856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  int SourceSize() const { return end_position() - start_position(); }
2349c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  bool is_expression() const { return IsExpression::decode(bitfield_); }
2350c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  bool is_anonymous() const { return IsAnonymous::decode(bitfield_); }
2351486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  StrictMode strict_mode() const;
235243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
235343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int materialized_literal_count() { return materialized_literal_count_; }
235443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int expected_property_count() { return expected_property_count_; }
235504e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org  int handler_count() { return handler_count_; }
2356c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  int parameter_count() { return parameter_count_; }
235743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
235843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool AllowsLazyCompilation();
23595a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  bool AllowsLazyCompilationWithoutContext();
236043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23614610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org  void InitializeSharedInfo(Handle<Code> code);
23624610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org
2363b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  Handle<String> debug_name() const {
236408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    if (raw_name_ != NULL && !raw_name_->IsEmpty()) {
236508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org      return raw_name_->string();
236608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    }
2367b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org    return inferred_name();
2368b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  }
2369b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
237008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Handle<String> inferred_name() const {
237108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    if (!inferred_name_.is_null()) {
2372e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(raw_inferred_name_ == NULL);
237308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org      return inferred_name_;
237408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    }
237508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    if (raw_inferred_name_ != NULL) {
237608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org      return raw_inferred_name_->string();
237708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    }
237808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    UNREACHABLE();
237908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    return Handle<String>();
238008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  }
238108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
238208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  // Only one of {set_inferred_name, set_raw_inferred_name} should be called.
2383d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  void set_inferred_name(Handle<String> inferred_name) {
2384e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!inferred_name.is_null());
2385d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org    inferred_name_ = inferred_name;
2386e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(raw_inferred_name_== NULL || raw_inferred_name_->IsEmpty());
238708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    raw_inferred_name_ = NULL;
238808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  }
238908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
239008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  void set_raw_inferred_name(const AstString* raw_inferred_name) {
2391e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(raw_inferred_name != NULL);
239208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    raw_inferred_name_ = raw_inferred_name;
2393e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(inferred_name_.is_null());
239408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    inferred_name_ = Handle<String>();
2395d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  }
2396d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org
23974610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org  // shared_info may be null if it's not cached in full code.
23984610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org  Handle<SharedFunctionInfo> shared_info() { return shared_info_; }
23994610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org
2400c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  bool pretenure() { return Pretenure::decode(bitfield_); }
2401c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  void set_pretenure() { bitfield_ |= Pretenure::encode(true); }
240221b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org
2403c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  bool has_duplicate_parameters() {
2404c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    return HasDuplicateParameters::decode(bitfield_);
2405c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  }
24067b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
240756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  bool is_function() { return IsFunction::decode(bitfield_) == kIsFunction; }
240856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org
2409de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  // This is used as a heuristic on when to eagerly compile a function
2410de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  // literal. We consider the following constructs as hints that the
2411de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  // function will be called immediately:
2412de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  // - (function() { ... })();
2413de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  // - var x = function() { ... }();
2414471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  bool is_parenthesized() {
2415471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    return IsParenthesized::decode(bitfield_) == kIsParenthesized;
2416471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
2417de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  void set_parenthesized() {
2418de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org    bitfield_ = IsParenthesized::update(bitfield_, kIsParenthesized);
2419de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  }
2420471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
24212c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  FunctionKind kind() { return FunctionKindBits::decode(bitfield_); }
24222c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  bool is_arrow() {
24232c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    return IsArrowFunction(FunctionKindBits::decode(bitfield_));
24242c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  }
24252c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  bool is_generator() {
24262c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    return IsGeneratorFunction(FunctionKindBits::decode(bitfield_));
24272c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  }
24282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  bool is_concise_method() {
24292c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    return IsConciseMethod(FunctionKindBits::decode(bitfield_));
24302c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  }
2431f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
2432b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  int ast_node_count() { return ast_properties_.node_count(); }
2433b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  AstProperties::Flags* flags() { return ast_properties_.flags(); }
2434b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  void set_ast_properties(AstProperties* ast_properties) {
2435b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    ast_properties_ = *ast_properties;
2436b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
2437f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int slot_count() {
2438a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    return ast_properties_.feedback_slots();
2439f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
24402c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  bool dont_optimize() { return dont_optimize_reason_ != kNoReason; }
24412c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  BailoutReason dont_optimize_reason() { return dont_optimize_reason_; }
24422c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  void set_dont_optimize_reason(BailoutReason reason) {
24432c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org    dont_optimize_reason_ = reason;
24442c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  }
24452c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
2446b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
24479d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  FunctionLiteral(Zone* zone, const AstRawString* name,
24489d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                  AstValueFactory* ast_value_factory, Scope* scope,
24499d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                  ZoneList<Statement*>* body, int materialized_literal_count,
24509d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                  int expected_property_count, int handler_count,
24519d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                  int parameter_count, FunctionType function_type,
245256454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org                  ParameterFlag has_duplicate_parameters,
2453471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org                  IsFunctionFlag is_function,
24542c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                  IsParenthesizedFlag is_parenthesized, FunctionKind kind,
2455a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                  int position, IdGen* id_gen)
2456a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, position, id_gen),
245708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org        raw_name_(name),
2458b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        scope_(scope),
2459b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        body_(body),
246008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org        raw_inferred_name_(ast_value_factory->empty_string()),
24612c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org        dont_optimize_reason_(kNoReason),
2462b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        materialized_literal_count_(materialized_literal_count),
2463b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        expected_property_count_(expected_property_count),
2464b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        handler_count_(handler_count),
2465b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        parameter_count_(parameter_count),
2466b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org        function_token_position_(RelocInfo::kNoPosition) {
24679d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    bitfield_ = IsExpression::encode(function_type != DECLARATION) |
24689d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                IsAnonymous::encode(function_type == ANONYMOUS_EXPRESSION) |
24699d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                Pretenure::encode(false) |
24709d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                HasDuplicateParameters::encode(has_duplicate_parameters) |
24719d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                IsFunction::encode(is_function) |
24729d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                IsParenthesized::encode(is_parenthesized) |
24732c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                FunctionKindBits::encode(kind);
24742c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    DCHECK(IsValidFunctionKind(kind));
2475b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
2476b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
247743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
247808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstRawString* raw_name_;
247943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<String> name_;
24804610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org  Handle<SharedFunctionInfo> shared_info_;
248143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Scope* scope_;
248243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<Statement*>* body_;
248308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstString* raw_inferred_name_;
2484c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  Handle<String> inferred_name_;
2485b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  AstProperties ast_properties_;
24862c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  BailoutReason dont_optimize_reason_;
2487c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
248843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int materialized_literal_count_;
248943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int expected_property_count_;
249004e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org  int handler_count_;
2491c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  int parameter_count_;
249243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int function_token_position_;
2493c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
2494c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  unsigned bitfield_;
24952c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  class IsExpression : public BitField<bool, 0, 1> {};
24962c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  class IsAnonymous : public BitField<bool, 1, 1> {};
24972c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  class Pretenure : public BitField<bool, 2, 1> {};
24982c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  class HasDuplicateParameters : public BitField<ParameterFlag, 3, 1> {};
24992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  class IsFunction : public BitField<IsFunctionFlag, 4, 1> {};
25002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  class IsParenthesized : public BitField<IsParenthesizedFlag, 5, 1> {};
25012c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  class FunctionKindBits : public BitField<FunctionKind, 6, 3> {};
250243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
250343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
250443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2505a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgclass ClassLiteral FINAL : public Expression {
2506a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org public:
2507a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  typedef ObjectLiteralProperty Property;
2508a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
2509a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  DECLARE_NODE_TYPE(ClassLiteral)
2510a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
2511a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Handle<String> name() const { return raw_name_->string(); }
2512a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  const AstRawString* raw_name() const { return raw_name_; }
2513a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Expression* extends() const { return extends_; }
2514a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Expression* constructor() const { return constructor_; }
2515a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  ZoneList<Property*>* properties() const { return properties_; }
2516a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
2517a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org protected:
2518a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  ClassLiteral(Zone* zone, const AstRawString* name, Expression* extends,
2519a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org               Expression* constructor, ZoneList<Property*>* properties,
2520a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org               int position, IdGen* id_gen)
2521a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      : Expression(zone, position, id_gen),
2522a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        raw_name_(name),
2523a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        extends_(extends),
2524a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        constructor_(constructor),
2525a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        properties_(properties) {}
2526a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
2527a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org private:
2528a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  const AstRawString* raw_name_;
2529a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Expression* extends_;
2530a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Expression* constructor_;
2531a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  ZoneList<Property*>* properties_;
2532a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org};
2533a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
2534a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
2535ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass NativeFunctionLiteral FINAL : public Expression {
253643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
2537fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  DECLARE_NODE_TYPE(NativeFunctionLiteral)
2538f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org
253908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Handle<String> name() const { return name_->string(); }
2540fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  v8::Extension* extension() const { return extension_; }
2541b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
2542b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
254308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  NativeFunctionLiteral(Zone* zone, const AstRawString* name,
2544a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                        v8::Extension* extension, int pos, IdGen* id_gen)
2545a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen), name_(name), extension_(extension) {}
254643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
254743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
254808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  const AstRawString* name_;
2549fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  v8::Extension* extension_;
255043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
255143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
255243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2553ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ThisFunction FINAL : public Expression {
255443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
2555f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org  DECLARE_NODE_TYPE(ThisFunction)
2556b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
2557b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected:
2558a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  ThisFunction(Zone* zone, int pos, IdGen* id_gen)
2559a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen) {}
2560a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
2561a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
25625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
2563ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass SuperReference FINAL : public Expression {
25645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org public:
25655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  DECLARE_NODE_TYPE(SuperReference)
25665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
25675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  VariableProxy* this_var() const { return this_var_; }
25685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
25695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TypeFeedbackId HomeObjectFeedbackId() { return reuse(id()); }
25705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
25715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org protected:
2572a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  SuperReference(Zone* zone, VariableProxy* this_var, int pos, IdGen* id_gen)
2573a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : Expression(zone, pos, id_gen), this_var_(this_var) {
2574a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    DCHECK(this_var->is_this());
25755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
25765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
25775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  VariableProxy* this_var_;
25785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org};
25795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
25805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
258165a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org#undef DECLARE_NODE_TYPE
258265a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org
2583a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2584a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// ----------------------------------------------------------------------------
2585a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Regular expressions
2586a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2587a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
25883291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgclass RegExpVisitor BASE_EMBEDDED {
25893291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org public:
25903291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  virtual ~RegExpVisitor() { }
25913291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#define MAKE_CASE(Name)                                              \
25923291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  virtual void* Visit##Name(RegExp##Name*, void* data) = 0;
25933291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE)
25943291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#undef MAKE_CASE
25953291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org};
25963291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
25973291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
259832cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass RegExpTree : public ZoneObject {
2599a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
260037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  static const int kInfinity = kMaxInt;
260132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  virtual ~RegExpTree() {}
2602a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual void* Accept(RegExpVisitor* visitor, void* data) = 0;
2603a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
26048bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org                             RegExpNode* on_success) = 0;
2605a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual bool IsTextElement() { return false; }
26064a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  virtual bool IsAnchoredAtStart() { return false; }
26074a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  virtual bool IsAnchoredAtEnd() { return false; }
260837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  virtual int min_match() = 0;
260937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  virtual int max_match() = 0;
26103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Returns the interval of registers used for captures within this
26113291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // expression.
26123291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  virtual Interval CaptureRegisters() { return Interval::Empty(); }
26137028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  virtual void AppendToText(RegExpText* text, Zone* zone);
2614f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  OStream& Print(OStream& os, Zone* zone);  // NOLINT
2615a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#define MAKE_ASTYPE(Name)                                                  \
2616a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual RegExp##Name* As##Name();                                        \
2617a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual bool Is##Name();
2618a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  FOR_EACH_REG_EXP_TREE_TYPE(MAKE_ASTYPE)
2619a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#undef MAKE_ASTYPE
2620a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
2621a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2622a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2623ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpDisjunction FINAL : public RegExpTree {
2624a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
262537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  explicit RegExpDisjunction(ZoneList<RegExpTree*>* alternatives);
2626ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
2627a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2628ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                             RegExpNode* on_success) OVERRIDE;
2629ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual RegExpDisjunction* AsDisjunction() OVERRIDE;
2630ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual Interval CaptureRegisters() OVERRIDE;
2631ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsDisjunction() OVERRIDE;
2632ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsAnchoredAtStart() OVERRIDE;
2633ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsAnchoredAtEnd() OVERRIDE;
2634ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int min_match() OVERRIDE { return min_match_; }
2635ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int max_match() OVERRIDE { return max_match_; }
2636a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  ZoneList<RegExpTree*>* alternatives() { return alternatives_; }
2637a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
2638a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  ZoneList<RegExpTree*>* alternatives_;
263937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  int min_match_;
264037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  int max_match_;
2641a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
2642a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2643a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2644ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpAlternative FINAL : public RegExpTree {
2645a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
264637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  explicit RegExpAlternative(ZoneList<RegExpTree*>* nodes);
2647ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
2648a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2649ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                             RegExpNode* on_success) OVERRIDE;
2650ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual RegExpAlternative* AsAlternative() OVERRIDE;
2651ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual Interval CaptureRegisters() OVERRIDE;
2652ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsAlternative() OVERRIDE;
2653ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsAnchoredAtStart() OVERRIDE;
2654ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsAnchoredAtEnd() OVERRIDE;
2655ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int min_match() OVERRIDE { return min_match_; }
2656ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int max_match() OVERRIDE { return max_match_; }
2657a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  ZoneList<RegExpTree*>* nodes() { return nodes_; }
2658a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
2659a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  ZoneList<RegExpTree*>* nodes_;
266037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  int min_match_;
266137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  int max_match_;
2662a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
2663a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2664a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2665ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpAssertion FINAL : public RegExpTree {
2666a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
2667dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  enum AssertionType {
2668a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    START_OF_LINE,
2669a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    START_OF_INPUT,
2670a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    END_OF_LINE,
2671a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    END_OF_INPUT,
2672a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    BOUNDARY,
2673a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    NON_BOUNDARY
2674a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  };
2675dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  explicit RegExpAssertion(AssertionType type) : assertion_type_(type) { }
2676ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
2677a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2678ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                             RegExpNode* on_success) OVERRIDE;
2679ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual RegExpAssertion* AsAssertion() OVERRIDE;
2680ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsAssertion() OVERRIDE;
2681ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsAnchoredAtStart() OVERRIDE;
2682ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsAnchoredAtEnd() OVERRIDE;
2683ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int min_match() OVERRIDE { return 0; }
2684ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int max_match() OVERRIDE { return 0; }
2685dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  AssertionType assertion_type() { return assertion_type_; }
2686a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
2687dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  AssertionType assertion_type_;
2688a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
2689a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2690a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2691ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CharacterSet FINAL BASE_EMBEDDED {
269237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com public:
269337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  explicit CharacterSet(uc16 standard_set_type)
269437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      : ranges_(NULL),
269537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        standard_set_type_(standard_set_type) {}
269637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  explicit CharacterSet(ZoneList<CharacterRange>* ranges)
269737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      : ranges_(ranges),
269837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        standard_set_type_(0) {}
26997028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  ZoneList<CharacterRange>* ranges(Zone* zone);
270037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  uc16 standard_set_type() { return standard_set_type_; }
270137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  void set_standard_set_type(uc16 special_set_type) {
270237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    standard_set_type_ = special_set_type;
270337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
270437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  bool is_standard() { return standard_set_type_ != 0; }
27050c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  void Canonicalize();
270637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com private:
270737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  ZoneList<CharacterRange>* ranges_;
270837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // If non-zero, the value represents a standard set (e.g., all whitespace
270937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // characters) without having to expand the ranges.
271037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  uc16 standard_set_type_;
271137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
271237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
271337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
2714ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpCharacterClass FINAL : public RegExpTree {
2715a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
2716a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  RegExpCharacterClass(ZoneList<CharacterRange>* ranges, bool is_negated)
271737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      : set_(ranges),
2718a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org        is_negated_(is_negated) { }
2719a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  explicit RegExpCharacterClass(uc16 type)
272037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      : set_(type),
272137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        is_negated_(false) { }
2722ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
2723a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2724ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                             RegExpNode* on_success) OVERRIDE;
2725ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual RegExpCharacterClass* AsCharacterClass() OVERRIDE;
2726ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsCharacterClass() OVERRIDE;
2727ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsTextElement() OVERRIDE { return true; }
2728ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int min_match() OVERRIDE { return 1; }
2729ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int max_match() OVERRIDE { return 1; }
2730ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void AppendToText(RegExpText* text, Zone* zone) OVERRIDE;
273137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  CharacterSet character_set() { return set_; }
273237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // TODO(lrn): Remove need for complex version if is_standard that
273337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // recognizes a mangled standard set and just do { return set_.is_special(); }
27347028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  bool is_standard(Zone* zone);
273537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Returns a value representing the standard character set if is_standard()
273637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // returns true.
273737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Currently used values are:
273837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // s : unicode whitespace
273937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // S : unicode non-whitespace
274037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // w : ASCII word character (digit, letter, underscore)
274137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // W : non-ASCII word character
274237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // d : ASCII digit
274337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // D : non-ASCII digit
2744ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // . : non-unicode non-newline
274537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // * : All characters
274637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  uc16 standard_type() { return set_.standard_set_type(); }
27477028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  ZoneList<CharacterRange>* ranges(Zone* zone) { return set_.ranges(zone); }
2748a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  bool is_negated() { return is_negated_; }
2749e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
2750a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
275137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  CharacterSet set_;
2752a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  bool is_negated_;
2753a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
2754a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2755a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2756ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpAtom FINAL : public RegExpTree {
2757a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
2758a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  explicit RegExpAtom(Vector<const uc16> data) : data_(data) { }
2759ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
2760a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2761ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                             RegExpNode* on_success) OVERRIDE;
2762ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual RegExpAtom* AsAtom() OVERRIDE;
2763ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsAtom() OVERRIDE;
2764ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsTextElement() OVERRIDE { return true; }
2765ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int min_match() OVERRIDE { return data_.length(); }
2766ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int max_match() OVERRIDE { return data_.length(); }
2767ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void AppendToText(RegExpText* text, Zone* zone) OVERRIDE;
2768a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  Vector<const uc16> data() { return data_; }
276937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  int length() { return data_.length(); }
2770a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
2771a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  Vector<const uc16> data_;
2772a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
2773a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2774a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2775ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpText FINAL : public RegExpTree {
277637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com public:
27777028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  explicit RegExpText(Zone* zone) : elements_(2, zone), length_(0) {}
2778ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
277937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2780ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                             RegExpNode* on_success) OVERRIDE;
2781ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual RegExpText* AsText() OVERRIDE;
2782ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsText() OVERRIDE;
2783ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsTextElement() OVERRIDE { return true; }
2784ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int min_match() OVERRIDE { return length_; }
2785ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int max_match() OVERRIDE { return length_; }
2786ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void AppendToText(RegExpText* text, Zone* zone) OVERRIDE;
27877028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  void AddElement(TextElement elm, Zone* zone)  {
27887028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    elements_.Add(elm, zone);
278937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    length_ += elm.length();
27903cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  }
279137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  ZoneList<TextElement>* elements() { return &elements_; }
279237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com private:
279337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  ZoneList<TextElement> elements_;
279437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  int length_;
279537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
279637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
279737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
2798ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpQuantifier FINAL : public RegExpTree {
2799a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
2800dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  enum QuantifierType { GREEDY, NON_GREEDY, POSSESSIVE };
2801dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  RegExpQuantifier(int min, int max, QuantifierType type, RegExpTree* body)
28020c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org      : body_(body),
28030c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org        min_(min),
2804a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org        max_(max),
28050c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org        min_match_(min * body->min_match()),
2806dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org        quantifier_type_(type) {
280737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (max > 0 && body->max_match() > kInfinity / max) {
280837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      max_match_ = kInfinity;
280937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    } else {
281037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      max_match_ = max * body->max_match();
281137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
281237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
2813ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
2814a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2815ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                             RegExpNode* on_success) OVERRIDE;
2816a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static RegExpNode* ToNode(int min,
2817a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org                            int max,
2818a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org                            bool is_greedy,
2819a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org                            RegExpTree* body,
2820a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org                            RegExpCompiler* compiler,
2821245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org                            RegExpNode* on_success,
2822245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org                            bool not_at_start = false);
2823ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual RegExpQuantifier* AsQuantifier() OVERRIDE;
2824ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual Interval CaptureRegisters() OVERRIDE;
2825ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsQuantifier() OVERRIDE;
2826ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int min_match() OVERRIDE { return min_match_; }
2827ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int max_match() OVERRIDE { return max_match_; }
2828a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  int min() { return min_; }
2829a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  int max() { return max_; }
2830dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  bool is_possessive() { return quantifier_type_ == POSSESSIVE; }
2831dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  bool is_non_greedy() { return quantifier_type_ == NON_GREEDY; }
2832dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  bool is_greedy() { return quantifier_type_ == GREEDY; }
2833a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  RegExpTree* body() { return body_; }
2834e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
2835a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
28360c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  RegExpTree* body_;
2837a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  int min_;
2838a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  int max_;
283937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  int min_match_;
284037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  int max_match_;
2841dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  QuantifierType quantifier_type_;
2842a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
2843a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2844a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2845ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpCapture FINAL : public RegExpTree {
2846a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
2847a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  explicit RegExpCapture(RegExpTree* body, int index)
284886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org      : body_(body), index_(index) { }
2849ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
2850a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2851ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                             RegExpNode* on_success) OVERRIDE;
2852a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static RegExpNode* ToNode(RegExpTree* body,
2853a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org                            int index,
2854a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org                            RegExpCompiler* compiler,
28558bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org                            RegExpNode* on_success);
2856ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual RegExpCapture* AsCapture() OVERRIDE;
2857ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsAnchoredAtStart() OVERRIDE;
2858ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsAnchoredAtEnd() OVERRIDE;
2859ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual Interval CaptureRegisters() OVERRIDE;
2860ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsCapture() OVERRIDE;
2861ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int min_match() OVERRIDE { return body_->min_match(); }
2862ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int max_match() OVERRIDE { return body_->max_match(); }
2863a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  RegExpTree* body() { return body_; }
2864a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  int index() { return index_; }
2865a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static int StartRegister(int index) { return index * 2; }
2866a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static int EndRegister(int index) { return index * 2 + 1; }
2867e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
2868a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
2869a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  RegExpTree* body_;
2870a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  int index_;
2871a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
2872a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2873a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2874ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpLookahead FINAL : public RegExpTree {
2875a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
2876ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  RegExpLookahead(RegExpTree* body,
2877ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org                  bool is_positive,
2878ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org                  int capture_count,
2879ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org                  int capture_from)
2880a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      : body_(body),
2881ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        is_positive_(is_positive),
2882ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        capture_count_(capture_count),
2883ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        capture_from_(capture_from) { }
2884ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2885ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
2886a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2887ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                             RegExpNode* on_success) OVERRIDE;
2888ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual RegExpLookahead* AsLookahead() OVERRIDE;
2889ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual Interval CaptureRegisters() OVERRIDE;
2890ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsLookahead() OVERRIDE;
2891ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsAnchoredAtStart() OVERRIDE;
2892ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int min_match() OVERRIDE { return 0; }
2893ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int max_match() OVERRIDE { return 0; }
2894a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  RegExpTree* body() { return body_; }
2895a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  bool is_positive() { return is_positive_; }
2896ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  int capture_count() { return capture_count_; }
2897ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  int capture_from() { return capture_from_; }
2898e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
2899a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
2900a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  RegExpTree* body_;
2901a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  bool is_positive_;
2902ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  int capture_count_;
2903ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  int capture_from_;
2904a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
2905a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2906a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2907ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpBackReference FINAL : public RegExpTree {
2908a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
2909a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  explicit RegExpBackReference(RegExpCapture* capture)
2910a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      : capture_(capture) { }
2911ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
2912a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2913ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                             RegExpNode* on_success) OVERRIDE;
2914ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual RegExpBackReference* AsBackReference() OVERRIDE;
2915ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsBackReference() OVERRIDE;
2916ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int min_match() OVERRIDE { return 0; }
2917ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int max_match() OVERRIDE { return capture_->max_match(); }
2918a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  int index() { return capture_->index(); }
2919a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  RegExpCapture* capture() { return capture_; }
2920a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
2921a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  RegExpCapture* capture_;
2922a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
2923a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2924a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2925ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpEmpty FINAL : public RegExpTree {
2926a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
2927a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  RegExpEmpty() { }
2928ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
2929a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2930ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                             RegExpNode* on_success) OVERRIDE;
2931ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual RegExpEmpty* AsEmpty() OVERRIDE;
2932ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsEmpty() OVERRIDE;
2933ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int min_match() OVERRIDE { return 0; }
2934ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int max_match() OVERRIDE { return 0; }
29350ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  static RegExpEmpty* GetInstance() {
29360ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    static RegExpEmpty* instance = ::new RegExpEmpty();
29370ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    return instance;
29380ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  }
2939a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
2940a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2941a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
294243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------
2943bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// Out-of-line inline constructors (to side-step cyclic dependencies).
2944bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
29456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orginline ModuleVariable::ModuleVariable(Zone* zone, VariableProxy* proxy, int pos)
29466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    : Module(zone, proxy->interface(), pos),
2947bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com      proxy_(proxy) {
2948bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com}
2949bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
2950bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
2951bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// ----------------------------------------------------------------------------
295243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Basic visitor
295343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - leaf node visitors are abstract.
295443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2955a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgclass AstVisitor BASE_EMBEDDED {
295643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
2957a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  AstVisitor() {}
295832cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  virtual ~AstVisitor() {}
295943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
296025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  // Stack overflow check and dynamic dispatch.
2961a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  virtual void Visit(AstNode* node) = 0;
296243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
296325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  // Iteration left-to-right.
29649d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  virtual void VisitDeclarations(ZoneList<Declaration*>* declarations);
296543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual void VisitStatements(ZoneList<Statement*>* statements);
296643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual void VisitExpressions(ZoneList<Expression*>* expressions);
296743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2968a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Individual AST nodes.
296943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define DEF_VISIT(type)                         \
297043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual void Visit##type(type* node) = 0;
29710b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  AST_NODE_LIST(DEF_VISIT)
297243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef DEF_VISIT
2973a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org};
297443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2975ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2976a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org#define DEFINE_AST_VISITOR_SUBCLASS_MEMBERS()                       \
2977a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgpublic:                                                             \
2978ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void Visit(AstNode* node) FINAL OVERRIDE {          \
2979a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    if (!CheckStackOverflow()) node->Accept(this);                  \
2980a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }                                                                 \
2981a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org                                                                    \
2982a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  void SetStackOverflow() { stack_overflow_ = true; }               \
2983a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  void ClearStackOverflow() { stack_overflow_ = false; }            \
2984a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  bool HasStackOverflow() const { return stack_overflow_; }         \
2985a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org                                                                    \
2986a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  bool CheckStackOverflow() {                                       \
2987a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    if (stack_overflow_) return true;                               \
29886d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    StackLimitCheck check(zone_->isolate());                        \
2989a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    if (!check.HasOverflowed()) return false;                       \
2990a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    return (stack_overflow_ = true);                                \
2991a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }                                                                 \
2992a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org                                                                    \
2993a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgprivate:                                                            \
29946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void InitializeAstVisitor(Zone* zone) {                           \
29956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    zone_ = zone;                                                   \
2996a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    stack_overflow_ = false;                                        \
2997a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }                                                                 \
29986d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Zone* zone() { return zone_; }                                    \
29996d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Isolate* isolate() { return zone_->isolate(); }                   \
3000a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org                                                                    \
30016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Zone* zone_;                                                      \
3002a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  bool stack_overflow_
300343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3004ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
3005b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org// ----------------------------------------------------------------------------
3006b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org// Construction time visitor.
3007b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3008b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgclass AstConstructionVisitor BASE_EMBEDDED {
3009b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org public:
30109e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  AstConstructionVisitor()
30119e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org      : dont_crankshaft_reason_(kNoReason), dont_turbofan_reason_(kNoReason) {}
3012b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3013b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  AstProperties* ast_properties() { return &properties_; }
30149e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  BailoutReason dont_optimize_reason() {
30159e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    if (dont_turbofan_reason_ != kNoReason) {
30169e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org      return dont_turbofan_reason_;
30179e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    } else {
30189e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org      return dont_crankshaft_reason_;
30199e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    }
30209e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  }
3021b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3022b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org private:
3023b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  template<class> friend class AstNodeFactory;
3024b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3025b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  // Node visitors.
3026b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#define DEF_VISIT(type) \
3027b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  void Visit##type(type* node);
3028b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  AST_NODE_LIST(DEF_VISIT)
3029b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#undef DEF_VISIT
3030b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3031b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  void increase_node_count() { properties_.add_node_count(1); }
3032b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  void add_flag(AstPropertiesFlag flag) { properties_.flags()->Add(flag); }
30339e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  void set_dont_crankshaft_reason(BailoutReason reason) {
30349e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    dont_crankshaft_reason_ = reason;
30359e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  }
30369e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  void set_dont_turbofan_reason(BailoutReason reason) {
30379e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    dont_turbofan_reason_ = reason;
30382c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  }
3039b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3040f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  void add_slot_node(FeedbackSlotInterface* slot_node) {
3041a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    int count = slot_node->ComputeFeedbackSlotCount();
3042a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    if (count > 0) {
3043a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      slot_node->SetFirstFeedbackSlot(properties_.feedback_slots());
3044a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      properties_.increase_feedback_slots(count);
3045a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    }
3046f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
3047f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
3048b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  AstProperties properties_;
30499e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  BailoutReason dont_crankshaft_reason_;
30509e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  BailoutReason dont_turbofan_reason_;
3051b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org};
3052b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3053b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3054b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgclass AstNullVisitor BASE_EMBEDDED {
3055b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org public:
3056b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  // Node visitors.
3057b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#define DEF_VISIT(type) \
3058b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  void Visit##type(type* node) {}
3059b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  AST_NODE_LIST(DEF_VISIT)
3060b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#undef DEF_VISIT
3061b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org};
3062b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3063b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3064b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3065b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org// ----------------------------------------------------------------------------
3066b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org// AstNode factory
3067b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3068b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgtemplate<class Visitor>
3069ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass AstNodeFactory FINAL BASE_EMBEDDED {
3070b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org public:
3071a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  AstNodeFactory(Zone* zone, AstValueFactory* ast_value_factory,
3072a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                 AstNode::IdGen* id_gen)
3073a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : zone_(zone), ast_value_factory_(ast_value_factory), id_gen_(id_gen) {}
3074b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3075b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Visitor* visitor() { return &visitor_; }
3076b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3077b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#define VISIT_AND_RETURN(NodeType, node) \
3078b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  visitor_.Visit##NodeType((node)); \
3079b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  return node;
3080b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
308178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  VariableDeclaration* NewVariableDeclaration(VariableProxy* proxy,
308278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org                                              VariableMode mode,
3083a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                              Scope* scope,
3084a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                              int pos) {
308578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org    VariableDeclaration* decl =
30866d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        new(zone_) VariableDeclaration(zone_, proxy, mode, scope, pos);
308778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org    VISIT_AND_RETURN(VariableDeclaration, decl)
308878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  }
308978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
3090812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  FunctionDeclaration* NewFunctionDeclaration(VariableProxy* proxy,
3091812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                              VariableMode mode,
3092812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                              FunctionLiteral* fun,
3093a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                              Scope* scope,
3094a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                              int pos) {
3095812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    FunctionDeclaration* decl =
30966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        new(zone_) FunctionDeclaration(zone_, proxy, mode, fun, scope, pos);
3097812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    VISIT_AND_RETURN(FunctionDeclaration, decl)
3098812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
3099812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
310078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  ModuleDeclaration* NewModuleDeclaration(VariableProxy* proxy,
310178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org                                          Module* module,
3102a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                          Scope* scope,
3103a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                          int pos) {
310478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org    ModuleDeclaration* decl =
31056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        new(zone_) ModuleDeclaration(zone_, proxy, module, scope, pos);
310678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org    VISIT_AND_RETURN(ModuleDeclaration, decl)
310778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  }
310878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
3109812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  ImportDeclaration* NewImportDeclaration(VariableProxy* proxy,
3110812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                          Module* module,
3111a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                          Scope* scope,
3112a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                          int pos) {
3113812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    ImportDeclaration* decl =
31146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        new(zone_) ImportDeclaration(zone_, proxy, module, scope, pos);
3115812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    VISIT_AND_RETURN(ImportDeclaration, decl)
3116812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
3117812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
3118812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  ExportDeclaration* NewExportDeclaration(VariableProxy* proxy,
3119a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                          Scope* scope,
3120a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                          int pos) {
3121812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    ExportDeclaration* decl =
31226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        new(zone_) ExportDeclaration(zone_, proxy, scope, pos);
3123812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    VISIT_AND_RETURN(ExportDeclaration, decl)
3124812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
3125812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
3126a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ModuleLiteral* NewModuleLiteral(Block* body, Interface* interface, int pos) {
31276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    ModuleLiteral* module =
31286d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        new(zone_) ModuleLiteral(zone_, body, interface, pos);
312978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org    VISIT_AND_RETURN(ModuleLiteral, module)
313078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  }
313178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
3132a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ModuleVariable* NewModuleVariable(VariableProxy* proxy, int pos) {
31336d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    ModuleVariable* module = new(zone_) ModuleVariable(zone_, proxy, pos);
3134f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org    VISIT_AND_RETURN(ModuleVariable, module)
313578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  }
313678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
313708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  ModulePath* NewModulePath(Module* origin, const AstRawString* name, int pos) {
313808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    ModulePath* module = new (zone_) ModulePath(zone_, origin, name, pos);
3139f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org    VISIT_AND_RETURN(ModulePath, module)
314078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  }
314178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
3142a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ModuleUrl* NewModuleUrl(Handle<String> url, int pos) {
31436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    ModuleUrl* module = new(zone_) ModuleUrl(zone_, url, pos);
3144f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org    VISIT_AND_RETURN(ModuleUrl, module)
314578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  }
314678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
314708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Block* NewBlock(ZoneList<const AstRawString*>* labels,
3148b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                  int capacity,
3149a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                  bool is_initializer_block,
3150a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                  int pos) {
3151a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Block* block = new (zone_)
3152a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        Block(zone_, labels, capacity, is_initializer_block, pos, id_gen_);
3153b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(Block, block)
3154b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3155b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3156a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org#define STATEMENT_WITH_LABELS(NodeType)                                     \
315708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  NodeType* New##NodeType(ZoneList<const AstRawString*>* labels, int pos) { \
3158a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    NodeType* stmt = new (zone_) NodeType(zone_, labels, pos, id_gen_);     \
3159a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    VISIT_AND_RETURN(NodeType, stmt);                                       \
3160b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3161b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  STATEMENT_WITH_LABELS(DoWhileStatement)
3162b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  STATEMENT_WITH_LABELS(WhileStatement)
3163b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  STATEMENT_WITH_LABELS(ForStatement)
3164b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  STATEMENT_WITH_LABELS(SwitchStatement)
3165b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#undef STATEMENT_WITH_LABELS
3166b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
31671fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  ForEachStatement* NewForEachStatement(ForEachStatement::VisitMode visit_mode,
316808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org                                        ZoneList<const AstRawString*>* labels,
3169a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                        int pos) {
31701fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    switch (visit_mode) {
31711fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      case ForEachStatement::ENUMERATE: {
3172a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        ForInStatement* stmt =
3173a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org            new (zone_) ForInStatement(zone_, labels, pos, id_gen_);
31741fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org        VISIT_AND_RETURN(ForInStatement, stmt);
31751fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      }
31761fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      case ForEachStatement::ITERATE: {
3177a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        ForOfStatement* stmt =
3178a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org            new (zone_) ForOfStatement(zone_, labels, pos, id_gen_);
31791fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org        VISIT_AND_RETURN(ForOfStatement, stmt);
31801fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      }
31811fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    }
31821fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    UNREACHABLE();
31831fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    return NULL;
31841fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
31851fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
3186a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ModuleStatement* NewModuleStatement(
3187a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      VariableProxy* proxy, Block* body, int pos) {
31886d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    ModuleStatement* stmt = new(zone_) ModuleStatement(zone_, proxy, body, pos);
31898e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    VISIT_AND_RETURN(ModuleStatement, stmt)
31908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  }
31918e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
3192a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ExpressionStatement* NewExpressionStatement(Expression* expression, int pos) {
31936d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    ExpressionStatement* stmt =
31946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        new(zone_) ExpressionStatement(zone_, expression, pos);
3195b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(ExpressionStatement, stmt)
3196b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3197b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3198a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ContinueStatement* NewContinueStatement(IterationStatement* target, int pos) {
31996d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    ContinueStatement* stmt = new(zone_) ContinueStatement(zone_, target, pos);
3200b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(ContinueStatement, stmt)
3201b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3202b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3203a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  BreakStatement* NewBreakStatement(BreakableStatement* target, int pos) {
32046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    BreakStatement* stmt = new(zone_) BreakStatement(zone_, target, pos);
3205b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(BreakStatement, stmt)
3206b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3207b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3208a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ReturnStatement* NewReturnStatement(Expression* expression, int pos) {
32096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    ReturnStatement* stmt = new(zone_) ReturnStatement(zone_, expression, pos);
3210b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(ReturnStatement, stmt)
3211b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3212b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3213ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  WithStatement* NewWithStatement(Scope* scope,
3214ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org                                  Expression* expression,
3215a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                  Statement* statement,
3216a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                  int pos) {
3217ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    WithStatement* stmt = new(zone_) WithStatement(
32186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        zone_, scope, expression, statement, pos);
3219b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(WithStatement, stmt)
3220b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3221b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3222b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  IfStatement* NewIfStatement(Expression* condition,
3223b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                              Statement* then_statement,
3224a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                              Statement* else_statement,
3225a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                              int pos) {
3226a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    IfStatement* stmt = new (zone_) IfStatement(
3227a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        zone_, condition, then_statement, else_statement, pos, id_gen_);
3228b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(IfStatement, stmt)
3229b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3230b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3231b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  TryCatchStatement* NewTryCatchStatement(int index,
3232b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                          Block* try_block,
3233b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                          Scope* scope,
3234b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                          Variable* variable,
3235a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                          Block* catch_block,
3236a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                          int pos) {
3237b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    TryCatchStatement* stmt = new(zone_) TryCatchStatement(
32386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        zone_, index, try_block, scope, variable, catch_block, pos);
3239b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(TryCatchStatement, stmt)
3240b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3241b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3242b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  TryFinallyStatement* NewTryFinallyStatement(int index,
3243b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                              Block* try_block,
3244a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                              Block* finally_block,
3245a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                              int pos) {
32466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    TryFinallyStatement* stmt = new(zone_) TryFinallyStatement(
32476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        zone_, index, try_block, finally_block, pos);
3248b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(TryFinallyStatement, stmt)
3249b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3250b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3251a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  DebuggerStatement* NewDebuggerStatement(int pos) {
3252a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    DebuggerStatement* stmt =
3253a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) DebuggerStatement(zone_, pos, id_gen_);
3254b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(DebuggerStatement, stmt)
3255b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3256b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3257a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  EmptyStatement* NewEmptyStatement(int pos) {
32586d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    return new(zone_) EmptyStatement(zone_, pos);
3259a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  }
3260a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
3261a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  CaseClause* NewCaseClause(
3262a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      Expression* label, ZoneList<Statement*>* statements, int pos) {
3263a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    CaseClause* clause =
3264a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) CaseClause(zone_, label, statements, pos, id_gen_);
3265a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    VISIT_AND_RETURN(CaseClause, clause)
3266b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3267b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
326808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Literal* NewStringLiteral(const AstRawString* string, int pos) {
3269a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Literal* lit = new (zone_)
3270a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        Literal(zone_, ast_value_factory_->NewString(string), pos, id_gen_);
327108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    VISIT_AND_RETURN(Literal, lit)
327208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  }
327308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
327408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  // A JavaScript symbol (ECMA-262 edition 6).
327508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Literal* NewSymbolLiteral(const char* name, int pos) {
3276a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Literal* lit = new (zone_)
3277a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        Literal(zone_, ast_value_factory_->NewSymbol(name), pos, id_gen_);
3278b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(Literal, lit)
3279b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3280b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3281a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  Literal* NewNumberLiteral(double number, int pos) {
328208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    Literal* lit = new (zone_)
3283a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        Literal(zone_, ast_value_factory_->NewNumber(number), pos, id_gen_);
328408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    VISIT_AND_RETURN(Literal, lit)
328508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  }
328608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
328708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Literal* NewSmiLiteral(int number, int pos) {
3288a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Literal* lit = new (zone_)
3289a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        Literal(zone_, ast_value_factory_->NewSmi(number), pos, id_gen_);
329008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    VISIT_AND_RETURN(Literal, lit)
329108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  }
329208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
329308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Literal* NewBooleanLiteral(bool b, int pos) {
3294a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Literal* lit = new (zone_)
3295a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        Literal(zone_, ast_value_factory_->NewBoolean(b), pos, id_gen_);
329608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    VISIT_AND_RETURN(Literal, lit)
329708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  }
329808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
329908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Literal* NewStringListLiteral(ZoneList<const AstRawString*>* strings,
330008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org                                int pos) {
3301a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Literal* lit = new (zone_) Literal(
3302a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        zone_, ast_value_factory_->NewStringList(strings), pos, id_gen_);
330308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    VISIT_AND_RETURN(Literal, lit)
330408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  }
330508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
330608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Literal* NewNullLiteral(int pos) {
330708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    Literal* lit =
3308a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) Literal(zone_, ast_value_factory_->NewNull(), pos, id_gen_);
330908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    VISIT_AND_RETURN(Literal, lit)
331008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  }
331108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
331208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Literal* NewUndefinedLiteral(int pos) {
3313a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Literal* lit = new (zone_)
3314a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        Literal(zone_, ast_value_factory_->NewUndefined(), pos, id_gen_);
331508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    VISIT_AND_RETURN(Literal, lit)
331608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  }
331708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
331808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  Literal* NewTheHoleLiteral(int pos) {
3319a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Literal* lit = new (zone_)
3320a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        Literal(zone_, ast_value_factory_->NewTheHole(), pos, id_gen_);
332108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    VISIT_AND_RETURN(Literal, lit)
3322b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3323b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3324b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  ObjectLiteral* NewObjectLiteral(
3325b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org      ZoneList<ObjectLiteral::Property*>* properties,
3326b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org      int literal_index,
3327e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      int boilerplate_properties,
3328a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      bool has_function,
3329a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      int pos) {
3330a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    ObjectLiteral* lit = new (zone_)
3331a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        ObjectLiteral(zone_, properties, literal_index, boilerplate_properties,
3332a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                      has_function, pos, id_gen_);
3333b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(ObjectLiteral, lit)
3334b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3335b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
33366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ObjectLiteral::Property* NewObjectLiteralProperty(Literal* key,
3337a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                                    Expression* value,
3338a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                                    bool is_static) {
3339a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    return new (zone_) ObjectLiteral::Property(zone_, ast_value_factory_, key,
3340a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                               value, is_static);
33416d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
33426d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
3343b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  ObjectLiteral::Property* NewObjectLiteralProperty(bool is_getter,
3344a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                                    FunctionLiteral* value,
3345a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                                    int pos, bool is_static) {
3346b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    ObjectLiteral::Property* prop =
3347a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        new (zone_) ObjectLiteral::Property(zone_, is_getter, value, is_static);
334808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    prop->set_key(NewStringLiteral(value->raw_name(), pos));
3349b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    return prop;  // Not an AST node, will not be visited.
3350b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3351b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
335208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  RegExpLiteral* NewRegExpLiteral(const AstRawString* pattern,
335308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org                                  const AstRawString* flags,
3354a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                  int literal_index,
3355a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                  int pos) {
3356a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    RegExpLiteral* lit = new (zone_)
3357a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        RegExpLiteral(zone_, pattern, flags, literal_index, pos, id_gen_);
3358b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(RegExpLiteral, lit);
3359b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3360b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3361e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  ArrayLiteral* NewArrayLiteral(ZoneList<Expression*>* values,
3362b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                int literal_index,
3363a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                int pos) {
3364a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    ArrayLiteral* lit =
3365a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) ArrayLiteral(zone_, values, literal_index, pos, id_gen_);
3366b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(ArrayLiteral, lit)
3367b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3368b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3369a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  VariableProxy* NewVariableProxy(Variable* var,
3370a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                                  int pos = RelocInfo::kNoPosition) {
3371a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    VariableProxy* proxy = new (zone_) VariableProxy(zone_, var, pos, id_gen_);
3372b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(VariableProxy, proxy)
3373b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3374b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
337508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  VariableProxy* NewVariableProxy(const AstRawString* name,
3376b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                  bool is_this,
337728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org                                  Interface* interface = Interface::NewValue(),
337828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org                                  int position = RelocInfo::kNoPosition) {
3379a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    VariableProxy* proxy = new (zone_)
3380a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        VariableProxy(zone_, name, is_this, interface, position, id_gen_);
3381b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(VariableProxy, proxy)
3382b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3383b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3384b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Property* NewProperty(Expression* obj, Expression* key, int pos) {
3385a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Property* prop = new (zone_) Property(zone_, obj, key, pos, id_gen_);
3386b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(Property, prop)
3387b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3388b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3389b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Call* NewCall(Expression* expression,
3390b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                ZoneList<Expression*>* arguments,
3391b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                int pos) {
3392a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Call* call = new (zone_) Call(zone_, expression, arguments, pos, id_gen_);
3393b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(Call, call)
3394b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3395b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3396b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  CallNew* NewCallNew(Expression* expression,
3397b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                      ZoneList<Expression*>* arguments,
3398b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                      int pos) {
3399a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    CallNew* call =
3400a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) CallNew(zone_, expression, arguments, pos, id_gen_);
3401b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(CallNew, call)
3402b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3403b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
340408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  CallRuntime* NewCallRuntime(const AstRawString* name,
3405b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                              const Runtime::Function* function,
3406a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                              ZoneList<Expression*>* arguments,
3407a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                              int pos) {
3408b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    CallRuntime* call =
3409a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) CallRuntime(zone_, name, function, arguments, pos, id_gen_);
3410b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(CallRuntime, call)
3411b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3412b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3413b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  UnaryOperation* NewUnaryOperation(Token::Value op,
3414b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                    Expression* expression,
3415b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                    int pos) {
3416b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    UnaryOperation* node =
3417a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) UnaryOperation(zone_, op, expression, pos, id_gen_);
3418b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(UnaryOperation, node)
3419b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3420b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3421b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  BinaryOperation* NewBinaryOperation(Token::Value op,
3422b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                      Expression* left,
3423b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                      Expression* right,
3424b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                      int pos) {
3425b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    BinaryOperation* node =
3426a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) BinaryOperation(zone_, op, left, right, pos, id_gen_);
3427b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(BinaryOperation, node)
3428b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3429b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3430b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  CountOperation* NewCountOperation(Token::Value op,
3431b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                    bool is_prefix,
3432b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                    Expression* expr,
3433b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                    int pos) {
3434b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    CountOperation* node =
3435a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) CountOperation(zone_, op, is_prefix, expr, pos, id_gen_);
3436b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(CountOperation, node)
3437b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3438b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3439b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  CompareOperation* NewCompareOperation(Token::Value op,
3440b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                        Expression* left,
3441b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                        Expression* right,
3442b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                                        int pos) {
3443b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    CompareOperation* node =
3444a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) CompareOperation(zone_, op, left, right, pos, id_gen_);
3445b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(CompareOperation, node)
3446b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3447b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3448b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Conditional* NewConditional(Expression* condition,
3449b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                              Expression* then_expression,
3450b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                              Expression* else_expression,
3451a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                              int position) {
3452a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Conditional* cond = new (zone_) Conditional(
3453a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        zone_, condition, then_expression, else_expression, position, id_gen_);
3454b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(Conditional, cond)
3455b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3456b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3457b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Assignment* NewAssignment(Token::Value op,
3458b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                            Expression* target,
3459b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                            Expression* value,
3460b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                            int pos) {
3461b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    Assignment* assign =
3462a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) Assignment(zone_, op, target, value, pos, id_gen_);
34636d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    assign->Init(zone_, this);
3464b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(Assignment, assign)
3465b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3466b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3467e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Yield* NewYield(Expression *generator_object,
3468e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org                  Expression* expression,
346977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org                  Yield::Kind yield_kind,
3470e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org                  int pos) {
3471d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org    if (!expression) expression = NewUndefinedLiteral(pos);
3472a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Yield* yield = new (zone_)
3473a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        Yield(zone_, generator_object, expression, yield_kind, pos, id_gen_);
3474f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    VISIT_AND_RETURN(Yield, yield)
3475f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
3476f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
3477b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Throw* NewThrow(Expression* exception, int pos) {
3478a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Throw* t = new (zone_) Throw(zone_, exception, pos, id_gen_);
3479b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(Throw, t)
3480b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3481b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3482b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  FunctionLiteral* NewFunctionLiteral(
34839d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      const AstRawString* name, AstValueFactory* ast_value_factory,
34849d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      Scope* scope, ZoneList<Statement*>* body, int materialized_literal_count,
34859d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      int expected_property_count, int handler_count, int parameter_count,
348656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org      FunctionLiteral::ParameterFlag has_duplicate_parameters,
3487dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org      FunctionLiteral::FunctionType function_type,
3488471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      FunctionLiteral::IsFunctionFlag is_function,
34892c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      FunctionLiteral::IsParenthesizedFlag is_parenthesized, FunctionKind kind,
34902c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      int position) {
34919d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    FunctionLiteral* lit = new (zone_) FunctionLiteral(
34929d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org        zone_, name, ast_value_factory, scope, body, materialized_literal_count,
34939d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org        expected_property_count, handler_count, parameter_count, function_type,
3494a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        has_duplicate_parameters, is_function, is_parenthesized, kind, position,
3495a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        id_gen_);
349656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org    // Top-level literal doesn't count for the AST's properties.
349756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org    if (is_function == FunctionLiteral::kIsFunction) {
3498b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org      visitor_.VisitFunctionLiteral(lit);
3499b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    }
3500b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    return lit;
3501b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3502b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3503a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  ClassLiteral* NewClassLiteral(const AstRawString* name, Expression* extends,
3504a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                Expression* constructor,
3505a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                ZoneList<ObjectLiteral::Property*>* properties,
3506a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                int position) {
3507a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    ClassLiteral* lit = new (zone_) ClassLiteral(
3508a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        zone_, name, extends, constructor, properties, position, id_gen_);
3509a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    VISIT_AND_RETURN(ClassLiteral, lit)
3510a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  }
3511a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
3512a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  NativeFunctionLiteral* NewNativeFunctionLiteral(const AstRawString* name,
3513a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                                                  v8::Extension* extension,
3514a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                                                  int pos) {
3515fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    NativeFunctionLiteral* lit =
3516a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) NativeFunctionLiteral(zone_, name, extension, pos, id_gen_);
3517fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    VISIT_AND_RETURN(NativeFunctionLiteral, lit)
3518b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3519b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3520a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ThisFunction* NewThisFunction(int pos) {
3521a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    ThisFunction* fun = new (zone_) ThisFunction(zone_, pos, id_gen_);
3522b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    VISIT_AND_RETURN(ThisFunction, fun)
3523b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
3524b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
35255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  SuperReference* NewSuperReference(VariableProxy* this_var, int pos) {
3526a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    SuperReference* super =
3527a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        new (zone_) SuperReference(zone_, this_var, pos, id_gen_);
35285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    VISIT_AND_RETURN(SuperReference, super);
35295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
35305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
3531b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#undef VISIT_AND_RETURN
3532b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3533b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org private:
3534b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Zone* zone_;
3535b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  Visitor visitor_;
353608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  AstValueFactory* ast_value_factory_;
3537a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  AstNode::IdGen* id_gen_;
3538b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org};
3539b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
3540b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
354143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
354243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
354343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // V8_AST_H_
3544