diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2014-11-01 23:04:20 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-11-08 16:39:07 +0100 |
commit | ec8f1f68d623ae68cc7d79e19067884532e3db6f (patch) | |
tree | ccf08fdf46e677931ba839228c444f24bcbb202e /src/qml/jsruntime/qv4arraydata_p.h | |
parent | 9d1cd3098a066c7b6689d4776bfd3a25621a26fc (diff) |
Begin moving the data out of Managed objects
We need to move the Data objects out of the Managed
objects, to avoid lots of trouble because inner classes
can't be forward declared in C++.
Instead move them all into a Heap namespace.
Change-Id: I736af60702b68a1759f4643aa16d64108693dea2
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4arraydata_p.h')
-rw-r--r-- | src/qml/jsruntime/qv4arraydata_p.h | 89 |
1 files changed, 50 insertions, 39 deletions
diff --git a/src/qml/jsruntime/qv4arraydata_p.h b/src/qml/jsruntime/qv4arraydata_p.h index 5286be875b..10997a8e55 100644 --- a/src/qml/jsruntime/qv4arraydata_p.h +++ b/src/qml/jsruntime/qv4arraydata_p.h @@ -42,7 +42,7 @@ QT_BEGIN_NAMESPACE namespace QV4 { -#define V4_ARRAYDATA \ +#define V4_ARRAYDATA(Data) \ public: \ Q_MANAGED_CHECK \ static const QV4::ArrayVTable static_vtbl; \ @@ -50,8 +50,8 @@ namespace QV4 { template <typename T> \ QV4::Returned<T> *asReturned() { return QV4::Returned<T>::create(this); } \ V4_MANAGED_SIZE_TEST \ - const Data *d() const { return &static_cast<const Data &>(Managed::data); } \ - Data *d() { return &static_cast<Data &>(Managed::data); } + const QV4::Heap::Data *d() const { return &static_cast<const QV4::Heap::Data &>(Managed::data); } \ + QV4::Heap::Data *d() { return &static_cast<QV4::Heap::Data &>(Managed::data); } struct ArrayData; @@ -73,9 +73,12 @@ struct ArrayVTable uint (*length)(const ArrayData *d); }; +namespace Heap { -struct Q_QML_EXPORT ArrayData : public Managed -{ +struct ArrayData : public Base { + ArrayData(InternalClass *ic) + : Base(ic) + {} enum Type { Simple = 0, Complex = 1, @@ -83,24 +86,36 @@ struct Q_QML_EXPORT ArrayData : public Managed Custom = 3 }; - struct Data : public Managed::Data { - Data(InternalClass *ic) - : Managed::Data(ic) - {} - uint alloc; - Type type; - PropertyAttributes *attrs; - union { - uint len; - uint freeList; - }; - union { - uint offset; - SparseArray *sparse; - }; - Value arrayData[1]; + uint alloc; + Type type; + PropertyAttributes *attrs; + union { + uint len; + uint freeList; + }; + union { + uint offset; + SparseArray *sparse; }; - V4_MANAGED(Managed) + Value arrayData[1]; +}; + +struct SimpleArrayData : public ArrayData { + SimpleArrayData(ExecutionEngine *engine) + : ArrayData(engine->simpleArrayDataClass) + {} +}; + +struct SparseArrayData : public ArrayData { + inline SparseArrayData(ExecutionEngine *engine); +}; + +} + +struct Q_QML_EXPORT ArrayData : public Managed +{ + typedef Heap::ArrayData::Type Type; + V4_MANAGED2(ArrayData, Managed) uint alloc() const { return d()->alloc; } uint &alloc() { return d()->alloc; } @@ -113,7 +128,7 @@ struct Q_QML_EXPORT ArrayData : public Managed Value *arrayData() { return &d()->arrayData[0]; } const ArrayVTable *vtable() const { return reinterpret_cast<const ArrayVTable *>(internalClass()->vtable); } - bool isSparse() const { return type() == Sparse; } + bool isSparse() const { return type() == Heap::ArrayData::Sparse; } uint length() const { return vtable()->length(this); @@ -146,13 +161,7 @@ struct Q_QML_EXPORT ArrayData : public Managed struct Q_QML_EXPORT SimpleArrayData : public ArrayData { - - struct Data : public ArrayData::Data { - Data(ExecutionEngine *engine) - : ArrayData::Data(engine->simpleArrayDataClass) - {} - }; - V4_ARRAYDATA + V4_ARRAYDATA(SimpleArrayData) uint mappedIndex(uint index) const { return (index + d()->offset) % d()->alloc; } Value data(uint index) const { return d()->arrayData[mappedIndex(index)]; } @@ -172,7 +181,7 @@ struct Q_QML_EXPORT SimpleArrayData : public ArrayData static ArrayData *reallocate(Object *o, uint n, bool enforceAttributes); - static void markObjects(HeapObject *d, ExecutionEngine *e); + static void markObjects(Heap::Base *d, ExecutionEngine *e); static ReturnedValue get(const ArrayData *d, uint index); static bool put(Object *o, uint index, ValueRef value); @@ -188,12 +197,7 @@ struct Q_QML_EXPORT SimpleArrayData : public ArrayData struct Q_QML_EXPORT SparseArrayData : public ArrayData { - struct Data : public ArrayData::Data { - Data(ExecutionEngine *engine) - : ArrayData::Data(engine->emptyClass) - { setVTable(staticVTable()); } - }; - V4_ARRAYDATA + V4_ARRAYDATA(SparseArrayData) uint &freeList() { return d()->freeList; } uint freeList() const { return d()->freeList; } @@ -218,7 +222,7 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData } static void destroy(Managed *d); - static void markObjects(HeapObject *d, ExecutionEngine *e); + static void markObjects(Heap::Base *d, ExecutionEngine *e); static ArrayData *reallocate(Object *o, uint n, bool enforceAttributes); static ReturnedValue get(const ArrayData *d, uint index); @@ -233,10 +237,17 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData static uint length(const ArrayData *d); }; +namespace Heap { +inline SparseArrayData::SparseArrayData(ExecutionEngine *engine) + : ArrayData(engine->emptyClass) +{ + setVTable(QV4::SparseArrayData::staticVTable()); +} +} inline Property *ArrayData::getProperty(uint index) { - if (type() != Sparse) { + if (type() != Heap::ArrayData::Sparse) { SimpleArrayData *that = static_cast<SimpleArrayData *>(this); return that->getProperty(index); } else { |