124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SBError.cpp ---------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/API/SBError.h" 1198f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice#include "lldb/API/SBStream.h" 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Error.h" 137826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice#include "lldb/Core/Log.h" 1498f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice 151501a967735469f0e21950905cc64ca24d305fa0Eli Friedman#include <stdarg.h> 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::SBError () : 2263094e0bb161580564954dee512955c1c79d3476Greg Clayton m_opaque_ap () 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::SBError (const SBError &rhs) : 2763094e0bb161580564954dee512955c1c79d3476Greg Clayton m_opaque_ap () 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (rhs.IsValid()) 3063094e0bb161580564954dee512955c1c79d3476Greg Clayton m_opaque_ap.reset (new Error(*rhs)); 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::~SBError() 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst SBError & 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::operator = (const SBError &rhs) 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (rhs.IsValid()) 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4363094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_opaque_ap.get()) 4463094e0bb161580564954dee512955c1c79d3476Greg Clayton *m_opaque_ap = *rhs; 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 4663094e0bb161580564954dee512955c1c79d3476Greg Clayton m_opaque_ap.reset (new Error(*rhs)); 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 4963094e0bb161580564954dee512955c1c79d3476Greg Clayton m_opaque_ap.reset(); 507826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::GetCString () const 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5863094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_opaque_ap.get()) 5963094e0bb161580564954dee512955c1c79d3476Greg Clayton return m_opaque_ap->AsCString(); 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::Clear () 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6663094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_opaque_ap.get()) 6763094e0bb161580564954dee512955c1c79d3476Greg Clayton m_opaque_ap->Clear(); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::Fail () const 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 73952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 747826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 757826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice bool ret_value = false; 7663094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_opaque_ap.get()) 777826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice ret_value = m_opaque_ap->Fail(); 787826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 797826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice if (log) 80a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton log->Printf ("SBError(%p)::Fail () => %i", m_opaque_ap.get(), ret_value); 817826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 827826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice return ret_value; 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::Success () const 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 89574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham bool ret_value = true; 9063094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_opaque_ap.get()) 91a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton ret_value = m_opaque_ap->Success(); 92a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton 93a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton if (log) 94a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton log->Printf ("SBError(%p)::Success () => %i", m_opaque_ap.get(), ret_value); 95a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton 96a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton return ret_value; 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::GetError () const 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 102952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 103a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton 104a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton uint32_t err = 0; 10563094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_opaque_ap.get()) 106a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton err = m_opaque_ap->GetError(); 107a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton 108a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton if (log) 109a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton log->Printf ("SBError(%p)::GetError () => 0x%8.8x", m_opaque_ap.get(), err); 110a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton 111a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton 112a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton return err; 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerErrorType 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::GetType () const 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 118952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 119a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton ErrorType err_type = eErrorTypeInvalid; 12063094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_opaque_ap.get()) 121a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton err_type = m_opaque_ap->GetType(); 122a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton 123a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton if (log) 124a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton log->Printf ("SBError(%p)::GetType () => %i", m_opaque_ap.get(), err_type); 125a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton 126a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton return err_type; 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::SetError (uint32_t err, ErrorType type) 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateIfNeeded (); 13363094e0bb161580564954dee512955c1c79d3476Greg Clayton m_opaque_ap->SetError (err, type); 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::SetError (const Error &lldb_error) 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateIfNeeded (); 14063094e0bb161580564954dee512955c1c79d3476Greg Clayton *m_opaque_ap = lldb_error; 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::SetErrorToErrno () 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateIfNeeded (); 14863094e0bb161580564954dee512955c1c79d3476Greg Clayton m_opaque_ap->SetErrorToErrno (); 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::SetErrorToGenericError () 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateIfNeeded (); 15563094e0bb161580564954dee512955c1c79d3476Greg Clayton m_opaque_ap->SetErrorToErrno (); 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::SetErrorString (const char *err_str) 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateIfNeeded (); 16263094e0bb161580564954dee512955c1c79d3476Greg Clayton m_opaque_ap->SetErrorString (err_str); 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::SetErrorStringWithFormat (const char *format, ...) 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateIfNeeded (); 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 17163094e0bb161580564954dee512955c1c79d3476Greg Clayton int num_chars = m_opaque_ap->SetErrorStringWithVarArg (format, args); 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_chars; 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::IsValid () const 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17963094e0bb161580564954dee512955c1c79d3476Greg Clayton return m_opaque_ap.get() != NULL; 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::CreateIfNeeded () 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18563094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_opaque_ap.get() == NULL) 18663094e0bb161580564954dee512955c1c79d3476Greg Clayton m_opaque_ap.reset(new Error ()); 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::Error * 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::operator->() 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19363094e0bb161580564954dee512955c1c79d3476Greg Clayton return m_opaque_ap.get(); 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::Error * 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::get() 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19963094e0bb161580564954dee512955c1c79d3476Greg Clayton return m_opaque_ap.get(); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2020baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonlldb_private::Error & 2030baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonSBError::ref() 2040baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 2050baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton CreateIfNeeded(); 2060baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return *m_opaque_ap; 2070baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst lldb_private::Error & 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError::operator*() const 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Be sure to call "IsValid()" before calling this function or it will crash 21363094e0bb161580564954dee512955c1c79d3476Greg Clayton return *m_opaque_ap; 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21698f930f429160f9777f626c3ac6aa609f4e965d2Caroline Ticebool 21798f930f429160f9777f626c3ac6aa609f4e965d2Caroline TiceSBError::GetDescription (SBStream &description) 21898f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice{ 21998f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice if (m_opaque_ap.get()) 22098f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice { 221bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton if (m_opaque_ap->Success()) 222bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton description.Printf ("success"); 22398f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice else 22498f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice { 22598f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice const char * err_string = GetCString(); 226bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton description.Printf ("error: %s", (err_string != NULL ? err_string : "")); 22798f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice } 22898f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice } 22998f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice else 230bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton description.Printf ("error: <NULL>"); 2317826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 2327826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice return true; 2337826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice} 234