130fdc8d8SChris Lattner //===-- SBError.cpp ---------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 930fdc8d8SChris Lattner #include "lldb/API/SBError.h" 10baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 11bd4bf82aSJonas Devlieghere #include "Utils.h" 12dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 1397206d57SZachary Turner #include "lldb/Utility/Status.h" 14dde9cff3SCaroline Tice 159c68da97SEli Friedman #include <stdarg.h> 1630fdc8d8SChris Lattner 1730fdc8d8SChris Lattner using namespace lldb; 1830fdc8d8SChris Lattner using namespace lldb_private; 1930fdc8d8SChris Lattner 20baf5664fSJonas Devlieghere SBError::SBError() : m_opaque_up() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBError); } 2130fdc8d8SChris Lattner 22d5b44036SJonas Devlieghere SBError::SBError(const SBError &rhs) : m_opaque_up() { 23baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBError, (const lldb::SBError &), rhs); 24baf5664fSJonas Devlieghere 25bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 2630fdc8d8SChris Lattner } 2730fdc8d8SChris Lattner 28b9c1b51eSKate Stone SBError::~SBError() {} 2930fdc8d8SChris Lattner 30b9c1b51eSKate Stone const SBError &SBError::operator=(const SBError &rhs) { 31baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBError &, 32baf5664fSJonas Devlieghere SBError, operator=,(const lldb::SBError &), rhs); 33baf5664fSJonas Devlieghere 34bd4bf82aSJonas Devlieghere if (this != &rhs) 35bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 36*306809f2SJonas Devlieghere return LLDB_RECORD_RESULT(*this); 3730fdc8d8SChris Lattner } 3830fdc8d8SChris Lattner 39b9c1b51eSKate Stone const char *SBError::GetCString() const { 40baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBError, GetCString); 41baf5664fSJonas Devlieghere 42d5b44036SJonas Devlieghere if (m_opaque_up) 43d5b44036SJonas Devlieghere return m_opaque_up->AsCString(); 4430fdc8d8SChris Lattner return NULL; 4530fdc8d8SChris Lattner } 4630fdc8d8SChris Lattner 47b9c1b51eSKate Stone void SBError::Clear() { 48baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBError, Clear); 49baf5664fSJonas Devlieghere 50d5b44036SJonas Devlieghere if (m_opaque_up) 51d5b44036SJonas Devlieghere m_opaque_up->Clear(); 5230fdc8d8SChris Lattner } 5330fdc8d8SChris Lattner 54b9c1b51eSKate Stone bool SBError::Fail() const { 55baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, Fail); 56baf5664fSJonas Devlieghere 57ceb6b139SCaroline Tice bool ret_value = false; 58d5b44036SJonas Devlieghere if (m_opaque_up) 59d5b44036SJonas Devlieghere ret_value = m_opaque_up->Fail(); 60ceb6b139SCaroline Tice 61ceb6b139SCaroline Tice 62ceb6b139SCaroline Tice return ret_value; 6330fdc8d8SChris Lattner } 6430fdc8d8SChris Lattner 65b9c1b51eSKate Stone bool SBError::Success() const { 66baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, Success); 67baf5664fSJonas Devlieghere 6816e0c686SJim Ingham bool ret_value = true; 69d5b44036SJonas Devlieghere if (m_opaque_up) 70d5b44036SJonas Devlieghere ret_value = m_opaque_up->Success(); 714838131bSGreg Clayton 724838131bSGreg Clayton return ret_value; 7330fdc8d8SChris Lattner } 7430fdc8d8SChris Lattner 75b9c1b51eSKate Stone uint32_t SBError::GetError() const { 76baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBError, GetError); 77baf5664fSJonas Devlieghere 784838131bSGreg Clayton 794838131bSGreg Clayton uint32_t err = 0; 80d5b44036SJonas Devlieghere if (m_opaque_up) 81d5b44036SJonas Devlieghere err = m_opaque_up->GetError(); 824838131bSGreg Clayton 834838131bSGreg Clayton 844838131bSGreg Clayton return err; 8530fdc8d8SChris Lattner } 8630fdc8d8SChris Lattner 87b9c1b51eSKate Stone ErrorType SBError::GetType() const { 88baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::ErrorType, SBError, GetType); 89baf5664fSJonas Devlieghere 904838131bSGreg Clayton ErrorType err_type = eErrorTypeInvalid; 91d5b44036SJonas Devlieghere if (m_opaque_up) 92d5b44036SJonas Devlieghere err_type = m_opaque_up->GetType(); 934838131bSGreg Clayton 944838131bSGreg Clayton return err_type; 9530fdc8d8SChris Lattner } 9630fdc8d8SChris Lattner 97b9c1b51eSKate Stone void SBError::SetError(uint32_t err, ErrorType type) { 98baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBError, SetError, (uint32_t, lldb::ErrorType), err, 99baf5664fSJonas Devlieghere type); 100baf5664fSJonas Devlieghere 10130fdc8d8SChris Lattner CreateIfNeeded(); 102d5b44036SJonas Devlieghere m_opaque_up->SetError(err, type); 10330fdc8d8SChris Lattner } 10430fdc8d8SChris Lattner 10597206d57SZachary Turner void SBError::SetError(const Status &lldb_error) { 10630fdc8d8SChris Lattner CreateIfNeeded(); 107d5b44036SJonas Devlieghere *m_opaque_up = lldb_error; 10830fdc8d8SChris Lattner } 10930fdc8d8SChris Lattner 110b9c1b51eSKate Stone void SBError::SetErrorToErrno() { 111baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBError, SetErrorToErrno); 112baf5664fSJonas Devlieghere 11330fdc8d8SChris Lattner CreateIfNeeded(); 114d5b44036SJonas Devlieghere m_opaque_up->SetErrorToErrno(); 11530fdc8d8SChris Lattner } 11630fdc8d8SChris Lattner 117b9c1b51eSKate Stone void SBError::SetErrorToGenericError() { 118baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBError, SetErrorToGenericError); 119baf5664fSJonas Devlieghere 12030fdc8d8SChris Lattner CreateIfNeeded(); 121d5b44036SJonas Devlieghere m_opaque_up->SetErrorToErrno(); 12230fdc8d8SChris Lattner } 12330fdc8d8SChris Lattner 124b9c1b51eSKate Stone void SBError::SetErrorString(const char *err_str) { 125baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBError, SetErrorString, (const char *), err_str); 126baf5664fSJonas Devlieghere 12730fdc8d8SChris Lattner CreateIfNeeded(); 128d5b44036SJonas Devlieghere m_opaque_up->SetErrorString(err_str); 12930fdc8d8SChris Lattner } 13030fdc8d8SChris Lattner 131b9c1b51eSKate Stone int SBError::SetErrorStringWithFormat(const char *format, ...) { 13230fdc8d8SChris Lattner CreateIfNeeded(); 13330fdc8d8SChris Lattner va_list args; 13430fdc8d8SChris Lattner va_start(args, format); 135d5b44036SJonas Devlieghere int num_chars = m_opaque_up->SetErrorStringWithVarArg(format, args); 13630fdc8d8SChris Lattner va_end(args); 13730fdc8d8SChris Lattner return num_chars; 13830fdc8d8SChris Lattner } 13930fdc8d8SChris Lattner 140baf5664fSJonas Devlieghere bool SBError::IsValid() const { 141baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, IsValid); 1427f5237bcSPavel Labath return this->operator bool(); 1437f5237bcSPavel Labath } 1447f5237bcSPavel Labath SBError::operator bool() const { 1457f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, operator bool); 146baf5664fSJonas Devlieghere 147baf5664fSJonas Devlieghere return m_opaque_up != NULL; 148baf5664fSJonas Devlieghere } 14930fdc8d8SChris Lattner 150b9c1b51eSKate Stone void SBError::CreateIfNeeded() { 151d5b44036SJonas Devlieghere if (m_opaque_up == NULL) 152d5b44036SJonas Devlieghere m_opaque_up.reset(new Status()); 15330fdc8d8SChris Lattner } 15430fdc8d8SChris Lattner 155d5b44036SJonas Devlieghere lldb_private::Status *SBError::operator->() { return m_opaque_up.get(); } 15630fdc8d8SChris Lattner 157d5b44036SJonas Devlieghere lldb_private::Status *SBError::get() { return m_opaque_up.get(); } 15830fdc8d8SChris Lattner 15997206d57SZachary Turner lldb_private::Status &SBError::ref() { 1608f343b09SGreg Clayton CreateIfNeeded(); 161d5b44036SJonas Devlieghere return *m_opaque_up; 1628f343b09SGreg Clayton } 16330fdc8d8SChris Lattner 16497206d57SZachary Turner const lldb_private::Status &SBError::operator*() const { 16530fdc8d8SChris Lattner // Be sure to call "IsValid()" before calling this function or it will crash 166d5b44036SJonas Devlieghere return *m_opaque_up; 16730fdc8d8SChris Lattner } 16830fdc8d8SChris Lattner 169b9c1b51eSKate Stone bool SBError::GetDescription(SBStream &description) { 170baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBError, GetDescription, (lldb::SBStream &), 171baf5664fSJonas Devlieghere description); 172baf5664fSJonas Devlieghere 173d5b44036SJonas Devlieghere if (m_opaque_up) { 174d5b44036SJonas Devlieghere if (m_opaque_up->Success()) 175262f80dfSGreg Clayton description.Printf("success"); 176b9c1b51eSKate Stone else { 177dde9cff3SCaroline Tice const char *err_string = GetCString(); 178262f80dfSGreg Clayton description.Printf("error: %s", (err_string != NULL ? err_string : "")); 179dde9cff3SCaroline Tice } 180b9c1b51eSKate Stone } else 181262f80dfSGreg Clayton description.Printf("error: <NULL>"); 182ceb6b139SCaroline Tice 183ceb6b139SCaroline Tice return true; 184ceb6b139SCaroline Tice } 185ae211eceSMichal Gorny 186ae211eceSMichal Gorny namespace lldb_private { 187ae211eceSMichal Gorny namespace repro { 188ae211eceSMichal Gorny 189ae211eceSMichal Gorny template <> 190ae211eceSMichal Gorny void RegisterMethods<SBError>(Registry &R) { 191ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBError, ()); 192ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBError, (const lldb::SBError &)); 193ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const lldb::SBError &, 194ae211eceSMichal Gorny SBError, operator=,(const lldb::SBError &)); 195ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBError, GetCString, ()); 196ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBError, Clear, ()); 197ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBError, Fail, ()); 198ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBError, Success, ()); 199ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(uint32_t, SBError, GetError, ()); 200ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::ErrorType, SBError, GetType, ()); 201ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBError, SetError, (uint32_t, lldb::ErrorType)); 202ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBError, SetErrorToErrno, ()); 203ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBError, SetErrorToGenericError, ()); 204ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBError, SetErrorString, (const char *)); 205ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBError, IsValid, ()); 206ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBError, operator bool, ()); 207ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBError, GetDescription, (lldb::SBStream &)); 208ae211eceSMichal Gorny } 209ae211eceSMichal Gorny 210ae211eceSMichal Gorny } 211ae211eceSMichal Gorny } 212