PageRenderTime 26ms CodeModel.GetById 0ms RepoModel.GetById 1ms app.codeStats 0ms

/venv/Lib/site-packages/billiard/einfo.py

https://bitbucket.org/lina_wang_veeva/vone
Python | 134 lines | 122 code | 12 blank | 0 comment | 1 complexity | b1355e778475b08a418978f62990af33 MD5 | raw file
  1. from __future__ import absolute_import
  2. import sys
  3. import traceback
  4. __all__ = ['ExceptionInfo', 'Traceback']
  5. DEFAULT_MAX_FRAMES = sys.getrecursionlimit() // 8
  6. class _Code(object):
  7. def __init__(self, code):
  8. self.co_filename = code.co_filename
  9. self.co_name = code.co_name
  10. self.co_argcount = code.co_argcount
  11. self.co_cellvars = ()
  12. self.co_firstlineno = code.co_firstlineno
  13. self.co_flags = code.co_flags
  14. self.co_freevars = ()
  15. self.co_code = b''
  16. self.co_lnotab = b''
  17. self.co_names = code.co_names
  18. self.co_nlocals = code.co_nlocals
  19. self.co_stacksize = code.co_stacksize
  20. self.co_varnames = ()
  21. class _Frame(object):
  22. Code = _Code
  23. def __init__(self, frame):
  24. self.f_builtins = {}
  25. self.f_globals = {
  26. "__file__": frame.f_globals.get("__file__", "__main__"),
  27. "__name__": frame.f_globals.get("__name__"),
  28. "__loader__": None,
  29. }
  30. self.f_locals = fl = {}
  31. try:
  32. fl["__traceback_hide__"] = frame.f_locals["__traceback_hide__"]
  33. except KeyError:
  34. pass
  35. self.f_trace = None
  36. self.f_exc_traceback = None
  37. self.f_exc_type = None
  38. self.f_exc_value = None
  39. self.f_code = self.Code(frame.f_code)
  40. self.f_lineno = frame.f_lineno
  41. self.f_lasti = frame.f_lasti
  42. # don't want to hit https://bugs.python.org/issue21967
  43. self.f_restricted = False
  44. class _Object(object):
  45. def __init__(self, **kw):
  46. [setattr(self, k, v) for k, v in kw.items()]
  47. class _Truncated(object):
  48. def __init__(self):
  49. self.tb_lineno = -1
  50. self.tb_frame = _Object(
  51. f_globals={"__file__": "",
  52. "__name__": "",
  53. "__loader__": None},
  54. f_fileno=None,
  55. f_code=_Object(co_filename="...",
  56. co_name="[rest of traceback truncated]"),
  57. )
  58. self.tb_next = None
  59. self.tb_lasti = 0
  60. class Traceback(object):
  61. Frame = _Frame
  62. def __init__(self, tb, max_frames=DEFAULT_MAX_FRAMES, depth=0):
  63. self.tb_frame = self.Frame(tb.tb_frame)
  64. self.tb_lineno = tb.tb_lineno
  65. self.tb_lasti = tb.tb_lasti
  66. self.tb_next = None
  67. if tb.tb_next is not None:
  68. if depth <= max_frames:
  69. self.tb_next = Traceback(tb.tb_next, max_frames, depth + 1)
  70. else:
  71. self.tb_next = _Truncated()
  72. class ExceptionInfo(object):
  73. """Exception wrapping an exception and its traceback.
  74. :param exc_info: The exception info tuple as returned by
  75. :func:`sys.exc_info`.
  76. """
  77. #: Exception type.
  78. type = None
  79. #: Exception instance.
  80. exception = None
  81. #: Pickleable traceback instance for use with :mod:`traceback`
  82. tb = None
  83. #: String representation of the traceback.
  84. traceback = None
  85. #: Set to true if this is an internal error.
  86. internal = False
  87. def __init__(self, exc_info=None, internal=False):
  88. self.type, self.exception, tb = exc_info or sys.exc_info()
  89. try:
  90. self.tb = Traceback(tb)
  91. self.traceback = ''.join(
  92. traceback.format_exception(self.type, self.exception, tb),
  93. )
  94. self.internal = internal
  95. finally:
  96. del(tb)
  97. def __str__(self):
  98. return self.traceback
  99. def __repr__(self):
  100. return "<ExceptionInfo: %r>" % (self.exception, )
  101. @property
  102. def exc_info(self):
  103. return self.type, self.exception, self.tb