teak-llvm/lldb/source/API/SBValueList.cpp
Greg Clayton dea8cb4fe3 Added support for finding and global variables in the SBTarget and SBModule
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
2011-06-29 22:09:02 +00:00

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();
}