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