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""" 8dc1df6b2fd7d359753b2bcfcf2decb114f465a1dEnrico Granata# example summary provider for NSNotification 9dc1df6b2fd7d359753b2bcfcf2decb114f465a1dEnrico Granata# the real summary is now C++ code built into LLDB 100d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.runtime.objc.objc_runtime 110d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.metrics 12b370df27c76fd875f3312be487868528121a4838Enrico Granataimport CFString 13b370df27c76fd875f3312be487868528121a4838Enrico Granataimport lldb 140d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.Logger 15b370df27c76fd875f3312be487868528121a4838Enrico Granata 160d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granatastatistics = lldb.formatters.metrics.Metrics() 17b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_isa') 18b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_pointer') 19b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('unknown_class') 20b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('code_notrun') 21b370df27c76fd875f3312be487868528121a4838Enrico Granata 22b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSConcreteNotification_SummaryProvider: 23b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 24f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 25b370df27c76fd875f3312be487868528121a4838Enrico Granata 26f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 270d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 28b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 29092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata self.sys_params = params 30f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not (self.sys_params.types_cache.id): 31f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.id = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID) 32b370df27c76fd875f3312be487868528121a4838Enrico Granata self.update(); 33b370df27c76fd875f3312be487868528121a4838Enrico Granata 34b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 350d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 36b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 37b370df27c76fd875f3312be487868528121a4838Enrico Granata 38b370df27c76fd875f3312be487868528121a4838Enrico Granata # skip the ISA and go to the name pointer 39b370df27c76fd875f3312be487868528121a4838Enrico Granata def offset(self): 400d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 41f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return self.sys_params.pointer_size 42092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata 43b370df27c76fd875f3312be487868528121a4838Enrico Granata def name(self): 440d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 45b370df27c76fd875f3312be487868528121a4838Enrico Granata string_ptr = self.valobj.CreateChildAtOffset("name", 46b370df27c76fd875f3312be487868528121a4838Enrico Granata self.offset(), 47f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.id) 48b370df27c76fd875f3312be487868528121a4838Enrico Granata return CFString.CFString_SummaryProvider(string_ptr,None) 49b370df27c76fd875f3312be487868528121a4838Enrico Granata 50b370df27c76fd875f3312be487868528121a4838Enrico Granata 51b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSNotificationUnknown_SummaryProvider: 52b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 53f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 54b370df27c76fd875f3312be487868528121a4838Enrico Granata 55f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 560d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 57b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 58f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 59b370df27c76fd875f3312be487868528121a4838Enrico Granata self.update() 60b370df27c76fd875f3312be487868528121a4838Enrico Granata 61b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 620d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 63b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 64b370df27c76fd875f3312be487868528121a4838Enrico Granata 65b370df27c76fd875f3312be487868528121a4838Enrico Granata def name(self): 660d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 67b370df27c76fd875f3312be487868528121a4838Enrico Granata stream = lldb.SBStream() 68b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj.GetExpressionPath(stream) 69579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]") 70579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if name_vo.IsValid(): 71579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return CFString.CFString_SummaryProvider(name_vo,None) 72579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return '<variable is not NSNotification>' 73b370df27c76fd875f3312be487868528121a4838Enrico Granata 74b370df27c76fd875f3312be487868528121a4838Enrico Granata 75b370df27c76fd875f3312be487868528121a4838Enrico Granatadef GetSummary_Impl(valobj): 760d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 77b370df27c76fd875f3312be487868528121a4838Enrico Granata global statistics 78a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics) 79579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if wrapper: 80579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return wrapper 81b370df27c76fd875f3312be487868528121a4838Enrico Granata 82b370df27c76fd875f3312be487868528121a4838Enrico Granata name_string = class_data.class_name() 838f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "class name is: " + str(name_string) 848f18240a09893310c43673901d863892ae7b0611Enrico Granata 85b370df27c76fd875f3312be487868528121a4838Enrico Granata if name_string == 'NSConcreteNotification': 86092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata wrapper = NSConcreteNotification_SummaryProvider(valobj, class_data.sys_params) 87b370df27c76fd875f3312be487868528121a4838Enrico Granata statistics.metric_hit('code_notrun',valobj) 88b370df27c76fd875f3312be487868528121a4838Enrico Granata else: 89092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata wrapper = NSNotificationUnknown_SummaryProvider(valobj, class_data.sys_params) 90805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string) 91b370df27c76fd875f3312be487868528121a4838Enrico Granata return wrapper; 92b370df27c76fd875f3312be487868528121a4838Enrico Granata 93b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSNotification_SummaryProvider (valobj,dict): 940d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 95b370df27c76fd875f3312be487868528121a4838Enrico Granata provider = GetSummary_Impl(valobj); 96b370df27c76fd875f3312be487868528121a4838Enrico Granata if provider != None: 97a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description): 98579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return provider.message() 99579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata try: 100579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = provider.name(); 101579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata except: 102579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = None 1038f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "got summary " + str(summary) 104579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if summary == None: 105579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = '<variable is not NSNotification>' 106579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return str(summary) 107579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'Summary Unavailable' 108b370df27c76fd875f3312be487868528121a4838Enrico Granata 109b370df27c76fd875f3312be487868528121a4838Enrico Granatadef __lldb_init_module(debugger,dict): 110b370df27c76fd875f3312be487868528121a4838Enrico Granata debugger.HandleCommand("type summary add -F NSNotification.NSNotification_SummaryProvider NSNotification") 111