blob: 4273b43abd1ec5cf5d445d53db3f0c2f1236b98f [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)
50 if base.GetValueAsUnsigned(0) != 0:
51 my_string = my_string + " (base path: " + NSURL_SummaryProvider(base,None) + ")"
52 return my_string
53
54
55class NSURLUnknown_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
Enrico Granataeb4a4792012-02-23 23:10:27 +000062 self.update()
63
64 def update(self):
65 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000066
67 def url_text(self):
68 stream = lldb.SBStream()
69 self.valobj.GetExpressionPath(stream)
70 url_text_vo = self.valobj.CreateValueFromExpression("url","(NSString*)[" + stream.GetData() + " description]");
71 return CFString.CFString_SummaryProvider(url_text_vo,None)
72
73
74def GetSummary_Impl(valobj):
75 global statistics
76 class_data = objc_runtime.ObjCRuntime(valobj)
77 if class_data.is_valid() == False:
78 statistics.metric_hit('invalid_pointer',valobj)
79 wrapper = None
80 return
81 class_data = class_data.read_class_data()
82 if class_data.is_valid() == False:
83 statistics.metric_hit('invalid_isa',valobj)
84 wrapper = None
85 return
86 if class_data.is_kvo():
87 class_data = class_data.get_superclass()
88 if class_data.is_valid() == False:
89 statistics.metric_hit('invalid_isa',valobj)
90 wrapper = None
91 return
92
93 name_string = class_data.class_name()
94 if name_string == 'NSURL':
Enrico Granatacfdafa32012-03-05 19:56:33 +000095 wrapper = NSURLKnown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +000096 statistics.metric_hit('code_notrun',valobj)
97 else:
Enrico Granatacfdafa32012-03-05 19:56:33 +000098 wrapper = NSURLUnknown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +000099 statistics.metric_hit('unknown_class',str(valobj) + " seen as " + name_string)
100 return wrapper;
101
102def NSURL_SummaryProvider (valobj,dict):
103 provider = GetSummary_Impl(valobj);
104 if provider != None:
105 try:
106 summary = provider.url_text();
107 except:
108 summary = None
109 if summary == None or summary == '':
110 summary = 'no valid NSURL here'
111 return summary
112 return ''
113
114def __lldb_init_module(debugger,dict):
115 debugger.HandleCommand("type summary add -F NSURL.NSURL_SummaryProvider NSURL CFURLRef")