diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-09-24 13:53:54 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-26 09:05:22 +0200 |
commit | 0f204625dc6720d40df22ca352af995af5448525 (patch) | |
tree | edb78721935e2b0d34927b3dc358c3b171dc43b1 /src/qml/types | |
parent | a57085f00b146798a0cca0d52dfa127232c3e659 (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.cpp | 54 | ||||
-rw-r--r-- | src/qml/types/qqmllistmodel.cpp | 39 | ||||
-rw-r--r-- | src/qml/types/qquickworkerscript.cpp | 3 |
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]; |