blob: 826871d70c21ce76b15c27edf3c9b2a76149c4a5 [file] [log] [blame]
Enrico Granata3f1052b2012-03-13 21:52:00 +00001"""
2LLDB AppKit formatters
3
4part of The LLVM Compiler Infrastructure
5This file is distributed under the University of Illinois Open Source
6License. See LICENSE.TXT for details.
7"""
Enrico Granataeb4a4792012-02-23 23:10:27 +00008# summary provider for class NSException
Enrico Granata28399ad2012-04-25 01:39:27 +00009import lldb.runtime.objc.objc_runtime
10import lldb.formatters.metrics
Enrico Granataeb4a4792012-02-23 23:10:27 +000011import CFString
12import lldb
Enrico Granata28399ad2012-04-25 01:39:27 +000013import lldb.formatters.Logger
Enrico Granataeb4a4792012-02-23 23:10:27 +000014
Enrico Granata28399ad2012-04-25 01:39:27 +000015statistics = lldb.formatters.metrics.Metrics()
Enrico Granataeb4a4792012-02-23 23:10:27 +000016statistics.add_metric('invalid_isa')
17statistics.add_metric('invalid_pointer')
18statistics.add_metric('unknown_class')
19statistics.add_metric('code_notrun')
20
Kate Stoneb9c1b512016-09-06 20:57:50 +000021
Enrico Granataeb4a4792012-02-23 23:10:27 +000022class NSKnownException_SummaryProvider:
Enrico Granataeb4a4792012-02-23 23:10:27 +000023
Kate Stoneb9c1b512016-09-06 20:57:50 +000024 def adjust_for_architecture(self):
25 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000026
Kate Stoneb9c1b512016-09-06 20:57:50 +000027 def __init__(self, valobj, params):
28 logger = lldb.formatters.Logger.Logger()
29 self.valobj = valobj
30 self.sys_params = params
31 if not (self.sys_params.types_cache.id):
32 self.sys_params.types_cache.id = self.valobj.GetType(
33 ).GetBasicType(lldb.eBasicTypeObjCID)
34 self.update()
Enrico Granataeb4a4792012-02-23 23:10:27 +000035
Kate Stoneb9c1b512016-09-06 20:57:50 +000036 def update(self):
37 logger = lldb.formatters.Logger.Logger()
38 self.adjust_for_architecture()
Enrico Granataeb4a4792012-02-23 23:10:27 +000039
Kate Stoneb9c1b512016-09-06 20:57:50 +000040 def offset_name(self):
41 logger = lldb.formatters.Logger.Logger()
42 return self.sys_params.pointer_size
43
44 def offset_reason(self):
45 logger = lldb.formatters.Logger.Logger()
46 return 2 * self.sys_params.pointer_size
47
48 def description(self):
49 logger = lldb.formatters.Logger.Logger()
50 name_ptr = self.valobj.CreateChildAtOffset(
51 "name", self.offset_name(), self.sys_params.types_cache.id)
52 reason_ptr = self.valobj.CreateChildAtOffset(
53 "reason", self.offset_reason(), self.sys_params.types_cache.id)
54 return 'name:' + CFString.CFString_SummaryProvider(
55 name_ptr, None) + ' reason:' + CFString.CFString_SummaryProvider(reason_ptr, None)
56
Enrico Granataeb4a4792012-02-23 23:10:27 +000057
Enrico Granataeb4a4792012-02-23 23:10:27 +000058class NSUnknownException_SummaryProvider:
Enrico Granataeb4a4792012-02-23 23:10:27 +000059
Kate Stoneb9c1b512016-09-06 20:57:50 +000060 def adjust_for_architecture(self):
61 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000062
Kate Stoneb9c1b512016-09-06 20:57:50 +000063 def __init__(self, valobj, params):
64 logger = lldb.formatters.Logger.Logger()
65 self.valobj = valobj
66 self.sys_params = params
67 self.update()
Enrico Granataeb4a4792012-02-23 23:10:27 +000068
Kate Stoneb9c1b512016-09-06 20:57:50 +000069 def update(self):
70 logger = lldb.formatters.Logger.Logger()
71 self.adjust_for_architecture()
72
73 def description(self):
74 logger = lldb.formatters.Logger.Logger()
75 stream = lldb.SBStream()
76 self.valobj.GetExpressionPath(stream)
77 name_vo = self.valobj.CreateValueFromExpression(
78 "name", "(NSString*)[" + stream.GetData() + " name]")
79 reason_vo = self.valobj.CreateValueFromExpression(
80 "reason", "(NSString*)[" + stream.GetData() + " reason]")
81 if name_vo.IsValid() and reason_vo.IsValid():
82 return CFString.CFString_SummaryProvider(
83 name_vo, None) + ' ' + CFString.CFString_SummaryProvider(reason_vo, None)
84 return '<variable is not NSException>'
Enrico Granataeb4a4792012-02-23 23:10:27 +000085
86
87def GetSummary_Impl(valobj):
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 logger = lldb.formatters.Logger.Logger()
89 global statistics
90 class_data, wrapper = lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(
91 valobj, statistics)
92 if wrapper:
93 return wrapper
Enrico Granata247bd412012-04-02 16:39:29 +000094
Kate Stoneb9c1b512016-09-06 20:57:50 +000095 name_string = class_data.class_name()
96 logger >> "class name is: " + str(name_string)
Enrico Granataeb4a4792012-02-23 23:10:27 +000097
Kate Stoneb9c1b512016-09-06 20:57:50 +000098 if name_string == 'NSException':
99 wrapper = NSKnownException_SummaryProvider(
100 valobj, class_data.sys_params)
101 statistics.metric_hit('code_notrun', valobj)
102 else:
103 wrapper = NSUnknownException_SummaryProvider(
104 valobj, class_data.sys_params)
105 statistics.metric_hit(
106 'unknown_class',
107 valobj.GetName() +
108 " seen as " +
109 name_string)
110 return wrapper
Enrico Granataeb4a4792012-02-23 23:10:27 +0000111
Kate Stoneb9c1b512016-09-06 20:57:50 +0000112
113def NSException_SummaryProvider(valobj, dict):
114 logger = lldb.formatters.Logger.Logger()
115 provider = GetSummary_Impl(valobj)
116 if provider is not None:
117 if isinstance(
118 provider,
119 lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
120 return provider.message()
121 try:
122 summary = provider.description()
123 except:
124 summary = None
125 logger >> "got summary " + str(summary)
126 if summary is None:
127 summary = '<variable is not NSException>'
128 return str(summary)
129 return 'Summary Unavailable'
130
131
132def __lldb_init_module(debugger, dict):
133 debugger.HandleCommand(
134 "type summary add -F NSException.NSException_SummaryProvider NSException")