diff options
| -rw-r--r-- | binaryninjaapi.h | 11 | ||||
| -rw-r--r-- | datarenderer.cpp | 35 |
2 files changed, 32 insertions, 14 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 158b1a21..5a8398d2 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -19645,6 +19645,14 @@ namespace BinaryNinja { virtual std::vector<DisassemblyTextLine> GetLinesForData(BinaryView* data, uint64_t addr, Type* type, const std::vector<InstructionTextToken>& prefix, size_t width, std::vector<std::pair<Type*, size_t>>& context, const std::string& language = std::string()); + + /*! Render lines for data using the registered data renderers. + + \deprecated Use \c DataRendererContainer::RenderLinesForData instead. This instance method does not use + any state from the receiving \c DataRenderer; constructing a transient instance just to call it leaks + the underlying core object. + */ + BN_DEPRECATED("Use DataRendererContainer::RenderLinesForData", "DataRendererContainer::RenderLinesForData") std::vector<DisassemblyTextLine> RenderLinesForData(BinaryView* data, uint64_t addr, Type* type, const std::vector<InstructionTextToken>& prefix, size_t width, std::vector<std::pair<Type*, size_t>>& context, const std::string& language = std::string()); @@ -19666,6 +19674,9 @@ namespace BinaryNinja { public: static void RegisterGenericDataRenderer(DataRenderer* renderer); static void RegisterTypeSpecificDataRenderer(DataRenderer* renderer); + static std::vector<DisassemblyTextLine> RenderLinesForData(BinaryView* data, uint64_t addr, Type* type, + const std::vector<InstructionTextToken>& prefix, size_t width, + std::vector<std::pair<Type*, size_t>>& context, const std::string& language = std::string()); }; /*! diff --git a/datarenderer.cpp b/datarenderer.cpp index d87183b5..cab10792 100644 --- a/datarenderer.cpp +++ b/datarenderer.cpp @@ -135,7 +135,7 @@ vector<DisassemblyTextLine> DataRenderer::GetLinesForData(BinaryView* data, uint for (size_t i = 0; i < prefix.size(); i++) { BNFreeString(prefixes[i].text); - for (size_t j = 0; j < prefixes[j].namesCount; j++) + for (size_t j = 0; j < prefixes[i].namesCount; j++) BNFreeString(prefixes[i].typeNames[j]); delete[] prefixes[i].typeNames; } @@ -150,6 +150,25 @@ vector<DisassemblyTextLine> DataRenderer::GetLinesForData(BinaryView* data, uint vector<DisassemblyTextLine> DataRenderer::RenderLinesForData(BinaryView* data, uint64_t addr, Type* type, const std::vector<InstructionTextToken>& prefix, size_t width, vector<pair<Type*, size_t>>& context, const string& language) { + return DataRendererContainer::RenderLinesForData(data, addr, type, prefix, width, context, language); +} + + +void DataRendererContainer::RegisterGenericDataRenderer(DataRenderer* renderer) +{ + BNRegisterGenericDataRenderer(BNGetDataRendererContainer(), renderer->GetObject()); +} + + +void DataRendererContainer::RegisterTypeSpecificDataRenderer(DataRenderer* renderer) +{ + BNRegisterTypeSpecificDataRenderer(BNGetDataRendererContainer(), renderer->GetObject()); +} + + +vector<DisassemblyTextLine> DataRendererContainer::RenderLinesForData(BinaryView* data, uint64_t addr, Type* type, + const std::vector<InstructionTextToken>& prefix, size_t width, vector<pair<Type*, size_t>>& context, const string& language) +{ BNInstructionTextToken* prefixes = InstructionTextToken::CreateInstructionTextTokenList(prefix); BNTypeContext* typeCtx = new BNTypeContext[context.size()]; for (size_t i = 0; i < context.size(); i++) @@ -166,7 +185,7 @@ vector<DisassemblyTextLine> DataRenderer::RenderLinesForData(BinaryView* data, u for (size_t i = 0; i < prefix.size(); i++) { BNFreeString(prefixes[i].text); - for (size_t j = 0; j < prefixes[j].namesCount; j++) + for (size_t j = 0; j < prefixes[i].namesCount; j++) BNFreeString(prefixes[i].typeNames[j]); delete[] prefixes[i].typeNames; } @@ -176,15 +195,3 @@ vector<DisassemblyTextLine> DataRenderer::RenderLinesForData(BinaryView* data, u BNFreeDisassemblyTextLines(lines, count); return result; } - - -void DataRendererContainer::RegisterGenericDataRenderer(DataRenderer* renderer) -{ - BNRegisterGenericDataRenderer(BNGetDataRendererContainer(), renderer->GetObject()); -} - - -void DataRendererContainer::RegisterTypeSpecificDataRenderer(DataRenderer* renderer) -{ - BNRegisterTypeSpecificDataRenderer(BNGetDataRendererContainer(), renderer->GetObject()); -} |
