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