diff options
-rw-r--r-- | src/qml/qml/qqmlcontextwrapper.cpp | 31 | ||||
-rw-r--r-- | src/qml/qml/qqmlcontextwrapper_p.h | 15 | ||||
-rw-r--r-- | src/qml/qml/qqmllistwrapper.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/qqmllistwrapper_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmltypewrapper.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmltypewrapper_p.h | 3 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 12 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper_p.h | 4 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4managed_p.h | 58 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4sequenceobject.cpp | 75 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4value_p.h | 5 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4variantobject.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine.cpp | 12 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8qobjectwrapper.cpp | 3 | ||||
-rw-r--r-- | src/qml/types/qquickworkerscript.cpp | 2 | ||||
-rw-r--r-- | tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp | 4 |
16 files changed, 116 insertions, 122 deletions
diff --git a/src/qml/qml/qqmlcontextwrapper.cpp b/src/qml/qml/qqmlcontextwrapper.cpp index b7a236b2b8..c7ac48902d 100644 --- a/src/qml/qml/qqmlcontextwrapper.cpp +++ b/src/qml/qml/qqmlcontextwrapper.cpp @@ -55,25 +55,6 @@ QT_BEGIN_NAMESPACE -namespace QV4 { - -struct QmlContextNullWrapper : QmlContextWrapper -{ - QmlContextNullWrapper(QV8Engine *engine, QQmlContextData *context, QObject *scopeObject, bool ownsContext = false) - : QmlContextWrapper(engine, context, scopeObject, ownsContext) - { - vtbl = &static_vtbl; - } - - using Object::get; - static void put(Managed *m, ExecutionContext *ctx, String *name, const Value &value); - -private: - const static ManagedVTable static_vtbl; -}; - -} - using namespace QV4; DEFINE_MANAGED_VTABLE(QmlContextWrapper); @@ -123,14 +104,14 @@ QQmlContextData *QmlContextWrapper::callingContext(ExecutionEngine *v4) if (!qmlglobal) return 0; - QmlContextWrapper *c = qmlglobal->asQmlContext(); + QmlContextWrapper *c = qmlglobal->as<QmlContextWrapper>(); return c ? c->getContext() : 0; } QQmlContextData *QmlContextWrapper::getContext(const Value &value) { Object *o = value.asObject(); - QmlContextWrapper *c = o ? o->asQmlContext() : 0; + QmlContextWrapper *c = o ? o->as<QmlContextWrapper>() : 0; if (!c) return 0; @@ -140,7 +121,7 @@ QQmlContextData *QmlContextWrapper::getContext(const Value &value) void QmlContextWrapper::takeContextOwnership(const Value &qmlglobal) { Object *o = qmlglobal.asObject(); - QmlContextWrapper *c = o ? o->asQmlContext() : 0; + QmlContextWrapper *c = o ? o->as<QmlContextWrapper>() : 0; assert(c); c->ownsContext = true; } @@ -148,7 +129,7 @@ void QmlContextWrapper::takeContextOwnership(const Value &qmlglobal) Value QmlContextWrapper::get(Managed *m, ExecutionContext *ctx, String *name, bool *hasProperty) { - QmlContextWrapper *resource = m->asQmlContext(); + QmlContextWrapper *resource = m->as<QmlContextWrapper>(); if (!resource) ctx->throwTypeError(); @@ -284,7 +265,7 @@ Value QmlContextWrapper::get(Managed *m, ExecutionContext *ctx, String *name, bo void QmlContextWrapper::put(Managed *m, ExecutionContext *ctx, String *name, const Value &value) { - QmlContextWrapper *wrapper = m->asQmlContext(); + QmlContextWrapper *wrapper = m->as<QmlContextWrapper>(); if (!wrapper) ctx->throwTypeError(); @@ -350,7 +331,7 @@ void QmlContextWrapper::destroy(Managed *that) void QmlContextNullWrapper::put(Managed *m, ExecutionContext *ctx, String *name, const Value &value) { - QmlContextWrapper *w = m->asQmlContext(); + QmlContextWrapper *w = m->as<QmlContextWrapper>(); if (w && w->readOnly) { QString error = QLatin1String("Invalid write to global property \"") + name->toQString() + QLatin1Char('"'); diff --git a/src/qml/qml/qqmlcontextwrapper_p.h b/src/qml/qml/qqmlcontextwrapper_p.h index a8df7ba2b6..41026eed32 100644 --- a/src/qml/qml/qqmlcontextwrapper_p.h +++ b/src/qml/qml/qqmlcontextwrapper_p.h @@ -66,6 +66,7 @@ namespace QV4 { struct Q_QML_EXPORT QmlContextWrapper : Object { + Q_MANAGED QmlContextWrapper(QV8Engine *engine, QQmlContextData *context, QObject *scopeObject, bool ownsContext = false); ~QmlContextWrapper(); @@ -92,9 +93,19 @@ struct Q_QML_EXPORT QmlContextWrapper : Object QQmlGuardedContextData context; QQmlGuard<QObject> scopeObject; +}; -private: - const static ManagedVTable static_vtbl; +struct QmlContextNullWrapper : QmlContextWrapper +{ + Q_MANAGED + QmlContextNullWrapper(QV8Engine *engine, QQmlContextData *context, QObject *scopeObject, bool ownsContext = false) + : QmlContextWrapper(engine, context, scopeObject, ownsContext) + { + vtbl = &static_vtbl; + } + + using Object::get; + static void put(Managed *m, ExecutionContext *ctx, String *name, const Value &value); }; } diff --git a/src/qml/qml/qqmllistwrapper.cpp b/src/qml/qml/qqmllistwrapper.cpp index ff878c0d9c..e8bc053ec1 100644 --- a/src/qml/qml/qqmllistwrapper.cpp +++ b/src/qml/qml/qqmllistwrapper.cpp @@ -100,7 +100,7 @@ QVariant QmlListWrapper::toVariant() const Value QmlListWrapper::get(Managed *m, ExecutionContext *ctx, String *name, bool *hasProperty) { - QmlListWrapper *w = m->asQmlListWrapper(); + QmlListWrapper *w = m->as<QmlListWrapper>(); if (!w) ctx->throwTypeError(); @@ -114,7 +114,7 @@ Value QmlListWrapper::get(Managed *m, ExecutionContext *ctx, String *name, bool Value QmlListWrapper::getIndexed(Managed *m, ExecutionContext *ctx, uint index, bool *hasProperty) { - QmlListWrapper *w = m->asQmlListWrapper(); + QmlListWrapper *w = m->as<QmlListWrapper>(); if (!w) ctx->throwTypeError(); @@ -136,7 +136,7 @@ void QmlListWrapper::put(Managed *m, ExecutionContext *ctx, String *name, const void QmlListWrapper::destroy(Managed *that) { - QmlListWrapper *w = that->asQmlListWrapper(); + QmlListWrapper *w = that->as<QmlListWrapper>(); w->~QmlListWrapper(); } diff --git a/src/qml/qml/qqmllistwrapper_p.h b/src/qml/qml/qqmllistwrapper_p.h index 6cbcef1093..5e8a84b87a 100644 --- a/src/qml/qml/qqmllistwrapper_p.h +++ b/src/qml/qml/qqmllistwrapper_p.h @@ -68,6 +68,7 @@ namespace QV4 { struct Q_QML_EXPORT QmlListWrapper : Object { + Q_MANAGED protected: QmlListWrapper(QV8Engine *engine); ~QmlListWrapper(); @@ -90,7 +91,6 @@ private: QQmlListProperty<QObject> property; int propertyType; - static const ManagedVTable static_vtbl; }; } diff --git a/src/qml/qml/qqmltypewrapper.cpp b/src/qml/qml/qqmltypewrapper.cpp index cdc9265004..1c2fd1f479 100644 --- a/src/qml/qml/qqmltypewrapper.cpp +++ b/src/qml/qml/qqmltypewrapper.cpp @@ -117,7 +117,7 @@ Value QmlTypeWrapper::create(QV8Engine *v8, QObject *o, QQmlTypeNameCache *t, co Value QmlTypeWrapper::get(Managed *m, ExecutionContext *ctx, String *name, bool *hasProperty) { - QmlTypeWrapper *w = m->asQmlTypeWrapper(); + QmlTypeWrapper *w = m->as<QmlTypeWrapper>(); if (!w) ctx->throwTypeError(); @@ -229,7 +229,7 @@ Value QmlTypeWrapper::get(Managed *m, ExecutionContext *ctx, String *name, bool void QmlTypeWrapper::put(Managed *m, ExecutionContext *ctx, String *name, const Value &value) { - QmlTypeWrapper *w = m->asQmlTypeWrapper(); + QmlTypeWrapper *w = m->as<QmlTypeWrapper>(); if (!w) ctx->throwTypeError(); diff --git a/src/qml/qml/qqmltypewrapper_p.h b/src/qml/qml/qqmltypewrapper_p.h index dc86991605..c81b4cc0c9 100644 --- a/src/qml/qml/qqmltypewrapper_p.h +++ b/src/qml/qml/qqmltypewrapper_p.h @@ -68,6 +68,7 @@ namespace QV4 { struct Q_QML_EXPORT QmlTypeWrapper : Object { + Q_MANAGED private: QmlTypeWrapper(QV8Engine *engine); ~QmlTypeWrapper(); @@ -93,8 +94,6 @@ private: QQmlType *type; QQmlTypeNameCache *typeNamespace; const void *importNamespace; - - const static ManagedVTable static_vtbl; }; } diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index ddc22daa5e..03e4639ae8 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -181,7 +181,7 @@ QVariant QmlValueTypeWrapper::toVariant() const void QmlValueTypeWrapper::destroy(Managed *that) { - QmlValueTypeWrapper *w = that->asQmlValueTypeWrapper(); + QmlValueTypeWrapper *w = that->as<QmlValueTypeWrapper>(); assert(w); if (w->objectType == Reference) static_cast<QmlValueTypeReference *>(w)->~QmlValueTypeReference(); @@ -191,13 +191,13 @@ void QmlValueTypeWrapper::destroy(Managed *that) bool QmlValueTypeWrapper::isEqualTo(Managed *m, Managed *other) { - QV4::QmlValueTypeWrapper *lv = m->asQmlValueTypeWrapper(); + QV4::QmlValueTypeWrapper *lv = m->as<QmlValueTypeWrapper>(); assert(lv); if (QV4::VariantObject *rv = other->asVariantObject()) return lv->isEqual(rv->data); - if (QV4::QmlValueTypeWrapper *v = other->asQmlValueTypeWrapper()) + if (QV4::QmlValueTypeWrapper *v = other->as<QmlValueTypeWrapper>()) return lv->isEqual(v->toVariant()); return false; @@ -227,7 +227,7 @@ Value QmlValueTypeWrapper::method_toString(SimpleCallContext *ctx) Object *o = ctx->thisObject.asObject(); if (!o) ctx->throwTypeError(); - QmlValueTypeWrapper *w = o->asQmlValueTypeWrapper(); + QmlValueTypeWrapper *w = o->as<QmlValueTypeWrapper>(); if (!w) ctx->throwTypeError(); @@ -248,7 +248,7 @@ Value QmlValueTypeWrapper::method_toString(SimpleCallContext *ctx) Value QmlValueTypeWrapper::get(Managed *m, ExecutionContext *ctx, String *name, bool *hasProperty) { - QmlValueTypeWrapper *r = m->asQmlValueTypeWrapper(); + QmlValueTypeWrapper *r = m->as<QmlValueTypeWrapper>(); if (!r) ctx->throwTypeError(); @@ -311,7 +311,7 @@ Value QmlValueTypeWrapper::get(Managed *m, ExecutionContext *ctx, String *name, void QmlValueTypeWrapper::put(Managed *m, ExecutionContext *ctx, String *name, const Value &value) { - QmlValueTypeWrapper *r = m->asQmlValueTypeWrapper(); + QmlValueTypeWrapper *r = m->as<QmlValueTypeWrapper>(); if (!r) ctx->throwTypeError(); diff --git a/src/qml/qml/qqmlvaluetypewrapper_p.h b/src/qml/qml/qqmlvaluetypewrapper_p.h index c75556a71b..4841bcc523 100644 --- a/src/qml/qml/qqmlvaluetypewrapper_p.h +++ b/src/qml/qml/qqmlvaluetypewrapper_p.h @@ -68,6 +68,7 @@ namespace QV4 { struct Q_QML_EXPORT QmlValueTypeWrapper : Object { + Q_MANAGED protected: enum ObjectType { Reference, Copy }; QmlValueTypeWrapper(QV8Engine *engine, ObjectType type); @@ -93,9 +94,6 @@ public: ObjectType objectType; mutable QQmlValueType *type; -private: - const static ManagedVTable static_vtbl; - static void initProto(ExecutionEngine *v4); static PersistentValue proto; }; diff --git a/src/qml/qml/v4/qv4managed_p.h b/src/qml/qml/v4/qv4managed_p.h index f9641e6689..a942377163 100644 --- a/src/qml/qml/v4/qv4managed_p.h +++ b/src/qml/qml/v4/qv4managed_p.h @@ -50,7 +50,6 @@ QT_BEGIN_NAMESPACE class QQmlLocaleData; class QQuickJSContext2D; -template <typename, int> class QQmlSequence; namespace QV4 { @@ -81,10 +80,22 @@ struct ExecutionEngine; struct VariantObject; struct QObjectWrapper; struct QtObject; -struct QmlContextWrapper; -struct QmlTypeWrapper; -struct QmlValueTypeWrapper; -struct QmlListWrapper; + +#define Q_MANAGED_CHECK \ + template <typename T> inline void qt_check_for_QMANAGED_macro(const T &_q_argument) const \ + { int i = qYouForgotTheQ_MANAGED_Macro(this, &_q_argument); i = i + 1; } + +template <typename T> +inline int qYouForgotTheQ_MANAGED_Macro(T, T) { return 0; } + +template <typename T1, typename T2> +inline void qYouForgotTheQ_MANAGED_Macro(T1, T2) {} + +#define Q_MANAGED \ + public: \ + Q_MANAGED_CHECK \ + static const ManagedVTable static_vtbl; + struct ManagedVTable { @@ -178,13 +189,7 @@ public: Type_QmlLocale, Type_QQuickJSContext2D, - // QML sequence types - Type_QmlIntList, - Type_QmlRealList, - Type_QmlBoolList, - Type_QmlStringList, - Type_QmlQStringList, - Type_QmlUrlList, + Type_QmlSequence, // Wrapped QVariant Type_QVariant, @@ -201,6 +206,22 @@ public: String *asString() { return reinterpret_cast<String *>(this); } Object *asObject() { return reinterpret_cast<Object *>(this); } + + template <typename T> + T *as() { +#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; + } + template <typename T> + const T *as() const { +#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; + } + ArrayObject *asArrayObject() { return type == Type_ArrayObject ? reinterpret_cast<ArrayObject *>(this) : 0; } FunctionObject *asFunctionObject() { return type == Type_FunctionObject ? reinterpret_cast<FunctionObject *>(this) : 0; } BooleanObject *asBooleanObject() { return type == Type_BooleanObject ? reinterpret_cast<BooleanObject *>(this) : 0; } @@ -220,20 +241,9 @@ public: QQuickJSContext2D *asQQuickJSContext2D() { return type == Type_QQuickJSContext2D ? reinterpret_cast<QQuickJSContext2D *>(this) : 0; } VariantObject *asVariantObject() { return type == Type_QVariant ? reinterpret_cast<VariantObject *>(this) : 0; } - QQmlSequence<QList<int>, Type_QmlIntList> *asQmlIntList() { return type == Type_QmlIntList ? reinterpret_cast<QQmlSequence<QList<int>, Type_QmlIntList> *>(this): 0; } - QQmlSequence<QList<qreal>, Type_QmlRealList> *asQmlRealList() { return type == Type_QmlRealList ? reinterpret_cast<QQmlSequence<QList<qreal>, Type_QmlRealList> *>(this): 0; } - QQmlSequence<QList<bool>, Type_QmlBoolList> *asQmlBoolList() { return type == Type_QmlBoolList ? reinterpret_cast<QQmlSequence<QList<bool>, Type_QmlBoolList> *>(this): 0; } - QQmlSequence<QList<QString>, Type_QmlStringList> *asQmlStringList() { return type == Type_QmlStringList ? reinterpret_cast<QQmlSequence<QList<QString>, Type_QmlStringList> *>(this): 0; } - QQmlSequence<QStringList, Type_QmlQStringList> *asQmlQStringList() { return type == Type_QmlQStringList ? reinterpret_cast<QQmlSequence<QStringList, Type_QmlQStringList> *>(this): 0; } - QQmlSequence<QList<QUrl>, Type_QmlUrlList> *asQmlUrlList() { return type == Type_QmlUrlList ? reinterpret_cast<QQmlSequence<QList<QUrl>, Type_QmlUrlList> *>(this): 0; } - QtObject *asQtObject() { return type == Type_QtObject ? reinterpret_cast<QtObject *>(this) : 0; } - QmlContextWrapper *asQmlContext() { return type == Type_QmlContext ? reinterpret_cast<QmlContextWrapper *>(this) : 0; } - QmlTypeWrapper *asQmlTypeWrapper() { return type == Type_QmlTypeWrapper ? reinterpret_cast<QmlTypeWrapper *>(this) : 0; } - QmlValueTypeWrapper *asQmlValueTypeWrapper() { return type == Type_QmlValueTypeWrapper ? reinterpret_cast<QmlValueTypeWrapper *>(this) : 0; } - QmlListWrapper *asQmlListWrapper() { return type == Type_QmlListWrapper ? reinterpret_cast<QmlListWrapper *>(this) : 0; } - bool isListType() const { return type >= Type_QmlIntList && type <= Type_QmlUrlList; } + bool isListType() const { return type == Type_QmlSequence; } bool isArrayObject() const { return type == Type_ArrayObject; } bool isStringObject() const { return type == Type_StringObject; } diff --git a/src/qml/qml/v4/qv4sequenceobject.cpp b/src/qml/qml/v4/qv4sequenceobject.cpp index c0fa872204..5a1c5b923d 100644 --- a/src/qml/qml/v4/qv4sequenceobject.cpp +++ b/src/qml/qml/v4/qv4sequenceobject.cpp @@ -155,9 +155,10 @@ template <> bool convertValueToElement(const QV4::Value &value) return value.toBoolean(); } -template <typename Container, int ManagedType> +template <typename Container> class QQmlSequence : public QQmlSequenceBase { + Q_MANAGED public: QQmlSequence(QV4::ExecutionEngine *engine, const Container &container) : QQmlSequenceBase(engine) @@ -166,7 +167,7 @@ public: , m_propertyIndex(-1) , m_isReference(false) { - type = ManagedType; + type = Type_QmlSequence; vtbl = &static_vtbl; prototype = engine->sequencePrototype; initClass(engine); @@ -178,7 +179,7 @@ public: , m_propertyIndex(propertyIndex) , m_isReference(true) { - type = ManagedType; + type = Type_QmlSequence; vtbl = &static_vtbl; prototype = engine->sequencePrototype; loadReference(); @@ -432,38 +433,36 @@ private: bool m_isReference; static QV4::Value getIndexed(QV4::Managed *that, QV4::ExecutionContext *ctx, uint index, bool *hasProperty) - { return static_cast<QQmlSequence<Container, ManagedType> *>(that)->containerGetIndexed(ctx, index, hasProperty); } + { return static_cast<QQmlSequence<Container> *>(that)->containerGetIndexed(ctx, index, hasProperty); } static void putIndexed(Managed *that, QV4::ExecutionContext *ctx, uint index, const QV4::Value &value) - { static_cast<QQmlSequence<Container, ManagedType> *>(that)->containerPutIndexed(ctx, index, value); } + { static_cast<QQmlSequence<Container> *>(that)->containerPutIndexed(ctx, index, value); } static QV4::PropertyAttributes queryIndexed(QV4::Managed *that, QV4::ExecutionContext *ctx, uint index) - { return static_cast<QQmlSequence<Container, ManagedType> *>(that)->containerQueryIndexed(ctx, index); } + { return static_cast<QQmlSequence<Container> *>(that)->containerQueryIndexed(ctx, index); } static bool deleteIndexedProperty(QV4::Managed *that, QV4::ExecutionContext *ctx, uint index) - { return static_cast<QQmlSequence<Container, ManagedType> *>(that)->containerDeleteIndexedProperty(ctx, index); } + { return static_cast<QQmlSequence<Container> *>(that)->containerDeleteIndexedProperty(ctx, index); } static void destroy(Managed *that) { - static_cast<QQmlSequence<Container, ManagedType> *>(that)->~QQmlSequence<Container, ManagedType>(); + static_cast<QQmlSequence<Container> *>(that)->~QQmlSequence<Container>(); } - - static const QV4::ManagedVTable static_vtbl; }; -typedef QQmlSequence<QStringList, QV4::Managed::Type_QmlQStringList> QQmlQStringList; +typedef QQmlSequence<QStringList> QQmlQStringList; template<> DEFINE_MANAGED_VTABLE(QQmlQStringList); -typedef QQmlSequence<QList<QString>, QV4::Managed::Type_QmlStringList> QQmlStringList; +typedef QQmlSequence<QList<QString> > QQmlStringList; template<> DEFINE_MANAGED_VTABLE(QQmlStringList); -typedef QQmlSequence<QList<int>, QV4::Managed::Type_QmlIntList> QQmlIntList; +typedef QQmlSequence<QList<int> > QQmlIntList; template<> DEFINE_MANAGED_VTABLE(QQmlIntList); -typedef QQmlSequence<QList<QUrl>, QV4::Managed::Type_QmlUrlList> QQmlUrlList; +typedef QQmlSequence<QList<QUrl> > QQmlUrlList; template<> DEFINE_MANAGED_VTABLE(QQmlUrlList); -typedef QQmlSequence<QList<bool>, QV4::Managed::Type_QmlBoolList> QQmlBoolList; +typedef QQmlSequence<QList<bool> > QQmlBoolList; template<> DEFINE_MANAGED_VTABLE(QQmlBoolList); -typedef QQmlSequence<QList<qreal>, QV4::Managed::Type_QmlRealList> QQmlRealList; +typedef QQmlSequence<QList<qreal> > QQmlRealList; template<> DEFINE_MANAGED_VTABLE(QQmlRealList); @@ -482,17 +481,17 @@ QV4::Value SequencePrototype::method_sort(QV4::SimpleCallContext *ctx) if (!o || !o->isListType()) ctx->throwTypeError(); - if (ctx->argumentCount < 2) { + if (ctx->argumentCount >= 2) + return ctx->thisObject; + #define CALL_SORT(SequenceElementType, SequenceElementTypeName, SequenceType, DefaultValue) \ - case QV4::Managed::Type_Qml##SequenceElementTypeName##List: o->asQml##SequenceElementTypeName##List()->sort(ctx); break; + if (QQml##SequenceElementTypeName##List *s = o->as<QQml##SequenceElementTypeName##List>()) { \ + s->sort(ctx); \ + } else - switch (o->internalType()) { - FOREACH_QML_SEQUENCE_TYPE(CALL_SORT) - default: break; - } + FOREACH_QML_SEQUENCE_TYPE(CALL_SORT) #undef CALL_SORT - } return ctx->thisObject; } @@ -502,14 +501,14 @@ QV4::Value QQmlSequenceBase::method_get_length(QV4::SimpleCallContext* ctx) QV4_ if (!o) ctx->throwTypeError(); #define CALL_LENGTH_GETTER(SequenceElementType, SequenceElementTypeName, SequenceType, DefaultValue) \ - case QV4::Managed::Type_Qml##SequenceElementTypeName##List: return o->asQml##SequenceElementTypeName##List()->lengthGetter(ctx); - - switch (o->internalType()) { - FOREACH_QML_SEQUENCE_TYPE(CALL_LENGTH_GETTER) - default: QV4::Value::undefinedValue(); - } + if (QQml##SequenceElementTypeName##List *s = o->as<QQml##SequenceElementTypeName##List>()) { \ + return s->lengthGetter(ctx); \ + } else + FOREACH_QML_SEQUENCE_TYPE(CALL_LENGTH_GETTER) #undef CALL_LENGTH_GETTER + + return QV4::Value::undefinedValue(); } QV4::Value QQmlSequenceBase::method_set_length(QV4::SimpleCallContext* ctx) @@ -518,12 +517,11 @@ QV4::Value QQmlSequenceBase::method_set_length(QV4::SimpleCallContext* ctx) if (!o) ctx->throwTypeError(); #define CALL_LENGTH_SETTER(SequenceElementType, SequenceElementTypeName, SequenceType, DefaultValue) \ - case QV4::Managed::Type_Qml##SequenceElementTypeName##List: o->asQml##SequenceElementTypeName##List()->lengthSetter(ctx); break; + if (QQml##SequenceElementTypeName##List *s = o->as<QQml##SequenceElementTypeName##List>()) { \ + s->lengthSetter(ctx); \ + } else - switch (o->internalType()) { - FOREACH_QML_SEQUENCE_TYPE(CALL_LENGTH_SETTER) - default: break; - } + FOREACH_QML_SEQUENCE_TYPE(CALL_LENGTH_SETTER) #undef CALL_LENGTH_SETTER return QV4::Value::undefinedValue(); @@ -576,7 +574,7 @@ QV4::Value SequencePrototype::fromVariant(QV4::ExecutionEngine *engine, const QV #undef NEW_COPY_SEQUENCE #define SEQUENCE_TO_VARIANT(ElementType, ElementTypeName, SequenceType, unused) \ - if (QQml##ElementTypeName##List *list = object->asQml##ElementTypeName##List()) \ + if (QQml##ElementTypeName##List *list = object->as<QQml##ElementTypeName##List>()) \ return list->toVariant(); \ else @@ -606,13 +604,14 @@ QVariant SequencePrototype::toVariant(const QV4::Value &array, int typeHint, boo #undef SEQUENCE_TO_VARIANT #define MAP_META_TYPE(ElementType, ElementTypeName, SequenceType, unused) \ - case QV4::Managed::Type_Qml##ElementTypeName##List: return qMetaTypeId<SequenceType>(); + if (object->as<QQml##ElementTypeName##List>()) { \ + return qMetaTypeId<SequenceType>(); \ + } else int SequencePrototype::metaTypeForSequence(QV4::Object *object) { - switch (object->internalType()) { FOREACH_QML_SEQUENCE_TYPE(MAP_META_TYPE) - default: + /*else*/ { return -1; } } diff --git a/src/qml/qml/v4/qv4value_p.h b/src/qml/qml/v4/qv4value_p.h index 45604740e6..af6f6ab64d 100644 --- a/src/qml/qml/v4/qv4value_p.h +++ b/src/qml/qml/v4/qv4value_p.h @@ -271,7 +271,6 @@ struct Q_QML_EXPORT Value ErrorObject *asErrorObject() const; VariantObject *asVariantObject() const; QObjectWrapper *asQObjectWrapper() const; - QmlValueTypeWrapper *asQmlValueType() const; uint asArrayIndex() const; uint asArrayLength(bool *ok) const; @@ -554,10 +553,6 @@ inline QObjectWrapper *Value::asQObjectWrapper() const return isObject() ? managed()->asQObjectWrapper() : 0; } -inline QmlValueTypeWrapper *Value::asQmlValueType() const -{ - return isObject() ? managed()->asQmlValueTypeWrapper() : 0; -} // ### inline Value Managed::construct(ExecutionContext *context, Value *args, int argc) { return vtbl->construct(this, context, args, argc); diff --git a/src/qml/qml/v4/qv4variantobject.cpp b/src/qml/qml/v4/qv4variantobject.cpp index c962b21f51..2348a93a6f 100644 --- a/src/qml/qml/v4/qv4variantobject.cpp +++ b/src/qml/qml/v4/qv4variantobject.cpp @@ -89,7 +89,7 @@ bool VariantObject::isEqualTo(Managed *m, Managed *other) if (QV4::VariantObject *rv = other->asVariantObject()) return lv->data == rv->data; - if (QV4::QmlValueTypeWrapper *v = other->asQmlValueTypeWrapper()) + if (QV4::QmlValueTypeWrapper *v = other->as<QmlValueTypeWrapper>()) return v->isEqual(lv->data); return false; diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index 1d8de37102..ec56f73845 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -168,13 +168,13 @@ QVariant QV8Engine::toVariant(const QV4::Value &value, int typeHint) return QVariant::fromValue(jsonObjectFromJS(value)); } else if (QV4::QObjectWrapper *wrapper = object->asQObjectWrapper()) { return qVariantFromValue<QObject *>(wrapper->object); - } else if (QV4::QmlContextWrapper *wrapper = object->asQmlContext()) { + } else if (QV4::QmlContextWrapper *wrapper = object->as<QV4::QmlContextWrapper>()) { return QVariant(); - } else if (QV4::QmlTypeWrapper *w = object->asQmlTypeWrapper()) { + } else if (QV4::QmlTypeWrapper *w = object->as<QV4::QmlTypeWrapper>()) { return w->toVariant(); - } else if (QV4::QmlValueTypeWrapper *v = object->asQmlValueTypeWrapper()) { + } else if (QV4::QmlValueTypeWrapper *v = object->as<QV4::QmlValueTypeWrapper>()) { return v->toVariant(); - } else if (QV4::QmlListWrapper *l = object->asQmlListWrapper()) { + } else if (QV4::QmlListWrapper *l = object->as<QV4::QmlListWrapper>()) { return l->toVariant(); } else if (object->isListType()) return QV4::SequencePrototype::toVariant(object); @@ -1248,12 +1248,12 @@ QV4::Value QV8Engine::newValueType(const QVariant &value, QQmlValueType *type) bool QV8Engine::isValueType(const QV4::Value &value) const { - return value.isObject() ? value.objectValue()->asQmlValueTypeWrapper() : 0; + return value.isObject() ? value.objectValue()->as<QV4::QmlValueTypeWrapper>() : 0; } QVariant QV8Engine::toValueType(const QV4::Value &obj) { - return obj.isObject() ? obj.objectValue()->asQmlValueTypeWrapper()->toVariant() : QVariant(); + return obj.isObject() ? obj.objectValue()->as<QV4::QmlValueTypeWrapper>()->toVariant() : QVariant(); } QT_END_NAMESPACE diff --git a/src/qml/qml/v8/qv8qobjectwrapper.cpp b/src/qml/qml/v8/qv8qobjectwrapper.cpp index b06b2ba40a..b8f13d51a1 100644 --- a/src/qml/qml/v8/qv8qobjectwrapper.cpp +++ b/src/qml/qml/v8/qv8qobjectwrapper.cpp @@ -52,6 +52,7 @@ #include <private/qqmlexpression_p.h> #include <private/qqmlglobal_p.h> #include <private/qqmltypewrapper_p.h> +#include <private/qqmlvaluetypewrapper_p.h> #include <private/qqmlcontextwrapper_p.h> #include <private/qqmllistwrapper_p.h> @@ -1435,7 +1436,7 @@ static int MatchScore(v8::Handle<v8::Value> actual, int conversionType) } } - if (QV4::QmlValueTypeWrapper *w = obj->asQmlValueTypeWrapper()) { + if (QV4::QmlValueTypeWrapper *w = obj->as<QV4::QmlValueTypeWrapper>()) { if (engine->toVariant(actual->v4Value(), -1).userType() == conversionType) return 0; return 10; diff --git a/src/qml/types/qquickworkerscript.cpp b/src/qml/types/qquickworkerscript.cpp index 95eabb0f4d..daaa9e2767 100644 --- a/src/qml/types/qquickworkerscript.cpp +++ b/src/qml/types/qquickworkerscript.cpp @@ -298,7 +298,7 @@ QV4::Value QQuickWorkerScriptEnginePrivate::getWorker(WorkerScript *script) script->object = QV4::QmlContextWrapper::urlScope(workerEngine, script->source); - QV4::QmlContextWrapper *w = script->object.value().asObject()->asQmlContext(); + QV4::QmlContextWrapper *w = script->object.value().asObject()->as<QV4::QmlContextNullWrapper>(); w->setReadOnly(false); QV4::Object *api = v4->newObject(); diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp index f3383f6e77..ffd4a154ca 100644 --- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp +++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp @@ -620,7 +620,7 @@ void tst_qqmlecmascript::methods() void tst_qqmlecmascript::bindingLoop() { QQmlComponent component(&engine, testFileUrl("bindingLoop.qml")); - QString warning = component.url().toString() + ":9:9: QML MyQmlObject: Binding loop detected for property \"stringProperty\""; + QString warning = component.url().toString() + ":5:9: QML MyQmlObject: Binding loop detected for property \"stringProperty\""; QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); QObject *object = component.create(); QVERIFY(object != 0); @@ -859,7 +859,7 @@ void tst_qqmlecmascript::deferredPropertiesErrors() QVERIFY(object->objectProperty() == 0); QVERIFY(object->objectProperty2() == 0); - QString warning = component.url().toString() + ":6: Unable to assign [undefined] to QObject*"; + QString warning = component.url().toString() + ":6:21: Unable to assign [undefined] to QObject*"; QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); qmlExecuteDeferred(object); |