From 51d8f62dacc9b37a50e522162d5438a624ee9168 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 21 Oct 2014 14:54:45 +0200 Subject: 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 --- src/qml/jsruntime/qv4arrayobject.cpp | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) (limited to 'src/qml/jsruntime/qv4arrayobject.cpp') 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(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); -- cgit v1.2.3