diff options
Diffstat (limited to 'src/qml/jsruntime/qv4managed_p.h')
-rw-r--r-- | src/qml/jsruntime/qv4managed_p.h | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h index 220363efff..79316ba40f 100644 --- a/src/qml/jsruntime/qv4managed_p.h +++ b/src/qml/jsruntime/qv4managed_p.h @@ -46,6 +46,7 @@ #include <QtCore/QDebug> #include "qv4global_p.h" #include "qv4value_def_p.h" +#include "qv4internalclass_p.h" QT_BEGIN_NAMESPACE @@ -155,11 +156,12 @@ private: protected: Managed(InternalClass *internal) - : _data(0), vtbl(&static_vtbl), internalClass(internal) + : _data(0), internalClass(internal) { inUse = 1; extensible = 1; } public: void *operator new(size_t size, MemoryManager *mm); + void *operator new(size_t, Managed *m) { return m; } void operator delete(void *ptr); void operator delete(void *ptr, MemoryManager *mm); @@ -191,12 +193,12 @@ public: template <typename T> T *as() { // ### FIXME: - if (!this) + if (!this || !internalClass) return 0; #if !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T *>(this)->qt_check_for_QMANAGED_macro(*reinterpret_cast<T *>(this)); #endif - return vtbl == &T::static_vtbl ? static_cast<T *>(this) : 0; + return internalClass->vtable == &T::static_vtbl ? static_cast<T *>(this) : 0; } template <typename T> const T *as() const { @@ -206,7 +208,7 @@ public: #if !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T *>(this)->qt_check_for_QMANAGED_macro(*reinterpret_cast<T *>(const_cast<Managed *>(this))); #endif - return vtbl == &T::static_vtbl ? static_cast<const T *>(this) : 0; + return internalClass->vtable == &T::static_vtbl ? static_cast<const T *>(this) : 0; } String *asString() { return type == Type_String ? reinterpret_cast<String *>(this) : 0; } @@ -237,6 +239,8 @@ public: *reinterpret_cast<Managed **>(this) = m; } + void setVTable(const ManagedVTable *vt); + ReturnedValue construct(CallData *d); ReturnedValue call(CallData *d); ReturnedValue get(const StringRef name, bool *hasProperty = 0); @@ -245,17 +249,17 @@ public: void putIndexed(uint index, const ValueRef value); PropertyAttributes query(StringRef name) const; PropertyAttributes queryIndexed(uint index) const - { return vtbl->queryIndexed(this, index); } + { return internalClass->vtable->queryIndexed(this, index); } bool deleteProperty(const StringRef name); bool deleteIndexedProperty(uint index) - { return vtbl->deleteIndexedProperty(this, index); } + { return internalClass->vtable->deleteIndexedProperty(this, index); } ReturnedValue getLookup(Lookup *l) - { return vtbl->getLookup(this, l); } + { return internalClass->vtable->getLookup(this, l); } void setLookup(Lookup *l, const ValueRef v); bool isEqualTo(Managed *other) - { return vtbl->isEqualTo(this, other); } + { return internalClass->vtable->isEqualTo(this, other); } Property *advanceIterator(ObjectIterator *it, StringRef name, uint *index, PropertyAttributes *attributes); static void destroy(Managed *that) { that->_data = 0; } @@ -292,8 +296,6 @@ public: }; }; -protected: - const ManagedVTable *vtbl; public: InternalClass *internalClass; @@ -332,10 +334,10 @@ inline FunctionObject *managed_cast(Managed *m) inline ReturnedValue Managed::construct(CallData *d) { - return vtbl->construct(this, d); + return internalClass->vtable->construct(this, d); } inline ReturnedValue Managed::call(CallData *d) { - return vtbl->call(this, d); + return internalClass->vtable->call(this, d); } } |