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);
213 QQmlRefPointer<QQmlContextData>
214 createBareContext(
const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit,
215 const QQmlRefPointer<QQmlContextData> &parentContext,
int subComponentIndex)
219 QQmlRefPointer<QQmlContextData> context = QQmlContextData::createRefCounted(parentContext);
220 context->setInternal(
true);
221 context->setImports(unit->typeNameCache());
222 context->initFromTypeCompilationUnit(unit, subComponentIndex);
226 QQmlRefPointer<QQmlContextData>
227 createComponentRootContext(
const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit,
228 const QQmlRefPointer<QQmlContextData> &parentContex,
229 int subComponentIndex);
231 static void setInternalContext(QObject *This,
const QQmlRefPointer<QQmlContextData> &context,
232 QQmlContextData::QmlObjectKind kind)
235 QQmlData *ddata = QQmlData::get(This,
true);
241 context->installContext(ddata, kind);
242 Q_ASSERT(qmlEngine(This));
246 class SingletonInstances :
private QHash<QQmlType::SingletonInstanceInfo::ConstPtr, QJSValue>
249 void convertAndInsert(
250 QV4::ExecutionEngine *engine,
const QQmlType::SingletonInstanceInfo::ConstPtr &type,
253 QJSValuePrivate::manageStringOnV4Heap(engine, value);
254 insert(type, *value);
259 const auto canDelete = [](QObject *instance,
const auto &siinfo) ->
bool {
263 if (!siinfo->url.isEmpty())
266 const auto *ddata = QQmlData::get(instance,
false);
267 return !(ddata && ddata->indestructible && ddata->explicitIndestructibleSet);
270 for (
auto it = constBegin(), end = constEnd(); it != end; ++it) {
271 auto *instance = it.value().toQObject();
272 if (canDelete(instance, it.key()))
273 QQmlData::markAsDeleted(instance);
276 for (
auto it = constBegin(), end = constEnd(); it != end; ++it) {
277 QObject *instance = it.value().toQObject();
279 if (canDelete(instance, it.key()))
283 QHash<QQmlType::SingletonInstanceInfo::ConstPtr, QJSValue>::clear();
286 using QHash<QQmlType::SingletonInstanceInfo::ConstPtr, QJSValue>::value;
287 using QHash<QQmlType::SingletonInstanceInfo::ConstPtr, QJSValue>::take;
290 SingletonInstances singletonInstances;
291 QHash<
int, QQmlGadgetPtrWrapper *> cachedValueTypeInstances;
293 static bool s_designerMode;
295 void cleanupScarceResources();