Index: src/macro-assembler-arm.cc |
=================================================================== |
--- src/macro-assembler-arm.cc (revision 544) |
+++ src/macro-assembler-arm.cc (working copy) |
@@ -648,8 +648,8 @@ |
void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg, |
- Register scratch, |
- Label* miss) { |
+ Register scratch, |
+ Label* miss) { |
Label same_contexts; |
ASSERT(!holder_reg.is(scratch)); |
@@ -671,10 +671,15 @@ |
// Check the context is a global context. |
if (FLAG_debug_code) { |
+ // TODO(119): avoid push(holder_reg)/pop(holder_reg) |
+ // Cannot use ip as a temporary in this verification code. Due to the fact |
+ // that ip is clobbered as part of cmp with an object Operand. |
+ push(holder_reg); // Temporarily save holder on the stack. |
// Read the first word and compare to the global_context_map. |
- ldr(ip, FieldMemOperand(scratch, HeapObject::kMapOffset)); |
- cmp(ip, Operand(Factory::global_context_map())); |
+ ldr(holder_reg, FieldMemOperand(scratch, HeapObject::kMapOffset)); |
+ cmp(holder_reg, Operand(Factory::global_context_map())); |
Check(eq, "JSGlobalObject::global_context should be a global context."); |
+ pop(holder_reg); // Restore holder. |
} |
// Check if both contexts are the same. |
@@ -684,12 +689,19 @@ |
// Check the context is a global context. |
if (FLAG_debug_code) { |
- cmp(ip, Operand(Factory::null_value())); |
+ // TODO(119): avoid push(holder_reg)/pop(holder_reg) |
+ // Cannot use ip as a temporary in this verification code. Due to the fact |
+ // that ip is clobbered as part of cmp with an object Operand. |
+ push(holder_reg); // Temporarily save holder on the stack. |
+ mov(holder_reg, ip); // Move ip to its holding place. |
+ cmp(holder_reg, Operand(Factory::null_value())); |
Check(ne, "JSGlobalProxy::context() should not be null."); |
- ldr(ip, FieldMemOperand(ip, HeapObject::kMapOffset)); |
- cmp(ip, Operand(Factory::global_context_map())); |
+ ldr(holder_reg, FieldMemOperand(holder_reg, HeapObject::kMapOffset)); |
+ cmp(holder_reg, Operand(Factory::global_context_map())); |
Check(eq, "JSGlobalObject::global_context should be a global context."); |
+ // Restore ip is not needed. ip is reloaded below. |
+ pop(holder_reg); // Restore holder. |
// Restore ip to holder's context. |
ldr(ip, FieldMemOperand(holder_reg, JSGlobalProxy::kContextOffset)); |
} |