diff options
author | Greg Clayton <gclayton@apple.com> | 2012-10-09 17:51:53 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2012-10-09 17:51:53 +0000 |
commit | 77fbc8176d9821a0c530b635bbfb70ca780c89c4 (patch) | |
tree | 057371055467f5758cb86ed7521ec9d489cf5621 /lldb/source/Target/ObjCLanguageRuntime.cpp | |
parent | 7c0990ba35e743d58a5751f6019a6faab9478daa (diff) | |
download | bcm5719-llvm-77fbc8176d9821a0c530b635bbfb70ca780c89c4.tar.gz bcm5719-llvm-77fbc8176d9821a0c530b635bbfb70ca780c89c4.zip |
Changes to clean up the runtime and how the ISA caches are managed.
llvm-svn: 165516
Diffstat (limited to 'lldb/source/Target/ObjCLanguageRuntime.cpp')
-rw-r--r-- | lldb/source/Target/ObjCLanguageRuntime.cpp | 107 |
1 files changed, 59 insertions, 48 deletions
diff --git a/lldb/source/Target/ObjCLanguageRuntime.cpp b/lldb/source/Target/ObjCLanguageRuntime.cpp index 5bf0a79e86d..98bb0c44dad 100644 --- a/lldb/source/Target/ObjCLanguageRuntime.cpp +++ b/lldb/source/Target/ObjCLanguageRuntime.cpp @@ -269,7 +269,7 @@ ObjCLanguageRuntime::ClassDescriptor::IsPointerValid (lldb::addr_t value, 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::GetISA(const ConstString &name) 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 @@ ObjCLanguageRuntime::GetParentClass(ObjCLanguageRuntime::ObjCISA isa) 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(); + 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->GetClassName(); + if (found != end && found->second) + return found->second; - ClassDescriptorSP descriptor(GetClassDescriptor(isa)); - if (!descriptor.get() || !descriptor->IsValid()) - return ConstString(); - ConstString class_name = descriptor->GetClassName(); - if (descriptor->IsKVO()) + 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 superclass(descriptor->GetSuperclass()); - if (!superclass.get() || !superclass->IsValid()) - return ConstString(); - descriptor = superclass; + 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; + } } - m_isa_to_descriptor_cache[isa] = descriptor; - return descriptor->GetClassName(); + return ClassDescriptorSP(); } + + + |