Mangled.cpp revision 251de2acc7c269a1168ce906a269f4ab1b999f09
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Mangled.cpp ---------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <cxxabi.h> 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton#include "llvm/ADT/DenseMap.h" 13e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConstString.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Mangled.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 18a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <ctype.h> 19a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <string.h> 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Mangled 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Default constructor 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Mangled () : 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mangled(), 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_demangled() 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Constructor with an optional string and a boolean indicating if it is 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the mangled version. 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Mangled (const char *s, bool mangled) : 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mangled(), 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_demangled() 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (s && s[0]) 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetValue(s, mangled); 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::~Mangled () 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Convert to pointer operator. This allows code to check any Mangled 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// objects to see if they contain anything valid using code such as: 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Mangled mangled(...); 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (mangled) 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { ... 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::operator void* () const 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (m_mangled) ? const_cast<Mangled*>(this) : NULL; 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Logical NOT operator. This allows code to check any Mangled 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// objects to see if they are invalid using code such as: 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Mangled mangled(...); 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (!file_spec) 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { ... 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::operator! () const 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return !m_mangled; 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Clear the mangled and demangled values. 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Clear () 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mangled.Clear(); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_demangled.Clear(); 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Compare the the string values. 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Compare (const Mangled& a, const Mangled& b) 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham return ConstString::Compare(a.GetName(ePreferDemangled), a.GetName(ePreferDemangled)); 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Set the string value in this objects. If "mangled" is true, then 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the mangled named is set with the new value in "s", else the 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// demangled name is set. 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::SetValue (const char *s, bool mangled) 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mangled.Clear(); 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_demangled.Clear(); 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (s) 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (mangled) 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mangled.SetCString (s); 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_demangled.SetCString(s); 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Generate the demangled name on demand using this accessor. Code in 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// this class will need to use this accessor if it wishes to decode 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the demangled name. The result is cached and will be kept until a 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// new string value is supplied to this object, or until the end of the 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// object's lifetime. 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString& 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::GetDemangledName () const 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check to make sure we have a valid mangled name and that we 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // haven't already decoded our mangled name. 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_mangled && !m_demangled) 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We need to generate and cache the demangled name. 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Mangled::GetDemangledName (m_mangled = %s)", 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mangled.GetCString()); 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We already know mangled is valid from the above check, 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lets just make sure it isn't empty... 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char * mangled = m_mangled.AsCString(); 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (mangled[0]) 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 147e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // Since demangling can be a costly, and since all names that go 148e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // into a ConstString (like our m_mangled and m_demangled members) 149e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // end up being unique "const char *" values, we can use a DenseMap 150e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // to speed up our lookup. We do this because often our symbol table 151e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // and our debug information both have the mangled names which they 152e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // would each need to demangle. Also, with GCC we end up with the one 153e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // definition rule where a lot of STL code produces symbols that are 154e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // in multiple compile units and the mangled names end up being in 155e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // the same binary multiple times. The performance win isn't huge, 156e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // but we showed a 20% improvement on darwin. 157e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton typedef llvm::DenseMap<const char *, const char *> MangledToDemangledMap; 158e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton static MangledToDemangledMap g_mangled_to_demangled; 159e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton 160e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // Check our mangled string pointer to demangled string pointer map first 161e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton MangledToDemangledMap::const_iterator pos = g_mangled_to_demangled.find (mangled); 162e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton if (pos != g_mangled_to_demangled.end()) 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 164e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // We have already demangled this string, we can just use our saved result! 165e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton m_demangled.SetCString(pos->second); 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 169e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // We didn't already mangle this name, demangle it and if all goes well 170e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // add it to our map. 171e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton char *demangled_name = abi::__cxa_demangle (mangled, NULL, NULL, NULL); 172e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton 173e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton if (demangled_name) 174e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton { 175e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton m_demangled.SetCString (demangled_name); 176e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // Now that the name has been uniqued, add the uniqued C string 177e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // pointer from m_mangled as the key to the uniqued C string 178e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // pointer in m_demangled. 179e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton g_mangled_to_demangled.insert (std::make_pair (mangled, m_demangled.GetCString())); 180e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton free (demangled_name); 181e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton } 182e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton else 183e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton { 184e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // Set the demangled string to the empty string to indicate we 185e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // tried to parse it once and failed. 186e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton m_demangled.SetCString(""); 187e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton } 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_demangled; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Mangled name get accessor 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerConstString& 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::GetMangledName () 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mangled; 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Mangled name const get accessor 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString& 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::GetMangledName () const 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mangled; 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the demangled name if there is one, else return the mangled name. 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString& 21717454cfc6a757305a7d9d4c31313c38981b57b01Jim InghamMangled::GetName (Mangled::NamePreference preference) const 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 219251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton if (preference == ePreferDemangled) 22017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham { 221251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton const ConstString& name = GetDemangledName(); 222251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton if (name && !name.IsEmpty()) 223251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton return name; 224251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton return m_mangled; 225251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton } 226251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton else 227251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton { 228251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton const ConstString& name = GetMangledName(); 229251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton if (name && !name.IsEmpty()) 230251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton return name; 231251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton return m_demangled; 23217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham } 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Generate the tokens from the demangled name. 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns the number of tokens that were parsed. 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::GetTokens (Mangled::TokenList &tokens) const 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tokens.Clear(); 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstString& demangled = GetDemangledName(); 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (demangled && !demangled.IsEmpty()) 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tokens.Parse(demangled.AsCString()); 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return tokens.Size(); 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump a Mangled object to stream "s". We don't force our 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// demangled name to be computed currently (we don't use the accessor). 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Dump (Stream *s) const 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_mangled) 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *s << ", mangled = " << m_mangled; 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_demangled) 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char * demangled = m_demangled.AsCString(); 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(", demangled = %s", demangled[0] ? demangled : "<error>"); 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dumps a debug version of this string with extra object and state 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// information to stream "s". 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::DumpDebug (Stream *s) const 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("%*p: Mangled mangled = ", (int)sizeof(void*) * 2, this); 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mangled.DumpDebug(s); 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(", demangled = "); 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_demangled.DumpDebug(s); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Return the size in byte that this object takes in memory. The size 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// includes the size of the objects it owns, and not the strings that 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// it references because they are shared strings. 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::MemorySize () const 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mangled.MemorySize() + m_demangled.MemorySize(); 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump OBJ to the supplied stream S. 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneroperator << (Stream& s, const Mangled& obj) 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj.GetMangledName()) 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << "mangled = '" << obj.GetMangledName() << "'"; 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstString& demangled = obj.GetDemangledName(); 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (demangled) 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << ", demangled = '" << demangled << '\''; 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << ", demangled = <error>"; 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return s; 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Mangled::Token 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------- 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Default constructor 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------- 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Token::Token () : 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner type(eInvalid), 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value() 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------- 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Equal to operator 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------- 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Token::operator== (const Token& rhs) const 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return type == rhs.type && value == rhs.value; 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------- 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump the token to a stream "s" 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------- 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Token::Dump (Stream *s) const 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (type) 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eInvalid: s->PutCString("invalid "); break; 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eNameSpace: s->PutCString("namespace "); break; 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eMethodName: s->PutCString("method "); break; 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eType: s->PutCString("type "); break; 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eTemplate: s->PutCString("template "); break; 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eTemplateBeg: s->PutCString("template < "); break; 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eTemplateEnd: s->PutCString("template > "); break; 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eParamsBeg: s->PutCString("params ( "); break; 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eParamsEnd: s->PutCString("params ) "); break; 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eQualifier: s->PutCString("qualifier "); break; 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eError: s->PutCString("ERROR "); break; 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("type = %i", type); 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value.DumpDebug(s); 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------- 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if this token is a wildcard 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------- 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Token::IsWildcard () const 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString g_wildcard_str("*"); 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return value == g_wildcard_str; 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump "obj" to the supplied stream "s" 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator << (Stream& s, const Mangled::Token& obj) 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner obj.Dump(&s); 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return s; 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Mangled::TokenList 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Mangled::TokenList 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------- 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Default constructor. If demangled is non-NULL and not-empty 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the token list will parse up the demangled string it is 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// given, else the object will initialize an empty token list. 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------- 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::TokenList (const char *demangled) : 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens() 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (demangled && demangled[0]) 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Parse(demangled); 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::~TokenList () 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Parses "demangled" into tokens. This allows complex 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// comparisons to be done. Comparisons can include wildcards at 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the namespace, method name, template, and template and 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// parameter type levels. 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Example queries include: 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "std::basic_string<*>" // Find all std::basic_string variants 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "std::basic_string<*>::erase(*)" // Find all std::basic_string::erase variants with any number of parameters 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "*::clear()" // Find all functions with a method name of 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // "clear" that are in any namespace that 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // have no parameters 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "::printf" // Find the printf function in the global namespace 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "printf" // Ditto 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "foo::*(int)" // Find all functions in the class or namespace "foo" that take a single integer argument 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns the number of tokens that were decoded, or zero when 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// we fail. 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::Parse (const char *s) 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.clear(); 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Token token; 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eNameSpace; 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TokenType max_type = eInvalid; 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *p = s; 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t span = 0; 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t sep_size = 0; 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (*p != '\0') 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner p = p + span + sep_size; 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (isspace(*p)) 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++p; 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (*p == '\0') 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner span = strcspn(p, ":<>(),"); 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sep_size = 1; 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eInvalid; 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (p[span]) 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case '\0': 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case ':': 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (p[span+1] == ':') 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sep_size = 2; 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (span > 0) 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eNameSpace; 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.SetCStringWithLength (p, span); 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case '(': 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (span > 0) 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eMethodName; 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.SetCStringWithLength (p, span); 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eParamsBeg; 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.Clear(); 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case ',': 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (span > 0) 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eType; 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.SetCStringWithLength (p, span); 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case ')': 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (span > 0) 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eType; 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.SetCStringWithLength (p, span); 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eParamsEnd; 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.Clear(); 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case '<': 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (span > 0) 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eTemplate; 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.SetCStringWithLength (p, span); 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eTemplateBeg; 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.Clear(); 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case '>': 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (span > 0) 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eType; 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.SetCStringWithLength (p, span); 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eTemplateEnd; 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.Clear(); 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (max_type < token.type) 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner max_type = token.type; 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (token.type == eInvalid) 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (max_type >= eParamsEnd) 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eQualifier; 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.SetCString(p); 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (max_type >= eParamsBeg) 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eType; 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.SetCString(p); 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.type = eMethodName; 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner token.value.SetCString(p); 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.push_back(token); 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_tokens.size(); 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Clear the token list. 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::Clear () 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tokens.clear(); 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump the token list to the stream "s" 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::Dump (Stream *s) const 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::const_iterator pos; 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::const_iterator beg = m_tokens.begin(); 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::const_iterator end = m_tokens.end(); 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = beg; pos != end; ++pos) 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Indent("token["); 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *s << (uint32_t)std::distance(beg, pos) << "] = " << *pos << "\n"; 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Find the first token in the list that has "token_type" as its 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// type 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Mangled::Token * 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::Find (TokenType token_type) const 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::const_iterator pos; 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::const_iterator beg = m_tokens.begin(); 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::const_iterator end = m_tokens.end(); 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = beg; pos != end; ++pos) 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->type == token_type) 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &(*pos); 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Return the token at index "idx", or NULL if the index is 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of range. 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Mangled::Token * 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::GetTokenAtIndex (uint32_t idx) const 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < m_tokens.size()) 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_tokens[idx]; 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Given a token list, see if it matches this object's tokens. 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "token_list" can contain wild card values to enable powerful 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matching. Matching the std::string::erase(*) example that was 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// tokenized above we could use a token list such as: 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// token name 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ----------- ---------------------------------------- 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// eNameSpace "std" 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// eTemplate "basic_string" 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// eTemplateBeg 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// eInvalid "*" 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// eTemplateEnd 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// eMethodName "erase" 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// eParamsBeg 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// eInvalid "*" 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// eParamsEnd 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if it "token_list" matches this object's tokens, 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// false otherwise. 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::MatchesQuery (const Mangled::TokenList &match) const 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t match_count = 0; 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::const_iterator pos; 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::const_iterator pos_end = m_tokens.end(); 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::const_iterator match_pos; 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::const_iterator match_pos_end = match.m_tokens.end(); 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::const_iterator match_wildcard_pos = match_pos_end; 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::const_iterator match_next_pos = match_pos_end; 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t template_scope_depth = 0; 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_tokens.begin(), match_pos = match.m_tokens.begin(); 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos != pos_end && match_pos != match_pos_end; 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++match_pos) 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner match_next_pos = match_pos + 1; 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Is this a wildcard? 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_pos->IsWildcard()) 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_wildcard_pos != match_pos_end) 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; // Can't have two wildcards in effect at once. 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner match_wildcard_pos = match_pos; 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Are we at the end of the MATCH token list? 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_next_pos == match_pos_end) 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // There is nothing more to match, return if we have any matches so far... 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return match_count > 0; 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_pos->type == eInvalid || match_pos->type == eError) 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_pos->type == eTemplateBeg) 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++template_scope_depth; 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (match_pos->type == eTemplateEnd) 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(template_scope_depth > 0); 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner --template_scope_depth; 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Do we have a wildcard going right now? 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_wildcard_pos == match_pos_end) 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No wildcard matching right now, just check and see if things match 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (*pos == *match_pos) 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++match_count; 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have a wildcard match going 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For template types we need to make sure to match the template depths... 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t start_wildcard_template_scope_depth = template_scope_depth; 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t curr_wildcard_template_scope_depth = template_scope_depth; 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (pos != pos_end) 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_wildcard_pos->type == eNameSpace && pos->type == eParamsBeg) 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (start_wildcard_template_scope_depth == curr_wildcard_template_scope_depth) 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (*pos == *match_next_pos) 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++match_count; 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner match_pos = match_next_pos; 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner match_wildcard_pos = match_pos_end; 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->type == eTemplateBeg) 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++curr_wildcard_template_scope_depth; 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (pos->type == eTemplateEnd) 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner --curr_wildcard_template_scope_depth; 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++pos; 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != pos_end) 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++pos; 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_pos != match_pos_end) 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return match_count > 0; 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Return the number of tokens in the token collection 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::Size () const 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_tokens.size(); 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream out the tokens 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator << (Stream& s, const Mangled::TokenList& obj) 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner obj.Dump(&s); 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return s; 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 765