101 Q_DECLARE_PUBLIC(QQmlEngine)
103 ~QQmlEnginePrivate() override;
108 static bool baseModulesUninitialized;
110 QQmlPropertyCapture *propertyCapture =
nullptr;
112 QRecyclePool<QQmlJavaScriptExpressionGuard> jsExpressionGuardPool;
113 QRecyclePool<TriggerList> qPropertyTriggerPool;
115 QQmlContext *rootContext =
nullptr;
116 Q_OBJECT_BINDABLE_PROPERTY(QQmlEnginePrivate, QString, translationLanguage);
118#if !QT_CONFIG(qml_debug)
119 static const quintptr profiler = 0;
121 QQmlProfiler *profiler =
nullptr;
124 bool outputWarningsToMsgLog =
true;
127 QQmlDelayedError *erroredBindings =
nullptr;
128 int inProgressCreations = 0;
130#if QT_CONFIG(qml_worker_script)
131 QThread *workerScriptEngine =
nullptr;
136 QQmlObjectCreator *activeObjectCreator =
nullptr;
138 mutable QRecursiveMutex imageProviderMutex;
139 QHash<QString,QSharedPointer<QQmlImageProviderBase> > imageProviders;
140 QSharedPointer<QQmlImageProviderBase> imageProvider(
const QString &providerId)
const;
142 int scarceResourcesRefCount = 0;
143 void referenceScarceResources();
144 void dereferenceScarceResources();
146 QString offlineStoragePath;
151 QIntrusiveListNode next;
153 QIntrusiveList<Incubator, &Incubator::next> incubatorList;
154 unsigned int incubatorCount = 0;
155 QQmlIncubationController *incubationController =
nullptr;
156 void incubate(QQmlIncubator &,
const QQmlRefPointer<QQmlContextData> &);
159 QString offlineStorageDatabaseDirectory()
const;
161 template <
typename T>
162 T singletonInstance(
const QQmlType &type);
165 void sendExit(
int retCode = 0);
166 void warning(
const QQmlError &);
167 void warning(
const QList<QQmlError> &);
168 static void warning(QQmlEngine *,
const QQmlError &);
169 static void warning(QQmlEngine *,
const QList<QQmlError> &);
170 static void warning(QQmlEnginePrivate *,
const QQmlError &);
171 static void warning(QQmlEnginePrivate *,
const QList<QQmlError> &);
173 inline static QQmlEnginePrivate *get(QQmlEngine *e);
174 inline static const QQmlEnginePrivate *get(
const QQmlEngine *e);
175 inline static QQmlEngine *get(QQmlEnginePrivate *p);
176 inline static const QQmlEngine *get(
const QQmlEnginePrivate *p);
177 inline static QQmlEnginePrivate *get(QV4::ExecutionEngine *e);
179 inline static QQmlEnginePrivate *get(QQmlContext *c);
180 inline static QQmlEnginePrivate *get(
const QQmlRefPointer<QQmlContextData> &c);
182 static QList<QQmlError> qmlErrorFromDiagnostics(
const QString &fileName,
const QList<QQmlJS::DiagnosticMessage> &diagnosticMessages);
184 static bool designerMode();
185 static void activateDesignerMode();
187 static std::atomic<
bool> qml_debugging_enabled;
189 QQmlGadgetPtrWrapper *valueTypeInstance(QMetaType type)
191 int typeIndex = type.id();
192 auto it = cachedValueTypeInstances.constFind(typeIndex);
193 if (it != cachedValueTypeInstances.cend())
196 if (QQmlValueType *valueType = QQmlMetaType::valueType(type)) {
197 QQmlGadgetPtrWrapper *instance =
new QQmlGadgetPtrWrapper(valueType);
198 cachedValueTypeInstances.insert(typeIndex, instance);
205 void executeRuntimeFunction(
const QUrl &url, qsizetype functionIndex, QObject *thisObject,
206 int argc = 0,
void **args =
nullptr, QMetaType *types =
nullptr);
207 void executeRuntimeFunction(
const QV4::ExecutableCompilationUnit *unit, qsizetype functionIndex,
208 QObject *thisObject,
int argc = 0,
void **args =
nullptr,
209 QMetaType *types =
nullptr);
210 QV4::ExecutableCompilationUnit *compilationUnitFromUrl(
const QUrl &url);
211 QQmlRefPointer<QQmlContextData>
212 createInternalContext(
const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit,
213 const QQmlRefPointer<QQmlContextData> &parentContext,
214 int subComponentIndex,
bool isComponentRoot);
215 static void setInternalContext(QObject *This,
const QQmlRefPointer<QQmlContextData> &context,
216 QQmlContextData::QmlObjectKind kind)
219 QQmlData *ddata = QQmlData::get(This,
true);
225 context->installContext(ddata, kind);
226 Q_ASSERT(qmlEngine(This));
230 class SingletonInstances :
private QHash<QQmlType::SingletonInstanceInfo::ConstPtr, QJSValue>
233 void convertAndInsert(
234 QV4::ExecutionEngine *engine,
const QQmlType::SingletonInstanceInfo::ConstPtr &type,
237 QJSValuePrivate::manageStringOnV4Heap(engine, value);
238 insert(type, *value);
243 const auto canDelete = [](QObject *instance,
const auto &siinfo) ->
bool {
247 if (!siinfo->url.isEmpty())
250 const auto *ddata = QQmlData::get(instance,
false);
251 return !(ddata && ddata->indestructible && ddata->explicitIndestructibleSet);
254 for (
auto it = constBegin(), end = constEnd(); it != end; ++it) {
255 auto *instance = it.value().toQObject();
256 if (canDelete(instance, it.key()))
257 QQmlData::markAsDeleted(instance);
260 for (
auto it = constBegin(), end = constEnd(); it != end; ++it) {
261 QObject *instance = it.value().toQObject();
263 if (canDelete(instance, it.key()))
267 QHash<QQmlType::SingletonInstanceInfo::ConstPtr, QJSValue>::clear();
270 using QHash<QQmlType::SingletonInstanceInfo::ConstPtr, QJSValue>::value;
271 using QHash<QQmlType::SingletonInstanceInfo::ConstPtr, QJSValue>::take;
274 SingletonInstances singletonInstances;
275 QHash<
int, QQmlGadgetPtrWrapper *> cachedValueTypeInstances;
277 static bool s_designerMode;
279 void cleanupScarceResources();