IDEA-CR-65209: PY-43134 Add debugger binaries for Python 3.9 beta
authorAndrey Lisin <andrey.lisin@jetbrains.com>
Thu, 13 Aug 2020 10:08:52 +0000 (13:08 +0300)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Thu, 13 Aug 2020 10:25:45 +0000 (10:25 +0000)
Because of changes in the Python frame evaluation API, particularly in the `_PyEval_EvalFrameDefault` function signature, new Cython modules and C files for Python 3.9 were added. Note that Python 3.9 frame evaluation binaries built from the C files have the '_py39' suffix, e.g. 'pydevd_frame_evaluator_py39', and we explicitly check the Python version while importing them. This is done to avoid changing the extension build scripts that rely on `pyx` file name and target binary name - otherwise, it would be hard to use the current build workflow when more than one possible `pyx` file available.

(cherry picked from commit 61015a7ae8b8d6780e3aff6aa480f5b02952d4fa)

GitOrigin-RevId: fcf44e51d67456f54da5d643f7cbd41069461484

64 files changed:
python/build/build-debug-binaries/src/build.gradle
python/helpers/pydev/_pydevd_bundle/pydevd_additional_thread_info_regular.py
python/helpers/pydev/_pydevd_bundle/pydevd_cython.c
python/helpers/pydev/_pydevd_bundle/pydevd_cython.pyx
python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_27_64.so
python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_35_64.cpython-35m-darwin.so
python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_36_64.cpython-36m-darwin.so
python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_37_64.cpython-37m-darwin.so
python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_38_64.cpython-38-darwin.so
python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_39_64.cpython-39-darwin.so [new file with mode: 0755]
python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_27_32.pyd
python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_27_64.pyd
python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_35_32.cp35-win32.pyd
python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_35_64.cp35-win_amd64.pyd
python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_36_32.cp36-win32.pyd
python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_36_64.cp36-win_amd64.pyd
python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_37_32.cp37-win32.pyd
python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_37_64.cp37-win_amd64.pyd
python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_38_32.cp38-win32.pyd
python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_38_64.cp38-win_amd64.pyd
python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_39_32.cp39-win32.pyd [new file with mode: 0644]
python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_39_64.cp39-win_amd64.pyd [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/internal_pycore.h [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pycore_pystate.h [deleted file]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_eval_cython_wrapper.py
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator.c
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator.pxd
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator.pyx
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.c [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.cp36-win32.pyd [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.cp36-win_amd64.pyd [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.cp37-win32.pyd [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.cp37-win_amd64.pyd [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.cp38-win32.pyd [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.cp38-win_amd64.pyd [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.cp39-win32.pyd [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.cp39-win_amd64.pyd [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.cpython-36m-darwin.so [new file with mode: 0755]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.cpython-37m-darwin.so [new file with mode: 0755]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.cpython-38-darwin.so [new file with mode: 0755]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.cpython-39-darwin.so [new file with mode: 0755]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.pxd [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_common.pyx [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_darwin_36_64.cpython-36m-darwin.so
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_darwin_37_64.cpython-37m-darwin.so
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_darwin_38_64.cpython-38-darwin.so
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_darwin_39_64.cpython-39-darwin.so [new file with mode: 0755]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_py39.c [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_py39.pxd [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_py39.pyx [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_win32_36_32.cp36-win32.pyd
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_win32_36_64.cp36-win_amd64.pyd
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_win32_37_32.cp37-win32.pyd
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_win32_37_64.cp37-win_amd64.pyd
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_win32_38_32.cp38-win32.pyd
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_win32_38_64.cp38-win_amd64.pyd
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_win32_39_32.cp39-win32.pyd [new file with mode: 0644]
python/helpers/pydev/_pydevd_frame_eval/pydevd_frame_evaluator_win32_39_64.cp39-win_amd64.pyd [new file with mode: 0644]
python/helpers/pydev/build_tools/build.py
python/helpers/pydev/build_tools/build_binaries_osx.py
python/helpers/pydev/build_tools/build_binaries_windows.py
python/helpers/pydev/setup.py
python/helpers/pydev/setup_cython.py
python/setup-test-environment/build.gradle

index 9b37023dc6045d85c02c7dd2e1143f8ec6122b56..c628b64ffba9f247e586464ccccf5cda6cbf74cf 100644 (file)
@@ -8,12 +8,16 @@ ext {
   pydevDir = new File(projectDir, '/../../../helpers/pydev/')
 }
 
+boolean isWindows = Os.isFamily(Os.FAMILY_WINDOWS)
+boolean isMac = Os.isFamily(Os.FAMILY_MAC)
+
 envs {
   String python27version = "2.7.16"
   String python35version = "3.5.7"
   String python36version = "3.6.8"
   String python37version = "3.7.6"
   String python38version = "3.8.1"
+  String python39version = isWindows ? "3.9.0b4" : "3.9-dev"
 
   def customBuildDir = System.getenv().get("PYCHARM_BUILD_DIR")
   project.buildDir = customBuildDir? new File(customBuildDir): buildDir
@@ -21,7 +25,7 @@ envs {
   envsDirectory = new File(buildDir, 'envs')
 
   zipRepository = new URL("https://repo.labs.intellij.net/pycharm/python-archives-windows/")
-  shouldUseZipsFromRepository = Os.isFamily(Os.FAMILY_WINDOWS)
+  shouldUseZipsFromRepository = isWindows
 
   python "python27_64", python27version, "64"
   virtualenv "py27_64", "python27_64", ["cython"]
@@ -38,7 +42,10 @@ envs {
   python "python38_64", python38version, "64"
   virtualenv "py38_64", "python38_64", ["cython"]
 
-  if (Os.isFamily(Os.FAMILY_WINDOWS)) {
+  python "python39_64", python39version, "64"
+  virtualenv "py39_64", "python39_64", ["cython"]
+
+  if (isWindows) {
     python "python27_32", python27version, "32"
     virtualenv "py27_32", "python27_32", ["cython"]
 
@@ -53,10 +60,13 @@ envs {
 
     python "python38_32", python38version, "32"
     virtualenv "py38_32", "python38_32", ["cython"]
+
+    python "python39_32", python39version, "32"
+    virtualenv "py39_32", "python39_32", ["cython"]
   }
 }
 
-task buildBinariesOnWindows(dependsOn: 'build_envs') << {
+task buildBinariesOnWindows(dependsOn: 'build_envs') doLast {
   exec {
     workingDir pydevDir
 
@@ -68,7 +78,7 @@ task buildBinariesOnWindows(dependsOn: 'build_envs') << {
   }
 }
 
-task buildBinariesOnMac(dependsOn: 'build_envs') << {
+task buildBinariesOnMac(dependsOn: 'build_envs') doLast {
   exec {
     workingDir pydevDir
 
@@ -80,14 +90,14 @@ task buildBinariesOnMac(dependsOn: 'build_envs') << {
 }
 
 task buildBinaries() {
-  if (Os.isFamily(Os.FAMILY_WINDOWS)) {
+  if (isWindows) {
     dependsOn buildBinariesOnWindows
   }
-  else if (Os.isFamily(Os.FAMILY_MAC)) {
+  else if (isMac) {
     dependsOn buildBinariesOnMac
   }
 }
 
-task wrapper(type: Wrapper) << {
+task wrapper(type: Wrapper) doLast {
   gradleVersion = '4.2'
 }
\ No newline at end of file
index e09f9a8ac5f15378a6e15e393f9a821c0f81e5d7..81c429f71c7fb92e2894e3074f46d973f909b1eb 100644 (file)
@@ -7,7 +7,7 @@ from _pydev_bundle import pydev_log
 from _pydevd_bundle.pydevd_frame import PyDBFrame
 # ENDIF
 
-version = 29
+version = 30
 
 if not hasattr(sys, '_current_frames'):
 
index 537dcddd0ee982974dc06ab2c91b1606bd36f80d..6d8a78537aead1e29bde111c4cc88c1578110e88 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.29.19 */
+/* Generated by Cython 0.29.21 */
 
 /* BEGIN: Cython Metadata
 {
@@ -20,8 +20,8 @@ END: Cython Metadata */
 #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000)
     #error Cython requires Python 2.6+ or Python 3.3+.
 #else
-#define CYTHON_ABI "0_29_19"
-#define CYTHON_HEX_VERSION 0x001D13F0
+#define CYTHON_ABI "0_29_21"
+#define CYTHON_HEX_VERSION 0x001D15F0
 #define CYTHON_FUTURE_DIVISION 0
 #include <stddef.h>
 #ifndef offsetof
@@ -448,7 +448,11 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
   #define __Pyx_PyUnicode_DATA(u)         PyUnicode_DATA(u)
   #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
   #define __Pyx_PyUnicode_WRITE(k, d, i, ch)  PyUnicode_WRITE(k, d, i, ch)
+  #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE)
   #define __Pyx_PyUnicode_IS_TRUE(u)      (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u)))
+  #else
+  #define __Pyx_PyUnicode_IS_TRUE(u)      (0 != PyUnicode_GET_LENGTH(u))
+  #endif
 #else
   #define CYTHON_PEP393_ENABLED 0
   #define PyUnicode_1BYTE_KIND  1
@@ -511,6 +515,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
 #ifndef PySet_CheckExact
   #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
 #endif
+#if PY_VERSION_HEX >= 0x030900A4
+  #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt)
+  #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size)
+#else
+  #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt)
+  #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size)
+#endif
 #if CYTHON_ASSUME_SAFE_MACROS
   #define __Pyx_PySequence_SIZE(seq)  Py_SIZE(seq)
 #else
@@ -550,7 +561,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
   #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
 #endif
 #if PY_MAJOR_VERSION >= 3
-  #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func))
+  #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func))
 #else
   #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass)
 #endif
@@ -1522,7 +1533,7 @@ static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
     if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) {
         Py_INCREF(x);
         PyList_SET_ITEM(list, len, x);
-        Py_SIZE(list) = len+1;
+        __Pyx_SET_SIZE(list, len + 1);
         return 0;
     }
     return PyList_Append(list, x);
@@ -2602,7 +2613,7 @@ static PyObject *__pyx_tp_new_14_pydevd_bundle_13pydevd_cython_ThreadTracer(PyTy
 static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_get = {0, &__pyx_n_s_get, 0, 0, 0};
 static PyObject *__pyx_int_0;
 static PyObject *__pyx_int_1;
-static PyObject *__pyx_int_29;
+static PyObject *__pyx_int_30;
 static PyObject *__pyx_int_160;
 static PyObject *__pyx_int_19394913;
 static PyObject *__pyx_int_64458794;
@@ -36754,7 +36765,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) {
   if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error);
   __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error)
   __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error)
-  __pyx_int_29 = PyInt_FromLong(29); if (unlikely(!__pyx_int_29)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_int_30 = PyInt_FromLong(30); if (unlikely(!__pyx_int_30)) __PYX_ERR(0, 1, __pyx_L1_error)
   __pyx_int_160 = PyInt_FromLong(160); if (unlikely(!__pyx_int_160)) __PYX_ERR(0, 1, __pyx_L1_error)
   __pyx_int_19394913 = PyInt_FromLong(19394913L); if (unlikely(!__pyx_int_19394913)) __PYX_ERR(0, 1, __pyx_L1_error)
   __pyx_int_64458794 = PyInt_FromLong(64458794L); if (unlikely(!__pyx_int_64458794)) __PYX_ERR(0, 1, __pyx_L1_error)
@@ -37252,14 +37263,14 @@ if (!__Pyx_RefNanny) {
   /* "_pydevd_bundle/pydevd_cython.pyx":16
  * # ENDIF
  * 
- * version = 29             # <<<<<<<<<<<<<<
+ * version = 30             # <<<<<<<<<<<<<<
  * 
  * if not hasattr(sys, '_current_frames'):
  */
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_version, __pyx_int_29) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_version, __pyx_int_30) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
 
   /* "_pydevd_bundle/pydevd_cython.pyx":18
- * version = 29
+ * version = 30
  * 
  * if not hasattr(sys, '_current_frames'):             # <<<<<<<<<<<<<<
  * 
@@ -37562,7 +37573,7 @@ if (!__Pyx_RefNanny) {
     __pyx_L3:;
 
     /* "_pydevd_bundle/pydevd_cython.pyx":18
- * version = 29
+ * version = 30
  * 
  * if not hasattr(sys, '_current_frames'):             # <<<<<<<<<<<<<<
  * 
@@ -40975,6 +40986,7 @@ static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit,
 }
 static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type)
 {
+#if PY_MAJOR_VERSION < 3
     __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
     if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) {
         Py_INCREF(func);
@@ -40987,6 +40999,7 @@ static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObj
     }
     if (obj == Py_None)
         obj = NULL;
+#endif
     return __Pyx_PyMethod_New(func, obj, type);
 }
 static PyObject*
index 38ab8a20fda348fecdda39885baffbbb4e16aee5..98945b1b99125ba89e2386551d0eb40f89091f51 100644 (file)
@@ -13,7 +13,7 @@ pydev_log.debug("Using Cython speedups")
 # from _pydevd_bundle.pydevd_frame import PyDBFrame
 # ENDIF
 
-version = 29
+version = 30
 
 if not hasattr(sys, '_current_frames'):
 
index 5124005af668ff20403f140273f8164de91fcad7..ee1300b362b8fedfe1e4466e6290a246b0dcd178 100755 (executable)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_27_64.so and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_27_64.so differ
index dde91f0aee0c7b81f99740bed0125f6c5ce4675c..7ed2e62f97b36df598974004b0156095989d2f68 100755 (executable)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_35_64.cpython-35m-darwin.so and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_35_64.cpython-35m-darwin.so differ
index ac0daa3985c9427288ca34636f70ee73fa27f793..74c904a5c0891218a1c8aff0a6dd6e4b0f23f8e9 100755 (executable)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_36_64.cpython-36m-darwin.so and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_36_64.cpython-36m-darwin.so differ
index c757d860da4693119432c9521a3dddf1f14bf7c4..40cacf7d124187ac4694953c718d68d56c2bdb39 100755 (executable)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_37_64.cpython-37m-darwin.so and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_37_64.cpython-37m-darwin.so differ
index 02015fa703592de30d83386239716b0897e7c4f9..141a08d35403ec0403b6bafd63df3b31edf475e5 100755 (executable)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_38_64.cpython-38-darwin.so and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_38_64.cpython-38-darwin.so differ
diff --git a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_39_64.cpython-39-darwin.so b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_39_64.cpython-39-darwin.so
new file mode 100755 (executable)
index 0000000..5592f59
Binary files /dev/null and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_darwin_39_64.cpython-39-darwin.so differ
index 65cbdefc3e0bafc71932ee567e077522194234f3..beacefc0d9618d552b638043687488e2db5dad3c 100644 (file)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_27_32.pyd and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_27_32.pyd differ
index 09137fa6cb9bcfe159ee4691f126f298a4cfbf53..14fdc00428d8f95289786c26fcd026b54974d50c 100644 (file)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_27_64.pyd and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_27_64.pyd differ
index 621e8fe0929f71e008720491f7d1e48b86c83164..1953daee84a5b9bc47b0b918f7edc12610ffa0ea 100644 (file)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_35_32.cp35-win32.pyd and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_35_32.cp35-win32.pyd differ
index 79bc1310d83ad9b9d7893b1cc4ca1947d16bb018..e9767cbcd3b8adba8a1f20712c04851979afd225 100644 (file)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_35_64.cp35-win_amd64.pyd and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_35_64.cp35-win_amd64.pyd differ
index b5441c1d4fdf0d6e8259fe5cb79fe29a2ba35e30..5d8dce097312730167f87d34e898379ed7cb79d6 100644 (file)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_36_32.cp36-win32.pyd and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_36_32.cp36-win32.pyd differ
index a927d3a9a357884fae91fee2981593d2d02ab9de..e22f33851a8efc450d621c47141098ed5f4321cc 100644 (file)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_36_64.cp36-win_amd64.pyd and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_36_64.cp36-win_amd64.pyd differ
index be5f94a7ab8c98897578883969e24a4498659ad0..6174b11d32e0ba210bdf9fa099b928b7aef4003c 100644 (file)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_37_32.cp37-win32.pyd and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_37_32.cp37-win32.pyd differ
index 9c364aeb77b9a8a2a5aa9595b09cdf9e33d3efa0..52fb33bf3df57c946885d888991692bb48c71e22 100644 (file)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_37_64.cp37-win_amd64.pyd and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_37_64.cp37-win_amd64.pyd differ
index 42e78adb8e18da7f462e6156b1623d86e424df00..d6dc5e5e51ae55df55aaa6e799d72cf425b251ca 100644 (file)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_38_32.cp38-win32.pyd and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_38_32.cp38-win32.pyd differ
index 35cdfc4ee5daeac33a81ce24936dabd835b4f266..b98639ef71b0468840b87067334f7ca89b98819a 100644 (file)
Binary files a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_38_64.cp38-win_amd64.pyd and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_38_64.cp38-win_amd64.pyd differ
diff --git a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_39_32.cp39-win32.pyd b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_39_32.cp39-win32.pyd
new file mode 100644 (file)
index 0000000..c32b430
Binary files /dev/null and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_39_32.cp39-win32.pyd differ
diff --git a/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_39_64.cp39-win_amd64.pyd b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_39_64.cp39-win_amd64.pyd
new file mode 100644 (file)
index 0000000..38c3446
Binary files /dev/null and b/python/helpers/pydev/_pydevd_bundle/pydevd_cython_win32_39_64.cp39-win_amd64.pyd differ
diff --git a/python/helpers/pydev/_pydevd_frame_eval/internal_pycore.h b/python/helpers/pydev/_pydevd_frame_eval/internal_pycore.h
new file mode 100644 (file)
index 0000000..3876ce7
--- /dev/null
@@ -0,0 +1,9 @@
+#if PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
+  #define Py_BUILD_CORE // for access to PyInterpreterState
+  #include "internal/pycore_pystate.h"
+  #undef Py_BUILD_CORE
+#elif PY_VERSION_HEX >= 0x03090000
+  #define Py_BUILD_CORE // for access to PyInterpreterState
+  #include "internal/pycore_interp.h"
+  #undef Py_BUILD_CORE
+#endif
\ No newline at end of file
diff --git a/python/helpers/pydev/_pydevd_frame_eval/pycore_pystate.h b/python/helpers/pydev/_pydevd_frame_eval/pycore_pystate.h
deleted file mode 100644 (file)
index 85492cc..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#if PY_VERSION_HEX >= 0x03080000
-#define Py_BUILD_CORE // for access to PyInterpreterState
-#include "internal/pycore_pystate.h"
-#undef Py_BUILD_CORE
-#endif
\ No newline at end of file
index 0864a4e38b73decfe77092bd5b4d30fa005753c7..ad44c3a2314a6f7038206334b2fb04ef3dbd5094 100644 (file)
@@ -1,13 +1,26 @@
+import sys
+
+# If no common frame evaluator library is found, there is no point to continue looking the version dependent
+# frame evaluator extension, and we let the exception to be propagated to the upper context.
 try:
-    try:
-        from _pydevd_frame_eval_ext import pydevd_frame_evaluator as mod
-    except ImportError:
-        from _pydevd_frame_eval import pydevd_frame_evaluator as mod
+    from _pydevd_frame_eval_ext import pydevd_frame_evaluator_common
+except ImportError:
+    from _pydevd_frame_eval import pydevd_frame_evaluator_common
+
+try:
+    if sys.version_info[:2] < (3, 9):  # Python 3.9's extension has a different name.
+        try:
+            from _pydevd_frame_eval_ext import pydevd_frame_evaluator as mod
+        except ImportError:
+            from _pydevd_frame_eval import pydevd_frame_evaluator as mod
+    else:
+        try:
+            from _pydevd_frame_eval_ext import pydevd_frame_evaluator_py39 as mod
+        except ImportError:
+            from _pydevd_frame_eval import pydevd_frame_evaluator_py39 as mod
 
 except ImportError:
     try:
-        import sys
-
         try:
             is_64bits = sys.maxsize > 2 ** 32
         except:
index 95b3382345ea205772e5d20263c6b430056d5e47..07a19a28abb0cf12d74dfd32e3635b24e956e999 100644 (file)
@@ -4,11 +4,12 @@
 {
     "distutils": {
         "depends": [
-            "_pydevd_frame_eval/pycore_pystate.h",
+            "_pydevd_frame_eval/internal_pycore.h",
             "_pydevd_frame_eval/release_mem.h"
         ],
         "include_dirs": [
-            "_pydevd_frame_eval"
+            "_pydevd_frame_eval",
+            "./_pydevd_frame_eval"
         ],
         "name": "_pydevd_frame_eval.pydevd_frame_evaluator",
         "sources": [
@@ -28,7 +29,7 @@ END: Cython Metadata */
 #else
 #define CYTHON_ABI "0_29_19"
 #define CYTHON_HEX_VERSION 0x001D13F0
-#define CYTHON_FUTURE_DIVISION 0
+#define CYTHON_FUTURE_DIVISION 1
 #include <stddef.h>
 #ifndef offsetof
   #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
@@ -616,9 +617,9 @@ static CYTHON_INLINE float __PYX_NAN() {
 #include "frameobject.h"
 #include "release_mem.h"
 #include "code.h"
-#include "pycore_pystate.h"
-#include "pystate.h"
+#include "internal_pycore.h"
 #include "ceval.h"
+#include "pystate.h"
 #ifdef _OPENMP
 #include <omp.h>
 #endif /* _OPENMP */
@@ -828,15 +829,15 @@ static const char *__pyx_filename;
 
 static const char *__pyx_f[] = {
   "_pydevd_frame_eval/pydevd_frame_evaluator.pyx",
-  "stringsource",
   "_pydevd_bundle/pydevd_cython.pxd",
+  "_pydevd_frame_eval/pydevd_frame_evaluator_common.pxd",
 };
 
 /*--- Type declarations ---*/
 struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo;
 struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PydevSmartStepContext;
-struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo;
-struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo;
+struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo;
+struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo;
 
 /* "_pydevd_bundle/pydevd_cython.pxd":1
  * cdef class PyDBAdditionalThreadInfo:             # <<<<<<<<<<<<<<
@@ -882,14 +883,14 @@ struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PydevSmartStepContext {
 };
 
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":24
- * 
+/* "_pydevd_frame_eval/pydevd_frame_evaluator_common.pxd":73
+ *     PyObject* PyEval_CallFunction(PyObject *callable, const char *format, ...)
  * 
  * cdef class ThreadInfo:             # <<<<<<<<<<<<<<
- * 
  *     cdef public PyDBAdditionalThreadInfo additional_info
+ *     cdef public bint is_pydevd_thread
  */
-struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo {
+struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo {
   PyObject_HEAD
   struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *additional_info;
   int is_pydevd_thread;
@@ -899,14 +900,14 @@ struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo {
 };
 
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":77
- * 
+/* "_pydevd_frame_eval/pydevd_frame_evaluator_common.pxd":80
+ *     cdef public object thread_trace_func
  * 
  * cdef class FuncCodeInfo:             # <<<<<<<<<<<<<<
- * 
  *     cdef public str co_filename
+ *     cdef public str real_path
  */
-struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo {
+struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo {
   PyObject_HEAD
   PyObject *co_filename;
   PyObject *real_path;
@@ -1095,18 +1096,35 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec
 static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
     Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);
 
-/* KeywordStringCheck.proto */
-static int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed);
+/* RaiseDoubleKeywords.proto */
+static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);
 
-/* PyObjectCall2Args.proto */
-static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2);
+/* ParseKeywords.proto */
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\
+    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\
+    const char* function_name);
 
-/* PyErrExceptionMatches.proto */
-#if CYTHON_FAST_THREAD_STATE
-#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err)
-static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err);
-#else
-#define __Pyx_PyErr_ExceptionMatches(err)  PyErr_ExceptionMatches(err)
+/* ArgTypeTest.proto */
+#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\
+    ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\
+        __Pyx__ArgTypeTest(obj, type, name, exact))
+static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact);
+
+/* IncludeStringH.proto */
+#include <string.h>
+
+/* BytesEquals.proto */
+static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals);
+
+/* UnicodeEquals.proto */
+static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals);
+
+/* ExtTypeTest.proto */
+static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type);
+
+/* GetTopmostException.proto */
+#if CYTHON_USE_EXC_INFO_STACK
+static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate);
 #endif
 
 /* PyThreadStateGet.proto */
@@ -1120,45 +1138,6 @@ static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tsta
 #define __Pyx_PyErr_Occurred()  PyErr_Occurred()
 #endif
 
-/* PyErrFetchRestore.proto */
-#if CYTHON_FAST_THREAD_STATE
-#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL)
-#define __Pyx_ErrRestoreWithState(type, value, tb)  __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb)
-#define __Pyx_ErrFetchWithState(type, value, tb)    __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb)
-#define __Pyx_ErrRestore(type, value, tb)  __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb)
-#define __Pyx_ErrFetch(type, value, tb)    __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb)
-static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb);
-static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
-#if CYTHON_COMPILING_IN_CPYTHON
-#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL))
-#else
-#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc)
-#endif
-#else
-#define __Pyx_PyErr_Clear() PyErr_Clear()
-#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc)
-#define __Pyx_ErrRestoreWithState(type, value, tb)  PyErr_Restore(type, value, tb)
-#define __Pyx_ErrFetchWithState(type, value, tb)  PyErr_Fetch(type, value, tb)
-#define __Pyx_ErrRestoreInState(tstate, type, value, tb)  PyErr_Restore(type, value, tb)
-#define __Pyx_ErrFetchInState(tstate, type, value, tb)  PyErr_Fetch(type, value, tb)
-#define __Pyx_ErrRestore(type, value, tb)  PyErr_Restore(type, value, tb)
-#define __Pyx_ErrFetch(type, value, tb)  PyErr_Fetch(type, value, tb)
-#endif
-
-/* GetAttr.proto */
-static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *);
-
-/* GetAttr3.proto */
-static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *);
-
-/* RaiseException.proto */
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
-
-/* GetTopmostException.proto */
-#if CYTHON_USE_EXC_INFO_STACK
-static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate);
-#endif
-
 /* SaveResetException.proto */
 #if CYTHON_FAST_THREAD_STATE
 #define __Pyx_ExceptionSave(type, value, tb)  __Pyx__ExceptionSave(__pyx_tstate, type, value, tb)
@@ -1178,34 +1157,23 @@ static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject
 static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb);
 #endif
 
-/* PyObjectLookupSpecial.proto */
-#if CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
-static CYTHON_INLINE PyObject* __Pyx_PyObject_LookupSpecial(PyObject* obj, PyObject* attr_name) {
-    PyObject *res;
-    PyTypeObject *tp = Py_TYPE(obj);
-#if PY_MAJOR_VERSION < 3
-    if (unlikely(PyInstance_Check(obj)))
-        return __Pyx_PyObject_GetAttrStr(obj, attr_name);
-#endif
-    res = _PyType_Lookup(tp, attr_name);
-    if (likely(res)) {
-        descrgetfunc f = Py_TYPE(res)->tp_descr_get;
-        if (!f) {
-            Py_INCREF(res);
-        } else {
-            res = f(res, obj, (PyObject *)tp);
-        }
-    } else {
-        PyErr_SetObject(PyExc_AttributeError, attr_name);
-    }
-    return res;
-}
-#else
-#define __Pyx_PyObject_LookupSpecial(o,n) __Pyx_PyObject_GetAttrStr(o,n)
-#endif
+/* GetAttr.proto */
+static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *);
+
+/* HasAttr.proto */
+static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *);
+
+/* RaiseTooManyValuesToUnpack.proto */
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
+
+/* RaiseNeedMoreValuesToUnpack.proto */
+static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
 
-/* None.proto */
-static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname);
+/* IterFinish.proto */
+static CYTHON_INLINE int __Pyx_IterFinish(void);
+
+/* UnpackItemEndCheck.proto */
+static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected);
 
 /* PyObjectSetAttrStr.proto */
 #if CYTHON_USE_TYPE_SLOTS
@@ -1216,135 +1184,47 @@ static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr
 #define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v)
 #endif
 
-/* ExtTypeTest.proto */
-static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type);
+/* PyObjectCall2Args.proto */
+static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2);
 
-/* SwapException.proto */
+/* PyErrFetchRestore.proto */
 #if CYTHON_FAST_THREAD_STATE
-#define __Pyx_ExceptionSwap(type, value, tb)  __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb)
-static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
+#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL)
+#define __Pyx_ErrRestoreWithState(type, value, tb)  __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb)
+#define __Pyx_ErrFetchWithState(type, value, tb)    __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb)
+#define __Pyx_ErrRestore(type, value, tb)  __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb)
+#define __Pyx_ErrFetch(type, value, tb)    __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb)
+static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb);
+static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
+#if CYTHON_COMPILING_IN_CPYTHON
+#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL))
 #else
-static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb);
+#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc)
 #endif
-
-/* RaiseDoubleKeywords.proto */
-static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);
-
-/* ParseKeywords.proto */
-static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\
-    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\
-    const char* function_name);
-
-/* ArgTypeTest.proto */
-#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\
-    ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\
-        __Pyx__ArgTypeTest(obj, type, name, exact))
-static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact);
-
-/* IncludeStringH.proto */
-#include <string.h>
-
-/* BytesEquals.proto */
-static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals);
-
-/* UnicodeEquals.proto */
-static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals);
-
-/* StrEquals.proto */
-#if PY_MAJOR_VERSION >= 3
-#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
 #else
-#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
+#define __Pyx_PyErr_Clear() PyErr_Clear()
+#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc)
+#define __Pyx_ErrRestoreWithState(type, value, tb)  PyErr_Restore(type, value, tb)
+#define __Pyx_ErrFetchWithState(type, value, tb)  PyErr_Fetch(type, value, tb)
+#define __Pyx_ErrRestoreInState(tstate, type, value, tb)  PyErr_Restore(type, value, tb)
+#define __Pyx_ErrFetchInState(tstate, type, value, tb)  PyErr_Fetch(type, value, tb)
+#define __Pyx_ErrRestore(type, value, tb)  PyErr_Restore(type, value, tb)
+#define __Pyx_ErrFetch(type, value, tb)  PyErr_Fetch(type, value, tb)
 #endif
 
-/* PyIntCompare.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, long intval, long inplace);
-
-/* DictGetItem.proto */
-#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
-static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key);
-#define __Pyx_PyObject_Dict_GetItem(obj, name)\
-    (likely(PyDict_CheckExact(obj)) ?\
-     __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name))
+/* SwapException.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_ExceptionSwap(type, value, tb)  __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb)
+static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
 #else
-#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key)
-#define __Pyx_PyObject_Dict_GetItem(obj, name)  PyObject_GetItem(obj, name)
-#endif
-
-/* GetItemInt.proto */
-#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
-    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
-    __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\
-    (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\
-               __Pyx_GetItemInt_Generic(o, to_py_func(i))))
-#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
-    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
-    __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
-    (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
-                                                              int wraparound, int boundscheck);
-#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
-    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
-    __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
-    (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL))
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
-                                                              int wraparound, int boundscheck);
-static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j);
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
-                                                     int is_list, int wraparound, int boundscheck);
-
-/* RaiseTooManyValuesToUnpack.proto */
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
-
-/* RaiseNeedMoreValuesToUnpack.proto */
-static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
-
-/* IterFinish.proto */
-static CYTHON_INLINE int __Pyx_IterFinish(void);
-
-/* UnpackItemEndCheck.proto */
-static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected);
-
-/* PyDictContains.proto */
-static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) {
-    int result = PyDict_Contains(dict, item);
-    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
-}
-
-/* HasAttr.proto */
-static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *);
+static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb);
+#endif
 
 /* WriteUnraisableException.proto */
 static void __Pyx_WriteUnraisable(const char *name, int clineno,
                                   int lineno, const char *filename,
                                   int full_traceback, int nogil);
 
-/* Import.proto */
-static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level);
-
-/* ImportFrom.proto */
-static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name);
-
-/* PyObject_GenericGetAttrNoDict.proto */
-#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
-static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name);
-#else
-#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr
-#endif
-
-/* PyObject_GenericGetAttr.proto */
-#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
-static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name);
-#else
-#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr
-#endif
-
-/* PyObjectGetAttrStrNoError.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name);
-
-/* SetupReduce.proto */
-static int __Pyx_setup_reduce(PyObject* type_obj);
-
 /* TypeImport.proto */
 #ifndef __PYX_HAVE_RT_ImportType_proto
 #define __PYX_HAVE_RT_ImportType_proto
@@ -1356,6 +1236,12 @@ enum __Pyx_ImportType_CheckSize {
 static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size);
 #endif
 
+/* Import.proto */
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level);
+
+/* ImportFrom.proto */
+static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name);
+
 /* CLineInTraceback.proto */
 #ifdef CYTHON_CLINE_IN_TRACEBACK
 #define __Pyx_CLineForTraceback(tstate, c_line)  (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0)
@@ -1389,10 +1275,10 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);
 static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);
 
 /* CIntFromPy.proto */
-static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
+static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);
 
 /* CIntFromPy.proto */
-static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);
+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
 
 /* FastTypeChecks.proto */
 #if CYTHON_COMPILING_IN_CPYTHON
@@ -1410,6 +1296,9 @@ static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObj
 /* CheckBinaryVersion.proto */
 static int __Pyx_check_binary_version(void);
 
+/* FunctionImport.proto */
+static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig);
+
 /* InitStrings.proto */
 static int __Pyx_InitStrings(__Pyx_StringTabEntry *t);
 
@@ -1420,84 +1309,43 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t);
 static PyTypeObject *__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo = 0;
 static PyTypeObject *__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PydevSmartStepContext = 0;
 
+/* Module declarations from '_pydevd_frame_eval.pydevd_frame_evaluator_common' */
+static PyTypeObject *__pyx_ptype_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo = 0;
+static PyTypeObject *__pyx_ptype_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo = 0;
+static struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo *(*__pyx_f_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_get_thread_info)(void); /*proto*/
+static struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo *(*__pyx_f_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_get_func_code_info)(PyCodeObject *); /*proto*/
+
 /* Module declarations from '_pydevd_frame_eval.pydevd_frame_evaluator' */
-static PyTypeObject *__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo = 0;
-static PyTypeObject *__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo = 0;
-static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_thread_info(void); /*proto*/
-static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_func_code_info(PyCodeObject *); /*proto*/
 static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_bytecode_while_frame_eval(PyFrameObject *, int); /*proto*/
-static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle_ThreadInfo__set_state(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *, PyObject *); /*proto*/
-static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle_FuncCodeInfo__set_state(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *, PyObject *); /*proto*/
 #define __Pyx_MODULE_NAME "_pydevd_frame_eval.pydevd_frame_evaluator"
 extern int __pyx_module_is_main__pydevd_frame_eval__pydevd_frame_evaluator;
 int __pyx_module_is_main__pydevd_frame_eval__pydevd_frame_evaluator = 0;
 
 /* Implementation of '_pydevd_frame_eval.pydevd_frame_evaluator' */
-static PyObject *__pyx_builtin_AttributeError;
-static const char __pyx_k__2[] = "";
 static const char __pyx_k_arg[] = "arg";
-static const char __pyx_k_dis[] = "dis";
-static const char __pyx_k_get[] = "get";
-static const char __pyx_k_new[] = "__new__";
 static const char __pyx_k_obj[] = "obj";
 static const char __pyx_k_call[] = "call";
-static const char __pyx_k_dict[] = "__dict__";
-static const char __pyx_k_exit[] = "__exit__";
 static const char __pyx_k_main[] = "__main__";
 static const char __pyx_k_name[] = "__name__";
 static const char __pyx_k_test[] = "__test__";
-static const char __pyx_k_enter[] = "__enter__";
 static const char __pyx_k_event[] = "event";
 static const char __pyx_k_frame[] = "frame";
-static const char __pyx_k_ident[] = "ident";
 static const char __pyx_k_local[] = "local";
-static const char __pyx_k_mtime[] = "mtime";
 static const char __pyx_k_state[] = "state";
-static const char __pyx_k_active[] = "_active";
 static const char __pyx_k_f_back[] = "f_back";
 static const char __pyx_k_import[] = "__import__";
-static const char __pyx_k_pickle[] = "pickle";
 static const char __pyx_k_plugin[] = "plugin";
-static const char __pyx_k_reduce[] = "__reduce__";
-static const char __pyx_k_thread[] = "thread";
-static const char __pyx_k_update[] = "update";
 static const char __pyx_k_f_trace[] = "f_trace";
 static const char __pyx_k_code_obj[] = "code_obj";
-static const char __pyx_k_getstate[] = "__getstate__";
-static const char __pyx_k_pyx_type[] = "__pyx_type";
-static const char __pyx_k_setstate[] = "__setstate__";
 static const char __pyx_k_decref_py[] = "decref_py";
-static const char __pyx_k_enumerate[] = "enumerate";
-static const char __pyx_k_get_ident[] = "get_ident";
-static const char __pyx_k_pyx_state[] = "__pyx_state";
-static const char __pyx_k_reduce_ex[] = "__reduce_ex__";
 static const char __pyx_k_threading[] = "threading";
-static const char __pyx_k_DONT_TRACE[] = "DONT_TRACE";
-static const char __pyx_k_ThreadInfo[] = "ThreadInfo";
 static const char __pyx_k_global_dbg[] = "global_dbg";
-static const char __pyx_k_pyx_result[] = "__pyx_result";
-static const char __pyx_k_DummyThread[] = "_DummyThread";
-static const char __pyx_k_PickleError[] = "PickleError";
-static const char __pyx_k_breakpoints[] = "breakpoints";
-static const char __pyx_k_insert_code[] = "insert_code";
 static const char __pyx_k_thread_info[] = "thread_info";
-static const char __pyx_k_FuncCodeInfo[] = "FuncCodeInfo";
 static const char __pyx_k_can_not_skip[] = "can_not_skip";
-static const char __pyx_k_pyx_checksum[] = "__pyx_checksum";
-static const char __pyx_k_stringsource[] = "stringsource";
-static const char __pyx_k_get_file_type[] = "get_file_type";
-static const char __pyx_k_reduce_cython[] = "__reduce_cython__";
-static const char __pyx_k_AttributeError[] = "AttributeError";
-static const char __pyx_k_findlinestarts[] = "findlinestarts";
 static const char __pyx_k_set_trace_func[] = "set_trace_func";
 static const char __pyx_k_trace_dispatch[] = "trace_dispatch";
-static const char __pyx_k_additional_info[] = "additional_info";
 static const char __pyx_k_frame_eval_func[] = "frame_eval_func";
-static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError";
-static const char __pyx_k_setstate_cython[] = "__setstate_cython__";
 static const char __pyx_k_stop_frame_eval[] = "stop_frame_eval";
-static const char __pyx_k_code_extra_index[] = "_code_extra_index";
-static const char __pyx_k_pydevd_file_utils[] = "pydevd_file_utils";
 static const char __pyx_k_signature_factory[] = "signature_factory";
 static const char __pyx_k_thread_local_info[] = "_thread_local_info";
 static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback";
@@ -1511,197 +1359,90 @@ static const char __pyx_k_stop_on_failed_tests[] = "stop_on_failed_tests";
 static const char __pyx_k_get_func_code_info_py[] = "get_func_code_info_py";
 static const char __pyx_k_has_plugin_line_breaks[] = "has_plugin_line_breaks";
 static const char __pyx_k_initialize_if_possible[] = "initialize_if_possible";
-static const char __pyx_k_is_pydev_daemon_thread[] = "is_pydev_daemon_thread";
 static const char __pyx_k_clear_thread_local_info[] = "clear_thread_local_info";
-static const char __pyx_k_pyx_unpickle_ThreadInfo[] = "__pyx_unpickle_ThreadInfo";
 static const char __pyx_k_pydevd_bundle_pydevd_comm[] = "_pydevd_bundle.pydevd_comm";
-static const char __pyx_k_pyx_unpickle_FuncCodeInfo[] = "__pyx_unpickle_FuncCodeInfo";
 static const char __pyx_k_break_on_caught_exceptions[] = "break_on_caught_exceptions";
 static const char __pyx_k_has_plugin_exception_breaks[] = "has_plugin_exception_breaks";
-static const char __pyx_k_NORM_PATHS_AND_BASE_CONTAINER[] = "NORM_PATHS_AND_BASE_CONTAINER";
 static const char __pyx_k_pydevd_frame_eval_pydevd_frame[] = "_pydevd_frame_eval.pydevd_frame_tracing";
-static const char __pyx_k_create_pydev_trace_code_wrapper[] = "create_pydev_trace_code_wrapper";
-static const char __pyx_k_get_abs_path_real_path_and_base[] = "get_abs_path_real_path_and_base_from_file";
 static const char __pyx_k_pydev_imps__pydev_saved_modules[] = "_pydev_imps._pydev_saved_modules";
-static const char __pyx_k_pydevd_bundle_pydevd_additional[] = "_pydevd_bundle.pydevd_additional_thread_info";
-static const char __pyx_k_pydevd_bundle_pydevd_dont_trace[] = "_pydevd_bundle.pydevd_dont_trace_files";
 static const char __pyx_k_pydevd_bundle_pydevd_trace_disp[] = "_pydevd_bundle.pydevd_trace_dispatch";
-static const char __pyx_k_pydevd_frame_eval_pydevd_modify[] = "_pydevd_frame_eval.pydevd_modify_bytecode";
-static const char __pyx_k_set_additional_thread_info_lock[] = "_set_additional_thread_info_lock";
-static const char __pyx_k_Incompatible_checksums_s_vs_0x2c[] = "Incompatible checksums (%s vs 0x2ccfa67 = (additional_info, fully_initialized, inside_frame_eval, is_pydevd_thread, thread_trace_func))";
-static const char __pyx_k_Incompatible_checksums_s_vs_0xda[] = "Incompatible checksums (%s vs 0xdaf6aa4 = (always_skip_code, breakpoint_found, breakpoints_created, breakpoints_mtime, co_filename, new_code, real_path))";
 static const char __pyx_k_fix_top_level_trace_and_get_trac[] = "fix_top_level_trace_and_get_trace_func";
 static const char __pyx_k_pydevd_frame_eval_pydevd_frame_2[] = "_pydevd_frame_eval/pydevd_frame_evaluator.pyx";
 static const char __pyx_k_pydevd_frame_eval_pydevd_frame_3[] = "_pydevd_frame_eval.pydevd_frame_evaluator";
-static PyObject *__pyx_n_s_AttributeError;
-static PyObject *__pyx_n_s_DONT_TRACE;
-static PyObject *__pyx_n_s_DummyThread;
-static PyObject *__pyx_n_s_FuncCodeInfo;
 static PyObject *__pyx_n_s_GlobalDebuggerHolder;
-static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0x2c;
-static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0xda;
-static PyObject *__pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER;
-static PyObject *__pyx_n_s_PickleError;
-static PyObject *__pyx_n_s_ThreadInfo;
-static PyObject *__pyx_kp_s__2;
-static PyObject *__pyx_n_s_active;
-static PyObject *__pyx_n_s_additional_info;
 static PyObject *__pyx_n_s_arg;
 static PyObject *__pyx_n_s_break_on_caught_exceptions;
-static PyObject *__pyx_n_s_breakpoints;
-static PyObject *__pyx_n_s_call;
+static PyObject *__pyx_n_u_break_on_caught_exceptions;
+static PyObject *__pyx_n_u_call;
 static PyObject *__pyx_n_s_can_not_skip;
 static PyObject *__pyx_n_s_clear_thread_local_info;
 static PyObject *__pyx_n_s_cline_in_traceback;
-static PyObject *__pyx_n_s_code_extra_index;
 static PyObject *__pyx_n_s_code_obj;
-static PyObject *__pyx_n_s_create_pydev_trace_code_wrapper;
 static PyObject *__pyx_n_s_decref_py;
-static PyObject *__pyx_n_s_dict;
-static PyObject *__pyx_n_s_dis;
 static PyObject *__pyx_n_s_dummy_trace_dispatch;
 static PyObject *__pyx_n_s_dummy_tracing_holder;
-static PyObject *__pyx_n_s_enter;
-static PyObject *__pyx_n_s_enumerate;
 static PyObject *__pyx_n_s_event;
-static PyObject *__pyx_n_s_exit;
 static PyObject *__pyx_n_s_f_back;
 static PyObject *__pyx_n_s_f_trace;
-static PyObject *__pyx_n_s_findlinestarts;
 static PyObject *__pyx_n_s_fix_top_level_trace_and_get_trac;
 static PyObject *__pyx_n_s_frame;
 static PyObject *__pyx_n_s_frame_eval_func;
-static PyObject *__pyx_n_s_get;
-static PyObject *__pyx_n_s_get_abs_path_real_path_and_base;
-static PyObject *__pyx_n_s_get_file_type;
 static PyObject *__pyx_n_s_get_func_code_info_py;
-static PyObject *__pyx_n_s_get_ident;
 static PyObject *__pyx_n_s_get_thread_info_py;
-static PyObject *__pyx_n_s_getstate;
 static PyObject *__pyx_n_s_global_dbg;
 static PyObject *__pyx_n_s_has_plugin_exception_breaks;
+static PyObject *__pyx_n_u_has_plugin_exception_breaks;
 static PyObject *__pyx_n_s_has_plugin_line_breaks;
-static PyObject *__pyx_n_s_ident;
 static PyObject *__pyx_n_s_import;
 static PyObject *__pyx_n_s_initialize_if_possible;
-static PyObject *__pyx_n_s_insert_code;
-static PyObject *__pyx_n_s_is_pydev_daemon_thread;
 static PyObject *__pyx_n_s_local;
 static PyObject *__pyx_n_s_main;
-static PyObject *__pyx_n_s_mtime;
 static PyObject *__pyx_n_s_name;
-static PyObject *__pyx_n_s_new;
 static PyObject *__pyx_n_s_obj;
-static PyObject *__pyx_n_s_pickle;
 static PyObject *__pyx_n_s_plugin;
 static PyObject *__pyx_n_s_pydev_imps__pydev_saved_modules;
-static PyObject *__pyx_n_s_pydevd_bundle_pydevd_additional;
 static PyObject *__pyx_n_s_pydevd_bundle_pydevd_comm;
-static PyObject *__pyx_n_s_pydevd_bundle_pydevd_dont_trace;
 static PyObject *__pyx_n_s_pydevd_bundle_pydevd_trace_disp;
-static PyObject *__pyx_n_s_pydevd_file_utils;
 static PyObject *__pyx_n_s_pydevd_frame_eval_pydevd_frame;
 static PyObject *__pyx_kp_s_pydevd_frame_eval_pydevd_frame_2;
 static PyObject *__pyx_n_s_pydevd_frame_eval_pydevd_frame_3;
-static PyObject *__pyx_n_s_pydevd_frame_eval_pydevd_modify;
-static PyObject *__pyx_n_s_pyx_PickleError;
-static PyObject *__pyx_n_s_pyx_checksum;
-static PyObject *__pyx_n_s_pyx_result;
-static PyObject *__pyx_n_s_pyx_state;
-static PyObject *__pyx_n_s_pyx_type;
-static PyObject *__pyx_n_s_pyx_unpickle_FuncCodeInfo;
-static PyObject *__pyx_n_s_pyx_unpickle_ThreadInfo;
-static PyObject *__pyx_n_s_reduce;
-static PyObject *__pyx_n_s_reduce_cython;
-static PyObject *__pyx_n_s_reduce_ex;
-static PyObject *__pyx_n_s_set_additional_thread_info_lock;
 static PyObject *__pyx_n_s_set_trace_func;
-static PyObject *__pyx_n_s_setstate;
-static PyObject *__pyx_n_s_setstate_cython;
 static PyObject *__pyx_n_s_show_return_values;
 static PyObject *__pyx_n_s_signature_factory;
+static PyObject *__pyx_n_u_signature_factory;
 static PyObject *__pyx_n_s_state;
 static PyObject *__pyx_n_s_stop_frame_eval;
 static PyObject *__pyx_n_s_stop_on_failed_tests;
-static PyObject *__pyx_kp_s_stringsource;
+static PyObject *__pyx_n_u_stop_on_failed_tests;
 static PyObject *__pyx_n_s_test;
-static PyObject *__pyx_n_s_thread;
 static PyObject *__pyx_n_s_thread_info;
 static PyObject *__pyx_n_s_thread_local_info;
 static PyObject *__pyx_n_s_threading;
 static PyObject *__pyx_n_s_trace_dispatch;
-static PyObject *__pyx_n_s_update;
 static PyObject *__pyx_n_s_update_globals_dict;
 static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_clear_thread_local_info(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo___init__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_2initialize_if_possible(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_4__reduce_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_6__setstate_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo___init__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_2__reduce_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_4__setstate_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_2dummy_trace_dispatch(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg); /* proto */
-static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_4get_thread_info_py(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_2get_thread_info_py(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_4dummy_trace_dispatch(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg); /* proto */
 static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_obj); /* proto */
-static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_code_obj); /* proto */
+static struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_code_obj); /* proto */
 static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10frame_eval_func(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
 static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12stop_frame_eval(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_14__pyx_unpickle_ThreadInfo(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_16__pyx_unpickle_FuncCodeInfo(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */
-static PyObject *__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
-static PyObject *__pyx_tp_new_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
-static PyObject *__pyx_int_46987879;
-static PyObject *__pyx_int_229599908;
-static PyObject *__pyx_int_neg_1;
-static PyObject *__pyx_tuple_;
-static PyObject *__pyx_tuple__4;
+static PyObject *__pyx_codeobj_;
+static PyObject *__pyx_tuple__3;
+static PyObject *__pyx_tuple__5;
 static PyObject *__pyx_tuple__7;
 static PyObject *__pyx_tuple__9;
 static PyObject *__pyx_tuple__11;
-static PyObject *__pyx_tuple__13;
-static PyObject *__pyx_tuple__15;
-static PyObject *__pyx_tuple__17;
-static PyObject *__pyx_codeobj__3;
-static PyObject *__pyx_codeobj__5;
+static PyObject *__pyx_codeobj__2;
+static PyObject *__pyx_codeobj__4;
 static PyObject *__pyx_codeobj__6;
 static PyObject *__pyx_codeobj__8;
 static PyObject *__pyx_codeobj__10;
 static PyObject *__pyx_codeobj__12;
-static PyObject *__pyx_codeobj__14;
-static PyObject *__pyx_codeobj__16;
-static PyObject *__pyx_codeobj__18;
 /* Late includes */
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":19
- * _thread_local_info = threading.local()
+/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":15
+ * 
  * 
  * def clear_thread_local_info():             # <<<<<<<<<<<<<<
  *     global _thread_local_info
@@ -1733,16 +1474,16 @@ static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_clear_th
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("clear_thread_local_info", 0);
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":21
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":17
  * def clear_thread_local_info():
  *     global _thread_local_info
  *     _thread_local_info = threading.local()             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_threading); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error)
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_threading); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 17, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_local); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 21, __pyx_L1_error)
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_local); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 17, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_t_2 = NULL;
@@ -1757,14 +1498,14 @@ static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_clear_th
   }
   __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2) : __Pyx_PyObject_CallNoArg(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error)
+  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 17, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_thread_local_info, __pyx_t_1) < 0) __PYX_ERR(0, 21, __pyx_L1_error)
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_thread_local_info, __pyx_t_1) < 0) __PYX_ERR(0, 17, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":19
- * _thread_local_info = threading.local()
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":15
+ * 
  * 
  * def clear_thread_local_info():             # <<<<<<<<<<<<<<
  *     global _thread_local_info
@@ -1786,9272 +1527,3146 @@ static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_clear_th
   return __pyx_r;
 }
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":32
- *     cdef public object thread_trace_func
+/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":20
+ * 
+ * 
+ * def get_thread_info_py() -> ThreadInfo:             # <<<<<<<<<<<<<<
+ *     return get_thread_info()
  * 
- *     def __init__(self):             # <<<<<<<<<<<<<<
- *         self.additional_info = None
- *         self.is_pydevd_thread = False
  */
 
 /* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_r;
+static struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_3get_thread_info_py(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_3get_thread_info_py = {"get_thread_info_py", (PyCFunction)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_3get_thread_info_py, METH_NOARGS, 0};
+static struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_3get_thread_info_py(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__init__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1;
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo___init__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("get_thread_info_py (wrapper)", 0);
+  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_2get_thread_info_py(__pyx_self);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo___init__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) {
-  int __pyx_r;
+static struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_2get_thread_info_py(CYTHON_UNUSED PyObject *__pyx_self) {
+  struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__init__", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_thread_info_py", 0);
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":33
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":21
  * 
- *     def __init__(self):
- *         self.additional_info = None             # <<<<<<<<<<<<<<
- *         self.is_pydevd_thread = False
- *         self.inside_frame_eval = 0
- */
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->additional_info);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->additional_info));
-  __pyx_v_self->additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)Py_None);
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":34
- *     def __init__(self):
- *         self.additional_info = None
- *         self.is_pydevd_thread = False             # <<<<<<<<<<<<<<
- *         self.inside_frame_eval = 0
- *         self.fully_initialized = False
- */
-  __pyx_v_self->is_pydevd_thread = 0;
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":35
- *         self.additional_info = None
- *         self.is_pydevd_thread = False
- *         self.inside_frame_eval = 0             # <<<<<<<<<<<<<<
- *         self.fully_initialized = False
- *         self.thread_trace_func = None
- */
-  __pyx_v_self->inside_frame_eval = 0;
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":36
- *         self.is_pydevd_thread = False
- *         self.inside_frame_eval = 0
- *         self.fully_initialized = False             # <<<<<<<<<<<<<<
- *         self.thread_trace_func = None
+ * def get_thread_info_py() -> ThreadInfo:
+ *     return get_thread_info()             # <<<<<<<<<<<<<<
  * 
- */
-  __pyx_v_self->fully_initialized = 0;
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":37
- *         self.inside_frame_eval = 0
- *         self.fully_initialized = False
- *         self.thread_trace_func = None             # <<<<<<<<<<<<<<
  * 
- *     def initialize_if_possible(self):
  */
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->thread_trace_func);
-  __Pyx_DECREF(__pyx_v_self->thread_trace_func);
-  __pyx_v_self->thread_trace_func = Py_None;
+  __Pyx_XDECREF(((PyObject *)__pyx_r));
+  __pyx_t_1 = ((PyObject *)__pyx_f_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_get_thread_info()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = ((struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo *)__pyx_t_1);
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":32
- *     cdef public object thread_trace_func
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":20
+ * 
+ * 
+ * def get_thread_info_py() -> ThreadInfo:             # <<<<<<<<<<<<<<
+ *     return get_thread_info()
  * 
- *     def __init__(self):             # <<<<<<<<<<<<<<
- *         self.additional_info = None
- *         self.is_pydevd_thread = False
  */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_thread_info_py", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF((PyObject *)__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":39
- *         self.thread_trace_func = None
+/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":24
  * 
- *     def initialize_if_possible(self):             # <<<<<<<<<<<<<<
- *         # Don't call threading.currentThread because if we're too early in the process
- *         # we may create a dummy thread.
+ * 
+ * def dummy_trace_dispatch(frame, str event, arg):             # <<<<<<<<<<<<<<
+ *     if event == 'call':
+ *         if frame.f_trace is not None:
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_3initialize_if_possible(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_3initialize_if_possible(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("initialize_if_possible (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_2initialize_if_possible(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self));
-
-  /* function exit code */
+static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_5dummy_trace_dispatch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_5dummy_trace_dispatch = {"dummy_trace_dispatch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_5dummy_trace_dispatch, METH_VARARGS|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_5dummy_trace_dispatch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_frame = 0;
+  PyObject *__pyx_v_event = 0;
+  PyObject *__pyx_v_arg = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("dummy_trace_dispatch (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_frame,&__pyx_n_s_event,&__pyx_n_s_arg,0};
+    PyObject* values[3] = {0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_frame)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_event)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("dummy_trace_dispatch", 1, 3, 3, 1); __PYX_ERR(0, 24, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_arg)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("dummy_trace_dispatch", 1, 3, 3, 2); __PYX_ERR(0, 24, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dummy_trace_dispatch") < 0)) __PYX_ERR(0, 24, __pyx_L3_error)
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+    }
+    __pyx_v_frame = values[0];
+    __pyx_v_event = ((PyObject*)values[1]);
+    __pyx_v_arg = values[2];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("dummy_trace_dispatch", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 24, __pyx_L3_error)
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.dummy_trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_event), (&PyUnicode_Type), 1, "event", 1))) __PYX_ERR(0, 24, __pyx_L1_error)
+  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_4dummy_trace_dispatch(__pyx_self, __pyx_v_frame, __pyx_v_event, __pyx_v_arg);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_2initialize_if_possible(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) {
-  PyObject *__pyx_v_thread_ident = NULL;
-  PyObject *__pyx_v_t = NULL;
-  PyObject *__pyx_v_thread = NULL;
-  PyObject *__pyx_v_additional_info = NULL;
+static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_4dummy_trace_dispatch(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_1;
+  int __pyx_t_2;
   PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  int __pyx_t_5;
-  Py_ssize_t __pyx_t_6;
-  PyObject *(*__pyx_t_7)(PyObject *);
-  int __pyx_t_8;
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  PyObject *__pyx_t_12 = NULL;
-  PyObject *__pyx_t_13 = NULL;
-  PyObject *__pyx_t_14 = NULL;
-  PyObject *__pyx_t_15 = NULL;
-  PyObject *__pyx_t_16 = NULL;
-  PyObject *__pyx_t_17 = NULL;
-  PyObject *__pyx_t_18 = NULL;
-  PyObject *__pyx_t_19 = NULL;
-  PyObject *__pyx_t_20 = NULL;
-  int __pyx_t_21;
-  int __pyx_t_22;
-  char const *__pyx_t_23;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("initialize_if_possible", 0);
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":42
- *         # Don't call threading.currentThread because if we're too early in the process
- *         # we may create a dummy thread.
- *         self.inside_frame_eval += 1             # <<<<<<<<<<<<<<
- * 
- *         try:
- */
-  __pyx_v_self->inside_frame_eval = (__pyx_v_self->inside_frame_eval + 1);
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":44
- *         self.inside_frame_eval += 1
- * 
- *         try:             # <<<<<<<<<<<<<<
- *             thread_ident = threading.get_ident()  # Note this is py3 only, if py2 needed to be supported, _get_ident would be needed.
- *             t = threading._active.get(thread_ident)
- */
-  /*try:*/ {
+  __Pyx_RefNannySetupContext("dummy_trace_dispatch", 0);
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":45
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":25
  * 
- *         try:
- *             thread_ident = threading.get_ident()  # Note this is py3 only, if py2 needed to be supported, _get_ident would be needed.             # <<<<<<<<<<<<<<
- *             t = threading._active.get(thread_ident)
- *             if t is None:
+ * def dummy_trace_dispatch(frame, str event, arg):
+ *     if event == 'call':             # <<<<<<<<<<<<<<
+ *         if frame.f_trace is not None:
+ *             return frame.f_trace(frame, event, arg)
  */
-    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_threading); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 45, __pyx_L4_error)
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get_ident); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 45, __pyx_L4_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = NULL;
-    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
-      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
-      if (likely(__pyx_t_2)) {
-        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
-        __Pyx_INCREF(__pyx_t_2);
-        __Pyx_INCREF(function);
-        __Pyx_DECREF_SET(__pyx_t_3, function);
-      }
-    }
-    __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2) : __Pyx_PyObject_CallNoArg(__pyx_t_3);
-    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 45, __pyx_L4_error)
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_v_thread_ident = __pyx_t_1;
-    __pyx_t_1 = 0;
+  __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_event, __pyx_n_u_call, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 25, __pyx_L1_error)
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":46
- *         try:
- *             thread_ident = threading.get_ident()  # Note this is py3 only, if py2 needed to be supported, _get_ident would be needed.
- *             t = threading._active.get(thread_ident)             # <<<<<<<<<<<<<<
- *             if t is None:
- *                 return  # Cannot initialize until thread becomes active.
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":26
+ * def dummy_trace_dispatch(frame, str event, arg):
+ *     if event == 'call':
+ *         if frame.f_trace is not None:             # <<<<<<<<<<<<<<
+ *             return frame.f_trace(frame, event, arg)
+ *     return None
  */
-    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_threading); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 46, __pyx_L4_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_active); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 46, __pyx_L4_error)
-    __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 46, __pyx_L4_error)
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 26, __pyx_L1_error)
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = NULL;
-    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
-      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
-      if (likely(__pyx_t_2)) {
-        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
-        __Pyx_INCREF(__pyx_t_2);
-        __Pyx_INCREF(function);
-        __Pyx_DECREF_SET(__pyx_t_3, function);
-      }
-    }
-    __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, __pyx_v_thread_ident) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_thread_ident);
-    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 46, __pyx_L4_error)
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = (__pyx_t_3 != Py_None);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_v_t = __pyx_t_1;
-    __pyx_t_1 = 0;
-
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":47
- *             thread_ident = threading.get_ident()  # Note this is py3 only, if py2 needed to be supported, _get_ident would be needed.
- *             t = threading._active.get(thread_ident)
- *             if t is None:             # <<<<<<<<<<<<<<
- *                 return  # Cannot initialize until thread becomes active.
- * 
- */
-    __pyx_t_4 = (__pyx_v_t == Py_None);
-    __pyx_t_5 = (__pyx_t_4 != 0);
-    if (__pyx_t_5) {
+    __pyx_t_1 = (__pyx_t_2 != 0);
+    if (__pyx_t_1) {
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":48
- *             t = threading._active.get(thread_ident)
- *             if t is None:
- *                 return  # Cannot initialize until thread becomes active.             # <<<<<<<<<<<<<<
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":27
+ *     if event == 'call':
+ *         if frame.f_trace is not None:
+ *             return frame.f_trace(frame, event, arg)             # <<<<<<<<<<<<<<
+ *     return None
  * 
- *             for thread in threading.enumerate():
  */
       __Pyx_XDECREF(__pyx_r);
-      __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-      goto __pyx_L3_return;
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":47
- *             thread_ident = threading.get_ident()  # Note this is py3 only, if py2 needed to be supported, _get_ident would be needed.
- *             t = threading._active.get(thread_ident)
- *             if t is None:             # <<<<<<<<<<<<<<
- *                 return  # Cannot initialize until thread becomes active.
- * 
- */
-    }
-
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":50
- *                 return  # Cannot initialize until thread becomes active.
- * 
- *             for thread in threading.enumerate():             # <<<<<<<<<<<<<<
- *                 if isinstance(t, threading._DummyThread) and t is thread and t.ident != thread.ident:
- *                     t = thread
- */
-    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_threading); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 50, __pyx_L4_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_enumerate); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 50, __pyx_L4_error)
-    __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = NULL;
-    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
-      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
-      if (likely(__pyx_t_3)) {
-        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
-        __Pyx_INCREF(__pyx_t_3);
-        __Pyx_INCREF(function);
-        __Pyx_DECREF_SET(__pyx_t_2, function);
-      }
-    }
-    __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
-    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 50, __pyx_L4_error)
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) {
-      __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2); __pyx_t_6 = 0;
-      __pyx_t_7 = NULL;
-    } else {
-      __pyx_t_6 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 50, __pyx_L4_error)
-      __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_7 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 50, __pyx_L4_error)
-    }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    for (;;) {
-      if (likely(!__pyx_t_7)) {
-        if (likely(PyList_CheckExact(__pyx_t_2))) {
-          if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_2)) break;
-          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
-          __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_1); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 50, __pyx_L4_error)
-          #else
-          __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 50, __pyx_L4_error)
-          __Pyx_GOTREF(__pyx_t_1);
-          #endif
-        } else {
-          if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
-          __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_1); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 50, __pyx_L4_error)
-          #else
-          __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 50, __pyx_L4_error)
-          __Pyx_GOTREF(__pyx_t_1);
-          #endif
-        }
-      } else {
-        __pyx_t_1 = __pyx_t_7(__pyx_t_2);
-        if (unlikely(!__pyx_t_1)) {
-          PyObject* exc_type = PyErr_Occurred();
-          if (exc_type) {
-            if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
-            else __PYX_ERR(0, 50, __pyx_L4_error)
-          }
-          break;
+      __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 27, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_5 = NULL;
+      __pyx_t_6 = 0;
+      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
+        __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
+        if (likely(__pyx_t_5)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+          __Pyx_INCREF(__pyx_t_5);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_4, function);
+          __pyx_t_6 = 1;
         }
-        __Pyx_GOTREF(__pyx_t_1);
-      }
-      __Pyx_XDECREF_SET(__pyx_v_thread, __pyx_t_1);
-      __pyx_t_1 = 0;
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":51
- * 
- *             for thread in threading.enumerate():
- *                 if isinstance(t, threading._DummyThread) and t is thread and t.ident != thread.ident:             # <<<<<<<<<<<<<<
- *                     t = thread
- *                     break
- */
-      __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_threading); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 51, __pyx_L4_error)
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_DummyThread); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 51, __pyx_L4_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_4 = PyObject_IsInstance(__pyx_v_t, __pyx_t_3); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(0, 51, __pyx_L4_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_8 = (__pyx_t_4 != 0);
-      if (__pyx_t_8) {
-      } else {
-        __pyx_t_5 = __pyx_t_8;
-        goto __pyx_L10_bool_binop_done;
       }
-      __pyx_t_8 = (__pyx_v_t == __pyx_v_thread);
-      __pyx_t_4 = (__pyx_t_8 != 0);
-      if (__pyx_t_4) {
-      } else {
-        __pyx_t_5 = __pyx_t_4;
-        goto __pyx_L10_bool_binop_done;
+      #if CYTHON_FAST_PYCALL
+      if (PyFunction_Check(__pyx_t_4)) {
+        PyObject *__pyx_temp[4] = {__pyx_t_5, __pyx_v_frame, __pyx_v_event, __pyx_v_arg};
+        __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_6, 3+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 27, __pyx_L1_error)
+        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_GOTREF(__pyx_t_3);
+      } else
+      #endif
+      #if CYTHON_FAST_PYCCALL
+      if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) {
+        PyObject *__pyx_temp[4] = {__pyx_t_5, __pyx_v_frame, __pyx_v_event, __pyx_v_arg};
+        __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_6, 3+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 27, __pyx_L1_error)
+        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_GOTREF(__pyx_t_3);
+      } else
+      #endif
+      {
+        __pyx_t_7 = PyTuple_New(3+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 27, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_7);
+        if (__pyx_t_5) {
+          __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __pyx_t_5 = NULL;
+        }
+        __Pyx_INCREF(__pyx_v_frame);
+        __Pyx_GIVEREF(__pyx_v_frame);
+        PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, __pyx_v_frame);
+        __Pyx_INCREF(__pyx_v_event);
+        __Pyx_GIVEREF(__pyx_v_event);
+        PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_v_event);
+        __Pyx_INCREF(__pyx_v_arg);
+        __Pyx_GIVEREF(__pyx_v_arg);
+        PyTuple_SET_ITEM(__pyx_t_7, 2+__pyx_t_6, __pyx_v_arg);
+        __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 27, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       }
-      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_t, __pyx_n_s_ident); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 51, __pyx_L4_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_thread, __pyx_n_s_ident); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 51, __pyx_L4_error)
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_9 = PyObject_RichCompare(__pyx_t_3, __pyx_t_1, Py_NE); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 51, __pyx_L4_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 51, __pyx_L4_error)
-      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      __pyx_t_5 = __pyx_t_4;
-      __pyx_L10_bool_binop_done:;
-      if (__pyx_t_5) {
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_r = __pyx_t_3;
+      __pyx_t_3 = 0;
+      goto __pyx_L0;
 
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":52
- *             for thread in threading.enumerate():
- *                 if isinstance(t, threading._DummyThread) and t is thread and t.ident != thread.ident:
- *                     t = thread             # <<<<<<<<<<<<<<
- *                     break
- * 
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":26
+ * def dummy_trace_dispatch(frame, str event, arg):
+ *     if event == 'call':
+ *         if frame.f_trace is not None:             # <<<<<<<<<<<<<<
+ *             return frame.f_trace(frame, event, arg)
+ *     return None
  */
-        __Pyx_INCREF(__pyx_v_thread);
-        __Pyx_DECREF_SET(__pyx_v_t, __pyx_v_thread);
+    }
 
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":53
- *                 if isinstance(t, threading._DummyThread) and t is thread and t.ident != thread.ident:
- *                     t = thread
- *                     break             # <<<<<<<<<<<<<<
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":25
  * 
- *             if getattr(t, 'is_pydev_daemon_thread', False):
+ * def dummy_trace_dispatch(frame, str event, arg):
+ *     if event == 'call':             # <<<<<<<<<<<<<<
+ *         if frame.f_trace is not None:
+ *             return frame.f_trace(frame, event, arg)
  */
-        goto __pyx_L8_break;
+  }
 
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":51
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":28
+ *         if frame.f_trace is not None:
+ *             return frame.f_trace(frame, event, arg)
+ *     return None             # <<<<<<<<<<<<<<
  * 
- *             for thread in threading.enumerate():
- *                 if isinstance(t, threading._DummyThread) and t is thread and t.ident != thread.ident:             # <<<<<<<<<<<<<<
- *                     t = thread
- *                     break
- */
-      }
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":50
- *                 return  # Cannot initialize until thread becomes active.
  * 
- *             for thread in threading.enumerate():             # <<<<<<<<<<<<<<
- *                 if isinstance(t, threading._DummyThread) and t is thread and t.ident != thread.ident:
- *                     t = thread
  */
-    }
-    __pyx_L8_break:;
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":55
- *                     break
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":24
  * 
- *             if getattr(t, 'is_pydev_daemon_thread', False):             # <<<<<<<<<<<<<<
- *                 self.is_pydevd_thread = True
- *                 self.fully_initialized = True
- */
-    __pyx_t_2 = __Pyx_GetAttr3(__pyx_v_t, __pyx_n_s_is_pydev_daemon_thread, Py_False); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 55, __pyx_L4_error)
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 55, __pyx_L4_error)
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (__pyx_t_5) {
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":56
  * 
- *             if getattr(t, 'is_pydev_daemon_thread', False):
- *                 self.is_pydevd_thread = True             # <<<<<<<<<<<<<<
- *                 self.fully_initialized = True
- *             else:
+ * def dummy_trace_dispatch(frame, str event, arg):             # <<<<<<<<<<<<<<
+ *     if event == 'call':
+ *         if frame.f_trace is not None:
  */
-      __pyx_v_self->is_pydevd_thread = 1;
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":57
- *             if getattr(t, 'is_pydev_daemon_thread', False):
- *                 self.is_pydevd_thread = True
- *                 self.fully_initialized = True             # <<<<<<<<<<<<<<
- *             else:
- *                 try:
- */
-      __pyx_v_self->fully_initialized = 1;
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.dummy_trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":55
- *                     break
+/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":31
+ * 
  * 
- *             if getattr(t, 'is_pydev_daemon_thread', False):             # <<<<<<<<<<<<<<
- *                 self.is_pydevd_thread = True
- *                 self.fully_initialized = True
+ * def decref_py(obj):             # <<<<<<<<<<<<<<
+ *     '''
+ *     Helper to be called from Python.
  */
-      goto __pyx_L13;
-    }
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":59
- *                 self.fully_initialized = True
- *             else:
- *                 try:             # <<<<<<<<<<<<<<
- *                     additional_info = t.additional_info
- *                     if additional_info is None:
- */
-    /*else*/ {
-      {
-        __Pyx_PyThreadState_declare
-        __Pyx_PyThreadState_assign
-        __Pyx_ExceptionSave(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12);
-        __Pyx_XGOTREF(__pyx_t_10);
-        __Pyx_XGOTREF(__pyx_t_11);
-        __Pyx_XGOTREF(__pyx_t_12);
-        /*try:*/ {
-
-          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":60
- *             else:
- *                 try:
- *                     additional_info = t.additional_info             # <<<<<<<<<<<<<<
- *                     if additional_info is None:
- *                         raise AttributeError()
- */
-          __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_t, __pyx_n_s_additional_info); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 60, __pyx_L14_error)
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_v_additional_info = __pyx_t_2;
-          __pyx_t_2 = 0;
-
-          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":61
- *                 try:
- *                     additional_info = t.additional_info
- *                     if additional_info is None:             # <<<<<<<<<<<<<<
- *                         raise AttributeError()
- *                 except:
- */
-          __pyx_t_5 = (__pyx_v_additional_info == Py_None);
-          __pyx_t_4 = (__pyx_t_5 != 0);
-          if (unlikely(__pyx_t_4)) {
-
-            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":62
- *                     additional_info = t.additional_info
- *                     if additional_info is None:
- *                         raise AttributeError()             # <<<<<<<<<<<<<<
- *                 except:
- *                     with _set_additional_thread_info_lock:
- */
-            __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_builtin_AttributeError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 62, __pyx_L14_error)
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_Raise(__pyx_t_2, 0, 0, 0);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __PYX_ERR(0, 62, __pyx_L14_error)
-
-            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":61
- *                 try:
- *                     additional_info = t.additional_info
- *                     if additional_info is None:             # <<<<<<<<<<<<<<
- *                         raise AttributeError()
- *                 except:
- */
-          }
-
-          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":59
- *                 self.fully_initialized = True
- *             else:
- *                 try:             # <<<<<<<<<<<<<<
- *                     additional_info = t.additional_info
- *                     if additional_info is None:
- */
-        }
-        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
-        __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-        goto __pyx_L19_try_end;
-        __pyx_L14_error:;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
-
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":63
- *                     if additional_info is None:
- *                         raise AttributeError()
- *                 except:             # <<<<<<<<<<<<<<
- *                     with _set_additional_thread_info_lock:
- *                         # If it's not there, set it within a lock to avoid any racing
- */
-        /*except:*/ {
-          __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.initialize_if_possible", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_9, &__pyx_t_1) < 0) __PYX_ERR(0, 63, __pyx_L16_except_error)
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_GOTREF(__pyx_t_9);
-          __Pyx_GOTREF(__pyx_t_1);
-
-          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":64
- *                         raise AttributeError()
- *                 except:
- *                     with _set_additional_thread_info_lock:             # <<<<<<<<<<<<<<
- *                         # If it's not there, set it within a lock to avoid any racing
- *                         # conditions.
- */
-          /*with:*/ {
-            __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_set_additional_thread_info_lock); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 64, __pyx_L16_except_error)
-            __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_13 = __Pyx_PyObject_LookupSpecial(__pyx_t_3, __pyx_n_s_exit); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 64, __pyx_L16_except_error)
-            __Pyx_GOTREF(__pyx_t_13);
-            __pyx_t_15 = __Pyx_PyObject_LookupSpecial(__pyx_t_3, __pyx_n_s_enter); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 64, __pyx_L23_error)
-            __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_16 = NULL;
-            if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_15))) {
-              __pyx_t_16 = PyMethod_GET_SELF(__pyx_t_15);
-              if (likely(__pyx_t_16)) {
-                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_15);
-                __Pyx_INCREF(__pyx_t_16);
-                __Pyx_INCREF(function);
-                __Pyx_DECREF_SET(__pyx_t_15, function);
-              }
-            }
-            __pyx_t_14 = (__pyx_t_16) ? __Pyx_PyObject_CallOneArg(__pyx_t_15, __pyx_t_16) : __Pyx_PyObject_CallNoArg(__pyx_t_15);
-            __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
-            if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 64, __pyx_L23_error)
-            __Pyx_GOTREF(__pyx_t_14);
-            __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-            __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            /*try:*/ {
-              {
-                __Pyx_PyThreadState_declare
-                __Pyx_PyThreadState_assign
-                __Pyx_ExceptionSave(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19);
-                __Pyx_XGOTREF(__pyx_t_17);
-                __Pyx_XGOTREF(__pyx_t_18);
-                __Pyx_XGOTREF(__pyx_t_19);
-                /*try:*/ {
-
-                  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":67
- *                         # If it's not there, set it within a lock to avoid any racing
- *                         # conditions.
- *                         additional_info = getattr(thread, 'additional_info', None)             # <<<<<<<<<<<<<<
- *                         if additional_info is None:
- *                             additional_info = PyDBAdditionalThreadInfo()
- */
-                  if (unlikely(!__pyx_v_thread)) { __Pyx_RaiseUnboundLocalError("thread"); __PYX_ERR(0, 67, __pyx_L29_error) }
-                  __pyx_t_3 = __Pyx_GetAttr3(__pyx_v_thread, __pyx_n_s_additional_info, Py_None); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 67, __pyx_L29_error)
-                  __Pyx_GOTREF(__pyx_t_3);
-                  __Pyx_XDECREF_SET(__pyx_v_additional_info, __pyx_t_3);
-                  __pyx_t_3 = 0;
-
-                  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":68
- *                         # conditions.
- *                         additional_info = getattr(thread, 'additional_info', None)
- *                         if additional_info is None:             # <<<<<<<<<<<<<<
- *                             additional_info = PyDBAdditionalThreadInfo()
- *                         t.additional_info = additional_info
- */
-                  __pyx_t_4 = (__pyx_v_additional_info == Py_None);
-                  __pyx_t_5 = (__pyx_t_4 != 0);
-                  if (__pyx_t_5) {
-
-                    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":69
- *                         additional_info = getattr(thread, 'additional_info', None)
- *                         if additional_info is None:
- *                             additional_info = PyDBAdditionalThreadInfo()             # <<<<<<<<<<<<<<
- *                         t.additional_info = additional_info
- *                 self.additional_info = additional_info
- */
-                    __pyx_t_3 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 69, __pyx_L29_error)
-                    __Pyx_GOTREF(__pyx_t_3);
-                    __Pyx_DECREF_SET(__pyx_v_additional_info, __pyx_t_3);
-                    __pyx_t_3 = 0;
-
-                    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":68
- *                         # conditions.
- *                         additional_info = getattr(thread, 'additional_info', None)
- *                         if additional_info is None:             # <<<<<<<<<<<<<<
- *                             additional_info = PyDBAdditionalThreadInfo()
- *                         t.additional_info = additional_info
- */
-                  }
-
-                  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":70
- *                         if additional_info is None:
- *                             additional_info = PyDBAdditionalThreadInfo()
- *                         t.additional_info = additional_info             # <<<<<<<<<<<<<<
- *                 self.additional_info = additional_info
- *                 self.fully_initialized = True
- */
-                  if (__Pyx_PyObject_SetAttrStr(__pyx_v_t, __pyx_n_s_additional_info, __pyx_v_additional_info) < 0) __PYX_ERR(0, 70, __pyx_L29_error)
-
-                  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":64
- *                         raise AttributeError()
- *                 except:
- *                     with _set_additional_thread_info_lock:             # <<<<<<<<<<<<<<
- *                         # If it's not there, set it within a lock to avoid any racing
- *                         # conditions.
- */
-                }
-                __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0;
-                __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0;
-                __Pyx_XDECREF(__pyx_t_19); __pyx_t_19 = 0;
-                goto __pyx_L36_try_end;
-                __pyx_L29_error:;
-                __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
-                __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
-                __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-                /*except:*/ {
-                  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.initialize_if_possible", __pyx_clineno, __pyx_lineno, __pyx_filename);
-                  if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_14, &__pyx_t_15) < 0) __PYX_ERR(0, 64, __pyx_L31_except_error)
-                  __Pyx_GOTREF(__pyx_t_3);
-                  __Pyx_GOTREF(__pyx_t_14);
-                  __Pyx_GOTREF(__pyx_t_15);
-                  __pyx_t_16 = PyTuple_Pack(3, __pyx_t_3, __pyx_t_14, __pyx_t_15); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 64, __pyx_L31_except_error)
-                  __Pyx_GOTREF(__pyx_t_16);
-                  __pyx_t_20 = __Pyx_PyObject_Call(__pyx_t_13, __pyx_t_16, NULL);
-                  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                  __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-                  if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 64, __pyx_L31_except_error)
-                  __Pyx_GOTREF(__pyx_t_20);
-                  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_20);
-                  __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0;
-                  if (__pyx_t_5 < 0) __PYX_ERR(0, 64, __pyx_L31_except_error)
-                  __pyx_t_4 = ((!(__pyx_t_5 != 0)) != 0);
-                  if (__pyx_t_4) {
-                    __Pyx_GIVEREF(__pyx_t_3);
-                    __Pyx_GIVEREF(__pyx_t_14);
-                    __Pyx_XGIVEREF(__pyx_t_15);
-                    __Pyx_ErrRestoreWithState(__pyx_t_3, __pyx_t_14, __pyx_t_15);
-                    __pyx_t_3 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; 
-                    __PYX_ERR(0, 64, __pyx_L31_except_error)
-                  }
-                  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-                  __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
-                  __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
-                  goto __pyx_L30_exception_handled;
-                }
-                __pyx_L31_except_error:;
-                __Pyx_XGIVEREF(__pyx_t_17);
-                __Pyx_XGIVEREF(__pyx_t_18);
-                __Pyx_XGIVEREF(__pyx_t_19);
-                __Pyx_ExceptionReset(__pyx_t_17, __pyx_t_18, __pyx_t_19);
-                goto __pyx_L16_except_error;
-                __pyx_L30_exception_handled:;
-                __Pyx_XGIVEREF(__pyx_t_17);
-                __Pyx_XGIVEREF(__pyx_t_18);
-                __Pyx_XGIVEREF(__pyx_t_19);
-                __Pyx_ExceptionReset(__pyx_t_17, __pyx_t_18, __pyx_t_19);
-                __pyx_L36_try_end:;
-              }
-            }
-            /*finally:*/ {
-              /*normal exit:*/{
-                if (__pyx_t_13) {
-                  __pyx_t_19 = __Pyx_PyObject_Call(__pyx_t_13, __pyx_tuple_, NULL);
-                  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                  if (unlikely(!__pyx_t_19)) __PYX_ERR(0, 64, __pyx_L16_except_error)
-                  __Pyx_GOTREF(__pyx_t_19);
-                  __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-                }
-                goto __pyx_L28;
-              }
-              __pyx_L28:;
-            }
-            goto __pyx_L41;
-            __pyx_L23_error:;
-            __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-            goto __pyx_L16_except_error;
-            __pyx_L41:;
-          }
-          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L15_exception_handled;
-        }
-        __pyx_L16_except_error:;
+/* Python wrapper */
+static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py(PyObject *__pyx_self, PyObject *__pyx_v_obj); /*proto*/
+static char __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py[] = "\n    Helper to be called from Python.\n    ";
+static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py = {"decref_py", (PyCFunction)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py, METH_O, __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py};
+static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py(PyObject *__pyx_self, PyObject *__pyx_v_obj) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("decref_py (wrapper)", 0);
+  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py(__pyx_self, ((PyObject *)__pyx_v_obj));
 
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":59
- *                 self.fully_initialized = True
- *             else:
- *                 try:             # <<<<<<<<<<<<<<
- *                     additional_info = t.additional_info
- *                     if additional_info is None:
- */
-        __Pyx_XGIVEREF(__pyx_t_10);
-        __Pyx_XGIVEREF(__pyx_t_11);
-        __Pyx_XGIVEREF(__pyx_t_12);
-        __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12);
-        goto __pyx_L4_error;
-        __pyx_L15_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_10);
-        __Pyx_XGIVEREF(__pyx_t_11);
-        __Pyx_XGIVEREF(__pyx_t_12);
-        __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12);
-        __pyx_L19_try_end:;
-      }
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":71
- *                             additional_info = PyDBAdditionalThreadInfo()
- *                         t.additional_info = additional_info
- *                 self.additional_info = additional_info             # <<<<<<<<<<<<<<
- *                 self.fully_initialized = True
- *         finally:
- */
-      if (unlikely(!__pyx_v_additional_info)) { __Pyx_RaiseUnboundLocalError("additional_info"); __PYX_ERR(0, 71, __pyx_L4_error) }
-      if (!(likely(((__pyx_v_additional_info) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_additional_info, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo))))) __PYX_ERR(0, 71, __pyx_L4_error)
-      __pyx_t_1 = __pyx_v_additional_info;
-      __Pyx_INCREF(__pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      __Pyx_GOTREF(__pyx_v_self->additional_info);
-      __Pyx_DECREF(((PyObject *)__pyx_v_self->additional_info));
-      __pyx_v_self->additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_1);
-      __pyx_t_1 = 0;
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":72
- *                         t.additional_info = additional_info
- *                 self.additional_info = additional_info
- *                 self.fully_initialized = True             # <<<<<<<<<<<<<<
- *         finally:
- *             self.inside_frame_eval -= 1
- */
-      __pyx_v_self->fully_initialized = 1;
-    }
-    __pyx_L13:;
-  }
+static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_obj) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("decref_py", 0);
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":74
- *                 self.fully_initialized = True
- *         finally:
- *             self.inside_frame_eval -= 1             # <<<<<<<<<<<<<<
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":35
+ *     Helper to be called from Python.
+ *     '''
+ *     Py_DECREF(obj)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  /*finally:*/ {
-    /*normal exit:*/{
-      __pyx_v_self->inside_frame_eval = (__pyx_v_self->inside_frame_eval - 1);
-      goto __pyx_L5;
-    }
-    __pyx_L4_error:;
-    /*exception exit:*/{
-      __Pyx_PyThreadState_declare
-      __Pyx_PyThreadState_assign
-      __pyx_t_12 = 0; __pyx_t_11 = 0; __pyx_t_10 = 0; __pyx_t_13 = 0; __pyx_t_19 = 0; __pyx_t_18 = 0;
-      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
-      __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
-      __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
-      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
-      if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_13, &__pyx_t_19, &__pyx_t_18);
-      if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_12, &__pyx_t_11, &__pyx_t_10) < 0)) __Pyx_ErrFetch(&__pyx_t_12, &__pyx_t_11, &__pyx_t_10);
-      __Pyx_XGOTREF(__pyx_t_12);
-      __Pyx_XGOTREF(__pyx_t_11);
-      __Pyx_XGOTREF(__pyx_t_10);
-      __Pyx_XGOTREF(__pyx_t_13);
-      __Pyx_XGOTREF(__pyx_t_19);
-      __Pyx_XGOTREF(__pyx_t_18);
-      __pyx_t_21 = __pyx_lineno; __pyx_t_22 = __pyx_clineno; __pyx_t_23 = __pyx_filename;
-      {
-        __pyx_v_self->inside_frame_eval = (__pyx_v_self->inside_frame_eval - 1);
-      }
-      if (PY_MAJOR_VERSION >= 3) {
-        __Pyx_XGIVEREF(__pyx_t_13);
-        __Pyx_XGIVEREF(__pyx_t_19);
-        __Pyx_XGIVEREF(__pyx_t_18);
-        __Pyx_ExceptionReset(__pyx_t_13, __pyx_t_19, __pyx_t_18);
-      }
-      __Pyx_XGIVEREF(__pyx_t_12);
-      __Pyx_XGIVEREF(__pyx_t_11);
-      __Pyx_XGIVEREF(__pyx_t_10);
-      __Pyx_ErrRestore(__pyx_t_12, __pyx_t_11, __pyx_t_10);
-      __pyx_t_12 = 0; __pyx_t_11 = 0; __pyx_t_10 = 0; __pyx_t_13 = 0; __pyx_t_19 = 0; __pyx_t_18 = 0;
-      __pyx_lineno = __pyx_t_21; __pyx_clineno = __pyx_t_22; __pyx_filename = __pyx_t_23;
-      goto __pyx_L1_error;
-    }
-    __pyx_L3_return: {
-      __pyx_t_18 = __pyx_r;
-      __pyx_r = 0;
-      __pyx_v_self->inside_frame_eval = (__pyx_v_self->inside_frame_eval - 1);
-      __pyx_r = __pyx_t_18;
-      __pyx_t_18 = 0;
-      goto __pyx_L0;
-    }
-    __pyx_L5:;
-  }
+  Py_DECREF(__pyx_v_obj);
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":39
- *         self.thread_trace_func = None
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":31
+ * 
  * 
- *     def initialize_if_possible(self):             # <<<<<<<<<<<<<<
- *         # Don't call threading.currentThread because if we're too early in the process
- *         # we may create a dummy thread.
+ * def decref_py(obj):             # <<<<<<<<<<<<<<
+ *     '''
+ *     Helper to be called from Python.
  */
 
   /* function exit code */
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_9);
-  __Pyx_XDECREF(__pyx_t_14);
-  __Pyx_XDECREF(__pyx_t_15);
-  __Pyx_XDECREF(__pyx_t_16);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.initialize_if_possible", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_thread_ident);
-  __Pyx_XDECREF(__pyx_v_t);
-  __Pyx_XDECREF(__pyx_v_thread);
-  __Pyx_XDECREF(__pyx_v_additional_info);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":26
- * cdef class ThreadInfo:
+/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":38
  * 
- *     cdef public PyDBAdditionalThreadInfo additional_info             # <<<<<<<<<<<<<<
- *     cdef public bint is_pydevd_thread
- *     cdef public int inside_frame_eval
+ * 
+ * def get_func_code_info_py(code_obj) -> FuncCodeInfo:             # <<<<<<<<<<<<<<
+ *     '''
+ *     Helper to be called from Python.
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->additional_info));
-  __pyx_r = ((PyObject *)__pyx_v_self->additional_info);
-  goto __pyx_L0;
-
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py(PyObject *__pyx_self, PyObject *__pyx_v_code_obj); /*proto*/
+static char __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py[] = "\n    Helper to be called from Python.\n    ";
+static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py = {"get_func_code_info_py", (PyCFunction)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py, METH_O, __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py};
+static struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py(PyObject *__pyx_self, PyObject *__pyx_v_code_obj) {
+  struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannySetupContext("get_func_code_info_py (wrapper)", 0);
+  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py(__pyx_self, ((PyObject *)__pyx_v_code_obj));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_code_obj) {
+  struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo))))) __PYX_ERR(0, 26, __pyx_L1_error)
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->additional_info);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->additional_info));
-  __pyx_v_self->additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_1);
-  __pyx_t_1 = 0;
-
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.additional_info.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_15additional_info_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->additional_info);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->additional_info));
-  __pyx_v_self->additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)Py_None);
-
-  /* function exit code */
-  __pyx_r = 0;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  __Pyx_RefNannySetupContext("get_func_code_info_py", 0);
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":27
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":42
+ *     Helper to be called from Python.
+ *     '''
+ *     return get_func_code_info(<PyCodeObject *> code_obj)             # <<<<<<<<<<<<<<
+ * 
  * 
- *     cdef public PyDBAdditionalThreadInfo additional_info
- *     cdef public bint is_pydevd_thread             # <<<<<<<<<<<<<<
- *     cdef public int inside_frame_eval
- *     cdef public bint fully_initialized
  */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_pydevd_thread); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 27, __pyx_L1_error)
+  __Pyx_XDECREF(((PyObject *)__pyx_r));
+  __pyx_t_1 = ((PyObject *)__pyx_f_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_get_func_code_info(((PyCodeObject *)__pyx_v_code_obj))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 42, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
+  __pyx_r = ((struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo *)__pyx_t_1);
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":38
+ * 
+ * 
+ * def get_func_code_info_py(code_obj) -> FuncCodeInfo:             # <<<<<<<<<<<<<<
+ *     '''
+ *     Helper to be called from Python.
+ */
+
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.is_pydevd_thread.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_func_code_info_py", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_XGIVEREF((PyObject *)__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":45
+ * 
+ * 
+ * cdef PyObject * get_bytecode_while_frame_eval(PyFrameObject * frame_obj, int exc):             # <<<<<<<<<<<<<<
+ *     '''
+ *     This function makes the actual evaluation and changes the bytecode to a version
+ */
 
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_16is_pydevd_thread_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_bytecode_while_frame_eval(PyFrameObject *__pyx_v_frame_obj, int __pyx_v_exc) {
+  struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo *__pyx_v_thread_info = 0;
+  CYTHON_UNUSED int __pyx_v_STATE_SUSPEND;
+  int __pyx_v_CMD_STEP_INTO;
+  int __pyx_v_CMD_STEP_OVER;
+  int __pyx_v_CMD_STEP_INTO_MY_CODE;
+  int __pyx_v_CMD_SMART_STEP_INTO;
+  int __pyx_v_can_skip;
+  struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *__pyx_v_additional_info = 0;
+  PyObject *__pyx_v_main_debugger = 0;
+  PyObject *__pyx_v_frame = NULL;
+  PyObject *__pyx_v_trace_func = NULL;
+  PyObject *__pyx_v_apply_to_global = NULL;
+  struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo *__pyx_v_func_code_info = 0;
+  PyObject *__pyx_v_old = NULL;
+  PyObject *__pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_t_11;
+  PyObject *(*__pyx_t_12)(PyObject *);
+  int __pyx_t_13;
+  char const *__pyx_t_14;
+  PyObject *__pyx_t_15 = NULL;
+  PyObject *__pyx_t_16 = NULL;
+  PyObject *__pyx_t_17 = NULL;
+  PyObject *__pyx_t_18;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 27, __pyx_L1_error)
-  __pyx_v_self->is_pydevd_thread = __pyx_t_1;
-
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.is_pydevd_thread.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  __Pyx_RefNannySetupContext("get_bytecode_while_frame_eval", 0);
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":28
- *     cdef public PyDBAdditionalThreadInfo additional_info
- *     cdef public bint is_pydevd_thread
- *     cdef public int inside_frame_eval             # <<<<<<<<<<<<<<
- *     cdef public bint fully_initialized
- *     cdef public object thread_trace_func
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":50
+ *     where programmatic breakpoints are added.
+ *     '''
+ *     if GlobalDebuggerHolder is None or _thread_local_info is None or exc:             # <<<<<<<<<<<<<<
+ *         # Sometimes during process shutdown these global variables become None
+ *         return _PyEval_EvalFrameDefault(frame_obj, exc)
  */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_GlobalDebuggerHolder); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 50, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = (__pyx_t_2 == Py_None);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_4 = (__pyx_t_3 != 0);
+  if (!__pyx_t_4) {
+  } else {
+    __pyx_t_1 = __pyx_t_4;
+    goto __pyx_L4_bool_binop_done;
+  }
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_thread_local_info); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 50, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_4 = (__pyx_t_2 == Py_None);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_3 = (__pyx_t_4 != 0);
+  if (!__pyx_t_3) {
+  } else {
+    __pyx_t_1 = __pyx_t_3;
+    goto __pyx_L4_bool_binop_done;
+  }
+  __pyx_t_3 = (__pyx_v_exc != 0);
+  __pyx_t_1 = __pyx_t_3;
+  __pyx_L4_bool_binop_done:;
+  if (__pyx_t_1) {
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->inside_frame_eval); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 28, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.inside_frame_eval.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":52
+ *     if GlobalDebuggerHolder is None or _thread_local_info is None or exc:
+ *         # Sometimes during process shutdown these global variables become None
+ *         return _PyEval_EvalFrameDefault(frame_obj, exc)             # <<<<<<<<<<<<<<
+ * 
+ *     # co_filename: str = <str>frame_obj.f_code.co_filename
+ */
+    __pyx_r = _PyEval_EvalFrameDefault(__pyx_v_frame_obj, __pyx_v_exc);
+    goto __pyx_L0;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":50
+ *     where programmatic breakpoints are added.
+ *     '''
+ *     if GlobalDebuggerHolder is None or _thread_local_info is None or exc:             # <<<<<<<<<<<<<<
+ *         # Sometimes during process shutdown these global variables become None
+ *         return _PyEval_EvalFrameDefault(frame_obj, exc)
+ */
+  }
 
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17inside_frame_eval_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 28, __pyx_L1_error)
-  __pyx_v_self->inside_frame_eval = __pyx_t_1;
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":59
+ * 
+ *     cdef ThreadInfo thread_info
+ *     cdef int STATE_SUSPEND = 2             # <<<<<<<<<<<<<<
+ *     cdef int CMD_STEP_INTO = 107
+ *     cdef int CMD_STEP_OVER = 108
+ */
+  __pyx_v_STATE_SUSPEND = 2;
 
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.inside_frame_eval.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":60
+ *     cdef ThreadInfo thread_info
+ *     cdef int STATE_SUSPEND = 2
+ *     cdef int CMD_STEP_INTO = 107             # <<<<<<<<<<<<<<
+ *     cdef int CMD_STEP_OVER = 108
+ *     cdef int CMD_STEP_INTO_MY_CODE = 144
+ */
+  __pyx_v_CMD_STEP_INTO = 0x6B;
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":29
- *     cdef public bint is_pydevd_thread
- *     cdef public int inside_frame_eval
- *     cdef public bint fully_initialized             # <<<<<<<<<<<<<<
- *     cdef public object thread_trace_func
- * 
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":61
+ *     cdef int STATE_SUSPEND = 2
+ *     cdef int CMD_STEP_INTO = 107
+ *     cdef int CMD_STEP_OVER = 108             # <<<<<<<<<<<<<<
+ *     cdef int CMD_STEP_INTO_MY_CODE = 144
+ *     cdef int CMD_SMART_STEP_INTO = 128
  */
+  __pyx_v_CMD_STEP_OVER = 0x6C;
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self));
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":62
+ *     cdef int CMD_STEP_INTO = 107
+ *     cdef int CMD_STEP_OVER = 108
+ *     cdef int CMD_STEP_INTO_MY_CODE = 144             # <<<<<<<<<<<<<<
+ *     cdef int CMD_SMART_STEP_INTO = 128
+ *     cdef bint can_skip = True
+ */
+  __pyx_v_CMD_STEP_INTO_MY_CODE = 0x90;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":63
+ *     cdef int CMD_STEP_OVER = 108
+ *     cdef int CMD_STEP_INTO_MY_CODE = 144
+ *     cdef int CMD_SMART_STEP_INTO = 128             # <<<<<<<<<<<<<<
+ *     cdef bint can_skip = True
+ *     try:
+ */
+  __pyx_v_CMD_SMART_STEP_INTO = 0x80;
 
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->fully_initialized); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 29, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":64
+ *     cdef int CMD_STEP_INTO_MY_CODE = 144
+ *     cdef int CMD_SMART_STEP_INTO = 128
+ *     cdef bint can_skip = True             # <<<<<<<<<<<<<<
+ *     try:
+ *         thread_info = _thread_local_info.thread_info
+ */
+  __pyx_v_can_skip = 1;
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.fully_initialized.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":65
+ *     cdef int CMD_SMART_STEP_INTO = 128
+ *     cdef bint can_skip = True
+ *     try:             # <<<<<<<<<<<<<<
+ *         thread_info = _thread_local_info.thread_info
+ *     except:
+ */
+  {
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+    __Pyx_XGOTREF(__pyx_t_5);
+    __Pyx_XGOTREF(__pyx_t_6);
+    __Pyx_XGOTREF(__pyx_t_7);
+    /*try:*/ {
 
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":66
+ *     cdef bint can_skip = True
+ *     try:
+ *         thread_info = _thread_local_info.thread_info             # <<<<<<<<<<<<<<
+ *     except:
+ *         thread_info = get_thread_info()
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_thread_local_info); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 66, __pyx_L7_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_thread_info); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 66, __pyx_L7_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (!(likely(((__pyx_t_8) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_8, __pyx_ptype_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo))))) __PYX_ERR(0, 66, __pyx_L7_error)
+      __pyx_v_thread_info = ((struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo *)__pyx_t_8);
+      __pyx_t_8 = 0;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":65
+ *     cdef int CMD_SMART_STEP_INTO = 128
+ *     cdef bint can_skip = True
+ *     try:             # <<<<<<<<<<<<<<
+ *         thread_info = _thread_local_info.thread_info
+ *     except:
+ */
+    }
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+    goto __pyx_L12_try_end;
+    __pyx_L7_error:;
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17fully_initialized_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 29, __pyx_L1_error)
-  __pyx_v_self->fully_initialized = __pyx_t_1;
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":67
+ *     try:
+ *         thread_info = _thread_local_info.thread_info
+ *     except:             # <<<<<<<<<<<<<<
+ *         thread_info = get_thread_info()
+ *         if thread_info is None:
+ */
+    /*except:*/ {
+      __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_bytecode_while_frame_eval", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_8, &__pyx_t_2, &__pyx_t_9) < 0) __PYX_ERR(0, 67, __pyx_L9_except_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_GOTREF(__pyx_t_9);
 
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.fully_initialized.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":68
+ *         thread_info = _thread_local_info.thread_info
+ *     except:
+ *         thread_info = get_thread_info()             # <<<<<<<<<<<<<<
+ *         if thread_info is None:
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)
+ */
+      __pyx_t_10 = ((PyObject *)__pyx_f_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_get_thread_info()); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 68, __pyx_L9_except_error)
+      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_XDECREF_SET(__pyx_v_thread_info, ((struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo *)__pyx_t_10));
+      __pyx_t_10 = 0;
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":30
- *     cdef public int inside_frame_eval
- *     cdef public bint fully_initialized
- *     cdef public object thread_trace_func             # <<<<<<<<<<<<<<
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":69
+ *     except:
+ *         thread_info = get_thread_info()
+ *         if thread_info is None:             # <<<<<<<<<<<<<<
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)
  * 
- *     def __init__(self):
  */
+      __pyx_t_1 = (((PyObject *)__pyx_v_thread_info) == Py_None);
+      __pyx_t_3 = (__pyx_t_1 != 0);
+      if (__pyx_t_3) {
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self));
+        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":70
+ *         thread_info = get_thread_info()
+ *         if thread_info is None:
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)             # <<<<<<<<<<<<<<
+ * 
+ *     if thread_info.inside_frame_eval:
+ */
+        __pyx_r = _PyEval_EvalFrameDefault(__pyx_v_frame_obj, __pyx_v_exc);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        goto __pyx_L10_except_return;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":69
+ *     except:
+ *         thread_info = get_thread_info()
+ *         if thread_info is None:             # <<<<<<<<<<<<<<
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)
+ * 
+ */
+      }
+      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+      goto __pyx_L8_exception_handled;
+    }
+    __pyx_L9_except_error:;
 
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->thread_trace_func);
-  __pyx_r = __pyx_v_self->thread_trace_func;
-  goto __pyx_L0;
-
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __Pyx_INCREF(__pyx_v_value);
-  __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(__pyx_v_self->thread_trace_func);
-  __Pyx_DECREF(__pyx_v_self->thread_trace_func);
-  __pyx_v_self->thread_trace_func = __pyx_v_value;
-
-  /* function exit code */
-  __pyx_r = 0;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_17thread_trace_func_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->thread_trace_func);
-  __Pyx_DECREF(__pyx_v_self->thread_trace_func);
-  __pyx_v_self->thread_trace_func = Py_None;
-
-  /* function exit code */
-  __pyx_r = 0;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "(tree fragment)":1
- * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
- *     cdef tuple state
- *     cdef object _dict
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_4__reduce_cython__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_4__reduce_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self) {
-  PyObject *__pyx_v_state = 0;
-  PyObject *__pyx_v__dict = 0;
-  int __pyx_v_use_setstate;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__reduce_cython__", 0);
-
-  /* "(tree fragment)":5
- *     cdef object _dict
- *     cdef bint use_setstate
- *     state = (self.additional_info, self.fully_initialized, self.inside_frame_eval, self.is_pydevd_thread, self.thread_trace_func)             # <<<<<<<<<<<<<<
- *     _dict = getattr(self, '__dict__', None)
- *     if _dict is not None:
- */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->fully_initialized); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->inside_frame_eval); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_v_self->is_pydevd_thread); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_4);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->additional_info));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->additional_info));
-  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_self->additional_info));
-  __Pyx_GIVEREF(__pyx_t_1);
-  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_2);
-  PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3);
-  __Pyx_INCREF(__pyx_v_self->thread_trace_func);
-  __Pyx_GIVEREF(__pyx_v_self->thread_trace_func);
-  PyTuple_SET_ITEM(__pyx_t_4, 4, __pyx_v_self->thread_trace_func);
-  __pyx_t_1 = 0;
-  __pyx_t_2 = 0;
-  __pyx_t_3 = 0;
-  __pyx_v_state = ((PyObject*)__pyx_t_4);
-  __pyx_t_4 = 0;
-
-  /* "(tree fragment)":6
- *     cdef bint use_setstate
- *     state = (self.additional_info, self.fully_initialized, self.inside_frame_eval, self.is_pydevd_thread, self.thread_trace_func)
- *     _dict = getattr(self, '__dict__', None)             # <<<<<<<<<<<<<<
- *     if _dict is not None:
- *         state += (_dict,)
- */
-  __pyx_t_4 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_4);
-  __pyx_v__dict = __pyx_t_4;
-  __pyx_t_4 = 0;
-
-  /* "(tree fragment)":7
- *     state = (self.additional_info, self.fully_initialized, self.inside_frame_eval, self.is_pydevd_thread, self.thread_trace_func)
- *     _dict = getattr(self, '__dict__', None)
- *     if _dict is not None:             # <<<<<<<<<<<<<<
- *         state += (_dict,)
- *         use_setstate = True
- */
-  __pyx_t_5 = (__pyx_v__dict != Py_None);
-  __pyx_t_6 = (__pyx_t_5 != 0);
-  if (__pyx_t_6) {
-
-    /* "(tree fragment)":8
- *     _dict = getattr(self, '__dict__', None)
- *     if _dict is not None:
- *         state += (_dict,)             # <<<<<<<<<<<<<<
- *         use_setstate = True
- *     else:
- */
-    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_INCREF(__pyx_v__dict);
-    __Pyx_GIVEREF(__pyx_v__dict);
-    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v__dict);
-    __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3));
-    __pyx_t_3 = 0;
-
-    /* "(tree fragment)":9
- *     if _dict is not None:
- *         state += (_dict,)
- *         use_setstate = True             # <<<<<<<<<<<<<<
- *     else:
- *         use_setstate = self.additional_info is not None or self.thread_trace_func is not None
- */
-    __pyx_v_use_setstate = 1;
-
-    /* "(tree fragment)":7
- *     state = (self.additional_info, self.fully_initialized, self.inside_frame_eval, self.is_pydevd_thread, self.thread_trace_func)
- *     _dict = getattr(self, '__dict__', None)
- *     if _dict is not None:             # <<<<<<<<<<<<<<
- *         state += (_dict,)
- *         use_setstate = True
- */
-    goto __pyx_L3;
-  }
-
-  /* "(tree fragment)":11
- *         use_setstate = True
- *     else:
- *         use_setstate = self.additional_info is not None or self.thread_trace_func is not None             # <<<<<<<<<<<<<<
- *     if use_setstate:
- *         return __pyx_unpickle_ThreadInfo, (type(self), 0x2ccfa67, None), state
- */
-  /*else*/ {
-    __pyx_t_5 = (((PyObject *)__pyx_v_self->additional_info) != Py_None);
-    __pyx_t_7 = (__pyx_t_5 != 0);
-    if (!__pyx_t_7) {
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-      goto __pyx_L4_bool_binop_done;
-    }
-    __pyx_t_7 = (__pyx_v_self->thread_trace_func != Py_None);
-    __pyx_t_5 = (__pyx_t_7 != 0);
-    __pyx_t_6 = __pyx_t_5;
-    __pyx_L4_bool_binop_done:;
-    __pyx_v_use_setstate = __pyx_t_6;
-  }
-  __pyx_L3:;
-
-  /* "(tree fragment)":12
- *     else:
- *         use_setstate = self.additional_info is not None or self.thread_trace_func is not None
- *     if use_setstate:             # <<<<<<<<<<<<<<
- *         return __pyx_unpickle_ThreadInfo, (type(self), 0x2ccfa67, None), state
- *     else:
- */
-  __pyx_t_6 = (__pyx_v_use_setstate != 0);
-  if (__pyx_t_6) {
-
-    /* "(tree fragment)":13
- *         use_setstate = self.additional_info is not None or self.thread_trace_func is not None
- *     if use_setstate:
- *         return __pyx_unpickle_ThreadInfo, (type(self), 0x2ccfa67, None), state             # <<<<<<<<<<<<<<
- *     else:
- *         return __pyx_unpickle_ThreadInfo, (type(self), 0x2ccfa67, state)
- */
-    __Pyx_XDECREF(__pyx_r);
-    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_ThreadInfo); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
-    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
-    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
-    __Pyx_INCREF(__pyx_int_46987879);
-    __Pyx_GIVEREF(__pyx_int_46987879);
-    PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_int_46987879);
-    __Pyx_INCREF(Py_None);
-    __Pyx_GIVEREF(Py_None);
-    PyTuple_SET_ITEM(__pyx_t_4, 2, Py_None);
-    __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_GIVEREF(__pyx_t_3);
-    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
-    __Pyx_GIVEREF(__pyx_t_4);
-    PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4);
-    __Pyx_INCREF(__pyx_v_state);
-    __Pyx_GIVEREF(__pyx_v_state);
-    PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state);
-    __pyx_t_3 = 0;
-    __pyx_t_4 = 0;
-    __pyx_r = __pyx_t_2;
-    __pyx_t_2 = 0;
-    goto __pyx_L0;
-
-    /* "(tree fragment)":12
- *     else:
- *         use_setstate = self.additional_info is not None or self.thread_trace_func is not None
- *     if use_setstate:             # <<<<<<<<<<<<<<
- *         return __pyx_unpickle_ThreadInfo, (type(self), 0x2ccfa67, None), state
- *     else:
- */
-  }
-
-  /* "(tree fragment)":15
- *         return __pyx_unpickle_ThreadInfo, (type(self), 0x2ccfa67, None), state
- *     else:
- *         return __pyx_unpickle_ThreadInfo, (type(self), 0x2ccfa67, state)             # <<<<<<<<<<<<<<
- * def __setstate_cython__(self, __pyx_state):
- *     __pyx_unpickle_ThreadInfo__set_state(self, __pyx_state)
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":65
+ *     cdef int CMD_SMART_STEP_INTO = 128
+ *     cdef bint can_skip = True
+ *     try:             # <<<<<<<<<<<<<<
+ *         thread_info = _thread_local_info.thread_info
+ *     except:
  */
-  /*else*/ {
-    __Pyx_XDECREF(__pyx_r);
-    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_pyx_unpickle_ThreadInfo); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
-    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
-    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
-    __Pyx_INCREF(__pyx_int_46987879);
-    __Pyx_GIVEREF(__pyx_int_46987879);
-    PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_int_46987879);
-    __Pyx_INCREF(__pyx_v_state);
-    __Pyx_GIVEREF(__pyx_v_state);
-    PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state);
-    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_GIVEREF(__pyx_t_2);
-    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
-    __Pyx_GIVEREF(__pyx_t_4);
-    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4);
-    __pyx_t_2 = 0;
-    __pyx_t_4 = 0;
-    __pyx_r = __pyx_t_3;
-    __pyx_t_3 = 0;
+    __Pyx_XGIVEREF(__pyx_t_5);
+    __Pyx_XGIVEREF(__pyx_t_6);
+    __Pyx_XGIVEREF(__pyx_t_7);
+    __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+    goto __pyx_L1_error;
+    __pyx_L10_except_return:;
+    __Pyx_XGIVEREF(__pyx_t_5);
+    __Pyx_XGIVEREF(__pyx_t_6);
+    __Pyx_XGIVEREF(__pyx_t_7);
+    __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
     goto __pyx_L0;
+    __pyx_L8_exception_handled:;
+    __Pyx_XGIVEREF(__pyx_t_5);
+    __Pyx_XGIVEREF(__pyx_t_6);
+    __Pyx_XGIVEREF(__pyx_t_7);
+    __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+    __pyx_L12_try_end:;
   }
 
-  /* "(tree fragment)":1
- * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
- *     cdef tuple state
- *     cdef object _dict
- */
-
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_state);
-  __Pyx_XDECREF(__pyx_v__dict);
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "(tree fragment)":16
- *     else:
- *         return __pyx_unpickle_ThreadInfo, (type(self), 0x2ccfa67, state)
- * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
- *     __pyx_unpickle_ThreadInfo__set_state(self, __pyx_state)
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_6__setstate_cython__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10ThreadInfo_6__setstate_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__setstate_cython__", 0);
-
-  /* "(tree fragment)":17
- *         return __pyx_unpickle_ThreadInfo, (type(self), 0x2ccfa67, state)
- * def __setstate_cython__(self, __pyx_state):
- *     __pyx_unpickle_ThreadInfo__set_state(self, __pyx_state)             # <<<<<<<<<<<<<<
- */
-  if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error)
-  __pyx_t_1 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle_ThreadInfo__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
-  /* "(tree fragment)":16
- *     else:
- *         return __pyx_unpickle_ThreadInfo, (type(self), 0x2ccfa67, state)
- * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
- *     __pyx_unpickle_ThreadInfo__set_state(self, __pyx_state)
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":72
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)
+ * 
+ *     if thread_info.inside_frame_eval:             # <<<<<<<<<<<<<<
+ *         return _PyEval_EvalFrameDefault(frame_obj, exc)
+ * 
  */
+  __pyx_t_3 = (__pyx_v_thread_info->inside_frame_eval != 0);
+  if (__pyx_t_3) {
 
-  /* function exit code */
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.ThreadInfo.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":93
- *     cdef public int breakpoints_mtime
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":73
  * 
- *     def __init__(self):             # <<<<<<<<<<<<<<
- *         self.co_filename = ''
- *         self.real_path = ''
+ *     if thread_info.inside_frame_eval:
+ *         return _PyEval_EvalFrameDefault(frame_obj, exc)             # <<<<<<<<<<<<<<
+ * 
+ *     if not thread_info.fully_initialized:
  */
+    __pyx_r = _PyEval_EvalFrameDefault(__pyx_v_frame_obj, __pyx_v_exc);
+    goto __pyx_L0;
 
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__init__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1;
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo___init__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo___init__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__init__", 0);
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":94
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":72
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)
+ * 
+ *     if thread_info.inside_frame_eval:             # <<<<<<<<<<<<<<
+ *         return _PyEval_EvalFrameDefault(frame_obj, exc)
  * 
- *     def __init__(self):
- *         self.co_filename = ''             # <<<<<<<<<<<<<<
- *         self.real_path = ''
- *         self.always_skip_code = False
  */
-  __Pyx_INCREF(__pyx_kp_s__2);
-  __Pyx_GIVEREF(__pyx_kp_s__2);
-  __Pyx_GOTREF(__pyx_v_self->co_filename);
-  __Pyx_DECREF(__pyx_v_self->co_filename);
-  __pyx_v_self->co_filename = __pyx_kp_s__2;
+  }
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":95
- *     def __init__(self):
- *         self.co_filename = ''
- *         self.real_path = ''             # <<<<<<<<<<<<<<
- *         self.always_skip_code = False
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":75
+ *         return _PyEval_EvalFrameDefault(frame_obj, exc)
  * 
+ *     if not thread_info.fully_initialized:             # <<<<<<<<<<<<<<
+ *         thread_info.initialize_if_possible()
+ *         if not thread_info.fully_initialized:
  */
-  __Pyx_INCREF(__pyx_kp_s__2);
-  __Pyx_GIVEREF(__pyx_kp_s__2);
-  __Pyx_GOTREF(__pyx_v_self->real_path);
-  __Pyx_DECREF(__pyx_v_self->real_path);
-  __pyx_v_self->real_path = __pyx_kp_s__2;
+  __pyx_t_3 = ((!(__pyx_v_thread_info->fully_initialized != 0)) != 0);
+  if (__pyx_t_3) {
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":96
- *         self.co_filename = ''
- *         self.real_path = ''
- *         self.always_skip_code = False             # <<<<<<<<<<<<<<
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":76
  * 
- *         # If breakpoints are found but new_code is None,
+ *     if not thread_info.fully_initialized:
+ *         thread_info.initialize_if_possible()             # <<<<<<<<<<<<<<
+ *         if not thread_info.fully_initialized:
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)
  */
-  __pyx_v_self->always_skip_code = 0;
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_thread_info), __pyx_n_s_initialize_if_possible); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 76, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_8 = NULL;
+    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
+      __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_2);
+      if (likely(__pyx_t_8)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+        __Pyx_INCREF(__pyx_t_8);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_2, function);
+      }
+    }
+    __pyx_t_9 = (__pyx_t_8) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_8) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
+    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 76, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":101
- *         # this means we weren't able to actually add the code
- *         # where needed, so, fallback to tracing.
- *         self.breakpoint_found = False             # <<<<<<<<<<<<<<
- *         self.new_code = None
- *         self.breakpoints_created = set()
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":77
+ *     if not thread_info.fully_initialized:
+ *         thread_info.initialize_if_possible()
+ *         if not thread_info.fully_initialized:             # <<<<<<<<<<<<<<
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)
+ * 
  */
-  __pyx_v_self->breakpoint_found = 0;
+    __pyx_t_3 = ((!(__pyx_v_thread_info->fully_initialized != 0)) != 0);
+    if (__pyx_t_3) {
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":102
- *         # where needed, so, fallback to tracing.
- *         self.breakpoint_found = False
- *         self.new_code = None             # <<<<<<<<<<<<<<
- *         self.breakpoints_created = set()
- *         self.breakpoints_mtime = -1
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":78
+ *         thread_info.initialize_if_possible()
+ *         if not thread_info.fully_initialized:
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)             # <<<<<<<<<<<<<<
+ * 
+ *     # Can only get additional_info when fully initialized.
  */
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->new_code);
-  __Pyx_DECREF(__pyx_v_self->new_code);
-  __pyx_v_self->new_code = Py_None;
+      __pyx_r = _PyEval_EvalFrameDefault(__pyx_v_frame_obj, __pyx_v_exc);
+      goto __pyx_L0;
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":103
- *         self.breakpoint_found = False
- *         self.new_code = None
- *         self.breakpoints_created = set()             # <<<<<<<<<<<<<<
- *         self.breakpoints_mtime = -1
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":77
+ *     if not thread_info.fully_initialized:
+ *         thread_info.initialize_if_possible()
+ *         if not thread_info.fully_initialized:             # <<<<<<<<<<<<<<
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)
  * 
  */
-  __pyx_t_1 = PySet_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 103, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->breakpoints_created);
-  __Pyx_DECREF(__pyx_v_self->breakpoints_created);
-  __pyx_v_self->breakpoints_created = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
+    }
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":104
- *         self.new_code = None
- *         self.breakpoints_created = set()
- *         self.breakpoints_mtime = -1             # <<<<<<<<<<<<<<
- * 
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":75
+ *         return _PyEval_EvalFrameDefault(frame_obj, exc)
  * 
+ *     if not thread_info.fully_initialized:             # <<<<<<<<<<<<<<
+ *         thread_info.initialize_if_possible()
+ *         if not thread_info.fully_initialized:
  */
-  __pyx_v_self->breakpoints_mtime = -1;
+  }
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":93
- *     cdef public int breakpoints_mtime
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":81
  * 
- *     def __init__(self):             # <<<<<<<<<<<<<<
- *         self.co_filename = ''
- *         self.real_path = ''
+ *     # Can only get additional_info when fully initialized.
+ *     cdef PyDBAdditionalThreadInfo additional_info = thread_info.additional_info             # <<<<<<<<<<<<<<
+ *     if thread_info.is_pydevd_thread or additional_info.is_tracing:
+ *         # Make sure that we don't trace pydevd threads or inside our own calls.
  */
+  __pyx_t_9 = ((PyObject *)__pyx_v_thread_info->additional_info);
+  __Pyx_INCREF(__pyx_t_9);
+  __pyx_v_additional_info = ((struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo *)__pyx_t_9);
+  __pyx_t_9 = 0;
 
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":82
+ *     # Can only get additional_info when fully initialized.
+ *     cdef PyDBAdditionalThreadInfo additional_info = thread_info.additional_info
+ *     if thread_info.is_pydevd_thread or additional_info.is_tracing:             # <<<<<<<<<<<<<<
+ *         # Make sure that we don't trace pydevd threads or inside our own calls.
+ *         return _PyEval_EvalFrameDefault(frame_obj, exc)
+ */
+  __pyx_t_1 = (__pyx_v_thread_info->is_pydevd_thread != 0);
+  if (!__pyx_t_1) {
+  } else {
+    __pyx_t_3 = __pyx_t_1;
+    goto __pyx_L20_bool_binop_done;
+  }
+  __pyx_t_1 = (__pyx_v_additional_info->is_tracing != 0);
+  __pyx_t_3 = __pyx_t_1;
+  __pyx_L20_bool_binop_done:;
+  if (__pyx_t_3) {
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":79
- * cdef class FuncCodeInfo:
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":84
+ *     if thread_info.is_pydevd_thread or additional_info.is_tracing:
+ *         # Make sure that we don't trace pydevd threads or inside our own calls.
+ *         return _PyEval_EvalFrameDefault(frame_obj, exc)             # <<<<<<<<<<<<<<
  * 
- *     cdef public str co_filename             # <<<<<<<<<<<<<<
- *     cdef public str real_path
- *     cdef bint always_skip_code
+ *     # frame = <object> frame_obj
  */
+    __pyx_r = _PyEval_EvalFrameDefault(__pyx_v_frame_obj, __pyx_v_exc);
+    goto __pyx_L0;
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->co_filename);
-  __pyx_r = __pyx_v_self->co_filename;
-  goto __pyx_L0;
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":82
+ *     # Can only get additional_info when fully initialized.
+ *     cdef PyDBAdditionalThreadInfo additional_info = thread_info.additional_info
+ *     if thread_info.is_pydevd_thread or additional_info.is_tracing:             # <<<<<<<<<<<<<<
+ *         # Make sure that we don't trace pydevd threads or inside our own calls.
+ *         return _PyEval_EvalFrameDefault(frame_obj, exc)
+ */
+  }
 
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":91
+ *     #     print('get_bytecode_while_frame_eval', frame.f_lineno, frame.f_code.co_name, frame.f_code.co_filename)
+ * 
+ *     thread_info.inside_frame_eval += 1             # <<<<<<<<<<<<<<
+ *     additional_info.is_tracing = True
+ *     try:
+ */
+  __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval + 1);
 
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":92
+ * 
+ *     thread_info.inside_frame_eval += 1
+ *     additional_info.is_tracing = True             # <<<<<<<<<<<<<<
+ *     try:
+ *         main_debugger: object = GlobalDebuggerHolder.global_dbg
+ */
+  __pyx_v_additional_info->is_tracing = 1;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":93
+ *     thread_info.inside_frame_eval += 1
+ *     additional_info.is_tracing = True
+ *     try:             # <<<<<<<<<<<<<<
+ *         main_debugger: object = GlobalDebuggerHolder.global_dbg
+ * 
+ */
+  /*try:*/ {
 
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyString_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 79, __pyx_L1_error)
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->co_filename);
-  __Pyx_DECREF(__pyx_v_self->co_filename);
-  __pyx_v_self->co_filename = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":94
+ *     additional_info.is_tracing = True
+ *     try:
+ *         main_debugger: object = GlobalDebuggerHolder.global_dbg             # <<<<<<<<<<<<<<
+ * 
+ *         if main_debugger is None or \
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_GlobalDebuggerHolder); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 94, __pyx_L23_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_global_dbg); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 94, __pyx_L23_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_v_main_debugger = __pyx_t_2;
+    __pyx_t_2 = 0;
 
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.co_filename.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":96
+ *         main_debugger: object = GlobalDebuggerHolder.global_dbg
+ * 
+ *         if main_debugger is None or \             # <<<<<<<<<<<<<<
+ *                 not hasattr(main_debugger, "break_on_caught_exceptions") or \
+ *                 not hasattr(main_debugger, "has_plugin_exception_breaks") or \
+ */
+    __pyx_t_1 = (__pyx_v_main_debugger == Py_None);
+    __pyx_t_4 = (__pyx_t_1 != 0);
+    if (!__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L26_bool_binop_done;
+    }
 
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self));
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":97
+ * 
+ *         if main_debugger is None or \
+ *                 not hasattr(main_debugger, "break_on_caught_exceptions") or \             # <<<<<<<<<<<<<<
+ *                 not hasattr(main_debugger, "has_plugin_exception_breaks") or \
+ *                 not hasattr(main_debugger, "stop_on_failed_tests") or \
+ */
+    __pyx_t_4 = __Pyx_HasAttr(__pyx_v_main_debugger, __pyx_n_u_break_on_caught_exceptions); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(0, 97, __pyx_L23_error)
+    __pyx_t_1 = ((!(__pyx_t_4 != 0)) != 0);
+    if (!__pyx_t_1) {
+    } else {
+      __pyx_t_3 = __pyx_t_1;
+      goto __pyx_L26_bool_binop_done;
+    }
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":98
+ *         if main_debugger is None or \
+ *                 not hasattr(main_debugger, "break_on_caught_exceptions") or \
+ *                 not hasattr(main_debugger, "has_plugin_exception_breaks") or \             # <<<<<<<<<<<<<<
+ *                 not hasattr(main_debugger, "stop_on_failed_tests") or \
+ *                 not hasattr(main_debugger, "signature_factory"):
+ */
+    __pyx_t_1 = __Pyx_HasAttr(__pyx_v_main_debugger, __pyx_n_u_has_plugin_exception_breaks); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 98, __pyx_L23_error)
+    __pyx_t_4 = ((!(__pyx_t_1 != 0)) != 0);
+    if (!__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L26_bool_binop_done;
+    }
 
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_11co_filename_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->co_filename);
-  __Pyx_DECREF(__pyx_v_self->co_filename);
-  __pyx_v_self->co_filename = ((PyObject*)Py_None);
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":99
+ *                 not hasattr(main_debugger, "break_on_caught_exceptions") or \
+ *                 not hasattr(main_debugger, "has_plugin_exception_breaks") or \
+ *                 not hasattr(main_debugger, "stop_on_failed_tests") or \             # <<<<<<<<<<<<<<
+ *                 not hasattr(main_debugger, "signature_factory"):
+ *             # Debugger isn't fully initialized here yet
+ */
+    __pyx_t_4 = __Pyx_HasAttr(__pyx_v_main_debugger, __pyx_n_u_stop_on_failed_tests); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(0, 99, __pyx_L23_error)
+    __pyx_t_1 = ((!(__pyx_t_4 != 0)) != 0);
+    if (!__pyx_t_1) {
+    } else {
+      __pyx_t_3 = __pyx_t_1;
+      goto __pyx_L26_bool_binop_done;
+    }
 
-  /* function exit code */
-  __pyx_r = 0;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":100
+ *                 not hasattr(main_debugger, "has_plugin_exception_breaks") or \
+ *                 not hasattr(main_debugger, "stop_on_failed_tests") or \
+ *                 not hasattr(main_debugger, "signature_factory"):             # <<<<<<<<<<<<<<
+ *             # Debugger isn't fully initialized here yet
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)
+ */
+    __pyx_t_1 = __Pyx_HasAttr(__pyx_v_main_debugger, __pyx_n_u_signature_factory); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 100, __pyx_L23_error)
+    __pyx_t_4 = ((!(__pyx_t_1 != 0)) != 0);
+    __pyx_t_3 = __pyx_t_4;
+    __pyx_L26_bool_binop_done:;
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":80
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":96
+ *         main_debugger: object = GlobalDebuggerHolder.global_dbg
  * 
- *     cdef public str co_filename
- *     cdef public str real_path             # <<<<<<<<<<<<<<
- *     cdef bint always_skip_code
- *     cdef public bint breakpoint_found
+ *         if main_debugger is None or \             # <<<<<<<<<<<<<<
+ *                 not hasattr(main_debugger, "break_on_caught_exceptions") or \
+ *                 not hasattr(main_debugger, "has_plugin_exception_breaks") or \
  */
+    if (__pyx_t_3) {
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->real_path);
-  __pyx_r = __pyx_v_self->real_path;
-  goto __pyx_L0;
-
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":102
+ *                 not hasattr(main_debugger, "signature_factory"):
+ *             # Debugger isn't fully initialized here yet
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)             # <<<<<<<<<<<<<<
+ *         frame = <object> frame_obj
+ * 
+ */
+      __pyx_r = _PyEval_EvalFrameDefault(__pyx_v_frame_obj, __pyx_v_exc);
+      goto __pyx_L22_return;
 
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":96
+ *         main_debugger: object = GlobalDebuggerHolder.global_dbg
+ * 
+ *         if main_debugger is None or \             # <<<<<<<<<<<<<<
+ *                 not hasattr(main_debugger, "break_on_caught_exceptions") or \
+ *                 not hasattr(main_debugger, "has_plugin_exception_breaks") or \
+ */
+    }
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":103
+ *             # Debugger isn't fully initialized here yet
+ *             return _PyEval_EvalFrameDefault(frame_obj, exc)
+ *         frame = <object> frame_obj             # <<<<<<<<<<<<<<
+ * 
+ *         if thread_info.thread_trace_func is None:
+ */
+    __pyx_t_2 = ((PyObject *)__pyx_v_frame_obj);
+    __Pyx_INCREF(__pyx_t_2);
+    __pyx_v_frame = __pyx_t_2;
+    __pyx_t_2 = 0;
 
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyString_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 80, __pyx_L1_error)
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->real_path);
-  __Pyx_DECREF(__pyx_v_self->real_path);
-  __pyx_v_self->real_path = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":105
+ *         frame = <object> frame_obj
+ * 
+ *         if thread_info.thread_trace_func is None:             # <<<<<<<<<<<<<<
+ *             trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame)
+ *             if apply_to_global:
+ */
+    __pyx_t_3 = (__pyx_v_thread_info->thread_trace_func == Py_None);
+    __pyx_t_4 = (__pyx_t_3 != 0);
+    if (__pyx_t_4) {
 
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.real_path.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_9real_path_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->real_path);
-  __Pyx_DECREF(__pyx_v_self->real_path);
-  __pyx_v_self->real_path = ((PyObject*)Py_None);
-
-  /* function exit code */
-  __pyx_r = 0;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":82
- *     cdef public str real_path
- *     cdef bint always_skip_code
- *     cdef public bint breakpoint_found             # <<<<<<<<<<<<<<
- *     cdef public object new_code
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":106
  * 
+ *         if thread_info.thread_trace_func is None:
+ *             trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame)             # <<<<<<<<<<<<<<
+ *             if apply_to_global:
+ *                 thread_info.thread_trace_func = trace_func  # ThreadTracer.__call__
  */
+      __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_fix_top_level_trace_and_get_trac); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 106, __pyx_L23_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_8 = NULL;
+      __pyx_t_11 = 0;
+      if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_9))) {
+        __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_9);
+        if (likely(__pyx_t_8)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
+          __Pyx_INCREF(__pyx_t_8);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_9, function);
+          __pyx_t_11 = 1;
+        }
+      }
+      #if CYTHON_FAST_PYCALL
+      if (PyFunction_Check(__pyx_t_9)) {
+        PyObject *__pyx_temp[3] = {__pyx_t_8, __pyx_v_main_debugger, __pyx_v_frame};
+        __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_9, __pyx_temp+1-__pyx_t_11, 2+__pyx_t_11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 106, __pyx_L23_error)
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_GOTREF(__pyx_t_2);
+      } else
+      #endif
+      #if CYTHON_FAST_PYCCALL
+      if (__Pyx_PyFastCFunction_Check(__pyx_t_9)) {
+        PyObject *__pyx_temp[3] = {__pyx_t_8, __pyx_v_main_debugger, __pyx_v_frame};
+        __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_9, __pyx_temp+1-__pyx_t_11, 2+__pyx_t_11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 106, __pyx_L23_error)
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_GOTREF(__pyx_t_2);
+      } else
+      #endif
+      {
+        __pyx_t_10 = PyTuple_New(2+__pyx_t_11); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 106, __pyx_L23_error)
+        __Pyx_GOTREF(__pyx_t_10);
+        if (__pyx_t_8) {
+          __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8); __pyx_t_8 = NULL;
+        }
+        __Pyx_INCREF(__pyx_v_main_debugger);
+        __Pyx_GIVEREF(__pyx_v_main_debugger);
+        PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_11, __pyx_v_main_debugger);
+        __Pyx_INCREF(__pyx_v_frame);
+        __Pyx_GIVEREF(__pyx_v_frame);
+        PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_11, __pyx_v_frame);
+        __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_10, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 106, __pyx_L23_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
+        PyObject* sequence = __pyx_t_2;
+        Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
+        if (unlikely(size != 2)) {
+          if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+          __PYX_ERR(0, 106, __pyx_L23_error)
+        }
+        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        if (likely(PyTuple_CheckExact(sequence))) {
+          __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
+          __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
+        } else {
+          __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
+          __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
+        }
+        __Pyx_INCREF(__pyx_t_9);
+        __Pyx_INCREF(__pyx_t_10);
+        #else
+        __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 106, __pyx_L23_error)
+        __Pyx_GOTREF(__pyx_t_9);
+        __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 106, __pyx_L23_error)
+        __Pyx_GOTREF(__pyx_t_10);
+        #endif
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      } else {
+        Py_ssize_t index = -1;
+        __pyx_t_8 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 106, __pyx_L23_error)
+        __Pyx_GOTREF(__pyx_t_8);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __pyx_t_12 = Py_TYPE(__pyx_t_8)->tp_iternext;
+        index = 0; __pyx_t_9 = __pyx_t_12(__pyx_t_8); if (unlikely(!__pyx_t_9)) goto __pyx_L32_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_9);
+        index = 1; __pyx_t_10 = __pyx_t_12(__pyx_t_8); if (unlikely(!__pyx_t_10)) goto __pyx_L32_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_10);
+        if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_8), 2) < 0) __PYX_ERR(0, 106, __pyx_L23_error)
+        __pyx_t_12 = NULL;
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L33_unpacking_done;
+        __pyx_L32_unpacking_failed:;
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __pyx_t_12 = NULL;
+        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+        __PYX_ERR(0, 106, __pyx_L23_error)
+        __pyx_L33_unpacking_done:;
+      }
+      __pyx_v_trace_func = __pyx_t_9;
+      __pyx_t_9 = 0;
+      __pyx_v_apply_to_global = __pyx_t_10;
+      __pyx_t_10 = 0;
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":107
+ *         if thread_info.thread_trace_func is None:
+ *             trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame)
+ *             if apply_to_global:             # <<<<<<<<<<<<<<
+ *                 thread_info.thread_trace_func = trace_func  # ThreadTracer.__call__
+ * 
+ */
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_apply_to_global); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 107, __pyx_L23_error)
+      if (__pyx_t_4) {
 
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->breakpoint_found); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 82, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":108
+ *             trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame)
+ *             if apply_to_global:
+ *                 thread_info.thread_trace_func = trace_func  # ThreadTracer.__call__             # <<<<<<<<<<<<<<
+ * 
+ *         if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_SMART_STEP_INTO) or \
+ */
+        __Pyx_INCREF(__pyx_v_trace_func);
+        __Pyx_GIVEREF(__pyx_v_trace_func);
+        __Pyx_GOTREF(__pyx_v_thread_info->thread_trace_func);
+        __Pyx_DECREF(__pyx_v_thread_info->thread_trace_func);
+        __pyx_v_thread_info->thread_trace_func = __pyx_v_trace_func;
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.breakpoint_found.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":107
+ *         if thread_info.thread_trace_func is None:
+ *             trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame)
+ *             if apply_to_global:             # <<<<<<<<<<<<<<
+ *                 thread_info.thread_trace_func = trace_func  # ThreadTracer.__call__
+ * 
+ */
+      }
 
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":105
+ *         frame = <object> frame_obj
+ * 
+ *         if thread_info.thread_trace_func is None:             # <<<<<<<<<<<<<<
+ *             trace_func, apply_to_global = fix_top_level_trace_and_get_trace_func(main_debugger, frame)
+ *             if apply_to_global:
+ */
+    }
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":110
+ *                 thread_info.thread_trace_func = trace_func  # ThreadTracer.__call__
+ * 
+ *         if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_SMART_STEP_INTO) or \             # <<<<<<<<<<<<<<
+ *                 main_debugger.break_on_caught_exceptions or \
+ *                 main_debugger.has_plugin_exception_breaks or \
+ */
+    __pyx_t_11 = __pyx_v_additional_info->pydev_step_cmd;
+    __pyx_t_1 = ((__pyx_t_11 == __pyx_v_CMD_STEP_INTO) != 0);
+    if (!__pyx_t_1) {
+    } else {
+      __pyx_t_3 = __pyx_t_1;
+      goto __pyx_L38_bool_binop_done;
+    }
+    __pyx_t_1 = ((__pyx_t_11 == __pyx_v_CMD_STEP_INTO_MY_CODE) != 0);
+    if (!__pyx_t_1) {
+    } else {
+      __pyx_t_3 = __pyx_t_1;
+      goto __pyx_L38_bool_binop_done;
+    }
+    __pyx_t_1 = ((__pyx_t_11 == __pyx_v_CMD_SMART_STEP_INTO) != 0);
+    __pyx_t_3 = __pyx_t_1;
+    __pyx_L38_bool_binop_done:;
+    __pyx_t_1 = (__pyx_t_3 != 0);
+    if (!__pyx_t_1) {
+    } else {
+      __pyx_t_4 = __pyx_t_1;
+      goto __pyx_L36_bool_binop_done;
+    }
 
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_16breakpoint_found_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 82, __pyx_L1_error)
-  __pyx_v_self->breakpoint_found = __pyx_t_1;
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":111
+ * 
+ *         if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_SMART_STEP_INTO) or \
+ *                 main_debugger.break_on_caught_exceptions or \             # <<<<<<<<<<<<<<
+ *                 main_debugger.has_plugin_exception_breaks or \
+ *                 main_debugger.signature_factory or \
+ */
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_break_on_caught_exceptions); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 111, __pyx_L23_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 111, __pyx_L23_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (!__pyx_t_1) {
+    } else {
+      __pyx_t_4 = __pyx_t_1;
+      goto __pyx_L36_bool_binop_done;
+    }
 
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.breakpoint_found.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":112
+ *         if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_SMART_STEP_INTO) or \
+ *                 main_debugger.break_on_caught_exceptions or \
+ *                 main_debugger.has_plugin_exception_breaks or \             # <<<<<<<<<<<<<<
+ *                 main_debugger.signature_factory or \
+ *                 additional_info.pydev_step_cmd == CMD_STEP_OVER and main_debugger.show_return_values and frame.f_back is additional_info.pydev_step_stop:
+ */
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_has_plugin_exception_breaks); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 112, __pyx_L23_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 112, __pyx_L23_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (!__pyx_t_1) {
+    } else {
+      __pyx_t_4 = __pyx_t_1;
+      goto __pyx_L36_bool_binop_done;
+    }
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":83
- *     cdef bint always_skip_code
- *     cdef public bint breakpoint_found
- *     cdef public object new_code             # <<<<<<<<<<<<<<
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":113
+ *                 main_debugger.break_on_caught_exceptions or \
+ *                 main_debugger.has_plugin_exception_breaks or \
+ *                 main_debugger.signature_factory or \             # <<<<<<<<<<<<<<
+ *                 additional_info.pydev_step_cmd == CMD_STEP_OVER and main_debugger.show_return_values and frame.f_back is additional_info.pydev_step_stop:
  * 
- *     # Lines with the breakpoints which were actually added to this function.
  */
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_signature_factory); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 113, __pyx_L23_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 113, __pyx_L23_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (!__pyx_t_1) {
+    } else {
+      __pyx_t_4 = __pyx_t_1;
+      goto __pyx_L36_bool_binop_done;
+    }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->new_code);
-  __pyx_r = __pyx_v_self->new_code;
-  goto __pyx_L0;
-
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":114
+ *                 main_debugger.has_plugin_exception_breaks or \
+ *                 main_debugger.signature_factory or \
+ *                 additional_info.pydev_step_cmd == CMD_STEP_OVER and main_debugger.show_return_values and frame.f_back is additional_info.pydev_step_stop:             # <<<<<<<<<<<<<<
+ * 
+ *             if thread_info.thread_trace_func is not None:
+ */
+    __pyx_t_1 = ((__pyx_v_additional_info->pydev_step_cmd == __pyx_v_CMD_STEP_OVER) != 0);
+    if (__pyx_t_1) {
+    } else {
+      __pyx_t_4 = __pyx_t_1;
+      goto __pyx_L36_bool_binop_done;
+    }
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_show_return_values); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L23_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 114, __pyx_L23_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (__pyx_t_1) {
+    } else {
+      __pyx_t_4 = __pyx_t_1;
+      goto __pyx_L36_bool_binop_done;
+    }
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_back); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L23_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = (__pyx_t_2 == __pyx_v_additional_info->pydev_step_stop);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_3 = (__pyx_t_1 != 0);
+    __pyx_t_4 = __pyx_t_3;
+    __pyx_L36_bool_binop_done:;
 
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":110
+ *                 thread_info.thread_trace_func = trace_func  # ThreadTracer.__call__
+ * 
+ *         if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_SMART_STEP_INTO) or \             # <<<<<<<<<<<<<<
+ *                 main_debugger.break_on_caught_exceptions or \
+ *                 main_debugger.has_plugin_exception_breaks or \
+ */
+    if (__pyx_t_4) {
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":116
+ *                 additional_info.pydev_step_cmd == CMD_STEP_OVER and main_debugger.show_return_values and frame.f_back is additional_info.pydev_step_stop:
+ * 
+ *             if thread_info.thread_trace_func is not None:             # <<<<<<<<<<<<<<
+ *                 frame.f_trace = thread_info.thread_trace_func
+ *             else:
+ */
+      __pyx_t_4 = (__pyx_v_thread_info->thread_trace_func != Py_None);
+      __pyx_t_3 = (__pyx_t_4 != 0);
+      if (__pyx_t_3) {
 
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __Pyx_INCREF(__pyx_v_value);
-  __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(__pyx_v_self->new_code);
-  __Pyx_DECREF(__pyx_v_self->new_code);
-  __pyx_v_self->new_code = __pyx_v_value;
+        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":117
+ * 
+ *             if thread_info.thread_trace_func is not None:
+ *                 frame.f_trace = thread_info.thread_trace_func             # <<<<<<<<<<<<<<
+ *             else:
+ *                 frame.f_trace = <object> main_debugger.trace_dispatch
+ */
+        __pyx_t_2 = __pyx_v_thread_info->thread_trace_func;
+        __Pyx_INCREF(__pyx_t_2);
+        if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_2) < 0) __PYX_ERR(0, 117, __pyx_L23_error)
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* function exit code */
-  __pyx_r = 0;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":116
+ *                 additional_info.pydev_step_cmd == CMD_STEP_OVER and main_debugger.show_return_values and frame.f_back is additional_info.pydev_step_stop:
+ * 
+ *             if thread_info.thread_trace_func is not None:             # <<<<<<<<<<<<<<
+ *                 frame.f_trace = thread_info.thread_trace_func
+ *             else:
+ */
+        goto __pyx_L46;
+      }
 
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self));
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":119
+ *                 frame.f_trace = thread_info.thread_trace_func
+ *             else:
+ *                 frame.f_trace = <object> main_debugger.trace_dispatch             # <<<<<<<<<<<<<<
+ *         else:
+ *             func_code_info: FuncCodeInfo = get_func_code_info(frame_obj.f_code)
+ */
+      /*else*/ {
+        __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 119, __pyx_L23_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_10 = __pyx_t_2;
+        __Pyx_INCREF(__pyx_t_10);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_10) < 0) __PYX_ERR(0, 119, __pyx_L23_error)
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      }
+      __pyx_L46:;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":110
+ *                 thread_info.thread_trace_func = trace_func  # ThreadTracer.__call__
+ * 
+ *         if additional_info.pydev_step_cmd in (CMD_STEP_INTO, CMD_STEP_INTO_MY_CODE, CMD_SMART_STEP_INTO) or \             # <<<<<<<<<<<<<<
+ *                 main_debugger.break_on_caught_exceptions or \
+ *                 main_debugger.has_plugin_exception_breaks or \
+ */
+      goto __pyx_L35;
+    }
 
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_8new_code_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->new_code);
-  __Pyx_DECREF(__pyx_v_self->new_code);
-  __pyx_v_self->new_code = Py_None;
+    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":121
+ *                 frame.f_trace = <object> main_debugger.trace_dispatch
+ *         else:
+ *             func_code_info: FuncCodeInfo = get_func_code_info(frame_obj.f_code)             # <<<<<<<<<<<<<<
+ *             # if DEBUG:
+ *             #     print('get_bytecode_while_frame_eval always skip', func_code_info.always_skip_code)
+ */
+    /*else*/ {
+      __pyx_t_10 = ((PyObject *)__pyx_f_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_get_func_code_info(__pyx_v_frame_obj->f_code)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 121, __pyx_L23_error)
+      __Pyx_GOTREF(__pyx_t_10);
+      __pyx_v_func_code_info = ((struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo *)__pyx_t_10);
+      __pyx_t_10 = 0;
 
-  /* function exit code */
-  __pyx_r = 0;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":124
+ *             # if DEBUG:
+ *             #     print('get_bytecode_while_frame_eval always skip', func_code_info.always_skip_code)
+ *             if not func_code_info.always_skip_code:             # <<<<<<<<<<<<<<
+ * 
+ *                 if main_debugger.has_plugin_line_breaks:
+ */
+      __pyx_t_3 = ((!(__pyx_v_func_code_info->always_skip_code != 0)) != 0);
+      if (__pyx_t_3) {
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":86
+        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":126
+ *             if not func_code_info.always_skip_code:
  * 
- *     # Lines with the breakpoints which were actually added to this function.
- *     cdef public set breakpoints_created             # <<<<<<<<<<<<<<
+ *                 if main_debugger.has_plugin_line_breaks:             # <<<<<<<<<<<<<<
+ *                     can_skip = not main_debugger.plugin.can_not_skip(main_debugger, None, <object> frame_obj, None)
  * 
- *     # When breakpoints_mtime != PyDb.mtime the validity of breakpoints have
  */
+        __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_has_plugin_line_breaks); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 126, __pyx_L23_error)
+        __Pyx_GOTREF(__pyx_t_10);
+        __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 126, __pyx_L23_error)
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+        if (__pyx_t_3) {
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self));
+          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":127
+ * 
+ *                 if main_debugger.has_plugin_line_breaks:
+ *                     can_skip = not main_debugger.plugin.can_not_skip(main_debugger, None, <object> frame_obj, None)             # <<<<<<<<<<<<<<
+ * 
+ *                     if not can_skip:
+ */
+          __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_plugin); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 127, __pyx_L23_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_can_not_skip); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 127, __pyx_L23_error)
+          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_2 = NULL;
+          __pyx_t_11 = 0;
+          if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_9))) {
+            __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_9);
+            if (likely(__pyx_t_2)) {
+              PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
+              __Pyx_INCREF(__pyx_t_2);
+              __Pyx_INCREF(function);
+              __Pyx_DECREF_SET(__pyx_t_9, function);
+              __pyx_t_11 = 1;
+            }
+          }
+          #if CYTHON_FAST_PYCALL
+          if (PyFunction_Check(__pyx_t_9)) {
+            PyObject *__pyx_temp[5] = {__pyx_t_2, __pyx_v_main_debugger, Py_None, ((PyObject *)__pyx_v_frame_obj), Py_None};
+            __pyx_t_10 = __Pyx_PyFunction_FastCall(__pyx_t_9, __pyx_temp+1-__pyx_t_11, 4+__pyx_t_11); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 127, __pyx_L23_error)
+            __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_GOTREF(__pyx_t_10);
+          } else
+          #endif
+          #if CYTHON_FAST_PYCCALL
+          if (__Pyx_PyFastCFunction_Check(__pyx_t_9)) {
+            PyObject *__pyx_temp[5] = {__pyx_t_2, __pyx_v_main_debugger, Py_None, ((PyObject *)__pyx_v_frame_obj), Py_None};
+            __pyx_t_10 = __Pyx_PyCFunction_FastCall(__pyx_t_9, __pyx_temp+1-__pyx_t_11, 4+__pyx_t_11); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 127, __pyx_L23_error)
+            __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_GOTREF(__pyx_t_10);
+          } else
+          #endif
+          {
+            __pyx_t_8 = PyTuple_New(4+__pyx_t_11); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 127, __pyx_L23_error)
+            __Pyx_GOTREF(__pyx_t_8);
+            if (__pyx_t_2) {
+              __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2); __pyx_t_2 = NULL;
+            }
+            __Pyx_INCREF(__pyx_v_main_debugger);
+            __Pyx_GIVEREF(__pyx_v_main_debugger);
+            PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_11, __pyx_v_main_debugger);
+            __Pyx_INCREF(Py_None);
+            __Pyx_GIVEREF(Py_None);
+            PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_11, Py_None);
+            __Pyx_INCREF(((PyObject *)__pyx_v_frame_obj));
+            __Pyx_GIVEREF(((PyObject *)__pyx_v_frame_obj));
+            PyTuple_SET_ITEM(__pyx_t_8, 2+__pyx_t_11, ((PyObject *)__pyx_v_frame_obj));
+            __Pyx_INCREF(Py_None);
+            __Pyx_GIVEREF(Py_None);
+            PyTuple_SET_ITEM(__pyx_t_8, 3+__pyx_t_11, Py_None);
+            __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_8, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 127, __pyx_L23_error)
+            __Pyx_GOTREF(__pyx_t_10);
+            __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          }
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 127, __pyx_L23_error)
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __pyx_v_can_skip = (!__pyx_t_3);
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":129
+ *                     can_skip = not main_debugger.plugin.can_not_skip(main_debugger, None, <object> frame_obj, None)
+ * 
+ *                     if not can_skip:             # <<<<<<<<<<<<<<
+ *                         # if DEBUG:
+ *                         #     print('get_bytecode_while_frame_eval not can_skip')
+ */
+          __pyx_t_3 = ((!(__pyx_v_can_skip != 0)) != 0);
+          if (__pyx_t_3) {
 
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->breakpoints_created);
-  __pyx_r = __pyx_v_self->breakpoints_created;
-  goto __pyx_L0;
+            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":132
+ *                         # if DEBUG:
+ *                         #     print('get_bytecode_while_frame_eval not can_skip')
+ *                         if thread_info.thread_trace_func is not None:             # <<<<<<<<<<<<<<
+ *                             frame.f_trace = thread_info.thread_trace_func
+ *                         else:
+ */
+            __pyx_t_3 = (__pyx_v_thread_info->thread_trace_func != Py_None);
+            __pyx_t_4 = (__pyx_t_3 != 0);
+            if (__pyx_t_4) {
 
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+              /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":133
+ *                         #     print('get_bytecode_while_frame_eval not can_skip')
+ *                         if thread_info.thread_trace_func is not None:
+ *                             frame.f_trace = thread_info.thread_trace_func             # <<<<<<<<<<<<<<
+ *                         else:
+ *                             frame.f_trace = <object> main_debugger.trace_dispatch
+ */
+              __pyx_t_10 = __pyx_v_thread_info->thread_trace_func;
+              __Pyx_INCREF(__pyx_t_10);
+              if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_10) < 0) __PYX_ERR(0, 133, __pyx_L23_error)
+              __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+              /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":132
+ *                         # if DEBUG:
+ *                         #     print('get_bytecode_while_frame_eval not can_skip')
+ *                         if thread_info.thread_trace_func is not None:             # <<<<<<<<<<<<<<
+ *                             frame.f_trace = thread_info.thread_trace_func
+ *                         else:
+ */
+              goto __pyx_L50;
+            }
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PySet_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "set", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 86, __pyx_L1_error)
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->breakpoints_created);
-  __Pyx_DECREF(__pyx_v_self->breakpoints_created);
-  __pyx_v_self->breakpoints_created = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
-
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.breakpoints_created.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created_4__del__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_19breakpoints_created_4__del__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->breakpoints_created);
-  __Pyx_DECREF(__pyx_v_self->breakpoints_created);
-  __pyx_v_self->breakpoints_created = ((PyObject*)Py_None);
-
-  /* function exit code */
-  __pyx_r = 0;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":91
- *     # to be re-evaluated (if invalid a new FuncCodeInfo must be created and
- *     # tracing can't be disabled for the related frames).
- *     cdef public int breakpoints_mtime             # <<<<<<<<<<<<<<
+            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":135
+ *                             frame.f_trace = thread_info.thread_trace_func
+ *                         else:
+ *                             frame.f_trace = <object> main_debugger.trace_dispatch             # <<<<<<<<<<<<<<
  * 
- *     def __init__(self):
+ *                 if (can_skip and func_code_info.breakpoint_found) or main_debugger.stop_on_failed_tests:
  */
+            /*else*/ {
+              __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 135, __pyx_L23_error)
+              __Pyx_GOTREF(__pyx_t_10);
+              __pyx_t_9 = __pyx_t_10;
+              __Pyx_INCREF(__pyx_t_9);
+              __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+              if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_9) < 0) __PYX_ERR(0, 135, __pyx_L23_error)
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            }
+            __pyx_L50:;
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime___get__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime___get__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->breakpoints_mtime); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 91, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.breakpoints_mtime.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_2__set__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_17breakpoints_mtime_2__set__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 91, __pyx_L1_error)
-  __pyx_v_self->breakpoints_mtime = __pyx_t_1;
-
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.breakpoints_mtime.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "(tree fragment)":1
- * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
- *     cdef tuple state
- *     cdef object _dict
+            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":129
+ *                     can_skip = not main_debugger.plugin.can_not_skip(main_debugger, None, <object> frame_obj, None)
+ * 
+ *                     if not can_skip:             # <<<<<<<<<<<<<<
+ *                         # if DEBUG:
+ *                         #     print('get_bytecode_while_frame_eval not can_skip')
  */
+          }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_2__reduce_cython__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_2__reduce_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self) {
-  PyObject *__pyx_v_state = 0;
-  PyObject *__pyx_v__dict = 0;
-  int __pyx_v_use_setstate;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__reduce_cython__", 0);
-
-  /* "(tree fragment)":5
- *     cdef object _dict
- *     cdef bint use_setstate
- *     state = (self.always_skip_code, self.breakpoint_found, self.breakpoints_created, self.breakpoints_mtime, self.co_filename, self.new_code, self.real_path)             # <<<<<<<<<<<<<<
- *     _dict = getattr(self, '__dict__', None)
- *     if _dict is not None:
+          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":126
+ *             if not func_code_info.always_skip_code:
+ * 
+ *                 if main_debugger.has_plugin_line_breaks:             # <<<<<<<<<<<<<<
+ *                     can_skip = not main_debugger.plugin.can_not_skip(main_debugger, None, <object> frame_obj, None)
+ * 
  */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->always_skip_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->breakpoint_found); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->breakpoints_mtime); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = PyTuple_New(7); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_4);
-  __Pyx_GIVEREF(__pyx_t_1);
-  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_2);
-  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
-  __Pyx_INCREF(__pyx_v_self->breakpoints_created);
-  __Pyx_GIVEREF(__pyx_v_self->breakpoints_created);
-  PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_self->breakpoints_created);
-  __Pyx_GIVEREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3);
-  __Pyx_INCREF(__pyx_v_self->co_filename);
-  __Pyx_GIVEREF(__pyx_v_self->co_filename);
-  PyTuple_SET_ITEM(__pyx_t_4, 4, __pyx_v_self->co_filename);
-  __Pyx_INCREF(__pyx_v_self->new_code);
-  __Pyx_GIVEREF(__pyx_v_self->new_code);
-  PyTuple_SET_ITEM(__pyx_t_4, 5, __pyx_v_self->new_code);
-  __Pyx_INCREF(__pyx_v_self->real_path);
-  __Pyx_GIVEREF(__pyx_v_self->real_path);
-  PyTuple_SET_ITEM(__pyx_t_4, 6, __pyx_v_self->real_path);
-  __pyx_t_1 = 0;
-  __pyx_t_2 = 0;
-  __pyx_t_3 = 0;
-  __pyx_v_state = ((PyObject*)__pyx_t_4);
-  __pyx_t_4 = 0;
-
-  /* "(tree fragment)":6
- *     cdef bint use_setstate
- *     state = (self.always_skip_code, self.breakpoint_found, self.breakpoints_created, self.breakpoints_mtime, self.co_filename, self.new_code, self.real_path)
- *     _dict = getattr(self, '__dict__', None)             # <<<<<<<<<<<<<<
- *     if _dict is not None:
- *         state += (_dict,)
- */
-  __pyx_t_4 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_4);
-  __pyx_v__dict = __pyx_t_4;
-  __pyx_t_4 = 0;
-
-  /* "(tree fragment)":7
- *     state = (self.always_skip_code, self.breakpoint_found, self.breakpoints_created, self.breakpoints_mtime, self.co_filename, self.new_code, self.real_path)
- *     _dict = getattr(self, '__dict__', None)
- *     if _dict is not None:             # <<<<<<<<<<<<<<
- *         state += (_dict,)
- *         use_setstate = True
- */
-  __pyx_t_5 = (__pyx_v__dict != Py_None);
-  __pyx_t_6 = (__pyx_t_5 != 0);
-  if (__pyx_t_6) {
-
-    /* "(tree fragment)":8
- *     _dict = getattr(self, '__dict__', None)
- *     if _dict is not None:
- *         state += (_dict,)             # <<<<<<<<<<<<<<
- *         use_setstate = True
- *     else:
- */
-    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_INCREF(__pyx_v__dict);
-    __Pyx_GIVEREF(__pyx_v__dict);
-    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v__dict);
-    __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3));
-    __pyx_t_3 = 0;
-
-    /* "(tree fragment)":9
- *     if _dict is not None:
- *         state += (_dict,)
- *         use_setstate = True             # <<<<<<<<<<<<<<
- *     else:
- *         use_setstate = self.breakpoints_created is not None or self.co_filename is not None or self.new_code is not None or self.real_path is not None
- */
-    __pyx_v_use_setstate = 1;
-
-    /* "(tree fragment)":7
- *     state = (self.always_skip_code, self.breakpoint_found, self.breakpoints_created, self.breakpoints_mtime, self.co_filename, self.new_code, self.real_path)
- *     _dict = getattr(self, '__dict__', None)
- *     if _dict is not None:             # <<<<<<<<<<<<<<
- *         state += (_dict,)
- *         use_setstate = True
- */
-    goto __pyx_L3;
-  }
-
-  /* "(tree fragment)":11
- *         use_setstate = True
- *     else:
- *         use_setstate = self.breakpoints_created is not None or self.co_filename is not None or self.new_code is not None or self.real_path is not None             # <<<<<<<<<<<<<<
- *     if use_setstate:
- *         return __pyx_unpickle_FuncCodeInfo, (type(self), 0xdaf6aa4, None), state
- */
-  /*else*/ {
-    __pyx_t_5 = (__pyx_v_self->breakpoints_created != ((PyObject*)Py_None));
-    __pyx_t_7 = (__pyx_t_5 != 0);
-    if (!__pyx_t_7) {
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-      goto __pyx_L4_bool_binop_done;
-    }
-    __pyx_t_7 = (__pyx_v_self->co_filename != ((PyObject*)Py_None));
-    __pyx_t_5 = (__pyx_t_7 != 0);
-    if (!__pyx_t_5) {
-    } else {
-      __pyx_t_6 = __pyx_t_5;
-      goto __pyx_L4_bool_binop_done;
-    }
-    __pyx_t_5 = (__pyx_v_self->new_code != Py_None);
-    __pyx_t_7 = (__pyx_t_5 != 0);
-    if (!__pyx_t_7) {
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-      goto __pyx_L4_bool_binop_done;
-    }
-    __pyx_t_7 = (__pyx_v_self->real_path != ((PyObject*)Py_None));
-    __pyx_t_5 = (__pyx_t_7 != 0);
-    __pyx_t_6 = __pyx_t_5;
-    __pyx_L4_bool_binop_done:;
-    __pyx_v_use_setstate = __pyx_t_6;
-  }
-  __pyx_L3:;
-
-  /* "(tree fragment)":12
- *     else:
- *         use_setstate = self.breakpoints_created is not None or self.co_filename is not None or self.new_code is not None or self.real_path is not None
- *     if use_setstate:             # <<<<<<<<<<<<<<
- *         return __pyx_unpickle_FuncCodeInfo, (type(self), 0xdaf6aa4, None), state
- *     else:
- */
-  __pyx_t_6 = (__pyx_v_use_setstate != 0);
-  if (__pyx_t_6) {
-
-    /* "(tree fragment)":13
- *         use_setstate = self.breakpoints_created is not None or self.co_filename is not None or self.new_code is not None or self.real_path is not None
- *     if use_setstate:
- *         return __pyx_unpickle_FuncCodeInfo, (type(self), 0xdaf6aa4, None), state             # <<<<<<<<<<<<<<
- *     else:
- *         return __pyx_unpickle_FuncCodeInfo, (type(self), 0xdaf6aa4, state)
- */
-    __Pyx_XDECREF(__pyx_r);
-    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_FuncCodeInfo); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
-    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
-    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
-    __Pyx_INCREF(__pyx_int_229599908);
-    __Pyx_GIVEREF(__pyx_int_229599908);
-    PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_int_229599908);
-    __Pyx_INCREF(Py_None);
-    __Pyx_GIVEREF(Py_None);
-    PyTuple_SET_ITEM(__pyx_t_4, 2, Py_None);
-    __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_GIVEREF(__pyx_t_3);
-    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
-    __Pyx_GIVEREF(__pyx_t_4);
-    PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4);
-    __Pyx_INCREF(__pyx_v_state);
-    __Pyx_GIVEREF(__pyx_v_state);
-    PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state);
-    __pyx_t_3 = 0;
-    __pyx_t_4 = 0;
-    __pyx_r = __pyx_t_2;
-    __pyx_t_2 = 0;
-    goto __pyx_L0;
+        }
 
-    /* "(tree fragment)":12
- *     else:
- *         use_setstate = self.breakpoints_created is not None or self.co_filename is not None or self.new_code is not None or self.real_path is not None
- *     if use_setstate:             # <<<<<<<<<<<<<<
- *         return __pyx_unpickle_FuncCodeInfo, (type(self), 0xdaf6aa4, None), state
- *     else:
+        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":137
+ *                             frame.f_trace = <object> main_debugger.trace_dispatch
+ * 
+ *                 if (can_skip and func_code_info.breakpoint_found) or main_debugger.stop_on_failed_tests:             # <<<<<<<<<<<<<<
+ *                     # if DEBUG:
+ *                     #     print('get_bytecode_while_frame_eval new_code', func_code_info.new_code)
  */
-  }
+        __pyx_t_3 = (__pyx_v_can_skip != 0);
+        if (!__pyx_t_3) {
+          goto __pyx_L53_next_or;
+        } else {
+        }
+        __pyx_t_3 = (__pyx_v_func_code_info->breakpoint_found != 0);
+        if (!__pyx_t_3) {
+        } else {
+          __pyx_t_4 = __pyx_t_3;
+          goto __pyx_L52_bool_binop_done;
+        }
+        __pyx_L53_next_or:;
+        __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_stop_on_failed_tests); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 137, __pyx_L23_error)
+        __Pyx_GOTREF(__pyx_t_9);
+        __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 137, __pyx_L23_error)
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __pyx_t_4 = __pyx_t_3;
+        __pyx_L52_bool_binop_done:;
+        if (__pyx_t_4) {
 
-  /* "(tree fragment)":15
- *         return __pyx_unpickle_FuncCodeInfo, (type(self), 0xdaf6aa4, None), state
- *     else:
- *         return __pyx_unpickle_FuncCodeInfo, (type(self), 0xdaf6aa4, state)             # <<<<<<<<<<<<<<
- * def __setstate_cython__(self, __pyx_state):
- *     __pyx_unpickle_FuncCodeInfo__set_state(self, __pyx_state)
+          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":144
+ *                     # this means we weren't able to actually add the code
+ *                     # where needed, so, fallback to tracing.
+ *                     if func_code_info.new_code is None:             # <<<<<<<<<<<<<<
+ *                         if thread_info.thread_trace_func is not None:
+ *                             frame.f_trace = thread_info.thread_trace_func
  */
-  /*else*/ {
-    __Pyx_XDECREF(__pyx_r);
-    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_pyx_unpickle_FuncCodeInfo); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
-    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
-    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
-    __Pyx_INCREF(__pyx_int_229599908);
-    __Pyx_GIVEREF(__pyx_int_229599908);
-    PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_int_229599908);
-    __Pyx_INCREF(__pyx_v_state);
-    __Pyx_GIVEREF(__pyx_v_state);
-    PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state);
-    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_GIVEREF(__pyx_t_2);
-    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
-    __Pyx_GIVEREF(__pyx_t_4);
-    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4);
-    __pyx_t_2 = 0;
-    __pyx_t_4 = 0;
-    __pyx_r = __pyx_t_3;
-    __pyx_t_3 = 0;
-    goto __pyx_L0;
-  }
+          __pyx_t_4 = (__pyx_v_func_code_info->new_code == Py_None);
+          __pyx_t_3 = (__pyx_t_4 != 0);
+          if (__pyx_t_3) {
 
-  /* "(tree fragment)":1
- * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
- *     cdef tuple state
- *     cdef object _dict
+            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":145
+ *                     # where needed, so, fallback to tracing.
+ *                     if func_code_info.new_code is None:
+ *                         if thread_info.thread_trace_func is not None:             # <<<<<<<<<<<<<<
+ *                             frame.f_trace = thread_info.thread_trace_func
+ *                         else:
  */
+            __pyx_t_3 = (__pyx_v_thread_info->thread_trace_func != Py_None);
+            __pyx_t_4 = (__pyx_t_3 != 0);
+            if (__pyx_t_4) {
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_state);
-  __Pyx_XDECREF(__pyx_v__dict);
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "(tree fragment)":16
- *     else:
- *         return __pyx_unpickle_FuncCodeInfo, (type(self), 0xdaf6aa4, state)
- * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
- *     __pyx_unpickle_FuncCodeInfo__set_state(self, __pyx_state)
+              /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":146
+ *                     if func_code_info.new_code is None:
+ *                         if thread_info.thread_trace_func is not None:
+ *                             frame.f_trace = thread_info.thread_trace_func             # <<<<<<<<<<<<<<
+ *                         else:
+ *                             frame.f_trace = <object> main_debugger.trace_dispatch
  */
+              __pyx_t_9 = __pyx_v_thread_info->thread_trace_func;
+              __Pyx_INCREF(__pyx_t_9);
+              if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_9) < 0) __PYX_ERR(0, 146, __pyx_L23_error)
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_4__setstate_cython__(((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12FuncCodeInfo_4__setstate_cython__(struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__setstate_cython__", 0);
-
-  /* "(tree fragment)":17
- *         return __pyx_unpickle_FuncCodeInfo, (type(self), 0xdaf6aa4, state)
- * def __setstate_cython__(self, __pyx_state):
- *     __pyx_unpickle_FuncCodeInfo__set_state(self, __pyx_state)             # <<<<<<<<<<<<<<
+              /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":145
+ *                     # where needed, so, fallback to tracing.
+ *                     if func_code_info.new_code is None:
+ *                         if thread_info.thread_trace_func is not None:             # <<<<<<<<<<<<<<
+ *                             frame.f_trace = thread_info.thread_trace_func
+ *                         else:
  */
-  if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error)
-  __pyx_t_1 = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator___pyx_unpickle_FuncCodeInfo__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              goto __pyx_L56;
+            }
 
-  /* "(tree fragment)":16
- *     else:
- *         return __pyx_unpickle_FuncCodeInfo, (type(self), 0xdaf6aa4, state)
- * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
- *     __pyx_unpickle_FuncCodeInfo__set_state(self, __pyx_state)
+            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":148
+ *                             frame.f_trace = thread_info.thread_trace_func
+ *                         else:
+ *                             frame.f_trace = <object> main_debugger.trace_dispatch             # <<<<<<<<<<<<<<
+ *                     else:
+ *                         # print('Using frame eval break for', <object> frame_obj.f_code.co_name)
  */
+            /*else*/ {
+              __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_trace_dispatch); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 148, __pyx_L23_error)
+              __Pyx_GOTREF(__pyx_t_9);
+              __pyx_t_10 = __pyx_t_9;
+              __Pyx_INCREF(__pyx_t_10);
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              if (__Pyx_PyObject_SetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace, __pyx_t_10) < 0) __PYX_ERR(0, 148, __pyx_L23_error)
+              __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+            }
+            __pyx_L56:;
 
-  /* function exit code */
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.FuncCodeInfo.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":144
+ *                     # this means we weren't able to actually add the code
+ *                     # where needed, so, fallback to tracing.
+ *                     if func_code_info.new_code is None:             # <<<<<<<<<<<<<<
+ *                         if thread_info.thread_trace_func is not None:
+ *                             frame.f_trace = thread_info.thread_trace_func
+ */
+            goto __pyx_L55;
+          }
+
+          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":151
+ *                     else:
+ *                         # print('Using frame eval break for', <object> frame_obj.f_code.co_name)
+ *                         update_globals_dict(<object> frame_obj.f_globals)             # <<<<<<<<<<<<<<
+ *                         Py_INCREF(func_code_info.new_code)
+ *                         old = <object> frame_obj.f_code
+ */
+          /*else*/ {
+            __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_update_globals_dict); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 151, __pyx_L23_error)
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_8 = NULL;
+            if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_9))) {
+              __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_9);
+              if (likely(__pyx_t_8)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
+                __Pyx_INCREF(__pyx_t_8);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_9, function);
+              }
+            }
+            __pyx_t_10 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_9, __pyx_t_8, ((PyObject *)__pyx_v_frame_obj->f_globals)) : __Pyx_PyObject_CallOneArg(__pyx_t_9, ((PyObject *)__pyx_v_frame_obj->f_globals));
+            __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+            if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 151, __pyx_L23_error)
+            __Pyx_GOTREF(__pyx_t_10);
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+
+            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":152
+ *                         # print('Using frame eval break for', <object> frame_obj.f_code.co_name)
+ *                         update_globals_dict(<object> frame_obj.f_globals)
+ *                         Py_INCREF(func_code_info.new_code)             # <<<<<<<<<<<<<<
+ *                         old = <object> frame_obj.f_code
+ *                         frame_obj.f_code = <PyCodeObject *> func_code_info.new_code
+ */
+            __pyx_t_10 = __pyx_v_func_code_info->new_code;
+            __Pyx_INCREF(__pyx_t_10);
+            Py_INCREF(__pyx_t_10);
+            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+
+            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":153
+ *                         update_globals_dict(<object> frame_obj.f_globals)
+ *                         Py_INCREF(func_code_info.new_code)
+ *                         old = <object> frame_obj.f_code             # <<<<<<<<<<<<<<
+ *                         frame_obj.f_code = <PyCodeObject *> func_code_info.new_code
+ *                         Py_DECREF(old)
+ */
+            __pyx_t_10 = ((PyObject *)__pyx_v_frame_obj->f_code);
+            __Pyx_INCREF(__pyx_t_10);
+            __pyx_v_old = __pyx_t_10;
+            __pyx_t_10 = 0;
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":107
+            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":154
+ *                         Py_INCREF(func_code_info.new_code)
+ *                         old = <object> frame_obj.f_code
+ *                         frame_obj.f_code = <PyCodeObject *> func_code_info.new_code             # <<<<<<<<<<<<<<
+ *                         Py_DECREF(old)
  * 
+ */
+            __pyx_v_frame_obj->f_code = ((PyCodeObject *)__pyx_v_func_code_info->new_code);
+
+            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":155
+ *                         old = <object> frame_obj.f_code
+ *                         frame_obj.f_code = <PyCodeObject *> func_code_info.new_code
+ *                         Py_DECREF(old)             # <<<<<<<<<<<<<<
  * 
- * def dummy_trace_dispatch(frame, str event, arg):             # <<<<<<<<<<<<<<
- *     if event == 'call':
- *         if frame.f_trace is not None:
+ *     finally:
  */
+            Py_DECREF(__pyx_v_old);
+          }
+          __pyx_L55:;
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_3dummy_trace_dispatch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_3dummy_trace_dispatch = {"dummy_trace_dispatch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_3dummy_trace_dispatch, METH_VARARGS|METH_KEYWORDS, 0};
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_3dummy_trace_dispatch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_frame = 0;
-  PyObject *__pyx_v_event = 0;
-  PyObject *__pyx_v_arg = 0;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("dummy_trace_dispatch (wrapper)", 0);
-  {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_frame,&__pyx_n_s_event,&__pyx_n_s_arg,0};
-    PyObject* values[3] = {0,0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
-        CYTHON_FALLTHROUGH;
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        CYTHON_FALLTHROUGH;
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        CYTHON_FALLTHROUGH;
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_frame)) != 0)) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        CYTHON_FALLTHROUGH;
-        case  1:
-        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_event)) != 0)) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("dummy_trace_dispatch", 1, 3, 3, 1); __PYX_ERR(0, 107, __pyx_L3_error)
-        }
-        CYTHON_FALLTHROUGH;
-        case  2:
-        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_arg)) != 0)) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("dummy_trace_dispatch", 1, 3, 3, 2); __PYX_ERR(0, 107, __pyx_L3_error)
+          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":137
+ *                             frame.f_trace = <object> main_debugger.trace_dispatch
+ * 
+ *                 if (can_skip and func_code_info.breakpoint_found) or main_debugger.stop_on_failed_tests:             # <<<<<<<<<<<<<<
+ *                     # if DEBUG:
+ *                     #     print('get_bytecode_while_frame_eval new_code', func_code_info.new_code)
+ */
         }
+
+        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":124
+ *             # if DEBUG:
+ *             #     print('get_bytecode_while_frame_eval always skip', func_code_info.always_skip_code)
+ *             if not func_code_info.always_skip_code:             # <<<<<<<<<<<<<<
+ * 
+ *                 if main_debugger.has_plugin_line_breaks:
+ */
       }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dummy_trace_dispatch") < 0)) __PYX_ERR(0, 107, __pyx_L3_error)
-      }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
     }
-    __pyx_v_frame = values[0];
-    __pyx_v_event = ((PyObject*)values[1]);
-    __pyx_v_arg = values[2];
+    __pyx_L35:;
   }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dummy_trace_dispatch", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 107, __pyx_L3_error)
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.dummy_trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_event), (&PyString_Type), 1, "event", 1))) __PYX_ERR(0, 107, __pyx_L1_error)
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_2dummy_trace_dispatch(__pyx_self, __pyx_v_frame, __pyx_v_event, __pyx_v_arg);
-
-  /* function exit code */
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_2dummy_trace_dispatch(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_frame, PyObject *__pyx_v_event, PyObject *__pyx_v_arg) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_t_6;
-  PyObject *__pyx_t_7 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("dummy_trace_dispatch", 0);
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":158
+ * 
+ *     finally:
+ *         thread_info.inside_frame_eval -= 1             # <<<<<<<<<<<<<<
+ *         additional_info.is_tracing = False
+ * 
+ */
+  /*finally:*/ {
+    /*normal exit:*/{
+      __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1);
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":108
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":159
+ *     finally:
+ *         thread_info.inside_frame_eval -= 1
+ *         additional_info.is_tracing = False             # <<<<<<<<<<<<<<
  * 
- * def dummy_trace_dispatch(frame, str event, arg):
- *     if event == 'call':             # <<<<<<<<<<<<<<
- *         if frame.f_trace is not None:
- *             return frame.f_trace(frame, event, arg)
+ *     return _PyEval_EvalFrameDefault(frame_obj, exc)
  */
-  __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_event, __pyx_n_s_call, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 108, __pyx_L1_error)
-  __pyx_t_2 = (__pyx_t_1 != 0);
-  if (__pyx_t_2) {
+      __pyx_v_additional_info->is_tracing = 0;
+      goto __pyx_L24;
+    }
+    __pyx_L23_error:;
+    /*exception exit:*/{
+      __Pyx_PyThreadState_declare
+      __Pyx_PyThreadState_assign
+      __pyx_t_7 = 0; __pyx_t_6 = 0; __pyx_t_5 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0;
+      __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+      if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17);
+      if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_7, &__pyx_t_6, &__pyx_t_5) < 0)) __Pyx_ErrFetch(&__pyx_t_7, &__pyx_t_6, &__pyx_t_5);
+      __Pyx_XGOTREF(__pyx_t_7);
+      __Pyx_XGOTREF(__pyx_t_6);
+      __Pyx_XGOTREF(__pyx_t_5);
+      __Pyx_XGOTREF(__pyx_t_15);
+      __Pyx_XGOTREF(__pyx_t_16);
+      __Pyx_XGOTREF(__pyx_t_17);
+      __pyx_t_11 = __pyx_lineno; __pyx_t_13 = __pyx_clineno; __pyx_t_14 = __pyx_filename;
+      {
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":109
- * def dummy_trace_dispatch(frame, str event, arg):
- *     if event == 'call':
- *         if frame.f_trace is not None:             # <<<<<<<<<<<<<<
- *             return frame.f_trace(frame, event, arg)
- *     return None
+        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":158
+ * 
+ *     finally:
+ *         thread_info.inside_frame_eval -= 1             # <<<<<<<<<<<<<<
+ *         additional_info.is_tracing = False
+ * 
  */
-    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 109, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = (__pyx_t_3 != Py_None);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_1 = (__pyx_t_2 != 0);
-    if (__pyx_t_1) {
+        __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1);
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":110
- *     if event == 'call':
- *         if frame.f_trace is not None:
- *             return frame.f_trace(frame, event, arg)             # <<<<<<<<<<<<<<
- *     return None
+        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":159
+ *     finally:
+ *         thread_info.inside_frame_eval -= 1
+ *         additional_info.is_tracing = False             # <<<<<<<<<<<<<<
  * 
+ *     return _PyEval_EvalFrameDefault(frame_obj, exc)
  */
-      __Pyx_XDECREF(__pyx_r);
-      __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_frame, __pyx_n_s_f_trace); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 110, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_5 = NULL;
-      __pyx_t_6 = 0;
-      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
-        __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
-        if (likely(__pyx_t_5)) {
-          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
-          __Pyx_INCREF(__pyx_t_5);
-          __Pyx_INCREF(function);
-          __Pyx_DECREF_SET(__pyx_t_4, function);
-          __pyx_t_6 = 1;
-        }
+        __pyx_v_additional_info->is_tracing = 0;
       }
-      #if CYTHON_FAST_PYCALL
-      if (PyFunction_Check(__pyx_t_4)) {
-        PyObject *__pyx_temp[4] = {__pyx_t_5, __pyx_v_frame, __pyx_v_event, __pyx_v_arg};
-        __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_6, 3+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error)
-        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __Pyx_GOTREF(__pyx_t_3);
-      } else
-      #endif
-      #if CYTHON_FAST_PYCCALL
-      if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) {
-        PyObject *__pyx_temp[4] = {__pyx_t_5, __pyx_v_frame, __pyx_v_event, __pyx_v_arg};
-        __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_6, 3+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error)
-        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __Pyx_GOTREF(__pyx_t_3);
-      } else
-      #endif
-      {
-        __pyx_t_7 = PyTuple_New(3+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 110, __pyx_L1_error)
-        __Pyx_GOTREF(__pyx_t_7);
-        if (__pyx_t_5) {
-          __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __pyx_t_5 = NULL;
-        }
-        __Pyx_INCREF(__pyx_v_frame);
-        __Pyx_GIVEREF(__pyx_v_frame);
-        PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, __pyx_v_frame);
-        __Pyx_INCREF(__pyx_v_event);
-        __Pyx_GIVEREF(__pyx_v_event);
-        PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_v_event);
-        __Pyx_INCREF(__pyx_v_arg);
-        __Pyx_GIVEREF(__pyx_v_arg);
-        PyTuple_SET_ITEM(__pyx_t_7, 2+__pyx_t_6, __pyx_v_arg);
-        __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error)
-        __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      if (PY_MAJOR_VERSION >= 3) {
+        __Pyx_XGIVEREF(__pyx_t_15);
+        __Pyx_XGIVEREF(__pyx_t_16);
+        __Pyx_XGIVEREF(__pyx_t_17);
+        __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17);
       }
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_r = __pyx_t_3;
-      __pyx_t_3 = 0;
-      goto __pyx_L0;
+      __Pyx_XGIVEREF(__pyx_t_7);
+      __Pyx_XGIVEREF(__pyx_t_6);
+      __Pyx_XGIVEREF(__pyx_t_5);
+      __Pyx_ErrRestore(__pyx_t_7, __pyx_t_6, __pyx_t_5);
+      __pyx_t_7 = 0; __pyx_t_6 = 0; __pyx_t_5 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0;
+      __pyx_lineno = __pyx_t_11; __pyx_clineno = __pyx_t_13; __pyx_filename = __pyx_t_14;
+      goto __pyx_L1_error;
+    }
+    __pyx_L22_return: {
+      __pyx_t_18 = __pyx_r;
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":109
- * def dummy_trace_dispatch(frame, str event, arg):
- *     if event == 'call':
- *         if frame.f_trace is not None:             # <<<<<<<<<<<<<<
- *             return frame.f_trace(frame, event, arg)
- *     return None
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":158
+ * 
+ *     finally:
+ *         thread_info.inside_frame_eval -= 1             # <<<<<<<<<<<<<<
+ *         additional_info.is_tracing = False
+ * 
  */
-    }
+      __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1);
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":108
+      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":159
+ *     finally:
+ *         thread_info.inside_frame_eval -= 1
+ *         additional_info.is_tracing = False             # <<<<<<<<<<<<<<
  * 
- * def dummy_trace_dispatch(frame, str event, arg):
- *     if event == 'call':             # <<<<<<<<<<<<<<
- *         if frame.f_trace is not None:
- *             return frame.f_trace(frame, event, arg)
+ *     return _PyEval_EvalFrameDefault(frame_obj, exc)
  */
+      __pyx_v_additional_info->is_tracing = 0;
+      __pyx_r = __pyx_t_18;
+      goto __pyx_L0;
+    }
+    __pyx_L24:;
   }
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":111
- *         if frame.f_trace is not None:
- *             return frame.f_trace(frame, event, arg)
- *     return None             # <<<<<<<<<<<<<<
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":161
+ *         additional_info.is_tracing = False
+ * 
+ *     return _PyEval_EvalFrameDefault(frame_obj, exc)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __pyx_r = _PyEval_EvalFrameDefault(__pyx_v_frame_obj, __pyx_v_exc);
   goto __pyx_L0;
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":107
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":45
  * 
  * 
- * def dummy_trace_dispatch(frame, str event, arg):             # <<<<<<<<<<<<<<
- *     if event == 'call':
- *         if frame.f_trace is not None:
+ * cdef PyObject * get_bytecode_while_frame_eval(PyFrameObject * frame_obj, int exc):             # <<<<<<<<<<<<<<
+ *     '''
+ *     This function makes the actual evaluation and changes the bytecode to a version
  */
 
   /* function exit code */
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_7);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.dummy_trace_dispatch", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_WriteUnraisable("_pydevd_frame_eval.pydevd_frame_evaluator.get_bytecode_while_frame_eval", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+  __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_XDECREF((PyObject *)__pyx_v_thread_info);
+  __Pyx_XDECREF((PyObject *)__pyx_v_additional_info);
+  __Pyx_XDECREF(__pyx_v_main_debugger);
+  __Pyx_XDECREF(__pyx_v_frame);
+  __Pyx_XDECREF(__pyx_v_trace_func);
+  __Pyx_XDECREF(__pyx_v_apply_to_global);
+  __Pyx_XDECREF((PyObject *)__pyx_v_func_code_info);
+  __Pyx_XDECREF(__pyx_v_old);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":114
- * 
+/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":164
  * 
- * def get_thread_info_py() -> ThreadInfo:             # <<<<<<<<<<<<<<
- *     return get_thread_info()
  * 
+ * def frame_eval_func():             # <<<<<<<<<<<<<<
+ *     cdef PyThreadState *state = PyThreadState_Get()
+ *     state.interp.eval_frame = get_bytecode_while_frame_eval
  */
 
 /* Python wrapper */
-static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_5get_thread_info_py(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_5get_thread_info_py = {"get_thread_info_py", (PyCFunction)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_5get_thread_info_py, METH_NOARGS, 0};
-static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_5get_thread_info_py(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
-  struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_r = 0;
+static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11frame_eval_func(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_11frame_eval_func = {"frame_eval_func", (PyCFunction)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11frame_eval_func, METH_NOARGS, 0};
+static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_11frame_eval_func(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_thread_info_py (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_4get_thread_info_py(__pyx_self);
+  __Pyx_RefNannySetupContext("frame_eval_func (wrapper)", 0);
+  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10frame_eval_func(__pyx_self);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_4get_thread_info_py(CYTHON_UNUSED PyObject *__pyx_self) {
-  struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_r = NULL;
+static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_10frame_eval_func(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyThreadState *__pyx_v_state;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_thread_info_py", 0);
+  __Pyx_RefNannySetupContext("frame_eval_func", 0);
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":115
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":165
  * 
- * def get_thread_info_py() -> ThreadInfo:
- *     return get_thread_info()             # <<<<<<<<<<<<<<
+ * def frame_eval_func():
+ *     cdef PyThreadState *state = PyThreadState_Get()             # <<<<<<<<<<<<<<
+ *     state.interp.eval_frame = get_bytecode_while_frame_eval
+ *     global dummy_tracing_holder
+ */
+  __pyx_v_state = PyThreadState_Get();
+
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":166
+ * def frame_eval_func():
+ *     cdef PyThreadState *state = PyThreadState_Get()
+ *     state.interp.eval_frame = get_bytecode_while_frame_eval             # <<<<<<<<<<<<<<
+ *     global dummy_tracing_holder
+ *     dummy_tracing_holder.set_trace_func(dummy_trace_dispatch)
+ */
+  __pyx_v_state->interp->eval_frame = __pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_bytecode_while_frame_eval;
+
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":168
+ *     state.interp.eval_frame = get_bytecode_while_frame_eval
+ *     global dummy_tracing_holder
+ *     dummy_tracing_holder.set_trace_func(dummy_trace_dispatch)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __Pyx_XDECREF(((PyObject *)__pyx_r));
-  __pyx_t_1 = ((PyObject *)__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_thread_info()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 115, __pyx_L1_error)
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_dummy_tracing_holder); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 168, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_set_trace_func); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 168, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_dummy_trace_dispatch); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 168, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_4 = NULL;
+  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+    }
+  }
+  __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 168, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_t_1);
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":114
- * 
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":164
  * 
- * def get_thread_info_py() -> ThreadInfo:             # <<<<<<<<<<<<<<
- *     return get_thread_info()
  * 
+ * def frame_eval_func():             # <<<<<<<<<<<<<<
+ *     cdef PyThreadState *state = PyThreadState_Get()
+ *     state.interp.eval_frame = get_bytecode_while_frame_eval
  */
 
   /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_thread_info_py", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.frame_eval_func", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XGIVEREF((PyObject *)__pyx_r);
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":118
+/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":171
  * 
  * 
- * cdef ThreadInfo get_thread_info():             # <<<<<<<<<<<<<<
- *     '''
- *     Provides thread-related info.
+ * def stop_frame_eval():             # <<<<<<<<<<<<<<
+ *     cdef PyThreadState *state = PyThreadState_Get()
+ *     state.interp.eval_frame = _PyEval_EvalFrameDefault
  */
 
-static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_thread_info(void) {
-  struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_v_thread_info = 0;
-  struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *__pyx_r = NULL;
+/* Python wrapper */
+static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13stop_frame_eval(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_13stop_frame_eval = {"stop_frame_eval", (PyCFunction)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13stop_frame_eval, METH_NOARGS, 0};
+static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_13stop_frame_eval(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *__pyx_t_8 = NULL;
-  int __pyx_t_9;
-  PyObject *__pyx_t_10 = NULL;
-  int __pyx_t_11;
-  int __pyx_t_12;
-  char const *__pyx_t_13;
-  PyObject *__pyx_t_14 = NULL;
-  PyObject *__pyx_t_15 = NULL;
-  PyObject *__pyx_t_16 = NULL;
-  PyObject *__pyx_t_17 = NULL;
-  PyObject *__pyx_t_18 = NULL;
-  PyObject *__pyx_t_19 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_thread_info", 0);
+  __Pyx_RefNannySetupContext("stop_frame_eval (wrapper)", 0);
+  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12stop_frame_eval(__pyx_self);
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":125
- *     '''
- *     cdef ThreadInfo thread_info
- *     try:             # <<<<<<<<<<<<<<
- *         # Note: changing to a `dict[thread.ident] = thread_info` had almost no
- *         # effect in the performance.
- */
-  {
-    __Pyx_PyThreadState_declare
-    __Pyx_PyThreadState_assign
-    __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3);
-    __Pyx_XGOTREF(__pyx_t_1);
-    __Pyx_XGOTREF(__pyx_t_2);
-    __Pyx_XGOTREF(__pyx_t_3);
-    /*try:*/ {
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":128
- *         # Note: changing to a `dict[thread.ident] = thread_info` had almost no
- *         # effect in the performance.
- *         thread_info = _thread_local_info.thread_info             # <<<<<<<<<<<<<<
- *     except:
- *         thread_info = ThreadInfo()
- */
-      __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_thread_local_info); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 128, __pyx_L3_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_thread_info); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 128, __pyx_L3_error)
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo))))) __PYX_ERR(0, 128, __pyx_L3_error)
-      __pyx_v_thread_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_t_5);
-      __pyx_t_5 = 0;
+static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_12stop_frame_eval(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyThreadState *__pyx_v_state;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("stop_frame_eval", 0);
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":125
- *     '''
- *     cdef ThreadInfo thread_info
- *     try:             # <<<<<<<<<<<<<<
- *         # Note: changing to a `dict[thread.ident] = thread_info` had almost no
- *         # effect in the performance.
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":172
+ * 
+ * def stop_frame_eval():
+ *     cdef PyThreadState *state = PyThreadState_Get()             # <<<<<<<<<<<<<<
+ *     state.interp.eval_frame = _PyEval_EvalFrameDefault
  */
-    }
-    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-    goto __pyx_L8_try_end;
-    __pyx_L3_error:;
-    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_v_state = PyThreadState_Get();
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":129
- *         # effect in the performance.
- *         thread_info = _thread_local_info.thread_info
- *     except:             # <<<<<<<<<<<<<<
- *         thread_info = ThreadInfo()
- *         thread_info.inside_frame_eval += 1
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":173
+ * def stop_frame_eval():
+ *     cdef PyThreadState *state = PyThreadState_Get()
+ *     state.interp.eval_frame = _PyEval_EvalFrameDefault             # <<<<<<<<<<<<<<
  */
-    /*except:*/ {
-      __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_thread_info", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_6) < 0) __PYX_ERR(0, 129, __pyx_L5_except_error)
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_GOTREF(__pyx_t_6);
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":130
- *         thread_info = _thread_local_info.thread_info
- *     except:
- *         thread_info = ThreadInfo()             # <<<<<<<<<<<<<<
- *         thread_info.inside_frame_eval += 1
- *         try:
- */
-      __pyx_t_7 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 130, __pyx_L5_except_error)
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_XDECREF_SET(__pyx_v_thread_info, ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_ThreadInfo *)__pyx_t_7));
-      __pyx_t_7 = 0;
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":131
- *     except:
- *         thread_info = ThreadInfo()
- *         thread_info.inside_frame_eval += 1             # <<<<<<<<<<<<<<
- *         try:
- *             _thread_local_info.thread_info = thread_info
- */
-      __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval + 1);
+  __pyx_v_state->interp->eval_frame = _PyEval_EvalFrameDefault;
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":132
- *         thread_info = ThreadInfo()
- *         thread_info.inside_frame_eval += 1
- *         try:             # <<<<<<<<<<<<<<
- *             _thread_local_info.thread_info = thread_info
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":171
  * 
- */
-      /*try:*/ {
-
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":133
- *         thread_info.inside_frame_eval += 1
- *         try:
- *             _thread_local_info.thread_info = thread_info             # <<<<<<<<<<<<<<
  * 
- *             # Note: _code_extra_index is not actually thread-related,
+ * def stop_frame_eval():             # <<<<<<<<<<<<<<
+ *     cdef PyThreadState *state = PyThreadState_Get()
+ *     state.interp.eval_frame = _PyEval_EvalFrameDefault
  */
-        __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_thread_local_info); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 133, __pyx_L14_error)
-        __Pyx_GOTREF(__pyx_t_7);
-        if (__Pyx_PyObject_SetAttrStr(__pyx_t_7, __pyx_n_s_thread_info, ((PyObject *)__pyx_v_thread_info)) < 0) __PYX_ERR(0, 133, __pyx_L14_error)
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":138
- *             # but this is a good point to initialize it.
- *             global _code_extra_index
- *             if _code_extra_index == -1:             # <<<<<<<<<<<<<<
- *                 _code_extra_index = _PyEval_RequestCodeExtraIndex(release_co_extra)
- * 
- */
-        __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_code_extra_index); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 138, __pyx_L14_error)
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_8 = __Pyx_PyInt_EqObjC(__pyx_t_7, __pyx_int_neg_1, -1L, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 138, __pyx_L14_error)
-        __Pyx_GOTREF(__pyx_t_8);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 138, __pyx_L14_error)
-        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-        if (__pyx_t_9) {
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":139
- *             global _code_extra_index
- *             if _code_extra_index == -1:
- *                 _code_extra_index = _PyEval_RequestCodeExtraIndex(release_co_extra)             # <<<<<<<<<<<<<<
- * 
- *             thread_info.initialize_if_possible()
- */
-          __pyx_t_8 = __Pyx_PyInt_From_int(_PyEval_RequestCodeExtraIndex(release_co_extra)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 139, __pyx_L14_error)
-          __Pyx_GOTREF(__pyx_t_8);
-          if (PyDict_SetItem(__pyx_d, __pyx_n_s_code_extra_index, __pyx_t_8) < 0) __PYX_ERR(0, 139, __pyx_L14_error)
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+static PyMethodDef __pyx_methods[] = {
+  {0, 0, 0, 0}
+};
 
-          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":138
- *             # but this is a good point to initialize it.
- *             global _code_extra_index
- *             if _code_extra_index == -1:             # <<<<<<<<<<<<<<
- *                 _code_extra_index = _PyEval_RequestCodeExtraIndex(release_co_extra)
- * 
- */
-        }
+#if PY_MAJOR_VERSION >= 3
+#if CYTHON_PEP489_MULTI_PHASE_INIT
+static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/
+static int __pyx_pymod_exec_pydevd_frame_evaluator(PyObject* module); /*proto*/
+static PyModuleDef_Slot __pyx_moduledef_slots[] = {
+  {Py_mod_create, (void*)__pyx_pymod_create},
+  {Py_mod_exec, (void*)__pyx_pymod_exec_pydevd_frame_evaluator},
+  {0, NULL}
+};
+#endif
 
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":141
- *                 _code_extra_index = _PyEval_RequestCodeExtraIndex(release_co_extra)
- * 
- *             thread_info.initialize_if_possible()             # <<<<<<<<<<<<<<
- *         finally:
- *             thread_info.inside_frame_eval -= 1
- */
-        __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_thread_info), __pyx_n_s_initialize_if_possible); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 141, __pyx_L14_error)
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_10 = NULL;
-        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) {
-          __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7);
-          if (likely(__pyx_t_10)) {
-            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
-            __Pyx_INCREF(__pyx_t_10);
-            __Pyx_INCREF(function);
-            __Pyx_DECREF_SET(__pyx_t_7, function);
-          }
-        }
-        __pyx_t_8 = (__pyx_t_10) ? __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_10) : __Pyx_PyObject_CallNoArg(__pyx_t_7);
-        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 141, __pyx_L14_error)
-        __Pyx_GOTREF(__pyx_t_8);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      }
+static struct PyModuleDef __pyx_moduledef = {
+    PyModuleDef_HEAD_INIT,
+    "pydevd_frame_evaluator",
+    0, /* m_doc */
+  #if CYTHON_PEP489_MULTI_PHASE_INIT
+    0, /* m_size */
+  #else
+    -1, /* m_size */
+  #endif
+    __pyx_methods /* m_methods */,
+  #if CYTHON_PEP489_MULTI_PHASE_INIT
+    __pyx_moduledef_slots, /* m_slots */
+  #else
+    NULL, /* m_reload */
+  #endif
+    NULL, /* m_traverse */
+    NULL, /* m_clear */
+    NULL /* m_free */
+};
+#endif
+#ifndef CYTHON_SMALL_CODE
+#if defined(__clang__)
+    #define CYTHON_SMALL_CODE
+#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
+    #define CYTHON_SMALL_CODE __attribute__((cold))
+#else
+    #define CYTHON_SMALL_CODE
+#endif
+#endif
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":143
- *             thread_info.initialize_if_possible()
- *         finally:
- *             thread_info.inside_frame_eval -= 1             # <<<<<<<<<<<<<<
- * 
- *     return thread_info
- */
-      /*finally:*/ {
-        /*normal exit:*/{
-          __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1);
-          goto __pyx_L15;
-        }
-        __pyx_L14_error:;
-        /*exception exit:*/{
-          __Pyx_PyThreadState_declare
-          __Pyx_PyThreadState_assign
-          __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0;
-          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-          __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
-          if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19);
-          if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16) < 0)) __Pyx_ErrFetch(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16);
-          __Pyx_XGOTREF(__pyx_t_14);
-          __Pyx_XGOTREF(__pyx_t_15);
-          __Pyx_XGOTREF(__pyx_t_16);
-          __Pyx_XGOTREF(__pyx_t_17);
-          __Pyx_XGOTREF(__pyx_t_18);
-          __Pyx_XGOTREF(__pyx_t_19);
-          __pyx_t_11 = __pyx_lineno; __pyx_t_12 = __pyx_clineno; __pyx_t_13 = __pyx_filename;
-          {
-            __pyx_v_thread_info->inside_frame_eval = (__pyx_v_thread_info->inside_frame_eval - 1);
-          }
-          if (PY_MAJOR_VERSION >= 3) {
-            __Pyx_XGIVEREF(__pyx_t_17);
-            __Pyx_XGIVEREF(__pyx_t_18);
-            __Pyx_XGIVEREF(__pyx_t_19);
-            __Pyx_ExceptionReset(__pyx_t_17, __pyx_t_18, __pyx_t_19);
-          }
-          __Pyx_XGIVEREF(__pyx_t_14);
-          __Pyx_XGIVEREF(__pyx_t_15);
-          __Pyx_XGIVEREF(__pyx_t_16);
-          __Pyx_ErrRestore(__pyx_t_14, __pyx_t_15, __pyx_t_16);
-          __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0;
-          __pyx_lineno = __pyx_t_11; __pyx_clineno = __pyx_t_12; __pyx_filename = __pyx_t_13;
-          goto __pyx_L5_except_error;
-        }
-        __pyx_L15:;
-      }
-      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L4_exception_handled;
-    }
-    __pyx_L5_except_error:;
+static __Pyx_StringTabEntry __pyx_string_tab[] = {
+  {&__pyx_n_s_GlobalDebuggerHolder, __pyx_k_GlobalDebuggerHolder, sizeof(__pyx_k_GlobalDebuggerHolder), 0, 0, 1, 1},
+  {&__pyx_n_s_arg, __pyx_k_arg, sizeof(__pyx_k_arg), 0, 0, 1, 1},
+  {&__pyx_n_s_break_on_caught_exceptions, __pyx_k_break_on_caught_exceptions, sizeof(__pyx_k_break_on_caught_exceptions), 0, 0, 1, 1},
+  {&__pyx_n_u_break_on_caught_exceptions, __pyx_k_break_on_caught_exceptions, sizeof(__pyx_k_break_on_caught_exceptions), 0, 1, 0, 1},
+  {&__pyx_n_u_call, __pyx_k_call, sizeof(__pyx_k_call), 0, 1, 0, 1},
+  {&__pyx_n_s_can_not_skip, __pyx_k_can_not_skip, sizeof(__pyx_k_can_not_skip), 0, 0, 1, 1},
+  {&__pyx_n_s_clear_thread_local_info, __pyx_k_clear_thread_local_info, sizeof(__pyx_k_clear_thread_local_info), 0, 0, 1, 1},
+  {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1},
+  {&__pyx_n_s_code_obj, __pyx_k_code_obj, sizeof(__pyx_k_code_obj), 0, 0, 1, 1},
+  {&__pyx_n_s_decref_py, __pyx_k_decref_py, sizeof(__pyx_k_decref_py), 0, 0, 1, 1},
+  {&__pyx_n_s_dummy_trace_dispatch, __pyx_k_dummy_trace_dispatch, sizeof(__pyx_k_dummy_trace_dispatch), 0, 0, 1, 1},
+  {&__pyx_n_s_dummy_tracing_holder, __pyx_k_dummy_tracing_holder, sizeof(__pyx_k_dummy_tracing_holder), 0, 0, 1, 1},
+  {&__pyx_n_s_event, __pyx_k_event, sizeof(__pyx_k_event), 0, 0, 1, 1},
+  {&__pyx_n_s_f_back, __pyx_k_f_back, sizeof(__pyx_k_f_back), 0, 0, 1, 1},
+  {&__pyx_n_s_f_trace, __pyx_k_f_trace, sizeof(__pyx_k_f_trace), 0, 0, 1, 1},
+  {&__pyx_n_s_fix_top_level_trace_and_get_trac, __pyx_k_fix_top_level_trace_and_get_trac, sizeof(__pyx_k_fix_top_level_trace_and_get_trac), 0, 0, 1, 1},
+  {&__pyx_n_s_frame, __pyx_k_frame, sizeof(__pyx_k_frame), 0, 0, 1, 1},
+  {&__pyx_n_s_frame_eval_func, __pyx_k_frame_eval_func, sizeof(__pyx_k_frame_eval_func), 0, 0, 1, 1},
+  {&__pyx_n_s_get_func_code_info_py, __pyx_k_get_func_code_info_py, sizeof(__pyx_k_get_func_code_info_py), 0, 0, 1, 1},
+  {&__pyx_n_s_get_thread_info_py, __pyx_k_get_thread_info_py, sizeof(__pyx_k_get_thread_info_py), 0, 0, 1, 1},
+  {&__pyx_n_s_global_dbg, __pyx_k_global_dbg, sizeof(__pyx_k_global_dbg), 0, 0, 1, 1},
+  {&__pyx_n_s_has_plugin_exception_breaks, __pyx_k_has_plugin_exception_breaks, sizeof(__pyx_k_has_plugin_exception_breaks), 0, 0, 1, 1},
+  {&__pyx_n_u_has_plugin_exception_breaks, __pyx_k_has_plugin_exception_breaks, sizeof(__pyx_k_has_plugin_exception_breaks), 0, 1, 0, 1},
+  {&__pyx_n_s_has_plugin_line_breaks, __pyx_k_has_plugin_line_breaks, sizeof(__pyx_k_has_plugin_line_breaks), 0, 0, 1, 1},
+  {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1},
+  {&__pyx_n_s_initialize_if_possible, __pyx_k_initialize_if_possible, sizeof(__pyx_k_initialize_if_possible), 0, 0, 1, 1},
+  {&__pyx_n_s_local, __pyx_k_local, sizeof(__pyx_k_local), 0, 0, 1, 1},
+  {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1},
+  {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1},
+  {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1},
+  {&__pyx_n_s_plugin, __pyx_k_plugin, sizeof(__pyx_k_plugin), 0, 0, 1, 1},
+  {&__pyx_n_s_pydev_imps__pydev_saved_modules, __pyx_k_pydev_imps__pydev_saved_modules, sizeof(__pyx_k_pydev_imps__pydev_saved_modules), 0, 0, 1, 1},
+  {&__pyx_n_s_pydevd_bundle_pydevd_comm, __pyx_k_pydevd_bundle_pydevd_comm, sizeof(__pyx_k_pydevd_bundle_pydevd_comm), 0, 0, 1, 1},
+  {&__pyx_n_s_pydevd_bundle_pydevd_trace_disp, __pyx_k_pydevd_bundle_pydevd_trace_disp, sizeof(__pyx_k_pydevd_bundle_pydevd_trace_disp), 0, 0, 1, 1},
+  {&__pyx_n_s_pydevd_frame_eval_pydevd_frame, __pyx_k_pydevd_frame_eval_pydevd_frame, sizeof(__pyx_k_pydevd_frame_eval_pydevd_frame), 0, 0, 1, 1},
+  {&__pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_k_pydevd_frame_eval_pydevd_frame_2, sizeof(__pyx_k_pydevd_frame_eval_pydevd_frame_2), 0, 0, 1, 0},
+  {&__pyx_n_s_pydevd_frame_eval_pydevd_frame_3, __pyx_k_pydevd_frame_eval_pydevd_frame_3, sizeof(__pyx_k_pydevd_frame_eval_pydevd_frame_3), 0, 0, 1, 1},
+  {&__pyx_n_s_set_trace_func, __pyx_k_set_trace_func, sizeof(__pyx_k_set_trace_func), 0, 0, 1, 1},
+  {&__pyx_n_s_show_return_values, __pyx_k_show_return_values, sizeof(__pyx_k_show_return_values), 0, 0, 1, 1},
+  {&__pyx_n_s_signature_factory, __pyx_k_signature_factory, sizeof(__pyx_k_signature_factory), 0, 0, 1, 1},
+  {&__pyx_n_u_signature_factory, __pyx_k_signature_factory, sizeof(__pyx_k_signature_factory), 0, 1, 0, 1},
+  {&__pyx_n_s_state, __pyx_k_state, sizeof(__pyx_k_state), 0, 0, 1, 1},
+  {&__pyx_n_s_stop_frame_eval, __pyx_k_stop_frame_eval, sizeof(__pyx_k_stop_frame_eval), 0, 0, 1, 1},
+  {&__pyx_n_s_stop_on_failed_tests, __pyx_k_stop_on_failed_tests, sizeof(__pyx_k_stop_on_failed_tests), 0, 0, 1, 1},
+  {&__pyx_n_u_stop_on_failed_tests, __pyx_k_stop_on_failed_tests, sizeof(__pyx_k_stop_on_failed_tests), 0, 1, 0, 1},
+  {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
+  {&__pyx_n_s_thread_info, __pyx_k_thread_info, sizeof(__pyx_k_thread_info), 0, 0, 1, 1},
+  {&__pyx_n_s_thread_local_info, __pyx_k_thread_local_info, sizeof(__pyx_k_thread_local_info), 0, 0, 1, 1},
+  {&__pyx_n_s_threading, __pyx_k_threading, sizeof(__pyx_k_threading), 0, 0, 1, 1},
+  {&__pyx_n_s_trace_dispatch, __pyx_k_trace_dispatch, sizeof(__pyx_k_trace_dispatch), 0, 0, 1, 1},
+  {&__pyx_n_s_update_globals_dict, __pyx_k_update_globals_dict, sizeof(__pyx_k_update_globals_dict), 0, 0, 1, 1},
+  {0, 0, 0, 0, 0, 0, 0}
+};
+static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
+  return 0;
+}
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":125
- *     '''
- *     cdef ThreadInfo thread_info
- *     try:             # <<<<<<<<<<<<<<
- *         # Note: changing to a `dict[thread.ident] = thread_info` had almost no
- *         # effect in the performance.
- */
-    __Pyx_XGIVEREF(__pyx_t_1);
-    __Pyx_XGIVEREF(__pyx_t_2);
-    __Pyx_XGIVEREF(__pyx_t_3);
-    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
-    goto __pyx_L1_error;
-    __pyx_L4_exception_handled:;
-    __Pyx_XGIVEREF(__pyx_t_1);
-    __Pyx_XGIVEREF(__pyx_t_2);
-    __Pyx_XGIVEREF(__pyx_t_3);
-    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
-    __pyx_L8_try_end:;
-  }
+static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":145
- *             thread_info.inside_frame_eval -= 1
- * 
- *     return thread_info             # <<<<<<<<<<<<<<
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":15
  * 
  * 
+ * def clear_thread_local_info():             # <<<<<<<<<<<<<<
+ *     global _thread_local_info
+ *     _thread_local_info = threading.local()
  */
-  __Pyx_XDECREF(((PyObject *)__pyx_r));
-  __Pyx_INCREF(((PyObject *)__pyx_v_thread_info));
-  __pyx_r = __pyx_v_thread_info;
-  goto __pyx_L0;
+  __pyx_codeobj_ = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_clear_thread_local_info, 15, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj_)) __PYX_ERR(0, 15, __pyx_L1_error)
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":118
- * 
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":20
  * 
- * cdef ThreadInfo get_thread_info():             # <<<<<<<<<<<<<<
- *     '''
- *     Provides thread-related info.
- */
-
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_6);
-  __Pyx_XDECREF(__pyx_t_7);
-  __Pyx_XDECREF(__pyx_t_8);
-  __Pyx_XDECREF(__pyx_t_10);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_thread_info", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_thread_info);
-  __Pyx_XGIVEREF((PyObject *)__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":148
  * 
+ * def get_thread_info_py() -> ThreadInfo:             # <<<<<<<<<<<<<<
+ *     return get_thread_info()
  * 
- * def decref_py(obj):             # <<<<<<<<<<<<<<
- *     '''
- *     Helper to be called from Python.
  */
+  __pyx_codeobj__2 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_get_thread_info_py, 20, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__2)) __PYX_ERR(0, 20, __pyx_L1_error)
 
-/* Python wrapper */
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py(PyObject *__pyx_self, PyObject *__pyx_v_obj); /*proto*/
-static char __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py[] = "\n    Helper to be called from Python.\n    ";
-static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py = {"decref_py", (PyCFunction)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py, METH_O, __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py};
-static PyObject *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py(PyObject *__pyx_self, PyObject *__pyx_v_obj) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("decref_py (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py(__pyx_self, ((PyObject *)__pyx_v_obj));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_6decref_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_obj) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("decref_py", 0);
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":152
- *     Helper to be called from Python.
- *     '''
- *     Py_DECREF(obj)             # <<<<<<<<<<<<<<
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":24
  * 
  * 
+ * def dummy_trace_dispatch(frame, str event, arg):             # <<<<<<<<<<<<<<
+ *     if event == 'call':
+ *         if frame.f_trace is not None:
  */
-  Py_DECREF(__pyx_v_obj);
+  __pyx_tuple__3 = PyTuple_Pack(3, __pyx_n_s_frame, __pyx_n_s_event, __pyx_n_s_arg); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 24, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__3);
+  __Pyx_GIVEREF(__pyx_tuple__3);
+  __pyx_codeobj__4 = (PyObject*)__Pyx_PyCode_New(3, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__3, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_dummy_trace_dispatch, 24, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__4)) __PYX_ERR(0, 24, __pyx_L1_error)
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":148
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":31
  * 
  * 
  * def decref_py(obj):             # <<<<<<<<<<<<<<
  *     '''
  *     Helper to be called from Python.
  */
+  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 31, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__5);
+  __Pyx_GIVEREF(__pyx_tuple__5);
+  __pyx_codeobj__6 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__5, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_decref_py, 31, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__6)) __PYX_ERR(0, 31, __pyx_L1_error)
 
-  /* function exit code */
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":155
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":38
  * 
  * 
  * def get_func_code_info_py(code_obj) -> FuncCodeInfo:             # <<<<<<<<<<<<<<
  *     '''
  *     Helper to be called from Python.
  */
+  __pyx_tuple__7 = PyTuple_Pack(1, __pyx_n_s_code_obj); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 38, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__7);
+  __Pyx_GIVEREF(__pyx_tuple__7);
+  __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_get_func_code_info_py, 38, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) __PYX_ERR(0, 38, __pyx_L1_error)
 
-/* Python wrapper */
-static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py(PyObject *__pyx_self, PyObject *__pyx_v_code_obj); /*proto*/
-static char __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py[] = "\n    Helper to be called from Python.\n    ";
-static PyMethodDef __pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py = {"get_func_code_info_py", (PyCFunction)__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py, METH_O, __pyx_doc_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py};
-static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_pw_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py(PyObject *__pyx_self, PyObject *__pyx_v_code_obj) {
-  struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_func_code_info_py (wrapper)", 0);
-  __pyx_r = __pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py(__pyx_self, ((PyObject *)__pyx_v_code_obj));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_pf_18_pydevd_frame_eval_22pydevd_frame_evaluator_8get_func_code_info_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_code_obj) {
-  struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_func_code_info_py", 0);
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":159
- *     Helper to be called from Python.
- *     '''
- *     return get_func_code_info(<PyCodeObject *> code_obj)             # <<<<<<<<<<<<<<
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":164
  * 
  * 
+ * def frame_eval_func():             # <<<<<<<<<<<<<<
+ *     cdef PyThreadState *state = PyThreadState_Get()
+ *     state.interp.eval_frame = get_bytecode_while_frame_eval
  */
-  __Pyx_XDECREF(((PyObject *)__pyx_r));
-  __pyx_t_1 = ((PyObject *)__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_func_code_info(((PyCodeObject *)__pyx_v_code_obj))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_t_1);
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_n_s_state); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 164, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__9);
+  __Pyx_GIVEREF(__pyx_tuple__9);
+  __pyx_codeobj__10 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__9, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_frame_eval_func, 164, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__10)) __PYX_ERR(0, 164, __pyx_L1_error)
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":155
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":171
  * 
  * 
- * def get_func_code_info_py(code_obj) -> FuncCodeInfo:             # <<<<<<<<<<<<<<
- *     '''
- *     Helper to be called from Python.
+ * def stop_frame_eval():             # <<<<<<<<<<<<<<
+ *     cdef PyThreadState *state = PyThreadState_Get()
+ *     state.interp.eval_frame = _PyEval_EvalFrameDefault
  */
+  __pyx_tuple__11 = PyTuple_Pack(1, __pyx_n_s_state); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 171, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__11);
+  __Pyx_GIVEREF(__pyx_tuple__11);
+  __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__11, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pydevd_frame_eval_pydevd_frame_2, __pyx_n_s_stop_frame_eval, 171, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) __PYX_ERR(0, 171, __pyx_L1_error)
+  __Pyx_RefNannyFinishContext();
+  return 0;
+  __pyx_L1_error:;
+  __Pyx_RefNannyFinishContext();
+  return -1;
+}
 
-  /* function exit code */
+static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) {
+  if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error);
+  return 0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_func_code_info_py", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF((PyObject *)__pyx_r);
+  return -1;
+}
+
+static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/
+
+static int __Pyx_modinit_global_init_code(void) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0);
+  /*--- Global init code ---*/
   __Pyx_RefNannyFinishContext();
-  return __pyx_r;
+  return 0;
 }
 
-/* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":164
- * _code_extra_index: Py_SIZE = -1
- * 
- * cdef FuncCodeInfo get_func_code_info(PyCodeObject * code_obj):             # <<<<<<<<<<<<<<
- *     '''
- *     Provides code-object related info.
- */
+static int __Pyx_modinit_variable_export_code(void) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0);
+  /*--- Variable export code ---*/
+  __Pyx_RefNannyFinishContext();
+  return 0;
+}
 
-static struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_f_18_pydevd_frame_eval_22pydevd_frame_evaluator_get_func_code_info(PyCodeObject *__pyx_v_code_obj) {
-  PyObject *__pyx_v_main_debugger = 0;
-  void *__pyx_v_extra;
-  PyObject *__pyx_v_extra_obj;
-  struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_func_code_info_obj = NULL;
-  PyObject *__pyx_v_co_filename = 0;
-  CYTHON_UNUSED PyObject *__pyx_v_co_name = 0;
-  struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_v_func_code_info = NULL;
-  PyObject *__pyx_v_abs_path_real_path_and_base = NULL;
-  PyObject *__pyx_v_file_type = NULL;
-  CYTHON_UNUSED int __pyx_v_was_break;
-  PyObject *__pyx_v_breakpoints = 0;
-  PyObject *__pyx_v_code_obj_py = 0;
-  CYTHON_UNUSED PyObject *__pyx_v_offset = NULL;
-  PyObject *__pyx_v_line = NULL;
-  CYTHON_UNUSED PyObject *__pyx_v_breakpoint = NULL;
-  PyObject *__pyx_v_success = NULL;
-  PyObject *__pyx_v_new_code = NULL;
-  struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *__pyx_r = NULL;
+static int __Pyx_modinit_function_export_code(void) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0);
+  /*--- Function export code ---*/
+  __Pyx_RefNannyFinishContext();
+  return 0;
+}
+
+static int __Pyx_modinit_type_init_code(void) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0);
+  /*--- Type init code ---*/
+  __Pyx_RefNannyFinishContext();
+  return 0;
+}
+
+static int __Pyx_modinit_type_import_code(void) {
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_t_6;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *__pyx_t_8 = NULL;
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  PyObject *__pyx_t_12 = NULL;
-  int __pyx_t_13;
-  PyObject *(*__pyx_t_14)(PyObject *);
-  PyObject *(*__pyx_t_15)(PyObject *);
-  int __pyx_t_16;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_func_code_info", 0);
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":179
- *     #     print('get_func_code_info', f_code.co_name, f_code.co_filename)
- * 
- *     cdef object main_debugger = GlobalDebuggerHolder.global_dbg             # <<<<<<<<<<<<<<
- * 
- *     cdef void * extra
- */
-  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_GlobalDebuggerHolder); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 179, __pyx_L1_error)
+  __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0);
+  /*--- Type import code ---*/
+  __pyx_t_1 = PyImport_ImportModule("_pydevd_bundle.pydevd_cython"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_global_dbg); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 179, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo = __Pyx_ImportType(__pyx_t_1, "_pydevd_bundle.pydevd_cython", "PyDBAdditionalThreadInfo", sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PyDBAdditionalThreadInfo) __PYX_ERR(1, 1, __pyx_L1_error)
+  __pyx_ptype_14_pydevd_bundle_13pydevd_cython_PydevSmartStepContext = __Pyx_ImportType(__pyx_t_1, "_pydevd_bundle.pydevd_cython", "PydevSmartStepContext", sizeof(struct __pyx_obj_14_pydevd_bundle_13pydevd_cython_PydevSmartStepContext), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_14_pydevd_bundle_13pydevd_cython_PydevSmartStepContext) __PYX_ERR(1, 20, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_main_debugger = __pyx_t_2;
-  __pyx_t_2 = 0;
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":182
- * 
- *     cdef void * extra
- *     _PyCode_GetExtra(<PyObject *> code_obj, _code_extra_index, & extra)             # <<<<<<<<<<<<<<
- *     if extra is not NULL:
- *         extra_obj = <PyObject *> extra
- */
-  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_code_extra_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 182, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_t_2); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L1_error)
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  (void)(_PyCode_GetExtra(((PyObject *)__pyx_v_code_obj), __pyx_t_3, (&__pyx_v_extra)));
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":183
- *     cdef void * extra
- *     _PyCode_GetExtra(<PyObject *> code_obj, _code_extra_index, & extra)
- *     if extra is not NULL:             # <<<<<<<<<<<<<<
- *         extra_obj = <PyObject *> extra
- *         if extra_obj is not NULL:
- */
-  __pyx_t_4 = ((__pyx_v_extra != NULL) != 0);
-  if (__pyx_t_4) {
-
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":184
- *     _PyCode_GetExtra(<PyObject *> code_obj, _code_extra_index, & extra)
- *     if extra is not NULL:
- *         extra_obj = <PyObject *> extra             # <<<<<<<<<<<<<<
- *         if extra_obj is not NULL:
- *             func_code_info_obj = <FuncCodeInfo> extra_obj
- */
-    __pyx_v_extra_obj = ((PyObject *)__pyx_v_extra);
-
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":185
- *     if extra is not NULL:
- *         extra_obj = <PyObject *> extra
- *         if extra_obj is not NULL:             # <<<<<<<<<<<<<<
- *             func_code_info_obj = <FuncCodeInfo> extra_obj
- *             if func_code_info_obj.breakpoints_mtime == main_debugger.mtime:
- */
-    __pyx_t_4 = ((__pyx_v_extra_obj != NULL) != 0);
-    if (__pyx_t_4) {
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":186
- *         extra_obj = <PyObject *> extra
- *         if extra_obj is not NULL:
- *             func_code_info_obj = <FuncCodeInfo> extra_obj             # <<<<<<<<<<<<<<
- *             if func_code_info_obj.breakpoints_mtime == main_debugger.mtime:
- *                 # if DEBUG:
- */
-      __pyx_t_2 = ((PyObject *)__pyx_v_extra_obj);
-      __Pyx_INCREF(__pyx_t_2);
-      __pyx_v_func_code_info_obj = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_t_2);
-      __pyx_t_2 = 0;
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":187
- *         if extra_obj is not NULL:
- *             func_code_info_obj = <FuncCodeInfo> extra_obj
- *             if func_code_info_obj.breakpoints_mtime == main_debugger.mtime:             # <<<<<<<<<<<<<<
- *                 # if DEBUG:
- *                 #     print('get_func_code_info: matched mtime', f_code.co_name, f_code.co_filename)
- */
-      __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_func_code_info_obj->breakpoints_mtime); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 187, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_mtime); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 187, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 187, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 187, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_4) {
-
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":191
- *                 #     print('get_func_code_info: matched mtime', f_code.co_name, f_code.co_filename)
- * 
- *                 return func_code_info_obj             # <<<<<<<<<<<<<<
- * 
- *     cdef str co_filename = <str> code_obj.co_filename
- */
-        __Pyx_XDECREF(((PyObject *)__pyx_r));
-        __Pyx_INCREF(((PyObject *)__pyx_v_func_code_info_obj));
-        __pyx_r = __pyx_v_func_code_info_obj;
-        goto __pyx_L0;
-
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":187
- *         if extra_obj is not NULL:
- *             func_code_info_obj = <FuncCodeInfo> extra_obj
- *             if func_code_info_obj.breakpoints_mtime == main_debugger.mtime:             # <<<<<<<<<<<<<<
- *                 # if DEBUG:
- *                 #     print('get_func_code_info: matched mtime', f_code.co_name, f_code.co_filename)
- */
-      }
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":185
- *     if extra is not NULL:
- *         extra_obj = <PyObject *> extra
- *         if extra_obj is not NULL:             # <<<<<<<<<<<<<<
- *             func_code_info_obj = <FuncCodeInfo> extra_obj
- *             if func_code_info_obj.breakpoints_mtime == main_debugger.mtime:
- */
-    }
-
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":183
- *     cdef void * extra
- *     _PyCode_GetExtra(<PyObject *> code_obj, _code_extra_index, & extra)
- *     if extra is not NULL:             # <<<<<<<<<<<<<<
- *         extra_obj = <PyObject *> extra
- *         if extra_obj is not NULL:
- */
-  }
-
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":193
- *                 return func_code_info_obj
- * 
- *     cdef str co_filename = <str> code_obj.co_filename             # <<<<<<<<<<<<<<
- *     cdef str co_name = <str> code_obj.co_name
- * 
- */
-  __pyx_t_5 = ((PyObject *)__pyx_v_code_obj->co_filename);
-  __Pyx_INCREF(__pyx_t_5);
-  __pyx_v_co_filename = ((PyObject*)__pyx_t_5);
-  __pyx_t_5 = 0;
+  __pyx_t_1 = PyImport_ImportModule("_pydevd_frame_eval.pydevd_frame_evaluator_common"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo = __Pyx_ImportType(__pyx_t_1, "_pydevd_frame_eval.pydevd_frame_evaluator_common", "ThreadInfo", sizeof(struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo) __PYX_ERR(2, 73, __pyx_L1_error)
+  __pyx_ptype_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo = __Pyx_ImportType(__pyx_t_1, "_pydevd_frame_eval.pydevd_frame_evaluator_common", "FuncCodeInfo", sizeof(struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo) __PYX_ERR(2, 80, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_RefNannyFinishContext();
+  return 0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+}
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":194
- * 
- *     cdef str co_filename = <str> code_obj.co_filename
- *     cdef str co_name = <str> code_obj.co_name             # <<<<<<<<<<<<<<
- * 
- *     func_code_info = FuncCodeInfo()
- */
-  __pyx_t_5 = ((PyObject *)__pyx_v_code_obj->co_name);
-  __Pyx_INCREF(__pyx_t_5);
-  __pyx_v_co_name = ((PyObject*)__pyx_t_5);
-  __pyx_t_5 = 0;
+static int __Pyx_modinit_variable_import_code(void) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0);
+  /*--- Variable import code ---*/
+  __Pyx_RefNannyFinishContext();
+  return 0;
+}
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":196
- *     cdef str co_name = <str> code_obj.co_name
- * 
- *     func_code_info = FuncCodeInfo()             # <<<<<<<<<<<<<<
- *     func_code_info.breakpoints_mtime = main_debugger.mtime
- * 
- */
-  __pyx_t_5 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 196, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_5);
-  __pyx_v_func_code_info = ((struct __pyx_obj_18_pydevd_frame_eval_22pydevd_frame_evaluator_FuncCodeInfo *)__pyx_t_5);
-  __pyx_t_5 = 0;
+static int __Pyx_modinit_function_import_code(void) {
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0);
+  /*--- Function import code ---*/
+  __pyx_t_1 = PyImport_ImportModule("_pydevd_frame_eval.pydevd_frame_evaluator_common"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ImportFunction(__pyx_t_1, "get_thread_info", (void (**)(void))&__pyx_f_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_get_thread_info, "struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_ThreadInfo *(void)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ImportFunction(__pyx_t_1, "get_func_code_info", (void (**)(void))&__pyx_f_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_get_func_code_info, "struct __pyx_obj_18_pydevd_frame_eval_29pydevd_frame_evaluator_common_FuncCodeInfo *(PyCodeObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  Py_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_RefNannyFinishContext();
+  return 0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+}
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":197
- * 
- *     func_code_info = FuncCodeInfo()
- *     func_code_info.breakpoints_mtime = main_debugger.mtime             # <<<<<<<<<<<<<<
- * 
- *     func_code_info.co_filename = co_filename
- */
-  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_mtime); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 197, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_5); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 197, __pyx_L1_error)
-  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  __pyx_v_func_code_info->breakpoints_mtime = __pyx_t_6;
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":199
- *     func_code_info.breakpoints_mtime = main_debugger.mtime
- * 
- *     func_code_info.co_filename = co_filename             # <<<<<<<<<<<<<<
- * 
- *     if not func_code_info.always_skip_code:
- */
-  __Pyx_INCREF(__pyx_v_co_filename);
-  __Pyx_GIVEREF(__pyx_v_co_filename);
-  __Pyx_GOTREF(__pyx_v_func_code_info->co_filename);
-  __Pyx_DECREF(__pyx_v_func_code_info->co_filename);
-  __pyx_v_func_code_info->co_filename = __pyx_v_co_filename;
+#ifndef CYTHON_NO_PYINIT_EXPORT
+#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC
+#elif PY_MAJOR_VERSION < 3
+#ifdef __cplusplus
+#define __Pyx_PyMODINIT_FUNC extern "C" void
+#else
+#define __Pyx_PyMODINIT_FUNC void
+#endif
+#else
+#ifdef __cplusplus
+#define __Pyx_PyMODINIT_FUNC extern "C" PyObject *
+#else
+#define __Pyx_PyMODINIT_FUNC PyObject *
+#endif
+#endif
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":201
- *     func_code_info.co_filename = co_filename
- * 
- *     if not func_code_info.always_skip_code:             # <<<<<<<<<<<<<<
- *         try:
- *             abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename]
- */
-  __pyx_t_4 = ((!(__pyx_v_func_code_info->always_skip_code != 0)) != 0);
-  if (__pyx_t_4) {
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":202
- * 
- *     if not func_code_info.always_skip_code:
- *         try:             # <<<<<<<<<<<<<<
- *             abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename]
- *         except:
- */
+#if PY_MAJOR_VERSION < 3
+__Pyx_PyMODINIT_FUNC initpydevd_frame_evaluator(void) CYTHON_SMALL_CODE; /*proto*/
+__Pyx_PyMODINIT_FUNC initpydevd_frame_evaluator(void)
+#else
+__Pyx_PyMODINIT_FUNC PyInit_pydevd_frame_evaluator(void) CYTHON_SMALL_CODE; /*proto*/
+__Pyx_PyMODINIT_FUNC PyInit_pydevd_frame_evaluator(void)
+#if CYTHON_PEP489_MULTI_PHASE_INIT
+{
+  return PyModuleDef_Init(&__pyx_moduledef);
+}
+static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) {
+    #if PY_VERSION_HEX >= 0x030700A1
+    static PY_INT64_T main_interpreter_id = -1;
+    PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp);
+    if (main_interpreter_id == -1) {
+        main_interpreter_id = current_id;
+        return (unlikely(current_id == -1)) ? -1 : 0;
+    } else if (unlikely(main_interpreter_id != current_id))
+    #else
+    static PyInterpreterState *main_interpreter = NULL;
+    PyInterpreterState *current_interpreter = PyThreadState_Get()->interp;
+    if (!main_interpreter) {
+        main_interpreter = current_interpreter;
+    } else if (unlikely(main_interpreter != current_interpreter))
+    #endif
     {
-      __Pyx_PyThreadState_declare
-      __Pyx_PyThreadState_assign
-      __Pyx_ExceptionSave(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
-      __Pyx_XGOTREF(__pyx_t_7);
-      __Pyx_XGOTREF(__pyx_t_8);
-      __Pyx_XGOTREF(__pyx_t_9);
-      /*try:*/ {
-
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":203
- *     if not func_code_info.always_skip_code:
- *         try:
- *             abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename]             # <<<<<<<<<<<<<<
- *         except:
- *             abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_file(co_filename)
- */
-        __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_NORM_PATHS_AND_BASE_CONTAINER); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 203, __pyx_L7_error)
-        __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_1 = __Pyx_PyObject_Dict_GetItem(__pyx_t_5, __pyx_v_co_filename); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 203, __pyx_L7_error)
-        __Pyx_GOTREF(__pyx_t_1);
-        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __pyx_v_abs_path_real_path_and_base = __pyx_t_1;
-        __pyx_t_1 = 0;
-
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":202
- * 
- *     if not func_code_info.always_skip_code:
- *         try:             # <<<<<<<<<<<<<<
- *             abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename]
- *         except:
- */
-      }
-      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
-      goto __pyx_L12_try_end;
-      __pyx_L7_error:;
-      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":204
- *         try:
- *             abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename]
- *         except:             # <<<<<<<<<<<<<<
- *             abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_file(co_filename)
- * 
- */
-      /*except:*/ {
-        __Pyx_AddTraceback("_pydevd_frame_eval.pydevd_frame_evaluator.get_func_code_info", __pyx_clineno, __pyx_lineno, __pyx_filename);
-        if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_5, &__pyx_t_2) < 0) __PYX_ERR(0, 204, __pyx_L9_except_error)
-        __Pyx_GOTREF(__pyx_t_1);
-        __Pyx_GOTREF(__pyx_t_5);
-        __Pyx_GOTREF(__pyx_t_2);
-
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":205
- *             abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename]
- *         except:
- *             abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_file(co_filename)             # <<<<<<<<<<<<<<
- * 
- *         func_code_info.real_path = abs_path_real_path_and_base[1]
- */
-        __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_get_abs_path_real_path_and_base); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 205, __pyx_L9_except_error)
-        __Pyx_GOTREF(__pyx_t_11);
-        __pyx_t_12 = NULL;
-        if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_11))) {
-          __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_11);
-          if (likely(__pyx_t_12)) {
-            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
-            __Pyx_INCREF(__pyx_t_12);
-            __Pyx_INCREF(function);
-            __Pyx_DECREF_SET(__pyx_t_11, function);
-          }
+        PyErr_SetString(
+            PyExc_ImportError,
+            "Interpreter change detected - this module can only be loaded into one interpreter per process.");
+        return -1;
+    }
+    return 0;
+}
+static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) {
+    PyObject *value = PyObject_GetAttrString(spec, from_name);
+    int result = 0;
+    if (likely(value)) {
+        if (allow_none || value != Py_None) {
+            result = PyDict_SetItemString(moddict, to_name, value);
         }
-        __pyx_t_10 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_11, __pyx_t_12, __pyx_v_co_filename) : __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_v_co_filename);
-        __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-        if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 205, __pyx_L9_except_error)
-        __Pyx_GOTREF(__pyx_t_10);
-        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-        __Pyx_XDECREF_SET(__pyx_v_abs_path_real_path_and_base, __pyx_t_10);
-        __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        goto __pyx_L8_exception_handled;
-      }
-      __pyx_L9_except_error:;
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":202
- * 
- *     if not func_code_info.always_skip_code:
- *         try:             # <<<<<<<<<<<<<<
- *             abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename]
- *         except:
- */
-      __Pyx_XGIVEREF(__pyx_t_7);
-      __Pyx_XGIVEREF(__pyx_t_8);
-      __Pyx_XGIVEREF(__pyx_t_9);
-      __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
-      goto __pyx_L1_error;
-      __pyx_L8_exception_handled:;
-      __Pyx_XGIVEREF(__pyx_t_7);
-      __Pyx_XGIVEREF(__pyx_t_8);
-      __Pyx_XGIVEREF(__pyx_t_9);
-      __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
-      __pyx_L12_try_end:;
+        Py_DECREF(value);
+    } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
+        PyErr_Clear();
+    } else {
+        result = -1;
     }
-
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":207
- *             abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_file(co_filename)
- * 
- *         func_code_info.real_path = abs_path_real_path_and_base[1]             # <<<<<<<<<<<<<<
- * 
- *         file_type = get_file_type(abs_path_real_path_and_base[-1])  # we don't want to debug anything related to pydevd
- */
-    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_abs_path_real_path_and_base, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 207, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_2);
-    if (!(likely(PyString_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 207, __pyx_L1_error)
-    __Pyx_GIVEREF(__pyx_t_2);
-    __Pyx_GOTREF(__pyx_v_func_code_info->real_path);
-    __Pyx_DECREF(__pyx_v_func_code_info->real_path);
-    __pyx_v_func_code_info->real_path = ((PyObject*)__pyx_t_2);
-    __pyx_t_2 = 0;
-
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":209
- *         func_code_info.real_path = abs_path_real_path_and_base[1]
- * 
- *         file_type = get_file_type(abs_path_real_path_and_base[-1])  # we don't want to debug anything related to pydevd             # <<<<<<<<<<<<<<
- *         if file_type is not None:
- *             func_code_info.always_skip_code = True
- */
-    __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_get_file_type); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 209, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_abs_path_real_path_and_base, -1L, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 209, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_10 = NULL;
-    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) {
-      __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_5);
-      if (likely(__pyx_t_10)) {
-        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
-        __Pyx_INCREF(__pyx_t_10);
-        __Pyx_INCREF(function);
-        __Pyx_DECREF_SET(__pyx_t_5, function);
-      }
+    return result;
+}
+static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) {
+    PyObject *module = NULL, *moddict, *modname;
+    if (__Pyx_check_single_interpreter())
+        return NULL;
+    if (__pyx_m)
+        return __Pyx_NewRef(__pyx_m);
+    modname = PyObject_GetAttrString(spec, "name");
+    if (unlikely(!modname)) goto bad;
+    module = PyModule_NewObject(modname);
+    Py_DECREF(modname);
+    if (unlikely(!module)) goto bad;
+    moddict = PyModule_GetDict(module);
+    if (unlikely(!moddict)) goto bad;
+    if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad;
+    if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad;
+    if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad;
+    if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad;
+    return module;
+bad:
+    Py_XDECREF(module);
+    return NULL;
+}
+
+
+static CYTHON_SMALL_CODE int __pyx_pymod_exec_pydevd_frame_evaluator(PyObject *__pyx_pyinit_module)
+#endif
+#endif
+{
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  #if CYTHON_PEP489_MULTI_PHASE_INIT
+  if (__pyx_m) {
+    if (__pyx_m == __pyx_pyinit_module) return 0;
+    PyErr_SetString(PyExc_RuntimeError, "Module 'pydevd_frame_evaluator' has already been imported. Re-initialisation is not supported.");
+    return -1;
+  }
+  #elif PY_MAJOR_VERSION >= 3
+  if (__pyx_m) return __Pyx_NewRef(__pyx_m);
+  #endif
+  #if CYTHON_REFNANNY
+__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
+if (!__Pyx_RefNanny) {
+  PyErr_Clear();
+  __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
+  if (!__Pyx_RefNanny)
+      Py_FatalError("failed to import 'refnanny' module");
+}
+#endif
+  __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_pydevd_frame_evaluator(void)", 0);
+  if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #ifdef __Pxy_PyFrame_Initialize_Offsets
+  __Pxy_PyFrame_Initialize_Offsets();
+  #endif
+  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error)
+  #ifdef __Pyx_CyFunction_USED
+  if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  #ifdef __Pyx_FusedFunction_USED
+  if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  #ifdef __Pyx_Coroutine_USED
+  if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  #ifdef __Pyx_Generator_USED
+  if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  #ifdef __Pyx_AsyncGen_USED
+  if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  #ifdef __Pyx_StopAsyncIteration_USED
+  if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  /*--- Library function declarations ---*/
+  /*--- Threads initialization code ---*/
+  #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
+  #ifdef WITH_THREAD /* Python build with threading support? */
+  PyEval_InitThreads();
+  #endif
+  #endif
+  /*--- Module creation code ---*/
+  #if CYTHON_PEP489_MULTI_PHASE_INIT
+  __pyx_m = __pyx_pyinit_module;
+  Py_INCREF(__pyx_m);
+  #else
+  #if PY_MAJOR_VERSION < 3
+  __pyx_m = Py_InitModule4("pydevd_frame_evaluator", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
+  #else
+  __pyx_m = PyModule_Create(&__pyx_moduledef);
+  #endif
+  if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error)
+  Py_INCREF(__pyx_d);
+  __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error)
+  Py_INCREF(__pyx_b);
+  __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error)
+  Py_INCREF(__pyx_cython_runtime);
+  if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error);
+  /*--- Initialize various global constants etc. ---*/
+  if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
+  if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  if (__pyx_module_is_main__pydevd_frame_eval__pydevd_frame_evaluator) {
+    if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  }
+  #if PY_MAJOR_VERSION >= 3
+  {
+    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error)
+    if (!PyDict_GetItemString(modules, "_pydevd_frame_eval.pydevd_frame_evaluator")) {
+      if (unlikely(PyDict_SetItemString(modules, "_pydevd_frame_eval.pydevd_frame_evaluator", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
     }
-    __pyx_t_2 = (__pyx_t_10) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_10, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_1);
-    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 209, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_v_file_type = __pyx_t_2;
-    __pyx_t_2 = 0;
+  }
+  #endif
+  /*--- Builtin init code ---*/
+  if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  /*--- Constants init code ---*/
+  if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  /*--- Global type/function init code ---*/
+  (void)__Pyx_modinit_global_init_code();
+  (void)__Pyx_modinit_variable_export_code();
+  (void)__Pyx_modinit_function_export_code();
+  (void)__Pyx_modinit_type_init_code();
+  if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
+  (void)__Pyx_modinit_variable_import_code();
+  if (unlikely(__Pyx_modinit_function_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
+  /*--- Execution code ---*/
+  #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
+  if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":210
- * 
- *         file_type = get_file_type(abs_path_real_path_and_base[-1])  # we don't want to debug anything related to pydevd
- *         if file_type is not None:             # <<<<<<<<<<<<<<
- *             func_code_info.always_skip_code = True
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":2
+ * from __future__ import print_function
+ * from _pydev_imps._pydev_saved_modules import threading             # <<<<<<<<<<<<<<
+ * from _pydevd_bundle.pydevd_comm import GlobalDebuggerHolder
+ * from _pydevd_frame_eval.pydevd_frame_tracing import update_globals_dict, dummy_tracing_holder
+ */
+  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_n_s_threading);
+  __Pyx_GIVEREF(__pyx_n_s_threading);
+  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_threading);
+  __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydev_imps__pydev_saved_modules, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_threading); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_threading, __pyx_t_1) < 0) __PYX_ERR(0, 2, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":3
+ * from __future__ import print_function
+ * from _pydev_imps._pydev_saved_modules import threading
+ * from _pydevd_bundle.pydevd_comm import GlobalDebuggerHolder             # <<<<<<<<<<<<<<
+ * from _pydevd_frame_eval.pydevd_frame_tracing import update_globals_dict, dummy_tracing_holder
+ * from _pydevd_bundle.pydevd_trace_dispatch import fix_top_level_trace_and_get_trace_func
+ */
+  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_n_s_GlobalDebuggerHolder);
+  __Pyx_GIVEREF(__pyx_n_s_GlobalDebuggerHolder);
+  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_GlobalDebuggerHolder);
+  __pyx_t_1 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_comm, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_GlobalDebuggerHolder); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_GlobalDebuggerHolder, __pyx_t_2) < 0) __PYX_ERR(0, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":4
+ * from _pydev_imps._pydev_saved_modules import threading
+ * from _pydevd_bundle.pydevd_comm import GlobalDebuggerHolder
+ * from _pydevd_frame_eval.pydevd_frame_tracing import update_globals_dict, dummy_tracing_holder             # <<<<<<<<<<<<<<
+ * from _pydevd_bundle.pydevd_trace_dispatch import fix_top_level_trace_and_get_trace_func
  * 
  */
-    __pyx_t_4 = (__pyx_v_file_type != Py_None);
-    __pyx_t_13 = (__pyx_t_4 != 0);
-    if (__pyx_t_13) {
+  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_n_s_update_globals_dict);
+  __Pyx_GIVEREF(__pyx_n_s_update_globals_dict);
+  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_update_globals_dict);
+  __Pyx_INCREF(__pyx_n_s_dummy_tracing_holder);
+  __Pyx_GIVEREF(__pyx_n_s_dummy_tracing_holder);
+  PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_dummy_tracing_holder);
+  __pyx_t_2 = __Pyx_Import(__pyx_n_s_pydevd_frame_eval_pydevd_frame, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_update_globals_dict); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_update_globals_dict, __pyx_t_1) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_dummy_tracing_holder); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_dummy_tracing_holder, __pyx_t_1) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":211
- *         file_type = get_file_type(abs_path_real_path_and_base[-1])  # we don't want to debug anything related to pydevd
- *         if file_type is not None:
- *             func_code_info.always_skip_code = True             # <<<<<<<<<<<<<<
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":5
+ * from _pydevd_bundle.pydevd_comm import GlobalDebuggerHolder
+ * from _pydevd_frame_eval.pydevd_frame_tracing import update_globals_dict, dummy_tracing_holder
+ * from _pydevd_bundle.pydevd_trace_dispatch import fix_top_level_trace_and_get_trace_func             # <<<<<<<<<<<<<<
  * 
- *     if not func_code_info.always_skip_code:
+ * from _pydevd_bundle.pydevd_cython cimport PyDBAdditionalThreadInfo
  */
-      __pyx_v_func_code_info->always_skip_code = 1;
+  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 5, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_n_s_fix_top_level_trace_and_get_trac);
+  __Pyx_GIVEREF(__pyx_n_s_fix_top_level_trace_and_get_trac);
+  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_fix_top_level_trace_and_get_trac);
+  __pyx_t_1 = __Pyx_Import(__pyx_n_s_pydevd_bundle_pydevd_trace_disp, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 5, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_fix_top_level_trace_and_get_trac); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 5, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_fix_top_level_trace_and_get_trac, __pyx_t_2) < 0) __PYX_ERR(0, 5, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":210
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":12
+ * 
+ * 
+ * _thread_local_info = threading.local()             # <<<<<<<<<<<<<<
  * 
- *         file_type = get_file_type(abs_path_real_path_and_base[-1])  # we don't want to debug anything related to pydevd
- *         if file_type is not None:             # <<<<<<<<<<<<<<
- *             func_code_info.always_skip_code = True
  * 
  */
-    }
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_threading); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_local); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_thread_local_info, __pyx_t_1) < 0) __PYX_ERR(0, 12, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":201
- *     func_code_info.co_filename = co_filename
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":15
  * 
- *     if not func_code_info.always_skip_code:             # <<<<<<<<<<<<<<
- *         try:
- *             abs_path_real_path_and_base = NORM_PATHS_AND_BASE_CONTAINER[co_filename]
+ * 
+ * def clear_thread_local_info():             # <<<<<<<<<<<<<<
+ *     global _thread_local_info
+ *     _thread_local_info = threading.local()
  */
-  }
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_1clear_thread_local_info, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_clear_thread_local_info, __pyx_t_1) < 0) __PYX_ERR(0, 15, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":213
- *             func_code_info.always_skip_code = True
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":20
+ * 
+ * 
+ * def get_thread_info_py() -> ThreadInfo:             # <<<<<<<<<<<<<<
+ *     return get_thread_info()
  * 
- *     if not func_code_info.always_skip_code:             # <<<<<<<<<<<<<<
- *         was_break: bool = False
- *         if main_debugger is not None:
  */
-  __pyx_t_13 = ((!(__pyx_v_func_code_info->always_skip_code != 0)) != 0);
-  if (__pyx_t_13) {
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_3get_thread_info_py, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 20, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_thread_info_py, __pyx_t_1) < 0) __PYX_ERR(0, 20, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":214
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":24
+ * 
  * 
- *     if not func_code_info.always_skip_code:
- *         was_break: bool = False             # <<<<<<<<<<<<<<
- *         if main_debugger is not None:
- *             breakpoints: dict = main_debugger.breakpoints.get(func_code_info.real_path)
+ * def dummy_trace_dispatch(frame, str event, arg):             # <<<<<<<<<<<<<<
+ *     if event == 'call':
+ *         if frame.f_trace is not None:
  */
-    __pyx_v_was_break = 0;
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_5dummy_trace_dispatch, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 24, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_dummy_trace_dispatch, __pyx_t_1) < 0) __PYX_ERR(0, 24, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-    /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":215
- *     if not func_code_info.always_skip_code:
- *         was_break: bool = False
- *         if main_debugger is not None:             # <<<<<<<<<<<<<<
- *             breakpoints: dict = main_debugger.breakpoints.get(func_code_info.real_path)
- *             # print('\n---')
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":31
+ * 
+ * 
+ * def decref_py(obj):             # <<<<<<<<<<<<<<
+ *     '''
+ *     Helper to be called from Python.
  */
-    __pyx_t_13 = (__pyx_v_main_debugger != Py_None);
-    __pyx_t_4 = (__pyx_t_13 != 0);
-    if (__pyx_t_4) {
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_7decref_py, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 31, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_decref_py, __pyx_t_1) < 0) __PYX_ERR(0, 31, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":216
- *         was_break: bool = False
- *         if main_debugger is not None:
- *             breakpoints: dict = main_debugger.breakpoints.get(func_code_info.real_path)             # <<<<<<<<<<<<<<
- *             # print('\n---')
- *             # print(main_debugger.breakpoints)
- */
-      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_main_debugger, __pyx_n_s_breakpoints); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 216, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_get); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 216, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = NULL;
-      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) {
-        __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1);
-        if (likely(__pyx_t_5)) {
-          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
-          __Pyx_INCREF(__pyx_t_5);
-          __Pyx_INCREF(function);
-          __Pyx_DECREF_SET(__pyx_t_1, function);
-        }
-      }
-      __pyx_t_2 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_5, __pyx_v_func_code_info->real_path) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_func_code_info->real_path);
-      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 216, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      if (!(likely(PyDict_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 216, __pyx_L1_error)
-      __pyx_v_breakpoints = ((PyObject*)__pyx_t_2);
-      __pyx_t_2 = 0;
-
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":221
- *             # print(func_code_info.real_path)
- *             # print(main_debugger.breakpoints.get(func_code_info.real_path))
- *             code_obj_py: object = <object> code_obj             # <<<<<<<<<<<<<<
- *             if breakpoints:
- *                 # if DEBUG:
- */
-      __pyx_t_2 = ((PyObject *)__pyx_v_code_obj);
-      __Pyx_INCREF(__pyx_t_2);
-      __pyx_v_code_obj_py = __pyx_t_2;
-      __pyx_t_2 = 0;
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":38
+ * 
+ * 
+ * def get_func_code_info_py(code_obj) -> FuncCodeInfo:             # <<<<<<<<<<<<<<
+ *     '''
+ *     Helper to be called from Python.
+ */
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_9get_func_code_info_py, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 38, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_func_code_info_py, __pyx_t_1) < 0) __PYX_ERR(0, 38, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":222
- *             # print(main_debugger.breakpoints.get(func_code_info.real_path))
- *             code_obj_py: object = <object> code_obj
- *             if breakpoints:             # <<<<<<<<<<<<<<
- *                 # if DEBUG:
- *                 #    print('found breakpoints', code_obj_py.co_name, breakpoints)
+  /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":164
+ * 
+ * 
+ * def frame_eval_func():             # <<<<<<<<<<<<<<
+ *     cdef PyThreadState *state = PyThreadState_Get()
+ *     state.interp.eval_frame = get_bytecode_while_frame_eval
  */
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_breakpoints); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 222, __pyx_L1_error)
-      if (__pyx_t_4) {
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_18_pydevd_frame_eval_22pydevd_frame_evaluator_11frame_eval_func, NULL, __pyx_n_s_pydevd_frame_eval_pydevd_frame_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 164, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_frame_eval_func, __pyx_t_1) < 0) __PYX_ERR(0, 164, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":225
- *                 # if DEBUG:
- *                 #    print('found breakpoints', code_obj_py.co_name, breakpoints)
- *                 for offset, line in dis.findlinestarts(code_obj_py):             # <<<<<<<<<<<<<<
- *                     if line in breakpoints:
- *                         breakpoint = breakpoints[line]
- */
-        __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_dis); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 225, __pyx_L1_error)
-        __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_findlinestarts); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 225, __pyx_L1_error)
-        __Pyx_GOTREF(__pyx_t_5);
-        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = NULL;
-        if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) {
-          __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_5);
-          if (likely(__pyx_t_1)) {
-            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
-            __Pyx_INCREF(__pyx_t_1);
-            __Pyx_INCREF(function);
-            __Pyx_DECREF_SET(__pyx_t_5, function);
-          }
-        }
-        __pyx_t_2 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_1, __pyx_v_code_obj_py) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_code_obj_py);
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 225, __pyx_L1_error)
-        __Pyx_GOTREF(__pyx_t_2);
-        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        if (likely(PyList_CheckExact(__pyx_t_2)) || PyTuple_CheckExact(__pyx_t_2)) {
-          __pyx_t_5 = __pyx_t_2; __Pyx_INCREF(__pyx_t_5); __pyx_t_3 = 0;
-          __pyx_t_14 = NULL;
-        } else {
-          __pyx_t_3 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 225, __pyx_L1_error)
-          __Pyx_GOTREF(__pyx_t_5);
-          __pyx_t_14 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 225, __pyx_L1_error)
-        }
-        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        for (;;) {
-          if (likely(!__pyx_t_14)) {
-            if (likely(PyList_CheckExact(__pyx_t_5))) {
-              if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_5)) break;
-              #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 225, __pyx_L1_error)
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 225, __pyx_L1_error)
-              __Pyx_GOTREF(__pyx_t_2);
-              #endif
-            } else {
-              if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-              #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 225, __pyx_L1_error)
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 225, __pyx_L1_error)
-              __Pyx_GOTREF(__pyx_t_2);
-              #endif
-            }
-          } else {
-            __pyx_t_2 = __pyx_t_14(__pyx_t_5);
-            if (unlikely(!__pyx_t_2)) {
-              PyObject* exc_type = PyErr_Occurred();
-              if (exc_type) {
-                if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
-                else __PYX_ERR(0, 225, __pyx_L1_error)
-              }
-              break;
-            }
-            __Pyx_GOTREF(__pyx_t_2);
-          }
-          if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
-            PyObject* sequence = __pyx_t_2;
-            Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
-            if (unlikely(size != 2)) {
-              if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-              else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-              __PYX_ERR(0, 225, __pyx_L1_error)
-            }
-            #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
-            if (likely(PyTuple_CheckExact(sequence))) {
-              __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
-              __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
-            } else {
-              __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
-              __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
-            }
-            __Pyx_INCREF(__pyx_t_1);
-            __Pyx_INCREF(__pyx_t_10);
-            #else
-            __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 225, __pyx_L1_error)
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 225, __pyx_L1_error)
-            __Pyx_GOTREF(__pyx_t_10);
-            #endif
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          } else {
-            Py_ssize_t index = -1;
-            __pyx_t_11 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 225, __pyx_L1_error)
-            __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_15 = Py_TYPE(__pyx_t_11)->tp_iternext;
-            index = 0; __pyx_t_1 = __pyx_t_15(__pyx_t_11); if (unlikely(!__pyx_t_1)) goto __pyx_L21_unpacking_failed;
-            __Pyx_GOTREF(__pyx_t_1);
-            index = 1; __pyx_t_10 = __pyx_t_15(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L21_unpacking_failed;
-            __Pyx_GOTREF(__pyx_t_10);
-            if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_11), 2) < 0) __PYX_ERR(0, 225, __pyx_L1_error)
-            __pyx_t_15 = NULL;
-            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            goto __pyx_L22_unpacking_done;
-            __pyx_L21_unpacking_failed:;
-            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            __pyx_t_15 = NULL;
-            if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-            __PYX_ERR(0, 225, __pyx_L1_error)
-            __pyx_L22_unpacking_done:;
-          }
-          __Pyx_XDECREF_SET(__pyx_v_offset, __pyx_t_1);
-          __pyx_t_1 = 0;
-          __Pyx_XDECREF_SET(__pyx_v_line, __pyx_t_10);
-          __pyx_t_10 = 0;
-
-          /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":226
- *                 #    print('found breakpoints', code_obj_py.co_name, breakpoints)
- *                 for offset, line in dis.findlinestarts(code_obj_py):
- *                     if line in breakpoints:             # <<<<<<<<<<<<<<
- *                         breakpoint = breakpoints[line]
- *                         # if DEBUG:
- */
-          if (unlikely(__pyx_v_breakpoints == Py_None)) {
-            PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
-            __PYX_ERR(0, 226, __pyx_L1_error)
-          }
-          __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_v_line, __pyx_v_breakpoints, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 226, __pyx_L1_error)
-          __pyx_t_13 = (__pyx_t_4 != 0);
-          if (__pyx_t_13) {
-
-            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":227
- *                 for offset, line in dis.findlinestarts(code_obj_py):
- *                     if line in breakpoints:
- *                         breakpoint = breakpoints[line]             # <<<<<<<<<<<<<<
- *                         # if DEBUG:
- *                         #    print('created breakpoint', code_obj_py.co_name, line)
- */
-            if (unlikely(__pyx_v_breakpoints == Py_None)) {
-              PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-              __PYX_ERR(0, 227, __pyx_L1_error)
-            }
-            __pyx_t_2 = __Pyx_PyDict_GetItem(__pyx_v_breakpoints, __pyx_v_line); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 227, __pyx_L1_error)
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_XDECREF_SET(__pyx_v_breakpoint, __pyx_t_2);
-            __pyx_t_2 = 0;
-
-            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":230
- *                         # if DEBUG:
- *                         #    print('created breakpoint', code_obj_py.co_name, line)
- *                         func_code_info.breakpoints_created.add(line)             # <<<<<<<<<<<<<<
- *                         func_code_info.breakpoint_found = True
- * 
- */
-            if (unlikely(__pyx_v_func_code_info->breakpoints_created == Py_None)) {
-              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "add");
-              __PYX_ERR(0, 230, __pyx_L1_error)
-            }
-            __pyx_t_16 = PySet_Add(__pyx_v_func_code_info->breakpoints_created, __pyx_v_line); if (unlikely(__pyx_t_16 == ((int)-1))) __PYX_ERR(0, 230, __pyx_L1_error)
-
-            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":231
- *                         #    print('created breakpoint', code_obj_py.co_name, line)
- *                         func_code_info.breakpoints_created.add(line)
- *                         func_code_info.breakpoint_found = True             # <<<<<<<<<<<<<<
- * 
- *                         success, new_code = insert_code(
- */
-            __pyx_v_func_code_info->breakpoint_found = 1;
-
-            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":233
- *                         func_code_info.breakpoint_found = True
- * 
- *                         success, new_code = insert_code(             # <<<<<<<<<<<<<<
- *                             code_obj_py, create_pydev_trace_code_wrapper(line), line)
- * 
- */
-            __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_insert_code); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 233, __pyx_L1_error)
-            __Pyx_GOTREF(__pyx_t_10);
-
-            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":234
- * 
- *                         success, new_code = insert_code(
- *                             code_obj_py, create_pydev_trace_code_wrapper(line), line)             # <<<<<<<<<<<<<<
- * 
- *                         if success:
- */
-            __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_create_pydev_trace_code_wrapper); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 234, __pyx_L1_error)
-            __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_12 = NULL;
-            if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_11))) {
-              __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_11);
-              if (likely(__pyx_t_12)) {
-                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
-                __Pyx_INCREF(__pyx_t_12);
-                __Pyx_INCREF(function);
-                __Pyx_DECREF_SET(__pyx_t_11, function);
-              }
-            }
-            __pyx_t_1 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_11, __pyx_t_12, __pyx_v_line) : __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_v_line);
-            __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-            if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 234, __pyx_L1_error)
-            __Pyx_GOTREF(__pyx_t_1);
-            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            __pyx_t_11 = NULL;
-            __pyx_t_6 = 0;
-            if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_10))) {
-              __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_10);
-              if (likely(__pyx_t_11)) {
-                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
-                __Pyx_INCREF(__pyx_t_11);
-                __Pyx_INCREF(function);
-                __Pyx_DECREF_SET(__pyx_t_10, function);
-                __pyx_t_6 = 1;
-              }
-            }
-            #if CYTHON_FAST_PYCALL
-            if (PyFunction_Check(__pyx_t_10)) {
-              PyObject *__pyx_temp[4] = {__pyx_t_11, __pyx_v_code_obj_py, __pyx_t_1, __pyx_v_line};
-              __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-__pyx_t_6, 3+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 233, __pyx_L1_error)
-              __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
-              __Pyx_GOTREF(__pyx_t_2);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            } else
-            #endif
-            #if CYTHON_FAST_PYCCALL
-            if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) {
-              PyObject *__pyx_temp[4] = {__pyx_t_11, __pyx_v_code_obj_py, __pyx_t_1, __pyx_v_line};
-              __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-__pyx_t_6, 3+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 233, __pyx_L1_error)
-              __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
-              __Pyx_GOTREF(__pyx_t_2);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            } else
-            #endif
-            {
-              __pyx_t_12 = PyTuple_New(3+__pyx_t_6); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 233, __pyx_L1_error)
-              __Pyx_GOTREF(__pyx_t_12);
-              if (__pyx_t_11) {
-                __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_11); __pyx_t_11 = NULL;
-              }
-              __Pyx_INCREF(__pyx_v_code_obj_py);
-              __Pyx_GIVEREF(__pyx_v_code_obj_py);
-              PyTuple_SET_ITEM(__pyx_t_12, 0+__pyx_t_6, __pyx_v_code_obj_py);
-              __Pyx_GIVEREF(__pyx_t_1);
-              PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_6, __pyx_t_1);
-              __Pyx_INCREF(__pyx_v_line);
-              __Pyx_GIVEREF(__pyx_v_line);
-              PyTuple_SET_ITEM(__pyx_t_12, 2+__pyx_t_6, __pyx_v_line);
-              __pyx_t_1 = 0;
-              __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_12, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 233, __pyx_L1_error)
-              __Pyx_GOTREF(__pyx_t_2);
-              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-            }
-            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
-              PyObject* sequence = __pyx_t_2;
-              Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
-              if (unlikely(size != 2)) {
-                if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                __PYX_ERR(0, 233, __pyx_L1_error)
-              }
-              #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
-              if (likely(PyTuple_CheckExact(sequence))) {
-                __pyx_t_10 = PyTuple_GET_ITEM(sequence, 0); 
-                __pyx_t_12 = PyTuple_GET_ITEM(sequence, 1); 
-              } else {
-                __pyx_t_10 = PyList_GET_ITEM(sequence, 0); 
-                __pyx_t_12 = PyList_GET_ITEM(sequence, 1); 
-              }
-              __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_12);
-              #else
-              __pyx_t_10 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 233, __pyx_L1_error)
-              __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_12 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 233, __pyx_L1_error)
-              __Pyx_GOTREF(__pyx_t_12);
-              #endif
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            } else {
-              Py_ssize_t index = -1;
-              __pyx_t_1 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 233, __pyx_L1_error)
-              __Pyx_GOTREF(__pyx_t_1);
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-              __pyx_t_15 = Py_TYPE(__pyx_t_1)->tp_iternext;
-              index = 0; __pyx_t_10 = __pyx_t_15(__pyx_t_1); if (unlikely(!__pyx_t_10)) goto __pyx_L24_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_10);
-              index = 1; __pyx_t_12 = __pyx_t_15(__pyx_t_1); if (unlikely(!__pyx_t_12)) goto __pyx_L24_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_12);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_1), 2) < 0) __PYX_ERR(0, 233, __pyx_L1_error)
-              __pyx_t_15 = NULL;
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              goto __pyx_L25_unpacking_done;
-              __pyx_L24_unpacking_failed:;
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_15 = NULL;
-              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              __PYX_ERR(0, 233, __pyx_L1_error)
-              __pyx_L25_unpacking_done:;
-            }
-
-            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":233
- *                         func_code_info.breakpoint_found = True
- * 
- *                         success, new_code = insert_code(             # <<<<<<<<<<<<<<
- *                             code_obj_py, create_pydev_trace_code_wrapper(line), line)
- * 
- */
-            __Pyx_XDECREF_SET(__pyx_v_success, __pyx_t_10);
-            __pyx_t_10 = 0;
-            __Pyx_XDECREF_SET(__pyx_v_new_code, __pyx_t_12);
-            __pyx_t_12 = 0;
-
-            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":236
- *                             code_obj_py, create_pydev_trace_code_wrapper(line), line)
- * 
- *                         if success:             # <<<<<<<<<<<<<<
- *                             func_code_info.new_code = new_code
- *                             code_obj_py = new_code
- */
-            __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_v_success); if (unlikely(__pyx_t_13 < 0)) __PYX_ERR(0, 236, __pyx_L1_error)
-            if (__pyx_t_13) {
-
-              /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":237
- * 
- *                         if success:
- *                             func_code_info.new_code = new_code             # <<<<<<<<<<<<<<
- *                             code_obj_py = new_code
- *                         else:
- */
-              __Pyx_INCREF(__pyx_v_new_code);
-              __Pyx_GIVEREF(__pyx_v_new_code);
-              __Pyx_GOTREF(__pyx_v_func_code_info->new_code);
-              __Pyx_DECREF(__pyx_v_func_code_info->new_code);
-              __pyx_v_func_code_info->new_code = __pyx_v_new_code;
-
-              /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":238
- *                         if success:
- *                             func_code_info.new_code = new_code
- *                             code_obj_py = new_code             # <<<<<<<<<<<<<<
- *                         else:
- *                             func_code_info.new_code = None
- */
-              __Pyx_INCREF(__pyx_v_new_code);
-              __Pyx_DECREF_SET(__pyx_v_code_obj_py, __pyx_v_new_code);
-
-              /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":236
- *                             code_obj_py, create_pydev_trace_code_wrapper(line), line)
- * 
- *                         if success:             # <<<<<<<<<<<<<<
- *                             func_code_info.new_code = new_code
- *                             code_obj_py = new_code
- */
-              goto __pyx_L26;
-            }
-
-            /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":240
- *                             code_obj_py = new_code
- *                         else:
- *                             func_code_info.new_code = None             # <<<<<<<<<<<<<<
- *                             break
- * 
- */
-            /*else*/ {
-              __Pyx_INCREF(Py_None);
-              __Pyx_GIVEREF(Py_None);
-              __Pyx_GOTREF(__pyx_v_func_code_info->new_code);
-              __Pyx_DECREF(__pyx_v_func_code_info->new_code);
-              __pyx_v_func_code_info->new_code = Py_None;
-
-              /* "_pydevd_frame_eval/pydevd_frame_evaluator.pyx":241
- *                         else:
- *                             func_code_info.new_code = None
- *                             break             # <<<<<<<<<<<<<<
- * 
- *     Py_INCREF(func_code_info)
- */
-              goto __pyx_L20_break;
-            }
-            __pyx_L26:;
-
-            /* "_pydevd_frame_eval/pydevd_frame_eva