diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2022-09-27 14:13:57 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2022-09-29 18:19:06 +0200 |
commit | 4bc3f64b0edc5f097ca7cad4a89a535db67aa266 (patch) | |
tree | 7aceecf29a4347167db3ce1572c7bf5e456f6272 /src/qml/jsruntime | |
parent | 435d587e74ee7a726ccc29e137cd0032a16383b2 (diff) |
V4: Use an enum to categorize functions and rename aotFunction
We want to use the aotFunction member also for typed JavaScript
functions.
Change-Id: Iad6d12ebed3ad3069832484137ed8e4d9e7a7cf4
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r-- | src/qml/jsruntime/qv4engine_p.h | 3 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4executablecompilationunit.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4function.cpp | 13 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4function_p.h | 9 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4functionobject.cpp | 7 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4globalobject.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4jscall_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4vme_moth.cpp | 14 |
9 files changed, 30 insertions, 26 deletions
diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index 1bca525584..8d27d1b719 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -657,7 +657,8 @@ public: if (!m_canAllocateExecutableMemory) return false; if (f) { - return !f->aotFunction && !f->isGenerator() + return f->kind != Function::AotCompiled + && !f->isGenerator() && f->interpreterCallCount >= s_jitCallCountThreshold; } return true; diff --git a/src/qml/jsruntime/qv4executablecompilationunit.cpp b/src/qml/jsruntime/qv4executablecompilationunit.cpp index 81716d2f0f..0a3033a567 100644 --- a/src/qml/jsruntime/qv4executablecompilationunit.cpp +++ b/src/qml/jsruntime/qv4executablecompilationunit.cpp @@ -179,10 +179,10 @@ QV4::Function *ExecutableCompilationUnit::linkToEngine(ExecutionEngine *engine) runtimeFunctions.resize(data->functionTableSize); static bool forceInterpreter = qEnvironmentVariableIsSet("QV4_FORCE_INTERPRETER"); - const QQmlPrivate::AOTCompiledFunction *aotFunction + const QQmlPrivate::TypedFunction *aotFunction = forceInterpreter ? nullptr : aotCompiledFunctions; - auto advanceAotFunction = [&](int i) -> const QQmlPrivate::AOTCompiledFunction * { + auto advanceAotFunction = [&](int i) -> const QQmlPrivate::TypedFunction * { if (aotFunction) { if (aotFunction->functionPtr) { if (aotFunction->extraData == i) diff --git a/src/qml/jsruntime/qv4function.cpp b/src/qml/jsruntime/qv4function.cpp index e9cececbdd..666bd3a0de 100644 --- a/src/qml/jsruntime/qv4function.cpp +++ b/src/qml/jsruntime/qv4function.cpp @@ -22,7 +22,7 @@ using namespace QV4; bool Function::call(QObject *thisObject, void **a, const QMetaType *types, int argc, ExecutionContext *context) { - if (!aotFunction) { + if (kind != AotCompiled) { return QV4::convertAndCall( context->engine(), thisObject, a, types, argc, [this, context](const Value *thisObject, const Value *argv, int argc) { @@ -41,9 +41,9 @@ bool Function::call(QObject *thisObject, void **a, const QMetaType *types, int a ReturnedValue Function::call( const Value *thisObject, const Value *argv, int argc, ExecutionContext *context) { - if (aotFunction) { + if (kind == AotCompiled) { return QV4::convertAndCall( - context->engine(), aotFunction, thisObject, argv, argc, + context->engine(), typedFunction, thisObject, argv, argc, [this, context](QObject *thisObject, void **a, const QMetaType *types, int argc) { call(thisObject, a, types, argc, context); @@ -64,7 +64,7 @@ ReturnedValue Function::call( Function *Function::create(ExecutionEngine *engine, ExecutableCompilationUnit *unit, const CompiledData::Function *function, - const QQmlPrivate::AOTCompiledFunction *aotFunction) + const QQmlPrivate::TypedFunction *aotFunction) { return new Function(engine, unit, function, aotFunction); } @@ -76,13 +76,14 @@ void Function::destroy() Function::Function(ExecutionEngine *engine, ExecutableCompilationUnit *unit, const CompiledData::Function *function, - const QQmlPrivate::AOTCompiledFunction *aotFunction) + const QQmlPrivate::TypedFunction *aotFunction) : FunctionData(unit) , compiledFunction(function) , codeData(function->code()) , jittedCode(nullptr) , codeRef(nullptr) - , aotFunction(aotFunction) + , typedFunction(aotFunction) + , kind(aotFunction ? AotCompiled : JsUntyped) { Scope scope(engine); Scoped<InternalClass> ic(scope, engine->internalClasses(EngineBase::Class_CallContext)); diff --git a/src/qml/jsruntime/qv4function_p.h b/src/qml/jsruntime/qv4function_p.h index 67d31b6c6c..181c88a1e2 100644 --- a/src/qml/jsruntime/qv4function_p.h +++ b/src/qml/jsruntime/qv4function_p.h @@ -47,7 +47,7 @@ Q_STATIC_ASSERT(std::is_standard_layout< FunctionData >::value); struct Q_QML_EXPORT Function : public FunctionData { protected: Function(ExecutionEngine *engine, ExecutableCompilationUnit *unit, - const CompiledData::Function *function, const QQmlPrivate::AOTCompiledFunction *aotFunction); + const CompiledData::Function *function, const QQmlPrivate::TypedFunction *aotFunction); ~Function(); public: @@ -74,18 +74,19 @@ public: typedef ReturnedValue (*JittedCode)(CppStackFrame *, ExecutionEngine *); JittedCode jittedCode; JSC::MacroAssemblerCodeRef *codeRef; - const QQmlPrivate::AOTCompiledFunction *aotFunction = nullptr; + const QQmlPrivate::TypedFunction *typedFunction = nullptr; // first nArguments names in internalClass are the actual arguments Heap::InternalClass *internalClass; int interpreterCallCount = 0; quint16 nFormals; - bool isEval = false; + enum Kind : quint8 { JsUntyped, JsTyped, AotCompiled, Eval }; + Kind kind = JsUntyped; bool detectedInjectedParameters = false; static Function *create(ExecutionEngine *engine, ExecutableCompilationUnit *unit, const CompiledData::Function *function, - const QQmlPrivate::AOTCompiledFunction *aotFunction); + const QQmlPrivate::TypedFunction *aotFunction); void destroy(); // used when dynamically assigning signal handlers (QQmlConnection) diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp index 437f57e43f..a1d0c94b83 100644 --- a/src/qml/jsruntime/qv4functionobject.cpp +++ b/src/qml/jsruntime/qv4functionobject.cpp @@ -495,7 +495,7 @@ DEFINE_OBJECT_VTABLE(ArrowFunction); void ArrowFunction::virtualCallWithMetaTypes(const FunctionObject *fo, QObject *thisObject, void **a, const QMetaType *types, int argc) { - if (!fo->function()->aotFunction) { + if (fo->function()->kind != Function::AotCompiled) { QV4::convertAndCall(fo->engine(), thisObject, a, types, argc, [fo](const Value *thisObject, const Value *argv, int argc) { return ArrowFunction::virtualCall(fo, thisObject, argv, argc); @@ -514,9 +514,10 @@ void ArrowFunction::virtualCallWithMetaTypes(const FunctionObject *fo, QObject * ReturnedValue ArrowFunction::virtualCall(const FunctionObject *fo, const Value *thisObject, const Value *argv, int argc) { - if (const auto *aotFunction = fo->function()->aotFunction) { + Function *function = fo->function(); + if (function->kind == Function::AotCompiled) { return QV4::convertAndCall( - fo->engine(), aotFunction, thisObject, argv, argc, + fo->engine(), function->typedFunction, thisObject, argv, argc, [fo](QObject *thisObject, void **a, const QMetaType *types, int argc) { ArrowFunction::virtualCallWithMetaTypes(fo, thisObject, a, types, argc); }); diff --git a/src/qml/jsruntime/qv4globalobject.cpp b/src/qml/jsruntime/qv4globalobject.cpp index 7e016cf8fc..5357b72477 100644 --- a/src/qml/jsruntime/qv4globalobject.cpp +++ b/src/qml/jsruntime/qv4globalobject.cpp @@ -328,7 +328,7 @@ ReturnedValue EvalFunction::evalCall(const Value *, const Value *argv, int argc, Function *function = script.function(); if (!function) return Encode::undefined(); - function->isEval = true; + function->kind = Function::Eval; if (function->isStrict() || isStrict) { ScopedFunctionObject e(scope, FunctionObject::createScriptFunction(ctx, function)); diff --git a/src/qml/jsruntime/qv4jscall_p.h b/src/qml/jsruntime/qv4jscall_p.h index cf62f2549e..27c9cfe052 100644 --- a/src/qml/jsruntime/qv4jscall_p.h +++ b/src/qml/jsruntime/qv4jscall_p.h @@ -125,7 +125,7 @@ private: template<typename Callable> ReturnedValue convertAndCall( - ExecutionEngine *engine, const QQmlPrivate::AOTCompiledFunction *aotFunction, + ExecutionEngine *engine, const QQmlPrivate::TypedFunction *aotFunction, const Value *thisObject, const Value *argv, int argc, Callable call) { const qsizetype numFunctionArguments = aotFunction->argumentTypes.size(); diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index f1f26ee53a..01ee03bddc 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -1039,7 +1039,7 @@ static Object *getSuperBase(Scope &scope) if (CallContext *c = ctx->asCallContext()) { f = c->d()->function; QV4::Function *fn = f->function(); - if (fn && !fn->isArrowFunction() && !fn->isEval) + if (fn && !fn->isArrowFunction() && fn->kind != Function::Eval) break; } ctx = ctx->d()->outer; diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp index fa699b0e5e..5d86f44fbf 100644 --- a/src/qml/jsruntime/qv4vme_moth.cpp +++ b/src/qml/jsruntime/qv4vme_moth.cpp @@ -404,18 +404,18 @@ void VME::exec(MetaTypesStackFrame *frame, ExecutionEngine *engine) ExecutionEngineCallDepthRecorder executionEngineCallDepthRecorder(engine); Function *function = frame->v4Function; - Q_ASSERT(function->aotFunction); + Q_ASSERT(function->typedFunction); Q_TRACE_SCOPE(QQmlV4_function_call, engine, function->name()->toQString(), function->executableCompilationUnit()->fileName(), function->compiledFunction->location.line(), function->compiledFunction->location.column()); Profiling::FunctionCallProfiler profiler(engine, function); // start execution profiling - const qsizetype numFunctionArguments = function->aotFunction->argumentTypes.size(); + const qsizetype numFunctionArguments = function->typedFunction->argumentTypes.size(); Q_ALLOCA_DECLARE(void *, transformedArguments); for (qsizetype i = 0; i < numFunctionArguments; ++i) { - const QMetaType argumentType = function->aotFunction->argumentTypes[i]; + const QMetaType argumentType = function->typedFunction->argumentTypes[i]; if (frame->argc() > i && argumentType == frame->argTypes()[i]) continue; @@ -450,7 +450,7 @@ void VME::exec(MetaTypesStackFrame *frame, ExecutionEngine *engine) transformedArguments[i] = arg; } - const QMetaType returnType = function->aotFunction->returnType; + const QMetaType returnType = function->typedFunction->returnType; const QMetaType frameReturn = frame->returnType(); Q_ALLOCA_DECLARE(void, transformedResult); if (frame->returnValue() && returnType != frameReturn) { @@ -470,7 +470,7 @@ void VME::exec(MetaTypesStackFrame *frame, ExecutionEngine *engine) aotContext.engine = engine->jsEngine(); aotContext.compilationUnit = function->executableCompilationUnit(); - function->aotFunction->functionPtr( + function->typedFunction->functionPtr( &aotContext, transformedResult ? transformedResult : frame->returnValue(), transformedArguments ? transformedArguments : frame->argv()); @@ -498,7 +498,7 @@ void VME::exec(MetaTypesStackFrame *frame, ExecutionEngine *engine) if (arg == nullptr) continue; if (i >= frame->argc() || arg != frame->argv()[i]) - function->aotFunction->argumentTypes[i].destruct(arg); + function->typedFunction->argumentTypes[i].destruct(arg); } } } @@ -535,7 +535,7 @@ ReturnedValue VME::exec(JSTypesStackFrame *frame, ExecutionEngine *engine) debugger->enteringFunction(); ReturnedValue result; - Q_ASSERT(!function->aotFunction); + Q_ASSERT(function->kind != Function::AotCompiled); if (function->jittedCode != nullptr && debugger == nullptr) { result = function->jittedCode(frame, engine); } else { |