| Index: runtime/vm/simulator_dbc.cc
|
| diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
|
| index 07df1b074296c16e5bb81ed3a94841983032ba97..81a4f32cdb3408716baa34d610af5ad7cf16429a 100644
|
| --- a/runtime/vm/simulator_dbc.cc
|
| +++ b/runtime/vm/simulator_dbc.cc
|
| @@ -553,6 +553,7 @@ DART_FORCE_INLINE void Simulator::Invoke(Thread* thread,
|
| callee_fp[kSavedCallerFpSlotFromFp] = reinterpret_cast<RawObject*>(*FP);
|
| *pp = code->ptr()->object_pool_->ptr();
|
| *pc = reinterpret_cast<uint32_t*>(code->ptr()->entry_point_);
|
| + pc_ = reinterpret_cast<uword>(*pc); // For the profiler.
|
| *FP = callee_fp;
|
| *SP = *FP - 1;
|
| }
|
| @@ -705,6 +706,7 @@ static DART_NOINLINE bool InvokeRuntime(
|
| thread->set_vm_tag(reinterpret_cast<uword>(drt));
|
| drt(args);
|
| thread->set_vm_tag(VMTag::kDartTagId);
|
| + thread->set_top_exit_frame_info(0);
|
| return true;
|
| } else {
|
| return false;
|
| @@ -722,6 +724,7 @@ static DART_NOINLINE bool InvokeNative(
|
| thread->set_vm_tag(reinterpret_cast<uword>(f));
|
| f(args);
|
| thread->set_vm_tag(VMTag::kDartTagId);
|
| + thread->set_top_exit_frame_info(0);
|
| return true;
|
| } else {
|
| return false;
|
| @@ -740,6 +743,7 @@ static DART_NOINLINE bool InvokeNativeWrapper(
|
| NativeEntry::NativeCallWrapper(reinterpret_cast<Dart_NativeArguments>(args),
|
| f);
|
| thread->set_vm_tag(VMTag::kDartTagId);
|
| + thread->set_top_exit_frame_info(0);
|
| return true;
|
| } else {
|
| return false;
|
| @@ -941,6 +945,7 @@ RawObject* Simulator::Call(const Code& code,
|
|
|
| // Save outer top_exit_frame_info.
|
| fp_[0] = reinterpret_cast<RawObject*>(thread->top_exit_frame_info());
|
| + thread->set_top_exit_frame_info(0);
|
|
|
| // Copy arguments and setup the Dart frame.
|
| const intptr_t argc = arguments.Length();
|
| @@ -959,6 +964,7 @@ RawObject* Simulator::Call(const Code& code,
|
| // Ready to start executing bytecode. Load entry point and corresponding
|
| // object pool.
|
| pc = reinterpret_cast<uint32_t*>(code.raw()->ptr()->entry_point_);
|
| + pc_ = reinterpret_cast<uword>(pc); // For the profiler.
|
| pp = code.object_pool()->ptr();
|
|
|
| // Cache some frequently used values in the frame.
|
| @@ -1180,6 +1186,7 @@ RawObject* Simulator::Call(const Code& code,
|
| SimulatorHelpers::SetFrameCode(FP, code);
|
| pp = code->ptr()->object_pool_->ptr();
|
| pc = reinterpret_cast<uint32_t*>(code->ptr()->entry_point_);
|
| + pc_ = reinterpret_cast<uword>(pc); // For the profiler.
|
| }
|
| DISPATCH();
|
| }
|
| @@ -1209,6 +1216,7 @@ RawObject* Simulator::Call(const Code& code,
|
| SimulatorHelpers::SetFrameCode(FP, code);
|
| pp = code->ptr()->object_pool_->ptr();
|
| pc = reinterpret_cast<uint32_t*>(code->ptr()->entry_point_);
|
| + pc_ = reinterpret_cast<uword>(pc); // For the profiler.
|
| }
|
| }
|
| DISPATCH();
|
| @@ -2146,6 +2154,7 @@ RawObject* Simulator::Call(const Code& code,
|
| ReturnImpl:
|
| // Restore caller PC.
|
| pc = SavedCallerPC(FP);
|
| + pc_ = reinterpret_cast<uword>(pc); // For the profiler.
|
|
|
| // Check if it is a fake PC marking the entry frame.
|
| if ((reinterpret_cast<uword>(pc) & 2) != 0) {
|
| @@ -3050,6 +3059,7 @@ RawObject* Simulator::Call(const Code& code,
|
|
|
| // Restore caller PC.
|
| pc = SavedCallerPC(FP);
|
| + pc_ = reinterpret_cast<uword>(pc); // For the profiler.
|
|
|
| // Check if it is a fake PC marking the entry frame.
|
| ASSERT((reinterpret_cast<uword>(pc) & 2) == 0);
|
|
|