@@ -27,6 +27,7 @@ static PyObject *traceback_extract_stack;
2727static PyObject * asyncio_get_event_loop_policy ;
2828static PyObject * asyncio_future_repr_info_func ;
2929static PyObject * asyncio_iscoroutine_func ;
30+ static PyObject * asyncio_isfuture_func ;
3031static PyObject * asyncio_task_get_stack_func ;
3132static PyObject * asyncio_task_print_stack_func ;
3233static PyObject * asyncio_task_repr_info_func ;
@@ -194,6 +195,19 @@ is_coroutine(PyObject *coro)
194195}
195196
196197
198+ static inline int
199+ is_future (PyObject * fut )
200+ {
201+ printf ("is_future is called." );
202+ if (PyObject_HasAttr (
203+ Py_TYPE (fut ), "_asyncio_future_blocking"
204+ ) && PyObject_GetAttr (fut , "_asyncio_future_blocking" ) != Py_None ) {
205+ return 1 ;
206+ }
207+ return 0 ;
208+ }
209+
210+
197211static PyObject *
198212get_future_loop (PyObject * fut )
199213{
@@ -3170,6 +3184,7 @@ module_free(void *m)
31703184 Py_CLEAR (asyncio_future_repr_info_func );
31713185 Py_CLEAR (asyncio_get_event_loop_policy );
31723186 Py_CLEAR (asyncio_iscoroutine_func );
3187+ Py_CLEAR (asyncio_isfuture_func );
31733188 Py_CLEAR (asyncio_task_get_stack_func );
31743189 Py_CLEAR (asyncio_task_print_stack_func );
31753190 Py_CLEAR (asyncio_task_repr_info_func );
@@ -3236,6 +3251,7 @@ module_init(void)
32363251 GET_MOD_ATTR (asyncio_future_repr_info_func , "_future_repr_info" )
32373252 GET_MOD_ATTR (asyncio_InvalidStateError , "InvalidStateError" )
32383253 GET_MOD_ATTR (asyncio_CancelledError , "CancelledError" )
3254+ GET_MOD_ATTR (asyncio_isfuture_func , "isfuture" )
32393255
32403256 WITH_MOD ("asyncio.base_tasks" )
32413257 GET_MOD_ATTR (asyncio_task_repr_info_func , "_task_repr_info" )
0 commit comments