##// END OF EJS Templates
- upgraded generator to generate polymorphic handlers for downcasting...
florianlink -
r29:fa33440a60c5
parent child
Show More
@@ -471,6 +471,8 public:
471 FunctionType functionType() const { return m_function_type; }
471 FunctionType functionType() const { return m_function_type; }
472 void setFunctionType(FunctionType type) { m_function_type = type; }
472 void setFunctionType(FunctionType type) { m_function_type = type; }
473
473
474 bool isVirtual() { return !(isFinal() || isSignal() || isStatic()); }
475
474 QStringList introspectionCompatibleSignatures(const QStringList &resolvedArguments = QStringList()) const;
476 QStringList introspectionCompatibleSignatures(const QStringList &resolvedArguments = QStringList()) const;
475 QString signature() const;
477 QString signature() const;
476 QString targetLangSignature(bool minimal = false) const;
478 QString targetLangSignature(bool minimal = false) const;
@@ -68,6 +68,7 QString GeneratorSetQtScript::generate() {
68 SetupGenerator setupGenerator;
68 SetupGenerator setupGenerator;
69 setupGenerator.setOutputDirectory(outDir);
69 setupGenerator.setOutputDirectory(outDir);
70 setupGenerator.setQtMetaTypeDeclaredTypeNames(declaredTypeNames);
70 setupGenerator.setQtMetaTypeDeclaredTypeNames(declaredTypeNames);
71 setupGenerator.setClasses(classes);
71
72
72 /*
73 /*
73 ClassGenerator classGenerator(&priGenerator, &setupGenerator);
74 ClassGenerator classGenerator(&priGenerator, &setupGenerator);
@@ -41,6 +41,20 bool hasDefaultConstructor(const AbstractMetaClass *meta_class);
41
41
42 void SetupGenerator::generate()
42 void SetupGenerator::generate()
43 {
43 {
44 AbstractMetaClassList classes_with_polymorphic_id;
45 {
46 QHashIterator<QString, QList<const AbstractMetaClass*> > pack(packHash);
47 while (pack.hasNext()) {
48 pack.next();
49 QList<const AbstractMetaClass*> list = pack.value();
50 foreach (const AbstractMetaClass *cls, list) {
51 if (cls->typeEntry()->isPolymorphicBase()) {
52 classes_with_polymorphic_id.append((AbstractMetaClass*)cls);
53 }
54 }
55 }
56 }
57
44 QHashIterator<QString, QList<const AbstractMetaClass*> > pack(packHash);
58 QHashIterator<QString, QList<const AbstractMetaClass*> > pack(packHash);
45 while (pack.hasNext()) {
59 while (pack.hasNext()) {
46 pack.next();
60 pack.next();
@@ -91,6 +105,9 void SetupGenerator::generate()
91 }
105 }
92 s << endl;
106 s << endl;
93
107
108 QStringList polymorphicHandlers = writePolymorphicHandler(s, list.at(0)->package(), classes_with_polymorphic_id);
109 s << endl;
110
94 // declare individual class creation functions
111 // declare individual class creation functions
95 s << "void PythonQt_init_" << shortPackName << "() {" << endl;
112 s << "void PythonQt_init_" << shortPackName << "() {" << endl;
96 QStringList cppClassNames;
113 QStringList cppClassNames;
@@ -115,9 +132,84 void SetupGenerator::generate()
115 }
132 }
116 }
133 }
117 s << endl;
134 s << endl;
135 foreach (QString handler, polymorphicHandlers) {
136 s << "PythonQt::self()->addPolymorphicHandler(\""<< handler << "\", polymorphichandler_" << handler << ");" << endl;
137 }
118
138
119 s << "}";
139 s << "}";
120 s << endl;
140 s << endl;
121 }
141 }
122 }
142 }
123 }
143 }
144
145 QStringList SetupGenerator::writePolymorphicHandler(QTextStream &s, const QString &package,
146 const AbstractMetaClassList &classes)
147 {
148 QStringList handlers;
149 foreach (AbstractMetaClass *cls, classes) {
150 const ComplexTypeEntry *centry = cls->typeEntry();
151 if (!centry->isPolymorphicBase())
152 continue;
153 bool isGraphicsItem = (cls->qualifiedCppName()=="QGraphicsItem");
154
155 AbstractMetaClassList classList = this->classes();
156 bool first = true;
157 foreach (AbstractMetaClass *clazz, classList) {
158 bool inherits = false;
159 if (isGraphicsItem) {
160 foreach(AbstractMetaClass* interfaze, clazz->interfaces()) {
161 if (interfaze->qualifiedCppName()=="QGraphicsItem") {
162 inherits = true;
163 break;
164 }
165 }
166 } else {
167 inherits = clazz->inheritsFrom(cls);
168 }
169 if (clazz->package() == package && inherits) {
170 if (!clazz->typeEntry()->polymorphicIdValue().isEmpty() || isGraphicsItem) {
171 // On first find, open the function
172 if (first) {
173 first = false;
174
175 QString handler = cls->name();
176 handlers.append(handler);
177
178 s << "static void* polymorphichandler_" << handler
179 << "(const void *ptr, char **class_name)" << endl
180 << "{" << endl
181 << " Q_ASSERT(ptr != 0);" << endl
182 << " " << cls->qualifiedCppName() << " *object = ("
183 << cls->qualifiedCppName() << " *)ptr;" << endl;
184 }
185
186 // For each, add case label
187 QString polyId = clazz->typeEntry()->polymorphicIdValue();
188 if (isGraphicsItem) {
189 polyId = "%1->type() == " + clazz->qualifiedCppName() + "::Type";
190 }
191 s << " if ("
192 << polyId.replace("%1", "object")
193 << ") {" << endl
194 << " *class_name = \"" << clazz->name() << "\";" << endl
195 << " return (" << clazz->qualifiedCppName() << "*)object;" << endl
196 << " }" << endl;
197 } else {
198 QString warning = QString("class '%1' inherits from polymorphic class '%2', but has no polymorphic id set")
199 .arg(clazz->name())
200 .arg(cls->name());
201
202 ReportHandler::warning(warning);
203 }
204 }
205 }
206
207 // Close the function if it has been opened
208 if (!first) {
209 s << " return NULL;" << endl
210 << "}" << endl;
211 }
212 }
213
214 return handlers;
215 }
@@ -37,6 +37,9 class SetupGenerator : public Generator
37 void addClass(const AbstractMetaClass *cls);
37 void addClass(const AbstractMetaClass *cls);
38
38
39 private:
39 private:
40 QStringList writePolymorphicHandler(QTextStream &s, const QString &package,
41 const AbstractMetaClassList &classes);
42
40 QHash<QString, QList<const AbstractMetaClass*> > packHash;
43 QHash<QString, QList<const AbstractMetaClass*> > packHash;
41 };
44 };
42 #endif // SETUPGENERATOR_H
45 #endif // SETUPGENERATOR_H
@@ -269,7 +269,7 AbstractMetaFunctionList ShellGenerator::getProtectedFunctionsThatNeedPromotion(
269 AbstractMetaFunctionList functions;
269 AbstractMetaFunctionList functions;
270 AbstractMetaFunctionList functions1 = getFunctionsToWrap(meta_class);
270 AbstractMetaFunctionList functions1 = getFunctionsToWrap(meta_class);
271 foreach(AbstractMetaFunction* func, functions1) {
271 foreach(AbstractMetaFunction* func, functions1) {
272 if (!func->wasPublic()) {
272 if (!func->isPublic() || func->isVirtual()) {
273 functions << func;
273 functions << func;
274 }
274 }
275 }
275 }
@@ -117,7 +117,7 void ShellHeaderGenerator::write(QTextStream &s, const AbstractMetaClass *meta_c
117
117
118 foreach(AbstractMetaFunction* fun, promoteFunctions) {
118 foreach(AbstractMetaFunction* fun, promoteFunctions) {
119 s << "inline ";
119 s << "inline ";
120 writeFunctionSignature(s, fun, 0, QString(),
120 writeFunctionSignature(s, fun, 0, "promoted_",
121 Option(IncludeDefaultExpression | OriginalName | ShowStatic | UnderscoreSpaces));
121 Option(IncludeDefaultExpression | OriginalName | ShowStatic | UnderscoreSpaces));
122 s << " { ";
122 s << " { ";
123 QString scriptFunctionName = fun->originalName();
123 QString scriptFunctionName = fun->originalName();
@@ -199,6 +199,8 void ShellImplGenerator::write(QTextStream &s, const AbstractMetaClass *meta_cla
199 }
199 }
200 }
200 }
201
201
202 QString wrappedObject = " (*theWrappedObject)";
203
202 // write member functions
204 // write member functions
203 for (int i = 0; i < functions.size(); ++i) {
205 for (int i = 0; i < functions.size(); ++i) {
204 AbstractMetaFunction *fun = functions.at(i);
206 AbstractMetaFunction *fun = functions.at(i);
@@ -208,12 +210,7 void ShellImplGenerator::write(QTextStream &s, const AbstractMetaClass *meta_cla
208 Option(FirstArgIsWrappedObject | OriginalName | ShowStatic | UnderscoreSpaces),
210 Option(FirstArgIsWrappedObject | OriginalName | ShowStatic | UnderscoreSpaces),
209 "PythonQtWrapper_");
211 "PythonQtWrapper_");
210 s << endl << "{" << endl;
212 s << endl << "{" << endl;
211 QString wrappedObject;
213 s << " ";
212 if (fun->wasPublic()) {
213 wrappedObject = " (*theWrappedObject)";
214 } else {
215 wrappedObject = " (*((" + promoterClassName(meta_class) + "*)theWrappedObject))";
216 }
217 if (ShellGenerator::isSpecialStreamingOperator(fun)) {
214 if (ShellGenerator::isSpecialStreamingOperator(fun)) {
218 s << fun->arguments().at(0)->argumentName();
215 s << fun->arguments().at(0)->argumentName();
219 if (fun->originalName().startsWith("operator>>")) {
216 if (fun->originalName().startsWith("operator>>")) {
@@ -241,7 +238,11 void ShellImplGenerator::write(QTextStream &s, const AbstractMetaClass *meta_cla
241 if (fun->isStatic()) {
238 if (fun->isStatic()) {
242 s << meta_class->qualifiedCppName() << "::";
239 s << meta_class->qualifiedCppName() << "::";
243 } else {
240 } else {
244 s << wrappedObject << ".";
241 if (!fun->isPublic() || fun->isVirtual()) {
242 s << " ((" << promoterClassName(meta_class) << "*)theWrappedObject)->promoted_";
243 } else {
244 s << " theWrappedObject->";
245 }
245 }
246 }
246 s << fun->originalName() << "(";
247 s << fun->originalName() << "(";
247 for (int i = 0; i < args.size(); ++i) {
248 for (int i = 0; i < args.size(); ++i) {
@@ -1401,7 +1401,7
1401 <interface-type name="QLayoutItem"/>
1401 <interface-type name="QLayoutItem"/>
1402 <interface-type name="QPaintDevice"/>
1402 <interface-type name="QPaintDevice"/>
1403
1403
1404 <interface-type name="QGraphicsItem" delete-in-main-thread="yes">
1404 <interface-type name="QGraphicsItem" delete-in-main-thread="yes" polymorphic-base="yes">
1405 <modify-function signature="setMatrix(QMatrix, bool)" remove="all"/>
1405 <modify-function signature="setMatrix(QMatrix, bool)" remove="all"/>
1406
1406
1407 <modify-function signature="paint(QPainter*,const QStyleOptionGraphicsItem*,QWidget*)">
1407 <modify-function signature="paint(QPainter*,const QStyleOptionGraphicsItem*,QWidget*)">
General Comments 0
You need to be logged in to leave comments. Login now