static void addBreakPointsInFile(Eval::DebuggerProxy* proxy, Eval::PhpFile* efile) { Eval::BreakPointInfoPtrVec bps; proxy->getBreakPoints(bps); for(unsigned int i = 0; i < bps.size(); i++) { Eval::BreakPointInfoPtr bp = bps[i]; if (bp->m_line1 == 0 || bp->m_file.empty()) { // invalid breakpoint for file:line continue; } if (!Eval::BreakPointInfo::MatchFile(bp->m_file, efile->getFileName(), efile->getRelPath())) { continue; } Unit* unit = efile->unit(); OffsetRangeVec offsets; if (!unit->getOffsetRanges(bp->m_line1, offsets)) { continue; } TRACE(3, "Add to breakpoint filter for %s:%d, unit %p:\n", efile->getFileName().c_str(), bp->m_line1, unit); getBreakPointFilter()->addRanges(unit, offsets); if (RuntimeOption::EvalJit) { blacklistRangesInJit(unit, offsets); } } }
// Looks up the offset range in the given unit, of the given breakpoint. // If the offset cannot be found, the breakpoint is marked as invalid. // Otherwise it is marked as valid and the offset is added to the // breakpoint filter and the offset range is black listed for the JIT. static void addBreakPointInUnit(Eval::BreakPointInfoPtr bp, Unit* unit) { OffsetRangeVec offsets; if (!unit->getOffsetRanges(bp->m_line1, offsets) || offsets.size() == 0) { bp->m_bindState = Eval::BreakPointInfo::KnownToBeInvalid; return; } bp->m_bindState = Eval::BreakPointInfo::KnownToBeValid; TRACE(3, "Add to breakpoint filter for %s:%d, unit %p:\n", unit->filepath()->data(), bp->m_line1, unit); getBreakPointFilter()->addRanges(unit, offsets); if (RuntimeOption::EvalJit) { blacklistRangesInJit(unit, offsets); } }
static void addBreakPointsInFile(Eval::DebuggerProxy* proxy, Eval::PhpFile* efile) { Eval::BreakPointInfoPtrVec bps; proxy->getBreakPoints(bps); for(unsigned int i = 0; i < bps.size(); i++) { Eval::BreakPointInfoPtr bp = bps[i]; if (bp->m_line1 == 0 || bp->m_file.empty()) { // invalid breakpoint for file:line continue; } if (!Eval::BreakPointInfo::MatchFile(bp->m_file, efile->getFileName(), efile->getRelPath())) { continue; } Unit* unit = efile->unit(); OffsetRangeVec offsets; if (!unit->getOffsetRanges(bp->m_line1, offsets)) { continue; } if (!g_vmContext->m_breakPointFilter) { g_vmContext->m_breakPointFilter = new PCFilter(); } if (debug && Trace::moduleEnabled(Trace::bcinterp, 5)) { for (OffsetRangeVec::const_iterator it = offsets.begin(); it != offsets.end(); ++it) { Trace::trace("file:line break %s:%d : unit %p offset [%d, %d)\n", efile->getFileName().c_str(), bp->m_line1, unit, it->m_base, it->m_past); } } g_vmContext->m_breakPointFilter->addRanges(unit, offsets); if (RuntimeOption::EvalJit) { blacklistRangesInJit(unit, offsets); } } }
// Ensure we interpret an entire function when the debugger is attached. static void blacklistFuncInJit(const Func* f) { Unit* unit = f->unit(); OffsetRangeVec ranges; ranges.push_back(OffsetRange(f->base(), f->past())); blacklistRangesInJit(unit, ranges); }