<rdar://problem/11485744> Implement important data formatters in C++. Have the Objective-C language runtime plugin expose class descriptors objects akin to the objc_runtime.py Pythonic implementation. Rewrite the data formatters for some core Cocoa classes in C++ instead of Python.

git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@163155 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBModule.cpp b/source/API/SBModule.cpp
index 44ac2d3..446a693 100644
--- a/source/API/SBModule.cpp
+++ b/source/API/SBModule.cpp
@@ -542,17 +542,15 @@
 {
     ModuleSP module_sp (GetSP ());
     if (module_sp)
+        return module_sp->GetVersion(versions, num_versions);
+    else
     {
-        ObjectFile *obj_file = module_sp->GetObjectFile();
-        if (obj_file)
-            return obj_file->GetVersion (versions, num_versions);
+        if (versions && num_versions)
+        {
+            for (uint32_t i=0; i<num_versions; ++i)
+                versions[i] = UINT32_MAX;
+        }
+        return 0;
     }
-    
-    if (versions && num_versions)
-    {
-        for (uint32_t i=0; i<num_versions; ++i)
-            versions[i] = UINT32_MAX;
-    }
-    return 0;
 }
 
diff --git a/source/API/SBTypeSummary.cpp b/source/API/SBTypeSummary.cpp
index 86cb89b..4108da0 100644
--- a/source/API/SBTypeSummary.cpp
+++ b/source/API/SBTypeSummary.cpp
@@ -99,6 +99,9 @@
     if (!IsValid())
         return false;
     
+    if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
+        return false;
+    
     return !m_opaque_sp->IsScripted();
 }
 
@@ -107,6 +110,8 @@
 {
     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();
@@ -144,7 +149,7 @@
 {
     if (!IsValid())
         return;
-    if (m_opaque_sp->IsScripted())
+    if (m_opaque_sp->IsScripted() || (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback))
         ChangeSummaryType(false);
     ((StringSummaryFormat*)m_opaque_sp.get())->SetSummaryString(data);
 }
@@ -205,6 +210,16 @@
 {
     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;
@@ -255,12 +270,20 @@
 {
     if (!IsValid())
         return false;
+    
     if (m_opaque_sp.unique())
         return true;
     
     TypeSummaryImplSP new_sp;
     
-    if (m_opaque_sp->IsScripted())
+    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(),
@@ -284,15 +307,23 @@
     if (!IsValid())
         return false;
     
-    if (want_script == m_opaque_sp->IsScripted())
-        return CopyOnWrite_Impl();
-    
     TypeSummaryImplSP new_sp;
     
-    if (want_script)
-        new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), "", ""));
-    else
-        new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
+    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);