void HphpdHook::onDefClass(const Class* cls) { // Make sure we have a proxy DebuggerProxy* proxy = Debugger::GetProxy().get(); if (proxy == nullptr) return; // If the proxy has enabled breakpoints that match entry into methods of // the given class, arrange for the VM to stop execution and notify the // debugger whenever execution enters one of these matched method. // This function is called once, when a class is first loaded, so it is not // performance critical. size_t numFuncs = cls->numMethods(); if (numFuncs == 0) return; auto clsName = cls->name(); std::vector<BreakPointInfoPtr> bps; proxy->getBreakPoints(bps); for (unsigned int i = 0; i < bps.size(); i++) { BreakPointInfoPtr bp = bps[i]; if (bp->m_state == BreakPointInfo::Disabled) continue; // TODO: check name space separately if (bp->getClass() != clsName->data()) continue; bp->m_bindState = BreakPointInfo::KnownToBeInvalid; for (size_t i = 0; i < numFuncs; ++i) { auto f = cls->getMethod(i); if (!matchFunctionName(bp->getFunction(), f)) continue; bp->m_bindState = BreakPointInfo::KnownToBeValid; phpAddBreakPointFuncEntry(f); } } }
void HphpdHook::onFileLoad(Unit* unit) { DebuggerProxy* proxy = Debugger::GetProxy().get(); if (proxy == nullptr) return; // Look up the proxy's breakpoints and add needed breakpoints to the passed // unit std::vector<BreakPointInfoPtr> bps; proxy->getBreakPoints(bps); for (unsigned int i = 0; i < bps.size(); i++) { BreakPointInfoPtr bp = bps[i]; if (BreakPointInfo::MatchFile(bp->m_file, unit->filepath()->toCppString())) { addBreakPointInUnit(bp, unit); } } }