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 ®ex,
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