blob: 94da6057f5ca7cb2e7fa652da88db69f9f652243 [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 NSData
9import lldb
10import ctypes
11import objc_runtime
12import metrics
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
20# despite the similary to synthetic children providers, these classes are not
21# trying to provide anything but the length for an NSData, so they need not
22# obey the interface specification for synthetic children providers
23class NSConcreteData_SummaryProvider:
24 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000025 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000026
Enrico Granatacfdafa32012-03-05 19:56:33 +000027 def __init__(self, valobj, params):
Enrico Granataeb4a4792012-02-23 23:10:27 +000028 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000029 self.sys_params = params
30 if not(self.sys_params.types_cache.NSUInteger):
31 if self.sys_params.is_64_bit:
32 self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong)
33 else:
34 self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedInt)
Enrico Granataeb4a4792012-02-23 23:10:27 +000035 self.update();
36
37 def update(self):
38 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000039
40 # one pointer is the ISA
41 # then there are 32 bit worth of flags and other data
42 # however, on 64bit systems these are padded to be a full
43 # machine word long, which means we actually have two pointers
44 # worth of data to skip
45 def offset(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000046 return 2 * self.sys_params.pointer_size
Enrico Granataeb4a4792012-02-23 23:10:27 +000047
48 def length(self):
49 size = self.valobj.CreateChildAtOffset("count",
50 self.offset(),
Enrico Granatacfdafa32012-03-05 19:56:33 +000051 self.sys_params.types_cache.NSUInteger)
Enrico Granataeb4a4792012-02-23 23:10:27 +000052 return size.GetValueAsUnsigned(0)
53
54
55class NSDataUnknown_SummaryProvider:
56 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000057 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000058
Enrico Granatacfdafa32012-03-05 19:56:33 +000059 def __init__(self, valobj, params):
Enrico Granataeb4a4792012-02-23 23:10:27 +000060 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000061 self.sys_params = params
62 self.update();
Enrico Granataeb4a4792012-02-23 23:10:27 +000063
64 def update(self):
65 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000066
67 def length(self):
68 stream = lldb.SBStream()
69 self.valobj.GetExpressionPath(stream)
70 num_children_vo = self.valobj.CreateValueFromExpression("count","(int)[" + stream.GetData() + " length]");
Enrico Granata3f1052b2012-03-13 21:52:00 +000071 if num_children_vo.IsValid():
72 return num_children_vo.GetValueAsUnsigned(0)
73 return '<variable is not NSData>'
Enrico Granataeb4a4792012-02-23 23:10:27 +000074
75
76def GetSummary_Impl(valobj):
77 global statistics
Enrico Granata3f1052b2012-03-13 21:52:00 +000078 class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
79 if wrapper:
80 return wrapper
Enrico Granataeb4a4792012-02-23 23:10:27 +000081
82 name_string = class_data.class_name()
83 if name_string == 'NSConcreteData' or \
84 name_string == 'NSConcreteMutableData' or \
85 name_string == '__NSCFData':
Enrico Granatacfdafa32012-03-05 19:56:33 +000086 wrapper = NSConcreteData_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +000087 statistics.metric_hit('code_notrun',valobj)
88 else:
Enrico Granatacfdafa32012-03-05 19:56:33 +000089 wrapper = NSDataUnknown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +000090 statistics.metric_hit('unknown_class',str(valobj) + " seen as " + name_string)
91 return wrapper;
92
93def NSData_SummaryProvider (valobj,dict):
94 provider = GetSummary_Impl(valobj);
95 if provider != None:
Enrico Granata3f1052b2012-03-13 21:52:00 +000096 try:
97 summary = provider.length();
98 except:
99 summary = None
100 if summary == None:
101 summary = '<variable is not NSData>'
102 elif isinstance(summary,basestring):
103 pass
104 else:
105 if summary == 1:
106 summary = '1 byte'
107 else:
108 summary = str(summary) + ' bytes'
109 return summary
110 return 'Summary Unavailable'
Enrico Granataeb4a4792012-02-23 23:10:27 +0000111
Enrico Granata8c69c962012-03-13 00:25:59 +0000112def NSData_SummaryProvider2 (valobj,dict):
113 provider = GetSummary_Impl(valobj);
114 if provider != None:
Enrico Granata3f1052b2012-03-13 21:52:00 +0000115 if isinstance(provider,objc_runtime.SpecialSituation_Description):
116 return provider.message()
117 try:
118 summary = provider.length();
119 except:
120 summary = None
121 if summary == None:
122 summary = '<variable is not CFData>'
123 elif isinstance(summary,basestring):
124 pass
125 else:
126 if summary == 1:
127 summary = '@"1 byte"'
128 else:
129 summary = '@"' + str(summary) + ' bytes"'
130 return summary
131 return 'Summary Unavailable'
Enrico Granata8c69c962012-03-13 00:25:59 +0000132
Enrico Granataeb4a4792012-02-23 23:10:27 +0000133def __lldb_init_module(debugger,dict):
Enrico Granata8c69c962012-03-13 00:25:59 +0000134 debugger.HandleCommand("type summary add -F NSData.NSData_SummaryProvider NSData")
135 debugger.HandleCommand("type summary add -F NSData.NSData_SummaryProvider2 CFDataRef CFMutableDataRef")