Newer
Older
"""
LLDB AppKit formatters
part of The LLVM Compiler Infrastructure
This file is distributed under the University of Illinois Open Source
License. See LICENSE.TXT for details.
"""
Enrico Granata
committed
# summary provider for class NSNotification
import objc_runtime
import metrics
import CFString
import lldb
Enrico Granata
committed
statistics = metrics.Metrics()
statistics.add_metric('invalid_isa')
statistics.add_metric('invalid_pointer')
statistics.add_metric('unknown_class')
statistics.add_metric('code_notrun')
class NSConcreteNotification_SummaryProvider:
def adjust_for_architecture(self):
pass
Enrico Granata
committed
def __init__(self, valobj, params):
Enrico Granata
committed
self.valobj = valobj;
self.sys_params = params
if not (self.sys_params.types_cache.id):
self.sys_params.types_cache.id = self.valobj.GetType().GetBasicType(lldb.eBasicTypeObjCID)
Enrico Granata
committed
self.update();
def update(self):
Enrico Granata
committed
self.adjust_for_architecture();
# skip the ISA and go to the name pointer
def offset(self):
return self.sys_params.pointer_size
Enrico Granata
committed
def name(self):
Enrico Granata
committed
string_ptr = self.valobj.CreateChildAtOffset("name",
self.offset(),
self.sys_params.types_cache.id)
Enrico Granata
committed
return CFString.CFString_SummaryProvider(string_ptr,None)
class NSNotificationUnknown_SummaryProvider:
def adjust_for_architecture(self):
pass
Enrico Granata
committed
def __init__(self, valobj, params):
Enrico Granata
committed
self.valobj = valobj;
self.sys_params = params
Enrico Granata
committed
self.update()
def update(self):
Enrico Granata
committed
self.adjust_for_architecture();
def name(self):
Enrico Granata
committed
stream = lldb.SBStream()
self.valobj.GetExpressionPath(stream)
name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]")
if name_vo.IsValid():
return CFString.CFString_SummaryProvider(name_vo,None)
return '<variable is not NSNotification>'
Enrico Granata
committed
def GetSummary_Impl(valobj):
Enrico Granata
committed
global statistics
class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
if wrapper:
return wrapper
Enrico Granata
committed
name_string = class_data.class_name()
logger >> "class name is: " + str(name_string)
Enrico Granata
committed
if name_string == 'NSConcreteNotification':
wrapper = NSConcreteNotification_SummaryProvider(valobj, class_data.sys_params)
Enrico Granata
committed
statistics.metric_hit('code_notrun',valobj)
else:
wrapper = NSNotificationUnknown_SummaryProvider(valobj, class_data.sys_params)
statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
Enrico Granata
committed
return wrapper;
def NSNotification_SummaryProvider (valobj,dict):
Enrico Granata
committed
provider = GetSummary_Impl(valobj);
if provider != None:
if isinstance(provider,objc_runtime.SpecialSituation_Description):
return provider.message()
try:
summary = provider.name();
except:
summary = None
if summary == None:
summary = '<variable is not NSNotification>'
return str(summary)
return 'Summary Unavailable'
Enrico Granata
committed
def __lldb_init_module(debugger,dict):
debugger.HandleCommand("type summary add -F NSNotification.NSNotification_SummaryProvider NSNotification")