aboutsummaryrefslogtreecommitdiff
path: root/examples/summaries/cocoa/NSDate.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/summaries/cocoa/NSDate.py')
-rw-r--r--examples/summaries/cocoa/NSDate.py462
1 files changed, 250 insertions, 212 deletions
diff --git a/examples/summaries/cocoa/NSDate.py b/examples/summaries/cocoa/NSDate.py
index 4dd63b4a5c32..4efe76eca598 100644
--- a/examples/summaries/cocoa/NSDate.py
+++ b/examples/summaries/cocoa/NSDate.py
@@ -27,243 +27,281 @@ statistics.add_metric('code_notrun')
# hence, all we need to know is the epoch year
python_epoch = time.gmtime(0).tm_year
-osx_epoch = datetime.date(2001,1,1).timetuple()
+osx_epoch = datetime.date(2001, 1, 1).timetuple()
+
def mkgmtime(t):
- logger = lldb.formatters.Logger.Logger()
- return time.mktime(t)-time.timezone
+ logger = lldb.formatters.Logger.Logger()
+ return time.mktime(t) - time.timezone
osx_epoch = mkgmtime(osx_epoch)
+
def osx_to_python_time(osx):
- logger = lldb.formatters.Logger.Logger()
- if python_epoch <= 2001:
- return osx + osx_epoch
- else:
- return osx - osx_epoch
+ logger = lldb.formatters.Logger.Logger()
+ if python_epoch <= 2001:
+ return osx + osx_epoch
+ else:
+ return osx - osx_epoch
# represent a struct_time as a string in the format used by Xcode
+
+
def xcode_format_time(X):
- logger = lldb.formatters.Logger.Logger()
- return time.strftime('%Y-%m-%d %H:%M:%S %Z',X)
+ logger = lldb.formatters.Logger.Logger()
+ return time.strftime('%Y-%m-%d %H:%M:%S %Z', X)
# represent a count-since-epoch as a string in the format used by Xcode
+
+
def xcode_format_count(X):
- logger = lldb.formatters.Logger.Logger()
- return xcode_format_time(time.localtime(X))
+ logger = lldb.formatters.Logger.Logger()
+ return xcode_format_time(time.localtime(X))
# despite the similary to synthetic children providers, these classes are not
# trying to provide anything but the summary for NSDate, so they need not
# obey the interface specification for synthetic children providers
+
+
class NSTaggedDate_SummaryProvider:
- def adjust_for_architecture(self):
- pass
-
- def __init__(self, valobj, info_bits, data, params):
- logger = lldb.formatters.Logger.Logger()
- self.valobj = valobj;
- self.sys_params = params
- self.update();
- # NSDate is not using its info_bits for info like NSNumber is
- # so we need to regroup info_bits and data
- self.data = ((data << 8) | (info_bits << 4))
-
- def update(self):
- logger = lldb.formatters.Logger.Logger()
- self.adjust_for_architecture();
-
- def value(self):
- logger = lldb.formatters.Logger.Logger()
- # the value of the date-time object is wrapped into the pointer value
- # unfortunately, it is made as a time-delta after Jan 1 2001 midnight GMT
- # while all Python knows about is the "epoch", which is a platform-dependent
- # year (1970 of *nix) whose Jan 1 at midnight is taken as reference
- value_double = struct.unpack('d', struct.pack('Q', self.data))[0]
- if value_double == -63114076800.0:
- return '0001-12-30 00:00:00 +0000'
- return xcode_format_count(osx_to_python_time(value_double))
+
+ def adjust_for_architecture(self):
+ pass
+
+ def __init__(self, valobj, info_bits, data, params):
+ logger = lldb.formatters.Logger.Logger()
+ self.valobj = valobj
+ self.sys_params = params
+ self.update()
+ # NSDate is not using its info_bits for info like NSNumber is
+ # so we need to regroup info_bits and data
+ self.data = ((data << 8) | (info_bits << 4))
+
+ def update(self):
+ logger = lldb.formatters.Logger.Logger()
+ self.adjust_for_architecture()
+
+ def value(self):
+ logger = lldb.formatters.Logger.Logger()
+ # the value of the date-time object is wrapped into the pointer value
+ # unfortunately, it is made as a time-delta after Jan 1 2001 midnight GMT
+ # while all Python knows about is the "epoch", which is a platform-dependent
+ # year (1970 of *nix) whose Jan 1 at midnight is taken as reference
+ value_double = struct.unpack('d', struct.pack('Q', self.data))[0]
+ if value_double == -63114076800.0:
+ return '0001-12-30 00:00:00 +0000'
+ return xcode_format_count(osx_to_python_time(value_double))
class NSUntaggedDate_SummaryProvider:
- def adjust_for_architecture(self):
- pass
-
- def __init__(self, valobj, params):
- logger = lldb.formatters.Logger.Logger()
- self.valobj = valobj;
- self.sys_params = params
- if not (self.sys_params.types_cache.double):
- self.sys_params.types_cache.double = self.valobj.GetType().GetBasicType(lldb.eBasicTypeDouble)
- self.update()
-
- def update(self):
- logger = lldb.formatters.Logger.Logger()
- self.adjust_for_architecture();
-
- def offset(self):
- logger = lldb.formatters.Logger.Logger()
- return self.sys_params.pointer_size
-
- def value(self):
- logger = lldb.formatters.Logger.Logger()
- value = self.valobj.CreateChildAtOffset("value",
- self.offset(),
- self.sys_params.types_cache.double)
- value_double = struct.unpack('d', struct.pack('Q', value.GetData().uint64[0]))[0]
- if value_double == -63114076800.0:
- return '0001-12-30 00:00:00 +0000'
- return xcode_format_count(osx_to_python_time(value_double))
+
+ def adjust_for_architecture(self):
+ pass
+
+ def __init__(self, valobj, params):
+ logger = lldb.formatters.Logger.Logger()
+ self.valobj = valobj
+ self.sys_params = params
+ if not (self.sys_params.types_cache.double):
+ self.sys_params.types_cache.double = self.valobj.GetType(
+ ).GetBasicType(lldb.eBasicTypeDouble)
+ self.update()
+
+ def update(self):
+ logger = lldb.formatters.Logger.Logger()
+ self.adjust_for_architecture()
+
+ def offset(self):
+ logger = lldb.formatters.Logger.Logger()
+ return self.sys_params.pointer_size
+
+ def value(self):
+ logger = lldb.formatters.Logger.Logger()
+ value = self.valobj.CreateChildAtOffset(
+ "value", self.offset(), self.sys_params.types_cache.double)
+ value_double = struct.unpack(
+ 'd', struct.pack(
+ 'Q', value.GetData().uint64[0]))[0]
+ if value_double == -63114076800.0:
+ return '0001-12-30 00:00:00 +0000'
+ return xcode_format_count(osx_to_python_time(value_double))
+
class NSCalendarDate_SummaryProvider:
- def adjust_for_architecture(self):
- pass
-
- def __init__(self, valobj, params):
- logger = lldb.formatters.Logger.Logger()
- self.valobj = valobj;
- self.sys_params = params
- if not (self.sys_params.types_cache.double):
- self.sys_params.types_cache.double = self.valobj.GetType().GetBasicType(lldb.eBasicTypeDouble)
- self.update()
-
- def update(self):
- logger = lldb.formatters.Logger.Logger()
- self.adjust_for_architecture();
-
- def offset(self):
- logger = lldb.formatters.Logger.Logger()
- return 2*self.sys_params.pointer_size
-
- def value(self):
- logger = lldb.formatters.Logger.Logger()
- value = self.valobj.CreateChildAtOffset("value",
- self.offset(),
- self.sys_params.types_cache.double)
- value_double = struct.unpack('d', struct.pack('Q', value.GetData().uint64[0]))[0]
- return xcode_format_count(osx_to_python_time(value_double))
+
+ def adjust_for_architecture(self):
+ pass
+
+ def __init__(self, valobj, params):
+ logger = lldb.formatters.Logger.Logger()
+ self.valobj = valobj
+ self.sys_params = params
+ if not (self.sys_params.types_cache.double):
+ self.sys_params.types_cache.double = self.valobj.GetType(
+ ).GetBasicType(lldb.eBasicTypeDouble)
+ self.update()
+
+ def update(self):
+ logger = lldb.formatters.Logger.Logger()
+ self.adjust_for_architecture()
+
+ def offset(self):
+ logger = lldb.formatters.Logger.Logger()
+ return 2 * self.sys_params.pointer_size
+
+ def value(self):
+ logger = lldb.formatters.Logger.Logger()
+ value = self.valobj.CreateChildAtOffset(
+ "value", self.offset(), self.sys_params.types_cache.double)
+ value_double = struct.unpack(
+ 'd', struct.pack(
+ 'Q', value.GetData().uint64[0]))[0]
+ return xcode_format_count(osx_to_python_time(value_double))
+
class NSTimeZoneClass_SummaryProvider:
- def adjust_for_architecture(self):
- pass
-
- def __init__(self, valobj, params):
- logger = lldb.formatters.Logger.Logger()
- self.valobj = valobj;
- self.sys_params = params
- if not (self.sys_params.types_cache.voidptr):
- self.sys_params.types_cache.voidptr = self.valobj.GetType().GetBasicType(lldb.eBasicTypeVoid).GetPointerType()
- self.update()
-
- def update(self):
- logger = lldb.formatters.Logger.Logger()
- self.adjust_for_architecture();
-
- def offset(self):
- logger = lldb.formatters.Logger.Logger()
- return self.sys_params.pointer_size
-
- def timezone(self):
- logger = lldb.formatters.Logger.Logger()
- tz_string = self.valobj.CreateChildAtOffset("tz_name",
- self.offset(),
- self.sys_params.types_cache.voidptr)
- return CFString.CFString_SummaryProvider(tz_string,None)
+
+ def adjust_for_architecture(self):
+ pass
+
+ def __init__(self, valobj, params):
+ logger = lldb.formatters.Logger.Logger()
+ self.valobj = valobj
+ self.sys_params = params
+ if not (self.sys_params.types_cache.voidptr):
+ self.sys_params.types_cache.voidptr = self.valobj.GetType(
+ ).GetBasicType(lldb.eBasicTypeVoid).GetPointerType()
+ self.update()
+
+ def update(self):
+ logger = lldb.formatters.Logger.Logger()
+ self.adjust_for_architecture()
+
+ def offset(self):
+ logger = lldb.formatters.Logger.Logger()
+ return self.sys_params.pointer_size
+
+ def timezone(self):
+ logger = lldb.formatters.Logger.Logger()
+ tz_string = self.valobj.CreateChildAtOffset(
+ "tz_name", self.offset(), self.sys_params.types_cache.voidptr)
+ return CFString.CFString_SummaryProvider(tz_string, None)
+
class NSUnknownDate_SummaryProvider:
- def adjust_for_architecture(self):
- pass
-
- def __init__(self, valobj):
- logger = lldb.formatters.Logger.Logger()
- self.valobj = valobj;
- self.update()
-
- def update(self):
- logger = lldb.formatters.Logger.Logger()
- self.adjust_for_architecture();
-
- def value(self):
- logger = lldb.formatters.Logger.Logger()
- stream = lldb.SBStream()
- self.valobj.GetExpressionPath(stream)
- expr = "(NSString*)[" + stream.GetData() + " description]"
- num_children_vo = self.valobj.CreateValueFromExpression("str",expr);
- if num_children_vo.IsValid():
- return num_children_vo.GetSummary()
- return '<variable is not NSDate>'
-def GetSummary_Impl(valobj):
- logger = lldb.formatters.Logger.Logger()
- global statistics
- class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
- if wrapper:
- return wrapper
-
- name_string = class_data.class_name()
- logger >> "class name is: " + str(name_string)
-
- if name_string == 'NSDate' or name_string == '__NSDate' or name_string == '__NSTaggedDate':
- if class_data.is_tagged():
- wrapper = NSTaggedDate_SummaryProvider(valobj,class_data.info_bits(),class_data.value(), class_data.sys_params)
- statistics.metric_hit('code_notrun',valobj)
- else:
- wrapper = NSUntaggedDate_SummaryProvider(valobj, class_data.sys_params)
- statistics.metric_hit('code_notrun',valobj)
- elif name_string == 'NSCalendarDate':
- wrapper = NSCalendarDate_SummaryProvider(valobj, class_data.sys_params)
- statistics.metric_hit('code_notrun',valobj)
- elif name_string == '__NSTimeZone':
- wrapper = NSTimeZoneClass_SummaryProvider(valobj, class_data.sys_params)
- statistics.metric_hit('code_notrun',valobj)
- else:
- wrapper = NSUnknownDate_SummaryProvider(valobj)
- statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
- return wrapper;
-
-
-def NSDate_SummaryProvider (valobj,dict):
- logger = lldb.formatters.Logger.Logger()
- provider = GetSummary_Impl(valobj);
- if provider != None:
- if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
- return provider.message()
- try:
- summary = provider.value();
- except:
- summary = None
- if summary == None:
- summary = '<variable is not NSDate>'
- return str(summary)
- return 'Summary Unavailable'
-
-def NSTimeZone_SummaryProvider (valobj,dict):
- logger = lldb.formatters.Logger.Logger()
- provider = GetSummary_Impl(valobj);
- if provider != None:
- if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
- return provider.message()
- try:
- summary = provider.timezone();
- except:
- summary = None
- logger >> "got summary " + str(summary)
- if summary == None:
- summary = '<variable is not NSTimeZone>'
- return str(summary)
- return 'Summary Unavailable'
-
-
-def CFAbsoluteTime_SummaryProvider (valobj,dict):
- logger = lldb.formatters.Logger.Logger()
- try:
- value_double = struct.unpack('d', struct.pack('Q', valobj.GetData().uint64[0]))[0]
- return xcode_format_count(osx_to_python_time(value_double))
- except:
- return 'Summary Unavailable'
-
-
-def __lldb_init_module(debugger,dict):
- debugger.HandleCommand("type summary add -F NSDate.NSDate_SummaryProvider NSDate")
- debugger.HandleCommand("type summary add -F NSDate.CFAbsoluteTime_SummaryProvider CFAbsoluteTime")
- debugger.HandleCommand("type summary add -F NSDate.NSTimeZone_SummaryProvider NSTimeZone CFTimeZoneRef")
+ def adjust_for_architecture(self):
+ pass
+
+ def __init__(self, valobj):
+ logger = lldb.formatters.Logger.Logger()
+ self.valobj = valobj
+ self.update()
+
+ def update(self):
+ logger = lldb.formatters.Logger.Logger()
+ self.adjust_for_architecture()
+ def value(self):
+ logger = lldb.formatters.Logger.Logger()
+ stream = lldb.SBStream()
+ self.valobj.GetExpressionPath(stream)
+ expr = "(NSString*)[" + stream.GetData() + " description]"
+ num_children_vo = self.valobj.CreateValueFromExpression("str", expr)
+ if num_children_vo.IsValid():
+ return num_children_vo.GetSummary()
+ return '<variable is not NSDate>'
+
+
+def GetSummary_Impl(valobj):
+ logger = lldb.formatters.Logger.Logger()
+ global statistics
+ class_data, wrapper = lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(
+ valobj, statistics)
+ if wrapper:
+ return wrapper
+
+ name_string = class_data.class_name()
+ logger >> "class name is: " + str(name_string)
+
+ if name_string == 'NSDate' or name_string == '__NSDate' or name_string == '__NSTaggedDate':
+ if class_data.is_tagged():
+ wrapper = NSTaggedDate_SummaryProvider(
+ valobj, class_data.info_bits(), class_data.value(), class_data.sys_params)
+ statistics.metric_hit('code_notrun', valobj)
+ else:
+ wrapper = NSUntaggedDate_SummaryProvider(
+ valobj, class_data.sys_params)
+ statistics.metric_hit('code_notrun', valobj)
+ elif name_string == 'NSCalendarDate':
+ wrapper = NSCalendarDate_SummaryProvider(valobj, class_data.sys_params)
+ statistics.metric_hit('code_notrun', valobj)
+ elif name_string == '__NSTimeZone':
+ wrapper = NSTimeZoneClass_SummaryProvider(
+ valobj, class_data.sys_params)
+ statistics.metric_hit('code_notrun', valobj)
+ else:
+ wrapper = NSUnknownDate_SummaryProvider(valobj)
+ statistics.metric_hit(
+ 'unknown_class',
+ valobj.GetName() +
+ " seen as " +
+ name_string)
+ return wrapper
+
+
+def NSDate_SummaryProvider(valobj, dict):
+ logger = lldb.formatters.Logger.Logger()
+ provider = GetSummary_Impl(valobj)
+ if provider is not None:
+ if isinstance(
+ provider,
+ lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
+ return provider.message()
+ try:
+ summary = provider.value()
+ except:
+ summary = None
+ if summary is None:
+ summary = '<variable is not NSDate>'
+ return str(summary)
+ return 'Summary Unavailable'
+
+
+def NSTimeZone_SummaryProvider(valobj, dict):
+ logger = lldb.formatters.Logger.Logger()
+ provider = GetSummary_Impl(valobj)
+ if provider is not None:
+ if isinstance(
+ provider,
+ lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
+ return provider.message()
+ try:
+ summary = provider.timezone()
+ except:
+ summary = None
+ logger >> "got summary " + str(summary)
+ if summary is None:
+ summary = '<variable is not NSTimeZone>'
+ return str(summary)
+ return 'Summary Unavailable'
+
+
+def CFAbsoluteTime_SummaryProvider(valobj, dict):
+ logger = lldb.formatters.Logger.Logger()
+ try:
+ value_double = struct.unpack(
+ 'd', struct.pack(
+ 'Q', valobj.GetData().uint64[0]))[0]
+ return xcode_format_count(osx_to_python_time(value_double))
+ except:
+ return 'Summary Unavailable'
+
+
+def __lldb_init_module(debugger, dict):
+ debugger.HandleCommand(
+ "type summary add -F NSDate.NSDate_SummaryProvider NSDate")
+ debugger.HandleCommand(
+ "type summary add -F NSDate.CFAbsoluteTime_SummaryProvider CFAbsoluteTime")
+ debugger.HandleCommand(
+ "type summary add -F NSDate.NSTimeZone_SummaryProvider NSTimeZone CFTimeZoneRef")