diff options
| author | Rusty Wagner <dontpanic@binaryninja.com> | 2015-03-04 14:53:06 -0500 |
|---|---|---|
| committer | Rusty Wagner <dontpanic@binaryninja.com> | 2015-03-04 14:53:06 -0500 |
| commit | 55b999c719a33235c46166563df750b2a0fd30aa (patch) | |
| tree | d5038bd726cbaf43f4642fcf821f75689a4d907e | |
| parent | 5d0f774334c1bea3935001bf665d614c39a60d0f (diff) | |
Modify architecture API for less allocations and more flexibility
| -rw-r--r-- | architecture.cpp | 21 | ||||
| -rw-r--r-- | binaryninjaapi.h | 17 |
2 files changed, 20 insertions, 18 deletions
diff --git a/architecture.cpp b/architecture.cpp index f5ef6cc6..eca3a9a6 100644 --- a/architecture.cpp +++ b/architecture.cpp @@ -42,26 +42,25 @@ Architecture::Architecture(const string& name): m_nameForRegister(name) } -bool Architecture::GetInstructionInfoCallback(void* ctxt, BNBinaryView* data, uint64_t addr, BNInstructionInfo* result) +bool Architecture::GetInstructionInfoCallback(void* ctxt, const uint8_t* data, uint64_t addr, + size_t maxLen, BNInstructionInfo* result) { Architecture* arch = (Architecture*)ctxt; - Ref<BinaryView> view = new BinaryView(BNNewViewReference(data)); InstructionInfo info; - bool ok = arch->GetInstructionInfo(view, addr, info); + bool ok = arch->GetInstructionInfo(data, addr, maxLen, info); *result = info; return ok; } -bool Architecture::GetInstructionTextCallback(void* ctxt, BNBinaryView* data, uint64_t addr, - BNInstructionTextToken** result, size_t* count) +bool Architecture::GetInstructionTextCallback(void* ctxt, const uint8_t* data, uint64_t addr, + size_t* len, BNInstructionTextToken** result, size_t* count) { Architecture* arch = (Architecture*)ctxt; - Ref<BinaryView> view = new BinaryView(BNNewViewReference(data)); vector<InstructionTextToken> tokens; - bool ok = arch->GetInstructionText(view, addr, tokens); + bool ok = arch->GetInstructionText(data, addr, *len, tokens); if (!ok) { *result = nullptr; @@ -138,17 +137,17 @@ CoreArchitecture::CoreArchitecture(BNArchitecture* arch): Architecture(arch) } -bool CoreArchitecture::GetInstructionInfo(BinaryView* view, uint64_t addr, InstructionInfo& result) +bool CoreArchitecture::GetInstructionInfo(const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result) { - return BNGetInstructionInfo(m_arch, view->GetViewObject(), addr, &result); + return BNGetInstructionInfo(m_arch, data, addr, maxLen, &result); } -bool CoreArchitecture::GetInstructionText(BinaryView* view, uint64_t addr, std::vector<InstructionTextToken>& result) +bool CoreArchitecture::GetInstructionText(const uint8_t* data, uint64_t addr, size_t& len, std::vector<InstructionTextToken>& result) { BNInstructionTextToken* tokens = nullptr; size_t count = 0; - if (!BNGetInstructionText(m_arch, view->GetViewObject(), addr, &tokens, &count)) + if (!BNGetInstructionText(m_arch, data, addr, &len, &tokens, &count)) return false; for (size_t i = 0; i < count; i++) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 63e8f1a5..b0ed5a04 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -634,9 +634,10 @@ namespace BinaryNinja Architecture(BNArchitecture* arch); - static bool GetInstructionInfoCallback(void* ctxt, BNBinaryView* data, uint64_t addr, BNInstructionInfo* result); - static bool GetInstructionTextCallback(void* ctxt, BNBinaryView* data, uint64_t addr, - BNInstructionTextToken** result, size_t* count); + static bool GetInstructionInfoCallback(void* ctxt, const uint8_t* data, uint64_t addr, + size_t maxLen, BNInstructionInfo* result); + static bool GetInstructionTextCallback(void* ctxt, const uint8_t* data, uint64_t addr, + size_t* len, BNInstructionTextToken** result, size_t* count); static void FreeInstructionTextCallback(BNInstructionTextToken* tokens, size_t count); public: @@ -650,16 +651,18 @@ namespace BinaryNinja std::string GetName() const; - virtual bool GetInstructionInfo(BinaryView* data, uint64_t addr, InstructionInfo& result) = 0; - virtual bool GetInstructionText(BinaryView* data, uint64_t addr, std::vector<InstructionTextToken>& result) = 0; + virtual bool GetInstructionInfo(const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result) = 0; + virtual bool GetInstructionText(const uint8_t* data, uint64_t addr, size_t& len, + std::vector<InstructionTextToken>& result) = 0; }; class CoreArchitecture: public Architecture { public: CoreArchitecture(BNArchitecture* arch); - virtual bool GetInstructionInfo(BinaryView* view, uint64_t addr, InstructionInfo& result) override; - virtual bool GetInstructionText(BinaryView* view, uint64_t addr, std::vector<InstructionTextToken>& result) override; + virtual bool GetInstructionInfo(const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result) override; + virtual bool GetInstructionText(const uint8_t* data, uint64_t addr, size_t& len, + std::vector<InstructionTextToken>& result) override; }; class Function; |
