4#ifndef QV4COMPILEDDATA_P_H
5#define QV4COMPILEDDATA_P_H
21#include <QtCore/qcryptographichash.h>
22#include <QtCore/qhash.h>
23#include <QtCore/qhashfunctions.h>
24#include <QtCore/qlocale.h>
25#include <QtCore/qscopeguard.h>
26#include <QtCore/qstring.h>
27#include <QtCore/qstringlist.h>
28#include <QtCore/qurl.h>
29#include <QtCore/qvector.h>
30#include <QtCore/qtyperevision.h>
31#include <QtCore/qxpfunctional.h>
33#if QT_CONFIG(temporaryfile)
34#include <QtCore/qsavefile.h>
37#include <private/qendian_p.h>
38#include <private/qqmlnullablevalue_p.h>
39#include <private/qqmlpropertycachevector_p.h>
40#include <private/qqmlrefcount_p.h>
41#include <private/qqmltype_p.h>
42#include <private/qv4compilationunitmapper_p.h>
43#include <private/qv4staticvalue_p.h>
58#define QV4_DATA_STRUCTURE_VERSION 0x54
61class QQmlTypeNameCache;
94 bool addToHash(QCryptographicHash *hash, QHash<quintptr, QByteArray> *checksums)
const;
103template <
typename ItemType,
typename Container,
const ItemType *(Container::*IndexedGetter)(
int index)
const>
139 m_data.set<LineField>(l);
140 m_data.set<ColumnField>(c);
141 Q_ASSERT(m_data.get<LineField>() == l);
142 Q_ASSERT(m_data.get<ColumnField>() == c);
146 return m_data.get<LineField>() < other.m_data.get<LineField>()
147 || (m_data.get<LineField>() == other.m_data.get<LineField>()
148 && m_data.get<ColumnField>() < other.m_data.get<ColumnField>());
153 return QT_PREPEND_NAMESPACE(qHash)(location.m_data.data(), seed);
158 return a.m_data.data()== b.m_data.data();
162 void set(quint32 line, quint32 column)
164 m_data.set<LineField>(line);
165 m_data.set<ColumnField>(column);
175 quint32_le_bitfield_union<LineField, ColumnField> m_data;
177static_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");
195 m_data.set<FlagsField>(flags);
196 m_data.set<StringIndexField>(stringIndex);
205 quint32_le_bitfield_union<FlagsField, StringIndexField> m_data;
207static_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");
230 m_data.set<TypeField>(type);
231 m_data.set<ModeField>(mode);
232 m_data.set<NameIndexField>(nameIndex);
240 quint32_le_bitfield_union<TypeField, ModeField, NameIndexField> m_data;
242static_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");
248 void set(quint32 nameOffset,
bool isAccessor)
250 m_data.set<NameOffsetField>(nameOffset);
251 m_data.set<IsAccessorField>(isAccessor ? 1 : 0);
255 bool isAccessor()
const {
return m_data.get<IsAccessorField>() != 0; }
260 quint32_le_bitfield_union<NameOffsetField, IsAccessorField> m_data;
262static_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");
271static_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");
280 return (
sizeof(String) + (
int(str.size()) + 1) *
sizeof(quint16) + 7) & ~0x7;
284static_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");
291static_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");
300 const quint32_le *
localsTable()
const {
return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + localsOffset); }
303 int trailingData = nLocals*
sizeof (quint32);
304 size_t size = align(align(
sizeof(
Block)) + size_t(trailingData));
305 Q_ASSERT(size < INT_MAX);
310 return (a + 7) & ~size_t(7);
313static_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");
347 void set(Flags flags, quint32 typeNameIndexOrCommonType)
349 m_data.set<IsListField>(flags.testFlag(List) ? 1 : 0);
350 m_data.set<IndexIsCommonTypeField>(flags.testFlag(Common) ? 1 : 0);
351 m_data.set<TypeNameIndexOrCommonTypeField>(typeNameIndexOrCommonType);
356 return m_data.get<IndexIsCommonTypeField>() != 0;
361 return m_data.get<IsListField>() != 0;
366 return m_data.get<TypeNameIndexOrCommonTypeField>();
373 quint32_le_bitfield_union<IndexIsCommonTypeField, IsListField, TypeNameIndexOrCommonTypeField> m_data;
375static_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");
382static_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");
420 return lineAndStatementNumberOffset() + nLineAndStatementNumbers *
sizeof(CodeOffsetToLineAndStatement);
432 return reinterpret_cast<
const Parameter *>(
433 reinterpret_cast<
const char *>(
this) + formalsOffset);
437 return reinterpret_cast<
const quint32_le *>(
438 reinterpret_cast<
const char *>(
this) + localsOffset);
442 return reinterpret_cast<
const CodeOffsetToLineAndStatement *>(
443 reinterpret_cast<
const char *>(
this) + lineAndStatementNumberOffset());
451 const quint32_le *
labelInfoTable()
const {
return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + labelInfosOffset()); }
453 const char *
code()
const {
return reinterpret_cast<
const char *>(
this) + codeOffset; }
456 int nFormals,
int nLocals,
int nLinesAndStatements,
int labelInfoSize,
int codeSize)
458 const size_t trailingData = nFormals *
sizeof(Parameter)
459 + (nLocals + labelInfoSize) *
sizeof (quint32)
460 + nLinesAndStatements *
sizeof(CodeOffsetToLineAndStatement);
461 size_t size = align(align(
sizeof(
Function)) + size_t(trailingData)) + align(codeSize);
462 Q_ASSERT(size < INT_MAX);
467 return (a + 7) & ~size_t(7);
470static_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");
483static_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");
494 const Method *
methodTable()
const {
return reinterpret_cast<
const Method *>(
reinterpret_cast<
const char *>(
this) + methodTableOffset); }
497 int trailingData = (nStaticMethods + nMethods) *
sizeof(
Method);
498 size_t size = align(
sizeof(
Class) + trailingData);
499 Q_ASSERT(size < INT_MAX);
504 return (a + 7) & ~size_t(7);
507static_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");
514 int trailingData = 2 * size *
sizeof(quint32_le);
516 Q_ASSERT(s < INT_MAX);
521 return (a + 7) & ~size_t(7);
525 return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this + 1));
529 return stringTable()[i];
532 return stringTable()[size + i];
535static_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");
545static_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");
554static_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");
566static_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");
599 void setFlag(
Flag flag) { flagsAndType.set<FlagsField>(flagsAndType.get<FlagsField>() | flag); }
600 bool hasFlag(
Flag flag)
const {
return Flags(flagsAndType.get<FlagsField>()) & flag; }
601 Flags flags()
const {
return Flags(flagsAndType.get<FlagsField>()); }
604 Type type()
const {
return Type(flagsAndType.get<TypeField>()); }
608 quint32_le constantValueIndex;
609 quint32_le compiledScriptIndex;
610 quint32_le objectIndex;
611 quint32_le translationDataIndex;
627 QString tmp = QLatin1String(
"\"");
628 for (
int i = 0; i < string.size(); ++i) {
629 const QChar &c = string.at(i);
630 switch (c.unicode()) {
632 tmp += QLatin1String(
"\\b");
635 tmp += QLatin1String(
"\\t");
638 tmp += QLatin1String(
"\\n");
641 tmp += QLatin1String(
"\\v");
644 tmp += QLatin1String(
"\\f");
647 tmp += QLatin1String(
"\\r");
650 tmp += QLatin1String(
"\\\"");
653 tmp += QLatin1String(
"\\\'");
656 tmp += QLatin1String(
"\\\\");
663 tmp += QLatin1Char(
'\"');
678 if (type() == Type_Boolean)
684static_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");
693static_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");
700static_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");
709 return reinterpret_cast<
const EnumValue*>(
this + 1) + idx;
724static_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");
734 return reinterpret_cast<
const Parameter*>(
this + 1) + idx;
749static_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");
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
797 void setNameIndex(
int nameIndex) { nameIndexAndVirtSpecifiers.set<NameIndexField>(nameIndex); }
799 bool isVirtual()
const {
return nameIndexAndVirtSpecifiers.get<IsVirtualField>(); }
802 nameIndexAndVirtSpecifiers.set<IsVirtualField>(isVirtual ? 1 : 0);
805 bool isOverride()
const {
return nameIndexAndVirtSpecifiers.get<IsOverrideField>(); }
808 nameIndexAndVirtSpecifiers.set<IsOverrideField>(isOverride ? 1 : 0);
811 bool isFinal()
const {
return nameIndexAndVirtSpecifiers.get<IsFinalField>(); }
812 void setIsFinal(
bool isFinal) { nameIndexAndVirtSpecifiers.set<IsFinalField>(isFinal ? 1 : 0); }
816 data.set<CommonTypeOrTypeNameIndexField>(
static_cast<quint32>(t));
817 data.set<IsCommonTypeField>(
true);
822 return CommonType(data.get<CommonTypeOrTypeNameIndexField>());
828 data.set<CommonTypeOrTypeNameIndexField>(nameIndex);
829 data.set<IsCommonTypeField>(
false);
834 return data.get<IsCommonTypeField>() ? -1 : data.get<CommonTypeOrTypeNameIndexField>();
840 bool isList()
const {
return data.get<IsListField>(); }
841 void setIsList(
bool isList) { data.set<IsListField>(isList); }
843 bool isRequired()
const {
return data.get<IsRequiredField>(); }
844 void setIsRequired(
bool isRequired) { data.set<IsRequiredField>(isRequired); }
846 bool isReadOnly()
const {
return data.get<IsReadOnlyField>(); }
847 void setIsReadOnly(
bool isReadOnly) { data.set<IsReadOnlyField>(isReadOnly); }
849static_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");
855static_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");
859 bool isReadOnly()
const {
return m_nameIndexAndFlags.get<IsReadOnlyField>(); }
860 void setIsReadOnly(
bool isReadOnly) { m_nameIndexAndFlags.set<IsReadOnlyField>(isReadOnly); }
865 m_nameIndexAndFlags.set<NameIndexField>(nameIndex);
869 void setIdIndex(quint32 idIndex) { m_idIndexField = idIndex; }
874 m_propertyNameIndex = propertyNameIndex;
883 m_referenceLocation = referenceLocation;
890 quint32_le_bitfield_union<NameIndexField, IsReadOnlyField> m_nameIndexAndFlags;
891 quint32_le m_idIndexField;
892 quint32_le m_propertyNameIndex;
896static_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");
947 return Flags(flagsAndDefaultPropertyIsAlias.get<FlagsField>());
952 return flagsAndDefaultPropertyIsAlias.get<FlagsField>() & flag;
957 flagsAndDefaultPropertyIsAlias.set<FlagsField>(
958 flagsAndDefaultPropertyIsAlias.get<FlagsField>() | flag);
963 flagsAndDefaultPropertyIsAlias.set<FlagsField>(flags);
968 return flagsAndDefaultPropertyIsAlias.get<DefaultPropertyIsAliasField>();
973 flagsAndDefaultPropertyIsAlias.set<DefaultPropertyIsAliasField>(defaultAlias);
978 return (
sizeof(Object)
979 + nFunctions *
sizeof(quint32)
980 + nProperties *
sizeof(Property)
981 + nAliases *
sizeof(Alias)
982 + nEnums *
sizeof(quint32)
983 + nSignals *
sizeof(quint32)
984 + nBindings *
sizeof(Binding)
985 + nInlineComponents *
sizeof(InlineComponent)
986 + nRequiredPropertyExtraData *
sizeof(RequiredPropertyExtraData)
993 return reinterpret_cast<
const quint32_le*>(
reinterpret_cast<
const char *>(
this) + offsetToFunctions);
998 return reinterpret_cast<
const Property*>(
reinterpret_cast<
const char *>(
this) + offsetToProperties);
1003 return reinterpret_cast<
const Alias*>(
reinterpret_cast<
const char *>(
this) + offsetToAliases);
1008 return reinterpret_cast<
const Binding*>(
reinterpret_cast<
const char *>(
this) + offsetToBindings);
1013 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToEnums);
1014 const quint32_le offset = offsetTable[idx];
1015 return reinterpret_cast<
const Enum*>(
reinterpret_cast<
const char*>(
this) + offset);
1020 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToSignals);
1021 const quint32_le offset = offsetTable[idx];
1022 return reinterpret_cast<
const Signal*>(
reinterpret_cast<
const char*>(
this) + offset);
1032 return reinterpret_cast<
const InlineComponent*>(
reinterpret_cast<
const char *>(
this) + offsetToInlineComponents);
1042 return reinterpret_cast<
const RequiredPropertyExtraData*>(
reinterpret_cast<
const char *>(
this) + offsetToRequiredPropertyExtraData);
1079static_assert(
sizeof(
Object) == 76,
"Object structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
1100 type = 0; uriIndex = 0; qualifierIndex = 0; version = QTypeRevision::zero(); reserved = 0;
1103static_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");
1113 return reinterpret_cast<
const Import*>((
reinterpret_cast<
const char *>(
this)) + offsetToImports + idx *
sizeof(Import));
1117 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToObjects);
1118 const quint32_le offset = offsetTable[idx];
1119 return reinterpret_cast<
const Object*>(
reinterpret_cast<
const char*>(
this) + offset);
1122static_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");
1151 enum :
unsigned int {
1210 return reinterpret_cast<
const QmlUnit *>(
reinterpret_cast<
const char *>(
this) + offsetToQmlUnit);
1214 return reinterpret_cast<QmlUnit *>(
reinterpret_cast<
char *>(
this) + offsetToQmlUnit);
1218 return flags & Unit::IsSingleton;
1224 return (flags & Unit::ListPropertyAssignReplace) == Unit::ListPropertyAssignReplace;
1228 return flags & Unit::ListPropertyAssignReplaceIfNotDefault;
1233 Q_ASSERT(idx < stringTableSize);
1234 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToStringTable);
1235 const quint32_le offset = offsetTable[idx];
1236 const String *str =
reinterpret_cast<
const String*>(
reinterpret_cast<
const char *>(
this) + offset);
1237 Q_ASSERT(str->size >= 0);
1238#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
1239 const QChar *characters =
reinterpret_cast<
const QChar *>(str + 1);
1240 if (flags & StaticData)
1241 return QString::fromRawData(characters, str->size);
1242 return QString(characters, str->size);
1244 const quint16_le *characters =
reinterpret_cast<
const quint16_le *>(str + 1);
1245 QString qstr(str->size, Qt::Uninitialized);
1246 QChar *ch = qstr.data();
1247 for (
int i = 0; i < str->size; ++i)
1248 ch[i] = QChar(quint16(characters[i]));
1254 const quint32_le *
classOffsetTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToClassTable); }
1256 const quint32_le *
blockOffsetTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToBlockTable); }
1259 const quint32_le *offsetTable = functionOffsetTable();
1260 const quint32_le offset = offsetTable[idx];
1261 return reinterpret_cast<
const Function*>(
reinterpret_cast<
const char *>(
this) + offset);
1265 const quint32_le *offsetTable = classOffsetTable();
1266 const quint32_le offset = offsetTable[idx];
1267 return reinterpret_cast<
const Class *>(
reinterpret_cast<
const char *>(
this) + offset);
1271 const quint32_le *offsetTable = templateObjectOffsetTable();
1272 const quint32_le offset = offsetTable[idx];
1273 return reinterpret_cast<
const TemplateObject *>(
reinterpret_cast<
const char *>(
this) + offset);
1277 const quint32_le *offsetTable = blockOffsetTable();
1278 const quint32_le offset = offsetTable[idx];
1279 return reinterpret_cast<
const Block *>(
reinterpret_cast<
const char *>(
this) + offset);
1282 const Lookup *
lookupTable()
const {
return reinterpret_cast<
const Lookup*>(
reinterpret_cast<
const char *>(
this) + offsetToLookupTable); }
1284 return reinterpret_cast<
const RegExp*>(
reinterpret_cast<
const char *>(
this) + offsetToRegexpTable + index *
sizeof(RegExp));
1287 return reinterpret_cast<
const quint64_le*>(
reinterpret_cast<
const char *>(
this) + offsetToConstantTable);
1291 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + offsetToJSClassTable);
1292 const quint32_le offset = offsetTable[idx];
1293 const char *ptr =
reinterpret_cast<
const char *>(
this) + offset;
1295 *nMembers = klass->nMembers;
1300 return reinterpret_cast<
const TranslationData *>(
reinterpret_cast<
const char *>(
this) + offsetToTranslationTable);
1304 if ( translationTableSize == 0)
1306 return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this))
1307 + offsetToTranslationTable
1308 + translationTableSize *
sizeof(CompiledData::TranslationData)); }
1311 if ( translationTableSize == 0)
1313 return reinterpret_cast<quint32_le*>((
reinterpret_cast<
char *>(
this))
1314 + offsetToTranslationTable
1315 + translationTableSize *
sizeof(CompiledData::TranslationData)); }
1317 const ImportEntry *
importEntryTable()
const {
return reinterpret_cast<
const ImportEntry *>(
reinterpret_cast<
const char *>(
this) + offsetToImportEntryTable); }
1322 const quint32_le *
moduleRequestTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToModuleRequestTable); }
1324 bool verifyHeader(QDateTime expectedSourceTimeStamp, QString *errorString)
const;
1327static_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");
1367 reinterpret_cast<
const char *>(
this) +
sizeof(
RuntimeObject));
1378 return reinterpret_cast<
const RuntimeBindingIndex *>(
1379 reinterpret_cast<
const char *>(
this) + offsetToBindingOrder);
1384 return reinterpret_cast<RuntimeBindingIndex *>(
1385 reinterpret_cast<
char *>(
this) + offsetToBindingOrder);
1390 return reinterpret_cast<
const quint32_le *>(
1391 reinterpret_cast<
const char *>(
this) + offsetToNamedObjectsInComponent);
1396 return reinterpret_cast<quint32_le *>(
1397 reinterpret_cast<
char *>(
this) + offsetToNamedObjectsInComponent);
1407 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le *>(
1410 reinterpret_cast<
const char *>(
this) + offsetTable[idx]);
1415 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le *>(
1418 reinterpret_cast<
char *>(
this) + offsetTable[idx]);
1438 Iterator it = find(nameIndex);
1441 return *insert(nameIndex, loc);
1444 template <
typename CompiledObject>
1447 if (obj->inheritedTypeNameIndex != 0) {
1453 auto binding = obj->bindingsBegin();
1454 auto const bindingEnd = obj->bindingsEnd();
1455 for ( ; binding != bindingEnd; ++binding) {
1457 this->add(binding->propertyNameIndex
, binding->location
);
1460 auto ic = obj->inlineComponentsBegin();
1461 auto const icEnd = obj->inlineComponentsEnd();
1462 for (; ic != icEnd; ++ic) {
1463 this->add(ic->nameIndex
, ic->location
);
1467 template <
typename Iterator>
1470 for (; it != end; ++it)
1471 collectFromObject(*it);
1535 LookupValidationFn validateLookupSignatures,
1536 const QString &fileName = QString(),
1537 const QString &finalUrlString = QString())
1541 this->validateLookupSignatures = validateLookupSignatures;
1553 const QString &fileName = QString(),
const QString &finalUrlString = QString())
1557#if Q_BYTE_ORDER == Q_BIG_ENDIAN
1558 delete [] constants;
1560 constants =
nullptr;
1562 m_finalUrlString.clear();
1568#if Q_BYTE_ORDER == Q_BIG_ENDIAN
1569 StaticValue *bigEndianConstants =
new StaticValue[data->constantTableSize];
1570 const quint64_le *littleEndianConstants =
data->constants();
1571 for (uint i = 0; i <
data->constantTableSize; ++i)
1572 bigEndianConstants[i] = StaticValue::fromReturnedValue(littleEndianConstants[i]);
1573 constants = bigEndianConstants;
1575 constants =
reinterpret_cast<
const StaticValue*>(data->constants());
1578 m_fileName = !fileName.isEmpty() ? fileName : stringAt(data->sourceFileIndex);
1579 m_finalUrlString = !finalUrlString.isEmpty() ? finalUrlString : stringAt(data->finalUrlIndex);
1584 if (index <
data->stringTableSize)
1585 return data->stringAtInternal(index);
1587 const qsizetype dynamicIndex = index -
data->stringTableSize;
1588 Q_ASSERT(dynamicIndex < dynamicStrings.size());
1589 return dynamicStrings.at(dynamicIndex);
1599 case Binding::Type_Script:
1600 case Binding::Type_String:
1601 return stringAt(binding->stringIndex);
1603 return QStringLiteral(
"null");
1605 return binding->value.b ? QStringLiteral(
"true") : QStringLiteral(
"false");
1606 case Binding::Type_Number:
1607 return QString::number(bindingValueAsNumber(binding),
'g', QLocale::FloatingPointShortest);
1610 case Binding::Type_TranslationById:
1611 case Binding::Type_Translation:
1612 return stringAt(data->translations()[binding->value.translationDataIndex].stringIndex);
1622 ? CompiledData::Binding::escapedString(stringAt(binding->stringIndex))
1623 : bindingValueAsString(binding);
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();
1777 return int(binding.enumValue);
1778 return std::nullopt;
1791 return reinterpret_cast<RuntimeDataBlock *>(runtimeDataStorage.data());
1798 for (
int i =
objectCount(), end = propertyCaches.count(); i < end; ++i) {
1800 Q_ASSERT(p && p->isComponentWrapper());
1801 if (p->wrappedObjectIndex() == index)
1809 for (uint i = 0; i <
qmlData->nObjects; ++i) {
1811 for (
auto it = object->inlineComponentsBegin(), end = object->inlineComponentsEnd();
1813 if (stringAt(it->nameIndex) == inlineComponentName)
1814 return it->objectIndex;
1822 bool verifyChecksum(
const CompiledData::DependentTypesHasher &dependencyHasher)
const;
1908 QString m_finalUrlString;
1910 mutable QQmlNullableValue<QUrl> m_url;
1911 mutable QQmlNullableValue<QUrl> m_finalUrl;
1926 template<
typename Char>
1929 const quint32_le oldFlags = mutableFlags();
1930 auto cleanup = qScopeGuard([
this, oldFlags]() { mutableFlags() = oldFlags; });
1931 mutableFlags() |= temporaryFlags;
1932 return writer(data<Char>(), size());
1935 static bool writeDataToFile(
const QString &outputFileName,
const char *data, quint32 size,
1936 QString *errorString)
1938#if QT_CONFIG(temporaryfile)
1939 QSaveFile cacheFile(outputFileName);
1940 if (!cacheFile.open(QIODevice::WriteOnly | QIODevice::Truncate)
1941 || cacheFile.write(data, size) != size
1942 || !cacheFile.commit()) {
1943 *errorString = cacheFile.errorString();
1947 errorString->clear();
1950 Q_UNUSED(outputFileName);
1951 *errorString = QStringLiteral(
"features.temporaryfile is disabled.");
1958 quint32 temporaryFlags;
1960 quint32_le &mutableFlags()
const
1962 return const_cast<
Unit *>(unit)->flags;
1965 template<
typename Char>
1966 const Char *data()
const
1968 Q_STATIC_ASSERT(
sizeof(Char) == 1);
1969 const Char *dataPtr;
1970 memcpy(&dataPtr, &unit,
sizeof(dataPtr));
1974 quint32 size()
const
1976 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 isFunctionExpression() const
bool evaluatesToString() const
bool isAttachedProperty() const
quint32_le_bitfield_union< FlagsField, TypeField > flagsAndType
bool hasFlag(Flag flag) const
bool isGroupedProperty() const
bool isTranslationBinding() const
bool valueAsBoolean() const
static QString escapedString(const QString &string)
Q_DECLARE_FLAGS(Flags, Flag)
@ InitializerForReadOnlyDeclaration
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
RuntimeDataBlock * runtimeDataForWrite()
Q_QML_EXPORT ~CompilationUnit()
QByteArray runtimeDataStorage
void setUnitData(const Unit *unitData, const QmlUnit *qmlUnit=nullptr, const QString &fileName=QString(), const QString &finalUrlString=QString())
int inlineComponentId(const QString &inlineComponentName) const
quint32 namedObjectCountInComponent(int objectIndex) const
QMetaType metaType() const
double bindingValueAsNumber(const CompiledData::Binding *binding) const
std::optional< int > bindingFoldedEnum(int objectIndex, int bindingIndex) const
bool bindingIsDeferred(int objectIndex, int bindingIndex) const
void finalizeCompositeType(const QQmlType &type)
QMap< int, int > IdToObjectMap
ResolvedTypeReference * resolvedType(int id) const
const CompiledData::Function CompiledFunction
const QQmlPrivate::AOTCompiledFunction * aotCompiledFunctions
bool valueTypesAreAssertable() const
quint32_le * allocateNamedObjectsInComponent(int objectIndex, quint32 count)
bool bindingIsSignalHandlerExpression(int objectIndex, int bindingIndex) const
bool bindingIsPropertyObserver(int objectIndex, int bindingIndex) const
int objectId(int objectIndex) const
int implicitComponentForObject(int index) const
bool bindingIsCustomParser(int objectIndex, int bindingIndex) const
bool bindingIsSignalHandlerObject(int objectIndex, int bindingIndex) const
ResolvedTypeReferenceMap resolvedTypes
bool objectHasCustomParserBindings(int objectIndex) const
bool isSharedLibrary() const
bool componentsAreBound() const
QList< BindingPropertyData > bindingPropertyDataPerObject
bool verifyChecksum(const CompiledData::DependentTypesHasher &dependencyHasher) const
bool objectIsPopulatedByDeferredBinding(int objectIndex) 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
const RuntimeObject * runtimeObjectAt(int index) 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
void allocateRuntimeData()
LookupValidationFn validateLookupSignatures
bool ignoresFunctionSignature() const
bool valueTypesAreCopied() const
const CompiledData::Binding CompiledBinding
const RuntimeDataBlock * runtimeData
const CompiledData::Import * importAt(int index) const
QQmlPropertyCacheVector propertyCaches
bool objectIsComponent(int objectIndex) const
CompilationUnit(const Unit *unitData, const QQmlPrivate::AOTCompiledFunction *aotCompiledFunctions, LookupValidationFn validateLookupSignatures, const QString &fileName=QString(), const QString &finalUrlString=QString())
QList< QQmlRefPointer< QQmlScriptData > > dependentScripts
QStringList dynamicStrings
bool bindingIsSignalHandler(int objectIndex, int bindingIndex) const
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
bool objectHasDeferredBindings(int objectIndex) const
const StaticValue * constants
const RuntimeBindingIndex * bindingApplicationOrder(int objectIndex) const
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)
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 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
@ IsPartOfInlineComponent
SignalIterator signalsBegin() const
InlineComponentIterator inlineComponentsEnd() const
qint32_le indexOfDefaultPropertyOrAlias
int functionCount() const
const Alias * aliasTable() const
quint16_le nInlineComponents
static int calculateSizeExcludingSignalsAndEnums(int nFunctions, int nProperties, int nAliases, int nEnums, int nSignals, int nBindings, int nInlineComponents, int nRequiredPropertyExtraData)
quint32_le offsetToRequiredPropertyExtraData
const InlineComponent * inlineComponentAt(int idx) const
const Property * propertiesEnd() const
const Binding * bindingTable() const
quint16_le nRequiredPropertyExtraData
const Signal * signalAt(int idx) const
const Property * propertiesBegin() const
Location locationOfIdProperty
const quint32_le * functionOffsetTable() const
TableIterator< InlineComponent, Object, &Object::inlineComponentAt > InlineComponentIterator
const InlineComponent * inlineComponentTable() const
InlineComponentIterator inlineComponentsBegin() const
TableIterator< RequiredPropertyExtraData, Object, &Object::requiredPropertyExtraDataAt > RequiredPropertyExtraDataIterator
SignalIterator signalsEnd() const
quint32_le_bitfield_union< FlagsField, DefaultPropertyIsAliasField > flagsAndDefaultPropertyIsAlias
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
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
@ IsSignalHandlerExpression
const RuntimeObject * objectAt(int idx) const
RuntimeObject * objectAt(int idx)
const RuntimeBindingIndex * bindingOrder() const
quint32_le offsetToBindingOrder
@ PopulatedByDeferredBinding
@ HasCustomParserBindings
RuntimeBinding * bindingTable()
const RuntimeBinding * bindingTable() const
quint32_le offsetToNamedObjectsInComponent
RuntimeBindingIndex * bindingOrder()
quint32_le * namedObjectsInComponentTable()
const quint32_le * namedObjectsInComponentTable() const
quint32_le nNamedObjectsInComponent
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