mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-28 15:58:57 -04:00

level in the public API. Also modified the ValueObject values to be able to display global variables without having a valid running process. The globals will read themselves from the object file section data if there is no process, and from the process if there is one. Also fixed an issue where modifications for dynamic types could cause child values of ValueObjects to not show up if the value was unable to evaluate itself (children of NULL pointer objects). llvm-svn: 134102
207 lines
4.1 KiB
C++
207 lines
4.1 KiB
C++
//===-- SBValueList.cpp -----------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
#include "lldb/API/SBValueList.h"
|
|
#include "lldb/API/SBValue.h"
|
|
#include "lldb/API/SBStream.h"
|
|
#include "lldb/Core/Log.h"
|
|
#include "lldb/Core/ValueObjectList.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
SBValueList::SBValueList () :
|
|
m_opaque_ap ()
|
|
{
|
|
}
|
|
|
|
SBValueList::SBValueList (const SBValueList &rhs) :
|
|
m_opaque_ap ()
|
|
{
|
|
LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
|
|
|
|
if (rhs.IsValid())
|
|
m_opaque_ap.reset (new ValueObjectList (*rhs));
|
|
|
|
if (log)
|
|
{
|
|
log->Printf ("SBValueList::SBValueList (rhs.ap=%p) => this.ap = %p",
|
|
(rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL),
|
|
m_opaque_ap.get());
|
|
}
|
|
}
|
|
|
|
SBValueList::SBValueList (const ValueObjectList *lldb_object_ptr) :
|
|
m_opaque_ap ()
|
|
{
|
|
LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
|
|
|
|
if (lldb_object_ptr)
|
|
m_opaque_ap.reset (new ValueObjectList (*lldb_object_ptr));
|
|
|
|
if (log)
|
|
{
|
|
log->Printf ("SBValueList::SBValueList (lldb_object_ptr=%p) => this.ap = %p",
|
|
lldb_object_ptr,
|
|
m_opaque_ap.get());
|
|
}
|
|
}
|
|
|
|
SBValueList::~SBValueList ()
|
|
{
|
|
}
|
|
|
|
bool
|
|
SBValueList::IsValid () const
|
|
{
|
|
return (m_opaque_ap.get() != NULL);
|
|
}
|
|
|
|
const SBValueList &
|
|
SBValueList::operator = (const SBValueList &rhs)
|
|
{
|
|
if (this != &rhs)
|
|
{
|
|
if (rhs.IsValid())
|
|
m_opaque_ap.reset (new ValueObjectList (*rhs));
|
|
else
|
|
m_opaque_ap.reset ();
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
ValueObjectList *
|
|
SBValueList::operator->()
|
|
{
|
|
return m_opaque_ap.get();
|
|
}
|
|
|
|
ValueObjectList &
|
|
SBValueList::operator*()
|
|
{
|
|
return *m_opaque_ap;
|
|
}
|
|
|
|
const ValueObjectList *
|
|
SBValueList::operator->() const
|
|
{
|
|
return m_opaque_ap.get();
|
|
}
|
|
|
|
const ValueObjectList &
|
|
SBValueList::operator*() const
|
|
{
|
|
return *m_opaque_ap;
|
|
}
|
|
|
|
void
|
|
SBValueList::Append (const SBValue &val_obj)
|
|
{
|
|
if (val_obj.get())
|
|
{
|
|
CreateIfNeeded ();
|
|
m_opaque_ap->Append (*val_obj);
|
|
}
|
|
}
|
|
|
|
void
|
|
SBValueList::Append (lldb::ValueObjectSP& val_obj_sp)
|
|
{
|
|
if (val_obj_sp)
|
|
{
|
|
CreateIfNeeded ();
|
|
m_opaque_ap->Append (val_obj_sp);
|
|
}
|
|
}
|
|
|
|
void
|
|
SBValueList::Append (const lldb::SBValueList& value_list)
|
|
{
|
|
if (value_list.IsValid())
|
|
{
|
|
CreateIfNeeded ();
|
|
m_opaque_ap->Append (*value_list);
|
|
}
|
|
}
|
|
|
|
|
|
SBValue
|
|
SBValueList::GetValueAtIndex (uint32_t idx) const
|
|
{
|
|
LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
|
|
|
|
//if (log)
|
|
// log->Printf ("SBValueList::GetValueAtIndex (uint32_t idx) idx = %d", idx);
|
|
|
|
SBValue sb_value;
|
|
if (m_opaque_ap.get())
|
|
*sb_value = m_opaque_ap->GetValueObjectAtIndex (idx);
|
|
|
|
if (log)
|
|
{
|
|
SBStream sstr;
|
|
sb_value.GetDescription (sstr);
|
|
log->Printf ("SBValueList::GetValueAtIndex (this.ap=%p, idx=%d) => SBValue (this.sp = %p, '%s')",
|
|
m_opaque_ap.get(), idx, sb_value.get(), sstr.GetData());
|
|
}
|
|
|
|
return sb_value;
|
|
}
|
|
|
|
uint32_t
|
|
SBValueList::GetSize () const
|
|
{
|
|
LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
|
|
|
|
//if (log)
|
|
// log->Printf ("SBValueList::GetSize ()");
|
|
|
|
uint32_t size = 0;
|
|
if (m_opaque_ap.get())
|
|
size = m_opaque_ap->GetSize();
|
|
|
|
if (log)
|
|
log->Printf ("SBValueList::GetSize (this.ap=%p) => %d", m_opaque_ap.get(), size);
|
|
|
|
return size;
|
|
}
|
|
|
|
void
|
|
SBValueList::CreateIfNeeded ()
|
|
{
|
|
if (m_opaque_ap.get() == NULL)
|
|
m_opaque_ap.reset (new ValueObjectList());
|
|
}
|
|
|
|
|
|
SBValue
|
|
SBValueList::FindValueObjectByUID (lldb::user_id_t uid)
|
|
{
|
|
SBValue sb_value;
|
|
if (m_opaque_ap.get())
|
|
*sb_value = m_opaque_ap->FindValueObjectByUID (uid);
|
|
return sb_value;
|
|
}
|
|
|
|
ValueObjectList *
|
|
SBValueList::get ()
|
|
{
|
|
return m_opaque_ap.get();
|
|
}
|
|
|
|
ValueObjectList &
|
|
SBValueList::ref ()
|
|
{
|
|
CreateIfNeeded();
|
|
return *m_opaque_ap.get();
|
|
}
|
|
|
|
|