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 NSSet 9b370df27c76fd875f3312be487868528121a4838Enrico Granataimport lldb 10b370df27c76fd875f3312be487868528121a4838Enrico Granataimport ctypes 110d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.runtime.objc.objc_runtime 120d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.metrics 1383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granataimport CFBag 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 Granata# despite the similary to synthetic children providers, these classes are not 23b370df27c76fd875f3312be487868528121a4838Enrico Granata# trying to provide anything but the port number of an NSMachPort, so they need not 24b370df27c76fd875f3312be487868528121a4838Enrico Granata# obey the interface specification for synthetic children providers 25b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSCFSet_SummaryProvider: 26b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 27f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 28b370df27c76fd875f3312be487868528121a4838Enrico Granata 29f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 300d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 31b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 32f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 33f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not(self.sys_params.types_cache.NSUInteger): 34f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if self.sys_params.is_64_bit: 35f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong) 36f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata else: 37f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedInt) 38b370df27c76fd875f3312be487868528121a4838Enrico Granata self.update(); 39b370df27c76fd875f3312be487868528121a4838Enrico Granata 40b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 410d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 42b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 43b370df27c76fd875f3312be487868528121a4838Enrico Granata 44b370df27c76fd875f3312be487868528121a4838Enrico Granata # one pointer is the ISA 45b370df27c76fd875f3312be487868528121a4838Enrico Granata # then we have one other internal pointer, plus 46b370df27c76fd875f3312be487868528121a4838Enrico Granata # 4 bytes worth of flags. hence, these values 47b370df27c76fd875f3312be487868528121a4838Enrico Granata def offset(self): 480d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 49f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if self.sys_params.is_64_bit: 50b370df27c76fd875f3312be487868528121a4838Enrico Granata return 20 51b370df27c76fd875f3312be487868528121a4838Enrico Granata else: 52b370df27c76fd875f3312be487868528121a4838Enrico Granata return 12 53b370df27c76fd875f3312be487868528121a4838Enrico Granata 54b370df27c76fd875f3312be487868528121a4838Enrico Granata def count(self): 550d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 56b370df27c76fd875f3312be487868528121a4838Enrico Granata vcount = self.valobj.CreateChildAtOffset("count", 57b370df27c76fd875f3312be487868528121a4838Enrico Granata self.offset(), 58f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.NSUInteger) 59b370df27c76fd875f3312be487868528121a4838Enrico Granata return vcount.GetValueAsUnsigned(0) 60b370df27c76fd875f3312be487868528121a4838Enrico Granata 61b370df27c76fd875f3312be487868528121a4838Enrico Granata 62b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSSetUnknown_SummaryProvider: 63b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 64f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 65b370df27c76fd875f3312be487868528121a4838Enrico Granata 66f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 670d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 68b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 69f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 70f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.update(); 71b370df27c76fd875f3312be487868528121a4838Enrico Granata 72b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 730d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 74b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 75b370df27c76fd875f3312be487868528121a4838Enrico Granata 76b370df27c76fd875f3312be487868528121a4838Enrico Granata def count(self): 770d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 78b370df27c76fd875f3312be487868528121a4838Enrico Granata stream = lldb.SBStream() 79b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj.GetExpressionPath(stream) 80b370df27c76fd875f3312be487868528121a4838Enrico Granata expr = "(int)[" + stream.GetData() + " count]" 81579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata num_children_vo = self.valobj.CreateValueFromExpression("count",expr) 82579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if num_children_vo.IsValid(): 83579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return num_children_vo.GetValueAsUnsigned(0) 84579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return '<variable is not NSSet>' 85b370df27c76fd875f3312be487868528121a4838Enrico Granata 86b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSSetI_SummaryProvider: 87b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 88f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 89b370df27c76fd875f3312be487868528121a4838Enrico Granata 90f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 910d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 92b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 93f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 94f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not(self.sys_params.types_cache.NSUInteger): 95f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if self.sys_params.is_64_bit: 96f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong) 97f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata else: 98f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedInt) 99b370df27c76fd875f3312be487868528121a4838Enrico Granata self.update(); 100b370df27c76fd875f3312be487868528121a4838Enrico Granata 101b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 1020d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 103b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 104b370df27c76fd875f3312be487868528121a4838Enrico Granata 105b370df27c76fd875f3312be487868528121a4838Enrico Granata # we just need to skip the ISA and the count immediately follows 106b370df27c76fd875f3312be487868528121a4838Enrico Granata def offset(self): 1070d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 108f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return self.sys_params.pointer_size 109b370df27c76fd875f3312be487868528121a4838Enrico Granata 110b370df27c76fd875f3312be487868528121a4838Enrico Granata def count(self): 1110d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 112b370df27c76fd875f3312be487868528121a4838Enrico Granata num_children_vo = self.valobj.CreateChildAtOffset("count", 113b370df27c76fd875f3312be487868528121a4838Enrico Granata self.offset(), 114f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.NSUInteger) 115b370df27c76fd875f3312be487868528121a4838Enrico Granata value = num_children_vo.GetValueAsUnsigned(0) 116b370df27c76fd875f3312be487868528121a4838Enrico Granata if value != None: 117b370df27c76fd875f3312be487868528121a4838Enrico Granata # the MSB on immutable sets seems to be taken by some other data 118b370df27c76fd875f3312be487868528121a4838Enrico Granata # not sure if it is a bug or some weird sort of feature, but masking it out 119b370df27c76fd875f3312be487868528121a4838Enrico Granata # gets the count right (unless, of course, someone's dictionaries grow 120b370df27c76fd875f3312be487868528121a4838Enrico Granata # too large - but I have not tested this) 121f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if self.sys_params.is_64_bit: 122b370df27c76fd875f3312be487868528121a4838Enrico Granata value = value & ~0xFF00000000000000 123b370df27c76fd875f3312be487868528121a4838Enrico Granata else: 124b370df27c76fd875f3312be487868528121a4838Enrico Granata value = value & ~0xFF000000 125b370df27c76fd875f3312be487868528121a4838Enrico Granata return value 126b370df27c76fd875f3312be487868528121a4838Enrico Granata 127b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSSetM_SummaryProvider: 128b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 129f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 130b370df27c76fd875f3312be487868528121a4838Enrico Granata 131f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 1320d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 133b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 134f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 135f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not(self.sys_params.types_cache.NSUInteger): 136f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if self.sys_params.is_64_bit: 137f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong) 138f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata else: 139f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedInt) 140b370df27c76fd875f3312be487868528121a4838Enrico Granata self.update(); 141b370df27c76fd875f3312be487868528121a4838Enrico Granata 142b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 1430d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 144b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 145b370df27c76fd875f3312be487868528121a4838Enrico Granata 146b370df27c76fd875f3312be487868528121a4838Enrico Granata # we just need to skip the ISA and the count immediately follows 147b370df27c76fd875f3312be487868528121a4838Enrico Granata def offset(self): 1480d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 149f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return self.sys_params.pointer_size 150b370df27c76fd875f3312be487868528121a4838Enrico Granata 151b370df27c76fd875f3312be487868528121a4838Enrico Granata def count(self): 1520d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 153b370df27c76fd875f3312be487868528121a4838Enrico Granata num_children_vo = self.valobj.CreateChildAtOffset("count", 154b370df27c76fd875f3312be487868528121a4838Enrico Granata self.offset(), 155f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.NSUInteger) 156b370df27c76fd875f3312be487868528121a4838Enrico Granata return num_children_vo.GetValueAsUnsigned(0) 157b370df27c76fd875f3312be487868528121a4838Enrico Granata 158b370df27c76fd875f3312be487868528121a4838Enrico Granata 15983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granataclass NSCountedSet_SummaryProvider: 16083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata def adjust_for_architecture(self): 161f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 16283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 163f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 1640d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 16583410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.valobj = valobj; 166f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 167f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not (self.sys_params.types_cache.voidptr): 168f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.voidptr = self.valobj.GetType().GetBasicType(lldb.eBasicTypeVoid).GetPointerType() 16983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.update(); 17083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 17183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata def update(self): 1720d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 17383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.adjust_for_architecture(); 17483410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 17583410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata # an NSCountedSet is implemented using a CFBag whose pointer just follows the ISA 17683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata def offset(self): 1770d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 178f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return self.sys_params.pointer_size 17983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 18083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata def count(self): 1810d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 18283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata cfbag_vo = self.valobj.CreateChildAtOffset("bag_impl", 18383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.offset(), 184f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.voidptr) 185f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return CFBag.CFBagRef_SummaryProvider(cfbag_vo,self.sys_params).length() 18683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 18783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 188b370df27c76fd875f3312be487868528121a4838Enrico Granatadef GetSummary_Impl(valobj): 1890d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 190b370df27c76fd875f3312be487868528121a4838Enrico Granata global statistics 191a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics) 192579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if wrapper: 193579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return wrapper 194b370df27c76fd875f3312be487868528121a4838Enrico Granata 195b370df27c76fd875f3312be487868528121a4838Enrico Granata name_string = class_data.class_name() 1968f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "class name is: " + str(name_string) 1978f18240a09893310c43673901d863892ae7b0611Enrico Granata 198b370df27c76fd875f3312be487868528121a4838Enrico Granata if name_string == '__NSCFSet': 199f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSCFSet_SummaryProvider(valobj, class_data.sys_params) 200b370df27c76fd875f3312be487868528121a4838Enrico Granata statistics.metric_hit('code_notrun',valobj) 201b370df27c76fd875f3312be487868528121a4838Enrico Granata elif name_string == '__NSSetI': 202f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSSetI_SummaryProvider(valobj, class_data.sys_params) 203b370df27c76fd875f3312be487868528121a4838Enrico Granata statistics.metric_hit('code_notrun',valobj) 204b370df27c76fd875f3312be487868528121a4838Enrico Granata elif name_string == '__NSSetM': 205f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSSetM_SummaryProvider(valobj, class_data.sys_params) 206b370df27c76fd875f3312be487868528121a4838Enrico Granata statistics.metric_hit('code_notrun',valobj) 20783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata elif name_string == 'NSCountedSet': 208f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSCountedSet_SummaryProvider(valobj, class_data.sys_params) 20983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata statistics.metric_hit('code_notrun',valobj) 210b370df27c76fd875f3312be487868528121a4838Enrico Granata else: 211a58d9e75d6c3a2d02be931f1d549e68c91d10da6Enrico Granata wrapper = NSSetUnknown_SummaryProvider(valobj, class_data.sys_params) 212805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string) 213b370df27c76fd875f3312be487868528121a4838Enrico Granata return wrapper; 214b370df27c76fd875f3312be487868528121a4838Enrico Granata 215b370df27c76fd875f3312be487868528121a4838Enrico Granata 216b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSSet_SummaryProvider (valobj,dict): 2170d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 218b370df27c76fd875f3312be487868528121a4838Enrico Granata provider = GetSummary_Impl(valobj); 219b370df27c76fd875f3312be487868528121a4838Enrico Granata if provider != None: 220579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata try: 221579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = provider.count(); 222579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata except: 223579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = None 224579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if summary == None: 225579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = '<variable is not NSSet>' 226579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if isinstance(summary, basestring): 227579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return summary 228579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata else: 229579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = str(summary) + (' objects' if summary != 1 else ' object') 230579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return summary 231579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'Summary Unavailable' 232b370df27c76fd875f3312be487868528121a4838Enrico Granata 233b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSSet_SummaryProvider2 (valobj,dict): 2340d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 235b370df27c76fd875f3312be487868528121a4838Enrico Granata provider = GetSummary_Impl(valobj); 236b370df27c76fd875f3312be487868528121a4838Enrico Granata if provider != None: 237a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description): 238579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return provider.message() 239b370df27c76fd875f3312be487868528121a4838Enrico Granata try: 240b370df27c76fd875f3312be487868528121a4838Enrico Granata summary = provider.count(); 241b370df27c76fd875f3312be487868528121a4838Enrico Granata except: 242b370df27c76fd875f3312be487868528121a4838Enrico Granata summary = None 2438f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "got summary " + str(summary) 244b370df27c76fd875f3312be487868528121a4838Enrico Granata # for some reason, one needs to clear some bits for the count returned 245b370df27c76fd875f3312be487868528121a4838Enrico Granata # to be correct when using directly CF*SetRef as compared to NS*Set 246b370df27c76fd875f3312be487868528121a4838Enrico Granata # this only happens on 64bit, and the bit mask was derived through 247b370df27c76fd875f3312be487868528121a4838Enrico Granata # experimentation (if counts start looking weird, then most probably 248b370df27c76fd875f3312be487868528121a4838Enrico Granata # the mask needs to be changed) 249b370df27c76fd875f3312be487868528121a4838Enrico Granata if summary == None: 250579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = '<variable is not CFSet>' 251579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if isinstance(summary, basestring): 252579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return summary 253b370df27c76fd875f3312be487868528121a4838Enrico Granata else: 254f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if provider.sys_params.is_64_bit: 255323cec97d94bd1836e8c158e7065fdb5ad71ad48Enrico Granata summary = summary & ~0x1fff000000000000 256579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = '@"' + str(summary) + (' values"' if summary != 1 else ' value"') 257323cec97d94bd1836e8c158e7065fdb5ad71ad48Enrico Granata return summary 258579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'Summary Unavailable' 259b370df27c76fd875f3312be487868528121a4838Enrico Granata 260b370df27c76fd875f3312be487868528121a4838Enrico Granata 261b370df27c76fd875f3312be487868528121a4838Enrico Granatadef __lldb_init_module(debugger,dict): 262b370df27c76fd875f3312be487868528121a4838Enrico Granata debugger.HandleCommand("type summary add -F NSSet.NSSet_SummaryProvider NSSet") 263b370df27c76fd875f3312be487868528121a4838Enrico Granata debugger.HandleCommand("type summary add -F NSSet.NSSet_SummaryProvider2 CFSetRef CFMutableSetRef") 264