Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qv4compilationunitmapper.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant
4
6
7#include <private/qv4compileddata_p.h>
8
9#include <QtCore/qdatetime.h>
10#include <QtCore/qmutex.h>
11#include <QtCore/qhash.h>
12
14
15using namespace QV4;
16
18{
19public:
21
22 CompilationUnitMapper get(const QString &file)
23 {
24 const auto it = s_staticUnits.constFind(file);
25 return it == s_staticUnits.constEnd() ? CompilationUnitMapper() : *it;
26 }
27
28 void set(const QString &file, const CompilationUnitMapper &staticUnit) {
29 s_staticUnits.insert(file, staticUnit);
30 }
31
32 void remove(const QString &file)
33 {
34 s_staticUnits.remove(file);
35 }
36
37private:
38 QMutexLocker<QMutex> m_lock;
39
40 static QMutex s_mutex;
41
42 // We can copy the mappers around because they're all static.
43 // We never unmap the files.
44 static QHash<QString, CompilationUnitMapper> s_staticUnits;
45};
46
47QHash<QString, CompilationUnitMapper> StaticUnitCache::s_staticUnits;
48QMutex StaticUnitCache::s_mutex;
49
50CompiledData::Unit *CompilationUnitMapper::get(
51 const QString &cacheFilePath, const QDateTime &sourceTimeStamp, QString *errorString)
52{
53 StaticUnitCache cache;
54
55 CompilationUnitMapper mapper = cache.get(cacheFilePath);
56 if (mapper.dataPtr) {
57 auto *unit = reinterpret_cast<CompiledData::Unit *>(mapper.dataPtr);
58 if (unit->verifyHeader(sourceTimeStamp, errorString)) {
59 *this = mapper;
60 return unit;
61 }
62
63 return nullptr;
64 }
65
66 CompiledData::Unit *data = open(cacheFilePath, sourceTimeStamp, errorString);
67 if (data && (data->flags & CompiledData::Unit::StaticData)) {
68 cache.set(cacheFilePath, *this);
69 return data;
70 } else {
71 close();
72 return nullptr;
73 }
74}
75
76void CompilationUnitMapper::invalidate(const QString &cacheFilePath)
77{
78 StaticUnitCache cache;
79 cache.remove(cacheFilePath);
80}
81
82QT_END_NAMESPACE
CompilationUnitMapper get(const QString &file)
void set(const QString &file, const CompilationUnitMapper &staticUnit)
void remove(const QString &file)