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 InlineCallFrame::dumpInContext(PrintStream& out, DumpContext* context) const { out.print(briefFunctionInformation(), ":<", RawPointer(executable.get())); if (executable->isStrictMode()) out.print(" (StrictMode)"); out.print(", bc#", caller.bytecodeIndex, ", ", specializationKind()); if (isClosureCall) out.print(", closure call"); else out.print(", known callee: ", inContext(calleeRecovery.constant(), context)); out.print(", numArgs+this = ", arguments.size()); out.print(", stack < loc", VirtualRegister(stackOffset).toLocal()); out.print(">"); }
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(); } }
CodeBlockHash InlineCallFrame::hash() const { return jsCast<FunctionExecutable*>(executable.get())->codeBlockFor( specializationKind())->hash(); }
CodeBlock* InlineCallFrame::baselineCodeBlock() const { return jsCast<FunctionExecutable*>(executable.get())->baselineCodeBlockFor(specializationKind()); }
CString InlineCallFrame::hashAsStringIfPossible() const { return jsCast<FunctionExecutable*>(executable.get())->codeBlockFor( specializationKind())->hashAsStringIfPossible(); }
void InlineCallFrame::dump(PrintStream& out) const { out.print("#", hash(), ":<", RawPointer(executable.get()), ", bc#", caller.bytecodeIndex, ", ", specializationKind(), ">"); }
CodeBlockHash InlineCallFrame::hash() const { return executable->hashFor(specializationKind()); }