NSNotification.py revision 8f18240a09893310c43673901d863892ae7b0611
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 NSNotification 9b370df27c76fd875f3312be487868528121a4838Enrico Granataimport objc_runtime 10b370df27c76fd875f3312be487868528121a4838Enrico Granataimport metrics 11b370df27c76fd875f3312be487868528121a4838Enrico Granataimport CFString 12b370df27c76fd875f3312be487868528121a4838Enrico Granataimport lldb 138f18240a09893310c43673901d863892ae7b0611Enrico Granataimport Logger 14b370df27c76fd875f3312be487868528121a4838Enrico Granata 15b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics = 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 NSConcreteNotification_SummaryProvider: 22b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 23f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 24b370df27c76fd875f3312be487868528121a4838Enrico Granata 25f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 268f18240a09893310c43673901d863892ae7b0611Enrico Granata logger = Logger.Logger() 27b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 28092f71fca36e29031da906e26bda1a28d5595e8cEnrico 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): 348f18240a09893310c43673901d863892ae7b0611Enrico Granata logger = Logger.Logger() 35b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 36b370df27c76fd875f3312be487868528121a4838Enrico Granata 37b370df27c76fd875f3312be487868528121a4838Enrico Granata # skip the ISA and go to the name pointer 38b370df27c76fd875f3312be487868528121a4838Enrico Granata def offset(self): 398f18240a09893310c43673901d863892ae7b0611Enrico Granata logger = Logger.Logger() 40f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return self.sys_params.pointer_size 41092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata 42b370df27c76fd875f3312be487868528121a4838Enrico Granata def name(self): 438f18240a09893310c43673901d863892ae7b0611Enrico Granata logger = Logger.Logger() 44b370df27c76fd875f3312be487868528121a4838Enrico Granata string_ptr = self.valobj.CreateChildAtOffset("name", 45b370df27c76fd875f3312be487868528121a4838Enrico Granata self.offset(), 46f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.id) 47b370df27c76fd875f3312be487868528121a4838Enrico Granata return CFString.CFString_SummaryProvider(string_ptr,None) 48b370df27c76fd875f3312be487868528121a4838Enrico Granata 49b370df27c76fd875f3312be487868528121a4838Enrico Granata 50b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSNotificationUnknown_SummaryProvider: 51b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 52f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 53b370df27c76fd875f3312be487868528121a4838Enrico Granata 54f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 558f18240a09893310c43673901d863892ae7b0611Enrico Granata logger = Logger.Logger() 56b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 57f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 58b370df27c76fd875f3312be487868528121a4838Enrico Granata self.update() 59b370df27c76fd875f3312be487868528121a4838Enrico Granata 60b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 618f18240a09893310c43673901d863892ae7b0611Enrico Granata logger = Logger.Logger() 62b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 63b370df27c76fd875f3312be487868528121a4838Enrico Granata 64b370df27c76fd875f3312be487868528121a4838Enrico Granata def name(self): 658f18240a09893310c43673901d863892ae7b0611Enrico Granata logger = Logger.Logger() 66b370df27c76fd875f3312be487868528121a4838Enrico Granata stream = lldb.SBStream() 67b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj.GetExpressionPath(stream) 68579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]") 69579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if name_vo.IsValid(): 70579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return CFString.CFString_SummaryProvider(name_vo,None) 71579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return '<variable is not NSNotification>' 72b370df27c76fd875f3312be487868528121a4838Enrico Granata 73b370df27c76fd875f3312be487868528121a4838Enrico Granata 74b370df27c76fd875f3312be487868528121a4838Enrico Granatadef GetSummary_Impl(valobj): 758f18240a09893310c43673901d863892ae7b0611Enrico Granata logger = Logger.Logger() 76b370df27c76fd875f3312be487868528121a4838Enrico Granata global statistics 77579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) 78579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if wrapper: 79579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return wrapper 80b370df27c76fd875f3312be487868528121a4838Enrico Granata 81b370df27c76fd875f3312be487868528121a4838Enrico Granata name_string = class_data.class_name() 828f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "class name is: " + str(name_string) 838f18240a09893310c43673901d863892ae7b0611Enrico Granata 84b370df27c76fd875f3312be487868528121a4838Enrico Granata if name_string == 'NSConcreteNotification': 85092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata wrapper = NSConcreteNotification_SummaryProvider(valobj, class_data.sys_params) 86b370df27c76fd875f3312be487868528121a4838Enrico Granata statistics.metric_hit('code_notrun',valobj) 87b370df27c76fd875f3312be487868528121a4838Enrico Granata else: 88092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata wrapper = NSNotificationUnknown_SummaryProvider(valobj, class_data.sys_params) 89805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string) 90b370df27c76fd875f3312be487868528121a4838Enrico Granata return wrapper; 91b370df27c76fd875f3312be487868528121a4838Enrico Granata 92b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSNotification_SummaryProvider (valobj,dict): 938f18240a09893310c43673901d863892ae7b0611Enrico Granata logger = Logger.Logger() 94b370df27c76fd875f3312be487868528121a4838Enrico Granata provider = GetSummary_Impl(valobj); 95b370df27c76fd875f3312be487868528121a4838Enrico Granata if provider != None: 96579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if isinstance(provider,objc_runtime.SpecialSituation_Description): 97579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return provider.message() 98579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata try: 99579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = provider.name(); 100579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata except: 101579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = None 1028f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "got summary " + str(summary) 103579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if summary == None: 104579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = '<variable is not NSNotification>' 105579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return str(summary) 106579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'Summary Unavailable' 107b370df27c76fd875f3312be487868528121a4838Enrico Granata 108b370df27c76fd875f3312be487868528121a4838Enrico Granatadef __lldb_init_module(debugger,dict): 109b370df27c76fd875f3312be487868528121a4838Enrico Granata debugger.HandleCommand("type summary add -F NSNotification.NSNotification_SummaryProvider NSNotification") 110