aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4arraydata.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2014-01-20 16:01:26 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-23 21:47:27 +0100
commit9fb297a54bd0226b4827b5d7ca093a7f9c4922fa (patch)
treeb53967ff783246a094ccd136f8f8acc2bb511949 /src/qml/jsruntime/qv4arraydata.cpp
parent07429ea2a581dbf25d36e51375918e4cdb0962c9 (diff)
Turn ArrayData into a Managed object
Memory manage ArrayData. Once the ArrayData is moved to be inline inside the object, this will save quite some time for allocating and freeing arrays. Change-Id: I19a520161d41bfe3d83f377af0b41db4ac5b99e4 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4arraydata.cpp')
-rw-r--r--src/qml/jsruntime/qv4arraydata.cpp42
1 files changed, 20 insertions, 22 deletions
diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp
index 933449b96e..a71aa12310 100644
--- a/src/qml/jsruntime/qv4arraydata.cpp
+++ b/src/qml/jsruntime/qv4arraydata.cpp
@@ -46,9 +46,8 @@ using namespace QV4;
const ArrayVTable SimpleArrayData::static_vtbl =
{
+ DEFINE_MANAGED_VTABLE_INT(SimpleArrayData),
SimpleArrayData::Simple,
- SimpleArrayData::destroy,
- SimpleArrayData::markObjects,
SimpleArrayData::reserve,
SimpleArrayData::get,
SimpleArrayData::put,
@@ -64,9 +63,8 @@ const ArrayVTable SimpleArrayData::static_vtbl =
const ArrayVTable SparseArrayData::static_vtbl =
{
+ DEFINE_MANAGED_VTABLE_INT(SparseArrayData),
ArrayData::Sparse,
- SparseArrayData::destroy,
- SparseArrayData::markObjects,
SparseArrayData::reserve,
SparseArrayData::get,
SparseArrayData::put,
@@ -141,20 +139,20 @@ void ArrayData::ensureAttributes()
}
-void SimpleArrayData::destroy(ArrayData *d)
+void SimpleArrayData::destroy(Managed *d)
{
SimpleArrayData *dd = static_cast<SimpleArrayData *>(d);
delete [] (dd->data - dd->offset);
if (dd->attrs)
delete [] (dd->attrs - dd->offset);
- delete dd;
}
-void SimpleArrayData::markObjects(ArrayData *d, ExecutionEngine *e)
+void SimpleArrayData::markObjects(Managed *d, ExecutionEngine *e)
{
- uint l = static_cast<SimpleArrayData *>(d)->len;
+ SimpleArrayData *dd = static_cast<SimpleArrayData *>(d);
+ uint l = dd->len;
for (uint i = 0; i < l; ++i)
- d->data[i].mark(e);
+ dd->data[i].mark(e);
}
ReturnedValue SimpleArrayData::get(const ArrayData *d, uint index)
@@ -298,20 +296,21 @@ void SparseArrayData::free(ArrayData *d, uint idx)
}
-void SparseArrayData::destroy(ArrayData *d)
+void SparseArrayData::destroy(Managed *d)
{
- delete static_cast<SparseArrayData *>(d)->sparse;
- delete [] d->data;
- if (d->attrs)
- delete [] d->attrs;
- delete d;
+ SparseArrayData *dd = static_cast<SparseArrayData *>(d);
+ delete dd->sparse;
+ delete [] dd->data;
+ if (dd->attrs)
+ delete [] dd->attrs;
}
-void SparseArrayData::markObjects(ArrayData *d, ExecutionEngine *e)
+void SparseArrayData::markObjects(Managed *d, ExecutionEngine *e)
{
- uint l = d->alloc;
+ SparseArrayData *dd = static_cast<SparseArrayData *>(d);
+ uint l = dd->alloc;
for (uint i = 0; i < l; ++i)
- d->data[i].mark(e);
+ dd->data[i].mark(e);
}
void SparseArrayData::reserve(ArrayData *d, uint n)
@@ -603,9 +602,9 @@ void ArrayData::sort(ExecutionContext *context, ObjectRef thisObject, const Valu
if (!sparse->sparse->nEntries())
return;
- SimpleArrayData *d = new SimpleArrayData;
+ SimpleArrayData *d = new (context->engine->memoryManager) SimpleArrayData(context->engine);
thisObject->arrayData = d;
- d->vtable->reserve(d, sparse->sparse->nEntries());
+ d->vtable()->reserve(d, sparse->sparse->nEntries());
SparseArrayNode *n = sparse->sparse->begin();
uint i = 0;
@@ -645,8 +644,7 @@ void ArrayData::sort(ExecutionContext *context, ObjectRef thisObject, const Valu
}
}
-
- sparse->ArrayData::destroy();
+ // ### explicitly delete sparse
} else {
SimpleArrayData *d = static_cast<SimpleArrayData *>(thisObject->arrayData);
if (len > d->len)