| Index: runtime/vm/stub_code_x64.cc
|
| ===================================================================
|
| --- runtime/vm/stub_code_x64.cc (revision 28803)
|
| +++ 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);
|
|
|
|
|