brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.9 KiB · aa9c0ff Raw
200 lines · cpp
1//===-- SBEvent.cpp -------------------------------------------------------===//2//3// 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-exception6//7//===----------------------------------------------------------------------===//8 9#include "lldb/API/SBEvent.h"10#include "lldb/API/SBBroadcaster.h"11#include "lldb/API/SBStream.h"12#include "lldb/Utility/Instrumentation.h"13 14#include "lldb/Breakpoint/Breakpoint.h"15#include "lldb/Interpreter/CommandInterpreter.h"16#include "lldb/Target/Process.h"17#include "lldb/Utility/ConstString.h"18#include "lldb/Utility/Event.h"19#include "lldb/Utility/Stream.h"20 21using namespace lldb;22using namespace lldb_private;23 24SBEvent::SBEvent() { LLDB_INSTRUMENT_VA(this); }25 26SBEvent::SBEvent(uint32_t event_type, const char *cstr, uint32_t cstr_len)27    : m_event_sp(new Event(28          event_type, new EventDataBytes(llvm::StringRef(cstr, cstr_len)))),29      m_opaque_ptr(m_event_sp.get()) {30  LLDB_INSTRUMENT_VA(this, event_type, cstr, cstr_len);31}32 33SBEvent::SBEvent(EventSP &event_sp)34    : m_event_sp(event_sp), m_opaque_ptr(event_sp.get()) {35  LLDB_INSTRUMENT_VA(this, event_sp);36}37 38SBEvent::SBEvent(Event *event_ptr) : m_opaque_ptr(event_ptr) {39  LLDB_INSTRUMENT_VA(this, event_ptr);40}41 42SBEvent::SBEvent(const SBEvent &rhs)43    : m_event_sp(rhs.m_event_sp), m_opaque_ptr(rhs.m_opaque_ptr) {44  LLDB_INSTRUMENT_VA(this, rhs);45}46 47const SBEvent &SBEvent::operator=(const SBEvent &rhs) {48  LLDB_INSTRUMENT_VA(this, rhs);49 50  if (this != &rhs) {51    m_event_sp = rhs.m_event_sp;52    m_opaque_ptr = rhs.m_opaque_ptr;53  }54  return *this;55}56 57SBEvent::~SBEvent() = default;58 59const char *SBEvent::GetDataFlavor() {60  LLDB_INSTRUMENT_VA(this);61 62  Event *lldb_event = get();63  if (lldb_event) {64    EventData *event_data = lldb_event->GetData();65    if (event_data)66      return ConstString(lldb_event->GetData()->GetFlavor()).GetCString();67  }68  return nullptr;69}70 71uint32_t SBEvent::GetType() const {72  LLDB_INSTRUMENT_VA(this);73 74  const Event *lldb_event = get();75  uint32_t event_type = 0;76  if (lldb_event)77    event_type = lldb_event->GetType();78 79 80  return event_type;81}82 83SBBroadcaster SBEvent::GetBroadcaster() const {84  LLDB_INSTRUMENT_VA(this);85 86  SBBroadcaster broadcaster;87  const Event *lldb_event = get();88  if (lldb_event)89    broadcaster.reset(lldb_event->GetBroadcaster(), false);90  return broadcaster;91}92 93const char *SBEvent::GetBroadcasterClass() const {94  LLDB_INSTRUMENT_VA(this);95 96  const Event *lldb_event = get();97  if (lldb_event)98    return ConstString(lldb_event->GetBroadcaster()->GetBroadcasterClass())99        .AsCString();100  else101    return "unknown class";102}103 104bool SBEvent::BroadcasterMatchesPtr(const SBBroadcaster *broadcaster) {105  LLDB_INSTRUMENT_VA(this, broadcaster);106 107  if (broadcaster)108    return BroadcasterMatchesRef(*broadcaster);109  return false;110}111 112bool SBEvent::BroadcasterMatchesRef(const SBBroadcaster &broadcaster) {113  LLDB_INSTRUMENT_VA(this, broadcaster);114 115  Event *lldb_event = get();116  bool success = false;117  if (lldb_event)118    success = lldb_event->BroadcasterIs(broadcaster.get());119 120 121  return success;122}123 124void SBEvent::Clear() {125  LLDB_INSTRUMENT_VA(this);126 127  Event *lldb_event = get();128  if (lldb_event)129    lldb_event->Clear();130}131 132EventSP &SBEvent::GetSP() const { return m_event_sp; }133 134Event *SBEvent::get() const {135  // There is a dangerous accessor call GetSharedPtr which can be used, so if136  // we have anything valid in m_event_sp, we must use that since if it gets137  // used by a function that puts something in there, then it won't update138  // m_opaque_ptr...139  if (m_event_sp)140    m_opaque_ptr = m_event_sp.get();141 142  return m_opaque_ptr;143}144 145void SBEvent::reset(EventSP &event_sp) {146  m_event_sp = event_sp;147  m_opaque_ptr = m_event_sp.get();148}149 150void SBEvent::reset(Event *event_ptr) {151  m_opaque_ptr = event_ptr;152  m_event_sp.reset();153}154 155bool SBEvent::IsValid() const {156  LLDB_INSTRUMENT_VA(this);157  return this->operator bool();158}159SBEvent::operator bool() const {160  LLDB_INSTRUMENT_VA(this);161 162  // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get() accessor.163  // See comments in SBEvent::get()....164  return SBEvent::get() != nullptr;165}166 167const char *SBEvent::GetCStringFromEvent(const SBEvent &event) {168  LLDB_INSTRUMENT_VA(event);169 170  return ConstString(static_cast<const char *>(171                         EventDataBytes::GetBytesFromEvent(event.get())))172      .GetCString();173}174 175bool SBEvent::GetDescription(SBStream &description) {176  LLDB_INSTRUMENT_VA(this, description);177 178  Stream &strm = description.ref();179 180  if (get()) {181    m_opaque_ptr->Dump(&strm);182  } else183    strm.PutCString("No value");184 185  return true;186}187 188bool SBEvent::GetDescription(SBStream &description) const {189  LLDB_INSTRUMENT_VA(this, description);190 191  Stream &strm = description.ref();192 193  if (get()) {194    m_opaque_ptr->Dump(&strm);195  } else196    strm.PutCString("No value");197 198  return true;199}200