@@ -1331,7 +1331,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
1331
1331
TARGET_##op
1332
1332
1333
1333
#ifdef LLTRACE
1334
- #define FAST_DISPATCH () \
1334
+ #define DISPATCH () \
1335
1335
{ \
1336
1336
if (!lltrace && !_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
1337
1337
f->f_lasti = INSTR_OFFSET(); \
@@ -1341,7 +1341,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
1341
1341
goto fast_next_opcode; \
1342
1342
}
1343
1343
#else
1344
- #define FAST_DISPATCH () \
1344
+ #define DISPATCH () \
1345
1345
{ \
1346
1346
if (!_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
1347
1347
f->f_lasti = INSTR_OFFSET(); \
@@ -1352,20 +1352,17 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
1352
1352
}
1353
1353
#endif
1354
1354
1355
- #define DISPATCH () \
1356
- { \
1357
- if (!_Py_atomic_load_relaxed(eval_breaker)) { \
1358
- FAST_DISPATCH(); \
1359
- } \
1360
- continue; \
1361
- }
1362
-
1363
1355
#else
1364
1356
#define TARGET (op ) op
1365
- #define FAST_DISPATCH () goto fast_next_opcode
1366
- #define DISPATCH () continue
1357
+ #define DISPATCH () goto fast_next_opcode
1358
+
1367
1359
#endif
1368
1360
1361
+ #define CHECK_EVAL_BREAKER () \
1362
+ if (_Py_atomic_load_relaxed(eval_breaker)) { \
1363
+ continue; \
1364
+ }
1365
+
1369
1366
1370
1367
/* Tuple access macros */
1371
1368
@@ -1857,7 +1854,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
1857
1854
and that all operation that succeed call [FAST_]DISPATCH() ! */
1858
1855
1859
1856
case TARGET (NOP ): {
1860
- FAST_DISPATCH ();
1857
+ DISPATCH ();
1861
1858
}
1862
1859
1863
1860
case TARGET (LOAD_FAST ): {
@@ -1870,36 +1867,36 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
1870
1867
}
1871
1868
Py_INCREF (value );
1872
1869
PUSH (value );
1873
- FAST_DISPATCH ();
1870
+ DISPATCH ();
1874
1871
}
1875
1872
1876
1873
case TARGET (LOAD_CONST ): {
1877
1874
PREDICTED (LOAD_CONST );
1878
1875
PyObject * value = GETITEM (consts , oparg );
1879
1876
Py_INCREF (value );
1880
1877
PUSH (value );
1881
- FAST_DISPATCH ();
1878
+ DISPATCH ();
1882
1879
}
1883
1880
1884
1881
case TARGET (STORE_FAST ): {
1885
1882
PREDICTED (STORE_FAST );
1886
1883
PyObject * value = POP ();
1887
1884
SETLOCAL (oparg , value );
1888
- FAST_DISPATCH ();
1885
+ DISPATCH ();
1889
1886
}
1890
1887
1891
1888
case TARGET (POP_TOP ): {
1892
1889
PyObject * value = POP ();
1893
1890
Py_DECREF (value );
1894
- FAST_DISPATCH ();
1891
+ DISPATCH ();
1895
1892
}
1896
1893
1897
1894
case TARGET (ROT_TWO ): {
1898
1895
PyObject * top = TOP ();
1899
1896
PyObject * second = SECOND ();
1900
1897
SET_TOP (second );
1901
1898
SET_SECOND (top );
1902
- FAST_DISPATCH ();
1899
+ DISPATCH ();
1903
1900
}
1904
1901
1905
1902
case TARGET (ROT_THREE ): {
@@ -1909,7 +1906,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
1909
1906
SET_TOP (second );
1910
1907
SET_SECOND (third );
1911
1908
SET_THIRD (top );
1912
- FAST_DISPATCH ();
1909
+ DISPATCH ();
1913
1910
}
1914
1911
1915
1912
case TARGET (ROT_FOUR ): {
@@ -1921,14 +1918,14 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
1921
1918
SET_SECOND (third );
1922
1919
SET_THIRD (fourth );
1923
1920
SET_FOURTH (top );
1924
- FAST_DISPATCH ();
1921
+ DISPATCH ();
1925
1922
}
1926
1923
1927
1924
case TARGET (DUP_TOP ): {
1928
1925
PyObject * top = TOP ();
1929
1926
Py_INCREF (top );
1930
1927
PUSH (top );
1931
- FAST_DISPATCH ();
1928
+ DISPATCH ();
1932
1929
}
1933
1930
1934
1931
case TARGET (DUP_TOP_TWO ): {
@@ -1939,7 +1936,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
1939
1936
STACK_GROW (2 );
1940
1937
SET_TOP (top );
1941
1938
SET_SECOND (second );
1942
- FAST_DISPATCH ();
1939
+ DISPATCH ();
1943
1940
}
1944
1941
1945
1942
case TARGET (UNARY_POSITIVE ): {
@@ -2704,7 +2701,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
2704
2701
UNWIND_EXCEPT_HANDLER (b );
2705
2702
Py_DECREF (POP ());
2706
2703
JUMPBY (oparg );
2707
- FAST_DISPATCH ();
2704
+ DISPATCH ();
2708
2705
}
2709
2706
else {
2710
2707
PyObject * val = POP ();
@@ -2718,7 +2715,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
2718
2715
PyObject * value = PyExc_AssertionError ;
2719
2716
Py_INCREF (value );
2720
2717
PUSH (value );
2721
- FAST_DISPATCH ();
2718
+ DISPATCH ();
2722
2719
}
2723
2720
2724
2721
case TARGET (LOAD_BUILD_CLASS ): {
@@ -3620,7 +3617,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
3620
3617
Py_DECREF (right );
3621
3618
PREDICT (POP_JUMP_IF_FALSE );
3622
3619
PREDICT (POP_JUMP_IF_TRUE );
3623
- FAST_DISPATCH ();
3620
+ DISPATCH ();
3624
3621
}
3625
3622
3626
3623
case TARGET (CONTAINS_OP ): {
@@ -3637,7 +3634,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
3637
3634
PUSH (b );
3638
3635
PREDICT (POP_JUMP_IF_FALSE );
3639
3636
PREDICT (POP_JUMP_IF_TRUE );
3640
- FAST_DISPATCH ();
3637
+ DISPATCH ();
3641
3638
}
3642
3639
3643
3640
#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
@@ -3734,7 +3731,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
3734
3731
3735
3732
case TARGET (JUMP_FORWARD ): {
3736
3733
JUMPBY (oparg );
3737
- FAST_DISPATCH ();
3734
+ DISPATCH ();
3738
3735
}
3739
3736
3740
3737
case TARGET (POP_JUMP_IF_FALSE ): {
@@ -3743,12 +3740,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
3743
3740
int err ;
3744
3741
if (cond == Py_True ) {
3745
3742
Py_DECREF (cond );
3746
- FAST_DISPATCH ();
3743
+ DISPATCH ();
3747
3744
}
3748
3745
if (cond == Py_False ) {
3749
3746
Py_DECREF (cond );
3750
3747
JUMPTO (oparg );
3751
- FAST_DISPATCH ();
3748
+ DISPATCH ();
3752
3749
}
3753
3750
err = PyObject_IsTrue (cond );
3754
3751
Py_DECREF (cond );
@@ -3767,12 +3764,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
3767
3764
int err ;
3768
3765
if (cond == Py_False ) {
3769
3766
Py_DECREF (cond );
3770
- FAST_DISPATCH ();
3767
+ DISPATCH ();
3771
3768
}
3772
3769
if (cond == Py_True ) {
3773
3770
Py_DECREF (cond );
3774
3771
JUMPTO (oparg );
3775
- FAST_DISPATCH ();
3772
+ DISPATCH ();
3776
3773
}
3777
3774
err = PyObject_IsTrue (cond );
3778
3775
Py_DECREF (cond );
@@ -3792,11 +3789,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
3792
3789
if (cond == Py_True ) {
3793
3790
STACK_SHRINK (1 );
3794
3791
Py_DECREF (cond );
3795
- FAST_DISPATCH ();
3792
+ DISPATCH ();
3796
3793
}
3797
3794
if (cond == Py_False ) {
3798
3795
JUMPTO (oparg );
3799
- FAST_DISPATCH ();
3796
+ DISPATCH ();
3800
3797
}
3801
3798
err = PyObject_IsTrue (cond );
3802
3799
if (err > 0 ) {
@@ -3816,11 +3813,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
3816
3813
if (cond == Py_False ) {
3817
3814
STACK_SHRINK (1 );
3818
3815
Py_DECREF (cond );
3819
- FAST_DISPATCH ();
3816
+ DISPATCH ();
3820
3817
}
3821
3818
if (cond == Py_True ) {
3822
3819
JUMPTO (oparg );
3823
- FAST_DISPATCH ();
3820
+ DISPATCH ();
3824
3821
}
3825
3822
err = PyObject_IsTrue (cond );
3826
3823
if (err > 0 ) {
@@ -3838,18 +3835,8 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
3838
3835
case TARGET (JUMP_ABSOLUTE ): {
3839
3836
PREDICTED (JUMP_ABSOLUTE );
3840
3837
JUMPTO (oparg );
3841
- #if FAST_LOOPS
3842
- /* Enabling this path speeds-up all while and for-loops by bypassing
3843
- the per-loop checks for signals. By default, this should be turned-off
3844
- because it prevents detection of a control-break in tight loops like
3845
- "while 1: pass". Compile with this option turned-on when you need
3846
- the speed-up and do not need break checking inside tight loops (ones
3847
- that contain only instructions ending with FAST_DISPATCH).
3848
- */
3849
- FAST_DISPATCH ();
3850
- #else
3838
+ CHECK_EVAL_BREAKER ();
3851
3839
DISPATCH ();
3852
- #endif
3853
3840
}
3854
3841
3855
3842
case TARGET (GET_LEN ): {
@@ -4260,6 +4247,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
4260
4247
PUSH (res );
4261
4248
if (res == NULL )
4262
4249
goto error ;
4250
+ CHECK_EVAL_BREAKER ();
4263
4251
DISPATCH ();
4264
4252
}
4265
4253
@@ -4273,6 +4261,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
4273
4261
if (res == NULL ) {
4274
4262
goto error ;
4275
4263
}
4264
+ CHECK_EVAL_BREAKER ();
4276
4265
DISPATCH ();
4277
4266
}
4278
4267
@@ -4292,6 +4281,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
4292
4281
if (res == NULL ) {
4293
4282
goto error ;
4294
4283
}
4284
+ CHECK_EVAL_BREAKER ();
4295
4285
DISPATCH ();
4296
4286
}
4297
4287
@@ -4338,6 +4328,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
4338
4328
if (result == NULL ) {
4339
4329
goto error ;
4340
4330
}
4331
+ CHECK_EVAL_BREAKER ();
4341
4332
DISPATCH ();
4342
4333
}
4343
4334
0 commit comments