String ScriptDebugServer::setBreakpoint(const String& sourceID, const ScriptBreakpoint& scriptBreakpoint, int* actualLineNumber, int* actualColumnNumber) { intptr_t sourceIDValue = sourceID.toIntPtr(); if (!sourceIDValue) return ""; SourceIdToBreakpointsMap::iterator it = m_sourceIdToBreakpoints.find(sourceIDValue); if (it == m_sourceIdToBreakpoints.end()) it = m_sourceIdToBreakpoints.set(sourceIDValue, LineToBreakpointsMap()).iterator; LineToBreakpointsMap::iterator breaksIt = it->value.find(scriptBreakpoint.lineNumber); if (breaksIt == it->value.end()) breaksIt = it->value.set(scriptBreakpoint.lineNumber, BreakpointsInLine()).iterator; BreakpointsInLine& breaksVector = breaksIt->value; unsigned breaksCount = breaksVector.size(); for (unsigned i = 0; i < breaksCount; i++) { if (breaksVector.at(i).columnNumber == scriptBreakpoint.columnNumber) return ""; } breaksVector.append(scriptBreakpoint); incNumberOfBreakpoints(); *actualLineNumber = scriptBreakpoint.lineNumber; *actualColumnNumber = scriptBreakpoint.columnNumber; return sourceID + ":" + String::number(scriptBreakpoint.lineNumber) + ":" + String::number(scriptBreakpoint.columnNumber); }
BreakpointID Debugger::setBreakpoint(Breakpoint breakpoint, unsigned& actualLine, unsigned& actualColumn) { SourceID sourceID = breakpoint.sourceID; unsigned line = breakpoint.line; unsigned column = breakpoint.column; SourceIDToBreakpointsMap::iterator it = m_sourceIDToBreakpoints.find(sourceID); if (it == m_sourceIDToBreakpoints.end()) it = m_sourceIDToBreakpoints.set(sourceID, LineToBreakpointsMap()).iterator; LineToBreakpointsMap::iterator breaksIt = it->value.find(line); if (breaksIt == it->value.end()) breaksIt = it->value.set(line, BreakpointsInLine()).iterator; BreakpointsInLine& breakpoints = breaksIt->value; unsigned breakpointsCount = breakpoints.size(); for (unsigned i = 0; i < breakpointsCount; i++) if (breakpoints[i].column == column) { // The breakpoint already exists. We're not allowed to create a new // breakpoint at this location. Rather than returning the breakpointID // of the pre-existing breakpoint, we need to return noBreakpointID // to indicate that we're not creating a new one. return noBreakpointID; } BreakpointID id = ++m_topBreakpointID; RELEASE_ASSERT(id != noBreakpointID); breakpoint.id = id; actualLine = line; actualColumn = column; breakpoints.append(breakpoint); m_breakpointIDToBreakpoint.set(id, &breakpoints.last()); toggleBreakpoint(breakpoint, BreakpointEnabled); return id; }