NSDate.py revision c630f31ca7e5846eb932fcdad39a0d466feb7a66
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""" 81328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# summary provider for NSDate 91328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport lldb 101328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport ctypes 110d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.runtime.objc.objc_runtime 120d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.metrics 131328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport struct 141328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport time 151328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataimport datetime 1686fcb16c848b7503b2d082158886359ef76f1a84Enrico Granataimport CFString 170d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.Logger 181328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 190d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granatastatistics = lldb.formatters.metrics.Metrics() 201328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('invalid_isa') 211328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('invalid_pointer') 221328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('unknown_class') 231328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatastatistics.add_metric('code_notrun') 241328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 251328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# Python promises to start counting time at midnight on Jan 1st on the epoch year 261328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# hence, all we need to know is the epoch year 271328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatapython_epoch = time.gmtime(0).tm_year 281328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 291328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataosx_epoch = datetime.date(2001,1,1).timetuple() 301328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 311328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef mkgmtime(t): 320d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 338f18240a09893310c43673901d863892ae7b0611Enrico Granata return time.mktime(t)-time.timezone 341328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 351328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataosx_epoch = mkgmtime(osx_epoch) 361328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 371328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef osx_to_python_time(osx): 380d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 3983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata if python_epoch <= 2001: 401328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata return osx + osx_epoch 411328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata else: 421328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata return osx - osx_epoch 431328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 447b9aacf4a454465af905e505f74245173714b23bEnrico Granata# represent a struct_time as a string in the format used by Xcode 457b9aacf4a454465af905e505f74245173714b23bEnrico Granatadef xcode_format_time(X): 460d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 477b9aacf4a454465af905e505f74245173714b23bEnrico Granata return time.strftime('%Y-%m-%d %H:%M:%S %Z',X) 487b9aacf4a454465af905e505f74245173714b23bEnrico Granata 497b9aacf4a454465af905e505f74245173714b23bEnrico Granata# represent a count-since-epoch as a string in the format used by Xcode 507b9aacf4a454465af905e505f74245173714b23bEnrico Granatadef xcode_format_count(X): 510d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 527b9aacf4a454465af905e505f74245173714b23bEnrico Granata return xcode_format_time(time.localtime(X)) 531328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 541328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# despite the similary to synthetic children providers, these classes are not 5583410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata# trying to provide anything but the summary for NSDate, so they need not 561328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata# obey the interface specification for synthetic children providers 571328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataclass NSTaggedDate_SummaryProvider: 581328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def adjust_for_architecture(self): 59f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 601328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 61f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, info_bits, data, params): 620d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 631328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.valobj = valobj; 64f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 651328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.update(); 6683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata # NSDate is not using its info_bits for info like NSNumber is 6783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata # so we need to regroup info_bits and data 6883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.data = ((data << 8) | (info_bits << 4)) 691328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 701328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def update(self): 710d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 721328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.adjust_for_architecture(); 731328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 741328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def value(self): 750d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 761328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata # the value of the date-time object is wrapped into the pointer value 7783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata # unfortunately, it is made as a time-delta after Jan 1 2001 midnight GMT 781328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata # while all Python knows about is the "epoch", which is a platform-dependent 791328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata # year (1970 of *nix) whose Jan 1 at midnight is taken as reference 8083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata value_double = struct.unpack('d', struct.pack('Q', self.data))[0] 81c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata if value_double == -63114076800.0: 82c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata return '0001-12-30 00:00:00 +0000' 837b9aacf4a454465af905e505f74245173714b23bEnrico Granata return xcode_format_count(osx_to_python_time(value_double)) 841328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 851328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 861328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataclass NSUntaggedDate_SummaryProvider: 871328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def adjust_for_architecture(self): 88f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 891328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 90f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 910d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 921328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.valobj = valobj; 93f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 94f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not (self.sys_params.types_cache.double): 95f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.double = self.valobj.GetType().GetBasicType(lldb.eBasicTypeDouble) 961328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.update() 971328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 981328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def update(self): 990d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 1001328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.adjust_for_architecture(); 1011328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 1021328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def offset(self): 1030d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 104f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return self.sys_params.pointer_size 1051328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 1061328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def value(self): 1070d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 1081328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata value = self.valobj.CreateChildAtOffset("value", 1091328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.offset(), 110f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.double) 1111328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata value_double = struct.unpack('d', struct.pack('Q', value.GetValueAsUnsigned(0)))[0] 112c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata if value_double == -63114076800.0: 113c630f31ca7e5846eb932fcdad39a0d466feb7a66Enrico Granata return '0001-12-30 00:00:00 +0000' 1147b9aacf4a454465af905e505f74245173714b23bEnrico Granata return xcode_format_count(osx_to_python_time(value_double)) 1151328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 11683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granataclass NSCalendarDate_SummaryProvider: 11783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata def adjust_for_architecture(self): 118f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 11983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 120f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 1210d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 12283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.valobj = valobj; 123f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 124f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not (self.sys_params.types_cache.double): 125f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.double = self.valobj.GetType().GetBasicType(lldb.eBasicTypeDouble) 12683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.update() 12783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 12883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata def update(self): 1290d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 13083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.adjust_for_architecture(); 13183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 13283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata def offset(self): 1330d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 134f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return 2*self.sys_params.pointer_size 13583410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 13683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata def value(self): 1370d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 13883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata value = self.valobj.CreateChildAtOffset("value", 13983410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata self.offset(), 140f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.double) 14183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata value_double = struct.unpack('d', struct.pack('Q', value.GetValueAsUnsigned(0)))[0] 1427b9aacf4a454465af905e505f74245173714b23bEnrico Granata return xcode_format_count(osx_to_python_time(value_double)) 14383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 14486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granataclass NSTimeZoneClass_SummaryProvider: 14586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata def adjust_for_architecture(self): 146f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 14786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata 148f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 1490d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 15086fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata self.valobj = valobj; 151f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 152f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not (self.sys_params.types_cache.voidptr): 153f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.voidptr = self.valobj.GetType().GetBasicType(lldb.eBasicTypeVoid).GetPointerType() 15486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata self.update() 15586fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata 15686fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata def update(self): 1570d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 15886fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata self.adjust_for_architecture(); 15986fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata 16086fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata def offset(self): 1610d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 162f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata return self.sys_params.pointer_size 16386fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata 16486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata def timezone(self): 1650d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 16686fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata tz_string = self.valobj.CreateChildAtOffset("tz_name", 16786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata self.offset(), 168f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.voidptr) 16986fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata return CFString.CFString_SummaryProvider(tz_string,None) 17083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 1711328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granataclass NSUnknownDate_SummaryProvider: 1721328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def adjust_for_architecture(self): 173f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 1741328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 1751328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def __init__(self, valobj): 1760d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 1771328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.valobj = valobj; 1781328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.update() 1791328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 1801328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def update(self): 1810d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 1821328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.adjust_for_architecture(); 1831328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 1841328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata def value(self): 1850d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 1861328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata stream = lldb.SBStream() 1871328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata self.valobj.GetExpressionPath(stream) 1881328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata expr = "(NSString*)[" + stream.GetData() + " description]" 1891328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata num_children_vo = self.valobj.CreateValueFromExpression("str",expr); 190579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if num_children_vo.IsValid(): 191579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return num_children_vo.GetSummary() 192579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return '<variable is not NSDate>' 1931328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 1941328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef GetSummary_Impl(valobj): 1950d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 1961328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata global statistics 197a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics) 198579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if wrapper: 199579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return wrapper 2001328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 2011328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata name_string = class_data.class_name() 2028f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "class name is: " + str(name_string) 2038f18240a09893310c43673901d863892ae7b0611Enrico Granata 2041328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata if name_string == 'NSDate' or name_string == '__NSDate' or name_string == '__NSTaggedDate': 2051328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata if class_data.is_tagged(): 206f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSTaggedDate_SummaryProvider(valobj,class_data.info_bits(),class_data.value(), class_data.sys_params) 2071328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata statistics.metric_hit('code_notrun',valobj) 2081328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata else: 209f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSUntaggedDate_SummaryProvider(valobj, class_data.sys_params) 2101328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata statistics.metric_hit('code_notrun',valobj) 21183410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata elif name_string == 'NSCalendarDate': 212f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSCalendarDate_SummaryProvider(valobj, class_data.sys_params) 21383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata statistics.metric_hit('code_notrun',valobj) 21486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata elif name_string == '__NSTimeZone': 215f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSTimeZoneClass_SummaryProvider(valobj, class_data.sys_params) 21686fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata statistics.metric_hit('code_notrun',valobj) 2171328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata else: 218ce035a0ad0a6d6f07c1acdc38bdab02a327052c1Enrico Granata wrapper = NSUnknownDate_SummaryProvider(valobj) 219805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string) 2201328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata return wrapper; 2211328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 2221328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 2231328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef NSDate_SummaryProvider (valobj,dict): 2240d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 2251328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata provider = GetSummary_Impl(valobj); 2261328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata if provider != None: 227a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description): 228579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return provider.message() 229579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata try: 230579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = provider.value(); 231579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata except: 232579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = None 233579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if summary == None: 234579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = '<variable is not NSDate>' 235579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return str(summary) 236579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'Summary Unavailable' 2371328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 23886fcb16c848b7503b2d082158886359ef76f1a84Enrico Granatadef NSTimeZone_SummaryProvider (valobj,dict): 2390d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 24086fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata provider = GetSummary_Impl(valobj); 24186fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata if provider != None: 242a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description): 243579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return provider.message() 244579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata try: 245579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = provider.timezone(); 246579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata except: 247579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = None 2488f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "got summary " + str(summary) 249579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if summary == None: 250579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = '<variable is not NSTimeZone>' 251579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return str(summary) 252579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'Summary Unavailable' 25386fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata 25486fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata 25583410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granatadef CFAbsoluteTime_SummaryProvider (valobj,dict): 2560d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 25783410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata try: 25883410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata value_double = struct.unpack('d', struct.pack('Q', valobj.GetValueAsUnsigned(0)))[0] 2597b9aacf4a454465af905e505f74245173714b23bEnrico Granata return xcode_format_count(osx_to_python_time(value_double)) 26083410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata except: 261579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'Summary Unavailable' 26283410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata 2631328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 2641328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granatadef __lldb_init_module(debugger,dict): 2651328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata debugger.HandleCommand("type summary add -F NSDate.NSDate_SummaryProvider NSDate") 26683410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata debugger.HandleCommand("type summary add -F NSDate.CFAbsoluteTime_SummaryProvider CFAbsoluteTime") 26786fcb16c848b7503b2d082158886359ef76f1a84Enrico Granata debugger.HandleCommand("type summary add -F NSDate.NSTimeZone_SummaryProvider NSTimeZone CFTimeZoneRef") 2681328b1410eb0f5e03c3b3ee302e9adca3e1b0361Enrico Granata 269