diff options
Diffstat (limited to 'src/qml/qml')
24 files changed, 824 insertions, 748 deletions
diff --git a/src/qml/qml/qqmlbinding.cpp b/src/qml/qml/qqmlbinding.cpp index 43ab74138c..56ab259229 100644 --- a/src/qml/qml/qqmlbinding.cpp +++ b/src/qml/qml/qqmlbinding.cpp @@ -203,12 +203,11 @@ protected: bool isUndefined = false; - QV4::ScopedCallData callData(scope); - QQmlJavaScriptExpression::evaluate(callData, &isUndefined, scope); + QV4::ScopedValue result(scope, QQmlJavaScriptExpression::evaluate(&isUndefined)); bool error = false; if (!watcher.wasDeleted() && isAddedToObject() && !hasError()) - error = !write(scope.result, isUndefined, flags); + error = !write(result, isUndefined, flags); if (!watcher.wasDeleted()) { @@ -457,12 +456,11 @@ QVariant QQmlBinding::evaluate() bool isUndefined = false; QV4::Scope scope(ep->v4engine()); - QV4::ScopedCallData callData(scope); - QQmlJavaScriptExpression::evaluate(callData, &isUndefined, scope); + QV4::ScopedValue result(scope, QQmlJavaScriptExpression::evaluate(&isUndefined)); ep->dereferenceScarceResources(); - return scope.engine->toVariant(scope.result, qMetaTypeId<QList<QObject*> >()); + return scope.engine->toVariant(result, qMetaTypeId<QList<QObject*> >()); } QString QQmlBinding::expressionIdentifier() const diff --git a/src/qml/qml/qqmlboundsignal.cpp b/src/qml/qml/qqmlboundsignal.cpp index 19ece44beb..1d7a37fc99 100644 --- a/src/qml/qml/qqmlboundsignal.cpp +++ b/src/qml/qml/qqmlboundsignal.cpp @@ -55,6 +55,7 @@ #include <private/qjsvalue_p.h> #include <private/qv4value_p.h> +#include <private/qv4jscall_p.h> #include <private/qv4qobjectwrapper_p.h> #include <QtCore/qdebug.h> @@ -192,35 +193,35 @@ void QQmlBoundSignalExpression::evaluate(void **a) int *argsTypes = QQmlMetaObject(m_target).methodParameterTypes(methodIndex, &storage, 0); int argCount = argsTypes ? *argsTypes : 0; - QV4::ScopedCallData callData(scope, argCount); + QV4::JSCallData jsCall(scope, argCount); for (int ii = 0; ii < argCount; ++ii) { int type = argsTypes[ii + 1]; //### ideally we would use metaTypeToJS, however it currently gives different results // for several cases (such as QVariant type and QObject-derived types) //args[ii] = engine->metaTypeToJS(type, a[ii + 1]); if (type == qMetaTypeId<QJSValue>()) { - if (QV4::Value *v4Value = QJSValuePrivate::valueForData(reinterpret_cast<QJSValue *>(a[ii + 1]), &callData->args[ii])) - callData->args[ii] = *v4Value; + if (QV4::Value *v4Value = QJSValuePrivate::valueForData(reinterpret_cast<QJSValue *>(a[ii + 1]), &jsCall->args[ii])) + jsCall->args[ii] = *v4Value; else - callData->args[ii] = QV4::Encode::undefined(); + jsCall->args[ii] = QV4::Encode::undefined(); } else if (type == QMetaType::QVariant) { - callData->args[ii] = scope.engine->fromVariant(*((QVariant *)a[ii + 1])); + jsCall->args[ii] = scope.engine->fromVariant(*((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<const int*>(a[ii + 1])); + jsCall->args[ii] = QV4::Primitive::fromInt32(*reinterpret_cast<const int*>(a[ii + 1])); } else if (type == qMetaTypeId<QQmlV4Handle>()) { - callData->args[ii] = *reinterpret_cast<QQmlV4Handle *>(a[ii + 1]); + jsCall->args[ii] = *reinterpret_cast<QQmlV4Handle *>(a[ii + 1]); } else if (ep->isQObject(type)) { if (!*reinterpret_cast<void* const *>(a[ii + 1])) - callData->args[ii] = QV4::Primitive::nullValue(); + jsCall->args[ii] = QV4::Primitive::nullValue(); else - callData->args[ii] = QV4::QObjectWrapper::wrap(ep->v4engine(), *reinterpret_cast<QObject* const *>(a[ii + 1])); + jsCall->args[ii] = QV4::QObjectWrapper::wrap(ep->v4engine(), *reinterpret_cast<QObject* const *>(a[ii + 1])); } else { - callData->args[ii] = scope.engine->fromVariant(QVariant(type, a[ii + 1])); + jsCall->args[ii] = scope.engine->fromVariant(QVariant(type, a[ii + 1])); } } - QQmlJavaScriptExpression::evaluate(callData, 0, scope); + QQmlJavaScriptExpression::evaluate(jsCall.callData(), 0); ep->dereferenceScarceResources(); // "release" scarce resources if top-level expression evaluation is complete. } @@ -237,12 +238,12 @@ void QQmlBoundSignalExpression::evaluate(const QList<QVariant> &args) ep->referenceScarceResources(); // "hold" scarce resources in memory during evaluation. - QV4::ScopedCallData callData(scope, args.count()); + QV4::JSCallData jsCall(scope, args.count()); for (int ii = 0; ii < args.count(); ++ii) { - callData->args[ii] = scope.engine->fromVariant(args[ii]); + jsCall->args[ii] = scope.engine->fromVariant(args[ii]); } - QQmlJavaScriptExpression::evaluate(callData, 0, scope); + QQmlJavaScriptExpression::evaluate(jsCall.callData(), 0); ep->dereferenceScarceResources(); // "release" scarce resources if top-level expression evaluation is complete. } diff --git a/src/qml/qml/qqmlcomponent.cpp b/src/qml/qml/qqmlcomponent.cpp index 8ec8669c60..15ee1ac86f 100644 --- a/src/qml/qml/qqmlcomponent.cpp +++ b/src/qml/qml/qqmlcomponent.cpp @@ -58,6 +58,7 @@ #include <private/qv4scopedvalue_p.h> #include <private/qv4objectiterator_p.h> #include <private/qv4qobjectwrapper_p.h> +#include <private/qv4jscall_p.h> #include <QDir> #include <QStack> @@ -1110,11 +1111,11 @@ struct QmlIncubatorObject : public QV4::Object V4_OBJECT2(QmlIncubatorObject, Object) V4_NEEDS_DESTROY - static void method_get_statusChanged(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_set_statusChanged(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_get_status(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_get_object(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_forceCompletion(const BuiltinFunction *, Scope &scope, CallData *callData); + static ReturnedValue method_get_statusChanged(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_set_statusChanged(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_get_status(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_get_object(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_forceCompletion(const BuiltinFunction *, CallData *callData); void statusChanged(QQmlIncubator::Status); void setInitialState(QObject *); @@ -1224,8 +1225,7 @@ void QQmlComponentPrivate::setInitialProperties(QV4::ExecutionEngine *engine, QV if (engine->hasException) return; - QV4::ExecutionContextSaver saver(scope); - engine->pushContext(qmlContext); + QV4::ScopedStackFrame frame(scope, qmlContext->d()); while (1) { name = it.nextPropertyNameAsString(val); @@ -1460,17 +1460,19 @@ QQmlComponentExtension::QQmlComponentExtension(QV4::ExecutionEngine *v4) incubationProto.set(v4, proto); } -void QV4::QmlIncubatorObject::method_get_object(const BuiltinFunction *, Scope &scope, CallData *callData) +QV4::ReturnedValue QV4::QmlIncubatorObject::method_get_object(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QV4::Scoped<QmlIncubatorObject> o(scope, callData->thisObject.as<QmlIncubatorObject>()); if (!o) THROW_TYPE_ERROR(); - scope.result = QV4::QObjectWrapper::wrap(scope.engine, o->d()->incubator->object()); + return QV4::QObjectWrapper::wrap(scope.engine, o->d()->incubator->object()); } -void QV4::QmlIncubatorObject::method_forceCompletion(const BuiltinFunction *, Scope &scope, CallData *callData) +QV4::ReturnedValue QV4::QmlIncubatorObject::method_forceCompletion(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QV4::Scoped<QmlIncubatorObject> o(scope, callData->thisObject.as<QmlIncubatorObject>()); if (!o) THROW_TYPE_ERROR(); @@ -1480,28 +1482,31 @@ void QV4::QmlIncubatorObject::method_forceCompletion(const BuiltinFunction *, Sc RETURN_UNDEFINED(); } -void QV4::QmlIncubatorObject::method_get_status(const BuiltinFunction *, Scope &scope, CallData *callData) +QV4::ReturnedValue QV4::QmlIncubatorObject::method_get_status(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QV4::Scoped<QmlIncubatorObject> o(scope, callData->thisObject.as<QmlIncubatorObject>()); if (!o) THROW_TYPE_ERROR(); - scope.result = QV4::Encode(o->d()->incubator->status()); + return QV4::Encode(o->d()->incubator->status()); } -void QV4::QmlIncubatorObject::method_get_statusChanged(const BuiltinFunction *, Scope &scope, CallData *callData) +QV4::ReturnedValue QV4::QmlIncubatorObject::method_get_statusChanged(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QV4::Scoped<QmlIncubatorObject> o(scope, callData->thisObject.as<QmlIncubatorObject>()); if (!o) THROW_TYPE_ERROR(); - scope.result = o->d()->statusChanged; + return QV4::Encode(o->d()->statusChanged); } -void QV4::QmlIncubatorObject::method_set_statusChanged(const BuiltinFunction *, Scope &scope, CallData *callData) +QV4::ReturnedValue QV4::QmlIncubatorObject::method_set_statusChanged(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QV4::Scoped<QmlIncubatorObject> o(scope, callData->thisObject.as<QmlIncubatorObject>()); - if (!o || callData->argc < 1) + if (!o || callData->argc() < 1) THROW_TYPE_ERROR(); o->d()->statusChanged.set(scope.engine, callData->args[0]); @@ -1556,10 +1561,10 @@ void QV4::QmlIncubatorObject::statusChanged(QQmlIncubator::Status s) QV4::ScopedFunctionObject f(scope, d()->statusChanged); if (f) { - QV4::ScopedCallData callData(scope, 1); - callData->thisObject = this; - callData->args[0] = QV4::Primitive::fromUInt32(s); - f->call(scope, callData); + QV4::JSCallData jsCallData(scope, 1); + *jsCallData->thisObject = this; + jsCallData->args[0] = QV4::Primitive::fromUInt32(s); + f->call(jsCallData); if (scope.hasException()) { QQmlError error = scope.engine->catchExceptionAsQmlError(); QQmlEnginePrivate::warning(QQmlEnginePrivate::get(scope.engine->qmlEngine()), error); diff --git a/src/qml/qml/qqmldelayedcallqueue.cpp b/src/qml/qml/qqmldelayedcallqueue.cpp index 13e62ec696..df4030e522 100644 --- a/src/qml/qml/qqmldelayedcallqueue.cpp +++ b/src/qml/qml/qqmldelayedcallqueue.cpp @@ -42,6 +42,7 @@ #include <private/qqmlengine_p.h> #include <private/qqmljavascriptexpression_p.h> #include <private/qv4value_p.h> +#include <private/qv4jscall_p.h> #include <private/qv4qobjectwrapper_p.h> #include <QQmlError> @@ -63,17 +64,17 @@ void QQmlDelayedCallQueue::DelayedFunctionCall::execute(QV4::ExecutionEngine *en QV4::Scope scope(engine); QV4::ArrayObject *array = m_args.as<QV4::ArrayObject>(); + const QV4::FunctionObject *callback = m_function.as<QV4::FunctionObject>(); + Q_ASSERT(callback); const int argCount = array ? array->getLength() : 0; - QV4::ScopedCallData callData(scope, argCount); - callData->thisObject = QV4::Encode::undefined(); + QV4::JSCallData jsCallData(scope, argCount); + *jsCallData->thisObject = QV4::Encode::undefined(); for (int i = 0; i < argCount; i++) { - callData->args[i] = array->getIndexed(i); + jsCallData->args[i] = array->getIndexed(i); } - const QV4::FunctionObject *callback = m_function.as<QV4::FunctionObject>(); - Q_ASSERT(callback); - callback->call(scope, callData); + callback->call(jsCallData); if (scope.engine->hasException) { QQmlError error = scope.engine->catchExceptionAsQmlError(); @@ -105,9 +106,10 @@ void QQmlDelayedCallQueue::init(QV4::ExecutionEngine* engine) m_tickedMethod = metaObject.method(methodIndex); } -void QQmlDelayedCallQueue::addUniquelyAndExecuteLater(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +QV4::ReturnedValue QQmlDelayedCallQueue::addUniquelyAndExecuteLater(const QV4::BuiltinFunction *b, QV4::CallData *callData) { - if (callData->argc == 0) + QV4::Scope scope(b); + if (callData->argc() == 0) THROW_GENERIC_ERROR("Qt.callLater: no arguments given"); const QV4::FunctionObject *func = callData->args[0].as<QV4::FunctionObject>(); @@ -158,8 +160,8 @@ void QQmlDelayedCallQueue::addUniquelyAndExecuteLater(const QV4::BuiltinFunction dfc.m_guarded = true; } else if (func->scope()->type == QV4::Heap::ExecutionContext::Type_QmlContext) { QV4::QmlContext::Data *g = static_cast<QV4::QmlContext::Data *>(func->scope()); - Q_ASSERT(g->qml->scopeObject); - dfc.m_objectGuard = QQmlGuard<QObject>(g->qml->scopeObject); + Q_ASSERT(g->qml()->scopeObject); + dfc.m_objectGuard = QQmlGuard<QObject>(g->qml()->scopeObject); dfc.m_guarded = true; } } @@ -169,22 +171,21 @@ void QQmlDelayedCallQueue::addUniquelyAndExecuteLater(const QV4::BuiltinFunction m_tickedMethod.invoke(this, Qt::QueuedConnection); m_callbackOutstanding = true; } - scope.result = QV4::Encode::undefined(); + return QV4::Encode::undefined(); } void QQmlDelayedCallQueue::storeAnyArguments(DelayedFunctionCall &dfc, const QV4::CallData *callData, int offset, QV4::ExecutionEngine *engine) { - const int length = callData->argc - offset; + const int length = callData->argc() - offset; if (length == 0) { dfc.m_args.clear(); return; } QV4::Scope scope(engine); QV4::ScopedArrayObject array(scope, engine->newArrayObject(length)); - int i = 0; - for (int j = offset; j < callData->argc; ++i, ++j) { + uint i = 0; + for (int j = offset, ej = callData->argc(); j < ej; ++i, ++j) array->putIndexed(i, callData->args[j]); - } dfc.m_args.set(engine, array); } diff --git a/src/qml/qml/qqmldelayedcallqueue_p.h b/src/qml/qml/qqmldelayedcallqueue_p.h index cffde4f0c0..5b3043cfed 100644 --- a/src/qml/qml/qqmldelayedcallqueue_p.h +++ b/src/qml/qml/qqmldelayedcallqueue_p.h @@ -70,7 +70,7 @@ public: void init(QV4::ExecutionEngine *); - void addUniquelyAndExecuteLater(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); + QV4::ReturnedValue addUniquelyAndExecuteLater(const QV4::BuiltinFunction *, QV4::CallData *callData); public Q_SLOTS: void ticked(); diff --git a/src/qml/qml/qqmlexpression.cpp b/src/qml/qml/qqmlexpression.cpp index 1e1fbcf448..35dbaccbbe 100644 --- a/src/qml/qml/qqmlexpression.cpp +++ b/src/qml/qml/qqmlexpression.cpp @@ -247,15 +247,14 @@ void QQmlExpression::setExpression(const QString &expression) } // Must be called with a valid handle scope -void QQmlExpressionPrivate::v4value(bool *isUndefined, QV4::Scope &scope) +QV4::ReturnedValue QQmlExpressionPrivate::v4value(bool *isUndefined) { if (!expressionFunctionValid) { createQmlBinding(context(), scopeObject(), expression, url, line); expressionFunctionValid = true; } - QV4::ScopedCallData callData(scope); - evaluate(callData, isUndefined, scope); + return evaluate(isUndefined); } QVariant QQmlExpressionPrivate::value(bool *isUndefined) @@ -274,9 +273,9 @@ QVariant QQmlExpressionPrivate::value(bool *isUndefined) { QV4::Scope scope(QV8Engine::getV4(ep->v8engine())); - v4value(isUndefined, scope); + QV4::ScopedValue result(scope, v4value(isUndefined)); if (!hasError()) - rv = scope.engine->toVariant(scope.result, -1); + rv = scope.engine->toVariant(result, -1); } ep->dereferenceScarceResources(); // "release" scarce resources if top-level expression evaluation is complete. diff --git a/src/qml/qml/qqmlexpression_p.h b/src/qml/qml/qqmlexpression_p.h index 44342a957b..a94ca0fc2d 100644 --- a/src/qml/qml/qqmlexpression_p.h +++ b/src/qml/qml/qqmlexpression_p.h @@ -75,7 +75,7 @@ public: QVariant value(bool *isUndefined = 0); - void v4value(bool *isUndefined, QV4::Scope &scope); + QV4::ReturnedValue v4value(bool *isUndefined = 0); static inline QQmlExpressionPrivate *get(QQmlExpression *expr); static inline QQmlExpression *get(QQmlExpressionPrivate *expr); diff --git a/src/qml/qml/qqmljavascriptexpression.cpp b/src/qml/qml/qqmljavascriptexpression.cpp index 31c277d283..0208db2d48 100644 --- a/src/qml/qml/qqmljavascriptexpression.cpp +++ b/src/qml/qml/qqmljavascriptexpression.cpp @@ -46,6 +46,7 @@ #include <private/qv4script_p.h> #include <private/qv4errorobject_p.h> #include <private/qv4scopedvalue_p.h> +#include <private/qv4jscall_p.h> #include <private/qqmlglobal_p.h> #include <private/qv4qobjectwrapper_p.h> #include <private/qqmlbuiltinfunctions_p.h> @@ -180,9 +181,16 @@ void QQmlJavaScriptExpression::refresh() { } +QV4::ReturnedValue QQmlJavaScriptExpression::evaluate(bool *isUndefined) +{ + QV4::ExecutionEngine *v4 = QV8Engine::getV4(m_context->engine); + QV4::Scope scope(v4); + QV4::JSCallData jsCall(scope); + return evaluate(jsCall.callData(), isUndefined); +} -void QQmlJavaScriptExpression::evaluate(QV4::CallData *callData, bool *isUndefined, QV4::Scope &scope) +QV4::ReturnedValue QQmlJavaScriptExpression::evaluate(QV4::CallData *callData, bool *isUndefined) { Q_ASSERT(m_context && m_context->engine); @@ -190,7 +198,7 @@ void QQmlJavaScriptExpression::evaluate(QV4::CallData *callData, bool *isUndefin if (!v4Function) { if (isUndefined) *isUndefined = true; - return; + return QV4::Encode::undefined(); } QQmlEnginePrivate *ep = QQmlEnginePrivate::get(m_context->engine); @@ -210,19 +218,26 @@ void QQmlJavaScriptExpression::evaluate(QV4::CallData *callData, bool *isUndefin capture.guards.copyAndClearPrepend(activeGuards); QV4::ExecutionEngine *v4 = QV8Engine::getV4(ep->v8engine()); - scope.result = QV4::Primitive::undefinedValue(); callData->thisObject = v4->globalObject; if (scopeObject()) { - QV4::ScopedValue value(scope, QV4::QObjectWrapper::wrap(v4, scopeObject())); - if (value->isObject()) - callData->thisObject = value; + QV4::ReturnedValue scope = QV4::QObjectWrapper::wrap(v4, scopeObject()); + if (QV4::Value::fromReturnedValue(scope).isObject()) + callData->thisObject = scope; } - QV4::ExecutionContext *outer = static_cast<QV4::ExecutionContext *>(m_qmlScope.valueRef()); - if (v4Function->canUseSimpleFunction()) { - outer->simpleCall(scope, callData, v4Function); - } else { - outer->call(scope, callData, v4Function); + Q_ASSERT(m_qmlScope.valueRef()); + callData->context = *m_qmlScope.valueRef(); + QV4::ReturnedValue res = v4Function->call(callData); + QV4::Scope scope(v4); + QV4::ScopedValue result(scope, res); + if (v4Function->hasQmlDependencies) { + QV4::Heap::ExecutionContext *c = static_cast<QV4::Heap::ExecutionContext *>(callData->context.m()); + // CreateCallContext might have been executed, and that will push a CallContext on top of + // the current one. So, search back to the original QMLContext. + while (c->type != QV4::Heap::ExecutionContext::Type_QmlContext) + c = c->outer; + QV4::Heap::QmlContext *qc = static_cast<QV4::Heap::QmlContext *>(c); + QQmlPropertyCapture::registerQmlDependencies(qc, v4, v4Function->compiledFunction); } if (scope.hasException()) { @@ -234,7 +249,7 @@ void QQmlJavaScriptExpression::evaluate(QV4::CallData *callData, bool *isUndefin *isUndefined = true; } else { if (isUndefined) - *isUndefined = scope.result.isUndefined(); + *isUndefined = result->isUndefined(); if (!watcher.wasDeleted() && hasDelayedError()) delayedError()->clearError(); @@ -251,6 +266,8 @@ void QQmlJavaScriptExpression::evaluate(QV4::CallData *callData, bool *isUndefin g->Delete(); ep->propertyCapture = lastPropertyCapture; + + return result->asReturnedValue(); } void QQmlPropertyCapture::captureProperty(QQmlNotifier *n, Duration duration) @@ -329,12 +346,11 @@ void QQmlPropertyCapture::captureProperty(QObject *o, int c, int n, Duration dur } } -void QQmlPropertyCapture::registerQmlDependencies(const QV4::CompiledData::Function *compiledFunction, const QV4::Scope &scope) +void QQmlPropertyCapture::registerQmlDependencies(QV4::Heap::QmlContext *context, const QV4::ExecutionEngine *engine, const QV4::CompiledData::Function *compiledFunction) { // Let the caller check and avoid the function call :) Q_ASSERT(compiledFunction->hasQmlDependencies()); - QV4::ExecutionEngine *engine = scope.engine; QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine->qmlEngine()); if (!ep) return; @@ -347,8 +363,8 @@ void QQmlPropertyCapture::registerQmlDependencies(const QV4::CompiledData::Funct capture->expression->m_permanentDependenciesRegistered = true; - QV4::Scoped<QV4::QmlContext> context(scope, engine->qmlContext()); - QQmlContextData *qmlContext = context->qmlContext(); + QV4::Heap::QQmlContextWrapper *wrapper = context->qml(); + QQmlContextData *qmlContext = wrapper->context->contextData(); const quint32_le *idObjectDependency = compiledFunction->qmlIdObjectDependencyTable(); const int idObjectDependencyCount = compiledFunction->nDependingIdObjects; @@ -368,7 +384,7 @@ void QQmlPropertyCapture::registerQmlDependencies(const QV4::CompiledData::Funct QQmlPropertyCapture::Permanently); } - QObject *scopeObject = context->qmlScope(); + QObject *scopeObject = wrapper->scopeObject; const quint32_le *scopePropertyDependency = compiledFunction->qmlScopePropertiesDependencyTable(); const int scopePropertyDependencyCount = compiledFunction->nDependingScopeProperties; for (int i = 0; i < scopePropertyDependencyCount; ++i) { diff --git a/src/qml/qml/qqmljavascriptexpression_p.h b/src/qml/qml/qqmljavascriptexpression_p.h index e9a9f4feee..1cb6d7bfd1 100644 --- a/src/qml/qml/qqmljavascriptexpression_p.h +++ b/src/qml/qml/qqmljavascriptexpression_p.h @@ -103,7 +103,8 @@ public: virtual QString expressionIdentifier() const = 0; virtual void expressionChanged() = 0; - void evaluate(QV4::CallData *callData, bool *isUndefined, QV4::Scope &scope); + QV4::ReturnedValue evaluate(bool *isUndefined); + QV4::ReturnedValue evaluate(QV4::CallData *callData, bool *isUndefined); inline bool notifyOnValueChanged() const; @@ -204,7 +205,7 @@ public: Permanently }; - static void registerQmlDependencies(const QV4::CompiledData::Function *compiledFunction, const QV4::Scope &scope); + static void registerQmlDependencies(QV4::Heap::QmlContext *context, const QV4::ExecutionEngine *engine, const QV4::CompiledData::Function *compiledFunction); void captureProperty(QQmlNotifier *, Duration duration = OnlyOnce); void captureProperty(QObject *, int, int, Duration duration = OnlyOnce, bool doNotify = true); diff --git a/src/qml/qml/qqmllistwrapper.cpp b/src/qml/qml/qqmllistwrapper.cpp index 43677e0d78..b4be83a156 100644 --- a/src/qml/qml/qqmllistwrapper.cpp +++ b/src/qml/qml/qqmllistwrapper.cpp @@ -171,8 +171,9 @@ void PropertyListPrototype::init(ExecutionEngine *) defineDefaultProperty(QStringLiteral("push"), method_push, 1); } -void PropertyListPrototype::method_push(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue PropertyListPrototype::method_push(const BuiltinFunction *b, CallData *callData) { + Scope scope(b); ScopedObject instance(scope, callData->thisObject.toObject(scope.engine)); if (!instance) RETURN_UNDEFINED(); @@ -183,12 +184,13 @@ void PropertyListPrototype::method_push(const BuiltinFunction *, Scope &scope, C THROW_GENERIC_ERROR("List doesn't define an Append function"); QV4::ScopedObject so(scope); - for (int i = 0; i < callData->argc; ++i) + for (int i = 0, ei = callData->argc(); i < ei; ++i) { so = callData->args[i].toObject(scope.engine); if (QV4::QObjectWrapper *wrapper = so->as<QV4::QObjectWrapper>()) w->d()->property().append(&w->d()->property(), wrapper->object() ); } + return Encode::undefined(); } QT_END_NAMESPACE diff --git a/src/qml/qml/qqmllistwrapper_p.h b/src/qml/qml/qqmllistwrapper_p.h index 84dadba01a..0b53395d2b 100644 --- a/src/qml/qml/qqmllistwrapper_p.h +++ b/src/qml/qml/qqmllistwrapper_p.h @@ -103,7 +103,7 @@ struct PropertyListPrototype : Object { void init(ExecutionEngine *engine); - static void method_push(const BuiltinFunction *, Scope &, CallData *callData); + static ReturnedValue method_push(const BuiltinFunction *, CallData *callData); }; } diff --git a/src/qml/qml/qqmllocale.cpp b/src/qml/qml/qqmllocale.cpp index 326b36c5cd..f6aae67548 100644 --- a/src/qml/qml/qqmllocale.cpp +++ b/src/qml/qml/qqmllocale.cpp @@ -58,8 +58,7 @@ DEFINE_OBJECT_VTABLE(QQmlLocaleData); #define THROW_ERROR(string) \ do { \ - scope.result = scope.engine->throwError(QString::fromUtf8(string)); \ - return; \ + return scope.engine->throwError(QString::fromUtf8(string)); \ } while (false) @@ -87,37 +86,32 @@ void QQmlDateExtension::registerExtension(QV4::ExecutionEngine *engine) engine->dateCtor()->defineDefaultProperty(QStringLiteral("timeZoneUpdated"), method_timeZoneUpdated); } -void QQmlDateExtension::method_toLocaleString(const BuiltinFunction *b, Scope &scope, CallData *callData) +ReturnedValue QQmlDateExtension::method_toLocaleString(const BuiltinFunction *b, CallData *callData) { - if (callData->argc > 2) { - QV4::DatePrototype::method_toLocaleString(b, scope, callData); - return; - } + Scope scope(b); + if (callData->argc() > 2) + return QV4::DatePrototype::method_toLocaleString(b, callData); QV4::DateObject *date = callData->thisObject.as<DateObject>(); - if (!date) { - QV4::DatePrototype::method_toLocaleString(b, scope, callData); - return; - } + if (!date) + return QV4::DatePrototype::method_toLocaleString(b, callData); QDateTime dt = date->toQDateTime(); - if (callData->argc == 0) { + if (callData->argc() == 0) { // Use QLocale for standard toLocaleString() function QLocale locale; RETURN_RESULT(scope.engine->newString(locale.toString(dt))); } - if (!isLocaleObject(callData->args[0])) { - QV4::DatePrototype::method_toLocaleString(b, scope, callData); // Use the default Date toLocaleString() - return; - } + if (!isLocaleObject(callData->args[0])) + return QV4::DatePrototype::method_toLocaleString(b, callData); // Use the default Date toLocaleString() GET_LOCALE_DATA_RESOURCE(callData->args[0]); QLocale::FormatType enumFormat = QLocale::LongFormat; QString formattedDt; - if (callData->argc == 2) { + if (callData->argc() == 2) { if (String *s = callData->args[1].stringValue()) { QString format = s->toQString(); formattedDt = r->d()->locale->toString(dt, format); @@ -132,39 +126,36 @@ void QQmlDateExtension::method_toLocaleString(const BuiltinFunction *b, Scope &s formattedDt = r->d()->locale->toString(dt, enumFormat); } - scope.result = scope.engine->newString(formattedDt); + RETURN_RESULT(scope.engine->newString(formattedDt)); } -void QQmlDateExtension::method_toLocaleTimeString(const BuiltinFunction *b, Scope &scope, CallData *callData) +ReturnedValue QQmlDateExtension::method_toLocaleTimeString(const BuiltinFunction *b, CallData *callData) { - if (callData->argc > 2) { - QV4::DatePrototype::method_toLocaleTimeString(b, scope, callData); - return; - } + Scope scope(b); + if (callData->argc() > 2) + return QV4::DatePrototype::method_toLocaleTimeString(b, callData); QV4::DateObject *date = callData->thisObject.as<DateObject>(); - if (!date) { - QV4::DatePrototype::method_toLocaleTimeString(b, scope, callData); - return; - } + if (!date) + return QV4::DatePrototype::method_toLocaleTimeString(b, callData); QDateTime dt = date->toQDateTime(); QTime time = dt.time(); - if (callData->argc == 0) { + if (callData->argc() == 0) { // Use QLocale for standard toLocaleString() function QLocale locale; RETURN_RESULT(scope.engine->newString(locale.toString(time))); } if (!isLocaleObject(callData->args[0])) - return QV4::DatePrototype::method_toLocaleTimeString(b, scope, callData); // Use the default Date toLocaleTimeString() + return QV4::DatePrototype::method_toLocaleTimeString(b, callData); // Use the default Date toLocaleTimeString() GET_LOCALE_DATA_RESOURCE(callData->args[0]); QLocale::FormatType enumFormat = QLocale::LongFormat; QString formattedTime; - if (callData->argc == 2) { + if (callData->argc() == 2) { if (String *s = callData->args[1].stringValue()) { QString format = s->toQString(); formattedTime = r->d()->locale->toString(time, format); @@ -179,39 +170,36 @@ void QQmlDateExtension::method_toLocaleTimeString(const BuiltinFunction *b, Scop formattedTime = r->d()->locale->toString(time, enumFormat); } - scope.result = scope.engine->newString(formattedTime); + RETURN_RESULT(scope.engine->newString(formattedTime)); } -void QQmlDateExtension::method_toLocaleDateString(const BuiltinFunction *b, Scope &scope, CallData *callData) +ReturnedValue QQmlDateExtension::method_toLocaleDateString(const BuiltinFunction *b, CallData *callData) { - if (callData->argc > 2) { - QV4::DatePrototype::method_toLocaleDateString(b, scope, callData); - return; - } + Scope scope(b); + if (callData->argc() > 2) + return QV4::DatePrototype::method_toLocaleDateString(b, callData); QV4::DateObject *dateObj = callData->thisObject.as<DateObject>(); - if (!dateObj) { - QV4::DatePrototype::method_toLocaleDateString(b, scope, callData); - return; - } + if (!dateObj) + return QV4::DatePrototype::method_toLocaleDateString(b, callData); QDateTime dt = dateObj->toQDateTime(); QDate date = dt.date(); - if (callData->argc == 0) { + if (callData->argc() == 0) { // Use QLocale for standard toLocaleString() function QLocale locale; RETURN_RESULT(scope.engine->newString(locale.toString(date))); } if (!isLocaleObject(callData->args[0])) - return QV4::DatePrototype::method_toLocaleDateString(b, scope, callData); // Use the default Date toLocaleDateString() + return QV4::DatePrototype::method_toLocaleDateString(b, callData); // Use the default Date toLocaleDateString() GET_LOCALE_DATA_RESOURCE(callData->args[0]); QLocale::FormatType enumFormat = QLocale::LongFormat; QString formattedDate; - if (callData->argc == 2) { + if (callData->argc() == 2) { if (String *s = callData->args[1].stringValue()) { QString format = s->toQString(); formattedDate = r->d()->locale->toString(date, format); @@ -226,13 +214,14 @@ void QQmlDateExtension::method_toLocaleDateString(const BuiltinFunction *b, Scop formattedDate = r->d()->locale->toString(date, enumFormat); } - scope.result = scope.engine->newString(formattedDate); + RETURN_RESULT(scope.engine->newString(formattedDate)); } -void QQmlDateExtension::method_fromLocaleString(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlDateExtension::method_fromLocaleString(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QV4::ExecutionEngine * const engine = scope.engine; - if (callData->argc == 1) { + if (callData->argc() == 1) { if (String *s = callData->args[0].stringValue()) { QLocale locale; QString dateString = s->toQString(); @@ -241,7 +230,7 @@ void QQmlDateExtension::method_fromLocaleString(const BuiltinFunction *, Scope & } } - if (callData->argc < 1 || callData->argc > 3 || !isLocaleObject(callData->args[0])) + if (callData->argc() < 1 || callData->argc() > 3 || !isLocaleObject(callData->args[0])) THROW_ERROR("Locale: Date.fromLocaleString(): Invalid arguments"); GET_LOCALE_DATA_RESOURCE(callData->args[0]); @@ -249,7 +238,7 @@ void QQmlDateExtension::method_fromLocaleString(const BuiltinFunction *, Scope & QLocale::FormatType enumFormat = QLocale::LongFormat; QDateTime dt; QString dateString = callData->args[1].toQStringNoThrow(); - if (callData->argc == 3) { + if (callData->argc() == 3) { if (String *s = callData->args[2].stringValue()) { QString format = s->toQString(); dt = r->d()->locale->toDateTime(dateString, format); @@ -264,14 +253,15 @@ void QQmlDateExtension::method_fromLocaleString(const BuiltinFunction *, Scope & dt = r->d()->locale->toDateTime(dateString, enumFormat); } - scope.result = engine->newDateObject(dt); + RETURN_RESULT(engine->newDateObject(dt)); } -void QQmlDateExtension::method_fromLocaleTimeString(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlDateExtension::method_fromLocaleTimeString(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QV4::ExecutionEngine * const engine = scope.engine; - if (callData->argc == 1) { + if (callData->argc() == 1) { if (String *s = callData->args[0].stringValue()) { QLocale locale; QString timeString = s->toQString(); @@ -282,7 +272,7 @@ void QQmlDateExtension::method_fromLocaleTimeString(const BuiltinFunction *, Sco } } - if (callData->argc < 1 || callData->argc > 3 || !isLocaleObject(callData->args[0])) + if (callData->argc() < 1 || callData->argc() > 3 || !isLocaleObject(callData->args[0])) THROW_ERROR("Locale: Date.fromLocaleTimeString(): Invalid arguments"); GET_LOCALE_DATA_RESOURCE(callData->args[0]); @@ -290,7 +280,7 @@ void QQmlDateExtension::method_fromLocaleTimeString(const BuiltinFunction *, Sco QLocale::FormatType enumFormat = QLocale::LongFormat; QTime tm; QString dateString = callData->args[1].toQStringNoThrow(); - if (callData->argc == 3) { + if (callData->argc() == 3) { if (String *s = callData->args[2].stringValue()) { QString format = s->toQString(); tm = r->d()->locale->toTime(dateString, format); @@ -314,11 +304,12 @@ void QQmlDateExtension::method_fromLocaleTimeString(const BuiltinFunction *, Sco RETURN_RESULT(engine->newDateObject(dt)); } -void QQmlDateExtension::method_fromLocaleDateString(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlDateExtension::method_fromLocaleDateString(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QV4::ExecutionEngine * const engine = scope.engine; - if (callData->argc == 1) { + if (callData->argc() == 1) { if (String *s = callData->args[0].stringValue()) { QLocale locale; QString dateString = s->toQString(); @@ -327,7 +318,7 @@ void QQmlDateExtension::method_fromLocaleDateString(const BuiltinFunction *, Sco } } - if (callData->argc < 1 || callData->argc > 3 || !isLocaleObject(callData->args[0])) + if (callData->argc() < 1 || callData->argc() > 3 || !isLocaleObject(callData->args[0])) THROW_ERROR("Locale: Date.fromLocaleDateString(): Invalid arguments"); GET_LOCALE_DATA_RESOURCE(callData->args[0]); @@ -335,7 +326,7 @@ void QQmlDateExtension::method_fromLocaleDateString(const BuiltinFunction *, Sco QLocale::FormatType enumFormat = QLocale::LongFormat; QDate dt; QString dateString = callData->args[1].toQStringNoThrow(); - if (callData->argc == 3) { + if (callData->argc() == 3) { if (String *s = callData->args[2].stringValue()) { QString format = s->toQString(); dt = r->d()->locale->toDate(dateString, format); @@ -353,9 +344,10 @@ void QQmlDateExtension::method_fromLocaleDateString(const BuiltinFunction *, Sco RETURN_RESULT(engine->newDateObject(QDateTime(dt))); } -void QQmlDateExtension::method_timeZoneUpdated(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlDateExtension::method_timeZoneUpdated(const BuiltinFunction *b, CallData *callData) { - if (callData->argc != 0) + QV4::Scope scope(b); + if (callData->argc() != 0) THROW_ERROR("Locale: Date.timeZoneUpdated(): Invalid arguments"); QV4::DatePrototype::timezoneUpdated(); @@ -373,28 +365,27 @@ void QQmlNumberExtension::registerExtension(QV4::ExecutionEngine *engine) engine->numberCtor()->defineDefaultProperty(QStringLiteral("fromLocaleString"), method_fromLocaleString); } -void QQmlNumberExtension::method_toLocaleString(const BuiltinFunction *b, Scope &scope, CallData *callData) +QV4::ReturnedValue QQmlNumberExtension::method_toLocaleString(const BuiltinFunction *b, CallData *callData) { - if (callData->argc > 3) + QV4::Scope scope(b); + if (callData->argc() > 3) THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); double number = callData->thisObject.toNumber(); - if (callData->argc == 0) { + if (callData->argc() == 0) { // Use QLocale for standard toLocaleString() function QLocale locale; RETURN_RESULT(scope.engine->newString(locale.toString(number))); } - if (!isLocaleObject(callData->args[0])) { - QV4::NumberPrototype::method_toLocaleString(b, scope, callData); // Use the default Number toLocaleString() - return; - } + if (!isLocaleObject(callData->args[0])) + return QV4::NumberPrototype::method_toLocaleString(b, callData); // Use the default Number toLocaleString() GET_LOCALE_DATA_RESOURCE(callData->args[0]); quint16 format = 'f'; - if (callData->argc > 1) { + if (callData->argc() > 1) { if (!callData->args[1].isString()) THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); QString fs = callData->args[1].toQString(); @@ -402,23 +393,24 @@ void QQmlNumberExtension::method_toLocaleString(const BuiltinFunction *b, Scope format = fs.at(0).unicode(); } int prec = 2; - if (callData->argc > 2) { + if (callData->argc() > 2) { if (!callData->args[2].isNumber()) THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); prec = callData->args[2].toInt32(); } - scope.result = scope.engine->newString(r->d()->locale->toString(number, (char)format, prec)); + RETURN_RESULT(scope.engine->newString(r->d()->locale->toString(number, (char)format, prec))); } -void QQmlNumberExtension::method_toLocaleCurrencyString(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlNumberExtension::method_toLocaleCurrencyString(const BuiltinFunction *b, CallData *callData) { - if (callData->argc > 2) + QV4::Scope scope(b); + if (callData->argc() > 2) THROW_ERROR("Locale: Number.toLocaleCurrencyString(): Invalid arguments"); double number = callData->thisObject.toNumber(); - if (callData->argc == 0) { + if (callData->argc() == 0) { // Use QLocale for standard toLocaleString() function QLocale locale; RETURN_RESULT(scope.engine->newString(locale.toString(number))); @@ -430,7 +422,7 @@ void QQmlNumberExtension::method_toLocaleCurrencyString(const BuiltinFunction *, GET_LOCALE_DATA_RESOURCE(callData->args[0]); QString symbol; - if (callData->argc > 1) { + if (callData->argc() > 1) { if (!callData->args[1].isString()) THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); symbol = callData->args[1].toQStringNoThrow(); @@ -439,15 +431,16 @@ void QQmlNumberExtension::method_toLocaleCurrencyString(const BuiltinFunction *, RETURN_RESULT(scope.engine->newString(r->d()->locale->toCurrencyString(number, symbol))); } -void QQmlNumberExtension::method_fromLocaleString(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlNumberExtension::method_fromLocaleString(const BuiltinFunction *b, CallData *callData) { - if (callData->argc < 1 || callData->argc > 2) + QV4::Scope scope(b); + if (callData->argc() < 1 || callData->argc() > 2) THROW_ERROR("Locale: Number.fromLocaleString(): Invalid arguments"); int numberIdx = 0; QLocale locale; - if (callData->argc == 2) { + if (callData->argc() == 2) { if (!isLocaleObject(callData->args[0])) THROW_ERROR("Locale: Number.fromLocaleString(): Invalid arguments"); @@ -467,45 +460,49 @@ void QQmlNumberExtension::method_fromLocaleString(const BuiltinFunction *, Scope if (!ok) THROW_ERROR("Locale: Number.fromLocaleString(): Invalid format"); - scope.result = QV4::Encode(val); + RETURN_RESULT(QV4::Encode(val)); } //-------------- // Locale object -void QQmlLocaleData::method_get_firstDayOfWeek(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlLocaleData::method_get_firstDayOfWeek(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QLocale *locale = getThisLocale(scope, callData); if (!locale) - return; + return Encode::undefined(); int fdow = int(locale->firstDayOfWeek()); if (fdow == 7) fdow = 0; // Qt::Sunday = 7, but Sunday is 0 in JS Date - scope.result = QV4::Encode(fdow); + RETURN_RESULT(fdow); } -void QQmlLocaleData::method_get_measurementSystem(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlLocaleData::method_get_measurementSystem(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QLocale *locale = getThisLocale(scope, callData); if (!locale) - return; - scope.result = QV4::Encode(locale->measurementSystem()); + return Encode::undefined(); + return QV4::Encode(locale->measurementSystem()); } -void QQmlLocaleData::method_get_textDirection(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlLocaleData::method_get_textDirection(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QLocale *locale = getThisLocale(scope, callData); if (!locale) - return; + return Encode::undefined(); - scope.result = QV4::Encode(locale->textDirection()); + return QV4::Encode(locale->textDirection()); } -void QQmlLocaleData::method_get_weekDays(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlLocaleData::method_get_weekDays(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QLocale *locale = getThisLocale(scope, callData); if (!locale) - return; + return Encode::undefined(); QList<Qt::DayOfWeek> days = locale->weekdays(); @@ -519,14 +516,15 @@ void QQmlLocaleData::method_get_weekDays(const BuiltinFunction *, Scope &scope, } result->setArrayLengthUnchecked(days.size()); - scope.result = result.asReturnedValue(); + return result.asReturnedValue(); } -void QQmlLocaleData::method_get_uiLanguages(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlLocaleData::method_get_uiLanguages(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QLocale *locale = getThisLocale(scope, callData); if (!locale) - return; + return Encode::undefined(); QStringList langs = locale->uiLanguages(); QV4::ScopedArrayObject result(scope, scope.engine->newArrayObject()); @@ -537,40 +535,42 @@ void QQmlLocaleData::method_get_uiLanguages(const BuiltinFunction *, Scope &scop result->setArrayLengthUnchecked(langs.size()); - scope.result = result.asReturnedValue(); + return result.asReturnedValue(); } -void QQmlLocaleData::method_currencySymbol(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlLocaleData::method_currencySymbol(const BuiltinFunction *b, CallData *callData) { + QV4::Scope scope(b); QLocale *locale = getThisLocale(scope, callData); if (!locale) - return; + return Encode::undefined(); - if (callData->argc > 1) + if (callData->argc() > 1) THROW_ERROR("Locale: currencySymbol(): Invalid arguments"); QLocale::CurrencySymbolFormat format = QLocale::CurrencySymbol; - if (callData->argc == 1) { + if (callData->argc() == 1) { quint32 intFormat = callData->args[0].toNumber(); format = QLocale::CurrencySymbolFormat(intFormat); } - scope.result = scope.engine->newString(locale->currencySymbol(format)); + RETURN_RESULT(scope.engine->newString(locale->currencySymbol(format))); } #define LOCALE_FORMAT(FUNC) \ -void QQmlLocaleData::method_ ##FUNC (const BuiltinFunction *, Scope &scope, CallData *callData) { \ +ReturnedValue QQmlLocaleData::method_ ##FUNC (const BuiltinFunction *b, CallData *callData) { \ + QV4::Scope scope(b); \ QLocale *locale = getThisLocale(scope, callData); \ if (!locale) \ - return; \ - if (callData->argc > 1) \ + return Encode::undefined(); \ + if (callData->argc() > 1) \ THROW_ERROR("Locale: " #FUNC "(): Invalid arguments"); \ QLocale::FormatType format = QLocale::LongFormat;\ - if (callData->argc == 1) { \ + if (callData->argc() == 1) { \ quint32 intFormat = callData->args[0].toUInt32(); \ format = QLocale::FormatType(intFormat); \ } \ - scope.result = scope.engine->newString(locale-> FUNC (format)); \ + RETURN_RESULT(scope.engine->newString(locale-> FUNC (format))); \ } LOCALE_FORMAT(dateTimeFormat) @@ -579,18 +579,19 @@ LOCALE_FORMAT(dateFormat) // +1 added to idx because JS is 0-based, whereas QLocale months begin at 1. #define LOCALE_FORMATTED_MONTHNAME(VARIABLE) \ -void QQmlLocaleData::method_ ## VARIABLE (const BuiltinFunction *, Scope &scope, CallData *callData) {\ +ReturnedValue QQmlLocaleData::method_ ## VARIABLE (const BuiltinFunction *b, CallData *callData) {\ + Scope scope(b); \ QLocale *locale = getThisLocale(scope, callData); \ if (!locale) \ - return; \ - if (callData->argc < 1 || callData->argc > 2) \ + return Encode::undefined(); \ + if (callData->argc() < 1 || callData->argc() > 2) \ THROW_ERROR("Locale: " #VARIABLE "(): Invalid arguments"); \ QLocale::FormatType enumFormat = QLocale::LongFormat; \ int idx = callData->args[0].toInt32() + 1; \ if (idx < 1 || idx > 12) \ THROW_ERROR("Locale: Invalid month"); \ QString name; \ - if (callData->argc == 2) { \ + if (callData->argc() == 2) { \ if (callData->args[1].isNumber()) { \ quint32 intFormat = callData->args[1].toUInt32(); \ QLocale::FormatType format = QLocale::FormatType(intFormat); \ @@ -601,16 +602,17 @@ void QQmlLocaleData::method_ ## VARIABLE (const BuiltinFunction *, Scope &scope, } else { \ name = locale-> VARIABLE(idx, enumFormat); \ } \ - scope.result = scope.engine->newString(name); \ + RETURN_RESULT(scope.engine->newString(name)); \ } // 0 -> 7 as Qt::Sunday is 7, but Sunday is 0 in JS Date #define LOCALE_FORMATTED_DAYNAME(VARIABLE) \ -void QQmlLocaleData::method_ ## VARIABLE (const BuiltinFunction *, Scope &scope, CallData *callData) {\ +ReturnedValue QQmlLocaleData::method_ ## VARIABLE (const BuiltinFunction *b, CallData *callData) {\ + Scope scope(b); \ QLocale *locale = getThisLocale(scope, callData); \ if (!locale) \ - return; \ - if (callData->argc < 1 || callData->argc > 2) \ + return Encode::undefined(); \ + if (callData->argc() < 1 || callData->argc() > 2) \ THROW_ERROR("Locale: " #VARIABLE "(): Invalid arguments"); \ QLocale::FormatType enumFormat = QLocale::LongFormat; \ int idx = callData->args[0].toInt32(); \ @@ -618,7 +620,7 @@ void QQmlLocaleData::method_ ## VARIABLE (const BuiltinFunction *, Scope &scope, THROW_ERROR("Locale: Invalid day"); \ if (idx == 0) idx = 7; \ QString name; \ - if (callData->argc == 2) { \ + if (callData->argc() == 2) { \ if (callData->args[1].isNumber()) { \ quint32 intFormat = callData->args[1].toUInt32(); \ QLocale::FormatType format = QLocale::FormatType(intFormat); \ @@ -629,7 +631,7 @@ void QQmlLocaleData::method_ ## VARIABLE (const BuiltinFunction *, Scope &scope, } else { \ name = locale-> VARIABLE(idx, enumFormat); \ } \ - scope.result = scope.engine->newString(name); \ + RETURN_RESULT(scope.engine->newString(name)); \ } LOCALE_FORMATTED_MONTHNAME(monthName) @@ -637,12 +639,14 @@ LOCALE_FORMATTED_MONTHNAME(standaloneMonthName) LOCALE_FORMATTED_DAYNAME(dayName) LOCALE_FORMATTED_DAYNAME(standaloneDayName) -#define LOCALE_STRING_PROPERTY(VARIABLE) void QQmlLocaleData::method_get_ ## VARIABLE (const BuiltinFunction *, Scope &scope, CallData *callData) \ +#define LOCALE_STRING_PROPERTY(VARIABLE) \ +ReturnedValue QQmlLocaleData::method_get_ ## VARIABLE (const BuiltinFunction *b, CallData *callData) \ { \ + Scope scope(b); \ QLocale *locale = getThisLocale(scope, callData); \ if (!locale) \ - return; \ - scope.result = scope.engine->newString(locale-> VARIABLE());\ + return Encode::undefined(); \ + RETURN_RESULT(scope.engine->newString(locale-> VARIABLE()));\ } LOCALE_STRING_PROPERTY(name) @@ -833,22 +837,18 @@ void QQmlLocale::registerStringLocaleCompare(QV4::ExecutionEngine *engine) engine->stringPrototype()->defineDefaultProperty(QStringLiteral("localeCompare"), method_localeCompare); } -void QQmlLocale::method_localeCompare(const BuiltinFunction *b, Scope &scope, CallData *callData) +ReturnedValue QQmlLocale::method_localeCompare(const BuiltinFunction *b, CallData *callData) { - if (callData->argc != 1 || (!callData->args[0].isString() && !callData->args[0].as<StringObject>())) { - QV4::StringPrototype::method_localeCompare(b, scope, callData); - return; - } + if (callData->argc() != 1 || (!callData->args[0].isString() && !callData->args[0].as<StringObject>())) + return QV4::StringPrototype::method_localeCompare(b, callData); - if (!callData->thisObject.isString() && !callData->thisObject.as<StringObject>()) { - QV4::StringPrototype::method_localeCompare(b, scope, callData); - return; - } + if (!callData->thisObject.isString() && !callData->thisObject.as<StringObject>()) + return QV4::StringPrototype::method_localeCompare(b, callData); QString thisString = callData->thisObject.toQStringNoThrow(); QString thatString = callData->args[0].toQStringNoThrow(); - scope.result = QV4::Encode(QString::localeAwareCompare(thisString, thatString)); + return QV4::Encode(QString::localeAwareCompare(thisString, thatString)); } /*! diff --git a/src/qml/qml/qqmllocale_p.h b/src/qml/qml/qqmllocale_p.h index 1a2ffc72b0..a81fe07b8e 100644 --- a/src/qml/qml/qqmllocale_p.h +++ b/src/qml/qml/qqmllocale_p.h @@ -67,13 +67,13 @@ public: static void registerExtension(QV4::ExecutionEngine *engine); private: - static void method_toLocaleString(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_toLocaleTimeString(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_toLocaleDateString(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_fromLocaleString(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_fromLocaleTimeString(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_fromLocaleDateString(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_timeZoneUpdated(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); + static QV4::ReturnedValue method_toLocaleString(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_toLocaleTimeString(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_toLocaleDateString(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_fromLocaleString(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_fromLocaleTimeString(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_fromLocaleDateString(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_timeZoneUpdated(const QV4::BuiltinFunction *, QV4::CallData *callData); }; @@ -83,9 +83,9 @@ public: static void registerExtension(QV4::ExecutionEngine *engine); private: - static void method_toLocaleString(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_fromLocaleString(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_toLocaleCurrencyString(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); + static QV4::ReturnedValue method_toLocaleString(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_fromLocaleString(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_toLocaleCurrencyString(const QV4::BuiltinFunction *, QV4::CallData *callData); }; @@ -135,7 +135,7 @@ public: private: QQmlLocale(); - static void method_localeCompare(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); + static QV4::ReturnedValue method_localeCompare(const QV4::BuiltinFunction *, QV4::CallData *callData); }; namespace QV4 { @@ -168,33 +168,33 @@ struct QQmlLocaleData : public QV4::Object return thisObject->d()->locale; } - static void method_currencySymbol(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_dateTimeFormat(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_timeFormat(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_dateFormat(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_monthName(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_standaloneMonthName(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_dayName(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_standaloneDayName(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - - static void method_get_firstDayOfWeek(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_measurementSystem(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_textDirection(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_weekDays(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_uiLanguages(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - - static void method_get_name(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_nativeLanguageName(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_nativeCountryName(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_decimalPoint(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_groupSeparator(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_percent(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_zeroDigit(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_negativeSign(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_positiveSign(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_exponential(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_amText(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_pmText(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); + static QV4::ReturnedValue method_currencySymbol(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_dateTimeFormat(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_timeFormat(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_dateFormat(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_monthName(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_standaloneMonthName(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_dayName(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_standaloneDayName(const QV4::BuiltinFunction *, QV4::CallData *callData); + + static QV4::ReturnedValue method_get_firstDayOfWeek(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_measurementSystem(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_textDirection(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_weekDays(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_uiLanguages(const QV4::BuiltinFunction *, QV4::CallData *callData); + + static QV4::ReturnedValue method_get_name(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_nativeLanguageName(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_nativeCountryName(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_decimalPoint(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_groupSeparator(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_percent(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_zeroDigit(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_negativeSign(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_positiveSign(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_exponential(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_amText(const QV4::BuiltinFunction *, QV4::CallData *callData); + static QV4::ReturnedValue method_get_pmText(const QV4::BuiltinFunction *, QV4::CallData *callData); }; } diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index 4f69017ff0..5836c85666 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -260,8 +260,6 @@ void QQmlMetaTypeData::registerType(QQmlTypePrivate *priv) void QQmlType::SingletonInstanceInfo::init(QQmlEngine *e) { - QV4::ExecutionEngine *v4 = QV8Engine::getV4(e->handle()); - v4->pushGlobalContext(); if (scriptCallback && scriptApi(e).isUndefined()) { setScriptApi(e, scriptCallback(e, e)); } else if (qobjectCallback && !qobjectApi(e)) { @@ -277,7 +275,6 @@ void QQmlType::SingletonInstanceInfo::init(QQmlEngine *e) QObject *o = component.create(); setQObjectApi(e, o); } - v4->popContext(); } void QQmlType::SingletonInstanceInfo::destroy(QQmlEngine *e) diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index b9d6c521de..00bfb65a66 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -44,6 +44,7 @@ #include <private/qqmlengine_p.h> #include <private/qqmlglobal_p.h> #include <private/qqmlthread_p.h> +#include <private/qv4codegen_p.h> #include <private/qqmlcomponent_p.h> #include <private/qqmlprofiler_p.h> #include <private/qqmlmemoryprofiler_p.h> @@ -2080,10 +2081,10 @@ bool QQmlTypeData::tryLoadFromDiskCache() if (!v4) return false; - QQmlRefPointer<QV4::CompiledData::CompilationUnit> unit = v4->iselFactory->createUnitForLoading(); + QQmlRefPointer<QV4::CompiledData::CompilationUnit> unit = QV4::Compiler::Codegen::createUnitForLoading(); { QString error; - if (!unit->loadFromDisk(url(), m_backupSourceCode.sourceTimeStamp(), v4->iselFactory.data(), &error)) { + if (!unit->loadFromDisk(url(), m_backupSourceCode.sourceTimeStamp(), &error)) { qCDebug(DBG_DISK_CACHE) << "Error loading" << url().toString() << "from disk cache:" << error; return false; } @@ -2447,7 +2448,7 @@ void QQmlTypeData::restoreIR(QQmlRefPointer<QV4::CompiledData::CompilationUnit> m_document.reset(new QmlIR::Document(isDebugging())); QmlIR::IRLoader loader(unit->data, m_document.data()); loader.load(); - m_document->jsModule.setFileName(finalUrlString()); + m_document->jsModule.fileName = finalUrlString(); m_document->javaScriptCompilationUnit = unit; continueLoadFromIR(); } @@ -2564,7 +2565,7 @@ void QQmlTypeData::compile(const QQmlRefPointer<QQmlTypeNameCache> &typeNameCach QString errorString; if (m_compiledData->saveToDisk(url(), &errorString)) { QString error; - if (!m_compiledData->loadFromDisk(url(), m_backupSourceCode.sourceTimeStamp(), enginePrivate->v4engine()->iselFactory.data(), &error)) { + if (!m_compiledData->loadFromDisk(url(), m_backupSourceCode.sourceTimeStamp(), &error)) { // ignore error, keep using the in-memory compilation unit. } } else { @@ -2881,7 +2882,7 @@ QV4::ReturnedValue QQmlScriptData::scriptValueForContext(QQmlContextData *parent ep->warning(error); } - QV4::ScopedValue retval(scope, qmlContext->d()->qml); + QV4::ScopedValue retval(scope, qmlContext->d()->qml()); if (shared) { m_value.set(scope.engine, retval); m_loaded = true; @@ -2923,19 +2924,12 @@ QQmlScriptData *QQmlScriptBlob::scriptData() const return m_scriptData; } -struct EmptyCompilationUnit : public QV4::CompiledData::CompilationUnit -{ - void linkBackendToEngine(QV4::ExecutionEngine *) override {} -}; - void QQmlScriptBlob::dataReceived(const SourceCodeData &data) { - QV4::ExecutionEngine *v4 = QV8Engine::getV4(m_typeLoader->engine()); - if (!disableDiskCache() || forceDiskCache()) { - QQmlRefPointer<QV4::CompiledData::CompilationUnit> unit = v4->iselFactory->createUnitForLoading(); + QQmlRefPointer<QV4::CompiledData::CompilationUnit> unit = QV4::Compiler::Codegen::createUnitForLoading(); QString error; - if (unit->loadFromDisk(url(), data.sourceTimeStamp(), v4->iselFactory.data(), &error)) { + if (unit->loadFromDisk(url(), data.sourceTimeStamp(), &error)) { initializeFromCompilationUnit(unit); return; } else { @@ -2957,7 +2951,7 @@ void QQmlScriptBlob::dataReceived(const SourceCodeData &data) QmlIR::ScriptDirectivesCollector collector(&irUnit.jsParserEngine, &irUnit.jsGenerator); QList<QQmlError> errors; - QQmlRefPointer<QV4::CompiledData::CompilationUnit> unit = QV4::Script::precompile(&irUnit.jsModule, &irUnit.jsGenerator, v4, finalUrl(), source, &errors, &collector); + QQmlRefPointer<QV4::CompiledData::CompilationUnit> unit = QV4::Script::precompile(&irUnit.jsModule, &irUnit.jsGenerator, finalUrl(), source, &errors, &collector); // No need to addref on unit, it's initial refcount is 1 source.clear(); if (!errors.isEmpty()) { @@ -2965,7 +2959,7 @@ void QQmlScriptBlob::dataReceived(const SourceCodeData &data) return; } if (!unit) { - unit.adopt(new EmptyCompilationUnit); + unit.adopt(new QV4::CompiledData::CompilationUnit); } irUnit.javaScriptCompilationUnit = unit; irUnit.imports = collector.imports; diff --git a/src/qml/qml/qqmltypewrapper_p.h b/src/qml/qml/qqmltypewrapper_p.h index bb65093163..25ff7ba7c8 100644 --- a/src/qml/qml/qqmltypewrapper_p.h +++ b/src/qml/qml/qqmltypewrapper_p.h @@ -60,6 +60,9 @@ QT_BEGIN_NAMESPACE class QQmlTypeNameCache; +class QQmlType; +class QQmlTypePrivate; +struct QQmlImportRef; namespace QV4 { diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index a5cdccc97a..90ca08537c 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -316,8 +316,9 @@ bool QQmlValueTypeWrapper::write(QObject *target, int propertyIndex) const return true; } -void QQmlValueTypeWrapper::method_toString(const BuiltinFunction *, Scope &scope, CallData *callData) +ReturnedValue QQmlValueTypeWrapper::method_toString(const BuiltinFunction *b, CallData *callData) { + Scope scope(b); Object *o = callData->thisObject.as<Object>(); if (!o) THROW_TYPE_ERROR(); @@ -350,7 +351,7 @@ void QQmlValueTypeWrapper::method_toString(const BuiltinFunction *, Scope &scope } result += QLatin1Char(')'); } - scope.result = scope.engine->newString(result); + return Encode(scope.engine->newString(result)); } ReturnedValue QQmlValueTypeWrapper::get(const Managed *m, String *name, bool *hasProperty) @@ -472,13 +473,13 @@ bool QQmlValueTypeWrapper::put(Managed *m, String *name, const Value &value) if (auto binding = QQmlPropertyPrivate::binding(referenceObject, QQmlPropertyIndex(referencePropertyIndex, pd->coreIndex()))) { Q_ASSERT(!binding->isValueTypeProxy()); const auto qmlBinding = static_cast<const QQmlBinding*>(binding); - const auto stackFrame = v4->currentStackFrame(); + const auto stackFrame = v4->currentStackFrame; qCInfo(lcBindingRemoval, "Overwriting binding on %s::%s which was initially bound at %s by setting \"%s\" at %s:%d", referenceObject->metaObject()->className(), referenceObject->metaObject()->property(referencePropertyIndex).name(), qPrintable(qmlBinding->expressionIdentifier()), metaObject->property(pd->coreIndex()).name(), - qPrintable(stackFrame.source), stackFrame.line); + qPrintable(stackFrame->source()), stackFrame->lineNumber()); } } QQmlPropertyPrivate::removeBinding(referenceObject, QQmlPropertyIndex(referencePropertyIndex, pd->coreIndex())); diff --git a/src/qml/qml/qqmlvaluetypewrapper_p.h b/src/qml/qml/qqmlvaluetypewrapper_p.h index c8aac719ab..da03af6dbc 100644 --- a/src/qml/qml/qqmlvaluetypewrapper_p.h +++ b/src/qml/qml/qqmlvaluetypewrapper_p.h @@ -56,6 +56,7 @@ #include <private/qv4value_p.h> #include <private/qv4object_p.h> +#include <private/qqmlpropertycache_p.h> QT_BEGIN_NAMESPACE @@ -111,7 +112,7 @@ public: static PropertyAttributes query(const Managed *, String *name); static void advanceIterator(Managed *m, ObjectIterator *it, Value *name, uint *index, Property *p, PropertyAttributes *attributes); - static void method_toString(const BuiltinFunction *, Scope &scope, CallData *callData); + static ReturnedValue method_toString(const BuiltinFunction *, CallData *callData); static void initProto(ExecutionEngine *v4); }; diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index dde8784eb1..281d64ac79 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -55,6 +55,7 @@ #include <private/qv4variantobject_p.h> #include <private/qv4functionobject_p.h> #include <private/qv4scopedvalue_p.h> +#include <private/qv4jscall_p.h> #include <private/qv4qobjectwrapper_p.h> QT_BEGIN_NAMESPACE @@ -949,20 +950,20 @@ int QQmlVMEMetaObject::metaCall(QObject *o, QMetaObject::Call c, int _id, void * } const unsigned int parameterCount = function->formalParameterCount(); - QV4::ScopedCallData callData(scope, parameterCount); - callData->thisObject = ep->v8engine()->global(); + QV4::JSCallData jsCallData(scope, parameterCount); + *jsCallData->thisObject = ep->v8engine()->global(); for (uint ii = 0; ii < parameterCount; ++ii) - callData->args[ii] = scope.engine->fromVariant(*(QVariant *)a[ii + 1]); + jsCallData->args[ii] = scope.engine->fromVariant(*(QVariant *)a[ii + 1]); - function->call(scope, callData); + QV4::ScopedValue result(scope, function->call(jsCallData)); if (scope.hasException()) { QQmlError error = scope.engine->catchExceptionAsQmlError(); if (error.isValid()) ep->warning(error); if (a[0]) *(QVariant *)a[0] = QVariant(); } else { - if (a[0]) *(QVariant *)a[0] = scope.engine->toVariant(scope.result, 0); + if (a[0]) *(QVariant *)a[0] = scope.engine->toVariant(result, 0); } ep->dereferenceScarceResources(); // "release" scarce resources if top-level expression evaluation is complete. diff --git a/src/qml/qml/qqmlxmlhttprequest.cpp b/src/qml/qml/qqmlxmlhttprequest.cpp index 08f3d35e46..323074e12f 100644 --- a/src/qml/qml/qqmlxmlhttprequest.cpp +++ b/src/qml/qml/qqmlxmlhttprequest.cpp @@ -51,6 +51,7 @@ #include <private/qv4engine_p.h> #include <private/qv4functionobject_p.h> #include <private/qv4scopedvalue_p.h> +#include <private/qv4jscall_p.h> #include <QtCore/qobject.h> #include <QtQml/qjsvalue.h> @@ -74,8 +75,7 @@ using namespace QV4; #define V4THROW_REFERENCE(string) \ do { \ ScopedObject error(scope, scope.engine->newReferenceErrorObject(QStringLiteral(string))); \ - scope.result = scope.engine->throwError(error); \ - return; \ + return scope.engine->throwError(error); \ } while (false) QT_BEGIN_NAMESPACE @@ -276,25 +276,25 @@ public: static void initClass(ExecutionEngine *engine); // JS API - static void method_get_nodeName(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_nodeValue(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_nodeType(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_namespaceUri(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - - static void method_get_parentNode(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_childNodes(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_firstChild(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_lastChild(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_previousSibling(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_nextSibling(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_attributes(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - - //static void ownerDocument(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - //static void namespaceURI(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - //static void prefix(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - //static void localName(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - //static void baseURI(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - //static void textContent(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); + static ReturnedValue method_get_nodeName(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_nodeValue(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_nodeType(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_namespaceUri(const BuiltinFunction *b, QV4::CallData *callData); + + static ReturnedValue method_get_parentNode(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_childNodes(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_firstChild(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_lastChild(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_previousSibling(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_nextSibling(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_attributes(const BuiltinFunction *b, QV4::CallData *callData); + + //static ReturnedValue ownerDocument(const BuiltinFunction *b, QV4::CallData *callData); + //static ReturnedValue namespaceURI(const BuiltinFunction *b, QV4::CallData *callData); + //static ReturnedValue prefix(const BuiltinFunction *b, QV4::CallData *callData); + //static ReturnedValue localName(const BuiltinFunction *b, QV4::CallData *callData); + //static ReturnedValue baseURI(const BuiltinFunction *b, QV4::CallData *callData); + //static ReturnedValue textContent(const BuiltinFunction *b, QV4::CallData *callData); static ReturnedValue getProto(ExecutionEngine *v4); @@ -355,10 +355,10 @@ class Attr : public Node { public: // JS API - static void method_name(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); + static ReturnedValue method_name(const BuiltinFunction *b, QV4::CallData *callData); // static void specified(CallContext *); - static void method_value(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_ownerElement(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); + static ReturnedValue method_value(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_ownerElement(const BuiltinFunction *b, QV4::CallData *callData); // static void schemaTypeInfo(CallContext *); // static void isId(CallContext *c); @@ -370,7 +370,7 @@ class CharacterData : public Node { public: // JS API - static void method_length(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); + static ReturnedValue method_length(const BuiltinFunction *b, QV4::CallData *callData); // C++ API static ReturnedValue prototype(ExecutionEngine *v4); @@ -380,8 +380,8 @@ class Text : public CharacterData { public: // JS API - static void method_isElementContentWhitespace(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_wholeText(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); + static ReturnedValue method_isElementContentWhitespace(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_wholeText(const BuiltinFunction *b, QV4::CallData *callData); // C++ API static ReturnedValue prototype(ExecutionEngine *); @@ -398,10 +398,10 @@ class Document : public Node { public: // JS API - static void method_xmlVersion(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_xmlEncoding(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_xmlStandalone(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_documentElement(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); + static ReturnedValue method_xmlVersion(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_xmlEncoding(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_xmlStandalone(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_documentElement(const BuiltinFunction *b, QV4::CallData *callData); // C++ API static ReturnedValue prototype(ExecutionEngine *); @@ -420,8 +420,9 @@ void NodeImpl::release() document->release(); } -void NodePrototype::method_get_nodeName(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue NodePrototype::method_get_nodeName(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) THROW_TYPE_ERROR(); @@ -441,11 +442,12 @@ void NodePrototype::method_get_nodeName(const QV4::BuiltinFunction *, QV4::Scope name = r->d()->d->name; break; } - scope.result = Encode(scope.engine->newString(name)); + return Encode(scope.engine->newString(name)); } -void NodePrototype::method_get_nodeValue(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue NodePrototype::method_get_nodeValue(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) THROW_TYPE_ERROR(); @@ -459,74 +461,81 @@ void NodePrototype::method_get_nodeValue(const QV4::BuiltinFunction *, QV4::Scop r->d()->d->type == NodeImpl::Notation) RETURN_RESULT(Encode::null()); - scope.result = Encode(scope.engine->newString(r->d()->d->data)); + return Encode(scope.engine->newString(r->d()->d->data)); } -void NodePrototype::method_get_nodeType(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue NodePrototype::method_get_nodeType(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) THROW_TYPE_ERROR(); - scope.result = Encode(r->d()->d->type); + return Encode(r->d()->d->type); } -void NodePrototype::method_get_namespaceUri(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue NodePrototype::method_get_namespaceUri(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) THROW_TYPE_ERROR(); - scope.result = Encode(scope.engine->newString(r->d()->d->namespaceUri)); + return Encode(scope.engine->newString(r->d()->d->namespaceUri)); } -void NodePrototype::method_get_parentNode(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue NodePrototype::method_get_parentNode(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) THROW_TYPE_ERROR(); if (r->d()->d->parent) - scope.result = Node::create(scope.engine, r->d()->d->parent); + return Node::create(scope.engine, r->d()->d->parent); else - scope.result = Encode::null(); + return Encode::null(); } -void NodePrototype::method_get_childNodes(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue NodePrototype::method_get_childNodes(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) THROW_TYPE_ERROR(); - scope.result = NodeList::create(scope.engine, r->d()->d); + return NodeList::create(scope.engine, r->d()->d); } -void NodePrototype::method_get_firstChild(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue NodePrototype::method_get_firstChild(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) THROW_TYPE_ERROR(); if (r->d()->d->children.isEmpty()) - scope.result = Encode::null(); + return Encode::null(); else - scope.result = Node::create(scope.engine, r->d()->d->children.constFirst()); + return Node::create(scope.engine, r->d()->d->children.constFirst()); } -void NodePrototype::method_get_lastChild(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue NodePrototype::method_get_lastChild(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) THROW_TYPE_ERROR(); if (r->d()->d->children.isEmpty()) - scope.result = Encode::null(); + return Encode::null(); else - scope.result = Node::create(scope.engine, r->d()->d->children.constLast()); + return Node::create(scope.engine, r->d()->d->children.constLast()); } -void NodePrototype::method_get_previousSibling(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue NodePrototype::method_get_previousSibling(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) THROW_TYPE_ERROR(); @@ -537,18 +546,18 @@ void NodePrototype::method_get_previousSibling(const QV4::BuiltinFunction *, QV4 for (int ii = 0; ii < r->d()->d->parent->children.count(); ++ii) { if (r->d()->d->parent->children.at(ii) == r->d()->d) { if (ii == 0) - scope.result = Encode::null(); + return Encode::null(); else - scope.result = Node::create(scope.engine, r->d()->d->parent->children.at(ii - 1)); - return; + return Node::create(scope.engine, r->d()->d->parent->children.at(ii - 1)); } } - scope.result = Encode::null(); + return Encode::null(); } -void NodePrototype::method_get_nextSibling(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue NodePrototype::method_get_nextSibling(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) THROW_TYPE_ERROR(); @@ -559,26 +568,26 @@ void NodePrototype::method_get_nextSibling(const QV4::BuiltinFunction *, QV4::Sc for (int ii = 0; ii < r->d()->d->parent->children.count(); ++ii) { if (r->d()->d->parent->children.at(ii) == r->d()->d) { if ((ii + 1) == r->d()->d->parent->children.count()) - scope.result = Encode::null(); + return Encode::null(); else - scope.result = Node::create(scope.engine, r->d()->d->parent->children.at(ii + 1)); - return; + return Node::create(scope.engine, r->d()->d->parent->children.at(ii + 1)); } } - scope.result = Encode::null(); + return Encode::null(); } -void NodePrototype::method_get_attributes(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue NodePrototype::method_get_attributes(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) THROW_TYPE_ERROR(); if (r->d()->d->type != NodeImpl::Element) - scope.result = Encode::null(); + return Encode::null(); else - scope.result = NamedNodeMap::create(scope.engine, r->d()->d, r->d()->d->attributes); + return NamedNodeMap::create(scope.engine, r->d()->d, r->d()->d->attributes); } ReturnedValue NodePrototype::getProto(ExecutionEngine *v4) @@ -659,40 +668,44 @@ ReturnedValue Attr::prototype(ExecutionEngine *engine) return d->attrPrototype.value(); } -void Attr::method_name(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue Attr::method_name(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) RETURN_UNDEFINED(); - scope.result = scope.engine->newString(r->d()->d->name); + return Encode(scope.engine->newString(r->d()->d->name)); } -void Attr::method_value(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue Attr::method_value(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) RETURN_UNDEFINED(); - scope.result = scope.engine->newString(r->d()->d->data); + return Encode(scope.engine->newString(r->d()->d->data)); } -void Attr::method_ownerElement(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue Attr::method_ownerElement(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) RETURN_UNDEFINED(); - scope.result = Node::create(scope.engine, r->d()->d->parent); + return Node::create(scope.engine, r->d()->d->parent); } -void CharacterData::method_length(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue CharacterData::method_length(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) RETURN_UNDEFINED(); - scope.result = Encode(r->d()->d->data.length()); + return Encode(r->d()->d->data.length()); } ReturnedValue CharacterData::prototype(ExecutionEngine *v4) @@ -711,22 +724,24 @@ ReturnedValue CharacterData::prototype(ExecutionEngine *v4) return d->characterDataPrototype.value(); } -void Text::method_isElementContentWhitespace(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue Text::method_isElementContentWhitespace(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) RETURN_UNDEFINED(); - scope.result = Encode(QStringRef(&r->d()->d->data).trimmed().isEmpty()); + return Encode(QStringRef(&r->d()->d->data).trimmed().isEmpty()); } -void Text::method_wholeText(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue Text::method_wholeText(const BuiltinFunction *b, QV4::CallData *callData) { + QV4::Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r) RETURN_UNDEFINED(); - scope.result = scope.engine->newString(r->d()->d->data); + return Encode(scope.engine->newString(r->d()->d->data)); } ReturnedValue Text::prototype(ExecutionEngine *v4) @@ -952,40 +967,44 @@ ReturnedValue NodeList::create(ExecutionEngine *v4, NodeImpl *data) return (v4->memoryManager->allocObject<NodeList>(data))->asReturnedValue(); } -void Document::method_documentElement(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue Document::method_documentElement(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r || r->d()->d->type != NodeImpl::Document) RETURN_UNDEFINED(); - scope.result = Node::create(scope.engine, static_cast<DocumentImpl *>(r->d()->d)->root); + return Node::create(scope.engine, static_cast<DocumentImpl *>(r->d()->d)->root); } -void Document::method_xmlStandalone(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue Document::method_xmlStandalone(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r || r->d()->d->type != NodeImpl::Document) RETURN_UNDEFINED(); - scope.result = Encode(static_cast<DocumentImpl *>(r->d()->d)->isStandalone); + return Encode(static_cast<DocumentImpl *>(r->d()->d)->isStandalone); } -void Document::method_xmlVersion(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue Document::method_xmlVersion(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r || r->d()->d->type != NodeImpl::Document) RETURN_UNDEFINED(); - scope.result = scope.engine->newString(static_cast<DocumentImpl *>(r->d()->d)->version); + return Encode(scope.engine->newString(static_cast<DocumentImpl *>(r->d()->d)->version)); } -void Document::method_xmlEncoding(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue Document::method_xmlEncoding(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<Node> r(scope, callData->thisObject.as<Node>()); if (!r || r->d()->d->type != NodeImpl::Document) RETURN_UNDEFINED(); - scope.result = scope.engine->newString(static_cast<DocumentImpl *>(r->d()->d)->encoding); + return Encode(scope.engine->newString(static_cast<DocumentImpl *>(r->d()->d)->encoding)); } class QQmlXMLHttpRequest : public QObject @@ -1557,9 +1576,8 @@ void QQmlXMLHttpRequest::dispatchCallback(Object *thisObj, QQmlContextData *cont return; } - QV4::ScopedCallData callData(scope); - callData->thisObject = Encode::undefined(); - callback->call(scope, callData); + QV4::JSCallData jsCallData(scope); + callback->call(jsCallData); if (scope.engine->hasException) { QQmlError error = scope.engine->catchExceptionAsQmlError(); @@ -1617,42 +1635,39 @@ struct QQmlXMLHttpRequestCtor : public FunctionObject { V4_OBJECT2(QQmlXMLHttpRequestCtor, FunctionObject) - static void construct(const Managed *that, Scope &scope, QV4::CallData *) + static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *, int) { - Scoped<QQmlXMLHttpRequestCtor> ctor(scope, that->as<QQmlXMLHttpRequestCtor>()); - if (!ctor) { - scope.result = scope.engine->throwTypeError(); - return; - } + Scope scope(f->engine()); + const QQmlXMLHttpRequestCtor *ctor = static_cast<const QQmlXMLHttpRequestCtor *>(f); QQmlXMLHttpRequest *r = new QQmlXMLHttpRequest(scope.engine->v8Engine->networkAccessManager()); Scoped<QQmlXMLHttpRequestWrapper> w(scope, scope.engine->memoryManager->allocObject<QQmlXMLHttpRequestWrapper>(r)); ScopedObject proto(scope, ctor->d()->proto); w->setPrototype(proto); - scope.result = w.asReturnedValue(); + return w.asReturnedValue(); } - static void call(const Managed *, Scope &scope, QV4::CallData *) { - scope.result = Primitive::undefinedValue(); + static ReturnedValue call(const FunctionObject *, const Value *, const Value *, int) { + return Encode::undefined(); } void setupProto(); - static void method_open(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_setRequestHeader(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_send(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_abort(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_getResponseHeader(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_getAllResponseHeaders(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - - static void method_get_readyState(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_status(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_statusText(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_responseText(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_responseXML(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_response(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_get_responseType(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); - static void method_set_responseType(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData); + static ReturnedValue method_open(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_setRequestHeader(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_send(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_abort(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_getResponseHeader(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_getAllResponseHeaders(const BuiltinFunction *b, QV4::CallData *callData); + + static ReturnedValue method_get_readyState(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_status(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_statusText(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_responseText(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_responseXML(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_response(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_get_responseType(const BuiltinFunction *b, QV4::CallData *callData); + static ReturnedValue method_set_responseType(const BuiltinFunction *b, QV4::CallData *callData); }; } @@ -1714,14 +1729,15 @@ void QQmlXMLHttpRequestCtor::setupProto() // XMLHttpRequest methods -void QQmlXMLHttpRequestCtor::method_open(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_open(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); QQmlXMLHttpRequest *r = w->d()->request; - if (callData->argc < 2 || callData->argc > 5) + if (callData->argc() < 2 || callData->argc() > 5) THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); // Argument 0 - Method @@ -1744,15 +1760,15 @@ void QQmlXMLHttpRequestCtor::method_open(const QV4::BuiltinFunction *, QV4::Scop bool async = true; // Argument 2 - async (optional) - if (callData->argc > 2) { + if (callData->argc() > 2) { async = callData->args[2].booleanValue(); } // Argument 3/4 - user/pass (optional) QString username, password; - if (callData->argc > 3) + if (callData->argc() > 3) username = callData->args[3].toQStringNoThrow(); - if (callData->argc > 4) + if (callData->argc() > 4) password = callData->args[4].toQStringNoThrow(); // Clear the fragment (if any) @@ -1762,17 +1778,18 @@ void QQmlXMLHttpRequestCtor::method_open(const QV4::BuiltinFunction *, QV4::Scop if (!username.isNull()) url.setUserName(username); if (!password.isNull()) url.setPassword(password); - scope.result = r->open(w, scope.engine->callingQmlContext(), method, url, async ? QQmlXMLHttpRequest::AsynchronousLoad : QQmlXMLHttpRequest::SynchronousLoad); + return r->open(w, scope.engine->callingQmlContext(), method, url, async ? QQmlXMLHttpRequest::AsynchronousLoad : QQmlXMLHttpRequest::SynchronousLoad); } -void QQmlXMLHttpRequestCtor::method_setRequestHeader(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_setRequestHeader(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); QQmlXMLHttpRequest *r = w->d()->request; - if (callData->argc != 2) + if (callData->argc() != 2) THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); if (r->readyState() != QQmlXMLHttpRequest::Opened || r->sendFlag()) @@ -1811,8 +1828,9 @@ void QQmlXMLHttpRequestCtor::method_setRequestHeader(const QV4::BuiltinFunction RETURN_UNDEFINED(); } -void QQmlXMLHttpRequestCtor::method_send(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_send(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); @@ -1823,7 +1841,7 @@ void QQmlXMLHttpRequestCtor::method_send(const QV4::BuiltinFunction *, QV4::Scop THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); QByteArray data; - if (callData->argc > 0) { + if (callData->argc() > 0) { if (const ArrayBuffer *buffer = callData->args[0].as<ArrayBuffer>()) { data = buffer->asByteArray(); } else { @@ -1831,27 +1849,29 @@ void QQmlXMLHttpRequestCtor::method_send(const QV4::BuiltinFunction *, QV4::Scop } } - scope.result = r->send(w, scope.engine->callingQmlContext(), data); + return r->send(w, scope.engine->callingQmlContext(), data); } -void QQmlXMLHttpRequestCtor::method_abort(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_abort(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); QQmlXMLHttpRequest *r = w->d()->request; - scope.result = r->abort(w, scope.engine->callingQmlContext()); + return r->abort(w, scope.engine->callingQmlContext()); } -void QQmlXMLHttpRequestCtor::method_getResponseHeader(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_getResponseHeader(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); QQmlXMLHttpRequest *r = w->d()->request; - if (callData->argc != 1) + if (callData->argc() != 1) THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); if (r->readyState() != QQmlXMLHttpRequest::Loading && @@ -1859,17 +1879,18 @@ void QQmlXMLHttpRequestCtor::method_getResponseHeader(const QV4::BuiltinFunction r->readyState() != QQmlXMLHttpRequest::HeadersReceived) THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); - scope.result = scope.engine->newString(r->header(callData->args[0].toQStringNoThrow())); + return Encode(scope.engine->newString(r->header(callData->args[0].toQStringNoThrow()))); } -void QQmlXMLHttpRequestCtor::method_getAllResponseHeaders(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_getAllResponseHeaders(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); QQmlXMLHttpRequest *r = w->d()->request; - if (callData->argc != 0) + if (callData->argc() != 0) THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); if (r->readyState() != QQmlXMLHttpRequest::Loading && @@ -1877,22 +1898,24 @@ void QQmlXMLHttpRequestCtor::method_getAllResponseHeaders(const QV4::BuiltinFunc r->readyState() != QQmlXMLHttpRequest::HeadersReceived) THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); - scope.result = scope.engine->newString(r->headers()); + return Encode(scope.engine->newString(r->headers())); } // XMLHttpRequest properties -void QQmlXMLHttpRequestCtor::method_get_readyState(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_get_readyState(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); QQmlXMLHttpRequest *r = w->d()->request; - scope.result = Encode(r->readyState()); + return Encode(r->readyState()); } -void QQmlXMLHttpRequestCtor::method_get_status(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_get_status(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); @@ -1903,13 +1926,14 @@ void QQmlXMLHttpRequestCtor::method_get_status(const QV4::BuiltinFunction *, QV4 THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); if (r->errorFlag()) - scope.result = Encode(0); + return Encode(0); else - scope.result = Encode(r->replyStatus()); + return Encode(r->replyStatus()); } -void QQmlXMLHttpRequestCtor::method_get_statusText(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_get_statusText(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); @@ -1920,13 +1944,14 @@ void QQmlXMLHttpRequestCtor::method_get_statusText(const QV4::BuiltinFunction *, THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); if (r->errorFlag()) - scope.result = scope.engine->newString(QString()); + return Encode(scope.engine->newString(QString())); else - scope.result = scope.engine->newString(r->replyStatusText()); + return Encode(scope.engine->newString(r->replyStatusText())); } -void QQmlXMLHttpRequestCtor::method_get_responseText(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_get_responseText(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); @@ -1934,13 +1959,14 @@ void QQmlXMLHttpRequestCtor::method_get_responseText(const QV4::BuiltinFunction if (r->readyState() != QQmlXMLHttpRequest::Loading && r->readyState() != QQmlXMLHttpRequest::Done) - scope.result = scope.engine->newString(QString()); + return Encode(scope.engine->newString(QString())); else - scope.result = scope.engine->newString(r->responseBody()); + return Encode(scope.engine->newString(r->responseBody())); } -void QQmlXMLHttpRequestCtor::method_get_responseXML(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_get_responseXML(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); @@ -1949,16 +1975,17 @@ void QQmlXMLHttpRequestCtor::method_get_responseXML(const QV4::BuiltinFunction * if (!r->receivedXml() || (r->readyState() != QQmlXMLHttpRequest::Loading && r->readyState() != QQmlXMLHttpRequest::Done)) { - scope.result = Encode::null(); + return Encode::null(); } else { if (r->responseType().isEmpty()) r->setResponseType(QLatin1String("document")); - scope.result = r->xmlResponseBody(scope.engine); + return r->xmlResponseBody(scope.engine); } } -void QQmlXMLHttpRequestCtor::method_get_response(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_get_response(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); @@ -1983,29 +2010,31 @@ void QQmlXMLHttpRequestCtor::method_get_response(const QV4::BuiltinFunction *, Q } -void QQmlXMLHttpRequestCtor::method_get_responseType(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_get_responseType(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); QQmlXMLHttpRequest *r = w->d()->request; - scope.result = scope.engine->newString(r->responseType()); + return Encode(scope.engine->newString(r->responseType())); } -void QQmlXMLHttpRequestCtor::method_set_responseType(const QV4::BuiltinFunction *, QV4::Scope &scope, QV4::CallData *callData) +ReturnedValue QQmlXMLHttpRequestCtor::method_set_responseType(const BuiltinFunction *b, QV4::CallData *callData) { + Scope scope(b); Scoped<QQmlXMLHttpRequestWrapper> w(scope, callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); QQmlXMLHttpRequest *r = w->d()->request; - if (callData->argc < 1) + if (callData->argc() < 1) THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); // Argument 0 - response type r->setResponseType(callData->args[0].toQStringNoThrow()); - scope.result = Encode::undefined(); + return Encode::undefined(); } void qt_rem_qmlxmlhttprequest(ExecutionEngine * /* engine */, void *d) diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 25d99e0c87..3627f29cb2 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) + 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,9 +242,10 @@ 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) { - int argCount = callData->argc; + 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,9 +272,10 @@ 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) { - int argCount = callData->argc; + 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,9 +304,10 @@ 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) { - int argCount = callData->argc; + 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,9 +332,10 @@ 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) { - if (callData->argc != 2) + QV4::Scope scope(b); + if (callData->argc() != 2) THROW_GENERIC_ERROR("Qt.colorEqual(): Invalid arguments"); bool ok = false; @@ -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,9 +371,10 @@ 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) { - if (callData->argc != 4) + QV4::Scope scope(b); + if (callData->argc() != 4) THROW_GENERIC_ERROR("Qt.rect(): Invalid arguments"); double x = callData->args[0].toNumber(); @@ -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) { - if (callData->argc != 2) + 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) { - if (callData->argc != 2) + 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,9 +425,10 @@ 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) { - if (callData->argc != 1 || !callData->args[0].isObject()) + QV4::Scope scope(b); + if (callData->argc() != 1 || !callData->args[0].isObject()) THROW_GENERIC_ERROR("Qt.font(): Invalid arguments"); QV4::ExecutionEngine *v4 = scope.engine; @@ -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,9 +445,10 @@ 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) { - if (callData->argc != 2) + QV4::Scope scope(b); + if (callData->argc() != 2) THROW_GENERIC_ERROR("Qt.vector2d(): Invalid arguments"); float xy[3]; // qvector2d uses float internally @@ -448,16 +456,17 @@ 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) { - if (callData->argc != 3) + QV4::Scope scope(b); + if (callData->argc() != 3) THROW_GENERIC_ERROR("Qt.vector3d(): Invalid arguments"); float xyz[3]; // qvector3d uses float internally @@ -466,16 +475,17 @@ 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) { - if (callData->argc != 4) + QV4::Scope scope(b); + if (callData->argc() != 4) THROW_GENERIC_ERROR("Qt.vector4d(): Invalid arguments"); float xyzw[4]; // qvector4d uses float internally @@ -485,16 +495,17 @@ 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) { - if (callData->argc != 4) + QV4::Scope scope(b); + if (callData->argc() != 4) THROW_GENERIC_ERROR("Qt.quaternion(): Invalid arguments"); qreal sxyz[4]; // qquaternion uses qreal internally @@ -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,25 +527,23 @@ 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, nullptr)); - return; + if (callData->argc() == 0) { + return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QMatrix4x4, 0, nullptr)); } - if (callData->argc == 1 && callData->args[0].isObject()) { + 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) + if (callData->argc() != 16) THROW_GENERIC_ERROR("Qt.matrix4x4(): Invalid arguments"); qreal vals[16]; // qmatrix4x4 uses qreal internally @@ -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,9 +582,10 @@ 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) { - if (callData->argc != 1 && callData->argc != 2) + QV4::Scope scope(b); + if (callData->argc() != 1 && callData->argc() != 2) THROW_GENERIC_ERROR("Qt.lighter(): Invalid arguments"); QVariant v = scope.engine->toVariant(callData->args[0], -1); @@ -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) + 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,9 +621,10 @@ 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) { - if (callData->argc != 1 && callData->argc != 2) + QV4::Scope scope(b); + if (callData->argc() != 1 && callData->argc() != 2) THROW_GENERIC_ERROR("Qt.darker(): Invalid arguments"); QVariant v = scope.engine->toVariant(callData->args[0], -1); @@ -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) + 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,9 +669,10 @@ 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) { - if (callData->argc != 2) + QV4::Scope scope(b); + if (callData->argc() != 2) THROW_GENERIC_ERROR("Qt.tint(): Invalid arguments"); // base color @@ -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,15 +718,16 @@ 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) { - if (callData->argc < 1 || callData->argc > 2) + QV4::Scope scope(b); + if (callData->argc() < 1 || callData->argc() > 2) THROW_GENERIC_ERROR("Qt.formatDate(): Invalid arguments"); Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate; QDate date = scope.engine->toVariant(callData->args[0], -1).toDateTime().date(); QString formattedDate; - if (callData->argc == 2) { + if (callData->argc() == 2) { QV4::ScopedString s(scope, callData->args[1]); if (s) { QString format = s->toQString(); @@ -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,9 +761,10 @@ 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) { - if (callData->argc < 1 || callData->argc > 2) + QV4::Scope scope(b); + if (callData->argc() < 1 || callData->argc() > 2) THROW_GENERIC_ERROR("Qt.formatTime(): Invalid arguments"); QVariant argVariant = scope.engine->toVariant(callData->args[0], -1); @@ -770,7 +776,7 @@ void QtObject::method_formatTime(const BuiltinFunction *, Scope &scope, CallData Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate; QString formattedTime; - if (callData->argc == 2) { + if (callData->argc() == 2) { QV4::ScopedString s(scope, callData->args[1]); if (s) { QString format = s->toQString(); @@ -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)); } /*! @@ -881,15 +887,16 @@ 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) { - if (callData->argc < 1 || callData->argc > 2) + QV4::Scope scope(b); + if (callData->argc() < 1 || callData->argc() > 2) THROW_GENERIC_ERROR("Qt.formatDateTime(): Invalid arguments"); Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate; QDateTime dt = scope.engine->toVariant(callData->args[0], -1).toDateTime(); QString formattedDt; - if (callData->argc == 2) { + if (callData->argc() == 2) { QV4::ScopedString s(scope, callData->args[1]); if (s) { QString format = s->toQString(); @@ -905,7 +912,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)); } /*! @@ -919,94 +926,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) { - if (callData->argc != 1) { - scope.result = QV4::Encode(false); - return; + QV4::Scope scope(b); + if (callData->argc() != 1) { + 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) { - if (callData->argc != 0) + 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) { - if (callData->argc != 1) + 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) { - if (callData->argc != 1) + 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) { - if (callData->argc != 1) + 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)))); } /*! @@ -1018,10 +1028,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(); } /*! @@ -1035,15 +1045,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) { - if (callData->argc != 1) + 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(); } /*! @@ -1070,9 +1081,10 @@ 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) { - if (callData->argc < 2 || callData->argc > 3) + QV4::Scope scope(b); + if (callData->argc() < 2 || callData->argc() > 3) THROW_GENERIC_ERROR("Qt.createQmlObject(): Invalid arguments"); struct Error { @@ -1121,7 +1133,7 @@ void QtObject::method_createQmlObject(const BuiltinFunction *, Scope &scope, Cal RETURN_RESULT(Encode::null()); QUrl url; - if (callData->argc > 2) + if (callData->argc() > 2) url = QUrl(callData->args[2].toQStringNoThrow()); else url = QUrl(QLatin1String("inline")); @@ -1174,13 +1186,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); } /*! @@ -1227,9 +1238,10 @@ 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) { - if (callData->argc < 1 || callData->argc > 3) + QV4::Scope scope(b); + if (callData->argc() < 1 || callData->argc() > 3) THROW_GENERIC_ERROR("Qt.createComponent(): Invalid arguments"); QV8Engine *v8engine = scope.engine->v8Engine; @@ -1249,8 +1261,8 @@ void QtObject::method_createComponent(const BuiltinFunction *, Scope &scope, Cal QObject *parentArg = 0; int consumedCount = 1; - if (callData->argc > 1) { - ScopedValue lastArg(scope, callData->args[callData->argc-1]); + if (callData->argc() > 1) { + ScopedValue lastArg(scope, callData->args[callData->argc()-1]); // The second argument could be the mode enum if (callData->args[1].isInteger()) { @@ -1261,11 +1273,11 @@ void QtObject::method_createComponent(const BuiltinFunction *, Scope &scope, Cal consumedCount += 1; } else { // The second argument could be the parent only if there are exactly two args - if ((callData->argc != 2) || !(lastArg->isObject() || lastArg->isNull())) + if ((callData->argc() != 2) || !(lastArg->isObject() || lastArg->isNull())) THROW_GENERIC_ERROR("Qt.createComponent(): Invalid arguments"); } - if (consumedCount < callData->argc) { + if (consumedCount < callData->argc()) { if (lastArg->isObject()) { Scoped<QObjectWrapper> qobjectWrapper(scope, lastArg); if (qobjectWrapper) @@ -1286,7 +1298,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); } /*! @@ -1309,18 +1321,19 @@ 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) + if (callData->argc() > 1) THROW_GENERIC_ERROR("locale() requires 0 or 1 argument"); - if (callData->argc == 1 && !callData->args[0].isString()) + if (callData->argc() == 1 && !callData->args[0].isString()) THROW_TYPE_ERROR_WITH_MESSAGE("locale(): argument (locale code) must be a string"); - if (callData->argc == 1) + 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) @@ -1332,8 +1345,8 @@ void Heap::QQmlBindingFunction::init(const QV4::FunctionObject *originalFunction QQmlSourceLocation QQmlBindingFunction::currentLocation() const { - QV4::StackFrame frame = engine()->currentStackFrame(); - return QQmlSourceLocation(frame.source, frame.line, 0); + QV4::CppStackFrame *frame = engine()->currentStackFrame; + return QQmlSourceLocation(frame->source(), frame->lineNumber(), 0); } DEFINE_OBJECT_VTABLE(QQmlBindingFunction); @@ -1382,20 +1395,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) { - if (callData->argc != 1) + 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) @@ -1408,11 +1423,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) @@ -1425,19 +1441,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); } @@ -1497,15 +1513,16 @@ 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; - if (callData->argc > 0) { + if (callData->argc() > 0) { if (const QObjectWrapper* wrapper = callData->args[0].as<QObjectWrapper>()) { if (QQmlLoggingCategory* category = qobject_cast<QQmlLoggingCategory*>(wrapper->object())) { if (category->category()) @@ -1518,7 +1535,7 @@ static void writeToConsole(const BuiltinFunction *, Scope &scope, CallData *call } - for (int i = start; i < callData->argc; ++i) { + for (int i = start, ei = callData->argc(); i < ei; ++i) { if (i != start) result.append(QLatin1Char(' ')); @@ -1536,10 +1553,10 @@ static void writeToConsole(const BuiltinFunction *, Scope &scope, CallData *call if (!loggingCategory) loggingCategory = v4->qmlEngine() ? &qmlLoggingCategory : &jsLoggingCategory; - QV4::StackFrame frame = v4->currentStackFrame(); - const QByteArray baSource = frame.source.toUtf8(); - const QByteArray baFunction = frame.function.toUtf8(); - QMessageLogger logger(baSource.constData(), frame.line, baFunction.constData(), loggingCategory->categoryName()); + QV4::CppStackFrame *frame = v4->currentStackFrame; + const QByteArray baSource = frame->source().toUtf8(); + const QByteArray baFunction = frame->function().toUtf8(); + QMessageLogger logger(baSource.constData(), frame->lineNumber(), baFunction.constData(), loggingCategory->categoryName()); switch (logType) { case Log: @@ -1562,37 +1579,38 @@ 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::StackFrame frame = v4->currentStackFrame(); - const QByteArray baSource = frame.source.toUtf8(); - const QByteArray baFunction = frame.function.toUtf8(); - QMessageLogger logger(baSource.constData(), frame.line, baFunction.constData()); + QV4::CppStackFrame *frame = v4->currentStackFrame; + const QByteArray baSource = frame->source().toUtf8(); + const QByteArray baFunction = frame->function().toUtf8(); + QMessageLogger logger(baSource.constData(), frame->lineNumber(), baFunction.constData()); QQmlProfilerService *service = QQmlDebugConnector::service<QQmlProfilerService>(); if (!service) { logger.warning("Cannot start profiling because debug service is disabled. Start with -qmljsdebugger=port:XXXXX."); @@ -1601,17 +1619,18 @@ 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::StackFrame frame = v4->currentStackFrame(); - const QByteArray baSource = frame.source.toUtf8(); - const QByteArray baFunction = frame.function.toUtf8(); - QMessageLogger logger(baSource.constData(), frame.line, baFunction.constData()); + QV4::CppStackFrame *frame = v4->currentStackFrame; + const QByteArray baSource = frame->source().toUtf8(); + const QByteArray baFunction = frame->function().toUtf8(); + QMessageLogger logger(baSource.constData(), frame->lineNumber(), baFunction.constData()); QQmlProfilerService *service = QQmlDebugConnector::service<QQmlProfilerService>(); if (!service) { @@ -1621,24 +1640,26 @@ 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) { - if (callData->argc != 1) + QV4::Scope scope(b); + if (callData->argc() != 1) THROW_GENERIC_ERROR("console.time(): Invalid arguments"); QV8Engine *v8engine = scope.engine->v8Engine; 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) { - if (callData->argc != 1) + QV4::Scope scope(b); + if (callData->argc() != 1) THROW_GENERIC_ERROR("console.timeEnd(): Invalid arguments"); QV8Engine *v8engine = scope.engine->v8Engine; @@ -1649,65 +1670,68 @@ 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) + if (callData->argc() > 0) name = callData->args[0].toQStringNoThrow(); + Scope scope(b); QV4::ExecutionEngine *v4 = scope.engine; QV8Engine *v8engine = scope.engine->v8Engine; - QV4::StackFrame frame = v4->currentStackFrame(); + QV4::CppStackFrame *frame = v4->currentStackFrame; - QString scriptName = frame.source; + QString scriptName = frame->source(); - int value = v8engine->consoleCountHelper(scriptName, frame.line, frame.column); + int value = v8engine->consoleCountHelper(scriptName, frame->lineNumber(), -1); QString message = name + QLatin1String(": ") + QString::number(value); - QMessageLogger(qPrintable(scriptName), frame.line, - qPrintable(frame.function)) + QMessageLogger(qPrintable(scriptName), frame->lineNumber(), + 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) { - if (callData->argc != 0) + QV4::Scope scope(b); + if (callData->argc() != 0) THROW_GENERIC_ERROR("console.trace(): Invalid arguments"); QV4::ExecutionEngine *v4 = scope.engine; QString stack = jsStack(v4); - QV4::StackFrame frame = v4->currentStackFrame(); - QMessageLogger(frame.source.toUtf8().constData(), frame.line, - frame.function.toUtf8().constData()) + QV4::CppStackFrame *frame = v4->currentStackFrame; + QMessageLogger(frame->source().toUtf8().constData(), frame->lineNumber(), + 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) { - if (callData->argc == 0) + QV4::Scope scope(b); + if (callData->argc() == 0) THROW_GENERIC_ERROR("console.assert(): Missing argument"); QV4::ExecutionEngine *v4 = scope.engine; if (!callData->args[0].toBoolean()) { QString message; - for (int i = 1; i < callData->argc; ++i) { + for (int i = 1, ei = callData->argc(); i < ei; ++i) { if (i != 1) message.append(QLatin1Char(' ')); @@ -1716,23 +1740,22 @@ void ConsoleObject::method_assert(const BuiltinFunction *, Scope &scope, CallDat QString stack = jsStack(v4); - QV4::StackFrame frame = v4->currentStackFrame(); - QMessageLogger(frame.source.toUtf8().constData(), frame.line, - frame.function.toUtf8().constData()) + QV4::CppStackFrame *frame = v4->currentStackFrame; + QMessageLogger(frame->source().toUtf8().constData(), frame->lineNumber(), + frame->function().toUtf8().constData()) .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) { - if (callData->argc == 0) + 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); } @@ -1788,30 +1811,31 @@ 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) { - if (callData->argc < 2) + QV4::Scope scope(b); + if (callData->argc() < 2) THROW_GENERIC_ERROR("qsTranslate() requires at least two arguments"); if (!callData->args[0].isString()) THROW_GENERIC_ERROR("qsTranslate(): first argument (context) must be a string"); if (!callData->args[1].isString()) THROW_GENERIC_ERROR("qsTranslate(): second argument (sourceText) must be a string"); - if ((callData->argc > 2) && !callData->args[2].isString()) + if ((callData->argc() > 2) && !callData->args[2].isString()) THROW_GENERIC_ERROR("qsTranslate(): third argument (disambiguation) must be a string"); QString context = callData->args[0].toQStringNoThrow(); QString text = callData->args[1].toQStringNoThrow(); QString comment; - if (callData->argc > 2) comment = callData->args[2].toQStringNoThrow(); + if (callData->argc() > 2) comment = callData->args[2].toQStringNoThrow(); int i = 3; - if (callData->argc > i && callData->args[i].isString()) { + if (callData->argc() > i && callData->args[i].isString()) { qWarning("qsTranslate(): specifying the encoding as fourth argument is deprecated"); ++i; } int n = -1; - if (callData->argc > i) + if (callData->argc() > i) n = callData->args[i].toInt32(); QString result = QCoreApplication::translate(context.toUtf8().constData(), @@ -1819,7 +1843,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)); } /*! @@ -1844,12 +1868,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) { - if (callData->argc < 2) - scope.result = QV4::Encode::undefined(); + QV4::Scope scope(b); + if (callData->argc() < 2) + return QV4::Encode::undefined(); else - scope.result = callData->args[1]; + return callData->args[1].asReturnedValue(); } /*! @@ -1869,15 +1894,16 @@ 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) { - if (callData->argc < 1) + QV4::Scope scope(b); + if (callData->argc() < 1) THROW_GENERIC_ERROR("qsTr() requires at least one argument"); if (!callData->args[0].isString()) THROW_GENERIC_ERROR("qsTr(): first argument (sourceText) must be a string"); - if ((callData->argc > 1) && !callData->args[1].isString()) + if ((callData->argc() > 1) && !callData->args[1].isString()) THROW_GENERIC_ERROR("qsTr(): second argument (disambiguation) must be a string"); - if ((callData->argc > 2) && !callData->args[2].isNumber()) + if ((callData->argc() > 2) && !callData->args[2].isNumber()) THROW_GENERIC_ERROR("qsTr(): third argument (n) must be a number"); QString context; @@ -1888,10 +1914,10 @@ void GlobalExtensions::method_qsTr(const BuiltinFunction *, Scope &scope, CallDa int length = lastDot - (lastSlash + 1); context = (lastSlash > -1) ? path.mid(lastSlash + 1, (length > -1) ? length : -1) : QString(); } else { - ExecutionContext *parentCtx = scope.engine->currentContext; + CppStackFrame *frame = scope.engine->currentStackFrame; // The first non-empty source URL in the call stack determines the translation context. - while (!!parentCtx && context.isEmpty()) { - if (CompiledData::CompilationUnit *unit = static_cast<CompiledData::CompilationUnit*>(parentCtx->d()->compilationUnit)) { + while (frame && context.isEmpty()) { + if (CompiledData::CompilationUnit *unit = frame->v4Function->compilationUnit) { QString fileName = unit->fileName(); QUrl url(unit->fileName()); if (url.isValid() && url.isRelative()) { @@ -1903,22 +1929,22 @@ void GlobalExtensions::method_qsTr(const BuiltinFunction *, Scope &scope, CallDa } context = QFileInfo(context).baseName(); } - parentCtx = scope.engine->parentContext(parentCtx); + frame = frame->parent; } } QString text = callData->args[0].toQStringNoThrow(); QString comment; - if (callData->argc > 1) + if (callData->argc() > 1) comment = callData->args[1].toQStringNoThrow(); int n = -1; - if (callData->argc > 2) + if (callData->argc() > 2) n = callData->args[2].toInt32(); 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)); } /*! @@ -1943,12 +1969,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(); + if (callData->argc() < 1) + return QV4::Encode::undefined(); else - scope.result = callData->args[0]; + return callData->args[0].asReturnedValue(); } /*! @@ -1981,20 +2007,21 @@ 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) { - if (callData->argc < 1) + QV4::Scope scope(b); + if (callData->argc() < 1) THROW_GENERIC_ERROR("qsTrId() requires at least one argument"); if (!callData->args[0].isString()) THROW_TYPE_ERROR_WITH_MESSAGE("qsTrId(): first argument (id) must be a string"); - if (callData->argc > 1 && !callData->args[1].isNumber()) + if (callData->argc() > 1 && !callData->args[1].isNumber()) THROW_TYPE_ERROR_WITH_MESSAGE("qsTrId(): second argument (n) must be a number"); int n = -1; - if (callData->argc > 1) + 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))); } /*! @@ -2013,28 +2040,29 @@ 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(); + if (callData->argc() < 1) + 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) { - if (callData->argc != 1) + QV4::Scope scope(b); + if (callData->argc() != 1) THROW_GENERIC_ERROR("String.arg(): Invalid arguments"); QString value = callData->thisObject.toQString(); @@ -2070,10 +2098,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 diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h index 21613b7c10..7d61aa0ada 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h +++ b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h @@ -93,45 +93,45 @@ struct QtObject : Object static ReturnedValue get(const Managed *m, String *name, bool *hasProperty); static void advanceIterator(Managed *m, ObjectIterator *it, Value *name, uint *index, Property *p, PropertyAttributes *attributes); - static void method_isQtObject(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_rgba(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_hsla(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_hsva(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_colorEqual(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_font(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_rect(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_point(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_size(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_vector2d(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_vector3d(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_vector4d(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_quaternion(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_matrix4x4(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_lighter(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_darker(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_tint(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_formatDate(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_formatTime(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_formatDateTime(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_openUrlExternally(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_fontFamilies(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_md5(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_btoa(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_atob(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_quit(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_exit(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_resolvedUrl(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_createQmlObject(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_createComponent(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_locale(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_binding(const BuiltinFunction *, Scope &scope, CallData *callData); - - static void method_get_platform(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_get_application(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_get_inputMethod(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_get_styleHints(const BuiltinFunction *, Scope &scope, CallData *callData); - - static void method_callLater(const BuiltinFunction *, Scope &scope, CallData *callData); + static ReturnedValue method_isQtObject(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_rgba(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_hsla(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_hsva(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_colorEqual(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_font(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_rect(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_point(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_size(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_vector2d(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_vector3d(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_vector4d(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_quaternion(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_matrix4x4(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_lighter(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_darker(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_tint(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_formatDate(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_formatTime(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_formatDateTime(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_openUrlExternally(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_fontFamilies(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_md5(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_btoa(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_atob(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_quit(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_exit(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_resolvedUrl(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_createQmlObject(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_createComponent(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_locale(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_binding(const BuiltinFunction *, CallData *callData); + + static ReturnedValue method_get_platform(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_get_application(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_get_inputMethod(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_get_styleHints(const BuiltinFunction *, CallData *callData); + + static ReturnedValue method_callLater(const BuiltinFunction *, CallData *callData); private: void addAll(); @@ -142,18 +142,18 @@ struct ConsoleObject : Object { V4_OBJECT2(ConsoleObject, Object) - static void method_error(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_log(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_info(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_profile(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_profileEnd(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_time(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_timeEnd(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_count(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_trace(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_warn(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_assert(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_exception(const BuiltinFunction *, Scope &scope, CallData *callData); + static ReturnedValue method_error(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_log(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_info(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_profile(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_profileEnd(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_time(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_timeEnd(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_count(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_trace(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_warn(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_assert(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_exception(const BuiltinFunction *, CallData *callData); }; @@ -161,17 +161,17 @@ struct Q_QML_PRIVATE_EXPORT GlobalExtensions { static void init(Object *globalObject, QJSEngine::Extensions extensions); #if QT_CONFIG(translation) - static void method_qsTranslate(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_qsTranslateNoOp(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_qsTr(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_qsTrNoOp(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_qsTrId(const BuiltinFunction *, Scope &scope, CallData *callData); - static void method_qsTrIdNoOp(const BuiltinFunction *, Scope &scope, CallData *callData); + static ReturnedValue method_qsTranslate(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_qsTranslateNoOp(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_qsTr(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_qsTrNoOp(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_qsTrId(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_qsTrIdNoOp(const BuiltinFunction *, CallData *callData); #endif - static void method_gc(const BuiltinFunction *, Scope &scope, CallData *callData); + static ReturnedValue method_gc(const BuiltinFunction *, CallData *callData); // on String:prototype - static void method_string_arg(const BuiltinFunction *, Scope &scope, CallData *callData); + static ReturnedValue method_string_arg(const BuiltinFunction *, CallData *callData); }; diff --git a/src/qml/qml/v8/qv4domerrors_p.h b/src/qml/qml/v8/qv4domerrors_p.h index a9bdbe01ae..06a70a13e9 100644 --- a/src/qml/qml/v8/qv4domerrors_p.h +++ b/src/qml/qml/v8/qv4domerrors_p.h @@ -78,8 +78,7 @@ QT_BEGIN_NAMESPACE QV4::ScopedValue v(scope, scope.engine->newString(QStringLiteral(string))); \ QV4::ScopedObject ex(scope, scope.engine->newErrorObject(v)); \ ex->put(QV4::ScopedString(scope, scope.engine->newIdentifier(QStringLiteral("code"))), QV4::ScopedValue(scope, QV4::Primitive::fromInt32(error))); \ - scope.result = scope.engine->throwError(ex); \ - return; \ + return scope.engine->throwError(ex); \ } namespace QV4 { diff --git a/src/qml/qml/v8/qv8engine_p.h b/src/qml/qml/v8/qv8engine_p.h index 3bd3517968..a430fba0e6 100644 --- a/src/qml/qml/v8/qv8engine_p.h +++ b/src/qml/qml/v8/qv8engine_p.h @@ -116,8 +116,8 @@ namespace QV4 { class QQmlV4Function { public: - int length() const { return callData->argc; } - QV4::ReturnedValue operator[](int idx) const { return (idx < callData->argc ? callData->args[idx].asReturnedValue() : QV4::Encode::undefined()); } + int length() const { return callData->argc(); } + QV4::ReturnedValue operator[](int idx) const { return (idx < callData->argc() ? callData->args[idx].asReturnedValue() : QV4::Encode::undefined()); } void setReturnValue(QV4::ReturnedValue rv) { *retVal = rv; } QV4::ExecutionEngine *v4engine() const { return e; } private: |