blob: 8d49caa93d361e5d8c1389f8c3462479ae3d15cc [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
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
21class NSConcreteNotification_SummaryProvider:
22 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000023 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000024
Enrico Granatacfdafa32012-03-05 19:56:33 +000025 def __init__(self, valobj, params):
Enrico Granata28399ad2012-04-25 01:39:27 +000026 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000027 self.valobj = valobj;
Enrico Granataeb55ad42012-03-09 00:45:19 +000028 self.sys_params = params
Enrico Granatacfdafa32012-03-05 19:56:33 +000029 if not (self.sys_params.types_cache.id):
30 self.sys_params.types_cache.id = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
Enrico Granataeb4a4792012-02-23 23:10:27 +000031 self.update();
32
33 def update(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000034 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000035 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000036
37 # skip the ISA and go to the name pointer
38 def offset(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000039 logger = lldb.formatters.Logger.Logger()
Enrico Granatacfdafa32012-03-05 19:56:33 +000040 return self.sys_params.pointer_size
Enrico Granataeb55ad42012-03-09 00:45:19 +000041
Enrico Granataeb4a4792012-02-23 23:10:27 +000042 def name(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000043 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000044 string_ptr = self.valobj.CreateChildAtOffset("name",
45 self.offset(),
Enrico Granatacfdafa32012-03-05 19:56:33 +000046 self.sys_params.types_cache.id)
Enrico Granataeb4a4792012-02-23 23:10:27 +000047 return CFString.CFString_SummaryProvider(string_ptr,None)
48
49
50class NSNotificationUnknown_SummaryProvider:
51 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000052 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000053
Enrico Granatacfdafa32012-03-05 19:56:33 +000054 def __init__(self, valobj, params):
Enrico Granata28399ad2012-04-25 01:39:27 +000055 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000056 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000057 self.sys_params = params
Enrico Granataeb4a4792012-02-23 23:10:27 +000058 self.update()
59
60 def update(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000061 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000062 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000063
64 def name(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000065 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000066 stream = lldb.SBStream()
67 self.valobj.GetExpressionPath(stream)
Enrico Granata3f1052b2012-03-13 21:52:00 +000068 name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]")
69 if name_vo.IsValid():
70 return CFString.CFString_SummaryProvider(name_vo,None)
71 return '<variable is not NSNotification>'
Enrico Granataeb4a4792012-02-23 23:10:27 +000072
73
74def GetSummary_Impl(valobj):
Enrico Granata28399ad2012-04-25 01:39:27 +000075 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000076 global statistics
Enrico Granata7d222212012-04-25 17:53:41 +000077 class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
Enrico Granata3f1052b2012-03-13 21:52:00 +000078 if wrapper:
79 return wrapper
Enrico Granataeb4a4792012-02-23 23:10:27 +000080
81 name_string = class_data.class_name()
Enrico Granata247bd412012-04-02 16:39:29 +000082 logger >> "class name is: " + str(name_string)
83
Enrico Granataeb4a4792012-02-23 23:10:27 +000084 if name_string == 'NSConcreteNotification':
Enrico Granataeb55ad42012-03-09 00:45:19 +000085 wrapper = NSConcreteNotification_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +000086 statistics.metric_hit('code_notrun',valobj)
87 else:
Enrico Granataeb55ad42012-03-09 00:45:19 +000088 wrapper = NSNotificationUnknown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataa7daeeb2012-03-30 00:51:12 +000089 statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
Enrico Granataeb4a4792012-02-23 23:10:27 +000090 return wrapper;
91
92def NSNotification_SummaryProvider (valobj,dict):
Enrico Granata28399ad2012-04-25 01:39:27 +000093 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000094 provider = GetSummary_Impl(valobj);
95 if provider != None:
Enrico Granata7d222212012-04-25 17:53:41 +000096 if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
Enrico Granata3f1052b2012-03-13 21:52:00 +000097 return provider.message()
98 try:
99 summary = provider.name();
100 except:
101 summary = None
Enrico Granata247bd412012-04-02 16:39:29 +0000102 logger >> "got summary " + str(summary)
Enrico Granata3f1052b2012-03-13 21:52:00 +0000103 if summary == None:
104 summary = '<variable is not NSNotification>'
105 return str(summary)
106 return 'Summary Unavailable'
Enrico Granataeb4a4792012-02-23 23:10:27 +0000107
108def __lldb_init_module(debugger,dict):
109 debugger.HandleCommand("type summary add -F NSNotification.NSNotification_SummaryProvider NSNotification")