diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2011-07-29 16:04:26 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-10-06 10:44:27 +0200 |
commit | ab989615c05bbf15ef7f5b91d3daaf2423a490ea (patch) | |
tree | 93a5814dd4b62acacd772aad6fb23656c345138b /src | |
parent | 6e7ea2fc3823cb13a366845efe32050b9adefffb (diff) |
Fix QJSEngine::newQObject ownership behaviour
Ensure the indestructible flag is set to false for objects wrapped through
QJSEngine::newQObject, to ensure that they get deleted upon gc when they
don't have a parent.
Re-enabled the QJSEngine::garbageCollect and ownership auto-tests that verified
this behaviour.
Change-Id: I181bff0cc44d071d650a2f73494e49cce6ad538e
Reviewed-on: http://codereview.qt-project.org/2398
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Simon Hausmann <simon.hausmann@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/declarative/qml/v8/qjsengine.cpp | 2 | ||||
-rw-r--r-- | src/declarative/qml/v8/qv8engine_p.h | 19 |
2 files changed, 20 insertions, 1 deletions
diff --git a/src/declarative/qml/v8/qjsengine.cpp b/src/declarative/qml/v8/qjsengine.cpp index 3db7fc40e0..e466afc30c 100644 --- a/src/declarative/qml/v8/qjsengine.cpp +++ b/src/declarative/qml/v8/qjsengine.cpp @@ -378,7 +378,7 @@ QJSValue QJSEngine::newQObject(QObject *object) Q_D(QJSEngine); QScriptIsolate api(d, QScriptIsolate::NotNullEngine); v8::HandleScope handleScope; - return d->scriptValueFromInternal(d->newQObject(object)); + return d->scriptValueFromInternal(d->newQObject(object, QV8Engine::JavaScriptOwnership)); } /*! diff --git a/src/declarative/qml/v8/qv8engine_p.h b/src/declarative/qml/v8/qv8engine_p.h index 185eb545ef..e8163fbb80 100644 --- a/src/declarative/qml/v8/qv8engine_p.h +++ b/src/declarative/qml/v8/qv8engine_p.h @@ -228,6 +228,10 @@ public: QV8Engine(QJSEngine* qq,QJSEngine::ContextOwnership ownership = QJSEngine::CreateNewContext); ~QV8Engine(); + // ### TODO get rid of it, do we really need CppOwnership? + // This enum should be in sync with QDeclarativeEngine::ObjectOwnership + enum ObjectOwnership { CppOwnership, JavaScriptOwnership }; + struct Deletable { virtual ~Deletable() {} }; @@ -311,6 +315,7 @@ public: // Return a JS wrapper for the given QObject \a object inline v8::Handle<v8::Value> newQObject(QObject *object); + inline v8::Handle<v8::Value> newQObject(QObject *object, const ObjectOwnership ownership); inline bool isQObject(v8::Handle<v8::Value>); inline QObject *toQObject(v8::Handle<v8::Value>); @@ -511,6 +516,20 @@ v8::Handle<v8::Value> QV8Engine::newQObject(QObject *object) return m_qobjectWrapper.newQObject(object); } +v8::Handle<v8::Value> QV8Engine::newQObject(QObject *object, const ObjectOwnership ownership) +{ + if (!object) + return v8::Null(); + + v8::Handle<v8::Value> result = newQObject(object); + QDeclarativeData *ddata = QDeclarativeData::get(object, true); + if (ownership == JavaScriptOwnership && ddata) { + ddata->indestructible = false; + ddata->explicitIndestructibleSet = true; + } + return result; +} + v8::Local<v8::String> QV8Engine::toString(const QString &string) { return m_stringWrapper.toString(string); |