@@ -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
115135Demangle::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);
0 commit comments