diff options
| author | Lars Knoll <lars.knoll@digia.com> | 2014-03-31 15:48:02 +0200 |
|---|---|---|
| committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-04-04 17:26:20 +0200 |
| commit | 8e556778c8324c61ddf5842e457c873c1b5aac02 (patch) | |
| tree | ca9dd1cd85510fdbd01221005cb0c096a844a762 /src/qml/jsruntime/qv4object.cpp | |
| parent | b02eeeee586abe343b8866385c1327ac009b3ef0 (diff) | |
Garbage collect member data
Move the allocated member data into the garbage collected
area, so that we can avoid using malloc/free for it.
Change-Id: I20625efa67ecd60238568742b74854b0c8cb2e3e
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4object.cpp')
| -rw-r--r-- | src/qml/jsruntime/qv4object.cpp | 27 |
1 files changed, 8 insertions, 19 deletions
diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp index 37dc0a8bfb..c8d360d511 100644 --- a/src/qml/jsruntime/qv4object.cpp +++ b/src/qml/jsruntime/qv4object.cpp @@ -48,6 +48,7 @@ #include "qv4mm_p.h" #include "qv4lookup_p.h" #include "qv4scopedvalue_p.h" +#include "qv4memberdata_p.h" #include <private/qqmljsengine_p.h> #include <private/qqmljslexer_p.h> @@ -71,26 +72,24 @@ DEFINE_OBJECT_VTABLE(Object); Object::Object(ExecutionEngine *engine) : Managed(engine->objectClass) - , memberDataAlloc(InlinePropertySize), memberData(inlineProperties) { } Object::Object(InternalClass *ic) : Managed(ic) - , memberDataAlloc(InlinePropertySize), memberData(inlineProperties) { Q_ASSERT(internalClass->vtable && internalClass->vtable != &Managed::static_vtbl); - if (internalClass->size >= memberDataAlloc) { - memberDataAlloc = internalClass->size; - memberData = new Value[memberDataAlloc]; + Q_ASSERT(!memberData.d()); + if (internalClass->size) { + Scope scope(engine()); + ScopedObject protectThis(scope, this); + memberData.ensureIndex(engine(), internalClass->size); } } Object::~Object() { - if (memberData != inlineProperties) - delete [] memberData; _data = 0; } @@ -222,24 +221,14 @@ void Object::markObjects(Managed *that, ExecutionEngine *e) { Object *o = static_cast<Object *>(that); - for (uint i = 0; i < o->internalClass->size; ++i) - o->memberData[i].mark(e); + o->memberData.mark(e); if (o->arrayData) o->arrayData->mark(e); } void Object::ensureMemberIndex(uint idx) { - if (idx >= memberDataAlloc) { - int newAlloc = qMax((uint)8, 2*memberDataAlloc); - Value *newMemberData = new Value[newAlloc]; - memcpy(newMemberData, memberData, sizeof(Value)*memberDataAlloc); - memset(newMemberData + memberDataAlloc, 0, sizeof(Value)*(newAlloc - memberDataAlloc)); - memberDataAlloc = newAlloc; - if (memberData != inlineProperties) - delete [] memberData; - memberData = newMemberData; - } + memberData.ensureIndex(engine(), idx); } void Object::insertMember(const StringRef s, const Property &p, PropertyAttributes attributes) |
