2013-08-23 17:46:38 +00:00
|
|
|
//===-- SBTypeSummary.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/lldb-python.h"
|
|
|
|
|
|
|
|
#include "lldb/API/SBTypeSummary.h"
|
|
|
|
|
|
|
|
#include "lldb/API/SBStream.h"
|
|
|
|
|
|
|
|
#include "lldb/DataFormatters/DataVisualization.h"
|
|
|
|
|
|
|
|
using namespace lldb;
|
|
|
|
using namespace lldb_private;
|
|
|
|
|
|
|
|
#ifndef LLDB_DISABLE_PYTHON
|
|
|
|
|
2015-02-06 21:38:51 +00:00
|
|
|
SBTypeSummaryOptions::SBTypeSummaryOptions()
|
|
|
|
{
|
|
|
|
m_opaque_ap.reset(new TypeSummaryOptions());
|
|
|
|
}
|
|
|
|
|
|
|
|
SBTypeSummaryOptions::SBTypeSummaryOptions (const lldb::SBTypeSummaryOptions &rhs)
|
|
|
|
{
|
|
|
|
if (rhs.m_opaque_ap)
|
|
|
|
m_opaque_ap.reset(new TypeSummaryOptions(*rhs.m_opaque_ap.get()));
|
|
|
|
else
|
|
|
|
m_opaque_ap.reset(new TypeSummaryOptions());
|
|
|
|
}
|
|
|
|
|
|
|
|
SBTypeSummaryOptions::~SBTypeSummaryOptions ()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
SBTypeSummaryOptions::IsValid()
|
|
|
|
{
|
|
|
|
return m_opaque_ap.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
lldb::LanguageType
|
|
|
|
SBTypeSummaryOptions::GetLanguage ()
|
|
|
|
{
|
|
|
|
if (IsValid())
|
|
|
|
return m_opaque_ap->GetLanguage();
|
|
|
|
return lldb::eLanguageTypeUnknown;
|
|
|
|
}
|
|
|
|
|
|
|
|
lldb::TypeSummaryCapping
|
|
|
|
SBTypeSummaryOptions::GetCapping ()
|
|
|
|
{
|
|
|
|
if (IsValid())
|
|
|
|
return m_opaque_ap->GetCapping();
|
|
|
|
return eTypeSummaryCapped;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
SBTypeSummaryOptions::SetLanguage (lldb::LanguageType l)
|
|
|
|
{
|
|
|
|
if (IsValid())
|
|
|
|
m_opaque_ap->SetLanguage(l);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
SBTypeSummaryOptions::SetCapping (lldb::TypeSummaryCapping c)
|
|
|
|
{
|
|
|
|
if (IsValid())
|
|
|
|
m_opaque_ap->SetCapping(c);
|
|
|
|
}
|
|
|
|
|
|
|
|
lldb_private::TypeSummaryOptions *
|
|
|
|
SBTypeSummaryOptions::operator->()
|
|
|
|
{
|
|
|
|
return m_opaque_ap.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
const lldb_private::TypeSummaryOptions *
|
|
|
|
SBTypeSummaryOptions::operator->() const
|
|
|
|
{
|
|
|
|
return m_opaque_ap.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
lldb_private::TypeSummaryOptions *
|
|
|
|
SBTypeSummaryOptions::get ()
|
|
|
|
{
|
|
|
|
return m_opaque_ap.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
lldb_private::TypeSummaryOptions &
|
|
|
|
SBTypeSummaryOptions::ref()
|
|
|
|
{
|
|
|
|
return *m_opaque_ap.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
const lldb_private::TypeSummaryOptions &
|
|
|
|
SBTypeSummaryOptions::ref() const
|
|
|
|
{
|
|
|
|
return *m_opaque_ap.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
SBTypeSummaryOptions::SBTypeSummaryOptions (const lldb_private::TypeSummaryOptions *lldb_object_ptr)
|
|
|
|
{
|
|
|
|
SetOptions(lldb_object_ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
SBTypeSummaryOptions::SetOptions (const lldb_private::TypeSummaryOptions *lldb_object_ptr)
|
|
|
|
{
|
|
|
|
if (lldb_object_ptr)
|
|
|
|
m_opaque_ap.reset(new TypeSummaryOptions(*lldb_object_ptr));
|
|
|
|
else
|
|
|
|
m_opaque_ap.reset(new TypeSummaryOptions());
|
|
|
|
}
|
|
|
|
|
2013-08-23 17:46:38 +00:00
|
|
|
SBTypeSummary::SBTypeSummary() :
|
|
|
|
m_opaque_sp()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
SBTypeSummary
|
|
|
|
SBTypeSummary::CreateWithSummaryString (const char* data, uint32_t options)
|
|
|
|
{
|
|
|
|
if (!data || data[0] == 0)
|
|
|
|
return SBTypeSummary();
|
|
|
|
|
|
|
|
return SBTypeSummary(TypeSummaryImplSP(new StringSummaryFormat(options, data)));
|
|
|
|
}
|
|
|
|
|
|
|
|
SBTypeSummary
|
|
|
|
SBTypeSummary::CreateWithFunctionName (const char* data, uint32_t options)
|
|
|
|
{
|
|
|
|
if (!data || data[0] == 0)
|
|
|
|
return SBTypeSummary();
|
|
|
|
|
|
|
|
return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, data)));
|
|
|
|
}
|
|
|
|
|
|
|
|
SBTypeSummary
|
|
|
|
SBTypeSummary::CreateWithScriptCode (const char* data, uint32_t options)
|
|
|
|
{
|
|
|
|
if (!data || data[0] == 0)
|
|
|
|
return SBTypeSummary();
|
|
|
|
|
|
|
|
return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, "", data)));
|
|
|
|
}
|
|
|
|
|
|
|
|
SBTypeSummary::SBTypeSummary (const lldb::SBTypeSummary &rhs) :
|
|
|
|
m_opaque_sp(rhs.m_opaque_sp)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
SBTypeSummary::~SBTypeSummary ()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
SBTypeSummary::IsValid() const
|
|
|
|
{
|
|
|
|
return m_opaque_sp.get() != NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
SBTypeSummary::IsFunctionCode()
|
|
|
|
{
|
|
|
|
if (!IsValid())
|
|
|
|
return false;
|
|
|
|
if (m_opaque_sp->IsScripted())
|
|
|
|
{
|
|
|
|
ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
|
|
|
|
const char* ftext = script_summary_ptr->GetPythonScript();
|
|
|
|
return (ftext && *ftext != 0);
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
SBTypeSummary::IsFunctionName()
|
|
|
|
{
|
|
|
|
if (!IsValid())
|
|
|
|
return false;
|
|
|
|
if (m_opaque_sp->IsScripted())
|
|
|
|
{
|
|
|
|
ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
|
|
|
|
const char* ftext = script_summary_ptr->GetPythonScript();
|
|
|
|
return (!ftext || *ftext == 0);
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
SBTypeSummary::IsSummaryString()
|
|
|
|
{
|
|
|
|
if (!IsValid())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return !m_opaque_sp->IsScripted();
|
|
|
|
}
|
|
|
|
|
|
|
|
const char*
|
|
|
|
SBTypeSummary::GetData ()
|
|
|
|
{
|
|
|
|
if (!IsValid())
|
|
|
|
return NULL;
|
|
|
|
if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
|
|
|
|
return NULL;
|
|
|
|
if (m_opaque_sp->IsScripted())
|
|
|
|
{
|
|
|
|
ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
|
|
|
|
const char* fname = script_summary_ptr->GetFunctionName();
|
|
|
|
const char* ftext = script_summary_ptr->GetPythonScript();
|
|
|
|
if (ftext && *ftext)
|
|
|
|
return ftext;
|
|
|
|
return fname;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
StringSummaryFormat* string_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get();
|
|
|
|
return string_summary_ptr->GetSummaryString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t
|
|
|
|
SBTypeSummary::GetOptions ()
|
|
|
|
{
|
|
|
|
if (!IsValid())
|
|
|
|
return lldb::eTypeOptionNone;
|
|
|
|
return m_opaque_sp->GetOptions();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
SBTypeSummary::SetOptions (uint32_t value)
|
|
|
|
{
|
|
|
|
if (!CopyOnWrite_Impl())
|
|
|
|
return;
|
|
|
|
m_opaque_sp->SetOptions(value);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
SBTypeSummary::SetSummaryString (const char* data)
|
|
|
|
{
|
|
|
|
if (!IsValid())
|
|
|
|
return;
|
|
|
|
if (m_opaque_sp->IsScripted() || (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback))
|
|
|
|
ChangeSummaryType(false);
|
|
|
|
((StringSummaryFormat*)m_opaque_sp.get())->SetSummaryString(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
SBTypeSummary::SetFunctionName (const char* data)
|
|
|
|
{
|
|
|
|
if (!IsValid())
|
|
|
|
return;
|
|
|
|
if (!m_opaque_sp->IsScripted())
|
|
|
|
ChangeSummaryType(true);
|
|
|
|
((ScriptSummaryFormat*)m_opaque_sp.get())->SetFunctionName(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
SBTypeSummary::SetFunctionCode (const char* data)
|
|
|
|
{
|
|
|
|
if (!IsValid())
|
|
|
|
return;
|
|
|
|
if (!m_opaque_sp->IsScripted())
|
|
|
|
ChangeSummaryType(true);
|
|
|
|
((ScriptSummaryFormat*)m_opaque_sp.get())->SetPythonScript(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
SBTypeSummary::GetDescription (lldb::SBStream &description,
|
|
|
|
lldb::DescriptionLevel description_level)
|
|
|
|
{
|
|
|
|
if (!CopyOnWrite_Impl())
|
|
|
|
return false;
|
|
|
|
else {
|
|
|
|
description.Printf("%s\n",
|
|
|
|
m_opaque_sp->GetDescription().c_str());
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
lldb::SBTypeSummary &
|
|
|
|
SBTypeSummary::operator = (const lldb::SBTypeSummary &rhs)
|
|
|
|
{
|
|
|
|
if (this != &rhs)
|
|
|
|
{
|
|
|
|
m_opaque_sp = rhs.m_opaque_sp;
|
|
|
|
}
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
SBTypeSummary::operator == (lldb::SBTypeSummary &rhs)
|
|
|
|
{
|
|
|
|
if (IsValid() == false)
|
|
|
|
return !rhs.IsValid();
|
|
|
|
return m_opaque_sp == rhs.m_opaque_sp;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
SBTypeSummary::IsEqualTo (lldb::SBTypeSummary &rhs)
|
|
|
|
{
|
|
|
|
if (IsValid() == false)
|
|
|
|
return !rhs.IsValid();
|
|
|
|
|
|
|
|
if (m_opaque_sp->GetType() != rhs.m_opaque_sp->GetType())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
|
|
|
|
{
|
|
|
|
lldb_private::CXXFunctionSummaryFormat *self_cxx = (lldb_private::CXXFunctionSummaryFormat*)m_opaque_sp.get();
|
|
|
|
lldb_private::CXXFunctionSummaryFormat *other_cxx = (lldb_private::CXXFunctionSummaryFormat*)rhs.m_opaque_sp.get();
|
|
|
|
return (self_cxx->m_impl == other_cxx->m_impl);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_opaque_sp->IsScripted() != rhs.m_opaque_sp->IsScripted())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (IsFunctionCode() != rhs.IsFunctionCode())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (IsSummaryString() != rhs.IsSummaryString())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (IsFunctionName() != rhs.IsFunctionName())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if ( GetData() == NULL || rhs.GetData() == NULL || strcmp(GetData(), rhs.GetData()) )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return GetOptions() == rhs.GetOptions();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
SBTypeSummary::operator != (lldb::SBTypeSummary &rhs)
|
|
|
|
{
|
|
|
|
if (IsValid() == false)
|
|
|
|
return !rhs.IsValid();
|
|
|
|
return m_opaque_sp != rhs.m_opaque_sp;
|
|
|
|
}
|
|
|
|
|
|
|
|
lldb::TypeSummaryImplSP
|
|
|
|
SBTypeSummary::GetSP ()
|
|
|
|
{
|
|
|
|
return m_opaque_sp;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
SBTypeSummary::SetSP (const lldb::TypeSummaryImplSP &typesummary_impl_sp)
|
|
|
|
{
|
|
|
|
m_opaque_sp = typesummary_impl_sp;
|
|
|
|
}
|
|
|
|
|
|
|
|
SBTypeSummary::SBTypeSummary (const lldb::TypeSummaryImplSP &typesummary_impl_sp) :
|
|
|
|
m_opaque_sp(typesummary_impl_sp)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
SBTypeSummary::CopyOnWrite_Impl()
|
|
|
|
{
|
|
|
|
if (!IsValid())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (m_opaque_sp.unique())
|
|
|
|
return true;
|
|
|
|
|
|
|
|
TypeSummaryImplSP new_sp;
|
|
|
|
|
|
|
|
if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
|
|
|
|
{
|
|
|
|
CXXFunctionSummaryFormat* current_summary_ptr = (CXXFunctionSummaryFormat*)m_opaque_sp.get();
|
|
|
|
new_sp = TypeSummaryImplSP(new CXXFunctionSummaryFormat(GetOptions(),
|
|
|
|
current_summary_ptr->m_impl,
|
|
|
|
current_summary_ptr->m_description.c_str()));
|
|
|
|
}
|
|
|
|
else if (m_opaque_sp->IsScripted())
|
|
|
|
{
|
|
|
|
ScriptSummaryFormat* current_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
|
|
|
|
new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(),
|
|
|
|
current_summary_ptr->GetFunctionName(),
|
|
|
|
current_summary_ptr->GetPythonScript()));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
StringSummaryFormat* current_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get();
|
|
|
|
new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(),
|
|
|
|
current_summary_ptr->GetSummaryString()));
|
|
|
|
}
|
|
|
|
|
|
|
|
SetSP(new_sp);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
SBTypeSummary::ChangeSummaryType (bool want_script)
|
|
|
|
{
|
|
|
|
if (!IsValid())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
TypeSummaryImplSP new_sp;
|
|
|
|
|
|
|
|
if (want_script == m_opaque_sp->IsScripted())
|
|
|
|
{
|
|
|
|
if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback && !want_script)
|
|
|
|
new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
|
|
|
|
else
|
|
|
|
return CopyOnWrite_Impl();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!new_sp)
|
|
|
|
{
|
|
|
|
if (want_script)
|
|
|
|
new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), "", ""));
|
|
|
|
else
|
|
|
|
new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
|
|
|
|
}
|
|
|
|
|
|
|
|
SetSP(new_sp);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // LLDB_DISABLE_PYTHON
|