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)
 | 
						|
 |