| Index: src/frames.cc
|
| diff --git a/src/frames.cc b/src/frames.cc
|
| index 3b55c276cf3b4cfa6d4cb972f87370cd6bd7e5ee..e9df843e87102d2532712626b5e493f29b40ecba 100644
|
| --- a/src/frames.cc
|
| +++ b/src/frames.cc
|
| @@ -652,6 +652,32 @@ void StandardFrame::IterateCompiledFrame(ObjectVisitor* v) const {
|
| parameters_base += safepoint_entry.argument_count();
|
| }
|
|
|
| +#if V8_TARGET_ARCH_ARM
|
| + // The frame must have been generated within LCodegen::GeneratedCode where
|
| + // registers_mask and double_registers_mask are set.
|
| + ASSERT(code->registers_mask() != kRegListEmpty);
|
| + // Skip saved double registers.
|
| + if (safepoint_entry.has_doubles()) {
|
| + parameters_base +=
|
| + CompilerIntrinsics::CountSetBits(code->double_registers_mask()) *
|
| + kDoubleSize / kPointerSize;
|
| + }
|
| +
|
| + // Visit the registers that contain pointers if any.
|
| + if (safepoint_entry.HasRegisters()) {
|
| + RegList registers_mask = code->registers_mask();
|
| + for (int i = 0; i < kNumSafepointRegisters; i++) {
|
| + if ((registers_mask & (1 << i)) != 0) {
|
| + if (safepoint_entry.HasRegisterAt(i)) {
|
| + v->VisitPointer(parameters_base);
|
| + }
|
| + parameters_base++;
|
| + } else {
|
| + ASSERT(!safepoint_entry.HasRegisterAt(i));
|
| + }
|
| + }
|
| + }
|
| +#else
|
| // Skip saved double registers.
|
| if (safepoint_entry.has_doubles()) {
|
| // Number of doubles not known at snapshot time.
|
| @@ -671,6 +697,7 @@ void StandardFrame::IterateCompiledFrame(ObjectVisitor* v) const {
|
| // Skip the words containing the register values.
|
| parameters_base += kNumSafepointRegisters;
|
| }
|
| +#endif
|
|
|
| // We're done dealing with the register bits.
|
| uint8_t* safepoint_bits = safepoint_entry.bits();
|
|
|