The Cocoa formatters now provide error messages for many of the common things-went-wrong situations. Previously they would say nothing or log failures to the Python console

llvm-svn: 152673
diff --git a/lldb/examples/summaries/cocoa/CFBitVector.py b/lldb/examples/summaries/cocoa/CFBitVector.py
index 7cd83fe..6035ca7 100644
--- a/lldb/examples/summaries/cocoa/CFBitVector.py
+++ b/lldb/examples/summaries/cocoa/CFBitVector.py
@@ -1,3 +1,10 @@
+"""
+LLDB AppKit formatters
+
+part of The LLVM Compiler Infrastructure
+This file is distributed under the University of Illinois Open Source
+License. See LICENSE.TXT for details.
+"""
 # summary provider for CF(Mutable)BitVector
 import lldb
 import ctypes
@@ -101,41 +108,31 @@
 		self.adjust_for_architecture();
 
 	def contents(self):
-		return '*** unknown class *** very bad thing *** find out my name ***'
+		return '<unable to summarize this CFBitVector>'
 
 
 def GetSummary_Impl(valobj):
 	global statistics
-	class_data = objc_runtime.ObjCRuntime(valobj)
-	if class_data.is_valid() == False:
-		statistics.metric_hit('invalid_pointer',valobj)
-		wrapper = None
-		return
-	class_data = class_data.read_class_data()
-	if class_data.is_valid() == False:
-		statistics.metric_hit('invalid_isa',valobj)
-		wrapper = None
-		return
-	if class_data.is_kvo():
-		class_data = class_data.get_superclass()
-	if class_data.is_valid() == False:
-		statistics.metric_hit('invalid_isa',valobj)
-		wrapper = None
-		return
+	class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
+	if wrapper:
+		return wrapper
 
 	name_string = class_data.class_name()
-	if name_string == '__NSCFType':
+	actual_name = name_string
+	if class_data.is_cftype():
 		# CFBitVectorRef does not expose an actual NSWrapper type, so we have to check that this is
 		# an NSCFType and then check we are a pointer-to CFBitVectorRef
 		valobj_type = valobj.GetType()
 		if valobj_type.IsValid() and valobj_type.IsPointerType():
-			pointee_type = valobj_type.GetPointeeType()
-			if pointee_type.GetName() == '__CFBitVector' or pointee_type.GetName() == '__CFMutableBitVector':
-				wrapper = CFBitVectorKnown_SummaryProvider(valobj, class_data.sys_params)
-				statistics.metric_hit('code_notrun',valobj)
-			else:
-				wrapper = CFBitVectorUnknown_SummaryProvider(valobj)
-				print pointee_type.GetName()
+			valobj_type = valobj_type.GetPointeeType()
+			if valobj_type.IsValid():
+				actual_name = valobj_type.GetName()
+		if actual_name == '__CFBitVector' or actual_name == '__CFMutableBitVector':
+			wrapper = CFBitVectorKnown_SummaryProvider(valobj, class_data.sys_params)
+			statistics.metric_hit('code_notrun',valobj)
+		else:
+			wrapper = CFBitVectorUnknown_SummaryProvider(valobj, class_data.sys_params)
+			print actual_name
 	else:
 		wrapper = CFBitVectorUnknown_SummaryProvider(valobj, class_data.sys_params)
 		print name_string
@@ -145,14 +142,16 @@
 def CFBitVector_SummaryProvider (valobj,dict):
 	provider = GetSummary_Impl(valobj);
 	if provider != None:
-	    #try:
-	    summary = provider.contents();
-	    #except:
-	    #    summary = None
-	    if summary == None or summary == '':
-	        summary = 'no valid bitvector here'
-	    return summary
-	return ''
+		if isinstance(provider,objc_runtime.SpecialSituation_Description):
+			return provider.message()
+		try:
+			summary = provider.contents();
+		except:
+			summary = None
+		if summary == None or summary == '':
+			summary = '<variable is not CFBitVector>'
+		return summary
+	return 'Summary Unavailable'
 
 def __lldb_init_module(debugger,dict):
 	debugger.HandleCommand("type summary add -F CFBitVector.CFBitVector_SummaryProvider CFBitVectorRef CFMutableBitVectorRef")