@@ -94,13 +94,15 @@ class DemangleGNU3Reader
9494class 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
161180public:
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