180814287SRaphael Isemann //===-- SBError.cpp -------------------------------------------------------===//
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"
10bd4bf82aSJonas Devlieghere #include "Utils.h"
11dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
12*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
1397206d57SZachary Turner #include "lldb/Utility/Status.h"
14dde9cff3SCaroline Tice 
1576e47d48SRaphael Isemann #include <cstdarg>
1630fdc8d8SChris Lattner 
1730fdc8d8SChris Lattner using namespace lldb;
1830fdc8d8SChris Lattner using namespace lldb_private;
1930fdc8d8SChris Lattner 
SBError()20*1755f5b1SJonas Devlieghere SBError::SBError() { LLDB_INSTRUMENT_VA(this); }
2130fdc8d8SChris Lattner 
SBError(const SBError & rhs)22a3436f73SKazu Hirata SBError::SBError(const SBError &rhs) {
23*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
24baf5664fSJonas Devlieghere 
25bd4bf82aSJonas Devlieghere   m_opaque_up = clone(rhs.m_opaque_up);
2630fdc8d8SChris Lattner }
2730fdc8d8SChris Lattner 
28866b7a65SJonas Devlieghere SBError::~SBError() = default;
2930fdc8d8SChris Lattner 
operator =(const SBError & rhs)30b9c1b51eSKate Stone const SBError &SBError::operator=(const SBError &rhs) {
31*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
32baf5664fSJonas Devlieghere 
33bd4bf82aSJonas Devlieghere   if (this != &rhs)
34bd4bf82aSJonas Devlieghere     m_opaque_up = clone(rhs.m_opaque_up);
35d232abc3SJonas Devlieghere   return *this;
3630fdc8d8SChris Lattner }
3730fdc8d8SChris Lattner 
GetCString() const38b9c1b51eSKate Stone const char *SBError::GetCString() const {
39*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
40baf5664fSJonas Devlieghere 
41d5b44036SJonas Devlieghere   if (m_opaque_up)
42d5b44036SJonas Devlieghere     return m_opaque_up->AsCString();
43248a1305SKonrad Kleine   return nullptr;
4430fdc8d8SChris Lattner }
4530fdc8d8SChris Lattner 
Clear()46b9c1b51eSKate Stone void SBError::Clear() {
47*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
48baf5664fSJonas Devlieghere 
49d5b44036SJonas Devlieghere   if (m_opaque_up)
50d5b44036SJonas Devlieghere     m_opaque_up->Clear();
5130fdc8d8SChris Lattner }
5230fdc8d8SChris Lattner 
Fail() const53b9c1b51eSKate Stone bool SBError::Fail() const {
54*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
55baf5664fSJonas Devlieghere 
56ceb6b139SCaroline Tice   bool ret_value = false;
57d5b44036SJonas Devlieghere   if (m_opaque_up)
58d5b44036SJonas Devlieghere     ret_value = m_opaque_up->Fail();
59ceb6b139SCaroline Tice 
60ceb6b139SCaroline Tice 
61ceb6b139SCaroline Tice   return ret_value;
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner 
Success() const64b9c1b51eSKate Stone bool SBError::Success() const {
65*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
66baf5664fSJonas Devlieghere 
6716e0c686SJim Ingham   bool ret_value = true;
68d5b44036SJonas Devlieghere   if (m_opaque_up)
69d5b44036SJonas Devlieghere     ret_value = m_opaque_up->Success();
704838131bSGreg Clayton 
714838131bSGreg Clayton   return ret_value;
7230fdc8d8SChris Lattner }
7330fdc8d8SChris Lattner 
GetError() const74b9c1b51eSKate Stone uint32_t SBError::GetError() const {
75*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
764838131bSGreg Clayton 
774838131bSGreg Clayton   uint32_t err = 0;
78d5b44036SJonas Devlieghere   if (m_opaque_up)
79d5b44036SJonas Devlieghere     err = m_opaque_up->GetError();
804838131bSGreg Clayton 
814838131bSGreg Clayton 
824838131bSGreg Clayton   return err;
8330fdc8d8SChris Lattner }
8430fdc8d8SChris Lattner 
GetType() const85b9c1b51eSKate Stone ErrorType SBError::GetType() const {
86*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
87baf5664fSJonas Devlieghere 
884838131bSGreg Clayton   ErrorType err_type = eErrorTypeInvalid;
89d5b44036SJonas Devlieghere   if (m_opaque_up)
90d5b44036SJonas Devlieghere     err_type = m_opaque_up->GetType();
914838131bSGreg Clayton 
924838131bSGreg Clayton   return err_type;
9330fdc8d8SChris Lattner }
9430fdc8d8SChris Lattner 
SetError(uint32_t err,ErrorType type)95b9c1b51eSKate Stone void SBError::SetError(uint32_t err, ErrorType type) {
96*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, err, type);
97baf5664fSJonas Devlieghere 
9830fdc8d8SChris Lattner   CreateIfNeeded();
99d5b44036SJonas Devlieghere   m_opaque_up->SetError(err, type);
10030fdc8d8SChris Lattner }
10130fdc8d8SChris Lattner 
SetError(const Status & lldb_error)10297206d57SZachary Turner void SBError::SetError(const Status &lldb_error) {
10330fdc8d8SChris Lattner   CreateIfNeeded();
104d5b44036SJonas Devlieghere   *m_opaque_up = lldb_error;
10530fdc8d8SChris Lattner }
10630fdc8d8SChris Lattner 
SetErrorToErrno()107b9c1b51eSKate Stone void SBError::SetErrorToErrno() {
108*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
109baf5664fSJonas Devlieghere 
11030fdc8d8SChris Lattner   CreateIfNeeded();
111d5b44036SJonas Devlieghere   m_opaque_up->SetErrorToErrno();
11230fdc8d8SChris Lattner }
11330fdc8d8SChris Lattner 
SetErrorToGenericError()114b9c1b51eSKate Stone void SBError::SetErrorToGenericError() {
115*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
116baf5664fSJonas Devlieghere 
11730fdc8d8SChris Lattner   CreateIfNeeded();
118206e8d89SAndy Yankovsky   m_opaque_up->SetErrorToGenericError();
11930fdc8d8SChris Lattner }
12030fdc8d8SChris Lattner 
SetErrorString(const char * err_str)121b9c1b51eSKate Stone void SBError::SetErrorString(const char *err_str) {
122*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, err_str);
123baf5664fSJonas Devlieghere 
12430fdc8d8SChris Lattner   CreateIfNeeded();
125d5b44036SJonas Devlieghere   m_opaque_up->SetErrorString(err_str);
12630fdc8d8SChris Lattner }
12730fdc8d8SChris Lattner 
SetErrorStringWithFormat(const char * format,...)128b9c1b51eSKate Stone int SBError::SetErrorStringWithFormat(const char *format, ...) {
12930fdc8d8SChris Lattner   CreateIfNeeded();
13030fdc8d8SChris Lattner   va_list args;
13130fdc8d8SChris Lattner   va_start(args, format);
132d5b44036SJonas Devlieghere   int num_chars = m_opaque_up->SetErrorStringWithVarArg(format, args);
13330fdc8d8SChris Lattner   va_end(args);
13430fdc8d8SChris Lattner   return num_chars;
13530fdc8d8SChris Lattner }
13630fdc8d8SChris Lattner 
IsValid() const137baf5664fSJonas Devlieghere bool SBError::IsValid() const {
138*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1397f5237bcSPavel Labath   return this->operator bool();
1407f5237bcSPavel Labath }
operator bool() const1417f5237bcSPavel Labath SBError::operator bool() const {
142*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
143baf5664fSJonas Devlieghere 
144248a1305SKonrad Kleine   return m_opaque_up != nullptr;
145baf5664fSJonas Devlieghere }
14630fdc8d8SChris Lattner 
CreateIfNeeded()147b9c1b51eSKate Stone void SBError::CreateIfNeeded() {
148248a1305SKonrad Kleine   if (m_opaque_up == nullptr)
1491c0bbe43SJonas Devlieghere     m_opaque_up = std::make_unique<Status>();
15030fdc8d8SChris Lattner }
15130fdc8d8SChris Lattner 
operator ->()152d5b44036SJonas Devlieghere lldb_private::Status *SBError::operator->() { return m_opaque_up.get(); }
15330fdc8d8SChris Lattner 
get()154d5b44036SJonas Devlieghere lldb_private::Status *SBError::get() { return m_opaque_up.get(); }
15530fdc8d8SChris Lattner 
ref()15697206d57SZachary Turner lldb_private::Status &SBError::ref() {
1578f343b09SGreg Clayton   CreateIfNeeded();
158d5b44036SJonas Devlieghere   return *m_opaque_up;
1598f343b09SGreg Clayton }
16030fdc8d8SChris Lattner 
operator *() const16197206d57SZachary Turner const lldb_private::Status &SBError::operator*() const {
16230fdc8d8SChris Lattner   // Be sure to call "IsValid()" before calling this function or it will crash
163d5b44036SJonas Devlieghere   return *m_opaque_up;
16430fdc8d8SChris Lattner }
16530fdc8d8SChris Lattner 
GetDescription(SBStream & description)166b9c1b51eSKate Stone bool SBError::GetDescription(SBStream &description) {
167*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description);
168baf5664fSJonas Devlieghere 
169d5b44036SJonas Devlieghere   if (m_opaque_up) {
170d5b44036SJonas Devlieghere     if (m_opaque_up->Success())
171262f80dfSGreg Clayton       description.Printf("success");
172b9c1b51eSKate Stone     else {
173dde9cff3SCaroline Tice       const char *err_string = GetCString();
174248a1305SKonrad Kleine       description.Printf("error: %s",
175248a1305SKonrad Kleine                          (err_string != nullptr ? err_string : ""));
176dde9cff3SCaroline Tice     }
177b9c1b51eSKate Stone   } else
178262f80dfSGreg Clayton     description.Printf("error: <NULL>");
179ceb6b139SCaroline Tice 
180ceb6b139SCaroline Tice   return true;
181ceb6b139SCaroline Tice }
182