20QQmlJSCompilePass::BlocksAndAnnotations QQmlJSStorageInitializer::run(Function *function)
22 m_function = function;
24 if (QQmlJSRegisterContent &returnType = function->returnType; returnType.isValid()) {
25 if (
const QQmlJSScope::ConstPtr stored
26 = m_typeResolver->storedType(returnType.containedType())) {
27 m_pool->storeType(returnType, stored);
29 addError(QStringLiteral(
"Cannot store the return type %1.")
30 .arg(returnType.containedType()->internalName()));
35 const auto storeRegister = [&](QQmlJSRegisterContent &content) {
36 if (!content.isValid() || !content.storage().isNull())
39 const QQmlJSScope::ConstPtr original = m_typeResolver->originalContainedType(content);
40 if (
const QQmlJSScope::ConstPtr originalStored = m_typeResolver->storedType(original)) {
41 m_pool->storeType(content, originalStored);
43 addError(QStringLiteral(
"Cannot store type %1.").arg(original->internalName()));
47 const QQmlJSScope::ConstPtr contentContained = content.containedType();
48 const QQmlJSScope::ConstPtr adjustedStored = m_typeResolver->storedType(contentContained);
49 if (!adjustedStored) {
50 addError(QStringLiteral(
"Cannot store type %1.")
51 .arg(contentContained->internalName()));
55 if (!m_typeResolver->adjustTrackedType(content.storage(), adjustedStored)) {
56 addError(QStringLiteral(
"Cannot adjust stored type for %1 to %2.")
57 .arg(contentContained->internalName(), adjustedStored->internalName()));
61 const auto storeRegisters = [&](VirtualRegisters ®isters) {
62 for (
auto j = registers.begin(), jEnd = registers.end(); j != jEnd; ++j)
63 storeRegister(j.value().content);
66 storeRegister(function->qmlScope);
68 for (QQmlJSRegisterContent &argument : function->argumentTypes) {
69 Q_ASSERT(argument.isValid());
70 storeRegister(argument);
73 for (QQmlJSRegisterContent &argument : function->registerTypes) {
74 Q_ASSERT(argument.isValid());
75 storeRegister(argument);
78 for (
auto i = m_annotations.begin(), iEnd = m_annotations.end(); i != iEnd; ++i) {
79 storeRegister(i->second.changedRegister);
80 storeRegisters(i->second.typeConversions);
81 storeRegisters(i->second.readRegisters);
84 return { std::move(m_basicBlocks), std::move(m_annotations) };