130fdc8d8SChris Lattner //===-- SBError.cpp ---------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner #include "lldb/API/SBError.h" 11dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 12ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 13*bf9a7730SZachary Turner #include "lldb/Utility/Error.h" 14dde9cff3SCaroline Tice 159c68da97SEli Friedman #include <stdarg.h> 1630fdc8d8SChris Lattner 1730fdc8d8SChris Lattner using namespace lldb; 1830fdc8d8SChris Lattner using namespace lldb_private; 1930fdc8d8SChris Lattner 20b9c1b51eSKate Stone SBError::SBError() : m_opaque_ap() {} 2130fdc8d8SChris Lattner 22b9c1b51eSKate Stone SBError::SBError(const SBError &rhs) : m_opaque_ap() { 2330fdc8d8SChris Lattner if (rhs.IsValid()) 246611103cSGreg Clayton m_opaque_ap.reset(new Error(*rhs)); 2530fdc8d8SChris Lattner } 2630fdc8d8SChris Lattner 27b9c1b51eSKate Stone SBError::~SBError() {} 2830fdc8d8SChris Lattner 29b9c1b51eSKate Stone const SBError &SBError::operator=(const SBError &rhs) { 30b9c1b51eSKate Stone if (rhs.IsValid()) { 316611103cSGreg Clayton if (m_opaque_ap.get()) 326611103cSGreg Clayton *m_opaque_ap = *rhs; 3330fdc8d8SChris Lattner else 346611103cSGreg Clayton m_opaque_ap.reset(new Error(*rhs)); 35b9c1b51eSKate Stone } else 366611103cSGreg Clayton m_opaque_ap.reset(); 37ceb6b139SCaroline Tice 3830fdc8d8SChris Lattner return *this; 3930fdc8d8SChris Lattner } 4030fdc8d8SChris Lattner 41b9c1b51eSKate Stone const char *SBError::GetCString() const { 426611103cSGreg Clayton if (m_opaque_ap.get()) 436611103cSGreg Clayton return m_opaque_ap->AsCString(); 4430fdc8d8SChris Lattner return NULL; 4530fdc8d8SChris Lattner } 4630fdc8d8SChris Lattner 47b9c1b51eSKate Stone void SBError::Clear() { 486611103cSGreg Clayton if (m_opaque_ap.get()) 496611103cSGreg Clayton m_opaque_ap->Clear(); 5030fdc8d8SChris Lattner } 5130fdc8d8SChris Lattner 52b9c1b51eSKate Stone bool SBError::Fail() const { 535160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 54ceb6b139SCaroline Tice 55ceb6b139SCaroline Tice bool ret_value = false; 566611103cSGreg Clayton if (m_opaque_ap.get()) 57ceb6b139SCaroline Tice ret_value = m_opaque_ap->Fail(); 58ceb6b139SCaroline Tice 59ceb6b139SCaroline Tice if (log) 60324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::Fail () => %i", 61324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get()), ret_value); 62ceb6b139SCaroline Tice 63ceb6b139SCaroline Tice return ret_value; 6430fdc8d8SChris Lattner } 6530fdc8d8SChris Lattner 66b9c1b51eSKate Stone bool SBError::Success() const { 675160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6816e0c686SJim Ingham bool ret_value = true; 696611103cSGreg Clayton if (m_opaque_ap.get()) 704838131bSGreg Clayton ret_value = m_opaque_ap->Success(); 714838131bSGreg Clayton 724838131bSGreg Clayton if (log) 73324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::Success () => %i", 74324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get()), ret_value); 754838131bSGreg Clayton 764838131bSGreg Clayton return ret_value; 7730fdc8d8SChris Lattner } 7830fdc8d8SChris Lattner 79b9c1b51eSKate Stone uint32_t SBError::GetError() const { 805160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 814838131bSGreg Clayton 824838131bSGreg Clayton uint32_t err = 0; 836611103cSGreg Clayton if (m_opaque_ap.get()) 844838131bSGreg Clayton err = m_opaque_ap->GetError(); 854838131bSGreg Clayton 864838131bSGreg Clayton if (log) 87324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::GetError () => 0x%8.8x", 88324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get()), err); 894838131bSGreg Clayton 904838131bSGreg Clayton return err; 9130fdc8d8SChris Lattner } 9230fdc8d8SChris Lattner 93b9c1b51eSKate Stone ErrorType SBError::GetType() const { 945160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 954838131bSGreg Clayton ErrorType err_type = eErrorTypeInvalid; 966611103cSGreg Clayton if (m_opaque_ap.get()) 974838131bSGreg Clayton err_type = m_opaque_ap->GetType(); 984838131bSGreg Clayton 994838131bSGreg Clayton if (log) 100324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::GetType () => %i", 101324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get()), err_type); 1024838131bSGreg Clayton 1034838131bSGreg Clayton return err_type; 10430fdc8d8SChris Lattner } 10530fdc8d8SChris Lattner 106b9c1b51eSKate Stone void SBError::SetError(uint32_t err, ErrorType type) { 10730fdc8d8SChris Lattner CreateIfNeeded(); 1086611103cSGreg Clayton m_opaque_ap->SetError(err, type); 10930fdc8d8SChris Lattner } 11030fdc8d8SChris Lattner 111b9c1b51eSKate Stone void SBError::SetError(const Error &lldb_error) { 11230fdc8d8SChris Lattner CreateIfNeeded(); 1136611103cSGreg Clayton *m_opaque_ap = lldb_error; 11430fdc8d8SChris Lattner } 11530fdc8d8SChris Lattner 116b9c1b51eSKate Stone void SBError::SetErrorToErrno() { 11730fdc8d8SChris Lattner CreateIfNeeded(); 1186611103cSGreg Clayton m_opaque_ap->SetErrorToErrno(); 11930fdc8d8SChris Lattner } 12030fdc8d8SChris Lattner 121b9c1b51eSKate Stone void SBError::SetErrorToGenericError() { 12230fdc8d8SChris Lattner CreateIfNeeded(); 1236611103cSGreg Clayton m_opaque_ap->SetErrorToErrno(); 12430fdc8d8SChris Lattner } 12530fdc8d8SChris Lattner 126b9c1b51eSKate Stone void SBError::SetErrorString(const char *err_str) { 12730fdc8d8SChris Lattner CreateIfNeeded(); 1286611103cSGreg Clayton m_opaque_ap->SetErrorString(err_str); 12930fdc8d8SChris Lattner } 13030fdc8d8SChris Lattner 131b9c1b51eSKate Stone int SBError::SetErrorStringWithFormat(const char *format, ...) { 13230fdc8d8SChris Lattner CreateIfNeeded(); 13330fdc8d8SChris Lattner va_list args; 13430fdc8d8SChris Lattner va_start(args, format); 1356611103cSGreg Clayton int num_chars = m_opaque_ap->SetErrorStringWithVarArg(format, args); 13630fdc8d8SChris Lattner va_end(args); 13730fdc8d8SChris Lattner return num_chars; 13830fdc8d8SChris Lattner } 13930fdc8d8SChris Lattner 140b9c1b51eSKate Stone bool SBError::IsValid() const { return m_opaque_ap.get() != NULL; } 14130fdc8d8SChris Lattner 142b9c1b51eSKate Stone void SBError::CreateIfNeeded() { 1436611103cSGreg Clayton if (m_opaque_ap.get() == NULL) 1446611103cSGreg Clayton m_opaque_ap.reset(new Error()); 14530fdc8d8SChris Lattner } 14630fdc8d8SChris Lattner 147b9c1b51eSKate Stone lldb_private::Error *SBError::operator->() { return m_opaque_ap.get(); } 14830fdc8d8SChris Lattner 149b9c1b51eSKate Stone lldb_private::Error *SBError::get() { return m_opaque_ap.get(); } 15030fdc8d8SChris Lattner 151b9c1b51eSKate Stone lldb_private::Error &SBError::ref() { 1528f343b09SGreg Clayton CreateIfNeeded(); 1538f343b09SGreg Clayton return *m_opaque_ap; 1548f343b09SGreg Clayton } 15530fdc8d8SChris Lattner 156b9c1b51eSKate Stone const lldb_private::Error &SBError::operator*() const { 15730fdc8d8SChris Lattner // Be sure to call "IsValid()" before calling this function or it will crash 1586611103cSGreg Clayton return *m_opaque_ap; 15930fdc8d8SChris Lattner } 16030fdc8d8SChris Lattner 161b9c1b51eSKate Stone bool SBError::GetDescription(SBStream &description) { 162b9c1b51eSKate Stone if (m_opaque_ap.get()) { 163262f80dfSGreg Clayton if (m_opaque_ap->Success()) 164262f80dfSGreg Clayton description.Printf("success"); 165b9c1b51eSKate Stone else { 166dde9cff3SCaroline Tice const char *err_string = GetCString(); 167262f80dfSGreg Clayton description.Printf("error: %s", (err_string != NULL ? err_string : "")); 168dde9cff3SCaroline Tice } 169b9c1b51eSKate Stone } else 170262f80dfSGreg Clayton description.Printf("error: <NULL>"); 171ceb6b139SCaroline Tice 172ceb6b139SCaroline Tice return true; 173ceb6b139SCaroline Tice } 174