diff options
Diffstat (limited to 'src/qmlcompiler/qqmljscompiler.cpp')
| -rw-r--r-- | src/qmlcompiler/qqmljscompiler.cpp | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/src/qmlcompiler/qqmljscompiler.cpp b/src/qmlcompiler/qqmljscompiler.cpp index 6514caad6f..2cc32fc63d 100644 --- a/src/qmlcompiler/qqmljscompiler.cpp +++ b/src/qmlcompiler/qqmljscompiler.cpp @@ -10,6 +10,7 @@ #include <private/qqmljsimportvisitor_p.h> #include <private/qqmljslexer_p.h> #include <private/qqmljsloadergenerator_p.h> +#include <private/qqmljsoptimizations_p.h> #include <private/qqmljsparser_p.h> #include <private/qqmljsshadowcheck_p.h> #include <private/qqmljsstoragegeneralizer_p.h> @@ -774,32 +775,38 @@ QQmlJSAotFunction QQmlJSAotCompiler::doCompile( return QQmlJSAotFunction(); }; - QQmlJSTypePropagator propagator(m_unitGenerator, &m_typeResolver, m_logger); - auto typePropagationResult = propagator.run(function, error); if (error->isValid()) return compileError(); - QQmlJSShadowCheck shadowCheck(m_unitGenerator, &m_typeResolver, m_logger); - shadowCheck.run(&typePropagationResult, function, error); + bool basicBlocksValidationFailed = false; + QQmlJSBasicBlocks basicBlocks(context, m_unitGenerator, &m_typeResolver, m_logger); + auto passResult = basicBlocks.run(function, m_flags, basicBlocksValidationFailed); + auto &[blocks, annotations] = passResult; + + QQmlJSTypePropagator propagator(m_unitGenerator, &m_typeResolver, m_logger, blocks, annotations); + passResult = propagator.run(function, error); if (error->isValid()) return compileError(); - bool basicBlocksValidationFailed = false; - QQmlJSBasicBlocks basicBlocks(context, m_unitGenerator, &m_typeResolver, m_logger); - typePropagationResult = basicBlocks.run(function, typePropagationResult, error, m_flags, basicBlocksValidationFailed); + QQmlJSShadowCheck shadowCheck(m_unitGenerator, &m_typeResolver, m_logger, blocks, annotations); + passResult = shadowCheck.run(function, error); + if (error->isValid()) + return compileError(); + + QQmlJSOptimizations optimizer(m_unitGenerator, &m_typeResolver, m_logger, blocks, annotations, + basicBlocks.objectAndArrayDefinitions()); + passResult = optimizer.run(function, error); if (error->isValid()) return compileError(); // Generalize all arguments, registers, and the return type. - QQmlJSStorageGeneralizer generalizer( - m_unitGenerator, &m_typeResolver, m_logger); - typePropagationResult = generalizer.run(typePropagationResult, function, error); + QQmlJSStorageGeneralizer generalizer(m_unitGenerator, &m_typeResolver, m_logger, blocks, annotations); + passResult = generalizer.run(function, error); if (error->isValid()) return compileError(); - QQmlJSCodeGenerator codegen( - context, m_unitGenerator, &m_typeResolver, m_logger); - QQmlJSAotFunction result = codegen.run(function, &typePropagationResult, error, basicBlocksValidationFailed); + QQmlJSCodeGenerator codegen(context, m_unitGenerator, &m_typeResolver, m_logger, blocks, annotations); + QQmlJSAotFunction result = codegen.run(function, error, basicBlocksValidationFailed); return error->isValid() ? compileError() : result; } |
