traceback.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. """
  2. Python polyfills for traceback
  3. """
  4. import traceback
  5. from traceback import StackSummary
  6. from types import TracebackType
  7. from ..decorators import substitute_in_graph
  8. __all__ = ["extract_tb", "clear_frames"]
  9. @substitute_in_graph(traceback.extract_tb, can_constant_fold_through=True)
  10. def extract_tb(tb: TracebackType | None, limit: int | None = None) -> StackSummary:
  11. if tb is None:
  12. return traceback.StackSummary.from_list([])
  13. # pyrefly: ignore [implicit-any]
  14. frame_summary = []
  15. while tb is not None:
  16. if limit:
  17. if len(frame_summary) < limit:
  18. frame_summary.append(
  19. # pyrefly: ignore[missing-attribute]
  20. tb.frame_summary
  21. )
  22. else:
  23. break
  24. else:
  25. frame_summary.append(tb.frame_summary) # pyrefly: ignore[missing-attribute]
  26. tb = tb.tb_next
  27. return traceback.StackSummary.from_list(frame_summary)
  28. @substitute_in_graph(traceback.clear_frames, can_constant_fold_through=True)
  29. def clear_frames(tb: TracebackType | None) -> None:
  30. # no-op
  31. return None