aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2014-11-20 17:46:46 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2014-12-11 08:40:35 +0100
commit254cf16ed4c6007a59a7cd5d64bb621430b3c01d (patch)
tree7330fcef5dbd63ba2809d4e8fd3449a673c327f9 /src/qml/jsruntime
parent7cfc07ae1bf4ccbec109f52195ef824a3ea4dc21 (diff)
Fix Object::arrayData() accessor to return a heap object
Change-Id: Iffc82c2f415251d73bb7446848399b54b16589c9 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r--src/qml/jsruntime/qv4arraydata.cpp41
-rw-r--r--src/qml/jsruntime/qv4arraydata_p.h20
-rw-r--r--src/qml/jsruntime/qv4arrayobject.cpp8
-rw-r--r--src/qml/jsruntime/qv4functionobject.cpp4
-rw-r--r--src/qml/jsruntime/qv4object_p.h3
-rw-r--r--src/qml/jsruntime/qv4objectproto.cpp20
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp6
7 files changed, 52 insertions, 50 deletions
diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp
index a4f11b2b5a..59ba6c4b03 100644
--- a/src/qml/jsruntime/qv4arraydata.cpp
+++ b/src/qml/jsruntime/qv4arraydata.cpp
@@ -197,7 +197,7 @@ void ArrayData::realloc(Object *o, Type newType, uint requested, bool enforceAtt
// ### Could explicitly free the old data
}
-ArrayData *SimpleArrayData::reallocate(Object *o, uint n, bool enforceAttributes)
+Heap::ArrayData *SimpleArrayData::reallocate(Object *o, uint n, bool enforceAttributes)
{
realloc(o, Heap::ArrayData::Simple, n, enforceAttributes);
return o->arrayData();
@@ -205,7 +205,7 @@ ArrayData *SimpleArrayData::reallocate(Object *o, uint n, bool enforceAttributes
void ArrayData::ensureAttributes(Object *o)
{
- if (o->arrayData() && o->arrayData()->attrs())
+ if (o->arrayData() && o->arrayData()->attrs)
return;
ArrayData::realloc(o, Heap::ArrayData::Simple, 0, true);
@@ -261,7 +261,7 @@ bool SimpleArrayData::del(Object *o, uint index)
void SimpleArrayData::setAttribute(Object *o, uint index, PropertyAttributes attrs)
{
- o->arrayData()->attrs()[index] = attrs;
+ o->arrayData()->attrs[index] = attrs;
}
void SimpleArrayData::push_front(Object *o, Value *values, uint n)
@@ -311,9 +311,9 @@ uint SimpleArrayData::truncate(Object *o, uint newLen)
return dd->len;
}
-uint SimpleArrayData::length(const ArrayData *d)
+uint SimpleArrayData::length(const Heap::ArrayData *d)
{
- return static_cast<const SimpleArrayData *>(d)->len();
+ return d->len;
}
bool SimpleArrayData::putArray(Object *o, uint index, Value *values, uint n)
@@ -331,24 +331,23 @@ bool SimpleArrayData::putArray(Object *o, uint index, Value *values, uint n)
return true;
}
-void SparseArrayData::free(ArrayData *d, uint idx)
+void SparseArrayData::free(Heap::ArrayData *d, uint idx)
{
- Q_ASSERT(d && d->type() == Heap::ArrayData::Sparse);
- SparseArrayData *dd = static_cast<SparseArrayData *>(d);
- Value *v = dd->arrayData() + idx;
- if (dd->attrs() && dd->attrs()[idx].isAccessor()) {
+ Q_ASSERT(d && d->type == Heap::ArrayData::Sparse);
+ Value *v = d->arrayData + idx;
+ if (d->attrs && d->attrs[idx].isAccessor()) {
// double slot, free both. Order is important, so we have a double slot for allocation again afterwards.
v[1].tag = Value::Empty_Type;
- v[1].uint_32 = dd->freeList();
+ v[1].uint_32 = d->freeList;
v[0].tag = Value::Empty_Type;
v[0].uint_32 = idx + 1;
} else {
v->tag = Value::Empty_Type;
- v->uint_32 = dd->freeList();
+ v->uint_32 = d->freeList;
}
- dd->freeList() = idx;
- if (dd->attrs())
- dd->attrs()[idx].clear();
+ d->freeList = idx;
+ if (d->attrs)
+ d->attrs[idx].clear();
}
@@ -360,7 +359,7 @@ void SparseArrayData::markObjects(Heap::Base *d, ExecutionEngine *e)
dd->arrayData[i].mark(e);
}
-ArrayData *SparseArrayData::reallocate(Object *o, uint n, bool enforceAttributes)
+Heap::ArrayData *SparseArrayData::reallocate(Object *o, uint n, bool enforceAttributes)
{
realloc(o, Heap::ArrayData::Sparse, n, enforceAttributes);
return o->arrayData();
@@ -536,12 +535,12 @@ uint SparseArrayData::truncate(Object *o, uint newLen)
return newLen;
}
-uint SparseArrayData::length(const ArrayData *d)
+uint SparseArrayData::length(const Heap::ArrayData *d)
{
- const SparseArrayData *dd = static_cast<const SparseArrayData *>(d);
- if (!dd->sparse())
+ const Heap::SparseArrayData *dd = static_cast<const Heap::SparseArrayData *>(d);
+ if (!dd->sparse)
return 0;
- SparseArrayNode *n = dd->sparse()->end();
+ SparseArrayNode *n = dd->sparse->end();
n = n->previousNode();
return n ? n->key() + 1 : 0;
}
@@ -815,7 +814,7 @@ void ArrayData::sort(ExecutionEngine *engine, Object *thisObject, const ValueRef
ArrayElementLessThan lessThan(engine, thisObject, comparefn);
- Value *begin = thisObject->arrayData()->d()->arrayData;
+ Value *begin = thisObject->arrayData()->arrayData;
sortHelper(begin, begin + len, *begin, lessThan);
#ifdef CHECK_SPARSE_ARRAYS
diff --git a/src/qml/jsruntime/qv4arraydata_p.h b/src/qml/jsruntime/qv4arraydata_p.h
index d07f4e0708..1d2eb48a43 100644
--- a/src/qml/jsruntime/qv4arraydata_p.h
+++ b/src/qml/jsruntime/qv4arraydata_p.h
@@ -58,7 +58,7 @@ struct ArrayVTable
{
ManagedVTable managedVTable;
uint type;
- ArrayData *(*reallocate)(Object *o, uint n, bool enforceAttributes);
+ Heap::ArrayData *(*reallocate)(Object *o, uint n, bool enforceAttributes);
ReturnedValue (*get)(const Heap::ArrayData *d, uint index);
bool (*put)(Object *o, uint index, ValueRef value);
bool (*putArray)(Object *o, uint index, Value *values, uint n);
@@ -67,7 +67,7 @@ struct ArrayVTable
void (*push_front)(Object *o, Value *values, uint n);
ReturnedValue (*pop_front)(Object *o);
uint (*truncate)(Object *o, uint newLen);
- uint (*length)(const ArrayData *d);
+ uint (*length)(const Heap::ArrayData *d);
};
namespace Heap {
@@ -110,6 +110,10 @@ struct ArrayData : public Base {
return get(i) == Primitive::emptyValue().asReturnedValue();
}
+ inline ReturnedValue length() const {
+ return vtable()->length(this);
+ }
+
};
struct SimpleArrayData : public ArrayData {
@@ -182,7 +186,7 @@ struct Q_QML_EXPORT ArrayData : public Managed
bool isSparse() const { return type() == Heap::ArrayData::Sparse; }
uint length() const {
- return vtable()->length(this);
+ return d()->length();
}
bool hasAttributes() const {
@@ -222,7 +226,7 @@ struct Q_QML_EXPORT SimpleArrayData : public ArrayData
uint &len() { return d()->len; }
uint len() const { return d()->len; }
- static ArrayData *reallocate(Object *o, uint n, bool enforceAttributes);
+ static Heap::ArrayData *reallocate(Object *o, uint n, bool enforceAttributes);
static void markObjects(Heap::Base *d, ExecutionEngine *e);
@@ -234,7 +238,7 @@ struct Q_QML_EXPORT SimpleArrayData : public ArrayData
static void push_front(Object *o, Value *values, uint n);
static ReturnedValue pop_front(Object *o);
static uint truncate(Object *o, uint newLen);
- static uint length(const ArrayData *d);
+ static uint length(const Heap::ArrayData *d);
};
struct Q_QML_EXPORT SparseArrayData : public ArrayData
@@ -248,13 +252,13 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData
void setSparse(SparseArray *s) { d()->sparse = s; }
static uint allocate(Object *o, bool doubleSlot = false);
- static void free(ArrayData *d, uint idx);
+ static void free(Heap::ArrayData *d, uint idx);
uint mappedIndex(uint index) const { return d()->mappedIndex(index); }
static void markObjects(Heap::Base *d, ExecutionEngine *e);
- static ArrayData *reallocate(Object *o, uint n, bool enforceAttributes);
+ static Heap::ArrayData *reallocate(Object *o, uint n, bool enforceAttributes);
static ReturnedValue get(const Heap::ArrayData *d, uint index);
static bool put(Object *o, uint index, ValueRef value);
static bool putArray(Object *o, uint index, Value *values, uint n);
@@ -263,7 +267,7 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData
static void push_front(Object *o, Value *values, uint n);
static ReturnedValue pop_front(Object *o);
static uint truncate(Object *o, uint newLen);
- static uint length(const ArrayData *d);
+ static uint length(const Heap::ArrayData *d);
};
namespace Heap {
diff --git a/src/qml/jsruntime/qv4arrayobject.cpp b/src/qml/jsruntime/qv4arrayobject.cpp
index 09cd52d060..ec79d0b47d 100644
--- a/src/qml/jsruntime/qv4arrayobject.cpp
+++ b/src/qml/jsruntime/qv4arrayobject.cpp
@@ -293,7 +293,7 @@ ReturnedValue ArrayPrototype::method_push(CallContext *ctx)
if (!ctx->d()->callData->argc)
;
- else if (!instance->protoHasArray() && instance->arrayData()->length() <= len && instance->arrayData()->type() == Heap::ArrayData::Simple) {
+ else if (!instance->protoHasArray() && instance->arrayData()->length() <= len && instance->arrayData()->type == Heap::ArrayData::Simple) {
instance->arrayData()->vtable()->putArray(instance.getPointer(), len, ctx->d()->callData->args, ctx->d()->callData->argc);
len = instance->arrayData()->length();
} else {
@@ -361,7 +361,7 @@ ReturnedValue ArrayPrototype::method_shift(CallContext *ctx)
ScopedValue result(scope);
- if (!instance->protoHasArray() && !instance->arrayData()->attrs() && instance->arrayData()->length() <= len && instance->arrayData()->type() != Heap::ArrayData::Custom) {
+ if (!instance->protoHasArray() && !instance->arrayData()->attrs && instance->arrayData()->length() <= len && instance->arrayData()->type != Heap::ArrayData::Custom) {
result = instance->arrayData()->vtable()->pop_front(instance.getPointer());
} else {
result = instance->getIndexed(0);
@@ -541,8 +541,8 @@ ReturnedValue ArrayPrototype::method_unshift(CallContext *ctx)
uint len = instance->getLength();
- if (!instance->protoHasArray() && !instance->arrayData()->attrs() && instance->arrayData()->length() <= len &&
- instance->arrayData()->type() != Heap::ArrayData::Custom) {
+ if (!instance->protoHasArray() && !instance->arrayData()->attrs && instance->arrayData()->length() <= len &&
+ instance->arrayData()->type != Heap::ArrayData::Custom) {
instance->arrayData()->vtable()->push_front(instance.getPointer(), ctx->d()->callData->args, ctx->d()->callData->argc);
} else {
ScopedValue v(scope);
diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp
index ea82923cc5..8833d675d5 100644
--- a/src/qml/jsruntime/qv4functionobject.cpp
+++ b/src/qml/jsruntime/qv4functionobject.cpp
@@ -326,11 +326,11 @@ ReturnedValue FunctionPrototype::method_apply(CallContext *ctx)
for (quint32 i = 0; i < len; ++i)
callData->args[i] = arr->getIndexed(i);
} else {
- uint alen = arr->arrayData() ? arr->arrayData()->length() : 0;
+ uint alen = arr->arrayData() ? arr->arrayData()->len : 0;
if (alen > len)
alen = len;
for (uint i = 0; i < alen; ++i)
- callData->args[i] = static_cast<SimpleArrayData *>(arr->arrayData())->data(i);
+ callData->args[i] = static_cast<Heap::SimpleArrayData *>(arr->arrayData())->data(i);
for (quint32 i = alen; i < len; ++i)
callData->args[i] = Primitive::undefinedValue();
}
diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h
index 2fd0901d6f..379ff2fde6 100644
--- a/src/qml/jsruntime/qv4object_p.h
+++ b/src/qml/jsruntime/qv4object_p.h
@@ -98,8 +98,7 @@ struct Q_QML_EXPORT Object: Managed {
Heap::MemberData *memberData() { return d()->memberData; }
const Heap::MemberData *memberData() const { return d()->memberData; }
- // ### GC
- ArrayData *arrayData() const { return reinterpret_cast<ArrayData *>(d()->arrayData); }
+ Heap::ArrayData *arrayData() const { return d()->arrayData; }
void setArrayData(ArrayData *a) { d()->arrayData = a->d(); }
const Property *propertyAt(uint index) const { return reinterpret_cast<const Property *>(memberData()->data + index); }
diff --git a/src/qml/jsruntime/qv4objectproto.cpp b/src/qml/jsruntime/qv4objectproto.cpp
index 585c773c6b..46116cb707 100644
--- a/src/qml/jsruntime/qv4objectproto.cpp
+++ b/src/qml/jsruntime/qv4objectproto.cpp
@@ -250,9 +250,9 @@ ReturnedValue ObjectPrototype::method_seal(CallContext *ctx)
if (o->arrayData()) {
ArrayData::ensureAttributes(o.getPointer());
- for (uint i = 0; i < o->arrayData()->alloc(); ++i) {
+ for (uint i = 0; i < o->d()->arrayData->alloc; ++i) {
if (!o->arrayData()->isEmpty(i))
- o->arrayData()->attrs()[i].setConfigurable(false);
+ o->d()->arrayData->attrs[i].setConfigurable(false);
}
}
@@ -275,11 +275,11 @@ ReturnedValue ObjectPrototype::method_freeze(CallContext *ctx)
if (o->arrayData()) {
ArrayData::ensureAttributes(o.getPointer());
- for (uint i = 0; i < o->arrayData()->alloc(); ++i) {
+ for (uint i = 0; i < o->arrayData()->alloc; ++i) {
if (!o->arrayData()->isEmpty(i))
- o->arrayData()->attrs()[i].setConfigurable(false);
- if (o->arrayData()->attrs()[i].isData())
- o->arrayData()->attrs()[i].setWritable(false);
+ o->arrayData()->attrs[i].setConfigurable(false);
+ if (o->arrayData()->attrs[i].isData())
+ o->arrayData()->attrs[i].setWritable(false);
}
}
return o.asReturnedValue();
@@ -313,10 +313,10 @@ ReturnedValue ObjectPrototype::method_isSealed(CallContext *ctx)
return Encode(true);
Q_ASSERT(o->arrayData() && o->arrayData()->length());
- if (!o->arrayData()->attrs())
+ if (!o->arrayData()->attrs)
return Encode(false);
- for (uint i = 0; i < o->arrayData()->alloc(); ++i) {
+ for (uint i = 0; i < o->arrayData()->alloc; ++i) {
if (!o->arrayData()->isEmpty(i))
if (o->arrayData()->attributes(i).isConfigurable())
return Encode(false);
@@ -342,10 +342,10 @@ ReturnedValue ObjectPrototype::method_isFrozen(CallContext *ctx)
return Encode(true);
Q_ASSERT(o->arrayData() && o->arrayData()->length());
- if (!o->arrayData()->attrs())
+ if (!o->arrayData()->attrs)
return Encode(false);
- for (uint i = 0; i < o->arrayData()->alloc(); ++i) {
+ for (uint i = 0; i < o->arrayData()->alloc; ++i) {
if (!o->arrayData()->isEmpty(i))
if (o->arrayData()->attributes(i).isConfigurable() || o->arrayData()->attributes(i).isWritable())
return Encode(false);
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp
index 2aaf77b218..8436b8d828 100644
--- a/src/qml/jsruntime/qv4runtime.cpp
+++ b/src/qml/jsruntime/qv4runtime.cpp
@@ -589,7 +589,7 @@ ReturnedValue Runtime::getElement(ExecutionEngine *engine, const ValueRef object
}
if (idx < UINT_MAX) {
- if (o->arrayData() && !o->arrayData()->hasAttributes()) {
+ if (o->arrayData() && !o->arrayData()->attrs) {
ScopedValue v(scope, o->arrayData()->get(idx));
if (!v->isEmpty())
return v->asReturnedValue();
@@ -614,8 +614,8 @@ void Runtime::setElement(ExecutionEngine *engine, const ValueRef object, const V
uint idx = index->asArrayIndex();
if (idx < UINT_MAX) {
if (o->arrayType() == Heap::ArrayData::Simple) {
- SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData());
- if (s && idx < s->len() && !s->data(idx).isEmpty()) {
+ Heap::SimpleArrayData *s = static_cast<Heap::SimpleArrayData *>(o->arrayData());
+ if (s && idx < s->len && !s->data(idx).isEmpty()) {
s->data(idx) = value;
return;
}