1307void IRBuilder::setBindingValue(QV4::CompiledData::Binding *binding, QQmlJS::AST::Statement *statement, QQmlJS::AST::Node *parentNode)
1309 QQmlJS::SourceLocation loc = statement->firstSourceLocation();
1310 binding->valueLocation.set(loc.startLine, loc.startColumn);
1311 binding->setType(QV4::CompiledData::Binding::Type_Invalid);
1312 if (_propertyDeclaration && _propertyDeclaration->isReadOnly())
1313 binding->setFlag(QV4::CompiledData::Binding::InitializerForReadOnlyDeclaration);
1315 QQmlJS::AST::ExpressionStatement *exprStmt = QQmlJS::AST::cast<QQmlJS::AST::ExpressionStatement *>(statement);
1317 QQmlJS::AST::ExpressionNode *
const expr = exprStmt->expression;
1318 if (QQmlJS::AST::StringLiteral *lit = QQmlJS::AST::cast<QQmlJS::AST::StringLiteral *>(expr)) {
1319 binding->setType(QV4::CompiledData::Binding::Type_String);
1320 binding->stringIndex = registerString(lit->value.toString());
1321 }
else if (QQmlJS::AST::TemplateLiteral *templateLit = QQmlJS::AST::cast<QQmlJS::AST::TemplateLiteral *>(expr);
1322 templateLit && templateLit->hasNoSubstitution) {
1325 binding->setType(QV4::CompiledData::Binding::Type_String);
1326 binding->stringIndex = registerString(templateLit->value.toString());
1327 }
else if (expr->kind == QQmlJS::AST::Node::Kind_TrueLiteral) {
1328 binding->setType(QV4::CompiledData::Binding::Type_Boolean);
1329 binding->value.b =
true;
1330 }
else if (expr->kind == QQmlJS::AST::Node::Kind_FalseLiteral) {
1331 binding->setType(QV4::CompiledData::Binding::Type_Boolean);
1332 binding->value.b =
false;
1333 }
else if (QQmlJS::AST::NumericLiteral *lit = QQmlJS::AST::cast<QQmlJS::AST::NumericLiteral *>(expr)) {
1334 binding->setType(QV4::CompiledData::Binding::Type_Number);
1335 binding->value.constantValueIndex = jsGenerator->registerConstant(QV4::Encode(lit->value));
1336 }
else if (QQmlJS::AST::CallExpression *call = QQmlJS::AST::cast<QQmlJS::AST::CallExpression *>(expr)) {
1337 if (QQmlJS::AST::IdentifierExpression *base = QQmlJS::AST::cast<QQmlJS::AST::IdentifierExpression *>(call->base)) {
1338 tryGeneratingTranslationBinding(base->name, call->arguments, binding);
1342 }
else if (QQmlJS::AST::cast<QQmlJS::AST::FunctionExpression *>(expr)) {
1343 binding->setFlag(QV4::CompiledData::Binding::IsFunctionExpression);
1344 }
else if (QQmlJS::AST::UnaryMinusExpression *unaryMinus = QQmlJS::AST::cast<QQmlJS::AST::UnaryMinusExpression *>(expr)) {
1345 if (QQmlJS::AST::NumericLiteral *lit = QQmlJS::AST::cast<QQmlJS::AST::NumericLiteral *>(unaryMinus->expression)) {
1346 binding->setType(QV4::CompiledData::Binding::Type_Number);
1347 binding->value.constantValueIndex = jsGenerator->registerConstant(QV4::Encode(-lit->value));
1349 }
else if (QQmlJS::AST::cast<QQmlJS::AST::NullExpression *>(expr)) {
1350 binding->setType(QV4::CompiledData::Binding::Type_Null);
1351 binding->value.nullMarker = 0;
1356 if (binding->type() == QV4::CompiledData::Binding::Type_Invalid) {
1357 binding->setType(QV4::CompiledData::Binding::Type_Script);
1359 CompiledFunctionOrExpression *expr = New<CompiledFunctionOrExpression>();
1360 expr->node = statement;
1361 expr->parentNode = parentNode;
1362 expr->nameIndex = registerString(QLatin1String(
"expression for ")
1363 + stringAt(binding->propertyNameIndex));
1364 const int index = bindingsTarget()->functionsAndExpressions->append(expr);
1365 binding->value.compiledScriptIndex = index;
1370 QQmlJS::AST::Node *nodeForString = statement;
1372 nodeForString = exprStmt->expression;
1373 if (asStringRef(nodeForString) == u"undefined")
1374 binding->stringIndex = registerString(u"undefined"_s);
1376 binding->stringIndex = emptyStringIndex;
1605bool IRBuilder::resolveQualifiedId(QQmlJS::AST::UiQualifiedId **nameToResolve, Object **object,
bool onAssignment)
1607 QQmlJS::AST::UiQualifiedId *qualifiedIdElement = *nameToResolve;
1609 if (qualifiedIdElement->name == QLatin1String(
"id") && qualifiedIdElement->next)
1610 COMPILE_EXCEPTION(qualifiedIdElement->identifierToken, tr(
"Invalid use of id property"));
1613 QString currentName = qualifiedIdElement->name.toString();
1614 if (qualifiedIdElement->next) {
1615 for (
const QV4::CompiledData::Import* import : std::as_const(_imports))
1616 if (import->qualifierIndex != emptyStringIndex
1617 && stringAt(import->qualifierIndex) == currentName) {
1618 qualifiedIdElement = qualifiedIdElement->next;
1619 currentName += QLatin1Char(
'.') + qualifiedIdElement->name;
1621 if (!qualifiedIdElement->name.data()->isUpper())
1622 COMPILE_EXCEPTION(qualifiedIdElement->firstSourceLocation(), tr(
"Expected type name"));
1629 while (qualifiedIdElement->next) {
1630 const quint32 propertyNameIndex = registerString(currentName);
1631 const bool isAttachedProperty = qualifiedIdElement->name.data()->isUpper();
1633 Binding *binding = (*object)->findBinding(propertyNameIndex);
1635 if (isAttachedProperty) {
1636 if (!binding->isAttachedProperty())
1638 }
else if (!binding->isGroupProperty()) {
1643 binding = New<Binding>();
1644 binding->propertyNameIndex = propertyNameIndex;
1645 binding->offset = qualifiedIdElement->identifierToken.offset;
1646 binding->location.set(qualifiedIdElement->identifierToken.startLine,
1647 qualifiedIdElement->identifierToken.startColumn);
1648 binding->valueLocation.set(qualifiedIdElement->next->identifierToken.startLine,
1649 qualifiedIdElement->next->identifierToken.startColumn);
1650 binding->clearFlags();
1653 binding->setFlag(QV4::CompiledData::Binding::IsOnAssignment);
1655 if (isAttachedProperty)
1656 binding->setType(QV4::CompiledData::Binding::Type_AttachedProperty);
1658 binding->setType(QV4::CompiledData::Binding::Type_GroupProperty);
1661 if (!defineQMLObject(&objIndex,
nullptr, binding->location,
nullptr,
nullptr))
1663 binding->value.objectIndex = objIndex;
1665 QString error = (*object)->appendBinding(binding,
false);
1666 if (!error.isEmpty()) {
1667 recordError(qualifiedIdElement->identifierToken, error);
1670 *object = _objects.at(objIndex);
1672 Q_ASSERT(binding->isAttachedProperty() || binding->isGroupProperty());
1673 *object = _objects.at(binding->value.objectIndex);
1676 qualifiedIdElement = qualifiedIdElement->next;
1677 if (qualifiedIdElement)
1678 currentName = qualifiedIdElement->name.toString();
1680 *nameToResolve = qualifiedIdElement;
1728void QmlUnitGenerator::generate(Document &output,
const QV4::CompiledData::DependentTypesHasher &dependencyHasher)
1730 using namespace QV4::CompiledData;
1732 output.jsGenerator.stringTable.registerString(output.jsModule.fileName);
1733 output.jsGenerator.stringTable.registerString(output.jsModule.finalUrl);
1735 Unit *jsUnit =
nullptr;
1737 if (!output.javaScriptCompilationUnit)
1738 output.javaScriptCompilationUnit.adopt(
new QV4::CompiledData::CompilationUnit);
1741 if (output.javaScriptCompilationUnit->unitData()) {
1742 jsUnit =
const_cast<Unit *>(output.javaScriptCompilationUnit->unitData());
1743 output.javaScriptCompilationUnit->dynamicStrings
1744 = output.jsGenerator.stringTable.allStrings();
1747 jsUnit = createdUnit = output.jsGenerator.generateUnit();
1750 for (Pragma *p : std::as_const(output.pragmas)) {
1752 case Pragma::Singleton:
1753 createdUnit->flags |= Unit::IsSingleton;
1755 case Pragma::Strict:
1756 createdUnit->flags |= Unit::IsStrict;
1758 case Pragma::ComponentBehavior:
1760 switch (p->componentBehavior) {
1762 createdUnit->flags |= Unit::ComponentsBound;
1764 case Pragma::Unbound:
1769 case Pragma::ListPropertyAssignBehavior:
1770 switch (p->listPropertyAssignBehavior) {
1771 case Pragma::Replace:
1772 createdUnit->flags |= Unit::ListPropertyAssignReplace;
1774 case Pragma::ReplaceIfNotDefault:
1775 createdUnit->flags |= Unit::ListPropertyAssignReplaceIfNotDefault;
1777 case Pragma::Append:
1782 case Pragma::FunctionSignatureBehavior:
1783 switch (p->functionSignatureBehavior) {
1784 case Pragma::Enforced:
1786 case Pragma::Ignored:
1787 createdUnit->flags |= Unit::FunctionSignaturesIgnored;
1791 case Pragma::NativeMethodBehavior:
1792 switch (p->nativeMethodBehavior) {
1793 case Pragma::AcceptThisObject:
1794 createdUnit->flags |= Unit::NativeMethodsAcceptThisObject;
1796 case Pragma::RejectThisObject:
1801 case Pragma::ValueTypeBehavior:
1802 if (Pragma::ValueTypeBehaviorValues(p->valueTypeBehavior)
1803 .testFlag(Pragma::Copy)) {
1804 createdUnit->flags |= Unit::ValueTypesCopied;
1806 if (Pragma::ValueTypeBehaviorValues(p->valueTypeBehavior)
1807 .testFlag(Pragma::Addressable)) {
1808 createdUnit->flags |= Unit::ValueTypesAddressable;
1810 if (Pragma::ValueTypeBehaviorValues(p->valueTypeBehavior)
1811 .testFlag(Pragma::Assertable)) {
1812 createdUnit->flags |= Unit::ValueTypesAssertable;
1815 case Pragma::Translator:
1816 if (createdUnit->translationTableSize)
1817 if (quint32_le *index = createdUnit->translationContextIndex())
1818 *index = p->translationContextIndex;
1823 if (dependencyHasher) {
1824 const QByteArray checksum = dependencyHasher();
1825 if (checksum.size() ==
sizeof(createdUnit->dependencyMD5Checksum)) {
1826 memcpy(createdUnit->dependencyMD5Checksum, checksum.constData(),
1827 sizeof(createdUnit->dependencyMD5Checksum));
1831 createdUnit->sourceFileIndex = output.jsGenerator.stringTable.getStringId(output.jsModule.fileName);
1832 createdUnit->finalUrlIndex = output.jsGenerator.stringTable.getStringId(output.jsModule.finalUrl);
1836 output.jsGenerator.stringTable.freeze();
1838 const uint importSize = uint(
sizeof(QV4::CompiledData::Import)) * output.imports.size();
1839 const uint objectOffsetTableSize = output.objects.size() * uint(
sizeof(quint32));
1841 QHash<
const Object*, quint32> objectOffsets;
1843 const unsigned int objectOffset =
sizeof(QV4::CompiledData::QmlUnit) + importSize;
1844 uint nextOffset = objectOffset + objectOffsetTableSize;
1845 for (Object *o : std::as_const(output.objects)) {
1846 objectOffsets.insert(o, nextOffset);
1847 nextOffset += QV4::CompiledData::Object::calculateSizeExcludingSignalsAndEnums(o->functionCount(), o->propertyCount(), o->aliasCount(), o->enumCount(), o->signalCount(), o->bindingCount(), o->namedObjectsInComponent.size(), o->inlineComponentCount(), o->requiredPropertyExtraDataCount());
1849 int signalTableSize = 0;
1850 for (
const Signal *s = o->firstSignal(); s; s = s->next)
1851 signalTableSize += QV4::CompiledData::Signal::calculateSize(s->parameters->count);
1853 nextOffset += signalTableSize;
1855 int enumTableSize = 0;
1856 for (
const Enum *e = o->firstEnum(); e; e = e->next)
1857 enumTableSize += QV4::CompiledData::Enum::calculateSize(e->enumValues->count);
1859 nextOffset += enumTableSize;
1862 const uint totalSize = nextOffset;
1863 char *data = (
char*)malloc(totalSize);
1864 memset(data, 0, totalSize);
1865 QV4::CompiledData::QmlUnit *qmlUnit =
reinterpret_cast<QV4::CompiledData::QmlUnit *>(data);
1866 qmlUnit->offsetToImports =
sizeof(*qmlUnit);
1867 qmlUnit->nImports = output.imports.size();
1868 qmlUnit->offsetToObjects = objectOffset;
1869 qmlUnit->nObjects = output.objects.size();
1872 char *importPtr = data + qmlUnit->offsetToImports;
1873 for (
const QV4::CompiledData::Import *imp : std::as_const(output.imports)) {
1874 QV4::CompiledData::Import *importToWrite =
reinterpret_cast<QV4::CompiledData::Import*>(importPtr);
1875 *importToWrite = *imp;
1876 importPtr +=
sizeof(QV4::CompiledData::Import);
1880 quint32_le *objectTable =
reinterpret_cast<quint32_le*>(data + qmlUnit->offsetToObjects);
1881 for (
int i = 0; i < output.objects.size(); ++i) {
1882 const Object *o = output.objects.at(i);
1883 char *
const objectPtr = data + objectOffsets.value(o);
1884 *objectTable++ = objectOffsets.value(o);
1886 QV4::CompiledData::Object *objectToWrite =
reinterpret_cast<QV4::CompiledData::Object*>(objectPtr);
1887 objectToWrite->inheritedTypeNameIndex = o->inheritedTypeNameIndex;
1888 objectToWrite->indexOfDefaultPropertyOrAlias = o->indexOfDefaultPropertyOrAlias;
1889 objectToWrite->setHasAliasAsDefaultProperty(o->defaultPropertyIsAlias);
1890 objectToWrite->setFlags(QV4::CompiledData::Object::Flags(o->flags));
1891 objectToWrite->idNameIndex = o->idNameIndex;
1892 objectToWrite->setObjectId(o->id);
1893 objectToWrite->location = o->location;
1894 objectToWrite->locationOfIdProperty = o->locationOfIdProperty;
1896 quint32 nextOffset =
sizeof(QV4::CompiledData::Object);
1898 objectToWrite->nFunctions = o->functionCount();
1899 objectToWrite->offsetToFunctions = nextOffset;
1900 nextOffset += objectToWrite->nFunctions *
sizeof(quint32);
1902 objectToWrite->nProperties = o->propertyCount();
1903 objectToWrite->offsetToProperties = nextOffset;
1904 nextOffset += objectToWrite->nProperties *
sizeof(QV4::CompiledData::Property);
1906 objectToWrite->nAliases = o->aliasCount();
1907 objectToWrite->offsetToAliases = nextOffset;
1908 nextOffset += objectToWrite->nAliases *
sizeof(QV4::CompiledData::Alias);
1910 objectToWrite->nEnums = o->enumCount();
1911 objectToWrite->offsetToEnums = nextOffset;
1912 nextOffset += objectToWrite->nEnums *
sizeof(quint32);
1914 objectToWrite->nSignals = o->signalCount();
1915 objectToWrite->offsetToSignals = nextOffset;
1916 nextOffset += objectToWrite->nSignals *
sizeof(quint32);
1918 objectToWrite->nBindings = o->bindingCount();
1919 objectToWrite->offsetToBindings = nextOffset;
1920 nextOffset += objectToWrite->nBindings *
sizeof(QV4::CompiledData::Binding);
1922 objectToWrite->nNamedObjectsInComponent = o->namedObjectsInComponent.size();
1923 objectToWrite->offsetToNamedObjectsInComponent = nextOffset;
1924 nextOffset += objectToWrite->nNamedObjectsInComponent *
sizeof(quint32);
1926 objectToWrite->nInlineComponents = o->inlineComponentCount();
1927 objectToWrite->offsetToInlineComponents = nextOffset;
1928 nextOffset += objectToWrite->nInlineComponents *
sizeof (QV4::CompiledData::InlineComponent);
1930 objectToWrite->nRequiredPropertyExtraData = o->requiredPropertyExtraDataCount();
1931 objectToWrite->offsetToRequiredPropertyExtraData = nextOffset;
1932 nextOffset += objectToWrite->nRequiredPropertyExtraData *
sizeof(QV4::CompiledData::RequiredPropertyExtraData);
1934 quint32_le *functionsTable =
reinterpret_cast<quint32_le *>(objectPtr + objectToWrite->offsetToFunctions);
1935 for (
const Function *f = o->firstFunction(); f; f = f->next)
1936 *functionsTable++ = o->runtimeFunctionIndices.at(f->index);
1938 char *propertiesPtr = objectPtr + objectToWrite->offsetToProperties;
1939 for (
const Property *p = o->firstProperty(); p; p = p->next) {
1940 QV4::CompiledData::Property *propertyToWrite =
reinterpret_cast<QV4::CompiledData::Property*>(propertiesPtr);
1941 *propertyToWrite = *p;
1942 propertiesPtr +=
sizeof(QV4::CompiledData::Property);
1945 char *aliasesPtr = objectPtr + objectToWrite->offsetToAliases;
1946 for (
const Alias *a = o->firstAlias(); a; a = a->next) {
1947 QV4::CompiledData::Alias *aliasToWrite =
reinterpret_cast<QV4::CompiledData::Alias*>(aliasesPtr);
1949 aliasesPtr +=
sizeof(QV4::CompiledData::Alias);
1952 char *bindingPtr = objectPtr + objectToWrite->offsetToBindings;
1953 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isValueBindingNoAlias);
1954 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isSignalHandler);
1955 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isAttachedProperty);
1956 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isGroupProperty);
1957 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isValueBindingToAlias);
1958 Q_ASSERT((bindingPtr - objectToWrite->offsetToBindings - objectPtr) /
sizeof(QV4::CompiledData::Binding) ==
unsigned(o->bindingCount()));
1960 quint32_le *signalOffsetTable =
reinterpret_cast<quint32_le *>(objectPtr + objectToWrite->offsetToSignals);
1961 quint32 signalTableSize = 0;
1962 char *signalPtr = objectPtr + nextOffset;
1963 for (
const Signal *s = o->firstSignal(); s; s = s->next) {
1964 *signalOffsetTable++ = signalPtr - objectPtr;
1965 QV4::CompiledData::Signal *signalToWrite =
reinterpret_cast<QV4::CompiledData::Signal*>(signalPtr);
1967 signalToWrite->nameIndex = s->nameIndex;
1968 signalToWrite->location = s->location;
1969 signalToWrite->nParameters = s->parameters->count;
1971 QV4::CompiledData::Parameter *parameterToWrite =
reinterpret_cast<QV4::CompiledData::Parameter*>(signalPtr +
sizeof(*signalToWrite));
1972 for (Parameter *param = s->parameters->first; param; param = param->next, ++parameterToWrite)
1973 *parameterToWrite = *param;
1975 int size = QV4::CompiledData::Signal::calculateSize(s->parameters->count);
1976 signalTableSize += size;
1979 nextOffset += signalTableSize;
1981 quint32_le *enumOffsetTable =
reinterpret_cast<quint32_le*>(objectPtr + objectToWrite->offsetToEnums);
1982 char *enumPtr = objectPtr + nextOffset;
1983 for (
const Enum *e = o->firstEnum(); e; e = e->next) {
1984 *enumOffsetTable++ = enumPtr - objectPtr;
1985 QV4::CompiledData::Enum *enumToWrite =
reinterpret_cast<QV4::CompiledData::Enum*>(enumPtr);
1987 enumToWrite->nameIndex = e->nameIndex;
1988 enumToWrite->location = e->location;
1989 enumToWrite->nEnumValues = e->enumValues->count;
1991 QV4::CompiledData::EnumValue *enumValueToWrite =
reinterpret_cast<QV4::CompiledData::EnumValue*>(enumPtr +
sizeof(*enumToWrite));
1992 for (EnumValue *enumValue = e->enumValues->first; enumValue; enumValue = enumValue->next, ++enumValueToWrite)
1993 *enumValueToWrite = *enumValue;
1995 int size = QV4::CompiledData::Enum::calculateSize(e->enumValues->count);
1999 quint32_le *namedObjectInComponentPtr =
reinterpret_cast<quint32_le *>(objectPtr + objectToWrite->offsetToNamedObjectsInComponent);
2000 for (
int i = 0; i < o->namedObjectsInComponent.size(); ++i) {
2001 *namedObjectInComponentPtr++ = o->namedObjectsInComponent.at(i);
2004 char *inlineComponentPtr = objectPtr + objectToWrite->offsetToInlineComponents;
2005 for (
auto it = o->inlineComponentsBegin(); it != o->inlineComponentsEnd(); ++it) {
2006 const InlineComponent *ic = it.ptr;
2007 QV4::CompiledData::InlineComponent *icToWrite =
reinterpret_cast<QV4::CompiledData::InlineComponent*>(inlineComponentPtr);
2009 inlineComponentPtr +=
sizeof(QV4::CompiledData::InlineComponent);
2012 char *requiredPropertyExtraDataPtr = objectPtr + objectToWrite->offsetToRequiredPropertyExtraData;
2013 for (
auto it = o->requiredPropertyExtraDataBegin(); it != o->requiredPropertyExtraDataEnd(); ++it) {
2014 const RequiredPropertyExtraData *extraData = it.ptr;
2015 QV4::CompiledData::RequiredPropertyExtraData *extraDataToWrite =
reinterpret_cast<QV4::CompiledData::RequiredPropertyExtraData*>(requiredPropertyExtraDataPtr);
2016 *extraDataToWrite = *extraData;
2017 requiredPropertyExtraDataPtr +=
sizeof(QV4::CompiledData::RequiredPropertyExtraData);
2021 if (!output.javaScriptCompilationUnit->unitData()) {
2023 jsUnit =
static_cast<QV4::CompiledData::Unit *>(realloc(jsUnit, jsUnit->unitSize + totalSize));
2024 jsUnit->offsetToQmlUnit = jsUnit->unitSize;
2025 jsUnit->unitSize += totalSize;
2026 memcpy(jsUnit->qmlUnit(), qmlUnit, totalSize);
2028 QV4::Compiler::JSUnitGenerator::generateUnitChecksum(jsUnit);
2029 qmlUnit = jsUnit->qmlUnit();
2032 static const bool showStats = qEnvironmentVariableIsSet(
"QML_SHOW_UNIT_STATS");
2034 qDebug() <<
"Generated QML unit that is" << totalSize <<
"bytes big contains:";
2035 qDebug() <<
" " << jsUnit->functionTableSize <<
"functions";
2036 qDebug() <<
" " << jsUnit->unitSize <<
"for JS unit";
2037 qDebug() <<
" " << importSize <<
"for imports";
2038 qDebug() <<
" " << nextOffset - objectOffset - objectOffsetTableSize <<
"for" << qmlUnit->nObjects <<
"objects";
2039 quint32 totalBindingCount = 0;
2040 for (quint32 i = 0; i < qmlUnit->nObjects; ++i)
2041 totalBindingCount += qmlUnit->objectAt(i)->nBindings;
2042 qDebug() <<
" " << totalBindingCount <<
"bindings";
2043 quint32 totalCodeSize = 0;
2044 for (quint32 i = 0; i < jsUnit->functionTableSize; ++i)
2045 totalCodeSize += jsUnit->functionAt(i)->codeSize;
2046 qDebug() <<
" " << totalCodeSize <<
"bytes total byte code";
2047 qDebug() <<
" " << jsUnit->stringTableSize <<
"strings";
2048 quint32 totalStringSize = 0;
2049 for (quint32 i = 0; i < jsUnit->stringTableSize; ++i)
2050 totalStringSize += QV4::CompiledData::String::calculateSize(jsUnit->stringAtInternal(i));
2051 qDebug() <<
" " << totalStringSize <<
"bytes total strings";
2054 output.javaScriptCompilationUnit->setUnitData(
2055 jsUnit, qmlUnit, output.jsModule.fileName, output.jsModule.finalUrl);