Skip to content

Commit 4ff8569

Browse files
committed
Fix missing Isolate.
QScriptConnection methods can be called directly from QtMetaSystem (as a result of signal or delete operator) which means that they need to be protected by Isolate. Reviewed-by: Caio Marcelo de Oliveira Filho
1 parent a56eb72 commit 4ff8569

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

src/script/api/qscriptqobject.cpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,10 @@ class QScriptConnection : public QObject
400400
bool connect(v8::Handle<v8::Object> receiver, v8::Handle<v8::Object> callback, Qt::ConnectionType type);
401401
bool disconnect();
402402

403+
QScriptEnginePrivate *engine() const
404+
{
405+
return m_signal->engine;
406+
}
403407
v8::Handle<v8::Object> callback() const
404408
{ return m_callback; }
405409

@@ -415,7 +419,17 @@ class QScriptConnection : public QObject
415419

416420
// Slot.
417421
void onSignal(void **);
418-
void deleteNow() { delete this; }
422+
void deleteNow()
423+
{
424+
// This will be called if underlaying qobject instance is destroyed so there is no guarantee
425+
// that an isolate was setup correctly (delete can be called outside of public QtScript API).
426+
QScriptEnginePrivate *engine = this->engine();
427+
QScriptIsolate api(engine, QScriptIsolate::NotNullEngine);
428+
Q_ASSERT_X(engine == QScriptQObjectData::get(m_signal->object())->engine(),
429+
Q_FUNC_INFO,
430+
"Mismatch of QScriptEngines detected");
431+
delete this;
432+
}
419433

420434
private:
421435
QScriptSignalData *m_signal;
@@ -548,6 +562,8 @@ v8::Handle<v8::Value> QScriptGenericMetaMethodData<T, functionTemplate>::call()
548562
QScriptConnection::QScriptConnection(QScriptSignalData *signal)
549563
: m_signal(signal)
550564
{
565+
Q_ASSERT(m_signal);
566+
Q_ASSERT(m_signal->engine);
551567
}
552568

553569
QScriptConnection::~QScriptConnection()
@@ -611,8 +627,11 @@ void QScriptConnection::onSignal(void **argv)
611627
{
612628
Q_ASSERT(!m_callback.IsEmpty());
613629

614-
QScriptEnginePrivate *engine = QScriptQObjectData::get(m_signal->object())->engine();
615-
QScriptIsolate api(engine);
630+
QScriptEnginePrivate *engine = this->engine();
631+
QScriptIsolate api(engine, QScriptIsolate::NotNullEngine);
632+
Q_ASSERT_X(engine == QScriptQObjectData::get(m_signal->object())->engine(),
633+
Q_FUNC_INFO,
634+
"Mismatch of QScriptEngines detected");
616635
v8::HandleScope handleScope;
617636

618637
const QMetaObject *meta = sender()->metaObject();

0 commit comments

Comments
 (0)