+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();
+ }
+}
+
+CallLinkInfo& CallLinkInfo::dummy()
+{
+ static NeverDestroyed<CallLinkInfo> dummy;
+ return dummy;
+}
+