Chromium Code Reviews| Index: src/arm/full-codegen-arm.cc |
| diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc |
| index e1cac3403694bc2c9a5e23a20d946dc24545997b..5b515d862f08136c2ec84aff6ae7299f769524a6 100644 |
| --- a/src/arm/full-codegen-arm.cc |
| +++ b/src/arm/full-codegen-arm.cc |
| @@ -131,6 +131,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"); |
| @@ -149,13 +150,13 @@ void FullCodeGenerator::Generate(CompilationInfo* info) { |
| Label ok; |
| __ cmp(r5, Operand(0)); |
| __ b(eq, &ok); |
| - int receiver_offset = scope()->num_parameters() * kPointerSize; |
| + int receiver_offset = info->scope()->num_parameters() * kPointerSize; |
|
Mads Ager (chromium)
2011/06/30 12:08:32
I'm getting a little confused here. You don't need
Kevin Millikin (Chromium)
2011/06/30 12:30:06
I'm being overly defensive. We are definitely not
|
| __ LoadRoot(r2, Heap::kUndefinedValueRootIndex); |
| __ str(r2, MemOperand(sp, receiver_offset)); |
| __ bind(&ok); |
| } |
| - int locals_count = scope()->num_stack_slots(); |
| + int locals_count = info->scope()->num_stack_slots(); |
| __ Push(lr, fp, cp, r1); |
| if (locals_count > 0) { |
| @@ -175,7 +176,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 r1. |
| @@ -191,7 +192,7 @@ void FullCodeGenerator::Generate(CompilationInfo* info) { |
| // passed to us. It's saved in the stack and kept live in cp. |
| __ str(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) { |
| @@ -222,10 +223,11 @@ void FullCodeGenerator::Generate(CompilationInfo* info) { |
| __ mov(r3, r1); |
| } |
| // 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; |
| __ add(r2, fp, |
| Operand(StandardFrameConstants::kCallerSPOffset + offset)); |
| - __ mov(r1, Operand(Smi::FromInt(scope()->num_parameters()))); |
| + __ mov(r1, Operand(Smi::FromInt(num_parameters))); |
| __ Push(r3, r2, r1); |
| // Arguments to ArgumentsAccessStub: |
| @@ -347,7 +349,7 @@ void FullCodeGenerator::EmitReturnSequence() { |
| { Assembler::BlockConstPoolScope block_const_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); |
| @@ -2123,7 +2125,8 @@ void FullCodeGenerator::EmitResolvePossiblyDirectEval(ResolveEvalFlag flag, |
| __ push(r1); |
| // Push the receiver of the enclosing function and do runtime call. |
| - __ ldr(r1, MemOperand(fp, (2 + scope()->num_parameters()) * kPointerSize)); |
| + int receiver_offset = 2 + info_->scope()->num_parameters(); |
| + __ ldr(r1, MemOperand(fp, receiver_offset * kPointerSize)); |
| __ push(r1); |
| // Push the strict mode flag. |
| __ mov(r1, Operand(Smi::FromInt(strict_mode_flag()))); |
| @@ -2675,7 +2678,7 @@ void FullCodeGenerator::EmitArguments(ZoneList<Expression*>* args) { |
| // parameter count in r0. |
| VisitForAccumulatorValue(args->at(0)); |
| __ mov(r1, r0); |
| - __ mov(r0, Operand(Smi::FromInt(scope()->num_parameters()))); |
| + __ mov(r0, Operand(Smi::FromInt(info_->scope()->num_parameters()))); |
| ArgumentsAccessStub stub(ArgumentsAccessStub::READ_ELEMENT); |
| __ CallStub(&stub); |
| context()->Plug(r0); |
| @@ -2687,7 +2690,7 @@ void FullCodeGenerator::EmitArgumentsLength(ZoneList<Expression*>* args) { |
| Label exit; |
| // Get the number of formal parameters. |
| - __ mov(r0, Operand(Smi::FromInt(scope()->num_parameters()))); |
| + __ mov(r0, Operand(Smi::FromInt(info_->scope()->num_parameters()))); |
| // Check if the calling frame is an arguments adaptor frame. |
| __ ldr(r2, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
| @@ -4233,7 +4236,7 @@ void FullCodeGenerator::PushFunctionArgumentForContextAllocation() { |
| // code. Fetch it from the context. |
| __ ldr(ip, ContextOperand(cp, Context::CLOSURE_INDEX)); |
| } else { |
| - ASSERT(scope()->is_function_scope()); |
| + ASSERT(scope()->is_function_scope() || scope()->is_catch_scope()); |
| __ ldr(ip, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |
| } |
| __ push(ip); |