aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4lookup.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2014-10-21 14:54:45 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2014-10-27 15:19:08 +0100
commit51d8f62dacc9b37a50e522162d5438a624ee9168 (patch)
tree623336ed8c4b2b0ce052be6d3ec6af3ab8f04736 /src/qml/jsruntime/qv4lookup.cpp
parent125befb309f5eccd80cbffd815396d35c49c08f2 (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.cpp15
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;
}
}