130fdc8d8SChris Lattner //===-- SBEvent.cpp ---------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1093a64300SDaniel Malea #include "lldb/lldb-python.h" 1193a64300SDaniel Malea 124c5de699SEli Friedman #include "lldb/API/SBEvent.h" 134c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 1530fdc8d8SChris Lattner 1630fdc8d8SChris Lattner #include "lldb/Core/Event.h" 1730fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 1830fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 1930fdc8d8SChris Lattner #include "lldb/Core/ConstString.h" 2030fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2130fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h" 2230fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h" 2330fdc8d8SChris Lattner 2430fdc8d8SChris Lattner using namespace lldb; 2530fdc8d8SChris Lattner using namespace lldb_private; 2630fdc8d8SChris Lattner 2730fdc8d8SChris Lattner 2830fdc8d8SChris Lattner SBEvent::SBEvent () : 2930fdc8d8SChris Lattner m_event_sp (), 30efabb123SGreg Clayton m_opaque_ptr (NULL) 3130fdc8d8SChris Lattner { 3230fdc8d8SChris Lattner } 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner SBEvent::SBEvent (uint32_t event_type, const char *cstr, uint32_t cstr_len) : 3530fdc8d8SChris Lattner m_event_sp (new Event (event_type, new EventDataBytes (cstr, cstr_len))), 36efabb123SGreg Clayton m_opaque_ptr (m_event_sp.get()) 3730fdc8d8SChris Lattner { 3830fdc8d8SChris Lattner } 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner SBEvent::SBEvent (EventSP &event_sp) : 4130fdc8d8SChris Lattner m_event_sp (event_sp), 42efabb123SGreg Clayton m_opaque_ptr (event_sp.get()) 4330fdc8d8SChris Lattner { 4430fdc8d8SChris Lattner } 4530fdc8d8SChris Lattner 46*2bdbfd50SJim Ingham SBEvent::SBEvent (Event *event_ptr) : 47*2bdbfd50SJim Ingham m_event_sp (), 48*2bdbfd50SJim Ingham m_opaque_ptr (event_ptr) 49*2bdbfd50SJim Ingham { 50*2bdbfd50SJim Ingham } 51*2bdbfd50SJim Ingham 52efabb123SGreg Clayton SBEvent::SBEvent (const SBEvent &rhs) : 53efabb123SGreg Clayton m_event_sp (rhs.m_event_sp), 54efabb123SGreg Clayton m_opaque_ptr (rhs.m_opaque_ptr) 55efabb123SGreg Clayton { 56efabb123SGreg Clayton 57efabb123SGreg Clayton } 58efabb123SGreg Clayton 59efabb123SGreg Clayton const SBEvent & 60efabb123SGreg Clayton SBEvent::operator = (const SBEvent &rhs) 61efabb123SGreg Clayton { 62efabb123SGreg Clayton if (this != &rhs) 63efabb123SGreg Clayton { 64efabb123SGreg Clayton m_event_sp = rhs.m_event_sp; 65efabb123SGreg Clayton m_opaque_ptr = rhs.m_opaque_ptr; 66efabb123SGreg Clayton } 67efabb123SGreg Clayton return *this; 68efabb123SGreg Clayton } 69efabb123SGreg Clayton 7030fdc8d8SChris Lattner SBEvent::~SBEvent() 7130fdc8d8SChris Lattner { 7230fdc8d8SChris Lattner } 7330fdc8d8SChris Lattner 7430fdc8d8SChris Lattner const char * 7530fdc8d8SChris Lattner SBEvent::GetDataFlavor () 7630fdc8d8SChris Lattner { 776611103cSGreg Clayton Event *lldb_event = get(); 7830fdc8d8SChris Lattner if (lldb_event) 79920c696cSGreg Clayton { 80920c696cSGreg Clayton EventData *event_data = lldb_event->GetData(); 81920c696cSGreg Clayton if (event_data) 8230fdc8d8SChris Lattner return lldb_event->GetData()->GetFlavor().AsCString(); 83920c696cSGreg Clayton } 8430fdc8d8SChris Lattner return NULL; 8530fdc8d8SChris Lattner } 8630fdc8d8SChris Lattner 8730fdc8d8SChris Lattner uint32_t 8830fdc8d8SChris Lattner SBEvent::GetType () const 8930fdc8d8SChris Lattner { 905160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 91ceb6b139SCaroline Tice 926611103cSGreg Clayton const Event *lldb_event = get(); 93ceb6b139SCaroline Tice uint32_t event_type = 0; 9430fdc8d8SChris Lattner if (lldb_event) 95ceb6b139SCaroline Tice event_type = lldb_event->GetType(); 96ceb6b139SCaroline Tice 97ceb6b139SCaroline Tice if (log) 98cfd1acedSGreg Clayton { 99cfd1acedSGreg Clayton StreamString sstr; 100cfd1acedSGreg Clayton if (lldb_event && lldb_event->GetBroadcaster() && lldb_event->GetBroadcaster()->GetEventNames(sstr, event_type, true)) 101324a1036SSaleem Abdulrasool log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x (%s)", 102324a1036SSaleem Abdulrasool static_cast<void*>(get()), event_type, sstr.GetData()); 103cfd1acedSGreg Clayton else 104324a1036SSaleem Abdulrasool log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x", 105324a1036SSaleem Abdulrasool static_cast<void*>(get()), event_type); 106ceb6b139SCaroline Tice 107cfd1acedSGreg Clayton } 108cfd1acedSGreg Clayton 109ceb6b139SCaroline Tice return event_type; 11030fdc8d8SChris Lattner } 11130fdc8d8SChris Lattner 11230fdc8d8SChris Lattner SBBroadcaster 11330fdc8d8SChris Lattner SBEvent::GetBroadcaster () const 11430fdc8d8SChris Lattner { 11530fdc8d8SChris Lattner SBBroadcaster broadcaster; 1166611103cSGreg Clayton const Event *lldb_event = get(); 11730fdc8d8SChris Lattner if (lldb_event) 1186611103cSGreg Clayton broadcaster.reset (lldb_event->GetBroadcaster(), false); 11930fdc8d8SChris Lattner return broadcaster; 12030fdc8d8SChris Lattner } 12130fdc8d8SChris Lattner 1224bddaeb5SJim Ingham const char * 1234bddaeb5SJim Ingham SBEvent::GetBroadcasterClass () const 1244bddaeb5SJim Ingham { 1254bddaeb5SJim Ingham const Event *lldb_event = get(); 1264bddaeb5SJim Ingham if (lldb_event) 1274bddaeb5SJim Ingham return lldb_event->GetBroadcaster()->GetBroadcasterClass().AsCString(); 1284bddaeb5SJim Ingham else 1294bddaeb5SJim Ingham return "unknown class"; 1304bddaeb5SJim Ingham } 1314bddaeb5SJim Ingham 13230fdc8d8SChris Lattner bool 13330fdc8d8SChris Lattner SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster) 13430fdc8d8SChris Lattner { 13530fdc8d8SChris Lattner if (broadcaster) 136cfd1acedSGreg Clayton return BroadcasterMatchesRef (*broadcaster); 13730fdc8d8SChris Lattner return false; 13830fdc8d8SChris Lattner } 13930fdc8d8SChris Lattner 14030fdc8d8SChris Lattner bool 14130fdc8d8SChris Lattner SBEvent::BroadcasterMatchesRef (const SBBroadcaster &broadcaster) 14230fdc8d8SChris Lattner { 143ceb6b139SCaroline Tice 1446611103cSGreg Clayton Event *lldb_event = get(); 145ceb6b139SCaroline Tice bool success = false; 14630fdc8d8SChris Lattner if (lldb_event) 147ceb6b139SCaroline Tice success = lldb_event->BroadcasterIs (broadcaster.get()); 148ceb6b139SCaroline Tice 149cfd1acedSGreg Clayton // For logging, this gets a little chatty so only enable this when verbose logging is on 1505160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE)); 151ceb6b139SCaroline Tice if (log) 152cfd1acedSGreg Clayton log->Printf ("SBEvent(%p)::BroadcasterMatchesRef (SBBroadcaster(%p): %s) => %i", 153324a1036SSaleem Abdulrasool static_cast<void*>(get()), 154324a1036SSaleem Abdulrasool static_cast<void*>(broadcaster.get()), 155324a1036SSaleem Abdulrasool broadcaster.GetName(), success); 156ceb6b139SCaroline Tice 157ceb6b139SCaroline Tice return success; 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner 16030fdc8d8SChris Lattner void 16130fdc8d8SChris Lattner SBEvent::Clear() 16230fdc8d8SChris Lattner { 1636611103cSGreg Clayton Event *lldb_event = get(); 16430fdc8d8SChris Lattner if (lldb_event) 16530fdc8d8SChris Lattner lldb_event->Clear(); 16630fdc8d8SChris Lattner } 16730fdc8d8SChris Lattner 16830fdc8d8SChris Lattner EventSP & 1696611103cSGreg Clayton SBEvent::GetSP () const 17030fdc8d8SChris Lattner { 17130fdc8d8SChris Lattner return m_event_sp; 17230fdc8d8SChris Lattner } 17330fdc8d8SChris Lattner 17430fdc8d8SChris Lattner Event * 1756611103cSGreg Clayton SBEvent::get() const 17630fdc8d8SChris Lattner { 17730fdc8d8SChris Lattner // There is a dangerous accessor call GetSharedPtr which can be used, so if 17830fdc8d8SChris Lattner // we have anything valid in m_event_sp, we must use that since if it gets 17930fdc8d8SChris Lattner // used by a function that puts something in there, then it won't update 180efabb123SGreg Clayton // m_opaque_ptr... 18130fdc8d8SChris Lattner if (m_event_sp) 182efabb123SGreg Clayton m_opaque_ptr = m_event_sp.get(); 18330fdc8d8SChris Lattner 184efabb123SGreg Clayton return m_opaque_ptr; 18530fdc8d8SChris Lattner } 18630fdc8d8SChris Lattner 18730fdc8d8SChris Lattner void 1886611103cSGreg Clayton SBEvent::reset (EventSP &event_sp) 18930fdc8d8SChris Lattner { 19030fdc8d8SChris Lattner m_event_sp = event_sp; 191efabb123SGreg Clayton m_opaque_ptr = m_event_sp.get(); 19230fdc8d8SChris Lattner } 19330fdc8d8SChris Lattner 19430fdc8d8SChris Lattner void 1956611103cSGreg Clayton SBEvent::reset (Event* event_ptr) 19630fdc8d8SChris Lattner { 197efabb123SGreg Clayton m_opaque_ptr = event_ptr; 19830fdc8d8SChris Lattner m_event_sp.reset(); 19930fdc8d8SChris Lattner } 20030fdc8d8SChris Lattner 20130fdc8d8SChris Lattner bool 20230fdc8d8SChris Lattner SBEvent::IsValid() const 20330fdc8d8SChris Lattner { 204efabb123SGreg Clayton // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get() 2056611103cSGreg Clayton // accessor. See comments in SBEvent::get().... 2066611103cSGreg Clayton return SBEvent::get() != NULL; 20730fdc8d8SChris Lattner 20830fdc8d8SChris Lattner } 20930fdc8d8SChris Lattner 21030fdc8d8SChris Lattner const char * 21130fdc8d8SChris Lattner SBEvent::GetCStringFromEvent (const SBEvent &event) 21230fdc8d8SChris Lattner { 2135160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 214ceb6b139SCaroline Tice 215ceb6b139SCaroline Tice if (log) 216cfd1acedSGreg Clayton log->Printf ("SBEvent(%p)::GetCStringFromEvent () => \"%s\"", 217324a1036SSaleem Abdulrasool static_cast<void*>(event.get()), 218ceb6b139SCaroline Tice reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get()))); 219ceb6b139SCaroline Tice 2206611103cSGreg Clayton return reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get())); 22130fdc8d8SChris Lattner } 22230fdc8d8SChris Lattner 22330fdc8d8SChris Lattner 224dde9cff3SCaroline Tice bool 225dde9cff3SCaroline Tice SBEvent::GetDescription (SBStream &description) 226dde9cff3SCaroline Tice { 227da7bc7d0SGreg Clayton Stream &strm = description.ref(); 228da7bc7d0SGreg Clayton 22993aa84e8SGreg Clayton if (get()) 230dde9cff3SCaroline Tice { 231da7bc7d0SGreg Clayton m_opaque_ptr->Dump (&strm); 232dde9cff3SCaroline Tice } 233dde9cff3SCaroline Tice else 234da7bc7d0SGreg Clayton strm.PutCString ("No value"); 235dde9cff3SCaroline Tice 236dde9cff3SCaroline Tice return true; 237dde9cff3SCaroline Tice } 238ceb6b139SCaroline Tice 239ceb6b139SCaroline Tice bool 240ceb6b139SCaroline Tice SBEvent::GetDescription (SBStream &description) const 241ceb6b139SCaroline Tice { 242da7bc7d0SGreg Clayton Stream &strm = description.ref(); 243da7bc7d0SGreg Clayton 24493aa84e8SGreg Clayton if (get()) 245ceb6b139SCaroline Tice { 246da7bc7d0SGreg Clayton m_opaque_ptr->Dump (&strm); 247ceb6b139SCaroline Tice } 248ceb6b139SCaroline Tice else 249da7bc7d0SGreg Clayton strm.PutCString ("No value"); 250ceb6b139SCaroline Tice 251ceb6b139SCaroline Tice return true; 252ceb6b139SCaroline Tice } 253