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