1015bool IRBuilder::visit(QQmlJS::AST::UiPublicMember *node)
1017 if (node->type == QQmlJS::AST::UiPublicMember::Signal) {
1018 Signal *signal = New<Signal>();
1019 const QString signalName = node->name.toString();
1020 signal->nameIndex = registerString(signalName);
1022 QQmlJS::SourceLocation loc = node->typeToken;
1023 signal->location.set(loc.startLine, loc.startColumn);
1025 signal->parameters = New<PoolList<Parameter> >();
1027 QQmlJS::AST::UiParameterList *p = node->parameters;
1030 recordError(node->typeToken, QCoreApplication::translate(
"QQmlParser",
"Expected parameter type"));
1034 Parameter *param = New<Parameter>();
1035 param->nameIndex = registerString(p->name.toString());
1036 if (!Parameter::initType(
1037 ¶m->type, [
this](
const QString &str) {
return registerString(str); },
1039 QString errStr = QCoreApplication::translate(
"QQmlParser",
"Invalid signal parameter type: ");
1040 errStr.append(p->type->toString());
1041 recordError(node->typeToken, errStr);
1044 signal->parameters->append(param);
1048 for (
const QChar &ch : signalName) {
1053 tr(
"Signal names cannot begin with an upper case letter"));
1057 if (QV4::Compiler::Codegen::isNameGlobal(signalName))
1060 QString error = _object->appendSignal(signal);
1061 if (!error.isEmpty()) {
1062 recordError(node->identifierToken, error);
1066 QString memberType = asString(node->memberType);
1067 if (memberType == QLatin1String(
"alias")) {
1068 return appendAlias(node);
1070 QStringView name = node->name;
1072 Property *property = New<Property>();
1073 property->setIsReadOnly(node->isReadonly());
1074 property->setIsRequired(node->isRequired());
1075 property->setIsFinal(node->isFinal());
1077 const QV4::CompiledData::CommonType builtinPropertyType
1078 = Parameter::stringToBuiltinType(memberType);
1079 if (builtinPropertyType != QV4::CompiledData::CommonType::Invalid)
1080 property->setCommonType(builtinPropertyType);
1082 property->setTypeNameIndex(registerString(memberType));
1084 QStringView typeModifier = node->typeModifier;
1085 if (typeModifier == QLatin1String(
"list")) {
1086 property->setIsList(
true);
1087 }
else if (!typeModifier.isEmpty()) {
1088 recordError(node->typeModifierToken, QCoreApplication::translate(
"QQmlParser",
"Invalid property type modifier"));
1092 const QString propName = name.toString();
1093 property->setNameIndex(registerString(propName));
1095 QQmlJS::SourceLocation loc = node->firstSourceLocation();
1096 property->location.set(loc.startLine, loc.startColumn);
1098 QQmlJS::SourceLocation errorLocation;
1101 if (QV4::Compiler::Codegen::isNameGlobal(propName))
1102 error = tr(
"Illegal property name");
1104 error = _object->appendProperty(property, propName, node->isDefaultMember(), node->defaultToken(), &errorLocation);
1106 if (!error.isEmpty()) {
1107 if (errorLocation.startLine == 0)
1108 errorLocation = node->identifierToken;
1110 recordError(errorLocation, error);
1114 qSwap(_propertyDeclaration, property);
1115 if (node->binding) {
1117 QQmlJS::AST::Node::accept(node->binding,
this);
1118 }
else if (node->statement) {
1119 if (!isRedundantNullInitializerForPropertyDeclaration(_propertyDeclaration, node->statement))
1120 appendBinding(node->identifierToken, node->identifierToken, _propertyDeclaration->nameIndex(), node->statement, node);
1122 qSwap(_propertyDeclaration, property);
1225void IRBuilder::setBindingValue(QV4::CompiledData::Binding *binding, QQmlJS::AST::Statement *statement, QQmlJS::AST::Node *parentNode)
1227 QQmlJS::SourceLocation loc = statement->firstSourceLocation();
1228 binding->valueLocation.set(loc.startLine, loc.startColumn);
1229 binding->setType(QV4::CompiledData::Binding::Type_Invalid);
1230 if (_propertyDeclaration && _propertyDeclaration->isReadOnly())
1231 binding->setFlag(QV4::CompiledData::Binding::InitializerForReadOnlyDeclaration);
1233 QQmlJS::AST::ExpressionStatement *exprStmt = QQmlJS::AST::cast<QQmlJS::AST::ExpressionStatement *>(statement);
1235 QQmlJS::AST::ExpressionNode *
const expr = exprStmt->expression;
1236 if (QQmlJS::AST::StringLiteral *lit = QQmlJS::AST::cast<QQmlJS::AST::StringLiteral *>(expr)) {
1237 binding->setType(QV4::CompiledData::Binding::Type_String);
1238 binding->stringIndex = registerString(lit->value.toString());
1239 }
else if (QQmlJS::AST::TemplateLiteral *templateLit = QQmlJS::AST::cast<QQmlJS::AST::TemplateLiteral *>(expr);
1240 templateLit && templateLit->hasNoSubstitution) {
1243 binding->setType(QV4::CompiledData::Binding::Type_String);
1244 binding->stringIndex = registerString(templateLit->value.toString());
1245 }
else if (expr->kind == QQmlJS::AST::Node::Kind_TrueLiteral) {
1246 binding->setType(QV4::CompiledData::Binding::Type_Boolean);
1247 binding->value.b =
true;
1248 }
else if (expr->kind == QQmlJS::AST::Node::Kind_FalseLiteral) {
1249 binding->setType(QV4::CompiledData::Binding::Type_Boolean);
1250 binding->value.b =
false;
1251 }
else if (QQmlJS::AST::NumericLiteral *lit = QQmlJS::AST::cast<QQmlJS::AST::NumericLiteral *>(expr)) {
1252 binding->setType(QV4::CompiledData::Binding::Type_Number);
1253 binding->value.constantValueIndex = jsGenerator->registerConstant(QV4::Encode(lit->value));
1254 }
else if (QQmlJS::AST::CallExpression *call = QQmlJS::AST::cast<QQmlJS::AST::CallExpression *>(expr)) {
1255 if (QQmlJS::AST::IdentifierExpression *base = QQmlJS::AST::cast<QQmlJS::AST::IdentifierExpression *>(call->base)) {
1256 tryGeneratingTranslationBinding(base->name, call->arguments, binding);
1260 }
else if (QQmlJS::AST::cast<QQmlJS::AST::FunctionExpression *>(expr)) {
1261 binding->setFlag(QV4::CompiledData::Binding::IsFunctionExpression);
1262 }
else if (QQmlJS::AST::UnaryMinusExpression *unaryMinus = QQmlJS::AST::cast<QQmlJS::AST::UnaryMinusExpression *>(expr)) {
1263 if (QQmlJS::AST::NumericLiteral *lit = QQmlJS::AST::cast<QQmlJS::AST::NumericLiteral *>(unaryMinus->expression)) {
1264 binding->setType(QV4::CompiledData::Binding::Type_Number);
1265 binding->value.constantValueIndex = jsGenerator->registerConstant(QV4::Encode(-lit->value));
1267 }
else if (QQmlJS::AST::cast<QQmlJS::AST::NullExpression *>(expr)) {
1268 binding->setType(QV4::CompiledData::Binding::Type_Null);
1269 binding->value.nullMarker = 0;
1274 if (binding->type() == QV4::CompiledData::Binding::Type_Invalid) {
1275 binding->setType(QV4::CompiledData::Binding::Type_Script);
1277 CompiledFunctionOrExpression *expr = New<CompiledFunctionOrExpression>();
1278 expr->node = statement;
1279 expr->parentNode = parentNode;
1280 expr->nameIndex = registerString(QLatin1String(
"expression for ")
1281 + stringAt(binding->propertyNameIndex));
1282 const int index = bindingsTarget()->functionsAndExpressions->append(expr);
1283 binding->value.compiledScriptIndex = index;
1288 QQmlJS::AST::Node *nodeForString = statement;
1290 nodeForString = exprStmt->expression;
1291 if (asStringRef(nodeForString) == u"undefined")
1292 binding->stringIndex = registerString(u"undefined"_s);
1294 binding->stringIndex = emptyStringIndex;
1525bool IRBuilder::resolveQualifiedId(QQmlJS::AST::UiQualifiedId **nameToResolve, Object **object,
bool onAssignment)
1527 QQmlJS::AST::UiQualifiedId *qualifiedIdElement = *nameToResolve;
1529 if (qualifiedIdElement->name == QLatin1String(
"id") && qualifiedIdElement->next)
1530 COMPILE_EXCEPTION(qualifiedIdElement->identifierToken, tr(
"Invalid use of id property"));
1533 QString currentName = qualifiedIdElement->name.toString();
1534 if (qualifiedIdElement->next) {
1535 for (
const QV4::CompiledData::Import* import : std::as_const(_imports))
1536 if (import->qualifierIndex != emptyStringIndex
1537 && stringAt(import->qualifierIndex) == currentName) {
1538 qualifiedIdElement = qualifiedIdElement->next;
1539 currentName += QLatin1Char(
'.') + qualifiedIdElement->name;
1541 if (!qualifiedIdElement->name.data()->isUpper())
1542 COMPILE_EXCEPTION(qualifiedIdElement->firstSourceLocation(), tr(
"Expected type name"));
1549 while (qualifiedIdElement->next) {
1550 const quint32 propertyNameIndex = registerString(currentName);
1551 const bool isAttachedProperty = qualifiedIdElement->name.data()->isUpper();
1553 Binding *binding = (*object)->findBinding(propertyNameIndex);
1555 if (isAttachedProperty) {
1556 if (!binding->isAttachedProperty())
1558 }
else if (!binding->isGroupProperty()) {
1563 binding = New<Binding>();
1564 binding->propertyNameIndex = propertyNameIndex;
1565 binding->offset = qualifiedIdElement->identifierToken.offset;
1566 binding->location.set(qualifiedIdElement->identifierToken.startLine,
1567 qualifiedIdElement->identifierToken.startColumn);
1568 binding->valueLocation.set(qualifiedIdElement->next->identifierToken.startLine,
1569 qualifiedIdElement->next->identifierToken.startColumn);
1570 binding->clearFlags();
1573 binding->setFlag(QV4::CompiledData::Binding::IsOnAssignment);
1575 if (isAttachedProperty)
1576 binding->setType(QV4::CompiledData::Binding::Type_AttachedProperty);
1578 binding->setType(QV4::CompiledData::Binding::Type_GroupProperty);
1581 if (!defineQMLObject(&objIndex,
nullptr, binding->location,
nullptr,
nullptr))
1583 binding->value.objectIndex = objIndex;
1585 QString error = (*object)->appendBinding(binding,
false);
1586 if (!error.isEmpty()) {
1587 recordError(qualifiedIdElement->identifierToken, error);
1590 *object = _objects.at(objIndex);
1592 Q_ASSERT(binding->isAttachedProperty() || binding->isGroupProperty());
1593 *object = _objects.at(binding->value.objectIndex);
1596 qualifiedIdElement = qualifiedIdElement->next;
1597 if (qualifiedIdElement)
1598 currentName = qualifiedIdElement->name.toString();
1600 *nameToResolve = qualifiedIdElement;
1648void QmlUnitGenerator::generate(Document &output,
const QV4::CompiledData::DependentTypesHasher &dependencyHasher)
1650 using namespace QV4::CompiledData;
1652 output.jsGenerator.stringTable.registerString(output.jsModule.fileName);
1653 output.jsGenerator.stringTable.registerString(output.jsModule.finalUrl);
1655 Unit *jsUnit =
nullptr;
1657 if (!output.javaScriptCompilationUnit)
1658 output.javaScriptCompilationUnit.adopt(
new QV4::CompiledData::CompilationUnit);
1661 if (output.javaScriptCompilationUnit->unitData()) {
1662 jsUnit =
const_cast<Unit *>(output.javaScriptCompilationUnit->unitData());
1663 output.javaScriptCompilationUnit->dynamicStrings
1664 = output.jsGenerator.stringTable.allStrings();
1667 jsUnit = createdUnit = output.jsGenerator.generateUnit();
1670 for (Pragma *p : std::as_const(output.pragmas)) {
1672 case Pragma::Singleton:
1673 createdUnit->flags |= Unit::IsSingleton;
1675 case Pragma::Strict:
1676 createdUnit->flags |= Unit::IsStrict;
1678 case Pragma::ComponentBehavior:
1680 switch (p->componentBehavior) {
1682 createdUnit->flags |= Unit::ComponentsBound;
1684 case Pragma::Unbound:
1689 case Pragma::ListPropertyAssignBehavior:
1690 switch (p->listPropertyAssignBehavior) {
1691 case Pragma::Replace:
1692 createdUnit->flags |= Unit::ListPropertyAssignReplace;
1694 case Pragma::ReplaceIfNotDefault:
1695 createdUnit->flags |= Unit::ListPropertyAssignReplaceIfNotDefault;
1697 case Pragma::Append:
1702 case Pragma::FunctionSignatureBehavior:
1703 switch (p->functionSignatureBehavior) {
1704 case Pragma::Enforced:
1706 case Pragma::Ignored:
1707 createdUnit->flags |= Unit::FunctionSignaturesIgnored;
1711 case Pragma::NativeMethodBehavior:
1712 switch (p->nativeMethodBehavior) {
1713 case Pragma::AcceptThisObject:
1714 createdUnit->flags |= Unit::NativeMethodsAcceptThisObject;
1716 case Pragma::RejectThisObject:
1721 case Pragma::ValueTypeBehavior:
1722 if (Pragma::ValueTypeBehaviorValues(p->valueTypeBehavior)
1723 .testFlag(Pragma::Copy)) {
1724 createdUnit->flags |= Unit::ValueTypesCopied;
1726 if (Pragma::ValueTypeBehaviorValues(p->valueTypeBehavior)
1727 .testFlag(Pragma::Addressable)) {
1728 createdUnit->flags |= Unit::ValueTypesAddressable;
1730 if (Pragma::ValueTypeBehaviorValues(p->valueTypeBehavior)
1731 .testFlag(Pragma::Assertable)) {
1732 createdUnit->flags |= Unit::ValueTypesAssertable;
1735 case Pragma::Translator:
1736 if (createdUnit->translationTableSize)
1737 if (quint32_le *index = createdUnit->translationContextIndex())
1738 *index = p->translationContextIndex;
1743 if (dependencyHasher) {
1744 const QByteArray checksum = dependencyHasher();
1745 if (checksum.size() ==
sizeof(createdUnit->dependencyMD5Checksum)) {
1746 memcpy(createdUnit->dependencyMD5Checksum, checksum.constData(),
1747 sizeof(createdUnit->dependencyMD5Checksum));
1751 createdUnit->sourceFileIndex = output.jsGenerator.stringTable.getStringId(output.jsModule.fileName);
1752 createdUnit->finalUrlIndex = output.jsGenerator.stringTable.getStringId(output.jsModule.finalUrl);
1756 output.jsGenerator.stringTable.freeze();
1758 const uint importSize = uint(
sizeof(QV4::CompiledData::Import)) * output.imports.size();
1759 const uint objectOffsetTableSize = output.objects.size() * uint(
sizeof(quint32));
1761 QHash<
const Object*, quint32> objectOffsets;
1763 const unsigned int objectOffset =
sizeof(QV4::CompiledData::QmlUnit) + importSize;
1764 uint nextOffset = objectOffset + objectOffsetTableSize;
1765 for (Object *o : std::as_const(output.objects)) {
1766 objectOffsets.insert(o, nextOffset);
1767 nextOffset += QV4::CompiledData::Object::calculateSizeExcludingSignalsAndEnums(o->functionCount(), o->propertyCount(), o->aliasCount(), o->enumCount(), o->signalCount(), o->bindingCount(), o->namedObjectsInComponent.size(), o->inlineComponentCount(), o->requiredPropertyExtraDataCount());
1769 int signalTableSize = 0;
1770 for (
const Signal *s = o->firstSignal(); s; s = s->next)
1771 signalTableSize += QV4::CompiledData::Signal::calculateSize(s->parameters->count);
1773 nextOffset += signalTableSize;
1775 int enumTableSize = 0;
1776 for (
const Enum *e = o->firstEnum(); e; e = e->next)
1777 enumTableSize += QV4::CompiledData::Enum::calculateSize(e->enumValues->count);
1779 nextOffset += enumTableSize;
1782 const uint totalSize = nextOffset;
1783 char *data = (
char*)malloc(totalSize);
1784 memset(data, 0, totalSize);
1785 QV4::CompiledData::QmlUnit *qmlUnit =
reinterpret_cast<QV4::CompiledData::QmlUnit *>(data);
1786 qmlUnit->offsetToImports =
sizeof(*qmlUnit);
1787 qmlUnit->nImports = output.imports.size();
1788 qmlUnit->offsetToObjects = objectOffset;
1789 qmlUnit->nObjects = output.objects.size();
1792 char *importPtr = data + qmlUnit->offsetToImports;
1793 for (
const QV4::CompiledData::Import *imp : std::as_const(output.imports)) {
1794 QV4::CompiledData::Import *importToWrite =
reinterpret_cast<QV4::CompiledData::Import*>(importPtr);
1795 *importToWrite = *imp;
1796 importPtr +=
sizeof(QV4::CompiledData::Import);
1800 quint32_le *objectTable =
reinterpret_cast<quint32_le*>(data + qmlUnit->offsetToObjects);
1801 for (
int i = 0; i < output.objects.size(); ++i) {
1802 const Object *o = output.objects.at(i);
1803 char *
const objectPtr = data + objectOffsets.value(o);
1804 *objectTable++ = objectOffsets.value(o);
1806 QV4::CompiledData::Object *objectToWrite =
reinterpret_cast<QV4::CompiledData::Object*>(objectPtr);
1807 objectToWrite->inheritedTypeNameIndex = o->inheritedTypeNameIndex;
1808 objectToWrite->indexOfDefaultPropertyOrAlias = o->indexOfDefaultPropertyOrAlias;
1809 objectToWrite->setHasAliasAsDefaultProperty(o->defaultPropertyIsAlias);
1810 objectToWrite->setFlags(QV4::CompiledData::Object::Flags(o->flags));
1811 objectToWrite->idNameIndex = o->idNameIndex;
1812 objectToWrite->setObjectId(o->id);
1813 objectToWrite->location = o->location;
1814 objectToWrite->locationOfIdProperty = o->locationOfIdProperty;
1816 quint32 nextOffset =
sizeof(QV4::CompiledData::Object);
1818 objectToWrite->nFunctions = o->functionCount();
1819 objectToWrite->offsetToFunctions = nextOffset;
1820 nextOffset += objectToWrite->nFunctions *
sizeof(quint32);
1822 objectToWrite->nProperties = o->propertyCount();
1823 objectToWrite->offsetToProperties = nextOffset;
1824 nextOffset += objectToWrite->nProperties *
sizeof(QV4::CompiledData::Property);
1826 objectToWrite->nAliases = o->aliasCount();
1827 objectToWrite->offsetToAliases = nextOffset;
1828 nextOffset += objectToWrite->nAliases *
sizeof(QV4::CompiledData::Alias);
1830 objectToWrite->nEnums = o->enumCount();
1831 objectToWrite->offsetToEnums = nextOffset;
1832 nextOffset += objectToWrite->nEnums *
sizeof(quint32);
1834 objectToWrite->nSignals = o->signalCount();
1835 objectToWrite->offsetToSignals = nextOffset;
1836 nextOffset += objectToWrite->nSignals *
sizeof(quint32);
1838 objectToWrite->nBindings = o->bindingCount();
1839 objectToWrite->offsetToBindings = nextOffset;
1840 nextOffset += objectToWrite->nBindings *
sizeof(QV4::CompiledData::Binding);
1842 objectToWrite->nNamedObjectsInComponent = o->namedObjectsInComponent.size();
1843 objectToWrite->offsetToNamedObjectsInComponent = nextOffset;
1844 nextOffset += objectToWrite->nNamedObjectsInComponent *
sizeof(quint32);
1846 objectToWrite->nInlineComponents = o->inlineComponentCount();
1847 objectToWrite->offsetToInlineComponents = nextOffset;
1848 nextOffset += objectToWrite->nInlineComponents *
sizeof (QV4::CompiledData::InlineComponent);
1850 objectToWrite->nRequiredPropertyExtraData = o->requiredPropertyExtraDataCount();
1851 objectToWrite->offsetToRequiredPropertyExtraData = nextOffset;
1852 nextOffset += objectToWrite->nRequiredPropertyExtraData *
sizeof(QV4::CompiledData::RequiredPropertyExtraData);
1854 quint32_le *functionsTable =
reinterpret_cast<quint32_le *>(objectPtr + objectToWrite->offsetToFunctions);
1855 for (
const Function *f = o->firstFunction(); f; f = f->next)
1856 *functionsTable++ = o->runtimeFunctionIndices.at(f->index);
1858 char *propertiesPtr = objectPtr + objectToWrite->offsetToProperties;
1859 for (
const Property *p = o->firstProperty(); p; p = p->next) {
1860 QV4::CompiledData::Property *propertyToWrite =
reinterpret_cast<QV4::CompiledData::Property*>(propertiesPtr);
1861 *propertyToWrite = *p;
1862 propertiesPtr +=
sizeof(QV4::CompiledData::Property);
1865 char *aliasesPtr = objectPtr + objectToWrite->offsetToAliases;
1866 for (
const Alias *a = o->firstAlias(); a; a = a->next) {
1867 QV4::CompiledData::Alias *aliasToWrite =
reinterpret_cast<QV4::CompiledData::Alias*>(aliasesPtr);
1869 aliasesPtr +=
sizeof(QV4::CompiledData::Alias);
1872 char *bindingPtr = objectPtr + objectToWrite->offsetToBindings;
1873 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isValueBindingNoAlias);
1874 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isSignalHandler);
1875 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isAttachedProperty);
1876 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isGroupProperty);
1877 bindingPtr = writeBindings(bindingPtr, o, &QV4::CompiledData::Binding::isValueBindingToAlias);
1878 Q_ASSERT((bindingPtr - objectToWrite->offsetToBindings - objectPtr) /
sizeof(QV4::CompiledData::Binding) ==
unsigned(o->bindingCount()));
1880 quint32_le *signalOffsetTable =
reinterpret_cast<quint32_le *>(objectPtr + objectToWrite->offsetToSignals);
1881 quint32 signalTableSize = 0;
1882 char *signalPtr = objectPtr + nextOffset;
1883 for (
const Signal *s = o->firstSignal(); s; s = s->next) {
1884 *signalOffsetTable++ = signalPtr - objectPtr;
1885 QV4::CompiledData::Signal *signalToWrite =
reinterpret_cast<QV4::CompiledData::Signal*>(signalPtr);
1887 signalToWrite->nameIndex = s->nameIndex;
1888 signalToWrite->location = s->location;
1889 signalToWrite->nParameters = s->parameters->count;
1891 QV4::CompiledData::Parameter *parameterToWrite =
reinterpret_cast<QV4::CompiledData::Parameter*>(signalPtr +
sizeof(*signalToWrite));
1892 for (Parameter *param = s->parameters->first; param; param = param->next, ++parameterToWrite)
1893 *parameterToWrite = *param;
1895 int size = QV4::CompiledData::Signal::calculateSize(s->parameters->count);
1896 signalTableSize += size;
1899 nextOffset += signalTableSize;
1901 quint32_le *enumOffsetTable =
reinterpret_cast<quint32_le*>(objectPtr + objectToWrite->offsetToEnums);
1902 char *enumPtr = objectPtr + nextOffset;
1903 for (
const Enum *e = o->firstEnum(); e; e = e->next) {
1904 *enumOffsetTable++ = enumPtr - objectPtr;
1905 QV4::CompiledData::Enum *enumToWrite =
reinterpret_cast<QV4::CompiledData::Enum*>(enumPtr);
1907 enumToWrite->nameIndex = e->nameIndex;
1908 enumToWrite->location = e->location;
1909 enumToWrite->nEnumValues = e->enumValues->count;
1911 QV4::CompiledData::EnumValue *enumValueToWrite =
reinterpret_cast<QV4::CompiledData::EnumValue*>(enumPtr +
sizeof(*enumToWrite));
1912 for (EnumValue *enumValue = e->enumValues->first; enumValue; enumValue = enumValue->next, ++enumValueToWrite)
1913 *enumValueToWrite = *enumValue;
1915 int size = QV4::CompiledData::Enum::calculateSize(e->enumValues->count);
1919 quint32_le *namedObjectInComponentPtr =
reinterpret_cast<quint32_le *>(objectPtr + objectToWrite->offsetToNamedObjectsInComponent);
1920 for (
int i = 0; i < o->namedObjectsInComponent.size(); ++i) {
1921 *namedObjectInComponentPtr++ = o->namedObjectsInComponent.at(i);
1924 char *inlineComponentPtr = objectPtr + objectToWrite->offsetToInlineComponents;
1925 for (
auto it = o->inlineComponentsBegin(); it != o->inlineComponentsEnd(); ++it) {
1926 const InlineComponent *ic = it.ptr;
1927 QV4::CompiledData::InlineComponent *icToWrite =
reinterpret_cast<QV4::CompiledData::InlineComponent*>(inlineComponentPtr);
1929 inlineComponentPtr +=
sizeof(QV4::CompiledData::InlineComponent);
1932 char *requiredPropertyExtraDataPtr = objectPtr + objectToWrite->offsetToRequiredPropertyExtraData;
1933 for (
auto it = o->requiredPropertyExtraDataBegin(); it != o->requiredPropertyExtraDataEnd(); ++it) {
1934 const RequiredPropertyExtraData *extraData = it.ptr;
1935 QV4::CompiledData::RequiredPropertyExtraData *extraDataToWrite =
reinterpret_cast<QV4::CompiledData::RequiredPropertyExtraData*>(requiredPropertyExtraDataPtr);
1936 *extraDataToWrite = *extraData;
1937 requiredPropertyExtraDataPtr +=
sizeof(QV4::CompiledData::RequiredPropertyExtraData);
1941 if (!output.javaScriptCompilationUnit->unitData()) {
1943 jsUnit =
static_cast<QV4::CompiledData::Unit *>(realloc(jsUnit, jsUnit->unitSize + totalSize));
1944 jsUnit->offsetToQmlUnit = jsUnit->unitSize;
1945 jsUnit->unitSize += totalSize;
1946 memcpy(jsUnit->qmlUnit(), qmlUnit, totalSize);
1948 QV4::Compiler::JSUnitGenerator::generateUnitChecksum(jsUnit);
1949 qmlUnit = jsUnit->qmlUnit();
1952 static const bool showStats = qEnvironmentVariableIsSet(
"QML_SHOW_UNIT_STATS");
1954 qDebug() <<
"Generated QML unit that is" << totalSize <<
"bytes big contains:";
1955 qDebug() <<
" " << jsUnit->functionTableSize <<
"functions";
1956 qDebug() <<
" " << jsUnit->unitSize <<
"for JS unit";
1957 qDebug() <<
" " << importSize <<
"for imports";
1958 qDebug() <<
" " << nextOffset - objectOffset - objectOffsetTableSize <<
"for" << qmlUnit->nObjects <<
"objects";
1959 quint32 totalBindingCount = 0;
1960 for (quint32 i = 0; i < qmlUnit->nObjects; ++i)
1961 totalBindingCount += qmlUnit->objectAt(i)->nBindings;
1962 qDebug() <<
" " << totalBindingCount <<
"bindings";
1963 quint32 totalCodeSize = 0;
1964 for (quint32 i = 0; i < jsUnit->functionTableSize; ++i)
1965 totalCodeSize += jsUnit->functionAt(i)->codeSize;
1966 qDebug() <<
" " << totalCodeSize <<
"bytes total byte code";
1967 qDebug() <<
" " << jsUnit->stringTableSize <<
"strings";
1968 quint32 totalStringSize = 0;
1969 for (quint32 i = 0; i < jsUnit->stringTableSize; ++i)
1970 totalStringSize += QV4::CompiledData::String::calculateSize(jsUnit->stringAtInternal(i));
1971 qDebug() <<
" " << totalStringSize <<
"bytes total strings";
1974 output.javaScriptCompilationUnit->setUnitData(
1975 jsUnit, qmlUnit, output.jsModule.fileName, output.jsModule.finalUrl);