Browse Source

event: don't exit task if future __await__ yields None

This matches the behavior of asyncio's Task implementation, where this is the equivalent of `yield Task.cont`.

I've kept regular generator tasks unaffected for now, since this might break existing usage.
rdb 4 years ago
parent
commit
f6b39345f7
1 changed files with 5 additions and 0 deletions
  1. 5 0
      panda/src/event/pythonTask.cxx

+ 5 - 0
panda/src/event/pythonTask.cxx

@@ -585,6 +585,11 @@ do_python_task() {
         return DS_done;
         return DS_done;
       }
       }
 
 
+    } else if (result == Py_None && PyCoro_CheckExact(_generator)) {
+      // Bare yield from a coroutine means to try again next frame.
+      Py_DECREF(result);
+      return DS_cont;
+
     } else if (DtoolInstance_Check(result)) {
     } else if (DtoolInstance_Check(result)) {
       // We are waiting for an AsyncFuture (eg. other task) to finish.
       // We are waiting for an AsyncFuture (eg. other task) to finish.
       AsyncFuture *fut = (AsyncFuture *)DtoolInstance_UPCAST(result, Dtool_AsyncFuture);
       AsyncFuture *fut = (AsyncFuture *)DtoolInstance_UPCAST(result, Dtool_AsyncFuture);