diff options
| -rw-r--r-- | architecture.cpp | 84 | ||||
| -rw-r--r-- | basicblock.cpp | 78 | ||||
| -rw-r--r-- | binaryninjaapi.h | 10 | ||||
| -rw-r--r-- | datarenderer.cpp | 51 | ||||
| -rw-r--r-- | flowgraphnode.cpp | 37 | ||||
| -rw-r--r-- | function.cpp | 16 | ||||
| -rw-r--r-- | highlevelil.cpp | 29 | ||||
| -rw-r--r-- | languagerepresentation.cpp | 79 | ||||
| -rw-r--r-- | linearviewobject.cpp | 28 | ||||
| -rw-r--r-- | lineformatter.cpp | 75 |
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; } |
