Begin moving the data out of Managed objects
authorLars Knoll <lars.knoll@theqtcompany.com>
Sat, 1 Nov 2014 22:04:20 +0000 (23:04 +0100)
committerSimon Hausmann <simon.hausmann@digia.com>
Sat, 8 Nov 2014 15:39:07 +0000 (16:39 +0100)
We need to move the Data objects out of the Managed
objects, to avoid lots of trouble because inner classes
can't be forward declared in C++.

Instead move them all into a Heap namespace.

Change-Id: I736af60702b68a1759f4643aa16d64108693dea2
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
55 files changed:
src/qml/jsruntime/qv4argumentsobject.cpp
src/qml/jsruntime/qv4argumentsobject_p.h
src/qml/jsruntime/qv4arraydata.cpp
src/qml/jsruntime/qv4arraydata_p.h
src/qml/jsruntime/qv4arrayobject.cpp
src/qml/jsruntime/qv4context.cpp
src/qml/jsruntime/qv4context_p.h
src/qml/jsruntime/qv4dataview.cpp
src/qml/jsruntime/qv4dataview_p.h
src/qml/jsruntime/qv4engine_p.h
src/qml/jsruntime/qv4errorobject.cpp
src/qml/jsruntime/qv4errorobject_p.h
src/qml/jsruntime/qv4functionobject.cpp
src/qml/jsruntime/qv4functionobject_p.h
src/qml/jsruntime/qv4global_p.h
src/qml/jsruntime/qv4lookup.cpp
src/qml/jsruntime/qv4managed.cpp
src/qml/jsruntime/qv4managed_p.h
src/qml/jsruntime/qv4memberdata.cpp
src/qml/jsruntime/qv4memberdata_p.h
src/qml/jsruntime/qv4mm.cpp
src/qml/jsruntime/qv4object.cpp
src/qml/jsruntime/qv4object_p.h
src/qml/jsruntime/qv4objectiterator.cpp
src/qml/jsruntime/qv4objectiterator_p.h
src/qml/jsruntime/qv4qobjectwrapper.cpp
src/qml/jsruntime/qv4qobjectwrapper_p.h
src/qml/jsruntime/qv4regexp.cpp
src/qml/jsruntime/qv4regexp_p.h
src/qml/jsruntime/qv4regexpobject.cpp
src/qml/jsruntime/qv4regexpobject_p.h
src/qml/jsruntime/qv4runtime.cpp
src/qml/jsruntime/qv4scopedvalue_p.h
src/qml/jsruntime/qv4script.cpp
src/qml/jsruntime/qv4script_p.h
src/qml/jsruntime/qv4sequenceobject.cpp
src/qml/jsruntime/qv4string.cpp
src/qml/jsruntime/qv4string_p.h
src/qml/jsruntime/qv4stringobject.cpp
src/qml/jsruntime/qv4stringobject_p.h
src/qml/jsruntime/qv4typedarray.cpp
src/qml/jsruntime/qv4typedarray_p.h
src/qml/jsruntime/qv4value_inl_p.h
src/qml/jsruntime/qv4value_p.h
src/qml/qml/qqmlcomponent.cpp
src/qml/qml/qqmlcontextwrapper.cpp
src/qml/qml/qqmlcontextwrapper_p.h
src/qml/qml/qqmllistwrapper.cpp
src/qml/qml/qqmlxmlhttprequest.cpp
src/qml/qml/v8/qqmlbuiltinfunctions.cpp
src/qml/qml/v8/qqmlbuiltinfunctions_p.h
src/qml/types/qqmldelegatemodel.cpp
src/quick/items/context2d/qquickcontext2d.cpp
src/quick/items/qquickview.cpp
src/quick/items/qquickview_p.h

index c020e99..209d99f 100644 (file)
@@ -49,7 +49,7 @@ ArgumentsObject::Data::Data(CallContext *context)
     Scope scope(v4);
     Scoped<ArgumentsObject> args(scope, this);
 
-    args->setArrayType(ArrayData::Complex);
+    args->setArrayType(Heap::ArrayData::Complex);
 
     if (context->d()->strictMode) {
         Q_ASSERT(CalleePropertyIndex == args->internalClass()->find(context->d()->engine->id_callee));
@@ -78,7 +78,7 @@ void ArgumentsObject::fullyCreate()
 
     uint numAccessors = qMin((int)context()->d()->function->formalParameterCount(), context()->d()->realArgumentCount);
     uint argCount = qMin(context()->d()->realArgumentCount, context()->d()->callData->argc);
-    ArrayData::realloc(this, ArrayData::Sparse, argCount, true);
+    ArrayData::realloc(this, Heap::ArrayData::Sparse, argCount, true);
     context()->d()->engine->requireArgumentsAccessors(numAccessors);
 
     Scope scope(engine());
@@ -226,7 +226,7 @@ ReturnedValue ArgumentsSetterFunction::call(Managed *setter, CallData *callData)
     return Encode::undefined();
 }
 
-void ArgumentsObject::markObjects(HeapObject *that, ExecutionEngine *e)
+void ArgumentsObject::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     ArgumentsObject::Data *o = static_cast<ArgumentsObject::Data *>(that);
     if (o->context)
index d961d08..28b03c5 100644 (file)
@@ -82,14 +82,14 @@ struct ArgumentsObject: Object {
         Data(CallContext *context);
         CallContext *context;
         bool fullyCreated;
-        MemberData::Data *mappedArguments;
+        Heap::MemberData *mappedArguments;
     };
     V4_OBJECT(Object)
     Q_MANAGED_TYPE(ArgumentsObject)
 
     CallContext *context() const { return d()->context; }
     bool fullyCreated() const { return d()->fullyCreated; }
-    MemberData::Data *mappedArguments() { return d()->mappedArguments; }
+    Heap::MemberData *mappedArguments() { return d()->mappedArguments; }
 
     static bool isNonStrictArgumentsObject(Managed *m) {
         return m->internalClass()->vtable->type == Type_ArgumentsObject &&
@@ -106,7 +106,7 @@ struct ArgumentsObject: Object {
     static void putIndexed(Managed *m, uint index, const ValueRef value);
     static bool deleteIndexedProperty(Managed *m, uint index);
     static PropertyAttributes queryIndexed(const Managed *m, uint index);
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
 
     void fullyCreate();
 };
index 5aaed1a..d7af678 100644 (file)
@@ -57,7 +57,7 @@ const QV4::ManagedVTable QV4::ArrayData::static_vtbl = {
 const ArrayVTable SimpleArrayData::static_vtbl =
 {
     DEFINE_MANAGED_VTABLE_INT(SimpleArrayData, 0),
-    SimpleArrayData::Simple,
+    Heap::ArrayData::Simple,
     SimpleArrayData::reallocate,
     SimpleArrayData::get,
     SimpleArrayData::put,
@@ -74,7 +74,7 @@ const ArrayVTable SimpleArrayData::static_vtbl =
 const ArrayVTable SparseArrayData::static_vtbl =
 {
     DEFINE_MANAGED_VTABLE_INT(SparseArrayData, 0),
-    ArrayData::Sparse,
+    Heap::ArrayData::Sparse,
     SparseArrayData::reallocate,
     SparseArrayData::get,
     SparseArrayData::put,
@@ -88,8 +88,8 @@ const ArrayVTable SparseArrayData::static_vtbl =
     SparseArrayData::length
 };
 
-Q_STATIC_ASSERT(sizeof(ArrayData::Data) == sizeof(SimpleArrayData::Data));
-Q_STATIC_ASSERT(sizeof(ArrayData::Data) == sizeof(SparseArrayData::Data));
+Q_STATIC_ASSERT(sizeof(Heap::ArrayData) == sizeof(Heap::SimpleArrayData));
+Q_STATIC_ASSERT(sizeof(Heap::ArrayData) == sizeof(Heap::SparseArrayData));
 
 void ArrayData::realloc(Object *o, Type newType, uint requested, bool enforceAttributes)
 {
@@ -108,7 +108,7 @@ void ArrayData::realloc(Object *o, Type newType, uint requested, bool enforceAtt
         if (alloc < d->alloc())
             alloc = d->alloc();
 
-        if (d->type() < Sparse) {
+        if (d->type() < Heap::ArrayData::Sparse) {
             offset = static_cast<SimpleArrayData *>(d)->d()->offset;
             toCopy = static_cast<SimpleArrayData *>(d)->len();
         } else {
@@ -117,25 +117,25 @@ void ArrayData::realloc(Object *o, Type newType, uint requested, bool enforceAtt
         if (d->type() > newType)
             newType = d->type();
     }
-    if (enforceAttributes && newType == Simple)
-        newType = Complex;
+    if (enforceAttributes && newType == Heap::ArrayData::Simple)
+        newType = Heap::ArrayData::Complex;
 
     while (alloc < requested)
         alloc *= 2;
-    size_t size = sizeof(ArrayData::Data) + (alloc - 1)*sizeof(Value);
+    size_t size = sizeof(Heap::ArrayData) + (alloc - 1)*sizeof(Value);
     if (enforceAttributes)
         size += alloc*sizeof(PropertyAttributes);
 
     ArrayData *newData;
-    if (newType < Sparse) {
+    if (newType < Heap::ArrayData::Sparse) {
         SimpleArrayData *n = static_cast<SimpleArrayData *>(o->engine()->memoryManager->allocManaged(size));
-        new (n->d()) SimpleArrayData::Data(o->engine());
+        new (n->d()) Heap::SimpleArrayData(o->engine());
         n->d()->offset = 0;
         n->len() = d ? static_cast<SimpleArrayData *>(d)->len() : 0;
         newData = n;
     } else {
         SparseArrayData *n = static_cast<SparseArrayData *>(o->engine()->memoryManager->allocManaged(size));
-        new (n->d()) SparseArrayData::Data(o->engine());
+        new (n->d()) Heap::SparseArrayData(o->engine());
         newData = n;
     }
     newData->setAlloc(alloc);
@@ -160,13 +160,13 @@ void ArrayData::realloc(Object *o, Type newType, uint requested, bool enforceAtt
         memcpy(o->arrayData()->d()->arrayData, d->d()->arrayData + offset, sizeof(Value)*toCopy);
     }
 
-    if (newType != Sparse)
+    if (newType != Heap::ArrayData::Sparse)
         return;
 
     SparseArrayData *sparse = static_cast<SparseArrayData *>(o->arrayData());
 
     uint *lastFree;
-    if (d && d->type() == Sparse) {
+    if (d && d->type() == Heap::ArrayData::Sparse) {
         SparseArrayData *old = static_cast<SparseArrayData *>(d);
         sparse->setSparse(old->sparse());
         old->setSparse(0);
@@ -200,7 +200,7 @@ void ArrayData::realloc(Object *o, Type newType, uint requested, bool enforceAtt
 
 ArrayData *SimpleArrayData::reallocate(Object *o, uint n, bool enforceAttributes)
 {
-    realloc(o, Simple, n, enforceAttributes);
+    realloc(o, Heap::ArrayData::Simple, n, enforceAttributes);
     return o->arrayData();
 }
 
@@ -209,13 +209,13 @@ void ArrayData::ensureAttributes(Object *o)
     if (o->arrayData() && o->arrayData()->attrs())
         return;
 
-    ArrayData::realloc(o, Simple, 0, true);
+    ArrayData::realloc(o, Heap::ArrayData::Simple, 0, true);
 }
 
 
-void SimpleArrayData::markObjects(HeapObject *d, ExecutionEngine *e)
+void SimpleArrayData::markObjects(Heap::Base *d, ExecutionEngine *e)
 {
-    SimpleArrayData::Data *dd = static_cast<SimpleArrayData::Data *>(d);
+    Heap::SimpleArrayData *dd = static_cast<Heap::SimpleArrayData *>(d);
     uint l = dd->len;
     for (uint i = 0; i < l; ++i)
         dd->arrayData[i].mark(e);
@@ -275,7 +275,7 @@ void SimpleArrayData::push_front(Object *o, Value *values, uint n)
     SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData());
     Q_ASSERT(!dd->attrs());
     if (dd->len() + n > dd->alloc()) {
-        realloc(o, Simple, dd->len() + n, false);
+        realloc(o, Heap::ArrayData::Simple, dd->len() + n, false);
         dd = static_cast<SimpleArrayData *>(o->arrayData());
     }
     dd->d()->offset = (dd->d()->offset - n) % dd->d()->alloc;
@@ -338,7 +338,7 @@ bool SimpleArrayData::putArray(Object *o, uint index, Value *values, uint n)
 
 void SparseArrayData::free(ArrayData *d, uint idx)
 {
-    Q_ASSERT(d && d->type() == ArrayData::Sparse);
+    Q_ASSERT(d && d->type() == Heap::ArrayData::Sparse);
     SparseArrayData *dd = static_cast<SparseArrayData *>(d);
     Value *v = dd->arrayData() + idx;
     if (dd->attrs() && dd->attrs()[idx].isAccessor()) {
@@ -363,9 +363,9 @@ void SparseArrayData::destroy(Managed *d)
     delete dd->sparse();
 }
 
-void SparseArrayData::markObjects(HeapObject *d, ExecutionEngine *e)
+void SparseArrayData::markObjects(Heap::Base *d, ExecutionEngine *e)
 {
-    SparseArrayData::Data *dd = static_cast<SparseArrayData::Data *>(d);
+    Heap::SparseArrayData *dd = static_cast<Heap::SparseArrayData *>(d);
     uint l = dd->alloc;
     for (uint i = 0; i < l; ++i)
         dd->arrayData[i].mark(e);
@@ -373,14 +373,14 @@ void SparseArrayData::markObjects(HeapObject *d, ExecutionEngine *e)
 
 ArrayData *SparseArrayData::reallocate(Object *o, uint n, bool enforceAttributes)
 {
-    realloc(o, Sparse, n, enforceAttributes);
+    realloc(o, Heap::ArrayData::Sparse, n, enforceAttributes);
     return o->arrayData();
 }
 
 // double slots are required for accessor properties
 uint SparseArrayData::allocate(Object *o, bool doubleSlot)
 {
-    Q_ASSERT(o->arrayData()->type() == ArrayData::Sparse);
+    Q_ASSERT(o->arrayData()->type() == Heap::ArrayData::Sparse);
     SparseArrayData *dd = static_cast<SparseArrayData *>(o->arrayData());
     if (doubleSlot) {
         uint *last = &dd->freeList();
@@ -618,7 +618,7 @@ uint ArrayData::append(Object *obj, ArrayObject *otherObj, uint n)
 
 Property *ArrayData::insert(Object *o, uint index, bool isAccessor)
 {
-    if (!isAccessor && o->arrayData()->type() != ArrayData::Sparse) {
+    if (!isAccessor && o->arrayData()->type() != Heap::ArrayData::Sparse) {
         SimpleArrayData *d = static_cast<SimpleArrayData *>(o->arrayData());
         if (index < 0x1000 || index < d->len() + (d->len() >> 2)) {
             if (index >= o->arrayData()->alloc()) {
@@ -754,7 +754,7 @@ void ArrayData::sort(ExecutionContext *context, Object *thisObject, const ValueR
     // The spec says the sorting goes through a series of get,put and delete operations.
     // this implies that the attributes don't get sorted around.
 
-    if (thisObject->arrayData()->type() == ArrayData::Sparse) {
+    if (thisObject->arrayData()->type() == Heap::ArrayData::Sparse) {
         // since we sort anyway, we can simply iterate over the entries in the sparse
         // array and append them one by one to a regular one.
         SparseArrayData *sparse = static_cast<SparseArrayData *>(thisObject->arrayData());
@@ -763,7 +763,7 @@ void ArrayData::sort(ExecutionContext *context, Object *thisObject, const ValueR
             return;
 
         thisObject->setArrayData(0);
-        ArrayData::realloc(thisObject, ArrayData::Simple, sparse->sparse()->nEntries(), sparse->attrs() ? true : false);
+        ArrayData::realloc(thisObject, Heap::ArrayData::Simple, sparse->sparse()->nEntries(), sparse->attrs() ? true : false);
         SimpleArrayData *d = static_cast<SimpleArrayData *>(thisObject->arrayData());
 
         SparseArrayNode *n = sparse->sparse()->begin();
index 5286be8..10997a8 100644 (file)
@@ -42,7 +42,7 @@ QT_BEGIN_NAMESPACE
 
 namespace QV4 {
 
-#define V4_ARRAYDATA \
+#define V4_ARRAYDATA(Data) \
     public: \
         Q_MANAGED_CHECK \
         static const QV4::ArrayVTable static_vtbl; \
@@ -50,8 +50,8 @@ namespace QV4 {
         template <typename T> \
         QV4::Returned<T> *asReturned() { return QV4::Returned<T>::create(this); } \
         V4_MANAGED_SIZE_TEST \
-        const Data *d() const { return &static_cast<const Data &>(Managed::data); } \
-        Data *d() { return &static_cast<Data &>(Managed::data); }
+        const QV4::Heap::Data *d() const { return &static_cast<const QV4::Heap::Data &>(Managed::data); } \
+        QV4::Heap::Data *d() { return &static_cast<QV4::Heap::Data &>(Managed::data); }
 
 
 struct ArrayData;
@@ -73,9 +73,12 @@ struct ArrayVTable
     uint (*length)(const ArrayData *d);
 };
 
+namespace Heap {
 
-struct Q_QML_EXPORT ArrayData : public Managed
-{
+struct ArrayData : public Base {
+    ArrayData(InternalClass *ic)
+        : Base(ic)
+    {}
     enum Type {
         Simple = 0,
         Complex = 1,
@@ -83,24 +86,36 @@ struct Q_QML_EXPORT ArrayData : public Managed
         Custom = 3
     };
 
-    struct Data : public Managed::Data {
-        Data(InternalClass *ic)
-            : Managed::Data(ic)
-        {}
-        uint alloc;
-        Type type;
-        PropertyAttributes *attrs;
-        union {
-            uint len;
-            uint freeList;
-        };
-        union {
-            uint offset;
-            SparseArray *sparse;
-        };
-        Value arrayData[1];
+    uint alloc;
+    Type type;
+    PropertyAttributes *attrs;
+    union {
+        uint len;
+        uint freeList;
+    };
+    union {
+        uint offset;
+        SparseArray *sparse;
     };
-    V4_MANAGED(Managed)
+    Value arrayData[1];
+};
+
+struct SimpleArrayData : public ArrayData {
+    SimpleArrayData(ExecutionEngine *engine)
+        : ArrayData(engine->simpleArrayDataClass)
+    {}
+};
+
+struct SparseArrayData : public ArrayData {
+    inline SparseArrayData(ExecutionEngine *engine);
+};
+
+}
+
+struct Q_QML_EXPORT ArrayData : public Managed
+{
+    typedef Heap::ArrayData::Type Type;
+    V4_MANAGED2(ArrayData, Managed)
 
     uint alloc() const { return d()->alloc; }
     uint &alloc() { return d()->alloc; }
@@ -113,7 +128,7 @@ struct Q_QML_EXPORT ArrayData : public Managed
     Value *arrayData() { return &d()->arrayData[0]; }
 
     const ArrayVTable *vtable() const { return reinterpret_cast<const ArrayVTable *>(internalClass()->vtable); }
-    bool isSparse() const { return type() == Sparse; }
+    bool isSparse() const { return type() == Heap::ArrayData::Sparse; }
 
     uint length() const {
         return vtable()->length(this);
@@ -146,13 +161,7 @@ struct Q_QML_EXPORT ArrayData : public Managed
 
 struct Q_QML_EXPORT SimpleArrayData : public ArrayData
 {
-
-    struct Data : public ArrayData::Data {
-        Data(ExecutionEngine *engine)
-            : ArrayData::Data(engine->simpleArrayDataClass)
-        {}
-    };
-    V4_ARRAYDATA
+    V4_ARRAYDATA(SimpleArrayData)
 
     uint mappedIndex(uint index) const { return (index + d()->offset) % d()->alloc; }
     Value data(uint index) const { return d()->arrayData[mappedIndex(index)]; }
@@ -172,7 +181,7 @@ struct Q_QML_EXPORT SimpleArrayData : public ArrayData
 
     static ArrayData *reallocate(Object *o, uint n, bool enforceAttributes);
 
-    static void markObjects(HeapObject *d, ExecutionEngine *e);
+    static void markObjects(Heap::Base *d, ExecutionEngine *e);
 
     static ReturnedValue get(const ArrayData *d, uint index);
     static bool put(Object *o, uint index, ValueRef value);
@@ -188,12 +197,7 @@ struct Q_QML_EXPORT SimpleArrayData : public ArrayData
 
 struct Q_QML_EXPORT SparseArrayData : public ArrayData
 {
-    struct Data : public ArrayData::Data {
-        Data(ExecutionEngine *engine)
-            : ArrayData::Data(engine->emptyClass)
-        { setVTable(staticVTable()); }
-    };
-    V4_ARRAYDATA
+    V4_ARRAYDATA(SparseArrayData)
 
     uint &freeList() { return d()->freeList; }
     uint freeList() const { return d()->freeList; }
@@ -218,7 +222,7 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData
     }
 
     static void destroy(Managed *d);
-    static void markObjects(HeapObject *d, ExecutionEngine *e);
+    static void markObjects(Heap::Base *d, ExecutionEngine *e);
 
     static ArrayData *reallocate(Object *o, uint n, bool enforceAttributes);
     static ReturnedValue get(const ArrayData *d, uint index);
@@ -233,10 +237,17 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData
     static uint length(const ArrayData *d);
 };
 
+namespace Heap {
+inline SparseArrayData::SparseArrayData(ExecutionEngine *engine)
+    : ArrayData(engine->emptyClass)
+{
+    setVTable(QV4::SparseArrayData::staticVTable());
+}
+}
 
 inline Property *ArrayData::getProperty(uint index)
 {
-    if (type() != Sparse) {
+    if (type() != Heap::ArrayData::Sparse) {
         SimpleArrayData *that = static_cast<SimpleArrayData *>(this);
         return that->getProperty(index);
     } else {
index bbc0867..59d0c35 100644 (file)
@@ -293,7 +293,7 @@ ReturnedValue ArrayPrototype::method_push(CallContext *ctx)
 
     if (!ctx->d()->callData->argc) {
         ;
-    } else if (!instance->protoHasArray() && instance->arrayData()->length() <= len && instance->arrayType() == ArrayData::Simple) {
+    } else if (!instance->protoHasArray() && instance->arrayData()->length() <= len && instance->arrayType() == Heap::ArrayData::Simple) {
         instance->arrayData()->vtable()->putArray(instance.getPointer(), len, ctx->d()->callData->args, ctx->d()->callData->argc);
         len = instance->arrayData()->length();
     } else {
@@ -361,7 +361,7 @@ ReturnedValue ArrayPrototype::method_shift(CallContext *ctx)
 
     ScopedValue result(scope);
 
-    if (!instance->protoHasArray() && !instance->arrayData()->hasAttributes() && instance->arrayData()->length() <= len && instance->arrayData()->type() != ArrayData::Custom) {
+    if (!instance->protoHasArray() && !instance->arrayData()->hasAttributes() && instance->arrayData()->length() <= len && instance->arrayData()->type() != Heap::ArrayData::Custom) {
         result = instance->arrayData()->vtable()->pop_front(instance.getPointer());
     } else {
         result = instance->getIndexed(0);
@@ -541,7 +541,8 @@ ReturnedValue ArrayPrototype::method_unshift(CallContext *ctx)
 
     uint len = instance->getLength();
 
-    if (!instance->protoHasArray() && !instance->arrayData()->hasAttributes() && instance->arrayData()->length() <= len && instance->arrayData()->type() != ArrayData::Custom) {
+    if (!instance->protoHasArray() && !instance->arrayData()->hasAttributes() && instance->arrayData()->length() <= len &&
+        instance->arrayData()->type() != Heap::ArrayData::Custom) {
         instance->arrayData()->vtable()->push_front(instance.getPointer(), ctx->d()->callData->args, ctx->d()->callData->argc);
     } else {
         ScopedValue v(scope);
@@ -604,7 +605,7 @@ ReturnedValue ArrayPrototype::method_indexOf(CallContext *ctx)
 
     ScopedValue value(scope);
 
-    if (instance->hasAccessorProperty() || (instance->arrayType() >= ArrayData::Sparse) || instance->protoHasArray()) {
+    if (instance->hasAccessorProperty() || (instance->arrayType() >= Heap::ArrayData::Sparse) || instance->protoHasArray()) {
         // lets be safe and slow
         for (uint i = fromIndex; i < len; ++i) {
             bool exists;
@@ -617,7 +618,7 @@ ReturnedValue ArrayPrototype::method_indexOf(CallContext *ctx)
     } else if (!instance->arrayData()) {
         return Encode(-1);
     } else {
-        Q_ASSERT(instance->arrayType() == ArrayData::Simple || instance->arrayType() == ArrayData::Complex);
+        Q_ASSERT(instance->arrayType() == Heap::ArrayData::Simple || instance->arrayType() == Heap::ArrayData::Complex);
         SimpleArrayData *sa = static_cast<SimpleArrayData *>(instance->arrayData());
         if (len > sa->len())
             len = sa->len();
index 2dc8e8b..2863068 100644 (file)
@@ -246,7 +246,7 @@ bool CallContext::needsOwnArguments() const
     return d()->function->needsActivation() || d()->callData->argc < static_cast<int>(d()->function->formalParameterCount());
 }
 
-void ExecutionContext::markObjects(HeapObject *m, ExecutionEngine *engine)
+void ExecutionContext::markObjects(Heap::Base *m, ExecutionEngine *engine)
 {
     ExecutionContext::Data *ctx = static_cast<ExecutionContext::Data *>(m);
 
index a942c12..e45e82f 100644 (file)
@@ -71,9 +71,9 @@ struct Q_QML_EXPORT ExecutionContext : public Managed
         EvalCode *next;
     };
 
-    struct Data : Managed::Data {
+    struct Data : Heap::Base {
         Data(ExecutionEngine *engine, ContextType t)
-            : Managed::Data(engine->executionContextClass)
+            : Heap::Base(engine->executionContextClass)
             , type(t)
             , strictMode(false)
             , engine(engine)
@@ -137,7 +137,7 @@ struct Q_QML_EXPORT ExecutionContext : public Managed
     inline CallContext *asCallContext();
     inline const CallContext *asCallContext() const;
 
-    static void markObjects(HeapObject *m, ExecutionEngine *e);
+    static void markObjects(Heap::Base *m, ExecutionEngine *e);
 };
 
 struct CallContext : public ExecutionContext
index 11cb04e..4d7e065 100644 (file)
@@ -85,7 +85,7 @@ DataView::Data::Data(ExecutionEngine *e)
 }
 
 
-void DataView::markObjects(HeapObject *that, ExecutionEngine *e)
+void DataView::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     DataView::Data *v = static_cast<DataView::Data *>(that);
     v->buffer->mark(e);
index b1c2e36..e1a8aa7 100644 (file)
@@ -64,7 +64,7 @@ struct DataView : Object
     };
     V4_OBJECT(Object)
 
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
 };
 
 struct DataViewPrototype: Object
index ff9d2cc..fea731a 100644 (file)
@@ -151,11 +151,11 @@ public:
         jsStackTop -= nValues;
     }
 
-    void pushForGC(HeapObject *m) {
+    void pushForGC(Heap::Base *m) {
         *jsStackTop = Value::fromHeapObject(m);
         ++jsStackTop;
     }
-    HeapObject *popForGC() {
+    Heap::Base *popForGC() {
         --jsStackTop;
         return jsStackTop->heapObject();
     }
@@ -398,7 +398,7 @@ void Managed::mark(QV4::ExecutionEngine *engine)
 
 
 inline
-void HeapObject::mark(QV4::ExecutionEngine *engine)
+void Heap::Base::mark(QV4::ExecutionEngine *engine)
 {
     Q_ASSERT(inUse);
     if (markBit)
index ef664f2..f0c151a 100644 (file)
@@ -170,7 +170,7 @@ ReturnedValue ErrorObject::method_get_stack(CallContext *ctx)
     return This->d()->stack->asReturnedValue();
 }
 
-void ErrorObject::markObjects(HeapObject *that, ExecutionEngine *e)
+void ErrorObject::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     ErrorObject::Data *This = static_cast<ErrorObject::Data *>(that);
     if (This->stack)
index ffbdafc..359395e 100644 (file)
@@ -70,7 +70,7 @@ struct ErrorObject: Object {
     SyntaxErrorObject *asSyntaxError();
 
     static ReturnedValue method_get_stack(CallContext *ctx);
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
     static void destroy(Managed *that) { static_cast<ErrorObject *>(that)->d()->~Data(); }
 };
 
index 7c93cab..216f732 100644 (file)
@@ -155,7 +155,7 @@ ReturnedValue FunctionObject::call(Managed *, CallData *)
     return Encode::undefined();
 }
 
-void FunctionObject::markObjects(HeapObject *that, ExecutionEngine *e)
+void FunctionObject::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     FunctionObject::Data *o = static_cast<FunctionObject::Data *>(that);
     if (o->scope)
@@ -293,7 +293,7 @@ ReturnedValue FunctionPrototype::method_apply(CallContext *ctx)
     ScopedCallData callData(scope, len);
 
     if (len) {
-        if (arr->arrayType() != ArrayData::Simple || arr->protoHasArray() || arr->hasAccessorProperty()) {
+        if (arr->arrayType() != Heap::ArrayData::Simple || arr->protoHasArray() || arr->hasAccessorProperty()) {
             for (quint32 i = 0; i < len; ++i)
                 callData->args[i] = arr->getIndexed(i);
         } else {
@@ -649,7 +649,7 @@ ReturnedValue BoundFunction::construct(Managed *that, CallData *dd)
     return f->target()->construct(callData);
 }
 
-void BoundFunction::markObjects(HeapObject *that, ExecutionEngine *e)
+void BoundFunction::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     BoundFunction::Data *o = static_cast<BoundFunction::Data *>(that);
     o->target->mark(e);
index 07a8c45..58b9571 100644 (file)
@@ -102,7 +102,7 @@ struct Q_QML_EXPORT FunctionObject: Object {
     bool strictMode() const { return d()->strictMode; }
     bool bindingKeyFlag() const { return d()->bindingKeyFlag; }
 
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
 };
 
 template<>
@@ -205,7 +205,7 @@ struct BoundFunction: FunctionObject {
         Data(ExecutionContext *scope, FunctionObject *target, const ValueRef boundThis, MemberData *boundArgs);
         FunctionObject *target;
         Value boundThis;
-        MemberData::Data *boundArgs;
+        Heap::MemberData *boundArgs;
     };
     V4_OBJECT(FunctionObject)
 
@@ -222,7 +222,7 @@ struct BoundFunction: FunctionObject {
     static ReturnedValue construct(Managed *, CallData *d);
     static ReturnedValue call(Managed *that, CallData *dd);
 
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
 };
 
 }
index 71f2173..b1e1f3a 100644 (file)
@@ -114,6 +114,10 @@ QT_BEGIN_NAMESPACE
 
 namespace QV4 {
 
+namespace Heap {
+    struct Base;
+}
+
 class MemoryManager;
 struct String;
 struct Object;
@@ -127,7 +131,6 @@ struct InternalClass;
 struct Property;
 struct Value;
 struct Lookup;
-struct HeapObject;
 struct ArrayData;
 struct ManagedVTable;
 
index 9d4649b..d14898d 100644 (file)
@@ -163,7 +163,7 @@ ReturnedValue Lookup::indexedGetterObjectInt(Lookup *l, const ValueRef object, c
         return indexedGetterGeneric(l, object, index);
 
     Object *o = object->objectValue();
-    if (o->arrayData() && o->arrayData()->type() == ArrayData::Simple) {
+    if (o->arrayData() && o->arrayData()->type() == Heap::ArrayData::Simple) {
         SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData());
         if (idx < s->len())
             if (!s->data(idx).isEmpty())
@@ -177,7 +177,7 @@ void Lookup::indexedSetterGeneric(Lookup *l, const ValueRef object, const ValueR
 {
     if (object->isObject()) {
         Object *o = object->objectValue();
-        if (o->arrayData() && o->arrayData()->type() == ArrayData::Simple && index->asArrayIndex() < UINT_MAX) {
+        if (o->arrayData() && o->arrayData()->type() == Heap::ArrayData::Simple && index->asArrayIndex() < UINT_MAX) {
             l->indexedSetter = indexedSetterObjectInt;
             indexedSetterObjectInt(l, object, index, v);
             return;
@@ -196,7 +196,7 @@ void Lookup::indexedSetterFallback(Lookup *l, const ValueRef object, const Value
 
     uint idx = index->asArrayIndex();
     if (idx < UINT_MAX) {
-        if (o->arrayData() && o->arrayData()->type() == ArrayData::Simple) {
+        if (o->arrayData() && o->arrayData()->type() == Heap::ArrayData::Simple) {
             SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData());
             if (idx < s->len() && !s->data(idx).isEmpty()) {
                 s->data(idx) = value;
@@ -220,7 +220,7 @@ void Lookup::indexedSetterObjectInt(Lookup *l, const ValueRef object, const Valu
     }
 
     Object *o = object->objectValue();
-    if (o->arrayData() && o->arrayData()->type() == ArrayData::Simple) {
+    if (o->arrayData() && o->arrayData()->type() == Heap::ArrayData::Simple) {
         SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData());
         if (idx < s->len() && !s->data(idx).isEmpty()) {
             s->data(idx) = v;
index 93286b3..acaebdf 100644 (file)
@@ -157,7 +157,7 @@ void Managed::setVTable(const ManagedVTable *vt)
     d()->internalClass = internalClass()->changeVTable(vt);
 }
 
-void HeapObject::setVTable(const ManagedVTable *vt)
+void Heap::Base::setVTable(const ManagedVTable *vt)
 {
     Q_ASSERT(internalClass);
     internalClass = internalClass->changeVTable(vt);
index 91dc0fb..cc7ce9d 100644 (file)
@@ -69,6 +69,18 @@ inline void qYouForgotTheQ_MANAGED_Macro(T1, T2) {}
         const Data *d() const { return &static_cast<const Data &>(Managed::data); } \
         Data *d() { return &static_cast<Data &>(Managed::data); }
 
+#define V4_MANAGED2(Data, superClass) \
+    public: \
+        Q_MANAGED_CHECK \
+        typedef superClass SuperClass; \
+        static const QV4::ManagedVTable static_vtbl; \
+        static inline const QV4::ManagedVTable *staticVTable() { return &static_vtbl; } \
+        template <typename _T> \
+        QV4::Returned<_T> *asReturned() { return QV4::Returned<_T>::create(this); } \
+        V4_MANAGED_SIZE_TEST \
+        const QV4::Heap::Data *d() const { return &static_cast<const QV4::Heap::Data &>(Managed::data); } \
+        QV4::Heap::Data *d() { return &static_cast<QV4::Heap::Data &>(Managed::data); }
+
 #define V4_OBJECT(superClass) \
     public: \
         Q_MANAGED_CHECK \
@@ -110,7 +122,7 @@ struct ManagedVTable
     uint type : 8;
     const char *className;
     void (*destroy)(Managed *);
-    void (*markObjects)(HeapObject *, ExecutionEngine *e);
+    void (*markObjects)(Heap::Base *, ExecutionEngine *e);
     bool (*isEqualTo)(Managed *m, Managed *other);
 };
 
@@ -176,14 +188,8 @@ const QV4::ObjectVTable classname::static_vtbl =    \
 
 struct Q_QML_PRIVATE_EXPORT Managed
 {
-    struct Q_QML_PRIVATE_EXPORT Data : HeapObject {
-        Data() : HeapObject(0) {}
-        Data(InternalClass *internal)
-            : HeapObject(internal)
-        {}
-    };
-    Data data;
-    V4_MANAGED(Managed)
+    Heap::Base data;
+    V4_MANAGED2(Base, Managed)
     enum {
         IsExecutionContext = false,
         IsString = false,
index bf07a74..fe67099 100644 (file)
@@ -38,24 +38,24 @@ using namespace QV4;
 
 DEFINE_MANAGED_VTABLE(MemberData);
 
-void MemberData::markObjects(HeapObject *that, ExecutionEngine *e)
+void MemberData::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
-    MemberData::Data *m = static_cast<MemberData::Data *>(that);
+    Heap::MemberData *m = static_cast<Heap::MemberData *>(that);
     for (uint i = 0; i < m->size; ++i)
         m->data[i].mark(e);
 }
 
-MemberData::Data *MemberData::reallocate(ExecutionEngine *e, Data *old, uint idx)
+Heap::MemberData *MemberData::reallocate(ExecutionEngine *e, Heap::MemberData *old, uint idx)
 {
     uint s = old ? old->size : 0;
     if (idx < s)
         return old;
 
     int newAlloc = qMax((uint)4, 2*idx);
-    uint alloc = sizeof(Data) + (newAlloc)*sizeof(Value);
+    uint alloc = sizeof(Heap::MemberData) + (newAlloc)*sizeof(Value);
     MemberData *newMemberData = static_cast<MemberData *>(e->memoryManager->allocManaged(alloc));
     if (old)
-        memcpy(newMemberData, old, sizeof(MemberData::Data) + s*sizeof(Value));
+        memcpy(newMemberData, old, sizeof(Heap::MemberData) + s*sizeof(Value));
     else
         new (newMemberData) MemberData(e->memberDataClass);
     newMemberData->d()->size = newAlloc;
index 0177601..c3c9507 100644 (file)
@@ -40,16 +40,21 @@ QT_BEGIN_NAMESPACE
 
 namespace QV4 {
 
+namespace Heap {
+
+struct MemberData : Base {
+    union {
+        uint size;
+        double _dummy;
+    };
+    Value data[1];
+};
+
+}
+
 struct MemberData : Managed
 {
-    struct Data : Managed::Data {
-        union {
-            uint size;
-            double _dummy;
-        };
-        Value data[1];
-    };
-    V4_MANAGED(Managed)
+    V4_MANAGED2(MemberData, Managed)
 
     MemberData(QV4::InternalClass *ic) : Managed(ic) {}
     Value &operator[] (uint idx) { return d()->data[idx]; }
@@ -57,9 +62,9 @@ struct MemberData : Managed
     Value *data() { return d()->data; }
     inline uint size() const { return d()->size; }
 
-    static MemberData::Data *reallocate(QV4::ExecutionEngine *e, MemberData::Data *old, uint idx);
+    static Heap::MemberData *reallocate(QV4::ExecutionEngine *e, Heap::MemberData *old, uint idx);
 
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
 };
 
 }
index df439e1..2e15c24 100644 (file)
@@ -264,7 +264,7 @@ Managed *MemoryManager::allocData(std::size_t size)
 static void drainMarkStack(QV4::ExecutionEngine *engine, Value *markBase)
 {
     while (engine->jsStackTop > markBase) {
-        HeapObject *h = engine->popForGC();
+        Heap::Base *h = engine->popForGC();
         Q_ASSERT (h->internalClass->vtable->markObjects);
         h->internalClass->vtable->markObjects(h, engine);
     }
@@ -492,7 +492,7 @@ size_t MemoryManager::getUsedMem() const
         char *chunkStart = reinterpret_cast<char *>(i->memory.base());
         char *chunkEnd = chunkStart + i->memory.size() - i->chunkSize;
         for (char *chunk = chunkStart; chunk <= chunkEnd; chunk += i->chunkSize) {
-            Managed::Data *m = reinterpret_cast<Managed::Data *>(chunk);
+            Heap::Base *m = reinterpret_cast<Heap::Base *>(chunk);
             Q_ASSERT((qintptr) chunk % 16 == 0);
             if (m->inUse)
                 usedMem += i->chunkSize;
index f8b0c9f..0859537 100644 (file)
@@ -50,7 +50,7 @@ using namespace QV4;
 DEFINE_OBJECT_VTABLE(Object);
 
 Object::Data::Data(InternalClass *internalClass)
-    : Managed::Data(internalClass)
+    : Heap::Base(internalClass)
 {
     if (internalClass->size) {
         Scope scope(internalClass->engine);
@@ -178,7 +178,7 @@ void Object::defineReadonlyProperty(String *name, ValueRef value)
     insertMember(name, value, Attr_ReadOnly);
 }
 
-void Object::markObjects(HeapObject *that, ExecutionEngine *e)
+void Object::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     Object::Data *o = static_cast<Object::Data *>(that);
 
@@ -1072,7 +1072,7 @@ void Object::copyArrayData(Object *other)
     } else {
         Q_ASSERT(!arrayData() && other->arrayData());
         ArrayData::realloc(this, other->arrayData()->type(), other->arrayData()->alloc(), false);
-        if (other->arrayType() == ArrayData::Sparse) {
+        if (other->arrayType() == Heap::ArrayData::Sparse) {
             SparseArrayData *od = static_cast<SparseArrayData *>(other->arrayData());
             SparseArrayData *dd = static_cast<SparseArrayData *>(arrayData());
             dd->setSparse(new SparseArray(*od->sparse()));
@@ -1120,10 +1120,10 @@ bool Object::setArrayLength(uint newLen)
 
 void Object::initSparseArray()
 {
-    if (arrayType() == ArrayData::Sparse)
+    if (arrayType() == Heap::ArrayData::Sparse)
         return;
 
-    ArrayData::realloc(this, ArrayData::Sparse, 0, false);
+    ArrayData::realloc(this, Heap::ArrayData::Sparse, 0, false);
 }
 
 
index 7347232..ac3490c 100644 (file)
@@ -42,15 +42,15 @@ QT_BEGIN_NAMESPACE
 namespace QV4 {
 
 struct Q_QML_EXPORT Object: Managed {
-    struct Data : Managed::Data {
+    struct Data : Heap::Base {
         Data(ExecutionEngine *engine)
-            : Managed::Data(engine->objectClass)
+            : Heap::Base(engine->objectClass)
         {
         }
         Data(InternalClass *internal = 0);
 
-        MemberData::Data *memberData;
-        ArrayData::Data *arrayData;
+        Heap::MemberData *memberData;
+        Heap::ArrayData *arrayData;
     };
     V4_OBJECT(Object)
     Q_MANAGED_TYPE(Object)
@@ -164,30 +164,30 @@ public:
     void push_back(const ValueRef v);
 
     ArrayData::Type arrayType() const {
-        return arrayData() ? arrayData()->type() : ArrayData::Simple;
+        return arrayData() ? arrayData()->type() : Heap::ArrayData::Simple;
     }
     // ### remove me
     void setArrayType(ArrayData::Type t) {
-        Q_ASSERT(t != ArrayData::Simple && t != ArrayData::Sparse);
+        Q_ASSERT(t != Heap::ArrayData::Simple && t != Heap::ArrayData::Sparse);
         arrayCreate();
         arrayData()->setType(t);
     }
 
     inline void arrayReserve(uint n) {
-        ArrayData::realloc(this, ArrayData::Simple, n, false);
+        ArrayData::realloc(this, Heap::ArrayData::Simple, n, false);
     }
 
     void arrayCreate() {
         if (!arrayData())
-            ArrayData::realloc(this, ArrayData::Simple, 0, false);
+            ArrayData::realloc(this, Heap::ArrayData::Simple, 0, false);
 #ifdef CHECK_SPARSE_ARRAYS
         initSparseArray();
 #endif
     }
 
     void initSparseArray();
-    SparseArrayNode *sparseBegin() { return arrayType() == ArrayData::Sparse ? static_cast<SparseArrayData *>(arrayData())->sparse()->begin() : 0; }
-    SparseArrayNode *sparseEnd() { return arrayType() == ArrayData::Sparse ? static_cast<SparseArrayData *>(arrayData())->sparse()->end() : 0; }
+    SparseArrayNode *sparseBegin() { return arrayType() == Heap::ArrayData::Sparse ? static_cast<SparseArrayData *>(arrayData())->sparse()->begin() : 0; }
+    SparseArrayNode *sparseEnd() { return arrayType() == Heap::ArrayData::Sparse ? static_cast<SparseArrayData *>(arrayData())->sparse()->end() : 0; }
 
     inline bool protoHasArray() {
         Scope scope(engine());
@@ -230,7 +230,7 @@ public:
     inline ReturnedValue call(CallData *d)
     { return vtable()->call(this, d); }
 protected:
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
     static ReturnedValue construct(Managed *m, CallData *);
     static ReturnedValue call(Managed *m, CallData *);
     static ReturnedValue get(Managed *m, String *name, bool *hasProperty);
index e0f7087..dfe37df 100644 (file)
@@ -129,7 +129,7 @@ void ObjectIterator::next(String *&name, uint *index, Property *pd, PropertyAttr
             Object *proto = current->objectValue()->prototype();
             current->m = proto ? &proto->data : 0;
         } else
-            current->m = (HeapObject *)0;
+            current->m = (Heap::Base *)0;
 
         arrayIndex = 0;
         memberIndex = 0;
@@ -210,7 +210,7 @@ ReturnedValue ObjectIterator::nextPropertyNameAsString()
 
 DEFINE_OBJECT_VTABLE(ForEachIteratorObject);
 
-void ForEachIteratorObject::markObjects(HeapObject *that, ExecutionEngine *e)
+void ForEachIteratorObject::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     ForEachIteratorObject::Data *o = static_cast<ForEachIteratorObject::Data *>(that);
     o->workArea[0].mark(e);
index 10f75a1..00d7c49 100644 (file)
@@ -83,7 +83,7 @@ struct ForEachIteratorObject: Object {
     ReturnedValue nextPropertyName() { return d()->it.nextPropertyNameAsString(); }
 
 protected:
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
 };
 
 
index cf59fe0..23ce1e1 100644 (file)
@@ -985,7 +985,7 @@ static void markChildQObjectsRecursively(QObject *parent, QV4::ExecutionEngine *
     }
 }
 
-void QObjectWrapper::markObjects(HeapObject *that, QV4::ExecutionEngine *e)
+void QObjectWrapper::markObjects(Heap::Base *that, QV4::ExecutionEngine *e)
 {
     QObjectWrapper::Data *This = static_cast<QObjectWrapper::Data *>(that);
 
index 6458f03..8bcde64 100644 (file)
@@ -108,7 +108,7 @@ private:
     static void put(Managed *m, String *name, const ValueRef value);
     static PropertyAttributes query(const Managed *, String *name);
     static void advanceIterator(Managed *m, ObjectIterator *it, String *&name, uint *index, Property *p, PropertyAttributes *attributes);
-    static void markObjects(HeapObject *that, QV4::ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, QV4::ExecutionEngine *e);
     static void destroy(Managed *that);
 
     static ReturnedValue method_connect(CallContext *ctx);
index 659221b..eab364c 100644 (file)
@@ -86,7 +86,7 @@ Returned<RegExp> *RegExp::create(ExecutionEngine* engine, const QString& pattern
 }
 
 RegExp::Data::Data(ExecutionEngine* engine, const QString &pattern, bool ignoreCase, bool multiline)
-    : Managed::Data(engine->regExpValueClass)
+    : Heap::Base(engine->regExpValueClass)
     , pattern(pattern)
     , ignoreCase(ignoreCase)
     , multiLine(multiline)
@@ -119,7 +119,7 @@ void RegExp::destroy(Managed *that)
     static_cast<RegExp*>(that)->d()->~Data();
 }
 
-void RegExp::markObjects(HeapObject *that, ExecutionEngine *e)
+void RegExp::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     Q_UNUSED(that);
     Q_UNUSED(e);
index 7aad1a3..2ce39e8 100644 (file)
@@ -58,7 +58,7 @@ struct RegExpCacheKey;
 
 struct RegExp : public Managed
 {
-    struct Data : Managed::Data {
+    struct Data : Heap::Base {
         Data(ExecutionEngine* engine, const QString& pattern, bool ignoreCase, bool multiline);
         ~Data();
         QString pattern;
@@ -94,7 +94,7 @@ struct RegExp : public Managed
     int captureCount() const { return subPatternCount() + 1; }
 
     static void destroy(Managed *that);
-    static void markObjects(HeapObject *that, QV4::ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, QV4::ExecutionEngine *e);
 
     friend class RegExpCache;
 };
index 2fd91a0..115014a 100644 (file)
@@ -170,7 +170,7 @@ void RegExpObject::init(ExecutionEngine *engine)
 }
 
 
-void RegExpObject::markObjects(HeapObject *that, ExecutionEngine *e)
+void RegExpObject::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     RegExpObject::Data *re = static_cast<RegExpObject::Data *>(that);
     if (re->value)
@@ -303,7 +303,7 @@ ReturnedValue RegExpCtor::call(Managed *that, CallData *callData)
     return construct(that, callData);
 }
 
-void RegExpCtor::markObjects(HeapObject *that, ExecutionEngine *e)
+void RegExpCtor::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     RegExpCtor::Data *This = static_cast<RegExpCtor::Data *>(that);
     This->lastMatch.mark(e);
index cf59ca1..8e41523 100644 (file)
@@ -91,7 +91,7 @@ struct RegExpObject: Object {
     uint flags() const;
 
 protected:
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
 };
 
 struct RegExpCtor: FunctionObject
@@ -113,7 +113,7 @@ struct RegExpCtor: FunctionObject
 
     static ReturnedValue construct(Managed *m, CallData *callData);
     static ReturnedValue call(Managed *that, CallData *callData);
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
 };
 
 struct RegExpPrototype: RegExpObject
index fe9d07e..5c02555 100644 (file)
@@ -604,7 +604,7 @@ void Runtime::setElement(ExecutionContext *ctx, const ValueRef object, const Val
 
     uint idx = index->asArrayIndex();
     if (idx < UINT_MAX) {
-        if (o->arrayType() == ArrayData::Simple) {
+        if (o->arrayType() == Heap::ArrayData::Simple) {
             SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData());
             if (s && idx < s->len() && !s->data(idx).isEmpty()) {
                 s->data(idx) = value;
index 90a3bf1..0bb679a 100644 (file)
@@ -110,7 +110,7 @@ struct ScopedValue
 #endif
     }
 
-    ScopedValue(const Scope &scope, HeapObject *o)
+    ScopedValue(const Scope &scope, Heap::Base *o)
     {
         ptr = scope.engine->jsStackTop++;
         ptr->m = o;
@@ -155,7 +155,7 @@ struct ScopedValue
         return *this;
     }
 
-    ScopedValue &operator=(HeapObject *o) {
+    ScopedValue &operator=(Heap::Base *o) {
         ptr->m = o;
 #if QT_POINTER_SIZE == 4
         ptr->tag = QV4::Value::Managed_Type;
@@ -228,7 +228,7 @@ struct Scoped
         ++scope.size;
 #endif
     }
-    Scoped(const Scope &scope, HeapObject *o)
+    Scoped(const Scope &scope, Heap::Base *o)
     {
         Value v;
         v.m = o;
@@ -316,7 +316,7 @@ struct Scoped
 #endif
     }
 
-    Scoped<T> &operator=(HeapObject *o) {
+    Scoped<T> &operator=(Heap::Base *o) {
         Value v;
         v.m = o;
 #if QT_POINTER_SIZE == 4
index 5c0c3f3..a85cb8f 100644 (file)
@@ -111,7 +111,7 @@ ReturnedValue QmlBindingWrapper::call(Managed *that, CallData *)
     return result.asReturnedValue();
 }
 
-void QmlBindingWrapper::markObjects(HeapObject *m, ExecutionEngine *e)
+void QmlBindingWrapper::markObjects(Heap::Base *m, ExecutionEngine *e)
 {
     QmlBindingWrapper::Data *wrapper = static_cast<QmlBindingWrapper::Data *>(m);
     if (wrapper->qml)
index f12d5ad..6aa92c3 100644 (file)
@@ -82,7 +82,7 @@ struct Q_QML_EXPORT QmlBindingWrapper : FunctionObject {
     V4_OBJECT(FunctionObject)
 
     static ReturnedValue call(Managed *that, CallData *);
-    static void markObjects(HeapObject *m, ExecutionEngine *e);
+    static void markObjects(Heap::Base *m, ExecutionEngine *e);
 
     CallContext *context() const { return d()->qmlContext; }
 
index c63e634..d666de4 100644 (file)
@@ -167,7 +167,7 @@ struct QQmlSequence : public QV4::Object
         {
             QV4::Scope scope(engine);
             QV4::Scoped<QQmlSequence<Container> > o(scope, this);
-            o->setArrayType(ArrayData::Custom);
+            o->setArrayType(Heap::ArrayData::Custom);
             o->init();
         }
 
@@ -179,7 +179,7 @@ struct QQmlSequence : public QV4::Object
         {
             QV4::Scope scope(engine);
             QV4::Scoped<QQmlSequence<Container> > o(scope, this);
-            o->setArrayType(ArrayData::Custom);
+            o->setArrayType(Heap::ArrayData::Custom);
             o->loadReference();
             o->init();
         }
index 4ae10f6..80fbec8 100644 (file)
@@ -122,7 +122,7 @@ void String::destroy(Managed *that)
     static_cast<String*>(that)->d()->~Data();
 }
 
-void String::markObjects(HeapObject *that, ExecutionEngine *e)
+void String::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     String::Data *s = static_cast<String::Data *>(that);
     if (s->largestSubLength) {
@@ -244,7 +244,7 @@ bool String::isEqualTo(Managed *t, Managed *o)
 
 
 String::Data::Data(ExecutionEngine *engine, const QString &t)
-    : Managed::Data(engine->stringClass)
+    : Heap::Base(engine->stringClass)
 {
     subtype = StringType_Unknown;
 
@@ -257,7 +257,7 @@ String::Data::Data(ExecutionEngine *engine, const QString &t)
 }
 
 String::Data::Data(ExecutionEngine *engine, String *l, String *r)
-    : Managed::Data(engine->stringClass)
+    : Heap::Base(engine->stringClass)
 {
     subtype = StringType_Unknown;
 
index 1e53132..9f47327 100644 (file)
@@ -45,7 +45,7 @@ struct Identifier;
 
 struct Q_QML_PRIVATE_EXPORT String : public Managed {
 #ifndef V4_BOOTSTRAP
-    struct Q_QML_PRIVATE_EXPORT Data : Managed::Data {
+    struct Q_QML_PRIVATE_EXPORT Data : Heap::Base {
         Data(ExecutionEngine *engine, const QString &text);
         Data(ExecutionEngine *engine, String *l, String *n);
         ~Data() {
@@ -154,7 +154,7 @@ struct Q_QML_PRIVATE_EXPORT String : public Managed {
 
 protected:
     static void destroy(Managed *);
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
     static ReturnedValue get(Managed *m, String *name, bool *hasProperty);
     static ReturnedValue getIndexed(Managed *m, uint index, bool *hasProperty);
     static void put(Managed *m, String *name, const ValueRef value);
index 19ef789..5b5731c 100644 (file)
@@ -149,7 +149,7 @@ void StringObject::advanceIterator(Managed *m, ObjectIterator *it, String *&name
     return Object::advanceIterator(m, it, name, index, p, attrs);
 }
 
-void StringObject::markObjects(HeapObject *that, ExecutionEngine *e)
+void StringObject::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     StringObject::Data *o = static_cast<StringObject::Data *>(that);
     o->value.stringValue()->mark(e);
index 28e944c..22e2ba6 100644 (file)
@@ -59,7 +59,7 @@ struct StringObject: Object {
 
 protected:
     static void advanceIterator(Managed *m, ObjectIterator *it, String *&name, uint *index, Property *p, PropertyAttributes *attrs);
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
 };
 
 struct StringCtor: FunctionObject
index 72823ef..059e011 100644 (file)
@@ -339,7 +339,7 @@ TypedArray::Data::Data(ExecutionEngine *e, Type t)
 {
 }
 
-void TypedArray::markObjects(HeapObject *that, ExecutionEngine *e)
+void TypedArray::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     static_cast<TypedArray::Data *>(that)->buffer->mark(e);
     Object::markObjects(that, e);
index 28847e0..2b266e5 100644 (file)
@@ -82,7 +82,7 @@ struct TypedArray : Object
     }
 
 
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
     static ReturnedValue getIndexed(Managed *m, uint index, bool *hasProperty);
     static void putIndexed(Managed *m, uint index, const ValueRef value);
 };
index 2600148..d7fbf4b 100644 (file)
@@ -49,13 +49,13 @@ inline bool Value::isString() const
 {
     if (!isManaged())
         return false;
-    return m && static_cast<Managed::Data *>(m)->internalClass->vtable->isString;
+    return m && static_cast<Heap::Base *>(m)->internalClass->vtable->isString;
 }
 inline bool Value::isObject() const
 {
     if (!isManaged())
         return false;
-    return m && static_cast<Managed::Data *>(m)->internalClass->vtable->isObject;
+    return m && static_cast<Heap::Base *>(m)->internalClass->vtable->isObject;
 }
 
 inline bool Value::isPrimitive() const
index fa2d544..d948659 100644 (file)
@@ -44,8 +44,10 @@ namespace QV4 {
 
 typedef uint Bool;
 
-struct Q_QML_EXPORT HeapObject {
-    HeapObject(InternalClass *internal)
+namespace Heap {
+
+struct Q_QML_EXPORT Base {
+    Base(InternalClass *internal)
         : internalClass(internal)
         , markBit(0)
         , inUse(1)
@@ -75,15 +77,17 @@ struct Q_QML_EXPORT HeapObject {
     inline void mark(QV4::ExecutionEngine *engine);
 
     void *operator new(size_t, Managed *m) { return m; }
-    void *operator new(size_t, HeapObject *m) { return m; }
-    void operator delete(void *, HeapObject *) {}
+    void *operator new(size_t, Heap::Base *m) { return m; }
+    void operator delete(void *, Heap::Base *) {}
 };
 
+}
+
 template <typename T>
-struct Returned : private HeapObject
+struct Returned : private Heap::Base
 {
-    static Returned<T> *create(T *t) { Q_ASSERT((void *)&t->data == (void *)t); return static_cast<Returned<T> *>(static_cast<HeapObject*>(t ? &t->data : 0)); }
-    static Returned<T> *create(typename T::Data *t) { return static_cast<Returned<T> *>(static_cast<HeapObject*>(t)); }
+    static Returned<T> *create(T *t) { Q_ASSERT((void *)&t->data == (void *)t); return static_cast<Returned<T> *>(static_cast<Heap::Base*>(t ? &t->data : 0)); }
+    static Returned<T> *create(typename T::Data *t) { return static_cast<Returned<T> *>(static_cast<Heap::Base*>(t)); }
     T *getPointer() { return reinterpret_cast<T *>(this); }
     template<typename X>
     static T *getPointer(Returned<X> *x) { return x->getPointer(); }
@@ -121,7 +125,7 @@ struct Q_QML_PRIVATE_EXPORT Value
     union {
         quint64 val;
 #if QT_POINTER_SIZE == 8
-        HeapObject *m;
+        Heap::Base *m;
 #else
         double dbl;
 #endif
@@ -133,7 +137,7 @@ struct Q_QML_PRIVATE_EXPORT Value
                 uint uint_32;
                 int int_32;
 #if QT_POINTER_SIZE == 4
-                HeapObject *m;
+                Heap::Base *m;
 #endif
             };
 #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
@@ -309,7 +313,7 @@ struct Q_QML_PRIVATE_EXPORT Value
     Managed *managed() const {
         return m ? reinterpret_cast<Managed*>(m) : 0;
     }
-    HeapObject *heapObject() const {
+    Heap::Base *heapObject() const {
         return m;
     }
 
@@ -317,7 +321,7 @@ struct Q_QML_PRIVATE_EXPORT Value
         return val;
     }
 
-    static inline Value fromHeapObject(HeapObject *m)
+    static inline Value fromHeapObject(Heap::Base *m)
     {
         Value v;
         v.m = m;
@@ -391,7 +395,7 @@ struct Q_QML_PRIVATE_EXPORT Value
         val = Value::fromManaged(t).val;
         return *this;
     }
-    Value &operator=(HeapObject *o) {
+    Value &operator=(Heap::Base *o) {
         m = o;
         return *this;
     }
@@ -581,9 +585,9 @@ private:
 };
 
 inline
-ReturnedValue HeapObject::asReturnedValue() const
+ReturnedValue Heap::Base::asReturnedValue() const
 {
-    return Value::fromHeapObject(const_cast<HeapObject *>(this)).asReturnedValue();
+    return Value::fromHeapObject(const_cast<Heap::Base *>(this)).asReturnedValue();
 }
 
 
index 980fc99..0ba72c1 100644 (file)
@@ -1090,7 +1090,7 @@ struct QmlIncubatorObject : public QV4::Object
     static QV4::ReturnedValue method_forceCompletion(QV4::CallContext *ctx);
 
     static void destroy(Managed *that);
-    static void markObjects(QV4::HeapObject *that, QV4::ExecutionEngine *e);
+    static void markObjects(QV4::Heap::Base *that, QV4::ExecutionEngine *e);
 
     void statusChanged(QQmlIncubator::Status);
     void setInitialState(QObject *);
@@ -1503,7 +1503,7 @@ void QmlIncubatorObject::destroy(Managed *that)
     static_cast<QmlIncubatorObject *>(that)->d()->~Data();
 }
 
-void QmlIncubatorObject::markObjects(QV4::HeapObject *that, QV4::ExecutionEngine *e)
+void QmlIncubatorObject::markObjects(QV4::Heap::Base *that, QV4::ExecutionEngine *e)
 {
     QmlIncubatorObject::Data *o = static_cast<QmlIncubatorObject::Data *>(that);
     o->valuemap.mark(e);
index df62f28..bbb7577 100644 (file)
@@ -347,7 +347,7 @@ void QmlContextWrapper::destroy(Managed *that)
     static_cast<QmlContextWrapper *>(that)->d()->~Data();
 }
 
-void QmlContextWrapper::markObjects(HeapObject *m, ExecutionEngine *engine)
+void QmlContextWrapper::markObjects(Heap::Base *m, ExecutionEngine *engine)
 {
     QmlContextWrapper::Data *This = static_cast<QmlContextWrapper::Data *>(m);
     if (This->idObjectsWrapper)
@@ -465,7 +465,7 @@ ReturnedValue QQmlIdObjectsArray::getIndexed(Managed *m, uint index, bool *hasPr
     return QObjectWrapper::wrap(This->engine(), context->idValues[index].data());
 }
 
-void QQmlIdObjectsArray::markObjects(HeapObject *that, ExecutionEngine *engine)
+void QQmlIdObjectsArray::markObjects(Heap::Base *that, ExecutionEngine *engine)
 {
     QQmlIdObjectsArray::Data *This = static_cast<QQmlIdObjectsArray::Data *>(that);
     This->contextWrapper->mark(engine);
index ae9e795..5f2229f 100644 (file)
@@ -93,7 +93,7 @@ struct Q_QML_EXPORT QmlContextWrapper : Object
     static ReturnedValue get(Managed *m, String *name, bool *hasProperty);
     static void put(Managed *m, String *name, const ValueRef value);
     static void destroy(Managed *that);
-    static void markObjects(HeapObject *m, ExecutionEngine *engine);
+    static void markObjects(Heap::Base *m, ExecutionEngine *engine);
 
     static void registerQmlDependencies(ExecutionEngine *context, const CompiledData::Function *compiledFunction);
 
@@ -111,7 +111,7 @@ struct QQmlIdObjectsArray : public Object
     V4_OBJECT(Object)
 
     static ReturnedValue getIndexed(Managed *m, uint index, bool *hasProperty);
-    static void markObjects(HeapObject *that, ExecutionEngine *engine);
+    static void markObjects(Heap::Base *that, ExecutionEngine *engine);
 
 };
 
index b62689c..50f1b55 100644 (file)
@@ -53,7 +53,7 @@ QmlListWrapper::Data::Data(QV8Engine *engine)
 
     QV4::Scope scope(QV8Engine::getV4(engine));
     QV4::ScopedObject o(scope, this);
-    o->setArrayType(ArrayData::Custom);
+    o->setArrayType(Heap::ArrayData::Custom);
 }
 
 QmlListWrapper::Data::~Data()
index 2acd40a..c8bf521 100644 (file)
@@ -1639,7 +1639,7 @@ struct QQmlXMLHttpRequestCtor : public FunctionObject
         Object *proto;
     };
     V4_OBJECT(FunctionObject)
-    static void markObjects(HeapObject *that, ExecutionEngine *e) {
+    static void markObjects(Heap::Base *that, ExecutionEngine *e) {
         QQmlXMLHttpRequestCtor::Data *c = static_cast<QQmlXMLHttpRequestCtor::Data *>(that);
         if (c->proto)
             c->proto->mark(e);
index 3a593d1..4ab360e 100644 (file)
@@ -1187,7 +1187,7 @@ ReturnedValue QQmlBindingFunction::call(Managed *that, CallData *callData)
     return This->d()->originalFunction->call(callData);
 }
 
-void QQmlBindingFunction::markObjects(HeapObject *that, ExecutionEngine *e)
+void QQmlBindingFunction::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
     QQmlBindingFunction::Data *This = static_cast<QQmlBindingFunction::Data *>(that);
     This->originalFunction->mark(e);
index 7fe7d2b..19b30bc 100644 (file)
@@ -155,7 +155,7 @@ struct QQmlBindingFunction : public QV4::FunctionObject
 
     static ReturnedValue call(Managed *that, CallData *callData);
 
-    static void markObjects(HeapObject *that, ExecutionEngine *e);
+    static void markObjects(Heap::Base *that, ExecutionEngine *e);
     static void destroy(Managed *that) {
         static_cast<QQmlBindingFunction *>(that)->d()->~Data();
     }
index e150545..d7c2946 100644 (file)
@@ -3262,7 +3262,7 @@ struct QQmlDelegateModelGroupChangeArray : public QV4::Object
             setVTable(staticVTable());
             QV4::Scope scope(engine);
             QV4::ScopedObject o(scope, this);
-            o->setArrayType(QV4::ArrayData::Custom);
+            o->setArrayType(QV4::Heap::ArrayData::Custom);
         }
         QVector<QQmlChangeSet::Change> changes;
     };
index 1b29cd0..d7330d3 100644 (file)
@@ -867,7 +867,7 @@ struct QQuickJSContext2DPixelData : public QV4::Object
             setVTable(staticVTable());
             QV4::Scope scope(engine);
             QV4::ScopedObject o(scope, this);
-            o->setArrayType(QV4::ArrayData::Custom);
+            o->setArrayType(QV4::Heap::ArrayData::Custom);
         }
         QImage image;
     };
@@ -908,7 +908,7 @@ struct QQuickJSContext2DImageData : public QV4::Object
     static QV4::ReturnedValue method_get_height(QV4::CallContext *ctx);
     static QV4::ReturnedValue method_get_data(QV4::CallContext *ctx);
 
-    static void markObjects(QV4::HeapObject *that, QV4::ExecutionEngine *engine) {
+    static void markObjects(QV4::Heap::Base *that, QV4::ExecutionEngine *engine) {
         static_cast<QQuickJSContext2DImageData::Data *>(that)->pixelData.mark(engine);
         QV4::Object::markObjects(that, engine);
     }
index ae33f92..907d568 100644 (file)
@@ -56,7 +56,7 @@ QV4::Returned<QQuickRootItemMarker> *QQuickRootItemMarker::create(QQmlEngine *en
     return e->memoryManager->alloc<QQuickRootItemMarker>(e, window);
 }
 
-void QQuickRootItemMarker::markObjects(QV4::HeapObject *that, QV4::ExecutionEngine *e)
+void QQuickRootItemMarker::markObjects(QV4::Heap::Base *that, QV4::ExecutionEngine *e)
 {
     QQuickItem *root = static_cast<QQuickRootItemMarker::Data *>(that)->window->contentItem();
     if (root) {
index 7e39ed8..3fc6cee 100644 (file)
@@ -110,7 +110,7 @@ struct QQuickRootItemMarker : public QV4::Object
 
     static QV4::Returned<QQuickRootItemMarker> *create(QQmlEngine *engine, QQuickWindow *window);
 
-    static void markObjects(QV4::HeapObject *that, QV4::ExecutionEngine *e);
+    static void markObjects(QV4::Heap::Base *that, QV4::ExecutionEngine *e);
 
 };