diff options
author | Lars Knoll <lars.knoll@digia.com> | 2014-05-08 14:35:30 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-07-22 13:49:14 +0200 |
commit | e8746aeaecc4b1cfe312d8ed943ad74bd53f66e2 (patch) | |
tree | f4f391707da4054502b4826eedec5cc80bfe0a1c /src/qml | |
parent | 0732e0177e62590c812f0fea9c32f7d427bd933f (diff) |
Start implement new Object creation pattern
Create objects through a static create() method that returns a pointer
to the objects Data. This will later on simplify breaking the
direct connection between Object and Object::Data.
Change-Id: Id8daa3c766429bc36f432868e1957846147c96b6
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/jsruntime/qv4managed.cpp | 15 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4managed_p.h | 53 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4memberdata_p.h | 10 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object.cpp | 10 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object_p.h | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4scopedvalue_p.h | 16 |
6 files changed, 87 insertions, 23 deletions
diff --git a/src/qml/jsruntime/qv4managed.cpp b/src/qml/jsruntime/qv4managed.cpp index 3b0bdd08e2..5613e65446 100644 --- a/src/qml/jsruntime/qv4managed.cpp +++ b/src/qml/jsruntime/qv4managed.cpp @@ -164,7 +164,22 @@ void Managed::setVTable(const ManagedVTable *vt) d()->internalClass = internalClass()->changeVTable(vt); } +void Managed::Data::setVTable(const ManagedVTable *vt) +{ + Q_ASSERT(internalClass); + internalClass = internalClass->changeVTable(vt); +} + + bool Managed::isEqualTo(Managed *, Managed *) { return false; } + + +void *Managed::Data::operator new(size_t size, ExecutionEngine *e) +{ + assert(e); + + return e->memoryManager->allocManaged(size); +} diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h index c70b717b0f..729e835bb3 100644 --- a/src/qml/jsruntime/qv4managed_p.h +++ b/src/qml/jsruntime/qv4managed_p.h @@ -176,26 +176,41 @@ const QV4::ObjectVTable classname::static_vtbl = \ advanceIterator \ } +struct HeapObject { + +}; + struct Q_QML_PRIVATE_EXPORT Managed { - struct Data { + struct Data : HeapObject { + Data() {} + Data(InternalClass *internal) + : internalClass(internal) + , inUse(1) + , extensible(1) + { + // #### +// Q_ASSERT(internal && internal->vtable); + } InternalClass *internalClass; - union { - uint _data; - struct { - uchar markBit : 1; - uchar inUse : 1; - uchar extensible : 1; // used by Object - uchar _unused : 1; - uchar needsActivation : 1; // used by FunctionObject - uchar strictMode : 1; // used by FunctionObject - uchar bindingKeyFlag : 1; - uchar hasAccessorProperty : 1; - uchar _type; - mutable uchar subtype; - uchar _flags; - }; + struct { + uchar markBit : 1; + uchar inUse : 1; + uchar extensible : 1; // used by Object + uchar _unused : 1; + uchar needsActivation : 1; // used by FunctionObject + uchar strictMode : 1; // used by FunctionObject + uchar bindingKeyFlag : 1; + uchar hasAccessorProperty : 1; + uchar _type; + mutable uchar subtype; + uchar _flags; }; + + void setVTable(const ManagedVTable *vt); + + void *operator new(size_t size, ExecutionEngine *e); + void *operator new(size_t, Managed *m) { return m; } }; Data data; V4_MANAGED @@ -214,12 +229,8 @@ private: protected: Managed(InternalClass *internal) + : data(internal) { - Q_ASSERT(internal && internal->vtable); - d()->internalClass = internal; - d()->_data = 0; - d()->inUse = 1; - d()->extensible = 1; } public: diff --git a/src/qml/jsruntime/qv4memberdata_p.h b/src/qml/jsruntime/qv4memberdata_p.h index 41e026077d..f5f2305745 100644 --- a/src/qml/jsruntime/qv4memberdata_p.h +++ b/src/qml/jsruntime/qv4memberdata_p.h @@ -51,11 +51,17 @@ namespace QV4 { struct MemberData : Managed { struct Data : Managed::Data { - uint size; + union { + uint size; + double _dummy; + }; Value data[1]; }; struct { - uint size; + union { + uint size; + double _dummy; + }; Value data[1]; } __data; diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp index a9218cad35..9abfb252ce 100644 --- a/src/qml/jsruntime/qv4object.cpp +++ b/src/qml/jsruntime/qv4object.cpp @@ -70,6 +70,16 @@ using namespace QV4; DEFINE_OBJECT_VTABLE(Object); +Object::Data::Data(InternalClass *internalClass) + : Managed::Data(internalClass) +{ + if (internalClass->size) { + Scope scope(internalClass->engine); + ScopedObject o(scope, this); + o->memberData().ensureIndex(internalClass->engine, internalClass->size); + } +} + Object::Object(ExecutionEngine *engine) : Managed(engine->objectClass) { diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h index 19105b18d3..4ba27ccece 100644 --- a/src/qml/jsruntime/qv4object_p.h +++ b/src/qml/jsruntime/qv4object_p.h @@ -104,6 +104,12 @@ struct URIErrorPrototype; struct Q_QML_EXPORT Object: Managed { struct Data : Managed::Data { + Data(ExecutionEngine *engine) + : Managed::Data(engine->objectClass) + { + } + Data(InternalClass *internal = 0); + Members memberData; ArrayData *arrayData; }; diff --git a/src/qml/jsruntime/qv4scopedvalue_p.h b/src/qml/jsruntime/qv4scopedvalue_p.h index dfaa7e68bc..5a7852f49b 100644 --- a/src/qml/jsruntime/qv4scopedvalue_p.h +++ b/src/qml/jsruntime/qv4scopedvalue_p.h @@ -215,6 +215,16 @@ struct Scoped ++scope.size; #endif } + Scoped(const Scope &scope, HeapObject *o) + { + Value v; + v.m = reinterpret_cast<Managed *>(o); + ptr = scope.engine->jsStackTop++; + setPointer(value_cast<T>(v)); +#ifndef QT_NO_DEBUG + ++scope.size; +#endif + } Scoped(const Scope &scope, const ScopedValue &v) { ptr = scope.engine->jsStackTop++; @@ -280,6 +290,12 @@ struct Scoped #endif } + Scoped<T> &operator=(HeapObject *o) { + Value v; + v.m = reinterpret_cast<Managed *>(o); + setPointer(value_cast<T>(v)); + return *this; + } Scoped<T> &operator=(const Value &v) { setPointer(value_cast<T>(v)); return *this; |