| Index: runtime/vm/code_generator.cc
|
| ===================================================================
|
| --- runtime/vm/code_generator.cc (revision 15101)
|
| +++ runtime/vm/code_generator.cc (working copy)
|
| @@ -801,6 +801,7 @@
|
| target_function.ToFullyQualifiedCString(),
|
| target_code.EntryPoint());
|
| }
|
| + arguments.SetReturn(target_code);
|
| }
|
|
|
|
|
| @@ -868,8 +869,7 @@
|
|
|
|
|
| // Gets called from debug stub when code reaches a breakpoint.
|
| -// Arg0: function object of the static function that was about to be called.
|
| -DEFINE_RUNTIME_ENTRY(BreakpointStaticHandler, 1) {
|
| +DEFINE_RUNTIME_ENTRY(BreakpointStaticHandler, 0) {
|
| ASSERT(arguments.ArgCount() ==
|
| kBreakpointStaticHandlerRuntimeEntry.argument_count());
|
| ASSERT(isolate->debugger() != NULL);
|
| @@ -877,13 +877,20 @@
|
| // Make sure the static function that is about to be called is
|
| // compiled. The stub will jump to the entry point without any
|
| // further tests.
|
| - const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
|
| + DartFrameIterator iterator;
|
| + StackFrame* caller_frame = iterator.NextFrame();
|
| + ASSERT(caller_frame != NULL);
|
| + const Code& code = Code::Handle(caller_frame->LookupDartCode());
|
| + const Function& function =
|
| + Function::Handle(code.GetStaticCallTargetFunctionAt(caller_frame->pc()));
|
| +
|
| if (!function.HasCode()) {
|
| const Error& error = Error::Handle(Compiler::CompileFunction(function));
|
| if (!error.IsNull()) {
|
| Exceptions::PropagateError(error);
|
| }
|
| }
|
| + arguments.SetReturn(Code::ZoneHandle(function.CurrentCode()));
|
| }
|
|
|
|
|
| @@ -1530,12 +1537,9 @@
|
|
|
| // 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, 1) {
|
| +DEFINE_RUNTIME_ENTRY(FixCallersTarget, 0) {
|
| ASSERT(arguments.ArgCount() ==
|
| kFixCallersTargetRuntimeEntry.argument_count());
|
| - const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
|
| - ASSERT(!function.IsNull());
|
| - ASSERT(function.HasCode());
|
|
|
| StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
|
| StackFrame* frame = iterator.NextFrame();
|
| @@ -1543,22 +1547,25 @@
|
| frame = iterator.NextFrame();
|
| }
|
| ASSERT(frame != NULL);
|
| - if (!frame->IsEntryFrame()) {
|
| - ASSERT(frame->IsDartFrame());
|
| - uword target = CodePatcher::GetStaticCallTargetAt(frame->pc());
|
| - const Code& target_code = Code::Handle(function.CurrentCode());
|
| - const uword new_entry_point = target_code.EntryPoint();
|
| - ASSERT(target != new_entry_point); // Why patch otherwise.
|
| - CodePatcher::PatchStaticCallAt(frame->pc(), new_entry_point);
|
| - const Code& code = Code::Handle(frame->LookupDartCode());
|
| - code.SetStaticCallTargetCodeAt(frame->pc(), target_code);
|
| - if (FLAG_trace_patching) {
|
| - OS::Print("FixCallersTarget: patching from %#"Px" to '%s' %#"Px"\n",
|
| - frame->pc(),
|
| - Function::Handle(target_code.function()).ToFullyQualifiedCString(),
|
| - new_entry_point);
|
| - }
|
| + if (frame->IsEntryFrame()) {
|
| + // Since function's current code is always unpatched, the entry frame always
|
| + // calls to unpatched code.
|
| + UNREACHABLE();
|
| }
|
| + ASSERT(frame->IsDartFrame());
|
| + const Code& caller_code = Code::Handle(frame->LookupDartCode());
|
| + const Function& target_function = Function::Handle(
|
| + caller_code.GetStaticCallTargetFunctionAt(frame->pc()));
|
| + const Code& target_code = Code::Handle(target_function.CurrentCode());
|
| + CodePatcher::PatchStaticCallAt(frame->pc(), target_code.EntryPoint());
|
| + caller_code.SetStaticCallTargetCodeAt(frame->pc(), target_code);
|
| + if (FLAG_trace_patching) {
|
| + OS::Print("FixCallersTarget: patching from %#"Px" to '%s' %#"Px"\n",
|
| + frame->pc(),
|
| + Function::Handle(target_code.function()).ToFullyQualifiedCString(),
|
| + target_code.EntryPoint());
|
| + }
|
| + arguments.SetReturn(target_code);
|
| }
|
|
|
|
|
|
|