summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--architecture.cpp84
-rw-r--r--basicblock.cpp78
-rw-r--r--binaryninjaapi.h10
-rw-r--r--datarenderer.cpp51
-rw-r--r--flowgraphnode.cpp37
-rw-r--r--function.cpp16
-rw-r--r--highlevelil.cpp29
-rw-r--r--languagerepresentation.cpp79
-rw-r--r--linearviewobject.cpp28
-rw-r--r--lineformatter.cpp75
10 files changed, 121 insertions, 366 deletions
diff --git a/architecture.cpp b/architecture.cpp
index 450466da..6c43d5d8 100644
--- a/architecture.cpp
+++ b/architecture.cpp
@@ -24,6 +24,7 @@
#include <inttypes.h>
#include <vector>
#include "binaryninjaapi.h"
+#include "ffi.h"
using namespace BinaryNinja;
using namespace std;
@@ -2441,17 +2442,7 @@ bool DisassemblyTextRenderer::GetInstructionText(uint64_t addr, size_t& len, vec
if (!BNGetDisassemblyTextRendererInstructionText(m_object, addr, &len, &result, &count))
return false;
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = result[i].addr;
- line.instrIndex = result[i].instrIndex;
- line.highlight = result[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(result[i].tokens, result[i].count);
- line.tags = Tag::ConvertTagList(result[i].tags, result[i].tagCount);
- lines.push_back(line);
- }
-
+ lines = ParseAPIObjectList<DisassemblyTextLine>(result, count);
BNFreeDisassemblyTextLines(result, count);
return true;
}
@@ -2460,41 +2451,15 @@ bool DisassemblyTextRenderer::GetInstructionText(uint64_t addr, size_t& len, vec
vector<DisassemblyTextLine> DisassemblyTextRenderer::PostProcessInstructionTextLines(
uint64_t addr, size_t len, const vector<DisassemblyTextLine>& lines, const string& indentSpaces)
{
- BNDisassemblyTextLine* inLines = new BNDisassemblyTextLine[lines.size()];
- for (size_t i = 0; i < lines.size(); i++)
- {
- inLines[i].addr = lines[i].addr;
- inLines[i].instrIndex = lines[i].instrIndex;
- inLines[i].highlight = lines[i].highlight;
- inLines[i].tokens = InstructionTextToken::CreateInstructionTextTokenList(lines[i].tokens);
- inLines[i].count = lines[i].tokens.size();
- inLines[i].tags = Tag::CreateTagList(lines[i].tags, &inLines[i].tagCount);
- }
-
+ size_t inCount = 0;
+ BNDisassemblyTextLine* inLines = AllocAPIObjectList<DisassemblyTextLine>(lines, &inCount);
BNDisassemblyTextLine* result = nullptr;
size_t count = 0;
result = BNPostProcessDisassemblyTextRendererLines(
- m_object, addr, len, inLines, lines.size(), &count, indentSpaces.c_str());
-
- for (size_t i = 0; i < lines.size(); i++)
- {
- InstructionTextToken::FreeInstructionTextTokenList(inLines[i].tokens, inLines[i].count);
- Tag::FreeTagList(inLines[i].tags, inLines[i].tagCount);
- }
- delete[] inLines;
-
- vector<DisassemblyTextLine> outLines;
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = result[i].addr;
- line.instrIndex = result[i].instrIndex;
- line.highlight = result[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(result[i].tokens, result[i].count);
- line.tags = Tag::ConvertTagList(result[i].tags, result[i].tagCount);
- outLines.push_back(line);
- }
+ m_object, addr, len, inLines, inCount, &count, indentSpaces.c_str());
+ vector<DisassemblyTextLine> outLines = ParseAPIObjectList<DisassemblyTextLine>(result, count);
+ FreeAPIObjectList<DisassemblyTextLine>(inLines, inCount);
BNFreeDisassemblyTextLines(result, count);
return outLines;
}
@@ -2507,17 +2472,7 @@ bool DisassemblyTextRenderer::GetDisassemblyText(uint64_t addr, size_t& len, vec
if (!BNGetDisassemblyTextRendererLines(m_object, addr, &len, &result, &count))
return false;
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = result[i].addr;
- line.instrIndex = result[i].instrIndex;
- line.highlight = result[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(result[i].tokens, result[i].count);
- line.tags = Tag::ConvertTagList(result[i].tags, result[i].tagCount);
- lines.push_back(line);
- }
-
+ lines = ParseAPIObjectList<DisassemblyTextLine>(result, count);
BNFreeDisassemblyTextLines(result, count);
return true;
}
@@ -2614,31 +2569,14 @@ void DisassemblyTextRenderer::AddIntegerToken(
void DisassemblyTextRenderer::WrapComment(DisassemblyTextLine& line, vector<DisassemblyTextLine>& lines,
const string& comment, bool hasAutoAnnotations, const string& leadingSpaces, const string& indentSpaces)
{
- BNDisassemblyTextLine inLine;
- inLine.addr = line.addr;
- inLine.instrIndex = line.instrIndex;
- inLine.highlight = line.highlight;
- inLine.count = line.tokens.size();
- inLine.tokens = InstructionTextToken::CreateInstructionTextTokenList(line.tokens);
- inLine.tags = Tag::CreateTagList(line.tags, &inLine.tagCount);
-
+ BNDisassemblyTextLine inLine = line.GetAPIObject();
size_t count = 0;
BNDisassemblyTextLine* result = BNDisassemblyTextRendererWrapComment(
m_object, &inLine, &count, comment.c_str(), hasAutoAnnotations, leadingSpaces.c_str(), indentSpaces.c_str());
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = result[i].addr;
- line.instrIndex = result[i].instrIndex;
- line.highlight = result[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(result[i].tokens, result[i].count);
- line.tags = Tag::ConvertTagList(result[i].tags, result[i].tagCount);
- lines.push_back(line);
- }
-
+ lines = ParseAPIObjectList<DisassemblyTextLine>(result, count);
BNFreeDisassemblyTextLines(result, count);
- BNFreeInstructionText(inLine.tokens, inLine.count);
+ DisassemblyTextLine::FreeAPIObject(&inLine);
}
diff --git a/basicblock.cpp b/basicblock.cpp
index a56512fe..0468ab95 100644
--- a/basicblock.cpp
+++ b/basicblock.cpp
@@ -19,6 +19,7 @@
// IN THE SOFTWARE.
#include "binaryninjaapi.h"
+#include "ffi.h"
using namespace BinaryNinja;
using namespace std;
@@ -143,6 +144,34 @@ void DisassemblySettings::SetCallParameterHints(BNDisassemblyCallParameterHints
}
+BNDisassemblyTextLineTypeInfo DisassemblyTextLineTypeInfo::GetAPIObject() const
+{
+ BNDisassemblyTextLineTypeInfo result;
+ result.hasTypeInfo = this->hasTypeInfo;
+ result.parentType = this->parentType ? BNNewTypeReference(this->parentType->GetObject()) : nullptr;
+ result.fieldIndex = this->fieldIndex;
+ result.offset = this->offset;
+ return result;
+}
+
+
+void DisassemblyTextLineTypeInfo::FreeAPIObject(BNDisassemblyTextLineTypeInfo *value)
+{
+ BNFreeType(value->parentType);
+}
+
+
+DisassemblyTextLineTypeInfo DisassemblyTextLineTypeInfo::FromAPIObject(const BNDisassemblyTextLineTypeInfo *value)
+{
+ DisassemblyTextLineTypeInfo result;
+ result.hasTypeInfo = value->hasTypeInfo;
+ result.fieldIndex = value->fieldIndex;
+ result.parentType = value->parentType ? new Type(BNNewTypeReference(value->parentType)) : nullptr;
+ result.offset = value->offset;
+ return result;
+}
+
+
DisassemblyTextLine::DisassemblyTextLine()
{
addr = 0;
@@ -162,6 +191,41 @@ DisassemblyTextLine::DisassemblyTextLine()
}
+BNDisassemblyTextLine DisassemblyTextLine::GetAPIObject() const
+{
+ BNDisassemblyTextLine result;
+ result.addr = this->addr;
+ result.instrIndex = this->instrIndex;
+ result.highlight = this->highlight;
+ result.tokens = InstructionTextToken::CreateInstructionTextTokenList(this->tokens);
+ result.count = this->tokens.size();
+ result.tags = Tag::CreateTagList(this->tags, &(result.tagCount));
+ result.typeInfo = this->typeInfo.GetAPIObject();
+ return result;
+}
+
+
+void DisassemblyTextLine::FreeAPIObject(BNDisassemblyTextLine *value)
+{
+ InstructionTextToken::FreeInstructionTextTokenList(value->tokens, value->count);
+ Tag::FreeTagList(value->tags, value->tagCount);
+ DisassemblyTextLineTypeInfo::FreeAPIObject(&value->typeInfo);
+}
+
+
+DisassemblyTextLine DisassemblyTextLine::FromAPIObject(const BNDisassemblyTextLine *value)
+{
+ DisassemblyTextLine result;
+ result.addr = value->addr;
+ result.instrIndex = value->instrIndex;
+ result.highlight = value->highlight;
+ result.tokens = InstructionTextToken::ConvertInstructionTextTokenList(value->tokens, value->count);
+ result.tags = Tag::ConvertTagList(value->tags, value->tagCount);
+ result.typeInfo = DisassemblyTextLineTypeInfo::FromAPIObject(&value->typeInfo);
+ return result;
+}
+
+
size_t DisassemblyTextLine::GetTotalWidth() const
{
size_t result = 0;
@@ -435,19 +499,7 @@ vector<DisassemblyTextLine> BasicBlock::GetDisassemblyText(DisassemblySettings*
size_t count;
BNDisassemblyTextLine* lines = BNGetBasicBlockDisassemblyText(m_object, settings->GetObject(), &count);
- vector<DisassemblyTextLine> result;
- result.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = lines[i].addr;
- line.instrIndex = lines[i].instrIndex;
- line.highlight = lines[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(lines[i].tokens, lines[i].count);
- line.tags = Tag::ConvertTagList(lines[i].tags, lines[i].tagCount);
- result.push_back(line);
- }
-
+ vector<DisassemblyTextLine> result = ParseAPIObjectList<DisassemblyTextLine>(lines, count);;
BNFreeDisassemblyTextLines(lines, count);
return result;
}
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index c80b2510..eac04a53 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -4045,10 +4045,14 @@ namespace BinaryNinja {
struct DisassemblyTextLineTypeInfo
{
bool hasTypeInfo;
- BinaryNinja::Ref<BinaryNinja::Type> parentType;
+ Ref<Type> parentType;
size_t fieldIndex;
uint64_t offset;
+ BNDisassemblyTextLineTypeInfo GetAPIObject() const;
+ static void FreeAPIObject(BNDisassemblyTextLineTypeInfo* value);
+ static DisassemblyTextLineTypeInfo FromAPIObject(const BNDisassemblyTextLineTypeInfo* value);
+
DisassemblyTextLineTypeInfo() : hasTypeInfo(false), parentType(nullptr), fieldIndex(-1), offset(0) {}
};
@@ -4063,6 +4067,10 @@ namespace BinaryNinja {
DisassemblyTextLine();
+ BNDisassemblyTextLine GetAPIObject() const;
+ static void FreeAPIObject(BNDisassemblyTextLine* value);
+ static DisassemblyTextLine FromAPIObject(const BNDisassemblyTextLine* value);
+
size_t GetTotalWidth() const;
size_t GetAddressAndIndentationWidth() const;
std::vector<InstructionTextToken> GetAddressAndIndentationTokens() const;
diff --git a/datarenderer.cpp b/datarenderer.cpp
index 188127b1..d87183b5 100644
--- a/datarenderer.cpp
+++ b/datarenderer.cpp
@@ -1,4 +1,5 @@
#include "binaryninjaapi.h"
+#include "ffi.h"
using namespace std;
using namespace BinaryNinja;
@@ -82,22 +83,10 @@ BNDisassemblyTextLine* DataRenderer::GetLinesForDataCallback(void* ctxt, BNBinar
}
auto lines = renderer->GetLinesForData(viewObj, addr, typeObj, prefixes, width, context,
language ? language : string());
- *count = lines.size();
- BNDisassemblyTextLine* buf = new BNDisassemblyTextLine[lines.size()];
- for (size_t i = 0; i < lines.size(); i++)
- {
- const DisassemblyTextLine& line = lines[i];
- buf[i].addr = line.addr;
- buf[i].instrIndex = line.instrIndex;
- buf[i].highlight = line.highlight;
- buf[i].tokens = InstructionTextToken::CreateInstructionTextTokenList(line.tokens);
- buf[i].count = line.tokens.size();
- buf[i].tags = Tag::CreateTagList(line.tags, &(buf[i].tagCount));
- }
-
+ BNDisassemblyTextLine* result = AllocAPIObjectList(lines, count);
for (size_t i = 0; i < ctxCount; i++)
context[i].first->Release();
- return buf;
+ return result;
}
@@ -110,12 +99,7 @@ void DataRenderer::FreeCallback(void* ctxt)
void DataRenderer::FreeLinesCallback(void* ctxt, BNDisassemblyTextLine* lines, size_t count)
{
- for (size_t i = 0; i < count; i++)
- {
- InstructionTextToken::FreeInstructionTextTokenList(lines[i].tokens, lines[i].count);
- Tag::FreeTagList(lines[i].tags, lines[i].tagCount);
- }
- delete[] lines;
+ FreeAPIObjectList<DisassemblyTextLine>(lines, count);
}
@@ -157,18 +141,7 @@ vector<DisassemblyTextLine> DataRenderer::GetLinesForData(BinaryView* data, uint
}
delete[] prefixes;
- vector<DisassemblyTextLine> result;
- result.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = lines[i].addr;
- line.instrIndex = lines[i].instrIndex;
- line.highlight = lines[i].highlight;
- line.tokens = InstructionTextToken::ConvertAndFreeInstructionTextTokenList(lines[i].tokens, lines[i].count);
- line.tags = Tag::ConvertAndFreeTagList(lines[i].tags, lines[i].tagCount);
- result.push_back(line);
- }
+ vector<DisassemblyTextLine> result = ParseAPIObjectList<DisassemblyTextLine>(lines, count);
BNFreeDisassemblyTextLines(lines, count);
return result;
}
@@ -199,19 +172,7 @@ vector<DisassemblyTextLine> DataRenderer::RenderLinesForData(BinaryView* data, u
}
delete[] prefixes;
- vector<DisassemblyTextLine> result;
- result.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = lines[i].addr;
- line.instrIndex = lines[i].instrIndex;
- line.highlight = lines[i].highlight;
- line.tokens = InstructionTextToken::ConvertAndFreeInstructionTextTokenList(lines[i].tokens, lines[i].count);
- line.tags = Tag::ConvertAndFreeTagList(lines[i].tags, lines[i].tagCount);
- result.push_back(line);
- }
-
+ vector<DisassemblyTextLine> result = ParseAPIObjectList<DisassemblyTextLine>(lines, count);
BNFreeDisassemblyTextLines(lines, count);
return result;
}
diff --git a/flowgraphnode.cpp b/flowgraphnode.cpp
index e1e2351a..08fc79a6 100644
--- a/flowgraphnode.cpp
+++ b/flowgraphnode.cpp
@@ -19,6 +19,7 @@
// IN THE SOFTWARE.
#include "binaryninjaapi.h"
+#include "ffi.h"
using namespace BinaryNinja;
using namespace std;
@@ -110,19 +111,7 @@ const vector<DisassemblyTextLine>& FlowGraphNode::GetLines()
size_t count;
BNDisassemblyTextLine* lines = BNGetFlowGraphNodeLines(m_object, &count);
- vector<DisassemblyTextLine> result;
- result.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = lines[i].addr;
- line.instrIndex = lines[i].instrIndex;
- line.highlight = lines[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(lines[i].tokens, lines[i].count);
- line.tags = Tag::ConvertTagList(lines[i].tags, lines[i].tagCount);
- result.push_back(line);
- }
-
+ vector<DisassemblyTextLine> result = ParseAPIObjectList<DisassemblyTextLine>(lines, count);
BNFreeDisassemblyTextLines(lines, count);
m_cachedLines = result;
return m_cachedLines;
@@ -131,25 +120,11 @@ const vector<DisassemblyTextLine>& FlowGraphNode::GetLines()
void FlowGraphNode::SetLines(const vector<DisassemblyTextLine>& lines)
{
- BNDisassemblyTextLine* buf = new BNDisassemblyTextLine[lines.size()];
- for (size_t i = 0; i < lines.size(); i++)
- {
- buf[i].addr = lines[i].addr;
- buf[i].instrIndex = lines[i].instrIndex;
- buf[i].highlight = lines[i].highlight;
- buf[i].tokens = InstructionTextToken::CreateInstructionTextTokenList(lines[i].tokens);
- buf[i].count = lines[i].tokens.size();
- buf[i].tags = Tag::CreateTagList(lines[i].tags, &(buf[i].tagCount));
- }
-
- BNSetFlowGraphNodeLines(m_object, buf, lines.size());
+ size_t inCount = 0;
+ BNDisassemblyTextLine* inLines = AllocAPIObjectList<DisassemblyTextLine>(lines, &inCount);
+ BNSetFlowGraphNodeLines(m_object, inLines, inCount);
- for (size_t i = 0; i < lines.size(); i++)
- {
- InstructionTextToken::FreeInstructionTextTokenList(buf[i].tokens, buf[i].count);
- Tag::FreeTagList(buf[i].tags, buf[i].tagCount);
- }
- delete[] buf;
+ FreeAPIObjectList<DisassemblyTextLine>(inLines, inCount);
m_cachedLines = lines;
m_cachedLinesValid = true;
diff --git a/function.cpp b/function.cpp
index 811e64c3..1940734d 100644
--- a/function.cpp
+++ b/function.cpp
@@ -23,6 +23,8 @@
#include "highlevelilinstruction.h"
#include <cstring>
+#include "ffi.h"
+
using namespace BinaryNinja;
using namespace std;
@@ -2554,19 +2556,7 @@ vector<DisassemblyTextLine> Function::GetTypeTokens(DisassemblySettings* setting
BNDisassemblyTextLine* lines =
BNGetFunctionTypeTokens(m_object, settings ? settings->GetObject() : nullptr, &count);
- vector<DisassemblyTextLine> result;
- result.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = lines[i].addr;
- line.instrIndex = lines[i].instrIndex;
- line.highlight = lines[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(lines[i].tokens, lines[i].count);
- line.tags = Tag::ConvertTagList(lines[i].tags, lines[i].tagCount);
- result.push_back(line);
- }
-
+ vector<DisassemblyTextLine> result = ParseAPIObjectList<DisassemblyTextLine>(lines, count);
BNFreeDisassemblyTextLines(lines, count);
return result;
}
diff --git a/highlevelil.cpp b/highlevelil.cpp
index 121dc406..23587fca 100644
--- a/highlevelil.cpp
+++ b/highlevelil.cpp
@@ -19,6 +19,7 @@
// IN THE SOFTWARE.
#include "binaryninjaapi.h"
+#include "ffi.h"
#include "highlevelilinstruction.h"
using namespace BinaryNinja;
@@ -485,19 +486,7 @@ vector<DisassemblyTextLine> HighLevelILFunction::GetExprText(ExprId expr, bool a
BNDisassemblyTextLine* lines =
BNGetHighLevelILExprText(m_object, expr, asFullAst, &count, settings ? settings->GetObject() : nullptr);
- vector<DisassemblyTextLine> result;
- result.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = lines[i].addr;
- line.instrIndex = lines[i].instrIndex;
- line.highlight = lines[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(lines[i].tokens, lines[i].count);
- line.tags = Tag::ConvertTagList(lines[i].tags, lines[i].tagCount);
- result.push_back(line);
- }
-
+ vector<DisassemblyTextLine> result = ParseAPIObjectList<DisassemblyTextLine>(lines, count);
BNFreeDisassemblyTextLines(lines, count);
return result;
}
@@ -871,19 +860,7 @@ vector<DisassemblyTextLine> HighLevelILTokenEmitter::GetLines() const
size_t count = 0;
BNDisassemblyTextLine* lines = BNHighLevelILTokenEmitterGetLines(m_object, &count);
- vector<DisassemblyTextLine> result;
- result.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = lines[i].addr;
- line.instrIndex = lines[i].instrIndex;
- line.highlight = lines[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(lines[i].tokens, lines[i].count);
- line.tags = Tag::ConvertTagList(lines[i].tags, lines[i].tagCount);
- result.push_back(line);
- }
-
+ vector<DisassemblyTextLine> result = ParseAPIObjectList<DisassemblyTextLine>(lines, count);
BNFreeDisassemblyTextLines(lines, count);
return result;
}
diff --git a/languagerepresentation.cpp b/languagerepresentation.cpp
index 1af38b4b..8194a57f 100644
--- a/languagerepresentation.cpp
+++ b/languagerepresentation.cpp
@@ -1,4 +1,5 @@
#include "binaryninjaapi.h"
+#include "ffi.h"
#include "highlevelilinstruction.h"
using namespace BinaryNinja;
@@ -39,19 +40,7 @@ vector<DisassemblyTextLine> LanguageRepresentationFunction::GetExprText(
BNDisassemblyTextLine* lines = BNGetLanguageRepresentationFunctionExprText(m_object, instr.function->GetObject(),
instr.exprIndex, settings ? settings->GetObject() : nullptr, instr.ast, precedence, statement, &count);
- vector<DisassemblyTextLine> result;
- result.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = lines[i].addr;
- line.instrIndex = lines[i].instrIndex;
- line.highlight = lines[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(lines[i].tokens, lines[i].count);
- line.tags = Tag::ConvertTagList(lines[i].tags, lines[i].tagCount);
- result.push_back(line);
- }
-
+ vector<DisassemblyTextLine> result = ParseAPIObjectList<DisassemblyTextLine>(lines, count);
BNFreeDisassemblyTextLines(lines, count);
return result;
}
@@ -64,19 +53,7 @@ vector<DisassemblyTextLine> LanguageRepresentationFunction::GetLinearLines(
BNDisassemblyTextLine* lines = BNGetLanguageRepresentationFunctionLinearLines(m_object, instr.function->GetObject(),
instr.exprIndex, settings ? settings->GetObject() : nullptr, instr.ast, &count);
- vector<DisassemblyTextLine> result;
- result.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = lines[i].addr;
- line.instrIndex = lines[i].instrIndex;
- line.highlight = lines[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(lines[i].tokens, lines[i].count);
- line.tags = Tag::ConvertTagList(lines[i].tags, lines[i].tagCount);
- result.push_back(line);
- }
-
+ vector<DisassemblyTextLine> result = ParseAPIObjectList<DisassemblyTextLine>(lines, count);
BNFreeDisassemblyTextLines(lines, count);
return result;
}
@@ -89,19 +66,7 @@ vector<DisassemblyTextLine> LanguageRepresentationFunction::GetBlockLines(
BNDisassemblyTextLine* lines = BNGetLanguageRepresentationFunctionBlockLines(
m_object, block->GetObject(), settings ? settings->GetObject() : nullptr, &count);
- vector<DisassemblyTextLine> result;
- result.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = lines[i].addr;
- line.instrIndex = lines[i].instrIndex;
- line.highlight = lines[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(lines[i].tokens, lines[i].count);
- line.tags = Tag::ConvertTagList(lines[i].tags, lines[i].tagCount);
- result.push_back(line);
- }
-
+ vector<DisassemblyTextLine> result = ParseAPIObjectList<DisassemblyTextLine>(lines, count);
BNFreeDisassemblyTextLines(lines, count);
return result;
}
@@ -388,31 +353,13 @@ BNDisassemblyTextLine* LanguageRepresentationFunctionType::GetFunctionTypeTokens
Ref<Function> funcObj = new Function(BNNewFunctionReference(func));
Ref<DisassemblySettings> settingsObj = settings ? new DisassemblySettings(BNNewDisassemblySettingsReference(settings)) : nullptr;
auto lines = type->GetFunctionTypeTokens(funcObj, settingsObj);
- *count = lines.size();
- BNDisassemblyTextLine* buf = new BNDisassemblyTextLine[lines.size()];
- for (size_t i = 0; i < lines.size(); i++)
- {
- const DisassemblyTextLine& line = lines[i];
- buf[i].addr = line.addr;
- buf[i].instrIndex = line.instrIndex;
- buf[i].highlight = line.highlight;
- buf[i].tokens = InstructionTextToken::CreateInstructionTextTokenList(line.tokens);
- buf[i].count = line.tokens.size();
- buf[i].tags = Tag::CreateTagList(line.tags, &(buf[i].tagCount));
- }
-
- return buf;
+ return AllocAPIObjectList<DisassemblyTextLine>(lines, count);
}
void LanguageRepresentationFunctionType::FreeLinesCallback(void*, BNDisassemblyTextLine* lines, size_t count)
{
- for (size_t i = 0; i < count; i++)
- {
- InstructionTextToken::FreeInstructionTextTokenList(lines[i].tokens, lines[i].count);
- Tag::FreeTagList(lines[i].tags, lines[i].tagCount);
- }
- delete[] lines;
+ FreeAPIObjectList<DisassemblyTextLine>(lines, count);
}
@@ -506,19 +453,7 @@ vector<DisassemblyTextLine> CoreLanguageRepresentationFunctionType::GetFunctionT
BNDisassemblyTextLine* lines = BNGetLanguageRepresentationFunctionTypeFunctionTypeTokens(m_object,
func->GetObject(), settings ? settings->GetObject() : nullptr, &count);
- vector<DisassemblyTextLine> result;
- result.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- DisassemblyTextLine line;
- line.addr = lines[i].addr;
- line.instrIndex = lines[i].instrIndex;
- line.highlight = lines[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(lines[i].tokens, lines[i].count);
- line.tags = Tag::ConvertTagList(lines[i].tags, lines[i].tagCount);
- result.push_back(line);
- }
-
+ vector<DisassemblyTextLine> result = ParseAPIObjectList<DisassemblyTextLine>(lines, count);
BNFreeDisassemblyTextLines(lines, count);
return result;
}
diff --git a/linearviewobject.cpp b/linearviewobject.cpp
index 7cd08fcc..255a9ea2 100644
--- a/linearviewobject.cpp
+++ b/linearviewobject.cpp
@@ -30,16 +30,7 @@ BNLinearDisassemblyLine LinearDisassemblyLine::GetAPIObject() const
result.type = this->type;
result.function = this->function ? BNNewFunctionReference(this->function->GetObject()) : nullptr;
result.block = this->block ? BNNewBasicBlockReference(this->block->GetObject()) : nullptr;
- result.contents.addr = this->contents.addr;
- result.contents.instrIndex = this->contents.instrIndex;
- result.contents.highlight = this->contents.highlight;
- result.contents.count = this->contents.tokens.size();
- result.contents.tokens = InstructionTextToken::CreateInstructionTextTokenList(this->contents.tokens);
- result.contents.tags = Tag::CreateTagList(this->contents.tags, &result.contents.tagCount);
- result.contents.typeInfo.hasTypeInfo = this->contents.typeInfo.hasTypeInfo;
- result.contents.typeInfo.parentType = this->contents.typeInfo.parentType ? BNNewTypeReference(this->contents.typeInfo.parentType->GetObject()) : nullptr;
- result.contents.typeInfo.fieldIndex = this->contents.typeInfo.fieldIndex;
- result.contents.typeInfo.offset = this->contents.typeInfo.offset;
+ result.contents = this->contents.GetAPIObject();
return result;
}
@@ -50,17 +41,7 @@ LinearDisassemblyLine LinearDisassemblyLine::FromAPIObject(const BNLinearDisasse
result.type = line->type;
result.function = line->function ? new Function(BNNewFunctionReference(line->function)) : nullptr;
result.block = line->block ? new BasicBlock(BNNewBasicBlockReference(line->block)) : nullptr;
- result.contents.addr = line->contents.addr;
- result.contents.instrIndex = line->contents.instrIndex;
- result.contents.highlight = line->contents.highlight;
- result.contents.tokens =
- InstructionTextToken::ConvertInstructionTextTokenList(line->contents.tokens, line->contents.count);
- result.contents.tags = Tag::ConvertTagList(line->contents.tags, line->contents.tagCount);
- result.contents.typeInfo.hasTypeInfo = line->contents.typeInfo.hasTypeInfo;
- result.contents.typeInfo.fieldIndex = line->contents.typeInfo.fieldIndex;
- result.contents.typeInfo.parentType =
- line->contents.typeInfo.parentType ? new Type(BNNewTypeReference(line->contents.typeInfo.parentType)) : nullptr;
- result.contents.typeInfo.offset = line->contents.typeInfo.offset;
+ result.contents = DisassemblyTextLine::FromAPIObject(&line->contents);
return result;
}
@@ -71,10 +52,7 @@ void LinearDisassemblyLine::FreeAPIObject(BNLinearDisassemblyLine* line)
BNFreeFunction(line->function);
if (line->block)
BNFreeBasicBlock(line->block);
- InstructionTextToken::FreeInstructionTextTokenList(line->contents.tokens, line->contents.count);
- Tag::FreeTagList(line->contents.tags, line->contents.tagCount);
- if (line->contents.typeInfo.parentType)
- BNFreeType(line->contents.typeInfo.parentType);
+ DisassemblyTextLine::FreeAPIObject(&line->contents);
}
diff --git a/lineformatter.cpp b/lineformatter.cpp
index 71da6b6e..bc9223d7 100644
--- a/lineformatter.cpp
+++ b/lineformatter.cpp
@@ -19,6 +19,7 @@
// IN THE SOFTWARE.
#include "binaryninjaapi.h"
+#include "ffi.h"
using namespace BinaryNinja;
using namespace std;
@@ -103,47 +104,16 @@ BNDisassemblyTextLine* LineFormatter::FormatLinesCallback(void* ctxt, BNDisassem
{
LineFormatter* formatter = (LineFormatter*)ctxt;
- vector<DisassemblyTextLine> input;
- input.reserve(inCount);
- for (size_t i = 0; i < inCount; i++)
- {
- DisassemblyTextLine line;
- line.addr = inLines[i].addr;
- line.instrIndex = inLines[i].instrIndex;
- line.highlight = inLines[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(inLines[i].tokens, inLines[i].count);
- line.tags = Tag::ConvertTagList(inLines[i].tags, inLines[i].tagCount);
- input.push_back(line);
- }
-
+ vector<DisassemblyTextLine> input = ParseAPIObjectList<DisassemblyTextLine>(inLines, inCount);
vector<DisassemblyTextLine> outLines =
formatter->FormatLines(input, LineFormatterSettings::FromAPIObject(settings));
-
- *outCount = outLines.size();
- BNDisassemblyTextLine* buf = new BNDisassemblyTextLine[outLines.size()];
- for (size_t i = 0; i < outLines.size(); i++)
- {
- const DisassemblyTextLine& line = outLines[i];
- buf[i].addr = line.addr;
- buf[i].instrIndex = line.instrIndex;
- buf[i].highlight = line.highlight;
- buf[i].tokens = InstructionTextToken::CreateInstructionTextTokenList(line.tokens);
- buf[i].count = line.tokens.size();
- buf[i].tags = Tag::CreateTagList(line.tags, &(buf[i].tagCount));
- }
-
- return buf;
+ return AllocAPIObjectList<DisassemblyTextLine>(outLines, outCount);
}
void LineFormatter::FreeLinesCallback(void*, BNDisassemblyTextLine* lines, size_t count)
{
- for (size_t i = 0; i < count; i++)
- {
- InstructionTextToken::FreeInstructionTextTokenList(lines[i].tokens, lines[i].count);
- Tag::FreeTagList(lines[i].tags, lines[i].tagCount);
- }
- delete[] lines;
+ FreeAPIObjectList<DisassemblyTextLine>(lines, count);
}
@@ -183,43 +153,14 @@ CoreLineFormatter::CoreLineFormatter(BNLineFormatter* formatter) : LineFormatter
vector<DisassemblyTextLine> CoreLineFormatter::FormatLines(
const vector<DisassemblyTextLine>& lines, const LineFormatterSettings& settings)
{
- size_t inCount = lines.size();
- BNDisassemblyTextLine* inLines = new BNDisassemblyTextLine[lines.size()];
- for (size_t i = 0; i < lines.size(); i++)
- {
- const DisassemblyTextLine& line = lines[i];
- inLines[i].addr = line.addr;
- inLines[i].instrIndex = line.instrIndex;
- inLines[i].highlight = line.highlight;
- inLines[i].tokens = InstructionTextToken::CreateInstructionTextTokenList(line.tokens);
- inLines[i].count = line.tokens.size();
- inLines[i].tags = Tag::CreateTagList(line.tags, &(inLines[i].tagCount));
- }
-
+ size_t inCount = 0;
+ BNDisassemblyTextLine* inLines = AllocAPIObjectList<DisassemblyTextLine>(lines, &inCount);
size_t outCount = 0;
BNLineFormatterSettings apiSettings = settings.ToAPIObject();
BNDisassemblyTextLine* outLines = BNFormatLines(m_object, inLines, inCount, &apiSettings, &outCount);
- for (size_t i = 0; i < inCount; i++)
- {
- InstructionTextToken::FreeInstructionTextTokenList(inLines[i].tokens, inLines[i].count);
- Tag::FreeTagList(inLines[i].tags, inLines[i].tagCount);
- }
- delete[] inLines;
-
- vector<DisassemblyTextLine> result;
- result.reserve(outCount);
- for (size_t i = 0; i < outCount; i++)
- {
- DisassemblyTextLine line;
- line.addr = outLines[i].addr;
- line.instrIndex = outLines[i].instrIndex;
- line.highlight = outLines[i].highlight;
- line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(outLines[i].tokens, outLines[i].count);
- line.tags = Tag::ConvertTagList(outLines[i].tags, outLines[i].tagCount);
- result.push_back(line);
- }
-
+ vector<DisassemblyTextLine> result = ParseAPIObjectList<DisassemblyTextLine>(outLines, outCount);
+ FreeAPIObjectList<DisassemblyTextLine>(inLines, inCount);
BNFreeDisassemblyTextLines(outLines, outCount);
return result;
}