blob: c62c495b87c8ccd01a7f0b50ea9ac9bde77b4943 [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
Daniel Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Eli Friedman4c5de692010-06-09 07:44:37 +000012#include "lldb/API/SBEvent.h"
13#include "lldb/API/SBBroadcaster.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000014#include "lldb/API/SBStream.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015
16#include "lldb/Core/Event.h"
17#include "lldb/Core/Stream.h"
18#include "lldb/Core/StreamFile.h"
19#include "lldb/Core/ConstString.h"
20#include "lldb/Target/Process.h"
21#include "lldb/Breakpoint/Breakpoint.h"
22#include "lldb/Interpreter/CommandInterpreter.h"
23
24using namespace lldb;
25using namespace lldb_private;
26
27
28SBEvent::SBEvent () :
29 m_event_sp (),
Greg Claytonefabb122010-11-05 23:17:00 +000030 m_opaque_ptr (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031{
32}
33
34SBEvent::SBEvent (uint32_t event_type, const char *cstr, uint32_t cstr_len) :
35 m_event_sp (new Event (event_type, new EventDataBytes (cstr, cstr_len))),
Greg Claytonefabb122010-11-05 23:17:00 +000036 m_opaque_ptr (m_event_sp.get())
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037{
38}
39
40SBEvent::SBEvent (EventSP &event_sp) :
41 m_event_sp (event_sp),
Greg Claytonefabb122010-11-05 23:17:00 +000042 m_opaque_ptr (event_sp.get())
Chris Lattner30fdc8d2010-06-08 16:52:24 +000043{
44}
45
Jim Ingham2bdbfd52014-09-29 23:17:18 +000046SBEvent::SBEvent (Event *event_ptr) :
47 m_event_sp (),
48 m_opaque_ptr (event_ptr)
49{
50}
51
Greg Claytonefabb122010-11-05 23:17:00 +000052SBEvent::SBEvent (const SBEvent &rhs) :
53 m_event_sp (rhs.m_event_sp),
54 m_opaque_ptr (rhs.m_opaque_ptr)
55{
56
57}
58
59const SBEvent &
60SBEvent::operator = (const SBEvent &rhs)
61{
62 if (this != &rhs)
63 {
64 m_event_sp = rhs.m_event_sp;
65 m_opaque_ptr = rhs.m_opaque_ptr;
66 }
67 return *this;
68}
69
Chris Lattner30fdc8d2010-06-08 16:52:24 +000070SBEvent::~SBEvent()
71{
72}
73
Chris Lattner30fdc8d2010-06-08 16:52:24 +000074const char *
75SBEvent::GetDataFlavor ()
76{
Greg Clayton66111032010-06-23 01:19:29 +000077 Event *lldb_event = get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000078 if (lldb_event)
Greg Clayton920c6962010-12-05 19:21:02 +000079 {
80 EventData *event_data = lldb_event->GetData();
81 if (event_data)
82 return lldb_event->GetData()->GetFlavor().AsCString();
83 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000084 return NULL;
85}
86
87uint32_t
88SBEvent::GetType () const
89{
Greg Clayton5160ce52013-03-27 23:08:40 +000090 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000091
Greg Clayton66111032010-06-23 01:19:29 +000092 const Event *lldb_event = get();
Caroline Ticeceb6b132010-10-26 03:11:13 +000093 uint32_t event_type = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000094 if (lldb_event)
Caroline Ticeceb6b132010-10-26 03:11:13 +000095 event_type = lldb_event->GetType();
96
97 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +000098 {
99 StreamString sstr;
100 if (lldb_event && lldb_event->GetBroadcaster() && lldb_event->GetBroadcaster()->GetEventNames(sstr, event_type, true))
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000101 log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x (%s)",
102 static_cast<void*>(get()), event_type, sstr.GetData());
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000103 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000104 log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x",
105 static_cast<void*>(get()), event_type);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000106
107 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000108
109 return event_type;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000110}
111
112SBBroadcaster
113SBEvent::GetBroadcaster () const
114{
115 SBBroadcaster broadcaster;
Greg Clayton66111032010-06-23 01:19:29 +0000116 const Event *lldb_event = get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000117 if (lldb_event)
Greg Clayton66111032010-06-23 01:19:29 +0000118 broadcaster.reset (lldb_event->GetBroadcaster(), false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000119 return broadcaster;
120}
121
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000122const char *
123SBEvent::GetBroadcasterClass () const
124{
125 const Event *lldb_event = get();
126 if (lldb_event)
127 return lldb_event->GetBroadcaster()->GetBroadcasterClass().AsCString();
128 else
129 return "unknown class";
130}
131
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000132bool
133SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster)
134{
135 if (broadcaster)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000136 return BroadcasterMatchesRef (*broadcaster);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000137 return false;
138}
139
140bool
141SBEvent::BroadcasterMatchesRef (const SBBroadcaster &broadcaster)
142{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000143
Greg Clayton66111032010-06-23 01:19:29 +0000144 Event *lldb_event = get();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000145 bool success = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000146 if (lldb_event)
Caroline Ticeceb6b132010-10-26 03:11:13 +0000147 success = lldb_event->BroadcasterIs (broadcaster.get());
148
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000149 // For logging, this gets a little chatty so only enable this when verbose logging is on
Greg Clayton5160ce52013-03-27 23:08:40 +0000150 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000151 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000152 log->Printf ("SBEvent(%p)::BroadcasterMatchesRef (SBBroadcaster(%p): %s) => %i",
153 static_cast<void*>(get()),
154 static_cast<void*>(broadcaster.get()),
155 broadcaster.GetName(), success);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000156
157 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000158}
159
160void
161SBEvent::Clear()
162{
Greg Clayton66111032010-06-23 01:19:29 +0000163 Event *lldb_event = get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000164 if (lldb_event)
165 lldb_event->Clear();
166}
167
168EventSP &
Greg Clayton66111032010-06-23 01:19:29 +0000169SBEvent::GetSP () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000170{
171 return m_event_sp;
172}
173
174Event *
Greg Clayton66111032010-06-23 01:19:29 +0000175SBEvent::get() const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000176{
177 // There is a dangerous accessor call GetSharedPtr which can be used, so if
178 // we have anything valid in m_event_sp, we must use that since if it gets
179 // used by a function that puts something in there, then it won't update
Greg Claytonefabb122010-11-05 23:17:00 +0000180 // m_opaque_ptr...
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000181 if (m_event_sp)
Greg Claytonefabb122010-11-05 23:17:00 +0000182 m_opaque_ptr = m_event_sp.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000183
Greg Claytonefabb122010-11-05 23:17:00 +0000184 return m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000185}
186
187void
Greg Clayton66111032010-06-23 01:19:29 +0000188SBEvent::reset (EventSP &event_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000189{
190 m_event_sp = event_sp;
Greg Claytonefabb122010-11-05 23:17:00 +0000191 m_opaque_ptr = m_event_sp.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000192}
193
194void
Greg Clayton66111032010-06-23 01:19:29 +0000195SBEvent::reset (Event* event_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000196{
Greg Claytonefabb122010-11-05 23:17:00 +0000197 m_opaque_ptr = event_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000198 m_event_sp.reset();
199}
200
201bool
202SBEvent::IsValid() const
203{
Greg Claytonefabb122010-11-05 23:17:00 +0000204 // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get()
Greg Clayton66111032010-06-23 01:19:29 +0000205 // accessor. See comments in SBEvent::get()....
206 return SBEvent::get() != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000207
208}
209
210const char *
211SBEvent::GetCStringFromEvent (const SBEvent &event)
212{
Greg Clayton5160ce52013-03-27 23:08:40 +0000213 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000214
215 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000216 log->Printf ("SBEvent(%p)::GetCStringFromEvent () => \"%s\"",
217 static_cast<void*>(event.get()),
Caroline Ticeceb6b132010-10-26 03:11:13 +0000218 reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get())));
219
Greg Clayton66111032010-06-23 01:19:29 +0000220 return reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000221}
222
223
Caroline Ticedde9cff2010-09-20 05:20:02 +0000224bool
225SBEvent::GetDescription (SBStream &description)
226{
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000227 Stream &strm = description.ref();
228
Greg Clayton93aa84e2010-10-29 04:59:35 +0000229 if (get())
Caroline Tice201a8852010-09-20 16:21:41 +0000230 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000231 m_opaque_ptr->Dump (&strm);
Caroline Tice201a8852010-09-20 16:21:41 +0000232 }
Caroline Ticedde9cff2010-09-20 05:20:02 +0000233 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000234 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +0000235
236 return true;
237}
Caroline Ticeceb6b132010-10-26 03:11:13 +0000238
239bool
240SBEvent::GetDescription (SBStream &description) const
241{
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000242 Stream &strm = description.ref();
243
Greg Clayton93aa84e2010-10-29 04:59:35 +0000244 if (get())
Caroline Ticeceb6b132010-10-26 03:11:13 +0000245 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000246 m_opaque_ptr->Dump (&strm);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000247 }
248 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000249 strm.PutCString ("No value");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000250
251 return true;
252}