180814287SRaphael Isemann //===-- SBStructuredData.cpp ----------------------------------------------===// 275930019STodd Fiala // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 675930019STodd Fiala // 775930019STodd Fiala //===----------------------------------------------------------------------===// 875930019STodd Fiala 975930019STodd Fiala #include "lldb/API/SBStructuredData.h" 10d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.h" 1175930019STodd Fiala 1275930019STodd Fiala #include "lldb/API/SBStream.h" 133815e702SJim Ingham #include "lldb/API/SBStringList.h" 14d5d8d91cSRavitheja Addepally #include "lldb/Core/StructuredDataImpl.h" 1575930019STodd Fiala #include "lldb/Target/StructuredDataPlugin.h" 16181b823bSPavel Labath #include "lldb/Utility/Event.h" 1797206d57SZachary Turner #include "lldb/Utility/Status.h" 18bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 19f2a8bccfSPavel Labath #include "lldb/Utility/StructuredData.h" 2075930019STodd Fiala 2175930019STodd Fiala using namespace lldb; 2275930019STodd Fiala using namespace lldb_private; 2375930019STodd Fiala 2475930019STodd Fiala #pragma mark-- 2575930019STodd Fiala #pragma mark SBStructuredData 2675930019STodd Fiala 27baf5664fSJonas Devlieghere SBStructuredData::SBStructuredData() : m_impl_up(new StructuredDataImpl()) { 28baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBStructuredData); 29baf5664fSJonas Devlieghere } 3075930019STodd Fiala 31b9c1b51eSKate Stone SBStructuredData::SBStructuredData(const lldb::SBStructuredData &rhs) 32c5cf4b8fSDave Lee : m_impl_up(new StructuredDataImpl(*rhs.m_impl_up)) { 33baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBStructuredData, (const lldb::SBStructuredData &), 34baf5664fSJonas Devlieghere rhs); 35baf5664fSJonas Devlieghere } 3675930019STodd Fiala 37b9c1b51eSKate Stone SBStructuredData::SBStructuredData(const lldb::EventSP &event_sp) 38baf5664fSJonas Devlieghere : m_impl_up(new StructuredDataImpl(event_sp)) { 39baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBStructuredData, (const lldb::EventSP &), event_sp); 40baf5664fSJonas Devlieghere } 4175930019STodd Fiala 4282de8df2SPavel Labath SBStructuredData::SBStructuredData(const lldb_private::StructuredDataImpl &impl) 4382de8df2SPavel Labath : m_impl_up(new StructuredDataImpl(impl)) { 44baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBStructuredData, 4582de8df2SPavel Labath (const lldb_private::StructuredDataImpl &), impl); 46baf5664fSJonas Devlieghere } 473815e702SJim Ingham 48866b7a65SJonas Devlieghere SBStructuredData::~SBStructuredData() = default; 4975930019STodd Fiala 50b9c1b51eSKate Stone SBStructuredData &SBStructuredData:: 51b9c1b51eSKate Stone operator=(const lldb::SBStructuredData &rhs) { 52baf5664fSJonas Devlieghere LLDB_RECORD_METHOD( 53baf5664fSJonas Devlieghere lldb::SBStructuredData &, 54baf5664fSJonas Devlieghere SBStructuredData, operator=,(const lldb::SBStructuredData &), rhs); 55baf5664fSJonas Devlieghere 5675930019STodd Fiala *m_impl_up = *rhs.m_impl_up; 57*d232abc3SJonas Devlieghere return *this; 5875930019STodd Fiala } 5975930019STodd Fiala 60d5d8d91cSRavitheja Addepally lldb::SBError SBStructuredData::SetFromJSON(lldb::SBStream &stream) { 61baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBStructuredData, SetFromJSON, 62baf5664fSJonas Devlieghere (lldb::SBStream &), stream); 63baf5664fSJonas Devlieghere 64d5d8d91cSRavitheja Addepally lldb::SBError error; 65d5d8d91cSRavitheja Addepally std::string json_str(stream.GetData()); 66d5d8d91cSRavitheja Addepally 67d5d8d91cSRavitheja Addepally StructuredData::ObjectSP json_obj = StructuredData::ParseJSON(json_str); 68d5d8d91cSRavitheja Addepally m_impl_up->SetObjectSP(json_obj); 69d5d8d91cSRavitheja Addepally 705bfee5f1SAbhishek Aggarwal if (!json_obj || json_obj->GetType() != eStructuredDataTypeDictionary) 71d5d8d91cSRavitheja Addepally error.SetErrorString("Invalid Syntax"); 72*d232abc3SJonas Devlieghere return error; 73d5d8d91cSRavitheja Addepally } 74d5d8d91cSRavitheja Addepally 75bf9f21a2SWalter Erquinigo lldb::SBError SBStructuredData::SetFromJSON(const char *json) { 76bf9f21a2SWalter Erquinigo LLDB_RECORD_METHOD(lldb::SBError, SBStructuredData, SetFromJSON, 77bf9f21a2SWalter Erquinigo (const char *), json); 78bf9f21a2SWalter Erquinigo lldb::SBStream s; 79bf9f21a2SWalter Erquinigo s.Print(json); 80*d232abc3SJonas Devlieghere return SetFromJSON(s); 81bf9f21a2SWalter Erquinigo } 82bf9f21a2SWalter Erquinigo 83baf5664fSJonas Devlieghere bool SBStructuredData::IsValid() const { 84baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBStructuredData, IsValid); 857f5237bcSPavel Labath return this->operator bool(); 867f5237bcSPavel Labath } 87bf9f21a2SWalter Erquinigo 887f5237bcSPavel Labath SBStructuredData::operator bool() const { 897f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBStructuredData, operator bool); 9075930019STodd Fiala 91baf5664fSJonas Devlieghere return m_impl_up->IsValid(); 92baf5664fSJonas Devlieghere } 93baf5664fSJonas Devlieghere 94baf5664fSJonas Devlieghere void SBStructuredData::Clear() { 95baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBStructuredData, Clear); 96baf5664fSJonas Devlieghere 97baf5664fSJonas Devlieghere m_impl_up->Clear(); 98baf5664fSJonas Devlieghere } 9975930019STodd Fiala 100b9c1b51eSKate Stone SBError SBStructuredData::GetAsJSON(lldb::SBStream &stream) const { 101baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBError, SBStructuredData, GetAsJSON, 102baf5664fSJonas Devlieghere (lldb::SBStream &), stream); 103baf5664fSJonas Devlieghere 104d5d8d91cSRavitheja Addepally SBError error; 105d5d8d91cSRavitheja Addepally error.SetError(m_impl_up->GetAsJSON(stream.ref())); 106*d232abc3SJonas Devlieghere return error; 10775930019STodd Fiala } 10875930019STodd Fiala 109b9c1b51eSKate Stone lldb::SBError SBStructuredData::GetDescription(lldb::SBStream &stream) const { 110baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBError, SBStructuredData, GetDescription, 111baf5664fSJonas Devlieghere (lldb::SBStream &), stream); 112baf5664fSJonas Devlieghere 11397206d57SZachary Turner Status error = m_impl_up->GetDescription(stream.ref()); 1142ef442c6STodd Fiala SBError sb_error; 1152ef442c6STodd Fiala sb_error.SetError(error); 116*d232abc3SJonas Devlieghere return sb_error; 11775930019STodd Fiala } 1185bfee5f1SAbhishek Aggarwal 1195bfee5f1SAbhishek Aggarwal StructuredDataType SBStructuredData::GetType() const { 120baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::StructuredDataType, SBStructuredData, 121baf5664fSJonas Devlieghere GetType); 122baf5664fSJonas Devlieghere 123c5cf4b8fSDave Lee return m_impl_up->GetType(); 1245bfee5f1SAbhishek Aggarwal } 1255bfee5f1SAbhishek Aggarwal 1265bfee5f1SAbhishek Aggarwal size_t SBStructuredData::GetSize() const { 127baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(size_t, SBStructuredData, GetSize); 128baf5664fSJonas Devlieghere 129c5cf4b8fSDave Lee return m_impl_up->GetSize(); 1305bfee5f1SAbhishek Aggarwal } 1315bfee5f1SAbhishek Aggarwal 1323815e702SJim Ingham bool SBStructuredData::GetKeys(lldb::SBStringList &keys) const { 133baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBStructuredData, GetKeys, 134baf5664fSJonas Devlieghere (lldb::SBStringList &), keys); 135baf5664fSJonas Devlieghere 1363815e702SJim Ingham if (GetType() != eStructuredDataTypeDictionary) 1373815e702SJim Ingham return false; 1383815e702SJim Ingham 1393815e702SJim Ingham StructuredData::ObjectSP obj_sp = m_impl_up->GetObjectSP(); 1403815e702SJim Ingham if (!obj_sp) 1413815e702SJim Ingham return false; 1423815e702SJim Ingham 1433815e702SJim Ingham StructuredData::Dictionary *dict = obj_sp->GetAsDictionary(); 1443815e702SJim Ingham // We claimed we were a dictionary, so this can't be null. 1453815e702SJim Ingham assert(dict); 1463815e702SJim Ingham // The return kind of GetKeys is an Array: 1473815e702SJim Ingham StructuredData::ObjectSP array_sp = dict->GetKeys(); 1483815e702SJim Ingham StructuredData::Array *key_arr = array_sp->GetAsArray(); 1493815e702SJim Ingham assert(key_arr); 1503815e702SJim Ingham 1513815e702SJim Ingham key_arr->ForEach([&keys] (StructuredData::Object *object) -> bool { 1523815e702SJim Ingham llvm::StringRef key = object->GetStringValue(""); 1533815e702SJim Ingham keys.AppendString(key.str().c_str()); 1543815e702SJim Ingham return true; 1553815e702SJim Ingham }); 1563815e702SJim Ingham return true; 1573815e702SJim Ingham } 1583815e702SJim Ingham 1595bfee5f1SAbhishek Aggarwal lldb::SBStructuredData SBStructuredData::GetValueForKey(const char *key) const { 160baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBStructuredData, SBStructuredData, 161baf5664fSJonas Devlieghere GetValueForKey, (const char *), key); 162baf5664fSJonas Devlieghere 1635bfee5f1SAbhishek Aggarwal SBStructuredData result; 1645bfee5f1SAbhishek Aggarwal result.m_impl_up->SetObjectSP(m_impl_up->GetValueForKey(key)); 165*d232abc3SJonas Devlieghere return result; 1665bfee5f1SAbhishek Aggarwal } 1675bfee5f1SAbhishek Aggarwal 1685bfee5f1SAbhishek Aggarwal lldb::SBStructuredData SBStructuredData::GetItemAtIndex(size_t idx) const { 169baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBStructuredData, SBStructuredData, 170baf5664fSJonas Devlieghere GetItemAtIndex, (size_t), idx); 171baf5664fSJonas Devlieghere 1725bfee5f1SAbhishek Aggarwal SBStructuredData result; 1735bfee5f1SAbhishek Aggarwal result.m_impl_up->SetObjectSP(m_impl_up->GetItemAtIndex(idx)); 174*d232abc3SJonas Devlieghere return result; 1755bfee5f1SAbhishek Aggarwal } 1765bfee5f1SAbhishek Aggarwal 1775bfee5f1SAbhishek Aggarwal uint64_t SBStructuredData::GetIntegerValue(uint64_t fail_value) const { 178baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(uint64_t, SBStructuredData, GetIntegerValue, 179baf5664fSJonas Devlieghere (uint64_t), fail_value); 180baf5664fSJonas Devlieghere 181c5cf4b8fSDave Lee return m_impl_up->GetIntegerValue(fail_value); 1825bfee5f1SAbhishek Aggarwal } 1835bfee5f1SAbhishek Aggarwal 1845bfee5f1SAbhishek Aggarwal double SBStructuredData::GetFloatValue(double fail_value) const { 185baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(double, SBStructuredData, GetFloatValue, (double), 186baf5664fSJonas Devlieghere fail_value); 187baf5664fSJonas Devlieghere 188c5cf4b8fSDave Lee return m_impl_up->GetFloatValue(fail_value); 1895bfee5f1SAbhishek Aggarwal } 1905bfee5f1SAbhishek Aggarwal 1915bfee5f1SAbhishek Aggarwal bool SBStructuredData::GetBooleanValue(bool fail_value) const { 192baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBStructuredData, GetBooleanValue, (bool), 193baf5664fSJonas Devlieghere fail_value); 194baf5664fSJonas Devlieghere 195c5cf4b8fSDave Lee return m_impl_up->GetBooleanValue(fail_value); 1965bfee5f1SAbhishek Aggarwal } 1975bfee5f1SAbhishek Aggarwal 1985bfee5f1SAbhishek Aggarwal size_t SBStructuredData::GetStringValue(char *dst, size_t dst_len) const { 199e687aa82SJonas Devlieghere LLDB_RECORD_CHAR_PTR_METHOD_CONST(size_t, SBStructuredData, GetStringValue, 200e687aa82SJonas Devlieghere (char *, size_t), dst, "", dst_len); 201baf5664fSJonas Devlieghere 202c5cf4b8fSDave Lee return m_impl_up->GetStringValue(dst, dst_len); 2035bfee5f1SAbhishek Aggarwal } 204