| Index: src/interpreter/bytecode-array-builder.cc
|
| diff --git a/src/interpreter/bytecode-array-builder.cc b/src/interpreter/bytecode-array-builder.cc
|
| index bb1c69bd87ec327a248887467b8f52a1a6fe2c0e..ebab9f15b14e8a5f35cd10fce8f31154d2697892 100644
|
| --- a/src/interpreter/bytecode-array-builder.cc
|
| +++ b/src/interpreter/bytecode-array-builder.cc
|
| @@ -11,6 +11,7 @@ namespace interpreter {
|
| BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate)
|
| : isolate_(isolate),
|
| bytecode_generated_(false),
|
| + parameter_count_(-1),
|
| local_register_count_(-1),
|
| temporary_register_count_(0),
|
| temporary_register_next_(0) {}
|
| @@ -25,14 +26,30 @@ void BytecodeArrayBuilder::set_locals_count(int number_of_locals) {
|
| int BytecodeArrayBuilder::locals_count() const { return local_register_count_; }
|
|
|
|
|
| +void BytecodeArrayBuilder::set_parameter_count(int number_of_parameters) {
|
| + parameter_count_ = number_of_parameters;
|
| +}
|
| +
|
| +
|
| +int BytecodeArrayBuilder::parameter_count() const { return parameter_count_; }
|
| +
|
| +
|
| +Register BytecodeArrayBuilder::Parameter(int param_index) {
|
| + DCHECK_GE(param_index, 0);
|
| + DCHECK_LT(param_index, parameter_count_);
|
| + return Register(kLastParamRegisterIndex - parameter_count_ + param_index + 1);
|
| +}
|
| +
|
| +
|
| Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() {
|
| DCHECK_EQ(bytecode_generated_, false);
|
| + DCHECK_GE(parameter_count_, 0);
|
| DCHECK_GE(local_register_count_, 0);
|
| int bytecode_size = static_cast<int>(bytecodes_.size());
|
| int register_count = local_register_count_ + temporary_register_count_;
|
| int frame_size = register_count * kPointerSize;
|
| Handle<BytecodeArray> output = isolate_->factory()->NewBytecodeArray(
|
| - bytecode_size, &bytecodes_.front(), frame_size);
|
| + bytecode_size, &bytecodes_.front(), frame_size, parameter_count_);
|
| bytecode_generated_ = true;
|
| return output;
|
| }
|
| @@ -135,9 +152,12 @@ bool BytecodeArrayBuilder::OperandIsValid(Bytecode bytecode, int operand_index,
|
| return false;
|
| case OperandType::kImm8:
|
| return true;
|
| - case OperandType::kReg:
|
| - return Register::FromOperand(operand_value).index() <
|
| - temporary_register_next_;
|
| + case OperandType::kReg: {
|
| + int reg_index = Register::FromOperand(operand_value).index();
|
| + return (reg_index >= 0 && reg_index < temporary_register_next_) ||
|
| + (reg_index <= kLastParamRegisterIndex &&
|
| + reg_index > kLastParamRegisterIndex - parameter_count_);
|
| + }
|
| }
|
| UNREACHABLE();
|
| return false;
|
|
|