| 1953 | |
| 1954 | |
| 1955 | TypeBuilder DemangleGNU3::DemangleSymbol(QualifiedName& varName) |
| 1956 | { |
| 1957 | indent(); |
| 1958 | MyLogDebug("%s: %s\n", __FUNCTION__, m_reader.GetRaw().c_str()); |
| 1959 | TypeBuilder returnType; |
| 1960 | bool isReturnTypeUnknown = false; |
| 1961 | TypeBuilder type; |
| 1962 | vector<FunctionParameter> params; |
| 1963 | bool cnst = false, vltl = false, rstrct = false; |
| 1964 | bool oldTopLevel; |
| 1965 | QualifiedName name; |
| 1966 | |
| 1967 | /* |
| 1968 | <encoding> ::= <function name> <bare-function-type> |
| 1969 | ::= <data name> |
| 1970 | ::= <special-name> |
| 1971 | */ |
| 1972 | //<special-name> |
| 1973 | switch (m_reader.Peek()) |
| 1974 | { |
| 1975 | case 'G': |
| 1976 | m_reader.Consume(); |
| 1977 | switch (m_reader.Read()) |
| 1978 | { |
| 1979 | case 'A': //TODO hidden alias |
| 1980 | LogWarn("Unsupported demangle type: hidden alias\n"); |
| 1981 | throw DemangleException(); |
| 1982 | case 'R': //TODO reference temporaries |
| 1983 | LogWarn("Unsupported demangle type: reference temporary\n"); |
| 1984 | throw DemangleException(); |
| 1985 | case 'T': //TODO transaction clones |
| 1986 | LogWarn("Unsupported demangle type: transaction clone\n"); |
| 1987 | throw DemangleException(); |
| 1988 | case 'V': |
| 1989 | { |
| 1990 | TypeBuilder t = DemangleSymbol(name); |
| 1991 | varName.push_back("guard_variable_for_" + t.GetTypeAndName(name)); |
| 1992 | type = TypeBuilder::IntegerType(1, false); |
| 1993 | if (m_reader.Length() == 0) |
| 1994 | return type; |
| 1995 | //function parameters |
| 1996 | string paramList; |
| 1997 | paramList += "("; |
| 1998 | bool first = true; |
| 1999 | do |
| 2000 | { |
| 2001 | if (m_reader.Peek() == 'v') |
| 2002 | { |
| 2003 | m_reader.Consume(); |
| 2004 | break; |
| 2005 | } |
| 2006 | if (!first) |
| 2007 | paramList += ", "; |
| 2008 | paramList += DemangleTypeString(); |
| 2009 | }while (m_reader.Peek() != 'E'); |
| 2010 | m_reader.Consume(); |
| 2011 | varName.back() += paramList + ")"; |
| 2012 | varName.push_back(DemangleSourceName()); |
no test coverage detected