diff options
author | Lars Knoll <lars.knoll@digia.com> | 2014-01-09 11:05:08 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-20 21:14:27 +0100 |
commit | 5c25379cd1889dc16187c0ec62f32d2b17a320cf (patch) | |
tree | 23bb7bef5b2378ffe0e4193bf753811f4bf843f4 /src/qml/jsruntime/qv4arraydata_p.h | |
parent | e2d9917878968986a9df21c9cfafc32a2360aee7 (diff) |
Save memory on array data
Store a simple vector of Values in the array data,
instead of a Vector of Property's. This halfes the
memory consumption on 64bit and simplifies our code.
If an indexed property gets converted to an accessor
property, we simply convert the ArrayData into a
SparseArrayData.
Add support in SparseArrayData to allocate double slots
(two Value's) to hold a full Property in case someone
sets an accessor on an indexed property.
Some methods still return a Property*, but this is safe, as
only the first Value in the Property pointer will ever get
accessed if the Property doesn't contain an accessor.
Change-Id: Ic9b0f309b09a2772a328d947a10faaf3be9fe56f
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 | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/qml/jsruntime/qv4arraydata_p.h b/src/qml/jsruntime/qv4arraydata_p.h index 98968fada2..3e0901061c 100644 --- a/src/qml/jsruntime/qv4arraydata_p.h +++ b/src/qml/jsruntime/qv4arraydata_p.h @@ -95,7 +95,7 @@ struct Q_QML_EXPORT ArrayData uint alloc; uint type; PropertyAttributes *attrs; - Property *data; + SafeValue *data; bool isSparse() const { return this && type == Sparse; } @@ -170,7 +170,7 @@ struct Q_QML_EXPORT ArrayData static void sort(ExecutionContext *context, ObjectRef thisObject, const ValueRef comparefn, uint dataLen); static uint append(Object *o, const ArrayObject *otherObj, uint n); - static Property *insert(Object *o, uint index); + static Property *insert(Object *o, uint index, bool isAccessor = false); void markObjects(ExecutionEngine *e); static void getHeadRoom(ArrayData *d); @@ -200,7 +200,7 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData uint freeList; SparseArray *sparse; - static uint allocate(ArrayData *d); + static uint allocate(ArrayData *d, bool doubleSlot = false); static void free(ArrayData *d, uint idx); static void freeData(ArrayData *d); @@ -224,14 +224,14 @@ inline Property *ArrayData::getProperty(uint index) const if (!this) return 0; if (type != Sparse) { - if (index >= len || data[index].value.isEmpty()) + if (index >= len || data[index].isEmpty()) return 0; - return data + index; + return reinterpret_cast<Property *>(data + index); } else { SparseArrayNode *n = static_cast<const SparseArrayData *>(this)->sparse->findNode(index); if (!n) return 0; - return data + n->value; + return reinterpret_cast<Property *>(data + n->value); } } |