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 { 29750cd175SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 30ceb6b139SCaroline Tice 3130fdc8d8SChris Lattner if (rhs.IsValid()) 326611103cSGreg Clayton m_opaque_ap.reset (new Error(*rhs)); 33ceb6b139SCaroline Tice 34ceb6b139SCaroline Tice if (log) 35ceb6b139SCaroline Tice { 36ceb6b139SCaroline Tice SBStream sstr; 37ceb6b139SCaroline Tice GetDescription (sstr); 38*4838131bSGreg Clayton log->Printf ("SBError::SBError (const SBError rhs.ap=%p) => SBError(%p): %s", 39*4838131bSGreg Clayton rhs.m_opaque_ap.get(), m_opaque_ap.get(), sstr.GetData()); 40ceb6b139SCaroline Tice } 4130fdc8d8SChris Lattner } 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner 4430fdc8d8SChris Lattner SBError::~SBError() 4530fdc8d8SChris Lattner { 4630fdc8d8SChris Lattner } 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner const SBError & 4930fdc8d8SChris Lattner SBError::operator = (const SBError &rhs) 5030fdc8d8SChris Lattner { 51ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 52*4838131bSGreg Clayton void *old_error = m_opaque_ap.get(); 5330fdc8d8SChris Lattner if (rhs.IsValid()) 5430fdc8d8SChris Lattner { 556611103cSGreg Clayton if (m_opaque_ap.get()) 566611103cSGreg Clayton *m_opaque_ap = *rhs; 5730fdc8d8SChris Lattner else 586611103cSGreg Clayton m_opaque_ap.reset (new Error(*rhs)); 5930fdc8d8SChris Lattner } 6030fdc8d8SChris Lattner else 6130fdc8d8SChris Lattner { 626611103cSGreg Clayton m_opaque_ap.reset(); 6330fdc8d8SChris Lattner } 64ceb6b139SCaroline Tice 65ceb6b139SCaroline Tice if (log) 66750cd175SCaroline Tice { 67750cd175SCaroline Tice SBStream sstr; 68750cd175SCaroline Tice GetDescription (sstr); 69*4838131bSGreg Clayton log->Printf ("SBError(%p)::operator= (SBError(%p)) => SBError(%s)", 70*4838131bSGreg Clayton old_error, rhs.m_opaque_ap.get(), sstr.GetData()); 71750cd175SCaroline Tice } 72ceb6b139SCaroline Tice 7330fdc8d8SChris Lattner return *this; 7430fdc8d8SChris Lattner } 7530fdc8d8SChris Lattner 7630fdc8d8SChris Lattner 7730fdc8d8SChris Lattner const char * 7830fdc8d8SChris Lattner SBError::GetCString () const 7930fdc8d8SChris Lattner { 806611103cSGreg Clayton if (m_opaque_ap.get()) 816611103cSGreg Clayton return m_opaque_ap->AsCString(); 8230fdc8d8SChris Lattner return NULL; 8330fdc8d8SChris Lattner } 8430fdc8d8SChris Lattner 8530fdc8d8SChris Lattner void 8630fdc8d8SChris Lattner SBError::Clear () 8730fdc8d8SChris Lattner { 886611103cSGreg Clayton if (m_opaque_ap.get()) 896611103cSGreg Clayton m_opaque_ap->Clear(); 9030fdc8d8SChris Lattner } 9130fdc8d8SChris Lattner 9230fdc8d8SChris Lattner bool 9330fdc8d8SChris Lattner SBError::Fail () const 9430fdc8d8SChris Lattner { 95ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 96ceb6b139SCaroline Tice 97ceb6b139SCaroline Tice bool ret_value = false; 986611103cSGreg Clayton if (m_opaque_ap.get()) 99ceb6b139SCaroline Tice ret_value = m_opaque_ap->Fail(); 100ceb6b139SCaroline Tice 101ceb6b139SCaroline Tice if (log) 102*4838131bSGreg Clayton log->Printf ("SBError(%p)::Fail () => %i", m_opaque_ap.get(), ret_value); 103ceb6b139SCaroline Tice 104ceb6b139SCaroline Tice return ret_value; 10530fdc8d8SChris Lattner } 10630fdc8d8SChris Lattner 10730fdc8d8SChris Lattner bool 10830fdc8d8SChris Lattner SBError::Success () const 10930fdc8d8SChris Lattner { 110*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 111*4838131bSGreg Clayton bool ret_value = false; 1126611103cSGreg Clayton if (m_opaque_ap.get()) 113*4838131bSGreg Clayton ret_value = m_opaque_ap->Success(); 114*4838131bSGreg Clayton 115*4838131bSGreg Clayton if (log) 116*4838131bSGreg Clayton log->Printf ("SBError(%p)::Success () => %i", m_opaque_ap.get(), ret_value); 117*4838131bSGreg Clayton 118*4838131bSGreg Clayton return ret_value; 11930fdc8d8SChris Lattner } 12030fdc8d8SChris Lattner 12130fdc8d8SChris Lattner uint32_t 12230fdc8d8SChris Lattner SBError::GetError () const 12330fdc8d8SChris Lattner { 124*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 125*4838131bSGreg Clayton 126*4838131bSGreg Clayton uint32_t err = 0; 1276611103cSGreg Clayton if (m_opaque_ap.get()) 128*4838131bSGreg Clayton err = m_opaque_ap->GetError(); 129*4838131bSGreg Clayton 130*4838131bSGreg Clayton if (log) 131*4838131bSGreg Clayton log->Printf ("SBError(%p)::GetError () => 0x%8.8x", m_opaque_ap.get(), err); 132*4838131bSGreg Clayton 133*4838131bSGreg Clayton 134*4838131bSGreg Clayton return err; 13530fdc8d8SChris Lattner } 13630fdc8d8SChris Lattner 13730fdc8d8SChris Lattner ErrorType 13830fdc8d8SChris Lattner SBError::GetType () const 13930fdc8d8SChris Lattner { 140*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 141*4838131bSGreg Clayton ErrorType err_type = eErrorTypeInvalid; 1426611103cSGreg Clayton if (m_opaque_ap.get()) 143*4838131bSGreg Clayton err_type = m_opaque_ap->GetType(); 144*4838131bSGreg Clayton 145*4838131bSGreg Clayton if (log) 146*4838131bSGreg Clayton log->Printf ("SBError(%p)::GetType () => %i", m_opaque_ap.get(), err_type); 147*4838131bSGreg Clayton 148*4838131bSGreg Clayton return err_type; 14930fdc8d8SChris Lattner } 15030fdc8d8SChris Lattner 15130fdc8d8SChris Lattner void 15230fdc8d8SChris Lattner SBError::SetError (uint32_t err, ErrorType type) 15330fdc8d8SChris Lattner { 15430fdc8d8SChris Lattner CreateIfNeeded (); 1556611103cSGreg Clayton m_opaque_ap->SetError (err, type); 15630fdc8d8SChris Lattner } 15730fdc8d8SChris Lattner 15830fdc8d8SChris Lattner void 15930fdc8d8SChris Lattner SBError::SetError (const Error &lldb_error) 16030fdc8d8SChris Lattner { 16130fdc8d8SChris Lattner CreateIfNeeded (); 1626611103cSGreg Clayton *m_opaque_ap = lldb_error; 16330fdc8d8SChris Lattner } 16430fdc8d8SChris Lattner 16530fdc8d8SChris Lattner 16630fdc8d8SChris Lattner void 16730fdc8d8SChris Lattner SBError::SetErrorToErrno () 16830fdc8d8SChris Lattner { 16930fdc8d8SChris Lattner CreateIfNeeded (); 1706611103cSGreg Clayton m_opaque_ap->SetErrorToErrno (); 17130fdc8d8SChris Lattner } 17230fdc8d8SChris Lattner 17330fdc8d8SChris Lattner void 17430fdc8d8SChris Lattner SBError::SetErrorToGenericError () 17530fdc8d8SChris Lattner { 17630fdc8d8SChris Lattner CreateIfNeeded (); 1776611103cSGreg Clayton m_opaque_ap->SetErrorToErrno (); 17830fdc8d8SChris Lattner } 17930fdc8d8SChris Lattner 18030fdc8d8SChris Lattner void 18130fdc8d8SChris Lattner SBError::SetErrorString (const char *err_str) 18230fdc8d8SChris Lattner { 18330fdc8d8SChris Lattner CreateIfNeeded (); 1846611103cSGreg Clayton m_opaque_ap->SetErrorString (err_str); 18530fdc8d8SChris Lattner } 18630fdc8d8SChris Lattner 18730fdc8d8SChris Lattner int 18830fdc8d8SChris Lattner SBError::SetErrorStringWithFormat (const char *format, ...) 18930fdc8d8SChris Lattner { 19030fdc8d8SChris Lattner CreateIfNeeded (); 19130fdc8d8SChris Lattner va_list args; 19230fdc8d8SChris Lattner va_start (args, format); 1936611103cSGreg Clayton int num_chars = m_opaque_ap->SetErrorStringWithVarArg (format, args); 19430fdc8d8SChris Lattner va_end (args); 19530fdc8d8SChris Lattner return num_chars; 19630fdc8d8SChris Lattner } 19730fdc8d8SChris Lattner 19830fdc8d8SChris Lattner bool 19930fdc8d8SChris Lattner SBError::IsValid () const 20030fdc8d8SChris Lattner { 2016611103cSGreg Clayton return m_opaque_ap.get() != NULL; 20230fdc8d8SChris Lattner } 20330fdc8d8SChris Lattner 20430fdc8d8SChris Lattner void 20530fdc8d8SChris Lattner SBError::CreateIfNeeded () 20630fdc8d8SChris Lattner { 2076611103cSGreg Clayton if (m_opaque_ap.get() == NULL) 2086611103cSGreg Clayton m_opaque_ap.reset(new Error ()); 20930fdc8d8SChris Lattner } 21030fdc8d8SChris Lattner 21130fdc8d8SChris Lattner 21230fdc8d8SChris Lattner lldb_private::Error * 21330fdc8d8SChris Lattner SBError::operator->() 21430fdc8d8SChris Lattner { 2156611103cSGreg Clayton return m_opaque_ap.get(); 21630fdc8d8SChris Lattner } 21730fdc8d8SChris Lattner 21830fdc8d8SChris Lattner lldb_private::Error * 21930fdc8d8SChris Lattner SBError::get() 22030fdc8d8SChris Lattner { 2216611103cSGreg Clayton return m_opaque_ap.get(); 22230fdc8d8SChris Lattner } 22330fdc8d8SChris Lattner 22430fdc8d8SChris Lattner 22530fdc8d8SChris Lattner const lldb_private::Error & 22630fdc8d8SChris Lattner SBError::operator*() const 22730fdc8d8SChris Lattner { 22830fdc8d8SChris Lattner // Be sure to call "IsValid()" before calling this function or it will crash 2296611103cSGreg Clayton return *m_opaque_ap; 23030fdc8d8SChris Lattner } 23130fdc8d8SChris Lattner 232dde9cff3SCaroline Tice bool 233dde9cff3SCaroline Tice SBError::GetDescription (SBStream &description) 234dde9cff3SCaroline Tice { 235dde9cff3SCaroline Tice if (m_opaque_ap.get()) 236dde9cff3SCaroline Tice { 237dde9cff3SCaroline Tice if (Success()) 238dde9cff3SCaroline Tice description.Printf ("Status: Success"); 239dde9cff3SCaroline Tice else 240dde9cff3SCaroline Tice { 241dde9cff3SCaroline Tice const char * err_string = GetCString(); 242dde9cff3SCaroline Tice description.Printf ("Status: Error: %s", (err_string != NULL ? err_string : "")); 243dde9cff3SCaroline Tice } 244dde9cff3SCaroline Tice } 245dde9cff3SCaroline Tice else 246dde9cff3SCaroline Tice description.Printf ("No value"); 247dde9cff3SCaroline Tice 248dde9cff3SCaroline Tice return true; 249dde9cff3SCaroline Tice } 250ceb6b139SCaroline Tice 251ceb6b139SCaroline Tice bool 252ceb6b139SCaroline Tice SBError::GetDescription (SBStream &description) const 253ceb6b139SCaroline Tice { 254ceb6b139SCaroline Tice if (m_opaque_ap.get()) 255ceb6b139SCaroline Tice { 256ceb6b139SCaroline Tice if (Success()) 257ceb6b139SCaroline Tice description.Printf ("Status: Success"); 258ceb6b139SCaroline Tice else 259ceb6b139SCaroline Tice { 260ceb6b139SCaroline Tice const char * err_string = GetCString(); 261ceb6b139SCaroline Tice description.Printf ("Status: Error: %s", (err_string != NULL ? err_string : "")); 262ceb6b139SCaroline Tice } 263ceb6b139SCaroline Tice } 264ceb6b139SCaroline Tice else 265ceb6b139SCaroline Tice description.Printf ("No value"); 266ceb6b139SCaroline Tice 267ceb6b139SCaroline Tice return true; 268ceb6b139SCaroline Tice } 269