comparison generator/dgenerator.cpp @ 183:d3f4f14d43a5

fixes with QObjects
author eldar
date Fri, 03 Jul 2009 20:53:07 +0000
parents ae06da58ec25
children 7d9db724ee1d
comparison
equal deleted inserted replaced
182:973564c7e388 183:d3f4f14d43a5
1669 if (d_class->baseClassName().isEmpty()) { 1669 if (d_class->baseClassName().isEmpty()) {
1670 s << INDENT << "~this() { " << endl; 1670 s << INDENT << "~this() { " << endl;
1671 { 1671 {
1672 Indentation indent(INDENT); 1672 Indentation indent(INDENT);
1673 1673
1674 /* if(d_class->name() == "QObject")
1675 s << INDENT << "if(!__no_real_delete) {" << endl
1676 << INDENT << " __qobject_is_deleting = true;" << endl
1677 << INDENT << " scope(exit) __qobject_is_deleting = false;" << endl
1678 << INDENT << " __free_native_resources();" << endl
1679 << INDENT << "}" << endl;*/
1680
1674 if(d_class->name() == "QObject") 1681 if(d_class->name() == "QObject")
1675 s << INDENT << "if(!__gc_managed)" << endl 1682 s << INDENT << "if(!__gc_managed)" << endl
1676 << INDENT << " remove(__gc_ref_list, this);" << endl 1683 << INDENT << " remove(__gc_ref_list, this);" << endl
1677 << INDENT << "if(!__no_real_delete && __gc_managed)" << endl 1684 << INDENT << "if(!__no_real_delete && __gc_managed) {" << endl
1678 << INDENT << " __free_native_resources();" << endl; 1685 << INDENT << " __qobject_is_deleting = true;" << endl
1686 << INDENT << " scope(exit) __qobject_is_deleting = false;" << endl
1687 << INDENT << " __free_native_resources();" << endl
1688 << INDENT << "}" << endl;
1679 else 1689 else
1680 s << INDENT << "if(!__no_real_delete)" << endl 1690 s << INDENT << "if(!__no_real_delete)" << endl
1681 << INDENT << " __free_native_resources();" << endl; 1691 << INDENT << " __free_native_resources();" << endl;
1682 } 1692 }
1683 s << INDENT << "}" << endl << endl; 1693 s << INDENT << "}" << endl << endl;
2610 2620
2611 s << INDENT << "if (__qt_return_value is null)" << endl 2621 s << INDENT << "if (__qt_return_value is null)" << endl
2612 << INDENT << " return null;" << endl 2622 << INDENT << " return null;" << endl
2613 << INDENT << "void* d_obj = qtd_" << class_name << "_d_pointer(__qt_return_value);" << endl 2623 << INDENT << "void* d_obj = qtd_" << class_name << "_d_pointer(__qt_return_value);" << endl
2614 << INDENT << "if (d_obj is null) {" << endl 2624 << INDENT << "if (d_obj is null) {" << endl
2615 << INDENT << " auto new_obj = new " << type_name << "(__qt_return_value, true);" << endl 2625 << INDENT << " auto new_obj = new " << type_name << "(__qt_return_value, false);" << endl
2616 << INDENT << " qtd_" << class_name << "_create_link(new_obj.nativeId, cast(void*) new_obj);" << endl 2626 << INDENT << " qtd_" << class_name << "_create_link(new_obj.nativeId, cast(void*) new_obj);" << endl
2617 << INDENT << " new_obj.__no_real_delete = true;" << endl 2627 << INDENT << " new_obj.__no_real_delete = true;" << endl
2618 << INDENT << " return new_obj;" << endl 2628 << INDENT << " return new_obj;" << endl
2619 << INDENT << "} else" << endl 2629 << INDENT << "} else" << endl
2620 << INDENT << " return cast(" << class_name << ") d_obj;" << endl; 2630 << INDENT << " return cast(" << class_name << ") d_obj;" << endl;
2650 s << "extern(C) void* qtd_" << d_class->name() << "_d_pointer(void *obj);" << endl 2660 s << "extern(C) void* qtd_" << d_class->name() << "_d_pointer(void *obj);" << endl
2651 << "extern(C) void qtd_" << d_class->name() << "_create_link(void *obj, void* d_obj);" << endl << endl; 2661 << "extern(C) void qtd_" << d_class->name() << "_create_link(void *obj, void* d_obj);" << endl << endl;
2652 s << "private extern (C) void qtd_D_" << d_class->name() << "_delete(void *d_ptr) {" << endl 2662 s << "private extern (C) void qtd_D_" << d_class->name() << "_delete(void *d_ptr) {" << endl
2653 << " auto d_ref = cast(QObject) d_ptr;" << endl 2663 << " auto d_ref = cast(QObject) d_ptr;" << endl
2654 << " d_ref.__no_real_delete = true;" << endl 2664 << " d_ref.__no_real_delete = true;" << endl
2655 << " delete d_ref;" << endl 2665 << " if(!d_ref.__qobject_is_deleting)"
2666 << " delete d_ref;" << endl
2656 << "}" << endl << endl; 2667 << "}" << endl << endl;
2657 } 2668 }
2658 2669
2659 /* 2670 /*
2660 void DGenerator::writeMarshallFunction(QTextStream &s, const AbstractMetaClass *d_class) 2671 void DGenerator::writeMarshallFunction(QTextStream &s, const AbstractMetaClass *d_class)
2832 else if (type->isQObject()) { 2843 else if (type->isQObject()) {
2833 QString type_name = type->name(); 2844 QString type_name = type->name();
2834 const ComplexTypeEntry *ctype = static_cast<const ComplexTypeEntry *>(type->typeEntry()); 2845 const ComplexTypeEntry *ctype = static_cast<const ComplexTypeEntry *>(type->typeEntry());
2835 if(ctype->isAbstract()) 2846 if(ctype->isAbstract())
2836 type_name = type_name + "_ConcreteWrapper"; 2847 type_name = type_name + "_ConcreteWrapper";
2837 2848 /*
2849 s << INDENT << "scope " << arg_name << "_so = new StackObject!(" << type_name << ");" << endl
2850 << INDENT << "auto " << arg_name << "_d_ref = " << arg_name << "_so(" << arg_name <<", true);" << endl
2851 << INDENT << arg_name << "_d_ref.__no_real_delete = true;";
2852 */
2838 s << INDENT << "scope " << arg_name << "_d_ref = new " << type_name << "(" << arg_name <<", true);" << endl 2853 s << INDENT << "scope " << arg_name << "_d_ref = new " << type_name << "(" << arg_name <<", true);" << endl
2839 << INDENT << arg_name << "_d_ref.__no_real_delete = true;"; 2854 << INDENT << arg_name << "_d_ref.__no_real_delete = true;";
2840 } 2855 }
2841 s << endl; 2856 s << endl;
2842 } 2857 }