From 1652efdc43aa3acbd570c1f042a35da458538bb4 Mon Sep 17 00:00:00 2001 From: Ryan Snyder Date: Mon, 24 Feb 2025 15:14:19 -0500 Subject: core: initial union support with C++ API --- type.cpp | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) (limited to 'type.cpp') diff --git a/type.cpp b/type.cpp index 7afaf5c6..c5fc5e3b 100644 --- a/type.cpp +++ b/type.cpp @@ -515,6 +515,12 @@ void TypeDefinitionLine::FreeTypeDefinitionLineList(BNTypeDefinitionLine* lines, } +FieldResolutionInfo::FieldResolutionInfo(BNFieldResolutionInfo* info) +{ + m_object = info; +} + + BaseStructure::BaseStructure(NamedTypeReference* _type, uint64_t _offset, uint64_t _width) : type(_type), offset(_offset), width(_width) {} @@ -1274,7 +1280,7 @@ Ref Type::WithReplacedNamedTypeReference(NamedTypeReference* from, NamedTy bool Type::AddTypeMemberTokens(BinaryView* data, vector& tokens, int64_t offset, - vector& nameList, size_t size, bool indirect) + vector& nameList, size_t size, bool indirect, FieldResolutionInfo* info) { size_t tokenCount; BNInstructionTextToken* list; @@ -1282,8 +1288,8 @@ bool Type::AddTypeMemberTokens(BinaryView* data, vector& t size_t nameCount; char** names = nullptr; - if (!BNAddTypeMemberTokens( - m_object, data->GetObject(), &list, &tokenCount, offset, &names, &nameCount, size, indirect)) + if (!BNAddTypeMemberTokens(m_object, data->GetObject(), &list, &tokenCount, + offset, &names, &nameCount, size, indirect, info ? info->m_object : nullptr)) return false; vector newTokens = @@ -1300,6 +1306,30 @@ bool Type::AddTypeMemberTokens(BinaryView* data, vector& t return true; } +struct EnumerateTypesForAccessCallbackInfo +{ + const std::function>& type, FieldResolutionInfo* path)>* callback; +}; + + +static void EnumerateTypesForAccessCallback(void* ctxt, BNTypeWithConfidence* tc, BNFieldResolutionInfo* info) +{ + EnumerateTypesForAccessCallbackInfo* enumerateFunc = (EnumerateTypesForAccessCallbackInfo *) ctxt; + + Confidence> typeRef(tc->type ? new Type(BNNewTypeReference(tc->type)) : nullptr, tc->confidence); + Ref path = new FieldResolutionInfo(BNNewFieldResolutionInfoReference(info)); + + (*enumerateFunc->callback)(typeRef, path); +} + +bool Type::EnumerateTypesForAccess(BinaryView* data, uint64_t offset, size_t size, uint8_t baseConfidence, + const std::function>& type, FieldResolutionInfo* path)>& terminal) +{ + EnumerateTypesForAccessCallbackInfo callbackInfo = { &terminal }; + return BNEnumerateTypesForAccess(m_object, data->GetObject(), offset, size, baseConfidence, + EnumerateTypesForAccessCallback, &callbackInfo); +} + std::vector Type::GetLines(const TypeContainer& types, const std::string& name, int paddingCols, bool collapsed, BNTokenEscapingType escaping) -- cgit v1.3.1