brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · 0a90ea6 Raw
216 lines · cpp
1//===-- SBValueList.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/API/SBValueList.h"10#include "lldb/API/SBError.h"11#include "lldb/API/SBStream.h"12#include "lldb/API/SBValue.h"13#include "lldb/Utility/Instrumentation.h"14#include "lldb/Utility/Status.h"15#include "lldb/ValueObject/ValueObjectList.h"16#include <vector>17 18using namespace lldb;19using namespace lldb_private;20 21class ValueListImpl {22public:23  ValueListImpl() = default;24 25  ValueListImpl(const ValueListImpl &rhs)26      : m_values(rhs.m_values), m_error(rhs.m_error.Clone()) {}27 28  ValueListImpl &operator=(const ValueListImpl &rhs) {29    if (this == &rhs)30      return *this;31    m_values = rhs.m_values;32    m_error = rhs.m_error.Clone();33    return *this;34  }35 36  uint32_t GetSize() { return m_values.size(); }37 38  void Append(const lldb::SBValue &sb_value) { m_values.push_back(sb_value); }39 40  void Append(const ValueListImpl &list) {41    for (auto val : list.m_values)42      Append(val);43  }44 45  lldb::SBValue GetValueAtIndex(uint32_t index) {46    if (index >= GetSize())47      return lldb::SBValue();48    return m_values[index];49  }50 51  lldb::SBValue FindValueByUID(lldb::user_id_t uid) {52    for (auto val : m_values) {53      if (val.IsValid() && val.GetID() == uid)54        return val;55    }56    return lldb::SBValue();57  }58 59  lldb::SBValue GetFirstValueByName(const char *name) const {60    if (name) {61      for (auto val : m_values) {62        if (val.IsValid() && val.GetName() && strcmp(name, val.GetName()) == 0)63          return val;64      }65    }66    return lldb::SBValue();67  }68 69  const Status &GetError() const { return m_error; }70 71  void SetError(Status &&error) { m_error = std::move(error); }72 73private:74  std::vector<lldb::SBValue> m_values;75  Status m_error;76};77 78SBValueList::SBValueList() { LLDB_INSTRUMENT_VA(this); }79 80SBValueList::SBValueList(const SBValueList &rhs) {81  LLDB_INSTRUMENT_VA(this, rhs);82 83  if (rhs.IsValid())84    m_opaque_up = std::make_unique<ValueListImpl>(*rhs);85}86 87SBValueList::SBValueList(const ValueListImpl *lldb_object_ptr) {88  if (lldb_object_ptr)89    m_opaque_up = std::make_unique<ValueListImpl>(*lldb_object_ptr);90}91 92SBValueList::~SBValueList() = default;93 94bool SBValueList::IsValid() const {95  LLDB_INSTRUMENT_VA(this);96  return this->operator bool();97}98SBValueList::operator bool() const {99  LLDB_INSTRUMENT_VA(this);100 101  return (m_opaque_up != nullptr);102}103 104void SBValueList::Clear() {105  LLDB_INSTRUMENT_VA(this);106 107  m_opaque_up.reset();108}109 110const SBValueList &SBValueList::operator=(const SBValueList &rhs) {111  LLDB_INSTRUMENT_VA(this, rhs);112 113  if (this != &rhs) {114    if (rhs.IsValid())115      m_opaque_up = std::make_unique<ValueListImpl>(*rhs);116    else117      m_opaque_up.reset();118  }119  return *this;120}121 122ValueListImpl *SBValueList::operator->() { return m_opaque_up.get(); }123 124ValueListImpl &SBValueList::operator*() { return *m_opaque_up; }125 126const ValueListImpl *SBValueList::operator->() const {127  return m_opaque_up.get();128}129 130const ValueListImpl &SBValueList::operator*() const { return *m_opaque_up; }131 132void SBValueList::Append(const SBValue &val_obj) {133  LLDB_INSTRUMENT_VA(this, val_obj);134 135  CreateIfNeeded();136  m_opaque_up->Append(val_obj);137}138 139void SBValueList::Append(lldb::ValueObjectSP &val_obj_sp) {140  if (val_obj_sp) {141    CreateIfNeeded();142    m_opaque_up->Append(SBValue(val_obj_sp));143  }144}145 146void SBValueList::Append(const lldb::SBValueList &value_list) {147  LLDB_INSTRUMENT_VA(this, value_list);148 149  if (value_list.IsValid()) {150    CreateIfNeeded();151    m_opaque_up->Append(*value_list);152  }153}154 155SBValue SBValueList::GetValueAtIndex(uint32_t idx) const {156  LLDB_INSTRUMENT_VA(this, idx);157 158  SBValue sb_value;159  if (m_opaque_up)160    sb_value = m_opaque_up->GetValueAtIndex(idx);161 162  return sb_value;163}164 165uint32_t SBValueList::GetSize() const {166  LLDB_INSTRUMENT_VA(this);167 168  uint32_t size = 0;169  if (m_opaque_up)170    size = m_opaque_up->GetSize();171 172  return size;173}174 175void SBValueList::CreateIfNeeded() {176  if (m_opaque_up == nullptr)177    m_opaque_up = std::make_unique<ValueListImpl>();178}179 180SBValue SBValueList::FindValueObjectByUID(lldb::user_id_t uid) {181  LLDB_INSTRUMENT_VA(this, uid);182 183  SBValue sb_value;184  if (m_opaque_up)185    sb_value = m_opaque_up->FindValueByUID(uid);186  return sb_value;187}188 189SBValue SBValueList::GetFirstValueByName(const char *name) const {190  LLDB_INSTRUMENT_VA(this, name);191 192  SBValue sb_value;193  if (m_opaque_up)194    sb_value = m_opaque_up->GetFirstValueByName(name);195  return sb_value;196}197 198void *SBValueList::opaque_ptr() { return m_opaque_up.get(); }199 200ValueListImpl &SBValueList::ref() {201  CreateIfNeeded();202  return *m_opaque_up;203}204 205lldb::SBError SBValueList::GetError() {206  LLDB_INSTRUMENT_VA(this);207  SBError sb_error;208  if (m_opaque_up)209    sb_error.SetError(m_opaque_up->GetError().Clone());210  return sb_error;211}212 213void SBValueList::SetError(lldb_private::Status &&status) {214  ref().SetError(std::move(status));215}216