aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4object.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2014-03-31 15:48:02 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-04-04 17:26:20 +0200
commit8e556778c8324c61ddf5842e457c873c1b5aac02 (patch)
treeca9dd1cd85510fdbd01221005cb0c096a844a762 /src/qml/jsruntime/qv4object.cpp
parentb02eeeee586abe343b8866385c1327ac009b3ef0 (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.cpp27
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)