NSNotification.py revision 8f18240a09893310c43673901d863892ae7b0611
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 class NSNotification
9b370df27c76fd875f3312be487868528121a4838Enrico Granataimport objc_runtime
10b370df27c76fd875f3312be487868528121a4838Enrico Granataimport metrics
11b370df27c76fd875f3312be487868528121a4838Enrico Granataimport CFString
12b370df27c76fd875f3312be487868528121a4838Enrico Granataimport lldb
138f18240a09893310c43673901d863892ae7b0611Enrico Granataimport Logger
14b370df27c76fd875f3312be487868528121a4838Enrico Granata
15b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics = metrics.Metrics()
16b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_isa')
17b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_pointer')
18b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('unknown_class')
19b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('code_notrun')
20b370df27c76fd875f3312be487868528121a4838Enrico Granata
21b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSConcreteNotification_SummaryProvider:
22b370df27c76fd875f3312be487868528121a4838Enrico Granata	def adjust_for_architecture(self):
23f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
24b370df27c76fd875f3312be487868528121a4838Enrico Granata
25f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
268f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger = Logger.Logger()
27b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj = valobj;
28092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata		self.sys_params = params
29f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		if not (self.sys_params.types_cache.id):
30f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata			self.sys_params.types_cache.id = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
31b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.update();
32b370df27c76fd875f3312be487868528121a4838Enrico Granata
33b370df27c76fd875f3312be487868528121a4838Enrico Granata	def update(self):
348f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger = Logger.Logger()
35b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.adjust_for_architecture();
36b370df27c76fd875f3312be487868528121a4838Enrico Granata
37b370df27c76fd875f3312be487868528121a4838Enrico Granata	# skip the ISA and go to the name pointer
38b370df27c76fd875f3312be487868528121a4838Enrico Granata	def offset(self):
398f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger = Logger.Logger()
40f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return self.sys_params.pointer_size
41092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata
42b370df27c76fd875f3312be487868528121a4838Enrico Granata	def name(self):
438f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger = Logger.Logger()
44b370df27c76fd875f3312be487868528121a4838Enrico Granata		string_ptr = self.valobj.CreateChildAtOffset("name",
45b370df27c76fd875f3312be487868528121a4838Enrico Granata							self.offset(),
46f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.id)
47b370df27c76fd875f3312be487868528121a4838Enrico Granata		return CFString.CFString_SummaryProvider(string_ptr,None)
48b370df27c76fd875f3312be487868528121a4838Enrico Granata
49b370df27c76fd875f3312be487868528121a4838Enrico Granata
50b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSNotificationUnknown_SummaryProvider:
51b370df27c76fd875f3312be487868528121a4838Enrico Granata	def adjust_for_architecture(self):
52f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
53b370df27c76fd875f3312be487868528121a4838Enrico Granata
54f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
558f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger = Logger.Logger()
56b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj = valobj;
57f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
58b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.update()
59b370df27c76fd875f3312be487868528121a4838Enrico Granata
60b370df27c76fd875f3312be487868528121a4838Enrico Granata	def update(self):
618f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger = Logger.Logger()
62b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.adjust_for_architecture();
63b370df27c76fd875f3312be487868528121a4838Enrico Granata
64b370df27c76fd875f3312be487868528121a4838Enrico Granata	def name(self):
658f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger = Logger.Logger()
66b370df27c76fd875f3312be487868528121a4838Enrico Granata		stream = lldb.SBStream()
67b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj.GetExpressionPath(stream)
68579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]")
69579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if name_vo.IsValid():
70579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return CFString.CFString_SummaryProvider(name_vo,None)
71579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return '<variable is not NSNotification>'
72b370df27c76fd875f3312be487868528121a4838Enrico Granata
73b370df27c76fd875f3312be487868528121a4838Enrico Granata
74b370df27c76fd875f3312be487868528121a4838Enrico Granatadef GetSummary_Impl(valobj):
758f18240a09893310c43673901d863892ae7b0611Enrico Granata	logger = Logger.Logger()
76b370df27c76fd875f3312be487868528121a4838Enrico Granata	global statistics
77579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
78579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	if wrapper:
79579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return wrapper
80b370df27c76fd875f3312be487868528121a4838Enrico Granata
81b370df27c76fd875f3312be487868528121a4838Enrico Granata	name_string = class_data.class_name()
828f18240a09893310c43673901d863892ae7b0611Enrico Granata	logger >> "class name is: " + str(name_string)
838f18240a09893310c43673901d863892ae7b0611Enrico Granata
84b370df27c76fd875f3312be487868528121a4838Enrico Granata	if name_string == 'NSConcreteNotification':
85092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata		wrapper = NSConcreteNotification_SummaryProvider(valobj, class_data.sys_params)
86b370df27c76fd875f3312be487868528121a4838Enrico Granata		statistics.metric_hit('code_notrun',valobj)
87b370df27c76fd875f3312be487868528121a4838Enrico Granata	else:
88092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata		wrapper = NSNotificationUnknown_SummaryProvider(valobj, class_data.sys_params)
89805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata		statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
90b370df27c76fd875f3312be487868528121a4838Enrico Granata	return wrapper;
91b370df27c76fd875f3312be487868528121a4838Enrico Granata
92b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSNotification_SummaryProvider (valobj,dict):
938f18240a09893310c43673901d863892ae7b0611Enrico Granata	logger = Logger.Logger()
94b370df27c76fd875f3312be487868528121a4838Enrico Granata	provider = GetSummary_Impl(valobj);
95b370df27c76fd875f3312be487868528121a4838Enrico Granata	if provider != None:
96579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if isinstance(provider,objc_runtime.SpecialSituation_Description):
97579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return provider.message()
98579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		try:
99579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = provider.name();
100579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		except:
101579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = None
1028f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger >> "got summary " + str(summary)
103579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if summary == None:
104579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = '<variable is not NSNotification>'
105579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return str(summary)
106579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	return 'Summary Unavailable'
107b370df27c76fd875f3312be487868528121a4838Enrico Granata
108b370df27c76fd875f3312be487868528121a4838Enrico Granatadef __lldb_init_module(debugger,dict):
109b370df27c76fd875f3312be487868528121a4838Enrico Granata	debugger.HandleCommand("type summary add -F NSNotification.NSNotification_SummaryProvider NSNotification")
110