brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.9 KiB · 5ebc884 Raw
198 lines · cpp
1//===-- SBTypeSynthetic.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/SBTypeSynthetic.h"10#include "lldb/Utility/Instrumentation.h"11 12#include "lldb/API/SBStream.h"13 14#include "lldb/DataFormatters/DataVisualization.h"15 16using namespace lldb;17using namespace lldb_private;18 19SBTypeSynthetic::SBTypeSynthetic() { LLDB_INSTRUMENT_VA(this); }20 21SBTypeSynthetic SBTypeSynthetic::CreateWithClassName(const char *data,22                                                     uint32_t options) {23  LLDB_INSTRUMENT_VA(data, options);24 25  if (!data || data[0] == 0)26    return SBTypeSynthetic();27  return SBTypeSynthetic(28      std::make_shared<ScriptedSyntheticChildren>(options, data, ""));29}30 31SBTypeSynthetic SBTypeSynthetic::CreateWithScriptCode(const char *data,32                                                      uint32_t options) {33  LLDB_INSTRUMENT_VA(data, options);34 35  if (!data || data[0] == 0)36    return SBTypeSynthetic();37  return SBTypeSynthetic(38      std::make_shared<ScriptedSyntheticChildren>(options, "", data));39}40 41SBTypeSynthetic::SBTypeSynthetic(const lldb::SBTypeSynthetic &rhs)42    : m_opaque_sp(rhs.m_opaque_sp) {43  LLDB_INSTRUMENT_VA(this, rhs);44}45 46SBTypeSynthetic::~SBTypeSynthetic() = default;47 48bool SBTypeSynthetic::IsValid() const {49  LLDB_INSTRUMENT_VA(this);50  return this->operator bool();51}52SBTypeSynthetic::operator bool() const {53  LLDB_INSTRUMENT_VA(this);54 55  return m_opaque_sp.get() != nullptr;56}57 58bool SBTypeSynthetic::IsClassCode() {59  LLDB_INSTRUMENT_VA(this);60 61  if (!IsValid())62    return false;63  const char *code = m_opaque_sp->GetPythonCode();64  return (code && *code);65}66 67bool SBTypeSynthetic::IsClassName() {68  LLDB_INSTRUMENT_VA(this);69 70  if (!IsValid())71    return false;72  return !IsClassCode();73}74 75const char *SBTypeSynthetic::GetData() {76  LLDB_INSTRUMENT_VA(this);77 78  if (!IsValid())79    return nullptr;80  if (IsClassCode())81    return ConstString(m_opaque_sp->GetPythonCode()).GetCString();82 83  return ConstString(m_opaque_sp->GetPythonClassName()).GetCString();84}85 86void SBTypeSynthetic::SetClassName(const char *data) {87  LLDB_INSTRUMENT_VA(this, data);88 89  if (IsValid() && data && *data)90    m_opaque_sp->SetPythonClassName(data);91}92 93void SBTypeSynthetic::SetClassCode(const char *data) {94  LLDB_INSTRUMENT_VA(this, data);95 96  if (IsValid() && data && *data)97    m_opaque_sp->SetPythonCode(data);98}99 100uint32_t SBTypeSynthetic::GetOptions() {101  LLDB_INSTRUMENT_VA(this);102 103  if (!IsValid())104    return lldb::eTypeOptionNone;105  return m_opaque_sp->GetOptions();106}107 108void SBTypeSynthetic::SetOptions(uint32_t value) {109  LLDB_INSTRUMENT_VA(this, value);110 111  if (!CopyOnWrite_Impl())112    return;113  m_opaque_sp->SetOptions(value);114}115 116bool SBTypeSynthetic::GetDescription(lldb::SBStream &description,117                                     lldb::DescriptionLevel description_level) {118  LLDB_INSTRUMENT_VA(this, description, description_level);119 120  if (m_opaque_sp) {121    description.Printf("%s\n", m_opaque_sp->GetDescription().c_str());122    return true;123  }124  return false;125}126 127lldb::SBTypeSynthetic &SBTypeSynthetic::128operator=(const lldb::SBTypeSynthetic &rhs) {129  LLDB_INSTRUMENT_VA(this, rhs);130 131  if (this != &rhs) {132    m_opaque_sp = rhs.m_opaque_sp;133  }134  return *this;135}136 137bool SBTypeSynthetic::operator==(lldb::SBTypeSynthetic &rhs) {138  LLDB_INSTRUMENT_VA(this, rhs);139 140  if (!IsValid())141    return !rhs.IsValid();142  return m_opaque_sp == rhs.m_opaque_sp;143}144 145bool SBTypeSynthetic::IsEqualTo(lldb::SBTypeSynthetic &rhs) {146  LLDB_INSTRUMENT_VA(this, rhs);147 148  if (!IsValid())149    return !rhs.IsValid();150 151  if (m_opaque_sp->IsScripted() != rhs.m_opaque_sp->IsScripted())152    return false;153 154  if (IsClassCode() != rhs.IsClassCode())155    return false;156 157  if (strcmp(GetData(), rhs.GetData()))158    return false;159 160  return GetOptions() == rhs.GetOptions();161}162 163bool SBTypeSynthetic::operator!=(lldb::SBTypeSynthetic &rhs) {164  LLDB_INSTRUMENT_VA(this, rhs);165 166  if (!IsValid())167    return !rhs.IsValid();168  return m_opaque_sp != rhs.m_opaque_sp;169}170 171lldb::ScriptedSyntheticChildrenSP SBTypeSynthetic::GetSP() {172  return m_opaque_sp;173}174 175void SBTypeSynthetic::SetSP(176    const lldb::ScriptedSyntheticChildrenSP &TypeSynthetic_impl_sp) {177  m_opaque_sp = TypeSynthetic_impl_sp;178}179 180SBTypeSynthetic::SBTypeSynthetic(181    const lldb::ScriptedSyntheticChildrenSP &TypeSynthetic_impl_sp)182    : m_opaque_sp(TypeSynthetic_impl_sp) {}183 184bool SBTypeSynthetic::CopyOnWrite_Impl() {185  if (!IsValid())186    return false;187  if (m_opaque_sp.use_count() == 1)188    return true;189 190  ScriptedSyntheticChildrenSP new_sp(new ScriptedSyntheticChildren(191      m_opaque_sp->GetOptions(), m_opaque_sp->GetPythonClassName(),192      m_opaque_sp->GetPythonCode()));193 194  SetSP(new_sp);195 196  return true;197}198