Skip to content

Commit

Permalink
add search function to disassembler
Browse files Browse the repository at this point in the history
  • Loading branch information
lievenhey committed May 2, 2023
1 parent 274460c commit fce8558
Show file tree
Hide file tree
Showing 5 changed files with 166 additions and 4 deletions.
40 changes: 40 additions & 0 deletions src/models/sourcecodemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
#include <QTextBlock>
#include <QTextDocument>

#include <algorithm>

#include "highlighter.hpp"

SourceCodeModel::SourceCodeModel(KSyntaxHighlighting::Repository* repository, QObject* parent)
Expand Down Expand Up @@ -106,6 +108,8 @@ void SourceCodeModel::setDisassembly(const DisassemblyOutput& disassemblyOutput,
m_startLine = minLineNumber - 1; // convert to index
m_numLines = maxLineNumber - minLineNumber + 1; // include minLineNumber

m_sourceCodeLines.reserve(m_numLines);

for (int i = m_startLine; i < m_startLine + m_numLines; i++) {
auto block = m_document->findBlockByLineNumber(i);
if (!block.isValid())
Expand Down Expand Up @@ -242,3 +246,39 @@ void SourceCodeModel::setSysroot(const QString& sysroot)
{
m_sysroot = sysroot;
}

void SourceCodeModel::find(const QString& search, Direction direction, int offset)
{
auto searchFunc = [&search](const SourceCodeLine& line) {
return line.text.indexOf(search, 0, Qt::CaseInsensitive) != -1;
};

auto start = direction == Direction::Forward
? (m_sourceCodeLines.begin() + offset)
: (m_sourceCodeLines.end() - (m_numLines - offset - 1)); // 1 one due to offset of the reverse iterator

auto it = direction == Direction::Forward
? std::find_if(start, m_sourceCodeLines.end(), searchFunc)
: (std::find_if(std::make_reverse_iterator(start), m_sourceCodeLines.rend(), searchFunc) + 1).base();

// it is less than m_sourceCodeLines.begin() if the backward search ends at m_sourceCodeLines.rend()
if (it >= m_sourceCodeLines.begin() && it < m_sourceCodeLines.end()) {
auto distance = std::distance(m_sourceCodeLines.begin(), it);
auto resultIndex = direction == Direction::Forward ? distance : distance;
emit resultFound(createIndex(resultIndex + 1, SourceCodeColumn)); // to index
return;
}

it = direction == Direction::Forward
? std::find_if(m_sourceCodeLines.begin(), start, searchFunc)
: (std::find_if(m_sourceCodeLines.rbegin(), std::make_reverse_iterator(start), searchFunc) + 1).base();

if (it != m_sourceCodeLines.end()) {
auto distance = std::distance(m_sourceCodeLines.begin(), it);
auto resultIndex = direction == Direction::Forward ? distance : distance;
emit resultFound(createIndex(resultIndex + 1, SourceCodeColumn)); // to index
return;
}

emit noResultFound();
}
12 changes: 12 additions & 0 deletions src/models/sourcecodemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@ struct SourceCodeLine
QTextLine line;
};

enum class Direction
{
Forward,
Backward
};

Q_DECLARE_METATYPE(QTextLine)

class SourceCodeModel : public QAbstractTableModel
Expand Down Expand Up @@ -72,10 +78,16 @@ class SourceCodeModel : public QAbstractTableModel
FileLineRole,
};

signals:
void resultFound(QModelIndex index);
void noResultFound();

public slots:
void updateHighlighting(int line);
void setSysroot(const QString& sysroot);

void find(const QString& search, Direction direction, int offset);

private:
QString m_sysroot;
QSet<int> m_validLineNumbers;
Expand Down
60 changes: 56 additions & 4 deletions src/resultsdisassemblypage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@
#include <QTemporaryFile>
#include <QTextStream>

#include <KColorScheme>
#include <KRecursiveFilterProxyModel>
#include <KStandardAction>

#include "parsers/perf/perfparser.h"
#include "resultsutil.h"
Expand Down Expand Up @@ -171,6 +173,55 @@ ResultsDisassemblyPage::ResultsDisassemblyPage(CostContextMenu* costContextMenu,
showDisassembly();
});

ui->searchWidget->hide();

auto searchNext = [this] {
// point to next entry
int offset = m_currentSearchIndex.isValid() ? m_currentSearchIndex.row() : 0;
m_sourceCodeModel->find(ui->searchEdit->text(), Direction::Forward, offset);
};

auto searchPrev = [this] {
// point prev entry, need to subtract 2 since row() is index + 1
int offset = m_currentSearchIndex.isValid() ? m_currentSearchIndex.row() - 2 : 0;
m_sourceCodeModel->find(ui->searchEdit->text(), Direction::Backward, offset);
};

auto findAction = KStandardAction::find(
this,
[this] {
ui->searchWidget->show();
ui->searchEdit->setFocus();
},
this);
ui->sourceCodeView->addAction(findAction);

auto findNextAction = KStandardAction::findNext(this, searchNext, this);
ui->searchWidget->addAction(findNextAction);
auto findPrevAction = KStandardAction::findPrev(this, searchPrev, this);
ui->searchWidget->addAction(findPrevAction);

connect(ui->searchEdit, &QLineEdit::returnPressed, findNextAction, &QAction::trigger);
connect(ui->searchButton, &QPushButton::clicked, findNextAction, &QAction::trigger);
connect(ui->nextResult, &QPushButton::clicked, findNextAction, &QAction::trigger);
connect(ui->prevResult, &QPushButton::clicked, findPrevAction, &QAction::trigger);

KColorScheme colorScheme;
connect(m_sourceCodeModel, &SourceCodeModel::resultFound, this, [this, colorScheme](const QModelIndex& index) {
auto palette = ui->searchEdit->palette();
m_currentSearchIndex = index;
palette.setBrush(QPalette::Text, colorScheme.foreground());
ui->searchEdit->setPalette(palette);
ui->sourceCodeView->setCurrentIndex(index);
});

connect(m_sourceCodeModel, &SourceCodeModel::noResultFound, this, [this, colorScheme]() {
auto palette = ui->searchEdit->palette();
palette.setColor(QPalette::Text, Qt::red);
ui->searchEdit->setPalette(palette);
ui->sourceCodeView->clearSelection();
});

#if KF5SyntaxHighlighting_FOUND
QStringList schemes;

Expand Down Expand Up @@ -310,17 +361,18 @@ void ResultsDisassemblyPage::showDisassembly(const DisassemblyOutput& disassembl

ResultsUtil::hideEmptyColumns(m_callerCalleeResults.selfCosts, ui->assemblyView, DisassemblyModel::COLUMN_COUNT);

ResultsUtil::hideEmptyColumns(m_callerCalleeResults.selfCosts, ui->sourceCodeView,
SourceCodeModel::COLUMN_COUNT);
ResultsUtil::hideEmptyColumns(m_callerCalleeResults.selfCosts, ui->sourceCodeView, SourceCodeModel::COLUMN_COUNT);

ResultsUtil::hideEmptyColumns(m_callerCalleeResults.inclusiveCosts, ui->sourceCodeView,
SourceCodeModel::COLUMN_COUNT + m_callerCalleeResults.selfCosts.numTypes());

// hide self cost for tracepoints in assembly view, this is basically always zero
ResultsUtil::hideTracepointColumns(m_callerCalleeResults.selfCosts, ui->assemblyView, DisassemblyModel::COLUMN_COUNT);
ResultsUtil::hideTracepointColumns(m_callerCalleeResults.selfCosts, ui->assemblyView,
DisassemblyModel::COLUMN_COUNT);

// hide self cost for tracepoints - only show inclusive times instead here
ResultsUtil::hideTracepointColumns(m_callerCalleeResults.selfCosts, ui->sourceCodeView, SourceCodeModel::COLUMN_COUNT);
ResultsUtil::hideTracepointColumns(m_callerCalleeResults.selfCosts, ui->sourceCodeView,
SourceCodeModel::COLUMN_COUNT);

setupAsmViewModel();
}
Expand Down
3 changes: 3 additions & 0 deletions src/resultsdisassemblypage.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ class ResultsDisassemblyPage : public QWidget
// Model
DisassemblyModel* m_disassemblyModel;
SourceCodeModel* m_sourceCodeModel;
QModelIndex m_currentSearchIndex;
// Current chosen function symbol
Data::Symbol m_curSymbol;
// Architecture
QString m_arch;
// Objdump binary name
Expand Down
55 changes: 55 additions & 0 deletions src/resultsdisassemblypage.ui
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,61 @@
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="searchWidget" native="true">
<property name="enabled">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Search:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="searchEdit"/>
</item>
<item>
<widget class="QPushButton" name="searchButton">
<property name="icon">
<iconset theme="search"/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="nextResult">
<property name="icon">
<iconset theme="arrow-down"/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="prevResult">
<property name="icon">
<iconset theme="arrow-up"/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="customSourceCodeHighlighting" native="true">
<property name="enabled">
Expand Down

0 comments on commit fce8558

Please sign in to comment.