summaryrefslogtreecommitdiff
path: root/datarenderer.cpp
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2019-09-13 09:56:00 -0400
committerPeter LaFosse <peter@vector35.com>2019-11-15 21:10:58 -0500
commitdb48820f5fed420ad298278e8e6b055baa4ddf06 (patch)
tree2b41a6f081f924b622887ddc42f5f579eebbd849 /datarenderer.cpp
parent3c329e77e0318db070099be2d1731c4e7ac510ba (diff)
Type workflow improvements
Expand type context for data renderers Add additional linearview helper routines for defining variables inside of structures fix unit tests
Diffstat (limited to 'datarenderer.cpp')
-rw-r--r--datarenderer.cpp39
1 files changed, 22 insertions, 17 deletions
diff --git a/datarenderer.cpp b/datarenderer.cpp
index 4004b7d4..3d892987 100644
--- a/datarenderer.cpp
+++ b/datarenderer.cpp
@@ -22,38 +22,38 @@ DataRenderer::DataRenderer()
}
-bool DataRenderer::IsStructOfTypeName(Type* type, const QualifiedName& name, vector<Type*>& context)
+bool DataRenderer::IsStructOfTypeName(Type* type, const QualifiedName& name, vector<pair<Type*, size_t>>& context)
{
return (type->GetClass() == StructureTypeClass) &&
(context.size() > 0) &&
- (context[0]->GetClass() == NamedTypeReferenceClass) &&
- (context[0]->GetNamedTypeReference()->GetName() == name);
+ (context[context.size() - 1].first->GetClass() == NamedTypeReferenceClass) &&
+ (context[context.size() - 1].first->GetNamedTypeReference()->GetName() == name);
}
-bool DataRenderer::IsStructOfTypeName(Type* type, const string& name, vector<Type*>& context)
+bool DataRenderer::IsStructOfTypeName(Type* type, const string& name, vector<pair<Type*, size_t>>& context)
{
return DataRenderer::IsStructOfTypeName(type, QualifiedName(name), context);
}
bool DataRenderer::IsValidForDataCallback(void* ctxt, BNBinaryView* view, uint64_t addr, BNType* type,
- BNType** typeCtx, size_t ctxCount)
+ BNTypeContext** typeCtx, size_t ctxCount)
{
DataRenderer* renderer = (DataRenderer*)ctxt;
Ref<BinaryView> viewObj = new BinaryView(BNNewViewReference(view));
Ref<Type> typeObj = new Type(BNNewTypeReference(type));
- vector<Type*> context;
+ vector<pair<Type*, size_t>> context;
context.reserve(ctxCount);
for (size_t i = 0; i < ctxCount; i++)
- context.push_back(new Type(BNNewTypeReference(typeCtx[i])));
+ context.push_back({new Type(BNNewTypeReference(typeCtx[i]->type)), typeCtx[i]->offset});
return renderer->IsValidForData(viewObj, addr, typeObj, context);
}
BNDisassemblyTextLine* DataRenderer::GetLinesForDataCallback(void* ctxt, BNBinaryView* view, uint64_t addr, BNType* type,
- const BNInstructionTextToken* prefix, size_t prefixCount, size_t width, size_t* count, BNType** typeCtx,
+ const BNInstructionTextToken* prefix, size_t prefixCount, size_t width, size_t* count, BNTypeContext** typeCtx,
size_t ctxCount)
{
DataRenderer* renderer = (DataRenderer*)ctxt;
@@ -61,10 +61,10 @@ BNDisassemblyTextLine* DataRenderer::GetLinesForDataCallback(void* ctxt, BNBinar
Ref<Type> typeObj = new Type(BNNewTypeReference(type));
vector<InstructionTextToken> prefixes = InstructionTextToken::ConvertInstructionTextTokenList(prefix, prefixCount);
- vector<Type*> context;
+ vector<pair<Type*, size_t>> context;
context.reserve(ctxCount);
for (size_t i = 0; i < ctxCount; i++)
- context.push_back(new Type(BNNewTypeReference(typeCtx[i])));
+ context.push_back({new Type(BNNewTypeReference(typeCtx[i]->type)), typeCtx[i]->offset});
auto lines = renderer->GetLinesForData(viewObj, addr, typeObj, prefixes, width, context);
*count = lines.size();
BNDisassemblyTextLine* buf = new BNDisassemblyTextLine[lines.size()];
@@ -89,11 +89,14 @@ void DataRenderer::FreeCallback(void* ctxt)
}
-bool DataRenderer::IsValidForData(BinaryView* data, uint64_t addr, Type* type, vector<Type*>& context)
+bool DataRenderer::IsValidForData(BinaryView* data, uint64_t addr, Type* type, vector<pair<Type*, size_t>>& context)
{
- BNType** typeCtx = new BNType*[context.size()];
+ BNTypeContext** typeCtx = new BNTypeContext*[context.size()];
for (size_t i = 0; i < context.size(); i++)
- typeCtx[i] = context[i]->GetObject();
+ {
+ typeCtx[i]->type = context[i].first->GetObject();
+ typeCtx[i]->offset = context[i].second;
+ }
bool result = BNIsValidForData(m_object, data->GetObject(), addr, type->GetObject(), typeCtx, context.size());
delete[] typeCtx;
return result;
@@ -101,13 +104,15 @@ bool DataRenderer::IsValidForData(BinaryView* data, uint64_t addr, Type* type, v
vector<DisassemblyTextLine> DataRenderer::GetLinesForData(BinaryView* data, uint64_t addr, Type* type,
- const std::vector<InstructionTextToken>& prefix, size_t width, vector<Type*>& context)
+ const std::vector<InstructionTextToken>& prefix, size_t width, vector<pair<Type*, size_t>>& context)
{
BNInstructionTextToken* prefixes = InstructionTextToken::CreateInstructionTextTokenList(prefix);
- BNType** typeCtx = new BNType*[context.size()];
+ BNTypeContext** typeCtx = new BNTypeContext*[context.size()];
for (size_t i = 0; i < context.size(); i++)
- typeCtx[i] = context[i]->GetObject();
-
+ {
+ typeCtx[i]->type = context[i].first->GetObject();
+ typeCtx[i]->offset = context[i].second;
+ }
size_t count = 0;
BNDisassemblyTextLine* lines = BNGetLinesForData(m_object, data->GetObject(), addr, type->GetObject(), prefixes,
prefix.size(), width, &count, typeCtx, context.size());