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