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 25baf5664fSJonas Devlieghere SBEvent::SBEvent() : m_event_sp(), m_opaque_ptr(NULL) { 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 } 58*306809f2SJonas 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 } 7230fdc8d8SChris Lattner return NULL; 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().... 1716611103cSGreg Clayton return SBEvent::get() != NULL; 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 178b9c1b51eSKate Stone return reinterpret_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