| 51 | |
| 52 | |
| 53 | def frame_type( |
| 54 | frame: NativeFrame, python_version: Optional[Tuple[int, int]] |
| 55 | ) -> NativeFrame.FrameType: |
| 56 | symbol = frame.symbol |
| 57 | if python_version and _is_eval_frame(symbol, python_version): |
| 58 | return frame.FrameType.EVAL |
| 59 | if symbol.startswith("PyEval") or symbol.startswith("_PyEval"): |
| 60 | return frame.FrameType.IGNORE |
| 61 | if symbol.startswith("_Py"): |
| 62 | return frame.FrameType.IGNORE |
| 63 | if python_version and python_version >= (3, 8) and "vectorcall" in symbol.lower(): |
| 64 | return frame.FrameType.IGNORE |
| 65 | if any(symbol.startswith(ignored_symbol) for ignored_symbol in SYMBOL_IGNORELIST): |
| 66 | return frame.FrameType.IGNORE |
| 67 | |
| 68 | return frame.FrameType.OTHER |
| 69 | |
| 70 | |
| 71 | class LocationInfo(NamedTuple): |