diff options
author | Lars Knoll <[email protected]> | 2014-10-21 14:54:45 +0200 |
---|---|---|
committer | Simon Hausmann <[email protected]> | 2014-10-27 15:19:08 +0100 |
commit | 51d8f62dacc9b37a50e522162d5438a624ee9168 (patch) | |
tree | 623336ed8c4b2b0ce052be6d3ec6af3ab8f04736 /src/qml/jsruntime/qv4arrayobject.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 <[email protected]>
Diffstat (limited to 'src/qml/jsruntime/qv4arrayobject.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4arrayobject.cpp | 25 |
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); |