20inline decltype(
auto) createBindingInScope(QObject *thisObject, CreateBinding create)
22 QQmlEngine *qmlengine = qmlEngine(thisObject);
24 QV4::ExecutionEngine *v4 = qmlengine->handle();
27 QQmlData *ddata = QQmlData::get(thisObject);
28 Q_ASSERT(ddata && ddata->context);
29 QQmlRefPointer<QQmlContextData> ctxtdata = QQmlRefPointer<QQmlContextData>(ddata->context);
32 QV4::ExecutionContext *executionCtx = v4->scriptContext();
33 QV4::Scoped<QV4::QmlContext> qmlContext(
34 scope, QV4::QmlContext::create(executionCtx, ctxtdata, thisObject));
36 return create(ctxtdata, qmlContext);
40QQmlCppBinding::createBindingForBindable(
const QV4::ExecutableCompilationUnit *unit,
41 QObject *thisObject, qsizetype functionIndex,
42 QObject *bindingTarget,
int metaPropertyIndex,
43 int valueTypePropertyIndex,
const QString &propertyName)
45 Q_UNUSED(propertyName);
47 QV4::Function *v4Function = unit->runtimeFunctions.value(functionIndex,
nullptr);
50 qCritical() <<
"invalid JavaScript function index (internal error)";
51 return QUntypedPropertyBinding();
53 if (metaPropertyIndex < 0) {
55 qCritical() <<
"invalid meta property index (internal error)";
56 return QUntypedPropertyBinding();
59 const QMetaObject *mo = bindingTarget->metaObject();
61 QMetaProperty property = mo->property(metaPropertyIndex);
62 Q_ASSERT(valueTypePropertyIndex == -1 || QString::fromUtf8(property.name()) == propertyName);
64 return createBindingInScope(
66 [&](
const QQmlRefPointer<QQmlContextData> &ctxt, QV4::ExecutionContext *scope) {
67 auto index = QQmlPropertyIndex(property.propertyIndex(), valueTypePropertyIndex);
68 return QQmlPropertyBinding::create(property.metaType(), v4Function, thisObject,
69 ctxt, scope, bindingTarget, index);
73void QQmlCppBinding::createBindingForNonBindable(
const QV4::ExecutableCompilationUnit *unit,
74 QObject *thisObject, qsizetype functionIndex,
75 QObject *bindingTarget,
int metaPropertyIndex,
76 int valueTypePropertyIndex,
77 const QString &propertyName)
79 Q_UNUSED(propertyName);
81 QV4::Function *v4Function = unit->runtimeFunctions.value(functionIndex,
nullptr);
84 qCritical() <<
"invalid JavaScript function index (internal error)";
87 if (metaPropertyIndex < 0) {
89 qCritical() <<
"invalid meta property index (internal error)";
93 const QMetaObject *mo = bindingTarget->metaObject();
95 QMetaProperty property = mo->property(metaPropertyIndex);
96 Q_ASSERT(valueTypePropertyIndex != -1 || QString::fromUtf8(property.name()) == propertyName);
100 [&](
const QQmlRefPointer<QQmlContextData> &ctxt, QV4::ExecutionContext *scope) ->
void {
101 QQmlBinding *binding = QQmlBinding::create(property.metaType(), v4Function,
102 thisObject, ctxt, scope);
104 Q_ASSERT(!property.isAlias());
105 binding->setTarget(bindingTarget, property.propertyIndex(),
false,
106 valueTypePropertyIndex);
107 QQmlPropertyPrivate::setBinding(binding);
111QUntypedPropertyBinding QQmlCppBinding::createTranslationBindingForBindable(
112 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit, QObject *bindingTarget,
113 int metaPropertyIndex,
const QQmlTranslation &translationData,
const QString &propertyName)
115 Q_UNUSED(propertyName);
117 if (metaPropertyIndex < 0) {
119 qCritical() <<
"invalid meta property index (internal error)";
120 return QUntypedPropertyBinding();
123 const QMetaObject *mo = bindingTarget->metaObject();
125 QMetaProperty property = mo->property(metaPropertyIndex);
126 Q_ASSERT(QString::fromUtf8(property.name()) == propertyName);
128 return QQmlTranslationPropertyBinding::create(property.metaType(), unit, translationData);
131void QQmlCppBinding::createTranslationBindingForNonBindable(
132 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit,
133 const QQmlSourceLocation &location,
const QQmlTranslation &translationData,
134 QObject *thisObject, QObject *bindingTarget,
int metaPropertyIndex,
135 const QString &propertyName,
int valueTypePropertyIndex)
137 Q_UNUSED(propertyName);
139 if (metaPropertyIndex < 0) {
141 qCritical() <<
"invalid meta property index (internal error)";
145 const QMetaObject *mo = bindingTarget->metaObject();
147 QMetaProperty property = mo->property(metaPropertyIndex);
148 Q_ASSERT(QString::fromUtf8(property.name()) == propertyName);
150 createBindingInScope(
152 [&](
const QQmlRefPointer<QQmlContextData> &ctxt, QV4::ExecutionContext *) ->
void {
153 QQmlBinding *binding = QQmlBinding::createTranslationBinding(
154 unit, ctxt, propertyName, translationData, location, thisObject);
156 Q_ASSERT(!property.isAlias());
157 binding->setTarget(bindingTarget, property.propertyIndex(),
false,
158 valueTypePropertyIndex);
159 QQmlPropertyPrivate::setBinding(binding);