summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <dontpanic@binaryninja.com>2015-03-04 14:53:06 -0500
committerRusty Wagner <dontpanic@binaryninja.com>2015-03-04 14:53:06 -0500
commit55b999c719a33235c46166563df750b2a0fd30aa (patch)
treed5038bd726cbaf43f4642fcf821f75689a4d907e
parent5d0f774334c1bea3935001bf665d614c39a60d0f (diff)
Modify architecture API for less allocations and more flexibility
-rw-r--r--architecture.cpp21
-rw-r--r--binaryninjaapi.h17
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;