| 1815 | |
| 1816 | |
| 1817 | TypeBuilder DemangleGNU3::DemangleLocalName() |
| 1818 | { |
| 1819 | indent(); |
| 1820 | MyLogDebug("%s '%s'\n", __FUNCTION__, m_reader.GetRaw().c_str()); |
| 1821 | TypeBuilder type; |
| 1822 | QualifiedName varName; |
| 1823 | bool oldTopLevel = m_topLevel; |
| 1824 | m_topLevel = false; |
| 1825 | type = DemangleSymbol(varName); |
| 1826 | m_topLevel = oldTopLevel; |
| 1827 | |
| 1828 | if (varName.size() > 0) |
| 1829 | varName.back() += (type.GetStringAfterName()); |
| 1830 | else |
| 1831 | varName.push_back(type.GetString()); |
| 1832 | |
| 1833 | if (m_reader.Peek() != 's') |
| 1834 | { |
| 1835 | //<entity name> |
| 1836 | TypeBuilder tmpType = DemangleName(); |
| 1837 | type = TypeBuilder::NamedType(NamedTypeReference::GenerateAutoDemangledTypeReference(UnknownNamedTypeClass, varName)); |
| 1838 | QualifiedName newName = type.GetTypeName() + tmpType.GetTypeName(); |
| 1839 | if (newName.StringSize() > MAX_DEMANGLE_LENGTH) |
| 1840 | throw DemangleException("Detected adversarial mangled string"); |
| 1841 | type.SetTypeName(newName); |
| 1842 | type.SetConst(tmpType.IsConst()); |
| 1843 | type.SetVolatile(tmpType.IsVolatile()); |
| 1844 | type.SetPointerSuffix(tmpType.GetPointerSuffix()); |
| 1845 | } |
| 1846 | else |
| 1847 | { |
| 1848 | m_reader.Consume(); |
| 1849 | type = TypeBuilder::NamedType(NamedTypeReference::GenerateAutoDemangledTypeReference(UnknownNamedTypeClass, varName)); |
| 1850 | } |
| 1851 | // [<discriminator>] |
| 1852 | //TODO: What do we do with discriminators? |
| 1853 | if (m_reader.Peek() == '_') |
| 1854 | { |
| 1855 | m_reader.Consume(); |
| 1856 | if (m_reader.Peek() == '_') |
| 1857 | { |
| 1858 | m_reader.Consume(); |
| 1859 | DemangleNumberAsString(); |
| 1860 | if (m_reader.Read() != '_') |
| 1861 | throw DemangleException(); |
| 1862 | } |
| 1863 | else |
| 1864 | { |
| 1865 | DemangleNumberAsString(); |
| 1866 | } |
| 1867 | } |
| 1868 | dedent(); |
| 1869 | return type; |
| 1870 | } |
| 1871 | |
| 1872 | |
| 1873 | TypeBuilder DemangleGNU3::DemangleName() |
nothing calls this directly
no test coverage detected