diff options
author | Lars Knoll <lars.knoll@digia.com> | 2014-04-05 20:23:20 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-07-22 13:48:54 +0200 |
commit | b11ec085703a0b019c8115ff505ee6e2553fd4f1 (patch) | |
tree | 3336b31ba690f9b200b7fee8cc133aa4bf2e7837 /src/qml/jsruntime/qv4mm.cpp | |
parent | 05f17e841f971d3c8f635cc044c60c970c2055c9 (diff) |
Move Managed data into it's own subclass
This prepares for moving over to a d pointer scheme,
where Managed subclasses don't hold any data directly. This
is required to be able to move over to a modern GC.
Change-Id: I3f59633ac07a7da461bd2d4f0f9f3a8e3b0baf02
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4mm.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4mm.cpp | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/src/qml/jsruntime/qv4mm.cpp b/src/qml/jsruntime/qv4mm.cpp index 3998857291..fdc8c9b25f 100644 --- a/src/qml/jsruntime/qv4mm.cpp +++ b/src/qml/jsruntime/qv4mm.cpp @@ -237,7 +237,6 @@ Managed *MemoryManager::alloc(std::size_t size) Managed **last = &m_d->smallItems[pos]; while (chunk <= end) { Managed *o = reinterpret_cast<Managed *>(chunk); - o->_data = 0; *last = o; last = o->nextFreeRef(); chunk += size; @@ -318,8 +317,8 @@ void MemoryManager::mark() // now that we marked all roots, start marking recursively and popping from the mark stack while (m_d->engine->jsStackTop > markBase) { Managed *m = m_d->engine->popForGC(); - Q_ASSERT (m->internalClass->vtable->markObjects); - m->internalClass->vtable->markObjects(m, m_d->engine); + Q_ASSERT (m->internalClass()->vtable->markObjects); + m->internalClass()->vtable->markObjects(m, m_d->engine); } } @@ -335,7 +334,7 @@ void MemoryManager::sweep(bool lastSweep) continue; } if (Managed *m = weak->value.asManaged()) { - if (!m->markBit) { + if (!m->markBit()) { weak->value = Primitive::undefinedValue(); PersistentValuePrivate *n = weak->next; weak->removeFromList(); @@ -348,7 +347,7 @@ void MemoryManager::sweep(bool lastSweep) if (MultiplyWrappedQObjectMap *multiplyWrappedQObjects = m_d->engine->m_multiplyWrappedQObjects) { for (MultiplyWrappedQObjectMap::Iterator it = multiplyWrappedQObjects->begin(); it != multiplyWrappedQObjects->end();) { - if (!it.value()->markBit) + if (!it.value()->markBit()) it = multiplyWrappedQObjects->erase(it); else ++it; @@ -362,15 +361,15 @@ void MemoryManager::sweep(bool lastSweep) Data::LargeItem **last = &m_d->largeItems; while (i) { Managed *m = i->managed(); - Q_ASSERT(m->inUse); - if (m->markBit) { - m->markBit = 0; + Q_ASSERT(m->inUse()); + if (m->markBit()) { + m->managedData()->markBit = 0; last = &i->next; i = i->next; continue; } - if (m->internalClass->vtable->destroy) - m->internalClass->vtable->destroy(m); + if (m->internalClass()->vtable->destroy) + m->internalClass()->vtable->destroy(m); *last = i->next; free(Q_V4_PROFILE_DEALLOC(m_d->engine, i, i->size + sizeof(Data::LargeItem), @@ -403,16 +402,16 @@ void MemoryManager::sweep(char *chunkStart, std::size_t chunkSize, size_t size) Q_ASSERT((qintptr) chunk % 16 == 0); - if (m->inUse) { - if (m->markBit) { - m->markBit = 0; + if (m->inUse()) { + if (m->markBit()) { + m->managedData()->markBit = 0; } else { // qDebug() << "-- collecting it." << m << *f << m->nextFree(); #ifdef V4_USE_VALGRIND VALGRIND_ENABLE_ERROR_REPORTING; #endif - if (m->internalClass->vtable->destroy) - m->internalClass->vtable->destroy(m); + if (m->internalClass()->vtable->destroy) + m->internalClass()->vtable->destroy(m); memset(m, 0, size); m->setNextFree(*f); @@ -486,7 +485,7 @@ size_t MemoryManager::getUsedMem() const for (char *chunk = chunkStart; chunk <= chunkEnd; chunk += i->chunkSize) { Managed *m = reinterpret_cast<Managed *>(chunk); Q_ASSERT((qintptr) chunk % 16 == 0); - if (m->inUse) + if (m->inUse()) usedMem += i->chunkSize; } } @@ -570,7 +569,7 @@ void MemoryManager::collectFromJSStack() const Value *top = m_d->engine->jsStackTop; while (v < top) { Managed *m = v->asManaged(); - if (m && m->inUse) + if (m && m->inUse()) // Skip pointers to already freed objects, they are bogus as well m->mark(m_d->engine); ++v; |