aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2014-05-08 14:35:30 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2014-07-22 13:49:14 +0200
commite8746aeaecc4b1cfe312d8ed943ad74bd53f66e2 (patch)
treef4f391707da4054502b4826eedec5cc80bfe0a1c /src/qml
parent0732e0177e62590c812f0fea9c32f7d427bd933f (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.cpp15
-rw-r--r--src/qml/jsruntime/qv4managed_p.h53
-rw-r--r--src/qml/jsruntime/qv4memberdata_p.h10
-rw-r--r--src/qml/jsruntime/qv4object.cpp10
-rw-r--r--src/qml/jsruntime/qv4object_p.h6
-rw-r--r--src/qml/jsruntime/qv4scopedvalue_p.h16
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;