180814287SRaphael Isemann //===-- SBEvent.cpp -------------------------------------------------------===//
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"
10d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.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 
25a3436f73SKazu Hirata SBEvent::SBEvent() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBEvent); }
2630fdc8d8SChris Lattner 
27b9c1b51eSKate Stone SBEvent::SBEvent(uint32_t event_type, const char *cstr, uint32_t cstr_len)
28b9c1b51eSKate Stone     : m_event_sp(new Event(event_type, new EventDataBytes(cstr, cstr_len))),
29baf5664fSJonas Devlieghere       m_opaque_ptr(m_event_sp.get()) {
30baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBEvent, (uint32_t, const char *, uint32_t),
31baf5664fSJonas Devlieghere                           event_type, cstr, cstr_len);
32baf5664fSJonas Devlieghere }
3330fdc8d8SChris Lattner 
34b9c1b51eSKate Stone SBEvent::SBEvent(EventSP &event_sp)
35baf5664fSJonas Devlieghere     : m_event_sp(event_sp), m_opaque_ptr(event_sp.get()) {
36baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBEvent, (lldb::EventSP &), event_sp);
37baf5664fSJonas Devlieghere }
3830fdc8d8SChris Lattner 
39a3436f73SKazu Hirata SBEvent::SBEvent(Event *event_ptr) : m_opaque_ptr(event_ptr) {
40baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBEvent, (lldb_private::Event *), event_ptr);
41baf5664fSJonas Devlieghere }
4230fdc8d8SChris Lattner 
43b9c1b51eSKate Stone SBEvent::SBEvent(const SBEvent &rhs)
44baf5664fSJonas Devlieghere     : m_event_sp(rhs.m_event_sp), m_opaque_ptr(rhs.m_opaque_ptr) {
45baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBEvent, (const lldb::SBEvent &), rhs);
46baf5664fSJonas Devlieghere }
472bdbfd50SJim Ingham 
48b9c1b51eSKate Stone const SBEvent &SBEvent::operator=(const SBEvent &rhs) {
49baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBEvent &,
50baf5664fSJonas Devlieghere                      SBEvent, operator=,(const lldb::SBEvent &), rhs);
51baf5664fSJonas Devlieghere 
52b9c1b51eSKate Stone   if (this != &rhs) {
53efabb123SGreg Clayton     m_event_sp = rhs.m_event_sp;
54efabb123SGreg Clayton     m_opaque_ptr = rhs.m_opaque_ptr;
55efabb123SGreg Clayton   }
56*d232abc3SJonas Devlieghere   return *this;
57efabb123SGreg Clayton }
58efabb123SGreg Clayton 
59866b7a65SJonas Devlieghere SBEvent::~SBEvent() = default;
6030fdc8d8SChris Lattner 
61b9c1b51eSKate Stone const char *SBEvent::GetDataFlavor() {
62baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBEvent, GetDataFlavor);
63baf5664fSJonas Devlieghere 
646611103cSGreg Clayton   Event *lldb_event = get();
65b9c1b51eSKate Stone   if (lldb_event) {
66920c696cSGreg Clayton     EventData *event_data = lldb_event->GetData();
67920c696cSGreg Clayton     if (event_data)
6830fdc8d8SChris Lattner       return lldb_event->GetData()->GetFlavor().AsCString();
69920c696cSGreg Clayton   }
70248a1305SKonrad Kleine   return nullptr;
7130fdc8d8SChris Lattner }
7230fdc8d8SChris Lattner 
73b9c1b51eSKate Stone uint32_t SBEvent::GetType() const {
74baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBEvent, GetType);
75baf5664fSJonas Devlieghere 
76ceb6b139SCaroline Tice 
776611103cSGreg Clayton   const Event *lldb_event = get();
78ceb6b139SCaroline Tice   uint32_t event_type = 0;
7930fdc8d8SChris Lattner   if (lldb_event)
80ceb6b139SCaroline Tice     event_type = lldb_event->GetType();
81ceb6b139SCaroline Tice 
82cfd1acedSGreg Clayton 
83ceb6b139SCaroline Tice   return event_type;
8430fdc8d8SChris Lattner }
8530fdc8d8SChris Lattner 
86b9c1b51eSKate Stone SBBroadcaster SBEvent::GetBroadcaster() const {
87baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBroadcaster, SBEvent,
88baf5664fSJonas Devlieghere                                    GetBroadcaster);
89baf5664fSJonas Devlieghere 
9030fdc8d8SChris Lattner   SBBroadcaster broadcaster;
916611103cSGreg Clayton   const Event *lldb_event = get();
9230fdc8d8SChris Lattner   if (lldb_event)
936611103cSGreg Clayton     broadcaster.reset(lldb_event->GetBroadcaster(), false);
94*d232abc3SJonas Devlieghere   return broadcaster;
9530fdc8d8SChris Lattner }
9630fdc8d8SChris Lattner 
97b9c1b51eSKate Stone const char *SBEvent::GetBroadcasterClass() const {
98baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBEvent, GetBroadcasterClass);
99baf5664fSJonas Devlieghere 
1004bddaeb5SJim Ingham   const Event *lldb_event = get();
1014bddaeb5SJim Ingham   if (lldb_event)
1024bddaeb5SJim Ingham     return lldb_event->GetBroadcaster()->GetBroadcasterClass().AsCString();
1034bddaeb5SJim Ingham   else
1044bddaeb5SJim Ingham     return "unknown class";
1054bddaeb5SJim Ingham }
1064bddaeb5SJim Ingham 
107b9c1b51eSKate Stone bool SBEvent::BroadcasterMatchesPtr(const SBBroadcaster *broadcaster) {
108baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBEvent, BroadcasterMatchesPtr,
109baf5664fSJonas Devlieghere                      (const lldb::SBBroadcaster *), broadcaster);
110baf5664fSJonas Devlieghere 
11130fdc8d8SChris Lattner   if (broadcaster)
112cfd1acedSGreg Clayton     return BroadcasterMatchesRef(*broadcaster);
11330fdc8d8SChris Lattner   return false;
11430fdc8d8SChris Lattner }
11530fdc8d8SChris Lattner 
116b9c1b51eSKate Stone bool SBEvent::BroadcasterMatchesRef(const SBBroadcaster &broadcaster) {
117baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBEvent, BroadcasterMatchesRef,
118baf5664fSJonas Devlieghere                      (const lldb::SBBroadcaster &), broadcaster);
119ceb6b139SCaroline Tice 
1206611103cSGreg Clayton   Event *lldb_event = get();
121ceb6b139SCaroline Tice   bool success = false;
12230fdc8d8SChris Lattner   if (lldb_event)
123ceb6b139SCaroline Tice     success = lldb_event->BroadcasterIs(broadcaster.get());
124ceb6b139SCaroline Tice 
125ceb6b139SCaroline Tice 
126ceb6b139SCaroline Tice   return success;
12730fdc8d8SChris Lattner }
12830fdc8d8SChris Lattner 
129b9c1b51eSKate Stone void SBEvent::Clear() {
130baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBEvent, Clear);
131baf5664fSJonas Devlieghere 
1326611103cSGreg Clayton   Event *lldb_event = get();
13330fdc8d8SChris Lattner   if (lldb_event)
13430fdc8d8SChris Lattner     lldb_event->Clear();
13530fdc8d8SChris Lattner }
13630fdc8d8SChris Lattner 
137b9c1b51eSKate Stone EventSP &SBEvent::GetSP() const { return m_event_sp; }
13830fdc8d8SChris Lattner 
139b9c1b51eSKate Stone Event *SBEvent::get() const {
14030fdc8d8SChris Lattner   // There is a dangerous accessor call GetSharedPtr which can be used, so if
14130fdc8d8SChris Lattner   // we have anything valid in m_event_sp, we must use that since if it gets
14230fdc8d8SChris Lattner   // used by a function that puts something in there, then it won't update
143efabb123SGreg Clayton   // m_opaque_ptr...
14430fdc8d8SChris Lattner   if (m_event_sp)
145efabb123SGreg Clayton     m_opaque_ptr = m_event_sp.get();
14630fdc8d8SChris Lattner 
147efabb123SGreg Clayton   return m_opaque_ptr;
14830fdc8d8SChris Lattner }
14930fdc8d8SChris Lattner 
150b9c1b51eSKate Stone void SBEvent::reset(EventSP &event_sp) {
15130fdc8d8SChris Lattner   m_event_sp = event_sp;
152efabb123SGreg Clayton   m_opaque_ptr = m_event_sp.get();
15330fdc8d8SChris Lattner }
15430fdc8d8SChris Lattner 
155b9c1b51eSKate Stone void SBEvent::reset(Event *event_ptr) {
156efabb123SGreg Clayton   m_opaque_ptr = event_ptr;
15730fdc8d8SChris Lattner   m_event_sp.reset();
15830fdc8d8SChris Lattner }
15930fdc8d8SChris Lattner 
160b9c1b51eSKate Stone bool SBEvent::IsValid() const {
161baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBEvent, IsValid);
1627f5237bcSPavel Labath   return this->operator bool();
1637f5237bcSPavel Labath }
1647f5237bcSPavel Labath SBEvent::operator bool() const {
1657f5237bcSPavel Labath   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBEvent, operator bool);
166baf5664fSJonas Devlieghere 
16705097246SAdrian Prantl   // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get() accessor.
16805097246SAdrian Prantl   // See comments in SBEvent::get()....
169248a1305SKonrad Kleine   return SBEvent::get() != nullptr;
17030fdc8d8SChris Lattner }
17130fdc8d8SChris Lattner 
172b9c1b51eSKate Stone const char *SBEvent::GetCStringFromEvent(const SBEvent &event) {
173baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(const char *, SBEvent, GetCStringFromEvent,
174baf5664fSJonas Devlieghere                             (const lldb::SBEvent &), event);
175baf5664fSJonas Devlieghere 
17665fdb342SRaphael Isemann   return static_cast<const char *>(
177b9c1b51eSKate Stone       EventDataBytes::GetBytesFromEvent(event.get()));
17830fdc8d8SChris Lattner }
17930fdc8d8SChris Lattner 
180b9c1b51eSKate Stone bool SBEvent::GetDescription(SBStream &description) {
181baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBEvent, GetDescription, (lldb::SBStream &),
182baf5664fSJonas Devlieghere                      description);
183baf5664fSJonas Devlieghere 
184da7bc7d0SGreg Clayton   Stream &strm = description.ref();
185da7bc7d0SGreg Clayton 
186b9c1b51eSKate Stone   if (get()) {
187da7bc7d0SGreg Clayton     m_opaque_ptr->Dump(&strm);
188b9c1b51eSKate Stone   } else
189da7bc7d0SGreg Clayton     strm.PutCString("No value");
190dde9cff3SCaroline Tice 
191dde9cff3SCaroline Tice   return true;
192dde9cff3SCaroline Tice }
193ceb6b139SCaroline Tice 
194b9c1b51eSKate Stone bool SBEvent::GetDescription(SBStream &description) const {
195baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBEvent, GetDescription, (lldb::SBStream &),
196baf5664fSJonas Devlieghere                            description);
197baf5664fSJonas Devlieghere 
198da7bc7d0SGreg Clayton   Stream &strm = description.ref();
199da7bc7d0SGreg Clayton 
200b9c1b51eSKate Stone   if (get()) {
201da7bc7d0SGreg Clayton     m_opaque_ptr->Dump(&strm);
202b9c1b51eSKate Stone   } else
203da7bc7d0SGreg Clayton     strm.PutCString("No value");
204ceb6b139SCaroline Tice 
205ceb6b139SCaroline Tice   return true;
206ceb6b139SCaroline Tice }
207