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*bd4bf82aSJonas Devlieghere #include "Utils.h" 11dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 126f9e6901SZachary Turner #include "lldb/Utility/Log.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 20d5b44036SJonas Devlieghere SBError::SBError() : m_opaque_up() {} 2130fdc8d8SChris Lattner 22d5b44036SJonas Devlieghere SBError::SBError(const SBError &rhs) : m_opaque_up() { 23*bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 2430fdc8d8SChris Lattner } 2530fdc8d8SChris Lattner 26b9c1b51eSKate Stone SBError::~SBError() {} 2730fdc8d8SChris Lattner 28b9c1b51eSKate Stone const SBError &SBError::operator=(const SBError &rhs) { 29*bd4bf82aSJonas Devlieghere if (this != &rhs) 30*bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 3130fdc8d8SChris Lattner return *this; 3230fdc8d8SChris Lattner } 3330fdc8d8SChris Lattner 34b9c1b51eSKate Stone const char *SBError::GetCString() const { 35d5b44036SJonas Devlieghere if (m_opaque_up) 36d5b44036SJonas Devlieghere return m_opaque_up->AsCString(); 3730fdc8d8SChris Lattner return NULL; 3830fdc8d8SChris Lattner } 3930fdc8d8SChris Lattner 40b9c1b51eSKate Stone void SBError::Clear() { 41d5b44036SJonas Devlieghere if (m_opaque_up) 42d5b44036SJonas Devlieghere m_opaque_up->Clear(); 4330fdc8d8SChris Lattner } 4430fdc8d8SChris Lattner 45b9c1b51eSKate Stone bool SBError::Fail() const { 465160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 47ceb6b139SCaroline Tice 48ceb6b139SCaroline Tice bool ret_value = false; 49d5b44036SJonas Devlieghere if (m_opaque_up) 50d5b44036SJonas Devlieghere ret_value = m_opaque_up->Fail(); 51ceb6b139SCaroline Tice 52ceb6b139SCaroline Tice if (log) 53324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::Fail () => %i", 54d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), ret_value); 55ceb6b139SCaroline Tice 56ceb6b139SCaroline Tice return ret_value; 5730fdc8d8SChris Lattner } 5830fdc8d8SChris Lattner 59b9c1b51eSKate Stone bool SBError::Success() const { 605160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6116e0c686SJim Ingham bool ret_value = true; 62d5b44036SJonas Devlieghere if (m_opaque_up) 63d5b44036SJonas Devlieghere ret_value = m_opaque_up->Success(); 644838131bSGreg Clayton 654838131bSGreg Clayton if (log) 66324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::Success () => %i", 67d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), ret_value); 684838131bSGreg Clayton 694838131bSGreg Clayton return ret_value; 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner 72b9c1b51eSKate Stone uint32_t SBError::GetError() const { 735160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 744838131bSGreg Clayton 754838131bSGreg Clayton uint32_t err = 0; 76d5b44036SJonas Devlieghere if (m_opaque_up) 77d5b44036SJonas Devlieghere err = m_opaque_up->GetError(); 784838131bSGreg Clayton 794838131bSGreg Clayton if (log) 80324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::GetError () => 0x%8.8x", 81d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), err); 824838131bSGreg Clayton 834838131bSGreg Clayton return err; 8430fdc8d8SChris Lattner } 8530fdc8d8SChris Lattner 86b9c1b51eSKate Stone ErrorType SBError::GetType() const { 875160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 884838131bSGreg Clayton ErrorType err_type = eErrorTypeInvalid; 89d5b44036SJonas Devlieghere if (m_opaque_up) 90d5b44036SJonas Devlieghere err_type = m_opaque_up->GetType(); 914838131bSGreg Clayton 924838131bSGreg Clayton if (log) 93324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::GetType () => %i", 94d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), err_type); 954838131bSGreg Clayton 964838131bSGreg Clayton return err_type; 9730fdc8d8SChris Lattner } 9830fdc8d8SChris Lattner 99b9c1b51eSKate Stone void SBError::SetError(uint32_t err, ErrorType type) { 10030fdc8d8SChris Lattner CreateIfNeeded(); 101d5b44036SJonas Devlieghere m_opaque_up->SetError(err, type); 10230fdc8d8SChris Lattner } 10330fdc8d8SChris Lattner 10497206d57SZachary Turner void SBError::SetError(const Status &lldb_error) { 10530fdc8d8SChris Lattner CreateIfNeeded(); 106d5b44036SJonas Devlieghere *m_opaque_up = lldb_error; 10730fdc8d8SChris Lattner } 10830fdc8d8SChris Lattner 109b9c1b51eSKate Stone void SBError::SetErrorToErrno() { 11030fdc8d8SChris Lattner CreateIfNeeded(); 111d5b44036SJonas Devlieghere m_opaque_up->SetErrorToErrno(); 11230fdc8d8SChris Lattner } 11330fdc8d8SChris Lattner 114b9c1b51eSKate Stone void SBError::SetErrorToGenericError() { 11530fdc8d8SChris Lattner CreateIfNeeded(); 116d5b44036SJonas Devlieghere m_opaque_up->SetErrorToErrno(); 11730fdc8d8SChris Lattner } 11830fdc8d8SChris Lattner 119b9c1b51eSKate Stone void SBError::SetErrorString(const char *err_str) { 12030fdc8d8SChris Lattner CreateIfNeeded(); 121d5b44036SJonas Devlieghere m_opaque_up->SetErrorString(err_str); 12230fdc8d8SChris Lattner } 12330fdc8d8SChris Lattner 124b9c1b51eSKate Stone int SBError::SetErrorStringWithFormat(const char *format, ...) { 12530fdc8d8SChris Lattner CreateIfNeeded(); 12630fdc8d8SChris Lattner va_list args; 12730fdc8d8SChris Lattner va_start(args, format); 128d5b44036SJonas Devlieghere int num_chars = m_opaque_up->SetErrorStringWithVarArg(format, args); 12930fdc8d8SChris Lattner va_end(args); 13030fdc8d8SChris Lattner return num_chars; 13130fdc8d8SChris Lattner } 13230fdc8d8SChris Lattner 133d5b44036SJonas Devlieghere bool SBError::IsValid() const { return m_opaque_up != NULL; } 13430fdc8d8SChris Lattner 135b9c1b51eSKate Stone void SBError::CreateIfNeeded() { 136d5b44036SJonas Devlieghere if (m_opaque_up == NULL) 137d5b44036SJonas Devlieghere m_opaque_up.reset(new Status()); 13830fdc8d8SChris Lattner } 13930fdc8d8SChris Lattner 140d5b44036SJonas Devlieghere lldb_private::Status *SBError::operator->() { return m_opaque_up.get(); } 14130fdc8d8SChris Lattner 142d5b44036SJonas Devlieghere lldb_private::Status *SBError::get() { return m_opaque_up.get(); } 14330fdc8d8SChris Lattner 14497206d57SZachary Turner lldb_private::Status &SBError::ref() { 1458f343b09SGreg Clayton CreateIfNeeded(); 146d5b44036SJonas Devlieghere return *m_opaque_up; 1478f343b09SGreg Clayton } 14830fdc8d8SChris Lattner 14997206d57SZachary Turner const lldb_private::Status &SBError::operator*() const { 15030fdc8d8SChris Lattner // Be sure to call "IsValid()" before calling this function or it will crash 151d5b44036SJonas Devlieghere return *m_opaque_up; 15230fdc8d8SChris Lattner } 15330fdc8d8SChris Lattner 154b9c1b51eSKate Stone bool SBError::GetDescription(SBStream &description) { 155d5b44036SJonas Devlieghere if (m_opaque_up) { 156d5b44036SJonas Devlieghere if (m_opaque_up->Success()) 157262f80dfSGreg Clayton description.Printf("success"); 158b9c1b51eSKate Stone else { 159dde9cff3SCaroline Tice const char *err_string = GetCString(); 160262f80dfSGreg Clayton description.Printf("error: %s", (err_string != NULL ? err_string : "")); 161dde9cff3SCaroline Tice } 162b9c1b51eSKate Stone } else 163262f80dfSGreg Clayton description.Printf("error: <NULL>"); 164ceb6b139SCaroline Tice 165ceb6b139SCaroline Tice return true; 166ceb6b139SCaroline Tice } 167