sources for tracer.py [rev. 38799]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
""" 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)