From a7ffd048cc8ab49fdf13fa2a943b6f134ce157e8 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Sat, 1 Nov 2014 23:59:06 +0100 Subject: [PATCH] Move Data for Number/Boolean/ArrayObject into the Heap Change-Id: Ifc1c38b00f1b6b11e69caeb195429e2dd4c05d4f Reviewed-by: Simon Hausmann --- src/qml/jsruntime/qv4lookup.cpp | 2 +- src/qml/jsruntime/qv4object.cpp | 22 ++++----- src/qml/jsruntime/qv4object_p.h | 91 +++++++++++++++++++---------------- src/qml/jsruntime/qv4regexpobject_p.h | 2 +- 4 files changed, 62 insertions(+), 55 deletions(-) diff --git a/src/qml/jsruntime/qv4lookup.cpp b/src/qml/jsruntime/qv4lookup.cpp index d14898d..258f03c 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 365525b..b0737a0 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(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(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 4a6e3b6..5f2a224 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 8cbe9e1..481bd58 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 }; -- 2.7.4