aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsapi/qjsvalueiterator.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2015-01-12 21:55:51 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2015-01-16 21:12:49 +0100
commit8ffb79bbd214c239e414dc4e9cf4569b3219bdab (patch)
treec9cc7e596be2616f8c1211f4fb7623c9153cd7d6 /src/qml/jsapi/qjsvalueiterator.cpp
parent9fe1588915b935298917a0c29593eeed70da682f (diff)
Refactor persistent values
Use a page wise allocation mechanism for persistent values. This significantly reduces memory consumption of persistent values and also improves their performance a lot. Change-Id: I8499d2ca5bdd871e029f643ae605a94544558bb5 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsapi/qjsvalueiterator.cpp')
-rw-r--r--src/qml/jsapi/qjsvalueiterator.cpp19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/qml/jsapi/qjsvalueiterator.cpp b/src/qml/jsapi/qjsvalueiterator.cpp
index c74a5d2d76..e23bd5d763 100644
--- a/src/qml/jsapi/qjsvalueiterator.cpp
+++ b/src/qml/jsapi/qjsvalueiterator.cpp
@@ -46,12 +46,12 @@ QJSValueIteratorPrivate::QJSValueIteratorPrivate(const QJSValue &v)
, nextIndex(UINT_MAX)
{
QJSValuePrivate *jsp = QJSValuePrivate::get(value);
- QV4::ExecutionEngine *e = jsp->engine;
+ QV4::ExecutionEngine *e = jsp->persistent.engine();
if (!e)
return;
QV4::Scope scope(e);
- QV4::ScopedObject o(scope, jsp->value);
+ QV4::ScopedObject o(scope, jsp->persistent.value());
iterator.set(e, e->newForEachIteratorObject(o));
currentName = (QV4::String *)0;
@@ -123,7 +123,8 @@ QJSValueIterator::~QJSValueIterator()
*/
bool QJSValueIterator::hasNext() const
{
- if (!QJSValuePrivate::get(d_ptr->value)->value.isObject())
+ QV4::Value *val = QJSValuePrivate::get(d_ptr->value)->persistent.valueRef();
+ if (!val || !val->isObject())
return false;
return !!d_ptr->nextName || d_ptr->nextIndex != UINT_MAX;
}
@@ -138,7 +139,8 @@ bool QJSValueIterator::hasNext() const
*/
bool QJSValueIterator::next()
{
- if (!QJSValuePrivate::get(d_ptr->value)->value.isObject())
+ QV4::Value *val = QJSValuePrivate::get(d_ptr->value)->persistent.valueRef();
+ if (!val || !val->isObject())
return false;
d_ptr->currentName = d_ptr->nextName;
d_ptr->currentIndex = d_ptr->nextIndex;
@@ -164,7 +166,8 @@ bool QJSValueIterator::next()
*/
QString QJSValueIterator::name() const
{
- if (!QJSValuePrivate::get(d_ptr->value)->value.isObject())
+ QV4::Value *val = QJSValuePrivate::get(d_ptr->value)->persistent.valueRef();
+ if (!val || !val->isObject())
return QString();
if (!!d_ptr->currentName)
return d_ptr->currentName->toQString();
@@ -186,7 +189,7 @@ QJSValue QJSValueIterator::value() const
if (!engine)
return QJSValue();
QV4::Scope scope(engine);
- QV4::ScopedObject obj(scope, QJSValuePrivate::get(d_ptr->value)->value);
+ QV4::ScopedObject obj(scope, QJSValuePrivate::get(d_ptr->value)->persistent.value());
if (!obj)
return QJSValue();
@@ -216,13 +219,13 @@ QJSValueIterator& QJSValueIterator::operator=(QJSValue& object)
d_ptr->nextName = (QV4::String *)0;
QV4::ExecutionEngine *v4 = d_ptr->iterator.engine();
if (!v4) {
- d_ptr->iterator.set(v4, QV4::Encode::undefined());
+ d_ptr->iterator.clear();
return *this;
}
QJSValuePrivate *jsp = QJSValuePrivate::get(object);
QV4::Scope scope(v4);
- QV4::ScopedObject o(scope, jsp->value);
+ QV4::ScopedObject o(scope, jsp->persistent.value());
d_ptr->iterator.set(v4, v4->newForEachIteratorObject(o));
QV4::Scoped<QV4::ForEachIteratorObject> it(scope, d_ptr->iterator.value());
it->d()->it.flags = QV4::ObjectIterator::NoFlags;