@@ -88,6 +88,16 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
8888 _self->_p ->_pySourcelessFileLoader = importlib.getVariable (" SourcelessFileLoader" );
8989 }
9090
91+ #ifdef PY3K
92+ PythonQtObjectPtr asyncio;
93+ asyncio.setNewRef (PyImport_ImportModule (" asyncio" ));
94+ if (asyncio)
95+ {
96+ _self->_p ->_pyEnsureFuture = asyncio.getVariable (" ensure_future" );
97+ _self->_p ->_pyFutureClass = asyncio.getVariable (" Future" );
98+ }
99+ #endif
100+
91101 PythonQt::priv ()->setupSharedLibrarySuffixes ();
92102
93103 PythonQtMethodInfo::addParameterTypeAlias (" QObjectList" , " QList<QObject*>" );
@@ -402,6 +412,46 @@ void PythonQtPrivate::setTaskDoneCallback(const PythonQtObjectPtr & callable)
402412 _pyTaskDoneCallback = callable;
403413}
404414
415+ PythonQtObjectPtr PythonQtPrivate::checkAndRunCoroutine (const PythonQtObjectPtr& object)
416+ {
417+ PythonQtObjectPtr result;
418+ #ifdef PY3K
419+ if (!PyCoro_CheckExact (object))
420+ {
421+ return result;
422+ }
423+
424+ if (!_pyEnsureFuture)
425+ {
426+ std::cerr << " PythonQt: ensure_future not initialized" << std::endl;
427+ return PythonQtObjectPtr ();
428+ }
429+ PyObject* args = PyTuple_New (1 );
430+ PyObject* coro = object.object ();
431+ Py_INCREF (coro);
432+ PyTuple_SetItem (args, 0 , coro);
433+ PyObject* r = PyObject_CallObject (_pyEnsureFuture, args);
434+ result.setNewRef (r);
435+ if (_pyTaskDoneCallback) {
436+ PyObject* methodName = PyUnicode_FromString (" add_done_callback" );
437+ PyObject_CallMethodObjArgs (r, methodName, _pyTaskDoneCallback.object (), nullptr );
438+ Py_XDECREF (methodName);
439+ }
440+ Py_XDECREF (args);
441+ #endif
442+ return result;
443+ }
444+
445+ PythonQtObjectPtr PythonQtPrivate::createAsyncioFuture ()
446+ {
447+ if (!_pyFutureClass)
448+ {
449+ std::cerr << " PythonQt: _pyFutureClass not initialized" << std::endl;
450+ return nullptr ;
451+ }
452+ return _pyFutureClass.call ();
453+ }
454+
405455void PythonQt::setRedirectStdInCallback (PythonQtInputChangedCB* callback, void * callbackData)
406456{
407457 if (!callback) {
0 commit comments