summaryrefslogtreecommitdiff
path: root/basicblock.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'basicblock.cpp')
-rw-r--r--basicblock.cpp78
1 files changed, 65 insertions, 13 deletions
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;
}