130fdc8d8SChris Lattner //===-- SBEvent.cpp ---------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
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
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
94c5de699SEli Friedman #include "lldb/API/SBEvent.h"
10baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h"
114c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
12dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1330fdc8d8SChris Lattner 
14b9c1b51eSKate Stone #include "lldb/Breakpoint/Breakpoint.h"
1530fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
1630fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
17b9c1b51eSKate Stone #include "lldb/Target/Process.h"
18bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
19181b823bSPavel Labath #include "lldb/Utility/Event.h"
20bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner using namespace lldb;
2330fdc8d8SChris Lattner using namespace lldb_private;
2430fdc8d8SChris Lattner 
25248a1305SKonrad Kleine SBEvent::SBEvent() : m_event_sp(), m_opaque_ptr(nullptr) {
26baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBEvent);
27baf5664fSJonas Devlieghere }
2830fdc8d8SChris Lattner 
29b9c1b51eSKate Stone SBEvent::SBEvent(uint32_t event_type, const char *cstr, uint32_t cstr_len)
30b9c1b51eSKate Stone     : m_event_sp(new Event(event_type, new EventDataBytes(cstr, cstr_len))),
31baf5664fSJonas Devlieghere       m_opaque_ptr(m_event_sp.get()) {
32baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBEvent, (uint32_t, const char *, uint32_t),
33baf5664fSJonas Devlieghere                           event_type, cstr, cstr_len);
34baf5664fSJonas Devlieghere }
3530fdc8d8SChris Lattner 
36b9c1b51eSKate Stone SBEvent::SBEvent(EventSP &event_sp)
37baf5664fSJonas Devlieghere     : m_event_sp(event_sp), m_opaque_ptr(event_sp.get()) {
38baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBEvent, (lldb::EventSP &), event_sp);
39baf5664fSJonas Devlieghere }
4030fdc8d8SChris Lattner 
41baf5664fSJonas Devlieghere SBEvent::SBEvent(Event *event_ptr) : m_event_sp(), m_opaque_ptr(event_ptr) {
42baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBEvent, (lldb_private::Event *), event_ptr);
43baf5664fSJonas Devlieghere }
4430fdc8d8SChris Lattner 
45b9c1b51eSKate Stone SBEvent::SBEvent(const SBEvent &rhs)
46baf5664fSJonas Devlieghere     : m_event_sp(rhs.m_event_sp), m_opaque_ptr(rhs.m_opaque_ptr) {
47baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBEvent, (const lldb::SBEvent &), rhs);
48baf5664fSJonas Devlieghere }
492bdbfd50SJim Ingham 
50b9c1b51eSKate Stone const SBEvent &SBEvent::operator=(const SBEvent &rhs) {
51baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBEvent &,
52baf5664fSJonas Devlieghere                      SBEvent, operator=,(const lldb::SBEvent &), rhs);
53baf5664fSJonas Devlieghere 
54b9c1b51eSKate Stone   if (this != &rhs) {
55efabb123SGreg Clayton     m_event_sp = rhs.m_event_sp;
56efabb123SGreg Clayton     m_opaque_ptr = rhs.m_opaque_ptr;
57efabb123SGreg Clayton   }
58306809f2SJonas Devlieghere   return LLDB_RECORD_RESULT(*this);
59efabb123SGreg Clayton }
60efabb123SGreg Clayton 
61b9c1b51eSKate Stone SBEvent::~SBEvent() {}
6230fdc8d8SChris Lattner 
63b9c1b51eSKate Stone const char *SBEvent::GetDataFlavor() {
64baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBEvent, GetDataFlavor);
65baf5664fSJonas Devlieghere 
666611103cSGreg Clayton   Event *lldb_event = get();
67b9c1b51eSKate Stone   if (lldb_event) {
68920c696cSGreg Clayton     EventData *event_data = lldb_event->GetData();
69920c696cSGreg Clayton     if (event_data)
7030fdc8d8SChris Lattner       return lldb_event->GetData()->GetFlavor().AsCString();
71920c696cSGreg Clayton   }
72248a1305SKonrad Kleine   return nullptr;
7330fdc8d8SChris Lattner }
7430fdc8d8SChris Lattner 
75b9c1b51eSKate Stone uint32_t SBEvent::GetType() const {
76baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBEvent, GetType);
77baf5664fSJonas Devlieghere 
78ceb6b139SCaroline Tice 
796611103cSGreg Clayton   const Event *lldb_event = get();
80ceb6b139SCaroline Tice   uint32_t event_type = 0;
8130fdc8d8SChris Lattner   if (lldb_event)
82ceb6b139SCaroline Tice     event_type = lldb_event->GetType();
83ceb6b139SCaroline Tice 
84cfd1acedSGreg Clayton 
85ceb6b139SCaroline Tice   return event_type;
8630fdc8d8SChris Lattner }
8730fdc8d8SChris Lattner 
88b9c1b51eSKate Stone SBBroadcaster SBEvent::GetBroadcaster() const {
89baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBroadcaster, SBEvent,
90baf5664fSJonas Devlieghere                                    GetBroadcaster);
91baf5664fSJonas Devlieghere 
9230fdc8d8SChris Lattner   SBBroadcaster broadcaster;
936611103cSGreg Clayton   const Event *lldb_event = get();
9430fdc8d8SChris Lattner   if (lldb_event)
956611103cSGreg Clayton     broadcaster.reset(lldb_event->GetBroadcaster(), false);
96baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(broadcaster);
9730fdc8d8SChris Lattner }
9830fdc8d8SChris Lattner 
99b9c1b51eSKate Stone const char *SBEvent::GetBroadcasterClass() const {
100baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBEvent, GetBroadcasterClass);
101baf5664fSJonas Devlieghere 
1024bddaeb5SJim Ingham   const Event *lldb_event = get();
1034bddaeb5SJim Ingham   if (lldb_event)
1044bddaeb5SJim Ingham     return lldb_event->GetBroadcaster()->GetBroadcasterClass().AsCString();
1054bddaeb5SJim Ingham   else
1064bddaeb5SJim Ingham     return "unknown class";
1074bddaeb5SJim Ingham }
1084bddaeb5SJim Ingham 
109b9c1b51eSKate Stone bool SBEvent::BroadcasterMatchesPtr(const SBBroadcaster *broadcaster) {
110baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBEvent, BroadcasterMatchesPtr,
111baf5664fSJonas Devlieghere                      (const lldb::SBBroadcaster *), broadcaster);
112baf5664fSJonas Devlieghere 
11330fdc8d8SChris Lattner   if (broadcaster)
114cfd1acedSGreg Clayton     return BroadcasterMatchesRef(*broadcaster);
11530fdc8d8SChris Lattner   return false;
11630fdc8d8SChris Lattner }
11730fdc8d8SChris Lattner 
118b9c1b51eSKate Stone bool SBEvent::BroadcasterMatchesRef(const SBBroadcaster &broadcaster) {
119baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBEvent, BroadcasterMatchesRef,
120baf5664fSJonas Devlieghere                      (const lldb::SBBroadcaster &), broadcaster);
121ceb6b139SCaroline Tice 
1226611103cSGreg Clayton   Event *lldb_event = get();
123ceb6b139SCaroline Tice   bool success = false;
12430fdc8d8SChris Lattner   if (lldb_event)
125ceb6b139SCaroline Tice     success = lldb_event->BroadcasterIs(broadcaster.get());
126ceb6b139SCaroline Tice 
127ceb6b139SCaroline Tice 
128ceb6b139SCaroline Tice   return success;
12930fdc8d8SChris Lattner }
13030fdc8d8SChris Lattner 
131b9c1b51eSKate Stone void SBEvent::Clear() {
132baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBEvent, Clear);
133baf5664fSJonas Devlieghere 
1346611103cSGreg Clayton   Event *lldb_event = get();
13530fdc8d8SChris Lattner   if (lldb_event)
13630fdc8d8SChris Lattner     lldb_event->Clear();
13730fdc8d8SChris Lattner }
13830fdc8d8SChris Lattner 
139b9c1b51eSKate Stone EventSP &SBEvent::GetSP() const { return m_event_sp; }
14030fdc8d8SChris Lattner 
141b9c1b51eSKate Stone Event *SBEvent::get() const {
14230fdc8d8SChris Lattner   // There is a dangerous accessor call GetSharedPtr which can be used, so if
14330fdc8d8SChris Lattner   // we have anything valid in m_event_sp, we must use that since if it gets
14430fdc8d8SChris Lattner   // used by a function that puts something in there, then it won't update
145efabb123SGreg Clayton   // m_opaque_ptr...
14630fdc8d8SChris Lattner   if (m_event_sp)
147efabb123SGreg Clayton     m_opaque_ptr = m_event_sp.get();
14830fdc8d8SChris Lattner 
149efabb123SGreg Clayton   return m_opaque_ptr;
15030fdc8d8SChris Lattner }
15130fdc8d8SChris Lattner 
152b9c1b51eSKate Stone void SBEvent::reset(EventSP &event_sp) {
15330fdc8d8SChris Lattner   m_event_sp = event_sp;
154efabb123SGreg Clayton   m_opaque_ptr = m_event_sp.get();
15530fdc8d8SChris Lattner }
15630fdc8d8SChris Lattner 
157b9c1b51eSKate Stone void SBEvent::reset(Event *event_ptr) {
158efabb123SGreg Clayton   m_opaque_ptr = event_ptr;
15930fdc8d8SChris Lattner   m_event_sp.reset();
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
162b9c1b51eSKate Stone bool SBEvent::IsValid() const {
163baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBEvent, IsValid);
1647f5237bcSPavel Labath   return this->operator bool();
1657f5237bcSPavel Labath }
1667f5237bcSPavel Labath SBEvent::operator bool() const {
1677f5237bcSPavel Labath   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBEvent, operator bool);
168baf5664fSJonas Devlieghere 
16905097246SAdrian Prantl   // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get() accessor.
17005097246SAdrian Prantl   // See comments in SBEvent::get()....
171248a1305SKonrad Kleine   return SBEvent::get() != nullptr;
17230fdc8d8SChris Lattner }
17330fdc8d8SChris Lattner 
174b9c1b51eSKate Stone const char *SBEvent::GetCStringFromEvent(const SBEvent &event) {
175baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(const char *, SBEvent, GetCStringFromEvent,
176baf5664fSJonas Devlieghere                             (const lldb::SBEvent &), event);
177baf5664fSJonas Devlieghere 
178*65fdb342SRaphael Isemann   return static_cast<const char *>(
179b9c1b51eSKate Stone       EventDataBytes::GetBytesFromEvent(event.get()));
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
182b9c1b51eSKate Stone bool SBEvent::GetDescription(SBStream &description) {
183baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBEvent, GetDescription, (lldb::SBStream &),
184baf5664fSJonas Devlieghere                      description);
185baf5664fSJonas Devlieghere 
186da7bc7d0SGreg Clayton   Stream &strm = description.ref();
187da7bc7d0SGreg Clayton 
188b9c1b51eSKate Stone   if (get()) {
189da7bc7d0SGreg Clayton     m_opaque_ptr->Dump(&strm);
190b9c1b51eSKate Stone   } else
191da7bc7d0SGreg Clayton     strm.PutCString("No value");
192dde9cff3SCaroline Tice 
193dde9cff3SCaroline Tice   return true;
194dde9cff3SCaroline Tice }
195ceb6b139SCaroline Tice 
196b9c1b51eSKate Stone bool SBEvent::GetDescription(SBStream &description) const {
197baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBEvent, GetDescription, (lldb::SBStream &),
198baf5664fSJonas Devlieghere                            description);
199baf5664fSJonas Devlieghere 
200da7bc7d0SGreg Clayton   Stream &strm = description.ref();
201da7bc7d0SGreg Clayton 
202b9c1b51eSKate Stone   if (get()) {
203da7bc7d0SGreg Clayton     m_opaque_ptr->Dump(&strm);
204b9c1b51eSKate Stone   } else
205da7bc7d0SGreg Clayton     strm.PutCString("No value");
206ceb6b139SCaroline Tice 
207ceb6b139SCaroline Tice   return true;
208ceb6b139SCaroline Tice }
209ae211eceSMichal Gorny 
210ae211eceSMichal Gorny namespace lldb_private {
211ae211eceSMichal Gorny namespace repro {
212ae211eceSMichal Gorny 
213ae211eceSMichal Gorny template <>
214ae211eceSMichal Gorny void RegisterMethods<SBEvent>(Registry &R) {
215ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBEvent, ());
216ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBEvent, (uint32_t, const char *, uint32_t));
217ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBEvent, (lldb::EventSP &));
218ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBEvent, (lldb_private::Event *));
219ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBEvent, (const lldb::SBEvent &));
220ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const lldb::SBEvent &,
221ae211eceSMichal Gorny                        SBEvent, operator=,(const lldb::SBEvent &));
222ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBEvent, GetDataFlavor, ());
223ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(uint32_t, SBEvent, GetType, ());
224ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBBroadcaster, SBEvent, GetBroadcaster,
225ae211eceSMichal Gorny                              ());
226ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(const char *, SBEvent, GetBroadcasterClass, ());
227ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBEvent, BroadcasterMatchesPtr,
228ae211eceSMichal Gorny                        (const lldb::SBBroadcaster *));
229ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBEvent, BroadcasterMatchesRef,
230ae211eceSMichal Gorny                        (const lldb::SBBroadcaster &));
231ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBEvent, Clear, ());
232ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBEvent, IsValid, ());
233ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBEvent, operator bool, ());
234ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(const char *, SBEvent, GetCStringFromEvent,
235ae211eceSMichal Gorny                               (const lldb::SBEvent &));
236ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBEvent, GetDescription, (lldb::SBStream &));
237ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBEvent, GetDescription,
238ae211eceSMichal Gorny                              (lldb::SBStream &));
239ae211eceSMichal Gorny }
240ae211eceSMichal Gorny 
241ae211eceSMichal Gorny }
242ae211eceSMichal Gorny }
243