diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-09-24 15:25:10 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-26 09:05:32 +0200 |
commit | 74807c0725ad6ef6ccd49611bb9f4f994cddf106 (patch) | |
tree | 9f1d08155a46bdbef45390b3a017ea6f7a430700 /src/qml/qml | |
parent | 9062476491dd1c81f63bb7a3ae6e6a080db1db1e (diff) |
Move more API over to use ValueRef
Change-Id: I372f1f3e3e78d45912a913f437e622e0acfc9646
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/qqmlproperty.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmlvmemetaobject.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine.cpp | 173 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine_p.h | 14 |
5 files changed, 103 insertions, 98 deletions
diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp index bcecda9c57..a0fd98483b 100644 --- a/src/qml/qml/qqmlproperty.cpp +++ b/src/qml/qml/qqmlproperty.cpp @@ -1514,13 +1514,13 @@ bool QQmlPropertyPrivate::writeBinding(QObject *object, if (isUndefined) { } else if (core.isQList()) { - value = v8engine->toVariant(*result, qMetaTypeId<QList<QObject *> >()); + value = v8engine->toVariant(result, qMetaTypeId<QList<QObject *> >()); } else if (result->isNull() && core.isQObject()) { value = QVariant::fromValue((QObject *)0); } else if (core.propType == qMetaTypeId<QList<QUrl> >()) { - value = resolvedUrlSequence(v8engine->toVariant(*result, qMetaTypeId<QList<QUrl> >()), context); + value = resolvedUrlSequence(v8engine->toVariant(result, qMetaTypeId<QList<QUrl> >()), context); } else if (!isVarProperty && type != qMetaTypeId<QJSValue>()) { - value = v8engine->toVariant(*result, type); + value = v8engine->toVariant(result, type); } if (expression->hasError()) { diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index ba3cfc0801..2740d9b269 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -385,7 +385,7 @@ void QmlValueTypeWrapper::put(Managed *m, const StringRef name, const ValueRef v oldBinding->destroy(); if (!f) { - QVariant v = r->v8->toVariant(*value, -1); + QVariant v = r->v8->toVariant(value, -1); if (p.isEnumType() && (QMetaType::Type)v.type() == QMetaType::Double) v = v.toInt(); @@ -409,7 +409,7 @@ void QmlValueTypeWrapper::put(Managed *m, const StringRef name, const ValueRef v if (index == -1) return; - QVariant v = r->v8->toVariant(*value, -1); + QVariant v = r->v8->toVariant(value, -1); r->type->setValue(copy->value); QMetaProperty p = r->type->metaObject()->property(index); diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index 18f3dff39d..9b557f882b 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -1010,8 +1010,8 @@ QVariant QQmlVMEMetaObject::readPropertyAsVariant(int id) if (ensureVarPropertiesAllocated()) { QV4::Scope scope(QQmlEnginePrivate::get(ctxt->engine)->v4engine()); QV4::ScopedObject o(scope, varProperties.value()); - return QQmlEnginePrivate::get(ctxt->engine)->v8engine()->toVariant( - QV4::Value::fromReturnedValue(o->getIndexed(id - firstVarPropertyIndex)), -1); + QV4::ScopedValue val(scope, o->getIndexed(id - firstVarPropertyIndex)); + return QQmlEnginePrivate::get(ctxt->engine)->v8engine()->toVariant(val, -1); } return QVariant(); } else { diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index 40b512bdc7..a7eb23387f 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -117,27 +117,27 @@ QV8Engine::~QV8Engine() delete m_v4Engine; } -QVariant QV8Engine::toVariant(const QV4::Value &value, int typeHint) +QVariant QV8Engine::toVariant(const QV4::ValueRef value, int typeHint) { - Q_ASSERT (!value.isEmpty()); + Q_ASSERT (!value->isEmpty()); QV4::Scope scope(m_v4Engine); - QV4::ScopedValue v(scope, value); +// QV4::ScopedValue v(scope, value); - if (QV4::VariantObject *v = value.as<QV4::VariantObject>()) + if (QV4::VariantObject *v = value->as<QV4::VariantObject>()) return v->data; if (typeHint == QVariant::Bool) - return QVariant(value.toBoolean()); + return QVariant(value->toBoolean()); if (typeHint == QMetaType::QJsonValue) return QVariant::fromValue(QV4::JsonObject::toJsonValue(value)); if (typeHint == qMetaTypeId<QJSValue>()) - return QVariant::fromValue(QJSValue(new QJSValuePrivate(m_v4Engine, v))); + return QVariant::fromValue(QJSValue(new QJSValuePrivate(m_v4Engine, value))); - if (QV4::Object *object = value.asObject()) { + if (QV4::Object *object = value->asObject()) { if (typeHint == QMetaType::QJsonObject - && !value.asArrayObject() && !value.asFunctionObject()) { + && !value->asArrayObject() && !value->asFunctionObject()) { return QVariant::fromValue(QV4::JsonObject::toJsonObject(object)); } else if (QV4::QObjectWrapper *wrapper = object->as<QV4::QObjectWrapper>()) { return qVariantFromValue<QObject *>(wrapper->object()); @@ -153,7 +153,7 @@ QVariant QV8Engine::toVariant(const QV4::Value &value, int typeHint) return QV4::SequencePrototype::toVariant(object); } - if (QV4::ArrayObject *a = value.asArrayObject()) { + if (QV4::ArrayObject *a = value->asArrayObject()) { QV4::Scope scope(a->engine()); if (typeHint == qMetaTypeId<QList<QObject *> >()) { QList<QObject *> list; @@ -373,27 +373,27 @@ QQmlContextData *QV8Engine::callingContext() // Date -> QVariant(QDateTime) // RegExp -> QVariant(QRegExp) // [Any other object] -> QVariantMap(...) -QVariant QV8Engine::toBasicVariant(const QV4::Value &value) +QVariant QV8Engine::toBasicVariant(const QV4::ValueRef value) { - if (value.isNull() || value.isUndefined()) + if (value->isNullOrUndefined()) return QVariant(); - if (value.isBoolean()) - return value.booleanValue(); - if (value.isInteger()) - return value.integerValue(); - if (value.isNumber()) - return value.asDouble(); - if (value.isString()) - return value.stringValue()->toQString(); - if (QV4::DateObject *d = value.asDateObject()) + if (value->isBoolean()) + return value->booleanValue(); + if (value->isInteger()) + return value->integerValue(); + if (value->isNumber()) + return value->asDouble(); + if (value->isString()) + return value->stringValue()->toQString(); + if (QV4::DateObject *d = value->asDateObject()) return d->toQDateTime(); // NOTE: since we convert QTime to JS Date, round trip will change the variant type (to QDateTime)! - Q_ASSERT(value.isObject()); + Q_ASSERT(value->isObject()); - if (QV4::RegExpObject *re = value.as<QV4::RegExpObject>()) + if (QV4::RegExpObject *re = value->as<QV4::RegExpObject>()) return re->toQRegExp(); - if (QV4::ArrayObject *a = value.asArrayObject()) { + if (QV4::ArrayObject *a = value->asArrayObject()) { QV4::Scope scope(a->engine()); QV4::ScopedValue v(scope); QVariantList rv; @@ -405,8 +405,8 @@ QVariant QV8Engine::toBasicVariant(const QV4::Value &value) } return rv; } - if (!value.asFunctionObject()) - return variantMapFromJS(value.asObject()); + if (!value->asFunctionObject()) + return variantMapFromJS(value->asObject()); return QVariant(); } @@ -620,7 +620,8 @@ QVariantMap QV8Engine::variantMapFromJS(QV4::Object *o, break; QString key = name->toQStringNoThrow(); - result.insert(key, variantFromJS(v, visitedObjects)); + QV4::ScopedValue val(scope, v); + result.insert(key, variantFromJS(val, visitedObjects)); } visitedObjects.remove(o); @@ -713,92 +714,93 @@ QV4::ReturnedValue QV8Engine::metaTypeToJS(int type, const void *data) // Converts a JS value to a meta-type. // data must point to a place that can store a value of the given type. // Returns true if conversion succeeded, false otherwise. -bool QV8Engine::metaTypeFromJS(const QV4::Value &value, int type, void *data) { +bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data) +{ QV4::Scope scope(QV8Engine::getV4(this)); // check if it's one of the types we know switch (QMetaType::Type(type)) { case QMetaType::Bool: - *reinterpret_cast<bool*>(data) = value.toBoolean(); + *reinterpret_cast<bool*>(data) = value->toBoolean(); return true; case QMetaType::Int: - *reinterpret_cast<int*>(data) = value.toInt32(); + *reinterpret_cast<int*>(data) = value->toInt32(); return true; case QMetaType::UInt: - *reinterpret_cast<uint*>(data) = value.toUInt32(); + *reinterpret_cast<uint*>(data) = value->toUInt32(); return true; case QMetaType::LongLong: - *reinterpret_cast<qlonglong*>(data) = qlonglong(value.toInteger()); + *reinterpret_cast<qlonglong*>(data) = qlonglong(value->toInteger()); return true; case QMetaType::ULongLong: - *reinterpret_cast<qulonglong*>(data) = qulonglong(value.toInteger()); + *reinterpret_cast<qulonglong*>(data) = qulonglong(value->toInteger()); return true; case QMetaType::Double: - *reinterpret_cast<double*>(data) = value.toNumber(); + *reinterpret_cast<double*>(data) = value->toNumber(); return true; case QMetaType::QString: - if (value.isUndefined() || value.isNull()) + if (value->isUndefined() || value->isNull()) *reinterpret_cast<QString*>(data) = QString(); else - *reinterpret_cast<QString*>(data) = value.toString(m_v4Engine->current)->toQString(); + *reinterpret_cast<QString*>(data) = value->toString(m_v4Engine->current)->toQString(); return true; case QMetaType::Float: - *reinterpret_cast<float*>(data) = value.toNumber(); + *reinterpret_cast<float*>(data) = value->toNumber(); return true; case QMetaType::Short: - *reinterpret_cast<short*>(data) = short(value.toInt32()); + *reinterpret_cast<short*>(data) = short(value->toInt32()); return true; case QMetaType::UShort: - *reinterpret_cast<unsigned short*>(data) = value.toUInt16(); + *reinterpret_cast<unsigned short*>(data) = value->toUInt16(); return true; case QMetaType::Char: - *reinterpret_cast<char*>(data) = char(value.toInt32()); + *reinterpret_cast<char*>(data) = char(value->toInt32()); return true; case QMetaType::UChar: - *reinterpret_cast<unsigned char*>(data) = (unsigned char)(value.toInt32()); + *reinterpret_cast<unsigned char*>(data) = (unsigned char)(value->toInt32()); return true; case QMetaType::QChar: - if (value.isString()) { - QString str = value.stringValue()->toQString(); + if (value->isString()) { + QString str = value->stringValue()->toQString(); *reinterpret_cast<QChar*>(data) = str.isEmpty() ? QChar() : str.at(0); } else { - *reinterpret_cast<QChar*>(data) = QChar(ushort(value.toUInt16())); + *reinterpret_cast<QChar*>(data) = QChar(ushort(value->toUInt16())); } return true; case QMetaType::QDateTime: - if (QV4::DateObject *d = value.asDateObject()) { + if (QV4::DateObject *d = value->asDateObject()) { *reinterpret_cast<QDateTime *>(data) = d->toQDateTime(); return true; } break; case QMetaType::QDate: - if (QV4::DateObject *d = value.asDateObject()) { + if (QV4::DateObject *d = value->asDateObject()) { *reinterpret_cast<QDate *>(data) = d->toQDateTime().date(); return true; } break; case QMetaType::QRegExp: - if (QV4::RegExpObject *r = value.as<QV4::RegExpObject>()) { + if (QV4::RegExpObject *r = value->as<QV4::RegExpObject>()) { *reinterpret_cast<QRegExp *>(data) = r->toQRegExp(); return true; } break; case QMetaType::QObjectStar: { - QV4::QObjectWrapper *qobjectWrapper = value.as<QV4::QObjectWrapper>(); - if (qobjectWrapper || value.isNull()) { + QV4::QObjectWrapper *qobjectWrapper = value->as<QV4::QObjectWrapper>(); + if (qobjectWrapper || value->isNull()) { *reinterpret_cast<QObject* *>(data) = qtObjectFromJS(value); return true; } break; } case QMetaType::QStringList: - if (QV4::ArrayObject *a = value.asArrayObject()) { + if (QV4::ArrayObject *a = value->asArrayObject()) { *reinterpret_cast<QStringList *>(data) = a->toQStringList(); return true; } break; case QMetaType::QVariantList: - if (QV4::ArrayObject *a = value.asArrayObject()) { + if (QV4::ArrayObject *a = value->asArrayObject()) { *reinterpret_cast<QVariantList *>(data) = variantListFromJS(a); return true; } break; case QMetaType::QVariantMap: - if (QV4::Object *o = value.asObject()) { + if (QV4::Object *o = value->asObject()) { *reinterpret_cast<QVariantMap *>(data) = variantMapFromJS(o); return true; } break; @@ -809,10 +811,10 @@ bool QV8Engine::metaTypeFromJS(const QV4::Value &value, int type, void *data) { *reinterpret_cast<QJsonValue *>(data) = QV4::JsonObject::toJsonValue(value); return true; case QMetaType::QJsonObject: - *reinterpret_cast<QJsonObject *>(data) = QV4::JsonObject::toJsonObject(value.asObject()); + *reinterpret_cast<QJsonObject *>(data) = QV4::JsonObject::toJsonObject(value->asObject()); return true; case QMetaType::QJsonArray: - *reinterpret_cast<QJsonArray *>(data) = QV4::JsonObject::toJsonArray(value.asArrayObject()); + *reinterpret_cast<QJsonArray *>(data) = QV4::JsonObject::toJsonArray(value->asArrayObject()); return true; default: ; @@ -842,14 +844,14 @@ bool QV8Engine::metaTypeFromJS(const QV4::Value &value, int type, void *data) { QByteArray name = QMetaType::typeName(type); if (convertToNativeQObject(value, name, reinterpret_cast<void* *>(data))) return true; - if (value.as<QV4::VariantObject>() && name.endsWith('*')) { + if (value->as<QV4::VariantObject>() && name.endsWith('*')) { int valueType = QMetaType::type(name.left(name.size()-1)); - QVariant &var = value.as<QV4::VariantObject>()->data; + QVariant &var = value->as<QV4::VariantObject>()->data; if (valueType == var.userType()) { // We have T t, T* is requested, so return &t. *reinterpret_cast<void* *>(data) = var.data(); return true; - } else if (QV4::Object *o = value.asObject()) { + } else if (QV4::Object *o = value->asObject()) { // Look in the prototype chain. QV4::Object *proto = o->prototype(); while (proto) { @@ -860,7 +862,8 @@ bool QV8Engine::metaTypeFromJS(const QV4::Value &value, int type, void *data) { } else if (proto->as<QV4::QObjectWrapper>()) { QByteArray className = name.left(name.size()-1); - if (QObject *qobject = qtObjectFromJS(QV4::Value::fromObject(proto))) + QV4::ScopedObject p(scope, proto); + if (QObject *qobject = qtObjectFromJS(p)) canCast = qobject->qt_metacast(className) != 0; } if (canCast) { @@ -874,11 +877,11 @@ bool QV8Engine::metaTypeFromJS(const QV4::Value &value, int type, void *data) { proto = proto->prototype(); } } - } else if (value.isNull() && name.endsWith('*')) { + } else if (value->isNull() && name.endsWith('*')) { *reinterpret_cast<void* *>(data) = 0; return true; } else if (type == qMetaTypeId<QJSValue>()) { - *reinterpret_cast<QJSValue*>(data) = QJSValuePrivate::get(new QJSValuePrivate(m_v4Engine, QV4::ScopedValue(scope, value))); + *reinterpret_cast<QJSValue*>(data) = QJSValuePrivate::get(new QJSValuePrivate(m_v4Engine, value)); return true; } @@ -901,40 +904,40 @@ QV4::ReturnedValue QV8Engine::variantToJS(const QVariant &value) // Date -> QVariant(QDateTime) // RegExp -> QVariant(QRegExp) // [Any other object] -> QVariantMap(...) -QVariant QV8Engine::variantFromJS(const QV4::Value &value, +QVariant QV8Engine::variantFromJS(const QV4::ValueRef value, V8ObjectSet &visitedObjects) { - Q_ASSERT(!value.isEmpty()); - if (value.isUndefined()) + Q_ASSERT(!value->isEmpty()); + if (value->isUndefined()) return QVariant(); - if (value.isNull()) + if (value->isNull()) return QVariant(QMetaType::VoidStar, 0); - if (value.isBoolean()) - return value.booleanValue(); - if (value.isInteger()) - return value.integerValue(); - if (value.isNumber()) - return value.asDouble(); - if (value.isString()) - return value.stringValue()->toQString(); - Q_ASSERT(value.isObject()); - if (QV4::ArrayObject *a = value.asArrayObject()) + if (value->isBoolean()) + return value->booleanValue(); + if (value->isInteger()) + return value->integerValue(); + if (value->isNumber()) + return value->asDouble(); + if (value->isString()) + return value->stringValue()->toQString(); + Q_ASSERT(value->isObject()); + if (QV4::ArrayObject *a = value->asArrayObject()) return variantListFromJS(a, visitedObjects); - if (QV4::DateObject *d = value.asDateObject()) + if (QV4::DateObject *d = value->asDateObject()) return d->toQDateTime(); - if (QV4::RegExpObject *re = value.as<QV4::RegExpObject>()) + if (QV4::RegExpObject *re = value->as<QV4::RegExpObject>()) return re->toQRegExp(); - if (QV4::VariantObject *v = value.as<QV4::VariantObject>()) + if (QV4::VariantObject *v = value->as<QV4::VariantObject>()) return v->data; - if (value.as<QV4::QObjectWrapper>()) + if (value->as<QV4::QObjectWrapper>()) return qVariantFromValue(qtObjectFromJS(value)); - if (QV4::QmlValueTypeWrapper *v = value.as<QV4::QmlValueTypeWrapper>()) + if (QV4::QmlValueTypeWrapper *v = value->as<QV4::QmlValueTypeWrapper>()) return v->toVariant(); - return variantMapFromJS(value.asObject(), visitedObjects); + return variantMapFromJS(value->asObject(), visitedObjects); } -bool QV8Engine::convertToNativeQObject(const QV4::Value &value, const QByteArray &targetType, void **result) +bool QV8Engine::convertToNativeQObject(const QV4::ValueRef value, const QByteArray &targetType, void **result) { if (!targetType.endsWith('*')) return false; @@ -949,19 +952,21 @@ bool QV8Engine::convertToNativeQObject(const QV4::Value &value, const QByteArray return false; } -QObject *QV8Engine::qtObjectFromJS(const QV4::Value &value) +QObject *QV8Engine::qtObjectFromJS(const QV4::ValueRef value) { - if (!value.isObject()) + if (!value->isObject()) return 0; + QV4::Scope scope(m_v4Engine); + QV4::Scoped<QV4::VariantObject> v(scope, value); - if (QV4::VariantObject *v = value.as<QV4::VariantObject>()) { + if (v) { QVariant variant = v->data; int type = variant.userType(); if (type == QMetaType::QObjectStar) return *reinterpret_cast<QObject* const *>(variant.constData()); } - QV4::QObjectWrapper *wrapper = value.as<QV4::QObjectWrapper>(); + QV4::Scoped<QV4::QObjectWrapper> wrapper(scope, value); if (!wrapper) return 0; return wrapper->object(); diff --git a/src/qml/qml/v8/qv8engine_p.h b/src/qml/qml/v8/qv8engine_p.h index e27be50f29..04f4d5e6be 100644 --- a/src/qml/qml/v8/qv8engine_p.h +++ b/src/qml/qml/v8/qv8engine_p.h @@ -205,7 +205,7 @@ public: void freezeObject(const QV4::ValueRef value); - QVariant toVariant(const QV4::Value &value, int typeHint); + QVariant toVariant(const QV4::ValueRef value, int typeHint); QV4::ReturnedValue fromVariant(const QVariant &); // Return a JS string for the given QString \a string @@ -236,13 +236,13 @@ public: { V8ObjectSet visitedObjects; return variantMapFromJS(object, visitedObjects); } QV4::ReturnedValue variantToJS(const QVariant &value); - inline QVariant variantFromJS(const QV4::Value &value) + inline QVariant variantFromJS(const QV4::ValueRef value) { V8ObjectSet visitedObjects; return variantFromJS(value, visitedObjects); } QV4::ReturnedValue metaTypeToJS(int type, const void *data); - bool metaTypeFromJS(const QV4::Value &value, int type, void *data); + bool metaTypeFromJS(const QV4::ValueRef value, int type, void *data); - bool convertToNativeQObject(const QV4::Value &value, + bool convertToNativeQObject(const QV4::ValueRef value, const QByteArray &targetType, void **result); @@ -253,7 +253,7 @@ public: // used for console.count() int consoleCountHelper(const QString &file, quint16 line, quint16 column); - QObject *qtObjectFromJS(const QV4::Value &value); + QObject *qtObjectFromJS(const QV4::ValueRef value); protected: QJSEngine* q; @@ -275,14 +275,14 @@ protected: QHash<QString, quint32> m_consoleCount; - QVariant toBasicVariant(const QV4::Value &); + QVariant toBasicVariant(const QV4::ValueRef); void initializeGlobal(); private: QVariantList variantListFromJS(QV4::ArrayObject *array, V8ObjectSet &visitedObjects); QVariantMap variantMapFromJS(QV4::Object *object, V8ObjectSet &visitedObjects); - QVariant variantFromJS(const QV4::Value &value, V8ObjectSet &visitedObjects); + QVariant variantFromJS(const QV4::ValueRef value, V8ObjectSet &visitedObjects); Q_DISABLE_COPY(QV8Engine) }; |