X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fgui%2Fwidgets%2FBasicBlockWidget.cxx;h=1cdc33f3dc7eb2ce4cf67f84ba8b1e77a0f24d0d;hb=42617ae5ed5b400a66df8b59a705f6523eec71b8;hp=ee3b7afc0048ead4a014630349187602ea61b2a4;hpb=1be668c952706beab1a68d4a3ed0f4ae98b30280;p=frida%2Ffrida.git diff --git a/src/gui/widgets/BasicBlockWidget.cxx b/src/gui/widgets/BasicBlockWidget.cxx index ee3b7af..1cdc33f 100644 --- a/src/gui/widgets/BasicBlockWidget.cxx +++ b/src/gui/widgets/BasicBlockWidget.cxx @@ -1,4 +1,5 @@ #include "BasicBlockWidget.hxx" +#include "CFGScene.hxx" #include "gui/Mainwindow.hxx" #include "gui/dialogs/SimpleStringDialog.hxx" #include "core/BasicBlock.hxx" @@ -54,13 +55,21 @@ void CustomQGraphicsTextItem::contextMenuEvent(QGraphicsSceneContextMenuEvent* e QMenu menu; bool ok; uint64_t address = c.selectedText().toLongLong(&ok, 16); + QTextTable* table = c.currentTable(); if (ok) { QAction* act = menu.addAction(c.selectedText() + " is a Function"); QObject::connect(act, &QAction::triggered, - [=]() {parent->mainwindow->requestNewFunctionByAddress(address);}); + [=]() { + parent->mainwindow->requestNewFunctionByAddress(address); + if (NULL == table) return; + int row = table->cellAt(c).row(); + uint64_t insAddress = parent->instructions[row].getAddress(); + Comment* comment = parent->block->getManager()->newLocalComment(insAddress, (Function*)0x23); + comment->setText("#F<" + c.selectedText().toStdString() + ">"); + parent->block->getManager()->finishComment(comment); + }); } - QTextTable* table = c.currentTable(); if (NULL != table) { int row = table->cellAt(c).row(); QAction* globalComment = menu.addAction("Add global Comment"); @@ -103,7 +112,7 @@ void CustomQGraphicsTextItem::adjustSize() { BasicBlockWidget::BasicBlockWidget(const QString& name, BasicBlock * block, Mainwindow * mainwindow) : width(200), height(45), name(name) - , _table(NULL) + , currentColor(defaultColor), _table(NULL) , block(block), mainwindow(mainwindow) , logger(log4cxx::Logger::getLogger("gui.BasicBlockWidget." + name.toStdString())) { next[0] = NULL; next[1] = NULL; @@ -122,6 +131,21 @@ BasicBlockWidget::BasicBlockWidget(const QString& name, BasicBlock * block, if (str.startsWith("function:")) { QString address = str.remove("function:"); mainwindow->switchMainPlaneToAddress(address.toInt(NULL, 16)); + } else if (str.startsWith("block:")) { + QString address = str.remove("block:"); + + /* next[0] is always the jumptarget. On a + * conditional jump, next[1] also + * contains the following instruction + * + * TODO: Verify we're switching to the + * right block -- the target + * address matches the next blocks + * start address + */ + LOG4CXX_TRACE(logger, "Highlighting block at Address " << address.toStdString() + << " BasicBlockWidget " << std::hex << next[0]); + ((CFGScene*)this->scene())->highlightBlock(next[0]); } }); instructions = block->getInstructions(); @@ -251,7 +275,7 @@ void BasicBlockWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem*, height = 25 + _widget->boundingRect().height(); if (width < 250) width = 250; - painter->fillRect(0, 0, width, height, QColor(0xcc, 0xcc, 0xff, 0xff)); + painter->fillRect(0, 0, width, height, currentColor); painter->setPen(QColor(0x00, 0x00, 0xff, 0xff)); painter->drawRect(0, 0, width, height); painter->drawText(5, 15, name);