+ QTreeWidgetItem * item = new QTreeWidgetItem(listWidget, QStringList(fun->getName().c_str()));
+ stackedWidget->addWidget(w);
+ objects_list.insert(std::make_pair(item, w));
+ LOG4CXX_DEBUG(logger, "Adding function widget at " << std::hex
+ << fun->getStartAddress());
+ objects_list_by_address.insert(std::make_pair(fun->getStartAddress(), item));
+}
+
+namespace {
+ BasicBlockWidget *
+ local__add_basic_block(BasicBlock * block,
+ Mainwindow * mainwindow, InformationManager * manager,
+ std::map<uint64_t, BasicBlockWidget*>& known_blocks,
+ CFGScene * scene, uint64_t starty, uint64_t startx) {
+
+ decltype(known_blocks.begin()) old;
+ if ((old = known_blocks.find(block->getStartAddress())) != known_blocks.end())
+ return old->second;
+
+ std::stringstream s;
+ s << "BLOCK_" << std::hex << block->getStartAddress()
+ << "_" << block->getEndAddress();
+ BasicBlockWidget * widget = new BasicBlockWidget(s.str().c_str(),
+ block, mainwindow);
+
+ known_blocks.insert(std::make_pair(block->getStartAddress(), widget));
+
+ scene->addItem(widget);
+ widget->setFlag(QGraphicsItem::ItemIsMovable, true);
+ widget->moveBy(100*startx, block->getStartAddress() - starty);
+
+ manager->getDisassembler()
+ ->printEachInstruction(block->getStartAddress(),
+ block->getEndAddress(),
+ [&](uint8_t* bytes,
+ size_t byte_count,
+ const std::string& line,
+ const std::string& ref) {
+ widget->addItem(bytes, byte_count,
+ line.c_str() + 1, // remove \t
+ ref.c_str());
+ });
+
+ BasicBlockWidget *tmp, *nextl(NULL), *nextr(NULL);
+ BasicBlock * tmpblock;
+ if (block->getNextBlock(0) != 0) {
+ int xshift = 0;
+ if (block->getNextBlock(1) != 0)
+ xshift = 1;
+ tmpblock = manager->getBasicBlock(block->getNextBlock(0));
+ tmp = local__add_basic_block(tmpblock, mainwindow, manager,
+ known_blocks,
+ scene, starty, startx+xshift);
+ nextl = tmp;
+ tmp->addPrevious(widget);
+ }
+ if (block->getNextBlock(1) != 0) {
+ tmpblock = manager->getBasicBlock(block->getNextBlock(1));
+ tmp = local__add_basic_block(tmpblock, mainwindow, manager,
+ known_blocks,
+ scene, starty, startx-1);
+ nextr = tmp;
+ tmp->addPrevious(widget);
+ }
+ widget->addNext(nextl, nextr);
+ return widget;
+ }