Changes to clean up the runtime and how the ISA caches are managed.


git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@165516 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Target/ObjCLanguageRuntime.cpp b/source/Target/ObjCLanguageRuntime.cpp
index 5bf0a79..98bb0c4 100644
--- a/source/Target/ObjCLanguageRuntime.cpp
+++ b/source/Target/ObjCLanguageRuntime.cpp
@@ -269,7 +269,7 @@
                                                       uint32_t ptr_size,
                                                       bool allow_NULLs,
                                                       bool allow_tagged,
-                                                      bool check_version_specific)
+                                                      bool check_version_specific) const
 {
     if (!value)
         return allow_NULLs;
@@ -308,35 +308,14 @@
 ObjCLanguageRuntime::ObjCISA
 ObjCLanguageRuntime::GetParentClass(ObjCLanguageRuntime::ObjCISA isa)
 {
-    if (!IsValidISA(isa))
-        return 0;
-    
-    ISAToDescriptorIterator found = m_isa_to_descriptor_cache.find(isa);
-    ISAToDescriptorIterator end = m_isa_to_descriptor_cache.end();
-    
-    if (found != end && found->second)
+    ClassDescriptorSP objc_class_sp (GetClassDescriptor(isa));
+    if (objc_class_sp)
     {
-        ClassDescriptorSP superclass = found->second->GetSuperclass();
-        if (!superclass || !superclass->IsValid())
-            return 0;
-        else
-        {
-            ObjCISA parent_isa = superclass->GetISA();
-            m_isa_to_descriptor_cache[parent_isa] = superclass;
-            return parent_isa;
-        }
+        ClassDescriptorSP objc_super_class_sp (objc_class_sp->GetSuperclass());
+        if (objc_super_class_sp)
+            return objc_super_class_sp->GetISA();
     }
-    
-    ClassDescriptorSP descriptor(GetClassDescriptor(isa));
-    if (!descriptor.get() || !descriptor->IsValid())
-        return 0;
-    m_isa_to_descriptor_cache[isa] = descriptor;
-    ClassDescriptorSP superclass(descriptor->GetSuperclass());
-    if (!superclass.get() || !superclass->IsValid())
-        return 0;
-    ObjCISA parent_isa = superclass->GetISA();
-    m_isa_to_descriptor_cache[parent_isa] = superclass;
-    return parent_isa;
+    return 0;
 }
 
 // TODO: should we have a transparent_kvo parameter here to say if we
@@ -344,28 +323,60 @@
 ConstString
 ObjCLanguageRuntime::GetActualTypeName(ObjCLanguageRuntime::ObjCISA isa)
 {
-    static const ConstString g_unknown ("unknown");
-    
-    if (!IsValidISA(isa))
-        return ConstString();
-    
-    ISAToDescriptorIterator found = m_isa_to_descriptor_cache.find(isa);
-    ISAToDescriptorIterator end = m_isa_to_descriptor_cache.end();
-    
-    if (found != end && found->second)
-        return found->second->GetClassName();
-    
-    ClassDescriptorSP descriptor(GetClassDescriptor(isa));
-    if (!descriptor.get() || !descriptor->IsValid())
-        return ConstString();
-    ConstString class_name = descriptor->GetClassName();
-    if (descriptor->IsKVO())
-    {
-        ClassDescriptorSP superclass(descriptor->GetSuperclass());
-        if (!superclass.get() || !superclass->IsValid())
-            return ConstString();
-        descriptor = superclass;
-    }
-    m_isa_to_descriptor_cache[isa] = descriptor;
-    return descriptor->GetClassName();
+    ClassDescriptorSP objc_class_sp (GetNonKVOClassDescriptor(isa));
+    if (objc_class_sp)
+        return objc_class_sp->GetClassName();
+    return ConstString();
 }
+
+ObjCLanguageRuntime::ClassDescriptorSP
+ObjCLanguageRuntime::GetClassDescriptor (ValueObject& in_value)
+{
+    ObjCISA isa = GetISA(in_value);
+    if (isa)
+        return GetClassDescriptor (isa);
+    return ClassDescriptorSP();
+}
+
+ObjCLanguageRuntime::ClassDescriptorSP
+ObjCLanguageRuntime::GetClassDescriptor (ObjCISA isa)
+{
+    ClassDescriptorSP objc_class_sp;
+    if (isa)
+    {
+        ObjCLanguageRuntime::ISAToDescriptorIterator found = m_isa_to_descriptor_cache.find(isa);
+        ObjCLanguageRuntime::ISAToDescriptorIterator end = m_isa_to_descriptor_cache.end();
+    
+        if (found != end && found->second)
+            return found->second;
+    
+        objc_class_sp = CreateClassDescriptor(isa);
+        if (objc_class_sp && objc_class_sp->IsValid())
+            m_isa_to_descriptor_cache[isa] = objc_class_sp;
+    }
+    return objc_class_sp;
+}
+
+ObjCLanguageRuntime::ClassDescriptorSP
+ObjCLanguageRuntime::GetNonKVOClassDescriptor (ObjCISA isa)
+{
+    if (isa)
+    {
+        ClassDescriptorSP objc_class_sp = GetClassDescriptor (isa);
+        if (objc_class_sp && objc_class_sp->IsValid())
+        {
+            if (objc_class_sp->IsKVO())
+            {
+                ClassDescriptorSP non_kvo_objc_class_sp(objc_class_sp->GetSuperclass());
+                if (non_kvo_objc_class_sp && non_kvo_objc_class_sp->IsValid())
+                    return non_kvo_objc_class_sp;
+            }
+            else
+                return objc_class_sp;
+        }
+    }
+    return ClassDescriptorSP();
+}
+
+
+