Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 1 | //===-- SBStructuredData.cpp ------------------------------------*- C++ -*-===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
| 10 | #include "lldb/API/SBStructuredData.h" |
| 11 | |
| 12 | #include "lldb/API/SBStream.h" |
| 13 | #include "lldb/Core/Error.h" |
| 14 | #include "lldb/Core/Event.h" |
| 15 | #include "lldb/Core/Stream.h" |
| 16 | #include "lldb/Core/StructuredData.h" |
| 17 | #include "lldb/Target/StructuredDataPlugin.h" |
| 18 | |
| 19 | using namespace lldb; |
| 20 | using namespace lldb_private; |
| 21 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 22 | #pragma mark-- |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 23 | #pragma mark StructuredDataImpl |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 24 | |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 25 | class StructuredDataImpl { |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 26 | public: |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 27 | StructuredDataImpl() : m_plugin_wp(), m_data_sp() {} |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 28 | |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 29 | StructuredDataImpl(const StructuredDataImpl &rhs) = default; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 30 | |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 31 | StructuredDataImpl(const EventSP &event_sp) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 32 | : m_plugin_wp( |
| 33 | EventDataStructuredData::GetPluginFromEvent(event_sp.get())), |
| 34 | m_data_sp(EventDataStructuredData::GetObjectFromEvent(event_sp.get())) { |
| 35 | } |
| 36 | |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 37 | ~StructuredDataImpl() = default; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 38 | |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 39 | StructuredDataImpl &operator=(const StructuredDataImpl &rhs) = default; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 40 | |
| 41 | bool IsValid() const { return m_data_sp.get() != nullptr; } |
| 42 | |
| 43 | void Clear() { |
| 44 | m_plugin_wp.reset(); |
| 45 | m_data_sp.reset(); |
| 46 | } |
| 47 | |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 48 | SBError GetAsJSON(lldb_private::Stream &stream) const { |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 49 | SBError sb_error; |
| 50 | |
| 51 | if (!m_data_sp) { |
| 52 | sb_error.SetErrorString("No structured data."); |
| 53 | return sb_error; |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 54 | } |
| 55 | |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 56 | m_data_sp->Dump(stream); |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 57 | return sb_error; |
| 58 | } |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 59 | |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 60 | Error GetDescription(lldb_private::Stream &stream) const { |
| 61 | Error error; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 62 | |
| 63 | if (!m_data_sp) { |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 64 | error.SetErrorString("Cannot pretty print structured data: " |
| 65 | "no data to print."); |
| 66 | return error; |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 67 | } |
| 68 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 69 | // Grab the plugin. |
| 70 | auto plugin_sp = StructuredDataPluginSP(m_plugin_wp); |
| 71 | if (!plugin_sp) { |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 72 | error.SetErrorString("Cannot pretty print structured data: " |
| 73 | "plugin doesn't exist."); |
| 74 | return error; |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 75 | } |
| 76 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 77 | // Get the data's description. |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 78 | return plugin_sp->GetDescription(m_data_sp, stream); |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 79 | } |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 80 | |
| 81 | private: |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 82 | StructuredDataPluginWP m_plugin_wp; |
| 83 | StructuredData::ObjectSP m_data_sp; |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 84 | }; |
| 85 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 86 | #pragma mark-- |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 87 | #pragma mark SBStructuredData |
| 88 | |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 89 | SBStructuredData::SBStructuredData() : m_impl_up(new StructuredDataImpl()) {} |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 90 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 91 | SBStructuredData::SBStructuredData(const lldb::SBStructuredData &rhs) |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 92 | : m_impl_up(new StructuredDataImpl(*rhs.m_impl_up.get())) {} |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 93 | |
| 94 | SBStructuredData::SBStructuredData(const lldb::EventSP &event_sp) |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 95 | : m_impl_up(new StructuredDataImpl(event_sp)) {} |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 96 | |
| 97 | SBStructuredData::~SBStructuredData() {} |
| 98 | |
| 99 | SBStructuredData &SBStructuredData:: |
| 100 | operator=(const lldb::SBStructuredData &rhs) { |
| 101 | *m_impl_up = *rhs.m_impl_up; |
| 102 | return *this; |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 103 | } |
| 104 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 105 | bool SBStructuredData::IsValid() const { return m_impl_up->IsValid(); } |
| 106 | |
| 107 | void SBStructuredData::Clear() { m_impl_up->Clear(); } |
| 108 | |
| 109 | SBError SBStructuredData::GetAsJSON(lldb::SBStream &stream) const { |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 110 | return m_impl_up->GetAsJSON(stream.ref()); |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 111 | } |
| 112 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 113 | lldb::SBError SBStructuredData::GetDescription(lldb::SBStream &stream) const { |
Todd Fiala | 2ef442c | 2016-11-09 23:21:04 +0000 | [diff] [blame^] | 114 | Error error = m_impl_up->GetDescription(stream.ref()); |
| 115 | SBError sb_error; |
| 116 | sb_error.SetError(error); |
| 117 | return sb_error; |
Todd Fiala | 7593001 | 2016-08-19 04:21:48 +0000 | [diff] [blame] | 118 | } |