Index: src/interpreter/bytecode-array-builder.h |
diff --git a/src/interpreter/bytecode-array-builder.h b/src/interpreter/bytecode-array-builder.h |
index 27262e224d0ba606cf9fc26881470ab9fde2f824..3f2415e1be7a97e2f4d77c90071f9f6c847e6764 100644 |
--- a/src/interpreter/bytecode-array-builder.h |
+++ b/src/interpreter/bytecode-array-builder.h |
@@ -28,14 +28,14 @@ class BytecodeArrayBuilder { |
BytecodeArrayBuilder(Isolate* isolate, Zone* zone); |
Handle<BytecodeArray> ToBytecodeArray(); |
- // Set number of parameters expected by function. |
+ // Set the number of parameters expected by function. |
void set_parameter_count(int number_of_params); |
int parameter_count() const { |
DCHECK_GE(parameter_count_, 0); |
return parameter_count_; |
} |
- // Set number of locals required for bytecode array. |
+ // Set the number of locals required for bytecode array. |
void set_locals_count(int number_of_locals); |
int locals_count() const { |
DCHECK_GE(local_register_count_, 0); |
@@ -57,7 +57,14 @@ class BytecodeArrayBuilder { |
Register Parameter(int parameter_index) const; |
- // Constant loads to the accumulator. |
+ // Return true if the register |reg| represents a parameter or a |
+ // local. |
+ bool RegisterIsParameterOrLocal(Register reg) const; |
+ |
+ // Return true if the register |reg| represents a temporary register. |
+ bool RegisterIsTemporary(Register reg) const; |
+ |
+ // Constant loads to accumulator. |
BytecodeArrayBuilder& LoadLiteral(v8::internal::Smi* value); |
BytecodeArrayBuilder& LoadLiteral(Handle<Object> object); |
BytecodeArrayBuilder& LoadUndefined(); |
@@ -66,7 +73,7 @@ class BytecodeArrayBuilder { |
BytecodeArrayBuilder& LoadTrue(); |
BytecodeArrayBuilder& LoadFalse(); |
- // Global loads to accumulator and stores from the accumulator. |
+ // Global loads to the accumulator and stores from the accumulator. |
BytecodeArrayBuilder& LoadGlobal(int slot_index); |
BytecodeArrayBuilder& StoreGlobal(int slot_index, LanguageMode language_mode); |
@@ -140,7 +147,7 @@ class BytecodeArrayBuilder { |
BytecodeArrayBuilder& CompareOperation(Token::Value op, Register reg, |
Strength strength); |
- // Casts |
+ // Casts. |
BytecodeArrayBuilder& CastAccumulatorToBoolean(); |
BytecodeArrayBuilder& CastAccumulatorToName(); |
@@ -207,9 +214,14 @@ class BytecodeArrayBuilder { |
size_t GetConstantPoolEntry(Handle<Object> object); |
- // Scope helpers used by TemporaryRegisterScope |
int BorrowTemporaryRegister(); |
void ReturnTemporaryRegister(int reg_index); |
+ int PrepareForConsecutiveTemporaryRegisters(size_t count); |
+ void BorrowConsecutiveTemporaryRegister(int reg_index); |
+ bool TemporaryRegisterIsLive(Register reg) const; |
+ |
+ Register first_temporary_register() const; |
+ Register last_temporary_register() const; |
Isolate* isolate_; |
Zone* zone_; |
@@ -226,10 +238,11 @@ class BytecodeArrayBuilder { |
int local_register_count_; |
int context_register_count_; |
int temporary_register_count_; |
- int temporary_register_next_; |
+ |
+ ZoneSet<int> free_temporaries_; |
friend class TemporaryRegisterScope; |
- DISALLOW_IMPLICIT_CONSTRUCTORS(BytecodeArrayBuilder); |
+ DISALLOW_COPY_AND_ASSIGN(BytecodeArrayBuilder); |
}; |
@@ -273,19 +286,26 @@ class BytecodeLabel final { |
// A stack-allocated class than allows the instantiator to allocate |
// temporary registers that are cleaned up when scope is closed. |
+// TODO(oth): Deprecate TemporaryRegisterScope use. Code should be |
+// using result scopes as far as possible. |
class TemporaryRegisterScope { |
public: |
explicit TemporaryRegisterScope(BytecodeArrayBuilder* builder); |
~TemporaryRegisterScope(); |
Register NewRegister(); |
+ void PrepareForConsecutiveAllocations(size_t count); |
+ Register NextConsecutiveRegister(); |
+ |
private: |
void* operator new(size_t size); |
void operator delete(void* p); |
BytecodeArrayBuilder* builder_; |
- int count_; |
- int last_register_index_; |
+ const TemporaryRegisterScope* outer_; |
+ ZoneVector<int> allocated_; |
+ int next_consecutive_register_; |
+ int next_consecutive_count_; |
DISALLOW_COPY_AND_ASSIGN(TemporaryRegisterScope); |
}; |