| Index: runtime/vm/runtime_entry.cc | 
| diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc | 
| index 15bdab0595293f62d2741feb22174991e9b0a885..5c8e8a316ad9dcb5c5937d827e2955ff16fcad81 100644 | 
| --- a/runtime/vm/runtime_entry.cc | 
| +++ b/runtime/vm/runtime_entry.cc | 
| @@ -220,7 +220,8 @@ DEFINE_RUNTIME_ENTRY(AllocateArray, 2) { | 
|  | 
| // Helper returning the token position of the Dart caller. | 
| static TokenPosition GetCallerLocation() { | 
| -  DartFrameIterator iterator; | 
| +  DartFrameIterator iterator(Thread::Current(), | 
| +                             StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| ASSERT(caller_frame != NULL); | 
| return caller_frame->GetTokenPos(); | 
| @@ -382,7 +383,8 @@ static void PrintTypeCheck(const char* message, | 
| const TypeArguments& instantiator_type_arguments, | 
| const TypeArguments& function_type_arguments, | 
| const Bool& result) { | 
| -  DartFrameIterator iterator; | 
| +  DartFrameIterator iterator(Thread::Current(), | 
| +                             StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| ASSERT(caller_frame != NULL); | 
|  | 
| @@ -756,7 +758,8 @@ DEFINE_RUNTIME_ENTRY(ReThrow, 2) { | 
| // Patches static call in optimized code with the target's entry point. | 
| // Compiles target if necessary. | 
| DEFINE_RUNTIME_ENTRY(PatchStaticCall, 0) { | 
| -  DartFrameIterator iterator; | 
| +  DartFrameIterator iterator(thread, | 
| +                             StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| ASSERT(caller_frame != NULL); | 
| const Code& caller_code = Code::Handle(zone, caller_frame->LookupDartCode()); | 
| @@ -800,7 +803,8 @@ DEFINE_RUNTIME_ENTRY(BreakpointRuntimeHandler, 0) { | 
| UNREACHABLE(); | 
| return; | 
| } | 
| -  DartFrameIterator iterator; | 
| +  DartFrameIterator iterator(thread, | 
| +                             StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| ASSERT(caller_frame != NULL); | 
| const Code& orig_stub = Code::Handle( | 
| @@ -971,7 +975,8 @@ static RawFunction* InlineCacheMissHandler( | 
| ic_data.AddCheck(class_ids, target_function); | 
| } | 
| if (FLAG_trace_ic_miss_in_optimized || FLAG_trace_ic) { | 
| -    DartFrameIterator iterator; | 
| +    DartFrameIterator iterator(Thread::Current(), | 
| +                               StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| ASSERT(caller_frame != NULL); | 
| if (FLAG_trace_ic_miss_in_optimized) { | 
| @@ -1044,7 +1049,8 @@ DEFINE_RUNTIME_ENTRY(StaticCallMissHandlerOneArg, 2) { | 
| ASSERT(!target.IsNull() && target.HasCode()); | 
| ic_data.AddReceiverCheck(arg.GetClassId(), target, 1); | 
| if (FLAG_trace_ic) { | 
| -    DartFrameIterator iterator; | 
| +    DartFrameIterator iterator(thread, | 
| +                               StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| ASSERT(caller_frame != NULL); | 
| OS::PrintErr("StaticCallMissHandler at %#" Px " target %s (%" Pd ")\n", | 
| @@ -1072,7 +1078,8 @@ DEFINE_RUNTIME_ENTRY(StaticCallMissHandlerTwoArgs, 3) { | 
| cids.Add(arg1.GetClassId()); | 
| ic_data.AddCheck(cids, target); | 
| if (FLAG_trace_ic) { | 
| -    DartFrameIterator iterator; | 
| +    DartFrameIterator iterator(thread, | 
| +                               StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| ASSERT(caller_frame != NULL); | 
| OS::PrintErr("StaticCallMissHandler at %#" Px " target %s (%" Pd ", %" Pd | 
| @@ -1119,7 +1126,8 @@ DEFINE_RUNTIME_ENTRY(SingleTargetMiss, 1) { | 
| #else | 
| const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0)); | 
|  | 
| -  DartFrameIterator iterator; | 
| +  DartFrameIterator iterator(thread, | 
| +                             StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| ASSERT(caller_frame->IsDartFrame()); | 
| const Code& caller_code = Code::Handle(zone, caller_frame->LookupDartCode()); | 
| @@ -1205,7 +1213,8 @@ DEFINE_RUNTIME_ENTRY(UnlinkedCall, 2) { | 
| const UnlinkedCall& unlinked = | 
| UnlinkedCall::CheckedHandle(zone, arguments.ArgAt(1)); | 
|  | 
| -  DartFrameIterator iterator; | 
| +  DartFrameIterator iterator(thread, | 
| +                             StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| ASSERT(caller_frame->IsDartFrame()); | 
| const Code& caller_code = Code::Handle(zone, caller_frame->LookupDartCode()); | 
| @@ -1271,7 +1280,8 @@ DEFINE_RUNTIME_ENTRY(MonomorphicMiss, 1) { | 
| #else | 
| const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0)); | 
|  | 
| -  DartFrameIterator iterator; | 
| +  DartFrameIterator iterator(thread, | 
| +                             StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| ASSERT(caller_frame->IsDartFrame()); | 
| const Code& caller_code = Code::Handle(zone, caller_frame->LookupDartCode()); | 
| @@ -1411,7 +1421,8 @@ DEFINE_RUNTIME_ENTRY(MegamorphicCacheMissHandler, 3) { | 
| const Code& target_code = | 
| Code::Handle(zone, target_function.EnsureHasCode()); | 
|  | 
| -      DartFrameIterator iterator; | 
| +      DartFrameIterator iterator(thread, | 
| +                                 StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* miss_function_frame = iterator.NextFrame(); | 
| ASSERT(miss_function_frame->IsDartFrame()); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| @@ -1429,7 +1440,8 @@ DEFINE_RUNTIME_ENTRY(MegamorphicCacheMissHandler, 3) { | 
| // Switch to megamorphic call. | 
| const MegamorphicCache& cache = MegamorphicCache::Handle( | 
| zone, MegamorphicCacheTable::Lookup(isolate, name, descriptor)); | 
| -        DartFrameIterator iterator; | 
| +        DartFrameIterator iterator(thread, | 
| +                                   StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* miss_function_frame = iterator.NextFrame(); | 
| ASSERT(miss_function_frame->IsDartFrame()); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| @@ -1669,7 +1681,8 @@ DEFINE_RUNTIME_ENTRY(StackOverflow, 0) { | 
| } | 
| if ((FLAG_deoptimize_filter != NULL) || (FLAG_stacktrace_filter != NULL) || | 
| FLAG_reload_every_optimized) { | 
| -    DartFrameIterator iterator; | 
| +    DartFrameIterator iterator(thread, | 
| +                               StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* frame = iterator.NextFrame(); | 
| ASSERT(frame != NULL); | 
| const Code& code = Code::Handle(frame->LookupDartCode()); | 
| @@ -1752,7 +1765,8 @@ DEFINE_RUNTIME_ENTRY(StackOverflow, 0) { | 
|  | 
| if ((stack_overflow_flags & Thread::kOsrRequest) != 0) { | 
| ASSERT(isolate->use_osr()); | 
| -    DartFrameIterator iterator; | 
| +    DartFrameIterator iterator(thread, | 
| +                               StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* frame = iterator.NextFrame(); | 
| ASSERT(frame != NULL); | 
| const Code& code = Code::ZoneHandle(frame->LookupDartCode()); | 
| @@ -1811,7 +1825,8 @@ DEFINE_RUNTIME_ENTRY(StackOverflow, 0) { | 
| DEFINE_RUNTIME_ENTRY(TraceICCall, 2) { | 
| const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(0)); | 
| const Function& function = Function::CheckedHandle(arguments.ArgAt(1)); | 
| -  DartFrameIterator iterator; | 
| +  DartFrameIterator iterator(thread, | 
| +                             StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* frame = iterator.NextFrame(); | 
| ASSERT(frame != NULL); | 
| OS::PrintErr("IC call @%#" Px ": ICData: %p cnt:%" Pd " nchecks: %" Pd | 
| @@ -1891,7 +1906,8 @@ DEFINE_RUNTIME_ENTRY(OptimizeInvokedFunction, 1) { | 
| // The caller must be a static call in a Dart frame, or an entry frame. | 
| // Patch static call to point to valid code's entry point. | 
| DEFINE_RUNTIME_ENTRY(FixCallersTarget, 0) { | 
| -  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames); | 
| +  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, thread, | 
| +                              StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* frame = iterator.NextFrame(); | 
| ASSERT(frame != NULL); | 
| while (frame->IsStubFrame() || frame->IsExitFrame()) { | 
| @@ -1929,7 +1945,8 @@ DEFINE_RUNTIME_ENTRY(FixCallersTarget, 0) { | 
| // stub. | 
| DEFINE_RUNTIME_ENTRY(FixAllocationStubTarget, 0) { | 
| #if !defined(DART_PRECOMPILED_RUNTIME) | 
| -  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames); | 
| +  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, thread, | 
| +                              StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* frame = iterator.NextFrame(); | 
| ASSERT(frame != NULL); | 
| while (frame->IsStubFrame() || frame->IsExitFrame()) { | 
| @@ -2057,7 +2074,8 @@ void DeoptimizeAt(const Code& optimized_code, StackFrame* frame) { | 
| // Currently checks only that all optimized frames have kDeoptIndex | 
| // and unoptimized code has the kDeoptAfter. | 
| void DeoptimizeFunctionsOnStack() { | 
| -  DartFrameIterator iterator; | 
| +  DartFrameIterator iterator(Thread::Current(), | 
| +                             StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* frame = iterator.NextFrame(); | 
| Code& optimized_code = Code::Handle(); | 
| while (frame != NULL) { | 
| @@ -2128,7 +2146,8 @@ DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, | 
| ((kFirstLocalSlotFromFp + 1) * kWordSize); | 
|  | 
| // Get optimized code and frame that need to be deoptimized. | 
| -  DartFrameIterator iterator(last_fp); | 
| +  DartFrameIterator iterator(last_fp, thread, | 
| +                             StackFrameIterator::kNoCrossThreadIteration); | 
|  | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| ASSERT(caller_frame != NULL); | 
| @@ -2198,7 +2217,8 @@ DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, 1, uword last_fp) { | 
| HANDLESCOPE(thread); | 
|  | 
| DeoptContext* deopt_context = isolate->deopt_context(); | 
| -  DartFrameIterator iterator(last_fp); | 
| +  DartFrameIterator iterator(last_fp, thread, | 
| +                             StackFrameIterator::kNoCrossThreadIteration); | 
| StackFrame* caller_frame = iterator.NextFrame(); | 
| ASSERT(caller_frame != NULL); | 
|  | 
|  |