Chromium Code Reviews| 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,21 +1547,25 @@ |
| frame = iterator.NextFrame(); |
| } |
| ASSERT(frame != NULL); |
| - if (!frame->IsEntryFrame()) { |
| + if (frame->IsEntryFrame()) { |
| + // Since function's current code is always unpatched, the entry frame always |
| + // calls to unpatched code. |
| + UNREACHABLE(); |
| + } else { |
|
regis
2012/11/19 23:31:16
You could remove the else.
srdjan
2012/11/19 23:46:12
Done.
|
| 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); |
| + 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(), |
| - new_entry_point); |
| + target_code.EntryPoint()); |
| } |
| + arguments.SetReturn(target_code); |
| } |
| } |