diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-06-13 16:19:25 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-07-22 13:49:20 +0200 |
commit | 3110273d1cbb47cb28a4ea96e34373cc7bbdbaa9 (patch) | |
tree | 7c75bc1f0aed6ea52071a6fcffda34c9b59f281d /src/qml/jsruntime | |
parent | da9d5016613d04f002c6433e2b3083143fec34cb (diff) |
Ported array data to the new object structure
Change-Id: Ice53925f42924c889d265bcd1e4af7b9bd356fa8
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r-- | src/qml/jsruntime/qv4arraydata.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arraydata_p.h | 92 |
2 files changed, 54 insertions, 42 deletions
diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp index 2d702aed97..cbfb0d9f00 100644 --- a/src/qml/jsruntime/qv4arraydata.cpp +++ b/src/qml/jsruntime/qv4arraydata.cpp @@ -117,7 +117,7 @@ void ArrayData::realloc(Object *o, Type newType, uint offset, uint alloc, bool e if (newType < Sparse) { size += sizeof(SimpleArrayData); SimpleArrayData *newData = static_cast<SimpleArrayData *>(o->engine()->memoryManager->allocManaged(size)); - new (newData) SimpleArrayData(o->engine()); + new (newData->d()) SimpleArrayData::Data(o->engine()); newData->setAlloc(alloc - offset); newData->setType(newType); newData->setArrayData(reinterpret_cast<Value *>(newData + 1) + offset); @@ -128,7 +128,7 @@ void ArrayData::realloc(Object *o, Type newType, uint offset, uint alloc, bool e } else { size += sizeof(SparseArrayData); SparseArrayData *newData = static_cast<SparseArrayData *>(o->engine()->memoryManager->allocManaged(size)); - new (newData) SparseArrayData(o->engine()); + new (newData->d()) SparseArrayData::Data(o->engine()); newData->setAlloc(alloc); newData->setType(newType); newData->setArrayData(reinterpret_cast<Value *>(newData + 1)); diff --git a/src/qml/jsruntime/qv4arraydata_p.h b/src/qml/jsruntime/qv4arraydata_p.h index fb748ef031..a582effb01 100644 --- a/src/qml/jsruntime/qv4arraydata_p.h +++ b/src/qml/jsruntime/qv4arraydata_p.h @@ -57,6 +57,10 @@ namespace QV4 { static inline const QV4::ManagedVTable *staticVTable() { return &static_vtbl.managedVTable; } \ template <typename T> \ QV4::Returned<T> *asReturned() { return QV4::Returned<T>::create(this); } \ + void __dataTest() { Q_STATIC_ASSERT(sizeof(*this) == sizeof(Data)); } \ + const Data *d() const { return &static_cast<const Data &>(Managed::data); } \ + Data *d() { return &static_cast<Data &>(Managed::data); } + struct ArrayData; @@ -80,11 +84,6 @@ struct ArrayVTable struct Q_QML_EXPORT ArrayData : public Managed { - ArrayData(InternalClass *ic) - : Managed(ic) - { - } - enum Type { Simple = 0, Complex = 1, @@ -92,24 +91,33 @@ struct Q_QML_EXPORT ArrayData : public Managed Custom = 3 }; - struct Data { + struct Data : public Managed::Data { + Data(InternalClass *ic) + : Managed::Data(ic) + {} uint alloc; Type type; PropertyAttributes *attrs; Value *arrayData; }; - Data data; - - uint alloc() const { return data.alloc; } - uint &alloc() { return data.alloc; } - void setAlloc(uint a) { data.alloc = a; } - Type type() const { return data.type; } - void setType(Type t) { data.type = t; } - PropertyAttributes *attrs() const { return data.attrs; } - void setAttrs(PropertyAttributes *a) { data.attrs = a; } - Value *arrayData() const { return data.arrayData; } - Value *&arrayData() { return data.arrayData; } - void setArrayData(Value *v) { data.arrayData = v; } + struct { + uint alloc; + Type type; + PropertyAttributes *attrs; + Value *arrayData; + } __data; + V4_MANAGED(Managed) + + uint alloc() const { return d()->alloc; } + uint &alloc() { return d()->alloc; } + void setAlloc(uint a) { d()->alloc = a; } + Type type() const { return d()->type; } + void setType(Type t) { d()->type = t; } + PropertyAttributes *attrs() const { return d()->attrs; } + void setAttrs(PropertyAttributes *a) { d()->attrs = a; } + Value *arrayData() const { return d()->arrayData; } + Value *&arrayData() { return d()->arrayData; } + void setArrayData(Value *v) { d()->arrayData = v; } const ArrayVTable *vtable() const { return reinterpret_cast<const ArrayVTable *>(internalClass()->vtable); } bool isSparse() const { return this && type() == Sparse; } @@ -151,22 +159,24 @@ struct Q_QML_EXPORT ArrayData : public Managed struct Q_QML_EXPORT SimpleArrayData : public ArrayData { - V4_ARRAYDATA - - SimpleArrayData(ExecutionEngine *engine) - : ArrayData(engine->simpleArrayDataClass) - {} - struct Data { + struct Data : public ArrayData::Data { + Data(ExecutionEngine *engine) + : ArrayData::Data(engine->simpleArrayDataClass) + {} uint len; uint offset; }; - Data data; + struct { + uint len; + uint offset; + } __data; + V4_ARRAYDATA - uint &len() { return data.len; } - uint len() const { return data.len; } - uint &offset() { return data.offset; } - uint offset() const { return data.offset; } + uint &len() { return d()->len; } + uint len() const { return d()->len; } + uint &offset() { return d()->offset; } + uint offset() const { return d()->offset; } static void getHeadRoom(Object *o); static ArrayData *reallocate(Object *o, uint n, bool enforceAttributes); @@ -187,22 +197,24 @@ struct Q_QML_EXPORT SimpleArrayData : public ArrayData struct Q_QML_EXPORT SparseArrayData : public ArrayData { - V4_ARRAYDATA + struct Data : public ArrayData::Data { + Data(ExecutionEngine *engine) + : ArrayData::Data(engine->emptyClass) + { setVTable(staticVTable()); } - SparseArrayData(ExecutionEngine *engine) - : ArrayData(engine->emptyClass) - { setVTable(staticVTable()); } - - struct Data { uint freeList; SparseArray *sparse; }; - Data data; + struct { + uint freeList; + SparseArray *sparse; + } __data; + V4_ARRAYDATA - uint &freeList() { return data.freeList; } - uint freeList() const { return data.freeList; } - SparseArray *sparse() const { return data.sparse; } - void setSparse(SparseArray *s) { data.sparse = s; } + uint &freeList() { return d()->freeList; } + uint freeList() const { return d()->freeList; } + SparseArray *sparse() const { return d()->sparse; } + void setSparse(SparseArray *s) { d()->sparse = s; } static uint allocate(Object *o, bool doubleSlot = false); static void free(ArrayData *d, uint idx); |