From 9d242f1fa9314a63f1354db1bdd04dc78e9b98ad Mon Sep 17 00:00:00 2001 From: xarkes Date: Sun, 26 Nov 2017 17:53:05 +0100 Subject: [PATCH] Fix #22 --- src/dialogs/RenameDialog.cpp | 4 +- src/dialogs/RenameDialog.h | 4 +- src/menus/DisassemblyContextMenu.cpp | 71 +++++++++++++++++++++------- src/widgets/FunctionsWidget.cpp | 4 +- 4 files changed, 60 insertions(+), 23 deletions(-) diff --git a/src/dialogs/RenameDialog.cpp b/src/dialogs/RenameDialog.cpp index 498891fd..f1cedc9a 100644 --- a/src/dialogs/RenameDialog.cpp +++ b/src/dialogs/RenameDialog.cpp @@ -22,12 +22,12 @@ void RenameDialog::on_buttonBox_rejected() close(); } -void RenameDialog::setFunctionName(QString fcnName) +void RenameDialog::setName(QString fcnName) { ui->nameEdit->setText(fcnName); } -QString RenameDialog::getFunctionName() const +QString RenameDialog::getName() const { return ui->nameEdit->text(); } diff --git a/src/dialogs/RenameDialog.h b/src/dialogs/RenameDialog.h index fc231e48..17a3a0f8 100644 --- a/src/dialogs/RenameDialog.h +++ b/src/dialogs/RenameDialog.h @@ -17,8 +17,8 @@ public: explicit RenameDialog(QWidget *parent = 0); ~RenameDialog(); - void setFunctionName(QString fcnName); - QString getFunctionName() const; + void setName(QString fcnName); + QString getName() const; private slots: void on_buttonBox_accepted(); diff --git a/src/menus/DisassemblyContextMenu.cpp b/src/menus/DisassemblyContextMenu.cpp index ff092688..e2f923f9 100644 --- a/src/menus/DisassemblyContextMenu.cpp +++ b/src/menus/DisassemblyContextMenu.cpp @@ -36,7 +36,7 @@ QKeySequence DisassemblyContextMenu::getAddFlagSequence() const QKeySequence DisassemblyContextMenu::getRenameSequence() const { - return {}; //TODO insert correct sequence + return {Qt::Key_N}; } QKeySequence DisassemblyContextMenu::getXRefSequence() const @@ -129,25 +129,62 @@ void DisassemblyContextMenu::on_actionAddFlag_triggered() void DisassemblyContextMenu::on_actionRename_triggered() { - // Get function for clicked offset - RAnalFunction *fcn = CutterCore::getInstance()->functionAt(offset); - if( nullptr == fcn ) - { - return; - } + ut64 tgt_addr = UT64_MAX; + RAnalOp op; + RCore *core = Core()->core(); RenameDialog *dialog = new RenameDialog(this); - // Get function based on click position - dialog->setFunctionName(fcn->name); - if (dialog->exec()) - { - // Get new function name - QString new_name = dialog->getFunctionName(); - // Rename function in r2 core - CutterCore::getInstance()->renameFunction(fcn->name, new_name); - // Seek to new renamed function - CutterCore::getInstance()->seek(fcn->addr); + + r_anal_op(core->anal, &op, offset, core->block, 32); + tgt_addr = op.jump != UT64_MAX ? op.jump : op.ptr; + if (op.var) { + RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, offset, 0); + if (fcn) { + RAnalVar *bar = r_anal_var_get_byname (core->anal, fcn, op.var->name); + if (!bar) { + bar = r_anal_var_get_byname (core->anal, fcn, op.var->name); + if (!bar) { + + bar = r_anal_var_get_byname (core->anal, fcn, op.var->name); + } + } + if (bar) { + dialog->setName(bar->name); + if (dialog->exec()) { + QString new_name = dialog->getName(); + r_anal_var_rename (core->anal, fcn->addr, bar->scope, + bar->kind, bar->name, new_name.toStdString().c_str()); + } + } + } + } else if (tgt_addr != UT64_MAX) { + RAnalFunction *fcn = r_anal_get_fcn_at (core->anal, tgt_addr, R_ANAL_FCN_TYPE_NULL); + RFlagItem *f = r_flag_get_i (core->flags, tgt_addr); + if (fcn) { + /* Rename function */ + dialog->setName(fcn->name); + if (dialog->exec()) { + QString new_name = dialog->getName(); + Core()->renameFunction(fcn->name, new_name); + } + } else if (f) { + /* Rename current flag */ + dialog->setName(f->name); + if (dialog->exec()) { + QString new_name = dialog->getName(); + Core()->renameFunction(f->name, new_name); + } + } else { + /* Create new flag */ + dialog->setName(""); + if (dialog->exec()) { + QString new_name = dialog->getName(); + Core()->addFlag(tgt_addr, new_name, 1); + } + } } + r_anal_op_fini (&op); + emit Core()->commentsChanged(); } void DisassemblyContextMenu::on_actionXRefs_triggered() diff --git a/src/widgets/FunctionsWidget.cpp b/src/widgets/FunctionsWidget.cpp index 1cc5e8a8..e17e7fff 100644 --- a/src/widgets/FunctionsWidget.cpp +++ b/src/widgets/FunctionsWidget.cpp @@ -468,12 +468,12 @@ void FunctionsWidget::on_actionFunctionsRename_triggered() RenameDialog *r = new RenameDialog(this); // Set function name in dialog - r->setFunctionName(function.name); + r->setName(function.name); // If user accepted if (r->exec()) { // Get new function name - QString new_name = r->getFunctionName(); + QString new_name = r->getName(); // Rename function in r2 core CutterCore::getInstance()->renameFunction(function.name, new_name);