| Index: src/arm/codegen-arm.cc
 | 
| ===================================================================
 | 
| --- src/arm/codegen-arm.cc	(revision 3788)
 | 
| +++ src/arm/codegen-arm.cc	(working copy)
 | 
| @@ -121,14 +121,10 @@
 | 
|  // -------------------------------------------------------------------------
 | 
|  // CodeGenerator implementation
 | 
|  
 | 
| -CodeGenerator::CodeGenerator(MacroAssembler* masm,
 | 
| -                             Handle<Script> script,
 | 
| -                             bool is_eval)
 | 
| -    : is_eval_(is_eval),
 | 
| -      script_(script),
 | 
| -      deferred_(8),
 | 
| +CodeGenerator::CodeGenerator(MacroAssembler* masm)
 | 
| +    : deferred_(8),
 | 
|        masm_(masm),
 | 
| -      scope_(NULL),
 | 
| +      info_(NULL),
 | 
|        frame_(NULL),
 | 
|        allocator_(NULL),
 | 
|        cc_reg_(al),
 | 
| @@ -137,23 +133,21 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +Scope* CodeGenerator::scope() { return info_->function()->scope(); }
 | 
| +
 | 
| +
 | 
|  // Calling conventions:
 | 
|  // fp: caller's frame pointer
 | 
|  // sp: stack pointer
 | 
|  // r1: called JS function
 | 
|  // cp: callee's context
 | 
|  
 | 
| -void CodeGenerator::Generate(FunctionLiteral* fun,
 | 
| -                             Mode mode,
 | 
| -                             CompilationInfo* info) {
 | 
| +void CodeGenerator::Generate(CompilationInfo* info, Mode mode) {
 | 
|    // Record the position for debugging purposes.
 | 
| -  CodeForFunctionPosition(fun);
 | 
| +  CodeForFunctionPosition(info->function());
 | 
|  
 | 
| -  ZoneList<Statement*>* body = fun->body();
 | 
| -
 | 
|    // Initialize state.
 | 
| -  ASSERT(scope_ == NULL);
 | 
| -  scope_ = fun->scope();
 | 
| +  info_ = info;
 | 
|    ASSERT(allocator_ == NULL);
 | 
|    RegisterAllocator register_allocator(this);
 | 
|    allocator_ = ®ister_allocator;
 | 
| @@ -174,7 +168,7 @@
 | 
|  
 | 
|  #ifdef DEBUG
 | 
|      if (strlen(FLAG_stop_at) > 0 &&
 | 
| -        fun->name()->IsEqualTo(CStrVector(FLAG_stop_at))) {
 | 
| +        info->function()->name()->IsEqualTo(CStrVector(FLAG_stop_at))) {
 | 
|        frame_->SpillAll();
 | 
|        __ stop("stop-at");
 | 
|      }
 | 
| @@ -189,7 +183,7 @@
 | 
|        frame_->AllocateStackSlots();
 | 
|  
 | 
|        VirtualFrame::SpilledScope spilled_scope;
 | 
| -      int heap_slots = scope_->num_heap_slots();
 | 
| +      int heap_slots = scope()->num_heap_slots();
 | 
|        if (heap_slots > 0) {
 | 
|          // Allocate local context.
 | 
|          // Get outer context and create a new context based on it.
 | 
| @@ -219,7 +213,6 @@
 | 
|        // 3) don't copy parameter operand code from SlotOperand!
 | 
|        {
 | 
|          Comment cmnt2(masm_, "[ copy context parameters into .context");
 | 
| -
 | 
|          // Note that iteration order is relevant here! If we have the same
 | 
|          // parameter twice (e.g., function (x, y, x)), and that parameter
 | 
|          // needs to be copied into the context, it must be the last argument
 | 
| @@ -228,12 +221,11 @@
 | 
|          // order: such a parameter is copied repeatedly into the same
 | 
|          // context location and thus the last value is what is seen inside
 | 
|          // the function.
 | 
| -        for (int i = 0; i < scope_->num_parameters(); i++) {
 | 
| -          Variable* par = scope_->parameter(i);
 | 
| +        for (int i = 0; i < scope()->num_parameters(); i++) {
 | 
| +          Variable* par = scope()->parameter(i);
 | 
|            Slot* slot = par->slot();
 | 
|            if (slot != NULL && slot->type() == Slot::CONTEXT) {
 | 
| -            // No parameters in global scope.
 | 
| -            ASSERT(!scope_->is_global_scope());
 | 
| +            ASSERT(!scope()->is_global_scope());  // no parameters in global scope
 | 
|              __ ldr(r1, frame_->ParameterAt(i));
 | 
|              // Loads r2 with context; used below in RecordWrite.
 | 
|              __ str(r1, SlotOperand(slot, r2));
 | 
| @@ -249,20 +241,20 @@
 | 
|        // Store the arguments object.  This must happen after context
 | 
|        // initialization because the arguments object may be stored in the
 | 
|        // context.
 | 
| -      if (scope_->arguments() != NULL) {
 | 
| +      if (scope()->arguments() != NULL) {
 | 
|          Comment cmnt(masm_, "[ allocate arguments object");
 | 
| -        ASSERT(scope_->arguments_shadow() != NULL);
 | 
| -        Variable* arguments = scope_->arguments()->var();
 | 
| -        Variable* shadow = scope_->arguments_shadow()->var();
 | 
| +        ASSERT(scope()->arguments_shadow() != NULL);
 | 
| +        Variable* arguments = scope()->arguments()->var();
 | 
| +        Variable* shadow = scope()->arguments_shadow()->var();
 | 
|          ASSERT(arguments != NULL && arguments->slot() != NULL);
 | 
|          ASSERT(shadow != NULL && shadow->slot() != NULL);
 | 
|          ArgumentsAccessStub stub(ArgumentsAccessStub::NEW_OBJECT);
 | 
|          __ ldr(r2, frame_->Function());
 | 
|          // The receiver is below the arguments, the return address, and the
 | 
|          // frame pointer on the stack.
 | 
| -        const int kReceiverDisplacement = 2 + scope_->num_parameters();
 | 
| +        const int kReceiverDisplacement = 2 + scope()->num_parameters();
 | 
|          __ add(r1, fp, Operand(kReceiverDisplacement * kPointerSize));
 | 
| -        __ mov(r0, Operand(Smi::FromInt(scope_->num_parameters())));
 | 
| +        __ mov(r0, Operand(Smi::FromInt(scope()->num_parameters())));
 | 
|          frame_->Adjust(3);
 | 
|          __ stm(db_w, sp, r0.bit() | r1.bit() | r2.bit());
 | 
|          frame_->CallStub(&stub, 3);
 | 
| @@ -273,10 +265,10 @@
 | 
|        }
 | 
|  
 | 
|        // Initialize ThisFunction reference if present.
 | 
| -      if (scope_->is_function_scope() && scope_->function() != NULL) {
 | 
| +      if (scope()->is_function_scope() && scope()->function() != NULL) {
 | 
|          __ mov(ip, Operand(Factory::the_hole_value()));
 | 
|          frame_->EmitPush(ip);
 | 
| -        StoreToSlot(scope_->function()->slot(), NOT_CONST_INIT);
 | 
| +        StoreToSlot(scope()->function()->slot(), NOT_CONST_INIT);
 | 
|        }
 | 
|      } else {
 | 
|        // When used as the secondary compiler for splitting, r1, cp,
 | 
| @@ -295,12 +287,12 @@
 | 
|      // Generate code to 'execute' declarations and initialize functions
 | 
|      // (source elements). In case of an illegal redeclaration we need to
 | 
|      // handle that instead of processing the declarations.
 | 
| -    if (scope_->HasIllegalRedeclaration()) {
 | 
| +    if (scope()->HasIllegalRedeclaration()) {
 | 
|        Comment cmnt(masm_, "[ illegal redeclarations");
 | 
| -      scope_->VisitIllegalRedeclaration(this);
 | 
| +      scope()->VisitIllegalRedeclaration(this);
 | 
|      } else {
 | 
|        Comment cmnt(masm_, "[ declarations");
 | 
| -      ProcessDeclarations(scope_->declarations());
 | 
| +      ProcessDeclarations(scope()->declarations());
 | 
|        // Bail out if a stack-overflow exception occurred when processing
 | 
|        // declarations.
 | 
|        if (HasStackOverflow()) return;
 | 
| @@ -314,7 +306,7 @@
 | 
|      // Compile the body of the function in a vanilla state. Don't
 | 
|      // bother compiling all the code if the scope has an illegal
 | 
|      // redeclaration.
 | 
| -    if (!scope_->HasIllegalRedeclaration()) {
 | 
| +    if (!scope()->HasIllegalRedeclaration()) {
 | 
|        Comment cmnt(masm_, "[ function body");
 | 
|  #ifdef DEBUG
 | 
|        bool is_builtin = Bootstrapper::IsActive();
 | 
| @@ -325,14 +317,14 @@
 | 
|          // Ignore the return value.
 | 
|        }
 | 
|  #endif
 | 
| -      VisitStatementsAndSpill(body);
 | 
| +      VisitStatementsAndSpill(info->function()->body());
 | 
|      }
 | 
|    }
 | 
|  
 | 
|    // Generate the return sequence if necessary.
 | 
|    if (has_valid_frame() || function_return_.is_linked()) {
 | 
|      if (!function_return_.is_linked()) {
 | 
| -      CodeForReturnPosition(fun);
 | 
| +      CodeForReturnPosition(info->function());
 | 
|      }
 | 
|      // exit
 | 
|      // r0: result
 | 
| @@ -355,7 +347,7 @@
 | 
|  
 | 
|      // Calculate the exact length of the return sequence and make sure that
 | 
|      // the constant pool is not emitted inside of the return sequence.
 | 
| -    int32_t sp_delta = (scope_->num_parameters() + 1) * kPointerSize;
 | 
| +    int32_t sp_delta = (scope()->num_parameters() + 1) * kPointerSize;
 | 
|      int return_sequence_length = Assembler::kJSReturnSequenceLength;
 | 
|      if (!masm_->ImmediateFitsAddrMode1Instruction(sp_delta)) {
 | 
|        // Additional mov instruction generated.
 | 
| @@ -395,7 +387,6 @@
 | 
|    }
 | 
|  
 | 
|    allocator_ = NULL;
 | 
| -  scope_ = NULL;
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -2341,7 +2332,7 @@
 | 
|  
 | 
|    // Build the function boilerplate and instantiate it.
 | 
|    Handle<JSFunction> boilerplate =
 | 
| -      Compiler::BuildBoilerplate(node, script_, this);
 | 
| +      Compiler::BuildBoilerplate(node, script(), this);
 | 
|    // Check for stack-overflow exception.
 | 
|    if (HasStackOverflow()) {
 | 
|      ASSERT(frame_->height() == original_height);
 | 
| @@ -3519,7 +3510,7 @@
 | 
|  
 | 
|    // Seed the result with the formal parameters count, which will be used
 | 
|    // in case no arguments adaptor frame is found below the current frame.
 | 
| -  __ mov(r0, Operand(Smi::FromInt(scope_->num_parameters())));
 | 
| +  __ mov(r0, Operand(Smi::FromInt(scope()->num_parameters())));
 | 
|  
 | 
|    // Call the shared stub to get to the arguments.length.
 | 
|    ArgumentsAccessStub stub(ArgumentsAccessStub::READ_LENGTH);
 | 
| @@ -3536,7 +3527,7 @@
 | 
|    // Load the key into r1 and the formal parameters count into r0.
 | 
|    LoadAndSpill(args->at(0));
 | 
|    frame_->EmitPop(r1);
 | 
| -  __ mov(r0, Operand(Smi::FromInt(scope_->num_parameters())));
 | 
| +  __ mov(r0, Operand(Smi::FromInt(scope()->num_parameters())));
 | 
|  
 | 
|    // Call the shared stub to get to arguments[key].
 | 
|    ArgumentsAccessStub stub(ArgumentsAccessStub::READ_ELEMENT);
 | 
| 
 |