diff options
author | Ulf Hermann <[email protected]> | 2020-11-23 09:45:35 +0100 |
---|---|---|
committer | Ulf Hermann <[email protected]> | 2020-11-23 10:42:57 +0100 |
commit | 755a4bac045ffdad8f7f00805406eef66b57d3f4 (patch) | |
tree | 829f5c258676f2520e0e4470c40d2d76ff28782e /src/qml/jsruntime/qv4vme_moth.cpp | |
parent | 588d624837ae0174139f8db930ad20612463b1dd (diff) |
Don't call alloca(0)
Apparently that's not a good idea.
Change-Id: Ic49f6d40135f65e39725acd7a745d17917b64be3
Reviewed-by: Maximilian Goldstein <[email protected]>
Reviewed-by: Fabian Kosmale <[email protected]>
Diffstat (limited to 'src/qml/jsruntime/qv4vme_moth.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4vme_moth.cpp | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp index ebc018a595..581282c316 100644 --- a/src/qml/jsruntime/qv4vme_moth.cpp +++ b/src/qml/jsruntime/qv4vme_moth.cpp @@ -462,20 +462,31 @@ ReturnedValue VME::exec(CppStackFrame *frame, ExecutionEngine *engine) result = function->jittedCode(frame, engine); } else if (function->aotFunction) { const qsizetype numFunctionArguments = function->aotFunction->argumentTypes.size(); - Q_ALLOCA_VAR(void *, argumentPtrs, numFunctionArguments * sizeof(void *)); - - for (qsizetype i = 0; i < numFunctionArguments; ++i) { - const QMetaType argumentType = function->aotFunction->argumentTypes[i]; - Q_ALLOCA_VAR(void, argument, argumentType.sizeOf()); - if (i < frame->originalArgumentsCount) - engine->metaTypeFromJS(frame->originalArguments[i], argumentType.id(), argument); - else - argumentType.construct(argument); - argumentPtrs[i] = argument; + Q_ALLOCA_DECLARE(void *, argumentPtrs); + + if (numFunctionArguments > 0) { + Q_ALLOCA_ASSIGN(void *, argumentPtrs, numFunctionArguments * sizeof(void *)); + for (qsizetype i = 0; i < numFunctionArguments; ++i) { + const QMetaType argumentType = function->aotFunction->argumentTypes[i]; + if (const qsizetype argumentSize = argumentType.sizeOf()) { + Q_ALLOCA_VAR(void, argument, argumentSize); + if (i < frame->originalArgumentsCount) { + engine->metaTypeFromJS(frame->originalArguments[i], argumentType.id(), + argument); + } else { + argumentType.construct(argument); + } + argumentPtrs[i] = argument; + } else { + argumentPtrs[i] = nullptr; + } + } } + Q_ALLOCA_DECLARE(void, returnValue); const QMetaType returnType = function->aotFunction->returnType; - Q_ALLOCA_VAR(void, returnValue, returnType.sizeOf()); + if (const qsizetype returnSize = returnType.sizeOf()) + Q_ALLOCA_ASSIGN(void, returnValue, returnSize); Scope scope(engine); Scoped<QmlContext> qmlContext(scope, engine->qmlContext()); @@ -483,9 +494,13 @@ ReturnedValue VME::exec(CppStackFrame *frame, ExecutionEngine *engine) qmlContext->qmlContext()->asQQmlContext(), qmlContext->qmlScope(), returnValue, const_cast<const void **>(argumentPtrs)); // We're adding const here - result = engine->metaTypeToJS(returnType.id(), returnValue); + if (returnValue) { + result = engine->metaTypeToJS(returnType.id(), returnValue); + returnType.destruct(returnValue); + } else { + result = Encode::undefined(); + } - returnType.destruct(returnValue); for (qsizetype i = 0; i < numFunctionArguments; ++i) function->aotFunction->argumentTypes[i].destruct(argumentPtrs[i]); } else { |