blob: 29f81a840adab3d9f6dc845a5109e3903834af1a [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 NSURL
9import lldb
10import ctypes
Enrico Granata28399ad2012-04-25 01:39:27 +000011import lldb.runtime.objc.objc_runtime
12import lldb.formatters.metrics
Enrico Granataeb4a4792012-02-23 23:10:27 +000013import CFString
Enrico Granata28399ad2012-04-25 01:39:27 +000014import lldb.formatters.Logger
Enrico Granataeb4a4792012-02-23 23:10:27 +000015
Enrico Granata28399ad2012-04-25 01:39:27 +000016statistics = lldb.formatters.metrics.Metrics()
Enrico Granataeb4a4792012-02-23 23:10:27 +000017statistics.add_metric('invalid_isa')
18statistics.add_metric('invalid_pointer')
19statistics.add_metric('unknown_class')
20statistics.add_metric('code_notrun')
21
22# despite the similary to synthetic children providers, these classes are not
23# trying to provide anything but a summary for an NSURL, so they need not
24# obey the interface specification for synthetic children providers
25class NSURLKnown_SummaryProvider:
26 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000027 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000028
Enrico Granatacfdafa32012-03-05 19:56:33 +000029 def __init__(self, valobj, params):
Enrico Granata28399ad2012-04-25 01:39:27 +000030 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000031 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000032 self.sys_params = params
33 if not(self.sys_params.types_cache.NSString):
34 self.sys_params.types_cache.NSString = self.valobj.GetTarget().FindFirstType('NSString').GetPointerType()
35 if not(self.sys_params.types_cache.NSURL):
36 self.sys_params.types_cache.NSURL = self.valobj.GetTarget().FindFirstType('NSURL').GetPointerType()
Enrico Granataeb4a4792012-02-23 23:10:27 +000037 self.update();
38
39 def update(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000040 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000041 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000042
43 # one pointer is the ISA
44 # then there is one more pointer and 8 bytes of plain data
45 # (which are also present on a 32-bit system)
46 # plus another pointer, and then the real data
Enrico Granatacfdafa32012-03-05 19:56:33 +000047 def offset_text(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000048 logger = lldb.formatters.Logger.Logger()
Enrico Granatacfdafa32012-03-05 19:56:33 +000049 return 24 if self.sys_params.is_64_bit else 16
50 def offset_base(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000051 logger = lldb.formatters.Logger.Logger()
Enrico Granatacfdafa32012-03-05 19:56:33 +000052 return self.offset_text()+self.sys_params.pointer_size
Enrico Granataeb4a4792012-02-23 23:10:27 +000053
54 def url_text(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000055 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000056 text = self.valobj.CreateChildAtOffset("text",
Enrico Granatacfdafa32012-03-05 19:56:33 +000057 self.offset_text(),
58 self.sys_params.types_cache.NSString)
Enrico Granataeb4a4792012-02-23 23:10:27 +000059 base = self.valobj.CreateChildAtOffset("base",
Enrico Granatacfdafa32012-03-05 19:56:33 +000060 self.offset_base(),
61 self.sys_params.types_cache.NSURL)
Enrico Granataeb4a4792012-02-23 23:10:27 +000062 my_string = CFString.CFString_SummaryProvider(text,None)
Enrico Granata8c69c962012-03-13 00:25:59 +000063 if len(my_string) > 0 and base.GetValueAsUnsigned(0) != 0:
64 # remove final " from myself
65 my_string = my_string[0:len(my_string)-1]
66 my_string = my_string + ' -- '
67 my_base_string = NSURL_SummaryProvider(base,None)
68 if len(my_base_string) > 2:
69 # remove @" marker from base URL string
70 my_base_string = my_base_string[2:]
71 my_string = my_string + my_base_string
Enrico Granataeb4a4792012-02-23 23:10:27 +000072 return my_string
73
74
75class NSURLUnknown_SummaryProvider:
76 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000077 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000078
Enrico Granatacfdafa32012-03-05 19:56:33 +000079 def __init__(self, valobj, params):
Enrico Granata28399ad2012-04-25 01:39:27 +000080 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000081 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000082 self.sys_params = params
Enrico Granataeb4a4792012-02-23 23:10:27 +000083 self.update()
84
85 def update(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000086 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000087 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000088
89 def url_text(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000090 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000091 stream = lldb.SBStream()
92 self.valobj.GetExpressionPath(stream)
Enrico Granata3f1052b2012-03-13 21:52:00 +000093 url_text_vo = self.valobj.CreateValueFromExpression("url","(NSString*)[" + stream.GetData() + " description]")
94 if url_text_vo.IsValid():
95 return CFString.CFString_SummaryProvider(url_text_vo,None)
96 return '<variable is not NSURL>'
Enrico Granataeb4a4792012-02-23 23:10:27 +000097
98
99def GetSummary_Impl(valobj):
Enrico Granata28399ad2012-04-25 01:39:27 +0000100 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +0000101 global statistics
Enrico Granata7d222212012-04-25 17:53:41 +0000102 class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
Enrico Granata3f1052b2012-03-13 21:52:00 +0000103 if wrapper:
104 return wrapper
Enrico Granataeb4a4792012-02-23 23:10:27 +0000105
106 name_string = class_data.class_name()
Enrico Granata247bd412012-04-02 16:39:29 +0000107 logger >> "class name is: " + str(name_string)
108
Enrico Granataeb4a4792012-02-23 23:10:27 +0000109 if name_string == 'NSURL':
Enrico Granatacfdafa32012-03-05 19:56:33 +0000110 wrapper = NSURLKnown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +0000111 statistics.metric_hit('code_notrun',valobj)
112 else:
Enrico Granatacfdafa32012-03-05 19:56:33 +0000113 wrapper = NSURLUnknown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataa7daeeb2012-03-30 00:51:12 +0000114 statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
Enrico Granataeb4a4792012-02-23 23:10:27 +0000115 return wrapper;
116
117def NSURL_SummaryProvider (valobj,dict):
Enrico Granata28399ad2012-04-25 01:39:27 +0000118 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +0000119 provider = GetSummary_Impl(valobj);
120 if provider != None:
Enrico Granata7d222212012-04-25 17:53:41 +0000121 if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
Enrico Granata3f1052b2012-03-13 21:52:00 +0000122 return provider.message()
123 try:
124 summary = provider.url_text();
125 except:
126 summary = None
Enrico Granata247bd412012-04-02 16:39:29 +0000127 logger >> "got summary " + str(summary)
Enrico Granata3f1052b2012-03-13 21:52:00 +0000128 if summary == None or summary == '':
129 summary = '<variable is not NSURL>'
130 return summary
131 return 'Summary Unavailable'
Enrico Granataeb4a4792012-02-23 23:10:27 +0000132
133def __lldb_init_module(debugger,dict):
134 debugger.HandleCommand("type summary add -F NSURL.NSURL_SummaryProvider NSURL CFURLRef")