1dda28197Spatrick //===-- VariableList.cpp --------------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9061da546Spatrick #include "lldb/Symbol/VariableList.h"
10061da546Spatrick 
11061da546Spatrick #include "lldb/Symbol/Block.h"
12061da546Spatrick #include "lldb/Symbol/CompileUnit.h"
13061da546Spatrick #include "lldb/Symbol/Function.h"
14061da546Spatrick #include "lldb/Utility/RegularExpression.h"
15061da546Spatrick 
16061da546Spatrick using namespace lldb;
17061da546Spatrick using namespace lldb_private;
18061da546Spatrick 
19061da546Spatrick // VariableList constructor
VariableList()20061da546Spatrick VariableList::VariableList() : m_variables() {}
21061da546Spatrick 
22061da546Spatrick // Destructor
23*be691f3bSpatrick VariableList::~VariableList() = default;
24061da546Spatrick 
AddVariable(const VariableSP & var_sp)25061da546Spatrick void VariableList::AddVariable(const VariableSP &var_sp) {
26061da546Spatrick   m_variables.push_back(var_sp);
27061da546Spatrick }
28061da546Spatrick 
AddVariableIfUnique(const lldb::VariableSP & var_sp)29061da546Spatrick bool VariableList::AddVariableIfUnique(const lldb::VariableSP &var_sp) {
30061da546Spatrick   if (FindVariableIndex(var_sp) == UINT32_MAX) {
31061da546Spatrick     m_variables.push_back(var_sp);
32061da546Spatrick     return true;
33061da546Spatrick   }
34061da546Spatrick   return false;
35061da546Spatrick }
36061da546Spatrick 
AddVariables(VariableList * variable_list)37061da546Spatrick void VariableList::AddVariables(VariableList *variable_list) {
38061da546Spatrick   if (variable_list) {
39061da546Spatrick     std::copy(variable_list->m_variables.begin(), // source begin
40061da546Spatrick               variable_list->m_variables.end(),   // source end
41061da546Spatrick               back_inserter(m_variables));        // destination
42061da546Spatrick   }
43061da546Spatrick }
44061da546Spatrick 
Clear()45061da546Spatrick void VariableList::Clear() { m_variables.clear(); }
46061da546Spatrick 
GetVariableAtIndex(size_t idx) const47061da546Spatrick VariableSP VariableList::GetVariableAtIndex(size_t idx) const {
48061da546Spatrick   VariableSP var_sp;
49061da546Spatrick   if (idx < m_variables.size())
50061da546Spatrick     var_sp = m_variables[idx];
51061da546Spatrick   return var_sp;
52061da546Spatrick }
53061da546Spatrick 
RemoveVariableAtIndex(size_t idx)54061da546Spatrick VariableSP VariableList::RemoveVariableAtIndex(size_t idx) {
55061da546Spatrick   VariableSP var_sp;
56061da546Spatrick   if (idx < m_variables.size()) {
57061da546Spatrick     var_sp = m_variables[idx];
58061da546Spatrick     m_variables.erase(m_variables.begin() + idx);
59061da546Spatrick   }
60061da546Spatrick   return var_sp;
61061da546Spatrick }
62061da546Spatrick 
FindVariableIndex(const VariableSP & var_sp)63061da546Spatrick uint32_t VariableList::FindVariableIndex(const VariableSP &var_sp) {
64061da546Spatrick   iterator pos, end = m_variables.end();
65061da546Spatrick   for (pos = m_variables.begin(); pos != end; ++pos) {
66061da546Spatrick     if (pos->get() == var_sp.get())
67061da546Spatrick       return std::distance(m_variables.begin(), pos);
68061da546Spatrick   }
69061da546Spatrick   return UINT32_MAX;
70061da546Spatrick }
71061da546Spatrick 
FindVariable(ConstString name,bool include_static_members)72061da546Spatrick VariableSP VariableList::FindVariable(ConstString name,
73061da546Spatrick                                       bool include_static_members) {
74061da546Spatrick   VariableSP var_sp;
75061da546Spatrick   iterator pos, end = m_variables.end();
76061da546Spatrick   for (pos = m_variables.begin(); pos != end; ++pos) {
77061da546Spatrick     if ((*pos)->NameMatches(name)) {
78061da546Spatrick       if (include_static_members || !(*pos)->IsStaticMember()) {
79061da546Spatrick         var_sp = (*pos);
80061da546Spatrick         break;
81061da546Spatrick       }
82061da546Spatrick     }
83061da546Spatrick   }
84061da546Spatrick   return var_sp;
85061da546Spatrick }
86061da546Spatrick 
FindVariable(ConstString name,lldb::ValueType value_type,bool include_static_members)87061da546Spatrick VariableSP VariableList::FindVariable(ConstString name,
88061da546Spatrick                                       lldb::ValueType value_type,
89061da546Spatrick                                       bool include_static_members) {
90061da546Spatrick   VariableSP var_sp;
91061da546Spatrick   iterator pos, end = m_variables.end();
92061da546Spatrick   for (pos = m_variables.begin(); pos != end; ++pos) {
93061da546Spatrick     if ((*pos)->NameMatches(name) && (*pos)->GetScope() == value_type) {
94061da546Spatrick       if (include_static_members || !(*pos)->IsStaticMember()) {
95061da546Spatrick         var_sp = (*pos);
96061da546Spatrick         break;
97061da546Spatrick       }
98061da546Spatrick     }
99061da546Spatrick   }
100061da546Spatrick   return var_sp;
101061da546Spatrick }
102061da546Spatrick 
AppendVariablesIfUnique(VariableList & var_list)103061da546Spatrick size_t VariableList::AppendVariablesIfUnique(VariableList &var_list) {
104061da546Spatrick   const size_t initial_size = var_list.GetSize();
105061da546Spatrick   iterator pos, end = m_variables.end();
106061da546Spatrick   for (pos = m_variables.begin(); pos != end; ++pos)
107061da546Spatrick     var_list.AddVariableIfUnique(*pos);
108061da546Spatrick   return var_list.GetSize() - initial_size;
109061da546Spatrick }
110061da546Spatrick 
AppendVariablesIfUnique(const RegularExpression & regex,VariableList & var_list,size_t & total_matches)111061da546Spatrick size_t VariableList::AppendVariablesIfUnique(const RegularExpression &regex,
112061da546Spatrick                                              VariableList &var_list,
113061da546Spatrick                                              size_t &total_matches) {
114061da546Spatrick   const size_t initial_size = var_list.GetSize();
115061da546Spatrick   iterator pos, end = m_variables.end();
116061da546Spatrick   for (pos = m_variables.begin(); pos != end; ++pos) {
117061da546Spatrick     if ((*pos)->NameMatches(regex)) {
118061da546Spatrick       // Note the total matches found
119061da546Spatrick       total_matches++;
120061da546Spatrick       // Only add this variable if it isn't already in the "var_list"
121061da546Spatrick       var_list.AddVariableIfUnique(*pos);
122061da546Spatrick     }
123061da546Spatrick   }
124061da546Spatrick   // Return the number of new unique variables added to "var_list"
125061da546Spatrick   return var_list.GetSize() - initial_size;
126061da546Spatrick }
127061da546Spatrick 
AppendVariablesWithScope(lldb::ValueType type,VariableList & var_list,bool if_unique)128061da546Spatrick size_t VariableList::AppendVariablesWithScope(lldb::ValueType type,
129061da546Spatrick                                               VariableList &var_list,
130061da546Spatrick                                               bool if_unique) {
131061da546Spatrick   const size_t initial_size = var_list.GetSize();
132061da546Spatrick   iterator pos, end = m_variables.end();
133061da546Spatrick   for (pos = m_variables.begin(); pos != end; ++pos) {
134061da546Spatrick     if ((*pos)->GetScope() == type) {
135061da546Spatrick       if (if_unique)
136061da546Spatrick         var_list.AddVariableIfUnique(*pos);
137061da546Spatrick       else
138061da546Spatrick         var_list.AddVariable(*pos);
139061da546Spatrick     }
140061da546Spatrick   }
141061da546Spatrick   // Return the number of new unique variables added to "var_list"
142061da546Spatrick   return var_list.GetSize() - initial_size;
143061da546Spatrick }
144061da546Spatrick 
FindIndexForVariable(Variable * variable)145061da546Spatrick uint32_t VariableList::FindIndexForVariable(Variable *variable) {
146061da546Spatrick   VariableSP var_sp;
147061da546Spatrick   iterator pos;
148061da546Spatrick   const iterator begin = m_variables.begin();
149061da546Spatrick   const iterator end = m_variables.end();
150061da546Spatrick   for (pos = m_variables.begin(); pos != end; ++pos) {
151061da546Spatrick     if ((*pos).get() == variable)
152061da546Spatrick       return std::distance(begin, pos);
153061da546Spatrick   }
154061da546Spatrick   return UINT32_MAX;
155061da546Spatrick }
156061da546Spatrick 
MemorySize() const157061da546Spatrick size_t VariableList::MemorySize() const {
158061da546Spatrick   size_t mem_size = sizeof(VariableList);
159061da546Spatrick   const_iterator pos, end = m_variables.end();
160061da546Spatrick   for (pos = m_variables.begin(); pos != end; ++pos)
161061da546Spatrick     mem_size += (*pos)->MemorySize();
162061da546Spatrick   return mem_size;
163061da546Spatrick }
164061da546Spatrick 
GetSize() const165061da546Spatrick size_t VariableList::GetSize() const { return m_variables.size(); }
166061da546Spatrick 
Dump(Stream * s,bool show_context) const167061da546Spatrick void VariableList::Dump(Stream *s, bool show_context) const {
168061da546Spatrick   //  s.Printf("%.*p: ", (int)sizeof(void*) * 2, this);
169061da546Spatrick   //  s.Indent();
170061da546Spatrick   //  s << "VariableList\n";
171061da546Spatrick 
172061da546Spatrick   const_iterator pos, end = m_variables.end();
173061da546Spatrick   for (pos = m_variables.begin(); pos != end; ++pos) {
174061da546Spatrick     (*pos)->Dump(s, show_context);
175061da546Spatrick   }
176061da546Spatrick }
177