aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/memory
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2017-01-27 09:57:00 +0100
committerLars Knoll <lars.knoll@qt.io>2017-03-09 08:58:15 +0000
commit10c1e4053366085080a39ea84ebbd189c8d827ec (patch)
tree65af97d1897f113647e5463c9bdf9b3dfce94f1b /src/qml/memory
parent58b882ad42f99e03ac8dca13ff9c0d39fcafbaa0 (diff)
Unify mark handling for MemberData and ArrayData
Introduce a ValueArray class, that defines an array of Values at the end of a Heap Object. Change-Id: I00efbf6f5839a6687dd5bc5fc037ec8f06e0936e Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/memory')
-rw-r--r--src/qml/memory/qv4mm.cpp17
-rw-r--r--src/qml/memory/qv4mmdefs_p.h2
2 files changed, 5 insertions, 14 deletions
diff --git a/src/qml/memory/qv4mm.cpp b/src/qml/memory/qv4mm.cpp
index bb600c6c0f..259f221a86 100644
--- a/src/qml/memory/qv4mm.cpp
+++ b/src/qml/memory/qv4mm.cpp
@@ -733,7 +733,8 @@ Heap::Object *MemoryManager::allocObjectWithMemberData(std::size_t size, uint nM
memset(m, 0, memberSize);
o->memberData = static_cast<Heap::MemberData *>(m);
o->memberData->setVtable(MemberData::staticVTable());
- o->memberData->size = static_cast<uint>((memberSize - sizeof(Heap::MemberData) + sizeof(Value))/sizeof(Value));
+ o->memberData->values.alloc = static_cast<uint>((memberSize - sizeof(Heap::MemberData) + sizeof(Value))/sizeof(Value));
+ o->memberData->values.size = o->memberData->values.alloc;
o->memberData->init();
// qDebug() << " got" << o->memberData << o->memberData->size;
}
@@ -769,17 +770,9 @@ void MemoryManager::drainMarkStack(Value *markBase)
case Mark_ValueArray: {
Q_ASSERT(m == Mark_ValueArray);
// qDebug() << "marking Value Array at offset" << hex << (mem - reinterpret_cast<void **>(h));
- uint size;
- Value *v = reinterpret_cast<Value *>(mem);
- if (h->vtable() == QV4::MemberData::staticVTable()) {
- size = static_cast<Heap::MemberData *>(h)->size;
- } else if (h->vtable()->isArrayData) {
- size = static_cast<Heap::ArrayData *>(h)->alloc;
- } else {
- size = 0;
- Q_ASSERT(false);
- }
- const Value *end = v + size;
+ ValueArray *a = reinterpret_cast<ValueArray *>(mem);
+ Value *v = a->v;
+ const Value *end = v + a->alloc;
while (v < end) {
v->mark(engine);
++v;
diff --git a/src/qml/memory/qv4mmdefs_p.h b/src/qml/memory/qv4mmdefs_p.h
index 90e7d9cb61..a987c3a200 100644
--- a/src/qml/memory/qv4mmdefs_p.h
+++ b/src/qml/memory/qv4mmdefs_p.h
@@ -277,8 +277,6 @@ template<>
struct MarkFlagsForType<Value> {
static const quint64 markFlags = Mark_Value;
};
-
-typedef Value ValueArray[1];
template<>
struct MarkFlagsForType<ValueArray> {
static const quint64 markFlags = Mark_ValueArray;