brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · b7a396e Raw
177 lines · cpp
1//===-- VariableList.cpp --------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "lldb/Symbol/VariableList.h"10 11#include "lldb/Symbol/Block.h"12#include "lldb/Symbol/CompileUnit.h"13#include "lldb/Symbol/Function.h"14#include "lldb/Utility/RegularExpression.h"15 16using namespace lldb;17using namespace lldb_private;18 19// VariableList constructor20VariableList::VariableList() : m_variables() {}21 22// Destructor23VariableList::~VariableList() = default;24 25void VariableList::AddVariable(const VariableSP &var_sp) {26  m_variables.push_back(var_sp);27}28 29bool VariableList::AddVariableIfUnique(const lldb::VariableSP &var_sp) {30  if (FindVariableIndex(var_sp) == UINT32_MAX) {31    m_variables.push_back(var_sp);32    return true;33  }34  return false;35}36 37void VariableList::AddVariables(VariableList *variable_list) {38  if (variable_list) {39    std::copy(variable_list->m_variables.begin(), // source begin40              variable_list->m_variables.end(),   // source end41              back_inserter(m_variables));        // destination42  }43}44 45void VariableList::Clear() { m_variables.clear(); }46 47VariableSP VariableList::GetVariableAtIndex(size_t idx) const {48  VariableSP var_sp;49  if (idx < m_variables.size())50    var_sp = m_variables[idx];51  return var_sp;52}53 54VariableSP VariableList::RemoveVariableAtIndex(size_t idx) {55  VariableSP var_sp;56  if (idx < m_variables.size()) {57    var_sp = m_variables[idx];58    m_variables.erase(m_variables.begin() + idx);59  }60  return var_sp;61}62 63uint32_t VariableList::FindVariableIndex(const VariableSP &var_sp) {64  iterator pos, end = m_variables.end();65  for (pos = m_variables.begin(); pos != end; ++pos) {66    if (pos->get() == var_sp.get())67      return std::distance(m_variables.begin(), pos);68  }69  return UINT32_MAX;70}71 72VariableSP VariableList::FindVariable(ConstString name,73                                      bool include_static_members) {74  VariableSP var_sp;75  iterator pos, end = m_variables.end();76  for (pos = m_variables.begin(); pos != end; ++pos) {77    if ((*pos)->NameMatches(name)) {78      if (include_static_members || !(*pos)->IsStaticMember()) {79        var_sp = (*pos);80        break;81      }82    }83  }84  return var_sp;85}86 87VariableSP VariableList::FindVariable(ConstString name,88                                      lldb::ValueType value_type,89                                      bool include_static_members) {90  VariableSP var_sp;91  iterator pos, end = m_variables.end();92  for (pos = m_variables.begin(); pos != end; ++pos) {93    if ((*pos)->NameMatches(name) && (*pos)->GetScope() == value_type) {94      if (include_static_members || !(*pos)->IsStaticMember()) {95        var_sp = (*pos);96        break;97      }98    }99  }100  return var_sp;101}102 103size_t VariableList::AppendVariablesIfUnique(VariableList &var_list) {104  const size_t initial_size = var_list.GetSize();105  iterator pos, end = m_variables.end();106  for (pos = m_variables.begin(); pos != end; ++pos)107    var_list.AddVariableIfUnique(*pos);108  return var_list.GetSize() - initial_size;109}110 111size_t VariableList::AppendVariablesIfUnique(const RegularExpression &regex,112                                             VariableList &var_list,113                                             size_t &total_matches) {114  const size_t initial_size = var_list.GetSize();115  iterator pos, end = m_variables.end();116  for (pos = m_variables.begin(); pos != end; ++pos) {117    if ((*pos)->NameMatches(regex)) {118      // Note the total matches found119      total_matches++;120      // Only add this variable if it isn't already in the "var_list"121      var_list.AddVariableIfUnique(*pos);122    }123  }124  // Return the number of new unique variables added to "var_list"125  return var_list.GetSize() - initial_size;126}127 128size_t VariableList::AppendVariablesWithScope(lldb::ValueType type,129                                              VariableList &var_list,130                                              bool if_unique) {131  const size_t initial_size = var_list.GetSize();132  iterator pos, end = m_variables.end();133  for (pos = m_variables.begin(); pos != end; ++pos) {134    if ((*pos)->GetScope() == type) {135      if (if_unique)136        var_list.AddVariableIfUnique(*pos);137      else138        var_list.AddVariable(*pos);139    }140  }141  // Return the number of new unique variables added to "var_list"142  return var_list.GetSize() - initial_size;143}144 145uint32_t VariableList::FindIndexForVariable(Variable *variable) {146  VariableSP var_sp;147  iterator pos;148  const iterator begin = m_variables.begin();149  const iterator end = m_variables.end();150  for (pos = m_variables.begin(); pos != end; ++pos) {151    if ((*pos).get() == variable)152      return std::distance(begin, pos);153  }154  return UINT32_MAX;155}156 157size_t VariableList::MemorySize() const {158  size_t mem_size = sizeof(VariableList);159  const_iterator pos, end = m_variables.end();160  for (pos = m_variables.begin(); pos != end; ++pos)161    mem_size += (*pos)->MemorySize();162  return mem_size;163}164 165size_t VariableList::GetSize() const { return m_variables.size(); }166 167void VariableList::Dump(Stream *s, bool show_context) const {168  //  s.Printf("%.*p: ", (int)sizeof(void*) * 2, this);169  //  s.Indent();170  //  s << "VariableList\n";171 172  const_iterator pos, end = m_variables.end();173  for (pos = m_variables.begin(); pos != end; ++pos) {174    (*pos)->Dump(s, show_context);175  }176}177