| Index: src/interpreter/bytecode-array-builder.cc
|
| diff --git a/src/interpreter/bytecode-array-builder.cc b/src/interpreter/bytecode-array-builder.cc
|
| index 5476a475f214c51d72dd88875a4badc0a632a2ac..cdc2442888cc29f1692b9972835392bf4fc0ab5b 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,26 @@ 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);
|
| +}
|
| +
|
| +
|
| +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_);
|
| @@ -330,6 +351,18 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure(
|
| }
|
|
|
|
|
| +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
|
| @@ -579,7 +612,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_);
|
|
|