summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);