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