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"""
8dc1df6b2fd7d359753b2bcfcf2decb114f465a1dEnrico Granata# example summary provider for NSNotification
9dc1df6b2fd7d359753b2bcfcf2decb114f465a1dEnrico Granata# the real summary is now C++ code built into LLDB
100d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.runtime.objc.objc_runtime
110d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.metrics
12b370df27c76fd875f3312be487868528121a4838Enrico Granataimport CFString
13b370df27c76fd875f3312be487868528121a4838Enrico Granataimport lldb
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 Granataclass NSConcreteNotification_SummaryProvider:
23b370df27c76fd875f3312be487868528121a4838Enrico Granata	def adjust_for_architecture(self):
24f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
25b370df27c76fd875f3312be487868528121a4838Enrico Granata
26f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
270d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
28b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj = valobj;
29092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata		self.sys_params = params
30f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not (self.sys_params.types_cache.id):
31f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			self.sys_params.types_cache.id = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
32b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.update();
33b370df27c76fd875f3312be487868528121a4838Enrico Granata
34b370df27c76fd875f3312be487868528121a4838Enrico Granata	def update(self):
350d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
36b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.adjust_for_architecture();
37b370df27c76fd875f3312be487868528121a4838Enrico Granata
38b370df27c76fd875f3312be487868528121a4838Enrico Granata	# skip the ISA and go to the name pointer
39b370df27c76fd875f3312be487868528121a4838Enrico Granata	def offset(self):
400d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
41f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return self.sys_params.pointer_size
42092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata
43b370df27c76fd875f3312be487868528121a4838Enrico Granata	def name(self):
440d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
45b370df27c76fd875f3312be487868528121a4838Enrico Granata		string_ptr = self.valobj.CreateChildAtOffset("name",
46b370df27c76fd875f3312be487868528121a4838Enrico Granata							self.offset(),
47f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.id)
48b370df27c76fd875f3312be487868528121a4838Enrico Granata		return CFString.CFString_SummaryProvider(string_ptr,None)
49b370df27c76fd875f3312be487868528121a4838Enrico Granata
50b370df27c76fd875f3312be487868528121a4838Enrico Granata
51b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSNotificationUnknown_SummaryProvider:
52b370df27c76fd875f3312be487868528121a4838Enrico Granata	def adjust_for_architecture(self):
53f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
54b370df27c76fd875f3312be487868528121a4838Enrico Granata
55f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
560d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
57b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj = valobj;
58f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
59b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.update()
60b370df27c76fd875f3312be487868528121a4838Enrico Granata
61b370df27c76fd875f3312be487868528121a4838Enrico Granata	def update(self):
620d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
63b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.adjust_for_architecture();
64b370df27c76fd875f3312be487868528121a4838Enrico Granata
65b370df27c76fd875f3312be487868528121a4838Enrico Granata	def name(self):
660d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
67b370df27c76fd875f3312be487868528121a4838Enrico Granata		stream = lldb.SBStream()
68b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj.GetExpressionPath(stream)
69579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]")
70579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if name_vo.IsValid():
71579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return CFString.CFString_SummaryProvider(name_vo,None)
72579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return '<variable is not NSNotification>'
73b370df27c76fd875f3312be487868528121a4838Enrico Granata
74b370df27c76fd875f3312be487868528121a4838Enrico Granata
75b370df27c76fd875f3312be487868528121a4838Enrico Granatadef GetSummary_Impl(valobj):
760d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
77b370df27c76fd875f3312be487868528121a4838Enrico Granata	global statistics
78a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata	class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
79579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	if wrapper:
80579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return wrapper
81b370df27c76fd875f3312be487868528121a4838Enrico Granata
82b370df27c76fd875f3312be487868528121a4838Enrico Granata	name_string = class_data.class_name()
838f18240a09893310c43673901d863892ae7b0611Enrico Granata	logger >> "class name is: " + str(name_string)
848f18240a09893310c43673901d863892ae7b0611Enrico Granata
85b370df27c76fd875f3312be487868528121a4838Enrico Granata	if name_string == 'NSConcreteNotification':
86092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata		wrapper = NSConcreteNotification_SummaryProvider(valobj, class_data.sys_params)
87b370df27c76fd875f3312be487868528121a4838Enrico Granata		statistics.metric_hit('code_notrun',valobj)
88b370df27c76fd875f3312be487868528121a4838Enrico Granata	else:
89092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata		wrapper = NSNotificationUnknown_SummaryProvider(valobj, class_data.sys_params)
90805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata		statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
91b370df27c76fd875f3312be487868528121a4838Enrico Granata	return wrapper;
92b370df27c76fd875f3312be487868528121a4838Enrico Granata
93b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSNotification_SummaryProvider (valobj,dict):
940d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
95b370df27c76fd875f3312be487868528121a4838Enrico Granata	provider = GetSummary_Impl(valobj);
96b370df27c76fd875f3312be487868528121a4838Enrico Granata	if provider != None:
97a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata		if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
98579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return provider.message()
99579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		try:
100579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = provider.name();
101579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		except:
102579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = None
1038f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger >> "got summary " + str(summary)
104579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if summary == None:
105579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = '<variable is not NSNotification>'
106579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return str(summary)
107579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	return 'Summary Unavailable'
108b370df27c76fd875f3312be487868528121a4838Enrico Granata
109b370df27c76fd875f3312be487868528121a4838Enrico Granatadef __lldb_init_module(debugger,dict):
110b370df27c76fd875f3312be487868528121a4838Enrico Granata	debugger.HandleCommand("type summary add -F NSNotification.NSNotification_SummaryProvider NSNotification")
111