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"
104c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
11dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
12*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.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 
SBEvent()25*1755f5b1SJonas Devlieghere SBEvent::SBEvent() { LLDB_INSTRUMENT_VA(this); }
2630fdc8d8SChris Lattner 
SBEvent(uint32_t event_type,const char * cstr,uint32_t cstr_len)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()) {
30*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, event_type, cstr, cstr_len);
31baf5664fSJonas Devlieghere }
3230fdc8d8SChris Lattner 
SBEvent(EventSP & event_sp)33b9c1b51eSKate Stone SBEvent::SBEvent(EventSP &event_sp)
34baf5664fSJonas Devlieghere     : m_event_sp(event_sp), m_opaque_ptr(event_sp.get()) {
35*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, event_sp);
36baf5664fSJonas Devlieghere }
3730fdc8d8SChris Lattner 
SBEvent(Event * event_ptr)38a3436f73SKazu Hirata SBEvent::SBEvent(Event *event_ptr) : m_opaque_ptr(event_ptr) {
39*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, event_ptr);
40baf5664fSJonas Devlieghere }
4130fdc8d8SChris Lattner 
SBEvent(const SBEvent & rhs)42b9c1b51eSKate Stone SBEvent::SBEvent(const SBEvent &rhs)
43baf5664fSJonas Devlieghere     : m_event_sp(rhs.m_event_sp), m_opaque_ptr(rhs.m_opaque_ptr) {
44*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
45baf5664fSJonas Devlieghere }
462bdbfd50SJim Ingham 
operator =(const SBEvent & rhs)47b9c1b51eSKate Stone const SBEvent &SBEvent::operator=(const SBEvent &rhs) {
48*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
49baf5664fSJonas Devlieghere 
50b9c1b51eSKate Stone   if (this != &rhs) {
51efabb123SGreg Clayton     m_event_sp = rhs.m_event_sp;
52efabb123SGreg Clayton     m_opaque_ptr = rhs.m_opaque_ptr;
53efabb123SGreg Clayton   }
54d232abc3SJonas Devlieghere   return *this;
55efabb123SGreg Clayton }
56efabb123SGreg Clayton 
57866b7a65SJonas Devlieghere SBEvent::~SBEvent() = default;
5830fdc8d8SChris Lattner 
GetDataFlavor()59b9c1b51eSKate Stone const char *SBEvent::GetDataFlavor() {
60*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
61baf5664fSJonas Devlieghere 
626611103cSGreg Clayton   Event *lldb_event = get();
63b9c1b51eSKate Stone   if (lldb_event) {
64920c696cSGreg Clayton     EventData *event_data = lldb_event->GetData();
65920c696cSGreg Clayton     if (event_data)
6630fdc8d8SChris Lattner       return lldb_event->GetData()->GetFlavor().AsCString();
67920c696cSGreg Clayton   }
68248a1305SKonrad Kleine   return nullptr;
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
GetType() const71b9c1b51eSKate Stone uint32_t SBEvent::GetType() const {
72*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
73ceb6b139SCaroline Tice 
746611103cSGreg Clayton   const Event *lldb_event = get();
75ceb6b139SCaroline Tice   uint32_t event_type = 0;
7630fdc8d8SChris Lattner   if (lldb_event)
77ceb6b139SCaroline Tice     event_type = lldb_event->GetType();
78ceb6b139SCaroline Tice 
79cfd1acedSGreg Clayton 
80ceb6b139SCaroline Tice   return event_type;
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner 
GetBroadcaster() const83b9c1b51eSKate Stone SBBroadcaster SBEvent::GetBroadcaster() const {
84*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
85baf5664fSJonas Devlieghere 
8630fdc8d8SChris Lattner   SBBroadcaster broadcaster;
876611103cSGreg Clayton   const Event *lldb_event = get();
8830fdc8d8SChris Lattner   if (lldb_event)
896611103cSGreg Clayton     broadcaster.reset(lldb_event->GetBroadcaster(), false);
90d232abc3SJonas Devlieghere   return broadcaster;
9130fdc8d8SChris Lattner }
9230fdc8d8SChris Lattner 
GetBroadcasterClass() const93b9c1b51eSKate Stone const char *SBEvent::GetBroadcasterClass() const {
94*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
95baf5664fSJonas Devlieghere 
964bddaeb5SJim Ingham   const Event *lldb_event = get();
974bddaeb5SJim Ingham   if (lldb_event)
984bddaeb5SJim Ingham     return lldb_event->GetBroadcaster()->GetBroadcasterClass().AsCString();
994bddaeb5SJim Ingham   else
1004bddaeb5SJim Ingham     return "unknown class";
1014bddaeb5SJim Ingham }
1024bddaeb5SJim Ingham 
BroadcasterMatchesPtr(const SBBroadcaster * broadcaster)103b9c1b51eSKate Stone bool SBEvent::BroadcasterMatchesPtr(const SBBroadcaster *broadcaster) {
104*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, broadcaster);
105baf5664fSJonas Devlieghere 
10630fdc8d8SChris Lattner   if (broadcaster)
107cfd1acedSGreg Clayton     return BroadcasterMatchesRef(*broadcaster);
10830fdc8d8SChris Lattner   return false;
10930fdc8d8SChris Lattner }
11030fdc8d8SChris Lattner 
BroadcasterMatchesRef(const SBBroadcaster & broadcaster)111b9c1b51eSKate Stone bool SBEvent::BroadcasterMatchesRef(const SBBroadcaster &broadcaster) {
112*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, broadcaster);
113ceb6b139SCaroline Tice 
1146611103cSGreg Clayton   Event *lldb_event = get();
115ceb6b139SCaroline Tice   bool success = false;
11630fdc8d8SChris Lattner   if (lldb_event)
117ceb6b139SCaroline Tice     success = lldb_event->BroadcasterIs(broadcaster.get());
118ceb6b139SCaroline Tice 
119ceb6b139SCaroline Tice 
120ceb6b139SCaroline Tice   return success;
12130fdc8d8SChris Lattner }
12230fdc8d8SChris Lattner 
Clear()123b9c1b51eSKate Stone void SBEvent::Clear() {
124*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
125baf5664fSJonas Devlieghere 
1266611103cSGreg Clayton   Event *lldb_event = get();
12730fdc8d8SChris Lattner   if (lldb_event)
12830fdc8d8SChris Lattner     lldb_event->Clear();
12930fdc8d8SChris Lattner }
13030fdc8d8SChris Lattner 
GetSP() const131b9c1b51eSKate Stone EventSP &SBEvent::GetSP() const { return m_event_sp; }
13230fdc8d8SChris Lattner 
get() const133b9c1b51eSKate Stone Event *SBEvent::get() const {
13430fdc8d8SChris Lattner   // There is a dangerous accessor call GetSharedPtr which can be used, so if
13530fdc8d8SChris Lattner   // we have anything valid in m_event_sp, we must use that since if it gets
13630fdc8d8SChris Lattner   // used by a function that puts something in there, then it won't update
137efabb123SGreg Clayton   // m_opaque_ptr...
13830fdc8d8SChris Lattner   if (m_event_sp)
139efabb123SGreg Clayton     m_opaque_ptr = m_event_sp.get();
14030fdc8d8SChris Lattner 
141efabb123SGreg Clayton   return m_opaque_ptr;
14230fdc8d8SChris Lattner }
14330fdc8d8SChris Lattner 
reset(EventSP & event_sp)144b9c1b51eSKate Stone void SBEvent::reset(EventSP &event_sp) {
14530fdc8d8SChris Lattner   m_event_sp = event_sp;
146efabb123SGreg Clayton   m_opaque_ptr = m_event_sp.get();
14730fdc8d8SChris Lattner }
14830fdc8d8SChris Lattner 
reset(Event * event_ptr)149b9c1b51eSKate Stone void SBEvent::reset(Event *event_ptr) {
150efabb123SGreg Clayton   m_opaque_ptr = event_ptr;
15130fdc8d8SChris Lattner   m_event_sp.reset();
15230fdc8d8SChris Lattner }
15330fdc8d8SChris Lattner 
IsValid() const154b9c1b51eSKate Stone bool SBEvent::IsValid() const {
155*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1567f5237bcSPavel Labath   return this->operator bool();
1577f5237bcSPavel Labath }
operator bool() const1587f5237bcSPavel Labath SBEvent::operator bool() const {
159*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
160baf5664fSJonas Devlieghere 
16105097246SAdrian Prantl   // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get() accessor.
16205097246SAdrian Prantl   // See comments in SBEvent::get()....
163248a1305SKonrad Kleine   return SBEvent::get() != nullptr;
16430fdc8d8SChris Lattner }
16530fdc8d8SChris Lattner 
GetCStringFromEvent(const SBEvent & event)166b9c1b51eSKate Stone const char *SBEvent::GetCStringFromEvent(const SBEvent &event) {
167*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(event);
168baf5664fSJonas Devlieghere 
16965fdb342SRaphael Isemann   return static_cast<const char *>(
170b9c1b51eSKate Stone       EventDataBytes::GetBytesFromEvent(event.get()));
17130fdc8d8SChris Lattner }
17230fdc8d8SChris Lattner 
GetDescription(SBStream & description)173b9c1b51eSKate Stone bool SBEvent::GetDescription(SBStream &description) {
174*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description);
175baf5664fSJonas Devlieghere 
176da7bc7d0SGreg Clayton   Stream &strm = description.ref();
177da7bc7d0SGreg Clayton 
178b9c1b51eSKate Stone   if (get()) {
179da7bc7d0SGreg Clayton     m_opaque_ptr->Dump(&strm);
180b9c1b51eSKate Stone   } else
181da7bc7d0SGreg Clayton     strm.PutCString("No value");
182dde9cff3SCaroline Tice 
183dde9cff3SCaroline Tice   return true;
184dde9cff3SCaroline Tice }
185ceb6b139SCaroline Tice 
GetDescription(SBStream & description) const186b9c1b51eSKate Stone bool SBEvent::GetDescription(SBStream &description) const {
187*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description);
188baf5664fSJonas Devlieghere 
189da7bc7d0SGreg Clayton   Stream &strm = description.ref();
190da7bc7d0SGreg Clayton 
191b9c1b51eSKate Stone   if (get()) {
192da7bc7d0SGreg Clayton     m_opaque_ptr->Dump(&strm);
193b9c1b51eSKate Stone   } else
194da7bc7d0SGreg Clayton     strm.PutCString("No value");
195ceb6b139SCaroline Tice 
196ceb6b139SCaroline Tice   return true;
197ceb6b139SCaroline Tice }
198