1 //===-- VariableList.cpp ----------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Symbol/VariableList.h" 11 12 #include "lldb/Core/RegularExpression.h" 13 #include "lldb/Symbol/Block.h" 14 #include "lldb/Symbol/Function.h" 15 #include "lldb/Symbol/CompileUnit.h" 16 17 using namespace lldb; 18 using namespace lldb_private; 19 20 //---------------------------------------------------------------------- 21 // VariableList constructor 22 //---------------------------------------------------------------------- 23 VariableList::VariableList() : 24 m_variables() 25 { 26 } 27 28 //---------------------------------------------------------------------- 29 // Destructor 30 //---------------------------------------------------------------------- 31 VariableList::~VariableList() 32 { 33 } 34 35 void 36 VariableList::AddVariable(const VariableSP &var_sp) 37 { 38 m_variables.push_back(var_sp); 39 } 40 41 bool 42 VariableList::AddVariableIfUnique (const lldb::VariableSP &var_sp) 43 { 44 if (FindVariableIndex (var_sp) == UINT32_MAX) 45 { 46 m_variables.push_back(var_sp); 47 return true; 48 } 49 return false; 50 } 51 52 void 53 VariableList::AddVariables(VariableList *variable_list) 54 { 55 if (variable_list) 56 { 57 std::copy(variable_list->m_variables.begin(), // source begin 58 variable_list->m_variables.end(), // source end 59 back_inserter(m_variables)); // destination 60 } 61 } 62 63 void 64 VariableList::Clear() 65 { 66 m_variables.clear(); 67 } 68 69 VariableSP 70 VariableList::GetVariableAtIndex(size_t idx) const 71 { 72 VariableSP var_sp; 73 if (idx < m_variables.size()) 74 var_sp = m_variables[idx]; 75 return var_sp; 76 } 77 78 VariableSP 79 VariableList::RemoveVariableAtIndex(size_t idx) 80 { 81 VariableSP var_sp; 82 if (idx < m_variables.size()) 83 { 84 var_sp = m_variables[idx]; 85 m_variables.erase (m_variables.begin() + idx); 86 } 87 return var_sp; 88 } 89 90 uint32_t 91 VariableList::FindVariableIndex (const VariableSP &var_sp) 92 { 93 iterator pos, end = m_variables.end(); 94 for (pos = m_variables.begin(); pos != end; ++pos) 95 { 96 if (pos->get() == var_sp.get()) 97 return std::distance (m_variables.begin(), pos); 98 } 99 return UINT32_MAX; 100 } 101 102 VariableSP 103 VariableList::FindVariable(const ConstString& name) 104 { 105 VariableSP var_sp; 106 iterator pos, end = m_variables.end(); 107 for (pos = m_variables.begin(); pos != end; ++pos) 108 { 109 if ((*pos)->NameMatches(name)) 110 { 111 var_sp = (*pos); 112 break; 113 } 114 } 115 return var_sp; 116 } 117 118 size_t 119 VariableList::AppendVariablesIfUnique (const RegularExpression& regex, VariableList &var_list, size_t& total_matches) 120 { 121 const size_t initial_size = var_list.GetSize(); 122 iterator pos, end = m_variables.end(); 123 for (pos = m_variables.begin(); pos != end; ++pos) 124 { 125 if ((*pos)->NameMatches (regex)) 126 { 127 // Note the total matches found 128 total_matches++; 129 // Only add this variable if it isn't already in the "var_list" 130 var_list.AddVariableIfUnique (*pos); 131 } 132 } 133 // Return the number of new unique variables added to "var_list" 134 return var_list.GetSize() - initial_size; 135 } 136 137 size_t 138 VariableList::AppendVariablesWithScope (lldb::ValueType type, 139 VariableList &var_list, 140 bool if_unique) 141 { 142 const size_t initial_size = var_list.GetSize(); 143 iterator pos, end = m_variables.end(); 144 for (pos = m_variables.begin(); pos != end; ++pos) 145 { 146 if ((*pos)->GetScope() == type) 147 { 148 if (if_unique) 149 var_list.AddVariableIfUnique (*pos); 150 else 151 var_list.AddVariable(*pos); 152 } 153 } 154 // Return the number of new unique variables added to "var_list" 155 return var_list.GetSize() - initial_size; 156 } 157 158 uint32_t 159 VariableList::FindIndexForVariable (Variable* variable) 160 { 161 VariableSP var_sp; 162 iterator pos; 163 const iterator begin = m_variables.begin(); 164 const iterator end = m_variables.end(); 165 for (pos = m_variables.begin(); pos != end; ++pos) 166 { 167 if ((*pos).get() == variable) 168 return std::distance (begin, pos); 169 } 170 return UINT32_MAX; 171 } 172 173 size_t 174 VariableList::MemorySize() const 175 { 176 size_t mem_size = sizeof(VariableList); 177 const_iterator pos, end = m_variables.end(); 178 for (pos = m_variables.begin(); pos != end; ++pos) 179 mem_size += (*pos)->MemorySize(); 180 return mem_size; 181 } 182 183 size_t 184 VariableList::GetSize() const 185 { 186 return m_variables.size(); 187 } 188 189 void 190 VariableList::Dump(Stream *s, bool show_context) const 191 { 192 // s.Printf("%.*p: ", (int)sizeof(void*) * 2, this); 193 // s.Indent(); 194 // s << "VariableList\n"; 195 196 const_iterator pos, end = m_variables.end(); 197 for (pos = m_variables.begin(); pos != end; ++pos) 198 { 199 (*pos)->Dump(s, show_context); 200 } 201 } 202