21inline decltype(
auto) createBindingInScope(QObject *thisObject, CreateBinding create)
23 QQmlEngine *qmlengine = qmlEngine(thisObject);
25 QV4::ExecutionEngine *v4 = qmlengine->handle();
28 QQmlData *ddata = QQmlData::get(thisObject);
29 Q_ASSERT(ddata && ddata->context);
30 QQmlRefPointer<QQmlContextData> ctxtdata = QQmlRefPointer<QQmlContextData>(ddata->context);
33 QV4::ExecutionContext *executionCtx = v4->scriptContext();
34 QV4::Scoped<QV4::QmlContext> qmlContext(
35 scope, QV4::QmlContext::create(executionCtx, ctxtdata, thisObject));
37 return create(ctxtdata, qmlContext);
41QQmlCppBinding::createBindingForBindable(
const QV4::ExecutableCompilationUnit *unit,
42 QObject *thisObject, qsizetype functionIndex,
43 QObject *bindingTarget,
int metaPropertyIndex,
44 int valueTypePropertyIndex,
const QString &propertyName)
46 Q_UNUSED(propertyName);
48 QV4::Function *v4Function = unit->runtimeFunctions.value(functionIndex,
nullptr);
51 qCritical() <<
"invalid JavaScript function index (internal error)";
52 return QUntypedPropertyBinding();
54 if (metaPropertyIndex < 0) {
56 qCritical() <<
"invalid meta property index (internal error)";
57 return QUntypedPropertyBinding();
60 const QMetaObject *mo = bindingTarget->metaObject();
62 QMetaProperty property = mo->property(metaPropertyIndex);
63 Q_ASSERT(valueTypePropertyIndex == -1 || QString::fromUtf8(property.name()) == propertyName);
65 return createBindingInScope(
67 [&](
const QQmlRefPointer<QQmlContextData> &ctxt, QV4::ExecutionContext *scope) {
68 auto index = QQmlPropertyIndex(property.propertyIndex(), valueTypePropertyIndex);
69 return QQmlPropertyBinding::create(property.metaType(), v4Function, thisObject,
70 ctxt, scope, bindingTarget, index);
74void QQmlCppBinding::createBindingForNonBindable(
const QV4::ExecutableCompilationUnit *unit,
75 QObject *thisObject, qsizetype functionIndex,
76 QObject *bindingTarget,
int metaPropertyIndex,
77 int valueTypePropertyIndex,
78 const QString &propertyName)
80 Q_UNUSED(propertyName);
82 QV4::Function *v4Function = unit->runtimeFunctions.value(functionIndex,
nullptr);
85 qCritical() <<
"invalid JavaScript function index (internal error)";
88 if (metaPropertyIndex < 0) {
90 qCritical() <<
"invalid meta property index (internal error)";
94 const QMetaObject *mo = bindingTarget->metaObject();
96 QMetaProperty property = mo->property(metaPropertyIndex);
97 Q_ASSERT(valueTypePropertyIndex != -1 || QString::fromUtf8(property.name()) == propertyName);
101 [&](
const QQmlRefPointer<QQmlContextData> &ctxt, QV4::ExecutionContext *scope) ->
void {
102 QQmlBinding *binding = QQmlBinding::create(property.metaType(), v4Function,
103 thisObject, ctxt, scope);
105 Q_ASSERT(!property.isAlias());
106 binding->setTarget(bindingTarget, property.propertyIndex(),
false,
107 valueTypePropertyIndex);
108 QQmlPropertyPrivate::setBinding(binding);
112QUntypedPropertyBinding QQmlCppBinding::createTranslationBindingForBindable(
113 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit, QObject *bindingTarget,
114 int metaPropertyIndex,
const QQmlTranslation &translationData,
const QString &propertyName)
116 Q_UNUSED(propertyName);
118 if (metaPropertyIndex < 0) {
120 qCritical() <<
"invalid meta property index (internal error)";
121 return QUntypedPropertyBinding();
124 const QMetaObject *mo = bindingTarget->metaObject();
126 QMetaProperty property = mo->property(metaPropertyIndex);
127 Q_ASSERT(QString::fromUtf8(property.name()) == propertyName);
129 return QQmlTranslationPropertyBinding::create(property.metaType(), unit, translationData);
132void QQmlCppBinding::createTranslationBindingForNonBindable(
133 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit,
134 const QQmlSourceLocation &location,
const QQmlTranslation &translationData,
135 QObject *thisObject, QObject *bindingTarget,
int metaPropertyIndex,
136 const QString &propertyName,
int valueTypePropertyIndex)
138 Q_UNUSED(propertyName);
140 if (metaPropertyIndex < 0) {
142 qCritical() <<
"invalid meta property index (internal error)";
146 const QMetaObject *mo = bindingTarget->metaObject();
148 QMetaProperty property = mo->property(metaPropertyIndex);
149 Q_ASSERT(QString::fromUtf8(property.name()) == propertyName);
151 createBindingInScope(
153 [&](
const QQmlRefPointer<QQmlContextData> &ctxt, QV4::ExecutionContext *) ->
void {
154 QQmlBinding *binding = QQmlBinding::createTranslationBinding(
155 unit, ctxt, propertyName, translationData, location, thisObject);
157 Q_ASSERT(!property.isAlias());
158 binding->setTarget(bindingTarget, property.propertyIndex(),
false,
159 valueTypePropertyIndex);
160 QQmlPropertyPrivate::setBinding(binding);