139 Q_DECLARE_TR_FUNCTIONS(QQmlObjectCreator)
141 enum class InitFlag: quint8
144 IsDocumentRoot = 0x1,
145 IsContextObject = 0x2,
146 IsImplicitComponent = 0x4,
151 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit,
152 const QQmlRefPointer<QQmlContextData> &creationContext,
153 const QString &inlineComponentName,
155 ~QQmlObjectCreator();
158 QObject *
create(
int subComponentIndex = -1, QObject *parent =
nullptr,
165 const QV4::CompiledData::Binding *binding);
167 int index, QObject *instance, QObject *bindingTarget,
169 const QV4::CompiledData::Binding *binding =
nullptr);
182 return parentContext.contextData();
190 QQmlEngine *engine,
QV4::ExecutableCompilationUnit *compilationUnit,
int index,
191 QObject *parent,
const QQmlRefPointer<QQmlContextData> &context);
195 QList<DeferredQPropertyBinding> &pendingBindings = sharedState.data()->allQPropertyBindings;
197 return deferred.properyIndex == propertyIndex && deferred.target == target;
203 const QQmlRefPointer<QQmlContextData> &contextData,
204 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit,
205 const QString inlineComponentName,
206 QQmlObjectCreatorSharedState *inheritedSharedState,
bool isContextObject);
208 void init(
const QQmlRefPointer<QQmlContextData> &parentContext);
210 void initializeDData(
211 const QV4::CompiledData::Object *obj, QObject *instance, QQmlData *ddata,
213 void initializePropertyCache(
214 int index, QQmlData *ddata,
const QV4::ResolvedTypeReference *typeRef);
215 void initializeParent(QObject *instance, QObject *parent);
216 QObject *populateInstanceAndAliasBindings(
int index, QObject *instance, InitFlags flags);
218 QObject *createInstance(
int index, QObject *parent =
nullptr,
bool isContextObject =
false);
220 QObject *initializeComponent(
221 const QV4::CompiledData::Object *obj, QObject *instance, InitFlags flags);
222 QObject *initializeComposite(
223 int index,
const QV4::CompiledData::Object *obj,
224 const QV4::ResolvedTypeReference *typeRef, QObject *instance, QObject *parent,
226 QObject *initializeNonComposite(
227 int index,
const QV4::CompiledData::Object *obj,
228 const QV4::ResolvedTypeReference *typeRef, QObject *instance, QObject *parent,
231 bool populateInstance(
int index, QObject *instance, QObject *bindingTarget,
233 const QV4::CompiledData::Binding *binding =
nullptr);
236 void populateDeferred(QObject *instance,
int deferredIndex);
237 void populateDeferred(QObject *instance,
int deferredIndex,
238 const QQmlPropertyPrivate *qmlProperty,
239 const QV4::CompiledData::Binding *binding);
243 ApplyImmediate = 0x1,
245 ApplyAll = ApplyImmediate | ApplyDeferred,
247 Q_DECLARE_FLAGS(BindingSetupFlags, BindingMode);
249 void setupBindings(BindingSetupFlags mode = BindingMode::ApplyImmediate);
250 bool setPropertyBinding(
const QQmlPropertyData *property,
const QV4::CompiledData::Binding *binding);
251 void setPropertyValue(
const QQmlPropertyData *property,
const QV4::CompiledData::Binding *binding);
252 void setupFunctions();
254 QString stringAt(
int idx)
const {
return compilationUnit->stringAt(idx); }
255 void recordError(
const QV4::CompiledData::Location &location,
const QString &description);
257 void registerObjectWithContextById(
const QV4::CompiledData::Object *object, QObject *instance)
const;
259 inline QV4::QmlContext *currentQmlContext();
260 QV4::ResolvedTypeReference *resolvedType(
int id)
const
262 return compilationUnit->resolvedType(id);
268 CreatingObjectsPhase2,
275 QV4::ExecutionEngine *v4;
276 QString m_inlineComponentName;
277 QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit;
278 const QV4::CompiledData::Unit *qmlUnit;
279 QQmlGuardedContextData parentContext;
280 QQmlRefPointer<QQmlContextData> context;
281 const QQmlPropertyCacheVector *propertyCaches;
282 QQmlRefPointer<QQmlObjectCreatorSharedState> sharedState;
283 bool topLevelCreator;
284 bool isContextObject;
288 QObject *_scopeObject;
289 QObject *_bindingTarget;
292 int _compiledObjectIndex;
293 const QV4::CompiledData::Object *_compiledObject;
295 QQmlPropertyCache::ConstPtr _propertyCache;
296 QQmlVMEMetaObject *_vmeMetaObject;
297 QQmlListProperty<QObject> _currentList;
298 QV4::QmlContext *_qmlContext;
302 typedef std::function<
bool(QQmlObjectCreatorSharedState *sharedState)> PendingAliasBinding;
303 std::vector<PendingAliasBinding> pendingAliasBindings;
305 template<
typename Functor>
306 void doPopulateDeferred(QObject *instance,
int deferredIndex, Functor f)
308 QQmlData *declarativeData = QQmlData::get(instance);
311 Q_ASSERT(declarativeData && declarativeData->propertyCache);
313 QObject *bindingTarget = instance;
315 QQmlPropertyCache::ConstPtr cache = declarativeData->propertyCache;
316 QQmlVMEMetaObject *vmeMetaObject = QQmlVMEMetaObject::get(instance);
318 QObject *scopeObject = instance;
319 qt_ptr_swap(_scopeObject, scopeObject);
321 QV4::Scope valueScope(v4);
322 QScopedValueRollback<ObjectInCreationGCAnchorList> jsObjectGuard(
323 sharedState->allJavaScriptObjects, ObjectInCreationGCAnchorList(valueScope));
325 Q_ASSERT(topLevelCreator);
326 QV4::QmlContext *qmlContext =
static_cast<QV4::QmlContext *>(valueScope.constructUndefined(1));
328 qt_ptr_swap(_qmlContext, qmlContext);
330 _propertyCache.swap(cache);
331 qt_ptr_swap(_qobject, instance);
333 int objectIndex = deferredIndex;
334 std::swap(_compiledObjectIndex, objectIndex);
336 const QV4::CompiledData::Object *obj = compilationUnit->objectAt(_compiledObjectIndex);
337 qt_ptr_swap(_compiledObject, obj);
338 qt_ptr_swap(_ddata, declarativeData);
339 qt_ptr_swap(_bindingTarget, bindingTarget);
340 qt_ptr_swap(_vmeMetaObject, vmeMetaObject);
344 qt_ptr_swap(_vmeMetaObject, vmeMetaObject);
345 qt_ptr_swap(_bindingTarget, bindingTarget);
346 qt_ptr_swap(_ddata, declarativeData);
347 qt_ptr_swap(_compiledObject, obj);
348 std::swap(_compiledObjectIndex, objectIndex);
349 qt_ptr_swap(_qobject, instance);
350 _propertyCache.swap(cache);
352 qt_ptr_swap(_qmlContext, qmlContext);
353 qt_ptr_swap(_scopeObject, scopeObject);
355 void registerPostHocRequiredProperties(
const QV4::CompiledData::Binding *binding);