diff options
| author | Mark Rowe <mrowe@bdash.net.nz> | 2025-06-09 23:16:24 -0700 |
|---|---|---|
| committer | kat <kat@vector35.com> | 2025-06-18 07:32:21 -0400 |
| commit | 092815158ee7580ea0631dbf14243c11b63de6e3 (patch) | |
| tree | e55114d0782f78261ff462e3b10654642025235a /lang/c | |
| parent | 5320c6967cd380fd73be079675a960f22ba53b40 (diff) | |
[ObjC] Display selectors as @selector(...)
Diffstat (limited to 'lang/c')
| -rw-r--r-- | lang/c/pseudoobjc.cpp | 21 | ||||
| -rw-r--r-- | lang/c/pseudoobjc.h | 3 |
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); |
