From d7e535e99babae46d01311059f5ef6080dc90751 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Thu, 27 Aug 2015 22:32:38 +0200 Subject: Convert variant object and ObjectProto Change-Id: I5ee3b453b74f5832997aca68d04979302f9afac5 Reviewed-by: Simon Hausmann --- src/qml/jsruntime/qv4engine.cpp | 10 ++++------ src/qml/jsruntime/qv4errorobject.cpp | 1 - src/qml/jsruntime/qv4variantobject.cpp | 9 ++++++--- src/qml/jsruntime/qv4variantobject_p.h | 6 ++---- src/qml/memory/qv4mm_p.h | 13 +++++++++++++ 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index d881474bbc..19a4467ca8 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -298,7 +298,7 @@ ExecutionEngine::ExecutionEngine(EvalISelFactory *factory) jsStrings[String_buffer] = newIdentifier(QStringLiteral("buffer")); jsStrings[String_lastIndex] = newIdentifier(QStringLiteral("lastIndex")); - jsObjects[ObjectProto] = memoryManager->alloc(emptyClass, (QV4::Object *)0); + jsObjects[ObjectProto] = memoryManager->allocObject(emptyClass); arrayClass = emptyClass->addMember(id_length(), Attr_NotConfigurable|Attr_NotEnumerable); jsObjects[ArrayProto] = memoryManager->allocObject(arrayClass, objectPrototype()); @@ -359,10 +359,10 @@ ExecutionEngine::ExecutionEngine(EvalISelFactory *factory) jsObjects[TypeErrorProto] = memoryManager->alloc(emptyClass, errorPrototype()); jsObjects[URIErrorProto] = memoryManager->alloc(emptyClass, errorPrototype()); - jsObjects[VariantProto] = memoryManager->alloc(emptyClass, objectPrototype()); + jsObjects[VariantProto] = memoryManager->allocObject(emptyClass, objectPrototype()); Q_ASSERT(variantPrototype()->prototype() == objectPrototype()->d()); - jsObjects[SequenceProto] = ScopedValue(scope, memoryManager->alloc(arrayClass, arrayPrototype())); + jsObjects[SequenceProto] = ScopedValue(scope, memoryManager->allocObject(arrayClass, arrayPrototype())); ExecutionContext *global = rootContext(); jsObjects[Object_Ctor] = memoryManager->alloc(global); @@ -723,9 +723,7 @@ Heap::Object *ExecutionEngine::newURIErrorObject(const Value &message) Heap::Object *ExecutionEngine::newVariantObject(const QVariant &v) { - Scope scope(this); - ScopedObject o(scope, memoryManager->alloc(this, v)); - return o->d(); + return memoryManager->allocObject(emptyClass, variantPrototype(), v); } Heap::Object *ExecutionEngine::newForEachIteratorObject(Object *o) diff --git a/src/qml/jsruntime/qv4errorobject.cpp b/src/qml/jsruntime/qv4errorobject.cpp index a6c2a25b91..f052efe03e 100644 --- a/src/qml/jsruntime/qv4errorobject.cpp +++ b/src/qml/jsruntime/qv4errorobject.cpp @@ -63,7 +63,6 @@ using namespace QV4; Heap::ErrorObject::ErrorObject(InternalClass *ic, QV4::Object *prototype) : Heap::Object(ic, prototype) - , stack(Q_NULLPTR) { Scope scope(ic->engine); Scoped e(scope, this); diff --git a/src/qml/jsruntime/qv4variantobject.cpp b/src/qml/jsruntime/qv4variantobject.cpp index f9e26efe71..4609373cc9 100644 --- a/src/qml/jsruntime/qv4variantobject.cpp +++ b/src/qml/jsruntime/qv4variantobject.cpp @@ -43,12 +43,15 @@ using namespace QV4; DEFINE_OBJECT_VTABLE(VariantObject); -Heap::VariantObject::VariantObject(QV4::ExecutionEngine *engine, const QVariant &value) - : Heap::Object(engine->emptyClass, engine->variantPrototype()) +Heap::VariantObject::VariantObject() +{ +} + +Heap::VariantObject::VariantObject(const QVariant &value) { data = value; if (isScarce()) - engine->scarceResources.insert(this); + internalClass->engine->scarceResources.insert(this); } bool VariantObject::Data::isScarce() const diff --git a/src/qml/jsruntime/qv4variantobject_p.h b/src/qml/jsruntime/qv4variantobject_p.h index b19f12bb98..40a45f8eb5 100644 --- a/src/qml/jsruntime/qv4variantobject_p.h +++ b/src/qml/jsruntime/qv4variantobject_p.h @@ -60,10 +60,8 @@ namespace Heap { struct VariantObject : Object, public ExecutionEngine::ScarceResourceData { - VariantObject(InternalClass *ic, QV4::Object *prototype) - : Object(ic, prototype) - {} - VariantObject(QV4::ExecutionEngine *engine, const QVariant &value); + VariantObject(); + VariantObject(const QVariant &value); ~VariantObject() { if (isScarce()) node.remove(); diff --git a/src/qml/memory/qv4mm_p.h b/src/qml/memory/qv4mm_p.h index 6b6b502b95..d2071766e8 100644 --- a/src/qml/memory/qv4mm_p.h +++ b/src/qml/memory/qv4mm_p.h @@ -101,6 +101,19 @@ public: return t->d(); } + template + typename ObjectType::Data *allocObject(InternalClass *ic) + { + Scope scope(engine()); + const int size = (sizeof(typename ObjectType::Data) + (sizeof(Value) - 1)) & ~(sizeof(Value) - 1); + Scoped t(scope, allocManaged(size + ic->size*sizeof(Value))); + t->d()->internalClass = ic; + t->d()->inlineMemberSize = ic->size; + t->d()->inlineMemberOffset = size/sizeof(Value); + (void)new (t->d()) typename ObjectType::Data(); + return t->d(); + } + template typename ObjectType::Data *allocObject(InternalClass *ic, Object *prototype) { -- cgit v1.2.3