brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · aab4ddd Raw
217 lines · cpp
1//===-- SBError.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/SBError.h"10#include "Utils.h"11#include "lldb/API/SBStream.h"12#include "lldb/API/SBStructuredData.h"13#include "lldb/Core/StructuredDataImpl.h"14#include "lldb/Utility/Instrumentation.h"15#include "lldb/Utility/Status.h"16#include "lldb/Utility/VASPrintf.h"17 18#include <cstdarg>19 20using namespace lldb;21using namespace lldb_private;22 23SBError::SBError() { LLDB_INSTRUMENT_VA(this); }24 25SBError::SBError(const SBError &rhs) {26  LLDB_INSTRUMENT_VA(this, rhs);27 28  if (rhs.m_opaque_up)29    m_opaque_up = std::make_unique<Status>(rhs.m_opaque_up->Clone());30}31 32SBError::SBError(const char *message) {33  LLDB_INSTRUMENT_VA(this, message);34 35  SetErrorString(message);36}37 38SBError::SBError(lldb_private::Status &&status)39    : m_opaque_up(new Status(std::move(status))) {40  LLDB_INSTRUMENT_VA(this, status);41}42 43SBError::~SBError() = default;44 45const SBError &SBError::operator=(const SBError &rhs) {46  LLDB_INSTRUMENT_VA(this, rhs);47 48  if (this != &rhs)49    if (rhs.m_opaque_up)50      m_opaque_up = std::make_unique<Status>(rhs.m_opaque_up->Clone());51 52  return *this;53}54 55const char *SBError::GetCString() const {56  LLDB_INSTRUMENT_VA(this);57 58  if (m_opaque_up)59    return m_opaque_up->AsCString();60  return nullptr;61}62 63void SBError::Clear() {64  LLDB_INSTRUMENT_VA(this);65 66  if (m_opaque_up)67    m_opaque_up->Clear();68}69 70bool SBError::Fail() const {71  LLDB_INSTRUMENT_VA(this);72 73  bool ret_value = false;74  if (m_opaque_up)75    ret_value = m_opaque_up->Fail();76 77 78  return ret_value;79}80 81bool SBError::Success() const {82  LLDB_INSTRUMENT_VA(this);83 84  bool ret_value = true;85  if (m_opaque_up)86    ret_value = m_opaque_up->Success();87 88  return ret_value;89}90 91uint32_t SBError::GetError() const {92  LLDB_INSTRUMENT_VA(this);93 94  uint32_t err = 0;95  if (m_opaque_up)96    err = m_opaque_up->GetError();97 98 99  return err;100}101 102SBStructuredData SBError::GetErrorData() const {103  LLDB_INSTRUMENT_VA(this);104 105  SBStructuredData sb_data;106  if (!m_opaque_up)107    return sb_data;108 109  StructuredData::ObjectSP data(m_opaque_up->GetAsStructuredData());110  sb_data.m_impl_up->SetObjectSP(data);111  return sb_data;112}113 114ErrorType SBError::GetType() const {115  LLDB_INSTRUMENT_VA(this);116 117  ErrorType err_type = eErrorTypeInvalid;118  if (m_opaque_up)119    err_type = m_opaque_up->GetType();120 121  return err_type;122}123 124void SBError::SetError(uint32_t err, ErrorType type) {125  LLDB_INSTRUMENT_VA(this, err, type);126 127  CreateIfNeeded();128  *m_opaque_up = Status(err, type);129}130 131void SBError::SetError(Status &&lldb_error) {132  CreateIfNeeded();133  *m_opaque_up = std::move(lldb_error);134}135 136void SBError::SetErrorToErrno() {137  LLDB_INSTRUMENT_VA(this);138 139  CreateIfNeeded();140  *m_opaque_up = Status::FromErrno();141}142 143void SBError::SetErrorToGenericError() {144  LLDB_INSTRUMENT_VA(this);145 146  CreateIfNeeded();147  *m_opaque_up = Status(std::string("generic error"));148}149 150void SBError::SetErrorString(const char *err_str) {151  LLDB_INSTRUMENT_VA(this, err_str);152 153  CreateIfNeeded();154  *m_opaque_up = Status::FromErrorString(err_str);155}156 157int SBError::SetErrorStringWithFormat(const char *format, ...) {158  CreateIfNeeded();159  std::string string;160  va_list args;161  va_start(args, format);162  if (format != nullptr && format[0]) {163    llvm::SmallString<1024> buf;164    VASprintf(buf, format, args);165    string = std::string(buf.str());166    *m_opaque_up = Status(std::move(string));167  }168  va_end(args);169  return string.size();170}171 172bool SBError::IsValid() const {173  LLDB_INSTRUMENT_VA(this);174  return this->operator bool();175}176SBError::operator bool() const {177  LLDB_INSTRUMENT_VA(this);178 179  return m_opaque_up != nullptr;180}181 182void SBError::CreateIfNeeded() {183  if (m_opaque_up == nullptr)184    m_opaque_up = std::make_unique<Status>();185}186 187lldb_private::Status *SBError::operator->() { return m_opaque_up.get(); }188 189lldb_private::Status *SBError::get() { return m_opaque_up.get(); }190 191lldb_private::Status &SBError::ref() {192  CreateIfNeeded();193  return *m_opaque_up;194}195 196const lldb_private::Status &SBError::operator*() const {197  // Be sure to call "IsValid()" before calling this function or it will crash198  return *m_opaque_up;199}200 201bool SBError::GetDescription(SBStream &description) {202  LLDB_INSTRUMENT_VA(this, description);203 204  if (m_opaque_up) {205    if (m_opaque_up->Success())206      description.Printf("success");207    else {208      const char *err_string = GetCString();209      description.Printf("error: %s",210                         (err_string != nullptr ? err_string : ""));211    }212  } else213    description.Printf("error: <NULL>");214 215  return true;216}217