}
}
-void QV8GCCallback::ThreadData::releaseStrongReferencer()
-{
- // NOTE: must be called with a valid current isolate
- if (!referencer.strongReferencer.IsEmpty()) {
- qPersistentDispose(referencer.strongReferencer);
- }
-}
-
void QV8GCCallback::releaseWorkerThreadGcPrologueCallbackData()
{
// Note that only worker-thread implementations with their
Q_ASSERT_X(v8::Isolate::GetCurrent(), "QV8GCCallback::releaseWorkerThreadGcPrologueCallbackData()", "called after v8::Isolate has exited");
if (threadData.hasLocalData()) {
QV8GCCallback::ThreadData *td = threadData.localData();
- td->releaseStrongReferencer();
+ td->referencer.dispose();
}
}
QV8GCCallback::Referencer::~Referencer()
{
- if (!strongReferencer.IsEmpty()) {
- Q_ASSERT_X(v8::Isolate::GetCurrent(), "QV8GCCallback::Referencer::~Referencer()", "called after v8::Isolate has exited");
- // automatically release the strongReferencer if it hasn't
- // been explicitly released already.
- qPersistentDispose(strongReferencer);
- }
+ dispose();
}
QV8GCCallback::Referencer::Referencer()
{
v8::HandleScope handleScope;
- v8::Handle<v8::Context> context = v8::Context::New();
+ context = v8::Context::New();
+ qPersistentRegister(context);
v8::Context::Scope contextScope(context);
strongReferencer = qPersistentNew(v8::Object::New());
}
}
}
+void QV8GCCallback::Referencer::dispose()
+{
+ if (!strongReferencer.IsEmpty()) {
+ Q_ASSERT_X(v8::Isolate::GetCurrent(), "QV8GCCallback::Referencer::~Referencer()", "called after v8::Isolate has exited");
+ // automatically release the strongReferencer if it hasn't
+ // been explicitly released already.
+ qPersistentDispose(strongReferencer);
+ }
+ if (!context.IsEmpty())
+ qPersistentDispose(context);
+}
+
void QV8GCCallback::Referencer::addRelationship(QObject *object, v8::Persistent<v8::Value> handle)
{
if (handle.IsEmpty())
~Referencer();
void addRelationship(QObject *object, v8::Persistent<v8::Value> handle);
void addRelationship(QObject *object, QObject *other);
+ void dispose();
private:
Referencer();
static v8::Persistent<v8::Object> *findOwnerAndStrength(QObject *qobjectOwner, bool *shouldBeStrong);
v8::Persistent<v8::Object> strongReferencer;
+ v8::Persistent<v8::Context> context;
friend class QV8GCCallback::ThreadData;
};
Referencer referencer;
bool gcPrologueCallbackRegistered;
QIntrusiveList<Node, &Node::node> gcCallbackNodes;
- void releaseStrongReferencer();
};
static void initializeThreadData();