diff options
Diffstat (limited to 'src/tools/moc/generator.cpp')
-rw-r--r-- | src/tools/moc/generator.cpp | 318 |
1 files changed, 29 insertions, 289 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index c36e01a79a..1d2fa5d1d7 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -671,11 +671,6 @@ void Generator::generateCode() generateSignal(&cdef->signalList[signalindex], signalindex); // -// Generate QProperty forwarding API -// - generateQPropertyApi(); - -// // Generate plugin meta data // generatePluginMetaData(); @@ -1317,46 +1312,21 @@ void Generator::generateStaticMetacall() prefix += p.inPrivateClass + "->"; } - if (!p.qpropertyname.isEmpty() && p.stored != "true") { - // nullptr checks needed. - fprintf(out, " case %d:\n", propindex); - if (p.gspec == PropertyDef::PointerSpec || p.gspec == PropertyDef::ReferenceSpec) { - fprintf(out, " if (auto *source = %s%s)\n", prefix.constData(), p.qpropertyname.constData()); - fprintf(out, " _a[0] = const_cast<void*>(reinterpret_cast<const void*>(%ssource->value()));\n", p.gspec == PropertyDef::ReferenceSpec ? "&" : ""); - fprintf(out, " else\n"); - fprintf(out, " _a[0] = nullptr;\n"); - } else if (cdef->enumDeclarations.value(p.type, false)) { - fprintf(out, " if (auto *source = %s%s)\n", prefix.constData(), p.qpropertyname.constData()); - fprintf(out, " *reinterpret_cast<int*>(_v) = QFlag(source->value()));\n"); - fprintf(out, " else\n"); - fprintf(out, " *reinterpret_cast<int*>(_v) = QFlag(%s())\n;", p.type.constData()); - } else if (!p.read.isEmpty()) { - fprintf(out, " if (auto *source = %s%s)\n", prefix.constData(), p.qpropertyname.constData()); - fprintf(out, " *reinterpret_cast<%s*>(_v) = source->value();\n", p.type.constData()); - fprintf(out, " else\n"); - fprintf(out, " *reinterpret_cast<%s*>(_v) = %s()\n;", p.type.constData(), p.type.constData()); - } else { - fprintf(out, " *reinterpret_cast< %s*>(_v) = %s%s;\n", - p.type.constData(), prefix.constData(), p.member.constData()); - } - fprintf(out, " break;\n"); - } else { - if (p.gspec == PropertyDef::PointerSpec) - fprintf(out, " case %d: _a[0] = const_cast<void*>(reinterpret_cast<const void*>(%s%s())); break;\n", - propindex, prefix.constData(), p.read.constData()); - else if (p.gspec == PropertyDef::ReferenceSpec) - fprintf(out, " case %d: _a[0] = const_cast<void*>(reinterpret_cast<const void*>(&%s%s())); break;\n", - propindex, prefix.constData(), p.read.constData()); - else if (cdef->enumDeclarations.value(p.type, false)) - fprintf(out, " case %d: *reinterpret_cast<int*>(_v) = QFlag(%s%s()); break;\n", - propindex, prefix.constData(), p.read.constData()); - else if (!p.read.isEmpty()) - fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s(); break;\n", - propindex, p.type.constData(), prefix.constData(), p.read.constData()); - else - fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s; break;\n", - propindex, p.type.constData(), prefix.constData(), p.member.constData()); - } + if (p.gspec == PropertyDef::PointerSpec) + fprintf(out, " case %d: _a[0] = const_cast<void*>(reinterpret_cast<const void*>(%s%s())); break;\n", + propindex, prefix.constData(), p.read.constData()); + else if (p.gspec == PropertyDef::ReferenceSpec) + fprintf(out, " case %d: _a[0] = const_cast<void*>(reinterpret_cast<const void*>(&%s%s())); break;\n", + propindex, prefix.constData(), p.read.constData()); + else if (cdef->enumDeclarations.value(p.type, false)) + fprintf(out, " case %d: *reinterpret_cast<int*>(_v) = QFlag(%s%s()); break;\n", + propindex, prefix.constData(), p.read.constData()); + else if (!p.read.isEmpty()) + fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s(); break;\n", + propindex, p.type.constData(), prefix.constData(), p.read.constData()); + else + fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s; break;\n", + propindex, p.type.constData(), prefix.constData(), p.member.constData()); } fprintf(out, " default: break;\n"); fprintf(out, " }\n"); @@ -1382,35 +1352,11 @@ void Generator::generateStaticMetacall() prefix += p.inPrivateClass + "->"; } if (cdef->enumDeclarations.value(p.type, false)) { - if (!p.qpropertyname.isEmpty() && p.stored != "true") { - fprintf(out, " case %d:\n", propindex); - fprintf(out, " if (auto *destination = %s%s)\n", prefix.constData(), p.qpropertyname.constData()); - fprintf(out, " destination->setValue(QFlag(*reinterpret_cast<int*>(_v)));"); - fprintf(out, " break;"); - } else { - fprintf(out, " case %d: %s%s(QFlag(*reinterpret_cast<int*>(_v))); break;\n", - propindex, prefix.constData(), p.write.constData()); - } + fprintf(out, " case %d: %s%s(QFlag(*reinterpret_cast<int*>(_v))); break;\n", + propindex, prefix.constData(), p.write.constData()); } else if (!p.write.isEmpty()) { - QByteArray optionalQPropertyOwner; - if (p.isQPropertyWithNotifier) { - optionalQPropertyOwner = "_t"; - if (p.inPrivateClass.size()) { - optionalQPropertyOwner += "->"; - optionalQPropertyOwner += p.inPrivateClass; - } - optionalQPropertyOwner += ", "; - } - - if (!p.qpropertyname.isEmpty() && p.stored != "true") { - fprintf(out, " case %d:\n", propindex); - fprintf(out, " if (auto *destination = %s%s)\n", prefix.constData(), p.qpropertyname.constData()); - fprintf(out, " destination->setValue(%s*reinterpret_cast<%s*>(_v));\n", optionalQPropertyOwner.constData(), p.type.constData()); - fprintf(out, " break;\n"); - } else { - fprintf(out, " case %d: %s%s(%s*reinterpret_cast< %s*>(_v)); break;\n", - propindex, prefix.constData(), p.write.constData(), optionalQPropertyOwner.constData(), p.type.constData()); - } + fprintf(out, " case %d: %s%s(*reinterpret_cast< %s*>(_v)); break;\n", + propindex, prefix.constData(), p.write.constData(), p.type.constData()); } else { fprintf(out, " case %d:\n", propindex); fprintf(out, " if (%s%s != *reinterpret_cast< %s*>(_v)) {\n", @@ -1458,6 +1404,7 @@ void Generator::generateStaticMetacall() } fprintf(out, " }"); +#if 0 fprintf(out, " else "); fprintf(out, "if (_c == QMetaObject::RegisterQPropertyObserver) {\n"); if (haveQProperties) { @@ -1469,16 +1416,12 @@ void Generator::generateStaticMetacall() if (!p.isQProperty) continue; QByteArray prefix = "_t->"; - if (p.inPrivateClass.size()) { - prefix += p.inPrivateClass + "->"; - } if (p.qpropertyname.isEmpty() || p.stored == "true") { fprintf(out, " case %d: observer->setSource(%s%s); break;\n", - propindex, prefix.constData(), - p.qpropertyname.isEmpty() ? p.name.constData() : p.qpropertyname.constData()); + propindex, prefix.constData(), p.bindingAccessor.constData()); } else { fprintf(out, " case %d: if (auto *source = %s%s) observer->setSource(*source); break; \n", - propindex, prefix.constData(), p.qpropertyname.constData()); + propindex, prefix.constData(), p.bindingAccessor.constData()); } } fprintf(out, " default: break;\n"); @@ -1496,26 +1439,16 @@ void Generator::generateStaticMetacall() if (!p.isQProperty) continue; QByteArray prefix = "_t->"; - QByteArray objectAccessor = "_t"; - if (p.inPrivateClass.size()) { - prefix += p.inPrivateClass + "->"; - objectAccessor += "->"; - objectAccessor += p.inPrivateClass; - } - if (p.isQPropertyWithNotifier) - objectAccessor += ", "; - else - objectAccessor.clear(); if (p.qpropertyname.isEmpty() || p.stored == "true") { - fprintf(out, " case %d: %s%s.setBinding(%s*reinterpret_cast<QPropertyBinding<%s> *>(_a[0])); break;\n", + fprintf(out, " case %d: %s%s.setBinding(*reinterpret_cast<QPropertyBinding<%s> *>(_a[0])); break;\n", propindex, prefix.constData(), - p.qpropertyname.isEmpty() ? p.name.constData() : p.qpropertyname.constData(), - objectAccessor.constData(), p.type.constData()); + p.bindingAccessor.constData(), + p.type.constData()); } else { - fprintf(out, " case %d: if (auto *source = %s%s) source->setBinding(%s*reinterpret_cast<QPropertyBinding<%s> *>(_a[0])); break;\n", - propindex, prefix.constData(), p.qpropertyname.constData(), - objectAccessor.constData(), p.type.constData()); + fprintf(out, " case %d: if (auto *source = %s%s) source->setBinding(*reinterpret_cast<QPropertyBinding<%s> *>(_a[0])); break;\n", + propindex, prefix.constData(), p.bindingAccessor.constData(), + p.type.constData()); } } @@ -1523,7 +1456,7 @@ void Generator::generateStaticMetacall() fprintf(out, " }\n"); } fprintf(out, " }"); - +#endif fprintf(out, "\n#endif // QT_NO_PROPERTIES"); needElse = true; } @@ -1608,199 +1541,6 @@ void Generator::generateSignal(FunctionDef *def,int index) fprintf(out, "}\n"); } -void Generator::generateQPropertyApi() -{ - for (const PrivateQPropertyDef &property: cdef->privateQProperties) { - auto printAccessor = [this, property](bool constAccessor = false) { - const char *constOrNot = constAccessor ? "const " : " "; - fprintf(out, " const size_t propertyMemberOffset = Q_OFFSETOF(%s, %s);\n", cdef->qualified.constData(), property.name.constData()); - fprintf(out, " %sauto *thisPtr = reinterpret_cast<%s%s *>(reinterpret_cast<%schar *>(this) - propertyMemberOffset);\n", constOrNot, constOrNot, cdef->qualified.constData(), constOrNot); - }; - - const bool stored = (property.name == property.storage); - const bool isNotifiedProperty = property.isNotifiedProperty; - - // property accessor - fprintf(out, "\n%s %s::_qt_property_api_%s::value() const\n{\n", - property.type.name.constData(), - cdef->qualified.constData(), - property.name.constData()); - printAccessor(/*const*/true); - if (stored) { - fprintf(out, " return thisPtr->%s->%s.value();\n", property.accessor.constData(), property.storage.constData()); - } else { - fprintf(out, " if (auto *source = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData()); - fprintf(out, " return source->value();\n"); - fprintf(out, " else\n"); - fprintf(out, " return %s();\n", property.type.name.constData()); - } - fprintf(out, "}\n"); - - // property value setter - fprintf(out, "\nvoid %s::_qt_property_api_%s::setValue(%s const &value)\n{\n", - cdef->qualified.constData(), - property.name.constData(), - property.type.name.constData()); - printAccessor(); - if (stored) { - if (isNotifiedProperty) - fprintf(out, " thisPtr->%s->%s.setValue(thisPtr->%s, value);\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData()); - else - fprintf(out, " thisPtr->%s->%s.setValue(value);\n", property.accessor.constData(), property.storage.constData()); - } else { - fprintf(out, " if (auto *target = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData()); - if (isNotifiedProperty) - fprintf(out, " target->setValue(thisPtr->%s, value);\n", property.accessor.constData()); - else - fprintf(out, " target->setValue(value);\n"); - } - fprintf(out, "}\n"); - - // property value move setter - fprintf(out, "\nvoid %s::_qt_property_api_%s::setValue(%s &&value)\n{\n", - cdef->qualified.constData(), - property.name.constData(), - property.type.name.constData()); - printAccessor(); - if (stored) { - if (isNotifiedProperty) - fprintf(out, " thisPtr->%s->%s.setValue(thisPtr->%s, std::move(value));\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData()); - else - fprintf(out, " thisPtr->%s->%s.setValue(std::move(value));\n", property.accessor.constData(), property.storage.constData()); - } else { - fprintf(out, " if (auto *target = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData()); - if (isNotifiedProperty) - fprintf(out, " target->setValue(thisPtr->%s, std::move(value));\n", property.accessor.constData()); - else - fprintf(out, " target->setValue(std::move(value));\n"); - } - fprintf(out, "}\n"); - - // binding setter - fprintf(out, "\nQPropertyBinding<%s> %s::_qt_property_api_%s::setBinding(const QPropertyBinding<%s> &binding)\n{\n", - property.type.name.constData(), - cdef->qualified.constData(), - property.name.constData(), - property.type.name.constData()); - printAccessor(); - if (stored) { - if (isNotifiedProperty) - fprintf(out, " return thisPtr->%s->%s.setBinding(thisPtr->%s, binding);\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData()); - else - fprintf(out, " return thisPtr->%s->%s.setBinding(binding);\n", property.accessor.constData(), property.storage.constData()); - } else { - fprintf(out, " if (auto *target = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData()); - if (isNotifiedProperty) - fprintf(out, " return target->setBinding(thisPtr->%s, binding);\n", property.accessor.constData()); - else - fprintf(out, " return target->setBinding(binding);\n"); - fprintf(out, " else\n"); - fprintf(out, " return QPropertyBinding<%s>();\n", property.type.name.constData()); - } - fprintf(out, "}\n"); - - // binding move setter - fprintf(out, "\nQPropertyBinding<%s> %s::_qt_property_api_%s::setBinding(QPropertyBinding<%s> &&binding)\n{\n", - property.type.name.constData(), - cdef->qualified.constData(), - property.name.constData(), - property.type.name.constData()); - printAccessor(); - if (stored) { - if (isNotifiedProperty) - fprintf(out, " return thisPtr->%s->%s.setBinding(thisPtr->%s, std::move(binding));\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData()); - else - fprintf(out, " return thisPtr->%s->%s.setBinding(std::move(binding));\n", property.accessor.constData(), property.storage.constData()); - } else { - fprintf(out, " if (auto *target = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData()); - if (isNotifiedProperty) - fprintf(out, " return target->setBinding(thisPtr->%s, std::move(binding));\n", property.accessor.constData()); - else - fprintf(out, " return target->setBinding(std::move(binding));\n"); - fprintf(out, " else\n"); - fprintf(out, " return QPropertyBinding<%s>();\n", property.type.name.constData()); - } - fprintf(out, "}\n"); - - // untyped binding setter - fprintf(out, "\nbool %s::_qt_property_api_%s::setBinding(const QUntypedPropertyBinding &binding)\n{\n", - cdef->qualified.constData(), - property.name.constData()); - printAccessor(); - if (stored) { - if (isNotifiedProperty) - fprintf(out, " return thisPtr->%s->%s.setBinding(thisPtr->%s, binding);\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData()); - else - fprintf(out, " return thisPtr->%s->%s.setBinding(binding);\n", property.accessor.constData(), property.storage.constData()); - } else { - fprintf(out, " if (auto *target = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData()); - if (isNotifiedProperty) - fprintf(out, " return target->setBinding(thisPtr->%s, binding);\n", property.accessor.constData()); - else - fprintf(out, " return target->setBinding(binding);\n"); - fprintf(out, " else\n"); - fprintf(out, " return false;\n"); - } - - fprintf(out, "}\n"); - - // binding bool getter - fprintf(out, "\nbool %s::_qt_property_api_%s::hasBinding() const\n{\n", - cdef->qualified.constData(), - property.name.constData()); - printAccessor(/*const*/true); - if (stored) { - fprintf(out, " return thisPtr->%s->%s.hasBinding();\n", property.accessor.constData(), property.storage.constData()); - } else { - fprintf(out, " if (auto *source = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData()); - fprintf(out, " return source->hasBinding();\n"); - fprintf(out, " else\n"); - fprintf(out, " return false;\n"); - } - fprintf(out, "}\n"); - - // binding getter - fprintf(out, "\nQPropertyBinding<%s> %s::_qt_property_api_%s::binding() const\n{\n", - property.type.name.constData(), - cdef->qualified.constData(), - property.name.constData()); - printAccessor(/*const*/true); - if (stored) { - fprintf(out, " return thisPtr->%s->%s.binding();\n", property.accessor.constData(), property.storage.constData()); - } else { - fprintf(out, " if (auto *source = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData()); - fprintf(out, " return source->binding();\n"); - fprintf(out, " else\n"); - fprintf(out, " return QPropertyBinding<%s>();\n", property.type.name.constData()); - } - fprintf(out, "}\n"); - - // binding taker - fprintf(out, "\nQPropertyBinding<%s> %s::_qt_property_api_%s::takeBinding()\n{\n", - property.type.name.constData(), - cdef->qualified.constData(), - property.name.constData()); - printAccessor(); - if (stored) { - fprintf(out, " return thisPtr->%s->%s.takeBinding();\n", property.accessor.constData(), property.storage.constData()); - } else { - fprintf(out, " if (auto *source = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData()); - fprintf(out, " return source->takeBinding();\n"); - fprintf(out, " else\n"); - fprintf(out, " return QPropertyBinding<%s>();\n", property.type.name.constData()); - } - fprintf(out, "}\n"); - - // property setter function - fprintf(out, "\nvoid %s::%s(%s const& value)\n{\n", - cdef->qualified.constData(), - property.setter.constData(), - property.type.name.constData()); - fprintf(out, " this->%s.setValue(value);\n", property.name.constData()); - fprintf(out, "}\n\n"); - } -} - static CborError jsonValueToCbor(CborEncoder *parent, const QJsonValue &v); static CborError jsonObjectToCbor(CborEncoder *parent, const QJsonObject &o) { |