blob: d29bbc7750743a7e040e96972e8294764780a789 [file] [log] [blame]
Enrico Granataeb4a4792012-02-23 23:10:27 +00001# summary provider for NSURL
2import lldb
3import ctypes
4import objc_runtime
5import metrics
6import CFString
7
8statistics = metrics.Metrics()
9statistics.add_metric('invalid_isa')
10statistics.add_metric('invalid_pointer')
11statistics.add_metric('unknown_class')
12statistics.add_metric('code_notrun')
13
14# despite the similary to synthetic children providers, these classes are not
15# trying to provide anything but a summary for an NSURL, so they need not
16# obey the interface specification for synthetic children providers
17class NSURLKnown_SummaryProvider:
18 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000019 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000020
Enrico Granatacfdafa32012-03-05 19:56:33 +000021 def __init__(self, valobj, params):
Enrico Granataeb4a4792012-02-23 23:10:27 +000022 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000023 self.sys_params = params
24 if not(self.sys_params.types_cache.NSString):
25 self.sys_params.types_cache.NSString = self.valobj.GetTarget().FindFirstType('NSString').GetPointerType()
26 if not(self.sys_params.types_cache.NSURL):
27 self.sys_params.types_cache.NSURL = self.valobj.GetTarget().FindFirstType('NSURL').GetPointerType()
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 there is one more pointer and 8 bytes of plain data
35 # (which are also present on a 32-bit system)
36 # plus another pointer, and then the real data
Enrico Granatacfdafa32012-03-05 19:56:33 +000037 def offset_text(self):
38 return 24 if self.sys_params.is_64_bit else 16
39 def offset_base(self):
40 return self.offset_text()+self.sys_params.pointer_size
Enrico Granataeb4a4792012-02-23 23:10:27 +000041
42 def url_text(self):
43 text = self.valobj.CreateChildAtOffset("text",
Enrico Granatacfdafa32012-03-05 19:56:33 +000044 self.offset_text(),
45 self.sys_params.types_cache.NSString)
Enrico Granataeb4a4792012-02-23 23:10:27 +000046 base = self.valobj.CreateChildAtOffset("base",
Enrico Granatacfdafa32012-03-05 19:56:33 +000047 self.offset_base(),
48 self.sys_params.types_cache.NSURL)
Enrico Granataeb4a4792012-02-23 23:10:27 +000049 my_string = CFString.CFString_SummaryProvider(text,None)
Enrico Granata8c69c962012-03-13 00:25:59 +000050 if len(my_string) > 0 and base.GetValueAsUnsigned(0) != 0:
51 # remove final " from myself
52 my_string = my_string[0:len(my_string)-1]
53 my_string = my_string + ' -- '
54 my_base_string = NSURL_SummaryProvider(base,None)
55 if len(my_base_string) > 2:
56 # remove @" marker from base URL string
57 my_base_string = my_base_string[2:]
58 my_string = my_string + my_base_string
Enrico Granataeb4a4792012-02-23 23:10:27 +000059 return my_string
60
61
62class NSURLUnknown_SummaryProvider:
63 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000064 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000065
Enrico Granatacfdafa32012-03-05 19:56:33 +000066 def __init__(self, valobj, params):
Enrico Granataeb4a4792012-02-23 23:10:27 +000067 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000068 self.sys_params = params
Enrico Granataeb4a4792012-02-23 23:10:27 +000069 self.update()
70
71 def update(self):
72 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000073
74 def url_text(self):
75 stream = lldb.SBStream()
76 self.valobj.GetExpressionPath(stream)
77 url_text_vo = self.valobj.CreateValueFromExpression("url","(NSString*)[" + stream.GetData() + " description]");
78 return CFString.CFString_SummaryProvider(url_text_vo,None)
79
80
81def GetSummary_Impl(valobj):
82 global statistics
83 class_data = objc_runtime.ObjCRuntime(valobj)
84 if class_data.is_valid() == False:
85 statistics.metric_hit('invalid_pointer',valobj)
86 wrapper = None
87 return
88 class_data = class_data.read_class_data()
89 if class_data.is_valid() == False:
90 statistics.metric_hit('invalid_isa',valobj)
91 wrapper = None
92 return
93 if class_data.is_kvo():
94 class_data = class_data.get_superclass()
95 if class_data.is_valid() == False:
96 statistics.metric_hit('invalid_isa',valobj)
97 wrapper = None
98 return
99
100 name_string = class_data.class_name()
101 if name_string == 'NSURL':
Enrico Granatacfdafa32012-03-05 19:56:33 +0000102 wrapper = NSURLKnown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +0000103 statistics.metric_hit('code_notrun',valobj)
104 else:
Enrico Granatacfdafa32012-03-05 19:56:33 +0000105 wrapper = NSURLUnknown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +0000106 statistics.metric_hit('unknown_class',str(valobj) + " seen as " + name_string)
107 return wrapper;
108
109def NSURL_SummaryProvider (valobj,dict):
110 provider = GetSummary_Impl(valobj);
111 if provider != None:
112 try:
113 summary = provider.url_text();
114 except:
115 summary = None
116 if summary == None or summary == '':
117 summary = 'no valid NSURL here'
118 return summary
119 return ''
120
121def __lldb_init_module(debugger,dict):
122 debugger.HandleCommand("type summary add -F NSURL.NSURL_SummaryProvider NSURL CFURLRef")