1254721Semaste//===-- SBLineEntry.cpp -----------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include <limits.h>
11254721Semaste
12254721Semaste#include "lldb/API/SBLineEntry.h"
13254721Semaste#include "lldb/API/SBStream.h"
14254721Semaste#include "lldb/Core/StreamString.h"
15254721Semaste#include "lldb/Core/Log.h"
16254721Semaste#include "lldb/Symbol/LineEntry.h"
17254721Semaste
18254721Semasteusing namespace lldb;
19254721Semasteusing namespace lldb_private;
20254721Semaste
21254721Semaste
22254721SemasteSBLineEntry::SBLineEntry () :
23254721Semaste    m_opaque_ap ()
24254721Semaste{
25254721Semaste}
26254721Semaste
27254721SemasteSBLineEntry::SBLineEntry (const SBLineEntry &rhs) :
28254721Semaste    m_opaque_ap ()
29254721Semaste{
30254721Semaste    if (rhs.IsValid())
31254721Semaste        ref() = rhs.ref();
32254721Semaste}
33254721Semaste
34254721SemasteSBLineEntry::SBLineEntry (const lldb_private::LineEntry *lldb_object_ptr) :
35254721Semaste    m_opaque_ap ()
36254721Semaste{
37254721Semaste    if (lldb_object_ptr)
38254721Semaste        ref() = *lldb_object_ptr;
39254721Semaste}
40254721Semaste
41254721Semasteconst SBLineEntry &
42254721SemasteSBLineEntry::operator = (const SBLineEntry &rhs)
43254721Semaste{
44254721Semaste    if (this != &rhs)
45254721Semaste    {
46254721Semaste        if (rhs.IsValid())
47254721Semaste            ref() = rhs.ref();
48254721Semaste        else
49254721Semaste            m_opaque_ap.reset();
50254721Semaste    }
51254721Semaste    return *this;
52254721Semaste}
53254721Semaste
54254721Semastevoid
55254721SemasteSBLineEntry::SetLineEntry (const lldb_private::LineEntry &lldb_object_ref)
56254721Semaste{
57254721Semaste    ref() = lldb_object_ref;
58254721Semaste}
59254721Semaste
60254721Semaste
61254721SemasteSBLineEntry::~SBLineEntry ()
62254721Semaste{
63254721Semaste}
64254721Semaste
65254721Semaste
66254721SemasteSBAddress
67254721SemasteSBLineEntry::GetStartAddress () const
68254721Semaste{
69254721Semaste
70254721Semaste    SBAddress sb_address;
71254721Semaste    if (m_opaque_ap.get())
72254721Semaste        sb_address.SetAddress(&m_opaque_ap->range.GetBaseAddress());
73254721Semaste
74254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
75254721Semaste    if (log)
76254721Semaste    {
77254721Semaste        StreamString sstr;
78254721Semaste        const Address *addr = sb_address.get();
79254721Semaste        if (addr)
80254721Semaste            addr->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4);
81254721Semaste        log->Printf ("SBLineEntry(%p)::GetStartAddress () => SBAddress (%p): %s",
82254721Semaste                     m_opaque_ap.get(), sb_address.get(), sstr.GetData());
83254721Semaste    }
84254721Semaste
85254721Semaste    return sb_address;
86254721Semaste}
87254721Semaste
88254721SemasteSBAddress
89254721SemasteSBLineEntry::GetEndAddress () const
90254721Semaste{
91254721Semaste    SBAddress sb_address;
92254721Semaste    if (m_opaque_ap.get())
93254721Semaste    {
94254721Semaste        sb_address.SetAddress(&m_opaque_ap->range.GetBaseAddress());
95254721Semaste        sb_address.OffsetAddress(m_opaque_ap->range.GetByteSize());
96254721Semaste    }
97254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
98254721Semaste    if (log)
99254721Semaste    {
100254721Semaste        StreamString sstr;
101254721Semaste        const Address *addr = sb_address.get();
102254721Semaste        if (addr)
103254721Semaste            addr->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4);
104254721Semaste        log->Printf ("SBLineEntry(%p)::GetEndAddress () => SBAddress (%p): %s",
105254721Semaste                     m_opaque_ap.get(), sb_address.get(), sstr.GetData());
106254721Semaste    }
107254721Semaste    return sb_address;
108254721Semaste}
109254721Semaste
110254721Semastebool
111254721SemasteSBLineEntry::IsValid () const
112254721Semaste{
113254721Semaste    return m_opaque_ap.get() && m_opaque_ap->IsValid();
114254721Semaste}
115254721Semaste
116254721Semaste
117254721SemasteSBFileSpec
118254721SemasteSBLineEntry::GetFileSpec () const
119254721Semaste{
120254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
121254721Semaste
122254721Semaste    SBFileSpec sb_file_spec;
123254721Semaste    if (m_opaque_ap.get() && m_opaque_ap->file)
124254721Semaste        sb_file_spec.SetFileSpec(m_opaque_ap->file);
125254721Semaste
126254721Semaste    if (log)
127254721Semaste    {
128254721Semaste        SBStream sstr;
129254721Semaste        sb_file_spec.GetDescription (sstr);
130254721Semaste        log->Printf ("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s", m_opaque_ap.get(),
131254721Semaste                     sb_file_spec.get(), sstr.GetData());
132254721Semaste    }
133254721Semaste
134254721Semaste    return sb_file_spec;
135254721Semaste}
136254721Semaste
137254721Semasteuint32_t
138254721SemasteSBLineEntry::GetLine () const
139254721Semaste{
140254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
141254721Semaste
142254721Semaste    uint32_t line = 0;
143254721Semaste    if (m_opaque_ap.get())
144254721Semaste        line = m_opaque_ap->line;
145254721Semaste
146254721Semaste    if (log)
147254721Semaste        log->Printf ("SBLineEntry(%p)::GetLine () => %u", m_opaque_ap.get(), line);
148254721Semaste
149254721Semaste    return line;
150254721Semaste}
151254721Semaste
152254721Semaste
153254721Semasteuint32_t
154254721SemasteSBLineEntry::GetColumn () const
155254721Semaste{
156254721Semaste    if (m_opaque_ap.get())
157254721Semaste        return m_opaque_ap->column;
158254721Semaste    return 0;
159254721Semaste}
160254721Semaste
161254721Semastevoid
162254721SemasteSBLineEntry::SetFileSpec (lldb::SBFileSpec filespec)
163254721Semaste{
164254721Semaste    if (filespec.IsValid())
165254721Semaste        ref().file = filespec.ref();
166254721Semaste    else
167254721Semaste        ref().file.Clear();
168254721Semaste}
169254721Semastevoid
170254721SemasteSBLineEntry::SetLine (uint32_t line)
171254721Semaste{
172254721Semaste    ref().line = line;
173254721Semaste}
174254721Semaste
175254721Semastevoid
176254721SemasteSBLineEntry::SetColumn (uint32_t column)
177254721Semaste{
178254721Semaste    ref().line = column;
179254721Semaste}
180254721Semaste
181254721Semaste
182254721Semaste
183254721Semastebool
184254721SemasteSBLineEntry::operator == (const SBLineEntry &rhs) const
185254721Semaste{
186254721Semaste    lldb_private::LineEntry *lhs_ptr = m_opaque_ap.get();
187254721Semaste    lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_ap.get();
188254721Semaste
189254721Semaste    if (lhs_ptr && rhs_ptr)
190254721Semaste        return lldb_private::LineEntry::Compare (*lhs_ptr, *rhs_ptr) == 0;
191254721Semaste
192254721Semaste    return lhs_ptr == rhs_ptr;
193254721Semaste}
194254721Semaste
195254721Semastebool
196254721SemasteSBLineEntry::operator != (const SBLineEntry &rhs) const
197254721Semaste{
198254721Semaste    lldb_private::LineEntry *lhs_ptr = m_opaque_ap.get();
199254721Semaste    lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_ap.get();
200254721Semaste
201254721Semaste    if (lhs_ptr && rhs_ptr)
202254721Semaste        return lldb_private::LineEntry::Compare (*lhs_ptr, *rhs_ptr) != 0;
203254721Semaste
204254721Semaste    return lhs_ptr != rhs_ptr;
205254721Semaste}
206254721Semaste
207254721Semasteconst lldb_private::LineEntry *
208254721SemasteSBLineEntry::operator->() const
209254721Semaste{
210254721Semaste    return m_opaque_ap.get();
211254721Semaste}
212254721Semaste
213254721Semastelldb_private::LineEntry &
214254721SemasteSBLineEntry::ref()
215254721Semaste{
216254721Semaste    if (m_opaque_ap.get() == NULL)
217254721Semaste        m_opaque_ap.reset (new lldb_private::LineEntry ());
218254721Semaste    return *m_opaque_ap;
219254721Semaste}
220254721Semaste
221254721Semasteconst lldb_private::LineEntry &
222254721SemasteSBLineEntry::ref() const
223254721Semaste{
224254721Semaste    return *m_opaque_ap;
225254721Semaste}
226254721Semaste
227254721Semastebool
228254721SemasteSBLineEntry::GetDescription (SBStream &description)
229254721Semaste{
230254721Semaste    Stream &strm = description.ref();
231254721Semaste
232254721Semaste    if (m_opaque_ap.get())
233254721Semaste    {
234254721Semaste        char file_path[PATH_MAX*2];
235254721Semaste        m_opaque_ap->file.GetPath (file_path, sizeof (file_path));
236254721Semaste        strm.Printf ("%s:%u", file_path, GetLine());
237254721Semaste        if (GetColumn() > 0)
238254721Semaste            strm.Printf (":%u", GetColumn());
239254721Semaste    }
240254721Semaste    else
241254721Semaste        strm.PutCString ("No value");
242254721Semaste
243254721Semaste    return true;
244254721Semaste}
245254721Semaste
246254721Semastelldb_private::LineEntry *
247254721SemasteSBLineEntry::get ()
248254721Semaste{
249254721Semaste    return m_opaque_ap.get();
250254721Semaste}
251