@@ -712,36 +712,54 @@ new_lock(void)
712
712
* the exc_info-pointer in the thread state.
713
713
*/
714
714
715
+ #if 1
716
+ Py_LOCAL_INLINE (void ) SLP_EXCHANGE_EXCINFO (PyThreadState * tstate , PyTaskletObject * task )
717
+ {
718
+ PyThreadState * ts_ = (tstate );
719
+ PyTaskletObject * t_ = (task );
720
+ _PyErr_StackItem * exc_info ;
721
+ assert (ts_ );
722
+ assert (t_ );
723
+ exc_info = ts_ -> exc_info ;
724
+ assert (exc_info );
725
+ assert (t_ -> exc_info );
715
726
#if 0
716
- #define SLP_EXCHANGE_EXCINFO (tstate , task ) \
727
+ PyObject * c ;
728
+ c = PyStackless_GetCurrent ();
729
+ fprintf (stderr , "SLP_EXCHANGE_EXCINFO %3d current %14p,\tset task %p = %p,\ttstate %p = %p\n" , __LINE__ , c , t_ , exc_info , ts_ , t_ -> exc_info );
730
+ Py_XDECREF (c );
731
+ #endif
732
+ ts_ -> exc_info = t_ -> exc_info ;
733
+ t_ -> exc_info = exc_info ;
734
+ }
735
+ #else
736
+ #define SLP_EXCHANGE_EXCINFO (tstate_ , task_ ) \
717
737
do { \
718
- PyThreadState *ts_ = (tstate ); \
719
- PyTaskletObject *t_ = (task ); \
738
+ PyThreadState *ts_ = (tstate_ ); \
739
+ PyTaskletObject *t_ = (task_ ); \
720
740
_PyErr_StackItem *exc_info; \
721
- PyObject * c = PyStackless_GetCurrent(); \
722
741
assert(ts_); \
723
742
assert(t_); \
724
743
exc_info = ts_->exc_info; \
725
744
assert(exc_info); \
726
745
assert(t_->exc_info); \
727
- fprintf(stderr, "SLP_EXCHANGE_EXCINFO %3d current %14p,\tset task %p = %p,\ttstate %p = %p\n", __LINE__, c, t_, exc_info, ts_, t_->exc_info); \
728
- Py_XDECREF(c); \
729
746
ts_->exc_info = t_->exc_info; \
730
747
t_->exc_info = exc_info; \
731
748
} while(0)
749
+ #endif
750
+
751
+ #if 1
752
+ Py_LOCAL_INLINE (void ) SLP_UPDATE_TSTATE_ON_SWITCH (PyThreadState * tstate , PyTaskletObject * prev , PyTaskletObject * next )
753
+ {
754
+ SLP_EXCHANGE_EXCINFO (tstate , prev );
755
+ SLP_EXCHANGE_EXCINFO (tstate , next );
756
+ }
732
757
#else
733
- #define SLP_EXCHANGE_EXCINFO ( tstate , task ) \
758
+ #define SLP_UPDATE_TSTATE_ON_SWITCH ( tstate__ , prev_ , next_ ) \
734
759
do { \
735
- PyThreadState *ts_ = (tstate); \
736
- PyTaskletObject *t_ = (task); \
737
- _PyErr_StackItem *exc_info; \
738
- assert(ts_); \
739
- assert(t_); \
740
- exc_info = ts_->exc_info; \
741
- assert(exc_info); \
742
- assert(t_->exc_info); \
743
- ts_->exc_info = t_->exc_info; \
744
- t_->exc_info = exc_info; \
760
+ PyThreadState *ts__ = (tstate__); \
761
+ SLP_EXCHANGE_EXCINFO(ts__, (prev_)); \
762
+ SLP_EXCHANGE_EXCINFO(ts__, (next_)); \
745
763
} while(0)
746
764
#endif
747
765
@@ -1147,10 +1165,9 @@ slp_schedule_task_prepared(PyThreadState *ts, PyObject **result, PyTaskletObject
1147
1165
retval = slp_bomb_explode (retval );
1148
1166
}
1149
1167
/* no failure possible from here on */
1150
- SLP_EXCHANGE_EXCINFO (ts , prev );
1168
+ SLP_UPDATE_TSTATE_ON_SWITCH (ts , prev , next );
1151
1169
ts -> recursion_depth = next -> recursion_depth ;
1152
1170
ts -> st .current = next ;
1153
- SLP_EXCHANGE_EXCINFO (ts , next );
1154
1171
if (did_switch )
1155
1172
* did_switch = 1 ;
1156
1173
* result = STACKLESS_PACK (ts , retval );
@@ -1175,8 +1192,7 @@ slp_schedule_task_prepared(PyThreadState *ts, PyObject **result, PyTaskletObject
1175
1192
else
1176
1193
transfer = slp_transfer ;
1177
1194
1178
- SLP_EXCHANGE_EXCINFO (ts , prev );
1179
- SLP_EXCHANGE_EXCINFO (ts , next );
1195
+ SLP_UPDATE_TSTATE_ON_SWITCH (ts , prev , next );
1180
1196
1181
1197
transfer_result = transfer (cstprev , next -> cstate , prev );
1182
1198
/* Note: If the transfer was successful from here on "prev" holds the
@@ -1224,8 +1240,7 @@ slp_schedule_task_prepared(PyThreadState *ts, PyObject **result, PyTaskletObject
1224
1240
}
1225
1241
else {
1226
1242
/* Failed transfer. */
1227
- SLP_EXCHANGE_EXCINFO (ts , next );
1228
- SLP_EXCHANGE_EXCINFO (ts , prev );
1243
+ SLP_UPDATE_TSTATE_ON_SWITCH (ts , next , prev );
1229
1244
PyFrameObject * f = SLP_CLAIM_NEXT_FRAME (ts );
1230
1245
Py_XSETREF (next -> f .frame , f ); /* revert the Py_CLEAR(next->f.frame) */
1231
1246
kill_wrap_bad_guy (prev , next );
0 commit comments