130fdc8d8SChris Lattner //===-- SBError.cpp ---------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
930fdc8d8SChris Lattner #include "lldb/API/SBError.h"
10dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
116f9e6901SZachary Turner #include "lldb/Utility/Log.h"
1297206d57SZachary Turner #include "lldb/Utility/Status.h"
13dde9cff3SCaroline Tice 
149c68da97SEli Friedman #include <stdarg.h>
1530fdc8d8SChris Lattner 
1630fdc8d8SChris Lattner using namespace lldb;
1730fdc8d8SChris Lattner using namespace lldb_private;
1830fdc8d8SChris Lattner 
19b9c1b51eSKate Stone SBError::SBError() : m_opaque_ap() {}
2030fdc8d8SChris Lattner 
21b9c1b51eSKate Stone SBError::SBError(const SBError &rhs) : m_opaque_ap() {
2230fdc8d8SChris Lattner   if (rhs.IsValid())
2397206d57SZachary Turner     m_opaque_ap.reset(new Status(*rhs));
2430fdc8d8SChris Lattner }
2530fdc8d8SChris Lattner 
26b9c1b51eSKate Stone SBError::~SBError() {}
2730fdc8d8SChris Lattner 
28b9c1b51eSKate Stone const SBError &SBError::operator=(const SBError &rhs) {
29b9c1b51eSKate Stone   if (rhs.IsValid()) {
303447077aSJonas Devlieghere     if (m_opaque_ap)
316611103cSGreg Clayton       *m_opaque_ap = *rhs;
3230fdc8d8SChris Lattner     else
3397206d57SZachary Turner       m_opaque_ap.reset(new Status(*rhs));
34b9c1b51eSKate Stone   } else
356611103cSGreg Clayton     m_opaque_ap.reset();
36ceb6b139SCaroline Tice 
3730fdc8d8SChris Lattner   return *this;
3830fdc8d8SChris Lattner }
3930fdc8d8SChris Lattner 
40b9c1b51eSKate Stone const char *SBError::GetCString() const {
413447077aSJonas Devlieghere   if (m_opaque_ap)
426611103cSGreg Clayton     return m_opaque_ap->AsCString();
4330fdc8d8SChris Lattner   return NULL;
4430fdc8d8SChris Lattner }
4530fdc8d8SChris Lattner 
46b9c1b51eSKate Stone void SBError::Clear() {
473447077aSJonas Devlieghere   if (m_opaque_ap)
486611103cSGreg Clayton     m_opaque_ap->Clear();
4930fdc8d8SChris Lattner }
5030fdc8d8SChris Lattner 
51b9c1b51eSKate Stone bool SBError::Fail() const {
525160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
53ceb6b139SCaroline Tice 
54ceb6b139SCaroline Tice   bool ret_value = false;
553447077aSJonas Devlieghere   if (m_opaque_ap)
56ceb6b139SCaroline Tice     ret_value = m_opaque_ap->Fail();
57ceb6b139SCaroline Tice 
58ceb6b139SCaroline Tice   if (log)
59324a1036SSaleem Abdulrasool     log->Printf("SBError(%p)::Fail () => %i",
60324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()), ret_value);
61ceb6b139SCaroline Tice 
62ceb6b139SCaroline Tice   return ret_value;
6330fdc8d8SChris Lattner }
6430fdc8d8SChris Lattner 
65b9c1b51eSKate Stone bool SBError::Success() const {
665160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
6716e0c686SJim Ingham   bool ret_value = true;
683447077aSJonas Devlieghere   if (m_opaque_ap)
694838131bSGreg Clayton     ret_value = m_opaque_ap->Success();
704838131bSGreg Clayton 
714838131bSGreg Clayton   if (log)
72324a1036SSaleem Abdulrasool     log->Printf("SBError(%p)::Success () => %i",
73324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()), ret_value);
744838131bSGreg Clayton 
754838131bSGreg Clayton   return ret_value;
7630fdc8d8SChris Lattner }
7730fdc8d8SChris Lattner 
78b9c1b51eSKate Stone uint32_t SBError::GetError() const {
795160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
804838131bSGreg Clayton 
814838131bSGreg Clayton   uint32_t err = 0;
823447077aSJonas Devlieghere   if (m_opaque_ap)
834838131bSGreg Clayton     err = m_opaque_ap->GetError();
844838131bSGreg Clayton 
854838131bSGreg Clayton   if (log)
86324a1036SSaleem Abdulrasool     log->Printf("SBError(%p)::GetError () => 0x%8.8x",
87324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()), err);
884838131bSGreg Clayton 
894838131bSGreg Clayton   return err;
9030fdc8d8SChris Lattner }
9130fdc8d8SChris Lattner 
92b9c1b51eSKate Stone ErrorType SBError::GetType() const {
935160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
944838131bSGreg Clayton   ErrorType err_type = eErrorTypeInvalid;
953447077aSJonas Devlieghere   if (m_opaque_ap)
964838131bSGreg Clayton     err_type = m_opaque_ap->GetType();
974838131bSGreg Clayton 
984838131bSGreg Clayton   if (log)
99324a1036SSaleem Abdulrasool     log->Printf("SBError(%p)::GetType () => %i",
100324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()), err_type);
1014838131bSGreg Clayton 
1024838131bSGreg Clayton   return err_type;
10330fdc8d8SChris Lattner }
10430fdc8d8SChris Lattner 
105b9c1b51eSKate Stone void SBError::SetError(uint32_t err, ErrorType type) {
10630fdc8d8SChris Lattner   CreateIfNeeded();
1076611103cSGreg Clayton   m_opaque_ap->SetError(err, type);
10830fdc8d8SChris Lattner }
10930fdc8d8SChris Lattner 
11097206d57SZachary Turner void SBError::SetError(const Status &lldb_error) {
11130fdc8d8SChris Lattner   CreateIfNeeded();
1126611103cSGreg Clayton   *m_opaque_ap = lldb_error;
11330fdc8d8SChris Lattner }
11430fdc8d8SChris Lattner 
115b9c1b51eSKate Stone void SBError::SetErrorToErrno() {
11630fdc8d8SChris Lattner   CreateIfNeeded();
1176611103cSGreg Clayton   m_opaque_ap->SetErrorToErrno();
11830fdc8d8SChris Lattner }
11930fdc8d8SChris Lattner 
120b9c1b51eSKate Stone void SBError::SetErrorToGenericError() {
12130fdc8d8SChris Lattner   CreateIfNeeded();
1226611103cSGreg Clayton   m_opaque_ap->SetErrorToErrno();
12330fdc8d8SChris Lattner }
12430fdc8d8SChris Lattner 
125b9c1b51eSKate Stone void SBError::SetErrorString(const char *err_str) {
12630fdc8d8SChris Lattner   CreateIfNeeded();
1276611103cSGreg Clayton   m_opaque_ap->SetErrorString(err_str);
12830fdc8d8SChris Lattner }
12930fdc8d8SChris Lattner 
130b9c1b51eSKate Stone int SBError::SetErrorStringWithFormat(const char *format, ...) {
13130fdc8d8SChris Lattner   CreateIfNeeded();
13230fdc8d8SChris Lattner   va_list args;
13330fdc8d8SChris Lattner   va_start(args, format);
1346611103cSGreg Clayton   int num_chars = m_opaque_ap->SetErrorStringWithVarArg(format, args);
13530fdc8d8SChris Lattner   va_end(args);
13630fdc8d8SChris Lattner   return num_chars;
13730fdc8d8SChris Lattner }
13830fdc8d8SChris Lattner 
1393447077aSJonas Devlieghere bool SBError::IsValid() const { return m_opaque_ap != NULL; }
14030fdc8d8SChris Lattner 
141b9c1b51eSKate Stone void SBError::CreateIfNeeded() {
1423447077aSJonas Devlieghere   if (m_opaque_ap == NULL)
14397206d57SZachary Turner     m_opaque_ap.reset(new Status());
14430fdc8d8SChris Lattner }
14530fdc8d8SChris Lattner 
14697206d57SZachary Turner lldb_private::Status *SBError::operator->() { return m_opaque_ap.get(); }
14730fdc8d8SChris Lattner 
14897206d57SZachary Turner lldb_private::Status *SBError::get() { return m_opaque_ap.get(); }
14930fdc8d8SChris Lattner 
15097206d57SZachary Turner lldb_private::Status &SBError::ref() {
1518f343b09SGreg Clayton   CreateIfNeeded();
1528f343b09SGreg Clayton   return *m_opaque_ap;
1538f343b09SGreg Clayton }
15430fdc8d8SChris Lattner 
15597206d57SZachary Turner const lldb_private::Status &SBError::operator*() const {
15630fdc8d8SChris Lattner   // Be sure to call "IsValid()" before calling this function or it will crash
1576611103cSGreg Clayton   return *m_opaque_ap;
15830fdc8d8SChris Lattner }
15930fdc8d8SChris Lattner 
160b9c1b51eSKate Stone bool SBError::GetDescription(SBStream &description) {
1613447077aSJonas Devlieghere   if (m_opaque_ap) {
162262f80dfSGreg Clayton     if (m_opaque_ap->Success())
163262f80dfSGreg Clayton       description.Printf("success");
164b9c1b51eSKate Stone     else {
165dde9cff3SCaroline Tice       const char *err_string = GetCString();
166262f80dfSGreg Clayton       description.Printf("error: %s", (err_string != NULL ? err_string : ""));
167dde9cff3SCaroline Tice     }
168b9c1b51eSKate Stone   } else
169262f80dfSGreg Clayton     description.Printf("error: <NULL>");
170ceb6b139SCaroline Tice 
171ceb6b139SCaroline Tice   return true;
172ceb6b139SCaroline Tice }
173