1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_COMPILER_AST_GRAPH_BUILDER_H_
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_COMPILER_AST_GRAPH_BUILDER_H_
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ast.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/graph-builder.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/js-graph.h"
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ControlBuilder;
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass LoopBuilder;
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Graph;
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The AstGraphBuilder produces a high-level IR graph, based on an
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// underlying AST. The produced graph can either be compiled into a
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// stand-alone function or be wired into another graph for the purposes
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// of function inlining.
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AstGraphBuilder : public StructuredGraphBuilder, public AstVisitor {
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AstGraphBuilder(CompilationInfo* info, JSGraph* jsgraph);
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Creates a graph by visiting the entire AST.
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CreateGraph();
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class AstContext;
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class AstEffectContext;
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class AstValueContext;
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class AstTestContext;
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class BreakableScope;
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class ContextScope;
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class Environment;
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Environment* environment() {
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<Environment*>(
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        StructuredGraphBuilder::environment());
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AstContext* ast_context() const { return ast_context_; }
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BreakableScope* breakable() const { return breakable_; }
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ContextScope* execution_context() const { return execution_context_; }
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_ast_context(AstContext* ctx) { ast_context_ = ctx; }
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_breakable(BreakableScope* brk) { breakable_ = brk; }
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_execution_context(ContextScope* ctx) { execution_context_ = ctx; }
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Support for control flow builders. The concrete type of the environment
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // depends on the graph builder, but environments themselves are not virtual.
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  typedef StructuredGraphBuilder::Environment BaseEnvironment;
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual BaseEnvironment* CopyEnvironment(BaseEnvironment* env);
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // TODO(mstarzinger): The pipeline only needs to be a friend to access the
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // function context. Remove as soon as the context is a parameter.
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class Pipeline;
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Getters for values in the activation record.
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* GetFunctionClosure();
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* GetFunctionContext();
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The following build methods all generate graph fragments and return one
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // resulting node. The operand stack height remains the same, variables and
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // other dependencies tracked by the environment might be mutated though.
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Builder to create a local function context.
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildLocalFunctionContext(Node* context, Node* closure);
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Builder to create an arguments object if it is used.
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildArgumentsObject(Variable* arguments);
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Builders for variable load and assignment.
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildVariableAssignment(Variable* var, Node* value, Token::Value op,
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                BailoutId bailout_id);
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildVariableDelete(Variable* var);
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildVariableLoad(Variable* var, BailoutId bailout_id,
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          ContextualMode mode = CONTEXTUAL);
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Builders for accessing the function context.
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildLoadBuiltinsObject();
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildLoadGlobalObject();
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildLoadClosure();
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildLoadObjectField(Node* object, int offset);
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Builders for automatic type conversion.
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildToBoolean(Node* value);
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Builders for error reporting at runtime.
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildThrowReferenceError(Variable* var);
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Builders for dynamic hole-checks at runtime.
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildHoleCheckSilent(Node* value, Node* for_hole, Node* not_hole);
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildHoleCheckThrow(Node* value, Variable* var, Node* not_hole);
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Builders for binary operations.
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* BuildBinaryOp(Node* left, Node* right, Token::Value op);
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_VISIT(type) virtual void Visit##type(type* node);
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Visiting functions for AST nodes make this an AstVisitor.
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AST_NODE_LIST(DECLARE_VISIT)
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_VISIT
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Visiting function for declarations list is overridden.
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void VisitDeclarations(ZoneList<Declaration*>* declarations);
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CompilationInfo* info_;
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AstContext* ast_context_;
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSGraph* jsgraph_;
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // List of global declarations for functions and variables.
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZoneList<Handle<Object> > globals_;
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Stack of breakable statements entered by the visitor.
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BreakableScope* breakable_;
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Stack of context objects pushed onto the chain by the visitor.
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ContextScope* execution_context_;
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Nodes representing values in the activation record.
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetOncePointer<Node> function_closure_;
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetOncePointer<Node> function_context_;
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CompilationInfo* info() { return info_; }
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StrictMode strict_mode() { return info()->strict_mode(); }
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSGraph* jsgraph() { return jsgraph_; }
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSOperatorBuilder* javascript() { return jsgraph_->javascript(); }
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZoneList<Handle<Object> >* globals() { return &globals_; }
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Current scope during visitation.
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline Scope* current_scope() const;
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Process arguments to a call by popping {arity} elements off the operand
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // stack and build a call node using the given call operator.
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ProcessArguments(const Operator* op, int arity);
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Visit statements.
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitIfNotNull(Statement* stmt);
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Visit expressions.
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitForTest(Expression* expr);
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitForEffect(Expression* expr);
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitForValue(Expression* expr);
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitForValueOrNull(Expression* expr);
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitForValues(ZoneList<Expression*>* exprs);
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Common for all IterationStatement bodies.
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitIterationBody(IterationStatement* stmt, LoopBuilder* loop, int);
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Dispatched from VisitCallRuntime.
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitCallJSRuntime(CallRuntime* expr);
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Dispatched from VisitUnaryOperation.
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitDelete(UnaryOperation* expr);
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitVoid(UnaryOperation* expr);
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitTypeof(UnaryOperation* expr);
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitNot(UnaryOperation* expr);
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Dispatched from VisitBinaryOperation.
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitComma(BinaryOperation* expr);
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitLogicalExpression(BinaryOperation* expr);
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitArithmeticExpression(BinaryOperation* expr);
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Dispatched from VisitForInStatement.
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void VisitForInAssignment(Expression* expr, Node* value);
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Builds deoptimization for a given node.
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void PrepareFrameState(Node* node, BailoutId ast_id,
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         OutputFrameStateCombine combine = kIgnoreOutput);
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OutputFrameStateCombine StateCombineFromAstContext();
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AstGraphBuilder);
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The abstract execution environment for generated code consists of
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// parameter variables, local variables and the operand stack. The
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// environment will perform proper SSA-renaming of all tracked nodes
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// at split and merge points in the control flow. Internally all the
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// values are stored in one list using the following layout:
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//  [parameters (+receiver)] [locals] [operand stack]
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AstGraphBuilder::Environment
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : public StructuredGraphBuilder::Environment {
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Environment(AstGraphBuilder* builder, Scope* scope, Node* control_dependency);
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Environment(const Environment& copy);
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int parameters_count() const { return parameters_count_; }
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int locals_count() const { return locals_count_; }
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int stack_height() {
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return static_cast<int>(values()->size()) - parameters_count_ -
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           locals_count_;
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Operations on parameter or local variables. The parameter indices are
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // shifted by 1 (receiver is parameter index -1 but environment index 0).
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Bind(Variable* variable, Node* node) {
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(variable->IsStackAllocated());
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (variable->IsParameter()) {
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      values()->at(variable->index() + 1) = node;
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(variable->IsStackLocal());
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      values()->at(variable->index() + parameters_count_) = node;
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* Lookup(Variable* variable) {
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(variable->IsStackAllocated());
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (variable->IsParameter()) {
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return values()->at(variable->index() + 1);
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(variable->IsStackLocal());
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return values()->at(variable->index() + parameters_count_);
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Operations on the operand stack.
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Push(Node* node) {
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    values()->push_back(node);
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* Top() {
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(stack_height() > 0);
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return values()->back();
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* Pop() {
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(stack_height() > 0);
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* back = values()->back();
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    values()->pop_back();
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return back;
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Direct mutations of the operand stack.
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Poke(int depth, Node* node) {
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(depth >= 0 && depth < stack_height());
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int index = static_cast<int>(values()->size()) - depth - 1;
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    values()->at(index) = node;
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* Peek(int depth) {
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(depth >= 0 && depth < stack_height());
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int index = static_cast<int>(values()->size()) - depth - 1;
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return values()->at(index);
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Drop(int depth) {
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(depth >= 0 && depth <= stack_height());
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    values()->erase(values()->end() - depth, values()->end());
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Preserve a checkpoint of the environment for the IR graph. Any
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // further mutation of the environment will not affect checkpoints.
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* Checkpoint(BailoutId ast_id, OutputFrameStateCombine combine);
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AstGraphBuilder* builder() const {
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<AstGraphBuilder*>(
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        StructuredGraphBuilder::Environment::builder());
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void UpdateStateValues(Node** state_values, int offset, int count);
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int parameters_count_;
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int locals_count_;
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* parameters_node_;
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* locals_node_;
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* stack_node_;
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Each expression in the AST is evaluated in a specific context. This context
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// decides how the evaluation result is passed up the visitor.
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AstGraphBuilder::AstContext BASE_EMBEDDED {
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsEffect() const { return kind_ == Expression::kEffect; }
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsValue() const { return kind_ == Expression::kValue; }
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsTest() const { return kind_ == Expression::kTest; }
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Determines how to combine the frame state with the value
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // that is about to be plugged into this AstContext.
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OutputFrameStateCombine GetStateCombine() {
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return IsEffect() ? kIgnoreOutput : kPushOutput;
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Plug a node into this expression context.  Call this function in tail
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // position in the Visit functions for expressions.
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void ProduceValue(Node* value) = 0;
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Unplugs a node from this expression context.  Call this to retrieve the
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // result of another Visit function that already plugged the context.
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Node* ConsumeValue() = 0;
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Shortcut for "context->ProduceValue(context->ConsumeValue())".
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void ReplaceValue() { ProduceValue(ConsumeValue()); }
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AstContext(AstGraphBuilder* owner, Expression::Context kind);
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual ~AstContext();
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AstGraphBuilder* owner() const { return owner_; }
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Environment* environment() const { return owner_->environment(); }
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// We want to be able to assert, in a context-specific way, that the stack
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// height makes sense when the context is filled.
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int original_height_;
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Expression::Context kind_;
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AstGraphBuilder* owner_;
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AstContext* outer_;
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Context to evaluate expression for its side effects only.
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AstGraphBuilder::AstEffectContext FINAL : public AstContext {
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit AstEffectContext(AstGraphBuilder* owner)
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : AstContext(owner, Expression::kEffect) {}
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual ~AstEffectContext();
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void ProduceValue(Node* value) OVERRIDE;
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Node* ConsumeValue() OVERRIDE;
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Context to evaluate expression for its value (and side effects).
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AstGraphBuilder::AstValueContext FINAL : public AstContext {
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit AstValueContext(AstGraphBuilder* owner)
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : AstContext(owner, Expression::kValue) {}
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual ~AstValueContext();
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void ProduceValue(Node* value) OVERRIDE;
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Node* ConsumeValue() OVERRIDE;
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Context to evaluate expression for a condition value (and side effects).
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AstGraphBuilder::AstTestContext FINAL : public AstContext {
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit AstTestContext(AstGraphBuilder* owner)
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : AstContext(owner, Expression::kTest) {}
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual ~AstTestContext();
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void ProduceValue(Node* value) OVERRIDE;
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Node* ConsumeValue() OVERRIDE;
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Scoped class tracking breakable statements entered by the visitor. Allows to
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// properly 'break' and 'continue' iteration statements as well as to 'break'
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// from blocks within switch statements.
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AstGraphBuilder::BreakableScope BASE_EMBEDDED {
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BreakableScope(AstGraphBuilder* owner, BreakableStatement* target,
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 ControlBuilder* control, int drop_extra)
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : owner_(owner),
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        target_(target),
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        next_(owner->breakable()),
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        control_(control),
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        drop_extra_(drop_extra) {
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    owner_->set_breakable(this);  // Push.
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ~BreakableScope() {
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    owner_->set_breakable(next_);  // Pop.
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Either 'break' or 'continue' the target statement.
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void BreakTarget(BreakableStatement* target);
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void ContinueTarget(BreakableStatement* target);
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AstGraphBuilder* owner_;
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BreakableStatement* target_;
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BreakableScope* next_;
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ControlBuilder* control_;
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int drop_extra_;
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Find the correct scope for the target statement. Note that this also drops
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // extra operands from the environment for each scope skipped along the way.
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BreakableScope* FindBreakable(BreakableStatement* target);
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Scoped class tracking context objects created by the visitor. Represents
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// mutations of the context chain within the function body and allows to
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// change the current {scope} and {context} during visitation.
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AstGraphBuilder::ContextScope BASE_EMBEDDED {
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ContextScope(AstGraphBuilder* owner, Scope* scope, Node* context)
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : owner_(owner),
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        next_(owner->execution_context()),
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        outer_(owner->current_context()),
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        scope_(scope) {
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    owner_->set_execution_context(this);  // Push.
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    owner_->set_current_context(context);
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ~ContextScope() {
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    owner_->set_execution_context(next_);  // Pop.
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    owner_->set_current_context(outer_);
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Current scope during visitation.
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Scope* scope() const { return scope_; }
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AstGraphBuilder* owner_;
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ContextScope* next_;
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* outer_;
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Scope* scope_;
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochScope* AstGraphBuilder::current_scope() const {
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return execution_context_->scope();
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8::internal::compiler
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // V8_COMPILER_AST_GRAPH_BUILDER_H_
431