1204void IRBuilder::setBindingValue(QV4::CompiledData::Binding *binding, QQmlJS::AST::Statement *statement, QQmlJS::AST::Node *parentNode)
1206 QQmlJS::SourceLocation loc = statement->firstSourceLocation();
1207 binding->valueLocation.set(loc.startLine, loc.startColumn);
1208 binding->setType(QV4::CompiledData::Binding::Type_Invalid);
1209 if (_propertyDeclaration && _propertyDeclaration->isReadOnly())
1210 binding->setFlag(QV4::CompiledData::Binding::InitializerForReadOnlyDeclaration);
1212 QQmlJS::AST::ExpressionStatement *exprStmt = QQmlJS::AST::cast<QQmlJS::AST::ExpressionStatement *>(statement);
1214 QQmlJS::AST::ExpressionNode *
const expr = exprStmt->expression;
1215 if (QQmlJS::AST::StringLiteral *lit = QQmlJS::AST::cast<QQmlJS::AST::StringLiteral *>(expr)) {
1216 binding->setType(QV4::CompiledData::Binding::Type_String);
1217 binding->stringIndex = registerString(lit->value.toString());
1218 }
else if (QQmlJS::AST::TemplateLiteral *templateLit = QQmlJS::AST::cast<QQmlJS::AST::TemplateLiteral *>(expr);
1219 templateLit && templateLit->hasNoSubstitution) {
1222 binding->setType(QV4::CompiledData::Binding::Type_String);
1223 binding->stringIndex = registerString(templateLit->value.toString());
1224 }
else if (expr->kind == QQmlJS::AST::Node::Kind_TrueLiteral) {
1225 binding->setType(QV4::CompiledData::Binding::Type_Boolean);
1226 binding->value.b =
true;
1227 }
else if (expr->kind == QQmlJS::AST::Node::Kind_FalseLiteral) {
1228 binding->setType(QV4::CompiledData::Binding::Type_Boolean);
1229 binding->value.b =
false;
1230 }
else if (QQmlJS::AST::NumericLiteral *lit = QQmlJS::AST::cast<QQmlJS::AST::NumericLiteral *>(expr)) {
1231 binding->setType(QV4::CompiledData::Binding::Type_Number);
1232 binding->value.constantValueIndex = jsGenerator->registerConstant(QV4::Encode(lit->value));
1233 }
else if (QQmlJS::AST::CallExpression *call = QQmlJS::AST::cast<QQmlJS::AST::CallExpression *>(expr)) {
1234 if (QQmlJS::AST::IdentifierExpression *base = QQmlJS::AST::cast<QQmlJS::AST::IdentifierExpression *>(call->base)) {
1235 tryGeneratingTranslationBinding(base->name, call->arguments, binding);
1239 }
else if (QQmlJS::AST::cast<QQmlJS::AST::FunctionExpression *>(expr)) {
1240 binding->setFlag(QV4::CompiledData::Binding::IsFunctionExpression);
1241 }
else if (QQmlJS::AST::UnaryMinusExpression *unaryMinus = QQmlJS::AST::cast<QQmlJS::AST::UnaryMinusExpression *>(expr)) {
1242 if (QQmlJS::AST::NumericLiteral *lit = QQmlJS::AST::cast<QQmlJS::AST::NumericLiteral *>(unaryMinus->expression)) {
1243 binding->setType(QV4::CompiledData::Binding::Type_Number);
1244 binding->value.constantValueIndex = jsGenerator->registerConstant(QV4::Encode(-lit->value));
1246 }
else if (QQmlJS::AST::cast<QQmlJS::AST::NullExpression *>(expr)) {
1247 binding->setType(QV4::CompiledData::Binding::Type_Null);
1248 binding->value.nullMarker = 0;
1253 if (binding->type() == QV4::CompiledData::Binding::Type_Invalid) {
1254 binding->setType(QV4::CompiledData::Binding::Type_Script);
1256 CompiledFunctionOrExpression *expr = New<CompiledFunctionOrExpression>();
1257 expr->node = statement;
1258 expr->parentNode = parentNode;
1259 expr->nameIndex = registerString(QLatin1String(
"expression for ")
1260 + stringAt(binding->propertyNameIndex));
1261 const int index = bindingsTarget()->functionsAndExpressions->append(expr);
1262 binding->value.compiledScriptIndex = index;
1267 QQmlJS::AST::Node *nodeForString = statement;
1269 nodeForString = exprStmt->expression;
1270 if (asStringRef(nodeForString) == u"undefined")
1271 binding->stringIndex = registerString(u"undefined"_s);
1273 binding->stringIndex = emptyStringIndex;
1504bool IRBuilder::resolveQualifiedId(QQmlJS::AST::UiQualifiedId **nameToResolve, Object **object,
bool onAssignment)
1506 QQmlJS::AST::UiQualifiedId *qualifiedIdElement = *nameToResolve;
1508 if (qualifiedIdElement->name == QLatin1String(
"id") && qualifiedIdElement->next)
1509 COMPILE_EXCEPTION(qualifiedIdElement->identifierToken, tr(
"Invalid use of id property"));
1512 QString currentName = qualifiedIdElement->name.toString();
1513 if (qualifiedIdElement->next) {
1514 for (
const QV4::CompiledData::Import* import : std::as_const(_imports))
1515 if (import->qualifierIndex != emptyStringIndex
1516 && stringAt(import->qualifierIndex) == currentName) {
1517 qualifiedIdElement = qualifiedIdElement->next;
1518 currentName += QLatin1Char(
'.') + qualifiedIdElement->name;
1520 if (!qualifiedIdElement->name.data()->isUpper())
1521 COMPILE_EXCEPTION(qualifiedIdElement->firstSourceLocation(), tr(
"Expected type name"));
1528 while (qualifiedIdElement->next) {
1529 const quint32 propertyNameIndex = registerString(currentName);
1530 const bool isAttachedProperty = qualifiedIdElement->name.data()->isUpper();
1532 Binding *binding = (*object)->findBinding(propertyNameIndex);
1534 if (isAttachedProperty) {
1535 if (!binding->isAttachedProperty())
1537 }
else if (!binding->isGroupProperty()) {
1542 binding = New<Binding>();
1543 binding->propertyNameIndex = propertyNameIndex;
1544 binding->offset = qualifiedIdElement->identifierToken.offset;
1545 binding->location.set(qualifiedIdElement->identifierToken.startLine,
1546 qualifiedIdElement->identifierToken.startColumn);
1547 binding->valueLocation.set(qualifiedIdElement->next->identifierToken.startLine,
1548 qualifiedIdElement->next->identifierToken.startColumn);
1549 binding->clearFlags();
1552 binding->setFlag(QV4::CompiledData::Binding::IsOnAssignment);
1554 if (isAttachedProperty)
1555 binding->setType(QV4::CompiledData::Binding::Type_AttachedProperty);
1557 binding->setType(QV4::CompiledData::Binding::Type_GroupProperty);
1560 if (!defineQMLObject(&objIndex,
nullptr, binding->location,
nullptr,
nullptr))
1562 binding->value.objectIndex = objIndex;
1564 QString error = (*object)->appendBinding(binding,
false);
1565 if (!error.isEmpty()) {
1566 recordError(qualifiedIdElement->identifierToken, error);
1569 *object = _objects.at(objIndex);
1571 Q_ASSERT(binding->isAttachedProperty() || binding->isGroupProperty());
1572 *object = _objects.at(binding->value.objectIndex);
1575 qualifiedIdElement = qualifiedIdElement->next;
1576 if (qualifiedIdElement)
1577 currentName = qualifiedIdElement->name.toString();
1579 *nameToResolve = qualifiedIdElement;
1627void QmlUnitGenerator::generate(Document &output,
const QV4::CompiledData::DependentTypesHasher &dependencyHasher)
1629 using namespace QV4::CompiledData;
1631 output.jsGenerator.stringTable.registerString(output.jsModule.fileName);
1632 output.jsGenerator.stringTable.registerString(output.jsModule.finalUrl);
1634 Unit *jsUnit =
nullptr;
1636 if (!output.javaScriptCompilationUnit)
1637 output.javaScriptCompilationUnit.adopt(
new QV4::CompiledData::CompilationUnit);
1640 if (output.javaScriptCompilationUnit->unitData()) {
1641 jsUnit =
const_cast<Unit *>(output.javaScriptCompilationUnit->unitData());
1642 output.javaScriptCompilationUnit->dynamicStrings
1643 = output.jsGenerator.stringTable.allStrings();
1646 jsUnit = createdUnit = output.jsGenerator.generateUnit();
1649 for (Pragma *p : std::as_const(output.pragmas)) {
1651 case Pragma::Singleton:
1652 createdUnit->flags |= Unit::IsSingleton;
1654 case Pragma::Strict:
1655 createdUnit->flags |= Unit::IsStrict;
1657 case Pragma::ComponentBehavior:
1659 switch (p->componentBehavior) {
1661 createdUnit->flags |= Unit::ComponentsBound;
1663 case Pragma::Unbound:
1668 case Pragma::ListPropertyAssignBehavior:
1669 switch (p->listPropertyAssignBehavior) {
1670 case Pragma::Replace:
1671 createdUnit->flags |= Unit::ListPropertyAssignReplace;
1673 case Pragma::ReplaceIfNotDefault:
1674 createdUnit->flags |= Unit::ListPropertyAssignReplaceIfNotDefault;
1676 case Pragma::Append:
1681 case Pragma::FunctionSignatureBehavior:
1682 switch (p->functionSignatureBehavior) {
1683 case Pragma::Enforced:
1685 case Pragma::Ignored:
1686 createdUnit->flags |= Unit::FunctionSignaturesIgnored;
1690 case Pragma::NativeMethodBehavior:
1691 switch (p->nativeMethodBehavior) {
1692 case Pragma::AcceptThisObject:
1693 createdUnit->flags |= Unit::NativeMethodsAcceptThisObject;
1695 case Pragma::RejectThisObject:
1700 case Pragma::ValueTypeBehavior:
1701 if (Pragma::ValueTypeBehaviorValues(p->valueTypeBehavior)
1702 .testFlag(Pragma::Copy)) {
1703 createdUnit->flags |= Unit::ValueTypesCopied;
1705 if (Pragma::ValueTypeBehaviorValues(p->valueTypeBehavior)
1706 .testFlag(Pragma::Addressable)) {
1707 createdUnit->flags |= Unit::ValueTypesAddressable;
1709 if (Pragma::ValueTypeBehaviorValues(p->valueTypeBehavior)
1710 .testFlag(Pragma::Assertable)) {
1711 createdUnit->flags |= Unit::ValueTypesAssertable;
1714 case Pragma::Translator:
1715 if (createdUnit->translationTableSize)
1716 if (quint32_le *index = createdUnit->translationContextIndex())
1717 *index = p->translationContextIndex;
1722 if (dependencyHasher) {
1723 const QByteArray checksum = dependencyHasher();
1724 if (checksum.size() ==
sizeof(createdUnit->dependencyMD5Checksum)) {
1725 memcpy(createdUnit->dependencyMD5Checksum, checksum.constData(),
1726 sizeof(createdUnit->dependencyMD5Checksum));
1730 createdUnit->sourceFileIndex = output.jsGenerator.stringTable.getStringId(output.jsModule.fileName);
1731 createdUnit->finalUrlIndex = output.jsGenerator.stringTable.getStringId(output.jsModule.finalUrl);
1735 output.jsGenerator.stringTable.freeze();
1737 const uint importSize = uint(
sizeof(QV4::CompiledData::Import)) * output.imports.size();
1738 const uint objectOffsetTableSize = output.objects.size() * uint(
sizeof(quint32));
1740 QHash<
const Object*, quint32> objectOffsets;
1742 const unsigned int objectOffset =
sizeof(QV4::CompiledData::QmlUnit) + importSize;
1743 uint nextOffset = objectOffset + objectOffsetTableSize;
1744 for (Object *o : std::as_const(output.objects)) {
1745 objectOffsets.insert(o, nextOffset);
1746 nextOffset += QV4::CompiledData::Object::calculateSizeExcludingSignalsAndEnums(o->functionCount(), o->propertyCount(), o->aliasCount(), o->enumCount(), o->signalCount(), o->bindingCount(), o->namedObjectsInComponent.size(), o->inlineComponentCount(), o->requiredPropertyExtraDataCount());
1748 int signalTableSize = 0;
1749 for (
const Signal *s = o->firstSignal(); s; s = s->next)
1750 signalTableSize += QV4::CompiledData::Signal::calculateSize(s->parameters->count);
1752 nextOffset += signalTableSize;
1754 int enumTableSize = 0;
1755 for (
const Enum *e = o->firstEnum(); e; e = e->next)
1756 enumTableSize += QV4::CompiledData::Enum::calculateSize(e->enumValues->count);
1758 nextOffset += enumTableSize;
1761 const uint totalSize = nextOffset;
1762 char *data = (
char*)malloc(totalSize);
1763 memset(data, 0, totalSize);
1764 QV4::CompiledData::QmlUnit *qmlUnit =
reinterpret_cast<QV4::CompiledData::QmlUnit *>(data);
1765 qmlUnit->offsetToImports =
sizeof(*qmlUnit);
1766 qmlUnit->nImports = output.imports.size();
1767 qmlUnit->offsetToObjects = objectOffset;
1768 qmlUnit->nObjects = output.objects.size();
1771 char *importPtr = data + qmlUnit->offsetToImports;
1772 for (
const QV4::CompiledData::Import *imp : std::as_const(output.imports)) {
1773 QV4::CompiledData::Import *importToWrite =
reinterpret_cast<QV4::CompiledData::Import*>(importPtr);
1774 *importToWrite = *imp;
1775 importPtr +=
sizeof(QV4::CompiledData::Import);
1779 quint32_le *objectTable =
reinterpret_cast<quint32_le*>(data + qmlUnit->offsetToObjects);
1780 for (
int i = 0; i < output.objects.size(); ++i) {
1781 const Object *o = output.objects.at(i);
1782 char *
const objectPtr = data + objectOffsets.value(o);
1783 *objectTable++ = objectOffsets.value(o);
1785 QV4::CompiledData::Object *objectToWrite =
reinterpret_cast<QV4::CompiledData::Object*>(objectPtr);
1786 objectToWrite->inheritedTypeNameIndex = o->inheritedTypeNameIndex;
1787 objectToWrite->indexOfDefaultPropertyOrAlias = o->indexOfDefaultPropertyOrAlias;
1788 objectToWrite->setHasAliasAsDefaultProperty(o->defaultPropertyIsAlias);
1789 objectToWrite->setFlags(QV4::CompiledData::Object::Flags(o->flags));
1790 objectToWrite->idNameIndex = o->idNameIndex;
1791 objectToWrite->setObjectId(o->id);
1792 objectToWrite->location = o->location;
1793 objectToWrite->locationOfIdProperty = o->locationOfIdProperty;
1795 quint32 nextOffset =
sizeof(QV4::CompiledData::Object);
1797 objectToWrite->nFunctions = o->functionCount();
1798 objectToWrite->offsetToFunctions = nextOffset;
1799 nextOffset += objectToWrite->nFunctions *
sizeof(quint32);
1801 objectToWrite->nProperties = o->propertyCount();
1802 objectToWrite->offsetToProperties = nextOffset;
1803 nextOffset += objectToWrite->nProperties *
sizeof(QV4::CompiledData::Property);
1805 objectToWrite->nAliases = o->aliasCount();
1806 objectToWrite->offsetToAliases = nextOffset;
1807 nextOffset += objectToWrite->nAliases *
sizeof(QV4::CompiledData::Alias);
1809 objectToWrite->nEnums = o->enumCount();
1810 objectToWrite->offsetToEnums = nextOffset;
1811 nextOffset += objectToWrite->nEnums *
sizeof(quint32);
1813 objectToWrite->nSignals = o->signalCount();
1814 objectToWrite->offsetToSignals = nextOffset;
1815 nextOffset += objectToWrite->nSignals *
sizeof(quint32);
1817 objectToWrite->nBindings = o->bindingCount();
1818 objectToWrite->offsetToBindings = nextOffset;
1819 nextOffset += objectToWrite->nBindings *
sizeof(QV4::CompiledData::Binding);
1821 objectToWrite->nNamedObjectsInComponent = o->namedObjectsInComponent.size();
1822 objectToWrite->offsetToNamedObjectsInComponent = nextOffset;
1823 nextOffset += objectToWrite->nNamedObjectsInComponent *
sizeof(quint32);
1825 objectToWrite->nInlineComponents = o->inlineComponentCount();
1826 objectToWrite->offsetToInlineComponents = nextOffset;
1827 nextOffset += objectToWrite->nInlineComponents *
sizeof (QV4::CompiledData::InlineComponent);
1829 objectToWrite->nRequiredPropertyExtraData = o->requiredPropertyExtraDataCount();
1830 objectToWrite->offsetToRequiredPropertyExtraData = nextOffset;
1831 nextOffset += objectToWrite->nRequiredPropertyExtraData *
sizeof(QV4::CompiledData::RequiredPropertyExtraData);
1833 quint32_le *functionsTable =
reinterpret_cast<quint32_le *>(objectPtr + objectToWrite->offsetToFunctions);
1834 for (
const Function *f = o->firstFunction(); f; f = f->next)
1835 *functionsTable++ = o->runtimeFunctionIndices.at(f->index);
1837 char *propertiesPtr = objectPtr + objectToWrite->offsetToProperties;
1838 for (
const Property *p = o->firstProperty(); p; p = p->next) {
1839 QV4::CompiledData::Property *propertyToWrite =
reinterpret_cast<QV4::CompiledData::Property*>(propertiesPtr);
1840 *propertyToWrite = *p;
1841 propertiesPtr +=
sizeof(QV4::CompiledData::Property);
1844 char *aliasesPtr = objectPtr + objectToWrite->offsetToAliases;
1845 for (
const Alias *a = o->firstAlias(); a; a = a->next) {
1846 QV4::CompiledData::Alias *aliasToWrite =
reinterpret_cast<QV4::CompiledData::Alias*>(aliasesPtr);
1848 aliasesPtr +=
sizeof(QV4::CompiledData::Alias);
1851 char *bindingPtr = objectPtr + objectToWrite->offsetToBindings;
1852 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isValueBindingNoAlias);
1853 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isSignalHandler);
1854 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isAttachedProperty);
1855 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isGroupProperty);
1856 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isValueBindingToAlias);
1857 Q_ASSERT((bindingPtr - objectToWrite->offsetToBindings - objectPtr) /
sizeof(QV4::CompiledData::Binding) ==
unsigned(o->bindingCount()));
1859 quint32_le *signalOffsetTable =
reinterpret_cast<quint32_le *>(objectPtr + objectToWrite->offsetToSignals);
1860 quint32 signalTableSize = 0;
1861 char *signalPtr = objectPtr + nextOffset;
1862 for (
const Signal *s = o->firstSignal(); s; s = s->next) {
1863 *signalOffsetTable++ = signalPtr - objectPtr;
1864 QV4::CompiledData::Signal *signalToWrite =
reinterpret_cast<QV4::CompiledData::Signal*>(signalPtr);
1866 signalToWrite->nameIndex = s->nameIndex;
1867 signalToWrite->location = s->location;
1868 signalToWrite->nParameters = s->parameters->count;
1870 QV4::CompiledData::Parameter *parameterToWrite =
reinterpret_cast<QV4::CompiledData::Parameter*>(signalPtr +
sizeof(*signalToWrite));
1871 for (Parameter *param = s->parameters->first; param; param = param->next, ++parameterToWrite)
1872 *parameterToWrite = *param;
1874 int size = QV4::CompiledData::Signal::calculateSize(s->parameters->count);
1875 signalTableSize += size;
1878 nextOffset += signalTableSize;
1880 quint32_le *enumOffsetTable =
reinterpret_cast<quint32_le*>(objectPtr + objectToWrite->offsetToEnums);
1881 char *enumPtr = objectPtr + nextOffset;
1882 for (
const Enum *e = o->firstEnum(); e; e = e->next) {
1883 *enumOffsetTable++ = enumPtr - objectPtr;
1884 QV4::CompiledData::Enum *enumToWrite =
reinterpret_cast<QV4::CompiledData::Enum*>(enumPtr);
1886 enumToWrite->nameIndex = e->nameIndex;
1887 enumToWrite->location = e->location;
1888 enumToWrite->nEnumValues = e->enumValues->count;
1890 QV4::CompiledData::EnumValue *enumValueToWrite =
reinterpret_cast<QV4::CompiledData::EnumValue*>(enumPtr +
sizeof(*enumToWrite));
1891 for (EnumValue *enumValue = e->enumValues->first; enumValue; enumValue = enumValue->next, ++enumValueToWrite)
1892 *enumValueToWrite = *enumValue;
1894 int size = QV4::CompiledData::Enum::calculateSize(e->enumValues->count);
1898 quint32_le *namedObjectInComponentPtr =
reinterpret_cast<quint32_le *>(objectPtr + objectToWrite->offsetToNamedObjectsInComponent);
1899 for (
int i = 0; i < o->namedObjectsInComponent.size(); ++i) {
1900 *namedObjectInComponentPtr++ = o->namedObjectsInComponent.at(i);
1903 char *inlineComponentPtr = objectPtr + objectToWrite->offsetToInlineComponents;
1904 for (
auto it = o->inlineComponentsBegin(); it != o->inlineComponentsEnd(); ++it) {
1905 const InlineComponent *ic = it.ptr;
1906 QV4::CompiledData::InlineComponent *icToWrite =
reinterpret_cast<QV4::CompiledData::InlineComponent*>(inlineComponentPtr);
1908 inlineComponentPtr +=
sizeof(QV4::CompiledData::InlineComponent);
1911 char *requiredPropertyExtraDataPtr = objectPtr + objectToWrite->offsetToRequiredPropertyExtraData;
1912 for (
auto it = o->requiredPropertyExtraDataBegin(); it != o->requiredPropertyExtraDataEnd(); ++it) {
1913 const RequiredPropertyExtraData *extraData = it.ptr;
1914 QV4::CompiledData::RequiredPropertyExtraData *extraDataToWrite =
reinterpret_cast<QV4::CompiledData::RequiredPropertyExtraData*>(requiredPropertyExtraDataPtr);
1915 *extraDataToWrite = *extraData;
1916 requiredPropertyExtraDataPtr +=
sizeof(QV4::CompiledData::RequiredPropertyExtraData);
1920 if (!output.javaScriptCompilationUnit->unitData()) {
1922 jsUnit =
static_cast<QV4::CompiledData::Unit *>(realloc(jsUnit, jsUnit->unitSize + totalSize));
1923 jsUnit->offsetToQmlUnit = jsUnit->unitSize;
1924 jsUnit->unitSize += totalSize;
1925 memcpy(jsUnit->qmlUnit(), qmlUnit, totalSize);
1927 QV4::Compiler::JSUnitGenerator::generateUnitChecksum(jsUnit);
1928 qmlUnit = jsUnit->qmlUnit();
1931 static const bool showStats = qEnvironmentVariableIsSet(
"QML_SHOW_UNIT_STATS");
1933 qDebug() <<
"Generated QML unit that is" << totalSize <<
"bytes big contains:";
1934 qDebug() <<
" " << jsUnit->functionTableSize <<
"functions";
1935 qDebug() <<
" " << jsUnit->unitSize <<
"for JS unit";
1936 qDebug() <<
" " << importSize <<
"for imports";
1937 qDebug() <<
" " << nextOffset - objectOffset - objectOffsetTableSize <<
"for" << qmlUnit->nObjects <<
"objects";
1938 quint32 totalBindingCount = 0;
1939 for (quint32 i = 0; i < qmlUnit->nObjects; ++i)
1940 totalBindingCount += qmlUnit->objectAt(i)->nBindings;
1941 qDebug() <<
" " << totalBindingCount <<
"bindings";
1942 quint32 totalCodeSize = 0;
1943 for (quint32 i = 0; i < jsUnit->functionTableSize; ++i)
1944 totalCodeSize += jsUnit->functionAt(i)->codeSize;
1945 qDebug() <<
" " << totalCodeSize <<
"bytes total byte code";
1946 qDebug() <<
" " << jsUnit->stringTableSize <<
"strings";
1947 quint32 totalStringSize = 0;
1948 for (quint32 i = 0; i < jsUnit->stringTableSize; ++i)
1949 totalStringSize += QV4::CompiledData::String::calculateSize(jsUnit->stringAtInternal(i));
1950 qDebug() <<
" " << totalStringSize <<
"bytes total strings";
1953 output.javaScriptCompilationUnit->setUnitData(
1954 jsUnit, qmlUnit, output.jsModule.fileName, output.jsModule.finalUrl);