Home | History | Annotate | Download | only in cocoa
      1 """
      2 LLDB AppKit formatters
      3 
      4 part of The LLVM Compiler Infrastructure
      5 This file is distributed under the University of Illinois Open Source
      6 License. See LICENSE.TXT for details.
      7 """
      8 # summary provider for class NSException
      9 import lldb.runtime.objc.objc_runtime
     10 import lldb.formatters.metrics
     11 import CFString
     12 import lldb
     13 import lldb.formatters.Logger
     14 
     15 statistics = lldb.formatters.metrics.Metrics()
     16 statistics.add_metric('invalid_isa')
     17 statistics.add_metric('invalid_pointer')
     18 statistics.add_metric('unknown_class')
     19 statistics.add_metric('code_notrun')
     20 
     21 class NSKnownException_SummaryProvider:
     22 	def adjust_for_architecture(self):
     23 		pass
     24 
     25 	def __init__(self, valobj, params):
     26 		logger = lldb.formatters.Logger.Logger()
     27 		self.valobj = valobj;
     28 		self.sys_params = params
     29 		if not (self.sys_params.types_cache.id):
     30 			self.sys_params.types_cache.id = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
     31 		self.update();
     32 
     33 	def update(self):
     34 		logger = lldb.formatters.Logger.Logger()
     35 		self.adjust_for_architecture();
     36 
     37 	def offset_name(self):
     38 		logger = lldb.formatters.Logger.Logger()
     39 		return self.sys_params.pointer_size
     40 	def offset_reason(self):
     41 		logger = lldb.formatters.Logger.Logger()
     42 		return 2*self.sys_params.pointer_size
     43 
     44 	def description(self):
     45 		logger = lldb.formatters.Logger.Logger()
     46 		name_ptr = self.valobj.CreateChildAtOffset("name",
     47 							self.offset_name(),
     48 							self.sys_params.types_cache.id)
     49 		reason_ptr = self.valobj.CreateChildAtOffset("reason",
     50 							self.offset_reason(),
     51 							self.sys_params.types_cache.id)
     52 		return 'name:' + CFString.CFString_SummaryProvider(name_ptr,None) + ' reason:' + CFString.CFString_SummaryProvider(reason_ptr,None)
     53 
     54 class NSUnknownException_SummaryProvider:
     55 	def adjust_for_architecture(self):
     56 		pass
     57 
     58 	def __init__(self, valobj, params):
     59 		logger = lldb.formatters.Logger.Logger()
     60 		self.valobj = valobj;
     61 		self.sys_params = params
     62 		self.update();
     63 
     64 	def update(self):
     65 		logger = lldb.formatters.Logger.Logger()
     66 		self.adjust_for_architecture();
     67 
     68 	def description(self):
     69 		logger = lldb.formatters.Logger.Logger()
     70 		stream = lldb.SBStream()
     71 		self.valobj.GetExpressionPath(stream)
     72 		name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]");
     73 		reason_vo = self.valobj.CreateValueFromExpression("reason","(NSString*)[" + stream.GetData() + " reason]");
     74 		if name_vo.IsValid() and reason_vo.IsValid():
     75 			return CFString.CFString_SummaryProvider(name_vo,None) + ' ' + CFString.CFString_SummaryProvider(reason_vo,None)
     76 		return '<variable is not NSException>'
     77 
     78 
     79 def GetSummary_Impl(valobj):
     80 	logger = lldb.formatters.Logger.Logger()
     81 	global statistics
     82 	class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
     83 	if wrapper:
     84 		return wrapper
     85 	
     86 	name_string = class_data.class_name()
     87 	logger >> "class name is: " + str(name_string)
     88 
     89 	if name_string == 'NSException':
     90 		wrapper = NSKnownException_SummaryProvider(valobj, class_data.sys_params)
     91 		statistics.metric_hit('code_notrun',valobj)
     92 	else:
     93 		wrapper = NSUnknownException_SummaryProvider(valobj, class_data.sys_params)
     94 		statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
     95 	return wrapper;
     96 
     97 def NSException_SummaryProvider (valobj,dict):
     98 	logger = lldb.formatters.Logger.Logger()
     99 	provider = GetSummary_Impl(valobj);
    100 	if provider != None:
    101 		if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
    102 			return provider.message()
    103 		try:
    104 			summary = provider.description();
    105 		except:
    106 			summary = None
    107 		logger >> "got summary " + str(summary)
    108 		if summary == None:
    109 			summary = '<variable is not NSException>'
    110 		return str(summary)
    111 	return 'Summary Unavailable'
    112 
    113 def __lldb_init_module(debugger,dict):
    114 	debugger.HandleCommand("type summary add -F NSException.NSException_SummaryProvider NSException")
    115