| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved.7 | 1 // Copyright 2012 the V8 project authors. All rights reserved.7 | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 136 #endif | 136 #endif | 
| 137 | 137 | 
| 138     // a1: Callee's JS function. | 138     // a1: Callee's JS function. | 
| 139     // cp: Callee's context. | 139     // cp: Callee's context. | 
| 140     // fp: Caller's frame pointer. | 140     // fp: Caller's frame pointer. | 
| 141     // lr: Caller's pc. | 141     // lr: Caller's pc. | 
| 142 | 142 | 
| 143     // Sloppy mode functions and builtins need to replace the receiver with the | 143     // Sloppy mode functions and builtins need to replace the receiver with the | 
| 144     // global proxy when called as functions (without an explicit receiver | 144     // global proxy when called as functions (without an explicit receiver | 
| 145     // object). | 145     // object). | 
| 146     if (is_sloppy(info_->language_mode()) && info()->MayUseThis() && | 146     if (is_sloppy(info()->language_mode()) && info()->MayUseThis() && | 
| 147         !info_->is_native()) { | 147         !info()->is_native() && info()->scope()->has_this_declaration()) { | 
| 148       Label ok; | 148       Label ok; | 
| 149       int receiver_offset = info_->scope()->num_parameters() * kPointerSize; | 149       int receiver_offset = info_->scope()->num_parameters() * kPointerSize; | 
| 150       __ LoadRoot(at, Heap::kUndefinedValueRootIndex); | 150       __ LoadRoot(at, Heap::kUndefinedValueRootIndex); | 
| 151       __ lw(a2, MemOperand(sp, receiver_offset)); | 151       __ lw(a2, MemOperand(sp, receiver_offset)); | 
| 152       __ Branch(&ok, ne, a2, Operand(at)); | 152       __ Branch(&ok, ne, a2, Operand(at)); | 
| 153 | 153 | 
| 154       __ lw(a2, GlobalObjectOperand()); | 154       __ lw(a2, GlobalObjectOperand()); | 
| 155       __ lw(a2, FieldMemOperand(a2, GlobalObject::kGlobalProxyOffset)); | 155       __ lw(a2, FieldMemOperand(a2, GlobalObject::kGlobalProxyOffset)); | 
| 156 | 156 | 
| 157       __ sw(a2, MemOperand(sp, receiver_offset)); | 157       __ sw(a2, MemOperand(sp, receiver_offset)); | 
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 210       __ push(a1); | 210       __ push(a1); | 
| 211       __ CallRuntime(Runtime::kNewFunctionContext, 1); | 211       __ CallRuntime(Runtime::kNewFunctionContext, 1); | 
| 212     } | 212     } | 
| 213     RecordSafepoint(Safepoint::kNoLazyDeopt); | 213     RecordSafepoint(Safepoint::kNoLazyDeopt); | 
| 214     // Context is returned in both v0. It replaces the context passed to us. | 214     // Context is returned in both v0. It replaces the context passed to us. | 
| 215     // It's saved in the stack and kept live in cp. | 215     // It's saved in the stack and kept live in cp. | 
| 216     __ mov(cp, v0); | 216     __ mov(cp, v0); | 
| 217     __ sw(v0, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 217     __ sw(v0, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 
| 218     // Copy any necessary parameters into the context. | 218     // Copy any necessary parameters into the context. | 
| 219     int num_parameters = scope()->num_parameters(); | 219     int num_parameters = scope()->num_parameters(); | 
| 220     for (int i = 0; i < num_parameters; i++) { | 220     int first_parameter = scope()->has_this_declaration() ? -1 : 0; | 
| 221       Variable* var = scope()->parameter(i); | 221     for (int i = first_parameter; i < num_parameters; i++) { | 
|  | 222       Variable* var = (i == -1) ? scope()->receiver() : scope()->parameter(i); | 
| 222       if (var->IsContextSlot()) { | 223       if (var->IsContextSlot()) { | 
| 223         int parameter_offset = StandardFrameConstants::kCallerSPOffset + | 224         int parameter_offset = StandardFrameConstants::kCallerSPOffset + | 
| 224             (num_parameters - 1 - i) * kPointerSize; | 225             (num_parameters - 1 - i) * kPointerSize; | 
| 225         // Load parameter from stack. | 226         // Load parameter from stack. | 
| 226         __ lw(a0, MemOperand(fp, parameter_offset)); | 227         __ lw(a0, MemOperand(fp, parameter_offset)); | 
| 227         // Store it in the context. | 228         // Store it in the context. | 
| 228         MemOperand target = ContextOperand(cp, var->index()); | 229         MemOperand target = ContextOperand(cp, var->index()); | 
| 229         __ sw(a0, target); | 230         __ sw(a0, target); | 
| 230         // Update the write barrier. This clobbers a3 and a0. | 231         // Update the write barrier. This clobbers a3 and a0. | 
| 231         if (need_write_barrier) { | 232         if (need_write_barrier) { | 
| (...skipping 5768 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6000   __ li(at, scope_info); | 6001   __ li(at, scope_info); | 
| 6001   __ Push(at, ToRegister(instr->function())); | 6002   __ Push(at, ToRegister(instr->function())); | 
| 6002   CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6003   CallRuntime(Runtime::kPushBlockContext, 2, instr); | 
| 6003   RecordSafepoint(Safepoint::kNoLazyDeopt); | 6004   RecordSafepoint(Safepoint::kNoLazyDeopt); | 
| 6004 } | 6005 } | 
| 6005 | 6006 | 
| 6006 | 6007 | 
| 6007 #undef __ | 6008 #undef __ | 
| 6008 | 6009 | 
| 6009 } }  // namespace v8::internal | 6010 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|