blob: 72bf895bdbc3d97c0aec52621d9ccd77bd124f70 [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 class NSException
Enrico Granata28399ad2012-04-25 01:39:27 +00009import lldb.runtime.objc.objc_runtime
10import lldb.formatters.metrics
Enrico Granataeb4a4792012-02-23 23:10:27 +000011import CFString
12import lldb
Enrico Granata28399ad2012-04-25 01:39:27 +000013import lldb.formatters.Logger
Enrico Granataeb4a4792012-02-23 23:10:27 +000014
Enrico Granata28399ad2012-04-25 01:39:27 +000015statistics = lldb.formatters.metrics.Metrics()
Enrico Granataeb4a4792012-02-23 23:10:27 +000016statistics.add_metric('invalid_isa')
17statistics.add_metric('invalid_pointer')
18statistics.add_metric('unknown_class')
19statistics.add_metric('code_notrun')
20
21class NSKnownException_SummaryProvider:
22 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000023 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000024
Enrico Granatacfdafa32012-03-05 19:56:33 +000025 def __init__(self, valobj, params):
Enrico Granata28399ad2012-04-25 01:39:27 +000026 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000027 self.valobj = valobj;
Enrico Granatacfdafa32012-03-05 19:56:33 +000028 self.sys_params = params
29 if not (self.sys_params.types_cache.id):
30 self.sys_params.types_cache.id = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
Enrico Granataeb4a4792012-02-23 23:10:27 +000031 self.update();
32
33 def update(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000034 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000035 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000036
Enrico Granatacfdafa32012-03-05 19:56:33 +000037 def offset_name(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000038 logger = lldb.formatters.Logger.Logger()
Enrico Granatacfdafa32012-03-05 19:56:33 +000039 return self.sys_params.pointer_size
40 def offset_reason(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000041 logger = lldb.formatters.Logger.Logger()
Enrico Granatacfdafa32012-03-05 19:56:33 +000042 return 2*self.sys_params.pointer_size
Enrico Granataeb4a4792012-02-23 23:10:27 +000043
44 def description(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000045 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000046 name_ptr = self.valobj.CreateChildAtOffset("name",
Enrico Granatacfdafa32012-03-05 19:56:33 +000047 self.offset_name(),
48 self.sys_params.types_cache.id)
Enrico Granataeb4a4792012-02-23 23:10:27 +000049 reason_ptr = self.valobj.CreateChildAtOffset("reason",
Enrico Granatacfdafa32012-03-05 19:56:33 +000050 self.offset_reason(),
51 self.sys_params.types_cache.id)
Enrico Granata8c69c962012-03-13 00:25:59 +000052 return 'name:' + CFString.CFString_SummaryProvider(name_ptr,None) + ' reason:' + CFString.CFString_SummaryProvider(reason_ptr,None)
Enrico Granataeb4a4792012-02-23 23:10:27 +000053
Enrico Granataeb4a4792012-02-23 23:10:27 +000054class NSUnknownException_SummaryProvider:
55 def adjust_for_architecture(self):
Enrico Granatacfdafa32012-03-05 19:56:33 +000056 pass
Enrico Granataeb4a4792012-02-23 23:10:27 +000057
Enrico Granatacfdafa32012-03-05 19:56:33 +000058 def __init__(self, valobj, params):
Enrico Granata28399ad2012-04-25 01:39:27 +000059 logger = lldb.formatters.Logger.Logger()
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):
Enrico Granata28399ad2012-04-25 01:39:27 +000065 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000066 self.adjust_for_architecture();
Enrico Granataeb4a4792012-02-23 23:10:27 +000067
68 def description(self):
Enrico Granata28399ad2012-04-25 01:39:27 +000069 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000070 stream = lldb.SBStream()
71 self.valobj.GetExpressionPath(stream)
72 name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]");
73 reason_vo = self.valobj.CreateValueFromExpression("reason","(NSString*)[" + stream.GetData() + " reason]");
Enrico Granata3f1052b2012-03-13 21:52:00 +000074 if name_vo.IsValid() and reason_vo.IsValid():
75 return CFString.CFString_SummaryProvider(name_vo,None) + ' ' + CFString.CFString_SummaryProvider(reason_vo,None)
76 return '<variable is not NSException>'
Enrico Granataeb4a4792012-02-23 23:10:27 +000077
78
79def GetSummary_Impl(valobj):
Enrico Granata28399ad2012-04-25 01:39:27 +000080 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000081 global statistics
Enrico Granata7d222212012-04-25 17:53:41 +000082 class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
Enrico Granata3f1052b2012-03-13 21:52:00 +000083 if wrapper:
84 return wrapper
Enrico Granataeb4a4792012-02-23 23:10:27 +000085
86 name_string = class_data.class_name()
Enrico Granata247bd412012-04-02 16:39:29 +000087 logger >> "class name is: " + str(name_string)
88
Enrico Granataeb4a4792012-02-23 23:10:27 +000089 if name_string == 'NSException':
Enrico Granatacfdafa32012-03-05 19:56:33 +000090 wrapper = NSKnownException_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataeb4a4792012-02-23 23:10:27 +000091 statistics.metric_hit('code_notrun',valobj)
92 else:
Enrico Granatacfdafa32012-03-05 19:56:33 +000093 wrapper = NSUnknownException_SummaryProvider(valobj, class_data.sys_params)
Enrico Granataa7daeeb2012-03-30 00:51:12 +000094 statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
Enrico Granataeb4a4792012-02-23 23:10:27 +000095 return wrapper;
96
97def NSException_SummaryProvider (valobj,dict):
Enrico Granata28399ad2012-04-25 01:39:27 +000098 logger = lldb.formatters.Logger.Logger()
Enrico Granataeb4a4792012-02-23 23:10:27 +000099 provider = GetSummary_Impl(valobj);
100 if provider != None:
Enrico Granata7d222212012-04-25 17:53:41 +0000101 if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
Enrico Granata3f1052b2012-03-13 21:52:00 +0000102 return provider.message()
103 try:
104 summary = provider.description();
105 except:
106 summary = None
Enrico Granata247bd412012-04-02 16:39:29 +0000107 logger >> "got summary " + str(summary)
Enrico Granata3f1052b2012-03-13 21:52:00 +0000108 if summary == None:
109 summary = '<variable is not NSException>'
110 return str(summary)
111 return 'Summary Unavailable'
Enrico Granataeb4a4792012-02-23 23:10:27 +0000112
113def __lldb_init_module(debugger,dict):
114 debugger.HandleCommand("type summary add -F NSException.NSException_SummaryProvider NSException")