blob: 1d991c3eb6500566a79d2f052eadb45b998e0e8f [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBEvent.cpp ---------------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006//
7//===----------------------------------------------------------------------===//
8
Eli Friedman4c5de692010-06-09 07:44:37 +00009#include "lldb/API/SBEvent.h"
Jonas Devliegherebaf56642019-03-06 00:06:00 +000010#include "SBReproducerPrivate.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000011#include "lldb/API/SBBroadcaster.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000012#include "lldb/API/SBStream.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013
Kate Stoneb9c1b512016-09-06 20:57:50 +000014#include "lldb/Breakpoint/Breakpoint.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015#include "lldb/Core/StreamFile.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000016#include "lldb/Interpreter/CommandInterpreter.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000017#include "lldb/Target/Process.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000018#include "lldb/Utility/ConstString.h"
Pavel Labath181b8232018-12-14 15:59:49 +000019#include "lldb/Utility/Event.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000020#include "lldb/Utility/Stream.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021
22using namespace lldb;
23using namespace lldb_private;
24
Jonas Devliegherebaf56642019-03-06 00:06:00 +000025SBEvent::SBEvent() : m_event_sp(), m_opaque_ptr(NULL) {
26 LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBEvent);
27}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028
Kate Stoneb9c1b512016-09-06 20:57:50 +000029SBEvent::SBEvent(uint32_t event_type, const char *cstr, uint32_t cstr_len)
30 : m_event_sp(new Event(event_type, new EventDataBytes(cstr, cstr_len))),
Jonas Devliegherebaf56642019-03-06 00:06:00 +000031 m_opaque_ptr(m_event_sp.get()) {
32 LLDB_RECORD_CONSTRUCTOR(SBEvent, (uint32_t, const char *, uint32_t),
33 event_type, cstr, cstr_len);
34}
Kate Stoneb9c1b512016-09-06 20:57:50 +000035
36SBEvent::SBEvent(EventSP &event_sp)
Jonas Devliegherebaf56642019-03-06 00:06:00 +000037 : m_event_sp(event_sp), m_opaque_ptr(event_sp.get()) {
38 LLDB_RECORD_CONSTRUCTOR(SBEvent, (lldb::EventSP &), event_sp);
39}
Kate Stoneb9c1b512016-09-06 20:57:50 +000040
Jonas Devliegherebaf56642019-03-06 00:06:00 +000041SBEvent::SBEvent(Event *event_ptr) : m_event_sp(), m_opaque_ptr(event_ptr) {
42 LLDB_RECORD_CONSTRUCTOR(SBEvent, (lldb_private::Event *), event_ptr);
43}
Kate Stoneb9c1b512016-09-06 20:57:50 +000044
45SBEvent::SBEvent(const SBEvent &rhs)
Jonas Devliegherebaf56642019-03-06 00:06:00 +000046 : m_event_sp(rhs.m_event_sp), m_opaque_ptr(rhs.m_opaque_ptr) {
47 LLDB_RECORD_CONSTRUCTOR(SBEvent, (const lldb::SBEvent &), rhs);
48}
Kate Stoneb9c1b512016-09-06 20:57:50 +000049
50const SBEvent &SBEvent::operator=(const SBEvent &rhs) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000051 LLDB_RECORD_METHOD(const lldb::SBEvent &,
52 SBEvent, operator=,(const lldb::SBEvent &), rhs);
53
Kate Stoneb9c1b512016-09-06 20:57:50 +000054 if (this != &rhs) {
55 m_event_sp = rhs.m_event_sp;
56 m_opaque_ptr = rhs.m_opaque_ptr;
57 }
58 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059}
60
Kate Stoneb9c1b512016-09-06 20:57:50 +000061SBEvent::~SBEvent() {}
62
63const char *SBEvent::GetDataFlavor() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000064 LLDB_RECORD_METHOD_NO_ARGS(const char *, SBEvent, GetDataFlavor);
65
Kate Stoneb9c1b512016-09-06 20:57:50 +000066 Event *lldb_event = get();
67 if (lldb_event) {
68 EventData *event_data = lldb_event->GetData();
69 if (event_data)
70 return lldb_event->GetData()->GetFlavor().AsCString();
71 }
72 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000073}
74
Kate Stoneb9c1b512016-09-06 20:57:50 +000075uint32_t SBEvent::GetType() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000076 LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBEvent, GetType);
77
Kate Stoneb9c1b512016-09-06 20:57:50 +000078 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000079
Kate Stoneb9c1b512016-09-06 20:57:50 +000080 const Event *lldb_event = get();
81 uint32_t event_type = 0;
82 if (lldb_event)
83 event_type = lldb_event->GetType();
Jim Ingham2bdbfd52014-09-29 23:17:18 +000084
Kate Stoneb9c1b512016-09-06 20:57:50 +000085 if (log) {
86 StreamString sstr;
87 if (lldb_event && lldb_event->GetBroadcaster() &&
88 lldb_event->GetBroadcaster()->GetEventNames(sstr, event_type, true))
89 log->Printf("SBEvent(%p)::GetType () => 0x%8.8x (%s)",
90 static_cast<void *>(get()), event_type, sstr.GetData());
Jim Ingham4bddaeb2012-02-16 06:50:00 +000091 else
Kate Stoneb9c1b512016-09-06 20:57:50 +000092 log->Printf("SBEvent(%p)::GetType () => 0x%8.8x",
93 static_cast<void *>(get()), event_type);
94 }
95
96 return event_type;
Jim Ingham4bddaeb2012-02-16 06:50:00 +000097}
98
Kate Stoneb9c1b512016-09-06 20:57:50 +000099SBBroadcaster SBEvent::GetBroadcaster() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000100 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBroadcaster, SBEvent,
101 GetBroadcaster);
102
Kate Stoneb9c1b512016-09-06 20:57:50 +0000103 SBBroadcaster broadcaster;
104 const Event *lldb_event = get();
105 if (lldb_event)
106 broadcaster.reset(lldb_event->GetBroadcaster(), false);
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000107 return LLDB_RECORD_RESULT(broadcaster);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000108}
109
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110const char *SBEvent::GetBroadcasterClass() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000111 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBEvent, GetBroadcasterClass);
112
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113 const Event *lldb_event = get();
114 if (lldb_event)
115 return lldb_event->GetBroadcaster()->GetBroadcasterClass().AsCString();
116 else
117 return "unknown class";
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000118}
119
Kate Stoneb9c1b512016-09-06 20:57:50 +0000120bool SBEvent::BroadcasterMatchesPtr(const SBBroadcaster *broadcaster) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000121 LLDB_RECORD_METHOD(bool, SBEvent, BroadcasterMatchesPtr,
122 (const lldb::SBBroadcaster *), broadcaster);
123
Kate Stoneb9c1b512016-09-06 20:57:50 +0000124 if (broadcaster)
125 return BroadcasterMatchesRef(*broadcaster);
126 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000127}
128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129bool SBEvent::BroadcasterMatchesRef(const SBBroadcaster &broadcaster) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000130 LLDB_RECORD_METHOD(bool, SBEvent, BroadcasterMatchesRef,
131 (const lldb::SBBroadcaster &), broadcaster);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000132
133 Event *lldb_event = get();
134 bool success = false;
135 if (lldb_event)
136 success = lldb_event->BroadcasterIs(broadcaster.get());
137
138 // For logging, this gets a little chatty so only enable this when verbose
139 // logging is on
Pavel Labath3b7e1982017-02-05 00:44:54 +0000140 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
141 LLDB_LOGV(log, "({0}) (SBBroadcaster({1}): {2}) => {3}", get(),
142 broadcaster.get(), broadcaster.GetName(), success);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143
144 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000145}
146
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147void SBEvent::Clear() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000148 LLDB_RECORD_METHOD_NO_ARGS(void, SBEvent, Clear);
149
Kate Stoneb9c1b512016-09-06 20:57:50 +0000150 Event *lldb_event = get();
151 if (lldb_event)
152 lldb_event->Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000153}
154
Kate Stoneb9c1b512016-09-06 20:57:50 +0000155EventSP &SBEvent::GetSP() const { return m_event_sp; }
156
157Event *SBEvent::get() const {
158 // There is a dangerous accessor call GetSharedPtr which can be used, so if
159 // we have anything valid in m_event_sp, we must use that since if it gets
160 // used by a function that puts something in there, then it won't update
161 // m_opaque_ptr...
162 if (m_event_sp)
Greg Claytonefabb122010-11-05 23:17:00 +0000163 m_opaque_ptr = m_event_sp.get();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164
165 return m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000166}
167
Kate Stoneb9c1b512016-09-06 20:57:50 +0000168void SBEvent::reset(EventSP &event_sp) {
169 m_event_sp = event_sp;
170 m_opaque_ptr = m_event_sp.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000171}
172
Kate Stoneb9c1b512016-09-06 20:57:50 +0000173void SBEvent::reset(Event *event_ptr) {
174 m_opaque_ptr = event_ptr;
175 m_event_sp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000176}
177
Kate Stoneb9c1b512016-09-06 20:57:50 +0000178bool SBEvent::IsValid() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000179 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBEvent, IsValid);
180
Adrian Prantl05097242018-04-30 16:49:04 +0000181 // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get() accessor.
182 // See comments in SBEvent::get()....
Kate Stoneb9c1b512016-09-06 20:57:50 +0000183 return SBEvent::get() != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000184}
185
Kate Stoneb9c1b512016-09-06 20:57:50 +0000186const char *SBEvent::GetCStringFromEvent(const SBEvent &event) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000187 LLDB_RECORD_STATIC_METHOD(const char *, SBEvent, GetCStringFromEvent,
188 (const lldb::SBEvent &), event);
189
Kate Stoneb9c1b512016-09-06 20:57:50 +0000190 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000191
Kate Stoneb9c1b512016-09-06 20:57:50 +0000192 if (log)
193 log->Printf("SBEvent(%p)::GetCStringFromEvent () => \"%s\"",
194 static_cast<void *>(event.get()),
195 reinterpret_cast<const char *>(
196 EventDataBytes::GetBytesFromEvent(event.get())));
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000197
Kate Stoneb9c1b512016-09-06 20:57:50 +0000198 return reinterpret_cast<const char *>(
199 EventDataBytes::GetBytesFromEvent(event.get()));
Caroline Ticedde9cff2010-09-20 05:20:02 +0000200}
Caroline Ticeceb6b132010-10-26 03:11:13 +0000201
Kate Stoneb9c1b512016-09-06 20:57:50 +0000202bool SBEvent::GetDescription(SBStream &description) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000203 LLDB_RECORD_METHOD(bool, SBEvent, GetDescription, (lldb::SBStream &),
204 description);
205
Kate Stoneb9c1b512016-09-06 20:57:50 +0000206 Stream &strm = description.ref();
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000207
Kate Stoneb9c1b512016-09-06 20:57:50 +0000208 if (get()) {
209 m_opaque_ptr->Dump(&strm);
210 } else
211 strm.PutCString("No value");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000212
Kate Stoneb9c1b512016-09-06 20:57:50 +0000213 return true;
214}
215
216bool SBEvent::GetDescription(SBStream &description) const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000217 LLDB_RECORD_METHOD_CONST(bool, SBEvent, GetDescription, (lldb::SBStream &),
218 description);
219
Kate Stoneb9c1b512016-09-06 20:57:50 +0000220 Stream &strm = description.ref();
221
222 if (get()) {
223 m_opaque_ptr->Dump(&strm);
224 } else
225 strm.PutCString("No value");
226
227 return true;
Caroline Ticeceb6b132010-10-26 03:11:13 +0000228}