From 8bda3399997c0af7fbba6c8a6cf3d22cdd6d0297 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Sun, 28 Jul 2019 10:06:35 -0400 Subject: Fix symbol list issues. Vector35/binaryninja-api #1412 --- binaryninjaapi.h | 1 + binaryninjacore.h | 1 + binaryview.cpp | 17 +++++++++++++++++ ui/symbollist.h | 16 ++++++---------- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 68eee4db..e4af4672 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1517,6 +1517,7 @@ namespace BinaryNinja std::vector> GetSymbols(uint64_t start, uint64_t len, const NameSpace& nameSpace=NameSpace()); std::vector> GetSymbolsOfType(BNSymbolType type, const NameSpace& nameSpace=NameSpace()); std::vector> GetSymbolsOfType(BNSymbolType type, uint64_t start, uint64_t len, const NameSpace& nameSpace=NameSpace()); + std::vector> GetVisibleSymbols(const NameSpace& nameSpace=NameSpace()); void DefineAutoSymbol(Ref sym); void DefineAutoSymbolAndVariableOrFunction(Ref platform, Ref sym, Ref type); diff --git a/binaryninjacore.h b/binaryninjacore.h index 7ae63459..8cf053e5 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -3124,6 +3124,7 @@ extern "C" BINARYNINJACOREAPI BNSymbol** BNGetSymbolsOfTypeInRange(BNBinaryView* view, BNSymbolType type, uint64_t start, uint64_t len, size_t* count, const BNNameSpace* nameSpace); BINARYNINJACOREAPI void BNFreeSymbolList(BNSymbol** syms, size_t count); + BINARYNINJACOREAPI BNSymbol** BNGetVisibleSymbols(BNBinaryView* view, size_t* count, const BNNameSpace* nameSpace); BINARYNINJACOREAPI void BNDefineAutoSymbol(BNBinaryView* view, BNSymbol* sym); BINARYNINJACOREAPI void BNUndefineAutoSymbol(BNBinaryView* view, BNSymbol* sym); diff --git a/binaryview.cpp b/binaryview.cpp index c62b434e..e44bca2b 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -1944,6 +1944,23 @@ vector> BinaryView::GetSymbolsOfType(BNSymbolType type, uint64_t sta } +std::vector> BinaryView::GetVisibleSymbols(const NameSpace& nameSpace) +{ + size_t count; + BNNameSpace ns = nameSpace.GetAPIObject(); + BNSymbol** syms = BNGetVisibleSymbols(m_object, &count, &ns); + NameSpace::FreeAPIObject(&ns); + + vector> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + result.push_back(new Symbol(BNNewSymbolReference(syms[i]))); + + BNFreeSymbolList(syms, count); + return result; +} + + void BinaryView::DefineAutoSymbol(Ref sym) { BNDefineAutoSymbol(m_object, sym->GetObject()); diff --git a/ui/symbollist.h b/ui/symbollist.h index c33472e9..8010d3e2 100644 --- a/ui/symbollist.h +++ b/ui/symbollist.h @@ -33,15 +33,13 @@ public: struct NamedObject { SymbolRef sym; - std::string archName; mutable std::string name; mutable bool named; - NamedObject() : sym(nullptr), archName(emptyArch), named(false) {} - NamedObject(SymbolRef s, std::string& a=emptyArch) : sym(s), archName(a), named(false) {} + NamedObject() : sym(nullptr), named(false) {} + NamedObject(SymbolRef s) : sym(s), named(false) {} NamedObject(const NamedObject& n) { sym = n.sym; - archName = n.archName; named = n.named; name = n.name; } @@ -49,7 +47,6 @@ public: NamedObject(const NamedObject&& n) { sym = std::move(n.sym); - archName = std::move(n.archName); name = std::move(n.name); named = n.named; } @@ -57,7 +54,6 @@ public: NamedObject& operator=(const NamedObject&& n) { sym = std::move(n.sym); - archName = std::move(n.archName); name = std::move(n.name); named = n.named; return *this; @@ -66,7 +62,6 @@ public: NamedObject& operator=(const NamedObject& n) { sym = n.sym; - archName = n.archName; name = n.name; named = n.named; return *this; @@ -116,9 +111,7 @@ private: enum SymbolListUpdateType { UnnamedFunctionAddedToSymbolList, - UnnamedFunctionRemovedFromSymbolList, UnnamedDataAddedToSymbolList, - UnnamedDataRemovedFromSymbolList, SymbolAddedToSymbolList, SymbolUpdatedInSymbolList, SymbolRemovedFromSymbolList @@ -153,7 +146,8 @@ private: BinaryViewRef m_data; std::set m_archNames; std::vector m_allSyms; - std::vector m_curSyms; + std::vector m_curSymsBySortOrder; + std::vector m_curSymsByAddress; NamedObject m_currentSym; std::string m_filter; @@ -248,6 +242,8 @@ public: SortType getSortType() const { return m_sortType; } NamedObject getCurrentSym() const { return m_currentSym; } + bool checkTriggerFullUpdate(); + Q_SIGNALS: void afterListReset(); void beforeListReset(); -- cgit v1.3.1