diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2014-11-20 17:46:46 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-12-11 08:40:35 +0100 |
commit | 254cf16ed4c6007a59a7cd5d64bb621430b3c01d (patch) | |
tree | 7330fcef5dbd63ba2809d4e8fd3449a673c327f9 /src/qml/jsruntime | |
parent | 7cfc07ae1bf4ccbec109f52195ef824a3ea4dc21 (diff) |
Fix Object::arrayData() accessor to return a heap object
Change-Id: Iffc82c2f415251d73bb7446848399b54b16589c9
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r-- | src/qml/jsruntime/qv4arraydata.cpp | 41 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arraydata_p.h | 20 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arrayobject.cpp | 8 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4functionobject.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object_p.h | 3 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4objectproto.cpp | 20 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 6 |
7 files changed, 52 insertions, 50 deletions
diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp index a4f11b2b5a..59ba6c4b03 100644 --- a/src/qml/jsruntime/qv4arraydata.cpp +++ b/src/qml/jsruntime/qv4arraydata.cpp @@ -197,7 +197,7 @@ void ArrayData::realloc(Object *o, Type newType, uint requested, bool enforceAtt // ### Could explicitly free the old data } -ArrayData *SimpleArrayData::reallocate(Object *o, uint n, bool enforceAttributes) +Heap::ArrayData *SimpleArrayData::reallocate(Object *o, uint n, bool enforceAttributes) { realloc(o, Heap::ArrayData::Simple, n, enforceAttributes); return o->arrayData(); @@ -205,7 +205,7 @@ ArrayData *SimpleArrayData::reallocate(Object *o, uint n, bool enforceAttributes void ArrayData::ensureAttributes(Object *o) { - if (o->arrayData() && o->arrayData()->attrs()) + if (o->arrayData() && o->arrayData()->attrs) return; ArrayData::realloc(o, Heap::ArrayData::Simple, 0, true); @@ -261,7 +261,7 @@ bool SimpleArrayData::del(Object *o, uint index) void SimpleArrayData::setAttribute(Object *o, uint index, PropertyAttributes attrs) { - o->arrayData()->attrs()[index] = attrs; + o->arrayData()->attrs[index] = attrs; } void SimpleArrayData::push_front(Object *o, Value *values, uint n) @@ -311,9 +311,9 @@ uint SimpleArrayData::truncate(Object *o, uint newLen) return dd->len; } -uint SimpleArrayData::length(const ArrayData *d) +uint SimpleArrayData::length(const Heap::ArrayData *d) { - return static_cast<const SimpleArrayData *>(d)->len(); + return d->len; } bool SimpleArrayData::putArray(Object *o, uint index, Value *values, uint n) @@ -331,24 +331,23 @@ bool SimpleArrayData::putArray(Object *o, uint index, Value *values, uint n) return true; } -void SparseArrayData::free(ArrayData *d, uint idx) +void SparseArrayData::free(Heap::ArrayData *d, uint idx) { - Q_ASSERT(d && d->type() == Heap::ArrayData::Sparse); - SparseArrayData *dd = static_cast<SparseArrayData *>(d); - Value *v = dd->arrayData() + idx; - if (dd->attrs() && dd->attrs()[idx].isAccessor()) { + Q_ASSERT(d && d->type == Heap::ArrayData::Sparse); + Value *v = d->arrayData + 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].tag = Value::Empty_Type; - v[1].uint_32 = dd->freeList(); + v[1].uint_32 = d->freeList; v[0].tag = Value::Empty_Type; v[0].uint_32 = idx + 1; } else { v->tag = Value::Empty_Type; - v->uint_32 = dd->freeList(); + v->uint_32 = d->freeList; } - dd->freeList() = idx; - if (dd->attrs()) - dd->attrs()[idx].clear(); + d->freeList = idx; + if (d->attrs) + d->attrs[idx].clear(); } @@ -360,7 +359,7 @@ void SparseArrayData::markObjects(Heap::Base *d, ExecutionEngine *e) dd->arrayData[i].mark(e); } -ArrayData *SparseArrayData::reallocate(Object *o, uint n, bool enforceAttributes) +Heap::ArrayData *SparseArrayData::reallocate(Object *o, uint n, bool enforceAttributes) { realloc(o, Heap::ArrayData::Sparse, n, enforceAttributes); return o->arrayData(); @@ -536,12 +535,12 @@ uint SparseArrayData::truncate(Object *o, uint newLen) return newLen; } -uint SparseArrayData::length(const ArrayData *d) +uint SparseArrayData::length(const Heap::ArrayData *d) { - const SparseArrayData *dd = static_cast<const SparseArrayData *>(d); - if (!dd->sparse()) + const Heap::SparseArrayData *dd = static_cast<const Heap::SparseArrayData *>(d); + if (!dd->sparse) return 0; - SparseArrayNode *n = dd->sparse()->end(); + SparseArrayNode *n = dd->sparse->end(); n = n->previousNode(); return n ? n->key() + 1 : 0; } @@ -815,7 +814,7 @@ void ArrayData::sort(ExecutionEngine *engine, Object *thisObject, const ValueRef ArrayElementLessThan lessThan(engine, thisObject, comparefn); - Value *begin = thisObject->arrayData()->d()->arrayData; + Value *begin = thisObject->arrayData()->arrayData; sortHelper(begin, begin + len, *begin, lessThan); #ifdef CHECK_SPARSE_ARRAYS diff --git a/src/qml/jsruntime/qv4arraydata_p.h b/src/qml/jsruntime/qv4arraydata_p.h index d07f4e0708..1d2eb48a43 100644 --- a/src/qml/jsruntime/qv4arraydata_p.h +++ b/src/qml/jsruntime/qv4arraydata_p.h @@ -58,7 +58,7 @@ struct ArrayVTable { ManagedVTable managedVTable; uint type; - ArrayData *(*reallocate)(Object *o, uint n, bool enforceAttributes); + Heap::ArrayData *(*reallocate)(Object *o, uint n, bool enforceAttributes); ReturnedValue (*get)(const Heap::ArrayData *d, uint index); bool (*put)(Object *o, uint index, ValueRef value); bool (*putArray)(Object *o, uint index, Value *values, uint n); @@ -67,7 +67,7 @@ struct ArrayVTable void (*push_front)(Object *o, Value *values, uint n); ReturnedValue (*pop_front)(Object *o); uint (*truncate)(Object *o, uint newLen); - uint (*length)(const ArrayData *d); + uint (*length)(const Heap::ArrayData *d); }; namespace Heap { @@ -110,6 +110,10 @@ struct ArrayData : public Base { return get(i) == Primitive::emptyValue().asReturnedValue(); } + inline ReturnedValue length() const { + return vtable()->length(this); + } + }; struct SimpleArrayData : public ArrayData { @@ -182,7 +186,7 @@ struct Q_QML_EXPORT ArrayData : public Managed bool isSparse() const { return type() == Heap::ArrayData::Sparse; } uint length() const { - return vtable()->length(this); + return d()->length(); } bool hasAttributes() const { @@ -222,7 +226,7 @@ struct Q_QML_EXPORT SimpleArrayData : public ArrayData uint &len() { return d()->len; } uint len() const { return d()->len; } - static ArrayData *reallocate(Object *o, uint n, bool enforceAttributes); + static Heap::ArrayData *reallocate(Object *o, uint n, bool enforceAttributes); static void markObjects(Heap::Base *d, ExecutionEngine *e); @@ -234,7 +238,7 @@ struct Q_QML_EXPORT SimpleArrayData : public ArrayData static void push_front(Object *o, Value *values, uint n); static ReturnedValue pop_front(Object *o); static uint truncate(Object *o, uint newLen); - static uint length(const ArrayData *d); + static uint length(const Heap::ArrayData *d); }; struct Q_QML_EXPORT SparseArrayData : public ArrayData @@ -248,13 +252,13 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData void setSparse(SparseArray *s) { d()->sparse = s; } static uint allocate(Object *o, bool doubleSlot = false); - static void free(ArrayData *d, uint idx); + static void free(Heap::ArrayData *d, uint idx); uint mappedIndex(uint index) const { return d()->mappedIndex(index); } static void markObjects(Heap::Base *d, ExecutionEngine *e); - static ArrayData *reallocate(Object *o, uint n, bool enforceAttributes); + static Heap::ArrayData *reallocate(Object *o, uint n, bool enforceAttributes); static ReturnedValue get(const Heap::ArrayData *d, uint index); static bool put(Object *o, uint index, ValueRef value); static bool putArray(Object *o, uint index, Value *values, uint n); @@ -263,7 +267,7 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData static void push_front(Object *o, Value *values, uint n); static ReturnedValue pop_front(Object *o); static uint truncate(Object *o, uint newLen); - static uint length(const ArrayData *d); + static uint length(const Heap::ArrayData *d); }; namespace Heap { diff --git a/src/qml/jsruntime/qv4arrayobject.cpp b/src/qml/jsruntime/qv4arrayobject.cpp index 09cd52d060..ec79d0b47d 100644 --- a/src/qml/jsruntime/qv4arrayobject.cpp +++ b/src/qml/jsruntime/qv4arrayobject.cpp @@ -293,7 +293,7 @@ ReturnedValue ArrayPrototype::method_push(CallContext *ctx) if (!ctx->d()->callData->argc) ; - else if (!instance->protoHasArray() && instance->arrayData()->length() <= len && instance->arrayData()->type() == Heap::ArrayData::Simple) { + else if (!instance->protoHasArray() && instance->arrayData()->length() <= len && instance->arrayData()->type == Heap::ArrayData::Simple) { instance->arrayData()->vtable()->putArray(instance.getPointer(), len, ctx->d()->callData->args, ctx->d()->callData->argc); len = instance->arrayData()->length(); } else { @@ -361,7 +361,7 @@ ReturnedValue ArrayPrototype::method_shift(CallContext *ctx) ScopedValue result(scope); - if (!instance->protoHasArray() && !instance->arrayData()->attrs() && instance->arrayData()->length() <= len && instance->arrayData()->type() != Heap::ArrayData::Custom) { + if (!instance->protoHasArray() && !instance->arrayData()->attrs && instance->arrayData()->length() <= len && instance->arrayData()->type != Heap::ArrayData::Custom) { result = instance->arrayData()->vtable()->pop_front(instance.getPointer()); } else { result = instance->getIndexed(0); @@ -541,8 +541,8 @@ ReturnedValue ArrayPrototype::method_unshift(CallContext *ctx) uint len = instance->getLength(); - if (!instance->protoHasArray() && !instance->arrayData()->attrs() && instance->arrayData()->length() <= len && - instance->arrayData()->type() != Heap::ArrayData::Custom) { + if (!instance->protoHasArray() && !instance->arrayData()->attrs && instance->arrayData()->length() <= len && + instance->arrayData()->type != Heap::ArrayData::Custom) { instance->arrayData()->vtable()->push_front(instance.getPointer(), ctx->d()->callData->args, ctx->d()->callData->argc); } else { ScopedValue v(scope); diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp index ea82923cc5..8833d675d5 100644 --- a/src/qml/jsruntime/qv4functionobject.cpp +++ b/src/qml/jsruntime/qv4functionobject.cpp @@ -326,11 +326,11 @@ ReturnedValue FunctionPrototype::method_apply(CallContext *ctx) for (quint32 i = 0; i < len; ++i) callData->args[i] = arr->getIndexed(i); } else { - uint alen = arr->arrayData() ? arr->arrayData()->length() : 0; + uint alen = arr->arrayData() ? arr->arrayData()->len : 0; if (alen > len) alen = len; for (uint i = 0; i < alen; ++i) - callData->args[i] = static_cast<SimpleArrayData *>(arr->arrayData())->data(i); + callData->args[i] = static_cast<Heap::SimpleArrayData *>(arr->arrayData())->data(i); for (quint32 i = alen; i < len; ++i) callData->args[i] = Primitive::undefinedValue(); } diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h index 2fd0901d6f..379ff2fde6 100644 --- a/src/qml/jsruntime/qv4object_p.h +++ b/src/qml/jsruntime/qv4object_p.h @@ -98,8 +98,7 @@ struct Q_QML_EXPORT Object: Managed { Heap::MemberData *memberData() { return d()->memberData; } const Heap::MemberData *memberData() const { return d()->memberData; } - // ### GC - ArrayData *arrayData() const { return reinterpret_cast<ArrayData *>(d()->arrayData); } + Heap::ArrayData *arrayData() const { return d()->arrayData; } void setArrayData(ArrayData *a) { d()->arrayData = a->d(); } const Property *propertyAt(uint index) const { return reinterpret_cast<const Property *>(memberData()->data + index); } diff --git a/src/qml/jsruntime/qv4objectproto.cpp b/src/qml/jsruntime/qv4objectproto.cpp index 585c773c6b..46116cb707 100644 --- a/src/qml/jsruntime/qv4objectproto.cpp +++ b/src/qml/jsruntime/qv4objectproto.cpp @@ -250,9 +250,9 @@ ReturnedValue ObjectPrototype::method_seal(CallContext *ctx) if (o->arrayData()) { ArrayData::ensureAttributes(o.getPointer()); - for (uint i = 0; i < o->arrayData()->alloc(); ++i) { + for (uint i = 0; i < o->d()->arrayData->alloc; ++i) { if (!o->arrayData()->isEmpty(i)) - o->arrayData()->attrs()[i].setConfigurable(false); + o->d()->arrayData->attrs[i].setConfigurable(false); } } @@ -275,11 +275,11 @@ ReturnedValue ObjectPrototype::method_freeze(CallContext *ctx) if (o->arrayData()) { ArrayData::ensureAttributes(o.getPointer()); - for (uint i = 0; i < o->arrayData()->alloc(); ++i) { + for (uint i = 0; i < o->arrayData()->alloc; ++i) { if (!o->arrayData()->isEmpty(i)) - o->arrayData()->attrs()[i].setConfigurable(false); - if (o->arrayData()->attrs()[i].isData()) - o->arrayData()->attrs()[i].setWritable(false); + o->arrayData()->attrs[i].setConfigurable(false); + if (o->arrayData()->attrs[i].isData()) + o->arrayData()->attrs[i].setWritable(false); } } return o.asReturnedValue(); @@ -313,10 +313,10 @@ ReturnedValue ObjectPrototype::method_isSealed(CallContext *ctx) return Encode(true); Q_ASSERT(o->arrayData() && o->arrayData()->length()); - if (!o->arrayData()->attrs()) + if (!o->arrayData()->attrs) return Encode(false); - for (uint i = 0; i < o->arrayData()->alloc(); ++i) { + for (uint i = 0; i < o->arrayData()->alloc; ++i) { if (!o->arrayData()->isEmpty(i)) if (o->arrayData()->attributes(i).isConfigurable()) return Encode(false); @@ -342,10 +342,10 @@ ReturnedValue ObjectPrototype::method_isFrozen(CallContext *ctx) return Encode(true); Q_ASSERT(o->arrayData() && o->arrayData()->length()); - if (!o->arrayData()->attrs()) + if (!o->arrayData()->attrs) return Encode(false); - for (uint i = 0; i < o->arrayData()->alloc(); ++i) { + for (uint i = 0; i < o->arrayData()->alloc; ++i) { if (!o->arrayData()->isEmpty(i)) if (o->arrayData()->attributes(i).isConfigurable() || o->arrayData()->attributes(i).isWritable()) return Encode(false); diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 2aaf77b218..8436b8d828 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -589,7 +589,7 @@ ReturnedValue Runtime::getElement(ExecutionEngine *engine, const ValueRef object } if (idx < UINT_MAX) { - if (o->arrayData() && !o->arrayData()->hasAttributes()) { + if (o->arrayData() && !o->arrayData()->attrs) { ScopedValue v(scope, o->arrayData()->get(idx)); if (!v->isEmpty()) return v->asReturnedValue(); @@ -614,8 +614,8 @@ void Runtime::setElement(ExecutionEngine *engine, const ValueRef object, const V uint idx = index->asArrayIndex(); if (idx < UINT_MAX) { if (o->arrayType() == Heap::ArrayData::Simple) { - SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData()); - if (s && idx < s->len() && !s->data(idx).isEmpty()) { + Heap::SimpleArrayData *s = static_cast<Heap::SimpleArrayData *>(o->arrayData()); + if (s && idx < s->len && !s->data(idx).isEmpty()) { s->data(idx) = value; return; } |