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