1254721Semaste//===-- VariableList.cpp ----------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "lldb/Symbol/VariableList.h" 11254721Semaste 12254721Semaste#include "lldb/Core/RegularExpression.h" 13254721Semaste#include "lldb/Symbol/Block.h" 14254721Semaste#include "lldb/Symbol/Function.h" 15254721Semaste#include "lldb/Symbol/CompileUnit.h" 16254721Semaste 17254721Semasteusing namespace lldb; 18254721Semasteusing namespace lldb_private; 19254721Semaste 20254721Semaste//---------------------------------------------------------------------- 21254721Semaste// VariableList constructor 22254721Semaste//---------------------------------------------------------------------- 23254721SemasteVariableList::VariableList() : 24254721Semaste m_variables() 25254721Semaste{ 26254721Semaste} 27254721Semaste 28254721Semaste//---------------------------------------------------------------------- 29254721Semaste// Destructor 30254721Semaste//---------------------------------------------------------------------- 31254721SemasteVariableList::~VariableList() 32254721Semaste{ 33254721Semaste} 34254721Semaste 35254721Semastevoid 36254721SemasteVariableList::AddVariable(const VariableSP &var_sp) 37254721Semaste{ 38254721Semaste m_variables.push_back(var_sp); 39254721Semaste} 40254721Semaste 41254721Semastebool 42254721SemasteVariableList::AddVariableIfUnique (const lldb::VariableSP &var_sp) 43254721Semaste{ 44254721Semaste if (FindVariableIndex (var_sp) == UINT32_MAX) 45254721Semaste { 46254721Semaste m_variables.push_back(var_sp); 47254721Semaste return true; 48254721Semaste } 49254721Semaste return false; 50254721Semaste} 51254721Semaste 52254721Semastevoid 53254721SemasteVariableList::AddVariables(VariableList *variable_list) 54254721Semaste{ 55254721Semaste if (variable_list) 56254721Semaste { 57254721Semaste std::copy(variable_list->m_variables.begin(), // source begin 58254721Semaste variable_list->m_variables.end(), // source end 59254721Semaste back_inserter(m_variables)); // destination 60254721Semaste } 61254721Semaste} 62254721Semaste 63254721Semastevoid 64254721SemasteVariableList::Clear() 65254721Semaste{ 66254721Semaste m_variables.clear(); 67254721Semaste} 68254721Semaste 69254721SemasteVariableSP 70254721SemasteVariableList::GetVariableAtIndex(size_t idx) const 71254721Semaste{ 72254721Semaste VariableSP var_sp; 73254721Semaste if (idx < m_variables.size()) 74254721Semaste var_sp = m_variables[idx]; 75254721Semaste return var_sp; 76254721Semaste} 77254721Semaste 78254721SemasteVariableSP 79254721SemasteVariableList::RemoveVariableAtIndex(size_t idx) 80254721Semaste{ 81254721Semaste VariableSP var_sp; 82254721Semaste if (idx < m_variables.size()) 83254721Semaste { 84254721Semaste var_sp = m_variables[idx]; 85254721Semaste m_variables.erase (m_variables.begin() + idx); 86254721Semaste } 87254721Semaste return var_sp; 88254721Semaste} 89254721Semaste 90254721Semasteuint32_t 91254721SemasteVariableList::FindVariableIndex (const VariableSP &var_sp) 92254721Semaste{ 93254721Semaste iterator pos, end = m_variables.end(); 94254721Semaste for (pos = m_variables.begin(); pos != end; ++pos) 95254721Semaste { 96254721Semaste if (pos->get() == var_sp.get()) 97254721Semaste return std::distance (m_variables.begin(), pos); 98254721Semaste } 99254721Semaste return UINT32_MAX; 100254721Semaste} 101254721Semaste 102254721SemasteVariableSP 103254721SemasteVariableList::FindVariable(const ConstString& name) 104254721Semaste{ 105254721Semaste VariableSP var_sp; 106254721Semaste iterator pos, end = m_variables.end(); 107254721Semaste for (pos = m_variables.begin(); pos != end; ++pos) 108254721Semaste { 109254721Semaste if ((*pos)->NameMatches(name)) 110254721Semaste { 111254721Semaste var_sp = (*pos); 112254721Semaste break; 113254721Semaste } 114254721Semaste } 115254721Semaste return var_sp; 116254721Semaste} 117254721Semaste 118269024SemasteVariableSP 119269024SemasteVariableList::FindVariable (const ConstString& name, lldb::ValueType value_type) 120269024Semaste{ 121269024Semaste VariableSP var_sp; 122269024Semaste iterator pos, end = m_variables.end(); 123269024Semaste for (pos = m_variables.begin(); pos != end; ++pos) 124269024Semaste { 125269024Semaste if ((*pos)->NameMatches(name) && (*pos)->GetScope() == value_type) 126269024Semaste { 127269024Semaste var_sp = (*pos); 128269024Semaste break; 129269024Semaste } 130269024Semaste } 131269024Semaste return var_sp; 132269024Semaste} 133269024Semaste 134254721Semastesize_t 135269024SemasteVariableList::AppendVariablesIfUnique(VariableList &var_list) 136269024Semaste{ 137269024Semaste const size_t initial_size = var_list.GetSize(); 138269024Semaste iterator pos, end = m_variables.end(); 139269024Semaste for (pos = m_variables.begin(); pos != end; ++pos) 140269024Semaste var_list.AddVariableIfUnique(*pos); 141269024Semaste return var_list.GetSize() - initial_size; 142269024Semaste} 143269024Semaste 144269024Semastesize_t 145254721SemasteVariableList::AppendVariablesIfUnique (const RegularExpression& regex, VariableList &var_list, size_t& total_matches) 146254721Semaste{ 147254721Semaste const size_t initial_size = var_list.GetSize(); 148254721Semaste iterator pos, end = m_variables.end(); 149254721Semaste for (pos = m_variables.begin(); pos != end; ++pos) 150254721Semaste { 151254721Semaste if ((*pos)->NameMatches (regex)) 152254721Semaste { 153254721Semaste // Note the total matches found 154254721Semaste total_matches++; 155254721Semaste // Only add this variable if it isn't already in the "var_list" 156254721Semaste var_list.AddVariableIfUnique (*pos); 157254721Semaste } 158254721Semaste } 159254721Semaste // Return the number of new unique variables added to "var_list" 160254721Semaste return var_list.GetSize() - initial_size; 161254721Semaste} 162254721Semaste 163254721Semastesize_t 164254721SemasteVariableList::AppendVariablesWithScope (lldb::ValueType type, 165254721Semaste VariableList &var_list, 166254721Semaste bool if_unique) 167254721Semaste{ 168254721Semaste const size_t initial_size = var_list.GetSize(); 169254721Semaste iterator pos, end = m_variables.end(); 170254721Semaste for (pos = m_variables.begin(); pos != end; ++pos) 171254721Semaste { 172254721Semaste if ((*pos)->GetScope() == type) 173254721Semaste { 174254721Semaste if (if_unique) 175254721Semaste var_list.AddVariableIfUnique (*pos); 176254721Semaste else 177254721Semaste var_list.AddVariable(*pos); 178254721Semaste } 179254721Semaste } 180254721Semaste // Return the number of new unique variables added to "var_list" 181254721Semaste return var_list.GetSize() - initial_size; 182254721Semaste} 183254721Semaste 184254721Semasteuint32_t 185254721SemasteVariableList::FindIndexForVariable (Variable* variable) 186254721Semaste{ 187254721Semaste VariableSP var_sp; 188254721Semaste iterator pos; 189254721Semaste const iterator begin = m_variables.begin(); 190254721Semaste const iterator end = m_variables.end(); 191254721Semaste for (pos = m_variables.begin(); pos != end; ++pos) 192254721Semaste { 193254721Semaste if ((*pos).get() == variable) 194254721Semaste return std::distance (begin, pos); 195254721Semaste } 196254721Semaste return UINT32_MAX; 197254721Semaste} 198254721Semaste 199254721Semastesize_t 200254721SemasteVariableList::MemorySize() const 201254721Semaste{ 202254721Semaste size_t mem_size = sizeof(VariableList); 203254721Semaste const_iterator pos, end = m_variables.end(); 204254721Semaste for (pos = m_variables.begin(); pos != end; ++pos) 205254721Semaste mem_size += (*pos)->MemorySize(); 206254721Semaste return mem_size; 207254721Semaste} 208254721Semaste 209254721Semastesize_t 210254721SemasteVariableList::GetSize() const 211254721Semaste{ 212254721Semaste return m_variables.size(); 213254721Semaste} 214254721Semaste 215254721Semastevoid 216254721SemasteVariableList::Dump(Stream *s, bool show_context) const 217254721Semaste{ 218254721Semaste// s.Printf("%.*p: ", (int)sizeof(void*) * 2, this); 219254721Semaste// s.Indent(); 220254721Semaste// s << "VariableList\n"; 221254721Semaste 222254721Semaste const_iterator pos, end = m_variables.end(); 223254721Semaste for (pos = m_variables.begin(); pos != end; ++pos) 224254721Semaste { 225254721Semaste (*pos)->Dump(s, show_context); 226254721Semaste } 227254721Semaste} 228