File indexing completed on 2024-05-05 16:41:33

0001 /*
0002     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "pdbframestackmodel.h"
0008 #include "debugsession.h"
0009 #include <QRegExp>
0010 
0011 #include <QDebug>
0012 #include "debuggerdebug.h"
0013 
0014 using namespace KDevelop;
0015 
0016 namespace Python {
0017     
0018 PdbFrameStackModel::PdbFrameStackModel(IDebugSession* session): FrameStackModel(session), m_debuggerAtFrame(0)
0019 {
0020     
0021 }
0022 
0023 int PdbFrameStackModel::debuggerAtFrame() const
0024 {
0025     return m_debuggerAtFrame;
0026 }
0027 
0028 void PdbFrameStackModel::setDebuggerAtFrame(int newFrame)
0029 {
0030 //     Q_ASSERT(newFrame >= 0);
0031     m_debuggerAtFrame = newFrame;
0032 }
0033 
0034 void PdbFrameStackModel::framesFetched(QByteArray framelist)
0035 {
0036     qCDebug(KDEV_PYTHON_DEBUGGER) << "frames fetched:" << framelist;
0037     QList<QByteArray> lines = framelist.split('\n');
0038     QList<FrameItem> frames;
0039     bool parsingLocation = false;
0040     FrameItem* currentFrame = nullptr;
0041     int framesCount = 0;
0042     foreach ( const QString& line, lines ) {
0043         if ( line.startsWith("-> ") ) {
0044             parsingLocation = true;
0045             if ( currentFrame ) {
0046                 frames << *currentFrame;
0047             }
0048             currentFrame = new FrameItem();
0049             currentFrame->nr = framesCount;
0050             framesCount++;
0051         }
0052         else if ( parsingLocation ) {
0053             QRegExp location("(\\>?)\\s*(.*)\\(([0-9]+)\\)(.*)");
0054             // version 1 has some *really* weird "greedy" ruleset which makes no sense at all for me
0055             location.setPatternSyntax(QRegExp::RegExp2);
0056             if ( location.exactMatch(line) ) {
0057                 qCDebug(KDEV_PYTHON_DEBUGGER) << location.capturedTexts();
0058                 if ( ! location.capturedTexts().at(1).isEmpty() ) {
0059                     m_debuggerAtFrame = framesCount;
0060                 }
0061                 currentFrame->file = QUrl::fromLocalFile(location.capturedTexts().at(2));
0062                 currentFrame->line = location.capturedTexts().at(3).toInt() - 1;
0063                 currentFrame->name = location.capturedTexts().at(4);
0064             }
0065             else {
0066                 qCDebug(KDEV_PYTHON_DEBUGGER) << "regular expression mismatches" << line;
0067             }
0068         }
0069     }
0070     m_debuggerAtFrame = framesCount - m_debuggerAtFrame - 1;
0071     qCDebug(KDEV_PYTHON_DEBUGGER) << "at frame:" << m_debuggerAtFrame;
0072     QVector<FrameItem> framesReversed;
0073     framesReversed.reserve(frames.length());
0074     for ( int i = frames.length() - 1; i >= 0; i-- ) {
0075         framesReversed.append(frames.at(i));
0076         framesReversed.last().nr = framesCount - i - 2;
0077     }
0078     setFrames(0, framesReversed);
0079 }
0080 
0081 void PdbFrameStackModel::threadsFetched(QByteArray threadsData)
0082 {
0083     qCDebug(KDEV_PYTHON_DEBUGGER) << "threads fetched" << threadsData;
0084     qCDebug(KDEV_PYTHON_DEBUGGER) << "Implement me: Thread debugging is not supported by pdb.";
0085     QVector<ThreadItem> threads;
0086     ThreadItem mainThread;
0087     mainThread.nr = 0;
0088     mainThread.name = "main thread";
0089     threads << mainThread;
0090     setThreads(threads);
0091     setCurrentThread(0);
0092 }
0093 
0094 void PdbFrameStackModel::fetchFrames(int /*threadNumber*/, int /*from*/, int /*to*/)
0095 {
0096     qCDebug(KDEV_PYTHON_DEBUGGER) << "frames requested";
0097     InternalPdbCommand* cmd = new InternalPdbCommand(this, "framesFetched", "where\n");
0098     static_cast<DebugSession*>(session())->addCommand(cmd);
0099 }
0100 
0101 void PdbFrameStackModel::fetchThreads()
0102 {
0103     qCDebug(KDEV_PYTHON_DEBUGGER) << "threads requested";
0104     // pdb doesn't support threads.
0105     InternalPdbCommand* cmd = new InternalPdbCommand(this, "threadsFetched", "pass\n");
0106     static_cast<DebugSession*>(session())->addCommand(cmd);
0107 }
0108 
0109 }
0110 
0111 #include "moc_pdbframestackmodel.cpp"