From b9b12af83f121cdbc9bb1d3067bfb9e4ba923088 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 30 Dec 2014 11:54:59 +0100 Subject: [PATCH] Remove v8engine dependency in fromVariant conversions Change-Id: I3427129dc7a0e68c8fa0b61f353835e2bee179a0 Reviewed-by: Simon Hausmann --- src/imports/localstorage/plugin.cpp | 3 +- src/imports/xmllistmodel/qqmlxmllistmodel.cpp | 2 +- src/qml/jsapi/qjsvalue.cpp | 2 +- src/qml/jsruntime/qv4qobjectwrapper.cpp | 10 ++--- src/qml/jsruntime/qv4serialize.cpp | 2 +- src/qml/qml/qqmlboundsignal.cpp | 5 +-- src/qml/qml/qqmlcontextwrapper.cpp | 2 +- src/qml/qml/qqmlvaluetypewrapper.cpp | 2 +- src/qml/qml/qqmlvmemetaobject.cpp | 4 +- src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 45 ++++++++----------- src/qml/qml/v8/qv8engine.cpp | 62 +++++++++++++-------------- src/qml/qml/v8/qv8engine_p.h | 2 +- src/qml/types/qqmldelegatemodel.cpp | 2 +- src/qml/types/qqmllistmodel.cpp | 2 +- src/qml/util/qqmladaptormodel.cpp | 6 +-- src/quick/items/context2d/qquickcontext2d.cpp | 3 +- 16 files changed, 69 insertions(+), 85 deletions(-) diff --git a/src/imports/localstorage/plugin.cpp b/src/imports/localstorage/plugin.cpp index 17a27bf..8ee2742 100644 --- a/src/imports/localstorage/plugin.cpp +++ b/src/imports/localstorage/plugin.cpp @@ -219,7 +219,6 @@ static QString qmlsqldatabase_databaseFile(const QString& connectionName, QV8Eng static ReturnedValue qmlsqldatabase_rows_index(QQmlSqlDatabaseWrapper *r, ExecutionEngine *v4, quint32 index, bool *hasProperty = 0) { Scope scope(v4); - QV8Engine *v8 = v4->v8Engine; if (r->d()->sqlQuery.at() == (int)index || r->d()->sqlQuery.seek(index)) { QSqlRecord record = r->d()->sqlQuery.record(); @@ -228,7 +227,7 @@ static ReturnedValue qmlsqldatabase_rows_index(QQmlSqlDatabaseWrapper *r, Execut for (int ii = 0; ii < record.count(); ++ii) { QVariant v = record.value(ii); ScopedString s(scope, v4->newIdentifier(record.fieldName(ii))); - ScopedValue val(scope, v.isNull() ? Encode::null() : v8->fromVariant(v)); + ScopedValue val(scope, v.isNull() ? Encode::null() : QV8Engine::fromVariant(v4, v)); row->put(s.getPointer(), val); } if (hasProperty) diff --git a/src/imports/xmllistmodel/qqmlxmllistmodel.cpp b/src/imports/xmllistmodel/qqmlxmllistmodel.cpp index 225eedb..7cd1a2f 100644 --- a/src/imports/xmllistmodel/qqmlxmllistmodel.cpp +++ b/src/imports/xmllistmodel/qqmlxmllistmodel.cpp @@ -925,7 +925,7 @@ QQmlV4Handle QQuickXmlListModel::get(int index) const ScopedValue value(scope); for (int ii = 0; ii < d->roleObjects.count(); ++ii) { name = v4engine->newIdentifier(d->roleObjects[ii]->name()); - value = v8engine->fromVariant(d->data.value(ii).value(index)); + value = QV8Engine::fromVariant(v4engine, d->data.value(ii).value(index)); o->insertMember(name.getPointer(), value); } diff --git a/src/qml/jsapi/qjsvalue.cpp b/src/qml/jsapi/qjsvalue.cpp index 1c2a727..b423565 100644 --- a/src/qml/jsapi/qjsvalue.cpp +++ b/src/qml/jsapi/qjsvalue.cpp @@ -58,7 +58,7 @@ QV4::ReturnedValue QJSValuePrivate::getValue(QV4::ExecutionEngine *e) } if (value.isEmpty()) { - value = QV4::Encode(engine->v8Engine->fromVariant(unboundData)); + value = QV4::Encode(QV8Engine::fromVariant(e, unboundData)); PersistentValuePrivate **listRoot = &engine->memoryManager->m_persistentValues; prev = listRoot; next = *listRoot; diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index 8235f87..95605cd 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -205,7 +205,7 @@ static QV4::ReturnedValue LoadProperty(QV8Engine *engine, QObject *object, return QV4::QQmlValueTypeWrapper::create(v4, object, property.coreIndex, valueTypeMetaObject, v.userType()); // VariantReference value-type. } - return engine->fromVariant(v); + return QV8Engine::fromVariant(scope.engine, v); } else if (QQmlValueTypeFactory::isValueType(property.propType)) { Q_ASSERT(notifier == 0); @@ -229,7 +229,7 @@ static QV4::ReturnedValue LoadProperty(QV8Engine *engine, QObject *object, } else { QVariant v(property.propType, (void *)0); ReadFunction(object, property, v.data(), notifier); - return engine->fromVariant(v); + return QV8Engine::fromVariant(scope.engine, v); } } @@ -808,9 +808,9 @@ struct QObjectSlotDispatcher : public QtPrivate::QSlotObjectBase for (int ii = 0; ii < argCount; ++ii) { int type = argsTypes[ii + 1]; if (type == qMetaTypeId()) { - callData->args[ii] = v4->v8Engine->fromVariant(*((QVariant *)metaArgs[ii + 1])); + callData->args[ii] = QV8Engine::fromVariant(v4, *((QVariant *)metaArgs[ii + 1])); } else { - callData->args[ii] = v4->v8Engine->fromVariant(QVariant(type, metaArgs[ii + 1])); + callData->args[ii] = QV8Engine::fromVariant(v4, QVariant(type, metaArgs[ii + 1])); } } @@ -1720,7 +1720,7 @@ QV4::ReturnedValue CallArgument::toValue(QV8Engine *engine) return QV4::JsonObject::fromJsonValue(v4, *jsonValuePtr); } else if (type == -1 || type == qMetaTypeId()) { QVariant value = *qvariantPtr; - QV4::ScopedValue rv(scope, engine->fromVariant(value)); + QV4::ScopedValue rv(scope, QV8Engine::fromVariant(scope.engine, value)); QV4::Scoped qobjectWrapper(scope, rv); if (!!qobjectWrapper) { if (QObject *object = qobjectWrapper->object()) diff --git a/src/qml/jsruntime/qv4serialize.cpp b/src/qml/jsruntime/qv4serialize.cpp index 9d558d8..8d06927 100644 --- a/src/qml/jsruntime/qv4serialize.cpp +++ b/src/qml/jsruntime/qv4serialize.cpp @@ -359,7 +359,7 @@ ReturnedValue Serialize::deserialize(const char *&data, ExecutionEngine *engine) // ### Find a better solution then the ugly property QQmlListModelWorkerAgent::VariantRef ref(agent); QVariant var = qVariantFromValue(ref); - QV4::ScopedValue v(scope, engine->v8Engine->fromVariant((var))); + QV4::ScopedValue v(scope, QV8Engine::fromVariant(scope.engine, var)); QV4::ScopedString s(scope, engine->newString(QStringLiteral("__qml:hidden:ref"))); rv->asObject()->defineReadonlyProperty(s, v); diff --git a/src/qml/qml/qqmlboundsignal.cpp b/src/qml/qml/qqmlboundsignal.cpp index 8baeefe..6720491 100644 --- a/src/qml/qml/qqmlboundsignal.cpp +++ b/src/qml/qml/qqmlboundsignal.cpp @@ -247,7 +247,6 @@ void QQmlBoundSignalExpression::evaluate(void **a) setExpressionFunctionValid(true); } - QV8Engine *engine = ep->v8engine(); QVarLengthArray dummy; //TODO: lookup via signal index rather than method index as an optimization int methodIndex = QMetaObjectPrivate::signal(m_target->metaObject(), m_index).methodIndex(); @@ -262,7 +261,7 @@ void QQmlBoundSignalExpression::evaluate(void **a) // for several cases (such as QVariant type and QObject-derived types) //args[ii] = engine->metaTypeToJS(type, a[ii + 1]); if (type == QMetaType::QVariant) { - callData->args[ii] = engine->fromVariant(*((QVariant *)a[ii + 1])); + callData->args[ii] = QV8Engine::fromVariant(scope.engine, *((QVariant *)a[ii + 1])); } else if (type == QMetaType::Int) { //### optimization. Can go away if we switch to metaTypeToJS, or be expanded otherwise callData->args[ii] = QV4::Primitive::fromInt32(*reinterpret_cast(a[ii + 1])); @@ -274,7 +273,7 @@ void QQmlBoundSignalExpression::evaluate(void **a) else callData->args[ii] = QV4::QObjectWrapper::wrap(ep->v4engine(), *reinterpret_cast(a[ii + 1])); } else { - callData->args[ii] = engine->fromVariant(QVariant(type, a[ii + 1])); + callData->args[ii] = QV8Engine::fromVariant(scope.engine, QVariant(type, a[ii + 1])); } } diff --git a/src/qml/qml/qqmlcontextwrapper.cpp b/src/qml/qml/qqmlcontextwrapper.cpp index 98b72c6..bcab5c8 100644 --- a/src/qml/qml/qqmlcontextwrapper.cpp +++ b/src/qml/qml/qqmlcontextwrapper.cpp @@ -231,7 +231,7 @@ ReturnedValue QmlContextWrapper::get(Managed *m, String *name, bool *hasProperty QQmlContextPrivate::context_at); return QmlListWrapper::create(v4, prop, qMetaTypeId >()); } else { - return engine->fromVariant(cp->propertyValues.at(propertyIdx)); + return QV8Engine::fromVariant(scope.engine, cp->propertyValues.at(propertyIdx)); } } } diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index 19160fa..a7c4d6c 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -323,7 +323,7 @@ ReturnedValue QQmlValueTypeWrapper::get(Managed *m, String *name, bool *hasPrope QVariant v(result->propType, (void *)0); void *args[] = { v.data(), 0 }; metaObject->d.static_metacall(reinterpret_cast(gadget), QMetaObject::ReadProperty, result->coreIndex, args); - return v4->v8Engine->fromVariant(v); + return QV8Engine::fromVariant(v4, v); #undef VALUE_TYPE_ACCESSOR } diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index e75ccb5..7838d6c 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -945,7 +945,7 @@ int QQmlVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a) callData->thisObject = ep->v8engine()->global(); for (int ii = 0; ii < data->parameterCount; ++ii) - callData->args[ii] = ep->v8engine()->fromVariant(*(QVariant *)a[ii + 1]); + callData->args[ii] = QV8Engine::fromVariant(scope.engine, *(QVariant *)a[ii + 1]); QV4::ScopedValue result(scope); result = function->call(callData); @@ -1077,7 +1077,7 @@ void QQmlVMEMetaObject::writeProperty(int id, const QVariant &value) // And, if the new value is a scarce resource, we need to ensure that it does not get // automatically released by the engine until no other references to it exist. - QV4::ScopedValue newv(scope, QQmlEnginePrivate::get(ctxt->engine)->v8engine()->fromVariant(value)); + QV4::ScopedValue newv(scope, QV8Engine::fromVariant(scope.engine, value)); QV4::Scoped v(scope, newv); if (!!v) v->addVmePropertyReference(); diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 4bfcb87..f114616 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -183,7 +183,7 @@ ReturnedValue QtObject::method_rgba(QV4::CallContext *ctx) if (a < 0.0) a=0.0; if (a > 1.0) a=1.0; - return ctx->d()->engine->v8Engine->fromVariant(QQml_colorProvider()->fromRgbF(r, g, b, a)); + return QV8Engine::fromVariant(ctx->engine(), QQml_colorProvider()->fromRgbF(r, g, b, a)); } /*! @@ -212,7 +212,7 @@ ReturnedValue QtObject::method_hsla(QV4::CallContext *ctx) if (a < 0.0) a=0.0; if (a > 1.0) a=1.0; - return ctx->d()->engine->v8Engine->fromVariant(QQml_colorProvider()->fromHslF(h, s, l, a)); + return QV8Engine::fromVariant(ctx->engine(), QQml_colorProvider()->fromHslF(h, s, l, a)); } /*! @@ -271,7 +271,7 @@ ReturnedValue QtObject::method_rect(QV4::CallContext *ctx) double w = ctx->d()->callData->args[2].toNumber(); double h = ctx->d()->callData->args[3].toNumber(); - return ctx->d()->engine->v8Engine->fromVariant(QVariant::fromValue(QRectF(x, y, w, h))); + return QV8Engine::fromVariant(ctx->engine(), QVariant::fromValue(QRectF(x, y, w, h))); } /*! @@ -286,7 +286,7 @@ ReturnedValue QtObject::method_point(QV4::CallContext *ctx) double x = ctx->d()->callData->args[0].toNumber(); double y = ctx->d()->callData->args[1].toNumber(); - return ctx->d()->engine->v8Engine->fromVariant(QVariant::fromValue(QPointF(x, y))); + return QV8Engine::fromVariant(ctx->engine(), QVariant::fromValue(QPointF(x, y))); } /*! @@ -301,7 +301,7 @@ ReturnedValue QtObject::method_size(QV4::CallContext *ctx) double w = ctx->d()->callData->args[0].toNumber(); double h = ctx->d()->callData->args[1].toNumber(); - return ctx->d()->engine->v8Engine->fromVariant(QVariant::fromValue(QSizeF(w, h))); + return QV8Engine::fromVariant(ctx->engine(), QVariant::fromValue(QSizeF(w, h))); } /*! @@ -322,7 +322,7 @@ ReturnedValue QtObject::method_font(QV4::CallContext *ctx) QVariant v = QQml_valueTypeProvider()->createVariantFromJsObject(QMetaType::QFont, QQmlV4Handle(ctx->d()->callData->args[0]), v8engine, &ok); if (!ok) V4THROW_ERROR("Qt.font(): Invalid argument: no valid font subproperties specified"); - return v8engine->fromVariant(v); + return QV8Engine::fromVariant(ctx->engine(), v); } @@ -341,8 +341,7 @@ ReturnedValue QtObject::method_vector2d(QV4::CallContext *ctx) xy[1] = ctx->d()->callData->args[1].toNumber(); const void *params[] = { xy }; - QV8Engine *v8engine = ctx->d()->engine->v8Engine; - return v8engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector2D, 1, params)); + return QV8Engine::fromVariant(ctx->engine(), QQml_valueTypeProvider()->createValueType(QMetaType::QVector2D, 1, params)); } /*! @@ -360,8 +359,7 @@ ReturnedValue QtObject::method_vector3d(QV4::CallContext *ctx) xyz[2] = ctx->d()->callData->args[2].toNumber(); const void *params[] = { xyz }; - QV8Engine *v8engine = ctx->d()->engine->v8Engine; - return v8engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector3D, 1, params)); + return QV8Engine::fromVariant(ctx->engine(), QQml_valueTypeProvider()->createValueType(QMetaType::QVector3D, 1, params)); } /*! @@ -380,8 +378,7 @@ ReturnedValue QtObject::method_vector4d(QV4::CallContext *ctx) xyzw[3] = ctx->d()->callData->args[3].toNumber(); const void *params[] = { xyzw }; - QV8Engine *v8engine = ctx->d()->engine->v8Engine; - return v8engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector4D, 1, params)); + return QV8Engine::fromVariant(ctx->engine(), QQml_valueTypeProvider()->createValueType(QMetaType::QVector4D, 1, params)); } /*! @@ -400,8 +397,7 @@ ReturnedValue QtObject::method_quaternion(QV4::CallContext *ctx) sxyz[3] = ctx->d()->callData->args[3].toNumber(); const void *params[] = { sxyz }; - QV8Engine *v8engine = ctx->d()->engine->v8Engine; - return v8engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QQuaternion, 1, params)); + return QV8Engine::fromVariant(ctx->engine(), QQml_valueTypeProvider()->createValueType(QMetaType::QQuaternion, 1, params)); } /*! @@ -420,7 +416,7 @@ ReturnedValue QtObject::method_matrix4x4(QV4::CallContext *ctx) QVariant v = QQml_valueTypeProvider()->createVariantFromJsObject(QMetaType::QMatrix4x4, QQmlV4Handle(ctx->d()->callData->args[0]), v8engine, &ok); if (!ok) V4THROW_ERROR("Qt.matrix4x4(): Invalid argument: not a valid matrix4x4 values array"); - return v8engine->fromVariant(v); + return QV8Engine::fromVariant(ctx->engine(), v); } if (ctx->d()->callData->argc != 16) @@ -445,7 +441,7 @@ ReturnedValue QtObject::method_matrix4x4(QV4::CallContext *ctx) vals[15] = ctx->d()->callData->args[15].toNumber(); const void *params[] = { vals }; - return v8engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QMatrix4x4, 1, params)); + return QV8Engine::fromVariant(ctx->engine(), QQml_valueTypeProvider()->createValueType(QMetaType::QMatrix4x4, 1, params)); } /*! @@ -467,7 +463,6 @@ ReturnedValue QtObject::method_lighter(QV4::CallContext *ctx) if (ctx->d()->callData->argc != 1 && ctx->d()->callData->argc != 2) V4THROW_ERROR("Qt.lighter(): Invalid arguments"); - QV8Engine *v8engine = ctx->d()->engine->v8Engine; QVariant v = QV8Engine::toVariant(ctx->engine(), ctx->d()->callData->args[0], -1); if (v.userType() == QVariant::String) { bool ok = false; @@ -483,7 +478,7 @@ ReturnedValue QtObject::method_lighter(QV4::CallContext *ctx) if (ctx->d()->callData->argc == 2) factor = ctx->d()->callData->args[1].toNumber(); - return v8engine->fromVariant(QQml_colorProvider()->lighter(v, factor)); + return QV8Engine::fromVariant(ctx->engine(), QQml_colorProvider()->lighter(v, factor)); } /*! @@ -506,7 +501,6 @@ ReturnedValue QtObject::method_darker(QV4::CallContext *ctx) if (ctx->d()->callData->argc != 1 && ctx->d()->callData->argc != 2) V4THROW_ERROR("Qt.darker(): Invalid arguments"); - QV8Engine *v8engine = ctx->d()->engine->v8Engine; QVariant v = QV8Engine::toVariant(ctx->engine(), ctx->d()->callData->args[0], -1); if (v.userType() == QVariant::String) { bool ok = false; @@ -522,7 +516,7 @@ ReturnedValue QtObject::method_darker(QV4::CallContext *ctx) if (ctx->d()->callData->argc == 2) factor = ctx->d()->callData->args[1].toNumber(); - return v8engine->fromVariant(QQml_colorProvider()->darker(v, factor)); + return QV8Engine::fromVariant(ctx->engine(), QQml_colorProvider()->darker(v, factor)); } /*! @@ -554,8 +548,6 @@ ReturnedValue QtObject::method_tint(QV4::CallContext *ctx) if (ctx->d()->callData->argc != 2) V4THROW_ERROR("Qt.tint(): Invalid arguments"); - QV8Engine *v8engine = ctx->d()->engine->v8Engine; - // base color QVariant v1 = QV8Engine::toVariant(ctx->engine(), ctx->d()->callData->args[0], -1); if (v1.userType() == QVariant::String) { @@ -580,7 +572,7 @@ ReturnedValue QtObject::method_tint(QV4::CallContext *ctx) return QV4::Encode::null(); } - return v8engine->fromVariant(QQml_colorProvider()->tint(v1, v2)); + return QV8Engine::fromVariant(ctx->engine(), QQml_colorProvider()->tint(v1, v2)); } /*! @@ -803,10 +795,8 @@ ReturnedValue QtObject::method_openUrlExternally(QV4::CallContext *ctx) if (ctx->d()->callData->argc != 1) return QV4::Encode(false); - QV8Engine *v8engine = ctx->d()->engine->v8Engine; - QUrl url(Value::fromReturnedValue(method_resolvedUrl(ctx)).toQStringNoThrow()); - return v8engine->fromVariant(QQml_guiProvider()->openUrlExternally(url)); + return QV8Engine::fromVariant(ctx->engine(), QQml_guiProvider()->openUrlExternally(url)); } /*! @@ -841,8 +831,7 @@ ReturnedValue QtObject::method_fontFamilies(CallContext *ctx) if (ctx->d()->callData->argc != 0) V4THROW_ERROR("Qt.fontFamilies(): Invalid arguments"); - QV8Engine *v8engine = ctx->d()->engine->v8Engine; - return v8engine->fromVariant(QVariant(QQml_guiProvider()->fontFamilies())); + return QV8Engine::fromVariant(ctx->engine(), QVariant(QQml_guiProvider()->fontFamilies())); } /*! diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index d4ceaad..3c6fa32 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -306,24 +306,22 @@ QVariant QV8Engine::objectToVariant(QV4::ExecutionEngine *e, QV4::Object *o, V8O return result; } -static QV4::ReturnedValue arrayFromVariantList(QV8Engine *engine, const QVariantList &list) +static QV4::ReturnedValue arrayFromVariantList(QV4::ExecutionEngine *e, const QVariantList &list) { - QV4::ExecutionEngine *e = QV8Engine::getV4(engine); QV4::Scope scope(e); QV4::Scoped a(scope, e->newArrayObject()); int len = list.count(); a->arrayReserve(len); QV4::ScopedValue v(scope); for (int ii = 0; ii < len; ++ii) - a->arrayPut(ii, (v = engine->fromVariant(list.at(ii)))); + a->arrayPut(ii, (v = QV8Engine::fromVariant(scope.engine, list.at(ii)))); a->setArrayLengthUnchecked(len); return a.asReturnedValue(); } -static QV4::ReturnedValue objectFromVariantMap(QV8Engine *engine, const QVariantMap &map) +static QV4::ReturnedValue objectFromVariantMap(QV4::ExecutionEngine *e, const QVariantMap &map) { - QV4::ExecutionEngine *e = QV8Engine::getV4(engine); QV4::Scope scope(e); QV4::ScopedObject o(scope, e->newObject()); QV4::ScopedString s(scope); @@ -333,14 +331,14 @@ static QV4::ReturnedValue objectFromVariantMap(QV8Engine *engine, const QVariant uint idx = s->asArrayIndex(); if (idx > 16 && (!o->arrayData() || idx > o->arrayData()->length() * 2)) o->initSparseArray(); - o->put(s, (v = engine->fromVariant(iter.value()))); + o->put(s, (v = QV8Engine::fromVariant(e, iter.value()))); } return o.asReturnedValue(); } Q_CORE_EXPORT QString qt_regexp_toCanonical(const QString &, QRegExp::PatternSyntax); -QV4::ReturnedValue QV8Engine::fromVariant(const QVariant &variant) +QV4::ReturnedValue QV8Engine::fromVariant(QV4::ExecutionEngine *e, const QVariant &variant) { int type = variant.userType(); const void *ptr = variant.constData(); @@ -365,7 +363,7 @@ QV4::ReturnedValue QV8Engine::fromVariant(const QVariant &variant) case QMetaType::Double: return QV4::Encode(*reinterpret_cast(ptr)); case QMetaType::QString: - return m_v4Engine->currentContext()->engine->newString(*reinterpret_cast(ptr))->asReturnedValue(); + return e->currentContext()->engine->newString(*reinterpret_cast(ptr))->asReturnedValue(); case QMetaType::Float: return QV4::Encode(*reinterpret_cast(ptr)); case QMetaType::Short: @@ -379,44 +377,44 @@ QV4::ReturnedValue QV8Engine::fromVariant(const QVariant &variant) case QMetaType::QChar: return QV4::Encode((int)(*reinterpret_cast(ptr)).unicode()); case QMetaType::QDateTime: - return QV4::Encode(m_v4Engine->newDateObject(*reinterpret_cast(ptr))); + return QV4::Encode(e->newDateObject(*reinterpret_cast(ptr))); case QMetaType::QDate: - return QV4::Encode(m_v4Engine->newDateObject(QDateTime(*reinterpret_cast(ptr)))); + return QV4::Encode(e->newDateObject(QDateTime(*reinterpret_cast(ptr)))); case QMetaType::QTime: - return QV4::Encode(m_v4Engine->newDateObject(QDateTime(QDate(1970,1,1), *reinterpret_cast(ptr)))); + return QV4::Encode(e->newDateObject(QDateTime(QDate(1970,1,1), *reinterpret_cast(ptr)))); case QMetaType::QRegExp: - return QV4::Encode(m_v4Engine->newRegExpObject(*reinterpret_cast(ptr))); + return QV4::Encode(e->newRegExpObject(*reinterpret_cast(ptr))); case QMetaType::QObjectStar: - return QV4::QObjectWrapper::wrap(m_v4Engine, *reinterpret_cast(ptr)); + return QV4::QObjectWrapper::wrap(e, *reinterpret_cast(ptr)); case QMetaType::QStringList: { bool succeeded = false; - QV4::Scope scope(m_v4Engine); - QV4::ScopedValue retn(scope, QV4::SequencePrototype::fromVariant(m_v4Engine, variant, &succeeded)); + QV4::Scope scope(e); + QV4::ScopedValue retn(scope, QV4::SequencePrototype::fromVariant(e, variant, &succeeded)); if (succeeded) return retn.asReturnedValue(); - return QV4::Encode(m_v4Engine->newArrayObject(*reinterpret_cast(ptr))); + return QV4::Encode(e->newArrayObject(*reinterpret_cast(ptr))); } case QMetaType::QVariantList: - return arrayFromVariantList(this, *reinterpret_cast(ptr)); + return arrayFromVariantList(e, *reinterpret_cast(ptr)); case QMetaType::QVariantMap: - return objectFromVariantMap(this, *reinterpret_cast(ptr)); + return objectFromVariantMap(e, *reinterpret_cast(ptr)); case QMetaType::QJsonValue: - return QV4::JsonObject::fromJsonValue(m_v4Engine, *reinterpret_cast(ptr)); + return QV4::JsonObject::fromJsonValue(e, *reinterpret_cast(ptr)); case QMetaType::QJsonObject: - return QV4::JsonObject::fromJsonObject(m_v4Engine, *reinterpret_cast(ptr)); + return QV4::JsonObject::fromJsonObject(e, *reinterpret_cast(ptr)); case QMetaType::QJsonArray: - return QV4::JsonObject::fromJsonArray(m_v4Engine, *reinterpret_cast(ptr)); + return QV4::JsonObject::fromJsonArray(e, *reinterpret_cast(ptr)); case QMetaType::QLocale: - return QQmlLocale::wrap(this, *reinterpret_cast(ptr)); + return QQmlLocale::wrap(e->v8Engine, *reinterpret_cast(ptr)); default: break; } if (const QMetaObject *vtmo = QQmlValueTypeFactory::metaObjectForMetaType(type)) - return QV4::QQmlValueTypeWrapper::create(m_v4Engine, variant, vtmo, type); + return QV4::QQmlValueTypeWrapper::create(e, variant, vtmo, type); } else { - QV4::Scope scope(m_v4Engine); + QV4::Scope scope(e); if (type == qMetaTypeId()) { typedef QQmlListReferencePrivate QDLRP; QDLRP *p = QDLRP::get((QQmlListReference*)ptr); @@ -428,41 +426,41 @@ QV4::ReturnedValue QV8Engine::fromVariant(const QVariant &variant) } else if (type == qMetaTypeId()) { const QJSValue *value = reinterpret_cast(ptr); QJSValuePrivate *valuep = QJSValuePrivate::get(*value); - return valuep->getValue(m_v4Engine); + return valuep->getValue(e); } else if (type == qMetaTypeId >()) { // XXX Can this be made more by using Array as a prototype and implementing // directly against QList? const QList &list = *(QList*)ptr; - QV4::Scoped a(scope, m_v4Engine->newArrayObject()); + QV4::Scoped a(scope, e->newArrayObject()); a->arrayReserve(list.count()); QV4::ScopedValue v(scope); for (int ii = 0; ii < list.count(); ++ii) - a->arrayPut(ii, (v = QV4::QObjectWrapper::wrap(m_v4Engine, list.at(ii)))); + a->arrayPut(ii, (v = QV4::QObjectWrapper::wrap(e, list.at(ii)))); a->setArrayLengthUnchecked(list.count()); return a.asReturnedValue(); } else if (QMetaType::typeFlags(type) & QMetaType::PointerToQObject) { - return QV4::QObjectWrapper::wrap(m_v4Engine, *reinterpret_cast(ptr)); + return QV4::QObjectWrapper::wrap(e, *reinterpret_cast(ptr)); } bool objOk; QObject *obj = QQmlMetaType::toQObject(variant, &objOk); if (objOk) - return QV4::QObjectWrapper::wrap(m_v4Engine, obj); + return QV4::QObjectWrapper::wrap(e, obj); bool succeeded = false; - QV4::ScopedValue retn(scope, QV4::SequencePrototype::fromVariant(m_v4Engine, variant, &succeeded)); + QV4::ScopedValue retn(scope, QV4::SequencePrototype::fromVariant(e, variant, &succeeded)); if (succeeded) return retn.asReturnedValue(); if (const QMetaObject *vtmo = QQmlValueTypeFactory::metaObjectForMetaType(type)) - return QV4::QQmlValueTypeWrapper::create(m_v4Engine, variant, vtmo, type); + return QV4::QQmlValueTypeWrapper::create(e, variant, vtmo, type); } // XXX TODO: To be compatible, we still need to handle: // + QObjectList // + QList - return QV4::Encode(m_v4Engine->newVariantObject(variant)); + return QV4::Encode(e->newVariantObject(variant)); } QNetworkAccessManager *QV8Engine::networkAccessManager() diff --git a/src/qml/qml/v8/qv8engine_p.h b/src/qml/qml/v8/qv8engine_p.h index b63a052..131be2e 100644 --- a/src/qml/qml/v8/qv8engine_p.h +++ b/src/qml/qml/v8/qv8engine_p.h @@ -199,7 +199,7 @@ public: 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 &); + static QV4::ReturnedValue fromVariant(QV4::ExecutionEngine *e, const QVariant &); static QVariantMap variantMapFromJS(QV4::Object *o) { return objectToVariant(o->engine(), o).toMap(); } diff --git a/src/qml/types/qqmldelegatemodel.cpp b/src/qml/types/qqmldelegatemodel.cpp index d72ac42..ec8ad4a 100644 --- a/src/qml/types/qqmldelegatemodel.cpp +++ b/src/qml/types/qqmldelegatemodel.cpp @@ -1825,7 +1825,7 @@ QV4::ReturnedValue QQmlDelegateModelItem::get_groups(QV4::CallContext *ctx) groups.append(o->d()->item->metaType->groupNames.at(i - 1)); } - return scope.engine->v8Engine->fromVariant(groups); + return QV8Engine::fromVariant(scope.engine, groups); } QV4::ReturnedValue QQmlDelegateModelItem::set_groups(QV4::CallContext *ctx) diff --git a/src/qml/types/qqmllistmodel.cpp b/src/qml/types/qqmllistmodel.cpp index 083bbd6..bac6aed 100644 --- a/src/qml/types/qqmllistmodel.cpp +++ b/src/qml/types/qqmllistmodel.cpp @@ -1264,7 +1264,7 @@ void ModelNodeMetaObject::propertyWritten(int index) QVariant value = operator[](index); QV4::Scope scope(QV8Engine::getV4((eng))); - QV4::ScopedValue v(scope, eng->fromVariant(value)); + QV4::ScopedValue v(scope, QV8Engine::fromVariant(scope.engine, value)); int roleIndex = m_obj->m_model->m_listModel->setExistingProperty(m_obj->m_elementIndex, propName, v, eng); if (roleIndex != -1) { diff --git a/src/qml/util/qqmladaptormodel.cpp b/src/qml/util/qqmladaptormodel.cpp index 45c8963..678ff14 100644 --- a/src/qml/util/qqmladaptormodel.cpp +++ b/src/qml/util/qqmladaptormodel.cpp @@ -345,11 +345,11 @@ QV4::ReturnedValue QQmlDMCachedModelData::get_property(QV4::CallContext *ctx, ui QQmlDMCachedModelData *modelData = static_cast(o->d()->item); if (o->d()->item->index == -1) { if (!modelData->cachedData.isEmpty()) { - return ctx->d()->engine->v8Engine->fromVariant( + return QV8Engine::fromVariant(scope.engine, modelData->cachedData.at(modelData->type->hasModelData ? 0 : propertyId)); } } else if (*modelData->type->model) { - return ctx->d()->engine->v8Engine->fromVariant( + return QV8Engine::fromVariant(scope.engine, modelData->value(modelData->type->propertyRoles.at(propertyId))); } return QV4::Encode::undefined(); @@ -584,7 +584,7 @@ public: if (!o) return ctx->engine()->throwTypeError(QStringLiteral("Not a valid VisualData object")); - return scope.engine->v8Engine->fromVariant(static_cast(o->d()->item)->cachedData); + return QV8Engine::fromVariant(scope.engine, static_cast(o->d()->item)->cachedData); } static QV4::ReturnedValue set_modelData(QV4::CallContext *ctx) diff --git a/src/quick/items/context2d/qquickcontext2d.cpp b/src/quick/items/context2d/qquickcontext2d.cpp index d8e4530..a028055 100644 --- a/src/quick/items/context2d/qquickcontext2d.cpp +++ b/src/quick/items/context2d/qquickcontext2d.cpp @@ -1430,8 +1430,7 @@ QV4::ReturnedValue QQuickJSContext2D::method_get_fillRule(QV4::CallContext *ctx) QV4::Scoped r(scope, ctx->d()->callData->thisObject.as()); CHECK_CONTEXT(r) - QV8Engine *engine = scope.engine->v8Engine; - return engine->fromVariant(r->d()->context->state.fillRule); + return QV8Engine::fromVariant(scope.engine, r->d()->context->state.fillRule); } QV4::ReturnedValue QQuickJSContext2D::method_set_fillRule(QV4::CallContext *ctx) -- 2.7.4