diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2024-08-22 12:55:49 -0600 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2024-10-21 13:56:55 -0400 |
| commit | d8e3001e535fad178c621ff07418f81f25123dc4 (patch) | |
| tree | 54c03cef2f0bdfd9a3b6df4334c81becb63e4993 /type.cpp | |
| parent | 0e281a30d73c0f31ef9442fef0346779164231ad (diff) | |
Allow multiple high level representations for display, add Pseudo Rust and a Pseudo Python example plugin
Diffstat (limited to 'type.cpp')
| -rw-r--r-- | type.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
@@ -1116,6 +1116,19 @@ BNIntegerDisplayType Type::GetIntegerTypeDisplayType() const return BNGetIntegerTypeDisplayType(m_object); } + +BNNameType Type::GetNameType() const +{ + return BNTypeGetNameType(m_object); +} + + +bool Type::ShouldDisplayReturnType() const +{ + return BNTypeShouldDisplayReturnType(m_object); +} + + string Type::GenerateAutoTypeId(const string& source, const QualifiedName& name) { BNQualifiedName nameObj = name.GetAPIObject(); @@ -1215,6 +1228,15 @@ Ref<NamedTypeReference> Type::GetRegisteredName() const } +string Type::GetAlternateName() const +{ + char* name = BNGetTypeAlternateName(m_object); + string result = name; + BNFreeString(name); + return result; +} + + Ref<Type> Type::WithReplacedStructure(Structure* from, Structure* to) { BNType* result = BNTypeWithReplacedStructure(m_object, from->GetObject(), to->GetObject()); @@ -2544,6 +2566,40 @@ Ref<Structure> Structure::WithReplacedNamedTypeReference(NamedTypeReference* fro } +struct ResolveMemberCallbackInfo +{ + const std::function<void(NamedTypeReference*, Structure*, size_t, + uint64_t, uint64_t, const StructureMember&)>* callback; +}; + + +static void ResolveMemberCallback(void* ctxt, BNNamedTypeReference* baseName, BNStructure* resolvedStruct, + size_t memberIndex, uint64_t structOffset, uint64_t adjustedOffset, BNStructureMember member) +{ + ResolveMemberCallbackInfo* resolveFunc = (ResolveMemberCallbackInfo*)ctxt; + Ref<NamedTypeReference> baseNameRef = baseName ? new NamedTypeReference(BNNewNamedTypeReference(baseName)) : nullptr; + Ref<Structure> resolvedStructRef = resolvedStruct ? new Structure(BNNewStructureReference(resolvedStruct)) : nullptr; + StructureMember apiMember; + apiMember.type = Confidence<Ref<Type>>(new Type(BNNewTypeReference(member.type)), member.typeConfidence); + apiMember.name = member.name; + apiMember.offset = member.offset; + apiMember.access = member.access; + apiMember.scope = member.scope; + (*resolveFunc->callback)(baseNameRef, resolvedStructRef, memberIndex, structOffset, adjustedOffset, apiMember); +} + + +bool Structure::ResolveMemberOrBaseMember(BinaryView* data, uint64_t offset, size_t size, + const std::function<void(NamedTypeReference* baseName, Structure* s, size_t memberIndex, + uint64_t structOffset, uint64_t adjustedOffset, const StructureMember& member)>& resolveFunc, + std::optional<size_t> memberIndexHint) +{ + ResolveMemberCallbackInfo callbackInfo = { &resolveFunc }; + return BNResolveStructureMemberOrBaseMember(m_object, data ? data->GetObject() : nullptr, offset, size, + &callbackInfo, ResolveMemberCallback, memberIndexHint.has_value(), memberIndexHint.value_or(0)); +} + + StructureBuilder::StructureBuilder() { m_object = BNCreateStructureBuilder(); |
