blob: 554d2ca7785af03e990da59613870f15bf4299c6 [file] [log] [blame]
Enrico Granata579a2962012-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 Granatadc1df6b2013-03-16 00:50:25 +00008# example summary provider for NSMachPort
9# the real summary is now C++ code built into LLDB
Enrico Granatab370df22012-02-23 23:10:27 +000010import lldb
11import ctypes
Enrico Granata0d235d52012-04-25 01:39:27 +000012import lldb.runtime.objc.objc_runtime
13import lldb.formatters.metrics
14import lldb.formatters.Logger
Enrico Granatab370df22012-02-23 23:10:27 +000015
Enrico Granata0d235d52012-04-25 01:39:27 +000016statistics = lldb.formatters.metrics.Metrics()
Enrico Granatab370df22012-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
22# despite the similary to synthetic children providers, these classes are not
23# trying to provide anything but the port number of an NSMachPort, so they need not
24# obey the interface specification for synthetic children providers
25class NSMachPortKnown_SummaryProvider:
26 def adjust_for_architecture(self):
Enrico Granataf2a84672012-03-05 19:56:33 +000027 pass
Enrico Granatab370df22012-02-23 23:10:27 +000028
Enrico Granataf2a84672012-03-05 19:56:33 +000029 def __init__(self, valobj, params):
Enrico Granata0d235d52012-04-25 01:39:27 +000030 logger = lldb.formatters.Logger.Logger()
Enrico Granatab370df22012-02-23 23:10:27 +000031 self.valobj = valobj;
Enrico Granataf2a84672012-03-05 19:56:33 +000032 self.sys_params = params
33 if not(self.sys_params.types_cache.NSUInteger):
34 if self.sys_params.is_64_bit:
35 self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong)
36 else:
37 self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedInt)
Enrico Granatab370df22012-02-23 23:10:27 +000038 self.update();
39
40 def update(self):
Enrico Granata0d235d52012-04-25 01:39:27 +000041 logger = lldb.formatters.Logger.Logger()
Enrico Granatab370df22012-02-23 23:10:27 +000042 self.adjust_for_architecture();
Enrico Granatab370df22012-02-23 23:10:27 +000043
44 # one pointer is the ISA
45 # then we have one other internal pointer, plus
46 # 4 bytes worth of flags. hence, these values
47 def offset(self):
Enrico Granata0d235d52012-04-25 01:39:27 +000048 logger = lldb.formatters.Logger.Logger()
Enrico Granataf2a84672012-03-05 19:56:33 +000049 if self.sys_params.is_64_bit:
Enrico Granatab370df22012-02-23 23:10:27 +000050 return 20
51 else:
52 return 12
53
54 def port(self):
Enrico Granata0d235d52012-04-25 01:39:27 +000055 logger = lldb.formatters.Logger.Logger()
Enrico Granatab370df22012-02-23 23:10:27 +000056 vport = self.valobj.CreateChildAtOffset("port",
57 self.offset(),
Enrico Granataf2a84672012-03-05 19:56:33 +000058 self.sys_params.types_cache.NSUInteger)
Enrico Granatab370df22012-02-23 23:10:27 +000059 return vport.GetValueAsUnsigned(0)
60
61
62class NSMachPortUnknown_SummaryProvider:
63 def adjust_for_architecture(self):
Enrico Granataf2a84672012-03-05 19:56:33 +000064 pass
Enrico Granatab370df22012-02-23 23:10:27 +000065
Enrico Granataf2a84672012-03-05 19:56:33 +000066 def __init__(self, valobj, params):
Enrico Granata0d235d52012-04-25 01:39:27 +000067 logger = lldb.formatters.Logger.Logger()
Enrico Granatab370df22012-02-23 23:10:27 +000068 self.valobj = valobj;
Enrico Granataf2a84672012-03-05 19:56:33 +000069 self.sys_params = params
70 self.update();
Enrico Granatab370df22012-02-23 23:10:27 +000071
72 def update(self):
Enrico Granata0d235d52012-04-25 01:39:27 +000073 logger = lldb.formatters.Logger.Logger()
Enrico Granatab370df22012-02-23 23:10:27 +000074 self.adjust_for_architecture();
Enrico Granatab370df22012-02-23 23:10:27 +000075
76 def port(self):
Enrico Granata0d235d52012-04-25 01:39:27 +000077 logger = lldb.formatters.Logger.Logger()
Enrico Granatab370df22012-02-23 23:10:27 +000078 stream = lldb.SBStream()
79 self.valobj.GetExpressionPath(stream)
Enrico Granata579a2962012-03-13 21:52:00 +000080 num_children_vo = self.valobj.CreateValueFromExpression("port","(int)[" + stream.GetData() + " machPort]")
81 if num_children_vo.IsValid():
82 return num_children_vo.GetValueAsUnsigned(0)
83 return '<variable is not NSMachPort>'
Enrico Granatab370df22012-02-23 23:10:27 +000084
85
86def GetSummary_Impl(valobj):
Enrico Granata0d235d52012-04-25 01:39:27 +000087 logger = lldb.formatters.Logger.Logger()
Enrico Granatab370df22012-02-23 23:10:27 +000088 global statistics
Enrico Granataa5c2ce02012-04-25 17:53:41 +000089 class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
Enrico Granata579a2962012-03-13 21:52:00 +000090 if wrapper:
91 return wrapper
Enrico Granatab370df22012-02-23 23:10:27 +000092
93 name_string = class_data.class_name()
Enrico Granata8f182402012-04-02 16:39:29 +000094 logger >> "class name is: " + str(name_string)
95
Enrico Granatab370df22012-02-23 23:10:27 +000096 if name_string == 'NSMachPort':
Enrico Granataf2a84672012-03-05 19:56:33 +000097 wrapper = NSMachPortKnown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granatab370df22012-02-23 23:10:27 +000098 statistics.metric_hit('code_notrun',valobj)
99 else:
Enrico Granataf2a84672012-03-05 19:56:33 +0000100 wrapper = NSMachPortUnknown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granata805f79b2012-03-30 00:51:12 +0000101 statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
Enrico Granatab370df22012-02-23 23:10:27 +0000102 return wrapper;
103
104def NSMachPort_SummaryProvider (valobj,dict):
Enrico Granata0d235d52012-04-25 01:39:27 +0000105 logger = lldb.formatters.Logger.Logger()
Enrico Granatab370df22012-02-23 23:10:27 +0000106 provider = GetSummary_Impl(valobj);
107 if provider != None:
Enrico Granataa5c2ce02012-04-25 17:53:41 +0000108 if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
Enrico Granata579a2962012-03-13 21:52:00 +0000109 return provider.message()
110 try:
111 summary = provider.port();
112 except:
113 summary = None
Enrico Granata8f182402012-04-02 16:39:29 +0000114 logger >> "got summary " + str(summary)
Enrico Granata579a2962012-03-13 21:52:00 +0000115 if summary == None:
116 summary = '<variable is not NSMachPort>'
117 if isinstance(summary, basestring):
118 return summay
119 return 'mach port: ' + str(summary)
120 return 'Summary Unavailable'
Enrico Granatab370df22012-02-23 23:10:27 +0000121
122def __lldb_init_module(debugger,dict):
123 debugger.HandleCommand("type summary add -F NSMachPort.NSMachPort_SummaryProvider NSMachPort")