Skip to content

Commit 2596b3e

Browse files
committed
Add RAII backref context switch
1 parent f504977 commit 2596b3e

2 files changed

Lines changed: 34 additions & 17 deletions

File tree

demangler/msvc/demangle_msvc.cpp

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,26 @@ void Demangle::BackrefList::PushTemplateSpecialization(const DemangledTypeNode&
111111
}
112112

113113

114+
Demangle::BackrefContextSwitch::BackrefContextSwitch(BackrefList& active): active(active)
115+
{
116+
Swap(active, saved);
117+
}
118+
119+
120+
Demangle::BackrefContextSwitch::~BackrefContextSwitch()
121+
{
122+
Swap(active, saved);
123+
}
124+
125+
126+
void Demangle::BackrefContextSwitch::Swap(BackrefList& left, BackrefList& right)
127+
{
128+
std::swap(left.typeList, right.typeList);
129+
std::swap(left.nameList, right.nameList);
130+
std::swap(left.templateList, right.templateList);
131+
}
132+
133+
114134

115135
Demangle::Demangle(Architecture* arch, const string& mangledName) :
116136
m_mangledName(mangledName),
@@ -1206,33 +1226,17 @@ DemangledTypeNode Demangle::DemangleTemplateInstantiationNameInLocalContext(Back
12061226
vector<DemangledTypeNode::Param> params;
12071227
BNNameType dummyFunctionType = NoNameType;
12081228
NameList dummyNameList;
1209-
BackrefList outerBackrefs;
12101229
bool backrefEligible = true;
12111230
MSVC_TRACE("DemangleTemplateInstantiationNameInLocalContext: '%s'\n", reader.GetRaw());
12121231

1213-
std::swap(outerBackrefs.typeList, nameBackrefList.typeList);
1214-
std::swap(outerBackrefs.nameList, nameBackrefList.nameList);
1215-
std::swap(outerBackrefs.templateList, nameBackrefList.templateList);
1216-
1217-
try
12181232
{
1233+
BackrefContextSwitch localContext(nameBackrefList);
12191234
reader.Consume(2);
12201235
out = DemangleUnqualifiedSymbolName(dummyNameList, nameBackrefList, dummyFunctionType, backrefEligible);
12211236
if (backrefEligible && dummyFunctionType == NoNameType)
12221237
nameBackrefList.PushNameBackref(out);
12231238
DemangleTemplateParams(params, nameBackrefList, out);
12241239
}
1225-
catch (...)
1226-
{
1227-
std::swap(outerBackrefs.typeList, nameBackrefList.typeList);
1228-
std::swap(outerBackrefs.nameList, nameBackrefList.nameList);
1229-
std::swap(outerBackrefs.templateList, nameBackrefList.templateList);
1230-
throw;
1231-
}
1232-
1233-
std::swap(outerBackrefs.typeList, nameBackrefList.typeList);
1234-
std::swap(outerBackrefs.nameList, nameBackrefList.nameList);
1235-
std::swap(outerBackrefs.templateList, nameBackrefList.templateList);
12361240

12371241
nameBackrefList.PushTemplateSpecialization(out);
12381242
nameBackrefList.PushNameBackref(out);

demangler/msvc/demangle_msvc.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,19 @@ class Demangle
173173
void PushTemplateSpecialization(const DemangledTypeNode& t);
174174
};
175175

176+
struct BackrefContextSwitch
177+
{
178+
BackrefList& active;
179+
BackrefList saved;
180+
181+
BackrefContextSwitch(BackrefList& active);
182+
BackrefContextSwitch(const BackrefContextSwitch&) = delete;
183+
BackrefContextSwitch& operator=(const BackrefContextSwitch&) = delete;
184+
~BackrefContextSwitch();
185+
186+
static void Swap(BackrefList& left, BackrefList& right);
187+
};
188+
176189
// Internal name list type - keeps template names structured during parsing.
177190
typedef _STD_VECTOR<DemangledTypeNode> NameList;
178191

0 commit comments

Comments
 (0)