@@ -117,7 +117,6 @@ PyObject * slp_tp_init_callback(PyFrameObject *f, int exc, PyObject *retval);
117117
118118typedef struct {
119119 PyObject_HEAD
120- PyObject * tempval ;
121120} PyUnwindObject ;
122121
123122PyAPI_DATA (PyUnwindObject * ) Py_UnwindToken ;
@@ -139,45 +138,36 @@ PyAPI_DATA(PyTypeObject) PyClassMethodDescr_Type;
139138PyTaskletObject * slp_get_watchdog (PyThreadState * ts , int interrupt );
140139
141140
142- /* fast (release) and safe (debug) access to the unwind token and retval */
141+ /* access to the unwind token and retval */
143142
144- #ifdef Py_DEBUG
145-
146- #define STACKLESS_PACK (retval ) \
147- (assert(Py_UnwindToken->tempval == NULL), \
148- Py_UnwindToken->tempval = (retval), \
143+ #define STACKLESS_PACK (tstate , retval ) \
144+ (assert((tstate)->st.unwinding_retval == NULL), \
145+ (tstate)->st.unwinding_retval = (retval), \
149146 (PyObject *) Py_UnwindToken)
150147
151- #define STACKLESS_UNPACK (retval ) \
148+ #define STACKLESS_UNPACK (tstate , retval ) \
152149 ((void)(assert(STACKLESS_UNWINDING(retval)), \
153- retval = Py_UnwindToken->tempval, \
154- Py_UnwindToken->tempval = NULL, retval))
155-
156- #else
157-
158- #define STACKLESS_PACK (retval ) \
159- (Py_UnwindToken->tempval = (retval), \
160- (PyObject *) Py_UnwindToken)
161-
162- #define STACKLESS_UNPACK (retval ) \
163- ((void)(retval = Py_UnwindToken->tempval, retval))
164-
165- #endif
150+ retval = (tstate)->st.unwinding_retval, \
151+ (tstate)->st.unwinding_retval = NULL, retval))
166152
167153#define STACKLESS_UNWINDING (obj ) \
168154 ((PyObject *) (obj) == (PyObject *) Py_UnwindToken)
169155
170156/* an arbitrary positive number */
171157#define STACKLESS_UNWINDING_MAGIC 0x7fedcba9
172158
173- #define STACKLESS_RETVAL (obj ) \
174- (STACKLESS_UNWINDING(obj) ? Py_UnwindToken->tempval : (obj))
159+ #define STACKLESS_RETVAL (tstate , obj ) \
160+ (STACKLESS_UNWINDING(obj) ? (tstate)->st.unwinding_retval : (obj))
175161
176- #define STACKLESS_ASSERT_UNWINDING_VALUE_IS_NOT (obj , val ) \
177- assert(!STACKLESS_UNWINDING(obj) || ((Py_UnwindToken->tempval ) != (val)))
162+ #define STACKLESS_ASSERT_UNWINDING_VALUE_IS_NOT (tstate , obj , val ) \
163+ assert(!STACKLESS_UNWINDING(obj) || (((tstate)->st.unwinding_retval ) != (val)))
178164
179165/* macros for setting/resetting the stackless flag */
180166
167+ #define STACKLESS_POSSIBLE () \
168+ (slp_enable_softswitch && \
169+ PyThreadState_GET()->st.unwinding_retval == NULL)
170+
181171#define STACKLESS_GETARG () int stackless = (stackless = slp_try_stackless, \
182172 slp_try_stackless = 0, stackless)
183173
@@ -199,16 +189,16 @@ PyTaskletObject * slp_get_watchdog(PyThreadState *ts, int interrupt);
199189
200190#define STACKLESS_PROMOTE_ALL () ((void)(slp_try_stackless = stackless, NULL))
201191
202- #define STACKLESS_PROPOSE (func ) {int stackless = slp_enable_softswitch ; \
192+ #define STACKLESS_PROPOSE (func ) {int stackless = STACKLESS_POSSIBLE() ; \
203193 STACKLESS_PROMOTE(func);}
204194
205- #define STACKLESS_PROPOSE_FLAG (flag ) {int stackless = slp_enable_softswitch ; \
195+ #define STACKLESS_PROPOSE_FLAG (flag ) {int stackless = STACKLESS_POSSIBLE() ; \
206196 STACKLESS_PROMOTE_FLAG(flag);}
207197
208- #define STACKLESS_PROPOSE_METHOD (obj , meth ) {int stackless = slp_enable_softswitch ; \
198+ #define STACKLESS_PROPOSE_METHOD (obj , meth ) {int stackless = STACKLESS_POSSIBLE() ; \
209199 STACKLESS_PROMOTE_METHOD(obj, meth);}
210200
211- #define STACKLESS_PROPOSE_ALL () slp_try_stackless = slp_enable_softswitch;
201+ #define STACKLESS_PROPOSE_ALL () slp_try_stackless = STACKLESS_POSSIBLE()
212202
213203#define STACKLESS_RETRACT () slp_try_stackless = 0;
214204
@@ -541,8 +531,8 @@ PyObject * slp_get_channel_callback(void);
541531#define STACKLESS_RETRACT () assert(1)
542532#define STACKLESS_ASSERT () assert(1)
543533
544- #define STACKLESS_RETVAL (obj ) (obj)
545- #define STACKLESS_ASSERT_UNWINDING_VALUE_IS_NOT (obj , val ) assert(1)
534+ #define STACKLESS_RETVAL (tstate , obj ) (obj)
535+ #define STACKLESS_ASSERT_UNWINDING_VALUE_IS_NOT (tstate , obj , val ) assert(1)
546536
547537#define STACKLESS_DECLARE_METHOD (type , meth )
548538
0 commit comments