23QQmlJSCompilePass::BlocksAndAnnotations QQmlJSStorageGeneralizer::run(Function *function)
25 m_function = function;
27 if (QQmlJSRegisterContent &returnType = function->returnType; returnType.isValid()) {
28 if (QQmlJSScope::ConstPtr stored = m_typeResolver->genericType(
29 returnType.storedType(), QQmlJSTypeResolver::ComponentIsGeneric::Yes)) {
30 m_pool->generalizeType(returnType.storage(), stored);
32 addError(QStringLiteral(
"Cannot store the return type %1.")
33 .arg(returnType.storedType()->internalName()));
38 const auto transformRegister = [&](QQmlJSRegisterContent &content) {
39 QQmlJSRegisterContent specific = content.storage();
40 if (specific.isValid())
41 m_typeResolver->generalizeType(specific);
44 const auto transformRegisters = [&](VirtualRegisters ®isters) {
45 for (
auto j = registers.begin(), jEnd = registers.end(); j != jEnd; ++j) {
46 QQmlJSRegisterContent &content = j.value().content;
47 transformRegister(content);
51 for (QQmlJSRegisterContent &argument : function->argumentTypes) {
52 Q_ASSERT(argument.isValid());
53 transformRegister(argument);
56 for (
auto i = m_annotations.begin(), iEnd = m_annotations.end(); i != iEnd; ++i) {
57 transformRegister(i->second.changedRegister);
58 transformRegisters(i->second.typeConversions);
59 transformRegisters(i->second.readRegisters);
62 return { std::move(m_basicBlocks), std::move(m_annotations) };