| Index: src/mips/full-codegen-mips.cc
|
| diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc
|
| index 9b6ee0b67906f678246b5469292372fb470e8ade..e30d9b5ac2cce181bcd52d64f2f19f7c6259dfec 100644
|
| --- a/src/mips/full-codegen-mips.cc
|
| +++ b/src/mips/full-codegen-mips.cc
|
| @@ -139,6 +139,7 @@ class JumpPatchSite BASE_EMBEDDED {
|
| void FullCodeGenerator::Generate(CompilationInfo* info) {
|
| ASSERT(info_ == NULL);
|
| info_ = info;
|
| + scope_ = info->scope();
|
| SetFunctionPosition(function());
|
| Comment cmnt(masm_, "[ function compiled by full code generator");
|
|
|
| @@ -156,13 +157,13 @@ void FullCodeGenerator::Generate(CompilationInfo* info) {
|
| if (info->is_strict_mode() || info->is_native()) {
|
| Label ok;
|
| __ Branch(&ok, eq, t1, Operand(zero_reg));
|
| - int receiver_offset = scope()->num_parameters() * kPointerSize;
|
| + int receiver_offset = info->scope()->num_parameters() * kPointerSize;
|
| __ LoadRoot(a2, Heap::kUndefinedValueRootIndex);
|
| __ sw(a2, MemOperand(sp, receiver_offset));
|
| __ bind(&ok);
|
| }
|
|
|
| - int locals_count = scope()->num_stack_slots();
|
| + int locals_count = info->scope()->num_stack_slots();
|
|
|
| __ Push(ra, fp, cp, a1);
|
| if (locals_count > 0) {
|
| @@ -182,7 +183,7 @@ void FullCodeGenerator::Generate(CompilationInfo* info) {
|
| bool function_in_register = true;
|
|
|
| // Possibly allocate a local context.
|
| - int heap_slots = scope()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS;
|
| + int heap_slots = info->scope()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS;
|
| if (heap_slots > 0) {
|
| Comment cmnt(masm_, "[ Allocate local context");
|
| // Argument to NewContext is the function, which is in a1.
|
| @@ -198,7 +199,7 @@ void FullCodeGenerator::Generate(CompilationInfo* info) {
|
| // passed to us. It's saved in the stack and kept live in cp.
|
| __ sw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
|
| // Copy any necessary parameters into the context.
|
| - int num_parameters = scope()->num_parameters();
|
| + int num_parameters = info->scope()->num_parameters();
|
| for (int i = 0; i < num_parameters; i++) {
|
| Slot* slot = scope()->parameter(i)->AsSlot();
|
| if (slot != NULL && slot->type() == Slot::CONTEXT) {
|
| @@ -230,10 +231,11 @@ void FullCodeGenerator::Generate(CompilationInfo* info) {
|
| __ mov(a3, a1);
|
| }
|
| // Receiver is just before the parameters on the caller's stack.
|
| - int offset = scope()->num_parameters() * kPointerSize;
|
| + int num_parameters = info->scope()->num_parameters();
|
| + int offset = num_parameters * kPointerSize;
|
| __ Addu(a2, fp,
|
| Operand(StandardFrameConstants::kCallerSPOffset + offset));
|
| - __ li(a1, Operand(Smi::FromInt(scope()->num_parameters())));
|
| + __ li(a1, Operand(Smi::FromInt(num_parameters)));
|
| __ Push(a3, a2, a1);
|
|
|
| // Arguments to ArgumentsAccessStub:
|
| @@ -350,7 +352,7 @@ void FullCodeGenerator::EmitReturnSequence() {
|
| { Assembler::BlockTrampolinePoolScope block_trampoline_pool(masm_);
|
| // Here we use masm_-> instead of the __ macro to avoid the code coverage
|
| // tool from instrumenting as we rely on the code size here.
|
| - int32_t sp_delta = (scope()->num_parameters() + 1) * kPointerSize;
|
| + int32_t sp_delta = (info_->scope()->num_parameters() + 1) * kPointerSize;
|
| CodeGenerator::RecordPositions(masm_, function()->end_position() - 1);
|
| __ RecordJSReturn();
|
| masm_->mov(sp, fp);
|
| @@ -2139,7 +2141,8 @@ void FullCodeGenerator::EmitResolvePossiblyDirectEval(ResolveEvalFlag flag,
|
| __ push(a1);
|
|
|
| // Push the receiver of the enclosing function and do runtime call.
|
| - __ lw(a1, MemOperand(fp, (2 + scope()->num_parameters()) * kPointerSize));
|
| + int receiver_offset = 2 + info_->scope()->num_parameters();
|
| + __ lw(a1, MemOperand(fp, receiver_offset * kPointerSize));
|
| __ push(a1);
|
| // Push the strict mode flag.
|
| __ li(a1, Operand(Smi::FromInt(strict_mode_flag())));
|
| @@ -2685,7 +2688,7 @@ void FullCodeGenerator::EmitArguments(ZoneList<Expression*>* args) {
|
| // parameter count in a0.
|
| VisitForAccumulatorValue(args->at(0));
|
| __ mov(a1, v0);
|
| - __ li(a0, Operand(Smi::FromInt(scope()->num_parameters())));
|
| + __ li(a0, Operand(Smi::FromInt(info_->scope()->num_parameters())));
|
| ArgumentsAccessStub stub(ArgumentsAccessStub::READ_ELEMENT);
|
| __ CallStub(&stub);
|
| context()->Plug(v0);
|
| @@ -2697,7 +2700,7 @@ void FullCodeGenerator::EmitArgumentsLength(ZoneList<Expression*>* args) {
|
|
|
| Label exit;
|
| // Get the number of formal parameters.
|
| - __ li(v0, Operand(Smi::FromInt(scope()->num_parameters())));
|
| + __ li(v0, Operand(Smi::FromInt(info_->scope()->num_parameters())));
|
|
|
| // Check if the calling frame is an arguments adaptor frame.
|
| __ lw(a2, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
|
| @@ -4238,7 +4241,7 @@ void FullCodeGenerator::PushFunctionArgumentForContextAllocation() {
|
| // code. Fetch it from the context.
|
| __ lw(at, ContextOperand(cp, Context::CLOSURE_INDEX));
|
| } else {
|
| - ASSERT(scope()->is_function_scope());
|
| + ASSERT(scope()->is_function_scope() || scope()->is_catch_scope());
|
| __ lw(at, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
|
| }
|
| __ push(at);
|
|
|