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