4#ifndef QV4COMPILEDDATA_P_H
5#define QV4COMPILEDDATA_P_H
20#include <QtCore/qcryptographichash.h>
21#include <QtCore/qhash.h>
22#include <QtCore/qhashfunctions.h>
23#include <QtCore/qlocale.h>
24#include <QtCore/qscopeguard.h>
25#include <QtCore/qstring.h>
26#include <QtCore/qstringlist.h>
27#include <QtCore/qurl.h>
28#include <QtCore/qvector.h>
29#include <QtCore/qtyperevision.h>
30#include <QtCore/qxpfunctional.h>
32#if QT_CONFIG(temporaryfile)
33#include <QtCore/qsavefile.h>
36#include <private/qendian_p.h>
37#include <private/qqmlnullablevalue_p.h>
38#include <private/qqmlpropertycachevector_p.h>
39#include <private/qqmlrefcount_p.h>
40#include <private/qqmltype_p.h>
41#include <private/qv4compilationunitmapper_p.h>
42#include <private/qv4staticvalue_p.h>
57#define QV4_DATA_STRUCTURE_VERSION 0x4f
60class QQmlTypeNameCache;
93 bool addToHash(QCryptographicHash *hash, QHash<quintptr, QByteArray> *checksums)
const;
102template <
typename ItemType,
typename Container,
const ItemType *(Container::*IndexedGetter)(
int index)
const>
138 m_data.set<LineField>(l);
139 m_data.set<ColumnField>(c);
140 Q_ASSERT(m_data.get<LineField>() == l);
141 Q_ASSERT(m_data.get<ColumnField>() == c);
145 return m_data.get<LineField>() < other.m_data.get<LineField>()
146 || (m_data.get<LineField>() == other.m_data.get<LineField>()
147 && m_data.get<ColumnField>() < other.m_data.get<ColumnField>());
152 return QT_PREPEND_NAMESPACE(qHash)(location.m_data.data(), seed);
157 return a.m_data.data()== b.m_data.data();
174 quint32_le_bitfield_union<LineField, ColumnField> m_data;
176static_assert(
sizeof(
Location) == 4,
"Location structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
194 m_data.set<FlagsField>(flags);
195 m_data.set<StringIndexField>(stringIndex);
204 quint32_le_bitfield_union<FlagsField, StringIndexField> m_data;
206static_assert(
sizeof(
RegExp) == 4,
"RegExp structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
229 m_data.set<TypeField>(type);
230 m_data.set<ModeField>(mode);
231 m_data.set<NameIndexField>(nameIndex);
239 quint32_le_bitfield_union<TypeField, ModeField, NameIndexField> m_data;
241static_assert(
sizeof(
Lookup) == 4,
"Lookup structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
247 void set(quint32 nameOffset,
bool isAccessor)
249 m_data.set<NameOffsetField>(nameOffset);
250 m_data.set<IsAccessorField>(isAccessor ? 1 : 0);
254 bool isAccessor()
const {
return m_data.get<IsAccessorField>() != 0; }
259 quint32_le_bitfield_union<NameOffsetField, IsAccessorField> m_data;
261static_assert(
sizeof(
JSClassMember) == 4,
"JSClassMember structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
270static_assert(
sizeof(
JSClass) == 4,
"JSClass structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
279 return (
sizeof(String) + (
int(str.size()) + 1) *
sizeof(quint16) + 7) & ~0x7;
283static_assert (
sizeof (
String) == 4,
"String structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
290static_assert(
sizeof(
CodeOffsetToLineAndStatement) == 12,
"CodeOffsetToLineAndStatement structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
299 const quint32_le *
localsTable()
const {
return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + localsOffset); }
302 int trailingData = nLocals*
sizeof (quint32);
303 size_t size = align(align(
sizeof(
Block)) + size_t(trailingData));
304 Q_ASSERT(size < INT_MAX);
309 return (a + 7) & ~size_t(7);
312static_assert(
sizeof(
Block) == 12,
"Block structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
346 void set(Flags flags, quint32 typeNameIndexOrCommonType)
348 m_data.set<IsListField>(flags.testFlag(List) ? 1 : 0);
349 m_data.set<IndexIsCommonTypeField>(flags.testFlag(Common) ? 1 : 0);
350 m_data.set<TypeNameIndexOrCommonTypeField>(typeNameIndexOrCommonType);
355 return m_data.get<IndexIsCommonTypeField>() != 0;
360 return m_data.get<IsListField>() != 0;
365 return m_data.get<TypeNameIndexOrCommonTypeField>();
372 quint32_le_bitfield_union<IndexIsCommonTypeField, IsListField, TypeNameIndexOrCommonTypeField> m_data;
374static_assert(
sizeof(
ParameterType) == 4,
"ParameterType structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
381static_assert(
sizeof(
Parameter) == 8,
"Parameter structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
419 return lineAndStatementNumberOffset() + nLineAndStatementNumbers *
sizeof(CodeOffsetToLineAndStatement);
431 return reinterpret_cast<
const Parameter *>(
432 reinterpret_cast<
const char *>(
this) + formalsOffset);
436 return reinterpret_cast<
const quint32_le *>(
437 reinterpret_cast<
const char *>(
this) + localsOffset);
441 return reinterpret_cast<
const CodeOffsetToLineAndStatement *>(
442 reinterpret_cast<
const char *>(
this) + lineAndStatementNumberOffset());
450 const quint32_le *
labelInfoTable()
const {
return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + labelInfosOffset()); }
452 const char *
code()
const {
return reinterpret_cast<
const char *>(
this) + codeOffset; }
455 int nFormals,
int nLocals,
int nLinesAndStatements,
int labelInfoSize,
int codeSize)
457 const size_t trailingData = nFormals *
sizeof(Parameter)
458 + (nLocals + labelInfoSize) *
sizeof (quint32)
459 + nLinesAndStatements *
sizeof(CodeOffsetToLineAndStatement);
460 size_t size = align(align(
sizeof(
Function)) + size_t(trailingData)) + align(codeSize);
461 Q_ASSERT(size < INT_MAX);
466 return (a + 7) & ~size_t(7);
469static_assert(
sizeof(
Function) == 56,
"Function structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
482static_assert(
sizeof(
Method) == 12,
"Method structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
493 const Method *
methodTable()
const {
return reinterpret_cast<
const Method *>(
reinterpret_cast<
const char *>(
this) + methodTableOffset); }
496 int trailingData = (nStaticMethods + nMethods) *
sizeof(
Method);
497 size_t size = align(
sizeof(
Class) + trailingData);
498 Q_ASSERT(size < INT_MAX);
503 return (a + 7) & ~size_t(7);
506static_assert(
sizeof(
Class) == 24,
"Class structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
513 int trailingData = 2 * size *
sizeof(quint32_le);
515 Q_ASSERT(s < INT_MAX);
520 return (a + 7) & ~size_t(7);
524 return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this + 1));
528 return stringTable()[i];
531 return stringTable()[size + i];
534static_assert(
sizeof(
TemplateObject) == 4,
"Template object structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
544static_assert(
sizeof(
ExportEntry) == 20,
"ExportEntry structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
553static_assert(
sizeof(
ImportEntry) == 16,
"ImportEntry structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
565static_assert(
sizeof(
TranslationData) == 16,
"TranslationData structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
605 void setFlag(
Flag flag) { flagsAndType.set<FlagsField>(flagsAndType.get<FlagsField>() | flag); }
606 bool hasFlag(
Flag flag)
const {
return Flags(flagsAndType.get<FlagsField>()) & flag; }
607 Flags flags()
const {
return Flags(flagsAndType.get<FlagsField>()); }
610 Type type()
const {
return Type(flagsAndType.get<TypeField>()); }
629 const Flags bindingFlags = flags();
687 QString tmp = QLatin1String(
"\"");
688 for (
int i = 0; i < string.size(); ++i) {
689 const QChar &c = string.at(i);
690 switch (c.unicode()) {
692 tmp += QLatin1String(
"\\b");
695 tmp += QLatin1String(
"\\t");
698 tmp += QLatin1String(
"\\n");
701 tmp += QLatin1String(
"\\v");
704 tmp += QLatin1String(
"\\f");
707 tmp += QLatin1String(
"\\r");
710 tmp += QLatin1String(
"\\\"");
713 tmp += QLatin1String(
"\\\'");
716 tmp += QLatin1String(
"\\\\");
723 tmp += QLatin1Char(
'\"');
738 if (type() == Type_Boolean)
744static_assert(
sizeof(
Binding) == 24,
"Binding structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
753static_assert(
sizeof(
InlineComponent) == 12,
"InlineComponent structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
760static_assert(
sizeof(
EnumValue) == 8,
"EnumValue structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
769 return reinterpret_cast<
const EnumValue*>(
this + 1) + idx;
784static_assert(
sizeof(
Enum) == 12,
"Enum structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
794 return reinterpret_cast<
const Parameter*>(
this + 1) + idx;
809static_assert(
sizeof(
Signal) == 12,
"Signal structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
857 void setNameIndex(
int nameIndex) { nameIndexAndVirtSpecifiers.set<NameIndexField>(nameIndex); }
859 bool isVirtual()
const {
return nameIndexAndVirtSpecifiers.get<IsVirtualField>(); }
862 nameIndexAndVirtSpecifiers.set<IsVirtualField>(isVirtual ? 1 : 0);
865 bool isOverride()
const {
return nameIndexAndVirtSpecifiers.get<IsOverrideField>(); }
868 nameIndexAndVirtSpecifiers.set<IsOverrideField>(isOverride ? 1 : 0);
871 bool isFinal()
const {
return nameIndexAndVirtSpecifiers.get<IsFinalField>(); }
872 void setIsFinal(
bool isFinal) { nameIndexAndVirtSpecifiers.set<IsFinalField>(isFinal ? 1 : 0); }
876 data.set<CommonTypeOrTypeNameIndexField>(
static_cast<quint32>(t));
877 data.set<IsCommonTypeField>(
true);
882 return CommonType(data.get<CommonTypeOrTypeNameIndexField>());
888 data.set<CommonTypeOrTypeNameIndexField>(nameIndex);
889 data.set<IsCommonTypeField>(
false);
894 return data.get<IsCommonTypeField>() ? -1 : data.get<CommonTypeOrTypeNameIndexField>();
900 bool isList()
const {
return data.get<IsListField>(); }
901 void setIsList(
bool isList) { data.set<IsListField>(isList); }
903 bool isRequired()
const {
return data.get<IsRequiredField>(); }
904 void setIsRequired(
bool isRequired) { data.set<IsRequiredField>(isRequired); }
906 bool isReadOnly()
const {
return data.get<IsReadOnlyField>(); }
907 void setIsReadOnly(
bool isReadOnly) { data.set<IsReadOnlyField>(isReadOnly); }
909static_assert(
sizeof(
Property) == 12,
"Property structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
915static_assert (
sizeof(
RequiredPropertyExtraData) == 4,
"RequiredPropertyExtraData structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
919 bool isReadOnly()
const {
return m_nameIndexAndFlags.get<IsReadOnlyField>(); }
920 void setIsReadOnly(
bool isReadOnly) { m_nameIndexAndFlags.set<IsReadOnlyField>(isReadOnly); }
925 m_nameIndexAndFlags.set<NameIndexField>(nameIndex);
929 void setIdIndex(quint32 idIndex) { m_idIndexField = idIndex; }
934 m_propertyNameIndex = propertyNameIndex;
943 m_referenceLocation = referenceLocation;
950 quint32_le_bitfield_union<NameIndexField, IsReadOnlyField> m_nameIndexAndFlags;
951 quint32_le m_idIndexField;
952 quint32_le m_propertyNameIndex;
956static_assert(
sizeof(
Alias) == 20,
"Alias structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
1012 return Flags(flagsAndDefaultPropertyIsAliasAndId.get<FlagsField>());
1017 return flagsAndDefaultPropertyIsAliasAndId.get<FlagsField>() & flag;
1022 flagsAndDefaultPropertyIsAliasAndId.set<FlagsField>(
1023 flagsAndDefaultPropertyIsAliasAndId.get<FlagsField>() | flag);
1028 flagsAndDefaultPropertyIsAliasAndId.set<FlagsField>(flags);
1033 return flagsAndDefaultPropertyIsAliasAndId.get<DefaultPropertyIsAliasField>();
1038 flagsAndDefaultPropertyIsAliasAndId.set<DefaultPropertyIsAliasField>(defaultAlias);
1043 return flagsAndDefaultPropertyIsAliasAndId.get<IdField>();
1048 flagsAndDefaultPropertyIsAliasAndId.set<IdField>(id);
1052 static int calculateSizeExcludingSignalsAndEnums(
int nFunctions,
int nProperties,
int nAliases,
int nEnums,
int nSignals,
int nBindings,
int nNamedObjectsInComponent,
int nInlineComponents,
int nRequiredPropertyExtraData)
1054 return (
sizeof(Object)
1055 + nFunctions *
sizeof(quint32)
1056 + nProperties *
sizeof(Property)
1057 + nAliases *
sizeof(Alias)
1058 + nEnums *
sizeof(quint32)
1059 + nSignals *
sizeof(quint32)
1060 + nBindings *
sizeof(Binding)
1061 + nNamedObjectsInComponent *
sizeof(
int)
1062 + nInlineComponents *
sizeof(InlineComponent)
1063 + nRequiredPropertyExtraData *
sizeof(RequiredPropertyExtraData)
1070 return reinterpret_cast<
const quint32_le*>(
reinterpret_cast<
const char *>(
this) + offsetToFunctions);
1075 return reinterpret_cast<
const Property*>(
reinterpret_cast<
const char *>(
this) + offsetToProperties);
1080 return reinterpret_cast<
const Alias*>(
reinterpret_cast<
const char *>(
this) + offsetToAliases);
1085 return reinterpret_cast<
const Binding*>(
reinterpret_cast<
const char *>(
this) + offsetToBindings);
1090 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToEnums);
1091 const quint32_le offset = offsetTable[idx];
1092 return reinterpret_cast<
const Enum*>(
reinterpret_cast<
const char*>(
this) + offset);
1097 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToSignals);
1098 const quint32_le offset = offsetTable[idx];
1099 return reinterpret_cast<
const Signal*>(
reinterpret_cast<
const char*>(
this) + offset);
1109 return reinterpret_cast<
const quint32_le*>(
reinterpret_cast<
const char *>(
this) + offsetToNamedObjectsInComponent);
1114 return reinterpret_cast<
const InlineComponent*>(
reinterpret_cast<
const char *>(
this) + offsetToInlineComponents);
1124 return reinterpret_cast<
const RequiredPropertyExtraData*>(
reinterpret_cast<
const char *>(
this) + offsetToRequiredPropertyExtraData);
1164static_assert(
sizeof(
Object) == 84,
"Object structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
1185 type = 0; uriIndex = 0; qualifierIndex = 0; version = QTypeRevision::zero(); reserved = 0;
1188static_assert(
sizeof(
Import) == 20,
"Import structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
1198 return reinterpret_cast<
const Import*>((
reinterpret_cast<
const char *>(
this)) + offsetToImports + idx *
sizeof(Import));
1202 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToObjects);
1203 const quint32_le offset = offsetTable[idx];
1204 return reinterpret_cast<
const Object*>(
reinterpret_cast<
const char*>(
this) + offset);
1207static_assert(
sizeof(
QmlUnit) == 16,
"QmlUnit structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
1236 enum :
unsigned int {
1295 return reinterpret_cast<
const QmlUnit *>(
reinterpret_cast<
const char *>(
this) + offsetToQmlUnit);
1299 return reinterpret_cast<QmlUnit *>(
reinterpret_cast<
char *>(
this) + offsetToQmlUnit);
1303 return flags & Unit::IsSingleton;
1309 return (flags & Unit::ListPropertyAssignReplace) == Unit::ListPropertyAssignReplace;
1313 return flags & Unit::ListPropertyAssignReplaceIfNotDefault;
1318 Q_ASSERT(idx < stringTableSize);
1319 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToStringTable);
1320 const quint32_le offset = offsetTable[idx];
1321 const String *str =
reinterpret_cast<
const String*>(
reinterpret_cast<
const char *>(
this) + offset);
1322 Q_ASSERT(str->size >= 0);
1323#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
1324 const QChar *characters =
reinterpret_cast<
const QChar *>(str + 1);
1325 if (flags & StaticData)
1326 return QString::fromRawData(characters, str->size);
1327 return QString(characters, str->size);
1329 const quint16_le *characters =
reinterpret_cast<
const quint16_le *>(str + 1);
1330 QString qstr(str->size, Qt::Uninitialized);
1331 QChar *ch = qstr.data();
1332 for (
int i = 0; i < str->size; ++i)
1333 ch[i] = QChar(quint16(characters[i]));
1339 const quint32_le *
classOffsetTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToClassTable); }
1341 const quint32_le *
blockOffsetTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToBlockTable); }
1344 const quint32_le *offsetTable = functionOffsetTable();
1345 const quint32_le offset = offsetTable[idx];
1346 return reinterpret_cast<
const Function*>(
reinterpret_cast<
const char *>(
this) + offset);
1350 const quint32_le *offsetTable = classOffsetTable();
1351 const quint32_le offset = offsetTable[idx];
1352 return reinterpret_cast<
const Class *>(
reinterpret_cast<
const char *>(
this) + offset);
1356 const quint32_le *offsetTable = templateObjectOffsetTable();
1357 const quint32_le offset = offsetTable[idx];
1358 return reinterpret_cast<
const TemplateObject *>(
reinterpret_cast<
const char *>(
this) + offset);
1362 const quint32_le *offsetTable = blockOffsetTable();
1363 const quint32_le offset = offsetTable[idx];
1364 return reinterpret_cast<
const Block *>(
reinterpret_cast<
const char *>(
this) + offset);
1367 const Lookup *
lookupTable()
const {
return reinterpret_cast<
const Lookup*>(
reinterpret_cast<
const char *>(
this) + offsetToLookupTable); }
1369 return reinterpret_cast<
const RegExp*>(
reinterpret_cast<
const char *>(
this) + offsetToRegexpTable + index *
sizeof(RegExp));
1372 return reinterpret_cast<
const quint64_le*>(
reinterpret_cast<
const char *>(
this) + offsetToConstantTable);
1376 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + offsetToJSClassTable);
1377 const quint32_le offset = offsetTable[idx];
1378 const char *ptr =
reinterpret_cast<
const char *>(
this) + offset;
1380 *nMembers = klass->nMembers;
1385 return reinterpret_cast<
const TranslationData *>(
reinterpret_cast<
const char *>(
this) + offsetToTranslationTable);
1389 if ( translationTableSize == 0)
1391 return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this))
1392 + offsetToTranslationTable
1393 + translationTableSize *
sizeof(CompiledData::TranslationData)); }
1396 if ( translationTableSize == 0)
1398 return reinterpret_cast<quint32_le*>((
reinterpret_cast<
char *>(
this))
1399 + offsetToTranslationTable
1400 + translationTableSize *
sizeof(CompiledData::TranslationData)); }
1402 const ImportEntry *
importEntryTable()
const {
return reinterpret_cast<
const ImportEntry *>(
reinterpret_cast<
const char *>(
this) + offsetToImportEntryTable); }
1407 const quint32_le *
moduleRequestTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToModuleRequestTable); }
1409 bool verifyHeader(QDateTime expectedSourceTimeStamp, QString *errorString)
const;
1412static_assert(
sizeof(
Unit) == 216,
"Unit structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
1430 Iterator it = find(nameIndex);
1433 return *insert(nameIndex, loc);
1436 template <
typename CompiledObject>
1439 if (obj->inheritedTypeNameIndex != 0) {
1445 auto binding = obj->bindingsBegin();
1446 auto const bindingEnd = obj->bindingsEnd();
1447 for ( ; binding != bindingEnd; ++binding) {
1449 this->add(binding->propertyNameIndex
, binding->location
);
1452 auto ic = obj->inlineComponentsBegin();
1453 auto const icEnd = obj->inlineComponentsEnd();
1454 for (; ic != icEnd; ++ic) {
1455 this->add(ic->nameIndex
, ic->location
);
1459 template <
typename Iterator>
1462 for (; it != end; ++it)
1463 collectFromObject(*it);
1533 LookupValidationFn validateLookupSignatures,
1534 const QString &fileName = QString(),
1535 const QString &finalUrlString = QString())
1539 this->validateLookupSignatures = validateLookupSignatures;
1551 const QString &fileName = QString(),
const QString &finalUrlString = QString())
1555#if Q_BYTE_ORDER == Q_BIG_ENDIAN
1556 delete [] constants;
1558 constants =
nullptr;
1560 m_finalUrlString.clear();
1564 qmlData = qmlUnit ? qmlUnit : data->qmlUnit();
1566#if Q_BYTE_ORDER == Q_BIG_ENDIAN
1567 StaticValue *bigEndianConstants =
new StaticValue[data->constantTableSize];
1568 const quint64_le *littleEndianConstants = data->constants();
1569 for (uint i = 0; i < data->constantTableSize; ++i)
1570 bigEndianConstants[i] = StaticValue::fromReturnedValue(littleEndianConstants[i]);
1571 constants = bigEndianConstants;
1573 constants =
reinterpret_cast<
const StaticValue*>(data->constants());
1576 m_fileName = !fileName.isEmpty() ? fileName : stringAt(data->sourceFileIndex);
1577 m_finalUrlString = !finalUrlString.isEmpty() ? finalUrlString : stringAt(data->finalUrlIndex);
1582 if (index < data->stringTableSize)
1583 return data->stringAtInternal(index);
1585 const qsizetype dynamicIndex = index - data->stringTableSize;
1586 Q_ASSERT(dynamicIndex < dynamicStrings.size());
1587 return dynamicStrings.at(dynamicIndex);
1597 case Binding::Type_Script:
1598 case Binding::Type_String:
1599 return stringAt(binding->stringIndex);
1601 return QStringLiteral(
"null");
1603 return binding->value.b ? QStringLiteral(
"true") : QStringLiteral(
"false");
1604 case Binding::Type_Number:
1605 return QString::number(bindingValueAsNumber(binding),
'g', QLocale::FloatingPointShortest);
1608 case Binding::Type_TranslationById:
1609 case Binding::Type_Translation:
1610 return stringAt(data->translations()[binding->value.translationDataIndex].stringIndex);
1619 return (binding->type() == CompiledData::Binding::Type_String)
1620 ? CompiledData::Binding::escapedString(stringAt(binding->stringIndex))
1621 : bindingValueAsString(binding);
1629 return binding->value.resolvedEnumValue;
1630 return constants[binding->value.constantValueIndex].doubleValue();
1639 const QUrl &url,
const QDateTime &sourceTimeStamp,
1663 if (!m_url.isValid())
1664 m_url = QUrl(fileName());
1670 if (!m_finalUrl.isValid())
1671 m_finalUrl = QUrl(finalUrlString());
1680 return propertyCaches.isEmpty()
1681 ? QQmlPropertyCache::ConstPtr()
1682 : propertyCaches.at(0);
1694 Q_ASSERT(p && p->isComponentWrapper());
1695 return p->wrappedObjectIndex();
1707 for (
int i =
objectCount(), end = propertyCaches.count(); i < end; ++i) {
1709 Q_ASSERT(p && p->isComponentWrapper());
1710 if (p->wrappedObjectIndex() == index)
1718 for (uint i = 0; i <
qmlData->nObjects; ++i) {
1720 for (
auto it = object->inlineComponentsBegin(), end = object->inlineComponentsEnd();
1722 if (stringAt(it->nameIndex) == inlineComponentName)
1723 return it->objectIndex;
1731 bool verifyChecksum(
const CompiledData::DependentTypesHasher &dependencyHasher)
const;
1817 QString m_finalUrlString;
1819 mutable QQmlNullableValue<QUrl> m_url;
1820 mutable QQmlNullableValue<QUrl> m_finalUrl;
1835 template<
typename Char>
1838 const quint32_le oldFlags = mutableFlags();
1839 auto cleanup = qScopeGuard([
this, oldFlags]() { mutableFlags() = oldFlags; });
1840 mutableFlags() |= temporaryFlags;
1841 return writer(data<Char>(), size());
1844 static bool writeDataToFile(
const QString &outputFileName,
const char *data, quint32 size,
1845 QString *errorString)
1847#if QT_CONFIG(temporaryfile)
1848 QSaveFile cacheFile(outputFileName);
1849 if (!cacheFile.open(QIODevice::WriteOnly | QIODevice::Truncate)
1850 || cacheFile.write(data, size) != size
1851 || !cacheFile.commit()) {
1852 *errorString = cacheFile.errorString();
1856 errorString->clear();
1859 Q_UNUSED(outputFileName);
1860 *errorString = QStringLiteral(
"features.temporaryfile is disabled.");
1867 quint32 temporaryFlags;
1869 quint32_le &mutableFlags()
const
1871 return const_cast<
Unit *>(unit)->flags;
1874 template<
typename Char>
1875 const Char *data()
const
1877 Q_STATIC_ASSERT(
sizeof(Char) == 1);
1878 const Char *dataPtr;
1879 memcpy(&dataPtr, &unit,
sizeof(dataPtr));
1883 quint32 size()
const
1885 return unit->unitSize;
static bool writeDataToFile(const QString &outputFileName, const char *data, quint32 size, QString *errorString)
bool saveToDisk(const std::function< bool(const Char *, quint32)> &writer) const
Combined button and popup list for selecting options.
static const char magic_str[]
Q_DECLARE_TYPEINFO(QV4::CompiledData::JSClassMember, Q_PRIMITIVE_TYPE)
#define QV4_DATA_STRUCTURE_VERSION
Q_DECLARE_OPERATORS_FOR_FLAGS(QV4::CompiledData::ParameterType::Flags)
void setPropertyNameIndex(quint32 propertyNameIndex)
quint32 propertyNameIndex() const
void setIsReadOnly(bool isReadOnly)
Location location() const
void setReferenceLocation(Location referenceLocation)
void setNameIndex(quint32 nameIndex)
Location referenceLocation() const
void setIdIndex(quint32 idIndex)
void setLocation(Location location)
quint32 nameIndex() const
quint32_le propertyNameIndex
bool isNumberBinding() const
bool isSignalHandler() const
bool isFunctionExpression() const
bool hasSignalHandlerBindingFlag() const
bool evaluatesToString() const
bool isAttachedProperty() const
quint32_le_bitfield_union< FlagsField, TypeField > flagsAndType
qint32_le resolvedEnumValue
bool hasFlag(Flag flag) const
bool isGroupProperty() const
bool isValueBindingNoAlias() const
bool isTranslationBinding() const
bool valueAsBoolean() const
static QString escapedString(const QString &string)
bool isValueBinding() const
quint32_le translationDataIndex
quint32_le constantValueIndex
bool isValueBindingToAlias() const
Q_DECLARE_FLAGS(Flags, Flag)
@ InitializerForReadOnlyDeclaration
@ IsSignalHandlerExpression
quint32_le compiledScriptIndex
const quint32_le * localsTable() const
quint16_le sizeOfLocalTemporalDeadZone
static size_t align(size_t a)
static int calculateSize(int nLocals)
static int calculateSize(int nStaticMethods, int nMethods)
static size_t align(size_t a)
quint32_le methodTableOffset
const Method * methodTable() const
quint32_le nStaticMethods
quint32_le constructorFunction
const CompiledObject * object
const CompiledData::Unit * unit
bool operator!=(const FunctionIterator &rhs) const
bool operator==(const FunctionIterator &rhs) const
FunctionIterator(const CompiledData::Unit *unit, const CompiledObject *object, int index)
const CompiledFunction * operator->() const
QString stringAt(uint index) const
std::unique_ptr< CompilationUnitMapper > backingFile
QString bindingValueAsScriptString(const CompiledData::Binding *binding) const
QHash< QString, InlineComponentData > inlineComponentData
Q_QML_EXPORT ~CompilationUnit()
void setUnitData(const Unit *unitData, const QmlUnit *qmlUnit=nullptr, const QString &fileName=QString(), const QString &finalUrlString=QString())
int inlineComponentId(const QString &inlineComponentName) const
QMetaType metaType() const
double bindingValueAsNumber(const CompiledData::Binding *binding) const
void finalizeCompositeType(const QQmlType &type)
ResolvedTypeReference * resolvedType(int id) const
const CompiledData::Function CompiledFunction
const QQmlPrivate::AOTCompiledFunction * aotCompiledFunctions
bool valueTypesAreAssertable() const
int implicitComponentForObject(int index) const
ResolvedTypeReferenceMap resolvedTypes
bool isSharedLibrary() const
bool componentsAreBound() const
QList< BindingPropertyData > bindingPropertyDataPerObject
bool verifyChecksum(const CompiledData::DependentTypesHasher &dependencyHasher) const
QQmlType qmlTypeForComponent(const QString &inlineComponentName=QString()) const
FunctionIterator objectFunctionsBegin(const CompiledObject *object) const
QString finalUrlString() const
QQmlRefPointer< QQmlTypeNameCache > typeNameCache
Q_QML_EXPORT bool saveToDisk(const QUrl &unitUrl, qxp::function_ref< QByteArray() const > sourceChecksum, QString *errorString) const
FunctionIterator objectFunctionsEnd(const CompiledObject *object) const
bool nativeMethodsAcceptThisObjects() const
ListPropertyAssignBehavior listPropertyAssignBehavior() const
const Unit * unitData() const
ListPropertyAssignBehavior
const CompiledObject * objectAt(int index) const
int resolvedIndex(int index) const
bool valueTypesAreAddressable() const
const CompiledData::Object CompiledObject
LookupValidationFn validateLookupSignatures
bool ignoresFunctionSignature() const
bool valueTypesAreCopied() const
const CompiledData::Binding CompiledBinding
const CompiledData::Import * importAt(int index) const
QQmlPropertyCacheVector propertyCaches
CompilationUnit(const Unit *unitData, const QQmlPrivate::AOTCompiledFunction *aotCompiledFunctions, LookupValidationFn validateLookupSignatures, const QString &fileName=QString(), const QString &finalUrlString=QString())
QList< QQmlRefPointer< QQmlScriptData > > dependentScripts
QStringList dynamicStrings
QString bindingValueAsString(const CompiledData::Binding *binding) const
Q_QML_EXPORT bool loadFromDisk(const QUrl &url, const QDateTime &sourceTimeStamp, qxp::function_ref< QByteArray() const > sourceChecksum, QString *errorString)
QQmlPropertyCache::ConstPtr rootPropertyCache() const
const StaticValue * constants
const EnumValue * enumValueAt(int idx) const
const EnumValue * enumValuesEnd() const
const EnumValue * enumValuesBegin() const
static int calculateSize(int nEnumValues)
int enumValueCount() const
quint32_le nestedFunctionIndex
quint16_le firstTemporalDeadZoneRegister
size_t labelInfosOffset() const
const quint32_le * localsTable() const
static size_t align(size_t a)
const CodeOffsetToLineAndStatement * lineAndStatementNumberTable() const
quint16_le sizeOfRegisterTemporalDeadZone
quint16_le sizeOfLocalTemporalDeadZone
const char * code() const
size_t lineAndStatementNumberOffset() const
static int calculateSize(int nFormals, int nLocals, int nLinesAndStatements, int labelInfoSize, int codeSize)
const Parameter * formalsTable() const
const Parameter * formalsEnd() const
const Parameter * formalsBegin() const
const quint32_le * labelInfoTable() const
quint16_le nLineAndStatementNumbers
quint32_le qualifierIndex
InlineComponentData(const QQmlType &qmlType, int objectIndex, int nameIndex)
InlineComponentData()=default
void set(quint32 nameOffset, bool isAccessor)
quint32 nameOffset() const
static int calculateSize(int nMembers)
Location(quint32 l, quint32 c)
friend size_t qHash(const Location &location, size_t seed=0)
bool operator<(const Location &other) const
friend bool comparesEqual(const Location &a, const Location &b) noexcept
Lookup(Type type, Mode mode, quint32 nameIndex)
quint32 nameIndex() const
@ Type_QmlContextPropertyGetter
void setFlags(Flags flags)
quint32_le offsetToBindings
TableIterator< Enum, Object, &Object::enumAt > EnumIterator
EnumIterator enumsBegin() const
Q_DECLARE_FLAGS(Flags, Flag)
quint32_le offsetToAliases
quint32_le offsetToProperties
int propertyCount() const
quint32_le offsetToSignals
const RequiredPropertyExtraData * requiredPropertyExtraDataAt(int idx) const
EnumIterator enumsEnd() const
const Enum * enumAt(int idx) const
RequiredPropertyExtraDataIterator requiredPropertyExtraDataEnd() const
bool hasAliasAsDefaultProperty() const
quint32_le offsetToInlineComponents
const RequiredPropertyExtraData * requiredPropertyExtraDataTable() const
TableIterator< Signal, Object, &Object::signalAt > SignalIterator
const Binding * bindingsEnd() const
quint32_le inheritedTypeNameIndex
bool hasFlag(Flag flag) const
const Property * propertyTable() const
@ HasCustomParserBindings
@ IsPartOfInlineComponent
SignalIterator signalsBegin() const
quint32_le_bitfield_union< FlagsField, DefaultPropertyIsAliasField, IdField > flagsAndDefaultPropertyIsAliasAndId
quint32_le offsetToNamedObjectsInComponent
int namedObjectsInComponentCount() const
InlineComponentIterator inlineComponentsEnd() const
qint32_le indexOfDefaultPropertyOrAlias
int functionCount() const
const Alias * aliasTable() const
quint16_le nInlineComponents
void setObjectId(qint32 id)
quint32_le offsetToRequiredPropertyExtraData
const InlineComponent * inlineComponentAt(int idx) const
const Property * propertiesEnd() const
quint32_le nNamedObjectsInComponent
const Binding * bindingTable() const
quint16_le nRequiredPropertyExtraData
const Signal * signalAt(int idx) const
const Property * propertiesBegin() const
Location locationOfIdProperty
const quint32_le * functionOffsetTable() const
static int calculateSizeExcludingSignalsAndEnums(int nFunctions, int nProperties, int nAliases, int nEnums, int nSignals, int nBindings, int nNamedObjectsInComponent, int nInlineComponents, int nRequiredPropertyExtraData)
TableIterator< InlineComponent, Object, &Object::inlineComponentAt > InlineComponentIterator
const InlineComponent * inlineComponentTable() const
InlineComponentIterator inlineComponentsBegin() const
TableIterator< RequiredPropertyExtraData, Object, &Object::requiredPropertyExtraDataAt > RequiredPropertyExtraDataIterator
SignalIterator signalsEnd() const
const Alias * aliasesEnd() const
quint32_le offsetToFunctions
const Binding * bindingsBegin() const
RequiredPropertyExtraDataIterator requiredPropertyExtraDataBegin() const
void setHasAliasAsDefaultProperty(bool defaultAlias)
int inlineComponentCount() const
const Alias * aliasesBegin() const
const quint32_le * namedObjectsInComponentTable() const
quint32 typeNameIndexOrCommonType() const
void set(Flags flags, quint32 typeNameIndexOrCommonType)
bool indexIsCommonType() const
Q_DECLARE_FLAGS(Flags, Flag)
void setNameIndex(int nameIndex)
void setIsList(bool isList)
void setIsReadOnly(bool isReadOnly)
bool isCommonType() const
void setTypeNameIndex(int nameIndex)
void setIsVirtual(bool isVirtual)
void setIsFinal(bool isFinal)
quint32 nameIndex() const
quint32_le_bitfield_union< CommonTypeOrTypeNameIndexField, IsRequiredField, IsCommonTypeField, IsListField, IsReadOnlyField > data
quint32_le_bitfield_union< NameIndexField, IsVirtualField, IsOverrideField, IsFinalField > nameIndexAndVirtSpecifiers
void setIsOverride(bool isOverride)
uint commonTypeOrTypeNameIndex() const
int typeNameIndex() const
void setIsRequired(bool isRequired)
void setCommonType(CommonType t)
CommonType commonType() const
quint32_le offsetToObjects
const Object * objectAt(int idx) const
const Import * importAt(int idx) const
quint32_le offsetToImports
quint32 stringIndex() const
RegExp(quint32 flags, quint32 stringIndex)
Q_DECLARE_FLAGS(Flags, Flag)
bool addToHash(QCryptographicHash *hash, QHash< quintptr, QByteArray > *checksums) const
int parameterCount() const
const Parameter * parametersBegin() const
static int calculateSize(int nParameters)
const Parameter * parametersEnd() const
const Parameter * parameterAt(int idx) const
static int calculateSize(const QString &str)
bool operator==(const TableIterator &rhs) const
ItemType operator*() const
TableIterator & operator++()
const Container * container
bool operator!=(const TableIterator &rhs) const
TableIterator(const Container *container, int index)
TableIterator operator+(int offset) const
const ItemType * operator->() const
TableIterator operator++(int)
int operator-(TableIterator other) const
TableIterator operator-(int offset) const
static int calculateSize(int size)
uint stringIndexAt(uint i) const
static size_t align(size_t a)
uint rawStringIndexAt(uint i) const
const quint32_le * stringTable() const
void collectFromObject(const CompiledObject *obj)
TypeReference & add(int nameIndex, const Location &loc)
void collectFromObjects(Iterator it, Iterator end)
TypeReference(const Location &loc)
quint32_le offsetToLookupTable
quint32_le offsetToIndirectExportEntryTable
quint32_le offsetToJSClassTable
quint32_le jsClassTableSize
quint32_le * translationContextIndex()
quint32_le offsetToTemplateObjectTable
quint32_le functionTableSize
const TranslationData * translations() const
quint32_le offsetToRegexpTable
quint32_le importEntryTableSize
const ExportEntry * indirectExportEntryTable() const
const quint64_le * constants() const
quint32_le starExportEntryTableSize
quint32_le lookupTableSize
qint32_le indexOfRootFunction
QString stringAtInternal(uint idx) const
quint32_le offsetToLocalExportEntryTable
const quint32_le * functionOffsetTable() const
bool isListPropertyAssignReplaceIfNotDefault() const
bool verifyHeader(QDateTime expectedSourceTimeStamp, QString *errorString) const
quint32_le offsetToClassTable
quint32_le classTableSize
quint32_le offsetToStringTable
quint32_le offsetToQmlUnit
const Function * functionAt(int idx) const
const TemplateObject * templateObjectAt(int idx) const
quint32_le offsetToFunctionTable
quint32_le offsetToStarExportEntryTable
const ExportEntry * starExportEntryTable() const
const Lookup * lookupTable() const
quint32_le offsetToModuleRequestTable
quint32_le translationTableSize
const RegExp * regexpAt(int index) const
const Block * blockAt(int idx) const
const ExportEntry * localExportEntryTable() const
const quint32_le * translationContextIndex() const
const quint32_le * classOffsetTable() const
@ ListPropertyAssignReplace
@ FunctionSignaturesIgnored
@ ListPropertyAssignReplaceIfDefault
@ ListPropertyAssignReplaceIfNotDefault
@ NativeMethodsAcceptThisObject
const quint32_le * moduleRequestTable() const
quint32_le sourceFileIndex
quint32_le moduleRequestTableSize
quint32_le offsetToTranslationTable
quint32_le blockTableSize
quint32_le templateObjectTableSize
quint32_le localExportEntryTableSize
bool isListPropertyAssignReplace() const
const Class * classAt(int idx) const
quint32_le regexpTableSize
quint32_le offsetToImportEntryTable
quint32_le stringTableSize
quint32_le constantTableSize
const ImportEntry * importEntryTable() const
qint64_le sourceTimeStamp
char dependencyMD5Checksum[16]
const QmlUnit * qmlUnit() const
quint32_le offsetToConstantTable
quint32_le offsetToBlockTable
const quint32_le * blockOffsetTable() const
quint32_le indirectExportEntryTableSize
const JSClassMember * jsClassAt(int idx, int *nMembers) const
const quint32_le * templateObjectOffsetTable() const