diff options
author | Lars Knoll <lars.knoll@qt.io> | 2017-01-27 09:57:00 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2017-03-09 08:58:15 +0000 |
commit | 10c1e4053366085080a39ea84ebbd189c8d827ec (patch) | |
tree | 65af97d1897f113647e5463c9bdf9b3dfce94f1b /src/qml/memory | |
parent | 58b882ad42f99e03ac8dca13ff9c0d39fcafbaa0 (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.cpp | 17 | ||||
-rw-r--r-- | src/qml/memory/qv4mmdefs_p.h | 2 |
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; |