@@ -88,6 +88,16 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
88
88
_self->_p ->_pySourcelessFileLoader = importlib.getVariable (" SourcelessFileLoader" );
89
89
}
90
90
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
+
91
101
PythonQt::priv ()->setupSharedLibrarySuffixes ();
92
102
93
103
PythonQtMethodInfo::addParameterTypeAlias (" QObjectList" , " QList<QObject*>" );
@@ -402,6 +412,46 @@ void PythonQtPrivate::setTaskDoneCallback(const PythonQtObjectPtr & callable)
402
412
_pyTaskDoneCallback = callable;
403
413
}
404
414
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
+
405
455
void PythonQt::setRedirectStdInCallback (PythonQtInputChangedCB* callback, void * callbackData)
406
456
{
407
457
if (!callback) {
0 commit comments