From ae4d4b561481907734c8d6c8df5fb0df8ae5f332 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 1 Nov 2017 14:21:03 +0100 Subject: Convert more builtin methods to new calling convention Convert the methods of the global object and the remaining methods in in the Function object. Change-Id: I7c9a5f39b07f9c9cb0f31e83cdf41fade71a7dc5 Reviewed-by: Erik Verbruggen --- src/qml/jsruntime/qv4functionobject.cpp | 20 +++++------ src/qml/jsruntime/qv4functionobject_p.h | 4 +-- src/qml/jsruntime/qv4globalobject.cpp | 62 ++++++++++++++++----------------- src/qml/jsruntime/qv4globalobject_p.h | 20 +++++------ 4 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp index 56b62bcad2..e6073425d8 100644 --- a/src/qml/jsruntime/qv4functionobject.cpp +++ b/src/qml/jsruntime/qv4functionobject.cpp @@ -277,10 +277,10 @@ void FunctionPrototype::init(ExecutionEngine *engine, Object *ctor) } -ReturnedValue FunctionPrototype::method_toString(const BuiltinFunction *b, CallData *callData) +ReturnedValue FunctionPrototype::method_toString(const FunctionObject *b, const Value *thisObject, const Value *, int) { ExecutionEngine *v4 = b->engine(); - FunctionObject *fun = callData->thisObject.as(); + const FunctionObject *fun = thisObject->as(); if (!fun) return v4->throwTypeError(); @@ -345,20 +345,20 @@ ReturnedValue FunctionPrototype::method_call(const QV4::FunctionObject *b, const return f->call(thisObject, argv, argc); } -ReturnedValue FunctionPrototype::method_bind(const BuiltinFunction *b, CallData *callData) +ReturnedValue FunctionPrototype::method_bind(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc) { QV4::Scope scope(b); - FunctionObject *target = callData->thisObject.as(); + ScopedFunctionObject target(scope, thisObject); if (!target) return scope.engine->throwTypeError(); - ScopedValue boundThis(scope, callData->argument(0)); + ScopedValue boundThis(scope, argc ? argv[0] : Primitive::undefinedValue()); Scoped boundArgs(scope, (Heap::MemberData *)0); - if (callData->argc() > 1) { - boundArgs = MemberData::allocate(scope.engine, callData->argc() - 1); - boundArgs->d()->values.size = callData->argc() - 1; - for (uint i = 0, ei = static_cast(callData->argc() - 1); i < ei; ++i) - boundArgs->set(scope.engine, i, callData->args[i + 1]); + if (argc > 1) { + boundArgs = MemberData::allocate(scope.engine, argc - 1); + boundArgs->d()->values.size = argc - 1; + for (uint i = 0, ei = static_cast(argc - 1); i < ei; ++i) + boundArgs->set(scope.engine, i, argv[i + 1]); } ExecutionContext *global = scope.engine->rootContext(); diff --git a/src/qml/jsruntime/qv4functionobject_p.h b/src/qml/jsruntime/qv4functionobject_p.h index 86137e8e6e..6f787b3e38 100644 --- a/src/qml/jsruntime/qv4functionobject_p.h +++ b/src/qml/jsruntime/qv4functionobject_p.h @@ -197,10 +197,10 @@ struct FunctionPrototype: FunctionObject void init(ExecutionEngine *engine, Object *ctor); - static ReturnedValue method_toString(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); static ReturnedValue method_apply(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); static ReturnedValue method_call(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); - static ReturnedValue method_bind(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_bind(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); }; struct Q_QML_EXPORT BuiltinFunction : FunctionObject { diff --git a/src/qml/jsruntime/qv4globalobject.cpp b/src/qml/jsruntime/qv4globalobject.cpp index 1049c5d3fa..3214a716e8 100644 --- a/src/qml/jsruntime/qv4globalobject.cpp +++ b/src/qml/jsruntime/qv4globalobject.cpp @@ -408,11 +408,11 @@ static inline int toInt(const QChar &qc, int R) } // parseInt [15.1.2.2] -ReturnedValue GlobalFunctions::method_parseInt(const BuiltinFunction *b, CallData *callData) +ReturnedValue GlobalFunctions::method_parseInt(const FunctionObject *b, const Value *, const Value *argv, int argc) { Scope scope(b); - ScopedValue inputString(scope, callData->argument(0)); - ScopedValue radix(scope, callData->argument(1)); + ScopedValue inputString(scope, argc ? argv[0] : Primitive::undefinedValue()); + ScopedValue radix(scope, argc > 1 ? argv[1] : Primitive::undefinedValue()); int R = radix->isUndefined() ? 0 : radix->toInt32(); // [15.1.2.2] step by step: @@ -489,11 +489,11 @@ ReturnedValue GlobalFunctions::method_parseInt(const BuiltinFunction *b, CallDat } // parseFloat [15.1.2.3] -ReturnedValue GlobalFunctions::method_parseFloat(const BuiltinFunction *b, CallData *callData) +ReturnedValue GlobalFunctions::method_parseFloat(const FunctionObject *b, const Value *, const Value *argv, int argc) { Scope scope(b); // [15.1.2.3] step by step: - ScopedString inputString(scope, callData->argument(0), ScopedString::Convert); + ScopedString inputString(scope, argc ? argv[0] : Primitive::undefinedValue(), ScopedString::Convert); CHECK_EXCEPTION(); QString trimmed = inputString->toQString().trimmed(); // 2 @@ -516,41 +516,41 @@ ReturnedValue GlobalFunctions::method_parseFloat(const BuiltinFunction *b, CallD } /// isNaN [15.1.2.4] -ReturnedValue GlobalFunctions::method_isNaN(const BuiltinFunction *, CallData *callData) +ReturnedValue GlobalFunctions::method_isNaN(const FunctionObject *, const Value *, const Value *argv, int argc) { - if (!callData->argc()) + if (!argc) // undefined gets converted to NaN RETURN_RESULT(Encode(true)); - if (callData->args[0].integerCompatible()) + if (argv[0].integerCompatible()) RETURN_RESULT(Encode(false)); - double d = callData->args[0].toNumber(); + double d = argv[0].toNumber(); RETURN_RESULT(Encode((bool)std::isnan(d))); } /// isFinite [15.1.2.5] -ReturnedValue GlobalFunctions::method_isFinite(const BuiltinFunction *, CallData *callData) +ReturnedValue GlobalFunctions::method_isFinite(const FunctionObject *, const Value *, const Value *argv, int argc) { - if (!callData->argc()) + if (!argc) // undefined gets converted to NaN RETURN_RESULT(Encode(false)); - if (callData->args[0].integerCompatible()) + if (argv[0].integerCompatible()) RETURN_RESULT(Encode(true)); - double d = callData->args[0].toNumber(); + double d = argv[0].toNumber(); RETURN_RESULT(Encode((bool)std::isfinite(d))); } /// decodeURI [15.1.3.1] -ReturnedValue GlobalFunctions::method_decodeURI(const BuiltinFunction *b, CallData *callData) +ReturnedValue GlobalFunctions::method_decodeURI(const FunctionObject *b, const Value *, const Value *argv, int argc) { - if (callData->argc() == 0) + if (argc == 0) RETURN_UNDEFINED(); ExecutionEngine *v4 = b->engine(); - QString uriString = callData->args[0].toQString(); + QString uriString = argv[0].toQString(); bool ok; QString out = decode(uriString, DecodeNonReserved, &ok); if (!ok) { @@ -563,13 +563,13 @@ ReturnedValue GlobalFunctions::method_decodeURI(const BuiltinFunction *b, CallDa } /// decodeURIComponent [15.1.3.2] -ReturnedValue GlobalFunctions::method_decodeURIComponent(const BuiltinFunction *b, CallData *callData) +ReturnedValue GlobalFunctions::method_decodeURIComponent(const FunctionObject *b, const Value *, const Value *argv, int argc) { - if (callData->argc() == 0) + if (argc == 0) RETURN_UNDEFINED(); ExecutionEngine *v4 = b->engine(); - QString uriString = callData->args[0].toQString(); + QString uriString = argv[0].toQString(); bool ok; QString out = decode(uriString, DecodeAll, &ok); if (!ok) { @@ -582,13 +582,13 @@ ReturnedValue GlobalFunctions::method_decodeURIComponent(const BuiltinFunction * } /// encodeURI [15.1.3.3] -ReturnedValue GlobalFunctions::method_encodeURI(const BuiltinFunction *b, CallData *callData) +ReturnedValue GlobalFunctions::method_encodeURI(const FunctionObject *b, const Value *, const Value *argv, int argc) { - if (callData->argc() == 0) + if (argc == 0) RETURN_UNDEFINED(); ExecutionEngine *v4 = b->engine(); - QString uriString = callData->args[0].toQString(); + QString uriString = argv[0].toQString(); bool ok; QString out = encode(uriString, uriUnescapedReserved, &ok); if (!ok) { @@ -601,13 +601,13 @@ ReturnedValue GlobalFunctions::method_encodeURI(const BuiltinFunction *b, CallDa } /// encodeURIComponent [15.1.3.4] -ReturnedValue GlobalFunctions::method_encodeURIComponent(const BuiltinFunction *b, CallData *callData) +ReturnedValue GlobalFunctions::method_encodeURIComponent(const FunctionObject *b, const Value *, const Value *argv, int argc) { - if (callData->argc() == 0) + if (argc == 0) RETURN_UNDEFINED(); ExecutionEngine *v4 = b->engine(); - QString uriString = callData->args[0].toQString(); + QString uriString = argv[0].toQString(); bool ok; QString out = encode(uriString, uriUnescaped, &ok); if (!ok) { @@ -619,22 +619,22 @@ ReturnedValue GlobalFunctions::method_encodeURIComponent(const BuiltinFunction * RETURN_RESULT(v4->newString(out)); } -ReturnedValue GlobalFunctions::method_escape(const BuiltinFunction *b, CallData *callData) +ReturnedValue GlobalFunctions::method_escape(const FunctionObject *b, const Value *, const Value *argv, int argc) { ExecutionEngine *v4 = b->engine(); - if (!callData->argc()) + if (!argc) RETURN_RESULT(v4->newString(QStringLiteral("undefined"))); - QString str = callData->args[0].toQString(); + QString str = argv[0].toQString(); RETURN_RESULT(v4->newString(escape(str))); } -ReturnedValue GlobalFunctions::method_unescape(const BuiltinFunction *b, CallData *callData) +ReturnedValue GlobalFunctions::method_unescape(const FunctionObject *b, const Value *, const Value *argv, int argc) { ExecutionEngine *v4 = b->engine(); - if (!callData->argc()) + if (!argc) RETURN_RESULT(v4->newString(QStringLiteral("undefined"))); - QString str = callData->args[0].toQString(); + QString str = argv[0].toQString(); RETURN_RESULT(v4->newString(unescape(str))); } diff --git a/src/qml/jsruntime/qv4globalobject_p.h b/src/qml/jsruntime/qv4globalobject_p.h index af72d3af2f..fd1820c23c 100644 --- a/src/qml/jsruntime/qv4globalobject_p.h +++ b/src/qml/jsruntime/qv4globalobject_p.h @@ -76,16 +76,16 @@ struct Q_QML_EXPORT EvalFunction : FunctionObject struct GlobalFunctions { - static ReturnedValue method_parseInt(const BuiltinFunction *, CallData *callData); - static ReturnedValue method_parseFloat(const BuiltinFunction *, CallData *callData); - static ReturnedValue method_isNaN(const BuiltinFunction *, CallData *callData); - static ReturnedValue method_isFinite(const BuiltinFunction *, CallData *callData); - static ReturnedValue method_decodeURI(const BuiltinFunction *, CallData *callData); - static ReturnedValue method_decodeURIComponent(const BuiltinFunction *, CallData *callData); - static ReturnedValue method_encodeURI(const BuiltinFunction *, CallData *callData); - static ReturnedValue method_encodeURIComponent(const BuiltinFunction *, CallData *callData); - static ReturnedValue method_escape(const BuiltinFunction *, CallData *callData); - static ReturnedValue method_unescape(const BuiltinFunction *, CallData *callData); + static ReturnedValue method_parseInt(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_parseFloat(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_isNaN(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_isFinite(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_decodeURI(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_decodeURIComponent(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_encodeURI(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_encodeURIComponent(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_escape(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_unescape(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); }; } -- cgit v1.2.3