summaryrefslogtreecommitdiff
path: root/architecture.cpp
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2018-12-03 22:20:28 -0500
committerPeter LaFosse <peter@vector35.com>2018-12-13 13:32:18 -0500
commit231afab8b0ba6c8c9eff879681c52724b6688c18 (patch)
tree38026cfa20f34702b7267e9c397652119f27ebe7 /architecture.cpp
parent7357dd114a145ca64e7356233c3cb8b9dd9eae84 (diff)
Commonize all InstructionTextToken generation
Diffstat (limited to 'architecture.cpp')
-rw-r--r--architecture.cpp88
1 files changed, 60 insertions, 28 deletions
diff --git a/architecture.cpp b/architecture.cpp
index d7ab348b..334fda27 100644
--- a/architecture.cpp
+++ b/architecture.cpp
@@ -22,6 +22,7 @@
#include <stdio.h>
#include <cstdint>
#include <inttypes.h>
+#include <vector>
#include "binaryninjaapi.h"
using namespace BinaryNinja;
@@ -54,22 +55,73 @@ InstructionTextToken::InstructionTextToken(): type(TextToken), value(0), confide
InstructionTextToken::InstructionTextToken(BNInstructionTextTokenType t, const std::string& txt, uint64_t val,
- size_t s, size_t o, uint8_t c) : type(t), text(txt), value(val), size(s), operand(o), context(NoTokenContext),
- confidence(c), address(0)
+ size_t s, size_t o, uint8_t c, const vector<string>& n) : type(t), text(txt), value(val), size(s), operand(o), context(NoTokenContext),
+ confidence(c), address(0), typeNames(n)
{
}
InstructionTextToken::InstructionTextToken(BNInstructionTextTokenType t, BNInstructionTextTokenContext ctxt,
- const string& txt, uint64_t a, uint64_t val, size_t s, size_t o, uint8_t c):
- type(t), text(txt), value(val), size(s), operand(o), context(ctxt), confidence(c), address(a)
+ const string& txt, uint64_t a, uint64_t val, size_t s, size_t o, uint8_t c, const vector<string>& n):
+ type(t), text(txt), value(val), size(s), operand(o), context(ctxt), confidence(c), address(a), typeNames(n)
{
}
InstructionTextToken InstructionTextToken::WithConfidence(uint8_t conf)
{
- return InstructionTextToken(type, context, text, address, value, size, operand, conf);
+ return InstructionTextToken(type, context, text, address, value, size, operand, conf, typeNames);
+}
+
+
+static void ConvertInstructionTextToken(const InstructionTextToken& token, BNInstructionTextToken* result)
+{
+ result->type = token.type;
+ result->text = BNAllocString(token.text.c_str());
+ result->value = token.value;
+ result->size = token.size;
+ result->operand = token.operand;
+ result->context = token.context;
+ result->confidence = token.confidence;
+ result->address = token.address;
+ result->typeNames = new char*[token.typeNames.size()];
+ for (size_t i = 0; i < token.typeNames.size(); i++)
+ result->typeNames[i] = BNAllocString(token.typeNames[i].c_str());
+ result->namesCount = token.typeNames.size();
+}
+
+
+BNInstructionTextToken* InstructionTextToken::CreateInstructionTextTokenList(const vector<InstructionTextToken>& tokens)
+{
+ BNInstructionTextToken* result = new BNInstructionTextToken[tokens.size()];
+ for (size_t i = 0; i < tokens.size(); i++)
+ ConvertInstructionTextToken(tokens[i], &result[i]);
+ return result;
+}
+
+
+vector<InstructionTextToken> InstructionTextToken::ConvertAndFreeInstructionTextTokenList(BNInstructionTextToken* tokens, size_t count)
+{
+ auto result = ConvertInstructionTextTokenList(tokens, count);
+ BNFreeInstructionText(tokens, count);
+ return result;
+}
+
+
+vector<InstructionTextToken> InstructionTextToken::ConvertInstructionTextTokenList(const BNInstructionTextToken* tokens, size_t count)
+{
+ vector<InstructionTextToken> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ vector<string> names;
+ names.reserve(tokens[i].namesCount);
+ for (size_t j = 0; j < tokens[i].namesCount; j++)
+ names.push_back(tokens[i].typeNames[j]);
+ result.emplace_back(tokens[i].type, tokens[i].context, tokens[i].text, tokens[i].address, tokens[i].value, tokens[i].size,
+ tokens[i].operand, tokens[i].confidence, names);
+ }
+ return result;
}
@@ -168,27 +220,14 @@ bool Architecture::GetInstructionTextCallback(void* ctxt, const uint8_t* data, u
}
*count = tokens.size();
- *result = new BNInstructionTextToken[tokens.size()];
- for (size_t i = 0; i < tokens.size(); i++)
- {
- (*result)[i].type = tokens[i].type;
- (*result)[i].text = BNAllocString(tokens[i].text.c_str());
- (*result)[i].value = tokens[i].value;
- (*result)[i].size = tokens[i].size;
- (*result)[i].operand = tokens[i].operand;
- (*result)[i].context = tokens[i].context;
- (*result)[i].confidence = tokens[i].confidence;
- (*result)[i].address = tokens[i].address;
- }
+ *result = InstructionTextToken::CreateInstructionTextTokenList(tokens);
return true;
}
void Architecture::FreeInstructionTextCallback(BNInstructionTextToken* tokens, size_t count)
{
- for (size_t i = 0; i < count; i++)
- BNFreeString(tokens[i].text);
- delete[] tokens;
+ BNFreeInstructionText(tokens, count);
}
@@ -1312,14 +1351,7 @@ bool CoreArchitecture::GetInstructionText(const uint8_t* data, uint64_t addr, si
if (!BNGetInstructionText(m_object, data, addr, &len, &tokens, &count))
return false;
- result.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- result.emplace_back(tokens[i].type, tokens[i].context, tokens[i].text, tokens[i].address,
- tokens[i].value, tokens[i].size, tokens[i].operand, tokens[i].confidence);
- }
-
- BNFreeInstructionText(tokens, count);
+ result = InstructionTextToken::ConvertAndFreeInstructionTextTokenList(tokens, count);
return true;
}