Index: trunk/src/ia32/codegen-ia32.cc |
=================================================================== |
--- trunk/src/ia32/codegen-ia32.cc (revision 3508) |
+++ trunk/src/ia32/codegen-ia32.cc (working copy) |
@@ -174,7 +174,7 @@ |
function_return_is_shadowed_ = false; |
// Allocate the local context if needed. |
- int heap_slots = scope_->num_heap_slots(); |
+ int heap_slots = scope_->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; |
if (heap_slots > 0) { |
Comment cmnt(masm_, "[ allocate local context"); |
// Allocate local context. |
@@ -6741,8 +6741,11 @@ |
__ mov(Operand(eax, Context::SlotOffset(Context::PREVIOUS_INDEX)), ebx); |
__ mov(Operand(eax, Context::SlotOffset(Context::EXTENSION_INDEX)), ebx); |
- // Copy the global object from the surrounding context. |
- __ mov(ebx, Operand(esi, Context::SlotOffset(Context::GLOBAL_INDEX))); |
+ // Copy the global object from the surrounding context. We go through the |
+ // context in the function (ecx) to match the allocation behavior we have |
+ // in the runtime system (see Heap::AllocateFunctionContext). |
+ __ mov(ebx, FieldOperand(ecx, JSFunction::kContextOffset)); |
+ __ mov(ebx, Operand(ebx, Context::SlotOffset(Context::GLOBAL_INDEX))); |
__ mov(Operand(eax, Context::SlotOffset(Context::GLOBAL_INDEX)), ebx); |
// Initialize the rest of the slots to undefined. |