15ffd83dbSDimitry Andric //===-- SBEvent.cpp -------------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/API/SBEvent.h"
100b57cec5SDimitry Andric #include "lldb/API/SBBroadcaster.h"
110b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
1204eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #include "lldb/Breakpoint/Breakpoint.h"
150b57cec5SDimitry Andric #include "lldb/Interpreter/CommandInterpreter.h"
160b57cec5SDimitry Andric #include "lldb/Target/Process.h"
170b57cec5SDimitry Andric #include "lldb/Utility/ConstString.h"
180b57cec5SDimitry Andric #include "lldb/Utility/Event.h"
190b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric using namespace lldb;
220b57cec5SDimitry Andric using namespace lldb_private;
230b57cec5SDimitry Andric 
SBEvent()2404eeddc0SDimitry Andric SBEvent::SBEvent() { LLDB_INSTRUMENT_VA(this); }
250b57cec5SDimitry Andric 
SBEvent(uint32_t event_type,const char * cstr,uint32_t cstr_len)260b57cec5SDimitry Andric SBEvent::SBEvent(uint32_t event_type, const char *cstr, uint32_t cstr_len)
270b57cec5SDimitry Andric     : m_event_sp(new Event(event_type, new EventDataBytes(cstr, cstr_len))),
280b57cec5SDimitry Andric       m_opaque_ptr(m_event_sp.get()) {
2904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, event_type, cstr, cstr_len);
300b57cec5SDimitry Andric }
310b57cec5SDimitry Andric 
SBEvent(EventSP & event_sp)320b57cec5SDimitry Andric SBEvent::SBEvent(EventSP &event_sp)
330b57cec5SDimitry Andric     : m_event_sp(event_sp), m_opaque_ptr(event_sp.get()) {
3404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, event_sp);
350b57cec5SDimitry Andric }
360b57cec5SDimitry Andric 
SBEvent(Event * event_ptr)3704eeddc0SDimitry Andric SBEvent::SBEvent(Event *event_ptr) : m_opaque_ptr(event_ptr) {
3804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, event_ptr);
390b57cec5SDimitry Andric }
400b57cec5SDimitry Andric 
SBEvent(const SBEvent & rhs)410b57cec5SDimitry Andric SBEvent::SBEvent(const SBEvent &rhs)
420b57cec5SDimitry Andric     : m_event_sp(rhs.m_event_sp), m_opaque_ptr(rhs.m_opaque_ptr) {
4304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
440b57cec5SDimitry Andric }
450b57cec5SDimitry Andric 
operator =(const SBEvent & rhs)460b57cec5SDimitry Andric const SBEvent &SBEvent::operator=(const SBEvent &rhs) {
4704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric   if (this != &rhs) {
500b57cec5SDimitry Andric     m_event_sp = rhs.m_event_sp;
510b57cec5SDimitry Andric     m_opaque_ptr = rhs.m_opaque_ptr;
520b57cec5SDimitry Andric   }
5304eeddc0SDimitry Andric   return *this;
540b57cec5SDimitry Andric }
550b57cec5SDimitry Andric 
565ffd83dbSDimitry Andric SBEvent::~SBEvent() = default;
570b57cec5SDimitry Andric 
GetDataFlavor()580b57cec5SDimitry Andric const char *SBEvent::GetDataFlavor() {
5904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric   Event *lldb_event = get();
620b57cec5SDimitry Andric   if (lldb_event) {
630b57cec5SDimitry Andric     EventData *event_data = lldb_event->GetData();
640b57cec5SDimitry Andric     if (event_data)
65*fe013be4SDimitry Andric       return ConstString(lldb_event->GetData()->GetFlavor()).GetCString();
660b57cec5SDimitry Andric   }
670b57cec5SDimitry Andric   return nullptr;
680b57cec5SDimitry Andric }
690b57cec5SDimitry Andric 
GetType() const700b57cec5SDimitry Andric uint32_t SBEvent::GetType() const {
7104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
720b57cec5SDimitry Andric 
730b57cec5SDimitry Andric   const Event *lldb_event = get();
740b57cec5SDimitry Andric   uint32_t event_type = 0;
750b57cec5SDimitry Andric   if (lldb_event)
760b57cec5SDimitry Andric     event_type = lldb_event->GetType();
770b57cec5SDimitry Andric 
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric   return event_type;
800b57cec5SDimitry Andric }
810b57cec5SDimitry Andric 
GetBroadcaster() const820b57cec5SDimitry Andric SBBroadcaster SBEvent::GetBroadcaster() const {
8304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
840b57cec5SDimitry Andric 
850b57cec5SDimitry Andric   SBBroadcaster broadcaster;
860b57cec5SDimitry Andric   const Event *lldb_event = get();
870b57cec5SDimitry Andric   if (lldb_event)
880b57cec5SDimitry Andric     broadcaster.reset(lldb_event->GetBroadcaster(), false);
8904eeddc0SDimitry Andric   return broadcaster;
900b57cec5SDimitry Andric }
910b57cec5SDimitry Andric 
GetBroadcasterClass() const920b57cec5SDimitry Andric const char *SBEvent::GetBroadcasterClass() const {
9304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
940b57cec5SDimitry Andric 
950b57cec5SDimitry Andric   const Event *lldb_event = get();
960b57cec5SDimitry Andric   if (lldb_event)
970b57cec5SDimitry Andric     return lldb_event->GetBroadcaster()->GetBroadcasterClass().AsCString();
980b57cec5SDimitry Andric   else
990b57cec5SDimitry Andric     return "unknown class";
1000b57cec5SDimitry Andric }
1010b57cec5SDimitry Andric 
BroadcasterMatchesPtr(const SBBroadcaster * broadcaster)1020b57cec5SDimitry Andric bool SBEvent::BroadcasterMatchesPtr(const SBBroadcaster *broadcaster) {
10304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, broadcaster);
1040b57cec5SDimitry Andric 
1050b57cec5SDimitry Andric   if (broadcaster)
1060b57cec5SDimitry Andric     return BroadcasterMatchesRef(*broadcaster);
1070b57cec5SDimitry Andric   return false;
1080b57cec5SDimitry Andric }
1090b57cec5SDimitry Andric 
BroadcasterMatchesRef(const SBBroadcaster & broadcaster)1100b57cec5SDimitry Andric bool SBEvent::BroadcasterMatchesRef(const SBBroadcaster &broadcaster) {
11104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, broadcaster);
1120b57cec5SDimitry Andric 
1130b57cec5SDimitry Andric   Event *lldb_event = get();
1140b57cec5SDimitry Andric   bool success = false;
1150b57cec5SDimitry Andric   if (lldb_event)
1160b57cec5SDimitry Andric     success = lldb_event->BroadcasterIs(broadcaster.get());
1170b57cec5SDimitry Andric 
1180b57cec5SDimitry Andric 
1190b57cec5SDimitry Andric   return success;
1200b57cec5SDimitry Andric }
1210b57cec5SDimitry Andric 
Clear()1220b57cec5SDimitry Andric void SBEvent::Clear() {
12304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1240b57cec5SDimitry Andric 
1250b57cec5SDimitry Andric   Event *lldb_event = get();
1260b57cec5SDimitry Andric   if (lldb_event)
1270b57cec5SDimitry Andric     lldb_event->Clear();
1280b57cec5SDimitry Andric }
1290b57cec5SDimitry Andric 
GetSP() const1300b57cec5SDimitry Andric EventSP &SBEvent::GetSP() const { return m_event_sp; }
1310b57cec5SDimitry Andric 
get() const1320b57cec5SDimitry Andric Event *SBEvent::get() const {
1330b57cec5SDimitry Andric   // There is a dangerous accessor call GetSharedPtr which can be used, so if
1340b57cec5SDimitry Andric   // we have anything valid in m_event_sp, we must use that since if it gets
1350b57cec5SDimitry Andric   // used by a function that puts something in there, then it won't update
1360b57cec5SDimitry Andric   // m_opaque_ptr...
1370b57cec5SDimitry Andric   if (m_event_sp)
1380b57cec5SDimitry Andric     m_opaque_ptr = m_event_sp.get();
1390b57cec5SDimitry Andric 
1400b57cec5SDimitry Andric   return m_opaque_ptr;
1410b57cec5SDimitry Andric }
1420b57cec5SDimitry Andric 
reset(EventSP & event_sp)1430b57cec5SDimitry Andric void SBEvent::reset(EventSP &event_sp) {
1440b57cec5SDimitry Andric   m_event_sp = event_sp;
1450b57cec5SDimitry Andric   m_opaque_ptr = m_event_sp.get();
1460b57cec5SDimitry Andric }
1470b57cec5SDimitry Andric 
reset(Event * event_ptr)1480b57cec5SDimitry Andric void SBEvent::reset(Event *event_ptr) {
1490b57cec5SDimitry Andric   m_opaque_ptr = event_ptr;
1500b57cec5SDimitry Andric   m_event_sp.reset();
1510b57cec5SDimitry Andric }
1520b57cec5SDimitry Andric 
IsValid() const1530b57cec5SDimitry Andric bool SBEvent::IsValid() const {
15404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1550b57cec5SDimitry Andric   return this->operator bool();
1560b57cec5SDimitry Andric }
operator bool() const1570b57cec5SDimitry Andric SBEvent::operator bool() const {
15804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1590b57cec5SDimitry Andric 
1600b57cec5SDimitry Andric   // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get() accessor.
1610b57cec5SDimitry Andric   // See comments in SBEvent::get()....
1620b57cec5SDimitry Andric   return SBEvent::get() != nullptr;
1630b57cec5SDimitry Andric }
1640b57cec5SDimitry Andric 
GetCStringFromEvent(const SBEvent & event)1650b57cec5SDimitry Andric const char *SBEvent::GetCStringFromEvent(const SBEvent &event) {
16604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(event);
1670b57cec5SDimitry Andric 
168*fe013be4SDimitry Andric   return ConstString(static_cast<const char *>(
169*fe013be4SDimitry Andric                          EventDataBytes::GetBytesFromEvent(event.get())))
170*fe013be4SDimitry Andric       .GetCString();
1710b57cec5SDimitry Andric }
1720b57cec5SDimitry Andric 
GetDescription(SBStream & description)1730b57cec5SDimitry Andric bool SBEvent::GetDescription(SBStream &description) {
17404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, description);
1750b57cec5SDimitry Andric 
1760b57cec5SDimitry Andric   Stream &strm = description.ref();
1770b57cec5SDimitry Andric 
1780b57cec5SDimitry Andric   if (get()) {
1790b57cec5SDimitry Andric     m_opaque_ptr->Dump(&strm);
1800b57cec5SDimitry Andric   } else
1810b57cec5SDimitry Andric     strm.PutCString("No value");
1820b57cec5SDimitry Andric 
1830b57cec5SDimitry Andric   return true;
1840b57cec5SDimitry Andric }
1850b57cec5SDimitry Andric 
GetDescription(SBStream & description) const1860b57cec5SDimitry Andric bool SBEvent::GetDescription(SBStream &description) const {
18704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, description);
1880b57cec5SDimitry Andric 
1890b57cec5SDimitry Andric   Stream &strm = description.ref();
1900b57cec5SDimitry Andric 
1910b57cec5SDimitry Andric   if (get()) {
1920b57cec5SDimitry Andric     m_opaque_ptr->Dump(&strm);
1930b57cec5SDimitry Andric   } else
1940b57cec5SDimitry Andric     strm.PutCString("No value");
1950b57cec5SDimitry Andric 
1960b57cec5SDimitry Andric   return true;
1970b57cec5SDimitry Andric }
198