NSNotification.py revision 092f71fca36e29031da906e26bda1a28d5595e8c
1b370df27c76fd875f3312be487868528121a4838Enrico Granata# summary provider for class NSNotification
2b370df27c76fd875f3312be487868528121a4838Enrico Granataimport objc_runtime
3b370df27c76fd875f3312be487868528121a4838Enrico Granataimport metrics
4b370df27c76fd875f3312be487868528121a4838Enrico Granataimport CFString
5b370df27c76fd875f3312be487868528121a4838Enrico Granataimport lldb
6b370df27c76fd875f3312be487868528121a4838Enrico Granata
7b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics = metrics.Metrics()
8b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_isa')
9b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_pointer')
10b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('unknown_class')
11b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('code_notrun')
12b370df27c76fd875f3312be487868528121a4838Enrico Granata
13b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSConcreteNotification_SummaryProvider:
14b370df27c76fd875f3312be487868528121a4838Enrico Granata	def adjust_for_architecture(self):
15f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
16b370df27c76fd875f3312be487868528121a4838Enrico Granata
17f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
18b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj = valobj;
19092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata		self.sys_params = params
20f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not (self.sys_params.types_cache.id):
21f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			self.sys_params.types_cache.id = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
22b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.update();
23b370df27c76fd875f3312be487868528121a4838Enrico Granata
24b370df27c76fd875f3312be487868528121a4838Enrico Granata	def update(self):
25b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.adjust_for_architecture();
26b370df27c76fd875f3312be487868528121a4838Enrico Granata
27b370df27c76fd875f3312be487868528121a4838Enrico Granata	# skip the ISA and go to the name pointer
28b370df27c76fd875f3312be487868528121a4838Enrico Granata	def offset(self):
29f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return self.sys_params.pointer_size
30092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata
31b370df27c76fd875f3312be487868528121a4838Enrico Granata	def name(self):
32b370df27c76fd875f3312be487868528121a4838Enrico Granata		string_ptr = self.valobj.CreateChildAtOffset("name",
33b370df27c76fd875f3312be487868528121a4838Enrico Granata							self.offset(),
34f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.id)
35b370df27c76fd875f3312be487868528121a4838Enrico Granata		return CFString.CFString_SummaryProvider(string_ptr,None)
36b370df27c76fd875f3312be487868528121a4838Enrico Granata
37b370df27c76fd875f3312be487868528121a4838Enrico Granata
38b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSNotificationUnknown_SummaryProvider:
39b370df27c76fd875f3312be487868528121a4838Enrico Granata	def adjust_for_architecture(self):
40f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
41b370df27c76fd875f3312be487868528121a4838Enrico Granata
42f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
43b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj = valobj;
44f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
45b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.update()
46b370df27c76fd875f3312be487868528121a4838Enrico Granata
47b370df27c76fd875f3312be487868528121a4838Enrico Granata	def update(self):
48b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.adjust_for_architecture();
49b370df27c76fd875f3312be487868528121a4838Enrico Granata
50b370df27c76fd875f3312be487868528121a4838Enrico Granata	def name(self):
51b370df27c76fd875f3312be487868528121a4838Enrico Granata		stream = lldb.SBStream()
52b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj.GetExpressionPath(stream)
53b370df27c76fd875f3312be487868528121a4838Enrico Granata		name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]");
54b370df27c76fd875f3312be487868528121a4838Enrico Granata		return CFString.CFString_SummaryProvider(name_vo,None)
55b370df27c76fd875f3312be487868528121a4838Enrico Granata
56b370df27c76fd875f3312be487868528121a4838Enrico Granata
57b370df27c76fd875f3312be487868528121a4838Enrico Granatadef GetSummary_Impl(valobj):
58b370df27c76fd875f3312be487868528121a4838Enrico Granata	global statistics
59b370df27c76fd875f3312be487868528121a4838Enrico Granata	class_data = objc_runtime.ObjCRuntime(valobj)
60b370df27c76fd875f3312be487868528121a4838Enrico Granata	if class_data.is_valid() == False:
61b370df27c76fd875f3312be487868528121a4838Enrico Granata		statistics.metric_hit('invalid_pointer',valobj)
62b370df27c76fd875f3312be487868528121a4838Enrico Granata		wrapper = None
63b370df27c76fd875f3312be487868528121a4838Enrico Granata		return
64b370df27c76fd875f3312be487868528121a4838Enrico Granata	class_data = class_data.read_class_data()
65b370df27c76fd875f3312be487868528121a4838Enrico Granata	if class_data.is_valid() == False:
66b370df27c76fd875f3312be487868528121a4838Enrico Granata		statistics.metric_hit('invalid_isa',valobj)
67b370df27c76fd875f3312be487868528121a4838Enrico Granata		wrapper = None
68b370df27c76fd875f3312be487868528121a4838Enrico Granata		return
69b370df27c76fd875f3312be487868528121a4838Enrico Granata	if class_data.is_kvo():
70b370df27c76fd875f3312be487868528121a4838Enrico Granata		class_data = class_data.get_superclass()
71b370df27c76fd875f3312be487868528121a4838Enrico Granata	if class_data.is_valid() == False:
72b370df27c76fd875f3312be487868528121a4838Enrico Granata		statistics.metric_hit('invalid_isa',valobj)
73b370df27c76fd875f3312be487868528121a4838Enrico Granata		wrapper = None
74b370df27c76fd875f3312be487868528121a4838Enrico Granata		return
75b370df27c76fd875f3312be487868528121a4838Enrico Granata
76b370df27c76fd875f3312be487868528121a4838Enrico Granata	name_string = class_data.class_name()
77b370df27c76fd875f3312be487868528121a4838Enrico Granata	if name_string == 'NSConcreteNotification':
78092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata		wrapper = NSConcreteNotification_SummaryProvider(valobj, class_data.sys_params)
79b370df27c76fd875f3312be487868528121a4838Enrico Granata		statistics.metric_hit('code_notrun',valobj)
80b370df27c76fd875f3312be487868528121a4838Enrico Granata	else:
81092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata		wrapper = NSNotificationUnknown_SummaryProvider(valobj, class_data.sys_params)
82b370df27c76fd875f3312be487868528121a4838Enrico Granata		statistics.metric_hit('unknown_class',str(valobj) + " seen as " + name_string)
83b370df27c76fd875f3312be487868528121a4838Enrico Granata	return wrapper;
84b370df27c76fd875f3312be487868528121a4838Enrico Granata
85b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSNotification_SummaryProvider (valobj,dict):
86b370df27c76fd875f3312be487868528121a4838Enrico Granata	provider = GetSummary_Impl(valobj);
87b370df27c76fd875f3312be487868528121a4838Enrico Granata	if provider != None:
88b370df27c76fd875f3312be487868528121a4838Enrico Granata	    try:
89b370df27c76fd875f3312be487868528121a4838Enrico Granata	        summary = provider.name();
90b370df27c76fd875f3312be487868528121a4838Enrico Granata	    except:
91b370df27c76fd875f3312be487868528121a4838Enrico Granata	        summary = None
92b370df27c76fd875f3312be487868528121a4838Enrico Granata	    if summary == None:
93b370df27c76fd875f3312be487868528121a4838Enrico Granata	        summary = 'no valid notification here'
94b370df27c76fd875f3312be487868528121a4838Enrico Granata	    return str(summary)
95b370df27c76fd875f3312be487868528121a4838Enrico Granata	return ''
96b370df27c76fd875f3312be487868528121a4838Enrico Granata
97b370df27c76fd875f3312be487868528121a4838Enrico Granatadef __lldb_init_module(debugger,dict):
98b370df27c76fd875f3312be487868528121a4838Enrico Granata	debugger.HandleCommand("type summary add -F NSNotification.NSNotification_SummaryProvider NSNotification")
99