| 1230 | |
| 1231 | |
| 1232 | void Demangle::DemangleName(QualifiedName& nameList, |
| 1233 | BNNameType& classFunctionType, |
| 1234 | BackrefList& nameBackrefList) |
| 1235 | { |
| 1236 | string out; |
| 1237 | BNNameType functionType; |
| 1238 | BNNameType dummyFunctionType; |
| 1239 | vector<FunctionParameter> params; |
| 1240 | while(1) |
| 1241 | { |
| 1242 | m_logger->LogDebug("%s: '%s'\n", __FUNCTION__, reader.GetRaw()); |
| 1243 | switch (GetNameType()) |
| 1244 | { |
| 1245 | case NameString: |
| 1246 | m_logger->LogDebug("Demangle String\n"); |
| 1247 | DemangleNameTypeString(out); |
| 1248 | nameList.insert(nameList.begin(), out); |
| 1249 | m_logger->LogDebug("Pushing backref NameString %s", out.c_str()); |
| 1250 | nameBackrefList.PushStringBackref(out); |
| 1251 | m_logger->LogDebug("nameList.front(): %s\n", nameList.front().c_str()); |
| 1252 | m_logger->LogDebug("%s: '%s'\n", __FUNCTION__, reader.GetRaw()); |
| 1253 | break; |
| 1254 | case NameLookup: |
| 1255 | m_logger->LogDebug("Demangle Lookup\n"); |
| 1256 | DemangleTypeNameLookup(out, functionType); |
| 1257 | classFunctionType = functionType; |
| 1258 | nameList.insert(nameList.begin(), out); |
| 1259 | break; |
| 1260 | case NameBackref: |
| 1261 | m_logger->LogDebug("Demangle Backref"); |
| 1262 | out = nameBackrefList.GetStringBackref(reader.Read() - '0'); |
| 1263 | m_logger->LogDebug("Demangle Backref: %s", out.c_str()); |
| 1264 | nameList.insert(nameList.begin(), out); |
| 1265 | break; |
| 1266 | case NameTemplate: |
| 1267 | { |
| 1268 | m_logger->LogDebug("Demangle Template: '%s'\n", reader.GetRaw()); |
| 1269 | BackrefList templateBackref; |
| 1270 | out = DemangleUnqualifiedSymbolName(nameList, templateBackref, functionType); |
| 1271 | m_logger->LogDebug("Pushing backref NameTemplate %s", out.c_str()); |
| 1272 | templateBackref.PushStringBackref(out); |
| 1273 | m_logger->LogDebug("Demangling Template variables %s\n", reader.GetRaw()); |
| 1274 | DemangleTemplateParams(params, templateBackref, out); |
| 1275 | nameList.insert(nameList.begin(), out); |
| 1276 | nameBackrefList.PushStringBackref(out); |
| 1277 | break; |
| 1278 | } |
| 1279 | case NameConstructor: |
| 1280 | m_logger->LogDebug("NameConstructor\n"); |
| 1281 | classFunctionType = ConstructorNameType; |
| 1282 | DemangleName(nameList, dummyFunctionType, nameBackrefList); |
| 1283 | if (nameList.size() == 0) |
| 1284 | throw DemangleException(); |
| 1285 | nameList.push_back(nameList[nameList.size()-1]); |
| 1286 | return; |
| 1287 | case NameDestructor: |
| 1288 | classFunctionType = ConstructorNameType; |
| 1289 | m_logger->LogDebug("NameDestructor\n"); |
nothing calls this directly
no test coverage detected