File: pydevd_frame_eval_main.py

package info (click to toggle)
pydevd 3.3.0%2Bds-4
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 13,892 kB
  • sloc: python: 77,508; cpp: 1,869; sh: 368; makefile: 50; ansic: 4
file content (71 lines) | stat: -rw-r--r-- 2,444 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import os

from _pydev_bundle import pydev_log
from _pydevd_bundle.pydevd_trace_dispatch import USING_CYTHON
from _pydevd_bundle.pydevd_constants import (
    USE_CYTHON_FLAG,
    ENV_FALSE_LOWER_VALUES,
    ENV_TRUE_LOWER_VALUES,
    IS_PY36_OR_GREATER,
    IS_PY38_OR_GREATER,
    SUPPORT_GEVENT,
    IS_PYTHON_STACKLESS,
    PYDEVD_USE_FRAME_EVAL,
    PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING,
    IS_PY311_OR_GREATER,
)

frame_eval_func = None
stop_frame_eval = None
dummy_trace_dispatch = None
clear_thread_local_info = None

# "NO" means we should not use frame evaluation, 'YES' we should use it (and fail if not there) and unspecified uses if possible.
if (
    PYDEVD_USE_FRAME_EVAL in ENV_FALSE_LOWER_VALUES
    or USE_CYTHON_FLAG in ENV_FALSE_LOWER_VALUES
    or not USING_CYTHON
    or
    # Frame eval mode does not work with ipython compatible debugging (this happens because the
    # way that frame eval works is run untraced and set tracing only for the frames with
    # breakpoints, but ipython compatible debugging creates separate frames for what's logically
    # the same frame).
    PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING
):
    USING_FRAME_EVAL = False

elif SUPPORT_GEVENT or (IS_PYTHON_STACKLESS and not IS_PY38_OR_GREATER):
    USING_FRAME_EVAL = False
    # i.e gevent and frame eval mode don't get along very well.
    # https://github.com/microsoft/debugpy/issues/189
    # Same problem with Stackless.
    # https://github.com/stackless-dev/stackless/issues/240

elif PYDEVD_USE_FRAME_EVAL in ENV_TRUE_LOWER_VALUES and not IS_PY311_OR_GREATER:
    # Python 3.11 onwards doesn't have frame eval mode implemented
    # Fail if unable to use
    from _pydevd_frame_eval.pydevd_frame_eval_cython_wrapper import (
        frame_eval_func,
        stop_frame_eval,
        dummy_trace_dispatch,
        clear_thread_local_info,
    )

    USING_FRAME_EVAL = True

else:
    USING_FRAME_EVAL = False
    # Try to use if possible
    if IS_PY36_OR_GREATER and not IS_PY311_OR_GREATER:
        # Python 3.11 onwards doesn't have frame eval mode implemented
        try:
            from _pydevd_frame_eval.pydevd_frame_eval_cython_wrapper import (
                frame_eval_func,
                stop_frame_eval,
                dummy_trace_dispatch,
                clear_thread_local_info,
            )

            USING_FRAME_EVAL = True
        except ImportError:
            pydev_log.show_compile_cython_command_line()