| Index: runtime/vm/stack_frame.cc | 
| =================================================================== | 
| --- runtime/vm/stack_frame.cc	(revision 30084) | 
| +++ 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 | 
| +    // 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); | 
| } | 
|  | 
|  |