Skip to content

Commit de3f136

Browse files
committed
Use node equality for MSVC name backrefs
1 parent 2596b3e commit de3f136

3 files changed

Lines changed: 60 additions & 3 deletions

File tree

demangler/gnu3/demangled_type_node.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,63 @@ bool DemangledTypeNode::HasTemplateArguments() const
445445
}
446446

447447

448+
bool DemangledTypeNode::IsStructurallyEqual(const DemangledTypeNode& other) const
449+
{
450+
if (m_typeClass != other.m_typeClass || m_ntrClass != other.m_ntrClass ||
451+
m_pointerReference != other.m_pointerReference || m_nameType != other.m_nameType ||
452+
m_callingConventionName != other.m_callingConventionName ||
453+
m_pointerSuffixBits != other.m_pointerSuffixBits ||
454+
m_returnTypeConfidence != other.m_returnTypeConfidence ||
455+
m_const != other.m_const || m_volatile != other.m_volatile ||
456+
m_signed != other.m_signed || m_hasVariableArgs != other.m_hasVariableArgs ||
457+
m_hasTemplateArgs != other.m_hasTemplateArgs || m_width != other.m_width ||
458+
m_widthKind != other.m_widthKind || m_altName != other.m_altName ||
459+
m_spaceAfterTemplateComma != other.m_spaceAfterTemplateComma ||
460+
m_memberPointerOwnerName != other.m_memberPointerOwnerName ||
461+
m_isMemberPointer != other.m_isMemberPointer || m_elements != other.m_elements ||
462+
m_nameSegments != other.m_nameSegments)
463+
return false;
464+
465+
auto nodesEqual = [](const vector<DemangledTypeNode>& a, const vector<DemangledTypeNode>& b) {
466+
if (a.size() != b.size())
467+
return false;
468+
for (size_t i = 0; i < a.size(); i++)
469+
{
470+
if (!a[i].IsStructurallyEqual(b[i]))
471+
return false;
472+
}
473+
return true;
474+
};
475+
476+
if (!nodesEqual(m_nameSegmentNodes, other.m_nameSegmentNodes) ||
477+
!nodesEqual(m_memberPointerOwnerNameNodes, other.m_memberPointerOwnerNameNodes))
478+
return false;
479+
480+
auto typePtrsEqual = [](const std::shared_ptr<DemangledTypeNode>& a, const std::shared_ptr<DemangledTypeNode>& b) {
481+
if (!a || !b)
482+
return a == b;
483+
return a->IsStructurallyEqual(*b);
484+
};
485+
486+
if (!typePtrsEqual(m_childType, other.m_childType) ||
487+
!typePtrsEqual(m_implicitThisParameterType, other.m_implicitThisParameterType))
488+
return false;
489+
490+
auto paramsEqual = [&typePtrsEqual](const vector<Param>& a, const vector<Param>& b) {
491+
if (a.size() != b.size())
492+
return false;
493+
for (size_t i = 0; i < a.size(); i++)
494+
{
495+
if (a[i].name != b[i].name || !typePtrsEqual(a[i].type, b[i].type))
496+
return false;
497+
}
498+
return true;
499+
};
500+
501+
return paramsEqual(m_templateArgs, other.m_templateArgs) && paramsEqual(m_params, other.m_params);
502+
}
503+
504+
448505
void DemangledTypeNode::SetTemplateArguments(vector<Param> args, bool spaceAfterComma)
449506
{
450507
m_templateArgs = std::move(args);

demangler/gnu3/demangled_type_node.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ class DemangledTypeNode
126126
bool IsMemberPointer() const { return m_isMemberPointer; }
127127
const StringList& GetMemberPointerOwnerName() const { return m_memberPointerOwnerName; }
128128
StringList RenderTypeNameSegments() const;
129+
bool IsStructurallyEqual(const DemangledTypeNode& other) const;
129130

130131
void SetTypeName(StringList name) { m_nameSegments = std::move(name); m_nameSegmentNodes.clear(); }
131132
void SetTypeName(_STD_VECTOR<DemangledTypeNode> name) { m_nameSegmentNodes = std::move(name); m_nameSegments.clear(); }

demangler/msvc/demangle_msvc.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,9 @@ void Demangle::BackrefList::PushNameBackref(const DemangledTypeNode& t)
9393
{
9494
if (t.NameStringSize() > MAX_DEMANGLE_LENGTH)
9595
throw DemangleException();
96-
string rendered = t.GetString();
97-
MSVC_TRACE("this: %p - Backref: %zu - %s\n", this, nameList.size(), rendered.c_str());
96+
MSVC_TRACE("this: %p - Backref: %zu\n", this, nameList.size());
9897
for (const auto& name : nameList)
99-
if (name.GetString() == rendered)
98+
if (name.IsStructurallyEqual(t))
10099
return;
101100
if (nameList.size() <= 9)
102101
nameList.push_back(t);

0 commit comments

Comments
 (0)