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" 1230fdc8d8SChris Lattner #include "lldb/Core/Error.h" 13ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 14dde9cff3SCaroline Tice 159c68da97SEli Friedman #include <stdarg.h> 1630fdc8d8SChris Lattner 1730fdc8d8SChris Lattner using namespace lldb; 1830fdc8d8SChris Lattner using namespace lldb_private; 1930fdc8d8SChris Lattner 2030fdc8d8SChris Lattner 2130fdc8d8SChris Lattner SBError::SBError () : 226611103cSGreg Clayton m_opaque_ap () 2330fdc8d8SChris Lattner { 2430fdc8d8SChris Lattner } 2530fdc8d8SChris Lattner 2630fdc8d8SChris Lattner SBError::SBError (const SBError &rhs) : 276611103cSGreg Clayton m_opaque_ap () 2830fdc8d8SChris Lattner { 2930fdc8d8SChris Lattner if (rhs.IsValid()) 306611103cSGreg Clayton m_opaque_ap.reset (new Error(*rhs)); 3130fdc8d8SChris Lattner } 3230fdc8d8SChris Lattner 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner SBError::~SBError() 3530fdc8d8SChris Lattner { 3630fdc8d8SChris Lattner } 3730fdc8d8SChris Lattner 3830fdc8d8SChris Lattner const SBError & 3930fdc8d8SChris Lattner SBError::operator = (const SBError &rhs) 4030fdc8d8SChris Lattner { 4130fdc8d8SChris Lattner if (rhs.IsValid()) 4230fdc8d8SChris Lattner { 436611103cSGreg Clayton if (m_opaque_ap.get()) 446611103cSGreg Clayton *m_opaque_ap = *rhs; 4530fdc8d8SChris Lattner else 466611103cSGreg Clayton m_opaque_ap.reset (new Error(*rhs)); 4730fdc8d8SChris Lattner } 4830fdc8d8SChris Lattner else 496611103cSGreg Clayton m_opaque_ap.reset(); 50ceb6b139SCaroline Tice 5130fdc8d8SChris Lattner return *this; 5230fdc8d8SChris Lattner } 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner 5530fdc8d8SChris Lattner const char * 5630fdc8d8SChris Lattner SBError::GetCString () const 5730fdc8d8SChris Lattner { 586611103cSGreg Clayton if (m_opaque_ap.get()) 596611103cSGreg Clayton return m_opaque_ap->AsCString(); 6030fdc8d8SChris Lattner return NULL; 6130fdc8d8SChris Lattner } 6230fdc8d8SChris Lattner 6330fdc8d8SChris Lattner void 6430fdc8d8SChris Lattner SBError::Clear () 6530fdc8d8SChris Lattner { 666611103cSGreg Clayton if (m_opaque_ap.get()) 676611103cSGreg Clayton m_opaque_ap->Clear(); 6830fdc8d8SChris Lattner } 6930fdc8d8SChris Lattner 7030fdc8d8SChris Lattner bool 7130fdc8d8SChris Lattner SBError::Fail () const 7230fdc8d8SChris Lattner { 735160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 74ceb6b139SCaroline Tice 75ceb6b139SCaroline Tice bool ret_value = false; 766611103cSGreg Clayton if (m_opaque_ap.get()) 77ceb6b139SCaroline Tice ret_value = m_opaque_ap->Fail(); 78ceb6b139SCaroline Tice 79ceb6b139SCaroline Tice if (log) 80*324a1036SSaleem Abdulrasool log->Printf ("SBError(%p)::Fail () => %i", 81*324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_ap.get()), ret_value); 82ceb6b139SCaroline Tice 83ceb6b139SCaroline Tice return ret_value; 8430fdc8d8SChris Lattner } 8530fdc8d8SChris Lattner 8630fdc8d8SChris Lattner bool 8730fdc8d8SChris Lattner SBError::Success () const 8830fdc8d8SChris Lattner { 895160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9016e0c686SJim Ingham bool ret_value = true; 916611103cSGreg Clayton if (m_opaque_ap.get()) 924838131bSGreg Clayton ret_value = m_opaque_ap->Success(); 934838131bSGreg Clayton 944838131bSGreg Clayton if (log) 95*324a1036SSaleem Abdulrasool log->Printf ("SBError(%p)::Success () => %i", 96*324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_ap.get()), ret_value); 974838131bSGreg Clayton 984838131bSGreg Clayton return ret_value; 9930fdc8d8SChris Lattner } 10030fdc8d8SChris Lattner 10130fdc8d8SChris Lattner uint32_t 10230fdc8d8SChris Lattner SBError::GetError () const 10330fdc8d8SChris Lattner { 1045160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1054838131bSGreg Clayton 1064838131bSGreg Clayton uint32_t err = 0; 1076611103cSGreg Clayton if (m_opaque_ap.get()) 1084838131bSGreg Clayton err = m_opaque_ap->GetError(); 1094838131bSGreg Clayton 1104838131bSGreg Clayton if (log) 111*324a1036SSaleem Abdulrasool log->Printf ("SBError(%p)::GetError () => 0x%8.8x", 112*324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_ap.get()), err); 1134838131bSGreg Clayton 1144838131bSGreg Clayton 1154838131bSGreg Clayton return err; 11630fdc8d8SChris Lattner } 11730fdc8d8SChris Lattner 11830fdc8d8SChris Lattner ErrorType 11930fdc8d8SChris Lattner SBError::GetType () const 12030fdc8d8SChris Lattner { 1215160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1224838131bSGreg Clayton ErrorType err_type = eErrorTypeInvalid; 1236611103cSGreg Clayton if (m_opaque_ap.get()) 1244838131bSGreg Clayton err_type = m_opaque_ap->GetType(); 1254838131bSGreg Clayton 1264838131bSGreg Clayton if (log) 127*324a1036SSaleem Abdulrasool log->Printf ("SBError(%p)::GetType () => %i", 128*324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_ap.get()), err_type); 1294838131bSGreg Clayton 1304838131bSGreg Clayton return err_type; 13130fdc8d8SChris Lattner } 13230fdc8d8SChris Lattner 13330fdc8d8SChris Lattner void 13430fdc8d8SChris Lattner SBError::SetError (uint32_t err, ErrorType type) 13530fdc8d8SChris Lattner { 13630fdc8d8SChris Lattner CreateIfNeeded (); 1376611103cSGreg Clayton m_opaque_ap->SetError (err, type); 13830fdc8d8SChris Lattner } 13930fdc8d8SChris Lattner 14030fdc8d8SChris Lattner void 14130fdc8d8SChris Lattner SBError::SetError (const Error &lldb_error) 14230fdc8d8SChris Lattner { 14330fdc8d8SChris Lattner CreateIfNeeded (); 1446611103cSGreg Clayton *m_opaque_ap = lldb_error; 14530fdc8d8SChris Lattner } 14630fdc8d8SChris Lattner 14730fdc8d8SChris Lattner 14830fdc8d8SChris Lattner void 14930fdc8d8SChris Lattner SBError::SetErrorToErrno () 15030fdc8d8SChris Lattner { 15130fdc8d8SChris Lattner CreateIfNeeded (); 1526611103cSGreg Clayton m_opaque_ap->SetErrorToErrno (); 15330fdc8d8SChris Lattner } 15430fdc8d8SChris Lattner 15530fdc8d8SChris Lattner void 15630fdc8d8SChris Lattner SBError::SetErrorToGenericError () 15730fdc8d8SChris Lattner { 15830fdc8d8SChris Lattner CreateIfNeeded (); 1596611103cSGreg Clayton m_opaque_ap->SetErrorToErrno (); 16030fdc8d8SChris Lattner } 16130fdc8d8SChris Lattner 16230fdc8d8SChris Lattner void 16330fdc8d8SChris Lattner SBError::SetErrorString (const char *err_str) 16430fdc8d8SChris Lattner { 16530fdc8d8SChris Lattner CreateIfNeeded (); 1666611103cSGreg Clayton m_opaque_ap->SetErrorString (err_str); 16730fdc8d8SChris Lattner } 16830fdc8d8SChris Lattner 16930fdc8d8SChris Lattner int 17030fdc8d8SChris Lattner SBError::SetErrorStringWithFormat (const char *format, ...) 17130fdc8d8SChris Lattner { 17230fdc8d8SChris Lattner CreateIfNeeded (); 17330fdc8d8SChris Lattner va_list args; 17430fdc8d8SChris Lattner va_start (args, format); 1756611103cSGreg Clayton int num_chars = m_opaque_ap->SetErrorStringWithVarArg (format, args); 17630fdc8d8SChris Lattner va_end (args); 17730fdc8d8SChris Lattner return num_chars; 17830fdc8d8SChris Lattner } 17930fdc8d8SChris Lattner 18030fdc8d8SChris Lattner bool 18130fdc8d8SChris Lattner SBError::IsValid () const 18230fdc8d8SChris Lattner { 1836611103cSGreg Clayton return m_opaque_ap.get() != NULL; 18430fdc8d8SChris Lattner } 18530fdc8d8SChris Lattner 18630fdc8d8SChris Lattner void 18730fdc8d8SChris Lattner SBError::CreateIfNeeded () 18830fdc8d8SChris Lattner { 1896611103cSGreg Clayton if (m_opaque_ap.get() == NULL) 1906611103cSGreg Clayton m_opaque_ap.reset(new Error ()); 19130fdc8d8SChris Lattner } 19230fdc8d8SChris Lattner 19330fdc8d8SChris Lattner 19430fdc8d8SChris Lattner lldb_private::Error * 19530fdc8d8SChris Lattner SBError::operator->() 19630fdc8d8SChris Lattner { 1976611103cSGreg Clayton return m_opaque_ap.get(); 19830fdc8d8SChris Lattner } 19930fdc8d8SChris Lattner 20030fdc8d8SChris Lattner lldb_private::Error * 20130fdc8d8SChris Lattner SBError::get() 20230fdc8d8SChris Lattner { 2036611103cSGreg Clayton return m_opaque_ap.get(); 20430fdc8d8SChris Lattner } 20530fdc8d8SChris Lattner 2068f343b09SGreg Clayton lldb_private::Error & 2078f343b09SGreg Clayton SBError::ref() 2088f343b09SGreg Clayton { 2098f343b09SGreg Clayton CreateIfNeeded(); 2108f343b09SGreg Clayton return *m_opaque_ap; 2118f343b09SGreg Clayton } 21230fdc8d8SChris Lattner 21330fdc8d8SChris Lattner const lldb_private::Error & 21430fdc8d8SChris Lattner SBError::operator*() const 21530fdc8d8SChris Lattner { 21630fdc8d8SChris Lattner // Be sure to call "IsValid()" before calling this function or it will crash 2176611103cSGreg Clayton return *m_opaque_ap; 21830fdc8d8SChris Lattner } 21930fdc8d8SChris Lattner 220dde9cff3SCaroline Tice bool 221dde9cff3SCaroline Tice SBError::GetDescription (SBStream &description) 222dde9cff3SCaroline Tice { 223dde9cff3SCaroline Tice if (m_opaque_ap.get()) 224dde9cff3SCaroline Tice { 225262f80dfSGreg Clayton if (m_opaque_ap->Success()) 226262f80dfSGreg Clayton description.Printf ("success"); 227dde9cff3SCaroline Tice else 228dde9cff3SCaroline Tice { 229dde9cff3SCaroline Tice const char * err_string = GetCString(); 230262f80dfSGreg Clayton description.Printf ("error: %s", (err_string != NULL ? err_string : "")); 231dde9cff3SCaroline Tice } 232dde9cff3SCaroline Tice } 233dde9cff3SCaroline Tice else 234262f80dfSGreg Clayton description.Printf ("error: <NULL>"); 235ceb6b139SCaroline Tice 236ceb6b139SCaroline Tice return true; 237ceb6b139SCaroline Tice } 238