summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Rowe <mark@vector35.com>2026-05-11 18:55:03 -0700
committerMark Rowe <mark@vector35.com>2026-05-19 10:36:46 -0700
commit76fd89667ebcee148ed2aef6790d5f1632420c5f (patch)
tree509211fafe35dd16569abf0e14a23611979cf62f
parentfd40266f767e51e649fb48376e25f47a60d79765 (diff)
Add static DataRendererContainer::RenderLinesForData
This is a replacement for the `DataRenderer::RenderLinesForData` member function as it is impossible to use without leaking memory.
-rw-r--r--binaryninjaapi.h11
-rw-r--r--datarenderer.cpp35
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());
-}