| 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();
|
|
|