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) 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 42*82de8df2SPavel Labath SBStructuredData::SBStructuredData(const lldb_private::StructuredDataImpl &impl) 43*82de8df2SPavel Labath : m_impl_up(new StructuredDataImpl(impl)) { 44baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBStructuredData, 45*82de8df2SPavel 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; 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 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); 80bf9f21a2SWalter Erquinigo return LLDB_RECORD_RESULT(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())); 106baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(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); 116baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(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)); 165baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(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)); 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 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 } 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, 213*82de8df2SPavel Labath (const 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 &)); 219bf9f21a2SWalter Erquinigo LLDB_REGISTER_METHOD(lldb::SBError, SBStructuredData, SetFromJSON, 220bf9f21a2SWalter Erquinigo (const char *)); 221ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBStructuredData, IsValid, ()); 222ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBStructuredData, operator bool, ()); 223ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBStructuredData, Clear, ()); 224ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBError, SBStructuredData, GetAsJSON, 225ae211eceSMichal Gorny (lldb::SBStream &)); 226ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBError, SBStructuredData, GetDescription, 227ae211eceSMichal Gorny (lldb::SBStream &)); 228ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::StructuredDataType, SBStructuredData, 229ae211eceSMichal Gorny GetType, ()); 230ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(size_t, SBStructuredData, GetSize, ()); 231ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBStructuredData, GetKeys, 232ae211eceSMichal Gorny (lldb::SBStringList &)); 233ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBStructuredData, SBStructuredData, 234ae211eceSMichal Gorny GetValueForKey, (const char *)); 235ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBStructuredData, SBStructuredData, 236ae211eceSMichal Gorny GetItemAtIndex, (size_t)); 237ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(uint64_t, SBStructuredData, GetIntegerValue, 238ae211eceSMichal Gorny (uint64_t)); 2392f025bb8SJonas Devlieghere LLDB_REGISTER_METHOD_CONST(double, SBStructuredData, GetFloatValue, (double)); 240ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBStructuredData, GetBooleanValue, (bool)); 241e687aa82SJonas Devlieghere LLDB_REGISTER_CHAR_PTR_METHOD_CONST(size_t, SBStructuredData, GetStringValue); 242ae211eceSMichal Gorny } 243ae211eceSMichal Gorny 2442f025bb8SJonas Devlieghere } // namespace repro 2452f025bb8SJonas Devlieghere } // namespace lldb_private 246