1579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata""" 2579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico GranataLLDB AppKit formatters 3579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata 4579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granatapart of The LLVM Compiler Infrastructure 5579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico GranataThis file is distributed under the University of Illinois Open Source 6579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico GranataLicense. See LICENSE.TXT for details. 7579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata""" 8b370df27c76fd875f3312be487868528121a4838Enrico Granata# summary provider for class NSException 90d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.runtime.objc.objc_runtime 100d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.metrics 11b370df27c76fd875f3312be487868528121a4838Enrico Granataimport CFString 12b370df27c76fd875f3312be487868528121a4838Enrico Granataimport lldb 130d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.Logger 14b370df27c76fd875f3312be487868528121a4838Enrico Granata 150d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granatastatistics = lldb.formatters.metrics.Metrics() 16b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_isa') 17b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_pointer') 18b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('unknown_class') 19b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('code_notrun') 20b370df27c76fd875f3312be487868528121a4838Enrico Granata 21b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSKnownException_SummaryProvider: 22b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 23f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 24b370df27c76fd875f3312be487868528121a4838Enrico Granata 25f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 260d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 27b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 28f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 29f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not (self.sys_params.types_cache.id): 30f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.id = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID) 31b370df27c76fd875f3312be487868528121a4838Enrico Granata self.update(); 32b370df27c76fd875f3312be487868528121a4838Enrico Granata 33b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 340d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 35b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 36b370df27c76fd875f3312be487868528121a4838Enrico Granata 37f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def offset_name(self): 380d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 39f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return self.sys_params.pointer_size 40f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def offset_reason(self): 410d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 42f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return 2*self.sys_params.pointer_size 43b370df27c76fd875f3312be487868528121a4838Enrico Granata 44b370df27c76fd875f3312be487868528121a4838Enrico Granata def description(self): 450d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 46b370df27c76fd875f3312be487868528121a4838Enrico Granata name_ptr = self.valobj.CreateChildAtOffset("name", 47f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.offset_name(), 48f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.id) 49b370df27c76fd875f3312be487868528121a4838Enrico Granata reason_ptr = self.valobj.CreateChildAtOffset("reason", 50f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.offset_reason(), 51f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.id) 527b9aacf4a454465af905e505f74245173714b23bEnrico Granata return 'name:' + CFString.CFString_SummaryProvider(name_ptr,None) + ' reason:' + CFString.CFString_SummaryProvider(reason_ptr,None) 53b370df27c76fd875f3312be487868528121a4838Enrico Granata 54b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSUnknownException_SummaryProvider: 55b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 56f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 57b370df27c76fd875f3312be487868528121a4838Enrico Granata 58f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 590d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 60b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 61f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 62f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.update(); 63b370df27c76fd875f3312be487868528121a4838Enrico Granata 64b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 650d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 66b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 67b370df27c76fd875f3312be487868528121a4838Enrico Granata 68b370df27c76fd875f3312be487868528121a4838Enrico Granata def description(self): 690d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 70b370df27c76fd875f3312be487868528121a4838Enrico Granata stream = lldb.SBStream() 71b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj.GetExpressionPath(stream) 72b370df27c76fd875f3312be487868528121a4838Enrico Granata name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]"); 73b370df27c76fd875f3312be487868528121a4838Enrico Granata reason_vo = self.valobj.CreateValueFromExpression("reason","(NSString*)[" + stream.GetData() + " reason]"); 74579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if name_vo.IsValid() and reason_vo.IsValid(): 75579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return CFString.CFString_SummaryProvider(name_vo,None) + ' ' + CFString.CFString_SummaryProvider(reason_vo,None) 76579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return '<variable is not NSException>' 77b370df27c76fd875f3312be487868528121a4838Enrico Granata 78b370df27c76fd875f3312be487868528121a4838Enrico Granata 79b370df27c76fd875f3312be487868528121a4838Enrico Granatadef GetSummary_Impl(valobj): 800d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 81b370df27c76fd875f3312be487868528121a4838Enrico Granata global statistics 82a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics) 83579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if wrapper: 84579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return wrapper 85b370df27c76fd875f3312be487868528121a4838Enrico Granata 86b370df27c76fd875f3312be487868528121a4838Enrico Granata name_string = class_data.class_name() 878f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "class name is: " + str(name_string) 888f18240a09893310c43673901d863892ae7b0611Enrico Granata 89b370df27c76fd875f3312be487868528121a4838Enrico Granata if name_string == 'NSException': 90f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSKnownException_SummaryProvider(valobj, class_data.sys_params) 91b370df27c76fd875f3312be487868528121a4838Enrico Granata statistics.metric_hit('code_notrun',valobj) 92b370df27c76fd875f3312be487868528121a4838Enrico Granata else: 93f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSUnknownException_SummaryProvider(valobj, class_data.sys_params) 94805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string) 95b370df27c76fd875f3312be487868528121a4838Enrico Granata return wrapper; 96b370df27c76fd875f3312be487868528121a4838Enrico Granata 97b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSException_SummaryProvider (valobj,dict): 980d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 99b370df27c76fd875f3312be487868528121a4838Enrico Granata provider = GetSummary_Impl(valobj); 100b370df27c76fd875f3312be487868528121a4838Enrico Granata if provider != None: 101a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description): 102579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return provider.message() 103579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata try: 104579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = provider.description(); 105579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata except: 106579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = None 1078f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "got summary " + str(summary) 108579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if summary == None: 109579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = '<variable is not NSException>' 110579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return str(summary) 111579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'Summary Unavailable' 112b370df27c76fd875f3312be487868528121a4838Enrico Granata 113b370df27c76fd875f3312be487868528121a4838Enrico Granatadef __lldb_init_module(debugger,dict): 114b370df27c76fd875f3312be487868528121a4838Enrico Granata debugger.HandleCommand("type summary add -F NSException.NSException_SummaryProvider NSException") 115