175930019STodd Fiala //===-- SBStructuredData.cpp ------------------------------------*- C++ -*-===// 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" 10*baf5664fSJonas Devlieghere #include "SBReproducerPrivate.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 27*baf5664fSJonas Devlieghere SBStructuredData::SBStructuredData() : m_impl_up(new StructuredDataImpl()) { 28*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBStructuredData); 29*baf5664fSJonas Devlieghere } 3075930019STodd Fiala 31b9c1b51eSKate Stone SBStructuredData::SBStructuredData(const lldb::SBStructuredData &rhs) 32*baf5664fSJonas Devlieghere : m_impl_up(new StructuredDataImpl(*rhs.m_impl_up.get())) { 33*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBStructuredData, (const lldb::SBStructuredData &), 34*baf5664fSJonas Devlieghere rhs); 35*baf5664fSJonas Devlieghere } 3675930019STodd Fiala 37b9c1b51eSKate Stone SBStructuredData::SBStructuredData(const lldb::EventSP &event_sp) 38*baf5664fSJonas Devlieghere : m_impl_up(new StructuredDataImpl(event_sp)) { 39*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBStructuredData, (const lldb::EventSP &), event_sp); 40*baf5664fSJonas Devlieghere } 4175930019STodd Fiala 423815e702SJim Ingham SBStructuredData::SBStructuredData(lldb_private::StructuredDataImpl *impl) 43*baf5664fSJonas Devlieghere : m_impl_up(impl) { 44*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBStructuredData, 45*baf5664fSJonas Devlieghere (lldb_private::StructuredDataImpl *), impl); 46*baf5664fSJonas Devlieghere } 473815e702SJim Ingham 48b9c1b51eSKate Stone SBStructuredData::~SBStructuredData() {} 4975930019STodd Fiala 50b9c1b51eSKate Stone SBStructuredData &SBStructuredData:: 51b9c1b51eSKate Stone operator=(const lldb::SBStructuredData &rhs) { 52*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD( 53*baf5664fSJonas Devlieghere lldb::SBStructuredData &, 54*baf5664fSJonas Devlieghere SBStructuredData, operator=,(const lldb::SBStructuredData &), rhs); 55*baf5664fSJonas Devlieghere 5675930019STodd Fiala *m_impl_up = *rhs.m_impl_up; 5775930019STodd Fiala return *this; 5875930019STodd Fiala } 5975930019STodd Fiala 60d5d8d91cSRavitheja Addepally lldb::SBError SBStructuredData::SetFromJSON(lldb::SBStream &stream) { 61*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBStructuredData, SetFromJSON, 62*baf5664fSJonas Devlieghere (lldb::SBStream &), stream); 63*baf5664fSJonas 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*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 73d5d8d91cSRavitheja Addepally } 74d5d8d91cSRavitheja Addepally 75*baf5664fSJonas Devlieghere bool SBStructuredData::IsValid() const { 76*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBStructuredData, IsValid); 7775930019STodd Fiala 78*baf5664fSJonas Devlieghere return m_impl_up->IsValid(); 79*baf5664fSJonas Devlieghere } 80*baf5664fSJonas Devlieghere 81*baf5664fSJonas Devlieghere void SBStructuredData::Clear() { 82*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBStructuredData, Clear); 83*baf5664fSJonas Devlieghere 84*baf5664fSJonas Devlieghere m_impl_up->Clear(); 85*baf5664fSJonas Devlieghere } 8675930019STodd Fiala 87b9c1b51eSKate Stone SBError SBStructuredData::GetAsJSON(lldb::SBStream &stream) const { 88*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBError, SBStructuredData, GetAsJSON, 89*baf5664fSJonas Devlieghere (lldb::SBStream &), stream); 90*baf5664fSJonas Devlieghere 91d5d8d91cSRavitheja Addepally SBError error; 92d5d8d91cSRavitheja Addepally error.SetError(m_impl_up->GetAsJSON(stream.ref())); 93*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 9475930019STodd Fiala } 9575930019STodd Fiala 96b9c1b51eSKate Stone lldb::SBError SBStructuredData::GetDescription(lldb::SBStream &stream) const { 97*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBError, SBStructuredData, GetDescription, 98*baf5664fSJonas Devlieghere (lldb::SBStream &), stream); 99*baf5664fSJonas Devlieghere 10097206d57SZachary Turner Status error = m_impl_up->GetDescription(stream.ref()); 1012ef442c6STodd Fiala SBError sb_error; 1022ef442c6STodd Fiala sb_error.SetError(error); 103*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 10475930019STodd Fiala } 1055bfee5f1SAbhishek Aggarwal 1065bfee5f1SAbhishek Aggarwal StructuredDataType SBStructuredData::GetType() const { 107*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::StructuredDataType, SBStructuredData, 108*baf5664fSJonas Devlieghere GetType); 109*baf5664fSJonas Devlieghere 1105bfee5f1SAbhishek Aggarwal return (m_impl_up ? m_impl_up->GetType() : eStructuredDataTypeInvalid); 1115bfee5f1SAbhishek Aggarwal } 1125bfee5f1SAbhishek Aggarwal 1135bfee5f1SAbhishek Aggarwal size_t SBStructuredData::GetSize() const { 114*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(size_t, SBStructuredData, GetSize); 115*baf5664fSJonas Devlieghere 1165bfee5f1SAbhishek Aggarwal return (m_impl_up ? m_impl_up->GetSize() : 0); 1175bfee5f1SAbhishek Aggarwal } 1185bfee5f1SAbhishek Aggarwal 1193815e702SJim Ingham bool SBStructuredData::GetKeys(lldb::SBStringList &keys) const { 120*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBStructuredData, GetKeys, 121*baf5664fSJonas Devlieghere (lldb::SBStringList &), keys); 122*baf5664fSJonas Devlieghere 1233815e702SJim Ingham if (!m_impl_up) 1243815e702SJim Ingham return false; 1253815e702SJim Ingham 1263815e702SJim Ingham if (GetType() != eStructuredDataTypeDictionary) 1273815e702SJim Ingham return false; 1283815e702SJim Ingham 1293815e702SJim Ingham StructuredData::ObjectSP obj_sp = m_impl_up->GetObjectSP(); 1303815e702SJim Ingham if (!obj_sp) 1313815e702SJim Ingham return false; 1323815e702SJim Ingham 1333815e702SJim Ingham StructuredData::Dictionary *dict = obj_sp->GetAsDictionary(); 1343815e702SJim Ingham // We claimed we were a dictionary, so this can't be null. 1353815e702SJim Ingham assert(dict); 1363815e702SJim Ingham // The return kind of GetKeys is an Array: 1373815e702SJim Ingham StructuredData::ObjectSP array_sp = dict->GetKeys(); 1383815e702SJim Ingham StructuredData::Array *key_arr = array_sp->GetAsArray(); 1393815e702SJim Ingham assert(key_arr); 1403815e702SJim Ingham 1413815e702SJim Ingham key_arr->ForEach([&keys] (StructuredData::Object *object) -> bool { 1423815e702SJim Ingham llvm::StringRef key = object->GetStringValue(""); 1433815e702SJim Ingham keys.AppendString(key.str().c_str()); 1443815e702SJim Ingham return true; 1453815e702SJim Ingham }); 1463815e702SJim Ingham return true; 1473815e702SJim Ingham } 1483815e702SJim Ingham 1495bfee5f1SAbhishek Aggarwal lldb::SBStructuredData SBStructuredData::GetValueForKey(const char *key) const { 150*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBStructuredData, SBStructuredData, 151*baf5664fSJonas Devlieghere GetValueForKey, (const char *), key); 152*baf5664fSJonas Devlieghere 1535bfee5f1SAbhishek Aggarwal if (!m_impl_up) 154*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBStructuredData()); 1555bfee5f1SAbhishek Aggarwal 1565bfee5f1SAbhishek Aggarwal SBStructuredData result; 1575bfee5f1SAbhishek Aggarwal result.m_impl_up->SetObjectSP(m_impl_up->GetValueForKey(key)); 158*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 1595bfee5f1SAbhishek Aggarwal } 1605bfee5f1SAbhishek Aggarwal 1615bfee5f1SAbhishek Aggarwal lldb::SBStructuredData SBStructuredData::GetItemAtIndex(size_t idx) const { 162*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBStructuredData, SBStructuredData, 163*baf5664fSJonas Devlieghere GetItemAtIndex, (size_t), idx); 164*baf5664fSJonas Devlieghere 1655bfee5f1SAbhishek Aggarwal if (!m_impl_up) 166*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBStructuredData()); 1675bfee5f1SAbhishek Aggarwal 1685bfee5f1SAbhishek Aggarwal SBStructuredData result; 1695bfee5f1SAbhishek Aggarwal result.m_impl_up->SetObjectSP(m_impl_up->GetItemAtIndex(idx)); 170*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 1715bfee5f1SAbhishek Aggarwal } 1725bfee5f1SAbhishek Aggarwal 1735bfee5f1SAbhishek Aggarwal uint64_t SBStructuredData::GetIntegerValue(uint64_t fail_value) const { 174*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(uint64_t, SBStructuredData, GetIntegerValue, 175*baf5664fSJonas Devlieghere (uint64_t), fail_value); 176*baf5664fSJonas Devlieghere 1775bfee5f1SAbhishek Aggarwal return (m_impl_up ? m_impl_up->GetIntegerValue(fail_value) : fail_value); 1785bfee5f1SAbhishek Aggarwal } 1795bfee5f1SAbhishek Aggarwal 1805bfee5f1SAbhishek Aggarwal double SBStructuredData::GetFloatValue(double fail_value) const { 181*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(double, SBStructuredData, GetFloatValue, (double), 182*baf5664fSJonas Devlieghere fail_value); 183*baf5664fSJonas Devlieghere 1845bfee5f1SAbhishek Aggarwal return (m_impl_up ? m_impl_up->GetFloatValue(fail_value) : fail_value); 1855bfee5f1SAbhishek Aggarwal } 1865bfee5f1SAbhishek Aggarwal 1875bfee5f1SAbhishek Aggarwal bool SBStructuredData::GetBooleanValue(bool fail_value) const { 188*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBStructuredData, GetBooleanValue, (bool), 189*baf5664fSJonas Devlieghere fail_value); 190*baf5664fSJonas Devlieghere 1915bfee5f1SAbhishek Aggarwal return (m_impl_up ? m_impl_up->GetBooleanValue(fail_value) : fail_value); 1925bfee5f1SAbhishek Aggarwal } 1935bfee5f1SAbhishek Aggarwal 1945bfee5f1SAbhishek Aggarwal size_t SBStructuredData::GetStringValue(char *dst, size_t dst_len) const { 195*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(size_t, SBStructuredData, GetStringValue, 196*baf5664fSJonas Devlieghere (char *, size_t), dst, dst_len); 197*baf5664fSJonas Devlieghere 1985bfee5f1SAbhishek Aggarwal return (m_impl_up ? m_impl_up->GetStringValue(dst, dst_len) : 0); 1995bfee5f1SAbhishek Aggarwal } 200