diff options
55 files changed, 233 insertions, 203 deletions
diff --git a/src/qml/jsruntime/qv4argumentsobject.cpp b/src/qml/jsruntime/qv4argumentsobject.cpp index c020e99cbb..209d99fea0 100644 --- a/src/qml/jsruntime/qv4argumentsobject.cpp +++ b/src/qml/jsruntime/qv4argumentsobject.cpp @@ -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) diff --git a/src/qml/jsruntime/qv4argumentsobject_p.h b/src/qml/jsruntime/qv4argumentsobject_p.h index d961d0881f..28b03c5cf9 100644 --- a/src/qml/jsruntime/qv4argumentsobject_p.h +++ b/src/qml/jsruntime/qv4argumentsobject_p.h @@ -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(); }; diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp index 5aaed1a98d..d7af678402 100644 --- a/src/qml/jsruntime/qv4arraydata.cpp +++ b/src/qml/jsruntime/qv4arraydata.cpp @@ -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(); diff --git a/src/qml/jsruntime/qv4arraydata_p.h b/src/qml/jsruntime/qv4arraydata_p.h index 5286be875b..10997a8e55 100644 --- a/src/qml/jsruntime/qv4arraydata_p.h +++ b/src/qml/jsruntime/qv4arraydata_p.h @@ -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 { diff --git a/src/qml/jsruntime/qv4arrayobject.cpp b/src/qml/jsruntime/qv4arrayobject.cpp index bbc0867c22..59d0c35be3 100644 --- a/src/qml/jsruntime/qv4arrayobject.cpp +++ b/src/qml/jsruntime/qv4arrayobject.cpp @@ -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(); diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp index 2dc8e8b608..2863068d41 100644 --- a/src/qml/jsruntime/qv4context.cpp +++ b/src/qml/jsruntime/qv4context.cpp @@ -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); diff --git a/src/qml/jsruntime/qv4context_p.h b/src/qml/jsruntime/qv4context_p.h index a942c12f6c..e45e82fda2 100644 --- a/src/qml/jsruntime/qv4context_p.h +++ b/src/qml/jsruntime/qv4context_p.h @@ -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 diff --git a/src/qml/jsruntime/qv4dataview.cpp b/src/qml/jsruntime/qv4dataview.cpp index 11cb04e22f..4d7e065580 100644 --- a/src/qml/jsruntime/qv4dataview.cpp +++ b/src/qml/jsruntime/qv4dataview.cpp @@ -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); diff --git a/src/qml/jsruntime/qv4dataview_p.h b/src/qml/jsruntime/qv4dataview_p.h index b1c2e361f4..e1a8aa79d9 100644 --- a/src/qml/jsruntime/qv4dataview_p.h +++ b/src/qml/jsruntime/qv4dataview_p.h @@ -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 diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index ff9d2cc181..fea731ae48 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -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) diff --git a/src/qml/jsruntime/qv4errorobject.cpp b/src/qml/jsruntime/qv4errorobject.cpp index ef664f2830..f0c151a644 100644 --- a/src/qml/jsruntime/qv4errorobject.cpp +++ b/src/qml/jsruntime/qv4errorobject.cpp @@ -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) diff --git a/src/qml/jsruntime/qv4errorobject_p.h b/src/qml/jsruntime/qv4errorobject_p.h index ffbdafcc43..359395ed72 100644 --- a/src/qml/jsruntime/qv4errorobject_p.h +++ b/src/qml/jsruntime/qv4errorobject_p.h @@ -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(); } }; diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp index 7c93cab0ca..216f732231 100644 --- a/src/qml/jsruntime/qv4functionobject.cpp +++ b/src/qml/jsruntime/qv4functionobject.cpp @@ -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); diff --git a/src/qml/jsruntime/qv4functionobject_p.h b/src/qml/jsruntime/qv4functionobject_p.h index 07a8c45aed..58b957125e 100644 --- a/src/qml/jsruntime/qv4functionobject_p.h +++ b/src/qml/jsruntime/qv4functionobject_p.h @@ -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); }; } diff --git a/src/qml/jsruntime/qv4global_p.h b/src/qml/jsruntime/qv4global_p.h index 71f217395b..b1e1f3ada6 100644 --- a/src/qml/jsruntime/qv4global_p.h +++ b/src/qml/jsruntime/qv4global_p.h @@ -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; diff --git a/src/qml/jsruntime/qv4lookup.cpp b/src/qml/jsruntime/qv4lookup.cpp index 9d4649b287..d14898d8f7 100644 --- a/src/qml/jsruntime/qv4lookup.cpp +++ b/src/qml/jsruntime/qv4lookup.cpp @@ -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; diff --git a/src/qml/jsruntime/qv4managed.cpp b/src/qml/jsruntime/qv4managed.cpp index 93286b3945..acaebdfc75 100644 --- a/src/qml/jsruntime/qv4managed.cpp +++ b/src/qml/jsruntime/qv4managed.cpp @@ -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); diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h index 91dc0fb034..cc7ce9d6b9 100644 --- a/src/qml/jsruntime/qv4managed_p.h +++ b/src/qml/jsruntime/qv4managed_p.h @@ -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, diff --git a/src/qml/jsruntime/qv4memberdata.cpp b/src/qml/jsruntime/qv4memberdata.cpp index bf07a74b96..fe670992d2 100644 --- a/src/qml/jsruntime/qv4memberdata.cpp +++ b/src/qml/jsruntime/qv4memberdata.cpp @@ -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; diff --git a/src/qml/jsruntime/qv4memberdata_p.h b/src/qml/jsruntime/qv4memberdata_p.h index 0177601b9f..c3c95079dd 100644 --- a/src/qml/jsruntime/qv4memberdata_p.h +++ b/src/qml/jsruntime/qv4memberdata_p.h @@ -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); }; } diff --git a/src/qml/jsruntime/qv4mm.cpp b/src/qml/jsruntime/qv4mm.cpp index df439e1c5e..2e15c249ca 100644 --- a/src/qml/jsruntime/qv4mm.cpp +++ b/src/qml/jsruntime/qv4mm.cpp @@ -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; diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp index f8b0c9f0a0..0859537c58 100644 --- a/src/qml/jsruntime/qv4object.cpp +++ b/src/qml/jsruntime/qv4object.cpp @@ -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); } diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h index 7347232857..ac3490c3f6 100644 --- a/src/qml/jsruntime/qv4object_p.h +++ b/src/qml/jsruntime/qv4object_p.h @@ -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); diff --git a/src/qml/jsruntime/qv4objectiterator.cpp b/src/qml/jsruntime/qv4objectiterator.cpp index e0f7087437..dfe37dfd53 100644 --- a/src/qml/jsruntime/qv4objectiterator.cpp +++ b/src/qml/jsruntime/qv4objectiterator.cpp @@ -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); diff --git a/src/qml/jsruntime/qv4objectiterator_p.h b/src/qml/jsruntime/qv4objectiterator_p.h index 10f75a1e0d..00d7c490e3 100644 --- a/src/qml/jsruntime/qv4objectiterator_p.h +++ b/src/qml/jsruntime/qv4objectiterator_p.h @@ -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); }; diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index cf59fe027c..23ce1e118f 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -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); diff --git a/src/qml/jsruntime/qv4qobjectwrapper_p.h b/src/qml/jsruntime/qv4qobjectwrapper_p.h index 6458f03037..8bcde64cb6 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper_p.h +++ b/src/qml/jsruntime/qv4qobjectwrapper_p.h @@ -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); diff --git a/src/qml/jsruntime/qv4regexp.cpp b/src/qml/jsruntime/qv4regexp.cpp index 659221b0d9..eab364c418 100644 --- a/src/qml/jsruntime/qv4regexp.cpp +++ b/src/qml/jsruntime/qv4regexp.cpp @@ -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); diff --git a/src/qml/jsruntime/qv4regexp_p.h b/src/qml/jsruntime/qv4regexp_p.h index 7aad1a32f2..2ce39e812c 100644 --- a/src/qml/jsruntime/qv4regexp_p.h +++ b/src/qml/jsruntime/qv4regexp_p.h @@ -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; }; diff --git a/src/qml/jsruntime/qv4regexpobject.cpp b/src/qml/jsruntime/qv4regexpobject.cpp index 2fd91a0675..115014a73f 100644 --- a/src/qml/jsruntime/qv4regexpobject.cpp +++ b/src/qml/jsruntime/qv4regexpobject.cpp @@ -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); diff --git a/src/qml/jsruntime/qv4regexpobject_p.h b/src/qml/jsruntime/qv4regexpobject_p.h index cf59ca12c0..8e415234bc 100644 --- a/src/qml/jsruntime/qv4regexpobject_p.h +++ b/src/qml/jsruntime/qv4regexpobject_p.h @@ -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 diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index fe9d07e772..5c02555a66 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -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; diff --git a/src/qml/jsruntime/qv4scopedvalue_p.h b/src/qml/jsruntime/qv4scopedvalue_p.h index 90a3bf1602..0bb679af78 100644 --- a/src/qml/jsruntime/qv4scopedvalue_p.h +++ b/src/qml/jsruntime/qv4scopedvalue_p.h @@ -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 diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp index 5c0c3f32ff..a85cb8f883 100644 --- a/src/qml/jsruntime/qv4script.cpp +++ b/src/qml/jsruntime/qv4script.cpp @@ -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) diff --git a/src/qml/jsruntime/qv4script_p.h b/src/qml/jsruntime/qv4script_p.h index f12d5ad6fc..6aa92c3516 100644 --- a/src/qml/jsruntime/qv4script_p.h +++ b/src/qml/jsruntime/qv4script_p.h @@ -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; } diff --git a/src/qml/jsruntime/qv4sequenceobject.cpp b/src/qml/jsruntime/qv4sequenceobject.cpp index c63e634025..d666de4125 100644 --- a/src/qml/jsruntime/qv4sequenceobject.cpp +++ b/src/qml/jsruntime/qv4sequenceobject.cpp @@ -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(); } diff --git a/src/qml/jsruntime/qv4string.cpp b/src/qml/jsruntime/qv4string.cpp index 4ae10f6506..80fbec81cc 100644 --- a/src/qml/jsruntime/qv4string.cpp +++ b/src/qml/jsruntime/qv4string.cpp @@ -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; diff --git a/src/qml/jsruntime/qv4string_p.h b/src/qml/jsruntime/qv4string_p.h index 1e53132fe3..9f47327661 100644 --- a/src/qml/jsruntime/qv4string_p.h +++ b/src/qml/jsruntime/qv4string_p.h @@ -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); diff --git a/src/qml/jsruntime/qv4stringobject.cpp b/src/qml/jsruntime/qv4stringobject.cpp index 19ef7892ad..5b5731c5b1 100644 --- a/src/qml/jsruntime/qv4stringobject.cpp +++ b/src/qml/jsruntime/qv4stringobject.cpp @@ -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); diff --git a/src/qml/jsruntime/qv4stringobject_p.h b/src/qml/jsruntime/qv4stringobject_p.h index 28e944c791..22e2ba6c0e 100644 --- a/src/qml/jsruntime/qv4stringobject_p.h +++ b/src/qml/jsruntime/qv4stringobject_p.h @@ -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 diff --git a/src/qml/jsruntime/qv4typedarray.cpp b/src/qml/jsruntime/qv4typedarray.cpp index 72823efa12..059e011d9e 100644 --- a/src/qml/jsruntime/qv4typedarray.cpp +++ b/src/qml/jsruntime/qv4typedarray.cpp @@ -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); diff --git a/src/qml/jsruntime/qv4typedarray_p.h b/src/qml/jsruntime/qv4typedarray_p.h index 28847e0c85..2b266e5169 100644 --- a/src/qml/jsruntime/qv4typedarray_p.h +++ b/src/qml/jsruntime/qv4typedarray_p.h @@ -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); }; diff --git a/src/qml/jsruntime/qv4value_inl_p.h b/src/qml/jsruntime/qv4value_inl_p.h index 2600148417..d7fbf4b231 100644 --- a/src/qml/jsruntime/qv4value_inl_p.h +++ b/src/qml/jsruntime/qv4value_inl_p.h @@ -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 diff --git a/src/qml/jsruntime/qv4value_p.h b/src/qml/jsruntime/qv4value_p.h index fa2d544fcf..d948659a74 100644 --- a/src/qml/jsruntime/qv4value_p.h +++ b/src/qml/jsruntime/qv4value_p.h @@ -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(); } diff --git a/src/qml/qml/qqmlcomponent.cpp b/src/qml/qml/qqmlcomponent.cpp index 980fc99b92..0ba72c1641 100644 --- a/src/qml/qml/qqmlcomponent.cpp +++ b/src/qml/qml/qqmlcomponent.cpp @@ -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); diff --git a/src/qml/qml/qqmlcontextwrapper.cpp b/src/qml/qml/qqmlcontextwrapper.cpp index df62f285e3..bbb757797e 100644 --- a/src/qml/qml/qqmlcontextwrapper.cpp +++ b/src/qml/qml/qqmlcontextwrapper.cpp @@ -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); diff --git a/src/qml/qml/qqmlcontextwrapper_p.h b/src/qml/qml/qqmlcontextwrapper_p.h index ae9e795a5c..5f2229fe51 100644 --- a/src/qml/qml/qqmlcontextwrapper_p.h +++ b/src/qml/qml/qqmlcontextwrapper_p.h @@ -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); }; diff --git a/src/qml/qml/qqmllistwrapper.cpp b/src/qml/qml/qqmllistwrapper.cpp index b62689c454..50f1b55b9b 100644 --- a/src/qml/qml/qqmllistwrapper.cpp +++ b/src/qml/qml/qqmllistwrapper.cpp @@ -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() diff --git a/src/qml/qml/qqmlxmlhttprequest.cpp b/src/qml/qml/qqmlxmlhttprequest.cpp index 2acd40ae44..c8bf521767 100644 --- a/src/qml/qml/qqmlxmlhttprequest.cpp +++ b/src/qml/qml/qqmlxmlhttprequest.cpp @@ -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); diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 3a593d1c5b..4ab360eb9a 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -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); diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h index 7fe7d2b914..19b30bcc86 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h +++ b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h @@ -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(); } diff --git a/src/qml/types/qqmldelegatemodel.cpp b/src/qml/types/qqmldelegatemodel.cpp index e150545926..d7c2946e3f 100644 --- a/src/qml/types/qqmldelegatemodel.cpp +++ b/src/qml/types/qqmldelegatemodel.cpp @@ -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; }; diff --git a/src/quick/items/context2d/qquickcontext2d.cpp b/src/quick/items/context2d/qquickcontext2d.cpp index 1b29cd0b02..d7330d3912 100644 --- a/src/quick/items/context2d/qquickcontext2d.cpp +++ b/src/quick/items/context2d/qquickcontext2d.cpp @@ -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); } diff --git a/src/quick/items/qquickview.cpp b/src/quick/items/qquickview.cpp index ae33f9261c..907d56812b 100644 --- a/src/quick/items/qquickview.cpp +++ b/src/quick/items/qquickview.cpp @@ -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) { diff --git a/src/quick/items/qquickview_p.h b/src/quick/items/qquickview_p.h index 7e39ed89b2..3fc6cee54e 100644 --- a/src/quick/items/qquickview_p.h +++ b/src/quick/items/qquickview_p.h @@ -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); }; |