diff options
Diffstat (limited to 'src/qml/qml/v8/qqmlbuiltinfunctions.cpp')
-rw-r--r-- | src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 350 |
1 files changed, 189 insertions, 161 deletions
diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 459d9afe2a..ebf8918d31 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -87,8 +87,7 @@ DEFINE_OBJECT_VTABLE(QtObject); #define THROW_TYPE_ERROR_WITH_MESSAGE(msg) \ do { \ - scope.result = scope.engine->throwTypeError(QString::fromUtf8(msg)); \ - return; \ + return scope.engine->throwTypeError(QString::fromUtf8(msg)); \ } while (false) struct StaticQtMetaObject : public QObject @@ -229,12 +228,12 @@ void QtObject::advanceIterator(Managed *m, ObjectIterator *it, Value *name, uint \qmlmethod bool Qt::isQtObject(object) Returns true if \c object is a valid reference to a Qt or QML object, otherwise false. */ -void QtObject::method_isQtObject(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_isQtObject(const BuiltinFunction *, CallData *callData) { if (callData->argc == 0) RETURN_RESULT(QV4::Encode(false)); - scope.result = QV4::Encode(callData->args[0].as<QV4::QObjectWrapper>() != 0); + return QV4::Encode(callData->args[0].as<QV4::QObjectWrapper>() != 0); } /*! @@ -243,8 +242,9 @@ void QtObject::method_isQtObject(const BuiltinFunction *, Scope &scope, CallData Returns a color with the specified \c red, \c green, \c blue and \c alpha components. All components should be in the range 0-1 inclusive. */ -void QtObject::method_rgba(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_rgba(const BuiltinFunction *builtin, CallData *callData) { + QV4::Scope scope(builtin); int argCount = callData->argc; if (argCount < 3 || argCount > 4) THROW_GENERIC_ERROR("Qt.rgba(): Invalid arguments"); @@ -263,7 +263,7 @@ void QtObject::method_rgba(const BuiltinFunction *, Scope &scope, CallData *call if (a < 0.0) a=0.0; if (a > 1.0) a=1.0; - scope.result = scope.engine->fromVariant(QQml_colorProvider()->fromRgbF(r, g, b, a)); + return scope.engine->fromVariant(QQml_colorProvider()->fromRgbF(r, g, b, a)); } /*! @@ -272,8 +272,9 @@ void QtObject::method_rgba(const BuiltinFunction *, Scope &scope, CallData *call Returns a color with the specified \c hue, \c saturation, \c lightness and \c alpha components. All components should be in the range 0-1 inclusive. */ -void QtObject::method_hsla(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_hsla(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); int argCount = callData->argc; if (argCount < 3 || argCount > 4) THROW_GENERIC_ERROR("Qt.hsla(): Invalid arguments"); @@ -292,7 +293,7 @@ void QtObject::method_hsla(const BuiltinFunction *, Scope &scope, CallData *call if (a < 0.0) a=0.0; if (a > 1.0) a=1.0; - scope.result = scope.engine->fromVariant(QQml_colorProvider()->fromHslF(h, s, l, a)); + return scope.engine->fromVariant(QQml_colorProvider()->fromHslF(h, s, l, a)); } /*! @@ -303,8 +304,9 @@ All components should be in the range 0-1 inclusive. \since 5.5 */ -void QtObject::method_hsva(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_hsva(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); int argCount = callData->argc; if (argCount < 3 || argCount > 4) THROW_GENERIC_ERROR("Qt.hsva(): Invalid arguments"); @@ -319,7 +321,7 @@ void QtObject::method_hsva(const BuiltinFunction *, Scope &scope, CallData *call v = qBound(0.0, v, 1.0); a = qBound(0.0, a, 1.0); - scope.result = scope.engine->fromVariant(QQml_colorProvider()->fromHsvF(h, s, v, a)); + return scope.engine->fromVariant(QQml_colorProvider()->fromHsvF(h, s, v, a)); } /*! @@ -330,8 +332,9 @@ may be either color values or string values. If a string value is supplied it must be convertible to a color, as described for the \l{colorbasictypedocs}{color} basic type. */ -void QtObject::method_colorEqual(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_colorEqual(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 2) THROW_GENERIC_ERROR("Qt.colorEqual(): Invalid arguments"); @@ -358,7 +361,7 @@ void QtObject::method_colorEqual(const BuiltinFunction *, Scope &scope, CallData } bool equal = (lhs == rhs); - scope.result = QV4::Encode(equal); + return QV4::Encode(equal); } /*! @@ -368,8 +371,9 @@ Returns a \c rect with the top-left corner at \c x, \c y and the specified \c wi The returned object has \c x, \c y, \c width and \c height attributes with the given values. */ -void QtObject::method_rect(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_rect(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 4) THROW_GENERIC_ERROR("Qt.rect(): Invalid arguments"); @@ -378,37 +382,39 @@ void QtObject::method_rect(const BuiltinFunction *, Scope &scope, CallData *call double w = callData->args[2].toNumber(); double h = callData->args[3].toNumber(); - scope.result = scope.engine->fromVariant(QVariant::fromValue(QRectF(x, y, w, h))); + return scope.engine->fromVariant(QVariant::fromValue(QRectF(x, y, w, h))); } /*! \qmlmethod point Qt::point(int x, int y) Returns a Point with the specified \c x and \c y coordinates. */ -void QtObject::method_point(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_point(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 2) THROW_GENERIC_ERROR("Qt.point(): Invalid arguments"); double x = callData->args[0].toNumber(); double y = callData->args[1].toNumber(); - scope.result = scope.engine->fromVariant(QVariant::fromValue(QPointF(x, y))); + return scope.engine->fromVariant(QVariant::fromValue(QPointF(x, y))); } /*! \qmlmethod Qt::size(int width, int height) Returns a Size with the specified \c width and \c height. */ -void QtObject::method_size(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_size(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 2) THROW_GENERIC_ERROR("Qt.size(): Invalid arguments"); double w = callData->args[0].toNumber(); double h = callData->args[1].toNumber(); - scope.result = scope.engine->fromVariant(QVariant::fromValue(QSizeF(w, h))); + return scope.engine->fromVariant(QVariant::fromValue(QSizeF(w, h))); } /*! @@ -419,8 +425,9 @@ key-value pairs where valid keys are the \l{fontbasictypedocs}{font} type's subproperty names, and the values are valid values for each subproperty. Invalid keys will be ignored. */ -void QtObject::method_font(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_font(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 1 || !callData->args[0].isObject()) THROW_GENERIC_ERROR("Qt.font(): Invalid arguments"); @@ -429,7 +436,7 @@ void QtObject::method_font(const BuiltinFunction *, Scope &scope, CallData *call QVariant v = QQml_valueTypeProvider()->createVariantFromJsObject(QMetaType::QFont, QQmlV4Handle(callData->args[0]), v4, &ok); if (!ok) THROW_GENERIC_ERROR("Qt.font(): Invalid argument: no valid font subproperties specified"); - scope.result = scope.engine->fromVariant(v); + return scope.engine->fromVariant(v); } @@ -438,8 +445,9 @@ void QtObject::method_font(const BuiltinFunction *, Scope &scope, CallData *call \qmlmethod Qt::vector2d(real x, real y) Returns a Vector2D with the specified \c x and \c y. */ -void QtObject::method_vector2d(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_vector2d(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 2) THROW_GENERIC_ERROR("Qt.vector2d(): Invalid arguments"); @@ -448,15 +456,16 @@ void QtObject::method_vector2d(const BuiltinFunction *, Scope &scope, CallData * xy[1] = callData->args[1].toNumber(); const void *params[] = { xy }; - scope.result = scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector2D, 1, params)); + return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector2D, 1, params)); } /*! \qmlmethod Qt::vector3d(real x, real y, real z) Returns a Vector3D with the specified \c x, \c y and \c z. */ -void QtObject::method_vector3d(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_vector3d(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 3) THROW_GENERIC_ERROR("Qt.vector3d(): Invalid arguments"); @@ -466,15 +475,16 @@ void QtObject::method_vector3d(const BuiltinFunction *, Scope &scope, CallData * xyz[2] = callData->args[2].toNumber(); const void *params[] = { xyz }; - scope.result = scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector3D, 1, params)); + return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector3D, 1, params)); } /*! \qmlmethod Qt::vector4d(real x, real y, real z, real w) Returns a Vector4D with the specified \c x, \c y, \c z and \c w. */ -void QtObject::method_vector4d(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_vector4d(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 4) THROW_GENERIC_ERROR("Qt.vector4d(): Invalid arguments"); @@ -485,15 +495,16 @@ void QtObject::method_vector4d(const BuiltinFunction *, Scope &scope, CallData * xyzw[3] = callData->args[3].toNumber(); const void *params[] = { xyzw }; - scope.result = scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector4D, 1, params)); + return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector4D, 1, params)); } /*! \qmlmethod Qt::quaternion(real scalar, real x, real y, real z) Returns a Quaternion with the specified \c scalar, \c x, \c y, and \c z. */ -void QtObject::method_quaternion(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_quaternion(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 4) THROW_GENERIC_ERROR("Qt.quaternion(): Invalid arguments"); @@ -504,7 +515,7 @@ void QtObject::method_quaternion(const BuiltinFunction *, Scope &scope, CallData sxyz[3] = callData->args[3].toNumber(); const void *params[] = { sxyz }; - scope.result = scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QQuaternion, 1, params)); + return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QQuaternion, 1, params)); } /*! @@ -516,22 +527,20 @@ matrix values. Finally, the function may be called with no arguments and the resulting matrix will be the identity matrix. */ -void QtObject::method_matrix4x4(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_matrix4x4(const BuiltinFunction *b, CallData *callData) { - QV4::ExecutionEngine *v4 = scope.engine; + QV4::Scope scope(b); if (callData->argc == 0) { - scope.result = scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QMatrix4x4, 0, Q_NULLPTR)); - return; + return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QMatrix4x4, 0, Q_NULLPTR)); } if (callData->argc == 1 && callData->args[0].isObject()) { bool ok = false; - QVariant v = QQml_valueTypeProvider()->createVariantFromJsObject(QMetaType::QMatrix4x4, QQmlV4Handle(callData->args[0]), v4, &ok); + QVariant v = QQml_valueTypeProvider()->createVariantFromJsObject(QMetaType::QMatrix4x4, QQmlV4Handle(callData->args[0]), scope.engine, &ok); if (!ok) THROW_GENERIC_ERROR("Qt.matrix4x4(): Invalid argument: not a valid matrix4x4 values array"); - scope.result = scope.engine->fromVariant(v); - return; + return scope.engine->fromVariant(v); } if (callData->argc != 16) @@ -556,7 +565,7 @@ void QtObject::method_matrix4x4(const BuiltinFunction *, Scope &scope, CallData vals[15] = callData->args[15].toNumber(); const void *params[] = { vals }; - scope.result = scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QMatrix4x4, 1, params)); + return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QMatrix4x4, 1, params)); } /*! @@ -573,8 +582,9 @@ by factor and converts the color back to RGB. If \c factor is not supplied, returns a color 50% lighter than \c baseColor (factor 1.5). */ -void QtObject::method_lighter(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_lighter(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 1 && callData->argc != 2) THROW_GENERIC_ERROR("Qt.lighter(): Invalid arguments"); @@ -583,19 +593,17 @@ void QtObject::method_lighter(const BuiltinFunction *, Scope &scope, CallData *c bool ok = false; v = QQmlStringConverters::colorFromString(v.toString(), &ok); if (!ok) { - scope.result = QV4::Encode::null(); - return; + return QV4::Encode::null(); } } else if (v.userType() != QVariant::Color) { - scope.result = QV4::Encode::null(); - return; + return QV4::Encode::null(); } qreal factor = 1.5; if (callData->argc == 2) factor = callData->args[1].toNumber(); - scope.result = scope.engine->fromVariant(QQml_colorProvider()->lighter(v, factor)); + return scope.engine->fromVariant(QQml_colorProvider()->lighter(v, factor)); } /*! @@ -613,8 +621,9 @@ by factor and converts the color back to RGB. If \c factor is not supplied, returns a color 50% darker than \c baseColor (factor 2.0). */ -void QtObject::method_darker(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_darker(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 1 && callData->argc != 2) THROW_GENERIC_ERROR("Qt.darker(): Invalid arguments"); @@ -623,19 +632,17 @@ void QtObject::method_darker(const BuiltinFunction *, Scope &scope, CallData *ca bool ok = false; v = QQmlStringConverters::colorFromString(v.toString(), &ok); if (!ok) { - scope.result = QV4::Encode::null(); - return; + return QV4::Encode::null(); } } else if (v.userType() != QVariant::Color) { - scope.result = QV4::Encode::null(); - return; + return QV4::Encode::null(); } qreal factor = 2.0; if (callData->argc == 2) factor = callData->args[1].toNumber(); - scope.result = scope.engine->fromVariant(QQml_colorProvider()->darker(v, factor)); + return scope.engine->fromVariant(QQml_colorProvider()->darker(v, factor)); } /*! @@ -662,8 +669,9 @@ void QtObject::method_darker(const BuiltinFunction *, Scope &scope, CallData *ca Tint is most useful when a subtle change is intended to be conveyed due to some event; you can then use tinting to more effectively tune the visible color. */ -void QtObject::method_tint(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_tint(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 2) THROW_GENERIC_ERROR("Qt.tint(): Invalid arguments"); @@ -673,12 +681,10 @@ void QtObject::method_tint(const BuiltinFunction *, Scope &scope, CallData *call bool ok = false; v1 = QQmlStringConverters::colorFromString(v1.toString(), &ok); if (!ok) { - scope.result = QV4::Encode::null(); - return; + return QV4::Encode::null(); } } else if (v1.userType() != QVariant::Color) { - scope.result = QV4::Encode::null(); - return; + return QV4::Encode::null(); } // tint color @@ -687,15 +693,13 @@ void QtObject::method_tint(const BuiltinFunction *, Scope &scope, CallData *call bool ok = false; v2 = QQmlStringConverters::colorFromString(v2.toString(), &ok); if (!ok) { - scope.result = QV4::Encode::null(); - return; + return QV4::Encode::null(); } } else if (v2.userType() != QVariant::Color) { - scope.result = QV4::Encode::null(); - return; + return QV4::Encode::null(); } - scope.result = scope.engine->fromVariant(QQml_colorProvider()->tint(v1, v2)); + return scope.engine->fromVariant(QQml_colorProvider()->tint(v1, v2)); } /*! @@ -714,8 +718,9 @@ If \a format is not specified, \a date is formatted using \sa Locale */ -void QtObject::method_formatDate(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_formatDate(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc < 1 || callData->argc > 2) THROW_GENERIC_ERROR("Qt.formatDate(): Invalid arguments"); @@ -738,7 +743,7 @@ void QtObject::method_formatDate(const BuiltinFunction *, Scope &scope, CallData formattedDate = date.toString(enumFormat); } - scope.result = scope.engine->newString(formattedDate); + return Encode(scope.engine->newString(formattedDate)); } /*! @@ -756,8 +761,9 @@ If \a format is not specified, \a time is formatted using \sa Locale */ -void QtObject::method_formatTime(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_formatTime(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc < 1 || callData->argc > 2) THROW_GENERIC_ERROR("Qt.formatTime(): Invalid arguments"); @@ -786,7 +792,7 @@ void QtObject::method_formatTime(const BuiltinFunction *, Scope &scope, CallData formattedTime = time.toString(enumFormat); } - scope.result = scope.engine->newString(formattedTime); + return Encode(scope.engine->newString(formattedTime)); } /*! @@ -879,8 +885,9 @@ with the \a format values below to produce the following results: \sa Locale */ -void QtObject::method_formatDateTime(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_formatDateTime(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc < 1 || callData->argc > 2) THROW_GENERIC_ERROR("Qt.formatDateTime(): Invalid arguments"); @@ -903,7 +910,7 @@ void QtObject::method_formatDateTime(const BuiltinFunction *, Scope &scope, Call formattedDt = dt.toString(enumFormat); } - scope.result = scope.engine->newString(formattedDt); + return Encode(scope.engine->newString(formattedDt)); } /*! @@ -917,94 +924,97 @@ void QtObject::method_formatDateTime(const BuiltinFunction *, Scope &scope, Call still fail to launch or fail to open the requested URL. This result will not be reported back to the application. */ -void QtObject::method_openUrlExternally(const BuiltinFunction *b, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_openUrlExternally(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 1) { - scope.result = QV4::Encode(false); - return; + return QV4::Encode(false); } - method_resolvedUrl(b, scope, callData); - QUrl url(scope.result.toQStringNoThrow()); - scope.result = scope.engine->fromVariant(QQml_guiProvider()->openUrlExternally(url)); + ScopedValue result(scope, method_resolvedUrl(b, callData)); + QUrl url(result->toQStringNoThrow()); + return scope.engine->fromVariant(QQml_guiProvider()->openUrlExternally(url)); } /*! \qmlmethod url Qt::resolvedUrl(url url) Returns \a url resolved relative to the URL of the caller. */ -void QtObject::method_resolvedUrl(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_resolvedUrl(const BuiltinFunction *b, CallData *callData) { - ExecutionEngine *v4 = scope.engine; + QV4::Scope scope(b); - QUrl url = v4->toVariant(callData->args[0], -1).toUrl(); - QQmlEngine *e = v4->qmlEngine(); + QUrl url = scope.engine->toVariant(callData->args[0], -1).toUrl(); + QQmlEngine *e = scope.engine->qmlEngine(); QQmlEnginePrivate *p = 0; if (e) p = QQmlEnginePrivate::get(e); if (p) { - QQmlContextData *ctxt = v4->callingQmlContext(); + QQmlContextData *ctxt = scope.engine->callingQmlContext(); if (ctxt) - scope.result = v4->newString(ctxt->resolvedUrl(url).toString()); + return Encode(scope.engine->newString(ctxt->resolvedUrl(url).toString())); else - scope.result = v4->newString(url.toString()); - return; + return Encode(scope.engine->newString(url.toString())); } - scope.result = v4->newString(e->baseUrl().resolved(url).toString()); + return Encode(scope.engine->newString(e->baseUrl().resolved(url).toString())); } /*! \qmlmethod list<string> Qt::fontFamilies() Returns a list of the font families available to the application. */ -void QtObject::method_fontFamilies(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_fontFamilies(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 0) THROW_GENERIC_ERROR("Qt.fontFamilies(): Invalid arguments"); - scope.result = scope.engine->fromVariant(QVariant(QQml_guiProvider()->fontFamilies())); + return scope.engine->fromVariant(QVariant(QQml_guiProvider()->fontFamilies())); } /*! \qmlmethod string Qt::md5(data) Returns a hex string of the md5 hash of \c data. */ -void QtObject::method_md5(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_md5(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 1) THROW_GENERIC_ERROR("Qt.md5(): Invalid arguments"); QByteArray data = callData->args[0].toQStringNoThrow().toUtf8(); QByteArray result = QCryptographicHash::hash(data, QCryptographicHash::Md5); - scope.result = scope.engine->newString(QLatin1String(result.toHex())); + return Encode(scope.engine->newString(QLatin1String(result.toHex()))); } /*! \qmlmethod string Qt::btoa(data) Binary to ASCII - this function returns a base64 encoding of \c data. */ -void QtObject::method_btoa(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_btoa(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 1) THROW_GENERIC_ERROR("Qt.btoa(): Invalid arguments"); QByteArray data = callData->args[0].toQStringNoThrow().toUtf8(); - scope.result = scope.engine->newString(QLatin1String(data.toBase64())); + return Encode(scope.engine->newString(QLatin1String(data.toBase64()))); } /*! \qmlmethod string Qt::atob(data) ASCII to binary - this function decodes the base64 encoded \a data string and returns it. */ -void QtObject::method_atob(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_atob(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 1) THROW_GENERIC_ERROR("Qt.atob(): Invalid arguments"); QByteArray data = callData->args[0].toQStringNoThrow().toLatin1(); - scope.result = scope.engine->newString(QString::fromUtf8(QByteArray::fromBase64(data))); + return Encode(scope.engine->newString(QString::fromUtf8(QByteArray::fromBase64(data)))); } /*! @@ -1016,10 +1026,10 @@ QQmlEngine::quit() signal to the QCoreApplication::quit() slot. \sa exit() */ -void QtObject::method_quit(const BuiltinFunction *, Scope &scope, CallData *) +ReturnedValue QtObject::method_quit(const BuiltinFunction *b, CallData *) { - QQmlEnginePrivate::get(scope.engine->qmlEngine())->sendQuit(); - scope.result = Encode::undefined(); + QQmlEnginePrivate::get(b->engine()->qmlEngine())->sendQuit(); + return Encode::undefined(); } /*! @@ -1033,15 +1043,16 @@ void QtObject::method_quit(const BuiltinFunction *, Scope &scope, CallData *) \sa quit() */ -void QtObject::method_exit(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_exit(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 1) THROW_GENERIC_ERROR("Qt.exit(): Invalid arguments"); int retCode = callData->args[0].toNumber(); QQmlEnginePrivate::get(scope.engine->qmlEngine())->sendExit(retCode); - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); } /*! @@ -1068,8 +1079,9 @@ If this is the case, consider using \l{QtQml::Qt::createComponent()}{Qt.createCo See \l {Dynamic QML Object Creation from JavaScript} for more information on using this function. */ -void QtObject::method_createQmlObject(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_createQmlObject(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc < 2 || callData->argc > 3) THROW_GENERIC_ERROR("Qt.createQmlObject(): Invalid arguments"); @@ -1168,13 +1180,12 @@ void QtObject::method_createQmlObject(const BuiltinFunction *, Scope &scope, Cal if (component.isError()) { ScopedValue v(scope, Error::create(scope.engine, component.errors())); - scope.result = scope.engine->throwError(v); - return; + return scope.engine->throwError(v); } Q_ASSERT(obj); - scope.result = QV4::QObjectWrapper::wrap(scope.engine, obj); + return QV4::QObjectWrapper::wrap(scope.engine, obj); } /*! @@ -1221,8 +1232,9 @@ See \l {Dynamic QML Object Creation from JavaScript} for more information on usi To create a QML object from an arbitrary string of QML (instead of a file), use \l{QtQml::Qt::createQmlObject()}{Qt.createQmlObject()}. */ -void QtObject::method_createComponent(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_createComponent(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc < 1 || callData->argc > 3) THROW_GENERIC_ERROR("Qt.createComponent(): Invalid arguments"); @@ -1280,7 +1292,7 @@ void QtObject::method_createComponent(const BuiltinFunction *, Scope &scope, Cal QQmlData::get(c, true)->explicitIndestructibleSet = false; QQmlData::get(c)->indestructible = false; - scope.result = QV4::QObjectWrapper::wrap(scope.engine, c); + return QV4::QObjectWrapper::wrap(scope.engine, c); } /*! @@ -1303,8 +1315,9 @@ void QtObject::method_createComponent(const BuiltinFunction *, Scope &scope, Cal \sa Locale */ -void QtObject::method_locale(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_locale(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QString code; if (callData->argc > 1) THROW_GENERIC_ERROR("locale() requires 0 or 1 argument"); @@ -1314,7 +1327,7 @@ void QtObject::method_locale(const BuiltinFunction *, Scope &scope, CallData *ca if (callData->argc == 1) code = callData->args[0].toQStringNoThrow(); - scope.result = QQmlLocale::locale(scope.engine, code); + return QQmlLocale::locale(scope.engine, code); } void Heap::QQmlBindingFunction::init(const QV4::FunctionObject *originalFunction) @@ -1376,20 +1389,22 @@ DEFINE_OBJECT_VTABLE(QQmlBindingFunction); \since 5.0 */ -void QtObject::method_binding(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_binding(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 1) THROW_GENERIC_ERROR("binding() requires 1 argument"); const QV4::FunctionObject *f = callData->args[0].as<FunctionObject>(); if (!f) THROW_TYPE_ERROR_WITH_MESSAGE("binding(): argument (binding expression) must be a function"); - scope.result = scope.engine->memoryManager->allocObject<QQmlBindingFunction>(f); + return Encode(scope.engine->memoryManager->allocObject<QQmlBindingFunction>(f)); } -void QtObject::method_get_platform(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_get_platform(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); // ### inefficient. Should be just a value based getter Object *o = callData->thisObject.as<Object>(); if (!o) @@ -1402,11 +1417,12 @@ void QtObject::method_get_platform(const BuiltinFunction *, Scope &scope, CallDa // Only allocate a platform object once qt->d()->platform = new QQmlPlatform(scope.engine->jsEngine()); - scope.result = QV4::QObjectWrapper::wrap(scope.engine, qt->d()->platform); + return QV4::QObjectWrapper::wrap(scope.engine, qt->d()->platform); } -void QtObject::method_get_application(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_get_application(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); // ### inefficient. Should be just a value based getter Object *o = callData->thisObject.as<Object>(); if (!o) @@ -1419,19 +1435,19 @@ void QtObject::method_get_application(const BuiltinFunction *, Scope &scope, Cal // Only allocate an application object once qt->d()->application = QQml_guiProvider()->application(scope.engine->jsEngine()); - scope.result = QV4::QObjectWrapper::wrap(scope.engine, qt->d()->application); + return QV4::QObjectWrapper::wrap(scope.engine, qt->d()->application); } -void QtObject::method_get_inputMethod(const BuiltinFunction *, Scope &scope, CallData *) +ReturnedValue QtObject::method_get_inputMethod(const BuiltinFunction *b, CallData *) { QObject *o = QQml_guiProvider()->inputMethod(); - scope.result = QV4::QObjectWrapper::wrap(scope.engine, o); + return QV4::QObjectWrapper::wrap(b->engine(), o); } -void QtObject::method_get_styleHints(const BuiltinFunction *, Scope &scope, CallData *) +ReturnedValue QtObject::method_get_styleHints(const BuiltinFunction *b, CallData *) { QObject *o = QQml_guiProvider()->styleHints(); - scope.result = QV4::QObjectWrapper::wrap(scope.engine, o); + return QV4::QObjectWrapper::wrap(b->engine(), o); } @@ -1491,11 +1507,12 @@ static QString jsStack(QV4::ExecutionEngine *engine) { return stack; } -static void writeToConsole(const BuiltinFunction *, Scope &scope, CallData *callData, - ConsoleLogTypes logType, bool printStack = false) +static ReturnedValue writeToConsole(const BuiltinFunction *b, CallData *callData, + ConsoleLogTypes logType, bool printStack = false) { QLoggingCategory *loggingCategory = 0; QString result; + QV4::Scope scope(b); QV4::ExecutionEngine *v4 = scope.engine; int start = 0; @@ -1556,31 +1573,32 @@ static void writeToConsole(const BuiltinFunction *, Scope &scope, CallData *call break; } - scope.result = QV4::Encode::undefined(); + return Encode::undefined(); } DEFINE_OBJECT_VTABLE(ConsoleObject); -void ConsoleObject::method_error(const BuiltinFunction *b, Scope &scope, CallData *callData) +ReturnedValue ConsoleObject::method_error(const BuiltinFunction *b, CallData *callData) { - writeToConsole(b, scope, callData, Error); + return writeToConsole(b, callData, Error); } -void ConsoleObject::method_log(const BuiltinFunction *b, Scope &scope, CallData *callData) +ReturnedValue ConsoleObject::method_log(const BuiltinFunction *b, CallData *callData) { //console.log //console.debug //print - writeToConsole(b, scope, callData, Log); + return writeToConsole(b, callData, Log); } -void ConsoleObject::method_info(const BuiltinFunction *b, Scope &scope, CallData *callData) +ReturnedValue ConsoleObject::method_info(const BuiltinFunction *b, CallData *callData) { - writeToConsole(b, scope, callData, Info); + return writeToConsole(b, callData, Info); } -void ConsoleObject::method_profile(const BuiltinFunction *, Scope &scope, CallData *) +ReturnedValue ConsoleObject::method_profile(const BuiltinFunction *b, CallData *) { + QV4::Scope scope(b); QV4::ExecutionEngine *v4 = scope.engine; QV4::EngineBase::StackFrame *frame = v4->currentStackFrame; @@ -1595,11 +1613,12 @@ void ConsoleObject::method_profile(const BuiltinFunction *, Scope &scope, CallDa logger.debug("Profiling started."); } - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); } -void ConsoleObject::method_profileEnd(const BuiltinFunction *, Scope &scope, CallData *) +ReturnedValue ConsoleObject::method_profileEnd(const BuiltinFunction *b, CallData *) { + QV4::Scope scope(b); QV4::ExecutionEngine *v4 = scope.engine; QV4::EngineBase::StackFrame *frame = v4->currentStackFrame; @@ -1615,11 +1634,12 @@ void ConsoleObject::method_profileEnd(const BuiltinFunction *, Scope &scope, Cal logger.debug("Profiling ended."); } - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); } -void ConsoleObject::method_time(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue ConsoleObject::method_time(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 1) THROW_GENERIC_ERROR("console.time(): Invalid arguments"); @@ -1627,11 +1647,12 @@ void ConsoleObject::method_time(const BuiltinFunction *, Scope &scope, CallData QString name = callData->args[0].toQStringNoThrow(); v8engine->startTimer(name); - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); } -void ConsoleObject::method_timeEnd(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue ConsoleObject::method_timeEnd(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 1) THROW_GENERIC_ERROR("console.timeEnd(): Invalid arguments"); @@ -1643,16 +1664,17 @@ void ConsoleObject::method_timeEnd(const BuiltinFunction *, Scope &scope, CallDa if (wasRunning) { qDebug("%s: %llims", qPrintable(name), elapsed); } - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); } -void ConsoleObject::method_count(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue ConsoleObject::method_count(const BuiltinFunction *b, CallData *callData) { // first argument: name to print. Ignore any additional arguments QString name; if (callData->argc > 0) name = callData->args[0].toQStringNoThrow(); + Scope scope(b); QV4::ExecutionEngine *v4 = scope.engine; QV8Engine *v8engine = scope.engine->v8Engine; @@ -1667,11 +1689,12 @@ void ConsoleObject::method_count(const BuiltinFunction *, Scope &scope, CallData qPrintable(frame->function())) .debug("%s", qPrintable(message)); - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); } -void ConsoleObject::method_trace(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue ConsoleObject::method_trace(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 0) THROW_GENERIC_ERROR("console.trace(): Invalid arguments"); @@ -1684,16 +1707,17 @@ void ConsoleObject::method_trace(const BuiltinFunction *, Scope &scope, CallData frame->function().toUtf8().constData()) .debug("%s", qPrintable(stack)); - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); } -void ConsoleObject::method_warn(const BuiltinFunction *b, Scope &scope, CallData *callData) +ReturnedValue ConsoleObject::method_warn(const BuiltinFunction *b, CallData *callData) { - return writeToConsole(b, scope, callData, Warn); + return writeToConsole(b, callData, Warn); } -void ConsoleObject::method_assert(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue ConsoleObject::method_assert(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc == 0) THROW_GENERIC_ERROR("console.assert(): Missing argument"); @@ -1716,17 +1740,16 @@ void ConsoleObject::method_assert(const BuiltinFunction *, Scope &scope, CallDat .critical("%s\n%s",qPrintable(message), qPrintable(stack)); } - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); } -void ConsoleObject::method_exception(const BuiltinFunction *b, Scope &scope, CallData *callData) +ReturnedValue ConsoleObject::method_exception(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc == 0) THROW_GENERIC_ERROR("console.exception(): Missing argument"); - writeToConsole(b, scope, callData, Error, true); - - scope.result = QV4::Encode::undefined(); + return writeToConsole(b, callData, Error, true); } @@ -1782,8 +1805,9 @@ void QV4::GlobalExtensions::init(Object *globalObject, QJSEngine::Extensions ext \sa {Internationalization and Localization with Qt Quick} */ -void GlobalExtensions::method_qsTranslate(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue GlobalExtensions::method_qsTranslate(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc < 2) THROW_GENERIC_ERROR("qsTranslate() requires at least two arguments"); if (!callData->args[0].isString()) @@ -1813,7 +1837,7 @@ void GlobalExtensions::method_qsTranslate(const BuiltinFunction *, Scope &scope, comment.toUtf8().constData(), n); - scope.result = scope.engine->newString(result); + return Encode(scope.engine->newString(result)); } /*! @@ -1838,12 +1862,13 @@ void GlobalExtensions::method_qsTranslate(const BuiltinFunction *, Scope &scope, \sa {Internationalization and Localization with Qt Quick} */ -void GlobalExtensions::method_qsTranslateNoOp(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue GlobalExtensions::method_qsTranslateNoOp(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc < 2) - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); else - scope.result = callData->args[1]; + return callData->args[1].asReturnedValue(); } /*! @@ -1863,8 +1888,9 @@ void GlobalExtensions::method_qsTranslateNoOp(const BuiltinFunction *, Scope &sc \sa {Internationalization and Localization with Qt Quick} */ -void GlobalExtensions::method_qsTr(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue GlobalExtensions::method_qsTr(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc < 1) THROW_GENERIC_ERROR("qsTr() requires at least one argument"); if (!callData->args[0].isString()) @@ -1912,7 +1938,7 @@ void GlobalExtensions::method_qsTr(const BuiltinFunction *, Scope &scope, CallDa QString result = QCoreApplication::translate(context.toUtf8().constData(), text.toUtf8().constData(), comment.toUtf8().constData(), n); - scope.result = scope.engine->newString(result); + return Encode(scope.engine->newString(result)); } /*! @@ -1937,12 +1963,12 @@ void GlobalExtensions::method_qsTr(const BuiltinFunction *, Scope &scope, CallDa \sa {Internationalization and Localization with Qt Quick} */ -void GlobalExtensions::method_qsTrNoOp(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue GlobalExtensions::method_qsTrNoOp(const BuiltinFunction *, CallData *callData) { if (callData->argc < 1) - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); else - scope.result = callData->args[0]; + return callData->args[0].asReturnedValue(); } /*! @@ -1975,8 +2001,9 @@ void GlobalExtensions::method_qsTrNoOp(const BuiltinFunction *, Scope &scope, Ca \sa QT_TRID_NOOP(), {Internationalization and Localization with Qt Quick} */ -void GlobalExtensions::method_qsTrId(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue GlobalExtensions::method_qsTrId(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc < 1) THROW_GENERIC_ERROR("qsTrId() requires at least one argument"); if (!callData->args[0].isString()) @@ -1988,7 +2015,7 @@ void GlobalExtensions::method_qsTrId(const BuiltinFunction *, Scope &scope, Call if (callData->argc > 1) n = callData->args[1].toInt32(); - scope.result = scope.engine->newString(qtTrId(callData->args[0].toQStringNoThrow().toUtf8().constData(), n)); + return Encode(scope.engine->newString(qtTrId(callData->args[0].toQStringNoThrow().toUtf8().constData(), n))); } /*! @@ -2007,27 +2034,28 @@ void GlobalExtensions::method_qsTrId(const BuiltinFunction *, Scope &scope, Call \sa qsTrId(), {Internationalization and Localization with Qt Quick} */ -void GlobalExtensions::method_qsTrIdNoOp(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue GlobalExtensions::method_qsTrIdNoOp(const BuiltinFunction *, CallData *callData) { if (callData->argc < 1) - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); else - scope.result = callData->args[0]; + return callData->args[0].asReturnedValue(); } #endif // translation -void GlobalExtensions::method_gc(const BuiltinFunction *, Scope &scope, CallData *) +ReturnedValue GlobalExtensions::method_gc(const BuiltinFunction *b, CallData *) { - scope.engine->memoryManager->runGC(); + b->engine()->memoryManager->runGC(); - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); } -void GlobalExtensions::method_string_arg(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue GlobalExtensions::method_string_arg(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); if (callData->argc != 1) THROW_GENERIC_ERROR("String.arg(): Invalid arguments"); @@ -2064,10 +2092,10 @@ be passed on to the function invoked. Note that if redundant calls are eliminated, then only the last set of arguments will be passed to the function. */ -void QtObject::method_callLater(const BuiltinFunction *b, Scope &scope, CallData *callData) +ReturnedValue QtObject::method_callLater(const BuiltinFunction *b, CallData *callData) { - QV8Engine *v8engine = scope.engine->v8Engine; - v8engine->delayedCallQueue()->addUniquelyAndExecuteLater(b, scope, callData); + QV8Engine *v8engine = b->engine()->v8Engine; + return v8engine->delayedCallQueue()->addUniquelyAndExecuteLater(b, callData); } QT_END_NAMESPACE |