7#include <private/qv4compileddata_p.h>
9#include <QtCore/qdatetime.h>
10#include <QtCore/qfileinfo.h>
11#include <QtCore/qscopeguard.h>
13#include <qt_windows.h>
19CompiledData::Unit *CompilationUnitMapper::open(
const QString &cacheFileName,
const QDateTime &sourceTimeStamp, QString *errorString)
26 CreateFile(
reinterpret_cast<
const wchar_t*>(cacheFileName.constData()),
27 GENERIC_READ | GENERIC_EXECUTE, FILE_SHARE_READ,
28 nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
30 if (handle == INVALID_HANDLE_VALUE) {
31 *errorString = qt_error_string(GetLastError());
35 auto fileHandleCleanup = qScopeGuard([handle]{
39 CompiledData::Unit header;
41 if (!ReadFile(handle,
reinterpret_cast<
char *>(&header),
sizeof(header), &bytesRead,
nullptr)) {
42 *errorString = qt_error_string(GetLastError());
46 if (bytesRead !=
sizeof(header)) {
47 *errorString = QStringLiteral(
"File too small for the header fields");
51 if (!header.verifyHeader(sourceTimeStamp, errorString))
57
58
59
60
61
62 LARGE_INTEGER fileSize;
63 if (!GetFileSizeEx(handle, &fileSize)) {
64 *errorString = QStringLiteral(
"Could not determine file size");
67 if (header.unitSize != fileSize.QuadPart) {
68 *errorString = QStringLiteral(
"Potential file corruption, file too small");
73 HANDLE fileMappingHandle = CreateFileMapping(handle, 0, PAGE_READONLY, 0, 0, 0);
74 if (!fileMappingHandle) {
75 *errorString = qt_error_string(GetLastError());
79 auto mappingCleanup = qScopeGuard([fileMappingHandle]{
80 CloseHandle(fileMappingHandle);
83 dataPtr = MapViewOfFile(fileMappingHandle, FILE_MAP_READ, 0, 0, 0);
85 *errorString = qt_error_string(GetLastError());
89 return reinterpret_cast<CompiledData::Unit*>(dataPtr);
92void CompilationUnitMapper::close()
94 if (dataPtr !=
nullptr) {
100 if (!(
reinterpret_cast<CompiledData::Unit*>(dataPtr)->flags & CompiledData::Unit::StaticData))
101 UnmapViewOfFile(dataPtr);