137 Q_DECLARE_TR_FUNCTIONS(QQmlObjectCreator)
139 QQmlObjectCreator(
const QQmlRefPointer<QQmlContextData> &parentContext,
140 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit,
141 const QQmlRefPointer<QQmlContextData> &creationContext,
142 const QString &inlineComponentName,
143 QQmlIncubatorPrivate *incubator =
nullptr);
144 ~QQmlObjectCreator();
147 QObject *
create(
int subComponentIndex = -1, QObject *parent =
nullptr,
154 const QV4::CompiledData::Binding *binding);
156 int index, QObject *instance, QObject *bindingTarget,
158 const QV4::CompiledData::Binding *binding =
nullptr);
171 return parentContext.contextData();
179 QQmlEngine *engine,
QV4::ExecutableCompilationUnit *compilationUnit,
int index,
180 QObject *parent,
const QQmlRefPointer<QQmlContextData> &context);
184 QList<DeferredQPropertyBinding> &pendingBindings = sharedState.data()->allQPropertyBindings;
186 return deferred.properyIndex == propertyIndex && deferred.target == target;
192 const QQmlRefPointer<QQmlContextData> &contextData,
193 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit,
194 const QString inlineComponentName,
195 QQmlObjectCreatorSharedState *inheritedSharedState,
bool isContextObject);
197 void init(
const QQmlRefPointer<QQmlContextData> &parentContext);
199 QObject *createInstance(
int index, QObject *parent =
nullptr,
bool isContextObject =
false);
201 bool populateInstance(
int index, QObject *instance, QObject *bindingTarget,
203 const QV4::CompiledData::Binding *binding =
nullptr);
206 void populateDeferred(QObject *instance,
int deferredIndex);
207 void populateDeferred(QObject *instance,
int deferredIndex,
208 const QQmlPropertyPrivate *qmlProperty,
209 const QV4::CompiledData::Binding *binding);
213 ApplyImmediate = 0x1,
215 ApplyAll = ApplyImmediate | ApplyDeferred,
217 Q_DECLARE_FLAGS(BindingSetupFlags, BindingMode);
219 void setupBindings(BindingSetupFlags mode = BindingMode::ApplyImmediate);
220 bool setPropertyBinding(
const QQmlPropertyData *property,
const QV4::CompiledData::Binding *binding);
221 void setPropertyValue(
const QQmlPropertyData *property,
const QV4::CompiledData::Binding *binding);
222 void setupFunctions();
224 QString stringAt(
int idx)
const {
return compilationUnit->stringAt(idx); }
225 void recordError(
const QV4::CompiledData::Location &location,
const QString &description);
227 void registerObjectWithContextById(
const QV4::CompiledData::Object *object, QObject *instance)
const;
229 inline QV4::QmlContext *currentQmlContext();
230 QV4::ResolvedTypeReference *resolvedType(
int id)
const
232 return compilationUnit->resolvedType(id);
238 CreatingObjectsPhase2,
245 QV4::ExecutionEngine *v4;
246 QString m_inlineComponentName;
247 QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit;
248 const QV4::CompiledData::Unit *qmlUnit;
249 QQmlGuardedContextData parentContext;
250 QQmlRefPointer<QQmlContextData> context;
251 const QQmlPropertyCacheVector *propertyCaches;
252 QQmlRefPointer<QQmlObjectCreatorSharedState> sharedState;
253 bool topLevelCreator;
254 bool isContextObject;
258 QObject *_scopeObject;
259 QObject *_bindingTarget;
262 int _compiledObjectIndex;
263 const QV4::CompiledData::Object *_compiledObject;
265 QQmlPropertyCache::ConstPtr _propertyCache;
266 QQmlVMEMetaObject *_vmeMetaObject;
267 QQmlListProperty<
void> _currentList;
268 QV4::QmlContext *_qmlContext;
272 typedef std::function<
bool(QQmlObjectCreatorSharedState *sharedState)> PendingAliasBinding;
273 std::vector<PendingAliasBinding> pendingAliasBindings;
275 template<
typename Functor>
276 void doPopulateDeferred(QObject *instance,
int deferredIndex, Functor f)
278 QQmlData *declarativeData = QQmlData::get(instance);
281 Q_ASSERT(declarativeData && declarativeData->propertyCache);
283 QObject *bindingTarget = instance;
285 QQmlPropertyCache::ConstPtr cache = declarativeData->propertyCache;
286 QQmlVMEMetaObject *vmeMetaObject = QQmlVMEMetaObject::get(instance);
288 QObject *scopeObject = instance;
289 qt_ptr_swap(_scopeObject, scopeObject);
291 QV4::Scope valueScope(v4);
292 QScopedValueRollback<ObjectInCreationGCAnchorList> jsObjectGuard(
293 sharedState->allJavaScriptObjects, ObjectInCreationGCAnchorList(valueScope));
295 Q_ASSERT(topLevelCreator);
296 QV4::QmlContext *qmlContext =
static_cast<QV4::QmlContext *>(valueScope.constructUndefined(1));
298 qt_ptr_swap(_qmlContext, qmlContext);
300 _propertyCache.swap(cache);
301 qt_ptr_swap(_qobject, instance);
303 int objectIndex = deferredIndex;
304 std::swap(_compiledObjectIndex, objectIndex);
306 const QV4::CompiledData::Object *obj = compilationUnit->objectAt(_compiledObjectIndex);
307 qt_ptr_swap(_compiledObject, obj);
308 qt_ptr_swap(_ddata, declarativeData);
309 qt_ptr_swap(_bindingTarget, bindingTarget);
310 qt_ptr_swap(_vmeMetaObject, vmeMetaObject);
314 qt_ptr_swap(_vmeMetaObject, vmeMetaObject);
315 qt_ptr_swap(_bindingTarget, bindingTarget);
316 qt_ptr_swap(_ddata, declarativeData);
317 qt_ptr_swap(_compiledObject, obj);
318 std::swap(_compiledObjectIndex, objectIndex);
319 qt_ptr_swap(_qobject, instance);
320 _propertyCache.swap(cache);
322 qt_ptr_swap(_qmlContext, qmlContext);
323 qt_ptr_swap(_scopeObject, scopeObject);