-
-namespace {
- BasicBlockWidget *
- local__add_basic_block(BasicBlock * block, Disassembler * dis,
- Mainwindow * mainwindow,
- 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);
-
- dis->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 = dis->getBasicBlock(block->getNextBlock(0));
- tmp = local__add_basic_block(tmpblock, dis,
- mainwindow,
- known_blocks,
- scene, starty, startx+xshift);
- nextl = tmp;
- tmp->addPrevious(widget);
- }
- if (block->getNextBlock(1) != 0) {
- tmpblock = dis->getBasicBlock(block->getNextBlock(1));
- tmp = local__add_basic_block(tmpblock, dis,
- mainwindow,
- known_blocks,
- scene, starty, startx-1);
- nextr = tmp;
- tmp->addPrevious(widget);
- }
- widget->addNext(nextl, nextr);
- return widget;
- }
-}