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" 11*dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 1230fdc8d8SChris Lattner #include "lldb/Core/Error.h" 13*dde9cff3SCaroline Tice 149c68da97SEli Friedman #include <stdarg.h> 1530fdc8d8SChris Lattner 1630fdc8d8SChris Lattner using namespace lldb; 1730fdc8d8SChris Lattner using namespace lldb_private; 1830fdc8d8SChris Lattner 1930fdc8d8SChris Lattner 2030fdc8d8SChris Lattner SBError::SBError () : 216611103cSGreg Clayton m_opaque_ap () 2230fdc8d8SChris Lattner { 2330fdc8d8SChris Lattner } 2430fdc8d8SChris Lattner 2530fdc8d8SChris Lattner SBError::SBError (const SBError &rhs) : 266611103cSGreg Clayton m_opaque_ap () 2730fdc8d8SChris Lattner { 2830fdc8d8SChris Lattner if (rhs.IsValid()) 296611103cSGreg Clayton m_opaque_ap.reset (new Error(*rhs)); 3030fdc8d8SChris Lattner } 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner 3330fdc8d8SChris Lattner SBError::~SBError() 3430fdc8d8SChris Lattner { 3530fdc8d8SChris Lattner } 3630fdc8d8SChris Lattner 3730fdc8d8SChris Lattner const SBError & 3830fdc8d8SChris Lattner SBError::operator = (const SBError &rhs) 3930fdc8d8SChris Lattner { 4030fdc8d8SChris Lattner if (rhs.IsValid()) 4130fdc8d8SChris Lattner { 426611103cSGreg Clayton if (m_opaque_ap.get()) 436611103cSGreg Clayton *m_opaque_ap = *rhs; 4430fdc8d8SChris Lattner else 456611103cSGreg Clayton m_opaque_ap.reset (new Error(*rhs)); 4630fdc8d8SChris Lattner } 4730fdc8d8SChris Lattner else 4830fdc8d8SChris Lattner { 496611103cSGreg Clayton m_opaque_ap.reset(); 5030fdc8d8SChris Lattner } 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 { 736611103cSGreg Clayton if (m_opaque_ap.get()) 746611103cSGreg Clayton return m_opaque_ap->Fail(); 7530fdc8d8SChris Lattner return false; 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 7830fdc8d8SChris Lattner bool 7930fdc8d8SChris Lattner SBError::Success () const 8030fdc8d8SChris Lattner { 816611103cSGreg Clayton if (m_opaque_ap.get()) 826611103cSGreg Clayton return m_opaque_ap->Success(); 8330fdc8d8SChris Lattner return false; 8430fdc8d8SChris Lattner } 8530fdc8d8SChris Lattner 8630fdc8d8SChris Lattner uint32_t 8730fdc8d8SChris Lattner SBError::GetError () const 8830fdc8d8SChris Lattner { 896611103cSGreg Clayton if (m_opaque_ap.get()) 906611103cSGreg Clayton return m_opaque_ap->GetError(); 9130fdc8d8SChris Lattner return true; 9230fdc8d8SChris Lattner } 9330fdc8d8SChris Lattner 9430fdc8d8SChris Lattner ErrorType 9530fdc8d8SChris Lattner SBError::GetType () const 9630fdc8d8SChris Lattner { 976611103cSGreg Clayton if (m_opaque_ap.get()) 986611103cSGreg Clayton return m_opaque_ap->GetType(); 9930fdc8d8SChris Lattner return eErrorTypeInvalid; 10030fdc8d8SChris Lattner } 10130fdc8d8SChris Lattner 10230fdc8d8SChris Lattner void 10330fdc8d8SChris Lattner SBError::SetError (uint32_t err, ErrorType type) 10430fdc8d8SChris Lattner { 10530fdc8d8SChris Lattner CreateIfNeeded (); 1066611103cSGreg Clayton m_opaque_ap->SetError (err, type); 10730fdc8d8SChris Lattner } 10830fdc8d8SChris Lattner 10930fdc8d8SChris Lattner void 11030fdc8d8SChris Lattner SBError::SetError (const Error &lldb_error) 11130fdc8d8SChris Lattner { 11230fdc8d8SChris Lattner CreateIfNeeded (); 1136611103cSGreg Clayton *m_opaque_ap = lldb_error; 11430fdc8d8SChris Lattner } 11530fdc8d8SChris Lattner 11630fdc8d8SChris Lattner 11730fdc8d8SChris Lattner void 11830fdc8d8SChris Lattner SBError::SetErrorToErrno () 11930fdc8d8SChris Lattner { 12030fdc8d8SChris Lattner CreateIfNeeded (); 1216611103cSGreg Clayton m_opaque_ap->SetErrorToErrno (); 12230fdc8d8SChris Lattner } 12330fdc8d8SChris Lattner 12430fdc8d8SChris Lattner void 12530fdc8d8SChris Lattner SBError::SetErrorToGenericError () 12630fdc8d8SChris Lattner { 12730fdc8d8SChris Lattner CreateIfNeeded (); 1286611103cSGreg Clayton m_opaque_ap->SetErrorToErrno (); 12930fdc8d8SChris Lattner } 13030fdc8d8SChris Lattner 13130fdc8d8SChris Lattner void 13230fdc8d8SChris Lattner SBError::SetErrorString (const char *err_str) 13330fdc8d8SChris Lattner { 13430fdc8d8SChris Lattner CreateIfNeeded (); 1356611103cSGreg Clayton m_opaque_ap->SetErrorString (err_str); 13630fdc8d8SChris Lattner } 13730fdc8d8SChris Lattner 13830fdc8d8SChris Lattner int 13930fdc8d8SChris Lattner SBError::SetErrorStringWithFormat (const char *format, ...) 14030fdc8d8SChris Lattner { 14130fdc8d8SChris Lattner CreateIfNeeded (); 14230fdc8d8SChris Lattner va_list args; 14330fdc8d8SChris Lattner va_start (args, format); 1446611103cSGreg Clayton int num_chars = m_opaque_ap->SetErrorStringWithVarArg (format, args); 14530fdc8d8SChris Lattner va_end (args); 14630fdc8d8SChris Lattner return num_chars; 14730fdc8d8SChris Lattner } 14830fdc8d8SChris Lattner 14930fdc8d8SChris Lattner bool 15030fdc8d8SChris Lattner SBError::IsValid () const 15130fdc8d8SChris Lattner { 1526611103cSGreg Clayton return m_opaque_ap.get() != NULL; 15330fdc8d8SChris Lattner } 15430fdc8d8SChris Lattner 15530fdc8d8SChris Lattner void 15630fdc8d8SChris Lattner SBError::CreateIfNeeded () 15730fdc8d8SChris Lattner { 1586611103cSGreg Clayton if (m_opaque_ap.get() == NULL) 1596611103cSGreg Clayton m_opaque_ap.reset(new Error ()); 16030fdc8d8SChris Lattner } 16130fdc8d8SChris Lattner 16230fdc8d8SChris Lattner 16330fdc8d8SChris Lattner lldb_private::Error * 16430fdc8d8SChris Lattner SBError::operator->() 16530fdc8d8SChris Lattner { 1666611103cSGreg Clayton return m_opaque_ap.get(); 16730fdc8d8SChris Lattner } 16830fdc8d8SChris Lattner 16930fdc8d8SChris Lattner lldb_private::Error * 17030fdc8d8SChris Lattner SBError::get() 17130fdc8d8SChris Lattner { 1726611103cSGreg Clayton return m_opaque_ap.get(); 17330fdc8d8SChris Lattner } 17430fdc8d8SChris Lattner 17530fdc8d8SChris Lattner 17630fdc8d8SChris Lattner const lldb_private::Error & 17730fdc8d8SChris Lattner SBError::operator*() const 17830fdc8d8SChris Lattner { 17930fdc8d8SChris Lattner // Be sure to call "IsValid()" before calling this function or it will crash 1806611103cSGreg Clayton return *m_opaque_ap; 18130fdc8d8SChris Lattner } 18230fdc8d8SChris Lattner 183*dde9cff3SCaroline Tice bool 184*dde9cff3SCaroline Tice SBError::GetDescription (SBStream &description) 185*dde9cff3SCaroline Tice { 186*dde9cff3SCaroline Tice if (m_opaque_ap.get()) 187*dde9cff3SCaroline Tice { 188*dde9cff3SCaroline Tice if (Success()) 189*dde9cff3SCaroline Tice description.Printf ("Status: Success"); 190*dde9cff3SCaroline Tice else 191*dde9cff3SCaroline Tice { 192*dde9cff3SCaroline Tice const char * err_string = GetCString(); 193*dde9cff3SCaroline Tice description.Printf ("Status: Error: %s", (err_string != NULL ? err_string : "")); 194*dde9cff3SCaroline Tice } 195*dde9cff3SCaroline Tice } 196*dde9cff3SCaroline Tice else 197*dde9cff3SCaroline Tice description.Printf ("No value"); 198*dde9cff3SCaroline Tice 199*dde9cff3SCaroline Tice return true; 200*dde9cff3SCaroline Tice } 201*dde9cff3SCaroline Tice 202*dde9cff3SCaroline Tice PyObject * 203*dde9cff3SCaroline Tice SBError::__repr__ () 204*dde9cff3SCaroline Tice { 205*dde9cff3SCaroline Tice SBStream description; 206*dde9cff3SCaroline Tice GetDescription (description); 207*dde9cff3SCaroline Tice return PyString_FromString (description.GetData()); 208*dde9cff3SCaroline Tice } 209