From 76fd89667ebcee148ed2aef6790d5f1632420c5f Mon Sep 17 00:00:00 2001 From: Mark Rowe Date: Mon, 11 May 2026 18:55:03 -0700 Subject: Add static DataRendererContainer::RenderLinesForData This is a replacement for the `DataRenderer::RenderLinesForData` member function as it is impossible to use without leaking memory. --- binaryninjaapi.h | 11 +++++++++++ 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 GetLinesForData(BinaryView* data, uint64_t addr, Type* type, const std::vector& prefix, size_t width, std::vector>& 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 RenderLinesForData(BinaryView* data, uint64_t addr, Type* type, const std::vector& prefix, size_t width, std::vector>& 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 RenderLinesForData(BinaryView* data, uint64_t addr, Type* type, + const std::vector& prefix, size_t width, + std::vector>& 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 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; } @@ -149,6 +149,25 @@ vector DataRenderer::GetLinesForData(BinaryView* data, uint vector DataRenderer::RenderLinesForData(BinaryView* data, uint64_t addr, Type* type, const std::vector& prefix, size_t width, vector>& 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 DataRendererContainer::RenderLinesForData(BinaryView* data, uint64_t addr, Type* type, + const std::vector& prefix, size_t width, vector>& context, const string& language) { BNInstructionTextToken* prefixes = InstructionTextToken::CreateInstructionTextTokenList(prefix); BNTypeContext* typeCtx = new BNTypeContext[context.size()]; @@ -166,7 +185,7 @@ vector 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 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()); -} -- cgit v1.3.1