void CallLinkInfo::visitWeak(RepatchBuffer& repatchBuffer) { if (isLinked()) { if (stub) { if (!Heap::isMarked(stub->executable())) { if (Options::verboseOSR()) { dataLog( "Clearing closure call from ", *repatchBuffer.codeBlock(), " to ", stub->executable()->hashFor(specializationKind()), ", stub routine ", RawPointer(stub.get()), ".\n"); } unlink(repatchBuffer); } } else if (!Heap::isMarked(callee.get())) { if (Options::verboseOSR()) { dataLog( "Clearing call from ", *repatchBuffer.codeBlock(), " to ", RawPointer(callee.get()), " (", callee.get()->executable()->hashFor(specializationKind()), ").\n"); } unlink(repatchBuffer); } } if (!!lastSeenCallee && !Heap::isMarked(lastSeenCallee.get())) lastSeenCallee.clear(); }
void CallLinkInfo::unlink(RepatchBuffer& repatchBuffer) { ASSERT(isLinked()); if (Options::showDisassembly()) dataLog("Unlinking call from ", callReturnLocation, " to ", pointerDump(repatchBuffer.codeBlock()), "\n"); repatchBuffer.revertJumpReplacementToBranchPtrWithPatch(RepatchBuffer::startOfBranchPtrWithPatchOnRegister(hotPathBegin), static_cast<MacroAssembler::RegisterID>(calleeGPR), 0); repatchBuffer.relink( callReturnLocation, repatchBuffer.codeBlock()->vm()->getCTIStub(linkThunkGeneratorFor( (callType == Construct || callType == ConstructVarargs)? CodeForConstruct : CodeForCall, isFTL ? MustPreserveRegisters : RegisterPreservationNotRequired)).code()); hasSeenShouldRepatch = false; callee.clear(); stub.clear(); // It will be on a list if the callee has a code block. if (isOnList()) remove(); }
void CallLinkInfo::visitWeak(RepatchBuffer& repatchBuffer) { auto handleSpecificCallee = [&] (JSFunction* callee) { if (Heap::isMarked(callee->executable())) m_hasSeenClosure = true; else m_clearedByGC = true; }; if (isLinked()) { if (stub()) { if (!stub()->visitWeak(repatchBuffer)) { if (Options::verboseOSR()) { dataLog( "Clearing closure call from ", *repatchBuffer.codeBlock(), " to ", listDump(stub()->variants()), ", stub routine ", RawPointer(stub()), ".\n"); } unlink(repatchBuffer); m_clearedByGC = true; } } else if (!Heap::isMarked(m_callee.get())) { if (Options::verboseOSR()) { dataLog( "Clearing call from ", *repatchBuffer.codeBlock(), " to ", RawPointer(m_callee.get()), " (", m_callee.get()->executable()->hashFor(specializationKind()), ").\n"); } handleSpecificCallee(m_callee.get()); unlink(repatchBuffer); } } if (haveLastSeenCallee() && !Heap::isMarked(lastSeenCallee())) { handleSpecificCallee(lastSeenCallee()); clearLastSeenCallee(); } }