4 part of The LLVM Compiler Infrastructure
5 This file is distributed under the University of Illinois Open Source
6 License. See LICENSE.TXT for details.
8 # summary provider for class NSException
9 import lldb.runtime.objc.objc_runtime
10 import lldb.formatters.metrics
13 import lldb.formatters.Logger
15 statistics = lldb.formatters.metrics.Metrics()
16 statistics.add_metric('invalid_isa')
17 statistics.add_metric('invalid_pointer')
18 statistics.add_metric('unknown_class')
19 statistics.add_metric('code_notrun')
22 class NSKnownException_SummaryProvider:
24 def adjust_for_architecture(self):
27 def __init__(self, valobj, params):
28 logger = lldb.formatters.Logger.Logger()
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)
37 logger = lldb.formatters.Logger.Logger()
38 self.adjust_for_architecture()
40 def offset_name(self):
41 logger = lldb.formatters.Logger.Logger()
42 return self.sys_params.pointer_size
44 def offset_reason(self):
45 logger = lldb.formatters.Logger.Logger()
46 return 2 * self.sys_params.pointer_size
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)
58 class NSUnknownException_SummaryProvider:
60 def adjust_for_architecture(self):
63 def __init__(self, valobj, params):
64 logger = lldb.formatters.Logger.Logger()
66 self.sys_params = params
70 logger = lldb.formatters.Logger.Logger()
71 self.adjust_for_architecture()
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>'
87 def GetSummary_Impl(valobj):
88 logger = lldb.formatters.Logger.Logger()
90 class_data, wrapper = lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(
95 name_string = class_data.class_name()
96 logger >> "class name is: " + str(name_string)
98 if name_string == 'NSException':
99 wrapper = NSKnownException_SummaryProvider(
100 valobj, class_data.sys_params)
101 statistics.metric_hit('code_notrun', valobj)
103 wrapper = NSUnknownException_SummaryProvider(
104 valobj, class_data.sys_params)
105 statistics.metric_hit(
113 def NSException_SummaryProvider(valobj, dict):
114 logger = lldb.formatters.Logger.Logger()
115 provider = GetSummary_Impl(valobj)
116 if provider is not None:
119 lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
120 return provider.message()
122 summary = provider.description()
125 logger >> "got summary " + str(summary)
127 summary = '<variable is not NSException>'
129 return 'Summary Unavailable'
132 def __lldb_init_module(debugger, dict):
133 debugger.HandleCommand(
134 "type summary add -F NSException.NSException_SummaryProvider NSException")