| Index: src/interpreter/bytecode-register-allocator.h | 
| diff --git a/src/interpreter/bytecode-register-allocator.h b/src/interpreter/bytecode-register-allocator.h | 
| index 74ab3a42727119c907a05e400b07d1af483a817b..798fd06d2937ce66f978524511f7bdf28910544d 100644 | 
| --- a/src/interpreter/bytecode-register-allocator.h | 
| +++ b/src/interpreter/bytecode-register-allocator.h | 
| @@ -5,6 +5,7 @@ | 
| #ifndef V8_INTERPRETER_BYTECODE_REGISTER_ALLOCATOR_H_ | 
| #define V8_INTERPRETER_BYTECODE_REGISTER_ALLOCATOR_H_ | 
|  | 
| +#include "src/interpreter/bytecodes.h" | 
| #include "src/zone-containers.h" | 
|  | 
| namespace v8 { | 
| @@ -14,11 +15,62 @@ namespace interpreter { | 
| class BytecodeArrayBuilder; | 
| class Register; | 
|  | 
| +class TemporaryRegisterAllocator final { | 
| + public: | 
| +  TemporaryRegisterAllocator(Zone* zone, int start_index); | 
| + | 
| +  // Borrow a temporary register. | 
| +  int BorrowTemporaryRegister(); | 
| + | 
| +  // Borrow a temporary register from the register range outside of | 
| +  // |start_index| to |end_index|. | 
| +  int BorrowTemporaryRegisterNotInRange(int start_index, int end_index); | 
| + | 
| +  // Return a temporary register when no longer used. | 
| +  void ReturnTemporaryRegister(int reg_index); | 
| + | 
| +  // Ensure a run of consecutive registers is available. Each register in | 
| +  // the range should be borrowed with BorrowConsecutiveTemporaryRegister(). | 
| +  // Returns the start index of the run. | 
| +  int PrepareForConsecutiveTemporaryRegisters(size_t count); | 
| + | 
| +  // Borrow a register from a range prepared with | 
| +  // PrepareForConsecutiveTemporaryRegisters(). | 
| +  void BorrowConsecutiveTemporaryRegister(int reg_index); | 
| + | 
| +  // Returns true if |reg| is a temporary register and is currently | 
| +  // borrowed. | 
| +  bool RegisterIsLive(Register reg) const; | 
| + | 
| +  // Returns the first register in the range of temporary registers. | 
| +  Register first_temporary_register() const; | 
| + | 
| +  // Returns the last register in the range of temporary registers. | 
| +  Register last_temporary_register() const; | 
| + | 
| +  // Returns the start index of temporary register allocations. | 
| +  int allocation_base() const { return allocation_base_; } | 
| + | 
| +  // Returns the number of temporary register allocations made. | 
| +  int allocation_count() const { return allocation_count_; } | 
| + | 
| + private: | 
| +  // Allocate a temporary register. | 
| +  int AllocateTemporaryRegister(); | 
| + | 
| +  ZoneSet<int> free_temporaries_; | 
| +  int allocation_base_; | 
| +  int allocation_count_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(TemporaryRegisterAllocator); | 
| +}; | 
| + | 
| // A class than allows the instantiator to allocate temporary registers that are | 
| // cleaned up when scope is closed. | 
| -class BytecodeRegisterAllocator { | 
| +class BytecodeRegisterAllocator final { | 
| public: | 
| -  explicit BytecodeRegisterAllocator(BytecodeArrayBuilder* builder); | 
| +  explicit BytecodeRegisterAllocator(Zone* zone, | 
| +                                     TemporaryRegisterAllocator* allocator); | 
| ~BytecodeRegisterAllocator(); | 
| Register NewRegister(); | 
|  | 
| @@ -30,10 +82,9 @@ class BytecodeRegisterAllocator { | 
| bool HasConsecutiveAllocations() const { return next_consecutive_count_ > 0; } | 
|  | 
| private: | 
| -  void* operator new(size_t size); | 
| -  void operator delete(void* p); | 
| +  TemporaryRegisterAllocator* base_allocator() const { return base_allocator_; } | 
|  | 
| -  BytecodeArrayBuilder* builder_; | 
| +  TemporaryRegisterAllocator* base_allocator_; | 
| ZoneVector<int> allocated_; | 
| int next_consecutive_register_; | 
| int next_consecutive_count_; | 
|  |