102 Q_DECLARE_PUBLIC(QQmlEngine)
104 ~QQmlEnginePrivate() override;
109 static bool baseModulesUninitialized;
111 QQmlPropertyCapture *propertyCapture =
nullptr;
113 QRecyclePool<QQmlJavaScriptExpressionGuard> jsExpressionGuardPool;
114 QRecyclePool<TriggerList> qPropertyTriggerPool;
116 QQmlContext *rootContext =
nullptr;
117 Q_OBJECT_BINDABLE_PROPERTY(QQmlEnginePrivate, QString, translationLanguage);
119#if !QT_CONFIG(qml_debug)
120 static const quintptr profiler = 0;
122 QQmlProfiler *profiler =
nullptr;
125 bool outputWarningsToMsgLog =
true;
128 QQmlDelayedError *erroredBindings =
nullptr;
129 int inProgressCreations = 0;
131#if QT_CONFIG(qml_worker_script)
132 QThread *workerScriptEngine =
nullptr;
137 QQmlObjectCreator *activeObjectCreator =
nullptr;
139 mutable QRecursiveMutex imageProviderMutex;
140 QHash<QString,QSharedPointer<QQmlImageProviderBase> > imageProviders;
141 QSharedPointer<QQmlImageProviderBase> imageProvider(
const QString &providerId)
const;
143 int scarceResourcesRefCount = 0;
144 void referenceScarceResources();
145 void dereferenceScarceResources();
147 QString offlineStoragePath;
152 QIntrusiveListNode next;
154 QIntrusiveList<Incubator, &Incubator::next> incubatorList;
155 unsigned int incubatorCount = 0;
156 QQmlIncubationController *incubationController =
nullptr;
157 void incubate(QQmlIncubator &,
const QQmlRefPointer<QQmlContextData> &);
160 QString offlineStorageDatabaseDirectory()
const;
162 template <
typename T>
163 T singletonInstance(
const QQmlType &type);
166 void sendExit(
int retCode = 0);
167 void warning(
const QQmlError &);
168 void warning(
const QList<QQmlError> &);
169 static void warning(QQmlEngine *,
const QQmlError &);
170 static void warning(QQmlEngine *,
const QList<QQmlError> &);
171 static void warning(QQmlEnginePrivate *,
const QQmlError &);
172 static void warning(QQmlEnginePrivate *,
const QList<QQmlError> &);
174 inline static QQmlEnginePrivate *get(QQmlEngine *e);
175 inline static const QQmlEnginePrivate *get(
const QQmlEngine *e);
176 inline static QQmlEngine *get(QQmlEnginePrivate *p);
177 inline static const QQmlEngine *get(
const QQmlEnginePrivate *p);
178 inline static QQmlEnginePrivate *get(QV4::ExecutionEngine *e);
180 inline static QQmlEnginePrivate *get(QQmlContext *c);
181 inline static QQmlEnginePrivate *get(
const QQmlRefPointer<QQmlContextData> &c);
183 static QList<QQmlError> qmlErrorFromDiagnostics(
const QString &fileName,
const QList<QQmlJS::DiagnosticMessage> &diagnosticMessages);
185 static bool designerMode();
186 static void activateDesignerMode();
188 static std::atomic<
bool> qml_debugging_enabled;
190 QQmlGadgetPtrWrapper *valueTypeInstance(QMetaType type)
192 int typeIndex = type.id();
193 auto it = cachedValueTypeInstances.constFind(typeIndex);
194 if (it != cachedValueTypeInstances.cend())
197 if (QQmlValueType *valueType = QQmlMetaType::valueType(type)) {
198 QQmlGadgetPtrWrapper *instance =
new QQmlGadgetPtrWrapper(valueType);
199 cachedValueTypeInstances.insert(typeIndex, instance);
206 void executeRuntimeFunction(
const QUrl &url, qsizetype functionIndex, QObject *thisObject,
207 int argc = 0,
void **args =
nullptr, QMetaType *types =
nullptr);
208 void executeRuntimeFunction(
const QV4::ExecutableCompilationUnit *unit, qsizetype functionIndex,
209 QObject *thisObject,
int argc = 0,
void **args =
nullptr,
210 QMetaType *types =
nullptr);
211 QV4::ExecutableCompilationUnit *compilationUnitFromUrl(
const QUrl &url);
212 QQmlRefPointer<QQmlContextData>
213 createInternalContext(
const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit,
214 const QQmlRefPointer<QQmlContextData> &parentContext,
215 int subComponentIndex,
bool isComponentRoot);
216 static void setInternalContext(QObject *This,
const QQmlRefPointer<QQmlContextData> &context,
217 QQmlContextData::QmlObjectKind kind)
220 QQmlData *ddata = QQmlData::get(This,
true);
226 context->installContext(ddata, kind);
227 Q_ASSERT(qmlEngine(This));
231 class SingletonInstances :
private QHash<QQmlType::SingletonInstanceInfo::ConstPtr, QJSValue>
234 void convertAndInsert(
235 QV4::ExecutionEngine *engine,
const QQmlType::SingletonInstanceInfo::ConstPtr &type,
238 QJSValuePrivate::manageStringOnV4Heap(engine, value);
239 insert(type, *value);
244 const auto canDelete = [](QObject *instance,
const auto &siinfo) ->
bool {
248 if (!siinfo->url.isEmpty())
251 const auto *ddata = QQmlData::get(instance,
false);
252 return !(ddata && ddata->indestructible && ddata->explicitIndestructibleSet);
255 for (
auto it = constBegin(), end = constEnd(); it != end; ++it) {
256 auto *instance = it.value().toQObject();
257 if (canDelete(instance, it.key()))
258 QQmlData::markAsDeleted(instance);
261 for (
auto it = constBegin(), end = constEnd(); it != end; ++it) {
262 QObject *instance = it.value().toQObject();
264 if (canDelete(instance, it.key()))
268 QHash<QQmlType::SingletonInstanceInfo::ConstPtr, QJSValue>::clear();
271 using QHash<QQmlType::SingletonInstanceInfo::ConstPtr, QJSValue>::value;
272 using QHash<QQmlType::SingletonInstanceInfo::ConstPtr, QJSValue>::take;
275 SingletonInstances singletonInstances;
276 QHash<
int, QQmlGadgetPtrWrapper *> cachedValueTypeInstances;
278 static bool s_designerMode;
280 void cleanupScarceResources();