blob: 76bd698ac8109b4456234349dce01c4c29f64c84 [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 NSNotification
9import objc_runtime
10import metrics
11import CFString
12import lldb
13
14statistics = metrics.Metrics()
15statistics.add_metric('invalid_isa')
16statistics.add_metric('invalid_pointer')
17statistics.add_metric('unknown_class')
18statistics.add_metric('code_notrun')
19
20class NSConcreteNotification_SummaryProvider:
21 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000022 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000023
Enrico Granatacfdafa32012-03-05 19:56:33 +000024 def __init__(self, valobj, params):
Enrico Granataeb4a4792012-02-23 23:10:27 +000025 self.valobj = valobj;
Enrico Granataeb55ad42012-03-09 00:45:19 +000026 self.sys_params = params
Enrico Granatacfdafa32012-03-05 19:56:33 +000027 if not (self.sys_params.types_cache.id):
28 self.sys_params.types_cache.id = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
Enrico Granataeb4a4792012-02-23 23:10:27 +000029 self.update();
30
31 def update(self):
32 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000033
34 # skip the ISA and go to the name pointer
35 def offset(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000036 return self.sys_params.pointer_size
Enrico Granataeb55ad42012-03-09 00:45:19 +000037
Enrico Granataeb4a4792012-02-23 23:10:27 +000038 def name(self):
39 string_ptr = self.valobj.CreateChildAtOffset("name",
40 self.offset(),
Enrico Granatacfdafa32012-03-05 19:56:33 +000041 self.sys_params.types_cache.id)
Enrico Granataeb4a4792012-02-23 23:10:27 +000042 return CFString.CFString_SummaryProvider(string_ptr,None)
43
44
45class NSNotificationUnknown_SummaryProvider:
46 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000047 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000048
Enrico Granatacfdafa32012-03-05 19:56:33 +000049 def __init__(self, valobj, params):
Enrico Granataeb4a4792012-02-23 23:10:27 +000050 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000051 self.sys_params = params
Enrico Granataeb4a4792012-02-23 23:10:27 +000052 self.update()
53
54 def update(self):
55 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000056
57 def name(self):
58 stream = lldb.SBStream()
59 self.valobj.GetExpressionPath(stream)
Enrico Granata3f1052b2012-03-13 21:52:00 +000060 name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]")
61 if name_vo.IsValid():
62 return CFString.CFString_SummaryProvider(name_vo,None)
63 return '<variable is not NSNotification>'
Enrico Granataeb4a4792012-02-23 23:10:27 +000064
65
66def GetSummary_Impl(valobj):
67 global statistics
Enrico Granata3f1052b2012-03-13 21:52:00 +000068 class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
69 if wrapper:
70 return wrapper
Enrico Granataeb4a4792012-02-23 23:10:27 +000071
72 name_string = class_data.class_name()
73 if name_string == 'NSConcreteNotification':
Enrico Granataeb55ad42012-03-09 00:45:19 +000074 wrapper = NSConcreteNotification_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +000075 statistics.metric_hit('code_notrun',valobj)
76 else:
Enrico Granataeb55ad42012-03-09 00:45:19 +000077 wrapper = NSNotificationUnknown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +000078 statistics.metric_hit('unknown_class',str(valobj) + " seen as " + name_string)
79 return wrapper;
80
81def NSNotification_SummaryProvider (valobj,dict):
82 provider = GetSummary_Impl(valobj);
83 if provider != None:
Enrico Granata3f1052b2012-03-13 21:52:00 +000084 if isinstance(provider,objc_runtime.SpecialSituation_Description):
85 return provider.message()
86 try:
87 summary = provider.name();
88 except:
89 summary = None
90 if summary == None:
91 summary = '<variable is not NSNotification>'
92 return str(summary)
93 return 'Summary Unavailable'
Enrico Granataeb4a4792012-02-23 23:10:27 +000094
95def __lldb_init_module(debugger,dict):
96 debugger.HandleCommand("type summary add -F NSNotification.NSNotification_SummaryProvider NSNotification")