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" 13*ceb6b139SCaroline 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 { 24*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE); 25*ceb6b139SCaroline Tice 26*ceb6b139SCaroline Tice if (log) 27*ceb6b139SCaroline Tice log->Printf ("SBError::SBError () ==> this = %p", this); 2830fdc8d8SChris Lattner } 2930fdc8d8SChris Lattner 3030fdc8d8SChris Lattner SBError::SBError (const SBError &rhs) : 316611103cSGreg Clayton m_opaque_ap () 3230fdc8d8SChris Lattner { 33*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE); 34*ceb6b139SCaroline Tice 3530fdc8d8SChris Lattner if (rhs.IsValid()) 366611103cSGreg Clayton m_opaque_ap.reset (new Error(*rhs)); 37*ceb6b139SCaroline Tice 38*ceb6b139SCaroline Tice if (log) 39*ceb6b139SCaroline Tice { 40*ceb6b139SCaroline Tice SBStream sstr; 41*ceb6b139SCaroline Tice GetDescription (sstr); 42*ceb6b139SCaroline Tice log->Printf ("SBError::SBError (const SBError &rhs) rhs.m_opaque_ap.get() = %p ==> this = %p (%s)", 43*ceb6b139SCaroline Tice (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL), this, sstr.GetData()); 44*ceb6b139SCaroline Tice } 4530fdc8d8SChris Lattner } 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner SBError::~SBError() 4930fdc8d8SChris Lattner { 5030fdc8d8SChris Lattner } 5130fdc8d8SChris Lattner 5230fdc8d8SChris Lattner const SBError & 5330fdc8d8SChris Lattner SBError::operator = (const SBError &rhs) 5430fdc8d8SChris Lattner { 55*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 56*ceb6b139SCaroline Tice 57*ceb6b139SCaroline Tice if (log) 58*ceb6b139SCaroline Tice { 59*ceb6b139SCaroline Tice SBStream sstr; 60*ceb6b139SCaroline Tice rhs.GetDescription (sstr); 61*ceb6b139SCaroline Tice log->Printf ("SBError::operator= (const SBError &rhs) rhs.m_opaque_ap.get() = %p (%s)", 62*ceb6b139SCaroline Tice (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL), sstr.GetData()); 63*ceb6b139SCaroline Tice } 64*ceb6b139SCaroline Tice 6530fdc8d8SChris Lattner if (rhs.IsValid()) 6630fdc8d8SChris Lattner { 676611103cSGreg Clayton if (m_opaque_ap.get()) 686611103cSGreg Clayton *m_opaque_ap = *rhs; 6930fdc8d8SChris Lattner else 706611103cSGreg Clayton m_opaque_ap.reset (new Error(*rhs)); 7130fdc8d8SChris Lattner } 7230fdc8d8SChris Lattner else 7330fdc8d8SChris Lattner { 746611103cSGreg Clayton m_opaque_ap.reset(); 7530fdc8d8SChris Lattner } 76*ceb6b139SCaroline Tice 77*ceb6b139SCaroline Tice if (log) 78*ceb6b139SCaroline Tice log->Printf ("SBError::operator= ==> this = %p", this); 79*ceb6b139SCaroline Tice 8030fdc8d8SChris Lattner return *this; 8130fdc8d8SChris Lattner } 8230fdc8d8SChris Lattner 8330fdc8d8SChris Lattner 8430fdc8d8SChris Lattner const char * 8530fdc8d8SChris Lattner SBError::GetCString () const 8630fdc8d8SChris Lattner { 876611103cSGreg Clayton if (m_opaque_ap.get()) 886611103cSGreg Clayton return m_opaque_ap->AsCString(); 8930fdc8d8SChris Lattner return NULL; 9030fdc8d8SChris Lattner } 9130fdc8d8SChris Lattner 9230fdc8d8SChris Lattner void 9330fdc8d8SChris Lattner SBError::Clear () 9430fdc8d8SChris Lattner { 956611103cSGreg Clayton if (m_opaque_ap.get()) 966611103cSGreg Clayton m_opaque_ap->Clear(); 9730fdc8d8SChris Lattner } 9830fdc8d8SChris Lattner 9930fdc8d8SChris Lattner bool 10030fdc8d8SChris Lattner SBError::Fail () const 10130fdc8d8SChris Lattner { 102*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 103*ceb6b139SCaroline Tice 104*ceb6b139SCaroline Tice if (log) 105*ceb6b139SCaroline Tice log->Printf ("SBError::Fail ()"); 106*ceb6b139SCaroline Tice 107*ceb6b139SCaroline Tice bool ret_value = false; 1086611103cSGreg Clayton if (m_opaque_ap.get()) 109*ceb6b139SCaroline Tice ret_value = m_opaque_ap->Fail(); 110*ceb6b139SCaroline Tice 111*ceb6b139SCaroline Tice if (log) 112*ceb6b139SCaroline Tice log->Printf ("SBError::Fail ==> %s", (ret_value ? "true" : "false")); 113*ceb6b139SCaroline Tice 114*ceb6b139SCaroline Tice return ret_value; 11530fdc8d8SChris Lattner } 11630fdc8d8SChris Lattner 11730fdc8d8SChris Lattner bool 11830fdc8d8SChris Lattner SBError::Success () const 11930fdc8d8SChris Lattner { 1206611103cSGreg Clayton if (m_opaque_ap.get()) 1216611103cSGreg Clayton return m_opaque_ap->Success(); 12230fdc8d8SChris Lattner return false; 12330fdc8d8SChris Lattner } 12430fdc8d8SChris Lattner 12530fdc8d8SChris Lattner uint32_t 12630fdc8d8SChris Lattner SBError::GetError () const 12730fdc8d8SChris Lattner { 1286611103cSGreg Clayton if (m_opaque_ap.get()) 1296611103cSGreg Clayton return m_opaque_ap->GetError(); 13030fdc8d8SChris Lattner return true; 13130fdc8d8SChris Lattner } 13230fdc8d8SChris Lattner 13330fdc8d8SChris Lattner ErrorType 13430fdc8d8SChris Lattner SBError::GetType () const 13530fdc8d8SChris Lattner { 1366611103cSGreg Clayton if (m_opaque_ap.get()) 1376611103cSGreg Clayton return m_opaque_ap->GetType(); 13830fdc8d8SChris Lattner return eErrorTypeInvalid; 13930fdc8d8SChris Lattner } 14030fdc8d8SChris Lattner 14130fdc8d8SChris Lattner void 14230fdc8d8SChris Lattner SBError::SetError (uint32_t err, ErrorType type) 14330fdc8d8SChris Lattner { 14430fdc8d8SChris Lattner CreateIfNeeded (); 1456611103cSGreg Clayton m_opaque_ap->SetError (err, type); 14630fdc8d8SChris Lattner } 14730fdc8d8SChris Lattner 14830fdc8d8SChris Lattner void 14930fdc8d8SChris Lattner SBError::SetError (const Error &lldb_error) 15030fdc8d8SChris Lattner { 15130fdc8d8SChris Lattner CreateIfNeeded (); 1526611103cSGreg Clayton *m_opaque_ap = lldb_error; 15330fdc8d8SChris Lattner } 15430fdc8d8SChris Lattner 15530fdc8d8SChris Lattner 15630fdc8d8SChris Lattner void 15730fdc8d8SChris Lattner SBError::SetErrorToErrno () 15830fdc8d8SChris Lattner { 15930fdc8d8SChris Lattner CreateIfNeeded (); 1606611103cSGreg Clayton m_opaque_ap->SetErrorToErrno (); 16130fdc8d8SChris Lattner } 16230fdc8d8SChris Lattner 16330fdc8d8SChris Lattner void 16430fdc8d8SChris Lattner SBError::SetErrorToGenericError () 16530fdc8d8SChris Lattner { 16630fdc8d8SChris Lattner CreateIfNeeded (); 1676611103cSGreg Clayton m_opaque_ap->SetErrorToErrno (); 16830fdc8d8SChris Lattner } 16930fdc8d8SChris Lattner 17030fdc8d8SChris Lattner void 17130fdc8d8SChris Lattner SBError::SetErrorString (const char *err_str) 17230fdc8d8SChris Lattner { 17330fdc8d8SChris Lattner CreateIfNeeded (); 1746611103cSGreg Clayton m_opaque_ap->SetErrorString (err_str); 17530fdc8d8SChris Lattner } 17630fdc8d8SChris Lattner 17730fdc8d8SChris Lattner int 17830fdc8d8SChris Lattner SBError::SetErrorStringWithFormat (const char *format, ...) 17930fdc8d8SChris Lattner { 18030fdc8d8SChris Lattner CreateIfNeeded (); 18130fdc8d8SChris Lattner va_list args; 18230fdc8d8SChris Lattner va_start (args, format); 1836611103cSGreg Clayton int num_chars = m_opaque_ap->SetErrorStringWithVarArg (format, args); 18430fdc8d8SChris Lattner va_end (args); 18530fdc8d8SChris Lattner return num_chars; 18630fdc8d8SChris Lattner } 18730fdc8d8SChris Lattner 18830fdc8d8SChris Lattner bool 18930fdc8d8SChris Lattner SBError::IsValid () const 19030fdc8d8SChris Lattner { 1916611103cSGreg Clayton return m_opaque_ap.get() != NULL; 19230fdc8d8SChris Lattner } 19330fdc8d8SChris Lattner 19430fdc8d8SChris Lattner void 19530fdc8d8SChris Lattner SBError::CreateIfNeeded () 19630fdc8d8SChris Lattner { 1976611103cSGreg Clayton if (m_opaque_ap.get() == NULL) 1986611103cSGreg Clayton m_opaque_ap.reset(new Error ()); 19930fdc8d8SChris Lattner } 20030fdc8d8SChris Lattner 20130fdc8d8SChris Lattner 20230fdc8d8SChris Lattner lldb_private::Error * 20330fdc8d8SChris Lattner SBError::operator->() 20430fdc8d8SChris Lattner { 2056611103cSGreg Clayton return m_opaque_ap.get(); 20630fdc8d8SChris Lattner } 20730fdc8d8SChris Lattner 20830fdc8d8SChris Lattner lldb_private::Error * 20930fdc8d8SChris Lattner SBError::get() 21030fdc8d8SChris Lattner { 2116611103cSGreg Clayton return m_opaque_ap.get(); 21230fdc8d8SChris Lattner } 21330fdc8d8SChris Lattner 21430fdc8d8SChris Lattner 21530fdc8d8SChris Lattner const lldb_private::Error & 21630fdc8d8SChris Lattner SBError::operator*() const 21730fdc8d8SChris Lattner { 21830fdc8d8SChris Lattner // Be sure to call "IsValid()" before calling this function or it will crash 2196611103cSGreg Clayton return *m_opaque_ap; 22030fdc8d8SChris Lattner } 22130fdc8d8SChris Lattner 222dde9cff3SCaroline Tice bool 223dde9cff3SCaroline Tice SBError::GetDescription (SBStream &description) 224dde9cff3SCaroline Tice { 225dde9cff3SCaroline Tice if (m_opaque_ap.get()) 226dde9cff3SCaroline Tice { 227dde9cff3SCaroline Tice if (Success()) 228dde9cff3SCaroline Tice description.Printf ("Status: Success"); 229dde9cff3SCaroline Tice else 230dde9cff3SCaroline Tice { 231dde9cff3SCaroline Tice const char * err_string = GetCString(); 232dde9cff3SCaroline Tice description.Printf ("Status: Error: %s", (err_string != NULL ? err_string : "")); 233dde9cff3SCaroline Tice } 234dde9cff3SCaroline Tice } 235dde9cff3SCaroline Tice else 236dde9cff3SCaroline Tice description.Printf ("No value"); 237dde9cff3SCaroline Tice 238dde9cff3SCaroline Tice return true; 239dde9cff3SCaroline Tice } 240*ceb6b139SCaroline Tice 241*ceb6b139SCaroline Tice bool 242*ceb6b139SCaroline Tice SBError::GetDescription (SBStream &description) const 243*ceb6b139SCaroline Tice { 244*ceb6b139SCaroline Tice if (m_opaque_ap.get()) 245*ceb6b139SCaroline Tice { 246*ceb6b139SCaroline Tice if (Success()) 247*ceb6b139SCaroline Tice description.Printf ("Status: Success"); 248*ceb6b139SCaroline Tice else 249*ceb6b139SCaroline Tice { 250*ceb6b139SCaroline Tice const char * err_string = GetCString(); 251*ceb6b139SCaroline Tice description.Printf ("Status: Error: %s", (err_string != NULL ? err_string : "")); 252*ceb6b139SCaroline Tice } 253*ceb6b139SCaroline Tice } 254*ceb6b139SCaroline Tice else 255*ceb6b139SCaroline Tice description.Printf ("No value"); 256*ceb6b139SCaroline Tice 257*ceb6b139SCaroline Tice return true; 258*ceb6b139SCaroline Tice } 259