@@ -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*>" );
@@ -406,6 +416,46 @@ void PythonQtPrivate::setTaskDoneCallback(const PythonQtObjectPtr & callable)
406
416
_pyTaskDoneCallback = callable;
407
417
}
408
418
419
+ PythonQtObjectPtr PythonQtPrivate::checkAndRunCoroutine (const PythonQtObjectPtr& object)
420
+ {
421
+ PythonQtObjectPtr result;
422
+ #ifdef PY3K
423
+ if (!PyCoro_CheckExact (object))
424
+ {
425
+ return result;
426
+ }
427
+
428
+ if (!_pyEnsureFuture)
429
+ {
430
+ std::cerr << " PythonQt: ensure_future not initialized" << std::endl;
431
+ return PythonQtObjectPtr ();
432
+ }
433
+ PyObject* args = PyTuple_New (1 );
434
+ PyObject* coro = object.object ();
435
+ Py_INCREF (coro);
436
+ PyTuple_SetItem (args, 0 , coro);
437
+ PyObject* r = PyObject_CallObject (_pyEnsureFuture, args);
438
+ result.setNewRef (r);
439
+ if (_pyTaskDoneCallback) {
440
+ PyObject* methodName = PyUnicode_FromString (" add_done_callback" );
441
+ PyObject_CallMethodObjArgs (r, methodName, _pyTaskDoneCallback.object (), nullptr );
442
+ Py_XDECREF (methodName);
443
+ }
444
+ Py_XDECREF (args);
445
+ #endif
446
+ return result;
447
+ }
448
+
449
+ PythonQtObjectPtr PythonQtPrivate::createAsyncioFuture ()
450
+ {
451
+ if (!_pyFutureClass)
452
+ {
453
+ std::cerr << " PythonQt: _pyFutureClass not initialized" << std::endl;
454
+ return nullptr ;
455
+ }
456
+ return _pyFutureClass.call ();
457
+ }
458
+
409
459
void PythonQt::setRedirectStdInCallback (PythonQtInputChangedCB* callback, void * callbackData)
410
460
{
411
461
if (!callback) {
0 commit comments