diff options
author | Lars Knoll <lars.knoll@digia.com> | 2014-10-21 14:54:45 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-10-27 15:19:08 +0100 |
commit | 51d8f62dacc9b37a50e522162d5438a624ee9168 (patch) | |
tree | 623336ed8c4b2b0ce052be6d3ec6af3ab8f04736 /src/qml/jsruntime/qv4lookup.cpp | |
parent | 125befb309f5eccd80cbffd815396d35c49c08f2 (diff) |
Rework our simple array implementation
Implement the simple array as a circular buffer instead
of an array with head room. This fixes a couple of severe
issues with performance and memory management if the array
is being used as a queue.
Task-number: QTBUG-41421
Change-Id: I146ad8a874407c108aa8fe1eae68e9957e154847
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4lookup.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4lookup.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/qml/jsruntime/qv4lookup.cpp b/src/qml/jsruntime/qv4lookup.cpp index 6d4f05d8d4..4f2ec8315e 100644 --- a/src/qml/jsruntime/qv4lookup.cpp +++ b/src/qml/jsruntime/qv4lookup.cpp @@ -164,9 +164,10 @@ ReturnedValue Lookup::indexedGetterObjectInt(Lookup *l, const ValueRef object, c Object *o = object->objectValue(); if (o->arrayData() && o->arrayData()->type() == ArrayData::Simple) { - if (idx < static_cast<SimpleArrayData *>(o->arrayData())->len()) - if (!o->arrayData()->arrayData()[idx].isEmpty()) - return o->arrayData()->arrayData()[idx].asReturnedValue(); + SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData()); + if (idx < s->len()) + if (!s->data(idx).isEmpty()) + return s->data(idx).asReturnedValue(); } return indexedGetterFallback(l, object, index); @@ -197,8 +198,8 @@ void Lookup::indexedSetterFallback(Lookup *l, const ValueRef object, const Value if (idx < UINT_MAX) { if (o->arrayData() && o->arrayData()->type() == ArrayData::Simple) { SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData()); - if (s && idx < s->len() && !s->arrayData()[idx].isEmpty()) { - s->arrayData()[idx] = value; + if (idx < s->len() && !s->data(idx).isEmpty()) { + s->data(idx) = value; return; } } @@ -221,8 +222,8 @@ void Lookup::indexedSetterObjectInt(Lookup *l, const ValueRef object, const Valu Object *o = object->objectValue(); if (o->arrayData() && o->arrayData()->type() == ArrayData::Simple) { SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData()); - if (idx < s->len() && !s->arrayData()[idx].isEmpty()) { - s->arrayData()[idx] = v; + if (idx < s->len() && !s->data(idx).isEmpty()) { + s->data(idx) = v; return; } } |