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