aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4arraydata_p.h
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2014-01-09 11:05:08 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-20 21:14:27 +0100
commit5c25379cd1889dc16187c0ec62f32d2b17a320cf (patch)
tree23bb7bef5b2378ffe0e4193bf753811f4bf843f4 /src/qml/jsruntime/qv4arraydata_p.h
parente2d9917878968986a9df21c9cfafc32a2360aee7 (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.h12
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);
}
}