Index: runtime/vm/stub_code_ia32.cc |
=================================================================== |
--- runtime/vm/stub_code_ia32.cc (revision 29013) |
+++ runtime/vm/stub_code_ia32.cc (working copy) |
@@ -1613,8 +1613,25 @@ |
__ Bind(&call_target_function); |
// EAX: Target function. |
- __ movl(EAX, FieldAddress(EAX, Function::code_offset())); |
- __ movl(EAX, FieldAddress(EAX, Code::instructions_offset())); |
+ Label is_compiled; |
+ __ movl(EBX, FieldAddress(EAX, Function::code_offset())); |
+ if (FLAG_collect_code) { |
+ // If code might be GC'd, then EBX might be null. If it is, recompile. |
+ __ cmpl(EBX, raw_null); |
+ __ j(NOT_EQUAL, &is_compiled, Assembler::kNearJump); |
+ __ EnterStubFrame(); |
+ __ pushl(EDX); // Preserve arguments descriptor array. |
+ __ pushl(ECX); // Preserve IC data object. |
+ __ pushl(EAX); // Pass function. |
+ __ CallRuntime(kCompileFunctionRuntimeEntry, 1); |
+ __ popl(EAX); // Restore function. |
+ __ popl(ECX); // Restore IC data array. |
+ __ popl(EDX); // Restore arguments descriptor array. |
+ __ LeaveFrame(); |
+ __ movl(EBX, FieldAddress(EAX, Function::code_offset())); |
+ __ Bind(&is_compiled); |
+ } |
+ __ movl(EAX, FieldAddress(EBX, Code::instructions_offset())); |
__ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); |
__ jmp(EAX); |
@@ -1796,6 +1813,24 @@ |
} |
+// Stub for calling the CompileFunction runtime call. |
+// ECX: IC-Data. |
+// EDX: Arguments descriptor. |
+// EAX: Function. |
+void StubCode::GenerateCompileFunctionRuntimeCallStub(Assembler* assembler) { |
+ __ EnterStubFrame(); |
+ __ pushl(EDX); // Preserve arguments descriptor array. |
+ __ pushl(ECX); // Preserve IC data object. |
+ __ pushl(EAX); // Pass function. |
+ __ CallRuntime(kCompileFunctionRuntimeEntry, 1); |
+ __ popl(EAX); // Restore function. |
+ __ popl(ECX); // Restore IC data array. |
+ __ popl(EDX); // Restore arguments descriptor array. |
+ __ LeaveFrame(); |
+ __ ret(); |
+} |
+ |
+ |
// EDX, ECX: May contain arguments to runtime stub. |
void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) { |
__ EnterStubFrame(); |