diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2014-12-30 11:39:53 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2015-01-02 21:10:43 +0100 |
commit | 2056538feab7739689742de4efe370b35864bc9a (patch) | |
tree | 82845eea2eca647bc45dc63e13ea35712a692e54 /src/qml/qml/v8 | |
parent | 96178192c451a5e26e30e14a619b96aacd16c29b (diff) |
Remove v8engine dependency in toVariant conversions
Change-Id: I0f2f77c9cc268a0c5ca3ffe0cd66fc98bb1964b3
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/qml/v8')
-rw-r--r-- | src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 28 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine.cpp | 42 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine_p.h | 14 |
3 files changed, 38 insertions, 46 deletions
diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 8485576477..4bfcb879e6 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -230,9 +230,7 @@ ReturnedValue QtObject::method_colorEqual(QV4::CallContext *ctx) bool ok = false; - QV8Engine *v8engine = ctx->d()->engine->v8Engine; - - QVariant lhs = v8engine->toVariant(ctx->d()->callData->args[0], -1); + QVariant lhs = QV8Engine::toVariant(ctx->d()->engine, ctx->d()->callData->args[0], -1); if (lhs.userType() == QVariant::String) { lhs = QQmlStringConverters::colorFromString(lhs.toString(), &ok); if (!ok) { @@ -242,7 +240,7 @@ ReturnedValue QtObject::method_colorEqual(QV4::CallContext *ctx) V4THROW_ERROR("Qt.colorEqual(): Invalid arguments"); } - QVariant rhs = v8engine->toVariant(ctx->d()->callData->args[1], -1); + QVariant rhs = QV8Engine::toVariant(ctx->engine(), ctx->d()->callData->args[1], -1); if (rhs.userType() == QVariant::String) { rhs = QQmlStringConverters::colorFromString(rhs.toString(), &ok); if (!ok) { @@ -470,7 +468,7 @@ ReturnedValue QtObject::method_lighter(QV4::CallContext *ctx) V4THROW_ERROR("Qt.lighter(): Invalid arguments"); QV8Engine *v8engine = ctx->d()->engine->v8Engine; - QVariant v = v8engine->toVariant(ctx->d()->callData->args[0], -1); + QVariant v = QV8Engine::toVariant(ctx->engine(), ctx->d()->callData->args[0], -1); if (v.userType() == QVariant::String) { bool ok = false; v = QQmlStringConverters::colorFromString(v.toString(), &ok); @@ -509,7 +507,7 @@ ReturnedValue QtObject::method_darker(QV4::CallContext *ctx) V4THROW_ERROR("Qt.darker(): Invalid arguments"); QV8Engine *v8engine = ctx->d()->engine->v8Engine; - QVariant v = v8engine->toVariant(ctx->d()->callData->args[0], -1); + QVariant v = QV8Engine::toVariant(ctx->engine(), ctx->d()->callData->args[0], -1); if (v.userType() == QVariant::String) { bool ok = false; v = QQmlStringConverters::colorFromString(v.toString(), &ok); @@ -559,7 +557,7 @@ ReturnedValue QtObject::method_tint(QV4::CallContext *ctx) QV8Engine *v8engine = ctx->d()->engine->v8Engine; // base color - QVariant v1 = v8engine->toVariant(ctx->d()->callData->args[0], -1); + QVariant v1 = QV8Engine::toVariant(ctx->engine(), ctx->d()->callData->args[0], -1); if (v1.userType() == QVariant::String) { bool ok = false; v1 = QQmlStringConverters::colorFromString(v1.toString(), &ok); @@ -571,7 +569,7 @@ ReturnedValue QtObject::method_tint(QV4::CallContext *ctx) } // tint color - QVariant v2 = v8engine->toVariant(ctx->d()->callData->args[1], -1); + QVariant v2 = QV8Engine::toVariant(ctx->engine(), ctx->d()->callData->args[1], -1); if (v2.userType() == QVariant::String) { bool ok = false; v2 = QQmlStringConverters::colorFromString(v2.toString(), &ok); @@ -607,10 +605,8 @@ ReturnedValue QtObject::method_formatDate(QV4::CallContext *ctx) V4THROW_ERROR("Qt.formatDate(): Invalid arguments"); QV4::Scope scope(ctx); - QV8Engine *v8engine = ctx->d()->engine->v8Engine; - Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate; - QDate date = v8engine->toVariant(ctx->d()->callData->args[0], -1).toDateTime().date(); + QDate date = QV8Engine::toVariant(ctx->engine(), ctx->d()->callData->args[0], -1).toDateTime().date(); QString formattedDate; if (ctx->d()->callData->argc == 2) { QV4::ScopedString s(scope, ctx->d()->callData->args[1]); @@ -652,9 +648,7 @@ ReturnedValue QtObject::method_formatTime(QV4::CallContext *ctx) V4THROW_ERROR("Qt.formatTime(): Invalid arguments"); QV4::Scope scope(ctx); - QV8Engine *v8engine = ctx->d()->engine->v8Engine; - - QVariant argVariant = v8engine->toVariant(ctx->d()->callData->args[0], -1); + QVariant argVariant = QV8Engine::toVariant(ctx->engine(), ctx->d()->callData->args[0], -1); QTime time; if (ctx->d()->callData->args[0].asDateObject() || (argVariant.type() == QVariant::String)) time = argVariant.toDateTime().time(); @@ -778,10 +772,8 @@ ReturnedValue QtObject::method_formatDateTime(QV4::CallContext *ctx) V4THROW_ERROR("Qt.formatDateTime(): Invalid arguments"); QV4::Scope scope(ctx); - QV8Engine *v8engine = ctx->d()->engine->v8Engine; - Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate; - QDateTime dt = v8engine->toVariant(ctx->d()->callData->args[0], -1).toDateTime(); + QDateTime dt = QV8Engine::toVariant(ctx->engine(), ctx->d()->callData->args[0], -1).toDateTime(); QString formattedDt; if (ctx->d()->callData->argc == 2) { QV4::ScopedString s(scope, ctx->d()->callData->args[1]); @@ -825,7 +817,7 @@ ReturnedValue QtObject::method_resolvedUrl(QV4::CallContext *ctx) { QV8Engine *v8engine = ctx->d()->engine->v8Engine; - QUrl url = v8engine->toVariant(ctx->d()->callData->args[0], -1).toUrl(); + QUrl url = QV8Engine::toVariant(ctx->engine(), ctx->d()->callData->args[0], -1).toUrl(); QQmlEngine *e = v8engine->engine(); QQmlEnginePrivate *p = 0; if (e) p = QQmlEnginePrivate::get(e); diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index 0a309c2775..d4ceaad351 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -160,10 +160,10 @@ QV8Engine::~QV8Engine() delete m_v4Engine; } -QVariant QV8Engine::toVariant(const QV4::ValueRef value, int typeHint, bool createJSValueForObjects, V8ObjectSet *visitedObjects) +QVariant QV8Engine::toVariant(QV4::ExecutionEngine *e, const QV4::ValueRef value, int typeHint, bool createJSValueForObjects, V8ObjectSet *visitedObjects) { Q_ASSERT (!value->isEmpty()); - QV4::Scope scope(m_v4Engine); + QV4::Scope scope(e); if (QV4::VariantObject *v = value->as<QV4::VariantObject>()) return v->d()->data; @@ -175,7 +175,7 @@ QVariant QV8Engine::toVariant(const QV4::ValueRef value, int typeHint, bool crea return QVariant::fromValue(QV4::JsonObject::toJsonValue(value)); if (typeHint == qMetaTypeId<QJSValue>()) - return QVariant::fromValue(QJSValue(new QJSValuePrivate(m_v4Engine, value))); + return QVariant::fromValue(QJSValue(new QJSValuePrivate(e, value))); if (value->asObject()) { QV4::ScopedObject object(scope, value); @@ -249,10 +249,10 @@ QVariant QV8Engine::toVariant(const QV4::ValueRef value, int typeHint, bool crea if (createJSValueForObjects) return QVariant::fromValue(QJSValue(new QJSValuePrivate(o->asReturnedValue()))); - return objectToVariant(o, visitedObjects); + return objectToVariant(e, o, visitedObjects); } -QVariant QV8Engine::objectToVariant(QV4::Object *o, V8ObjectSet *visitedObjects) +QVariant QV8Engine::objectToVariant(QV4::ExecutionEngine *e, QV4::Object *o, V8ObjectSet *visitedObjects) { Q_ASSERT(o); @@ -272,7 +272,7 @@ QVariant QV8Engine::objectToVariant(QV4::Object *o, V8ObjectSet *visitedObjects) QVariant result; if (o->asArrayObject()) { - QV4::Scope scope(m_v4Engine); + QV4::Scope scope(e); QV4::ScopedArrayObject a(scope, o->asReturnedValue()); QV4::ScopedValue v(scope); QVariantList list; @@ -280,13 +280,13 @@ QVariant QV8Engine::objectToVariant(QV4::Object *o, V8ObjectSet *visitedObjects) int length = a->getLength(); for (int ii = 0; ii < length; ++ii) { v = a->getIndexed(ii); - list << toVariant(v, -1, /*createJSValueForObjects*/false, visitedObjects); + list << toVariant(e, v, -1, /*createJSValueForObjects*/false, visitedObjects); } result = list; } else if (!o->asFunctionObject()) { QVariantMap map; - QV4::Scope scope(m_v4Engine); + QV4::Scope scope(e); QV4::ObjectIterator it(scope, o, QV4::ObjectIterator::EnumerableOnly); QV4::ScopedValue name(scope); QV4::ScopedValue val(scope); @@ -296,7 +296,7 @@ QVariant QV8Engine::objectToVariant(QV4::Object *o, V8ObjectSet *visitedObjects) break; QString key = name->toQStringNoThrow(); - map.insert(key, toVariant(val, /*type hint*/-1, /*createJSValueForObjects*/false, visitedObjects)); + map.insert(key, toVariant(e, val, /*type hint*/-1, /*createJSValueForObjects*/false, visitedObjects)); } result = map; @@ -717,9 +717,9 @@ 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::ValueRef value, int type, void *data) +bool QV8Engine::metaTypeFromJS(QV4::ExecutionEngine *engine, const QV4::ValueRef value, int type, void *data) { - QV4::Scope scope(QV8Engine::getV4(this)); + QV4::Scope scope(engine); // check if it's one of the types we know switch (QMetaType::Type(type)) { @@ -788,7 +788,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data) case QMetaType::QObjectStar: { QV4::QObjectWrapper *qobjectWrapper = value->as<QV4::QObjectWrapper>(); if (qobjectWrapper || value->isNull()) { - *reinterpret_cast<QObject* *>(data) = qtObjectFromJS(value); + *reinterpret_cast<QObject* *>(data) = qtObjectFromJS(scope.engine, value); return true; } break; } @@ -803,7 +803,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data) case QMetaType::QVariantList: { QV4::ScopedArrayObject a(scope, value); if (a) { - *reinterpret_cast<QVariantList *>(data) = toVariant(a, /*typeHint*/-1, /*createJSValueForObjects*/false).toList(); + *reinterpret_cast<QVariantList *>(data) = toVariant(scope.engine, a, /*typeHint*/-1, /*createJSValueForObjects*/false).toList(); return true; } break; @@ -817,7 +817,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data) break; } case QMetaType::QVariant: - *reinterpret_cast<QVariant*>(data) = toVariant(value, /*typeHint*/-1, /*createJSValueForObjects*/false); + *reinterpret_cast<QVariant*>(data) = toVariant(scope.engine, value, /*typeHint*/-1, /*createJSValueForObjects*/false); return true; case QMetaType::QJsonValue: *reinterpret_cast<QJsonValue *>(data) = QV4::JsonObject::toJsonValue(value); @@ -869,7 +869,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data) // Try to use magic; for compatibility with qscriptvalue_cast. QByteArray name = QMetaType::typeName(type); - if (convertToNativeQObject(value, name, reinterpret_cast<void* *>(data))) + if (convertToNativeQObject(engine, value, name, reinterpret_cast<void* *>(data))) return true; if (value->as<QV4::VariantObject>() && name.endsWith('*')) { int valueType = QMetaType::type(name.left(name.size()-1)); @@ -890,7 +890,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data) else if (proto->as<QV4::QObjectWrapper>()) { QByteArray className = name.left(name.size()-1); QV4::ScopedObject p(scope, proto.getPointer()); - if (QObject *qobject = qtObjectFromJS(p)) + if (QObject *qobject = qtObjectFromJS(scope.engine, p)) canCast = qobject->qt_metacast(className) != 0; } if (canCast) { @@ -908,7 +908,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data) *reinterpret_cast<void* *>(data) = 0; return true; } else if (type == qMetaTypeId<QJSValue>()) { - *reinterpret_cast<QJSValue*>(data) = QJSValuePrivate::get(new QJSValuePrivate(m_v4Engine, value)); + *reinterpret_cast<QJSValue*>(data) = QJSValuePrivate::get(new QJSValuePrivate(engine, value)); return true; } @@ -921,11 +921,11 @@ QV4::ReturnedValue QV8Engine::variantToJS(const QVariant &value) return metaTypeToJS(value.userType(), value.constData()); } -bool QV8Engine::convertToNativeQObject(const QV4::ValueRef value, const QByteArray &targetType, void **result) +bool QV8Engine::convertToNativeQObject(QV4::ExecutionEngine *e, const QV4::ValueRef value, const QByteArray &targetType, void **result) { if (!targetType.endsWith('*')) return false; - if (QObject *qobject = qtObjectFromJS(value)) { + if (QObject *qobject = qtObjectFromJS(e, value)) { int start = targetType.startsWith("const ") ? 6 : 0; QByteArray className = targetType.mid(start, targetType.size()-start-1); if (void *instance = qobject->qt_metacast(className)) { @@ -936,12 +936,12 @@ bool QV8Engine::convertToNativeQObject(const QV4::ValueRef value, const QByteArr return false; } -QObject *QV8Engine::qtObjectFromJS(const QV4::ValueRef value) +QObject *QV8Engine::qtObjectFromJS(QV4::ExecutionEngine *engine, const QV4::ValueRef value) { if (!value->isObject()) return 0; - QV4::Scope scope(m_v4Engine); + QV4::Scope scope(engine); QV4::Scoped<QV4::VariantObject> v(scope, value); if (v) { diff --git a/src/qml/qml/v8/qv8engine_p.h b/src/qml/qml/v8/qv8engine_p.h index 18b59f0157..b63a052bb7 100644 --- a/src/qml/qml/v8/qv8engine_p.h +++ b/src/qml/qml/v8/qv8engine_p.h @@ -197,12 +197,12 @@ public: void freezeObject(const QV4::ValueRef value); - QVariant toVariant(const QV4::ValueRef value, int typeHint, bool createJSValueForObjects = true, V8ObjectSet *visitedObjects = 0); - QVariant objectToVariant(QV4::Object *o, V8ObjectSet *visitedObjects = 0); + static QVariant toVariant(QV4::ExecutionEngine *e, const QV4::ValueRef value, int typeHint, bool createJSValueForObjects = true, V8ObjectSet *visitedObjects = 0); + static QVariant objectToVariant(QV4::ExecutionEngine *e, QV4::Object *o, V8ObjectSet *visitedObjects = 0); QV4::ReturnedValue fromVariant(const QVariant &); - QVariantMap variantMapFromJS(QV4::Object *o) - { return objectToVariant(o).toMap(); } + static QVariantMap variantMapFromJS(QV4::Object *o) + { return objectToVariant(o->engine(), o).toMap(); } // Return a JS string for the given QString \a string QV4::ReturnedValue toString(const QString &string); @@ -226,9 +226,9 @@ public: QV4::ReturnedValue variantToJS(const QVariant &value); QV4::ReturnedValue metaTypeToJS(int type, const void *data); - bool metaTypeFromJS(const QV4::ValueRef value, int type, void *data); + static bool metaTypeFromJS(QV4::ExecutionEngine *e, const QV4::ValueRef value, int type, void *data); - bool convertToNativeQObject(const QV4::ValueRef value, + static bool convertToNativeQObject(QV4::ExecutionEngine *e, const QV4::ValueRef value, const QByteArray &targetType, void **result); @@ -239,7 +239,7 @@ public: // used for console.count() int consoleCountHelper(const QString &file, quint16 line, quint16 column); - QObject *qtObjectFromJS(const QV4::ValueRef value); + static QObject *qtObjectFromJS(QV4::ExecutionEngine *engine, const QV4::ValueRef value); protected: QJSEngine* q; |