Chromium Code Reviews| Index: runtime/vm/stack_frame.cc |
| =================================================================== |
| --- runtime/vm/stack_frame.cc (revision 29988) |
| +++ runtime/vm/stack_frame.cc (working copy) |
| @@ -61,21 +61,24 @@ |
| // helper functions to the raw object interface. |
| ASSERT(visitor != NULL); |
| NoGCScope no_gc; |
| - RawObject** first = reinterpret_cast<RawObject**>(sp()); |
| - RawObject** last = reinterpret_cast<RawObject**>( |
| - fp() + (kFirstLocalSlotFromFp * kWordSize)); |
| Code code; |
| code = LookupDartCode(); |
| if (!code.IsNull()) { |
| // Visit the code object. |
| RawObject* raw_code = code.raw(); |
| visitor->VisitPointer(&raw_code); |
| - // Visit stack based on stack maps. |
| + |
| + // Optimized frames have a stack map we need to visit the frame based |
|
zra
2013/11/07 19:28:17
map. We
siva
2013/11/07 23:08:19
Done.
|
| + // on the stack map. |
| Array maps; |
| maps = Array::null(); |
| Stackmap map; |
| map = code.GetStackmap(pc(), &maps, &map); |
| if (!map.IsNull()) { |
| + RawObject** first = reinterpret_cast<RawObject**>(sp()); |
| + RawObject** last = reinterpret_cast<RawObject**>( |
| + fp() + (kFirstLocalSlotFromFp * kWordSize)); |
| + |
| // A stack map is present in the code object, use the stack map to |
| // visit frame slots which are marked as having objects. |
| // |
| @@ -108,9 +111,22 @@ |
| // The last slot can be one slot (but not more) past the last slot |
| // in the case that all slots were covered by the stack map. |
| ASSERT((last + 1) >= first); |
| + visitor->VisitPointers(first, last); |
| + |
| + // Now visit other slots which might be part of the calling convention. |
| + first = reinterpret_cast<RawObject**>( |
| + fp() + ((kFirstLocalSlotFromFp + 1) * kWordSize)); |
| + last = reinterpret_cast<RawObject**>( |
| + fp() + (kFirstObjectSlotFromFp * kWordSize)); |
| + visitor->VisitPointers(first, last); |
| + return; |
| } |
| } |
| - // Each slot between the first and last included are tagged objects. |
| + // For normal unoptimized Dart frames and Stub frames each slot |
| + // between the first and last included are tagged objects. |
| + RawObject** first = reinterpret_cast<RawObject**>(sp()); |
| + RawObject** last = reinterpret_cast<RawObject**>( |
| + fp() + (kFirstObjectSlotFromFp * kWordSize)); |
| visitor->VisitPointers(first, last); |
| } |