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" 10*baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 11bd4bf82aSJonas Devlieghere #include "Utils.h" 12dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 136f9e6901SZachary Turner #include "lldb/Utility/Log.h" 1497206d57SZachary Turner #include "lldb/Utility/Status.h" 15dde9cff3SCaroline Tice 169c68da97SEli Friedman #include <stdarg.h> 1730fdc8d8SChris Lattner 1830fdc8d8SChris Lattner using namespace lldb; 1930fdc8d8SChris Lattner using namespace lldb_private; 2030fdc8d8SChris Lattner 21*baf5664fSJonas Devlieghere SBError::SBError() : m_opaque_up() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBError); } 2230fdc8d8SChris Lattner 23d5b44036SJonas Devlieghere SBError::SBError(const SBError &rhs) : m_opaque_up() { 24*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBError, (const lldb::SBError &), rhs); 25*baf5664fSJonas Devlieghere 26bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 2730fdc8d8SChris Lattner } 2830fdc8d8SChris Lattner 29b9c1b51eSKate Stone SBError::~SBError() {} 3030fdc8d8SChris Lattner 31b9c1b51eSKate Stone const SBError &SBError::operator=(const SBError &rhs) { 32*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBError &, 33*baf5664fSJonas Devlieghere SBError, operator=,(const lldb::SBError &), rhs); 34*baf5664fSJonas Devlieghere 35bd4bf82aSJonas Devlieghere if (this != &rhs) 36bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 3730fdc8d8SChris Lattner return *this; 3830fdc8d8SChris Lattner } 3930fdc8d8SChris Lattner 40b9c1b51eSKate Stone const char *SBError::GetCString() const { 41*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBError, GetCString); 42*baf5664fSJonas Devlieghere 43d5b44036SJonas Devlieghere if (m_opaque_up) 44d5b44036SJonas Devlieghere return m_opaque_up->AsCString(); 4530fdc8d8SChris Lattner return NULL; 4630fdc8d8SChris Lattner } 4730fdc8d8SChris Lattner 48b9c1b51eSKate Stone void SBError::Clear() { 49*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBError, Clear); 50*baf5664fSJonas Devlieghere 51d5b44036SJonas Devlieghere if (m_opaque_up) 52d5b44036SJonas Devlieghere m_opaque_up->Clear(); 5330fdc8d8SChris Lattner } 5430fdc8d8SChris Lattner 55b9c1b51eSKate Stone bool SBError::Fail() const { 56*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, Fail); 57*baf5664fSJonas Devlieghere 585160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 59ceb6b139SCaroline Tice 60ceb6b139SCaroline Tice bool ret_value = false; 61d5b44036SJonas Devlieghere if (m_opaque_up) 62d5b44036SJonas Devlieghere ret_value = m_opaque_up->Fail(); 63ceb6b139SCaroline Tice 64ceb6b139SCaroline Tice if (log) 65324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::Fail () => %i", 66d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), ret_value); 67ceb6b139SCaroline Tice 68ceb6b139SCaroline Tice return ret_value; 6930fdc8d8SChris Lattner } 7030fdc8d8SChris Lattner 71b9c1b51eSKate Stone bool SBError::Success() const { 72*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, Success); 73*baf5664fSJonas Devlieghere 745160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 7516e0c686SJim Ingham bool ret_value = true; 76d5b44036SJonas Devlieghere if (m_opaque_up) 77d5b44036SJonas Devlieghere ret_value = m_opaque_up->Success(); 784838131bSGreg Clayton 794838131bSGreg Clayton if (log) 80324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::Success () => %i", 81d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), ret_value); 824838131bSGreg Clayton 834838131bSGreg Clayton return ret_value; 8430fdc8d8SChris Lattner } 8530fdc8d8SChris Lattner 86b9c1b51eSKate Stone uint32_t SBError::GetError() const { 87*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBError, GetError); 88*baf5664fSJonas Devlieghere 895160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 904838131bSGreg Clayton 914838131bSGreg Clayton uint32_t err = 0; 92d5b44036SJonas Devlieghere if (m_opaque_up) 93d5b44036SJonas Devlieghere err = m_opaque_up->GetError(); 944838131bSGreg Clayton 954838131bSGreg Clayton if (log) 96324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::GetError () => 0x%8.8x", 97d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), err); 984838131bSGreg Clayton 994838131bSGreg Clayton return err; 10030fdc8d8SChris Lattner } 10130fdc8d8SChris Lattner 102b9c1b51eSKate Stone ErrorType SBError::GetType() const { 103*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::ErrorType, SBError, GetType); 104*baf5664fSJonas Devlieghere 1055160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1064838131bSGreg Clayton ErrorType err_type = eErrorTypeInvalid; 107d5b44036SJonas Devlieghere if (m_opaque_up) 108d5b44036SJonas Devlieghere err_type = m_opaque_up->GetType(); 1094838131bSGreg Clayton 1104838131bSGreg Clayton if (log) 111324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::GetType () => %i", 112d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), err_type); 1134838131bSGreg Clayton 1144838131bSGreg Clayton return err_type; 11530fdc8d8SChris Lattner } 11630fdc8d8SChris Lattner 117b9c1b51eSKate Stone void SBError::SetError(uint32_t err, ErrorType type) { 118*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBError, SetError, (uint32_t, lldb::ErrorType), err, 119*baf5664fSJonas Devlieghere type); 120*baf5664fSJonas Devlieghere 12130fdc8d8SChris Lattner CreateIfNeeded(); 122d5b44036SJonas Devlieghere m_opaque_up->SetError(err, type); 12330fdc8d8SChris Lattner } 12430fdc8d8SChris Lattner 12597206d57SZachary Turner void SBError::SetError(const Status &lldb_error) { 12630fdc8d8SChris Lattner CreateIfNeeded(); 127d5b44036SJonas Devlieghere *m_opaque_up = lldb_error; 12830fdc8d8SChris Lattner } 12930fdc8d8SChris Lattner 130b9c1b51eSKate Stone void SBError::SetErrorToErrno() { 131*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBError, SetErrorToErrno); 132*baf5664fSJonas Devlieghere 13330fdc8d8SChris Lattner CreateIfNeeded(); 134d5b44036SJonas Devlieghere m_opaque_up->SetErrorToErrno(); 13530fdc8d8SChris Lattner } 13630fdc8d8SChris Lattner 137b9c1b51eSKate Stone void SBError::SetErrorToGenericError() { 138*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBError, SetErrorToGenericError); 139*baf5664fSJonas Devlieghere 14030fdc8d8SChris Lattner CreateIfNeeded(); 141d5b44036SJonas Devlieghere m_opaque_up->SetErrorToErrno(); 14230fdc8d8SChris Lattner } 14330fdc8d8SChris Lattner 144b9c1b51eSKate Stone void SBError::SetErrorString(const char *err_str) { 145*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBError, SetErrorString, (const char *), err_str); 146*baf5664fSJonas Devlieghere 14730fdc8d8SChris Lattner CreateIfNeeded(); 148d5b44036SJonas Devlieghere m_opaque_up->SetErrorString(err_str); 14930fdc8d8SChris Lattner } 15030fdc8d8SChris Lattner 151b9c1b51eSKate Stone int SBError::SetErrorStringWithFormat(const char *format, ...) { 15230fdc8d8SChris Lattner CreateIfNeeded(); 15330fdc8d8SChris Lattner va_list args; 15430fdc8d8SChris Lattner va_start(args, format); 155d5b44036SJonas Devlieghere int num_chars = m_opaque_up->SetErrorStringWithVarArg(format, args); 15630fdc8d8SChris Lattner va_end(args); 15730fdc8d8SChris Lattner return num_chars; 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner 160*baf5664fSJonas Devlieghere bool SBError::IsValid() const { 161*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, IsValid); 162*baf5664fSJonas Devlieghere 163*baf5664fSJonas Devlieghere return m_opaque_up != NULL; 164*baf5664fSJonas Devlieghere } 16530fdc8d8SChris Lattner 166b9c1b51eSKate Stone void SBError::CreateIfNeeded() { 167d5b44036SJonas Devlieghere if (m_opaque_up == NULL) 168d5b44036SJonas Devlieghere m_opaque_up.reset(new Status()); 16930fdc8d8SChris Lattner } 17030fdc8d8SChris Lattner 171d5b44036SJonas Devlieghere lldb_private::Status *SBError::operator->() { return m_opaque_up.get(); } 17230fdc8d8SChris Lattner 173d5b44036SJonas Devlieghere lldb_private::Status *SBError::get() { return m_opaque_up.get(); } 17430fdc8d8SChris Lattner 17597206d57SZachary Turner lldb_private::Status &SBError::ref() { 1768f343b09SGreg Clayton CreateIfNeeded(); 177d5b44036SJonas Devlieghere return *m_opaque_up; 1788f343b09SGreg Clayton } 17930fdc8d8SChris Lattner 18097206d57SZachary Turner const lldb_private::Status &SBError::operator*() const { 18130fdc8d8SChris Lattner // Be sure to call "IsValid()" before calling this function or it will crash 182d5b44036SJonas Devlieghere return *m_opaque_up; 18330fdc8d8SChris Lattner } 18430fdc8d8SChris Lattner 185b9c1b51eSKate Stone bool SBError::GetDescription(SBStream &description) { 186*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBError, GetDescription, (lldb::SBStream &), 187*baf5664fSJonas Devlieghere description); 188*baf5664fSJonas Devlieghere 189d5b44036SJonas Devlieghere if (m_opaque_up) { 190d5b44036SJonas Devlieghere if (m_opaque_up->Success()) 191262f80dfSGreg Clayton description.Printf("success"); 192b9c1b51eSKate Stone else { 193dde9cff3SCaroline Tice const char *err_string = GetCString(); 194262f80dfSGreg Clayton description.Printf("error: %s", (err_string != NULL ? err_string : "")); 195dde9cff3SCaroline Tice } 196b9c1b51eSKate Stone } else 197262f80dfSGreg Clayton description.Printf("error: <NULL>"); 198ceb6b139SCaroline Tice 199ceb6b139SCaroline Tice return true; 200ceb6b139SCaroline Tice } 201