blob: e0bb68c66c27df2347dc53f472dd8ffe0f5eeeb4 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBEvent.cpp ---------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Eli Friedman4c5de692010-06-09 07:44:37 +000010#include "lldb/API/SBEvent.h"
11#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"
15#include "lldb/Core/ConstString.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000016#include "lldb/Core/Event.h"
17#include "lldb/Core/Stream.h"
18#include "lldb/Core/StreamFile.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019#include "lldb/Interpreter/CommandInterpreter.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000020#include "lldb/Target/Process.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021
22using namespace lldb;
23using namespace lldb_private;
24
Kate Stoneb9c1b512016-09-06 20:57:50 +000025SBEvent::SBEvent() : m_event_sp(), m_opaque_ptr(NULL) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000026
Kate Stoneb9c1b512016-09-06 20:57:50 +000027SBEvent::SBEvent(uint32_t event_type, const char *cstr, uint32_t cstr_len)
28 : m_event_sp(new Event(event_type, new EventDataBytes(cstr, cstr_len))),
29 m_opaque_ptr(m_event_sp.get()) {}
30
31SBEvent::SBEvent(EventSP &event_sp)
32 : m_event_sp(event_sp), m_opaque_ptr(event_sp.get()) {}
33
34SBEvent::SBEvent(Event *event_ptr) : m_event_sp(), m_opaque_ptr(event_ptr) {}
35
36SBEvent::SBEvent(const SBEvent &rhs)
37 : m_event_sp(rhs.m_event_sp), m_opaque_ptr(rhs.m_opaque_ptr) {}
38
39const SBEvent &SBEvent::operator=(const SBEvent &rhs) {
40 if (this != &rhs) {
41 m_event_sp = rhs.m_event_sp;
42 m_opaque_ptr = rhs.m_opaque_ptr;
43 }
44 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045}
46
Kate Stoneb9c1b512016-09-06 20:57:50 +000047SBEvent::~SBEvent() {}
48
49const char *SBEvent::GetDataFlavor() {
50 Event *lldb_event = get();
51 if (lldb_event) {
52 EventData *event_data = lldb_event->GetData();
53 if (event_data)
54 return lldb_event->GetData()->GetFlavor().AsCString();
55 }
56 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057}
58
Kate Stoneb9c1b512016-09-06 20:57:50 +000059uint32_t SBEvent::GetType() const {
60 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000061
Kate Stoneb9c1b512016-09-06 20:57:50 +000062 const Event *lldb_event = get();
63 uint32_t event_type = 0;
64 if (lldb_event)
65 event_type = lldb_event->GetType();
Jim Ingham2bdbfd52014-09-29 23:17:18 +000066
Kate Stoneb9c1b512016-09-06 20:57:50 +000067 if (log) {
68 StreamString sstr;
69 if (lldb_event && lldb_event->GetBroadcaster() &&
70 lldb_event->GetBroadcaster()->GetEventNames(sstr, event_type, true))
71 log->Printf("SBEvent(%p)::GetType () => 0x%8.8x (%s)",
72 static_cast<void *>(get()), event_type, sstr.GetData());
Jim Ingham4bddaeb2012-02-16 06:50:00 +000073 else
Kate Stoneb9c1b512016-09-06 20:57:50 +000074 log->Printf("SBEvent(%p)::GetType () => 0x%8.8x",
75 static_cast<void *>(get()), event_type);
76 }
77
78 return event_type;
Jim Ingham4bddaeb2012-02-16 06:50:00 +000079}
80
Kate Stoneb9c1b512016-09-06 20:57:50 +000081SBBroadcaster SBEvent::GetBroadcaster() const {
82 SBBroadcaster broadcaster;
83 const Event *lldb_event = get();
84 if (lldb_event)
85 broadcaster.reset(lldb_event->GetBroadcaster(), false);
86 return broadcaster;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000087}
88
Kate Stoneb9c1b512016-09-06 20:57:50 +000089const char *SBEvent::GetBroadcasterClass() const {
90 const Event *lldb_event = get();
91 if (lldb_event)
92 return lldb_event->GetBroadcaster()->GetBroadcasterClass().AsCString();
93 else
94 return "unknown class";
Chris Lattner30fdc8d2010-06-08 16:52:24 +000095}
96
Kate Stoneb9c1b512016-09-06 20:57:50 +000097bool SBEvent::BroadcasterMatchesPtr(const SBBroadcaster *broadcaster) {
98 if (broadcaster)
99 return BroadcasterMatchesRef(*broadcaster);
100 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000101}
102
Kate Stoneb9c1b512016-09-06 20:57:50 +0000103bool SBEvent::BroadcasterMatchesRef(const SBBroadcaster &broadcaster) {
104
105 Event *lldb_event = get();
106 bool success = false;
107 if (lldb_event)
108 success = lldb_event->BroadcasterIs(broadcaster.get());
109
110 // For logging, this gets a little chatty so only enable this when verbose
111 // logging is on
112 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API |
113 LIBLLDB_LOG_VERBOSE));
114 if (log)
115 log->Printf(
116 "SBEvent(%p)::BroadcasterMatchesRef (SBBroadcaster(%p): %s) => %i",
117 static_cast<void *>(get()), static_cast<void *>(broadcaster.get()),
118 broadcaster.GetName(), success);
119
120 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000121}
122
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123void SBEvent::Clear() {
124 Event *lldb_event = get();
125 if (lldb_event)
126 lldb_event->Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000127}
128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129EventSP &SBEvent::GetSP() const { return m_event_sp; }
130
131Event *SBEvent::get() const {
132 // There is a dangerous accessor call GetSharedPtr which can be used, so if
133 // we have anything valid in m_event_sp, we must use that since if it gets
134 // used by a function that puts something in there, then it won't update
135 // m_opaque_ptr...
136 if (m_event_sp)
Greg Claytonefabb122010-11-05 23:17:00 +0000137 m_opaque_ptr = m_event_sp.get();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000138
139 return m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000140}
141
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142void SBEvent::reset(EventSP &event_sp) {
143 m_event_sp = event_sp;
144 m_opaque_ptr = m_event_sp.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000145}
146
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147void SBEvent::reset(Event *event_ptr) {
148 m_opaque_ptr = event_ptr;
149 m_event_sp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000150}
151
Kate Stoneb9c1b512016-09-06 20:57:50 +0000152bool SBEvent::IsValid() const {
153 // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get()
154 // accessor. See comments in SBEvent::get()....
155 return SBEvent::get() != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000156}
157
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158const char *SBEvent::GetCStringFromEvent(const SBEvent &event) {
159 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000160
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161 if (log)
162 log->Printf("SBEvent(%p)::GetCStringFromEvent () => \"%s\"",
163 static_cast<void *>(event.get()),
164 reinterpret_cast<const char *>(
165 EventDataBytes::GetBytesFromEvent(event.get())));
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000166
Kate Stoneb9c1b512016-09-06 20:57:50 +0000167 return reinterpret_cast<const char *>(
168 EventDataBytes::GetBytesFromEvent(event.get()));
Caroline Ticedde9cff2010-09-20 05:20:02 +0000169}
Caroline Ticeceb6b132010-10-26 03:11:13 +0000170
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171bool SBEvent::GetDescription(SBStream &description) {
172 Stream &strm = description.ref();
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000173
Kate Stoneb9c1b512016-09-06 20:57:50 +0000174 if (get()) {
175 m_opaque_ptr->Dump(&strm);
176 } else
177 strm.PutCString("No value");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000178
Kate Stoneb9c1b512016-09-06 20:57:50 +0000179 return true;
180}
181
182bool SBEvent::GetDescription(SBStream &description) const {
183 Stream &strm = description.ref();
184
185 if (get()) {
186 m_opaque_ptr->Dump(&strm);
187 } else
188 strm.PutCString("No value");
189
190 return true;
Caroline Ticeceb6b132010-10-26 03:11:13 +0000191}