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""" 8cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata# example summary provider for NSDate 9cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata# the real summary is now C++ code built into LLDB 101328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport lldb 111328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport ctypes 120d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.runtime.objc.objc_runtime 130d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.metrics 141328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport struct 151328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport time 161328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport datetime 1786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granataimport CFString 180d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.Logger 191328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 200d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granatastatistics = lldb.formatters.metrics.Metrics() 211328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('invalid_isa') 221328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('invalid_pointer') 231328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('unknown_class') 241328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('code_notrun') 251328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 261328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# Python promises to start counting time at midnight on Jan 1st on the epoch year 271328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# hence, all we need to know is the epoch year 281328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatapython_epoch = time.gmtime(0).tm_year 291328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 301328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataosx_epoch = datetime.date(2001,1,1).timetuple() 311328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 321328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef mkgmtime(t): 330d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 348f18240a09893310c43673901d863892ae7b0611Enrico Granata return time.mktime(t)-time.timezone 351328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 361328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataosx_epoch = mkgmtime(osx_epoch) 371328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 381328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef osx_to_python_time(osx): 390d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 4083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata if python_epoch <= 2001: 411328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata return osx + osx_epoch 421328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata else: 431328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata return osx - osx_epoch 441328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 457b9aacf4a454465af905e505f74245173714b23bEnrico Granata# represent a struct_time as a string in the format used by Xcode 467b9aacf4a454465af905e505f74245173714b23bEnrico Granatadef xcode_format_time(X): 470d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 487b9aacf4a454465af905e505f74245173714b23bEnrico Granata return time.strftime('%Y-%m-%d %H:%M:%S %Z',X) 497b9aacf4a454465af905e505f74245173714b23bEnrico Granata 507b9aacf4a454465af905e505f74245173714b23bEnrico Granata# represent a count-since-epoch as a string in the format used by Xcode 517b9aacf4a454465af905e505f74245173714b23bEnrico Granatadef xcode_format_count(X): 520d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 537b9aacf4a454465af905e505f74245173714b23bEnrico Granata return xcode_format_time(time.localtime(X)) 541328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 551328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# despite the similary to synthetic children providers, these classes are not 5683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata# trying to provide anything but the summary for NSDate, so they need not 571328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# obey the interface specification for synthetic children providers 581328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataclass NSTaggedDate_SummaryProvider: 591328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def adjust_for_architecture(self): 60f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 611328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 62f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, info_bits, data, params): 630d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 641328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.valobj = valobj; 65f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 661328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.update(); 6783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata # NSDate is not using its info_bits for info like NSNumber is 6883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata # so we need to regroup info_bits and data 6983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.data = ((data << 8) | (info_bits << 4)) 701328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 711328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def update(self): 720d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 731328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.adjust_for_architecture(); 741328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 751328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def value(self): 760d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 771328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata # the value of the date-time object is wrapped into the pointer value 7883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata # unfortunately, it is made as a time-delta after Jan 1 2001 midnight GMT 791328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata # while all Python knows about is the "epoch", which is a platform-dependent 801328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata # year (1970 of *nix) whose Jan 1 at midnight is taken as reference 8183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata value_double = struct.unpack('d', struct.pack('Q', self.data))[0] 82c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata if value_double == -63114076800.0: 83c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata return '0001-12-30 00:00:00 +0000' 847b9aacf4a454465af905e505f74245173714b23bEnrico Granata return xcode_format_count(osx_to_python_time(value_double)) 851328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 861328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 871328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataclass NSUntaggedDate_SummaryProvider: 881328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def adjust_for_architecture(self): 89f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 901328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 91f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 920d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 931328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.valobj = valobj; 94f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 95f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not (self.sys_params.types_cache.double): 96f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.double = self.valobj.GetType().GetBasicType(lldb.eBasicTypeDouble) 971328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.update() 981328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 991328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def update(self): 1000d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 1011328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.adjust_for_architecture(); 1021328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 1031328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def offset(self): 1040d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 105f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return self.sys_params.pointer_size 1061328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 1071328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def value(self): 1080d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 1091328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata value = self.valobj.CreateChildAtOffset("value", 1101328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.offset(), 111f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.double) 11282ad7ca1423d998c6229899fed47464f61b86311Enrico Granata value_double = struct.unpack('d', struct.pack('Q', value.GetData().uint64[0]))[0] 113c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata if value_double == -63114076800.0: 114c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata return '0001-12-30 00:00:00 +0000' 1157b9aacf4a454465af905e505f74245173714b23bEnrico Granata return xcode_format_count(osx_to_python_time(value_double)) 1161328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 11783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granataclass NSCalendarDate_SummaryProvider: 11883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata def adjust_for_architecture(self): 119f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 12083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 121f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 1220d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 12383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.valobj = valobj; 124f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 125f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not (self.sys_params.types_cache.double): 126f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.double = self.valobj.GetType().GetBasicType(lldb.eBasicTypeDouble) 12783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.update() 12883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 12983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata def update(self): 1300d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 13183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.adjust_for_architecture(); 13283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 13383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata def offset(self): 1340d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 135f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return 2*self.sys_params.pointer_size 13683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 13783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata def value(self): 1380d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 13983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata value = self.valobj.CreateChildAtOffset("value", 14083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.offset(), 141f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.double) 14282ad7ca1423d998c6229899fed47464f61b86311Enrico Granata value_double = struct.unpack('d', struct.pack('Q', value.GetData().uint64[0]))[0] 1437b9aacf4a454465af905e505f74245173714b23bEnrico Granata return xcode_format_count(osx_to_python_time(value_double)) 14483410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 14586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granataclass NSTimeZoneClass_SummaryProvider: 14686fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata def adjust_for_architecture(self): 147f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 14886fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata 149f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 1500d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 15186fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata self.valobj = valobj; 152f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 153f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not (self.sys_params.types_cache.voidptr): 154f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.voidptr = self.valobj.GetType().GetBasicType(lldb.eBasicTypeVoid).GetPointerType() 15586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata self.update() 15686fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata 15786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata def update(self): 1580d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 15986fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata self.adjust_for_architecture(); 16086fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata 16186fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata def offset(self): 1620d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 163f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return self.sys_params.pointer_size 16486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata 16586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata def timezone(self): 1660d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 16786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata tz_string = self.valobj.CreateChildAtOffset("tz_name", 16886fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata self.offset(), 169f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.voidptr) 17086fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata return CFString.CFString_SummaryProvider(tz_string,None) 17183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 1721328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataclass NSUnknownDate_SummaryProvider: 1731328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def adjust_for_architecture(self): 174f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 1751328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 1761328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def __init__(self, valobj): 1770d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 1781328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.valobj = valobj; 1791328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.update() 1801328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 1811328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def update(self): 1820d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 1831328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.adjust_for_architecture(); 1841328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 1851328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def value(self): 1860d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 1871328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata stream = lldb.SBStream() 1881328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.valobj.GetExpressionPath(stream) 1891328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata expr = "(NSString*)[" + stream.GetData() + " description]" 1901328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata num_children_vo = self.valobj.CreateValueFromExpression("str",expr); 191579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if num_children_vo.IsValid(): 192579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return num_children_vo.GetSummary() 193579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return '<variable is not NSDate>' 1941328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 1951328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef GetSummary_Impl(valobj): 1960d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 1971328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata global statistics 198a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics) 199579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if wrapper: 200579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return wrapper 2011328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 2021328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata name_string = class_data.class_name() 2038f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "class name is: " + str(name_string) 2048f18240a09893310c43673901d863892ae7b0611Enrico Granata 2051328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata if name_string == 'NSDate' or name_string == '__NSDate' or name_string == '__NSTaggedDate': 2061328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata if class_data.is_tagged(): 207f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSTaggedDate_SummaryProvider(valobj,class_data.info_bits(),class_data.value(), class_data.sys_params) 2081328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata statistics.metric_hit('code_notrun',valobj) 2091328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata else: 210f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSUntaggedDate_SummaryProvider(valobj, class_data.sys_params) 2111328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata statistics.metric_hit('code_notrun',valobj) 21283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata elif name_string == 'NSCalendarDate': 213f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSCalendarDate_SummaryProvider(valobj, class_data.sys_params) 21483410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata statistics.metric_hit('code_notrun',valobj) 21586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata elif name_string == '__NSTimeZone': 216f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSTimeZoneClass_SummaryProvider(valobj, class_data.sys_params) 21786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata statistics.metric_hit('code_notrun',valobj) 2181328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata else: 219ce035a0ad0a6d6f07c1acdc38bdab02a327052c1Enrico Granata wrapper = NSUnknownDate_SummaryProvider(valobj) 220805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string) 2211328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata return wrapper; 2221328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 2231328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 2241328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef NSDate_SummaryProvider (valobj,dict): 2250d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 2261328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata provider = GetSummary_Impl(valobj); 2271328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata if provider != None: 228a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description): 229579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return provider.message() 230579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata try: 231579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = provider.value(); 232579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata except: 233579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = None 234579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if summary == None: 235579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = '<variable is not NSDate>' 236579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return str(summary) 237579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'Summary Unavailable' 2381328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 23986fcb16c848b7503b2d082158886359ef76f1a84Enrico Granatadef NSTimeZone_SummaryProvider (valobj,dict): 2400d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 24186fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata provider = GetSummary_Impl(valobj); 24286fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata if provider != None: 243a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description): 244579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return provider.message() 245579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata try: 246579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = provider.timezone(); 247579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata except: 248579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = None 2498f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "got summary " + str(summary) 250579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if summary == None: 251579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = '<variable is not NSTimeZone>' 252579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return str(summary) 253579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'Summary Unavailable' 25486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata 25586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata 25683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granatadef CFAbsoluteTime_SummaryProvider (valobj,dict): 2570d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 25883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata try: 25982ad7ca1423d998c6229899fed47464f61b86311Enrico Granata value_double = struct.unpack('d', struct.pack('Q', valobj.GetData().uint64[0]))[0] 2607b9aacf4a454465af905e505f74245173714b23bEnrico Granata return xcode_format_count(osx_to_python_time(value_double)) 26183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata except: 262579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'Summary Unavailable' 26383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 2641328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 2651328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef __lldb_init_module(debugger,dict): 2661328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata debugger.HandleCommand("type summary add -F NSDate.NSDate_SummaryProvider NSDate") 26783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata debugger.HandleCommand("type summary add -F NSDate.CFAbsoluteTime_SummaryProvider CFAbsoluteTime") 26886fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata debugger.HandleCommand("type summary add -F NSDate.NSTimeZone_SummaryProvider NSTimeZone CFTimeZoneRef") 2691328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 270