7#include <private/qcore_unix_p.h>
8#include <private/qv4compileddata_p.h>
10#include <QtCore/qscopeguard.h>
11#include <QtCore/qdatetime.h>
20CompiledData::Unit *CompilationUnitMapper::open(
const QString &cacheFileName,
const QDateTime &sourceTimeStamp, QString *errorString)
24 int fd = qt_safe_open(QFile::encodeName(cacheFileName).constData(), O_RDONLY);
26 *errorString = qt_error_string(errno);
30 auto cleanup = qScopeGuard([fd]{
34 CompiledData::Unit header;
35 qint64 bytesRead = qt_safe_read(fd,
reinterpret_cast<
char *>(&header),
sizeof(header));
37 if (bytesRead !=
sizeof(header)) {
38 *errorString = QStringLiteral(
"File too small for the header fields");
42 if (!header.verifyHeader(sourceTimeStamp, errorString))
47 length =
static_cast<size_t>(lseek(fd, 0, SEEK_END));
49
50
51
52
53
54 if (length != header.unitSize) {
55 *errorString = QStringLiteral(
"Potential file corruption, file too small");
59 void *ptr = mmap(
nullptr, length, PROT_READ, MAP_SHARED, fd, 0);
61 *errorString = qt_error_string(errno);
66 return reinterpret_cast<CompiledData::Unit*>(dataPtr);
69void CompilationUnitMapper::close()
72 if (dataPtr !=
nullptr) {
78 if (!(
reinterpret_cast<CompiledData::Unit*>(dataPtr)->flags & CompiledData::Unit::StaticData))
79 munmap(dataPtr, length);