56 lines
1.4 KiB
Python
56 lines
1.4 KiB
Python
|
|
""" simple tracer for API generation
|
|
"""
|
|
|
|
import py
|
|
import sys
|
|
import types
|
|
|
|
from py.__.apigen.tracer.description import FunctionDesc
|
|
from py.__.apigen.tracer.docstorage import DocStorage
|
|
|
|
class UnionError(Exception):
|
|
pass
|
|
|
|
class NoValue(object):
|
|
pass
|
|
|
|
class Tracer(object):
|
|
""" Basic tracer object, used for gathering additional info
|
|
about API functions
|
|
"""
|
|
def __init__(self, docstorage):
|
|
self.docstorage = docstorage
|
|
self.tracing = False
|
|
|
|
_locals = {}
|
|
def _tracer(self, frame, event, arg):
|
|
|
|
# perform actuall tracing
|
|
frame = py.code.Frame(frame)
|
|
if event == 'call':
|
|
assert arg is None
|
|
try:
|
|
self.docstorage.consider_call(frame,
|
|
py.code.Frame(sys._getframe(2)),
|
|
self.frame)
|
|
except ValueError:
|
|
self.docstorage.consider_call(frame, None, self.frame)
|
|
elif event == 'return':
|
|
self.docstorage.consider_return(frame, arg)
|
|
elif event == 'exception':
|
|
self.docstorage.consider_exception(frame, arg)
|
|
return self._tracer
|
|
|
|
def start_tracing(self):
|
|
if self.tracing:
|
|
return
|
|
self.tracing = True
|
|
self.frame = py.code.Frame(sys._getframe(1))
|
|
sys.settrace(self._tracer)
|
|
|
|
def end_tracing(self):
|
|
self.tracing = False
|
|
sys.settrace(None)
|
|
|