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()