Skip to content

Commit b00c928

Browse files
committed
Refactor demangler type nodes and backrefs
1 parent ac359f8 commit b00c928

4 files changed

Lines changed: 1490 additions & 345 deletions

File tree

demangler/gnu3/demangle_gnu3.h

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,15 @@ class DemangleGNU3Reader
9494
class DemangleGNU3
9595
{
9696
using ParamList = _STD_VECTOR<DemangledTypeNode::Param>;
97+
using NodeRef = DemangledTypeNode::NodeRef;
98+
using NodeRefList = _STD_VECTOR<NodeRef>;
9799

98-
BN::QualifiedName m_varName;
99100
DemangleGNU3Reader m_reader;
100-
BN::Architecture* m_arch;
101-
_STD_VECTOR<DemangledTypeNode> m_substitute;
102-
_STD_VECTOR<DemangledTypeNode> m_templateSubstitute;
103-
_STD_VECTOR<_STD_VECTOR<DemangledTypeNode>> m_functionSubstitute;
101+
BN::Ref<BN::Platform> m_platform;
102+
NodeRefList m_substitute;
103+
NodeRefList m_templateSubstitute;
104+
_STD_VECTOR<NodeRefList> m_functionSubstitute;
105+
NodeRef m_lastTypeRef;
104106
_STD_STRING m_lastName;
105107
BNNameType m_nameType;
106108
bool m_localType;
@@ -116,12 +118,20 @@ class DemangleGNU3
116118
// ResolveForwardTemplateRefs() can patch them once template args are known.
117119
bool m_permitForwardTemplateRefs;
118120
bool m_inLocalName;
121+
size_t m_nestingDepth;
119122
struct ForwardRef { size_t index; };
120123
_STD_VECTOR<ForwardRef> m_pendingForwardRefs;
121-
void ResolveForwardTemplateRefs(DemangledTypeNode& type, const _STD_VECTOR<_STD_STRING>& args);
124+
class NestingGuard
125+
{
126+
DemangleGNU3& m_demangler;
127+
public:
128+
NestingGuard(DemangleGNU3& demangler);
129+
~NestingGuard();
130+
};
131+
void ResolveForwardTemplateRefs(DemangledTypeNode& type, const ParamList& args);
122132
static _STD_STRING ForwardRefPlaceholder(size_t index);
123133
enum SymbolType { Function, FunctionWithReturn, Data, VTable, Rtti, Name};
124-
BN::QualifiedName DemangleBaseUnresolvedName();
134+
StringList DemangleBaseUnresolvedName();
125135
DemangledTypeNode DemangleUnresolvedType();
126136
_STD_STRING DemangleUnarySuffixExpression(const _STD_STRING& op);
127137
_STD_STRING DemangleUnaryPrefixExpression(const _STD_STRING& op);
@@ -138,31 +148,39 @@ class DemangleGNU3
138148
DemangledTypeNode DemangleLocalName();
139149

140150
void DemangleCVQualifiers(bool& cnst, bool& vltl, bool& rstrct);
141-
DemangledTypeNode DemangleSubstitution();
142-
DemangledTypeNode DemangleTemplateSubstitution();
143-
void DemangleTemplateArgs(_STD_VECTOR<_STD_STRING>& args, bool* hadNonTypeArg = nullptr);
151+
DemangledTypeNode DemangleSubstitution(NodeRef* outTypeRef = nullptr);
152+
DemangledTypeNode DemangleTemplateSubstitution(NodeRef* outTypeRef = nullptr);
153+
void DemangleTemplateArgs(ParamList& args, bool* hadNonTypeArg = nullptr);
144154
DemangledTypeNode DemangleFunction(bool cnst, bool vltl);
145155
DemangledTypeNode DemangleType();
146156
int64_t DemangleNumber();
147-
DemangledTypeNode DemangleNestedName(bool* allTypeTemplateArgs = nullptr);
148-
void PushTemplateType(const DemangledTypeNode& type);
149-
void PushType(const DemangledTypeNode& type);
157+
DemangledTypeNode DemangleNestedName(bool* allTypeTemplateArgs = nullptr, bool pushBareTemplatePrefix = true);
158+
NodeRef PushTemplateType(NodeRef type);
159+
NodeRef PushTemplateType(const DemangledTypeNode& type);
160+
NodeRef PushTemplateType(DemangledTypeNode&& type);
161+
NodeRef PushType(NodeRef type);
162+
NodeRef PushType(const DemangledTypeNode& type);
163+
NodeRef PushType(DemangledTypeNode&& type);
164+
NodeRef GetTypeRef(size_t ref);
150165
const DemangledTypeNode& GetType(size_t ref);
151166

152-
DemangledTypeNode CreateUnknownType(const BN::QualifiedName& s);
167+
DemangledTypeNode CreateUnknownType(const StringList& s);
153168
DemangledTypeNode CreateUnknownType(const _STD_STRING& s);
154169
static void ExtendTypeName(DemangledTypeNode& type, const _STD_STRING& extend);
170+
static void ApplyTemplateArgs(DemangledTypeNode& type, ParamList args);
171+
static void AppendTypeName(DemangledTypeNode& type, const DemangledTypeNode& extend);
172+
static _STD_STRING LastTypeNameSegmentBase(const DemangledTypeNode& type);
173+
static bool LastTypeNameSegmentHasTemplateArguments(const DemangledTypeNode& type);
155174

156175
#ifdef GNUDEMANGLE_DEBUG
157176
const DemangledTypeNode& GetTemplateType(size_t ref);
158177
void PrintTables();
159178
#endif
160179

161180
public:
162-
DemangleGNU3(BN::Architecture* arch, const _STD_STRING& mangledName);
163-
void Reset(BN::Architecture* arch, const _STD_STRING& mangledName);
164-
DemangledTypeNode DemangleSymbol(BN::QualifiedName& varName);
165-
BN::QualifiedName GetVarName() const { return m_varName; }
181+
DemangleGNU3(BN::Platform* platform, const _STD_STRING& mangledName);
182+
void Reset(BN::Platform* platform, const _STD_STRING& mangledName);
183+
DemangledTypeNode DemangleSymbol(StringList& varName);
166184
};
167185

168186

@@ -172,5 +190,6 @@ class DemangleGNU3Static
172190
static bool IsGNU3MangledString(const _STD_STRING& name);
173191
static bool DemangleGlobalHeader(_STD_STRING& name, _STD_STRING& header);
174192

193+
static bool DemangleStringGNU3(BN::Platform* platform, const _STD_STRING& name, BN::Ref<BN::Type>& outType, BN::QualifiedName& outVarName);
175194
static bool DemangleStringGNU3(BN::Architecture* arch, const _STD_STRING& name, BN::Ref<BN::Type>& outType, BN::QualifiedName& outVarName);
176195
};

0 commit comments

Comments
 (0)