|
""" magic - some operations which helps to extend PDB with some magic data. |
Actually there is only explicit tracking of data, might be extended to |
automatic at some point. |
""" |
|
|
|
import weakref |
|
import py |
from py.__.apigen.tracer.docstorage import DocStorage |
from py.__.apigen.tracer.tracer import Tracer |
import sys |
|
class DocStorageKeeper(object): |
doc_storage = DocStorage() |
doc_storage.tracer = Tracer(doc_storage) |
doc_storage.from_dict({}) |
|
def set_storage(cl, ds): |
cl.doc_storage = ds |
cl.doc_storage.tracer = Tracer(ds) |
set_storage = classmethod(set_storage) |
|
def get_storage(): |
return DocStorageKeeper.doc_storage |
|
def stack_copier(frame): |
|
num = 0 |
gather = False |
stack = [] |
try: |
while 1: |
if gather: |
stack.append(py.code.Frame(sys._getframe(num))) |
else: |
if sys._getframe(num) is frame.raw: |
gather = True |
num += 1 |
except ValueError: |
pass |
return stack |
|
def trace(keep_frames=False, frame_copier=lambda x:x): |
def decorator(fun): |
ds = get_storage() |
|
|
desc = ds.find_desc(py.code.Code(fun.func_code)) |
if desc is None: |
desc = ds.add_desc(fun.func_name, fun, keep_frames=keep_frames, |
frame_copier=frame_copier) |
|
def wrapper(*args, **kwargs): |
ds.tracer.start_tracing() |
retval = fun(*args, **kwargs) |
ds.tracer.end_tracing() |
return retval |
|
return wrapper |
return decorator |
|