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 NSException
90d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.runtime.objc.objc_runtime
100d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.metrics
11b370df27c76fd875f3312be487868528121a4838Enrico Granataimport CFString
12b370df27c76fd875f3312be487868528121a4838Enrico Granataimport lldb
130d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.Logger
14b370df27c76fd875f3312be487868528121a4838Enrico Granata
150d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granatastatistics = lldb.formatters.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 NSKnownException_SummaryProvider:
22b370df27c76fd875f3312be487868528121a4838Enrico Granata	def adjust_for_architecture(self):
23f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
24b370df27c76fd875f3312be487868528121a4838Enrico Granata
25f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
260d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
27b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj = valobj;
28f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico 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):
340d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
35b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.adjust_for_architecture();
36b370df27c76fd875f3312be487868528121a4838Enrico Granata
37f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def offset_name(self):
380d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
39f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return self.sys_params.pointer_size
40f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def offset_reason(self):
410d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
42f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		return 2*self.sys_params.pointer_size
43b370df27c76fd875f3312be487868528121a4838Enrico Granata
44b370df27c76fd875f3312be487868528121a4838Enrico Granata	def description(self):
450d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
46b370df27c76fd875f3312be487868528121a4838Enrico Granata		name_ptr = self.valobj.CreateChildAtOffset("name",
47f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.offset_name(),
48f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.id)
49b370df27c76fd875f3312be487868528121a4838Enrico Granata		reason_ptr = self.valobj.CreateChildAtOffset("reason",
50f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.offset_reason(),
51f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata							self.sys_params.types_cache.id)
527b9aacf4a454465af905e505f74245173714b23bEnrico Granata		return 'name:' + CFString.CFString_SummaryProvider(name_ptr,None) + ' reason:' + CFString.CFString_SummaryProvider(reason_ptr,None)
53b370df27c76fd875f3312be487868528121a4838Enrico Granata
54b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSUnknownException_SummaryProvider:
55b370df27c76fd875f3312be487868528121a4838Enrico Granata	def adjust_for_architecture(self):
56f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		pass
57b370df27c76fd875f3312be487868528121a4838Enrico Granata
58f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata	def __init__(self, valobj, params):
590d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
60b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj = valobj;
61f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.sys_params = params
62f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		self.update();
63b370df27c76fd875f3312be487868528121a4838Enrico Granata
64b370df27c76fd875f3312be487868528121a4838Enrico Granata	def update(self):
650d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
66b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.adjust_for_architecture();
67b370df27c76fd875f3312be487868528121a4838Enrico Granata
68b370df27c76fd875f3312be487868528121a4838Enrico Granata	def description(self):
690d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata		logger = lldb.formatters.Logger.Logger()
70b370df27c76fd875f3312be487868528121a4838Enrico Granata		stream = lldb.SBStream()
71b370df27c76fd875f3312be487868528121a4838Enrico Granata		self.valobj.GetExpressionPath(stream)
72b370df27c76fd875f3312be487868528121a4838Enrico Granata		name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]");
73b370df27c76fd875f3312be487868528121a4838Enrico Granata		reason_vo = self.valobj.CreateValueFromExpression("reason","(NSString*)[" + stream.GetData() + " reason]");
74579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if name_vo.IsValid() and reason_vo.IsValid():
75579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return CFString.CFString_SummaryProvider(name_vo,None) + ' ' + CFString.CFString_SummaryProvider(reason_vo,None)
76579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return '<variable is not NSException>'
77b370df27c76fd875f3312be487868528121a4838Enrico Granata
78b370df27c76fd875f3312be487868528121a4838Enrico Granata
79b370df27c76fd875f3312be487868528121a4838Enrico Granatadef GetSummary_Impl(valobj):
800d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
81b370df27c76fd875f3312be487868528121a4838Enrico Granata	global statistics
82a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata	class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
83579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	if wrapper:
84579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return wrapper
85b370df27c76fd875f3312be487868528121a4838Enrico Granata
86b370df27c76fd875f3312be487868528121a4838Enrico Granata	name_string = class_data.class_name()
878f18240a09893310c43673901d863892ae7b0611Enrico Granata	logger >> "class name is: " + str(name_string)
888f18240a09893310c43673901d863892ae7b0611Enrico Granata
89b370df27c76fd875f3312be487868528121a4838Enrico Granata	if name_string == 'NSException':
90f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		wrapper = NSKnownException_SummaryProvider(valobj, class_data.sys_params)
91b370df27c76fd875f3312be487868528121a4838Enrico Granata		statistics.metric_hit('code_notrun',valobj)
92b370df27c76fd875f3312be487868528121a4838Enrico Granata	else:
93f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata		wrapper = NSUnknownException_SummaryProvider(valobj, class_data.sys_params)
94805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata		statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
95b370df27c76fd875f3312be487868528121a4838Enrico Granata	return wrapper;
96b370df27c76fd875f3312be487868528121a4838Enrico Granata
97b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSException_SummaryProvider (valobj,dict):
980d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata	logger = lldb.formatters.Logger.Logger()
99b370df27c76fd875f3312be487868528121a4838Enrico Granata	provider = GetSummary_Impl(valobj);
100b370df27c76fd875f3312be487868528121a4838Enrico Granata	if provider != None:
101a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata		if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
102579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			return provider.message()
103579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		try:
104579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = provider.description();
105579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		except:
106579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = None
1078f18240a09893310c43673901d863892ae7b0611Enrico Granata		logger >> "got summary " + str(summary)
108579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		if summary == None:
109579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata			summary = '<variable is not NSException>'
110579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata		return str(summary)
111579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata	return 'Summary Unavailable'
112b370df27c76fd875f3312be487868528121a4838Enrico Granata
113b370df27c76fd875f3312be487868528121a4838Enrico Granatadef __lldb_init_module(debugger,dict):
114b370df27c76fd875f3312be487868528121a4838Enrico Granata	debugger.HandleCommand("type summary add -F NSException.NSException_SummaryProvider NSException")
115