1
0
mirror of https://github.com/thp/pyotherside.git synced 2025-02-05 08:08:23 +08:00

Don't pass QJSValue by value between different threads

This also avoids having additional signals when the callback isn't
a callable by not creating a QJSValue referencing the callback.
This commit is contained in:
Thomas Perl 2014-02-04 22:13:05 +01:00
parent a621f8c8ec
commit c765bf3d03
4 changed files with 46 additions and 36 deletions

View File

@ -45,15 +45,15 @@ QPython::QPython(QObject *parent)
QObject::connect(priv, SIGNAL(receive(QVariant)), QObject::connect(priv, SIGNAL(receive(QVariant)),
this, SLOT(receive(QVariant))); this, SLOT(receive(QVariant)));
QObject::connect(this, SIGNAL(process(QString,QVariant,QJSValue)), QObject::connect(this, SIGNAL(process(QString,QVariant,QJSValue *)),
worker, SLOT(process(QString,QVariant,QJSValue))); worker, SLOT(process(QString,QVariant,QJSValue *)));
QObject::connect(worker, SIGNAL(finished(QVariant,QJSValue)), QObject::connect(worker, SIGNAL(finished(QVariant,QJSValue *)),
this, SLOT(finished(QVariant,QJSValue))); this, SLOT(finished(QVariant,QJSValue *)));
QObject::connect(this, SIGNAL(import(QString,QJSValue)), QObject::connect(this, SIGNAL(import(QString,QJSValue *)),
worker, SLOT(import(QString,QJSValue))); worker, SLOT(import(QString,QJSValue *)));
QObject::connect(worker, SIGNAL(imported(bool,QJSValue)), QObject::connect(worker, SIGNAL(imported(bool,QJSValue *)),
this, SLOT(imported(bool,QJSValue))); this, SLOT(imported(bool,QJSValue *)));
thread.setObjectName("QPythonWorker"); thread.setObjectName("QPythonWorker");
thread.start(); thread.start();
@ -84,7 +84,11 @@ QPython::addImportPath(QString path)
void void
QPython::importModule(QString name, QJSValue callback) QPython::importModule(QString name, QJSValue callback)
{ {
emit import(name, callback); QJSValue *cb = 0;
if (!callback.isNull() && !callback.isUndefined() && callback.isCallable()) {
cb = new QJSValue(callback);
}
emit import(name, cb);
} }
bool bool
@ -168,7 +172,11 @@ QPython::evaluate(QString expr)
void void
QPython::call(QString func, QVariant args, QJSValue callback) QPython::call(QString func, QVariant args, QJSValue callback)
{ {
emit process(func, args, callback); QJSValue *cb = 0;
if (!callback.isNull() && !callback.isUndefined() && callback.isCallable()) {
cb = new QJSValue(callback);
}
emit process(func, args, cb);
} }
QVariant QVariant
@ -220,23 +228,21 @@ QPython::call_sync(QString func, QVariant args)
} }
void void
QPython::finished(QVariant result, QJSValue callback) QPython::finished(QVariant result, QJSValue *callback)
{ {
if (!callback.isNull() && !callback.isUndefined() && callback.isCallable()) { QJSValueList args;
QJSValueList args; QJSValue v = callback->engine()->toScriptValue(result);
QJSValue v = callback.engine()->toScriptValue(result); args << v;
args << v; callback->call(args);
callback.call(args); delete callback;
}
} }
void void
QPython::imported(bool result, QJSValue callback) QPython::imported(bool result, QJSValue *callback)
{ {
if (!callback.isNull() && !callback.isUndefined() && callback.isCallable()) { QJSValueList args;
QJSValueList args; QJSValue v = callback->engine()->toScriptValue(QVariant(result));
QJSValue v = callback.engine()->toScriptValue(QVariant(result)); args << v;
args << v; callback->call(args);
callback.call(args); delete callback;
}
} }

View File

@ -260,14 +260,14 @@ class QPython : public QObject {
void error(QString traceback); void error(QString traceback);
/* For internal use only */ /* For internal use only */
void process(QString func, QVariant args, QJSValue callback); void process(QString func, QVariant args, QJSValue *callback);
void import(QString name, QJSValue callback); void import(QString name, QJSValue *callback);
private slots: private slots:
void receive(QVariant data); void receive(QVariant data);
void finished(QVariant result, QJSValue callback); void finished(QVariant result, QJSValue *callback);
void imported(bool result, QJSValue callback); void imported(bool result, QJSValue *callback);
private: private:
static QPythonPriv *priv; static QPythonPriv *priv;

View File

@ -32,15 +32,19 @@ QPythonWorker::~QPythonWorker()
} }
void void
QPythonWorker::process(QString func, QVariant args, QJSValue callback) QPythonWorker::process(QString func, QVariant args, QJSValue *callback)
{ {
QVariant result = qpython->call_sync(func, args); QVariant result = qpython->call_sync(func, args);
emit finished(result, callback); if (callback) {
emit finished(result, callback);
}
} }
void void
QPythonWorker::import(QString name, QJSValue callback) QPythonWorker::import(QString name, QJSValue *callback)
{ {
bool result = qpython->importModule_sync(name); bool result = qpython->importModule_sync(name);
emit imported(result, callback); if (callback) {
emit imported(result, callback);
}
} }

View File

@ -34,12 +34,12 @@ class QPythonWorker : public QObject {
~QPythonWorker(); ~QPythonWorker();
public slots: public slots:
void process(QString func, QVariant args, QJSValue callback); void process(QString func, QVariant args, QJSValue *callback);
void import(QString func, QJSValue callback); void import(QString func, QJSValue *callback);
signals: signals:
void finished(QVariant result, QJSValue callback); void finished(QVariant result, QJSValue *callback);
void imported(bool result, QJSValue callback); void imported(bool result, QJSValue *callback);
private: private:
QPython *qpython; QPython *qpython;