bytecode-generator.h revision 342c50ce1624b485728b9a4fc41d8bbf37eb46cf
1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_INTERPRETER_BYTECODE_GENERATOR_H_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_INTERPRETER_BYTECODE_GENERATOR_H_
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/ast/ast.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/interpreter/bytecode-array-builder.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/interpreter/bytecodes.h"
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace interpreter {
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
16342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochclass LoopBuilder;
17342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass BytecodeGenerator final : public AstVisitor {
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeGenerator(Isolate* isolate, Zone* zone);
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<BytecodeArray> MakeBytecode(CompilationInfo* info);
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DECLARE_VISIT(type) void Visit##type(type* node) override;
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  AST_NODE_LIST(DECLARE_VISIT)
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DECLARE_VISIT
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Visiting function for declarations list and statements are overridden.
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitDeclarations(ZoneList<Declaration*>* declarations) override;
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitStatements(ZoneList<Statement*>* statments) override;
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class ContextScope;
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class ControlScope;
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class ControlScopeForBreakable;
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class ControlScopeForIteration;
37342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  class ControlScopeForTopLevel;
38342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  class ControlScopeForTryCatch;
39342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  class ControlScopeForTryFinally;
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class ExpressionResultScope;
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class EffectResultScope;
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class AccumulatorResultScope;
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class RegisterResultScope;
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class RegisterAllocationScope;
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void MakeBytecodeBody();
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Dispatched from VisitBinaryOperation.
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitArithmeticExpression(BinaryOperation* binop);
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitCommaExpression(BinaryOperation* binop);
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitLogicalOrExpression(BinaryOperation* binop);
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitLogicalAndExpression(BinaryOperation* binop);
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Dispatched from VisitUnaryOperation.
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitVoid(UnaryOperation* expr);
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitTypeOf(UnaryOperation* expr);
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitNot(UnaryOperation* expr);
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitDelete(UnaryOperation* expr);
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Used by flow control routines to evaluate loop condition.
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitCondition(Expression* expr);
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Helper visitors which perform common operations.
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register VisitArguments(ZoneList<Expression*>* arguments);
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
68342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  // Visit a keyed super property load. The optional
69342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  // |opt_receiver_out| register will have the receiver stored to it
70342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  // if it's a valid register. The loaded value is placed in the
71342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  // accumulator.
72342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitKeyedSuperPropertyLoad(Property* property,
73342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                                   Register opt_receiver_out);
74342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
75342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  // Visit a named super property load. The optional
76342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  // |opt_receiver_out| register will have the receiver stored to it
77342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  // if it's a valid register. The loaded value is placed in the
78342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  // accumulator.
79342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitNamedSuperPropertyLoad(Property* property,
80342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                                   Register opt_receiver_out);
81342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitPropertyLoad(Register obj, Property* expr);
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitPropertyLoadForAccumulator(Register obj, Property* expr);
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitVariableLoad(Variable* variable, FeedbackVectorSlot slot,
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         TypeofMode typeof_mode = NOT_INSIDE_TYPEOF);
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitVariableLoadForAccumulatorValue(
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Variable* variable, FeedbackVectorSlot slot,
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      TypeofMode typeof_mode = NOT_INSIDE_TYPEOF);
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MUST_USE_RESULT Register
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VisitVariableLoadForRegisterValue(Variable* variable, FeedbackVectorSlot slot,
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    TypeofMode typeof_mode = NOT_INSIDE_TYPEOF);
93342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitVariableAssignment(Variable* variable, Token::Value op,
94342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                               FeedbackVectorSlot slot);
95342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
96342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void BuildNamedSuperPropertyStore(Register receiver, Register home_object,
97342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                                    Register name, Register value);
98342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void BuildKeyedSuperPropertyStore(Register receiver, Register home_object,
99342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                                    Register key, Register value);
100342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void BuildNamedSuperPropertyLoad(Register receiver, Register home_object,
101342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                                   Register name);
102342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void BuildKeyedSuperPropertyLoad(Register receiver, Register home_object,
103342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                                   Register key);
104342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
105342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void BuildThrowIfHole(Handle<String> name);
106342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void BuildThrowIfNotHole(Handle<String> name);
107342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void BuildThrowReassignConstant(Handle<String> name);
108342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void BuildThrowReferenceError(Handle<String> name);
109342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void BuildHoleCheckForVariableLoad(VariableMode mode, Handle<String> name);
110342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void BuildHoleCheckForVariableAssignment(Variable* variable, Token::Value op);
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitArgumentsObject(Variable* variable);
113342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitRestArgumentsArray(Variable* rest);
114342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitCallSuper(Call* call);
115342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitClassLiteralContents(ClassLiteral* expr);
116342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitClassLiteralForRuntimeDefinition(ClassLiteral* expr);
117342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitClassLiteralProperties(ClassLiteral* expr, Register literal,
118342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                                   Register prototype);
119342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitClassLiteralStaticPrototypeWithComputedName(Register name);
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitThisFunctionVariable(Variable* variable);
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitNewTargetVariable(Variable* variable);
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitNewLocalFunctionContext();
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitBuildLocalActivationContext();
124342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitBlockDeclarationsAndStatements(Block* stmt);
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitNewLocalBlockContext(Scope* scope);
126342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitNewLocalCatchContext(Variable* variable);
127342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitNewLocalWithContext();
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitFunctionClosureForContext();
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitSetHomeObject(Register value, Register home_object,
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          ObjectLiteralProperty* property, int slot_number = 0);
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitObjectLiteralAccessor(Register home_object,
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                  ObjectLiteralProperty* property,
133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                  Register value_out);
134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitForInAssignment(Expression* expr, FeedbackVectorSlot slot);
135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
136342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  // Visit the body of a loop iteration.
137342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitIterationBody(IterationStatement* stmt, LoopBuilder* loop_builder);
138342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
139342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  // Visit a statement and switch scopes, the context is in the accumulator.
140342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitInScope(Statement* stmt, Scope* scope);
141342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Visitors for obtaining expression result in the accumulator, in a
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // register, or just getting the effect.
144342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitForAccumulatorValue(Expression* expr);
145342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitForAccumulatorValueOrTheHole(Expression* expr);
146342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  MUST_USE_RESULT Register VisitForRegisterValue(Expression* expr);
147342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitForRegisterValue(Expression* expr, Register destination);
148342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void VisitForEffect(Expression* expr);
149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Methods for tracking and remapping register.
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void RecordStoreToRegister(Register reg);
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register LoadFromAliasedRegister(Register reg);
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
154342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  // Methods for tracking try-block nesting.
155342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  bool IsInsideTryCatch() const { return try_catch_nesting_level_ > 0; }
156342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  bool IsInsideTryFinally() const { return try_finally_nesting_level_ > 0; }
157342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
158342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  // Initialize an array of temporary registers with consecutive registers.
159342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  template <size_t N>
160342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  void InitializeWithConsecutiveRegisters(Register (&registers)[N]);
161342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
162342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  inline void set_builder(BytecodeArrayBuilder* builder) { builder_ = builder; }
163342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  inline BytecodeArrayBuilder* builder() const { return builder_; }
164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Isolate* isolate() const { return isolate_; }
166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Zone* zone() const { return zone_; }
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Scope* scope() const { return scope_; }
169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_scope(Scope* scope) { scope_ = scope; }
170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline CompilationInfo* info() const { return info_; }
171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_info(CompilationInfo* info) { info_ = info; }
172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline ControlScope* execution_control() const { return execution_control_; }
174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_execution_control(ControlScope* scope) {
175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    execution_control_ = scope;
176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline ContextScope* execution_context() const { return execution_context_; }
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_execution_context(ContextScope* context) {
179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    execution_context_ = context;
180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_execution_result(ExpressionResultScope* execution_result) {
182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    execution_result_ = execution_result;
183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ExpressionResultScope* execution_result() const { return execution_result_; }
185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_register_allocator(
186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RegisterAllocationScope* register_allocator) {
187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    register_allocator_ = register_allocator;
188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RegisterAllocationScope* register_allocator() const {
190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return register_allocator_;
191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ZoneVector<Handle<Object>>* globals() { return &globals_; }
194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline LanguageMode language_mode() const;
195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int feedback_index(FeedbackVectorSlot slot) const;
196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Isolate* isolate_;
198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Zone* zone_;
199342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  BytecodeArrayBuilder* builder_;
200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CompilationInfo* info_;
201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Scope* scope_;
202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ZoneVector<Handle<Object>> globals_;
203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ControlScope* execution_control_;
204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ContextScope* execution_context_;
205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ExpressionResultScope* execution_result_;
206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RegisterAllocationScope* register_allocator_;
207342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  int try_catch_nesting_level_;
208342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  int try_finally_nesting_level_;
209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace interpreter
212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_INTERPRETER_BYTECODE_GENERATOR_H_
216