summaryrefslogtreecommitdiff
path: root/lldb/source/API/SBValueList.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/API/SBValueList.cpp')
-rw-r--r--lldb/source/API/SBValueList.cpp231
1 files changed, 231 insertions, 0 deletions
diff --git a/lldb/source/API/SBValueList.cpp b/lldb/source/API/SBValueList.cpp
new file mode 100644
index 000000000000..7e909df260d7
--- /dev/null
+++ b/lldb/source/API/SBValueList.cpp
@@ -0,0 +1,231 @@
+//===-- SBValueList.cpp -----------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/API/SBValueList.h"
+#include "SBReproducerPrivate.h"
+#include "lldb/API/SBStream.h"
+#include "lldb/API/SBValue.h"
+#include "lldb/Core/ValueObjectList.h"
+
+#include <vector>
+
+using namespace lldb;
+using namespace lldb_private;
+
+class ValueListImpl {
+public:
+ ValueListImpl() : m_values() {}
+
+ ValueListImpl(const ValueListImpl &rhs) : m_values(rhs.m_values) {}
+
+ ValueListImpl &operator=(const ValueListImpl &rhs) {
+ if (this == &rhs)
+ return *this;
+ m_values = rhs.m_values;
+ return *this;
+ }
+
+ uint32_t GetSize() { return m_values.size(); }
+
+ void Append(const lldb::SBValue &sb_value) { m_values.push_back(sb_value); }
+
+ void Append(const ValueListImpl &list) {
+ for (auto val : list.m_values)
+ Append(val);
+ }
+
+ lldb::SBValue GetValueAtIndex(uint32_t index) {
+ if (index >= GetSize())
+ return lldb::SBValue();
+ return m_values[index];
+ }
+
+ lldb::SBValue FindValueByUID(lldb::user_id_t uid) {
+ for (auto val : m_values) {
+ if (val.IsValid() && val.GetID() == uid)
+ return val;
+ }
+ return lldb::SBValue();
+ }
+
+ lldb::SBValue GetFirstValueByName(const char *name) const {
+ if (name) {
+ for (auto val : m_values) {
+ if (val.IsValid() && val.GetName() && strcmp(name, val.GetName()) == 0)
+ return val;
+ }
+ }
+ return lldb::SBValue();
+ }
+
+private:
+ std::vector<lldb::SBValue> m_values;
+};
+
+SBValueList::SBValueList() : m_opaque_up() {
+ LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBValueList);
+}
+
+SBValueList::SBValueList(const SBValueList &rhs) : m_opaque_up() {
+ LLDB_RECORD_CONSTRUCTOR(SBValueList, (const lldb::SBValueList &), rhs);
+
+ if (rhs.IsValid())
+ m_opaque_up.reset(new ValueListImpl(*rhs));
+}
+
+SBValueList::SBValueList(const ValueListImpl *lldb_object_ptr) : m_opaque_up() {
+ if (lldb_object_ptr)
+ m_opaque_up.reset(new ValueListImpl(*lldb_object_ptr));
+}
+
+SBValueList::~SBValueList() {}
+
+bool SBValueList::IsValid() const {
+ LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBValueList, IsValid);
+ return this->operator bool();
+}
+SBValueList::operator bool() const {
+ LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBValueList, operator bool);
+
+ return (m_opaque_up != nullptr);
+}
+
+void SBValueList::Clear() {
+ LLDB_RECORD_METHOD_NO_ARGS(void, SBValueList, Clear);
+
+ m_opaque_up.reset();
+}
+
+const SBValueList &SBValueList::operator=(const SBValueList &rhs) {
+ LLDB_RECORD_METHOD(const lldb::SBValueList &,
+ SBValueList, operator=,(const lldb::SBValueList &), rhs);
+
+ if (this != &rhs) {
+ if (rhs.IsValid())
+ m_opaque_up.reset(new ValueListImpl(*rhs));
+ else
+ m_opaque_up.reset();
+ }
+ return LLDB_RECORD_RESULT(*this);
+}
+
+ValueListImpl *SBValueList::operator->() { return m_opaque_up.get(); }
+
+ValueListImpl &SBValueList::operator*() { return *m_opaque_up; }
+
+const ValueListImpl *SBValueList::operator->() const {
+ return m_opaque_up.get();
+}
+
+const ValueListImpl &SBValueList::operator*() const { return *m_opaque_up; }
+
+void SBValueList::Append(const SBValue &val_obj) {
+ LLDB_RECORD_METHOD(void, SBValueList, Append, (const lldb::SBValue &),
+ val_obj);
+
+ CreateIfNeeded();
+ m_opaque_up->Append(val_obj);
+}
+
+void SBValueList::Append(lldb::ValueObjectSP &val_obj_sp) {
+ if (val_obj_sp) {
+ CreateIfNeeded();
+ m_opaque_up->Append(SBValue(val_obj_sp));
+ }
+}
+
+void SBValueList::Append(const lldb::SBValueList &value_list) {
+ LLDB_RECORD_METHOD(void, SBValueList, Append, (const lldb::SBValueList &),
+ value_list);
+
+ if (value_list.IsValid()) {
+ CreateIfNeeded();
+ m_opaque_up->Append(*value_list);
+ }
+}
+
+SBValue SBValueList::GetValueAtIndex(uint32_t idx) const {
+ LLDB_RECORD_METHOD_CONST(lldb::SBValue, SBValueList, GetValueAtIndex,
+ (uint32_t), idx);
+
+
+ SBValue sb_value;
+ if (m_opaque_up)
+ sb_value = m_opaque_up->GetValueAtIndex(idx);
+
+ return LLDB_RECORD_RESULT(sb_value);
+}
+
+uint32_t SBValueList::GetSize() const {
+ LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBValueList, GetSize);
+
+ uint32_t size = 0;
+ if (m_opaque_up)
+ size = m_opaque_up->GetSize();
+
+ return size;
+}
+
+void SBValueList::CreateIfNeeded() {
+ if (m_opaque_up == nullptr)
+ m_opaque_up.reset(new ValueListImpl());
+}
+
+SBValue SBValueList::FindValueObjectByUID(lldb::user_id_t uid) {
+ LLDB_RECORD_METHOD(lldb::SBValue, SBValueList, FindValueObjectByUID,
+ (lldb::user_id_t), uid);
+
+ SBValue sb_value;
+ if (m_opaque_up)
+ sb_value = m_opaque_up->FindValueByUID(uid);
+ return LLDB_RECORD_RESULT(sb_value);
+}
+
+SBValue SBValueList::GetFirstValueByName(const char *name) const {
+ LLDB_RECORD_METHOD_CONST(lldb::SBValue, SBValueList, GetFirstValueByName,
+ (const char *), name);
+
+ SBValue sb_value;
+ if (m_opaque_up)
+ sb_value = m_opaque_up->GetFirstValueByName(name);
+ return LLDB_RECORD_RESULT(sb_value);
+}
+
+void *SBValueList::opaque_ptr() { return m_opaque_up.get(); }
+
+ValueListImpl &SBValueList::ref() {
+ CreateIfNeeded();
+ return *m_opaque_up;
+}
+
+namespace lldb_private {
+namespace repro {
+
+template <>
+void RegisterMethods<SBValueList>(Registry &R) {
+ LLDB_REGISTER_CONSTRUCTOR(SBValueList, ());
+ LLDB_REGISTER_CONSTRUCTOR(SBValueList, (const lldb::SBValueList &));
+ LLDB_REGISTER_METHOD_CONST(bool, SBValueList, IsValid, ());
+ LLDB_REGISTER_METHOD_CONST(bool, SBValueList, operator bool, ());
+ LLDB_REGISTER_METHOD(void, SBValueList, Clear, ());
+ LLDB_REGISTER_METHOD(const lldb::SBValueList &,
+ SBValueList, operator=,(const lldb::SBValueList &));
+ LLDB_REGISTER_METHOD(void, SBValueList, Append, (const lldb::SBValue &));
+ LLDB_REGISTER_METHOD(void, SBValueList, Append,
+ (const lldb::SBValueList &));
+ LLDB_REGISTER_METHOD_CONST(lldb::SBValue, SBValueList, GetValueAtIndex,
+ (uint32_t));
+ LLDB_REGISTER_METHOD_CONST(uint32_t, SBValueList, GetSize, ());
+ LLDB_REGISTER_METHOD(lldb::SBValue, SBValueList, FindValueObjectByUID,
+ (lldb::user_id_t));
+ LLDB_REGISTER_METHOD_CONST(lldb::SBValue, SBValueList, GetFirstValueByName,
+ (const char *));
+}
+
+}
+}