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"""
8b370df27c76fd875f3312be487868528121a4838Enrico Granata# summary provider for NSSet
9b370df27c76fd875f3312be487868528121a4838Enrico Granataimport lldb
10b370df27c76fd875f3312be487868528121a4838Enrico Granataimport ctypes
110d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.runtime.objc.objc_runtime
120d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.metrics
1383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granataimport CFBag
140d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.Logger
15b370df27c76fd875f3312be487868528121a4838Enrico Granata
160d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granatastatistics = lldb.formatters.metrics.Metrics()
17b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_isa')
18b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_pointer')
19b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('unknown_class')
20b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('code_notrun')
21b370df27c76fd875f3312be487868528121a4838Enrico Granata
22b370df27c76fd875f3312be487868528121a4838Enrico Granata# despite the similary to synthetic children providers, these classes are not
23b370df27c76fd875f3312be487868528121a4838Enrico Granata# trying to provide anything but the port number of an NSMachPort, so they need not
24b370df27c76fd875f3312be487868528121a4838Enrico Granata# obey the interface specification for synthetic children providers
25b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSCFSet_SummaryProvider:
26b370df27c76fd875f3312be487868528121a4838Enrico Granata	def adjust_for_architecture(self):
27f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
28b370df27c76fd875f3312be487868528121a4838Enrico Granata
29f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
300d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
31b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj = valobj;
32f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
33f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not(self.sys_params.types_cache.NSUInteger):
34f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			if self.sys_params.is_64_bit:
35f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata				self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong)
36f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			else:
37f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata				self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedInt)
38b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.update();
39b370df27c76fd875f3312be487868528121a4838Enrico Granata
40b370df27c76fd875f3312be487868528121a4838Enrico Granata	def update(self):
410d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
42b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.adjust_for_architecture();
43b370df27c76fd875f3312be487868528121a4838Enrico Granata
44b370df27c76fd875f3312be487868528121a4838Enrico Granata	# one pointer is the ISA
45b370df27c76fd875f3312be487868528121a4838Enrico Granata	# then we have one other internal pointer, plus
46b370df27c76fd875f3312be487868528121a4838Enrico Granata	# 4 bytes worth of flags. hence, these values
47b370df27c76fd875f3312be487868528121a4838Enrico Granata	def offset(self):
480d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
49f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if self.sys_params.is_64_bit:
50b370df27c76fd875f3312be487868528121a4838Enrico Granata			return 20
51b370df27c76fd875f3312be487868528121a4838Enrico Granata		else:
52b370df27c76fd875f3312be487868528121a4838Enrico Granata			return 12
53b370df27c76fd875f3312be487868528121a4838Enrico Granata
54b370df27c76fd875f3312be487868528121a4838Enrico Granata	def count(self):
550d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
56b370df27c76fd875f3312be487868528121a4838Enrico Granata		vcount = self.valobj.CreateChildAtOffset("count",
57b370df27c76fd875f3312be487868528121a4838Enrico Granata							self.offset(),
58f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.NSUInteger)
59b370df27c76fd875f3312be487868528121a4838Enrico Granata		return vcount.GetValueAsUnsigned(0)
60b370df27c76fd875f3312be487868528121a4838Enrico Granata
61b370df27c76fd875f3312be487868528121a4838Enrico Granata
62b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSSetUnknown_SummaryProvider:
63b370df27c76fd875f3312be487868528121a4838Enrico Granata	def adjust_for_architecture(self):
64f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
65b370df27c76fd875f3312be487868528121a4838Enrico Granata
66f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
670d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
68b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj = valobj;
69f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
70f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.update();
71b370df27c76fd875f3312be487868528121a4838Enrico Granata
72b370df27c76fd875f3312be487868528121a4838Enrico Granata	def update(self):
730d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
74b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.adjust_for_architecture();
75b370df27c76fd875f3312be487868528121a4838Enrico Granata
76b370df27c76fd875f3312be487868528121a4838Enrico Granata	def count(self):
770d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
78b370df27c76fd875f3312be487868528121a4838Enrico Granata		stream = lldb.SBStream()
79b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj.GetExpressionPath(stream)
80b370df27c76fd875f3312be487868528121a4838Enrico Granata		expr = "(int)[" + stream.GetData() + " count]"
81579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		num_children_vo = self.valobj.CreateValueFromExpression("count",expr)
82579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if num_children_vo.IsValid():
83579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return num_children_vo.GetValueAsUnsigned(0)
84579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return '<variable is not NSSet>'
85b370df27c76fd875f3312be487868528121a4838Enrico Granata
86b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSSetI_SummaryProvider:
87b370df27c76fd875f3312be487868528121a4838Enrico Granata	def adjust_for_architecture(self):
88f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
89b370df27c76fd875f3312be487868528121a4838Enrico Granata
90f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
910d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
92b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj = valobj;
93f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
94f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not(self.sys_params.types_cache.NSUInteger):
95f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			if self.sys_params.is_64_bit:
96f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata				self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong)
97f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			else:
98f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata				self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedInt)
99b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.update();
100b370df27c76fd875f3312be487868528121a4838Enrico Granata
101b370df27c76fd875f3312be487868528121a4838Enrico Granata	def update(self):
1020d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
103b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.adjust_for_architecture();
104b370df27c76fd875f3312be487868528121a4838Enrico Granata
105b370df27c76fd875f3312be487868528121a4838Enrico Granata	# we just need to skip the ISA and the count immediately follows
106b370df27c76fd875f3312be487868528121a4838Enrico Granata	def offset(self):
1070d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
108f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return self.sys_params.pointer_size
109b370df27c76fd875f3312be487868528121a4838Enrico Granata
110b370df27c76fd875f3312be487868528121a4838Enrico Granata	def count(self):
1110d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
112b370df27c76fd875f3312be487868528121a4838Enrico Granata		num_children_vo = self.valobj.CreateChildAtOffset("count",
113b370df27c76fd875f3312be487868528121a4838Enrico Granata							self.offset(),
114f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.NSUInteger)
115b370df27c76fd875f3312be487868528121a4838Enrico Granata		value = num_children_vo.GetValueAsUnsigned(0)
116b370df27c76fd875f3312be487868528121a4838Enrico Granata		if value != None:
117b370df27c76fd875f3312be487868528121a4838Enrico Granata			# the MSB on immutable sets seems to be taken by some other data
118b370df27c76fd875f3312be487868528121a4838Enrico Granata			# not sure if it is a bug or some weird sort of feature, but masking it out
119b370df27c76fd875f3312be487868528121a4838Enrico Granata			# gets the count right (unless, of course, someone's dictionaries grow
120b370df27c76fd875f3312be487868528121a4838Enrico Granata			#                       too large - but I have not tested this)
121f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			if self.sys_params.is_64_bit:
122b370df27c76fd875f3312be487868528121a4838Enrico Granata				value = value & ~0xFF00000000000000
123b370df27c76fd875f3312be487868528121a4838Enrico Granata			else:
124b370df27c76fd875f3312be487868528121a4838Enrico Granata				value = value & ~0xFF000000
125b370df27c76fd875f3312be487868528121a4838Enrico Granata		return value
126b370df27c76fd875f3312be487868528121a4838Enrico Granata
127b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSSetM_SummaryProvider:
128b370df27c76fd875f3312be487868528121a4838Enrico Granata	def adjust_for_architecture(self):
129f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
130b370df27c76fd875f3312be487868528121a4838Enrico Granata
131f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
1320d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
133b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj = valobj;
134f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
135f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not(self.sys_params.types_cache.NSUInteger):
136f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			if self.sys_params.is_64_bit:
137f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata				self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong)
138f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			else:
139f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata				self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedInt)
140b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.update();
141b370df27c76fd875f3312be487868528121a4838Enrico Granata
142b370df27c76fd875f3312be487868528121a4838Enrico Granata	def update(self):
1430d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
144b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.adjust_for_architecture();
145b370df27c76fd875f3312be487868528121a4838Enrico Granata
146b370df27c76fd875f3312be487868528121a4838Enrico Granata	# we just need to skip the ISA and the count immediately follows
147b370df27c76fd875f3312be487868528121a4838Enrico Granata	def offset(self):
1480d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
149f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return self.sys_params.pointer_size
150b370df27c76fd875f3312be487868528121a4838Enrico Granata
151b370df27c76fd875f3312be487868528121a4838Enrico Granata	def count(self):
1520d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
153b370df27c76fd875f3312be487868528121a4838Enrico Granata		num_children_vo = self.valobj.CreateChildAtOffset("count",
154b370df27c76fd875f3312be487868528121a4838Enrico Granata							self.offset(),
155f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.NSUInteger)
156b370df27c76fd875f3312be487868528121a4838Enrico Granata		return num_children_vo.GetValueAsUnsigned(0)
157b370df27c76fd875f3312be487868528121a4838Enrico Granata
158b370df27c76fd875f3312be487868528121a4838Enrico Granata
15983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granataclass NSCountedSet_SummaryProvider:
16083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	def adjust_for_architecture(self):
161f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
16283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
163f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
1640d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
16583410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		self.valobj = valobj;
166f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
167f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not (self.sys_params.types_cache.voidptr):
168f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			self.sys_params.types_cache.voidptr = self.valobj.GetType().GetBasicType(lldb.eBasicTypeVoid).GetPointerType()
16983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		self.update();
17083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
17183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	def update(self):
1720d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
17383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		self.adjust_for_architecture();
17483410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
17583410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	# an NSCountedSet is implemented using a CFBag whose pointer just follows the ISA
17683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	def offset(self):
1770d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
178f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return self.sys_params.pointer_size
17983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
18083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	def count(self):
1810d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
18283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		cfbag_vo = self.valobj.CreateChildAtOffset("bag_impl",
18383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata							self.offset(),
184f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.voidptr)
185f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return CFBag.CFBagRef_SummaryProvider(cfbag_vo,self.sys_params).length()
18683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
18783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata
188b370df27c76fd875f3312be487868528121a4838Enrico Granatadef GetSummary_Impl(valobj):
1890d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
190b370df27c76fd875f3312be487868528121a4838Enrico Granata	global statistics
191a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata	class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
192579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	if wrapper:
193579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return wrapper
194b370df27c76fd875f3312be487868528121a4838Enrico Granata
195b370df27c76fd875f3312be487868528121a4838Enrico Granata	name_string = class_data.class_name()
1968f18240a09893310c43673901d863892ae7b0611Enrico Granata	logger >> "class name is: " + str(name_string)
1978f18240a09893310c43673901d863892ae7b0611Enrico Granata
198b370df27c76fd875f3312be487868528121a4838Enrico Granata	if name_string == '__NSCFSet':
199f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		wrapper = NSCFSet_SummaryProvider(valobj, class_data.sys_params)
200b370df27c76fd875f3312be487868528121a4838Enrico Granata		statistics.metric_hit('code_notrun',valobj)
201b370df27c76fd875f3312be487868528121a4838Enrico Granata	elif name_string == '__NSSetI':
202f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		wrapper = NSSetI_SummaryProvider(valobj, class_data.sys_params)
203b370df27c76fd875f3312be487868528121a4838Enrico Granata		statistics.metric_hit('code_notrun',valobj)
204b370df27c76fd875f3312be487868528121a4838Enrico Granata	elif name_string == '__NSSetM':
205f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		wrapper = NSSetM_SummaryProvider(valobj, class_data.sys_params)
206b370df27c76fd875f3312be487868528121a4838Enrico Granata		statistics.metric_hit('code_notrun',valobj)
20783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata	elif name_string == 'NSCountedSet':
208f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		wrapper = NSCountedSet_SummaryProvider(valobj, class_data.sys_params)
20983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata		statistics.metric_hit('code_notrun',valobj)
210b370df27c76fd875f3312be487868528121a4838Enrico Granata	else:
211a58d9e75d6c3a2d02be931f1d549e68c91d10da6Enrico Granata		wrapper = NSSetUnknown_SummaryProvider(valobj, class_data.sys_params)
212805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata		statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
213b370df27c76fd875f3312be487868528121a4838Enrico Granata	return wrapper;
214b370df27c76fd875f3312be487868528121a4838Enrico Granata
215b370df27c76fd875f3312be487868528121a4838Enrico Granata
216b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSSet_SummaryProvider (valobj,dict):
2170d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
218b370df27c76fd875f3312be487868528121a4838Enrico Granata	provider = GetSummary_Impl(valobj);
219b370df27c76fd875f3312be487868528121a4838Enrico Granata	if provider != None:
220579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		try:
221579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = provider.count();
222579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		except:
223579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = None
224579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if summary == None:
225579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = '<variable is not NSSet>'
226579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if isinstance(summary, basestring):
227579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return summary
228579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		else:
229579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = str(summary) + (' objects' if summary != 1 else ' object')
230579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return summary
231579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	return 'Summary Unavailable'
232b370df27c76fd875f3312be487868528121a4838Enrico Granata
233b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSSet_SummaryProvider2 (valobj,dict):
2340d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
235b370df27c76fd875f3312be487868528121a4838Enrico Granata	provider = GetSummary_Impl(valobj);
236b370df27c76fd875f3312be487868528121a4838Enrico Granata	if provider != None:
237a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata		if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
238579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return provider.message()
239b370df27c76fd875f3312be487868528121a4838Enrico Granata		try:
240b370df27c76fd875f3312be487868528121a4838Enrico Granata			summary = provider.count();
241b370df27c76fd875f3312be487868528121a4838Enrico Granata		except:
242b370df27c76fd875f3312be487868528121a4838Enrico Granata			summary = None
2438f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger >> "got summary " + str(summary)
244b370df27c76fd875f3312be487868528121a4838Enrico Granata		# for some reason, one needs to clear some bits for the count returned
245b370df27c76fd875f3312be487868528121a4838Enrico Granata		# to be correct when using directly CF*SetRef as compared to NS*Set
246b370df27c76fd875f3312be487868528121a4838Enrico Granata		# this only happens on 64bit, and the bit mask was derived through
247b370df27c76fd875f3312be487868528121a4838Enrico Granata		# experimentation (if counts start looking weird, then most probably
248b370df27c76fd875f3312be487868528121a4838Enrico Granata		#                  the mask needs to be changed)
249b370df27c76fd875f3312be487868528121a4838Enrico Granata		if summary == None:
250579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = '<variable is not CFSet>'
251579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if isinstance(summary, basestring):
252579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return summary
253b370df27c76fd875f3312be487868528121a4838Enrico Granata		else:
254f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			if provider.sys_params.is_64_bit:
255323cec97d94bd1836e8c158e7065fdb5ad71ad48Enrico Granata				summary = summary & ~0x1fff000000000000
256579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		 	summary = '@"' + str(summary) + (' values"' if summary != 1 else ' value"')
257323cec97d94bd1836e8c158e7065fdb5ad71ad48Enrico Granata		return summary
258579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	return 'Summary Unavailable'
259b370df27c76fd875f3312be487868528121a4838Enrico Granata
260b370df27c76fd875f3312be487868528121a4838Enrico Granata
261b370df27c76fd875f3312be487868528121a4838Enrico Granatadef __lldb_init_module(debugger,dict):
262b370df27c76fd875f3312be487868528121a4838Enrico Granata	debugger.HandleCommand("type summary add -F NSSet.NSSet_SummaryProvider NSSet")
263b370df27c76fd875f3312be487868528121a4838Enrico Granata	debugger.HandleCommand("type summary add -F NSSet.NSSet_SummaryProvider2 CFSetRef CFMutableSetRef")
264