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>
31#if QT_CONFIG(temporaryfile)
32#include <QtCore/qsavefile.h>
35#include <private/qendian_p.h>
36#include <private/qqmlnullablevalue_p.h>
37#include <private/qqmlpropertycachevector_p.h>
38#include <private/qqmlrefcount_p.h>
39#include <private/qqmltype_p.h>
40#include <private/qv4compilationunitmapper_p.h>
41#include <private/qv4staticvalue_p.h>
56#define QV4_DATA_STRUCTURE_VERSION 0x4c
59class QQmlTypeNameCache;
92 bool addToHash(QCryptographicHash *hash, QHash<quintptr, QByteArray> *checksums)
const;
101template <
typename ItemType,
typename Container,
const ItemType *(Container::*IndexedGetter)(
int index)
const>
137 m_data.set<LineField>(l);
138 m_data.set<ColumnField>(c);
139 Q_ASSERT(m_data.get<LineField>() == l);
140 Q_ASSERT(m_data.get<ColumnField>() == c);
144 return m_data.get<LineField>() < other.m_data.get<LineField>()
145 || (m_data.get<LineField>() == other.m_data.get<LineField>()
146 && m_data.get<ColumnField>() < other.m_data.get<ColumnField>());
151 return QT_PREPEND_NAMESPACE(qHash)(location.m_data.data(), seed);
156 return a.m_data.data()== b.m_data.data();
173 quint32_le_bitfield_union<LineField, ColumnField> m_data;
175static_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");
193 m_data.set<FlagsField>(flags);
194 m_data.set<StringIndexField>(stringIndex);
203 quint32_le_bitfield_union<FlagsField, StringIndexField> m_data;
205static_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");
228 m_data.set<TypeField>(type);
229 m_data.set<ModeField>(mode);
230 m_data.set<NameIndexField>(nameIndex);
238 quint32_le_bitfield_union<TypeField, ModeField, NameIndexField> m_data;
240static_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");
246 void set(quint32 nameOffset,
bool isAccessor)
248 m_data.set<NameOffsetField>(nameOffset);
249 m_data.set<IsAccessorField>(isAccessor ? 1 : 0);
253 bool isAccessor()
const {
return m_data.get<IsAccessorField>() != 0; }
258 quint32_le_bitfield_union<NameOffsetField, IsAccessorField> m_data;
260static_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");
269static_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");
278 return (
sizeof(String) + (
int(str.size()) + 1) *
sizeof(quint16) + 7) & ~0x7;
282static_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");
289static_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");
298 const quint32_le *
localsTable()
const {
return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + localsOffset); }
301 int trailingData = nLocals*
sizeof (quint32);
302 size_t size = align(align(
sizeof(
Block)) + size_t(trailingData));
303 Q_ASSERT(size < INT_MAX);
308 return (a + 7) & ~size_t(7);
311static_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");
345 void set(Flags flags, quint32 typeNameIndexOrCommonType)
347 m_data.set<IsListField>(flags.testFlag(List) ? 1 : 0);
348 m_data.set<IndexIsCommonTypeField>(flags.testFlag(Common) ? 1 : 0);
349 m_data.set<TypeNameIndexOrCommonTypeField>(typeNameIndexOrCommonType);
354 return m_data.get<IndexIsCommonTypeField>() != 0;
359 return m_data.get<IsListField>() != 0;
364 return m_data.get<TypeNameIndexOrCommonTypeField>();
371 quint32_le_bitfield_union<IndexIsCommonTypeField, IsListField, TypeNameIndexOrCommonTypeField> m_data;
373static_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");
380static_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");
418 return lineAndStatementNumberOffset() + nLineAndStatementNumbers *
sizeof(CodeOffsetToLineAndStatement);
430 return reinterpret_cast<
const Parameter *>(
431 reinterpret_cast<
const char *>(
this) + formalsOffset);
435 return reinterpret_cast<
const quint32_le *>(
436 reinterpret_cast<
const char *>(
this) + localsOffset);
440 return reinterpret_cast<
const CodeOffsetToLineAndStatement *>(
441 reinterpret_cast<
const char *>(
this) + lineAndStatementNumberOffset());
449 const quint32_le *
labelInfoTable()
const {
return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + labelInfosOffset()); }
451 const char *
code()
const {
return reinterpret_cast<
const char *>(
this) + codeOffset; }
454 int nFormals,
int nLocals,
int nLinesAndStatements,
int labelInfoSize,
int codeSize)
456 const size_t trailingData = nFormals *
sizeof(Parameter)
457 + (nLocals + labelInfoSize) *
sizeof (quint32)
458 + nLinesAndStatements *
sizeof(CodeOffsetToLineAndStatement);
459 size_t size = align(align(
sizeof(
Function)) + size_t(trailingData)) + align(codeSize);
460 Q_ASSERT(size < INT_MAX);
465 return (a + 7) & ~size_t(7);
468static_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");
481static_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");
492 const Method *
methodTable()
const {
return reinterpret_cast<
const Method *>(
reinterpret_cast<
const char *>(
this) + methodTableOffset); }
495 int trailingData = (nStaticMethods + nMethods) *
sizeof(
Method);
496 size_t size = align(
sizeof(
Class) + trailingData);
497 Q_ASSERT(size < INT_MAX);
502 return (a + 7) & ~size_t(7);
505static_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");
512 int trailingData = 2 * size *
sizeof(quint32_le);
514 Q_ASSERT(s < INT_MAX);
519 return (a + 7) & ~size_t(7);
523 return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this + 1));
527 return stringTable()[i];
530 return stringTable()[size + i];
533static_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");
543static_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");
552static_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");
564static_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");
604 void setFlag(
Flag flag) { flagsAndType.set<FlagsField>(flagsAndType.get<FlagsField>() | flag); }
605 bool hasFlag(
Flag flag)
const {
return Flags(flagsAndType.get<FlagsField>()) & flag; }
606 Flags flags()
const {
return Flags(flagsAndType.get<FlagsField>()); }
609 Type type()
const {
return Type(flagsAndType.get<TypeField>()); }
626 const Flags bindingFlags = flags();
684 QString tmp = QLatin1String(
"\"");
685 for (
int i = 0; i < string.size(); ++i) {
686 const QChar &c = string.at(i);
687 switch (c.unicode()) {
689 tmp += QLatin1String(
"\\b");
692 tmp += QLatin1String(
"\\t");
695 tmp += QLatin1String(
"\\n");
698 tmp += QLatin1String(
"\\v");
701 tmp += QLatin1String(
"\\f");
704 tmp += QLatin1String(
"\\r");
707 tmp += QLatin1String(
"\\\"");
710 tmp += QLatin1String(
"\\\'");
713 tmp += QLatin1String(
"\\\\");
720 tmp += QLatin1Char(
'\"');
735 if (type() == Type_Boolean)
741static_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");
750static_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");
757static_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");
766 return reinterpret_cast<
const EnumValue*>(
this + 1) + idx;
781static_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");
791 return reinterpret_cast<
const Parameter*>(
this + 1) + idx;
806static_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");
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
854 void setNameIndex(
int nameIndex) { nameIndexAndVirtSpecifiers.set<NameIndexField>(nameIndex); }
856 bool isVirtual()
const {
return nameIndexAndVirtSpecifiers.get<IsVirtualField>(); }
859 nameIndexAndVirtSpecifiers.set<IsVirtualField>(isVirtual ? 1 : 0);
862 bool isOverride()
const {
return nameIndexAndVirtSpecifiers.get<IsOverrideField>(); }
865 nameIndexAndVirtSpecifiers.set<IsOverrideField>(isOverride ? 1 : 0);
868 bool isFinal()
const {
return nameIndexAndVirtSpecifiers.get<IsFinalField>(); }
869 void setIsFinal(
bool isFinal) { nameIndexAndVirtSpecifiers.set<IsFinalField>(isFinal ? 1 : 0); }
873 data.set<CommonTypeOrTypeNameIndexField>(
static_cast<quint32>(t));
874 data.set<IsCommonTypeField>(
true);
879 return CommonType(data.get<CommonTypeOrTypeNameIndexField>());
885 data.set<CommonTypeOrTypeNameIndexField>(nameIndex);
886 data.set<IsCommonTypeField>(
false);
891 return data.get<IsCommonTypeField>() ? -1 : data.get<CommonTypeOrTypeNameIndexField>();
897 bool isList()
const {
return data.get<IsListField>(); }
898 void setIsList(
bool isList) { data.set<IsListField>(isList); }
900 bool isRequired()
const {
return data.get<IsRequiredField>(); }
901 void setIsRequired(
bool isRequired) { data.set<IsRequiredField>(isRequired); }
903 bool isReadOnly()
const {
return data.get<IsReadOnlyField>(); }
904 void setIsReadOnly(
bool isReadOnly) { data.set<IsReadOnlyField>(isReadOnly); }
906static_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");
912static_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");
916 bool isReadOnly()
const {
return m_nameIndexAndFlags.get<IsReadOnlyField>(); }
917 void setIsReadOnly(
bool isReadOnly) { m_nameIndexAndFlags.set<IsReadOnlyField>(isReadOnly); }
922 m_nameIndexAndFlags.set<NameIndexField>(nameIndex);
926 void setIdIndex(quint32 idIndex) { m_idIndexField = idIndex; }
931 m_propertyNameIndex = propertyNameIndex;
940 m_referenceLocation = referenceLocation;
947 quint32_le_bitfield_union<NameIndexField, IsReadOnlyField> m_nameIndexAndFlags;
948 quint32_le m_idIndexField;
949 quint32_le m_propertyNameIndex;
953static_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");
1009 return Flags(flagsAndDefaultPropertyIsAliasAndId.get<FlagsField>());
1014 return flagsAndDefaultPropertyIsAliasAndId.get<FlagsField>() & flag;
1019 flagsAndDefaultPropertyIsAliasAndId.set<FlagsField>(
1020 flagsAndDefaultPropertyIsAliasAndId.get<FlagsField>() | flag);
1025 flagsAndDefaultPropertyIsAliasAndId.set<FlagsField>(flags);
1030 return flagsAndDefaultPropertyIsAliasAndId.get<DefaultPropertyIsAliasField>();
1035 flagsAndDefaultPropertyIsAliasAndId.set<DefaultPropertyIsAliasField>(defaultAlias);
1040 return flagsAndDefaultPropertyIsAliasAndId.get<IdField>();
1045 flagsAndDefaultPropertyIsAliasAndId.set<IdField>(id);
1049 static int calculateSizeExcludingSignalsAndEnums(
int nFunctions,
int nProperties,
int nAliases,
int nEnums,
int nSignals,
int nBindings,
int nNamedObjectsInComponent,
int nInlineComponents,
int nRequiredPropertyExtraData)
1051 return (
sizeof(Object)
1052 + nFunctions *
sizeof(quint32)
1053 + nProperties *
sizeof(Property)
1054 + nAliases *
sizeof(Alias)
1055 + nEnums *
sizeof(quint32)
1056 + nSignals *
sizeof(quint32)
1057 + nBindings *
sizeof(Binding)
1058 + nNamedObjectsInComponent *
sizeof(
int)
1059 + nInlineComponents *
sizeof(InlineComponent)
1060 + nRequiredPropertyExtraData *
sizeof(RequiredPropertyExtraData)
1067 return reinterpret_cast<
const quint32_le*>(
reinterpret_cast<
const char *>(
this) + offsetToFunctions);
1072 return reinterpret_cast<
const Property*>(
reinterpret_cast<
const char *>(
this) + offsetToProperties);
1077 return reinterpret_cast<
const Alias*>(
reinterpret_cast<
const char *>(
this) + offsetToAliases);
1082 return reinterpret_cast<
const Binding*>(
reinterpret_cast<
const char *>(
this) + offsetToBindings);
1087 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToEnums);
1088 const quint32_le offset = offsetTable[idx];
1089 return reinterpret_cast<
const Enum*>(
reinterpret_cast<
const char*>(
this) + offset);
1094 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToSignals);
1095 const quint32_le offset = offsetTable[idx];
1096 return reinterpret_cast<
const Signal*>(
reinterpret_cast<
const char*>(
this) + offset);
1106 return reinterpret_cast<
const quint32_le*>(
reinterpret_cast<
const char *>(
this) + offsetToNamedObjectsInComponent);
1111 return reinterpret_cast<
const InlineComponent*>(
reinterpret_cast<
const char *>(
this) + offsetToInlineComponents);
1121 return reinterpret_cast<
const RequiredPropertyExtraData*>(
reinterpret_cast<
const char *>(
this) + offsetToRequiredPropertyExtraData);
1161static_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");
1182 type = 0; uriIndex = 0; qualifierIndex = 0; version = QTypeRevision::zero(); reserved = 0;
1185static_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");
1195 return reinterpret_cast<
const Import*>((
reinterpret_cast<
const char *>(
this)) + offsetToImports + idx *
sizeof(Import));
1199 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToObjects);
1200 const quint32_le offset = offsetTable[idx];
1201 return reinterpret_cast<
const Object*>(
reinterpret_cast<
const char*>(
this) + offset);
1204static_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");
1222 enum :
unsigned int {
1281 return reinterpret_cast<
const QmlUnit *>(
reinterpret_cast<
const char *>(
this) + offsetToQmlUnit);
1285 return reinterpret_cast<QmlUnit *>(
reinterpret_cast<
char *>(
this) + offsetToQmlUnit);
1289 return flags & Unit::IsSingleton;
1294 Q_ASSERT(idx < stringTableSize);
1295 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToStringTable);
1296 const quint32_le offset = offsetTable[idx];
1297 const String *str =
reinterpret_cast<
const String*>(
reinterpret_cast<
const char *>(
this) + offset);
1298 Q_ASSERT(str->size >= 0);
1299#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
1300 const QChar *characters =
reinterpret_cast<
const QChar *>(str + 1);
1301 if (flags & StaticData)
1302 return QString::fromRawData(characters, str->size);
1303 return QString(characters, str->size);
1305 const quint16_le *characters =
reinterpret_cast<
const quint16_le *>(str + 1);
1306 QString qstr(str->size, Qt::Uninitialized);
1307 QChar *ch = qstr.data();
1308 for (
int i = 0; i < str->size; ++i)
1309 ch[i] = QChar(quint16(characters[i]));
1315 const quint32_le *
classOffsetTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToClassTable); }
1317 const quint32_le *
blockOffsetTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToBlockTable); }
1320 const quint32_le *offsetTable = functionOffsetTable();
1321 const quint32_le offset = offsetTable[idx];
1322 return reinterpret_cast<
const Function*>(
reinterpret_cast<
const char *>(
this) + offset);
1326 const quint32_le *offsetTable = classOffsetTable();
1327 const quint32_le offset = offsetTable[idx];
1328 return reinterpret_cast<
const Class *>(
reinterpret_cast<
const char *>(
this) + offset);
1332 const quint32_le *offsetTable = templateObjectOffsetTable();
1333 const quint32_le offset = offsetTable[idx];
1334 return reinterpret_cast<
const TemplateObject *>(
reinterpret_cast<
const char *>(
this) + offset);
1338 const quint32_le *offsetTable = blockOffsetTable();
1339 const quint32_le offset = offsetTable[idx];
1340 return reinterpret_cast<
const Block *>(
reinterpret_cast<
const char *>(
this) + offset);
1343 const Lookup *
lookupTable()
const {
return reinterpret_cast<
const Lookup*>(
reinterpret_cast<
const char *>(
this) + offsetToLookupTable); }
1345 return reinterpret_cast<
const RegExp*>(
reinterpret_cast<
const char *>(
this) + offsetToRegexpTable + index *
sizeof(RegExp));
1348 return reinterpret_cast<
const quint64_le*>(
reinterpret_cast<
const char *>(
this) + offsetToConstantTable);
1352 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + offsetToJSClassTable);
1353 const quint32_le offset = offsetTable[idx];
1354 const char *ptr =
reinterpret_cast<
const char *>(
this) + offset;
1356 *nMembers = klass->nMembers;
1361 return reinterpret_cast<
const TranslationData *>(
reinterpret_cast<
const char *>(
this) + offsetToTranslationTable);
1365 if ( translationTableSize == 0)
1367 return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this))
1368 + offsetToTranslationTable
1369 + translationTableSize *
sizeof(CompiledData::TranslationData)); }
1372 if ( translationTableSize == 0)
1374 return reinterpret_cast<quint32_le*>((
reinterpret_cast<
char *>(
this))
1375 + offsetToTranslationTable
1376 + translationTableSize *
sizeof(CompiledData::TranslationData)); }
1378 const ImportEntry *
importEntryTable()
const {
return reinterpret_cast<
const ImportEntry *>(
reinterpret_cast<
const char *>(
this) + offsetToImportEntryTable); }
1383 const quint32_le *
moduleRequestTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToModuleRequestTable); }
1385 bool verifyHeader(QDateTime expectedSourceTimeStamp, QString *errorString)
const;
1388static_assert(
sizeof(
Unit) == 200,
"Unit structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
1406 Iterator it = find(nameIndex);
1409 return *insert(nameIndex, loc);
1412 template <
typename CompiledObject>
1415 if (obj->inheritedTypeNameIndex != 0) {
1421 auto binding = obj->bindingsBegin();
1422 auto const bindingEnd = obj->bindingsEnd();
1423 for ( ; binding != bindingEnd; ++binding) {
1425 this->add(binding->propertyNameIndex
, binding->location
);
1428 auto ic = obj->inlineComponentsBegin();
1429 auto const icEnd = obj->inlineComponentsEnd();
1430 for (; ic != icEnd; ++ic) {
1431 this->add(ic->nameIndex
, ic->location
);
1435 template <
typename Iterator>
1438 for (; it != end; ++it)
1439 collectFromObject(*it);
1507 const QString &fileName = QString(),
const QString &finalUrlString = QString())
1522 const QString &fileName = QString(),
const QString &finalUrlString = QString())
1526#if Q_BYTE_ORDER == Q_BIG_ENDIAN
1527 delete [] constants;
1529 constants =
nullptr;
1531 m_finalUrlString.clear();
1535 qmlData = qmlUnit ? qmlUnit : data->qmlUnit();
1537#if Q_BYTE_ORDER == Q_BIG_ENDIAN
1538 StaticValue *bigEndianConstants =
new StaticValue[data->constantTableSize];
1539 const quint64_le *littleEndianConstants = data->constants();
1540 for (uint i = 0; i < data->constantTableSize; ++i)
1541 bigEndianConstants[i] = StaticValue::fromReturnedValue(littleEndianConstants[i]);
1542 constants = bigEndianConstants;
1544 constants =
reinterpret_cast<
const StaticValue*>(data->constants());
1547 m_fileName = !fileName.isEmpty() ? fileName : stringAt(data->sourceFileIndex);
1548 m_finalUrlString = !finalUrlString.isEmpty() ? finalUrlString : stringAt(data->finalUrlIndex);
1553 if (index < data->stringTableSize)
1554 return data->stringAtInternal(index);
1556 const qsizetype dynamicIndex = index - data->stringTableSize;
1557 Q_ASSERT(dynamicIndex < dynamicStrings.size());
1558 return dynamicStrings.at(dynamicIndex);
1568 case Binding::Type_Script:
1569 case Binding::Type_String:
1570 return stringAt(binding->stringIndex);
1572 return QStringLiteral(
"null");
1574 return binding->value.b ? QStringLiteral(
"true") : QStringLiteral(
"false");
1575 case Binding::Type_Number:
1576 return QString::number(bindingValueAsNumber(binding),
'g', QLocale::FloatingPointShortest);
1579 case Binding::Type_TranslationById:
1580 case Binding::Type_Translation:
1581 return stringAt(data->translations()[binding->value.translationDataIndex].stringIndex);
1590 return (binding->type() == CompiledData::Binding::Type_String)
1591 ? CompiledData::Binding::escapedString(stringAt(binding->stringIndex))
1592 : bindingValueAsString(binding);
1599 return constants[binding->value.constantValueIndex].doubleValue();
1604 const QUrl &url,
const QDateTime &sourceTimeStamp, QString *errorString);
1621 if (!m_url.isValid())
1622 m_url = QUrl(fileName());
1628 if (!m_finalUrl.isValid())
1629 m_finalUrl = QUrl(finalUrlString());
1638 return propertyCaches.isEmpty()
1639 ? QQmlPropertyCache::ConstPtr()
1640 : propertyCaches.at(0);
1652 Q_ASSERT(p && p->isComponentWrapper());
1653 return p->wrappedObjectIndex();
1665 for (
int i =
objectCount(), end = propertyCaches.count(); i < end; ++i) {
1667 Q_ASSERT(p && p->isComponentWrapper());
1668 if (p->wrappedObjectIndex() == index)
1676 for (uint i = 0; i <
qmlData->nObjects; ++i) {
1678 for (
auto it = object->inlineComponentsBegin(), end = object->inlineComponentsEnd();
1680 if (stringAt(it->nameIndex) == inlineComponentName)
1681 return it->objectIndex;
1689 bool verifyChecksum(
const CompiledData::DependentTypesHasher &dependencyHasher)
const;
1774 QString m_finalUrlString;
1776 mutable QQmlNullableValue<QUrl> m_url;
1777 mutable QQmlNullableValue<QUrl> m_finalUrl;
1792 template<
typename Char>
1795 const quint32_le oldFlags = mutableFlags();
1796 auto cleanup = qScopeGuard([
this, oldFlags]() { mutableFlags() = oldFlags; });
1797 mutableFlags() |= temporaryFlags;
1798 return writer(data<Char>(), size());
1801 static bool writeDataToFile(
const QString &outputFileName,
const char *data, quint32 size,
1802 QString *errorString)
1804#if QT_CONFIG(temporaryfile)
1805 QSaveFile cacheFile(outputFileName);
1806 if (!cacheFile.open(QIODevice::WriteOnly | QIODevice::Truncate)
1807 || cacheFile.write(data, size) != size
1808 || !cacheFile.commit()) {
1809 *errorString = cacheFile.errorString();
1813 errorString->clear();
1816 Q_UNUSED(outputFileName);
1817 *errorString = QStringLiteral(
"features.temporaryfile is disabled.");
1824 quint32 temporaryFlags;
1826 quint32_le &mutableFlags()
const
1828 return const_cast<
Unit *>(unit)->flags;
1831 template<
typename Char>
1832 const Char *data()
const
1834 Q_STATIC_ASSERT(
sizeof(Char) == 1);
1835 const Char *dataPtr;
1836 memcpy(&dataPtr, &unit,
sizeof(dataPtr));
1840 quint32 size()
const
1842 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
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
Q_QML_EXPORT bool saveToDisk(const QUrl &unitUrl, QString *errorString) const
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
CompilationUnit(const Unit *unitData, const QQmlPrivate::AOTCompiledFunction *aotCompiledFunctions, const QString &fileName=QString(), const QString &finalUrlString=QString())
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
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
bool ignoresFunctionSignature() const
bool valueTypesAreCopied() const
const CompiledData::Binding CompiledBinding
const CompiledData::Import * importAt(int index) const
QQmlPropertyCacheVector propertyCaches
QList< QQmlRefPointer< QQmlScriptData > > dependentScripts
QStringList dynamicStrings
Q_QML_EXPORT bool loadFromDisk(const QUrl &url, const QDateTime &sourceTimeStamp, QString *errorString)
QString bindingValueAsString(const CompiledData::Binding *binding) const
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 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
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