aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2014-11-01 23:59:06 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2014-11-08 16:39:45 +0100
commita7ffd048cc8ab49fdf13fa2a943b6f134ce157e8 (patch)
tree0e1332f130deabfdcf1dba7ec9617dbff7c637f0 /src
parentc2da8abde56d2010d3e7cb234570079f06d8a441 (diff)
Move Data for Number/Boolean/ArrayObject into the Heap
Change-Id: Ifc1c38b00f1b6b11e69caeb195429e2dd4c05d4f Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/qml/jsruntime/qv4lookup.cpp2
-rw-r--r--src/qml/jsruntime/qv4object.cpp22
-rw-r--r--src/qml/jsruntime/qv4object_p.h91
-rw-r--r--src/qml/jsruntime/qv4regexpobject_p.h2
4 files changed, 62 insertions, 55 deletions
diff --git a/src/qml/jsruntime/qv4lookup.cpp b/src/qml/jsruntime/qv4lookup.cpp
index d14898d8f7..258f03c1ec 100644
--- a/src/qml/jsruntime/qv4lookup.cpp
+++ b/src/qml/jsruntime/qv4lookup.cpp
@@ -565,7 +565,7 @@ ReturnedValue Lookup::stringLengthGetter(Lookup *l, const ValueRef object)
ReturnedValue Lookup::arrayLengthGetter(Lookup *l, const ValueRef object)
{
if (ArrayObject *a = object->asArrayObject())
- return a->memberData()->data()[ArrayObject::LengthPropertyIndex].asReturnedValue();
+ return a->memberData()->data()[Heap::ArrayObject::LengthPropertyIndex].asReturnedValue();
l->getter = getterGeneric;
return getterGeneric(l, object);
diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp
index 365525b089..b0737a0dcd 100644
--- a/src/qml/jsruntime/qv4object.cpp
+++ b/src/qml/jsruntime/qv4object.cpp
@@ -461,7 +461,7 @@ void Object::setLookup(Managed *m, Lookup *l, const ValueRef value)
InternalClass *c = o->internalClass();
uint idx = c->find(l->name);
- if (!o->isArrayObject() || idx != ArrayObject::LengthPropertyIndex) {
+ if (!o->isArrayObject() || idx != Heap::ArrayObject::LengthPropertyIndex) {
if (idx != UINT_MAX && o->internalClass()->propertyData[idx].isData() && o->internalClass()->propertyData[idx].isWritable()) {
l->classList[0] = o->internalClass();
l->index = idx;
@@ -841,9 +841,9 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, String *name, const Pr
uint memberIndex;
if (isArrayObject() && name->equals(ctx->d()->engine->id_length)) {
- assert(ArrayObject::LengthPropertyIndex == internalClass()->find(ctx->d()->engine->id_length));
- Property *lp = propertyAt(ArrayObject::LengthPropertyIndex);
- cattrs = internalClass()->propertyData.constData() + ArrayObject::LengthPropertyIndex;
+ assert(Heap::ArrayObject::LengthPropertyIndex == internalClass()->find(ctx->d()->engine->id_length));
+ Property *lp = propertyAt(Heap::ArrayObject::LengthPropertyIndex);
+ cattrs = internalClass()->propertyData.constData() + Heap::ArrayObject::LengthPropertyIndex;
if (attrs.isEmpty() || p.isSubset(attrs, *lp, *cattrs))
return true;
if (!cattrs->isWritable() || attrs.type() == PropertyAttributes::Accessor || attrs.isConfigurable() || attrs.isEnumerable())
@@ -895,7 +895,7 @@ reject:
bool Object::__defineOwnProperty__(ExecutionContext *ctx, uint index, const Property &p, PropertyAttributes attrs)
{
// 15.4.5.1, 4b
- if (isArrayObject() && index >= getLength() && !internalClass()->propertyData[ArrayObject::LengthPropertyIndex].isWritable())
+ if (isArrayObject() && index >= getLength() && !internalClass()->propertyData[Heap::ArrayObject::LengthPropertyIndex].isWritable())
goto reject;
if (ArgumentsObject::isNonStrictArgumentsObject(this))
@@ -1097,7 +1097,7 @@ uint Object::getLength(const Managed *m)
bool Object::setArrayLength(uint newLen)
{
Q_ASSERT(isArrayObject());
- if (!internalClass()->propertyData[ArrayObject::LengthPropertyIndex].isWritable())
+ if (!internalClass()->propertyData[Heap::ArrayObject::LengthPropertyIndex].isWritable())
return false;
uint oldLen = getLength();
bool ok = true;
@@ -1129,7 +1129,7 @@ void Object::initSparseArray()
DEFINE_OBJECT_VTABLE(ArrayObject);
-ArrayObject::Data::Data(ExecutionEngine *engine, const QStringList &list)
+Heap::ArrayObject::ArrayObject(ExecutionEngine *engine, const QStringList &list)
: Heap::Object(engine->arrayClass)
{
init();
@@ -1154,7 +1154,7 @@ ReturnedValue ArrayObject::getLookup(Managed *m, Lookup *l)
// special case, as the property is on the object itself
l->getter = Lookup::arrayLengthGetter;
ArrayObject *a = static_cast<ArrayObject *>(m);
- return a->memberData()->data()[ArrayObject::LengthPropertyIndex].asReturnedValue();
+ return a->memberData()->data()[Heap::ArrayObject::LengthPropertyIndex].asReturnedValue();
}
return Object::getLookup(m, l);
}
@@ -1162,9 +1162,9 @@ ReturnedValue ArrayObject::getLookup(Managed *m, Lookup *l)
uint ArrayObject::getLength(const Managed *m)
{
const ArrayObject *a = static_cast<const ArrayObject *>(m);
- if (a->memberData()->data()[ArrayObject::LengthPropertyIndex].isInteger())
- return a->memberData()->data()[ArrayObject::LengthPropertyIndex].integerValue();
- return Primitive::toUInt32(a->memberData()->data()[ArrayObject::LengthPropertyIndex].doubleValue());
+ if (a->memberData()->data()[Heap::ArrayObject::LengthPropertyIndex].isInteger())
+ return a->memberData()->data()[Heap::ArrayObject::LengthPropertyIndex].integerValue();
+ return Primitive::toUInt32(a->memberData()->data()[Heap::ArrayObject::LengthPropertyIndex].doubleValue());
}
QStringList ArrayObject::toQStringList() const
diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h
index 4a6e3b6c66..5f2a224d59 100644
--- a/src/qml/jsruntime/qv4object_p.h
+++ b/src/qml/jsruntime/qv4object_p.h
@@ -54,6 +54,38 @@ struct Object : Base {
ArrayData *arrayData;
};
+struct BooleanObject : Object {
+ BooleanObject(ExecutionEngine *engine, const ValueRef val)
+ : Object(engine->booleanClass)
+ {
+ value = val;
+ }
+ inline BooleanObject(InternalClass *ic);
+ Value value;
+};
+
+struct NumberObject : Object {
+ NumberObject(ExecutionEngine *engine, const ValueRef val)
+ : Object(engine->numberClass) {
+ value = val;
+ }
+ inline NumberObject(InternalClass *ic);
+ Value value;
+};
+
+struct ArrayObject : Object {
+ enum {
+ LengthPropertyIndex = 0
+ };
+
+ ArrayObject(ExecutionEngine *engine) : Heap::Object(engine->arrayClass) { init(); }
+ ArrayObject(ExecutionEngine *engine, const QStringList &list);
+ ArrayObject(InternalClass *ic) : Heap::Object(ic) { init(); }
+ void init()
+ { memberData->data[LengthPropertyIndex] = Primitive::fromInt32(0); }
+};
+
+
}
struct Q_QML_EXPORT Object: Managed {
@@ -264,61 +296,36 @@ private:
};
struct BooleanObject: Object {
- struct Data : Heap::Object {
- Data(ExecutionEngine *engine, const ValueRef val)
- : Heap::Object(engine->booleanClass)
- {
- value = val;
- }
- Data(InternalClass *ic)
- : Heap::Object(ic)
- {
- Q_ASSERT(internalClass->vtable == staticVTable());
- value = Encode(false);
- }
- Value value;
- };
- V4_OBJECT(Object)
+ V4_OBJECT2(BooleanObject, Object)
Q_MANAGED_TYPE(BooleanObject)
Value value() const { return d()->value; }
};
+Heap::BooleanObject::BooleanObject(InternalClass *ic)
+ : Heap::Object(ic)
+{
+ Q_ASSERT(internalClass->vtable == QV4::BooleanObject::staticVTable());
+ value = Encode(false);
+}
+
struct NumberObject: Object {
- struct Data : Heap::Object {
- Data(ExecutionEngine *engine, const ValueRef val)
- : Heap::Object(engine->numberClass) {
- value = val;
- }
- Data(InternalClass *ic)
- : Heap::Object(ic) {
- Q_ASSERT(internalClass->vtable == staticVTable());
- value = Encode((int)0);
- }
- Value value;
- };
- V4_OBJECT(Object)
+ V4_OBJECT2(NumberObject, Object)
Q_MANAGED_TYPE(NumberObject)
Value value() const { return d()->value; }
-
};
-struct ArrayObject: Object {
- struct Data : Heap::Object {
- Data(ExecutionEngine *engine) : Heap::Object(engine->arrayClass) { init(); }
- Data(ExecutionEngine *engine, const QStringList &list);
- Data(InternalClass *ic) : Heap::Object(ic) { init(); }
- void init()
- { memberData->data[LengthPropertyIndex] = Primitive::fromInt32(0); }
- };
+Heap::NumberObject::NumberObject(InternalClass *ic)
+ : Heap::Object(ic) {
+ Q_ASSERT(internalClass->vtable == QV4::NumberObject::staticVTable());
+ value = Encode((int)0);
+}
- V4_OBJECT(Object)
+struct ArrayObject: Object {
+ V4_OBJECT2(ArrayObject, Object)
Q_MANAGED_TYPE(ArrayObject)
- enum {
- LengthPropertyIndex = 0
- };
void init(ExecutionEngine *engine);
@@ -332,7 +339,7 @@ struct ArrayObject: Object {
inline void Object::setArrayLengthUnchecked(uint l)
{
if (isArrayObject())
- memberData()->data()[ArrayObject::LengthPropertyIndex] = Primitive::fromUInt32(l);
+ memberData()->data()[Heap::ArrayObject::LengthPropertyIndex] = Primitive::fromUInt32(l);
}
inline void Object::push_back(const ValueRef v)
diff --git a/src/qml/jsruntime/qv4regexpobject_p.h b/src/qml/jsruntime/qv4regexpobject_p.h
index 8cbe9e11bb..481bd58bcd 100644
--- a/src/qml/jsruntime/qv4regexpobject_p.h
+++ b/src/qml/jsruntime/qv4regexpobject_p.h
@@ -75,7 +75,7 @@ struct RegExpObject: Object {
};
enum {
- Index_ArrayIndex = ArrayObject::LengthPropertyIndex + 1,
+ Index_ArrayIndex = Heap::ArrayObject::LengthPropertyIndex + 1,
Index_ArrayInput = Index_ArrayIndex + 1
};