blob: 33c20065346fd9349a3ed00f5e5cfdc46a1a2b1b [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 Granata50b5ee52013-03-16 00:50:25 +00008# example summary provider for NSNotification
9# the real summary is now C++ code built into LLDB
Enrico Granata28399ad2012-04-25 01:39:27 +000010import lldb.runtime.objc.objc_runtime
11import lldb.formatters.metrics
Enrico Granataeb4a4792012-02-23 23:10:27 +000012import CFString
13import lldb
Enrico Granata28399ad2012-04-25 01:39:27 +000014import lldb.formatters.Logger
Enrico Granataeb4a4792012-02-23 23:10:27 +000015
Enrico Granata28399ad2012-04-25 01:39:27 +000016statistics = lldb.formatters.metrics.Metrics()
Enrico Granataeb4a4792012-02-23 23:10:27 +000017statistics.add_metric('invalid_isa')
18statistics.add_metric('invalid_pointer')
19statistics.add_metric('unknown_class')
20statistics.add_metric('code_notrun')
21
22class NSConcreteNotification_SummaryProvider:
23 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000024 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000025
Enrico Granatacfdafa32012-03-05 19:56:33 +000026 def __init__(self, valobj, params):
Enrico Granata28399ad2012-04-25 01:39:27 +000027 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000028 self.valobj = valobj;
Enrico Granataeb55ad42012-03-09 00:45:19 +000029 self.sys_params = params
Enrico Granatacfdafa32012-03-05 19:56:33 +000030 if not (self.sys_params.types_cache.id):
31 self.sys_params.types_cache.id = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
Enrico Granataeb4a4792012-02-23 23:10:27 +000032 self.update();
33
34 def update(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000035 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000036 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000037
38 # skip the ISA and go to the name pointer
39 def offset(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000040 logger = lldb.formatters.Logger.Logger()
Enrico Granatacfdafa32012-03-05 19:56:33 +000041 return self.sys_params.pointer_size
Enrico Granataeb55ad42012-03-09 00:45:19 +000042
Enrico Granataeb4a4792012-02-23 23:10:27 +000043 def name(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000044 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000045 string_ptr = self.valobj.CreateChildAtOffset("name",
46 self.offset(),
Enrico Granatacfdafa32012-03-05 19:56:33 +000047 self.sys_params.types_cache.id)
Enrico Granataeb4a4792012-02-23 23:10:27 +000048 return CFString.CFString_SummaryProvider(string_ptr,None)
49
50
51class NSNotificationUnknown_SummaryProvider:
52 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000053 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000054
Enrico Granatacfdafa32012-03-05 19:56:33 +000055 def __init__(self, valobj, params):
Enrico Granata28399ad2012-04-25 01:39:27 +000056 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000057 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000058 self.sys_params = params
Enrico Granataeb4a4792012-02-23 23:10:27 +000059 self.update()
60
61 def update(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000062 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000063 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000064
65 def name(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000066 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000067 stream = lldb.SBStream()
68 self.valobj.GetExpressionPath(stream)
Enrico Granata3f1052b2012-03-13 21:52:00 +000069 name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]")
70 if name_vo.IsValid():
71 return CFString.CFString_SummaryProvider(name_vo,None)
72 return '<variable is not NSNotification>'
Enrico Granataeb4a4792012-02-23 23:10:27 +000073
74
75def GetSummary_Impl(valobj):
Enrico Granata28399ad2012-04-25 01:39:27 +000076 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000077 global statistics
Enrico Granata7d222212012-04-25 17:53:41 +000078 class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
Enrico Granata3f1052b2012-03-13 21:52:00 +000079 if wrapper:
80 return wrapper
Enrico Granataeb4a4792012-02-23 23:10:27 +000081
82 name_string = class_data.class_name()
Enrico Granata247bd412012-04-02 16:39:29 +000083 logger >> "class name is: " + str(name_string)
84
Enrico Granataeb4a4792012-02-23 23:10:27 +000085 if name_string == 'NSConcreteNotification':
Enrico Granataeb55ad42012-03-09 00:45:19 +000086 wrapper = NSConcreteNotification_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +000087 statistics.metric_hit('code_notrun',valobj)
88 else:
Enrico Granataeb55ad42012-03-09 00:45:19 +000089 wrapper = NSNotificationUnknown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataa7daeeb2012-03-30 00:51:12 +000090 statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
Enrico Granataeb4a4792012-02-23 23:10:27 +000091 return wrapper;
92
93def NSNotification_SummaryProvider (valobj,dict):
Enrico Granata28399ad2012-04-25 01:39:27 +000094 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000095 provider = GetSummary_Impl(valobj);
96 if provider != None:
Enrico Granata7d222212012-04-25 17:53:41 +000097 if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
Enrico Granata3f1052b2012-03-13 21:52:00 +000098 return provider.message()
99 try:
100 summary = provider.name();
101 except:
102 summary = None
Enrico Granata247bd412012-04-02 16:39:29 +0000103 logger >> "got summary " + str(summary)
Enrico Granata3f1052b2012-03-13 21:52:00 +0000104 if summary == None:
105 summary = '<variable is not NSNotification>'
106 return str(summary)
107 return 'Summary Unavailable'
Enrico Granataeb4a4792012-02-23 23:10:27 +0000108
109def __lldb_init_module(debugger,dict):
110 debugger.HandleCommand("type summary add -F NSNotification.NSNotification_SummaryProvider NSNotification")