NSNotification.py revision 092f71fca36e29031da906e26bda1a28d5595e8c
1b370df27c76fd875f3312be487868528121a4838Enrico Granata# summary provider for class NSNotification 2b370df27c76fd875f3312be487868528121a4838Enrico Granataimport objc_runtime 3b370df27c76fd875f3312be487868528121a4838Enrico Granataimport metrics 4b370df27c76fd875f3312be487868528121a4838Enrico Granataimport CFString 5b370df27c76fd875f3312be487868528121a4838Enrico Granataimport lldb 6b370df27c76fd875f3312be487868528121a4838Enrico Granata 7b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics = metrics.Metrics() 8b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_isa') 9b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_pointer') 10b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('unknown_class') 11b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('code_notrun') 12b370df27c76fd875f3312be487868528121a4838Enrico Granata 13b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSConcreteNotification_SummaryProvider: 14b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 15f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 16b370df27c76fd875f3312be487868528121a4838Enrico Granata 17f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 18b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 19092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata self.sys_params = params 20f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not (self.sys_params.types_cache.id): 21f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.id = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID) 22b370df27c76fd875f3312be487868528121a4838Enrico Granata self.update(); 23b370df27c76fd875f3312be487868528121a4838Enrico Granata 24b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 25b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 26b370df27c76fd875f3312be487868528121a4838Enrico Granata 27b370df27c76fd875f3312be487868528121a4838Enrico Granata # skip the ISA and go to the name pointer 28b370df27c76fd875f3312be487868528121a4838Enrico Granata def offset(self): 29f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return self.sys_params.pointer_size 30092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata 31b370df27c76fd875f3312be487868528121a4838Enrico Granata def name(self): 32b370df27c76fd875f3312be487868528121a4838Enrico Granata string_ptr = self.valobj.CreateChildAtOffset("name", 33b370df27c76fd875f3312be487868528121a4838Enrico Granata self.offset(), 34f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.id) 35b370df27c76fd875f3312be487868528121a4838Enrico Granata return CFString.CFString_SummaryProvider(string_ptr,None) 36b370df27c76fd875f3312be487868528121a4838Enrico Granata 37b370df27c76fd875f3312be487868528121a4838Enrico Granata 38b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSNotificationUnknown_SummaryProvider: 39b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 40f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 41b370df27c76fd875f3312be487868528121a4838Enrico Granata 42f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 43b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 44f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 45b370df27c76fd875f3312be487868528121a4838Enrico Granata self.update() 46b370df27c76fd875f3312be487868528121a4838Enrico Granata 47b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 48b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 49b370df27c76fd875f3312be487868528121a4838Enrico Granata 50b370df27c76fd875f3312be487868528121a4838Enrico Granata def name(self): 51b370df27c76fd875f3312be487868528121a4838Enrico Granata stream = lldb.SBStream() 52b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj.GetExpressionPath(stream) 53b370df27c76fd875f3312be487868528121a4838Enrico Granata name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]"); 54b370df27c76fd875f3312be487868528121a4838Enrico Granata return CFString.CFString_SummaryProvider(name_vo,None) 55b370df27c76fd875f3312be487868528121a4838Enrico Granata 56b370df27c76fd875f3312be487868528121a4838Enrico Granata 57b370df27c76fd875f3312be487868528121a4838Enrico Granatadef GetSummary_Impl(valobj): 58b370df27c76fd875f3312be487868528121a4838Enrico Granata global statistics 59b370df27c76fd875f3312be487868528121a4838Enrico Granata class_data = objc_runtime.ObjCRuntime(valobj) 60b370df27c76fd875f3312be487868528121a4838Enrico Granata if class_data.is_valid() == False: 61b370df27c76fd875f3312be487868528121a4838Enrico Granata statistics.metric_hit('invalid_pointer',valobj) 62b370df27c76fd875f3312be487868528121a4838Enrico Granata wrapper = None 63b370df27c76fd875f3312be487868528121a4838Enrico Granata return 64b370df27c76fd875f3312be487868528121a4838Enrico Granata class_data = class_data.read_class_data() 65b370df27c76fd875f3312be487868528121a4838Enrico Granata if class_data.is_valid() == False: 66b370df27c76fd875f3312be487868528121a4838Enrico Granata statistics.metric_hit('invalid_isa',valobj) 67b370df27c76fd875f3312be487868528121a4838Enrico Granata wrapper = None 68b370df27c76fd875f3312be487868528121a4838Enrico Granata return 69b370df27c76fd875f3312be487868528121a4838Enrico Granata if class_data.is_kvo(): 70b370df27c76fd875f3312be487868528121a4838Enrico Granata class_data = class_data.get_superclass() 71b370df27c76fd875f3312be487868528121a4838Enrico Granata if class_data.is_valid() == False: 72b370df27c76fd875f3312be487868528121a4838Enrico Granata statistics.metric_hit('invalid_isa',valobj) 73b370df27c76fd875f3312be487868528121a4838Enrico Granata wrapper = None 74b370df27c76fd875f3312be487868528121a4838Enrico Granata return 75b370df27c76fd875f3312be487868528121a4838Enrico Granata 76b370df27c76fd875f3312be487868528121a4838Enrico Granata name_string = class_data.class_name() 77b370df27c76fd875f3312be487868528121a4838Enrico Granata if name_string == 'NSConcreteNotification': 78092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata wrapper = NSConcreteNotification_SummaryProvider(valobj, class_data.sys_params) 79b370df27c76fd875f3312be487868528121a4838Enrico Granata statistics.metric_hit('code_notrun',valobj) 80b370df27c76fd875f3312be487868528121a4838Enrico Granata else: 81092f71fca36e29031da906e26bda1a28d5595e8cEnrico Granata wrapper = NSNotificationUnknown_SummaryProvider(valobj, class_data.sys_params) 82b370df27c76fd875f3312be487868528121a4838Enrico Granata statistics.metric_hit('unknown_class',str(valobj) + " seen as " + name_string) 83b370df27c76fd875f3312be487868528121a4838Enrico Granata return wrapper; 84b370df27c76fd875f3312be487868528121a4838Enrico Granata 85b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSNotification_SummaryProvider (valobj,dict): 86b370df27c76fd875f3312be487868528121a4838Enrico Granata provider = GetSummary_Impl(valobj); 87b370df27c76fd875f3312be487868528121a4838Enrico Granata if provider != None: 88b370df27c76fd875f3312be487868528121a4838Enrico Granata try: 89b370df27c76fd875f3312be487868528121a4838Enrico Granata summary = provider.name(); 90b370df27c76fd875f3312be487868528121a4838Enrico Granata except: 91b370df27c76fd875f3312be487868528121a4838Enrico Granata summary = None 92b370df27c76fd875f3312be487868528121a4838Enrico Granata if summary == None: 93b370df27c76fd875f3312be487868528121a4838Enrico Granata summary = 'no valid notification here' 94b370df27c76fd875f3312be487868528121a4838Enrico Granata return str(summary) 95b370df27c76fd875f3312be487868528121a4838Enrico Granata return '' 96b370df27c76fd875f3312be487868528121a4838Enrico Granata 97b370df27c76fd875f3312be487868528121a4838Enrico Granatadef __lldb_init_module(debugger,dict): 98b370df27c76fd875f3312be487868528121a4838Enrico Granata debugger.HandleCommand("type summary add -F NSNotification.NSNotification_SummaryProvider NSNotification") 99