bytecode-array-builder.h revision f91f0611dbaf29ca0f1d4aecb357ce243a19d2fa
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_ARRAY_BUILDER_H_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_INTERPRETER_BYTECODE_ARRAY_BUILDER_H_
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/ast/ast.h"
9bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/interpreter/bytecode-array-writer.h"
10109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/interpreter/bytecode-register-allocator.h"
11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/interpreter/bytecode-register.h"
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/interpreter/bytecodes.h"
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/interpreter/constant-array-builder.h"
14109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/interpreter/handler-table-builder.h"
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/zone-containers.h"
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Isolate;
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace interpreter {
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass BytecodeLabel;
25bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass BytecodeNode;
26bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass BytecodePipelineStage;
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Register;
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass BytecodeArrayBuilder final : public ZoneObject {
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder(
32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Isolate* isolate, Zone* zone, int parameter_count, int context_count,
33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      int locals_count, FunctionLiteral* literal = nullptr,
34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      SourcePositionTableBuilder::RecordingMode source_position_mode =
35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          SourcePositionTableBuilder::RECORD_SOURCE_POSITIONS);
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<BytecodeArray> ToBytecodeArray(Isolate* isolate);
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
39109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Get the number of parameters expected by function.
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int parameter_count() const {
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_GE(parameter_count_, 0);
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return parameter_count_;
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
45109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Get the number of locals required for bytecode array.
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int locals_count() const {
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_GE(local_register_count_, 0);
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return local_register_count_;
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
51109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Get number of contexts required for bytecode array.
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int context_count() const {
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_GE(context_register_count_, 0);
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return context_register_count_;
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register first_context_register() const;
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register last_context_register() const;
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns the number of fixed (non-temporary) registers.
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int fixed_register_count() const { return context_count() + locals_count(); }
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
63109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Returns the number of fixed and temporary registers.
64109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int fixed_and_temporary_register_count() const {
65109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return fixed_register_count() + temporary_register_count();
66109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
67109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
68109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int temporary_register_count() const {
69109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return temporary_register_allocator()->allocation_count();
70109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
71109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register Parameter(int parameter_index) const;
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Return true if the register |reg| represents a parameter or a
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // local.
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool RegisterIsParameterOrLocal(Register reg) const;
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
78109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Returns true if the register |reg| is a live temporary register.
79109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool TemporaryRegisterIsLive(Register reg) const;
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Constant loads to accumulator.
82f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& LoadConstantPoolEntry(size_t entry);
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& LoadLiteral(v8::internal::Smi* value);
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& LoadLiteral(Handle<Object> object);
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& LoadUndefined();
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& LoadNull();
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& LoadTheHole();
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& LoadTrue();
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& LoadFalse();
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Global loads to the accumulator and stores from the accumulator.
9213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  BytecodeArrayBuilder& LoadGlobal(int feedback_slot, TypeofMode typeof_mode);
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& StoreGlobal(const Handle<String> name,
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    int feedback_slot,
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    LanguageMode language_mode);
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Load the object at |slot_index| in |context| into the accumulator.
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& LoadContextSlot(Register context, int slot_index);
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Stores the object in the accumulator into |slot_index| of |context|.
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& StoreContextSlot(Register context, int slot_index);
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Register-accumulator transfers.
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& LoadAccumulatorWithRegister(Register reg);
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& StoreAccumulatorInRegister(Register reg);
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Register-register transfer.
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& MoveRegister(Register from, Register to);
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Named load property.
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& LoadNamedProperty(Register object,
112109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                          const Handle<Name> name,
113109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                          int feedback_slot);
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Keyed load property. The key should be in the accumulator.
115109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  BytecodeArrayBuilder& LoadKeyedProperty(Register object, int feedback_slot);
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Store properties. The value to be stored should be in the accumulator.
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& StoreNamedProperty(Register object,
119109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                           const Handle<Name> name,
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           int feedback_slot,
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           LanguageMode language_mode);
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& StoreKeyedProperty(Register object, Register key,
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           int feedback_slot,
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           LanguageMode language_mode);
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Lookup the variable with |name|.
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& LoadLookupSlot(const Handle<String> name,
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       TypeofMode typeof_mode);
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Store value in the accumulator into the variable with |name|.
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& StoreLookupSlot(const Handle<String> name,
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        LanguageMode language_mode);
133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Create a new closure for a SharedFunctionInfo which will be inserted at
135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // constant pool index |entry|.
136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& CreateClosure(size_t entry, int flags);
137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Create a new local context for a |scope_info| and a closure which should be
139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // in the accumulator.
140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& CreateBlockContext(Handle<ScopeInfo> scope_info);
141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Create a new context for a catch block with |exception| and |name| and the
143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // closure in the accumulator.
144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& CreateCatchContext(Register exception,
145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                           Handle<String> name);
146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Create a new context with size |slots|.
148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& CreateFunctionContext(int slots);
149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Creates a new context for a with-statement with the |object| in a register
151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // and the closure in the accumulator.
152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& CreateWithContext(Register object);
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Create a new arguments object in the accumulator.
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& CreateArguments(CreateArgumentsType type);
156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Literals creation.  Constant elements should be in the accumulator.
158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& CreateRegExpLiteral(Handle<String> pattern,
159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                            int literal_index, int flags);
160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& CreateArrayLiteral(Handle<FixedArray> constant_elements,
161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           int literal_index, int flags);
162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& CreateObjectLiteral(
163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Handle<FixedArray> constant_properties, int literal_index, int flags,
164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Register output);
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Push the context in accumulator as the new context, and store in register
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // |context|.
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& PushContext(Register context);
169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Pop the current context and replace with |context|.
171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& PopContext(Register context);
172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Call a JS function. The JSFunction or Callable to be called should be in
174109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // |callable|, the receiver should be in |receiver_args| and all subsequent
175109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // arguments should be in registers <receiver_args + 1> to
176f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // <receiver_args + receiver_arg_count - 1>. Type feedback is recorded in
177f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // the |feedback_slot| in the type feedback vector.
178109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  BytecodeArrayBuilder& Call(
179109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      Register callable, Register receiver_args, size_t receiver_arg_count,
180109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      int feedback_slot, TailCallMode tail_call_mode = TailCallMode::kDisallow);
181109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
182109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  BytecodeArrayBuilder& TailCall(Register callable, Register receiver_args,
183109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                 size_t receiver_arg_count, int feedback_slot) {
184109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return Call(callable, receiver_args, receiver_arg_count, feedback_slot,
185109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                TailCallMode::kAllow);
186109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
187109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
188109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Call the new operator. The accumulator holds the |new_target|.
189109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // The |constructor| is in a register followed by |arg_count|
190109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // consecutive arguments starting at |first_arg| for the constuctor
191109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // invocation.
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& New(Register constructor, Register first_arg,
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            size_t arg_count);
194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Call the runtime function with |function_id|. The first argument should be
196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // in |first_arg| and all subsequent arguments should be in registers
197109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // <first_arg + 1> to <first_arg + arg_count - 1>.
198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& CallRuntime(Runtime::FunctionId function_id,
199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    Register first_arg, size_t arg_count);
200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Call the runtime function with |function_id| that returns a pair of values.
202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The first argument should be in |first_arg| and all subsequent arguments
203109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // should be in registers <first_arg + 1> to <first_arg + arg_count - 1>. The
204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // return values will be returned in <first_return> and <first_return + 1>.
205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& CallRuntimeForPair(Runtime::FunctionId function_id,
206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           Register first_arg, size_t arg_count,
207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           Register first_return);
208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Call the JS runtime function with |context_index|. The the receiver should
210109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // be in |receiver_args| and all subsequent arguments should be in registers
211109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // <receiver + 1> to <receiver + receiver_args_count - 1>.
212109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  BytecodeArrayBuilder& CallJSRuntime(int context_index, Register receiver_args,
213109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                      size_t receiver_args_count);
214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Operators (register holds the lhs value, accumulator holds the rhs value).
216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Type feedback will be recorded in the |feedback_slot|
217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& BinaryOperation(Token::Value binop, Register reg,
218f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                        int feedback_slot);
219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Count Operators (value stored in accumulator).
221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Type feedback will be recorded in the |feedback_slot|
222f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& CountOperation(Token::Value op, int feedback_slot);
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Unary Operators.
225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& LogicalNot();
226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& TypeOf();
227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Deletes property from an object. This expects that accumulator contains
229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // the key to be deleted and the register contains a reference to the object.
230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& Delete(Register object, LanguageMode language_mode);
231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Tests.
233109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  BytecodeArrayBuilder& CompareOperation(Token::Value op, Register reg);
234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
235f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Casts accumulator and stores result in accumulator.
236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& CastAccumulatorToBoolean();
237f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
238f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Casts accumulator and stores result in register |out|.
239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& CastAccumulatorToJSObject(Register out);
240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& CastAccumulatorToName(Register out);
241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& CastAccumulatorToNumber(Register out);
242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Flow Control.
244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& Bind(BytecodeLabel* label);
245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& Bind(const BytecodeLabel& target, BytecodeLabel* label);
246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& Jump(BytecodeLabel* label);
248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& JumpIfTrue(BytecodeLabel* label);
249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& JumpIfFalse(BytecodeLabel* label);
250109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  BytecodeArrayBuilder& JumpIfNotHole(BytecodeLabel* label);
251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& JumpIfNull(BytecodeLabel* label);
252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& JumpIfUndefined(BytecodeLabel* label);
253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
254bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BytecodeArrayBuilder& StackCheck(int position);
255109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
256f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& OsrPoll(int loop_depth);
257f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& Throw();
259109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  BytecodeArrayBuilder& ReThrow();
260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& Return();
261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
262109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Debugger.
263109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  BytecodeArrayBuilder& Debugger();
264109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Complex flow control.
266f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& ForInPrepare(Register receiver,
267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                     Register cache_info_triple);
268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& ForInDone(Register index, Register cache_length);
269109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  BytecodeArrayBuilder& ForInNext(Register receiver, Register index,
2703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                  Register cache_type_array_pair,
2713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                  int feedback_slot);
272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& ForInStep(Register index);
273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
274bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Generators.
275bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BytecodeArrayBuilder& SuspendGenerator(Register generator);
276bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BytecodeArrayBuilder& ResumeGenerator(Register generator);
277bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
278109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Exception handling.
279f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BytecodeArrayBuilder& MarkHandler(int handler_id,
280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                    HandlerTable::CatchPrediction will_catch);
281109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  BytecodeArrayBuilder& MarkTryBegin(int handler_id, Register context);
282109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  BytecodeArrayBuilder& MarkTryEnd(int handler_id);
283109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
284109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Creates a new handler table entry and returns a {hander_id} identifying the
285109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // entry, so that it can be referenced by above exception handling support.
286109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int NewHandlerEntry() { return handler_table_builder()->NewHandlerEntry(); }
287109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Allocates a slot in the constant pool which can later be inserted.
289f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  size_t AllocateConstantPoolEntry();
290f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Inserts a entry into an allocated constant pool entry.
291f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void InsertConstantPoolEntryAt(size_t entry, Handle<Object> object);
292f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void InitializeReturnPosition(FunctionLiteral* literal);
2943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
295109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void SetStatementPosition(Statement* stmt);
296109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void SetExpressionPosition(Expression* expr);
2973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void SetExpressionAsStatementPosition(Expression* expr);
298109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Accessors
300109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  TemporaryRegisterAllocator* temporary_register_allocator() {
301109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return &temporary_allocator_;
302f2e3994fa5148cc3d9946666f0b0596290192b0eBen Murdoch  }
303109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  const TemporaryRegisterAllocator* temporary_register_allocator() const {
304109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return &temporary_allocator_;
305f2e3994fa5148cc3d9946666f0b0596290192b0eBen Murdoch  }
306bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Zone* zone() const { return zone_; }
3078389745919cae02139ddc085a63c00d024269cf2Ben Murdoch
3083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void EnsureReturn();
3093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
31013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static uint32_t RegisterOperand(Register reg) {
31113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return static_cast<uint32_t>(reg.ToOperand());
31213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
31313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
31413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static uint32_t SignedOperand(int value) {
31513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return static_cast<uint32_t>(value);
31613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
31713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
31813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static uint32_t UnsignedOperand(int value) {
31913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    DCHECK_GE(value, 0);
32013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return static_cast<uint32_t>(value);
32113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
32213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
32313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static uint32_t UnsignedOperand(size_t value) {
32413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    DCHECK_LE(value, kMaxUInt32);
32513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return static_cast<uint32_t>(value);
32613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
327109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
328109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private:
329109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  friend class BytecodeRegisterAllocator;
330109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static Bytecode BytecodeForBinaryOperation(Token::Value op);
332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static Bytecode BytecodeForCountOperation(Token::Value op);
333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static Bytecode BytecodeForCompareOperation(Token::Value op);
33413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static Bytecode BytecodeForStoreNamedProperty(LanguageMode language_mode);
33513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static Bytecode BytecodeForStoreKeyedProperty(LanguageMode language_mode);
336109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static Bytecode BytecodeForLoadGlobal(TypeofMode typeof_mode);
337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static Bytecode BytecodeForStoreGlobal(LanguageMode language_mode);
338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static Bytecode BytecodeForStoreLookupSlot(LanguageMode language_mode);
339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static Bytecode BytecodeForCreateArguments(CreateArgumentsType type);
340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static Bytecode BytecodeForDelete(LanguageMode language_mode);
341109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static Bytecode BytecodeForCall(TailCallMode tail_call_mode);
342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
34313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  void Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1,
34413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              uint32_t operand2, uint32_t operand3);
34513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  void Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1,
34613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              uint32_t operand2);
34713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  void Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1);
34813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  void Output(Bytecode bytecode, uint32_t operand0);
349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Output(Bytecode bytecode);
350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BytecodeArrayBuilder& OutputJump(Bytecode jump_bytecode,
352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   BytecodeLabel* label);
353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
35413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  bool RegisterIsValid(Register reg) const;
35513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  bool OperandsAreValid(Bytecode bytecode, int operand_count,
35613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        uint32_t operand0 = 0, uint32_t operand1 = 0,
35713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        uint32_t operand2 = 0, uint32_t operand3 = 0) const;
358f2e3994fa5148cc3d9946666f0b0596290192b0eBen Murdoch
359bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Attach latest source position to |node|.
360bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void AttachSourceInfo(BytecodeNode* node);
361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Set position for return.
3633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void SetReturnPosition();
364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Gets a constant pool entry for the |object|.
366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t GetConstantPoolEntry(Handle<Object> object);
367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
368bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Not implemented as the illegal bytecode is used inside internally
369bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // to indicate a bytecode field is not valid or an error has occured
370bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // during bytecode generation.
371bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BytecodeArrayBuilder& Illegal();
372bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
37313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  void LeaveBasicBlock() { return_seen_in_block_ = false; }
37413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
375bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BytecodeArrayWriter* bytecode_array_writer() {
376bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return &bytecode_array_writer_;
377bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
378bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BytecodePipelineStage* pipeline() { return pipeline_; }
379109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  ConstantArrayBuilder* constant_array_builder() {
380109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return &constant_array_builder_;
381109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
382109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  const ConstantArrayBuilder* constant_array_builder() const {
383109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return &constant_array_builder_;
384109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
385109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  HandlerTableBuilder* handler_table_builder() {
386109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return &handler_table_builder_;
387109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
388109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Zone* zone_;
390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool bytecode_generated_;
391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ConstantArrayBuilder constant_array_builder_;
392109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  HandlerTableBuilder handler_table_builder_;
39313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  bool return_seen_in_block_;
394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int parameter_count_;
395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int local_register_count_;
396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int context_register_count_;
3973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  int return_position_;
398109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  TemporaryRegisterAllocator temporary_allocator_;
399bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BytecodeArrayWriter bytecode_array_writer_;
400bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BytecodePipelineStage* pipeline_;
401bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BytecodeSourceInfo latest_source_info_;
402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(BytecodeArrayBuilder);
404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace interpreter
407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_INTERPRETER_BYTECODE_ARRAY_BUILDER_H_
411