- ip register cannot be used when accessing large constants in the instruction
stream. Enhance the debug code to save and restore the unused holder_reg at these points. - Fix lint issues. Review URL: http://codereview.chromium.org/8039 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@545 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
202dedbdb3
commit
ba6502bd64
@ -526,7 +526,6 @@ void Genesis::CreateRoots(v8::Handle<v8::ObjectTemplate> global_template,
|
||||
}
|
||||
|
||||
{ // --- G l o b a l ---
|
||||
|
||||
// Step 1: create a fresh inner JSGlobalObject
|
||||
Handle<JSGlobalObject> object;
|
||||
{
|
||||
|
@ -671,10 +671,15 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
|
||||
|
||||
// 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 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
|
||||
|
||||
// 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));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user