]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - examples/summaries/cocoa/NSException.py
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / examples / summaries / cocoa / NSException.py
1 """
2 LLDB AppKit formatters
3
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.
7 """
8 # summary provider for class NSException
9 import lldb.runtime.objc.objc_runtime
10 import lldb.formatters.metrics
11 import CFString
12 import lldb
13 import lldb.formatters.Logger
14
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')
20
21
22 class NSKnownException_SummaryProvider:
23
24     def adjust_for_architecture(self):
25         pass
26
27     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()
35
36     def update(self):
37         logger = lldb.formatters.Logger.Logger()
38         self.adjust_for_architecture()
39
40     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
57
58 class NSUnknownException_SummaryProvider:
59
60     def adjust_for_architecture(self):
61         pass
62
63     def __init__(self, valobj, params):
64         logger = lldb.formatters.Logger.Logger()
65         self.valobj = valobj
66         self.sys_params = params
67         self.update()
68
69     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>'
85
86
87 def GetSummary_Impl(valobj):
88     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
94
95     name_string = class_data.class_name()
96     logger >> "class name is: " + str(name_string)
97
98     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
111
112
113 def 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
132 def __lldb_init_module(debugger, dict):
133     debugger.HandleCommand(
134         "type summary add -F NSException.NSException_SummaryProvider NSException")