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/qversionnumber.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>
55#define QV4_DATA_STRUCTURE_VERSION 0x4a
58class QQmlTypeNameCache;
91 bool addToHash(QCryptographicHash *hash, QHash<quintptr, QByteArray> *checksums)
const;
100template <
typename ItemType,
typename Container,
const ItemType *(Container::*IndexedGetter)(
int index)
const>
119 m_data.set<LineField>(l);
120 m_data.set<ColumnField>(c);
121 Q_ASSERT(m_data.get<LineField>() == l);
122 Q_ASSERT(m_data.get<ColumnField>() == c);
126 return m_data.get<LineField>() < other.m_data.get<LineField>()
127 || (m_data.get<LineField>() == other.m_data.get<LineField>()
128 && m_data.get<ColumnField>() < other.m_data.get<ColumnField>());
133 return QT_PREPEND_NAMESPACE(qHash)(location.m_data.data(), seed);
138 return a.m_data.data()== b.m_data.data();
141 void set(quint32 line, quint32 column)
143 m_data.set<LineField>(line);
144 m_data.set<ColumnField>(column);
154 quint32_le_bitfield_union<LineField, ColumnField> m_data;
156static_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");
174 m_data.set<FlagsField>(flags);
175 m_data.set<StringIndexField>(stringIndex);
184 quint32_le_bitfield_union<FlagsField, StringIndexField> m_data;
186static_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");
209 m_data.set<TypeField>(type);
210 m_data.set<ModeField>(mode);
211 m_data.set<NameIndexField>(nameIndex);
219 quint32_le_bitfield_union<TypeField, ModeField, NameIndexField> m_data;
221static_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");
227 void set(quint32 nameOffset,
bool isAccessor)
229 m_data.set<NameOffsetField>(nameOffset);
230 m_data.set<IsAccessorField>(isAccessor ? 1 : 0);
234 bool isAccessor()
const {
return m_data.get<IsAccessorField>() != 0; }
239 quint32_le_bitfield_union<NameOffsetField, IsAccessorField> m_data;
241static_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");
250static_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");
259 return (
sizeof(String) + (
int(str.size()) + 1) *
sizeof(quint16) + 7) & ~0x7;
263static_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");
270static_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");
279 const quint32_le *
localsTable()
const {
return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + localsOffset); }
282 int trailingData = nLocals*
sizeof (quint32);
283 size_t size = align(align(
sizeof(
Block)) + size_t(trailingData));
284 Q_ASSERT(size < INT_MAX);
289 return (a + 7) & ~size_t(7);
292static_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");
326 void set(Flags flags, quint32 typeNameIndexOrCommonType)
328 m_data.set<IsListField>(flags.testFlag(List) ? 1 : 0);
329 m_data.set<IndexIsCommonTypeField>(flags.testFlag(Common) ? 1 : 0);
330 m_data.set<TypeNameIndexOrCommonTypeField>(typeNameIndexOrCommonType);
335 return m_data.get<IndexIsCommonTypeField>() != 0;
340 return m_data.get<IsListField>() != 0;
345 return m_data.get<TypeNameIndexOrCommonTypeField>();
352 quint32_le_bitfield_union<IndexIsCommonTypeField, IsListField, TypeNameIndexOrCommonTypeField> m_data;
354static_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");
361static_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");
399 return lineAndStatementNumberOffset() + nLineAndStatementNumbers *
sizeof(CodeOffsetToLineAndStatement);
411 return reinterpret_cast<
const Parameter *>(
412 reinterpret_cast<
const char *>(
this) + formalsOffset);
416 return reinterpret_cast<
const quint32_le *>(
417 reinterpret_cast<
const char *>(
this) + localsOffset);
421 return reinterpret_cast<
const CodeOffsetToLineAndStatement *>(
422 reinterpret_cast<
const char *>(
this) + lineAndStatementNumberOffset());
430 const quint32_le *
labelInfoTable()
const {
return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + labelInfosOffset()); }
432 const char *
code()
const {
return reinterpret_cast<
const char *>(
this) + codeOffset; }
435 int nFormals,
int nLocals,
int nLinesAndStatements,
int nInnerfunctions,
436 int labelInfoSize,
int codeSize)
438 int trailingData = nFormals *
sizeof(Parameter)
439 + (nLocals + nInnerfunctions + labelInfoSize) *
sizeof (quint32)
440 + nLinesAndStatements *
sizeof(CodeOffsetToLineAndStatement);
441 size_t size = align(align(
sizeof(
Function)) + size_t(trailingData)) + align(codeSize);
442 Q_ASSERT(size < INT_MAX);
447 return (a + 7) & ~size_t(7);
450static_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");
463static_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");
474 const Method *
methodTable()
const {
return reinterpret_cast<
const Method *>(
reinterpret_cast<
const char *>(
this) + methodTableOffset); }
477 int trailingData = (nStaticMethods + nMethods) *
sizeof(
Method);
478 size_t size = align(
sizeof(
Class) + trailingData);
479 Q_ASSERT(size < INT_MAX);
484 return (a + 7) & ~size_t(7);
487static_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");
494 int trailingData = 2 * size *
sizeof(quint32_le);
496 Q_ASSERT(s < INT_MAX);
501 return (a + 7) & ~size_t(7);
505 return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this + 1));
509 return stringTable()[i];
512 return stringTable()[size + i];
515static_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");
525static_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");
534static_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");
546static_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");
586 void setFlag(
Flag flag) { flagsAndType.set<FlagsField>(flagsAndType.get<FlagsField>() | flag); }
587 bool hasFlag(
Flag flag)
const {
return Flags(flagsAndType.get<FlagsField>()) & flag; }
588 Flags flags()
const {
return Flags(flagsAndType.get<FlagsField>()); }
591 Type type()
const {
return Type(flagsAndType.get<TypeField>()); }
608 const Flags bindingFlags = flags();
666 QString tmp = QLatin1String(
"\"");
667 for (
int i = 0; i < string.size(); ++i) {
668 const QChar &c = string.at(i);
669 switch (c.unicode()) {
671 tmp += QLatin1String(
"\\b");
674 tmp += QLatin1String(
"\\t");
677 tmp += QLatin1String(
"\\n");
680 tmp += QLatin1String(
"\\v");
683 tmp += QLatin1String(
"\\f");
686 tmp += QLatin1String(
"\\r");
689 tmp += QLatin1String(
"\\\"");
692 tmp += QLatin1String(
"\\\'");
695 tmp += QLatin1String(
"\\\\");
702 tmp += QLatin1Char(
'\"');
717 if (type() == Type_Boolean)
723static_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");
732static_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");
740static_assert(
sizeof(
EnumValue) == 12,
"EnumValue structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
749 return reinterpret_cast<
const EnumValue*>(
this + 1) + idx;
764static_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");
774 return reinterpret_cast<
const Parameter*>(
this + 1) + idx;
789static_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");
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
837 void setNameIndex(
int nameIndex) { nameIndexAndVirtSpecifiers.set<NameIndexField>(nameIndex); }
839 bool isVirtual()
const {
return nameIndexAndVirtSpecifiers.get<IsVirtualField>(); }
842 nameIndexAndVirtSpecifiers.set<IsVirtualField>(isVirtual ? 1 : 0);
845 bool isOverride()
const {
return nameIndexAndVirtSpecifiers.get<IsOverrideField>(); }
848 nameIndexAndVirtSpecifiers.set<IsOverrideField>(isOverride ? 1 : 0);
851 bool isFinal()
const {
return nameIndexAndVirtSpecifiers.get<IsFinalField>(); }
852 void setIsFinal(
bool isFinal) { nameIndexAndVirtSpecifiers.set<IsFinalField>(isFinal ? 1 : 0); }
856 data.set<CommonTypeOrTypeNameIndexField>(
static_cast<quint32>(t));
857 data.set<IsCommonTypeField>(
true);
862 return CommonType(data.get<CommonTypeOrTypeNameIndexField>());
868 data.set<CommonTypeOrTypeNameIndexField>(nameIndex);
869 data.set<IsCommonTypeField>(
false);
874 return data.get<IsCommonTypeField>() ? -1 : data.get<CommonTypeOrTypeNameIndexField>();
880 bool isList()
const {
return data.get<IsListField>(); }
881 void setIsList(
bool isList) { data.set<IsListField>(isList); }
883 bool isRequired()
const {
return data.get<IsRequiredField>(); }
884 void setIsRequired(
bool isRequired) { data.set<IsRequiredField>(isRequired); }
886 bool isReadOnly()
const {
return data.get<IsReadOnlyField>(); }
887 void setIsReadOnly(
bool isReadOnly) { data.set<IsReadOnlyField>(isReadOnly); }
889static_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");
895static_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");
899 bool isReadOnly()
const {
return m_nameIndexAndFlags.get<IsReadOnlyField>(); }
900 void setIsReadOnly(
bool isReadOnly) { m_nameIndexAndFlags.set<IsReadOnlyField>(isReadOnly); }
905 m_nameIndexAndFlags.set<NameIndexField>(nameIndex);
909 void setIdIndex(quint32 idIndex) { m_idIndexField = idIndex; }
914 m_propertyNameIndex = propertyNameIndex;
923 m_referenceLocation = referenceLocation;
930 quint32_le_bitfield_union<NameIndexField, IsReadOnlyField> m_nameIndexAndFlags;
931 quint32_le m_idIndexField;
932 quint32_le m_propertyNameIndex;
936static_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");
992 return Flags(flagsAndDefaultPropertyIsAliasAndId.get<FlagsField>());
997 return flagsAndDefaultPropertyIsAliasAndId.get<FlagsField>() & flag;
1002 flagsAndDefaultPropertyIsAliasAndId.set<FlagsField>(
1003 flagsAndDefaultPropertyIsAliasAndId.get<FlagsField>() | flag);
1008 flagsAndDefaultPropertyIsAliasAndId.set<FlagsField>(flags);
1013 return flagsAndDefaultPropertyIsAliasAndId.get<DefaultPropertyIsAliasField>();
1018 flagsAndDefaultPropertyIsAliasAndId.set<DefaultPropertyIsAliasField>(defaultAlias);
1023 return flagsAndDefaultPropertyIsAliasAndId.get<IdField>();
1028 flagsAndDefaultPropertyIsAliasAndId.set<IdField>(id);
1032 static int calculateSizeExcludingSignalsAndEnums(
int nFunctions,
int nProperties,
int nAliases,
int nEnums,
int nSignals,
int nBindings,
int nNamedObjectsInComponent,
int nInlineComponents,
int nRequiredPropertyExtraData)
1034 return (
sizeof(Object)
1035 + nFunctions *
sizeof(quint32)
1036 + nProperties *
sizeof(Property)
1037 + nAliases *
sizeof(Alias)
1038 + nEnums *
sizeof(quint32)
1039 + nSignals *
sizeof(quint32)
1040 + nBindings *
sizeof(Binding)
1041 + nNamedObjectsInComponent *
sizeof(
int)
1042 + nInlineComponents *
sizeof(InlineComponent)
1043 + nRequiredPropertyExtraData *
sizeof(RequiredPropertyExtraData)
1050 return reinterpret_cast<
const quint32_le*>(
reinterpret_cast<
const char *>(
this) + offsetToFunctions);
1055 return reinterpret_cast<
const Property*>(
reinterpret_cast<
const char *>(
this) + offsetToProperties);
1060 return reinterpret_cast<
const Alias*>(
reinterpret_cast<
const char *>(
this) + offsetToAliases);
1065 return reinterpret_cast<
const Binding*>(
reinterpret_cast<
const char *>(
this) + offsetToBindings);
1070 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToEnums);
1071 const quint32_le offset = offsetTable[idx];
1072 return reinterpret_cast<
const Enum*>(
reinterpret_cast<
const char*>(
this) + offset);
1077 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToSignals);
1078 const quint32_le offset = offsetTable[idx];
1079 return reinterpret_cast<
const Signal*>(
reinterpret_cast<
const char*>(
this) + offset);
1089 return reinterpret_cast<
const quint32_le*>(
reinterpret_cast<
const char *>(
this) + offsetToNamedObjectsInComponent);
1094 return reinterpret_cast<
const InlineComponent*>(
reinterpret_cast<
const char *>(
this) + offsetToInlineComponents);
1104 return reinterpret_cast<
const RequiredPropertyExtraData*>(
reinterpret_cast<
const char *>(
this) + offsetToRequiredPropertyExtraData);
1144static_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");
1165 type = 0; uriIndex = 0; qualifierIndex = 0; version = QTypeRevision::zero(); reserved = 0;
1168static_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");
1178 return reinterpret_cast<
const Import*>((
reinterpret_cast<
const char *>(
this)) + offsetToImports + idx *
sizeof(Import));
1182 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToObjects);
1183 const quint32_le offset = offsetTable[idx];
1184 return reinterpret_cast<
const Object*>(
reinterpret_cast<
const char*>(
this) + offset);
1187static_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");
1205 enum :
unsigned int {
1264 return reinterpret_cast<
const QmlUnit *>(
reinterpret_cast<
const char *>(
this) + offsetToQmlUnit);
1268 return reinterpret_cast<QmlUnit *>(
reinterpret_cast<
char *>(
this) + offsetToQmlUnit);
1272 return flags & Unit::IsSingleton;
1277 Q_ASSERT(idx < stringTableSize);
1278 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToStringTable);
1279 const quint32_le offset = offsetTable[idx];
1280 const String *str =
reinterpret_cast<
const String*>(
reinterpret_cast<
const char *>(
this) + offset);
1281 Q_ASSERT(str->size >= 0);
1282#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
1283 const QChar *characters =
reinterpret_cast<
const QChar *>(str + 1);
1284 if (flags & StaticData)
1285 return QString::fromRawData(characters, str->size);
1286 return QString(characters, str->size);
1288 const quint16_le *characters =
reinterpret_cast<
const quint16_le *>(str + 1);
1289 QString qstr(str->size, Qt::Uninitialized);
1290 QChar *ch = qstr.data();
1291 for (
int i = 0; i < str->size; ++i)
1292 ch[i] = QChar(quint16(characters[i]));
1298 const quint32_le *
classOffsetTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToClassTable); }
1300 const quint32_le *
blockOffsetTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToBlockTable); }
1303 const quint32_le *offsetTable = functionOffsetTable();
1304 const quint32_le offset = offsetTable[idx];
1305 return reinterpret_cast<
const Function*>(
reinterpret_cast<
const char *>(
this) + offset);
1309 const quint32_le *offsetTable = classOffsetTable();
1310 const quint32_le offset = offsetTable[idx];
1311 return reinterpret_cast<
const Class *>(
reinterpret_cast<
const char *>(
this) + offset);
1315 const quint32_le *offsetTable = templateObjectOffsetTable();
1316 const quint32_le offset = offsetTable[idx];
1317 return reinterpret_cast<
const TemplateObject *>(
reinterpret_cast<
const char *>(
this) + offset);
1321 const quint32_le *offsetTable = blockOffsetTable();
1322 const quint32_le offset = offsetTable[idx];
1323 return reinterpret_cast<
const Block *>(
reinterpret_cast<
const char *>(
this) + offset);
1326 const Lookup *
lookupTable()
const {
return reinterpret_cast<
const Lookup*>(
reinterpret_cast<
const char *>(
this) + offsetToLookupTable); }
1328 return reinterpret_cast<
const RegExp*>(
reinterpret_cast<
const char *>(
this) + offsetToRegexpTable + index *
sizeof(RegExp));
1331 return reinterpret_cast<
const quint64_le*>(
reinterpret_cast<
const char *>(
this) + offsetToConstantTable);
1335 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + offsetToJSClassTable);
1336 const quint32_le offset = offsetTable[idx];
1337 const char *ptr =
reinterpret_cast<
const char *>(
this) + offset;
1339 *nMembers = klass->nMembers;
1344 return reinterpret_cast<
const TranslationData *>(
reinterpret_cast<
const char *>(
this) + offsetToTranslationTable);
1348 if ( translationTableSize == 0)
1350 return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this))
1351 + offsetToTranslationTable
1352 + translationTableSize *
sizeof(CompiledData::TranslationData)); }
1355 if ( translationTableSize == 0)
1357 return reinterpret_cast<quint32_le*>((
reinterpret_cast<
char *>(
this))
1358 + offsetToTranslationTable
1359 + translationTableSize *
sizeof(CompiledData::TranslationData)); }
1361 const ImportEntry *
importEntryTable()
const {
return reinterpret_cast<
const ImportEntry *>(
reinterpret_cast<
const char *>(
this) + offsetToImportEntryTable); }
1366 const quint32_le *
moduleRequestTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToModuleRequestTable); }
1368 bool verifyHeader(QDateTime expectedSourceTimeStamp, QString *errorString)
const;
1371static_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");
1389 Iterator it = find(nameIndex);
1392 return *insert(nameIndex, loc);
1395 template <
typename CompiledObject>
1398 if (obj->inheritedTypeNameIndex != 0) {
1404 auto binding = obj->bindingsBegin();
1405 auto const bindingEnd = obj->bindingsEnd();
1406 for ( ; binding != bindingEnd; ++binding) {
1408 this->add(binding->propertyNameIndex
, binding->location
);
1411 auto ic = obj->inlineComponentsBegin();
1412 auto const icEnd = obj->inlineComponentsEnd();
1413 for (; ic != icEnd; ++ic) {
1414 this->add(ic->nameIndex
, ic->location
);
1418 template <
typename Iterator>
1421 for (; it != end; ++it)
1422 collectFromObject(*it);
1490 const QString &fileName = QString(),
const QString &finalUrlString = QString())
1505 const QString &fileName = QString(),
const QString &finalUrlString = QString())
1509#if Q_BYTE_ORDER == Q_BIG_ENDIAN
1510 delete [] constants;
1512 constants =
nullptr;
1514 m_finalUrlString.clear();
1518 qmlData = qmlUnit ? qmlUnit : data->qmlUnit();
1520#if Q_BYTE_ORDER == Q_BIG_ENDIAN
1521 StaticValue *bigEndianConstants =
new StaticValue[data->constantTableSize];
1522 const quint64_le *littleEndianConstants = data->constants();
1523 for (uint i = 0; i < data->constantTableSize; ++i)
1524 bigEndianConstants[i] = StaticValue::fromReturnedValue(littleEndianConstants[i]);
1525 constants = bigEndianConstants;
1527 constants =
reinterpret_cast<
const StaticValue*>(data->constants());
1530 m_fileName = !fileName.isEmpty() ? fileName : stringAt(data->sourceFileIndex);
1531 m_finalUrlString = !finalUrlString.isEmpty() ? finalUrlString : stringAt(data->finalUrlIndex);
1536 if (index < data->stringTableSize)
1537 return data->stringAtInternal(index);
1539 const qsizetype dynamicIndex = index - data->stringTableSize;
1540 Q_ASSERT(dynamicIndex < dynamicStrings.size());
1541 return dynamicStrings.at(dynamicIndex);
1551 case Binding::Type_Script:
1552 case Binding::Type_String:
1553 return stringAt(binding->stringIndex);
1555 return QStringLiteral(
"null");
1557 return binding->value.b ? QStringLiteral(
"true") : QStringLiteral(
"false");
1558 case Binding::Type_Number:
1559 return QString::number(bindingValueAsNumber(binding),
'g', QLocale::FloatingPointShortest);
1562 case Binding::Type_TranslationById:
1563 case Binding::Type_Translation:
1564 return stringAt(data->translations()[binding->value.translationDataIndex].stringIndex);
1573 return (binding->type() == CompiledData::Binding::Type_String)
1574 ? CompiledData::Binding::escapedString(stringAt(binding->stringIndex))
1575 : bindingValueAsString(binding);
1582 return constants[binding->value.constantValueIndex].doubleValue();
1587 const QUrl &url,
const QDateTime &sourceTimeStamp, QString *errorString);
1604 if (!m_url.isValid())
1605 m_url = QUrl(fileName());
1611 if (!m_finalUrl.isValid())
1612 m_finalUrl = QUrl(finalUrlString());
1621 return propertyCaches.isEmpty()
1622 ? QQmlPropertyCache::ConstPtr()
1623 : propertyCaches.at(0);
1631 for (uint i = 0; i <
qmlData->nObjects; ++i) {
1633 for (
auto it = object->inlineComponentsBegin(), end = object->inlineComponentsEnd();
1635 if (stringAt(it->nameIndex) == inlineComponentName)
1636 return it->objectIndex;
1644 bool verifyChecksum(
const CompiledData::DependentTypesHasher &dependencyHasher)
const;
1729 QString m_finalUrlString;
1731 mutable QQmlNullableValue<QUrl> m_url;
1732 mutable QQmlNullableValue<QUrl> m_finalUrl;
1747 template<
typename Char>
1750 const quint32_le oldFlags = mutableFlags();
1751 auto cleanup = qScopeGuard([
this, oldFlags]() { mutableFlags() = oldFlags; });
1752 mutableFlags() |= temporaryFlags;
1753 return writer(data<Char>(), size());
1756 static bool writeDataToFile(
const QString &outputFileName,
const char *data, quint32 size,
1757 QString *errorString)
1759#if QT_CONFIG(temporaryfile)
1760 QSaveFile cacheFile(outputFileName);
1761 if (!cacheFile.open(QIODevice::WriteOnly | QIODevice::Truncate)
1762 || cacheFile.write(data, size) != size
1763 || !cacheFile.commit()) {
1764 *errorString = cacheFile.errorString();
1768 errorString->clear();
1771 Q_UNUSED(outputFileName);
1772 *errorString = QStringLiteral(
"features.temporaryfile is disabled.");
1779 quint32 temporaryFlags;
1781 quint32_le &mutableFlags()
const
1783 return const_cast<
Unit *>(unit)->flags;
1786 template<
typename Char>
1787 const Char *data()
const
1789 Q_STATIC_ASSERT(
sizeof(Char) == 1);
1790 const Char *dataPtr;
1791 memcpy(&dataPtr, &unit,
sizeof(dataPtr));
1795 quint32 size()
const
1797 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())
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
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
static int calculateSize(int nFormals, int nLocals, int nLinesAndStatements, int nInnerfunctions, int labelInfoSize, int codeSize)
size_t lineAndStatementNumberOffset() const
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)
void set(quint32 line, quint32 column)
friend size_t qHash(const Location &location, size_t seed=0)
bool operator<(const Location &other) const
friend bool operator==(const Location &a, const Location &b)
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
const Container * container
const ItemType * operator->()
bool operator!=(const TableIterator &rhs) const
TableIterator(const Container *container, int index)
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