SBSymbolContext.cpp revision e49ec18f1868168c8927ae30a379db176ca8cce3
1//===-- SBSymbolContext.cpp -------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBSymbolContext.h"
11#include "lldb/API/SBStream.h"
12#include "lldb/Symbol/SymbolContext.h"
13
14using namespace lldb;
15using namespace lldb_private;
16
17
18
19SBSymbolContext::SBSymbolContext () :
20    m_opaque_ap ()
21{
22}
23
24SBSymbolContext::SBSymbolContext (const SymbolContext *sc_ptr) :
25    m_opaque_ap ()
26{
27    if (sc_ptr)
28        m_opaque_ap.reset (new SymbolContext (*sc_ptr));
29}
30
31SBSymbolContext::SBSymbolContext (const SBSymbolContext& rhs) :
32    m_opaque_ap ()
33{
34    if (rhs.IsValid())
35    {
36        if (m_opaque_ap.get())
37            *m_opaque_ap = *rhs.m_opaque_ap;
38        else
39            ref() = *rhs.m_opaque_ap;
40    }
41}
42
43SBSymbolContext::~SBSymbolContext ()
44{
45}
46
47const SBSymbolContext &
48SBSymbolContext::operator = (const SBSymbolContext &rhs)
49{
50    if (this != &rhs)
51    {
52        if (rhs.IsValid())
53            m_opaque_ap.reset (new lldb_private::SymbolContext(*rhs.m_opaque_ap.get()));
54    }
55    return *this;
56}
57
58void
59SBSymbolContext::SetSymbolContext (const SymbolContext *sc_ptr)
60{
61    if (sc_ptr)
62    {
63        if (m_opaque_ap.get())
64            *m_opaque_ap = *sc_ptr;
65        else
66            m_opaque_ap.reset (new SymbolContext (*sc_ptr));
67    }
68    else
69    {
70        if (m_opaque_ap.get())
71            m_opaque_ap->Clear();
72    }
73}
74
75bool
76SBSymbolContext::IsValid () const
77{
78    return m_opaque_ap.get() != NULL;
79}
80
81
82
83SBModule
84SBSymbolContext::GetModule ()
85{
86    SBModule sb_module;
87    if (m_opaque_ap.get())
88        sb_module.SetModule(m_opaque_ap->module_sp);
89    return sb_module;
90}
91
92SBCompileUnit
93SBSymbolContext::GetCompileUnit ()
94{
95    return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL);
96}
97
98SBFunction
99SBSymbolContext::GetFunction ()
100{
101    return SBFunction (m_opaque_ap.get() ? m_opaque_ap->function : NULL);
102}
103
104SBBlock
105SBSymbolContext::GetBlock ()
106{
107    return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL);
108}
109
110SBLineEntry
111SBSymbolContext::GetLineEntry ()
112{
113    SBLineEntry sb_line_entry;
114    if (m_opaque_ap.get())
115        sb_line_entry.SetLineEntry (m_opaque_ap->line_entry);
116
117    return sb_line_entry;
118}
119
120SBSymbol
121SBSymbolContext::GetSymbol ()
122{
123    return SBSymbol (m_opaque_ap.get() ? m_opaque_ap->symbol : NULL);
124}
125
126lldb_private::SymbolContext*
127SBSymbolContext::operator->() const
128{
129    return m_opaque_ap.get();
130}
131
132
133const lldb_private::SymbolContext&
134SBSymbolContext::operator*() const
135{
136    assert (m_opaque_ap.get());
137    return *m_opaque_ap.get();
138}
139
140
141lldb_private::SymbolContext&
142SBSymbolContext::operator*()
143{
144    if (m_opaque_ap.get() == NULL)
145        m_opaque_ap.reset (new SymbolContext);
146    return *m_opaque_ap.get();
147}
148
149lldb_private::SymbolContext&
150SBSymbolContext::ref()
151{
152    if (m_opaque_ap.get() == NULL)
153        m_opaque_ap.reset (new SymbolContext);
154    return *m_opaque_ap.get();
155}
156
157lldb_private::SymbolContext *
158SBSymbolContext::get() const
159{
160    return m_opaque_ap.get();
161}
162
163bool
164SBSymbolContext::GetDescription (SBStream &description)
165{
166    if (m_opaque_ap.get())
167    {
168        description.ref();
169        m_opaque_ap->GetDescription (description.get(), lldb::eDescriptionLevelFull, NULL);
170    }
171    else
172        description.Printf ("No value");
173
174    return true;
175}
176