1087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataimport sys
2087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataimport inspect
3087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatafrom collections import OrderedDict
4087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
5087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass TracebackFancy:
6087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def __init__(self,traceback):
7087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		self.t = traceback
8087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
9087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getFrame(self):
10087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return FrameFancy(self.t.tb_frame)
11087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
12087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getLineNumber(self):
138e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return self.t.tb_lineno if self.t != None else None
14087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
15087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getNext(self):
16087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return TracebackFancy(self.t.tb_next)
17087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
18087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def __str__(self):
19087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		if self.t == None:
20087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			return ""
21087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		str_self = "%s @ %s" % (self.getFrame().getName(), self.getLineNumber())
22087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return str_self + "\n" + self.getNext().__str__()
23087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
24087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass ExceptionFancy:
25087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def __init__(self,frame):
26087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		self.etraceback = frame.f_exc_traceback
27087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		self.etype = frame.exc_type
28087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		self.evalue = frame.f_exc_value
29087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
30087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def __init__(self,tb,ty,va):
31087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		self.etraceback = tb
32087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		self.etype = ty
33087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		self.evalue = va
34087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
35087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getTraceback(self):
36087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return TracebackFancy(self.etraceback)
37087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
38087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def __nonzero__(self):
39087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return self.etraceback != None or self.etype != None or self.evalue != None
40087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
41087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getType(self):
42087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return str(self.etype)
43087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
44087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getValue(self):
45087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return self.evalue
46087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
47087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass CodeFancy:
48087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def __init__(self,code):
49087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		self.c = code
50087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
51087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getArgCount(self):
528e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return self.c.co_argcount if self.c != None else 0
53087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
54087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getFilename(self):
558e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return self.c.co_filename if self.c != None else ""
56087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
57087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getVariables(self):
588e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return self.c.co_varnames if self.c != None else []
59087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
60087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getName(self):
618e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return self.c.co_name if self.c != None else ""
628e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata
638e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata	def getFileName(self):
648e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return self.c.co_filename if self.c != None else ""
65087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
66087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass ArgsFancy:
67087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def __init__(self,frame,arginfo):
68087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		self.f = frame
69087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		self.a = arginfo
70087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
71087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def __str__(self):
72087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		args, varargs, kwargs = self.getArgs(), self.getVarArgs(), self.getKWArgs()
73087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		ret = ""
74087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		count = 0
75087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		size = len(args)
76087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		for arg in args:
77087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			ret = ret + ("%s = %s" % (arg, args[arg]))
78087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			count = count + 1
79087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			if count < size:
80087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata				ret = ret + ", "
81087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		if varargs:
82087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			if size > 0:
83087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata				ret = ret + " "
84087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			ret = ret + "varargs are " + str(varargs)
85087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		if kwargs:
86087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			if size > 0:
87087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata				ret = ret + " "
88087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			ret = ret + "kwargs are " + str(kwargs)
89087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return ret
90087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
91087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getNumArgs(wantVarargs = False, wantKWArgs=False):
92087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		args, varargs, keywords, values = self.a
93087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		size = len(args)
94087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		if varargs and wantVarargs:
95087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			size = size+len(self.getVarArgs())
96087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		if keywords and wantKWArgs:
97087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			size = size+len(self.getKWArgs())
98087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return size
99087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
100087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getArgs(self):
101087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		args, _, _, values = self.a
102087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		argWValues = OrderedDict()
103087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		for arg in args:
104087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			argWValues[arg] = values[arg]
105087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return argWValues
106087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
107087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getVarArgs(self):
108087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		_, vargs, _, _ = self.a
109087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		if vargs:
110087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			return self.f.f_locals[vargs]
111087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return ()
112087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
113087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getKWArgs(self):
114087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		_, _, kwargs, _ = self.a
115087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		if kwargs:
116087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			return self.f.f_locals[kwargs]
117087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return {}
118087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
119087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass FrameFancy:
120087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def __init__(self,frame):
121087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		self.f = frame
122087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
123087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getCaller(self):
124087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return FrameFancy(self.f.f_back)
125087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
126087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getLineNumber(self):
1278e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return self.f.f_lineno if self.f != None else 0
128087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
129087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getCodeInformation(self):
1308e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return CodeFancy(self.f.f_code) if self.f != None else None
131087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
132087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getExceptionInfo(self):
1338e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return ExceptionFancy(self.f) if self.f != None else None
134087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
135087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getName(self):
1368e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return self.getCodeInformation().getName() if self.f != None else ""
1378e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata
1388e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata	def getFileName(self):
1398e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return self.getCodeInformation().getFileName() if self.f != None else ""
140087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
141087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getLocals(self):
1428e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return self.f.f_locals if self.f != None else {}
143087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
144087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def getArgumentInfo(self):
1458e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		return ArgsFancy(self.f,inspect.getargvalues(self.f)) if self.f != None else None
146087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
147087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass TracerClass:
148087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def callEvent(self,frame):
149087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		pass
150087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
151087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def lineEvent(self,frame):
152087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		pass
153087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
154087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def returnEvent(self,frame,retval):
155087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		pass
156087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
157087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def exceptionEvent(self,frame,exception,value,traceback):
158087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		pass
159087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
160087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def cCallEvent(self,frame,cfunct):
161087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		pass
162087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
163087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def cReturnEvent(self,frame,cfunct):
164087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		pass
165087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
166087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def cExceptionEvent(self,frame,cfunct):
167087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		pass
168087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
169087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatatracer_impl = TracerClass()
170087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
171087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
172087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef the_tracer_entrypoint(frame,event,args):
173087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	if tracer_impl == None:
174087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return None
175087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	if event == "call":
176087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		call_retval = tracer_impl.callEvent(FrameFancy(frame))
177087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		if call_retval == False:
178087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			return None
179087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return the_tracer_entrypoint
180087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	elif event == "line":
181087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		line_retval = tracer_impl.lineEvent(FrameFancy(frame))
182087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		if line_retval == False:
183087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			return None
184087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return the_tracer_entrypoint
185087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	elif event == "return":
186087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		tracer_impl.returnEvent(FrameFancy(frame),args)
187087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	elif event == "exception":
188087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		exty,exva,extb = args
189087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		exception_retval = tracer_impl.exceptionEvent(FrameFancy(frame),ExceptionFancy(extb,exty,exva))
190087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		if exception_retval == False:
191087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata			return None
192087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return the_tracer_entrypoint
193087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	elif event == "c_call":
194087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		tracer_impl.cCallEvent(FrameFancy(frame),args)
195087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	elif event == "c_return":
196087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		tracer_impl.cReturnEvent(FrameFancy(frame),args)
197087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	elif event == "c_exception":
198087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		tracer_impl.cExceptionEvent(FrameFancy(frame),args)
199087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	return None
200087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
201087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef enable(t=None):
202087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	global tracer_impl
203087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	if t:
204087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		tracer_impl = t
205087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	sys.settrace(the_tracer_entrypoint)
206087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
207087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef disable():
208087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	sys.settrace(None)
209087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
210087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass LoggingTracer:
211087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def callEvent(self,frame):
212087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		print "call " + frame.getName() + " from " + frame.getCaller().getName() + " @ " + str(frame.getCaller().getLineNumber()) + " args are " + str(frame.getArgumentInfo())
213087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
214087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def lineEvent(self,frame):
2158e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		print "running " + frame.getName() + " @ " + str(frame.getLineNumber()) + " locals are " + str(frame.getLocals()) + " in " + frame.getFileName()
216087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
217087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def returnEvent(self,frame,retval):
218087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		print "return from " + frame.getName() + " value is " + str(retval) + " locals are " + str(frame.getLocals())
219087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
220087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	def exceptionEvent(self,frame,exception):
221087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		print "exception %s %s raised from %s @ %s" %  (exception.getType(), str(exception.getValue()), frame.getName(), frame.getLineNumber())
222087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		print "tb: " + str(exception.getTraceback())
223087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
2248e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata# the same functionality as LoggingTracer, but with a little more lldb-specific smarts
2258e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granataclass LLDBAwareTracer:
2268e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata	def callEvent(self,frame):
2278e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if frame.getName() == "<module>":
2288e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			return
2298e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if frame.getName() == "run_one_line":
2308e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			print "call run_one_line(%s)" % (frame.getArgumentInfo().getArgs()["input_string"])
2318e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			return
2328e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if "Python.framework" in frame.getFileName():
2338e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			print "call into Python at " + frame.getName()
2348e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			return
2358e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if frame.getName() == "__init__" and frame.getCaller().getName() == "run_one_line" and frame.getCaller().getLineNumber() == 101:
2368e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			return False
2378e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		strout = "call " + frame.getName()
2388e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if (frame.getCaller().getFileName() == ""):
2398e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			strout += " from LLDB - args are "
2408e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			args = frame.getArgumentInfo().getArgs()
2418e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			for arg in args:
2428e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata				if arg == "dict" or arg == "internal_dict":
2438e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata					continue
2448e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata				strout = strout + ("%s = %s " % (arg,args[arg]))
2458e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		else:
2468e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			strout += " from " + frame.getCaller().getName() + " @ " + str(frame.getCaller().getLineNumber()) + " args are " + str(frame.getArgumentInfo())
2478e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		print strout
2488e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata
2498e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata	def lineEvent(self,frame):
2508e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if frame.getName() == "<module>":
2518e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			return
2528e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if frame.getName() == "run_one_line":
2538e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			print "running run_one_line(%s) @ %s" % (frame.getArgumentInfo().getArgs()["input_string"],frame.getLineNumber())
2548e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			return
2558e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if "Python.framework" in frame.getFileName():
2568e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			print "running into Python at " + frame.getName() + " @ " + str(frame.getLineNumber())
2578e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			return
2588e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		strout = "running " + frame.getName() + " @ " + str(frame.getLineNumber()) + " locals are "
2598e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if (frame.getCaller().getFileName() == ""):
2608e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			locals = frame.getLocals()
2618e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			for local in locals:
2628e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata				if local == "dict" or local == "internal_dict":
2638e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata					continue
2648e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata				strout = strout + ("%s = %s " % (local,locals[local]))
2658e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		else:
2668e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			strout = strout + str(frame.getLocals())
2678e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		strout = strout + " in " + frame.getFileName()
2688e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		print strout
2698e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata
2708e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata	def returnEvent(self,frame,retval):
2718e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if frame.getName() == "<module>":
2728e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			return
2738e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if frame.getName() == "run_one_line":
2748e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			print "return from run_one_line(%s) return value is %s" % (frame.getArgumentInfo().getArgs()["input_string"],retval)
2758e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			return
2768e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if "Python.framework" in frame.getFileName():
2778e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			print "return from Python at " + frame.getName() + " return value is " + str(retval)
2788e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			return
2798e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		strout = "return from " + frame.getName() + " return value is " + str(retval) + " locals are "
2808e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if (frame.getCaller().getFileName() == ""):
2818e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			locals = frame.getLocals()
2828e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			for local in locals:
2838e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata				if local == "dict" or local == "internal_dict":
2848e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata					continue
2858e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata				strout = strout + ("%s = %s " % (local,locals[local]))
2868e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		else:
2878e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			strout = strout + str(frame.getLocals())
2888e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		strout = strout + " in " + frame.getFileName()
2898e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		print strout
2908e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata
2918e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata	def exceptionEvent(self,frame,exception):
2928e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		if frame.getName() == "<module>":
2938e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata			return
2948e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		print "exception %s %s raised from %s @ %s" %  (exception.getType(), str(exception.getValue()), frame.getName(), frame.getLineNumber())
2958e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata		print "tb: " + str(exception.getTraceback())
2968e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata
297087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef f(x,y=None):
298087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	if x > 0:
299087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		return 2 + f(x-2)
300087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	return 35
301087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
302087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef g(x):
303087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	return 1.134 / x
304087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
305087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef print_keyword_args(**kwargs):
306087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata     # kwargs is a dict of the keyword args passed to the function
307087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata     for key, value in kwargs.iteritems():
308087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata         print "%s = %s" % (key, value)
309087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
310087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef total(initial=5, *numbers, **keywords):
311087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata    count = initial
312087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata    for number in numbers:
313087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata        count += number
314087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata    for key in keywords:
315087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata        count += keywords[key]
316087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata    return count
317087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata
318087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataif __name__ == "__main__":
319087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	enable(LoggingTracer())
320087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	f(5)
321087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	f(5,1)
322087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	print_keyword_args(first_name="John", last_name="Doe")
323087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	total(10, 1, 2, 3, vegetables=50, fruits=100)
324087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	try:
325087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		g(0)
326087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	except:
327087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata		pass
328087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata	disable()
329