summaryrefslogtreecommitdiff
path: root/lang/c
diff options
context:
space:
mode:
authorMark Rowe <mrowe@bdash.net.nz>2025-06-09 23:16:24 -0700
committerkat <kat@vector35.com>2025-06-18 07:32:21 -0400
commit092815158ee7580ea0631dbf14243c11b63de6e3 (patch)
treee55114d0782f78261ff462e3b10654642025235a /lang/c
parent5320c6967cd380fd73be079675a960f22ba53b40 (diff)
[ObjC] Display selectors as @selector(...)
Diffstat (limited to 'lang/c')
-rw-r--r--lang/c/pseudoobjc.cpp21
-rw-r--r--lang/c/pseudoobjc.h3
2 files changed, 24 insertions, 0 deletions
diff --git a/lang/c/pseudoobjc.cpp b/lang/c/pseudoobjc.cpp
index 56d67c5f..96f0e7c3 100644
--- a/lang/c/pseudoobjc.cpp
+++ b/lang/c/pseudoobjc.cpp
@@ -4,6 +4,7 @@
#include "highlevelilinstruction.h"
#include <optional>
#include <string>
+#include <string_view>
#include <vector>
using namespace BinaryNinja;
@@ -350,6 +351,11 @@ void PseudoObjCFunction::GetExpr_CONST_PTR(const BinaryNinja::HighLevelILInstruc
return;
}
+ if (shortName.rfind("sel_", 0) == 0
+ && GetExpr_Selector(
+ std::string_view(shortName).substr(4), constant, instr, tokens, settings, precedence, statement))
+ return;
+
DataVariable variable {};
auto hasVariable = GetFunction()->GetView()->GetDataVariableAtAddress(constant, variable);
if (!hasVariable)
@@ -393,6 +399,21 @@ bool PseudoObjCFunction::GetExpr_OBJC_CLASS(const Symbol& symbol, uint64_t const
return true;
}
+bool PseudoObjCFunction::GetExpr_Selector(std::string_view selector, uint64_t constant,
+ const BinaryNinja::HighLevelILInstruction& instr, BinaryNinja::HighLevelILTokenEmitter& tokens,
+ BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence, bool statement)
+{
+ if (selector.empty())
+ return false;
+
+ tokens.Append(KeywordToken, "@selector");
+ tokens.AppendOpenParen();
+ tokens.Append(DataSymbolToken, ConstDataTokenContext, std::string(selector), instr.address, constant);
+ tokens.AppendCloseParen();
+
+ return true;
+}
+
bool PseudoObjCFunction::GetExpr_NSConstantString(Ref<Type> type, uint64_t constant,
const BinaryNinja::HighLevelILInstruction& instr, BinaryNinja::HighLevelILTokenEmitter& tokens,
BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence, bool statement)
diff --git a/lang/c/pseudoobjc.h b/lang/c/pseudoobjc.h
index 9910c4b8..6e49d400 100644
--- a/lang/c/pseudoobjc.h
+++ b/lang/c/pseudoobjc.h
@@ -31,6 +31,9 @@ private:
bool GetExpr_OBJC_CLASS(const BinaryNinja::Symbol& symbol, uint64_t constant,
const BinaryNinja::HighLevelILInstruction& expr, BinaryNinja::HighLevelILTokenEmitter& tokens,
BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence, bool statement);
+ bool GetExpr_Selector(std::string_view selector, uint64_t constant,
+ const BinaryNinja::HighLevelILInstruction& expr, BinaryNinja::HighLevelILTokenEmitter& tokens,
+ BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence, bool statement);
bool GetExpr_NSConstantString(BinaryNinja::Ref<BinaryNinja::Type> type, uint64_t constant,
const BinaryNinja::HighLevelILInstruction& expr, BinaryNinja::HighLevelILTokenEmitter& tokens,
BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence, bool statement);