PageRenderTime 38ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/oldstuff/sleepy/dumper.py

https://bitbucket.org/tenuki/sleepy
Python | 80 lines | 60 code | 19 blank | 1 comment | 11 complexity | e376be83e2a5753352a5c1b3ef0a9279 MD5 | raw file
  1. from __future__ import with_statement
  2. import pickle
  3. from StringIO import StringIO
  4. from exceptions import *
  5. class SF(object):
  6. def __init__(self, frame):
  7. self.frame = frame
  8. def __str__(self):
  9. return '<%s:%d(%d)>' % (self.filename, self.lineno, self.lasti)
  10. @property
  11. def lasti(self):
  12. return self.frame.f_lasti
  13. @property
  14. def filename(self):
  15. return self.frame.f_code.co_filename
  16. @property
  17. def lineno(self):
  18. return self.frame.f_lineno
  19. class FrameChainInfo(object):
  20. def __init__(self, filename=None, frame=None, chain=None, truncate=True):
  21. self.filename = filename
  22. if chain is None:
  23. self.chain = self.convert(frame, truncate)
  24. else:
  25. self.chain = chain
  26. def convert(self, frame, truncate):
  27. """ convert a frame and its parents into a tuple list """
  28. def gen():
  29. f = frame
  30. while f:
  31. if truncate and (f.f_code.co_filename == '<string>'):
  32. return
  33. yield (f.f_code.co_filename, f.f_lineno, f.f_lasti)
  34. f = f.f_back
  35. return [f for f in gen()]
  36. def __str__(self):
  37. st = StringIO()
  38. for notFirst, f in enumerate(self.chain):
  39. if notFirst:
  40. st.write('\n')
  41. st.write(self.frameRepr(f))
  42. return st.getvalue()
  43. def frameRepr(self, frame):
  44. _filename, _lineno, _lasti = frame
  45. return '<%s:%d(%d)>' % (_filename, _lineno, _lasti)
  46. def save(self, fname):
  47. with open(fname, 'wb') as f:
  48. pickle.dump(self.chain, f)
  49. @classmethod
  50. def load(cls, fname):
  51. with open(fname, 'rb') as f:
  52. return cls(chain=pickle.load(f))
  53. class StateDumper(object):
  54. def __init__(self, filename=None):
  55. self.filename = filename
  56. def dumpState(self, frame):
  57. fci = FrameChainInfo(self.filename, frame)
  58. print str(fci)
  59. fci.save('dump.pck')
  60. if __name__ == "__main__":
  61. pass