diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-01-08 12:00:00 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-04-12 13:58:58 +0000 |
commit | 30850d1ebc28bfe68b329229b537a7d6a7791b29 (patch) | |
tree | 1c94b8a81bd1755adf42c077c8912acb25f121e1 /src/qml | |
parent | b6bb3fe4238c93d865e255c4681f07b9d4175529 (diff) |
Remove dependency from qv4heap_p.h onto qv4internalclass_p.h
This is required to be able to turn the internal class into
something that lives on the GC heap.
Change-Id: Ie4318588d420743b1e1ab1cd596a1c9d153eb793
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/jsruntime/qv4argumentsobject_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arraydata_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4context_p.h | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4dateobject_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4errorobject_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4functionobject_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4managed.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4managed_p.h | 9 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object_p.h | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4string.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4string_p.h | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4value.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4value_p.h | 11 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4vme_moth.cpp | 10 | ||||
-rw-r--r-- | src/qml/memory/qv4heap_p.h | 12 | ||||
-rw-r--r-- | src/qml/memory/qv4mm.cpp | 10 |
17 files changed, 45 insertions, 43 deletions
diff --git a/src/qml/jsruntime/qv4argumentsobject_p.h b/src/qml/jsruntime/qv4argumentsobject_p.h index ac281f555a..d163bbaf88 100644 --- a/src/qml/jsruntime/qv4argumentsobject_p.h +++ b/src/qml/jsruntime/qv4argumentsobject_p.h @@ -142,7 +142,7 @@ struct ArgumentsObject: Object { bool fullyCreated() const { return d()->fullyCreated; } static bool isNonStrictArgumentsObject(Managed *m) { - return m->d()->vtable() == staticVTable(); + return m->vtable() == staticVTable(); } bool defineOwnProperty(ExecutionEngine *engine, uint index, const Property *desc, PropertyAttributes attrs); diff --git a/src/qml/jsruntime/qv4arraydata_p.h b/src/qml/jsruntime/qv4arraydata_p.h index b2573b4491..613c3b2b50 100644 --- a/src/qml/jsruntime/qv4arraydata_p.h +++ b/src/qml/jsruntime/qv4arraydata_p.h @@ -117,7 +117,7 @@ DECLARE_HEAP_OBJECT(ArrayData, Base) { bool isSparse() const { return type == Sparse; } - const ArrayVTable *vtable() const { return reinterpret_cast<const ArrayVTable *>(Base::vtable()); } + const ArrayVTable *vtable() const { return reinterpret_cast<const ArrayVTable *>(internalClass->vtable); } inline ReturnedValue get(uint i) const { return vtable()->get(this, i); diff --git a/src/qml/jsruntime/qv4context_p.h b/src/qml/jsruntime/qv4context_p.h index aa3c07b668..ccc1653c36 100644 --- a/src/qml/jsruntime/qv4context_p.h +++ b/src/qml/jsruntime/qv4context_p.h @@ -120,6 +120,10 @@ DECLARE_HEAP_OBJECT(ExecutionContext, Base) { type = t; } + const VTable *vtable() const { + return internalClass->vtable; + } + quint32 type : 8; quint32 nArgs : 24; #if QT_POINTER_SIZE == 8 diff --git a/src/qml/jsruntime/qv4dateobject_p.h b/src/qml/jsruntime/qv4dateobject_p.h index 2b9a580288..0750d3bc75 100644 --- a/src/qml/jsruntime/qv4dateobject_p.h +++ b/src/qml/jsruntime/qv4dateobject_p.h @@ -101,7 +101,7 @@ struct DateObject: Object { template<> inline const DateObject *Value::as() const { - return isManaged() && m()->vtable()->type == Managed::Type_DateObject ? static_cast<const DateObject *>(this) : nullptr; + return isManaged() && m()->internalClass->vtable->type == Managed::Type_DateObject ? static_cast<const DateObject *>(this) : nullptr; } struct DateCtor: FunctionObject diff --git a/src/qml/jsruntime/qv4errorobject_p.h b/src/qml/jsruntime/qv4errorobject_p.h index bbb2e1ad55..9f51e6b99b 100644 --- a/src/qml/jsruntime/qv4errorobject_p.h +++ b/src/qml/jsruntime/qv4errorobject_p.h @@ -180,7 +180,7 @@ struct ErrorObject: Object { template<> inline const ErrorObject *Value::as() const { - return isManaged() && m()->vtable()->isErrorObject ? reinterpret_cast<const ErrorObject *>(this) : nullptr; + return isManaged() && m()->internalClass->vtable->isErrorObject ? reinterpret_cast<const ErrorObject *>(this) : nullptr; } struct EvalErrorObject: ErrorObject { diff --git a/src/qml/jsruntime/qv4functionobject_p.h b/src/qml/jsruntime/qv4functionobject_p.h index 373d7fe39e..08fe02a462 100644 --- a/src/qml/jsruntime/qv4functionobject_p.h +++ b/src/qml/jsruntime/qv4functionobject_p.h @@ -179,7 +179,7 @@ struct Q_QML_EXPORT FunctionObject: Object { template<> inline const FunctionObject *Value::as() const { - return isManaged() && m()->vtable()->isFunctionObject ? reinterpret_cast<const FunctionObject *>(this) : nullptr; + return isManaged() && m()->internalClass->vtable->isFunctionObject ? reinterpret_cast<const FunctionObject *>(this) : nullptr; } diff --git a/src/qml/jsruntime/qv4managed.cpp b/src/qml/jsruntime/qv4managed.cpp index b50e5f0355..082a3b42e4 100644 --- a/src/qml/jsruntime/qv4managed.cpp +++ b/src/qml/jsruntime/qv4managed.cpp @@ -67,7 +67,7 @@ const VTable Managed::static_vtbl = QString Managed::className() const { const char *s = nullptr; - switch (Type(d()->vtable()->type)) { + switch (Type(vtable()->type)) { case Type_Invalid: case Type_String: return QString(); diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h index 092c61b81c..73df9a2f30 100644 --- a/src/qml/jsruntime/qv4managed_p.h +++ b/src/qml/jsruntime/qv4managed_p.h @@ -201,17 +201,18 @@ public: Q_MANAGED_TYPE(Invalid) InternalClass *internalClass() const { return d()->internalClass; } + const VTable *vtable() const { return d()->internalClass->vtable; } inline ExecutionEngine *engine() const { return internalClass()->engine; } - bool isListType() const { return d()->vtable()->type == Type_QmlSequence; } + bool isListType() const { return d()->internalClass->vtable->type == Type_QmlSequence; } - bool isArrayObject() const { return d()->vtable()->type == Type_ArrayObject; } - bool isStringObject() const { return d()->vtable()->type == Type_StringObject; } + bool isArrayObject() const { return d()->internalClass->vtable->type == Type_ArrayObject; } + bool isStringObject() const { return d()->internalClass->vtable->type == Type_StringObject; } QString className() const; bool isEqualTo(const Managed *other) const - { return d()->vtable()->isEqualTo(const_cast<Managed *>(this), const_cast<Managed *>(other)); } + { return d()->internalClass->vtable->isEqualTo(const_cast<Managed *>(this), const_cast<Managed *>(other)); } static bool isEqualTo(Managed *m, Managed *other); diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h index 1731ae3c76..4743900196 100644 --- a/src/qml/jsruntime/qv4object_p.h +++ b/src/qml/jsruntime/qv4object_p.h @@ -74,6 +74,10 @@ DECLARE_EXPORTED_HEAP_OBJECT(Object, Base) { static void markObjects(Heap::Base *base, MarkStack *stack); void init() { Base::init(); } + const VTable *vtable() const { + return internalClass->vtable; + } + const Value *inlinePropertyDataWithOffset(uint indexWithOffset) const { Q_ASSERT(indexWithOffset >= vtable()->inlinePropertyOffset && indexWithOffset < vtable()->inlinePropertyOffset + vtable()->nInlineProperties); return reinterpret_cast<const Value *>(this) + indexWithOffset; @@ -551,7 +555,7 @@ inline void Object::arraySet(uint index, const Value &value) template<> inline const ArrayObject *Value::as() const { - return isManaged() && m()->vtable()->type == Managed::Type_ArrayObject ? static_cast<const ArrayObject *>(this) : nullptr; + return isManaged() && m()->internalClass->vtable->type == Managed::Type_ArrayObject ? static_cast<const ArrayObject *>(this) : nullptr; } #ifndef V4_BOOTSTRAP diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 11f66446d2..a150f84d44 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -617,7 +617,7 @@ ReturnedValue Runtime::method_loadElement(ExecutionEngine *engine, const Value & uint idx = 0; if (index.asArrayIndex(idx)) { if (Heap::Base *b = object.heapObject()) { - if (b->vtable()->isObject) { + if (b->internalClass->vtable->isObject) { Heap::Object *o = static_cast<Heap::Object *>(b); if (o->arrayData && o->arrayData->type == Heap::ArrayData::Simple) { Heap::SimpleArrayData *s = o->arrayData.cast<Heap::SimpleArrayData>(); @@ -661,7 +661,7 @@ bool Runtime::method_storeElement(ExecutionEngine *engine, const Value &object, uint idx = 0; if (index.asArrayIndex(idx)) { if (Heap::Base *b = object.heapObject()) { - if (b->vtable()->isObject) { + if (b->internalClass->vtable->isObject) { Heap::Object *o = static_cast<Heap::Object *>(b); if (o->arrayData && o->arrayData->type == Heap::ArrayData::Simple) { Heap::SimpleArrayData *s = o->arrayData.cast<Heap::SimpleArrayData>(); diff --git a/src/qml/jsruntime/qv4string.cpp b/src/qml/jsruntime/qv4string.cpp index 447992ebec..f107860b26 100644 --- a/src/qml/jsruntime/qv4string.cpp +++ b/src/qml/jsruntime/qv4string.cpp @@ -76,7 +76,7 @@ bool String::isEqualTo(Managed *t, Managed *o) if (t == o) return true; - if (!o->d()->vtable()->isString) + if (!o->vtable()->isString) return false; return static_cast<String *>(t)->isEqualTo(static_cast<String *>(o)); diff --git a/src/qml/jsruntime/qv4string_p.h b/src/qml/jsruntime/qv4string_p.h index 5466cc274d..72c4057b20 100644 --- a/src/qml/jsruntime/qv4string_p.h +++ b/src/qml/jsruntime/qv4string_p.h @@ -76,6 +76,10 @@ struct Q_QML_PRIVATE_EXPORT String : Base { }; #ifndef V4_BOOTSTRAP + const VTable *vtable() const { + return internalClass->vtable; + } + void init(const QString &text); void destroy(); void simplifyString() const; @@ -282,7 +286,7 @@ struct ComplexString : String { template<> inline const String *Value::as() const { - return isManaged() && m()->vtable()->isString ? static_cast<const String *>(this) : nullptr; + return isManaged() && m()->internalClass->vtable->isString ? static_cast<const String *>(this) : nullptr; } template<> diff --git a/src/qml/jsruntime/qv4value.cpp b/src/qml/jsruntime/qv4value.cpp index 0d4711df3c..c558c27521 100644 --- a/src/qml/jsruntime/qv4value.cpp +++ b/src/qml/jsruntime/qv4value.cpp @@ -84,7 +84,7 @@ bool Value::toBooleanImpl(Value val) #ifdef V4_BOOTSTRAP Q_UNIMPLEMENTED(); #else - if (b->vtable()->isString) + if (b->internalClass->vtable->isString) return static_cast<Heap::String *>(b)->length() > 0; #endif return true; diff --git a/src/qml/jsruntime/qv4value_p.h b/src/qml/jsruntime/qv4value_p.h index a5ee6b5373..42c0370138 100644 --- a/src/qml/jsruntime/qv4value_p.h +++ b/src/qml/jsruntime/qv4value_p.h @@ -56,6 +56,7 @@ #include <QtCore/QString> #include "qv4global_p.h" #include <private/qv4heap_p.h> +#include <private/qv4internalclass_p.h> #include <private/qnumeric_p.h> @@ -428,11 +429,11 @@ public: if (!isManaged()) return nullptr; - Q_ASSERT(m()->vtable()); + Q_ASSERT(m()->internalClass->vtable); #if !defined(QT_NO_QOBJECT_CHECK) static_cast<const T *>(this)->qt_check_for_QMANAGED_macro(static_cast<const T *>(this)); #endif - const VTable *vt = m()->vtable(); + const VTable *vt = m()->internalClass->vtable; while (vt) { if (vt == T::staticVTable()) return static_cast<const T *>(this); @@ -500,18 +501,18 @@ inline void Value::mark(MarkStack *markStack) inline bool Value::isString() const { Heap::Base *b = heapObject(); - return b && b->vtable()->isString; + return b && b->internalClass->vtable->isString; } inline bool Value::isObject() const { Heap::Base *b = heapObject(); - return b && b->vtable()->isObject; + return b && b->internalClass->vtable->isObject; } inline bool Value::isFunctionObject() const { Heap::Base *b = heapObject(); - return b && b->vtable()->isFunctionObject; + return b && b->internalClass->vtable->isFunctionObject; } inline bool Value::isPrimitive() const diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp index e73365e9b1..fbb2744c15 100644 --- a/src/qml/jsruntime/qv4vme_moth.cpp +++ b/src/qml/jsruntime/qv4vme_moth.cpp @@ -397,13 +397,13 @@ static bool compareEqual(Value lhs, Value rhs) Heap::Base *r = rhs.m(); Q_ASSERT(l); Q_ASSERT(r); - if (l->vtable()->isString == r->vtable()->isString) + if (l->internalClass->vtable->isString == r->internalClass->vtable->isString) return static_cast<QV4::Managed &>(lhs).isEqualTo(&static_cast<QV4::Managed &>(rhs)); - if (l->vtable()->isString) { + if (l->internalClass->vtable->isString) { rhs = Primitive::fromReturnedValue(RuntimeHelpers::objectDefaultValue(&static_cast<QV4::Object &>(rhs), PREFERREDTYPE_HINT)); break; } else { - Q_ASSERT(r->vtable()->isString); + Q_ASSERT(r->internalClass->vtable->isString); lhs = Primitive::fromReturnedValue(RuntimeHelpers::objectDefaultValue(&static_cast<QV4::Object &>(lhs), PREFERREDTYPE_HINT)); break; } @@ -418,7 +418,7 @@ static bool compareEqual(Value lhs, Value rhs) rhs = Primitive::fromDouble(rhs.int_32()); // fall through default: // double - if (lhs.m()->vtable()->isString) + if (lhs.m()->internalClass->vtable->isString) return RuntimeHelpers::toNumber(lhs) == rhs.doubleValue(); else lhs = Primitive::fromReturnedValue(RuntimeHelpers::objectDefaultValue(&static_cast<QV4::Object &>(lhs), PREFERREDTYPE_HINT)); @@ -462,7 +462,7 @@ static bool compareEqualInt(Value &accumulator, Value lhs, int rhs) case Value::QT_ManagedOrUndefined2: case Value::QT_ManagedOrUndefined3: // LHS: Managed - if (lhs.m()->vtable()->isString) + if (lhs.m()->internalClass->vtable->isString) return RuntimeHelpers::stringToNumber(static_cast<String &>(lhs).toQString()) == rhs; accumulator = lhs; lhs = Primitive::fromReturnedValue(RuntimeHelpers::objectDefaultValue(&static_cast<QV4::Object &>(accumulator), PREFERREDTYPE_HINT)); diff --git a/src/qml/memory/qv4heap_p.h b/src/qml/memory/qv4heap_p.h index 403f400bee..1ca37fe95f 100644 --- a/src/qml/memory/qv4heap_p.h +++ b/src/qml/memory/qv4heap_p.h @@ -54,7 +54,6 @@ #include <private/qv4global_p.h> #include <private/qv4mmdefs_p.h> #include <private/qv4writebarrier_p.h> -#include <private/qv4internalclass_p.h> #include <QSharedPointer> // To check if Heap::Base::init is called (meaning, all subclasses did their init and called their @@ -121,7 +120,6 @@ struct Q_QML_EXPORT Base { inline ReturnedValue asReturnedValue() const; inline void mark(QV4::MarkStack *markStack); - inline const VTable *vtable() const; inline bool isMarked() const { const HeapItem *h = reinterpret_cast<const HeapItem *>(this); Chunk *c = h->chunk(); @@ -148,10 +146,6 @@ struct Q_QML_EXPORT Base { return Chunk::testBit(c->objectBitmap, h - c->realBase()); } - inline void markChildren(MarkStack *markStack) { - vtable()->markObjects(this, markStack); - } - void *operator new(size_t, Managed *m) { return m; } void *operator new(size_t, Base *m) { return m; } void operator delete(void *, Base *) {} @@ -218,12 +212,6 @@ void Base::mark(QV4::MarkStack *markStack) } } -inline -const VTable *Base::vtable() const -{ - return internalClass->vtable; -} - template<typename T, size_t o> Base *Pointer<T, o>::base() { Base *base = reinterpret_cast<Base *>(this) - (offset/sizeof(Base *)); diff --git a/src/qml/memory/qv4mm.cpp b/src/qml/memory/qv4mm.cpp index 4e83abebdf..6e38081c9d 100644 --- a/src/qml/memory/qv4mm.cpp +++ b/src/qml/memory/qv4mm.cpp @@ -335,7 +335,7 @@ bool Chunk::sweep(ExecutionEngine *engine) HeapItem *itemToFree = o + index; Heap::Base *b = *itemToFree; - const VTable *v = b->vtable(); + const VTable *v = b->internalClass->vtable; // if (Q_UNLIKELY(classCountPtr)) // classCountPtr(v->className); if (v->destroy) { @@ -389,8 +389,8 @@ void Chunk::freeAll(ExecutionEngine *engine) HeapItem *itemToFree = o + index; Heap::Base *b = *itemToFree; - if (b->vtable()->destroy) { - b->vtable()->destroy(b); + if (b->internalClass->vtable->destroy) { + b->internalClass->vtable->destroy(b); b->_checkIsDestroyed(); } #ifdef V4_USE_HEAPTRACK @@ -691,7 +691,7 @@ static void freeHugeChunk(ChunkAllocator *chunkAllocator, const HugeItemAllocato { HeapItem *itemToFree = c.chunk->first(); Heap::Base *b = *itemToFree; - const VTable *v = b->vtable(); + const VTable *v = b->internalClass->vtable; if (Q_UNLIKELY(classCountPtr)) classCountPtr(v->className); @@ -911,7 +911,7 @@ void MarkStack::drain() Heap::Base *h = pop(); ++markStackSize; Q_ASSERT(h); // at this point we should only have Heap::Base objects in this area on the stack. If not, weird things might happen. - h->markChildren(this); + h->internalClass->vtable->markObjects(h, this); } } |