blob: 31b90405793387921a636167c303160f8ae918e3 [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 NSBundle
9import lldb
10import ctypes
11import objc_runtime
12import metrics
13import NSURL
14
15statistics = metrics.Metrics()
16statistics.add_metric('invalid_isa')
17statistics.add_metric('invalid_pointer')
18statistics.add_metric('unknown_class')
19statistics.add_metric('code_notrun')
20
21# despite the similary to synthetic children providers, these classes are not
22# trying to provide anything but a summary for an NSURL, so they need not
23# obey the interface specification for synthetic children providers
24class NSBundleKnown_SummaryProvider:
25 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000026 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000027
Enrico Granatacfdafa32012-03-05 19:56:33 +000028 def __init__(self, valobj, params):
Enrico Granataeb4a4792012-02-23 23:10:27 +000029 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000030 self.sys_params = params
31 if not(self.sys_params.types_cache.NSString):
32 self.sys_params.types_cache.NSString = self.valobj.GetTarget().FindFirstType('NSString').GetPointerType()
Enrico Granataeb4a4792012-02-23 23:10:27 +000033 self.update();
34
35 def update(self):
36 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000037
38 # we need to skip the ISA, plus four other values
39 # that are luckily each a pointer in size
40 # which makes our computation trivial :-)
41 def offset(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000042 return 5 * self.sys_params.pointer_size
Enrico Granataeb4a4792012-02-23 23:10:27 +000043
44 def url_text(self):
45 global statistics
46 text = self.valobj.CreateChildAtOffset("text",
47 self.offset(),
Enrico Granatacfdafa32012-03-05 19:56:33 +000048 self.sys_params.types_cache.NSString)
Enrico Granataeb4a4792012-02-23 23:10:27 +000049 my_string = text.GetSummary()
50 if (my_string == None) or (my_string == ''):
51 statistics.metric_hit('unknown_class',str(self.valobj) + " triggered unkown pointer location")
Enrico Granatacfdafa32012-03-05 19:56:33 +000052 return NSBundleUnknown_SummaryProvider(self.valobj, self.sys_params).url_text()
Enrico Granataeb4a4792012-02-23 23:10:27 +000053 else:
54 statistics.metric_hit('code_notrun',self.valobj)
55 return my_string
56
57
58class NSBundleUnknown_SummaryProvider:
59 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000060 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000061
Enrico Granatacfdafa32012-03-05 19:56:33 +000062 def __init__(self, valobj, params):
Enrico Granataeb4a4792012-02-23 23:10:27 +000063 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000064 self.sys_params = params
Enrico Granataeb4a4792012-02-23 23:10:27 +000065 self.update()
66
67 def update(self):
68 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000069
70 def url_text(self):
71 stream = lldb.SBStream()
72 self.valobj.GetExpressionPath(stream)
73 expr = "(NSString*)[" + stream.GetData() + " bundlePath]"
74 url_text_vo = self.valobj.CreateValueFromExpression("path",expr);
Enrico Granata3f1052b2012-03-13 21:52:00 +000075 if url_text_vo.IsValid():
76 return url_text_vo.GetSummary()
77 return '<variable is not NSBundle>'
Enrico Granataeb4a4792012-02-23 23:10:27 +000078
79
80def GetSummary_Impl(valobj):
81 global statistics
Enrico Granata3f1052b2012-03-13 21:52:00 +000082 class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
83 if wrapper:
84 return wrapper
Enrico Granataeb4a4792012-02-23 23:10:27 +000085
86 name_string = class_data.class_name()
87 if name_string == 'NSBundle':
Enrico Granatacfdafa32012-03-05 19:56:33 +000088 wrapper = NSBundleKnown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +000089 # [NSBundle mainBundle] does return an object that is
90 # not correctly filled out for our purposes, so we still
91 # end up having to run code in that case
92 #statistics.metric_hit('code_notrun',valobj)
93 else:
Enrico Granatacfdafa32012-03-05 19:56:33 +000094 wrapper = NSBundleUnknown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataa7daeeb2012-03-30 00:51:12 +000095 statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
Enrico Granataeb4a4792012-02-23 23:10:27 +000096 return wrapper;
97
98def NSBundle_SummaryProvider (valobj,dict):
99 provider = GetSummary_Impl(valobj);
100 if provider != None:
Enrico Granata3f1052b2012-03-13 21:52:00 +0000101 if isinstance(provider,objc_runtime.SpecialSituation_Description):
102 return provider.message()
103 try:
104 summary = provider.url_text();
105 except:
106 summary = None
107 if summary == None or summary == '':
108 summary = '<variable is not NSBundle>'
109 return summary
110 return 'Summary Unavailable'
Enrico Granataeb4a4792012-02-23 23:10:27 +0000111
112def __lldb_init_module(debugger,dict):
113 debugger.HandleCommand("type summary add -F NSBundle.NSBundle_SummaryProvider NSBundle")