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" 10baf5664fSJonas 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 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) 32baf5664fSJonas Devlieghere : m_impl_up(new StructuredDataImpl(*rhs.m_impl_up.get())) { 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 423815e702SJim Ingham SBStructuredData::SBStructuredData(lldb_private::StructuredDataImpl *impl) 43baf5664fSJonas Devlieghere : m_impl_up(impl) { 44baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBStructuredData, 45baf5664fSJonas Devlieghere (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; 57306809f2SJonas Devlieghere return LLDB_RECORD_RESULT(*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"); 72baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 73d5d8d91cSRavitheja Addepally } 74d5d8d91cSRavitheja Addepally 75baf5664fSJonas Devlieghere bool SBStructuredData::IsValid() const { 76baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBStructuredData, IsValid); 777f5237bcSPavel Labath return this->operator bool(); 787f5237bcSPavel Labath } 797f5237bcSPavel Labath SBStructuredData::operator bool() const { 807f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBStructuredData, operator bool); 8175930019STodd Fiala 82baf5664fSJonas Devlieghere return m_impl_up->IsValid(); 83baf5664fSJonas Devlieghere } 84baf5664fSJonas Devlieghere 85baf5664fSJonas Devlieghere void SBStructuredData::Clear() { 86baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBStructuredData, Clear); 87baf5664fSJonas Devlieghere 88baf5664fSJonas Devlieghere m_impl_up->Clear(); 89baf5664fSJonas Devlieghere } 9075930019STodd Fiala 91b9c1b51eSKate Stone SBError SBStructuredData::GetAsJSON(lldb::SBStream &stream) const { 92baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBError, SBStructuredData, GetAsJSON, 93baf5664fSJonas Devlieghere (lldb::SBStream &), stream); 94baf5664fSJonas Devlieghere 95d5d8d91cSRavitheja Addepally SBError error; 96d5d8d91cSRavitheja Addepally error.SetError(m_impl_up->GetAsJSON(stream.ref())); 97baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 9875930019STodd Fiala } 9975930019STodd Fiala 100b9c1b51eSKate Stone lldb::SBError SBStructuredData::GetDescription(lldb::SBStream &stream) const { 101baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBError, SBStructuredData, GetDescription, 102baf5664fSJonas Devlieghere (lldb::SBStream &), stream); 103baf5664fSJonas Devlieghere 10497206d57SZachary Turner Status error = m_impl_up->GetDescription(stream.ref()); 1052ef442c6STodd Fiala SBError sb_error; 1062ef442c6STodd Fiala sb_error.SetError(error); 107baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 10875930019STodd Fiala } 1095bfee5f1SAbhishek Aggarwal 1105bfee5f1SAbhishek Aggarwal StructuredDataType SBStructuredData::GetType() const { 111baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::StructuredDataType, SBStructuredData, 112baf5664fSJonas Devlieghere GetType); 113baf5664fSJonas Devlieghere 1145bfee5f1SAbhishek Aggarwal return (m_impl_up ? m_impl_up->GetType() : eStructuredDataTypeInvalid); 1155bfee5f1SAbhishek Aggarwal } 1165bfee5f1SAbhishek Aggarwal 1175bfee5f1SAbhishek Aggarwal size_t SBStructuredData::GetSize() const { 118baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(size_t, SBStructuredData, GetSize); 119baf5664fSJonas Devlieghere 1205bfee5f1SAbhishek Aggarwal return (m_impl_up ? m_impl_up->GetSize() : 0); 1215bfee5f1SAbhishek Aggarwal } 1225bfee5f1SAbhishek Aggarwal 1233815e702SJim Ingham bool SBStructuredData::GetKeys(lldb::SBStringList &keys) const { 124baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBStructuredData, GetKeys, 125baf5664fSJonas Devlieghere (lldb::SBStringList &), keys); 126baf5664fSJonas Devlieghere 1273815e702SJim Ingham if (!m_impl_up) 1283815e702SJim Ingham return false; 1293815e702SJim Ingham 1303815e702SJim Ingham if (GetType() != eStructuredDataTypeDictionary) 1313815e702SJim Ingham return false; 1323815e702SJim Ingham 1333815e702SJim Ingham StructuredData::ObjectSP obj_sp = m_impl_up->GetObjectSP(); 1343815e702SJim Ingham if (!obj_sp) 1353815e702SJim Ingham return false; 1363815e702SJim Ingham 1373815e702SJim Ingham StructuredData::Dictionary *dict = obj_sp->GetAsDictionary(); 1383815e702SJim Ingham // We claimed we were a dictionary, so this can't be null. 1393815e702SJim Ingham assert(dict); 1403815e702SJim Ingham // The return kind of GetKeys is an Array: 1413815e702SJim Ingham StructuredData::ObjectSP array_sp = dict->GetKeys(); 1423815e702SJim Ingham StructuredData::Array *key_arr = array_sp->GetAsArray(); 1433815e702SJim Ingham assert(key_arr); 1443815e702SJim Ingham 1453815e702SJim Ingham key_arr->ForEach([&keys] (StructuredData::Object *object) -> bool { 1463815e702SJim Ingham llvm::StringRef key = object->GetStringValue(""); 1473815e702SJim Ingham keys.AppendString(key.str().c_str()); 1483815e702SJim Ingham return true; 1493815e702SJim Ingham }); 1503815e702SJim Ingham return true; 1513815e702SJim Ingham } 1523815e702SJim Ingham 1535bfee5f1SAbhishek Aggarwal lldb::SBStructuredData SBStructuredData::GetValueForKey(const char *key) const { 154baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBStructuredData, SBStructuredData, 155baf5664fSJonas Devlieghere GetValueForKey, (const char *), key); 156baf5664fSJonas Devlieghere 1575bfee5f1SAbhishek Aggarwal if (!m_impl_up) 158baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBStructuredData()); 1595bfee5f1SAbhishek Aggarwal 1605bfee5f1SAbhishek Aggarwal SBStructuredData result; 1615bfee5f1SAbhishek Aggarwal result.m_impl_up->SetObjectSP(m_impl_up->GetValueForKey(key)); 162baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 1635bfee5f1SAbhishek Aggarwal } 1645bfee5f1SAbhishek Aggarwal 1655bfee5f1SAbhishek Aggarwal lldb::SBStructuredData SBStructuredData::GetItemAtIndex(size_t idx) const { 166baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBStructuredData, SBStructuredData, 167baf5664fSJonas Devlieghere GetItemAtIndex, (size_t), idx); 168baf5664fSJonas Devlieghere 1695bfee5f1SAbhishek Aggarwal if (!m_impl_up) 170baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBStructuredData()); 1715bfee5f1SAbhishek Aggarwal 1725bfee5f1SAbhishek Aggarwal SBStructuredData result; 1735bfee5f1SAbhishek Aggarwal result.m_impl_up->SetObjectSP(m_impl_up->GetItemAtIndex(idx)); 174baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(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 1815bfee5f1SAbhishek Aggarwal return (m_impl_up ? m_impl_up->GetIntegerValue(fail_value) : 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 1885bfee5f1SAbhishek Aggarwal return (m_impl_up ? m_impl_up->GetFloatValue(fail_value) : 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 1955bfee5f1SAbhishek Aggarwal return (m_impl_up ? m_impl_up->GetBooleanValue(fail_value) : fail_value); 1965bfee5f1SAbhishek Aggarwal } 1975bfee5f1SAbhishek Aggarwal 1985bfee5f1SAbhishek Aggarwal size_t SBStructuredData::GetStringValue(char *dst, size_t dst_len) const { 199*e687aa82SJonas Devlieghere LLDB_RECORD_CHAR_PTR_METHOD_CONST(size_t, SBStructuredData, GetStringValue, 200*e687aa82SJonas Devlieghere (char *, size_t), dst, "", dst_len); 201baf5664fSJonas Devlieghere 2025bfee5f1SAbhishek Aggarwal return (m_impl_up ? m_impl_up->GetStringValue(dst, dst_len) : 0); 2035bfee5f1SAbhishek Aggarwal } 204ae211eceSMichal Gorny 205ae211eceSMichal Gorny namespace lldb_private { 206ae211eceSMichal Gorny namespace repro { 207ae211eceSMichal Gorny 2082f025bb8SJonas Devlieghere template <> void RegisterMethods<SBStructuredData>(Registry &R) { 209ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBStructuredData, ()); 2102f025bb8SJonas Devlieghere LLDB_REGISTER_CONSTRUCTOR(SBStructuredData, (const lldb::SBStructuredData &)); 211ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBStructuredData, (const lldb::EventSP &)); 212ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBStructuredData, 213ae211eceSMichal Gorny (lldb_private::StructuredDataImpl *)); 214ae211eceSMichal Gorny LLDB_REGISTER_METHOD( 215ae211eceSMichal Gorny lldb::SBStructuredData &, 216ae211eceSMichal Gorny SBStructuredData, operator=,(const lldb::SBStructuredData &)); 217ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBError, SBStructuredData, SetFromJSON, 218ae211eceSMichal Gorny (lldb::SBStream &)); 219ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBStructuredData, IsValid, ()); 220ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBStructuredData, operator bool, ()); 221ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBStructuredData, Clear, ()); 222ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBError, SBStructuredData, GetAsJSON, 223ae211eceSMichal Gorny (lldb::SBStream &)); 224ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBError, SBStructuredData, GetDescription, 225ae211eceSMichal Gorny (lldb::SBStream &)); 226ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::StructuredDataType, SBStructuredData, 227ae211eceSMichal Gorny GetType, ()); 228ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(size_t, SBStructuredData, GetSize, ()); 229ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBStructuredData, GetKeys, 230ae211eceSMichal Gorny (lldb::SBStringList &)); 231ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBStructuredData, SBStructuredData, 232ae211eceSMichal Gorny GetValueForKey, (const char *)); 233ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBStructuredData, SBStructuredData, 234ae211eceSMichal Gorny GetItemAtIndex, (size_t)); 235ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(uint64_t, SBStructuredData, GetIntegerValue, 236ae211eceSMichal Gorny (uint64_t)); 2372f025bb8SJonas Devlieghere LLDB_REGISTER_METHOD_CONST(double, SBStructuredData, GetFloatValue, (double)); 238ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBStructuredData, GetBooleanValue, (bool)); 239*e687aa82SJonas Devlieghere LLDB_REGISTER_CHAR_PTR_METHOD_CONST(size_t, SBStructuredData, GetStringValue); 240ae211eceSMichal Gorny } 241ae211eceSMichal Gorny 2422f025bb8SJonas Devlieghere } // namespace repro 2432f025bb8SJonas Devlieghere } // namespace lldb_private 244