From 8ddd93f1a7aba531f5a6027f72a4ba7a89492916 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 6 Dec 2017 14:30:50 +0100 Subject: Move the freeList from Heap::ArrayData to SparseArray It's only used for sparse arrays, so the data should live there. Change-Id: I9ca04c73dd2dbebf459ee64c164a69681623a351 Reviewed-by: Simon Hausmann --- src/qml/jsruntime/qv4arraydata.cpp | 31 +++++++++++++++---------------- src/qml/jsruntime/qv4arraydata_p.h | 3 --- src/qml/jsruntime/qv4object.cpp | 1 - src/qml/jsruntime/qv4sparsearray.cpp | 1 + src/qml/jsruntime/qv4sparsearray_p.h | 2 ++ 5 files changed, 18 insertions(+), 20 deletions(-) (limited to 'src/qml') diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp index 390840fb1e..9b7251f3d0 100644 --- a/src/qml/jsruntime/qv4arraydata.cpp +++ b/src/qml/jsruntime/qv4arraydata.cpp @@ -204,11 +204,10 @@ void ArrayData::realloc(Object *o, Type newType, uint requested, bool enforceAtt Heap::SparseArrayData *old = static_cast(d->d()); sparse->sparse = old->sparse; old->sparse = 0; - sparse->freeList = old->freeList; - lastFree = &sparse->freeList; + lastFree = &sparse->sparse->freeList; } else { sparse->sparse = new SparseArray; - lastFree = &sparse->freeList; + lastFree = &sparse->sparse->freeList; storeValue(lastFree, 0); for (uint i = 0; i < toCopy; ++i) { if (!sparse->values[i].isEmpty()) { @@ -231,7 +230,7 @@ void ArrayData::realloc(Object *o, Type newType, uint requested, bool enforceAtt storeValue(lastFree, UINT_MAX); } - Q_ASSERT(Value::fromReturnedValue(sparse->freeList).isEmpty()); + Q_ASSERT(Value::fromReturnedValue(sparse->sparse->freeList).isEmpty()); // ### Could explicitly free the old data } @@ -373,12 +372,12 @@ void SparseArrayData::free(Heap::ArrayData *d, uint idx) Value *v = d->values.values + idx; if (d->attrs && d->attrs[idx].isAccessor()) { // double slot, free both. Order is important, so we have a double slot for allocation again afterwards. - v[1].setEmpty(Value::fromReturnedValue(d->freeList).emptyValue()); + v[1].setEmpty(Value::fromReturnedValue(d->sparse->freeList).emptyValue()); v[0].setEmpty(idx + 1); } else { - v->setEmpty(Value::fromReturnedValue(d->freeList).emptyValue()); + v->setEmpty(Value::fromReturnedValue(d->sparse->freeList).emptyValue()); } - d->freeList = Primitive::emptyValue(idx).asReturnedValue(); + d->sparse->freeList = Primitive::emptyValue(idx).asReturnedValue(); if (d->attrs) d->attrs[idx].clear(); } @@ -395,12 +394,12 @@ uint SparseArrayData::allocate(Object *o, bool doubleSlot) Q_ASSERT(o->d()->arrayData->type == Heap::ArrayData::Sparse); Heap::SimpleArrayData *dd = o->d()->arrayData.cast(); if (doubleSlot) { - ReturnedValue *last = &dd->freeList; + ReturnedValue *last = &dd->sparse->freeList; while (1) { if (Value::fromReturnedValue(*last).value() == UINT_MAX) { reallocate(o, dd->values.alloc + 2, true); dd = o->d()->arrayData.cast(); - last = &dd->freeList; + last = &dd->sparse->freeList; Q_ASSERT(Value::fromReturnedValue(*last).value() != UINT_MAX); } @@ -417,14 +416,14 @@ uint SparseArrayData::allocate(Object *o, bool doubleSlot) last = &dd->values.values[Value::fromReturnedValue(*last).value()].rawValueRef(); } } else { - if (Value::fromReturnedValue(dd->freeList).value() == UINT_MAX) { + if (Value::fromReturnedValue(dd->sparse->freeList).value() == UINT_MAX) { reallocate(o, dd->values.alloc + 1, false); dd = o->d()->arrayData.cast(); } - uint idx = Value::fromReturnedValue(dd->freeList).value(); + uint idx = Value::fromReturnedValue(dd->sparse->freeList).value(); Q_ASSERT(idx != UINT_MAX); - dd->freeList = dd->values[idx].asReturnedValue(); - Q_ASSERT(Value::fromReturnedValue(dd->freeList).isEmpty()); + dd->sparse->freeList = dd->values[idx].asReturnedValue(); + Q_ASSERT(Value::fromReturnedValue(dd->sparse->freeList).isEmpty()); if (dd->attrs) dd->attrs[idx] = Attr_Data; return idx; @@ -479,14 +478,14 @@ bool SparseArrayData::del(Object *o, uint index) if (isAccessor) { // free up both indices - dd->values.values[pidx + 1].setEmpty(Value::fromReturnedValue(dd->freeList).emptyValue()); + dd->values.values[pidx + 1].setEmpty(Value::fromReturnedValue(dd->sparse->freeList).emptyValue()); dd->values.values[pidx].setEmpty(pidx + 1); } else { Q_ASSERT(dd->type == Heap::ArrayData::Sparse); - dd->values.values[pidx].setEmpty(Value::fromReturnedValue(dd->freeList).emptyValue()); + dd->values.values[pidx].setEmpty(Value::fromReturnedValue(dd->sparse->freeList).emptyValue()); } - dd->freeList = Primitive::emptyValue(pidx).asReturnedValue(); + dd->sparse->freeList = Primitive::emptyValue(pidx).asReturnedValue(); dd->sparse->erase(n); return true; } diff --git a/src/qml/jsruntime/qv4arraydata_p.h b/src/qml/jsruntime/qv4arraydata_p.h index 46986c5e6f..d6549e44ee 100644 --- a/src/qml/jsruntime/qv4arraydata_p.h +++ b/src/qml/jsruntime/qv4arraydata_p.h @@ -95,7 +95,6 @@ namespace Heap { Member(class, NoMark, ushort, needsMark) \ Member(class, NoMark, uint, offset) \ Member(class, NoMark, PropertyAttributes *, attrs) \ - Member(class, NoMark, ReturnedValue, freeList) \ Member(class, NoMark, SparseArray *, sparse) \ Member(class, ValueArray, ValueArray, values) @@ -264,8 +263,6 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData V4_INTERNALCLASS(SparseArrayData) V4_NEEDS_DESTROY - ReturnedValue &freeList() { return d()->freeList; } - ReturnedValue freeList() const { return d()->freeList; } SparseArray *sparse() const { return d()->sparse; } void setSparse(SparseArray *s) { d()->sparse = s; } diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp index b50fc0f847..dc9e468578 100644 --- a/src/qml/jsruntime/qv4object.cpp +++ b/src/qml/jsruntime/qv4object.cpp @@ -1027,7 +1027,6 @@ void Object::copyArrayData(Object *other) Heap::ArrayData *od = other->d()->arrayData; Heap::ArrayData *dd = d()->arrayData; dd->sparse = new SparseArray(*od->sparse); - dd->freeList = od->freeList; } else { Heap::ArrayData *dd = d()->arrayData; dd->values.size = other->d()->arrayData->values.size; diff --git a/src/qml/jsruntime/qv4sparsearray.cpp b/src/qml/jsruntime/qv4sparsearray.cpp index 8f6aa6723c..b7be66bc31 100644 --- a/src/qml/jsruntime/qv4sparsearray.cpp +++ b/src/qml/jsruntime/qv4sparsearray.cpp @@ -410,6 +410,7 @@ SparseArray::SparseArray(const SparseArray &other) header.left->setParent(&header); recalcMostLeftNode(); } + freeList = other.freeList; } SparseArrayNode *SparseArray::insert(uint akey) diff --git a/src/qml/jsruntime/qv4sparsearray_p.h b/src/qml/jsruntime/qv4sparsearray_p.h index 2e4ac883f2..6dca1e1a34 100644 --- a/src/qml/jsruntime/qv4sparsearray_p.h +++ b/src/qml/jsruntime/qv4sparsearray_p.h @@ -150,6 +150,8 @@ struct Q_QML_EXPORT SparseArray } SparseArray(const SparseArray &other); + + ReturnedValue freeList = 0; private: SparseArray &operator=(const SparseArray &other); -- cgit v1.2.3