aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4arrayobject.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/qv4arrayobject.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/qv4arrayobject.cpp')
-rw-r--r--src/qml/jsruntime/qv4arrayobject.cpp25
1 files changed, 11 insertions, 14 deletions
diff --git a/src/qml/jsruntime/qv4arrayobject.cpp b/src/qml/jsruntime/qv4arrayobject.cpp
index 7515a839ce..eaf474287b 100644
--- a/src/qml/jsruntime/qv4arrayobject.cpp
+++ b/src/qml/jsruntime/qv4arrayobject.cpp
@@ -614,20 +614,17 @@ ReturnedValue ArrayPrototype::method_indexOf(CallContext *ctx)
return Encode(-1);
} else {
Q_ASSERT(instance->arrayType() == ArrayData::Simple || instance->arrayType() == ArrayData::Complex);
- if (len > instance->arrayData()->length())
- len = instance->arrayData()->length();
- Value *val = instance->arrayData()->arrayData();
- Value *end = val + len;
- val += fromIndex;
- while (val < end) {
- if (!val->isEmpty()) {
- value = *val;
- if (scope.hasException())
- return Encode::undefined();
- if (RuntimeHelpers::strictEqual(value, searchValue))
- return Encode((uint)(val - instance->arrayData()->arrayData()));
- }
- ++val;
+ SimpleArrayData *sa = static_cast<SimpleArrayData *>(instance->arrayData());
+ if (len > sa->len())
+ len = sa->len();
+ uint idx = fromIndex;
+ while (idx < len) {
+ value = sa->data(idx);
+ if (scope.hasException())
+ return Encode::undefined();
+ if (RuntimeHelpers::strictEqual(value, searchValue))
+ return Encode(idx);
+ ++idx;
}
}
return Encode(-1);