blob: a692a9678cdee6e2b53807d65d05307ec3b5d13e [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBError.cpp ---------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBError.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000011#include "lldb/API/SBStream.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000012#include "lldb/Utility/Error.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000013#include "lldb/Utility/Log.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000014
Eli Friedman9c68da92010-06-09 08:46:23 +000015#include <stdarg.h>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000016
17using namespace lldb;
18using namespace lldb_private;
19
Kate Stoneb9c1b512016-09-06 20:57:50 +000020SBError::SBError() : m_opaque_ap() {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021
Kate Stoneb9c1b512016-09-06 20:57:50 +000022SBError::SBError(const SBError &rhs) : m_opaque_ap() {
23 if (rhs.IsValid())
24 m_opaque_ap.reset(new Error(*rhs));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000025}
26
Kate Stoneb9c1b512016-09-06 20:57:50 +000027SBError::~SBError() {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028
Kate Stoneb9c1b512016-09-06 20:57:50 +000029const SBError &SBError::operator=(const SBError &rhs) {
30 if (rhs.IsValid()) {
31 if (m_opaque_ap.get())
32 *m_opaque_ap = *rhs;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033 else
Kate Stoneb9c1b512016-09-06 20:57:50 +000034 m_opaque_ap.reset(new Error(*rhs));
35 } else
36 m_opaque_ap.reset();
Caroline Ticeceb6b132010-10-26 03:11:13 +000037
Kate Stoneb9c1b512016-09-06 20:57:50 +000038 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039}
40
Kate Stoneb9c1b512016-09-06 20:57:50 +000041const char *SBError::GetCString() const {
42 if (m_opaque_ap.get())
43 return m_opaque_ap->AsCString();
44 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045}
46
Kate Stoneb9c1b512016-09-06 20:57:50 +000047void SBError::Clear() {
48 if (m_opaque_ap.get())
49 m_opaque_ap->Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000050}
51
Kate Stoneb9c1b512016-09-06 20:57:50 +000052bool SBError::Fail() const {
53 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000054
Kate Stoneb9c1b512016-09-06 20:57:50 +000055 bool ret_value = false;
56 if (m_opaque_ap.get())
57 ret_value = m_opaque_ap->Fail();
Caroline Ticeceb6b132010-10-26 03:11:13 +000058
Kate Stoneb9c1b512016-09-06 20:57:50 +000059 if (log)
60 log->Printf("SBError(%p)::Fail () => %i",
61 static_cast<void *>(m_opaque_ap.get()), ret_value);
Caroline Ticeceb6b132010-10-26 03:11:13 +000062
Kate Stoneb9c1b512016-09-06 20:57:50 +000063 return ret_value;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000064}
65
Kate Stoneb9c1b512016-09-06 20:57:50 +000066bool SBError::Success() const {
67 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
68 bool ret_value = true;
69 if (m_opaque_ap.get())
70 ret_value = m_opaque_ap->Success();
Greg Clayton48381312010-10-30 04:51:46 +000071
Kate Stoneb9c1b512016-09-06 20:57:50 +000072 if (log)
73 log->Printf("SBError(%p)::Success () => %i",
74 static_cast<void *>(m_opaque_ap.get()), ret_value);
Greg Clayton48381312010-10-30 04:51:46 +000075
Kate Stoneb9c1b512016-09-06 20:57:50 +000076 return ret_value;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000077}
78
Kate Stoneb9c1b512016-09-06 20:57:50 +000079uint32_t SBError::GetError() const {
80 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +000081
Kate Stoneb9c1b512016-09-06 20:57:50 +000082 uint32_t err = 0;
83 if (m_opaque_ap.get())
84 err = m_opaque_ap->GetError();
Greg Clayton48381312010-10-30 04:51:46 +000085
Kate Stoneb9c1b512016-09-06 20:57:50 +000086 if (log)
87 log->Printf("SBError(%p)::GetError () => 0x%8.8x",
88 static_cast<void *>(m_opaque_ap.get()), err);
Greg Clayton48381312010-10-30 04:51:46 +000089
Kate Stoneb9c1b512016-09-06 20:57:50 +000090 return err;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000091}
92
Kate Stoneb9c1b512016-09-06 20:57:50 +000093ErrorType SBError::GetType() const {
94 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
95 ErrorType err_type = eErrorTypeInvalid;
96 if (m_opaque_ap.get())
97 err_type = m_opaque_ap->GetType();
Greg Clayton48381312010-10-30 04:51:46 +000098
Kate Stoneb9c1b512016-09-06 20:57:50 +000099 if (log)
100 log->Printf("SBError(%p)::GetType () => %i",
101 static_cast<void *>(m_opaque_ap.get()), err_type);
Greg Clayton48381312010-10-30 04:51:46 +0000102
Kate Stoneb9c1b512016-09-06 20:57:50 +0000103 return err_type;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000104}
105
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106void SBError::SetError(uint32_t err, ErrorType type) {
107 CreateIfNeeded();
108 m_opaque_ap->SetError(err, type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000109}
110
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111void SBError::SetError(const Error &lldb_error) {
112 CreateIfNeeded();
113 *m_opaque_ap = lldb_error;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000114}
115
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116void SBError::SetErrorToErrno() {
117 CreateIfNeeded();
118 m_opaque_ap->SetErrorToErrno();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000119}
120
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121void SBError::SetErrorToGenericError() {
122 CreateIfNeeded();
123 m_opaque_ap->SetErrorToErrno();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000124}
125
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126void SBError::SetErrorString(const char *err_str) {
127 CreateIfNeeded();
128 m_opaque_ap->SetErrorString(err_str);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000129}
130
Kate Stoneb9c1b512016-09-06 20:57:50 +0000131int SBError::SetErrorStringWithFormat(const char *format, ...) {
132 CreateIfNeeded();
133 va_list args;
134 va_start(args, format);
135 int num_chars = m_opaque_ap->SetErrorStringWithVarArg(format, args);
136 va_end(args);
137 return num_chars;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000138}
139
Kate Stoneb9c1b512016-09-06 20:57:50 +0000140bool SBError::IsValid() const { return m_opaque_ap.get() != NULL; }
141
142void SBError::CreateIfNeeded() {
143 if (m_opaque_ap.get() == NULL)
144 m_opaque_ap.reset(new Error());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000145}
146
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147lldb_private::Error *SBError::operator->() { return m_opaque_ap.get(); }
148
149lldb_private::Error *SBError::get() { return m_opaque_ap.get(); }
150
151lldb_private::Error &SBError::ref() {
152 CreateIfNeeded();
153 return *m_opaque_ap;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000154}
155
Kate Stoneb9c1b512016-09-06 20:57:50 +0000156const lldb_private::Error &SBError::operator*() const {
157 // Be sure to call "IsValid()" before calling this function or it will crash
158 return *m_opaque_ap;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000159}
160
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161bool SBError::GetDescription(SBStream &description) {
162 if (m_opaque_ap.get()) {
163 if (m_opaque_ap->Success())
164 description.Printf("success");
165 else {
166 const char *err_string = GetCString();
167 description.Printf("error: %s", (err_string != NULL ? err_string : ""));
Caroline Ticedde9cff2010-09-20 05:20:02 +0000168 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000169 } else
170 description.Printf("error: <NULL>");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000171
Kate Stoneb9c1b512016-09-06 20:57:50 +0000172 return true;
173}