Added the ability to introspect types thourgh the public SBType interface.

Fixed up many API calls to not be "const" as const doesn't mean anything to
most of our lldb::SB objects since they contain a shared pointer, auto_ptr, or
pointer to the types which circumvent the constness anyway.



git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@139428 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBFrame.cpp b/source/API/SBFrame.cpp
index 4174638..3f27b6f 100644
--- a/source/API/SBFrame.cpp
+++ b/source/API/SBFrame.cpp
@@ -538,8 +538,8 @@
     return m_opaque_sp.get();
 }
 
-const lldb::StackFrameSP &
-SBFrame::get_sp() const
+lldb::StackFrameSP &
+SBFrame::get_sp()
 {
     return m_opaque_sp;
 }
diff --git a/source/API/SBType.cpp b/source/API/SBType.cpp
index 582ecee..8deb01c 100644
--- a/source/API/SBType.cpp
+++ b/source/API/SBType.cpp
@@ -31,7 +31,7 @@
 {
 }
 
-SBType::SBType (const lldb_private::ClangASTType &type) :
+SBType::SBType (const ClangASTType &type) :
     m_opaque_sp(new TypeImpl(ClangASTType(type.GetASTContext(),
                                           type.GetOpaqueQualType())))
 {
@@ -63,7 +63,7 @@
 //{}
 //
 bool
-SBType::operator == (const lldb::SBType &rhs) const
+SBType::operator == (SBType &rhs)
 {
     if (IsValid() == false)
         return !rhs.IsValid();
@@ -73,7 +73,7 @@
 }
 
 bool
-SBType::operator != (const lldb::SBType &rhs) const
+SBType::operator != (SBType &rhs)
 {    
     if (IsValid() == false)
         return rhs.IsValid();
@@ -82,11 +82,16 @@
             (rhs.m_opaque_sp->GetOpaqueQualType() != m_opaque_sp->GetOpaqueQualType());
 }
 
-
-const lldb::SBType &
-SBType::operator = (const lldb::SBType &rhs)
+void
+SBType::reset(const lldb::TypeImplSP &type_impl_sp)
 {
-    if (*this != rhs)
+    m_opaque_sp = type_impl_sp;
+}
+
+SBType &
+SBType::operator = (const SBType &rhs)
+{
+    if (this != &rhs)
     {
         m_opaque_sp = rhs.m_opaque_sp;
     }
@@ -96,15 +101,15 @@
 SBType::~SBType ()
 {}
 
-lldb_private::TypeImpl &
+TypeImpl &
 SBType::ref ()
 {
     if (m_opaque_sp.get() == NULL)
-        m_opaque_sp.reset (new lldb_private::TypeImpl());
+        m_opaque_sp.reset (new TypeImpl());
         return *m_opaque_sp;
 }
 
-const lldb_private::TypeImpl &
+const TypeImpl &
 SBType::ref () const
 {
     // "const SBAddress &addr" should already have checked "addr.IsValid()" 
@@ -124,7 +129,7 @@
 }
 
 size_t
-SBType::GetByteSize() const
+SBType::GetByteSize()
 {
     if (!IsValid())
         return 0;
@@ -134,7 +139,7 @@
 }
 
 bool
-SBType::IsPointerType() const
+SBType::IsPointerType()
 {
     if (!IsValid())
         return false;
@@ -148,7 +153,7 @@
 }
 
 bool
-SBType::IsReferenceType() const
+SBType::IsReferenceType()
 {
     if (!IsValid())
         return false;
@@ -162,7 +167,7 @@
 }
 
 SBType
-SBType::GetPointerType() const
+SBType::GetPointerType()
 {
     if (!IsValid())
         return SBType();
@@ -172,7 +177,7 @@
 }
 
 SBType
-SBType::GetPointeeType() const
+SBType::GetPointeeType()
 {
     if (!IsValid())
         return SBType();
@@ -186,7 +191,7 @@
 }
 
 SBType
-SBType::GetReferenceType() const
+SBType::GetReferenceType()
 {
     if (!IsValid())
         return SBType();
@@ -196,7 +201,7 @@
 }
 
 SBType
-SBType::GetDereferencedType() const
+SBType::GetDereferencedType()
 {
     if (!IsValid())
         return SBType();
@@ -207,7 +212,7 @@
 }
 
 SBType
-SBType::GetBasicType(lldb::BasicType type) const
+SBType::GetBasicType(lldb::BasicType type)
 {
     
     if (!IsValid())
@@ -302,6 +307,89 @@
     return SBType(ClangASTType(m_opaque_sp->GetASTContext(), base_type_qual.getAsOpaquePtr()));
 }
 
+uint32_t
+SBType::GetNumberOfDirectBaseClasses ()
+{
+    if (IsValid())
+        return ClangASTContext::GetNumDirectBaseClasses(m_opaque_sp->GetASTContext(), m_opaque_sp->GetOpaqueQualType());
+    return 0;
+}
+
+uint32_t
+SBType::GetNumberOfVirtualBaseClasses ()
+{
+    if (IsValid())
+        return ClangASTContext::GetNumVirtualBaseClasses(m_opaque_sp->GetASTContext(), m_opaque_sp->GetOpaqueQualType());
+    return 0;
+}
+
+uint32_t
+SBType::GetNumberOfFields ()
+{
+    if (IsValid())
+        return ClangASTContext::GetNumFields(m_opaque_sp->GetASTContext(), m_opaque_sp->GetOpaqueQualType());
+    return 0;
+}
+
+SBTypeMember
+SBType::GetDirectBaseClassAtIndex (uint32_t idx)
+{
+    SBTypeMember sb_type_member;
+    if (IsValid())
+    {
+        clang::ASTContext* ast = m_opaque_sp->GetASTContext();
+        uint32_t byte_offset = 0;
+        clang_type_t clang_type = ClangASTContext::GetDirectBaseClassAtIndex (ast, m_opaque_sp->GetOpaqueQualType(), idx, &byte_offset);
+        if (clang_type)
+        {
+            TypeImplSP type_impl_sp (new TypeImpl(ClangASTType (ast, clang_type)));
+            sb_type_member.reset (new TypeMemberImpl (type_impl_sp, byte_offset));
+        }
+    }
+    return sb_type_member;
+
+}
+
+SBTypeMember
+SBType::GetVirtualBaseClassAtIndex (uint32_t idx)
+{
+    SBTypeMember sb_type_member;
+    if (IsValid())
+    {
+        uint32_t byte_offset = 0;
+        clang::ASTContext* ast = m_opaque_sp->GetASTContext();
+        clang_type_t clang_type = ClangASTContext::GetVirtualBaseClassAtIndex (ast, m_opaque_sp->GetOpaqueQualType(), idx, &byte_offset);
+        if (clang_type)
+        {
+            TypeImplSP type_impl_sp (new TypeImpl(ClangASTType (ast, clang_type)));
+            sb_type_member.reset (new TypeMemberImpl (type_impl_sp, byte_offset));
+        }        
+    }
+    return sb_type_member;
+}
+
+SBTypeMember
+SBType::GetFieldAtIndex (uint32_t idx)
+{
+    SBTypeMember sb_type_member;
+    if (IsValid())
+    {
+        uint32_t byte_offset = 0;
+        clang::ASTContext* ast = m_opaque_sp->GetASTContext();
+        std::string name_sstr;
+        clang_type_t clang_type = ClangASTContext::GetFieldAtIndex (ast, m_opaque_sp->GetOpaqueQualType(), idx, name_sstr, &byte_offset);
+        if (clang_type)
+        {
+            ConstString name;
+            if (!name_sstr.empty())
+                name.SetCString(name_sstr.c_str());
+            TypeImplSP type_impl_sp (new TypeImpl(ClangASTType (ast, clang_type)));
+            sb_type_member.reset (new TypeMemberImpl (type_impl_sp, byte_offset, name));
+        }        
+    }
+    return sb_type_member;
+}
+
 const char*
 SBType::GetName()
 {
@@ -311,6 +399,15 @@
     return ClangASTType::GetConstTypeName(m_opaque_sp->GetOpaqueQualType()).GetCString();
 }
 
+lldb::TypeClass
+SBType::GetTypeClass ()
+{
+    if (IsValid())
+        return ClangASTType::GetTypeClass (m_opaque_sp->GetASTContext(),
+                                           m_opaque_sp->GetOpaqueQualType());
+    return lldb::eTypeClassInvalid;
+}
+
 SBTypeList::SBTypeList() :
     m_opaque_ap(new TypeListImpl())
 {
@@ -319,12 +416,12 @@
 SBTypeList::SBTypeList(const SBTypeList& rhs) :
     m_opaque_ap(new TypeListImpl())
 {
-    for (uint32_t i = 0, rhs_size = rhs.GetSize(); i < rhs_size; i++)
-        Append(rhs.GetTypeAtIndex(i));
+    for (uint32_t i = 0, rhs_size = const_cast<SBTypeList&>(rhs).GetSize(); i < rhs_size; i++)
+        Append(const_cast<SBTypeList&>(rhs).GetTypeAtIndex(i));
 }
 
 bool
-SBTypeList::IsValid () const
+SBTypeList::IsValid ()
 {
     return (m_opaque_ap.get() != NULL);
 }
@@ -332,30 +429,32 @@
 SBTypeList&
 SBTypeList::operator = (const SBTypeList& rhs)
 {
-    if (this != &rhs && m_opaque_ap.get() != rhs.m_opaque_ap.get())
+    if (this != &rhs)
     {
-        m_opaque_ap.reset(new TypeListImpl());
-        for (uint32_t i = 0, rhs_size = rhs.GetSize(); i < rhs_size; i++)
-            Append(rhs.GetTypeAtIndex(i));
+        m_opaque_ap.reset (new TypeListImpl());
+        for (uint32_t i = 0, rhs_size = const_cast<SBTypeList&>(rhs).GetSize(); i < rhs_size; i++)
+            Append(const_cast<SBTypeList&>(rhs).GetTypeAtIndex(i));
     }
     return *this;
 }
 
 void
-SBTypeList::Append (const SBType& type)
+SBTypeList::Append (SBType type)
 {
     if (type.IsValid())
         m_opaque_ap->Append (type.m_opaque_sp);
 }
 
 SBType
-SBTypeList::GetTypeAtIndex(int index) const
+SBTypeList::GetTypeAtIndex(uint32_t index)
 {
-    return SBType(m_opaque_ap->GetTypeAtIndex(index));
+    if (m_opaque_ap.get())
+        return SBType(m_opaque_ap->GetTypeAtIndex(index));
+    return SBType();
 }
 
-int
-SBTypeList::GetSize() const
+uint32_t
+SBTypeList::GetSize()
 {
     return m_opaque_ap->GetSize();
 }
@@ -367,7 +466,7 @@
 bool
 SBType::IsPointerType (void *opaque_type)
 {
-    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
+    LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     
     bool ret_value = ClangASTContext::IsPointerType (opaque_type);
     
@@ -376,3 +475,89 @@
     
     return ret_value;
 }
+
+
+SBTypeMember::SBTypeMember() :
+    m_opaque_ap()
+{
+}
+
+SBTypeMember::~SBTypeMember()
+{
+}
+
+SBTypeMember::SBTypeMember (const SBTypeMember& rhs) :
+    m_opaque_ap()
+{
+    if (this != &rhs)
+    {
+        if (rhs.IsValid())
+            m_opaque_ap.reset(new TypeMemberImpl(rhs.ref()));
+    }
+}
+
+lldb::SBTypeMember&
+SBTypeMember::operator = (const lldb::SBTypeMember& rhs)
+{
+    if (this != &rhs)
+    {
+        if (rhs.IsValid())
+            m_opaque_ap.reset(new TypeMemberImpl(rhs.ref()));
+    }
+    return *this;
+}
+
+bool
+SBTypeMember::IsValid() const
+{
+    return m_opaque_ap.get();
+}
+
+const char *
+SBTypeMember::GetName ()
+{
+    if (m_opaque_ap.get())
+        return m_opaque_ap->GetName().GetCString();
+    return NULL;
+}
+
+SBType
+SBTypeMember::GetType ()
+{
+    SBType sb_type;
+    if (m_opaque_ap.get())
+    {
+        sb_type.reset (m_opaque_ap->GetTypeImpl());
+    }
+    return sb_type;
+
+}
+
+uint64_t
+SBTypeMember::GetOffsetByteSize()
+{
+    if (m_opaque_ap.get())
+        return (m_opaque_ap->GetBitOffset() + 7) / 8u;
+    return 0;
+}
+
+void
+SBTypeMember::reset(TypeMemberImpl *type_member_impl)
+{
+    m_opaque_ap.reset(type_member_impl);
+}
+
+TypeMemberImpl &
+SBTypeMember::ref ()
+{
+    if (m_opaque_ap.get() == NULL)
+        m_opaque_ap.reset (new TypeMemberImpl());
+    return *m_opaque_ap.get();
+}
+
+const TypeMemberImpl &
+SBTypeMember::ref () const
+{
+    return *m_opaque_ap.get();
+}
+
diff --git a/source/API/SBValue.cpp b/source/API/SBValue.cpp
index ea7ebf8..d0e2e67 100644
--- a/source/API/SBValue.cpp
+++ b/source/API/SBValue.cpp
@@ -52,7 +52,7 @@
 {
 }
 
-const SBValue &
+SBValue &
 SBValue::operator = (const SBValue &rhs)
 {
     if (this != &rhs)
@@ -65,7 +65,7 @@
 }
 
 bool
-SBValue::IsValid () const
+SBValue::IsValid ()
 {
     // If this function ever changes to anything that does more than just
     // check if the opaque shared pointer is non NULL, then we need to update
@@ -146,12 +146,6 @@
 }
 
 bool
-SBValue::IsInScope (const SBFrame &sb_frame)
-{
-    return IsInScope();
-}
-
-bool
 SBValue::IsInScope ()
 {
     bool result = false;
@@ -173,12 +167,6 @@
 }
 
 const char *
-SBValue::GetValue (const SBFrame &sb_frame)
-{
-    return GetValue();
-}
-
-const char *
 SBValue::GetValue ()
 {
     const char *cstr = NULL;
@@ -228,12 +216,6 @@
 }
 
 const char *
-SBValue::GetObjectDescription (const SBFrame &sb_frame)
-{
-    return GetObjectDescription ();
-}
-
-const char *
 SBValue::GetObjectDescription ()
 {
     const char *cstr = NULL;
@@ -256,12 +238,6 @@
     return cstr;
 }
 
-bool
-SBValue::GetValueDidChange (const SBFrame &sb_frame)
-{
-    return GetValueDidChange ();
-}
-
 SBType
 SBValue::GetType()
 {
@@ -305,12 +281,6 @@
 }
 
 const char *
-SBValue::GetSummary (const SBFrame &sb_frame)
-{
-    return GetSummary ();
-}
-
-const char *
 SBValue::GetSummary ()
 {
     const char *cstr = NULL;
@@ -334,12 +304,6 @@
 }
 
 const char *
-SBValue::GetLocation (const SBFrame &sb_frame)
-{
-    return GetLocation ();
-}
-
-const char *
 SBValue::GetLocation ()
 {
     const char *cstr = NULL;
@@ -363,12 +327,6 @@
 }
 
 bool
-SBValue::SetValueFromCString (const SBFrame &sb_frame, const char *value_str)
-{
-    return SetValueFromCString (value_str);
-}
-
-bool
 SBValue::SetValueFromCString (const char *value_str)
 {
     bool success = false;
@@ -384,7 +342,7 @@
 }
 
 lldb::SBValue
-SBValue::CreateChildAtOffset (const char *name, uint32_t offset, const SBType& type)
+SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
 {
     lldb::SBValue result;
     if (m_opaque_sp)
@@ -407,7 +365,7 @@
 }
 
 lldb::SBValue
-SBValue::Cast(const SBType& type)
+SBValue::Cast (SBType type)
 {
     return CreateChildAtOffset(m_opaque_sp->GetName().GetCString(), 0, type);
 }
@@ -419,10 +377,10 @@
     if (m_opaque_sp)
     {
         ValueObjectSP result_valobj_sp;
-        m_opaque_sp->GetUpdatePoint().GetTargetSP()->EvaluateExpression(expression,
-                                                                      m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateStackFrame(),
-                                                                      true, true, eNoDynamicValues,
-                                                                      result_valobj_sp);
+        m_opaque_sp->GetUpdatePoint().GetTargetSP()->EvaluateExpression (expression,
+                                                                         m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateStackFrame(),
+                                                                         true, true, eNoDynamicValues,
+                                                                         result_valobj_sp);
         result_valobj_sp->SetName(ConstString(name));
         result = SBValue(result_valobj_sp);
     }
@@ -438,7 +396,7 @@
 }
 
 lldb::SBValue
-SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, const SBType& type)
+SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType type)
 {
     lldb::SBValue result;
     if (m_opaque_sp)
@@ -448,13 +406,13 @@
         
         lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
         
-        ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create(m_opaque_sp->GetUpdatePoint().GetExecutionContextScope(),
-                                                                          real_type.m_opaque_sp->GetASTContext(),
-                                                                          real_type.m_opaque_sp->GetOpaqueQualType(),
-                                                                          ConstString(name),
-                                                                          buffer,
-                                                                          lldb::endian::InlHostByteOrder(), 
-                                                                          GetTarget().GetProcess().GetAddressByteSize()));
+        ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (m_opaque_sp->GetUpdatePoint().GetExecutionContextScope(),
+                                                                           real_type.m_opaque_sp->GetASTContext(),
+                                                                           real_type.m_opaque_sp->GetOpaqueQualType(),
+                                                                           ConstString(name),
+                                                                           buffer,
+                                                                           lldb::endian::InlHostByteOrder(), 
+                                                                           GetTarget().GetProcess().GetAddressByteSize()));
         
         ValueObjectSP result_valobj_sp;
         
@@ -480,9 +438,7 @@
 }
 
 lldb::SBValue
-SBValue::CreateValueFromData (const char* name,
-                              const SBData& data,
-                              const SBType& type)
+SBValue::CreateValueFromData (const char* name, SBData data, SBType type)
 {
     SBValue result;
     
@@ -869,7 +825,7 @@
     {
         if (m_opaque_sp->GetUpdatePoint().GetExecutionContextScope())
         {
-            result = SBThread(lldb::ThreadSP(m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateThread()));
+            result = SBThread(m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateThread()->GetSP());
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
@@ -891,7 +847,7 @@
     {
         if (m_opaque_sp->GetUpdatePoint().GetExecutionContextScope())
         {
-            result = SBFrame(lldb::StackFrameSP(m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateStackFrame()));
+            result.SetFrame (m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateStackFrame()->GetSP());
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
@@ -980,7 +936,7 @@
 }
 
 lldb::Format
-SBValue::GetFormat () const
+SBValue::GetFormat ()
 {
     if (m_opaque_sp)
         return m_opaque_sp->GetFormat();