aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-11-02 16:30:26 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-11-05 18:54:51 +0100
commit025365f1dc6dc9c3244a125882433e55b57fa672 (patch)
tree6cab46d0595e7c9a8b61c8f2eb620dba009f30f8 /src/qml/qml
parentc9a90b3181723061e27e7545b70a66dda4f4306d (diff)
Refactor marking GC'ed objects
Don't use recursive function calls anymore. Instead, push marked objects onto the JS stack, and then pop them off when their children are being marked. Should reduce stack memory usage, and improves performance by ~5%. Change-Id: I2d37d97579144fcba87ec8e9fd545dd220c01fbb Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/qml')
-rw-r--r--src/qml/qml/qqmlcomponent.cpp12
-rw-r--r--src/qml/qml/qqmlvmemetaobject.cpp8
-rw-r--r--src/qml/qml/qqmlvmemetaobject_p.h2
-rw-r--r--src/qml/qml/qqmlxmlhttprequest.cpp4
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions.cpp6
5 files changed, 16 insertions, 16 deletions
diff --git a/src/qml/qml/qqmlcomponent.cpp b/src/qml/qml/qqmlcomponent.cpp
index cb05a2bef8..ea88acd85f 100644
--- a/src/qml/qml/qqmlcomponent.cpp
+++ b/src/qml/qml/qqmlcomponent.cpp
@@ -1120,7 +1120,7 @@ public:
static QV4::ReturnedValue method_forceCompletion(QV4::SimpleCallContext *ctx);
static void destroy(Managed *that);
- static void markObjects(Managed *that);
+ static void markObjects(Managed *that, QV4::ExecutionEngine *e);
QScopedPointer<QQmlComponentIncubator> incubator;
QV8Engine *v8;
@@ -1538,14 +1538,14 @@ void QmlIncubatorObject::destroy(Managed *that)
o->~QmlIncubatorObject();
}
-void QmlIncubatorObject::markObjects(QV4::Managed *that)
+void QmlIncubatorObject::markObjects(QV4::Managed *that, QV4::ExecutionEngine *e)
{
QmlIncubatorObject *o = that->as<QmlIncubatorObject>();
Q_ASSERT(o);
- o->valuemap.mark();
- o->qmlGlobal.mark();
- o->m_statusChanged.mark();
- Object::markObjects(that);
+ o->valuemap.mark(e);
+ o->qmlGlobal.mark(e);
+ o->m_statusChanged.mark(e);
+ Object::markObjects(that, e);
}
void QmlIncubatorObject::statusChanged(QQmlIncubator::Status s)
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp
index 1547b2a89d..4b34792421 100644
--- a/src/qml/qml/qqmlvmemetaobject.cpp
+++ b/src/qml/qml/qqmlvmemetaobject.cpp
@@ -1232,9 +1232,9 @@ void QQmlVMEMetaObject::ensureQObjectWrapper()
QV4::QObjectWrapper::wrap(v4, object);
}
-void QQmlVMEMetaObject::mark()
+void QQmlVMEMetaObject::mark(QV4::ExecutionEngine *e)
{
- varProperties.markOnce();
+ varProperties.markOnce(e);
// add references created by VMEVariant properties
int maxDataIdx = metaData->propertyCount - metaData->varPropertyCount;
@@ -1245,13 +1245,13 @@ void QQmlVMEMetaObject::mark()
if (ref) {
QQmlData *ddata = QQmlData::get(ref);
if (ddata)
- ddata->jsWrapper.markOnce();
+ ddata->jsWrapper.markOnce(e);
}
}
}
if (QQmlVMEMetaObject *parent = parentVMEMetaObject())
- parent->mark();
+ parent->mark(e);
}
void QQmlVMEMetaObject::allocateVarPropertiesArray()
diff --git a/src/qml/qml/qqmlvmemetaobject_p.h b/src/qml/qml/qqmlvmemetaobject_p.h
index 25a577d2e6..a9a0308ded 100644
--- a/src/qml/qml/qqmlvmemetaobject_p.h
+++ b/src/qml/qml/qqmlvmemetaobject_p.h
@@ -209,7 +209,7 @@ public:
void ensureQObjectWrapper();
- void mark();
+ void mark(QV4::ExecutionEngine *e);
void connectAlias(int aliasId);
QBitArray aConnected;
diff --git a/src/qml/qml/qqmlxmlhttprequest.cpp b/src/qml/qml/qqmlxmlhttprequest.cpp
index ab4c94704c..43adce3e8c 100644
--- a/src/qml/qml/qqmlxmlhttprequest.cpp
+++ b/src/qml/qml/qqmlxmlhttprequest.cpp
@@ -1646,10 +1646,10 @@ struct QQmlXMLHttpRequestCtor : public FunctionObject
static void destroy(Managed *that) {
that->as<QQmlXMLHttpRequestCtor>()->~QQmlXMLHttpRequestCtor();
}
- static void markObjects(Managed *that) {
+ static void markObjects(Managed *that, ExecutionEngine *e) {
QQmlXMLHttpRequestCtor *c = that->as<QQmlXMLHttpRequestCtor>();
if (c->proto)
- c->proto->mark();
+ c->proto->mark(e);
}
static ReturnedValue construct(Managed *that, QV4::CallData *)
{
diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
index c02096614b..adbd4da0eb 100644
--- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
+++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
@@ -1193,11 +1193,11 @@ struct BindingFunction : public QV4::FunctionObject
return This->originalFunction->call(callData);
}
- static void markObjects(Managed *that)
+ static void markObjects(Managed *that, ExecutionEngine *e)
{
BindingFunction *This = static_cast<BindingFunction*>(that);
- This->originalFunction->mark();
- QV4::FunctionObject::markObjects(that);
+ This->originalFunction->mark(e);
+ QV4::FunctionObject::markObjects(that, e);
}
QV4::FunctionObject *originalFunction;