Home | History | Annotate | Download | only in API
      1 //===-- SBTypeSummary.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/lldb-python.h"
     11 
     12 #include "lldb/API/SBTypeSummary.h"
     13 
     14 #include "lldb/API/SBStream.h"
     15 
     16 #include "lldb/DataFormatters/DataVisualization.h"
     17 
     18 using namespace lldb;
     19 using namespace lldb_private;
     20 
     21 #ifndef LLDB_DISABLE_PYTHON
     22 
     23 SBTypeSummary::SBTypeSummary() :
     24 m_opaque_sp()
     25 {
     26 }
     27 
     28 SBTypeSummary
     29 SBTypeSummary::CreateWithSummaryString (const char* data, uint32_t options)
     30 {
     31     if (!data || data[0] == 0)
     32         return SBTypeSummary();
     33 
     34     return SBTypeSummary(TypeSummaryImplSP(new StringSummaryFormat(options, data)));
     35 }
     36 
     37 SBTypeSummary
     38 SBTypeSummary::CreateWithFunctionName (const char* data, uint32_t options)
     39 {
     40     if (!data || data[0] == 0)
     41         return SBTypeSummary();
     42 
     43     return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, data)));
     44 }
     45 
     46 SBTypeSummary
     47 SBTypeSummary::CreateWithScriptCode (const char* data, uint32_t options)
     48 {
     49     if (!data || data[0] == 0)
     50         return SBTypeSummary();
     51 
     52     return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, "", data)));
     53 }
     54 
     55 SBTypeSummary::SBTypeSummary (const lldb::SBTypeSummary &rhs) :
     56 m_opaque_sp(rhs.m_opaque_sp)
     57 {
     58 }
     59 
     60 SBTypeSummary::~SBTypeSummary ()
     61 {
     62 }
     63 
     64 bool
     65 SBTypeSummary::IsValid() const
     66 {
     67     return m_opaque_sp.get() != NULL;
     68 }
     69 
     70 bool
     71 SBTypeSummary::IsFunctionCode()
     72 {
     73     if (!IsValid())
     74         return false;
     75     if (m_opaque_sp->IsScripted())
     76     {
     77         ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
     78         const char* ftext = script_summary_ptr->GetPythonScript();
     79         return (ftext && *ftext != 0);
     80     }
     81     return false;
     82 }
     83 
     84 bool
     85 SBTypeSummary::IsFunctionName()
     86 {
     87     if (!IsValid())
     88         return false;
     89     if (m_opaque_sp->IsScripted())
     90     {
     91         ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
     92         const char* ftext = script_summary_ptr->GetPythonScript();
     93         return (!ftext || *ftext == 0);
     94     }
     95     return false;
     96 }
     97 
     98 bool
     99 SBTypeSummary::IsSummaryString()
    100 {
    101     if (!IsValid())
    102         return false;
    103 
    104     if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
    105         return false;
    106 
    107     return !m_opaque_sp->IsScripted();
    108 }
    109 
    110 const char*
    111 SBTypeSummary::GetData ()
    112 {
    113     if (!IsValid())
    114         return NULL;
    115     if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
    116         return NULL;
    117     if (m_opaque_sp->IsScripted())
    118     {
    119         ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
    120         const char* fname = script_summary_ptr->GetFunctionName();
    121         const char* ftext = script_summary_ptr->GetPythonScript();
    122         if (ftext && *ftext)
    123             return ftext;
    124         return fname;
    125     }
    126     else
    127     {
    128         StringSummaryFormat* string_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get();
    129         return string_summary_ptr->GetSummaryString();
    130     }
    131 }
    132 
    133 uint32_t
    134 SBTypeSummary::GetOptions ()
    135 {
    136     if (!IsValid())
    137         return lldb::eTypeOptionNone;
    138     return m_opaque_sp->GetOptions();
    139 }
    140 
    141 void
    142 SBTypeSummary::SetOptions (uint32_t value)
    143 {
    144     if (!CopyOnWrite_Impl())
    145         return;
    146     m_opaque_sp->SetOptions(value);
    147 }
    148 
    149 void
    150 SBTypeSummary::SetSummaryString (const char* data)
    151 {
    152     if (!IsValid())
    153         return;
    154     if (m_opaque_sp->IsScripted() || (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback))
    155         ChangeSummaryType(false);
    156     ((StringSummaryFormat*)m_opaque_sp.get())->SetSummaryString(data);
    157 }
    158 
    159 void
    160 SBTypeSummary::SetFunctionName (const char* data)
    161 {
    162     if (!IsValid())
    163         return;
    164     if (!m_opaque_sp->IsScripted())
    165         ChangeSummaryType(true);
    166     ((ScriptSummaryFormat*)m_opaque_sp.get())->SetFunctionName(data);
    167 }
    168 
    169 void
    170 SBTypeSummary::SetFunctionCode (const char* data)
    171 {
    172     if (!IsValid())
    173         return;
    174     if (!m_opaque_sp->IsScripted())
    175         ChangeSummaryType(true);
    176     ((ScriptSummaryFormat*)m_opaque_sp.get())->SetPythonScript(data);
    177 }
    178 
    179 bool
    180 SBTypeSummary::GetDescription (lldb::SBStream &description,
    181                               lldb::DescriptionLevel description_level)
    182 {
    183     if (!CopyOnWrite_Impl())
    184         return false;
    185     else {
    186         description.Printf("%s\n",
    187                            m_opaque_sp->GetDescription().c_str());
    188         return true;
    189     }
    190 }
    191 
    192 lldb::SBTypeSummary &
    193 SBTypeSummary::operator = (const lldb::SBTypeSummary &rhs)
    194 {
    195     if (this != &rhs)
    196     {
    197         m_opaque_sp = rhs.m_opaque_sp;
    198     }
    199     return *this;
    200 }
    201 
    202 bool
    203 SBTypeSummary::operator == (lldb::SBTypeSummary &rhs)
    204 {
    205     if (IsValid() == false)
    206         return !rhs.IsValid();
    207     return m_opaque_sp == rhs.m_opaque_sp;
    208 }
    209 
    210 bool
    211 SBTypeSummary::IsEqualTo (lldb::SBTypeSummary &rhs)
    212 {
    213     if (IsValid() == false)
    214         return !rhs.IsValid();
    215 
    216     if (m_opaque_sp->GetType() != rhs.m_opaque_sp->GetType())
    217         return false;
    218 
    219     if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
    220     {
    221         lldb_private::CXXFunctionSummaryFormat *self_cxx = (lldb_private::CXXFunctionSummaryFormat*)m_opaque_sp.get();
    222         lldb_private::CXXFunctionSummaryFormat *other_cxx = (lldb_private::CXXFunctionSummaryFormat*)rhs.m_opaque_sp.get();
    223         return (self_cxx->m_impl == other_cxx->m_impl);
    224     }
    225 
    226     if (m_opaque_sp->IsScripted() != rhs.m_opaque_sp->IsScripted())
    227         return false;
    228 
    229     if (IsFunctionCode() != rhs.IsFunctionCode())
    230         return false;
    231 
    232     if (IsSummaryString() != rhs.IsSummaryString())
    233         return false;
    234 
    235     if (IsFunctionName() != rhs.IsFunctionName())
    236         return false;
    237 
    238     if ( GetData() == NULL || rhs.GetData() == NULL || strcmp(GetData(), rhs.GetData()) )
    239         return false;
    240 
    241     return GetOptions() == rhs.GetOptions();
    242 
    243 }
    244 
    245 bool
    246 SBTypeSummary::operator != (lldb::SBTypeSummary &rhs)
    247 {
    248     if (IsValid() == false)
    249         return !rhs.IsValid();
    250     return m_opaque_sp != rhs.m_opaque_sp;
    251 }
    252 
    253 lldb::TypeSummaryImplSP
    254 SBTypeSummary::GetSP ()
    255 {
    256     return m_opaque_sp;
    257 }
    258 
    259 void
    260 SBTypeSummary::SetSP (const lldb::TypeSummaryImplSP &typesummary_impl_sp)
    261 {
    262     m_opaque_sp = typesummary_impl_sp;
    263 }
    264 
    265 SBTypeSummary::SBTypeSummary (const lldb::TypeSummaryImplSP &typesummary_impl_sp) :
    266 m_opaque_sp(typesummary_impl_sp)
    267 {
    268 }
    269 
    270 bool
    271 SBTypeSummary::CopyOnWrite_Impl()
    272 {
    273     if (!IsValid())
    274         return false;
    275 
    276     if (m_opaque_sp.unique())
    277         return true;
    278 
    279     TypeSummaryImplSP new_sp;
    280 
    281     if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
    282     {
    283         CXXFunctionSummaryFormat* current_summary_ptr = (CXXFunctionSummaryFormat*)m_opaque_sp.get();
    284         new_sp = TypeSummaryImplSP(new CXXFunctionSummaryFormat(GetOptions(),
    285                                                                 current_summary_ptr->m_impl,
    286                                                                 current_summary_ptr->m_description.c_str()));
    287     }
    288     else if (m_opaque_sp->IsScripted())
    289     {
    290         ScriptSummaryFormat* current_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
    291         new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(),
    292                                                            current_summary_ptr->GetFunctionName(),
    293                                                            current_summary_ptr->GetPythonScript()));
    294     }
    295     else {
    296         StringSummaryFormat* current_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get();
    297         new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(),
    298                                                            current_summary_ptr->GetSummaryString()));
    299     }
    300 
    301     SetSP(new_sp);
    302 
    303     return true;
    304 }
    305 
    306 bool
    307 SBTypeSummary::ChangeSummaryType (bool want_script)
    308 {
    309     if (!IsValid())
    310         return false;
    311 
    312     TypeSummaryImplSP new_sp;
    313 
    314     if (want_script == m_opaque_sp->IsScripted())
    315     {
    316         if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback && !want_script)
    317             new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
    318         else
    319             return CopyOnWrite_Impl();
    320     }
    321 
    322     if (!new_sp)
    323     {
    324         if (want_script)
    325             new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), "", ""));
    326         else
    327             new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
    328     }
    329 
    330     SetSP(new_sp);
    331 
    332     return true;
    333 }
    334 
    335 #endif // LLDB_DISABLE_PYTHON
    336