NSDate.py revision c630f31ca7e5846eb932fcdad39a0d466feb7a66
1579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata"""
2579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico GranataLLDB AppKit formatters
3579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata
4579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granatapart of The LLVM Compiler Infrastructure
5579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico GranataThis file is distributed under the University of Illinois Open Source
6579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico GranataLicense. See LICENSE.TXT for details.
7579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata"""
81328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# summary provider for NSDate
91328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport lldb
101328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport ctypes
110d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.runtime.objc.objc_runtime
120d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.metrics
131328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport struct
141328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport time
151328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport datetime
1686fcb16c848b7503b2d082158886359ef76f1a84Enrico Granataimport CFString
170d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.Logger
181328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
190d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granatastatistics = lldb.formatters.metrics.Metrics()
201328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('invalid_isa')
211328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('invalid_pointer')
221328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('unknown_class')
231328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('code_notrun')
241328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
251328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# Python promises to start counting time at midnight on Jan 1st on the epoch year
261328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# hence, all we need to know is the epoch year
271328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatapython_epoch = time.gmtime(0).tm_year
281328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
291328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataosx_epoch = datetime.date(2001,1,1).timetuple()
301328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
311328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef mkgmtime(t):
320d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
338f18240a09893310c43673901d863892ae7b0611Enrico Granata	return time.mktime(t)-time.timezone
341328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
351328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataosx_epoch = mkgmtime(osx_epoch)
361328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
371328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef osx_to_python_time(osx):
380d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
3983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	if python_epoch <= 2001:
401328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		return osx + osx_epoch
411328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	else:
421328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		return osx - osx_epoch
431328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
447b9aacf4a454465af905e505f74245173714b23bEnrico Granata# represent a struct_time as a string in the format used by Xcode
457b9aacf4a454465af905e505f74245173714b23bEnrico Granatadef xcode_format_time(X):
460d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
477b9aacf4a454465af905e505f74245173714b23bEnrico Granata	return time.strftime('%Y-%m-%d %H:%M:%S %Z',X)
487b9aacf4a454465af905e505f74245173714b23bEnrico Granata
497b9aacf4a454465af905e505f74245173714b23bEnrico Granata# represent a count-since-epoch as a string in the format used by Xcode
507b9aacf4a454465af905e505f74245173714b23bEnrico Granatadef xcode_format_count(X):
510d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
527b9aacf4a454465af905e505f74245173714b23bEnrico Granata	return xcode_format_time(time.localtime(X))
531328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
541328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# despite the similary to synthetic children providers, these classes are not
5583410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata# trying to provide anything but the summary for NSDate, so they need not
561328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# obey the interface specification for synthetic children providers
571328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataclass NSTaggedDate_SummaryProvider:
581328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def adjust_for_architecture(self):
59f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
601328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
61f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, info_bits, data, params):
620d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
631328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.valobj = valobj;
64f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
651328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.update();
6683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		# NSDate is not using its info_bits for info like NSNumber is
6783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		# so we need to regroup info_bits and data
6883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		self.data = ((data << 8) | (info_bits << 4))
691328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
701328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def update(self):
710d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
721328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.adjust_for_architecture();
731328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
741328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def value(self):
750d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
761328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		# the value of the date-time object is wrapped into the pointer value
7783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		# unfortunately, it is made as a time-delta after Jan 1 2001 midnight GMT
781328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		# while all Python knows about is the "epoch", which is a platform-dependent
791328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		# year (1970 of *nix) whose Jan 1 at midnight is taken as reference
8083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		value_double = struct.unpack('d', struct.pack('Q', self.data))[0]
81c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata		if value_double == -63114076800.0:
82c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata			return '0001-12-30 00:00:00 +0000'
837b9aacf4a454465af905e505f74245173714b23bEnrico Granata		return xcode_format_count(osx_to_python_time(value_double))
841328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
851328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
861328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataclass NSUntaggedDate_SummaryProvider:
871328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def adjust_for_architecture(self):
88f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
891328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
90f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
910d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
921328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.valobj = valobj;
93f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
94f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not (self.sys_params.types_cache.double):
95f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			self.sys_params.types_cache.double = self.valobj.GetType().GetBasicType(lldb.eBasicTypeDouble)
961328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.update()
971328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
981328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def update(self):
990d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
1001328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.adjust_for_architecture();
1011328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
1021328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def offset(self):
1030d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
104f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return self.sys_params.pointer_size
1051328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
1061328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def value(self):
1070d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
1081328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		value = self.valobj.CreateChildAtOffset("value",
1091328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata							self.offset(),
110f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.double)
1111328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		value_double = struct.unpack('d', struct.pack('Q', value.GetValueAsUnsigned(0)))[0]
112c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata		if value_double == -63114076800.0:
113c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata			return '0001-12-30 00:00:00 +0000'
1147b9aacf4a454465af905e505f74245173714b23bEnrico Granata		return xcode_format_count(osx_to_python_time(value_double))
1151328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
11683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granataclass NSCalendarDate_SummaryProvider:
11783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	def adjust_for_architecture(self):
118f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
11983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
120f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
1210d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
12283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		self.valobj = valobj;
123f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
124f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not (self.sys_params.types_cache.double):
125f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			self.sys_params.types_cache.double = self.valobj.GetType().GetBasicType(lldb.eBasicTypeDouble)
12683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		self.update()
12783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
12883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	def update(self):
1290d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
13083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		self.adjust_for_architecture();
13183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
13283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	def offset(self):
1330d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
134f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return 2*self.sys_params.pointer_size
13583410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
13683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	def value(self):
1370d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
13883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		value = self.valobj.CreateChildAtOffset("value",
13983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata							self.offset(),
140f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.double)
14183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		value_double = struct.unpack('d', struct.pack('Q', value.GetValueAsUnsigned(0)))[0]
1427b9aacf4a454465af905e505f74245173714b23bEnrico Granata		return xcode_format_count(osx_to_python_time(value_double))
14383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
14486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granataclass NSTimeZoneClass_SummaryProvider:
14586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	def adjust_for_architecture(self):
146f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
14786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata
148f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
1490d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
15086fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata		self.valobj = valobj;
151f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
152f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not (self.sys_params.types_cache.voidptr):
153f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			self.sys_params.types_cache.voidptr = self.valobj.GetType().GetBasicType(lldb.eBasicTypeVoid).GetPointerType()
15486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata		self.update()
15586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata
15686fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	def update(self):
1570d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
15886fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata		self.adjust_for_architecture();
15986fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata
16086fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	def offset(self):
1610d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
162f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return self.sys_params.pointer_size
16386fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata
16486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	def timezone(self):
1650d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
16686fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata		tz_string = self.valobj.CreateChildAtOffset("tz_name",
16786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata							self.offset(),
168f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.voidptr)
16986fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata		return CFString.CFString_SummaryProvider(tz_string,None)
17083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
1711328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataclass NSUnknownDate_SummaryProvider:
1721328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def adjust_for_architecture(self):
173f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
1741328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
1751328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def __init__(self, valobj):
1760d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
1771328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.valobj = valobj;
1781328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.update()
1791328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
1801328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def update(self):
1810d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
1821328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.adjust_for_architecture();
1831328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
1841328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def value(self):
1850d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
1861328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		stream = lldb.SBStream()
1871328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.valobj.GetExpressionPath(stream)
1881328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		expr = "(NSString*)[" + stream.GetData() + " description]"
1891328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		num_children_vo = self.valobj.CreateValueFromExpression("str",expr);
190579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if num_children_vo.IsValid():
191579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return num_children_vo.GetSummary()
192579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return '<variable is not NSDate>'
1931328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
1941328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef GetSummary_Impl(valobj):
1950d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
1961328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	global statistics
197a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata	class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
198579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	if wrapper:
199579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return wrapper
2001328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
2011328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	name_string = class_data.class_name()
2028f18240a09893310c43673901d863892ae7b0611Enrico Granata	logger >> "class name is: " + str(name_string)
2038f18240a09893310c43673901d863892ae7b0611Enrico Granata
2041328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	if name_string == 'NSDate' or name_string == '__NSDate' or name_string == '__NSTaggedDate':
2051328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		if class_data.is_tagged():
206f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			wrapper = NSTaggedDate_SummaryProvider(valobj,class_data.info_bits(),class_data.value(), class_data.sys_params)
2071328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata			statistics.metric_hit('code_notrun',valobj)
2081328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		else:
209f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			wrapper = NSUntaggedDate_SummaryProvider(valobj, class_data.sys_params)
2101328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata			statistics.metric_hit('code_notrun',valobj)
21183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	elif name_string == 'NSCalendarDate':
212f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		wrapper = NSCalendarDate_SummaryProvider(valobj, class_data.sys_params)
21383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		statistics.metric_hit('code_notrun',valobj)
21486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	elif name_string == '__NSTimeZone':
215f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		wrapper = NSTimeZoneClass_SummaryProvider(valobj, class_data.sys_params)
21686fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata		statistics.metric_hit('code_notrun',valobj)
2171328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	else:
218ce035a0ad0a6d6f07c1acdc38bdab02a327052c1Enrico Granata		wrapper = NSUnknownDate_SummaryProvider(valobj)
219805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata		statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
2201328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	return wrapper;
2211328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
2221328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
2231328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef NSDate_SummaryProvider (valobj,dict):
2240d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
2251328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	provider = GetSummary_Impl(valobj);
2261328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	if provider != None:
227a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata		if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
228579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return provider.message()
229579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		try:
230579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = provider.value();
231579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		except:
232579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = None
233579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if summary == None:
234579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = '<variable is not NSDate>'
235579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return str(summary)
236579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	return 'Summary Unavailable'
2371328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
23886fcb16c848b7503b2d082158886359ef76f1a84Enrico Granatadef NSTimeZone_SummaryProvider (valobj,dict):
2390d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
24086fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	provider = GetSummary_Impl(valobj);
24186fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	if provider != None:
242a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata		if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
243579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return provider.message()
244579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		try:
245579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = provider.timezone();
246579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		except:
247579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = None
2488f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger >> "got summary " + str(summary)
249579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if summary == None:
250579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = '<variable is not NSTimeZone>'
251579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return str(summary)
252579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	return 'Summary Unavailable'
25386fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata
25486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata
25583410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granatadef CFAbsoluteTime_SummaryProvider (valobj,dict):
2560d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
25783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	try:
25883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		value_double = struct.unpack('d', struct.pack('Q', valobj.GetValueAsUnsigned(0)))[0]
2597b9aacf4a454465af905e505f74245173714b23bEnrico Granata		return xcode_format_count(osx_to_python_time(value_double))
26083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	except:
261579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return 'Summary Unavailable'
26283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
2631328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
2641328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef __lldb_init_module(debugger,dict):
2651328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	debugger.HandleCommand("type summary add -F NSDate.NSDate_SummaryProvider NSDate")
26683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	debugger.HandleCommand("type summary add -F NSDate.CFAbsoluteTime_SummaryProvider CFAbsoluteTime")
26786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	debugger.HandleCommand("type summary add -F NSDate.NSTimeZone_SummaryProvider NSTimeZone CFTimeZoneRef")
2681328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
269