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"""
8cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata# example summary provider for NSDate
9cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata# the real summary is now C++ code built into LLDB
101328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport lldb
111328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport ctypes
120d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.runtime.objc.objc_runtime
130d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.metrics
141328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport struct
151328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport time
161328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport datetime
1786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granataimport CFString
180d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.Logger
191328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
200d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granatastatistics = lldb.formatters.metrics.Metrics()
211328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('invalid_isa')
221328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('invalid_pointer')
231328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('unknown_class')
241328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('code_notrun')
251328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
261328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# Python promises to start counting time at midnight on Jan 1st on the epoch year
271328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# hence, all we need to know is the epoch year
281328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatapython_epoch = time.gmtime(0).tm_year
291328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
301328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataosx_epoch = datetime.date(2001,1,1).timetuple()
311328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
321328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef mkgmtime(t):
330d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
348f18240a09893310c43673901d863892ae7b0611Enrico Granata	return time.mktime(t)-time.timezone
351328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
361328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataosx_epoch = mkgmtime(osx_epoch)
371328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
381328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef osx_to_python_time(osx):
390d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
4083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	if python_epoch <= 2001:
411328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		return osx + osx_epoch
421328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	else:
431328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		return osx - osx_epoch
441328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
457b9aacf4a454465af905e505f74245173714b23bEnrico Granata# represent a struct_time as a string in the format used by Xcode
467b9aacf4a454465af905e505f74245173714b23bEnrico Granatadef xcode_format_time(X):
470d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
487b9aacf4a454465af905e505f74245173714b23bEnrico Granata	return time.strftime('%Y-%m-%d %H:%M:%S %Z',X)
497b9aacf4a454465af905e505f74245173714b23bEnrico Granata
507b9aacf4a454465af905e505f74245173714b23bEnrico Granata# represent a count-since-epoch as a string in the format used by Xcode
517b9aacf4a454465af905e505f74245173714b23bEnrico Granatadef xcode_format_count(X):
520d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
537b9aacf4a454465af905e505f74245173714b23bEnrico Granata	return xcode_format_time(time.localtime(X))
541328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
551328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# despite the similary to synthetic children providers, these classes are not
5683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata# trying to provide anything but the summary for NSDate, so they need not
571328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# obey the interface specification for synthetic children providers
581328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataclass NSTaggedDate_SummaryProvider:
591328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def adjust_for_architecture(self):
60f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
611328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
62f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, info_bits, data, params):
630d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
641328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.valobj = valobj;
65f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
661328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.update();
6783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		# NSDate is not using its info_bits for info like NSNumber is
6883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		# so we need to regroup info_bits and data
6983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		self.data = ((data << 8) | (info_bits << 4))
701328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
711328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def update(self):
720d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
731328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.adjust_for_architecture();
741328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
751328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def value(self):
760d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
771328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		# the value of the date-time object is wrapped into the pointer value
7883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		# unfortunately, it is made as a time-delta after Jan 1 2001 midnight GMT
791328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		# while all Python knows about is the "epoch", which is a platform-dependent
801328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		# year (1970 of *nix) whose Jan 1 at midnight is taken as reference
8183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		value_double = struct.unpack('d', struct.pack('Q', self.data))[0]
82c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata		if value_double == -63114076800.0:
83c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata			return '0001-12-30 00:00:00 +0000'
847b9aacf4a454465af905e505f74245173714b23bEnrico Granata		return xcode_format_count(osx_to_python_time(value_double))
851328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
861328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
871328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataclass NSUntaggedDate_SummaryProvider:
881328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def adjust_for_architecture(self):
89f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
901328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
91f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
920d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
931328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.valobj = valobj;
94f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
95f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not (self.sys_params.types_cache.double):
96f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			self.sys_params.types_cache.double = self.valobj.GetType().GetBasicType(lldb.eBasicTypeDouble)
971328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.update()
981328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
991328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def update(self):
1000d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
1011328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.adjust_for_architecture();
1021328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
1031328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def offset(self):
1040d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
105f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return self.sys_params.pointer_size
1061328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
1071328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def value(self):
1080d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
1091328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		value = self.valobj.CreateChildAtOffset("value",
1101328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata							self.offset(),
111f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.double)
11282ad7ca1423d998c6229899fed47464f61b86311Enrico Granata		value_double = struct.unpack('d', struct.pack('Q', value.GetData().uint64[0]))[0]
113c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata		if value_double == -63114076800.0:
114c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata			return '0001-12-30 00:00:00 +0000'
1157b9aacf4a454465af905e505f74245173714b23bEnrico Granata		return xcode_format_count(osx_to_python_time(value_double))
1161328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
11783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granataclass NSCalendarDate_SummaryProvider:
11883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	def adjust_for_architecture(self):
119f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
12083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
121f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
1220d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
12383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		self.valobj = valobj;
124f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
125f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not (self.sys_params.types_cache.double):
126f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			self.sys_params.types_cache.double = self.valobj.GetType().GetBasicType(lldb.eBasicTypeDouble)
12783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		self.update()
12883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
12983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	def update(self):
1300d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
13183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		self.adjust_for_architecture();
13283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
13383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	def offset(self):
1340d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
135f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return 2*self.sys_params.pointer_size
13683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
13783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	def value(self):
1380d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
13983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		value = self.valobj.CreateChildAtOffset("value",
14083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata							self.offset(),
141f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.double)
14282ad7ca1423d998c6229899fed47464f61b86311Enrico Granata		value_double = struct.unpack('d', struct.pack('Q', value.GetData().uint64[0]))[0]
1437b9aacf4a454465af905e505f74245173714b23bEnrico Granata		return xcode_format_count(osx_to_python_time(value_double))
14483410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
14586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granataclass NSTimeZoneClass_SummaryProvider:
14686fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	def adjust_for_architecture(self):
147f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
14886fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata
149f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
1500d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
15186fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata		self.valobj = valobj;
152f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
153f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not (self.sys_params.types_cache.voidptr):
154f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			self.sys_params.types_cache.voidptr = self.valobj.GetType().GetBasicType(lldb.eBasicTypeVoid).GetPointerType()
15586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata		self.update()
15686fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata
15786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	def update(self):
1580d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
15986fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata		self.adjust_for_architecture();
16086fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata
16186fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	def offset(self):
1620d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
163f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return self.sys_params.pointer_size
16486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata
16586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	def timezone(self):
1660d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
16786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata		tz_string = self.valobj.CreateChildAtOffset("tz_name",
16886fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata							self.offset(),
169f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.voidptr)
17086fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata		return CFString.CFString_SummaryProvider(tz_string,None)
17183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
1721328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataclass NSUnknownDate_SummaryProvider:
1731328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def adjust_for_architecture(self):
174f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
1751328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
1761328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def __init__(self, valobj):
1770d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
1781328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.valobj = valobj;
1791328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.update()
1801328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
1811328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def update(self):
1820d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
1831328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.adjust_for_architecture();
1841328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
1851328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	def value(self):
1860d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
1871328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		stream = lldb.SBStream()
1881328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		self.valobj.GetExpressionPath(stream)
1891328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		expr = "(NSString*)[" + stream.GetData() + " description]"
1901328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		num_children_vo = self.valobj.CreateValueFromExpression("str",expr);
191579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if num_children_vo.IsValid():
192579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return num_children_vo.GetSummary()
193579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return '<variable is not NSDate>'
1941328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
1951328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef GetSummary_Impl(valobj):
1960d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
1971328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	global statistics
198a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata	class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
199579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	if wrapper:
200579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return wrapper
2011328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
2021328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	name_string = class_data.class_name()
2038f18240a09893310c43673901d863892ae7b0611Enrico Granata	logger >> "class name is: " + str(name_string)
2048f18240a09893310c43673901d863892ae7b0611Enrico Granata
2051328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	if name_string == 'NSDate' or name_string == '__NSDate' or name_string == '__NSTaggedDate':
2061328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		if class_data.is_tagged():
207f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			wrapper = NSTaggedDate_SummaryProvider(valobj,class_data.info_bits(),class_data.value(), class_data.sys_params)
2081328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata			statistics.metric_hit('code_notrun',valobj)
2091328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata		else:
210f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			wrapper = NSUntaggedDate_SummaryProvider(valobj, class_data.sys_params)
2111328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata			statistics.metric_hit('code_notrun',valobj)
21283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	elif name_string == 'NSCalendarDate':
213f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		wrapper = NSCalendarDate_SummaryProvider(valobj, class_data.sys_params)
21483410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		statistics.metric_hit('code_notrun',valobj)
21586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	elif name_string == '__NSTimeZone':
216f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		wrapper = NSTimeZoneClass_SummaryProvider(valobj, class_data.sys_params)
21786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata		statistics.metric_hit('code_notrun',valobj)
2181328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	else:
219ce035a0ad0a6d6f07c1acdc38bdab02a327052c1Enrico Granata		wrapper = NSUnknownDate_SummaryProvider(valobj)
220805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata		statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
2211328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	return wrapper;
2221328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
2231328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
2241328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef NSDate_SummaryProvider (valobj,dict):
2250d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
2261328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	provider = GetSummary_Impl(valobj);
2271328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	if provider != None:
228a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata		if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
229579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return provider.message()
230579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		try:
231579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = provider.value();
232579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		except:
233579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = None
234579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if summary == None:
235579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = '<variable is not NSDate>'
236579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return str(summary)
237579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	return 'Summary Unavailable'
2381328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
23986fcb16c848b7503b2d082158886359ef76f1a84Enrico Granatadef NSTimeZone_SummaryProvider (valobj,dict):
2400d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
24186fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	provider = GetSummary_Impl(valobj);
24286fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	if provider != None:
243a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata		if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
244579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return provider.message()
245579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		try:
246579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = provider.timezone();
247579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		except:
248579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = None
2498f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger >> "got summary " + str(summary)
250579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if summary == None:
251579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = '<variable is not NSTimeZone>'
252579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return str(summary)
253579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	return 'Summary Unavailable'
25486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata
25586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata
25683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granatadef CFAbsoluteTime_SummaryProvider (valobj,dict):
2570d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
25883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	try:
25982ad7ca1423d998c6229899fed47464f61b86311Enrico Granata		value_double = struct.unpack('d', struct.pack('Q', valobj.GetData().uint64[0]))[0]
2607b9aacf4a454465af905e505f74245173714b23bEnrico Granata		return xcode_format_count(osx_to_python_time(value_double))
26183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	except:
262579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return 'Summary Unavailable'
26383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
2641328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
2651328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef __lldb_init_module(debugger,dict):
2661328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata	debugger.HandleCommand("type summary add -F NSDate.NSDate_SummaryProvider NSDate")
26783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	debugger.HandleCommand("type summary add -F NSDate.CFAbsoluteTime_SummaryProvider CFAbsoluteTime")
26886fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata	debugger.HandleCommand("type summary add -F NSDate.NSTimeZone_SummaryProvider NSTimeZone CFTimeZoneRef")
2691328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata
270