Home | History | Annotate | Download | only in API
      1 //===-- SBValueList.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 
     11 #include "lldb/API/SBValueList.h"
     12 #include "lldb/API/SBValue.h"
     13 #include "lldb/API/SBStream.h"
     14 #include "lldb/Core/Log.h"
     15 #include "lldb/Core/ValueObjectList.h"
     16 
     17 #include <vector>
     18 
     19 using namespace lldb;
     20 using namespace lldb_private;
     21 
     22 class ValueListImpl
     23 {
     24 public:
     25     ValueListImpl () :
     26     m_values()
     27     {
     28     }
     29 
     30     ValueListImpl (const ValueListImpl& rhs) :
     31     m_values(rhs.m_values)
     32     {
     33     }
     34 
     35     ValueListImpl&
     36     operator = (const ValueListImpl& rhs)
     37     {
     38         if (this == &rhs)
     39             return *this;
     40         m_values = rhs.m_values;
     41         return *this;
     42     };
     43 
     44     uint32_t
     45     GetSize ()
     46     {
     47         return m_values.size();
     48     }
     49 
     50     void
     51     Append (const lldb::SBValue& sb_value)
     52     {
     53         m_values.push_back(sb_value);
     54     }
     55 
     56     void
     57     Append (const ValueListImpl& list)
     58     {
     59         for (auto val : list.m_values)
     60             Append (val);
     61     }
     62 
     63     lldb::SBValue
     64     GetValueAtIndex (uint32_t index)
     65     {
     66         if (index >= GetSize())
     67             return lldb::SBValue();
     68         return m_values[index];
     69     }
     70 
     71     lldb::SBValue
     72     FindValueByUID (lldb::user_id_t uid)
     73     {
     74         for (auto val : m_values)
     75         {
     76             if (val.IsValid() && val.GetID() == uid)
     77                 return val;
     78         }
     79         return lldb::SBValue();
     80     }
     81 
     82 private:
     83     std::vector<lldb::SBValue> m_values;
     84 };
     85 
     86 SBValueList::SBValueList () :
     87     m_opaque_ap ()
     88 {
     89 }
     90 
     91 SBValueList::SBValueList (const SBValueList &rhs) :
     92     m_opaque_ap ()
     93 {
     94     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     95 
     96     if (rhs.IsValid())
     97         m_opaque_ap.reset (new ValueListImpl (*rhs));
     98 
     99     if (log)
    100     {
    101         log->Printf ("SBValueList::SBValueList (rhs.ap=%p) => this.ap = %p",
    102                      (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL),
    103                      m_opaque_ap.get());
    104     }
    105 }
    106 
    107 SBValueList::SBValueList (const ValueListImpl *lldb_object_ptr) :
    108     m_opaque_ap ()
    109 {
    110     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    111 
    112     if (lldb_object_ptr)
    113         m_opaque_ap.reset (new ValueListImpl (*lldb_object_ptr));
    114 
    115     if (log)
    116     {
    117         log->Printf ("SBValueList::SBValueList (lldb_object_ptr=%p) => this.ap = %p",
    118                      lldb_object_ptr,
    119                      m_opaque_ap.get());
    120     }
    121 }
    122 
    123 SBValueList::~SBValueList ()
    124 {
    125 }
    126 
    127 bool
    128 SBValueList::IsValid () const
    129 {
    130     return (m_opaque_ap.get() != NULL);
    131 }
    132 
    133 void
    134 SBValueList::Clear()
    135 {
    136     m_opaque_ap.reset();
    137 }
    138 
    139 const SBValueList &
    140 SBValueList::operator = (const SBValueList &rhs)
    141 {
    142     if (this != &rhs)
    143     {
    144         if (rhs.IsValid())
    145             m_opaque_ap.reset (new ValueListImpl (*rhs));
    146         else
    147             m_opaque_ap.reset ();
    148     }
    149     return *this;
    150 }
    151 
    152 ValueListImpl *
    153 SBValueList::operator->()
    154 {
    155     return m_opaque_ap.get();
    156 }
    157 
    158 ValueListImpl &
    159 SBValueList::operator*()
    160 {
    161     return *m_opaque_ap;
    162 }
    163 
    164 const ValueListImpl *
    165 SBValueList::operator->() const
    166 {
    167     return m_opaque_ap.get();
    168 }
    169 
    170 const ValueListImpl &
    171 SBValueList::operator*() const
    172 {
    173     return *m_opaque_ap;
    174 }
    175 
    176 void
    177 SBValueList::Append (const SBValue &val_obj)
    178 {
    179     CreateIfNeeded ();
    180     m_opaque_ap->Append (val_obj);
    181 }
    182 
    183 void
    184 SBValueList::Append (lldb::ValueObjectSP& val_obj_sp)
    185 {
    186     if (val_obj_sp)
    187     {
    188         CreateIfNeeded ();
    189         m_opaque_ap->Append (SBValue(val_obj_sp));
    190     }
    191 }
    192 
    193 void
    194 SBValueList::Append (const lldb::SBValueList& value_list)
    195 {
    196     if (value_list.IsValid())
    197     {
    198         CreateIfNeeded ();
    199         m_opaque_ap->Append (*value_list);
    200     }
    201 }
    202 
    203 
    204 SBValue
    205 SBValueList::GetValueAtIndex (uint32_t idx) const
    206 {
    207     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    208 
    209     //if (log)
    210     //    log->Printf ("SBValueList::GetValueAtIndex (uint32_t idx) idx = %d", idx);
    211 
    212     SBValue sb_value;
    213     if (m_opaque_ap.get())
    214         sb_value = m_opaque_ap->GetValueAtIndex (idx);
    215 
    216     if (log)
    217     {
    218         SBStream sstr;
    219         sb_value.GetDescription (sstr);
    220         log->Printf ("SBValueList::GetValueAtIndex (this.ap=%p, idx=%d) => SBValue (this.sp = %p, '%s')",
    221                      m_opaque_ap.get(), idx, sb_value.GetSP().get(), sstr.GetData());
    222     }
    223 
    224     return sb_value;
    225 }
    226 
    227 uint32_t
    228 SBValueList::GetSize () const
    229 {
    230     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    231 
    232     //if (log)
    233     //    log->Printf ("SBValueList::GetSize ()");
    234 
    235     uint32_t size = 0;
    236     if (m_opaque_ap.get())
    237         size = m_opaque_ap->GetSize();
    238 
    239     if (log)
    240         log->Printf ("SBValueList::GetSize (this.ap=%p) => %d", m_opaque_ap.get(), size);
    241 
    242     return size;
    243 }
    244 
    245 void
    246 SBValueList::CreateIfNeeded ()
    247 {
    248     if (m_opaque_ap.get() == NULL)
    249         m_opaque_ap.reset (new ValueListImpl());
    250 }
    251 
    252 
    253 SBValue
    254 SBValueList::FindValueObjectByUID (lldb::user_id_t uid)
    255 {
    256     SBValue sb_value;
    257     if (m_opaque_ap.get())
    258         sb_value = m_opaque_ap->FindValueByUID(uid);
    259     return sb_value;
    260 }
    261 
    262 void *
    263 SBValueList::opaque_ptr ()
    264 {
    265     return m_opaque_ap.get();
    266 }
    267 
    268 ValueListImpl &
    269 SBValueList::ref ()
    270 {
    271     CreateIfNeeded();
    272     return *m_opaque_ap.get();
    273 }
    274 
    275 
    276