Mercurial > projects > qtd
comparison generator/cppimplgenerator.cpp @ 252:37eed70de029
More things broken than fixed. Rolling back to 263
author | maxter |
---|---|
date | Sat, 22 Aug 2009 12:50:58 +0000 |
parents | 7664de4a55e5 |
children | 073b9153ed8a |
comparison
equal
deleted
inserted
replaced
251:739d0ee5bd91 | 252:37eed70de029 |
---|---|
463 bool CppImplGenerator::hasCustomDestructor(const AbstractMetaClass *java_class) const | 463 bool CppImplGenerator::hasCustomDestructor(const AbstractMetaClass *java_class) const |
464 { | 464 { |
465 return !java_class->isQObject() && !java_class->typeEntry()->isValue(); | 465 return !java_class->isQObject() && !java_class->typeEntry()->isValue(); |
466 } | 466 } |
467 | 467 |
468 void writeQtdEntityFunction(QTextStream &s, const AbstractMetaClass *java_class) | |
469 { | |
470 // if (!(java_class->typeEntry()->isObject() || java_class->typeEntry()->isQObject())) | |
471 // return; | |
472 if (!java_class->hasVirtualFunctions()) | |
473 return; | |
474 | |
475 s << "extern \"C\" DLL_PUBLIC void *__" << java_class->name() << "_entity(void *q_ptr)" << endl; | |
476 s << "{" << endl; | |
477 { | |
478 Indentation indent(INDENT); | |
479 s << INDENT << "Qtd_QObjectEntity* a = dynamic_cast<Qtd_QObjectEntity*>((" << java_class->qualifiedCppName() << "*)q_ptr);" << endl | |
480 << INDENT << "if (a != NULL)" << endl | |
481 << INDENT << " return a->d_entity();" << endl | |
482 << INDENT << "else" << endl | |
483 << INDENT << " return NULL;" << endl; | |
484 } | |
485 s << "}" << endl << endl; | |
486 } | |
487 | |
468 void CppImplGenerator::writeInterfaceCasts(QTextStream &s, const AbstractMetaClass *java_class) | 488 void CppImplGenerator::writeInterfaceCasts(QTextStream &s, const AbstractMetaClass *java_class) |
469 { | 489 { |
470 // pointers to native interface objects for classes that implement interfaces | 490 // pointers to native interface objects for classes that implement interfaces |
471 // initializing | 491 // initializing |
472 AbstractMetaClassList interfaces = java_class->interfaces(); | 492 AbstractMetaClassList interfaces = java_class->interfaces(); |
509 // D-side signal callbacks | 529 // D-side signal callbacks |
510 AbstractMetaFunctionList signal_funcs = signalFunctions(java_class); | 530 AbstractMetaFunctionList signal_funcs = signalFunctions(java_class); |
511 for(int i = 0; i < signal_funcs.size(); i++) | 531 for(int i = 0; i < signal_funcs.size(); i++) |
512 s << " emit_callbacks_" << java_class->name() << "[" << i << "] = (EmitCallback)" | 532 s << " emit_callbacks_" << java_class->name() << "[" << i << "] = (EmitCallback)" |
513 "sigs[" << i << "];" << endl; | 533 "sigs[" << i << "];" << endl; |
534 | |
535 if (java_class->isQObject()) | |
536 s << " qtd_D_" << java_class->name() << "_delete = " | |
537 "(qtd_pf_D_" << java_class->name() << "_delete)qobj_del;" << endl; | |
538 | |
514 | 539 |
515 s << "}" << endl; | 540 s << "}" << endl; |
516 } | 541 } |
517 | 542 |
518 | 543 |
581 writeShellSignatures(s, java_class); | 606 writeShellSignatures(s, java_class); |
582 | 607 |
583 writeDefaultConstructedValues(s, java_class); | 608 writeDefaultConstructedValues(s, java_class); |
584 | 609 |
585 if (hasCustomDestructor(java_class)) */ | 610 if (hasCustomDestructor(java_class)) */ |
586 if (!java_class->isQObject()) | 611 writeFinalDestructor(s, java_class); |
587 writeFinalDestructor(s, java_class); | |
588 | 612 |
589 if (java_class->isQObject()) | 613 if (java_class->isQObject()) |
590 writeSignalsHandling(s, java_class); | 614 writeSignalsHandling(s, java_class); |
591 | 615 |
592 if (shellClass) { | 616 if (shellClass) { |
594 if (function->isConstructor() && !function->isPrivate()) | 618 if (function->isConstructor() && !function->isPrivate()) |
595 writeShellConstructor(s, function); | 619 writeShellConstructor(s, function); |
596 } | 620 } |
597 writeShellDestructor(s, java_class); | 621 writeShellDestructor(s, java_class); |
598 | 622 |
599 if (!java_class->isQObject() && java_class->hasVirtualFunctions()) | 623 writeQtdEntityFunction(s, java_class); |
600 writeQtdEntityFunction(s, java_class); | |
601 | 624 |
602 if (java_class->isQObject()) | 625 if (java_class->isQObject()) |
603 writeQObjectFunctions(s, java_class); | 626 writeQObjectFunctions(s, java_class); |
604 | 627 |
605 // Virtual overrides | 628 // Virtual overrides |
697 } | 720 } |
698 | 721 |
699 writeSignalInitialization(s, java_class); | 722 writeSignalInitialization(s, java_class); |
700 */ | 723 */ |
701 // qtd writeJavaLangObjectOverrideFunctions(s, java_class); | 724 // qtd writeJavaLangObjectOverrideFunctions(s, java_class); |
702 | |
703 if (java_class->isQObject()) | |
704 { | |
705 s << endl << endl | |
706 << "extern \"C\" DLL_PUBLIC void* qtd_" << java_class->name() << "_staticMetaObject() {" << endl | |
707 << " return (void*)&" << java_class->name() << "::staticMetaObject;" << endl | |
708 << "}" << endl; | |
709 } | |
710 | 725 |
711 s << endl << endl; | 726 s << endl << endl; |
712 | 727 |
713 priGenerator->addSource(java_class->package(), fileNameForClass(java_class)); | 728 priGenerator->addSource(java_class->package(), fileNameForClass(java_class)); |
714 } | 729 } |
821 if (f_type->isEnum() || f_type->isFlags()) | 836 if (f_type->isEnum() || f_type->isFlags()) |
822 s << "(" << f_type->typeEntry()->qualifiedCppName() <<") "; | 837 s << "(" << f_type->typeEntry()->qualifiedCppName() <<") "; |
823 } | 838 } |
824 | 839 |
825 s << function->marshalledName() << "_dispatch(" | 840 s << function->marshalledName() << "_dispatch(" |
826 << "this->dId"; | 841 << "this->d_entity()"; |
827 | 842 |
828 if (f_type) { | 843 if (f_type) { |
829 if (f_type->isTargetLangString()) | 844 if (f_type->isTargetLangString()) |
830 s << ", &ret_str"; | 845 s << ", &ret_str"; |
831 if (f_type->name() == "QModelIndex" || f_type->typeEntry()->isStructInD()) | 846 if (f_type->name() == "QModelIndex" || f_type->typeEntry()->isStructInD()) |
844 | 859 |
845 if (f_type) { | 860 if (f_type) { |
846 if (f_type->name() == "QModelIndex") { | 861 if (f_type->name() == "QModelIndex") { |
847 s << INDENT << "QModelIndex __qt_return_value = qtd_to_QModelIndex( __d_return_value );" << endl; | 862 s << INDENT << "QModelIndex __qt_return_value = qtd_to_QModelIndex( __d_return_value );" << endl; |
848 #ifdef Q_OS_WIN32 | 863 #ifdef Q_OS_WIN32 |
849 s << "qtd_dummy();" << endl; // hack!!! | 864 s << "__qtd_dummy();" << endl; // hack!!! |
850 #endif | 865 #endif |
851 s << INDENT << "return __qt_return_value;" << endl; | 866 s << INDENT << "return __qt_return_value;" << endl; |
852 } else if (f_type->typeEntry()->isStructInD()) | 867 } else if (f_type->typeEntry()->isStructInD()) |
853 s << INDENT << "return __d_return_value;" << endl; | 868 s << INDENT << "return __d_return_value;" << endl; |
854 | 869 |
1240 << " if (!strcmp(_clname, \"" << shellClassName(java_class) << "\"))" << endl | 1255 << " if (!strcmp(_clname, \"" << shellClassName(java_class) << "\"))" << endl |
1241 << " return static_cast<void*>(const_cast<" << shellClassName(java_class) << "*>(this));" << endl | 1256 << " return static_cast<void*>(const_cast<" << shellClassName(java_class) << "*>(this));" << endl |
1242 << " return " << java_class->qualifiedCppName() << "::qt_metacast(_clname);" << endl | 1257 << " return " << java_class->qualifiedCppName() << "::qt_metacast(_clname);" << endl |
1243 << "}" << endl << endl; | 1258 << "}" << endl << endl; |
1244 */ | 1259 */ |
1245 | 1260 |
1261 // writeSignalsHandling(s, java_class); | |
1262 /* | |
1263 // QObject_Link::qt_metacall() | |
1246 s << "int " << shellClassName(java_class) << "::qt_metacall(QMetaObject::Call _c, int _id, void **_a)" << endl | 1264 s << "int " << shellClassName(java_class) << "::qt_metacall(QMetaObject::Call _c, int _id, void **_a)" << endl |
1247 << "{" << endl; | 1265 << "{" << endl; |
1248 | 1266 |
1249 s << " _id = " << java_class->qualifiedCppName() << "::qt_metacall(_c, _id, _a);" << endl | 1267 s << " _id = " << java_class->qualifiedCppName() << "::qt_metacall(_c, _id, _a);" << endl |
1250 << " if (_id < 0 || _c != QMetaObject::InvokeMetaMethod)" << endl | 1268 << " if (_id < 0 || _c != QMetaObject::InvokeMetaMethod)" << endl |
1251 << " return _id;" << endl | 1269 << " return _id;" << endl |
1252 << " emit_callbacks_" << java_class->name() << "[_id](this->dId, _a);" << endl | 1270 // << " Q_ASSERT(_id < 2);" << endl |
1271 << " emit_callbacks_" << java_class->name() << "[_id](this->d_entity(), _a);" << endl | |
1253 << " return -1;" << endl | 1272 << " return -1;" << endl |
1254 << "}" << endl << endl; | 1273 << "}" << endl << endl; |
1274 */ | |
1255 } | 1275 } |
1256 | 1276 |
1257 void CppImplGenerator::writeSignalHandler(QTextStream &s, const AbstractMetaClass *d_class, AbstractMetaFunction *function) | 1277 void CppImplGenerator::writeSignalHandler(QTextStream &s, const AbstractMetaClass *d_class, AbstractMetaFunction *function) |
1258 { | 1278 { |
1259 QString extra_args, extra_call_args, conversion_code; | 1279 QString extra_args, extra_call_args, conversion_code; |
1292 << "{" << endl | 1312 << "{" << endl |
1293 << conversion_code << endl | 1313 << conversion_code << endl |
1294 << INDENT << sig_name << "_handle_in_d(d_entity, args" << extra_call_args << ");" << endl | 1314 << INDENT << sig_name << "_handle_in_d(d_entity, args" << extra_call_args << ");" << endl |
1295 << "}" << endl; | 1315 << "}" << endl; |
1296 | 1316 |
1317 } | |
1318 | |
1319 void CppImplGenerator::writeQObjectLink(QTextStream &s, const AbstractMetaClass *java_class) | |
1320 { | |
1321 QString linkName = java_class->name() + "_Link"; | |
1322 QString className = java_class->name(); | |
1323 | |
1324 if (cpp_shared) | |
1325 s << "extern \"C\" typedef void (*qtd_pf_D_" << java_class->name() << "_delete)(void *d_ptr);" << endl | |
1326 << "qtd_pf_D_" << java_class->name() << "_delete qtd_D_" << java_class->name() << "_delete;" << endl << endl; | |
1327 else | |
1328 s << "extern \"C\" void qtd_D_" << java_class->name() << "_delete(void *d_ptr);" << endl << endl; | |
1329 | |
1330 s << "class " << linkName << " : public QObject, public QObjectUserData" << endl | |
1331 << "{" << endl | |
1332 << "public:" << endl | |
1333 << " Q_OBJECT_CHECK" << endl | |
1334 << " virtual int qt_metacall(QMetaObject::Call, int, void **);" << endl << endl | |
1335 | |
1336 << " " << linkName << "(QObject *parent, void *d_ptr) : QObject() { _d_ptr = d_ptr; }" << endl | |
1337 << " ~" << linkName << "() { qtd_D_" << className << "_delete(_d_ptr); }" << endl | |
1338 << " void *d_entity() const { return _d_ptr; }" << endl << endl | |
1339 | |
1340 << "private:" << endl | |
1341 << " void *_d_ptr;" << endl | |
1342 << "};" << endl << endl; | |
1343 | |
1344 // QObject_Link::qt_metacall() | |
1345 s << "int " << linkName << "::qt_metacall(QMetaObject::Call _c, int _id, void **_a)" << endl | |
1346 << "{" << endl | |
1347 << " _id = QObject::qt_metacall(_c, _id, _a);" << endl | |
1348 << " if (_id < 0 || _c != QMetaObject::InvokeMetaMethod)" << endl | |
1349 << " return _id;" << endl | |
1350 // << " Q_ASSERT(_id < 2);" << endl | |
1351 << " emit_callbacks_" << java_class->name() << "[_id](this->d_entity(), _a);" << endl | |
1352 << " return -1;" << endl | |
1353 << "}" << endl << endl; | |
1354 | |
1355 s << QString("inline %1_Link *get_%1_link(%1 *obj)").arg(className) << endl | |
1356 << "{" << endl | |
1357 << " return static_cast<" << linkName << "*>(obj->userData(USER_DATA_ID));" << endl | |
1358 << "}" << endl << endl; | |
1359 | |
1360 s << QString("extern \"C\" DLL_PUBLIC void* qtd_%1_d_pointer(%1 *obj)").arg(className) << endl | |
1361 << "{" << endl | |
1362 << " if (obj->userData(USER_DATA_ID)) {" << endl | |
1363 << " " << QString("%1_Link *qobj_helper = get_%1_link(obj);").arg(className) << endl | |
1364 << " return qobj_helper->d_entity();" << endl | |
1365 << " } else" << endl | |
1366 << " return NULL;" << endl | |
1367 << "}" << endl << endl; | |
1368 | |
1369 s << QString("extern \"C\" DLL_PUBLIC void qtd_%1_create_link(%1 *obj, void* d_obj)").arg(className) << endl | |
1370 << "{" << endl | |
1371 << " if(obj->userData(USER_DATA_ID))" << endl | |
1372 << " return;" << endl | |
1373 << " " << QString("%1 *qobj_link = new %1(obj, d_obj);").arg(linkName) << endl | |
1374 << " obj->setUserData(USER_DATA_ID, qobj_link);" << endl | |
1375 << "}" << endl << endl; | |
1297 } | 1376 } |
1298 | 1377 |
1299 void CppImplGenerator::writeSignalsHandling(QTextStream &s, const AbstractMetaClass *java_class) | 1378 void CppImplGenerator::writeSignalsHandling(QTextStream &s, const AbstractMetaClass *java_class) |
1300 { | 1379 { |
1301 s << "extern \"C\" typedef void (*EmitCallback)(void*, void**);" << endl; | 1380 s << "extern \"C\" typedef void (*EmitCallback)(void*, void**);" << endl; |
1325 s << "&" << signalExternName(java_class, signal) << "_handle"; | 1404 s << "&" << signalExternName(java_class, signal) << "_handle"; |
1326 } | 1405 } |
1327 s << endl << "};" << endl << endl; | 1406 s << endl << "};" << endl << endl; |
1328 } | 1407 } |
1329 | 1408 |
1409 writeQObjectLink(s, java_class); | |
1410 | |
1330 // Functions connecting/disconnecting shell's slots | 1411 // Functions connecting/disconnecting shell's slots |
1331 for(int i = 0; i < signal_funcs.size(); i++) { | 1412 for(int i = 0; i < signal_funcs.size(); i++) { |
1332 AbstractMetaFunction *signal = signal_funcs.at(i); | 1413 AbstractMetaFunction *signal = signal_funcs.at(i); |
1333 QString sigExternName = signalExternName(java_class, signal); | 1414 QString sigExternName = signalExternName(java_class, signal); |
1334 | 1415 |
1335 s << "extern \"C\" DLL_PUBLIC void " << sigExternName << "_connect" | 1416 s << "extern \"C\" DLL_PUBLIC void " << sigExternName << "_connect" |
1336 << "(void* native_id)" << endl << "{" << endl | 1417 << "(void* native_id)" << endl << "{" << endl |
1337 << " " << shellClassName(java_class) << " *qobj = (" << shellClassName(java_class) << "*) native_id;" << endl | 1418 << " " << shellClassName(java_class) << " *qobj = (" << shellClassName(java_class) << "*) native_id;" << endl |
1338 << " const QMetaObject &mo = " << java_class->name() << "::staticMetaObject;" << endl | 1419 << " const QMetaObject &mo = " << java_class->name() << "::staticMetaObject;" << endl |
1420 << " const QMetaObject &mo2 = " << java_class->name() << "_Link::staticMetaObject;" << endl | |
1339 << " int signalId = mo.indexOfSignal(\"" << signal->minimalSignature() << "\");" << endl | 1421 << " int signalId = mo.indexOfSignal(\"" << signal->minimalSignature() << "\");" << endl |
1340 << " mo.connect(qobj, signalId, qobj, mo.methodCount() + " << i << ");" << endl | 1422 << " mo.connect(qobj, signalId, get_" << java_class->name() << "_link(qobj), mo2.methodCount() + " << i << ");" << endl |
1341 << "}" << endl; | 1423 << "}" << endl; |
1342 | 1424 |
1343 s << "extern \"C\" DLL_PUBLIC void " << sigExternName << "_disconnect" | 1425 s << "extern \"C\" DLL_PUBLIC void " << sigExternName << "_disconnect" |
1344 << "(void* native_id)" << endl << "{" << endl | 1426 << "(void* native_id)" << endl << "{" << endl |
1345 << " " << shellClassName(java_class) << " *qobj = (" << shellClassName(java_class) << "*) native_id;" << endl | 1427 << " " << shellClassName(java_class) << " *qobj = (" << shellClassName(java_class) << "*) native_id;" << endl |
1346 << " const QMetaObject &mo = " << shellClassName(java_class) << "::staticMetaObject;" << endl | 1428 << " const QMetaObject &mo = " << shellClassName(java_class) << "::staticMetaObject;" << endl |
1429 << " const QMetaObject &mo2 = " << java_class->name() << "_Link::staticMetaObject;" << endl | |
1347 << " int signalId = mo.indexOfSignal(\"" << signal->minimalSignature() << "\");" << endl | 1430 << " int signalId = mo.indexOfSignal(\"" << signal->minimalSignature() << "\");" << endl |
1348 << " mo.disconnect(qobj, signalId, qobj, mo.methodCount() + " << i << ");" << endl | 1431 << " mo.disconnect(qobj, signalId, get_" << java_class->name() << "_link(qobj), mo2.methodCount() + " << i << ");" << endl |
1349 << "}" << endl << endl; | 1432 << "}" << endl << endl; |
1350 } | 1433 } |
1351 } | 1434 } |
1352 | 1435 |
1353 | 1436 |
1367 s << arguments.at(i)->indexedName(); | 1450 s << arguments.at(i)->indexedName(); |
1368 if (i != arguments.size() - 1) | 1451 if (i != arguments.size() - 1) |
1369 s << ", "; | 1452 s << ", "; |
1370 } | 1453 } |
1371 s << ")"; | 1454 s << ")"; |
1372 if (cls->isQObject()) | 1455 if (cls->hasVirtualFunctions()) |
1373 s << "," << endl << " QtD_QObjectEntity(this, d_ptr)"; | 1456 s << "," << endl << " Qtd_QObjectEntity(d_ptr)"; |
1374 else if (cls->hasVirtualFunctions()) | |
1375 s << "," << endl << " QtD_Entity(d_ptr)"; | |
1376 /* qtd s << " m_meta_object(0)," << endl; | 1457 /* qtd s << " m_meta_object(0)," << endl; |
1377 s << " m_vtable(0)," << endl | 1458 s << " m_vtable(0)," << endl |
1378 << " m_link(0)" << endl; | 1459 << " m_link(0)" << endl; |
1379 */ | 1460 */ |
1380 s << endl; | 1461 s << endl; |
1381 s << "{" << endl; | 1462 s << "{" << endl; |
1382 { | 1463 { |
1383 Indentation indent(INDENT); | 1464 Indentation indent(INDENT); |
1384 | |
1385 writeCodeInjections(s, java_function, cls, CodeSnip::Beginning, TypeSystem::ShellCode); | 1465 writeCodeInjections(s, java_function, cls, CodeSnip::Beginning, TypeSystem::ShellCode); |
1386 writeCodeInjections(s, java_function, cls, CodeSnip::End, TypeSystem::ShellCode); | 1466 writeCodeInjections(s, java_function, cls, CodeSnip::End, TypeSystem::ShellCode); |
1387 } | 1467 } |
1388 s << "}" << endl << endl; | 1468 s << "}" << endl << endl; |
1389 } | 1469 } |
1392 { | 1472 { |
1393 s << shellClassName(java_class) << "::~" | 1473 s << shellClassName(java_class) << "::~" |
1394 << shellClassName(java_class) << "()" << endl | 1474 << shellClassName(java_class) << "()" << endl |
1395 << "{" << endl; | 1475 << "{" << endl; |
1396 { | 1476 { |
1397 if (java_class->isQObject()) | 1477 /* qtd |
1398 s << " setUserData(userDataId, NULL);"; | 1478 Indentation indent(INDENT); |
1479 | |
1480 s << "#ifdef QT_DEBUG" << endl | |
1481 << INDENT << "if (m_vtable)" << endl | |
1482 << INDENT << " m_vtable->deref();" << endl | |
1483 << "#endif" << endl | |
1484 << INDENT << "if (m_link) {" << endl; | |
1485 | |
1486 AbstractMetaClassList interfaces = java_class->interfaces(); | |
1487 if (interfaces.size() + (java_class->baseClass() != 0 ? 1 : 0) > 1) { | |
1488 if (java_class->baseClass() != 0) | |
1489 interfaces += java_class->baseClass(); | |
1490 foreach (AbstractMetaClass *iface, interfaces) { | |
1491 AbstractMetaClass *impl = iface->isInterface() ? iface->primaryInterfaceImplementor() : iface; | |
1492 s << INDENT << " m_link->unregisterSubObject((" << impl->qualifiedCppName() << " *) this);" << endl; | |
1493 } | |
1494 } | |
1495 | |
1496 if (!java_class->isQObject()) { | |
1497 s << INDENT << " JNIEnv *__jni_env = qtjambi_current_environment();" << endl | |
1498 << INDENT << " if (__jni_env != 0) m_link->nativeShellObjectDestroyed(__jni_env);" << endl; | |
1499 } | |
1500 | |
1501 #if defined(QTJAMBI_DEBUG_TOOLS) | |
1502 s << INDENT << " qtjambi_increase_shellDestructorCalledCount(QString::fromLatin1(\"" << java_class->name() << "\"));" << endl; | |
1503 #endif | |
1504 | |
1505 s << INDENT << "}" << endl; */ | |
1399 } | 1506 } |
1400 s << "}" << endl << endl; | 1507 s << "}" << endl << endl; |
1401 } | 1508 } |
1402 | 1509 |
1403 void CppImplGenerator::writeCodeInjections(QTextStream &s, const AbstractMetaFunction *java_function, | 1510 void CppImplGenerator::writeCodeInjections(QTextStream &s, const AbstractMetaFunction *java_function, |
1709 Indentation indent(INDENT); | 1816 Indentation indent(INDENT); |
1710 writeBaseClassFunctionCall(s, java_function, implementor); | 1817 writeBaseClassFunctionCall(s, java_function, implementor); |
1711 s << "}" << endl << endl; | 1818 s << "}" << endl << endl; |
1712 } | 1819 } |
1713 | 1820 |
1714 void CppImplGenerator::writeQtdEntityFunction(QTextStream &s, const AbstractMetaClass *java_class) | |
1715 { | |
1716 s << "extern \"C\" DLL_PUBLIC void *__" << java_class->name() << "_entity(void *q_ptr)" << endl; | |
1717 s << "{" << endl; | |
1718 { | |
1719 Indentation indent(INDENT); | |
1720 s << INDENT << "QtD_Entity* a = dynamic_cast<QtD_Entity*>((" << java_class->qualifiedCppName() << "*)q_ptr);" << endl | |
1721 << INDENT << "if (a != NULL)" << endl | |
1722 << INDENT << " return a->dId;" << endl | |
1723 << INDENT << "else" << endl | |
1724 << INDENT << " return NULL;" << endl; | |
1725 } | |
1726 s << "}" << endl << endl; | |
1727 } | |
1728 | 1821 |
1729 void CppImplGenerator::writeVirtualFunctionOverride(QTextStream &s, | 1822 void CppImplGenerator::writeVirtualFunctionOverride(QTextStream &s, |
1730 const AbstractMetaFunction *java_function, | 1823 const AbstractMetaFunction *java_function, |
1731 const AbstractMetaClass *implementor) | 1824 const AbstractMetaClass *implementor) |
1732 { | 1825 { |
2061 function_prefix = "__public_"; | 2154 function_prefix = "__public_"; |
2062 } else if (!java_function->isFinalInCpp() && !java_function->isStatic() && hasShell) { | 2155 } else if (!java_function->isFinalInCpp() && !java_function->isStatic() && hasShell) { |
2063 function_prefix = "__override_"; | 2156 function_prefix = "__override_"; |
2064 extra_param.append("__do_static_call"); | 2157 extra_param.append("__do_static_call"); |
2065 s << INDENT | 2158 s << INDENT |
2066 << "bool __do_static_call = __this_nativeId ? "; | 2159 << "bool __do_static_call = __this_nativeId ? " |
2067 if (java_class->isQObject()) | 2160 << "__" << java_class->name() << "_entity(__this_nativeId) : false;" << endl; |
2068 s << "QtD_QObjectEntity::getQObjectEntity((QObject*)__this_nativeId) : false;" << endl; | |
2069 else | |
2070 s << "__" << java_class->name() << "_entity(__this_nativeId) : false;" << endl; | |
2071 } else { | 2161 } else { |
2072 option = OriginalName; | 2162 option = OriginalName; |
2073 } | 2163 } |
2074 | 2164 |
2075 // Call the Qt function on the java object | 2165 // Call the Qt function on the java object |
2122 AbstractMetaArgumentList arguments = java_function->arguments(); | 2212 AbstractMetaArgumentList arguments = java_function->arguments(); |
2123 foreach (const AbstractMetaArgument *argument, arguments) { | 2213 foreach (const AbstractMetaArgument *argument, arguments) { |
2124 AbstractMetaType *d_type = argument->type(); | 2214 AbstractMetaType *d_type = argument->type(); |
2125 const TypeEntry *te = d_type->typeEntry(); | 2215 const TypeEntry *te = d_type->typeEntry(); |
2126 if ((te && d_type->isNativePointer() && te->name() == "QString")) | 2216 if ((te && d_type->isNativePointer() && te->name() == "QString")) |
2127 s << QString(" qtd_toUtf8(__qt_%1.utf16(), __qt_%1.size(), &%1);").arg(argument->indexedName()) << endl; | 2217 s << QString(" _d_toUtf8(__qt_%1.utf16(), __qt_%1.size(), &%1);").arg(argument->indexedName()) << endl; |
2128 } | 2218 } |
2129 } | 2219 } |
2130 | 2220 |
2131 void CppImplGenerator::writeAssignment(QTextStream &s, const QString &destName, const QString &srcName, | 2221 void CppImplGenerator::writeAssignment(QTextStream &s, const QString &destName, const QString &srcName, |
2132 const AbstractMetaType *java_type) | 2222 const AbstractMetaType *java_type) |
2274 { | 2364 { |
2275 if (cls->hasConstructors()) { | 2365 if (cls->hasConstructors()) { |
2276 s << INDENT << "extern \"C\" DLL_PUBLIC void qtd_" << cls->name() << "_destructor(void *ptr)" << endl | 2366 s << INDENT << "extern \"C\" DLL_PUBLIC void qtd_" << cls->name() << "_destructor(void *ptr)" << endl |
2277 << INDENT << "{" << endl; | 2367 << INDENT << "{" << endl; |
2278 { | 2368 { |
2369 Indentation indent(INDENT); | |
2370 /* qtd | |
2371 if (!cls->isQObject() && !cls->generateShellClass()) { | |
2372 s << INDENT << "QtJambiLink *link = QtJambiLink::findLinkForUserObject(ptr);" << endl | |
2373 << INDENT << "if (link) link->resetObject(qtjambi_current_environment());" << endl; | |
2374 } | |
2375 | |
2376 // Code injectsions... | |
2377 foreach (const CodeSnip &snip, cls->typeEntry()->codeSnips()) { | |
2378 if (snip.language == TypeSystem::DestructorFunction) { | |
2379 s << snip.code(); | |
2380 } | |
2381 } | |
2382 */ | |
2279 s << INDENT << "delete (" << shellClassName(cls) << " *)ptr;" << endl; | 2383 s << INDENT << "delete (" << shellClassName(cls) << " *)ptr;" << endl; |
2384 | |
2385 #if defined(QTJAMBI_DEBUG_TOOLS) | |
2386 s << INDENT << "qtjambi_increase_destructorFunctionCalledCount(QString::fromLatin1(\"" << cls->name() << "\"));" << endl; | |
2387 #endif | |
2280 } | 2388 } |
2281 | 2389 |
2282 s << INDENT << "}" << endl << endl; | 2390 s << INDENT << "}" << endl << endl; |
2283 } | 2391 } |
2284 } | 2392 } |
2970 << " = new QVariant(" << qt_name << ");" << endl; | 3078 << " = new QVariant(" << qt_name << ");" << endl; |
2971 } else if (java_type->isTargetLangString()) { | 3079 } else if (java_type->isTargetLangString()) { |
2972 if(java_type->typeEntry()->qualifiedCppName() == "QStringRef") { | 3080 if(java_type->typeEntry()->qualifiedCppName() == "QStringRef") { |
2973 s << INDENT << "const QString *str_ref = " << qt_name << ".string();" << endl | 3081 s << INDENT << "const QString *str_ref = " << qt_name << ".string();" << endl |
2974 << INDENT << "if(str_ref)" << endl | 3082 << INDENT << "if(str_ref)" << endl |
2975 << INDENT << " qtd_toUtf8(str_ref->utf16(), str_ref->size(), " << java_name << ");" << endl | 3083 << INDENT << " _d_toUtf8(str_ref->utf16(), str_ref->size(), " << java_name << ");" << endl |
2976 << INDENT << "else {" << endl | 3084 << INDENT << "else {" << endl |
2977 << INDENT << " QString empty_str;" << endl | 3085 << INDENT << " QString empty_str;" << endl |
2978 << INDENT << " qtd_toUtf8(empty_str.utf16(), empty_str.size(), " << java_name << ");" << endl | 3086 << INDENT << " _d_toUtf8(empty_str.utf16(), empty_str.size(), " << java_name << ");" << endl |
2979 << INDENT << "}" << endl; | 3087 << INDENT << "}" << endl; |
2980 } else { | 3088 } else { |
2981 s << INDENT << QString("qtd_toUtf8(%1.utf16(), %1.size(), %2);").arg(qt_name, java_name) << endl; | 3089 s << INDENT << QString("_d_toUtf8(%1.utf16(), %1.size(), %2);").arg(qt_name, java_name) << endl; |
2982 } | 3090 } |
2983 } else if (java_type->isTargetLangChar()) { | 3091 } else if (java_type->isTargetLangChar()) { |
2984 s << INDENT << "jchar " << java_name << " = " << qt_name << ".unicode();" << endl; | 3092 s << INDENT << "jchar " << java_name << " = " << qt_name << ".unicode();" << endl; |
2985 | 3093 |
2986 } else if (java_type->isIntegerEnum() || java_type->isIntegerFlags() | 3094 } else if (java_type->isIntegerEnum() || java_type->isIntegerFlags() |