NSMachPort.py revision 0d235d5864e996d95f485df1a0df406126e1ccde
1"""
2LLDB AppKit formatters
3
4part of The LLVM Compiler Infrastructure
5This file is distributed under the University of Illinois Open Source
6License. See LICENSE.TXT for details.
7"""
8# summary provider for NSData
9import lldb
10import ctypes
11import lldb.runtime.objc.objc_runtime
12import lldb.formatters.metrics
13import lldb.formatters.Logger
14
15statistics = lldb.formatters.metrics.Metrics()
16statistics.add_metric('invalid_isa')
17statistics.add_metric('invalid_pointer')
18statistics.add_metric('unknown_class')
19statistics.add_metric('code_notrun')
20
21# despite the similary to synthetic children providers, these classes are not
22# trying to provide anything but the port number of an NSMachPort, so they need not
23# obey the interface specification for synthetic children providers
24class NSMachPortKnown_SummaryProvider:
25	def adjust_for_architecture(self):
26		pass
27
28	def __init__(self, valobj, params):
29		logger = lldb.formatters.Logger.Logger()
30		self.valobj = valobj;
31		self.sys_params = params
32		if not(self.sys_params.types_cache.NSUInteger):
33			if self.sys_params.is_64_bit:
34				self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong)
35			else:
36				self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedInt)
37		self.update();
38
39	def update(self):
40		logger = lldb.formatters.Logger.Logger()
41		self.adjust_for_architecture();
42
43	# one pointer is the ISA
44	# then we have one other internal pointer, plus
45	# 4 bytes worth of flags. hence, these values
46	def offset(self):
47		logger = lldb.formatters.Logger.Logger()
48		if self.sys_params.is_64_bit:
49			return 20
50		else:
51			return 12
52
53	def port(self):
54		logger = lldb.formatters.Logger.Logger()
55		vport = self.valobj.CreateChildAtOffset("port",
56							self.offset(),
57							self.sys_params.types_cache.NSUInteger)
58		return vport.GetValueAsUnsigned(0)
59
60
61class NSMachPortUnknown_SummaryProvider:
62	def adjust_for_architecture(self):
63		pass
64
65	def __init__(self, valobj, params):
66		logger = lldb.formatters.Logger.Logger()
67		self.valobj = valobj;
68		self.sys_params = params
69		self.update();
70
71	def update(self):
72		logger = lldb.formatters.Logger.Logger()
73		self.adjust_for_architecture();
74
75	def port(self):
76		logger = lldb.formatters.Logger.Logger()
77		stream = lldb.SBStream()
78		self.valobj.GetExpressionPath(stream)
79		num_children_vo = self.valobj.CreateValueFromExpression("port","(int)[" + stream.GetData() + " machPort]")
80		if num_children_vo.IsValid():
81			return num_children_vo.GetValueAsUnsigned(0)
82		return '<variable is not NSMachPort>'
83
84
85def GetSummary_Impl(valobj):
86	logger = lldb.formatters.Logger.Logger()
87	global statistics
88	class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
89	if wrapper:
90		return wrapper
91
92	name_string = class_data.class_name()
93	logger >> "class name is: " + str(name_string)
94
95	if name_string == 'NSMachPort':
96		wrapper = NSMachPortKnown_SummaryProvider(valobj, class_data.sys_params)
97		statistics.metric_hit('code_notrun',valobj)
98	else:
99		wrapper = NSMachPortUnknown_SummaryProvider(valobj, class_data.sys_params)
100		statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
101	return wrapper;
102
103def NSMachPort_SummaryProvider (valobj,dict):
104	logger = lldb.formatters.Logger.Logger()
105	provider = GetSummary_Impl(valobj);
106	if provider != None:
107		if isinstance(provider,objc_runtime.SpecialSituation_Description):
108			return provider.message()
109		try:
110			summary = provider.port();
111		except:
112			summary = None
113		logger >> "got summary " + str(summary)
114		if summary == None:
115			summary = '<variable is not NSMachPort>'
116		if isinstance(summary, basestring):
117			return summay
118		return 'mach port: ' + str(summary)
119	return 'Summary Unavailable'
120
121def __lldb_init_module(debugger,dict):
122	debugger.HandleCommand("type summary add -F NSMachPort.NSMachPort_SummaryProvider NSMachPort")
123