Chromium Code Reviews| Index: src/frames.cc |
| =================================================================== |
| --- src/frames.cc (revision 15486) |
| +++ src/frames.cc (working copy) |
| @@ -539,7 +539,11 @@ |
| state->sp = sp; |
| state->fp = fp; |
| state->pc_address = ResolveReturnAddressLocation( |
| +#ifndef V8_TARGET_ARCH_X32 |
| reinterpret_cast<Address*>(sp - 1 * kPointerSize)); |
|
danno
2013/07/17 13:33:21
Use kPCOnStackSize to make fully cross-platform
|
| +#else |
| + reinterpret_cast<Address*>(sp - 1 * kHWRegSize)); |
| +#endif |
| } |
| @@ -1499,9 +1503,13 @@ |
| FixedArray* array, |
| int offset, |
| int previous_handler_offset) const { |
| +#ifndef V8_TARGET_ARCH_X32 |
| STATIC_ASSERT(StackHandlerConstants::kSlotCount == 5); |
|
danno
2013/07/17 13:33:21
Compute using kPCOnStackSize to make fully cross-p
|
| +#else |
| + STATIC_ASSERT(StackHandlerConstants::kSlotCount == 6); |
| +#endif |
| ASSERT_LE(0, offset); |
| - ASSERT_GE(array->length(), offset + 5); |
| + ASSERT_GE(array->length(), offset + StackHandlerConstants::kSlotCount); |
| // Unwinding a stack handler into an array chains it in the opposite |
| // direction, re-using the "next" slot as a "previous" link, so that stack |
| // handlers can be later re-wound in the correct order. Decode the "state" |
| @@ -1511,6 +1519,9 @@ |
| array->set(offset + 2, Smi::FromInt(static_cast<int>(index()))); // state |
| array->set(offset + 3, *context_address()); // context |
| array->set(offset + 4, Smi::FromInt(static_cast<int>(kind()))); // fp |
| +#if V8_TARGET_ARCH_X32 |
| + array->set(offset + 5, Smi::FromInt(0)); // high-32 bit of fp |
| +#endif |
| *isolate->handler_address() = next()->address(); |
| } |
| @@ -1520,9 +1531,13 @@ |
| FixedArray* array, |
| int offset, |
| Address fp) { |
| +#ifndef V8_TARGET_ARCH_X32 |
| STATIC_ASSERT(StackHandlerConstants::kSlotCount == 5); |
| +#else |
| + STATIC_ASSERT(StackHandlerConstants::kSlotCount == 6); |
| +#endif |
| ASSERT_LE(0, offset); |
| - ASSERT_GE(array->length(), offset + 5); |
| + ASSERT_GE(array->length(), offset + StackHandlerConstants::kSlotCount); |
| Smi* prev_handler_offset = Smi::cast(array->get(offset)); |
| Code* code = Code::cast(array->get(offset + 1)); |
| Smi* smi_index = Smi::cast(array->get(offset + 2)); |
| @@ -1539,6 +1554,9 @@ |
| Memory::Object_at(address() + StackHandlerConstants::kContextOffset) = |
| context; |
| Memory::Address_at(address() + StackHandlerConstants::kFPOffset) = fp; |
| +#if V8_TARGET_ARCH_X32 |
| + Memory::Address_at(address() + StackHandlerConstants::kFPOffset + 4) = 0; |
| +#endif |
| *isolate->handler_address() = address(); |