blob: c7ffcc0c59be8203b01fa620a852853c1c6eafba [file] [log] [blame]
Enrico Granataeb4a4792012-02-23 23:10:27 +00001# summary provider for NSData
2import lldb
3import ctypes
4import objc_runtime
5import metrics
6
7statistics = metrics.Metrics()
8statistics.add_metric('invalid_isa')
9statistics.add_metric('invalid_pointer')
10statistics.add_metric('unknown_class')
11statistics.add_metric('code_notrun')
12
13# despite the similary to synthetic children providers, these classes are not
14# trying to provide anything but the port number of an NSMachPort, so they need not
15# obey the interface specification for synthetic children providers
16class NSMachPortKnown_SummaryProvider:
17 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000018 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000019
Enrico Granatacfdafa32012-03-05 19:56:33 +000020 def __init__(self, valobj, params):
Enrico Granataeb4a4792012-02-23 23:10:27 +000021 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000022 self.sys_params = params
23 if not(self.sys_params.types_cache.NSUInteger):
24 if self.sys_params.is_64_bit:
25 self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong)
26 else:
27 self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedInt)
Enrico Granataeb4a4792012-02-23 23:10:27 +000028 self.update();
29
30 def update(self):
31 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000032
33 # one pointer is the ISA
34 # then we have one other internal pointer, plus
35 # 4 bytes worth of flags. hence, these values
36 def offset(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000037 if self.sys_params.is_64_bit:
Enrico Granataeb4a4792012-02-23 23:10:27 +000038 return 20
39 else:
40 return 12
41
42 def port(self):
43 vport = self.valobj.CreateChildAtOffset("port",
44 self.offset(),
Enrico Granatacfdafa32012-03-05 19:56:33 +000045 self.sys_params.types_cache.NSUInteger)
Enrico Granataeb4a4792012-02-23 23:10:27 +000046 return vport.GetValueAsUnsigned(0)
47
48
49class NSMachPortUnknown_SummaryProvider:
50 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000051 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000052
Enrico Granatacfdafa32012-03-05 19:56:33 +000053 def __init__(self, valobj, params):
Enrico Granataeb4a4792012-02-23 23:10:27 +000054 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000055 self.sys_params = params
56 self.update();
Enrico Granataeb4a4792012-02-23 23:10:27 +000057
58 def update(self):
59 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000060
61 def port(self):
62 stream = lldb.SBStream()
63 self.valobj.GetExpressionPath(stream)
64 num_children_vo = self.valobj.CreateValueFromExpression("port","(int)[" + stream.GetData() + " machPort]");
65 return num_children_vo.GetValueAsUnsigned(0)
66
67
68def GetSummary_Impl(valobj):
69 global statistics
70 class_data = objc_runtime.ObjCRuntime(valobj)
71 if class_data.is_valid() == False:
72 statistics.metric_hit('invalid_pointer',valobj)
73 wrapper = None
74 return
75 class_data = class_data.read_class_data()
76 if class_data.is_valid() == False:
77 statistics.metric_hit('invalid_isa',valobj)
78 wrapper = None
79 return
80 if class_data.is_kvo():
81 class_data = class_data.get_superclass()
82 if class_data.is_valid() == False:
83 statistics.metric_hit('invalid_isa',valobj)
84 wrapper = None
85 return
86
87 name_string = class_data.class_name()
88 if name_string == 'NSMachPort':
Enrico Granatacfdafa32012-03-05 19:56:33 +000089 wrapper = NSMachPortKnown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +000090 statistics.metric_hit('code_notrun',valobj)
91 else:
Enrico Granatacfdafa32012-03-05 19:56:33 +000092 wrapper = NSMachPortUnknown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +000093 statistics.metric_hit('unknown_class',str(valobj) + " seen as " + name_string)
94 return wrapper;
95
96def NSMachPort_SummaryProvider (valobj,dict):
97 provider = GetSummary_Impl(valobj);
98 if provider != None:
99 try:
100 summary = provider.port();
101 except:
102 summary = None
103 if summary == None:
104 summary = 'no valid mach port here'
105 return 'mach port: ' + str(summary)
106 return ''
107
108def __lldb_init_module(debugger,dict):
109 debugger.HandleCommand("type summary add -F NSMachPort.NSMachPort_SummaryProvider NSMachPort")