aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2011-07-29 16:04:26 +0200
committerQt by Nokia <qt-info@nokia.com>2011-10-06 10:44:27 +0200
commitab989615c05bbf15ef7f5b91d3daaf2423a490ea (patch)
tree93a5814dd4b62acacd772aad6fb23656c345138b /src
parent6e7ea2fc3823cb13a366845efe32050b9adefffb (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.cpp2
-rw-r--r--src/declarative/qml/v8/qv8engine_p.h19
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);