aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/types
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-09-24 13:53:54 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-26 09:05:22 +0200
commit0f204625dc6720d40df22ca352af995af5448525 (patch)
treeedb78721935e2b0d34927b3dc358c3b171dc43b1 /src/qml/types
parenta57085f00b146798a0cca0d52dfa127232c3e659 (diff)
Fix QQmlV4Function API to be GC safe
Change-Id: Id4f79c22fc48ada1c8a9a858e1b7b3d1cf14d120 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/types')
-rw-r--r--src/qml/types/qqmldelegatemodel.cpp54
-rw-r--r--src/qml/types/qqmllistmodel.cpp39
-rw-r--r--src/qml/types/qquickworkerscript.cpp3
3 files changed, 55 insertions, 41 deletions
diff --git a/src/qml/types/qqmldelegatemodel.cpp b/src/qml/types/qqmldelegatemodel.cpp
index 8537e1a68e..8c434ccfdc 100644
--- a/src/qml/types/qqmldelegatemodel.cpp
+++ b/src/qml/types/qqmldelegatemodel.cpp
@@ -2447,7 +2447,8 @@ void QQmlDelegateModelGroup::insert(QQmlV4Function *args)
return;
int i = 0;
- QV4::Value v = (*args)[i];
+ QV4::Scope scope(args->v4engine());
+ QV4::ScopedValue v(scope, (*args)[i]);
if (d->parseIndex(v, &index, &group)) {
if (index < 0 || index > model->m_compositor.count(group)) {
qmlInfo(this) << tr("insert: index out of range");
@@ -2463,12 +2464,14 @@ void QQmlDelegateModelGroup::insert(QQmlV4Function *args)
: model->m_compositor.end();
int groups = 1 << d->group;
- if (++i < args->length())
- groups |= model->m_cacheMetaType->parseGroups((*args)[i]);
+ if (++i < args->length()) {
+ QV4::ScopedValue val(scope, (*args)[i]);
+ groups |= model->m_cacheMetaType->parseGroups(val);
+ }
- if (v.asArrayObject()) {
+ if (v->asArrayObject()) {
return;
- } else if (v.asObject()) {
+ } else if (v->asObject()) {
model->insert(before, v, groups);
model->emitChanges();
}
@@ -2506,16 +2509,19 @@ void QQmlDelegateModelGroup::create(QQmlV4Function *args)
Compositor::Group group = d->group;
int i = 0;
- QV4::Value v = (*args)[i];
+ QV4::Scope scope(args->v4engine());
+ QV4::ScopedValue v(scope, (*args)[i]);
if (d->parseIndex(v, &index, &group))
++i;
if (i < args->length() && index >= 0 && index <= model->m_compositor.count(group)) {
v = (*args)[i];
- if (/*QV4::Object *o = */v.asObject()) {
+ if (v->asObject()) {
int groups = 1 << d->group;
- if (++i < args->length())
- groups |= model->m_cacheMetaType->parseGroups((*args)[i]);
+ if (++i < args->length()) {
+ QV4::ScopedValue val(scope, (*args)[i]);
+ groups |= model->m_cacheMetaType->parseGroups(val);
+ }
Compositor::insert_iterator before = index < model->m_compositor.count(group)
? model->m_compositor.findInsertPosition(group, index)
@@ -2579,7 +2585,8 @@ void QQmlDelegateModelGroup::resolve(QQmlV4Function *args)
Compositor::Group fromGroup = d->group;
Compositor::Group toGroup = d->group;
- QV4::Value v = (*args)[0];
+ QV4::Scope scope(args->v4engine());
+ QV4::ScopedValue v(scope, (*args)[0]);
if (d->parseIndex(v, &from, &fromGroup)) {
if (from < 0 || from >= model->m_compositor.count(fromGroup)) {
qmlInfo(this) << tr("resolve: from index out of range");
@@ -2676,7 +2683,8 @@ void QQmlDelegateModelGroup::remove(QQmlV4Function *args)
return;
int i = 0;
- QV4::Value v = (*args)[i];
+ QV4::Scope scope(args->v4engine());
+ QV4::ScopedValue v(scope, (*args)[0]);
if (!d->parseIndex(v, &index, &group)) {
qmlInfo(this) << tr("remove: invalid index");
return;
@@ -2684,8 +2692,8 @@ void QQmlDelegateModelGroup::remove(QQmlV4Function *args)
if (++i < args->length()) {
v = (*args)[i];
- if (v.isNumber())
- count = v.toInt32();
+ if (v->isNumber())
+ count = v->toInt32();
}
QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(d->model);
@@ -2711,13 +2719,14 @@ bool QQmlDelegateModelGroupPrivate::parseGroupArgs(
return false;
int i = 0;
- QV4::Value v = (*args)[i];
+ QV4::Scope scope(args->v4engine());
+ QV4::ScopedValue v(scope, (*args)[i]);
if (!parseIndex(v, index, group))
return false;
v = (*args)[++i];
- if (v.isNumber()) {
- *count = v.toInt32();
+ if (v->isNumber()) {
+ *count = v->toInt32();
if (++i == args->length())
return false;
@@ -2844,20 +2853,23 @@ void QQmlDelegateModelGroup::move(QQmlV4Function *args)
int to = -1;
int count = 1;
- if (!d->parseIndex((*args)[0], &from, &fromGroup)) {
+ QV4::Scope scope(args->v4engine());
+ QV4::ScopedValue v(scope, (*args)[0]);
+ if (!d->parseIndex(v, &from, &fromGroup)) {
qmlInfo(this) << tr("move: invalid from index");
return;
}
- if (!d->parseIndex((*args)[1], &to, &toGroup)) {
+ v = (*args)[1];
+ if (!d->parseIndex(v, &to, &toGroup)) {
qmlInfo(this) << tr("move: invalid to index");
return;
}
if (args->length() > 2) {
- QV4::Value v = (*args)[2];
- if (v.isNumber())
- count = v.toInt32();
+ v = (*args)[2];
+ if (v->isNumber())
+ count = v->toInt32();
}
QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(d->model);
diff --git a/src/qml/types/qqmllistmodel.cpp b/src/qml/types/qqmllistmodel.cpp
index 7965bc046d..4af19438bf 100644
--- a/src/qml/types/qqmllistmodel.cpp
+++ b/src/qml/types/qqmllistmodel.cpp
@@ -1883,8 +1883,9 @@ void QQmlListModel::remove(QQmlV4Function *args)
int argLength = args->length();
if (argLength == 1 || argLength == 2) {
- int index = (*args)[0].toInt32();
- int removeCount = (argLength == 2 ? (*args)[1].toInt32() : 1);
+ QV4::Scope scope(args->v4engine());
+ int index = QV4::ScopedValue(scope, (*args)[0])->toInt32();
+ int removeCount = (argLength == 2 ? QV4::ScopedValue(scope, (*args)[1])->toInt32() : 1);
if (index < 0 || index+removeCount > count() || removeCount <= 0) {
qmlInfo(this) << tr("remove: indices [%1 - %2] out of range [0 - %3]").arg(index).arg(index+removeCount).arg(count());
@@ -1924,20 +1925,19 @@ void QQmlListModel::remove(QQmlV4Function *args)
void QQmlListModel::insert(QQmlV4Function *args)
{
if (args->length() == 2) {
-
- QV4::Value arg0 = (*args)[0];
- int index = arg0.toInt32();
+ QV4::Scope scope(args->v4engine());
+ QV4::ScopedValue arg0(scope, (*args)[0]);
+ int index = arg0->toInt32();
if (index < 0 || index > count()) {
qmlInfo(this) << tr("insert: index %1 out of range").arg(index);
return;
}
- QV4::Value arg1 = (*args)[1];
-
- if (QV4::ArrayObject *objectArray = arg1.asArrayObject()) {
- QV4::Scope scope(objectArray->engine());
- QV4::Scoped<QV4::Object> argObject(scope);
+ QV4::ScopedObject argObject(scope, (*args)[1]);
+ QV4::ScopedArrayObject objectArray(scope, (*args)[1]);
+ if (objectArray) {
+ QV4::ScopedObject argObject(scope);
int objectArrayLength = objectArray->arrayLength();
for (int i=0 ; i < objectArrayLength ; ++i) {
@@ -1950,11 +1950,11 @@ void QQmlListModel::insert(QQmlV4Function *args)
}
}
emitItemsInserted(index, objectArrayLength);
- } else if (QV4::Object *argObject = arg1.asObject()) {
+ } else if (argObject) {
if (m_dynamicRoles) {
- m_modelObjects.insert(index, DynamicRoleModelNode::create(args->engine()->variantMapFromJS(argObject), this));
+ m_modelObjects.insert(index, DynamicRoleModelNode::create(args->engine()->variantMapFromJS(argObject.getPointer()), this));
} else {
- m_listModel->insert(index, argObject, args->engine());
+ m_listModel->insert(index, argObject.getPointer(), args->engine());
}
emitItemsInserted(index, 1);
@@ -2034,10 +2034,11 @@ void QQmlListModel::move(int from, int to, int n)
void QQmlListModel::append(QQmlV4Function *args)
{
if (args->length() == 1) {
- QV4::Value arg = (*args)[0];
+ QV4::Scope scope(args->v4engine());
+ QV4::ScopedObject argObject(scope, (*args)[0]);
+ QV4::ScopedArrayObject objectArray(scope, (*args)[0]);
- if (QV4::ArrayObject *objectArray = arg.asArrayObject()) {
- QV4::Scope scope(objectArray->engine());
+ if (objectArray) {
QV4::Scoped<QV4::Object> argObject(scope);
int objectArrayLength = objectArray->arrayLength();
@@ -2054,14 +2055,14 @@ void QQmlListModel::append(QQmlV4Function *args)
}
emitItemsInserted(index, objectArrayLength);
- } else if (QV4::Object *argObject = arg.asObject()) {
+ } else if (argObject) {
int index;
if (m_dynamicRoles) {
index = m_modelObjects.count();
- m_modelObjects.append(DynamicRoleModelNode::create(args->engine()->variantMapFromJS(argObject), this));
+ m_modelObjects.append(DynamicRoleModelNode::create(args->engine()->variantMapFromJS(argObject.getPointer()), this));
} else {
- index = m_listModel->append(argObject, args->engine());
+ index = m_listModel->append(argObject.getPointer(), args->engine());
}
emitItemsInserted(index, 1);
diff --git a/src/qml/types/qquickworkerscript.cpp b/src/qml/types/qquickworkerscript.cpp
index b955555a82..a96a8ee71d 100644
--- a/src/qml/types/qquickworkerscript.cpp
+++ b/src/qml/types/qquickworkerscript.cpp
@@ -682,7 +682,8 @@ void QQuickWorkerScript::sendMessage(QQmlV4Function *args)
return;
}
- QV4::Value argument = QV4::Value::undefinedValue();
+ QV4::Scope scope(args->v4engine());
+ QV4::ScopedValue argument(scope, QV4::Value::undefinedValue());
if (args->length() != 0)
argument = (*args)[0];