Chromium Code Reviews| Index: src/interpreter/bytecode-array-builder.cc |
| diff --git a/src/interpreter/bytecode-array-builder.cc b/src/interpreter/bytecode-array-builder.cc |
| index 1ce19f901f4ed46c0474f538e9c3e5debf9ad330..70342079e0ffcb4838fe7130ee383eb0252ffa66 100644 |
| --- a/src/interpreter/bytecode-array-builder.cc |
| +++ b/src/interpreter/bytecode-array-builder.cc |
| @@ -20,12 +20,14 @@ BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate, Zone* zone) |
| constants_(zone), |
| parameter_count_(-1), |
| local_register_count_(-1), |
| + context_register_count_(-1), |
| temporary_register_count_(0), |
| temporary_register_next_(0) {} |
| void BytecodeArrayBuilder::set_locals_count(int number_of_locals) { |
| local_register_count_ = number_of_locals; |
| + DCHECK_LE(context_register_count_, 0); |
| temporary_register_next_ = local_register_count_; |
| } |
| @@ -41,7 +43,25 @@ void BytecodeArrayBuilder::set_parameter_count(int number_of_parameters) { |
| int BytecodeArrayBuilder::parameter_count() const { return parameter_count_; } |
| -Register BytecodeArrayBuilder::Parameter(int parameter_index) { |
| +void BytecodeArrayBuilder::set_context_count(int number_of_contexts) { |
| + context_register_count_ = number_of_contexts; |
| + DCHECK_GE(local_register_count_, 0); |
| + temporary_register_next_ = local_register_count_ + context_register_count_; |
| +} |
| + |
| + |
| +Register BytecodeArrayBuilder::first_context_register() const { |
| + DCHECK_GT(context_register_count_, 0); |
| + return Register(local_register_count_); |
| +} |
| + |
| + |
| +Register BytecodeArrayBuilder::last_context_register() const { |
| + DCHECK_GT(context_register_count_, 0); |
| + return Register(local_register_count_ + context_register_count_ - 1); |
| +} |
| + |
|
Michael Starzinger
2015/10/13 09:38:43
nit: Two empty newlines.
rmcilroy
2015/10/13 10:35:22
Done.
|
| +Register BytecodeArrayBuilder::Parameter(int parameter_index) const { |
| DCHECK_GE(parameter_index, 0); |
| DCHECK_LT(parameter_index, parameter_count_); |
| return Register::FromParameterIndex(parameter_index, parameter_count_); |
| @@ -322,6 +342,18 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( |
| } |
| +BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) { |
| + Output(Bytecode::kPushContext, context.ToOperand()); |
| + return *this; |
| +} |
| + |
| + |
| +BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) { |
| + Output(Bytecode::kPopContext, context.ToOperand()); |
| + return *this; |
| +} |
| + |
| + |
| BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToBoolean() { |
| if (LastBytecodeInSameBlock()) { |
| // If the previous bytecode puts a boolean in the accumulator |
| @@ -571,7 +603,7 @@ bool BytecodeArrayBuilder::OperandIsValid(Bytecode bytecode, int operand_index, |
| return static_cast<uint8_t>(operand_value) == operand_value; |
| case OperandType::kReg8: { |
| Register reg = Register::FromOperand(static_cast<uint8_t>(operand_value)); |
| - if (reg.is_function_context()) { |
| + if (reg.is_function_context() || reg.is_function_closure()) { |
| return true; |
| } else if (reg.is_parameter()) { |
| int parameter_index = reg.ToParameterIndex(parameter_count_); |