Index: runtime/vm/stub_code_x64.cc |
=================================================================== |
--- runtime/vm/stub_code_x64.cc (revision 29013) |
+++ runtime/vm/stub_code_x64.cc (working copy) |
@@ -1600,8 +1600,25 @@ |
__ Bind(&call_target_function); |
// RAX: Target function. |
- __ movq(RAX, FieldAddress(RAX, Function::code_offset())); |
- __ movq(RAX, FieldAddress(RAX, Code::instructions_offset())); |
+ Label is_compiled; |
+ __ movq(RCX, FieldAddress(RAX, Function::code_offset())); |
+ if (FLAG_collect_code) { |
+ // If code might be GC'd, then EBX might be null. If it is, recompile. |
+ __ CompareObject(RCX, Object::null_object(), PP); |
+ __ j(NOT_EQUAL, &is_compiled, Assembler::kNearJump); |
+ __ EnterStubFrame(); |
+ __ pushq(R10); // Preserve arguments descriptor array. |
+ __ pushq(RBX); // Preserve IC data object. |
+ __ pushq(RAX); // Pass function. |
+ __ CallRuntime(kCompileFunctionRuntimeEntry, 1); |
+ __ popq(RAX); // Restore function. |
+ __ popq(RBX); // Restore IC data array. |
+ __ popq(R10); // Restore arguments descriptor array. |
+ __ LeaveFrame(); |
+ __ movq(RCX, FieldAddress(RAX, Function::code_offset())); |
+ __ Bind(&is_compiled); |
+ } |
+ __ movq(RAX, FieldAddress(RCX, Code::instructions_offset())); |
__ addq(RAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); |
__ jmp(RAX); |
@@ -1782,6 +1799,24 @@ |
} |
+// Stub for calling the CompileFunction runtime call. |
+// RCX: IC-Data. |
+// RDX: Arguments descriptor. |
+// RAX: Function. |
+void StubCode::GenerateCompileFunctionRuntimeCallStub(Assembler* assembler) { |
+ __ EnterStubFrame(); |
+ __ pushq(RDX); // Preserve arguments descriptor array. |
+ __ pushq(RCX); // Preserve IC data object. |
+ __ pushq(RAX); // Pass function. |
+ __ CallRuntime(kCompileFunctionRuntimeEntry, 1); |
+ __ popq(RAX); // Restore function. |
+ __ popq(RCX); // Restore IC data array. |
+ __ popq(RDX); // Restore arguments descriptor array. |
+ __ LeaveFrame(); |
+ __ ret(); |
+} |
+ |
+ |
// RBX, R10: May contain arguments to runtime stub. |
// TOS(0): return address (Dart code). |
void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) { |