[Lldb-commits] [lldb] r151826 - in /lldb/trunk: examples/summaries/cocoa/CFString.py examples/summaries/cocoa/NSDate.py examples/summaries/cocoa/NSIndexSet.py examples/summaries/cocoa/NSNumber.py examples/summaries/cocoa/NSSet.py scripts/Python/finish-swig-Python-LLDB.sh source/Core/FormatManager.cpp source/Interpreter/ScriptInterpreterPython.cpp test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py test/functionalities/data-formatter/data-formatter-objc/main.m

Enrico Granata egranata at apple.com
Thu Mar 1 11:32:33 PST 2012


Author: enrico
Date: Thu Mar  1 13:32:33 2012
New Revision: 151826

URL: http://llvm.org/viewvc/llvm-project?rev=151826&view=rev
Log:
(a) adding an introspection formatter for NS(Mutable)IndexSet
(b) fixes and improvements to the formatters for NSDate and NSString
(c) adding an introspection formatter for NSCountedSet
(d) making the Objective-C formatters test cases pass on both 64 and 32 bit
    one of the test cases is marked as expected failure on i386 - support needs to be added to the LLDB core for it to pass

Added:
    lldb/trunk/examples/summaries/cocoa/NSIndexSet.py
Modified:
    lldb/trunk/examples/summaries/cocoa/CFString.py
    lldb/trunk/examples/summaries/cocoa/NSDate.py
    lldb/trunk/examples/summaries/cocoa/NSNumber.py
    lldb/trunk/examples/summaries/cocoa/NSSet.py
    lldb/trunk/scripts/Python/finish-swig-Python-LLDB.sh
    lldb/trunk/source/Core/FormatManager.cpp
    lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp
    lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py
    lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/main.m

Modified: lldb/trunk/examples/summaries/cocoa/CFString.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/summaries/cocoa/CFString.py?rev=151826&r1=151825&r2=151826&view=diff
==============================================================================
--- lldb/trunk/examples/summaries/cocoa/CFString.py (original)
+++ lldb/trunk/examples/summaries/cocoa/CFString.py Thu Mar  1 13:32:33 2012
@@ -1,6 +1,7 @@
 # synthetic children and summary provider for CFString
 # (and related NSString class)
 import lldb
+import objc_runtime
 
 def CFString_SummaryProvider (valobj,dict):
 	provider = CFStringSynthProvider(valobj,dict);
@@ -109,7 +110,12 @@
 				# content begins at * (i.e. 8 bytes into variants, skipping void* buffer in
 				# __notInlineImmutable1 entirely, while the length byte is correctly located
 				# for an inline string)
-				pointer = pointer + 8;
+				# on NMOS in 32 bit mode, we need to skip 4 bytes instead of why
+				# if the same occurs on Lion, then this simply needs to be pointer + pointer_size
+				if self.is_64_bit == False and objc_runtime.Utilities.check_is_osx_lion(self.valobj.GetTarget()) == False:
+					pointer = pointer + 4
+				else:
+					pointer = pointer + 8;
 		else:
 			pointer = self.valobj.GetValueAsUnsigned(0) + self.size_of_cfruntime_base();
 			# read 8 bytes here and make an address out of them

Modified: lldb/trunk/examples/summaries/cocoa/NSDate.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/summaries/cocoa/NSDate.py?rev=151826&r1=151825&r2=151826&view=diff
==============================================================================
--- lldb/trunk/examples/summaries/cocoa/NSDate.py (original)
+++ lldb/trunk/examples/summaries/cocoa/NSDate.py Thu Mar  1 13:32:33 2012
@@ -25,14 +25,14 @@
 osx_epoch = mkgmtime(osx_epoch)
 
 def osx_to_python_time(osx):
-	if python_epoch <= 2011:
+	if python_epoch <= 2001:
 		return osx + osx_epoch
 	else:
 		return osx - osx_epoch
 
 
 # despite the similary to synthetic children providers, these classes are not
-# trying to provide anything but the port number of an NSDate, so they need not
+# trying to provide anything but the summary for NSDate, so they need not
 # obey the interface specification for synthetic children providers
 class NSTaggedDate_SummaryProvider:
 	def adjust_for_architecture(self):
@@ -43,8 +43,9 @@
 	def __init__(self, valobj, info_bits, data):
 		self.valobj = valobj;
 		self.update();
-		self.info_bits = info_bits
-		self.data = data
+		# NSDate is not using its info_bits for info like NSNumber is
+		# so we need to regroup info_bits and data
+		self.data = ((data << 8) | (info_bits << 4))
 
 	def update(self):
 		self.adjust_for_architecture();
@@ -63,10 +64,12 @@
 
 	def value(self):
 		# the value of the date-time object is wrapped into the pointer value
-		# unfortunately, it is made as a time-delta after Jan 1 2011 midnight GMT
+		# unfortunately, it is made as a time-delta after Jan 1 2001 midnight GMT
 		# while all Python knows about is the "epoch", which is a platform-dependent
 		# year (1970 of *nix) whose Jan 1 at midnight is taken as reference
-		return time.ctime(osx_to_python_time(self.data))
+		print hex(self.data)
+		value_double = struct.unpack('d', struct.pack('Q', self.data))[0]
+		return time.ctime(osx_to_python_time(value_double))
 
 
 class NSUntaggedDate_SummaryProvider:
@@ -99,6 +102,37 @@
 		value_double = struct.unpack('d', struct.pack('Q', value.GetValueAsUnsigned(0)))[0]
 		return time.ctime(osx_to_python_time(value_double))
 
+class NSCalendarDate_SummaryProvider:
+	def adjust_for_architecture(self):
+		self.is_64_bit = (self.valobj.GetTarget().GetProcess().GetAddressByteSize() == 8)
+		self.is_little = (self.valobj.GetTarget().GetProcess().GetByteOrder() == lldb.eByteOrderLittle)
+		self.pointer_size = self.valobj.GetTarget().GetProcess().GetAddressByteSize()
+
+	def __init__(self, valobj):
+		self.valobj = valobj;
+		self.update()
+
+	def update(self):
+		self.adjust_for_architecture();
+		self.id_type = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
+		self.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong)
+		self.double = self.valobj.GetType().GetBasicType(lldb.eBasicTypeDouble)
+
+	def offset(self):
+		if self.is_64_bit:
+			return 16
+		else:
+			return 8
+
+
+	def value(self):
+		value = self.valobj.CreateChildAtOffset("value",
+							self.offset(),
+							self.double)
+		value_double = struct.unpack('d', struct.pack('Q', value.GetValueAsUnsigned(0)))[0]
+		return time.ctime(osx_to_python_time(value_double))
+
+
 class NSUnknownDate_SummaryProvider:
 	def adjust_for_architecture(self):
 		self.is_64_bit = (self.valobj.GetTarget().GetProcess().GetAddressByteSize() == 8)
@@ -147,7 +181,11 @@
 		else:
 			wrapper = NSUntaggedDate_SummaryProvider(valobj)
 			statistics.metric_hit('code_notrun',valobj)
+	elif name_string == 'NSCalendarDate':
+		wrapper = NSCalendarDate_SummaryProvider(valobj)
+		statistics.metric_hit('code_notrun',valobj)
 	else:
+		print name_string # comment this out in release mode
 		wrapper = NSUnknownDate_SummaryProvider(valobj)
 		statistics.metric_hit('unknown_class',str(valobj) + " seen as " + name_string)
 	return wrapper;
@@ -161,11 +199,19 @@
 	    #except:
 	    #    summary = None
 	    if summary == None:
-	        summary = 'no valid number here'
+	        summary = 'no valid date here'
 	    return str(summary)
 	return ''
 
+def CFAbsoluteTime_SummaryProvider (valobj,dict):
+	try:
+		value_double = struct.unpack('d', struct.pack('Q', valobj.GetValueAsUnsigned(0)))[0]
+		return time.ctime(osx_to_python_time(value_double))
+	except:
+		return 'unable to provide a summary'
+
 
 def __lldb_init_module(debugger,dict):
 	debugger.HandleCommand("type summary add -F NSDate.NSDate_SummaryProvider NSDate")
+	debugger.HandleCommand("type summary add -F NSDate.CFAbsoluteTime_SummaryProvider CFAbsoluteTime")
 

Added: lldb/trunk/examples/summaries/cocoa/NSIndexSet.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/summaries/cocoa/NSIndexSet.py?rev=151826&view=auto
==============================================================================
--- lldb/trunk/examples/summaries/cocoa/NSIndexSet.py (added)
+++ lldb/trunk/examples/summaries/cocoa/NSIndexSet.py Thu Mar  1 13:32:33 2012
@@ -0,0 +1,130 @@
+# summary provider for NS(Mutable)IndexSet
+import lldb
+import ctypes
+import objc_runtime
+import metrics
+
+statistics = metrics.Metrics()
+statistics.add_metric('invalid_isa')
+statistics.add_metric('invalid_pointer')
+statistics.add_metric('unknown_class')
+statistics.add_metric('code_notrun')
+
+# despite the similary to synthetic children providers, these classes are not
+# trying to provide anything but the count of values for an NSIndexSet, so they need not
+# obey the interface specification for synthetic children providers
+class NSIndexSetClass_SummaryProvider:
+	def adjust_for_architecture(self):
+		self.is_64_bit = (self.valobj.GetTarget().GetProcess().GetAddressByteSize() == 8)
+		self.is_little = (self.valobj.GetTarget().GetProcess().GetByteOrder() == lldb.eByteOrderLittle)
+		self.pointer_size = self.valobj.GetTarget().GetProcess().GetAddressByteSize()
+
+	def __init__(self, valobj):
+		self.valobj = valobj;
+		self.update();
+
+	def update(self):
+		self.adjust_for_architecture();
+		self.id_type = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
+		self.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong)
+
+	# NS(Mutable)IndexSet works in one of two modes: when having a compact block of data (e.g. a Range)
+	# the count is stored in the set itself, 3 pointers into it
+	# otherwise, it will store a pointer to an additional data structure (2 pointers into itself) and this
+	# additional structure will contain the count two pointers deep
+	# to distinguish the two modes, one reads two pointers deep into the object data: if only the MSB
+	# is set, then we are in mode 1, using that area to store flags, otherwise, the read pointer is the
+	# location to go look for count in mode 2
+	def count(self):
+		mode_chooser_vo = self.valobj.CreateChildAtOffset("mode_chooser",
+							2*self.pointer_size,
+							self.NSUInteger)
+		mode_chooser =  mode_chooser_vo.GetValueAsUnsigned(0)
+		if self.is_64_bit:
+			mode_chooser = mode_chooser & 0xFFFFFFFFFFFFFF00
+		else:
+			mode_chooser = mode_chooser & 0xFFFFFF00
+		if mode_chooser == 0:
+			mode = 1
+		else:
+			mode = 2
+		if mode == 1:
+			count_vo = self.valobj.CreateChildAtOffset("count",
+								3*self.pointer_size,
+								self.NSUInteger)
+		else:
+			count_ptr = mode_chooser_vo.GetValueAsUnsigned(0)
+			count_vo = self.valobj.CreateValueFromAddress("count",
+								count_ptr+2*self.pointer_size,
+								self.NSUInteger)
+		return count_vo.GetValueAsUnsigned(0)
+
+
+class NSIndexSetUnknown_SummaryProvider:
+	def adjust_for_architecture(self):
+		self.is_64_bit = (self.valobj.GetTarget().GetProcess().GetAddressByteSize() == 8)
+		self.is_little = (self.valobj.GetTarget().GetProcess().GetByteOrder() == lldb.eByteOrderLittle)
+		self.pointer_size = self.valobj.GetTarget().GetProcess().GetAddressByteSize()
+
+	def __init__(self, valobj):
+		self.valobj = valobj;
+		self.update()
+
+	def update(self):
+		self.adjust_for_architecture();
+		self.id_type = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
+
+	def count(self):
+		stream = lldb.SBStream()
+		self.valobj.GetExpressionPath(stream)
+		expr = "(int)[" + stream.GetData() + " count]"
+		num_children_vo = self.valobj.CreateValueFromExpression("count",expr);
+		return num_children_vo.GetValueAsUnsigned(0)
+
+
+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
+	
+	name_string = class_data.class_name()
+	if name_string == 'NSIndexSet' or name_string == 'NSMutableIndexSet':
+		wrapper = NSIndexSetClass_SummaryProvider(valobj)
+		statistics.metric_hit('code_notrun',valobj)
+	else:
+		wrapper = NSIndexSetUnknown_SummaryProvider(valobj)
+		statistics.metric_hit('unknown_class',str(valobj) + " seen as " + name_string)
+	return wrapper;
+
+
+def NSIndexSet_SummaryProvider (valobj,dict):
+	provider = GetSummary_Impl(valobj);
+	if provider != None:
+		try:
+			summary = provider.count();
+		except:
+			summary = None
+		if summary == None:
+			summary = 'no valid set here'
+		else:
+			summary = str(summary) + ' objects'
+		return summary
+	return ''
+
+
+def __lldb_init_module(debugger,dict):
+	debugger.HandleCommand("type summary add -F NSIndexSet.NSIndexSet_SummaryProvider NSIndexSet NSMutableIndexSet")

Modified: lldb/trunk/examples/summaries/cocoa/NSNumber.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/summaries/cocoa/NSNumber.py?rev=151826&r1=151825&r2=151826&view=diff
==============================================================================
--- lldb/trunk/examples/summaries/cocoa/NSNumber.py (original)
+++ lldb/trunk/examples/summaries/cocoa/NSNumber.py Thu Mar  1 13:32:33 2012
@@ -116,8 +116,16 @@
 			return '(int)' + str(data_vo.GetValueAsUnsigned(0) % (256*256*256*256))
 		# apparently, on is_64_bit architectures, these are the only values that will ever
 		# be represented by a non tagged pointers
-		elif data_type == 0B10001 or data_type == 0B0100:
-			data_offset = data_offset + self.pointer_size
+		elif data_type == 0B10001:
+			data_offset = data_offset + 8 # 8 is needed even if we are on 32bit
+			data_vo = self.valobj.CreateChildAtOffset("data",
+								data_offset,
+								self.longlong)
+			statistics.metric_hit('code_notrun',self.valobj)
+			return '(long)' + str(data_vo.GetValueAsUnsigned(0))
+		elif data_type == 0B0100:
+			if self.is_64_bit:
+				data_offset = data_offset + self.pointer_size
 			data_vo = self.valobj.CreateChildAtOffset("data",
 								data_offset,
 								self.longlong)

Modified: lldb/trunk/examples/summaries/cocoa/NSSet.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/summaries/cocoa/NSSet.py?rev=151826&r1=151825&r2=151826&view=diff
==============================================================================
--- lldb/trunk/examples/summaries/cocoa/NSSet.py (original)
+++ lldb/trunk/examples/summaries/cocoa/NSSet.py Thu Mar  1 13:32:33 2012
@@ -3,6 +3,7 @@
 import ctypes
 import objc_runtime
 import metrics
+import CFBag
 
 statistics = metrics.Metrics()
 statistics.add_metric('invalid_isa')
@@ -138,6 +139,35 @@
 		return num_children_vo.GetValueAsUnsigned(0)
 
 
+class NSCountedSet_SummaryProvider:
+	def adjust_for_architecture(self):
+		self.is_64_bit = (self.valobj.GetTarget().GetProcess().GetAddressByteSize() == 8)
+		self.is_little = (self.valobj.GetTarget().GetProcess().GetByteOrder() == lldb.eByteOrderLittle)
+		self.pointer_size = self.valobj.GetTarget().GetProcess().GetAddressByteSize()
+
+	def __init__(self, valobj):
+		self.valobj = valobj;
+		self.update();
+
+	def update(self):
+		self.adjust_for_architecture();
+		self.id_type = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
+		self.voidptr_type = self.valobj.GetType().GetBasicType(lldb.eBasicTypeVoid).GetPointerType()
+
+	# an NSCountedSet is implemented using a CFBag whose pointer just follows the ISA
+	def offset(self):
+		if self.is_64_bit:
+			return 8
+		else:
+			return 4
+
+	def count(self):
+		cfbag_vo = self.valobj.CreateChildAtOffset("bag_impl",
+							self.offset(),
+							self.voidptr_type)
+		return CFBag.CFBagRef_SummaryProvider(cfbag_vo).length()
+
+
 def GetSummary_Impl(valobj):
 	global statistics
 	class_data = objc_runtime.ObjCRuntime(valobj)
@@ -167,6 +197,9 @@
 	elif name_string == '__NSSetM':
 		wrapper = NSSetM_SummaryProvider(valobj)
 		statistics.metric_hit('code_notrun',valobj)
+	elif name_string == 'NSCountedSet':
+		wrapper = NSCountedSet_SummaryProvider(valobj)
+		statistics.metric_hit('code_notrun',valobj)
 	else:
 		wrapper = NSSetUnknown_SummaryProvider(valobj)
 		statistics.metric_hit('unknown_class',str(valobj) + " seen as " + name_string)

Modified: lldb/trunk/scripts/Python/finish-swig-Python-LLDB.sh
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/finish-swig-Python-LLDB.sh?rev=151826&r1=151825&r2=151826&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/finish-swig-Python-LLDB.sh (original)
+++ lldb/trunk/scripts/Python/finish-swig-Python-LLDB.sh Thu Mar  1 13:32:33 2012
@@ -396,6 +396,20 @@
     fi
 fi
 
+if [ -f "${SRC_ROOT}/examples/summaries/cocoa/NSIndexSet.py" ]
+then
+    if [ $Debug == 1 ]
+    then
+        echo "Copying NSIndexSet.py to ${framework_python_dir}"
+    fi
+    cp "${SRC_ROOT}/examples/summaries/cocoa/NSIndexSet.py" "${framework_python_dir}"
+else
+    if [ $Debug == 1 ]
+    then
+        echo "Unable to find ${SRC_ROOT}/examples/summaries/cocoa/NSIndexSet.py"
+    fi
+fi
+
 if [ -f "${SRC_ROOT}/examples/summaries/cocoa/cache.py" ]
 then
     if [ $Debug == 1 ]

Modified: lldb/trunk/source/Core/FormatManager.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/FormatManager.cpp?rev=151826&r1=151825&r2=151826&view=diff
==============================================================================
--- lldb/trunk/source/Core/FormatManager.cpp (original)
+++ lldb/trunk/source/Core/FormatManager.cpp Thu Mar  1 13:32:33 2012
@@ -738,7 +738,7 @@
                ConstString("CFRange"),
                objc_flags);
     AddSummary(corefoundation_category_sp,
-               "x=${var.x}, y=${var.y}",
+               "(x=${var.x}, y=${var.y})",
                ConstString("NSPoint"),
                objc_flags);
     AddSummary(corefoundation_category_sp,
@@ -754,7 +754,7 @@
                ConstString("NSRectArray"),
                objc_flags);
     AddSummary(objc_category_sp,
-               "width=${var.width}, height=${var.height}",
+               "(width=${var.width}, height=${var.height})",
                ConstString("NSSize"),
                objc_flags);
     
@@ -856,6 +856,15 @@
     
     AddScriptSummary(appkit_category_sp, "NSDate.NSDate_SummaryProvider", ConstString("NSDate"), appkit_flags);
     
+    // CFAbsoluteTime is actually a double rather than a pointer to an object
+    // we do not care about the numeric value, since it is probably meaningless to users
+    appkit_flags.SetDontShowValue(true);
+    AddScriptSummary(appkit_category_sp, "NSDate.CFAbsoluteTime_SummaryProvider", ConstString("CFAbsoluteTime"), appkit_flags);
+    appkit_flags.SetDontShowValue(false);
+    
+    AddScriptSummary(appkit_category_sp, "NSIndexSet.NSIndexSet_SummaryProvider", ConstString("NSIndexSet"), appkit_flags);
+    AddScriptSummary(appkit_category_sp, "NSIndexSet.NSIndexSet_SummaryProvider", ConstString("NSMutableIndexSet"), appkit_flags);
+
     TypeCategoryImpl::SharedPointer vectors_category_sp = GetCategory(m_vectortypes_category_name);
 
     TypeSummaryImpl::Flags vector_flags;

Modified: lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp?rev=151826&r1=151825&r2=151826&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp (original)
+++ lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp Thu Mar  1 13:32:33 2012
@@ -282,7 +282,7 @@
     // WARNING: temporary code that loads Cocoa formatters - this should be done on a per-platform basis rather than loading the whole set
     // and letting the individual formatter classes exploit APIs to check whether they can/cannot do their task
     run_string.Clear();
-    run_string.Printf ("run_one_line (%s, 'import CFString, CFArray, CFDictionary, NSData, NSMachPort, NSSet, NSNotification, NSException, CFBag, CFBinaryHeap, NSURL, NSBundle, NSNumber, NSDate')", m_dictionary_name.c_str());
+    run_string.Printf ("run_one_line (%s, 'import CFString, CFArray, CFDictionary, NSData, NSMachPort, NSSet, NSNotification, NSException, CFBag, CFBinaryHeap, NSURL, NSBundle, NSNumber, NSDate, NSIndexSet')", m_dictionary_name.c_str());
     PyRun_SimpleString (run_string.GetData());
 
     int new_count = Debugger::TestDebuggerRefCount();

Modified: lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py?rev=151826&r1=151825&r2=151826&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py (original)
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py Thu Mar  1 13:32:33 2012
@@ -6,6 +6,7 @@
 import unittest2
 import lldb
 from lldbtest import *
+import datetime
 
 class ObjCDataFormatterTestCase(TestBase):
 
@@ -59,6 +60,20 @@
         self.buildDwarf()
         self.kvo_data_formatter_commands()
 
+    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
+    @expectedFailurei386
+    def test_expr_with_dsym_and_run_command(self):
+        """Test common cases of expression parser <--> formatters interaction."""
+        self.buildDsym()
+        self.expr_objc_data_formatter_commands()
+
+    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
+    @expectedFailurei386
+    def test_expr_with_dwarf_and_run_command(self):
+        """Test common cases of expression parser <--> formatters interaction."""
+        self.buildDwarf()
+        self.expr_objc_data_formatter_commands()
+
     def setUp(self):
         # Call super's setUp().
         TestBase.setUp(self)
@@ -180,7 +195,7 @@
                     '(NSNumber *) num4 = ',' (long)18446744073709551614',
                     '(NSNumber *) num5 = ',' (char)65',
                     '(NSNumber *) num6 = ',' (long)255',
-                    '(NSNumber *) num7 = ',' (long)2000000',
+                    '(NSNumber *) num7 = ','2000000',
                     '(NSNumber *) num8_Y = ',' @"1"',
                     '(NSNumber *) num8_N = ',' @"0"',
                     '(NSNumber *) num9 = ',' (short)33920'])
@@ -252,6 +267,69 @@
         self.expect('frame variable port',
                     substrs = ['(NSMachPort *) port = ',' mach port: '])
 
+        self.expect('frame variable date1 date2',
+                    substrs = ['10','1985','1','2011'])
+
+        # this test might fail if we hit the breakpoint late on December 31st of some given year
+        # and midnight comes between hitting the breakpoint and running this line of code
+        # hopefully the output will be revealing enough in that case :-)
+        now_year = str(datetime.datetime.now().year)
+
+        self.expect('frame variable date3 date4',
+                    substrs = [now_year,'1970'])
+
+        self.expect('frame variable date1_abs date2_abs',
+                    substrs = ['10','1985','1','2011'])
+
+        self.expect('frame variable date3_abs date4_abs',
+                    substrs = [now_year,'1970'])
+
+        #self.runCmd('mem read `&date4_abs`')
+
+        #self.runCmd('mem read `nscounted_set`')
+
+        self.expect('frame variable nscounted_set',
+                    substrs = ['(NSCountedSet *) nscounted_set = ','5 objects'])
+
+        #self.runCmd('mem read `imset`')
+        #self.runCmd("p (int)[imset count]")
+
+        self.expect('frame variable iset1 iset2 imset',
+                    substrs = ['4 objects','512 objects','10 objects'])
+
+    def expr_objc_data_formatter_commands(self):
+        """Test common cases of expression parser <--> formatters interaction."""
+        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+        self.expect("breakpoint set -f main.m -l %d" % self.line,
+                    BREAKPOINT_CREATED,
+            startstr = "Breakpoint created: 1: file ='main.m', line = %d, locations = 1" %
+                        self.line)
+
+        self.runCmd("run", RUN_SUCCEEDED)
+
+        # The stop reason of the thread should be breakpoint.
+        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+            substrs = ['stopped',
+                       'stop reason = breakpoint'])
+
+        # This is the function to remove the custom formats in order to have a
+        # clean slate for the next test case.
+        def cleanup():
+            self.runCmd('type format clear', check=False)
+            self.runCmd('type summary clear', check=False)
+            self.runCmd('type synth clear', check=False)
+            self.runCmd('type category disable CoreFoundation', check=False)
+            self.runCmd('type category disable CoreGraphics', check=False)
+            self.runCmd('type category disable CoreServices', check=False)
+            self.runCmd('type category disable AppKit', check=False)
+
+        # Execute the cleanup function during test case tear down.
+        self.addTearDownHook(cleanup)
+
+        # Now enable AppKit
+        self.runCmd("type category enable AppKit")
+
         # check that the formatters are able to deal safely and correctly
         # with ValueObjects that the expression parser returns
         self.expect('expression ((id)@"Hello")', matching=False,
@@ -307,13 +385,13 @@
         self.expect("frame variable",
              substrs = ['(CFGregorianUnits) cf_greg_units = 1 years, 3 months, 5 days, 12 hours, 5 minutes 7 seconds',
              '(CFRange) cf_range = location=4 length=4',
-             '(NSPoint) ns_point = x=4, y=4',
+             '(NSPoint) ns_point = (x=4, y=4)',
              '(NSRange) ns_range = location=4, length=4',
              '(NSRect *) ns_rect_ptr = (x=1, y=1), (width=5, height=5)',
              '(NSRect) ns_rect = (x=1, y=1), (width=5, height=5)',
              '(NSRectArray) ns_rect_arr = ((x=1, y=1), (width=5, height=5)), ...',
-             '(NSSize) ns_size = width=5, height=7',
-             '(NSSize *) ns_size_ptr = width=5, height=7',
+             '(NSSize) ns_size = (width=5, height=7)',
+             '(NSSize *) ns_size_ptr = (width=5, height=7)',
              '(CGSize) cg_size = (width=1, height=6)',
              '(CGPoint) cg_point = (x=2, y=7)',
              '(CGRect) cg_rect = origin=(x=1, y=2) size=(width=7, height=7)',

Modified: lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/main.m
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/main.m?rev=151826&r1=151825&r2=151826&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/main.m (original)
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/main.m Thu Mar  1 13:32:33 2012
@@ -517,6 +517,41 @@
 	    NSURL *nsurl2 = [NSURL URLWithString:@"page.html" relativeToURL:nsurl];
 	    NSURL *nsurl3 = [NSURL URLWithString:@"?whatever" relativeToURL:nsurl2];
     
+		NSDate *date1 = [NSDate dateWithNaturalLanguageString:@"6pm April 10, 1985"];
+		NSDate *date2 = [NSDate dateWithNaturalLanguageString:@"12am January 1, 2011"];
+		NSDate *date3 = [NSDate date];
+		NSDate *date4 = [NSDate dateWithTimeIntervalSince1970:24*60*60];
+
+		CFAbsoluteTime date1_abs = CFDateGetAbsoluteTime(date1);
+		CFAbsoluteTime date2_abs = CFDateGetAbsoluteTime(date2);
+		CFAbsoluteTime date3_abs = CFDateGetAbsoluteTime(date3);
+		CFAbsoluteTime date4_abs = CFDateGetAbsoluteTime(date4);
+
+	    NSCountedSet *nscounted_set = [[NSCountedSet alloc] initWithCapacity:5];
+
+	    [nscounted_set addObject:str0];
+	    [nscounted_set addObject:str1];
+	    [nscounted_set addObject:str0];
+	    [nscounted_set addObject:str0];
+	    [nscounted_set addObject:@"foo1"];
+	    [nscounted_set addObject:@"foo2"];
+	    [nscounted_set addObject:@"foo3"];
+	
+	    NSIndexSet *iset1 = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange(1, 4)];
+	    NSIndexSet *iset2 = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange(1, 512)];
+
+	    NSMutableIndexSet *imset = [[NSMutableIndexSet alloc] init];
+	    [imset addIndex:4];
+	    [imset addIndex:7];
+	    [imset addIndex:9];
+	    [imset addIndex:11];
+	    [imset addIndex:24];
+	    [imset addIndex:41];
+	    [imset addIndex:58];
+	    [imset addIndex:61];
+	    [imset addIndex:62];
+	    [imset addIndex:63];
+
 	CFGregorianUnits cf_greg_units = {1,3,5,12,5,7};
 	CFRange cf_range = {4,4};
 	NSPoint ns_point = {4,4};





More information about the lldb-commits mailing list