Mercurial > projects > qtd
diff generator/dgenerator.cpp @ 183:d3f4f14d43a5
fixes with QObjects
author | eldar |
---|---|
date | Fri, 03 Jul 2009 20:53:07 +0000 |
parents | ae06da58ec25 |
children | 7d9db724ee1d |
line wrap: on
line diff
--- a/generator/dgenerator.cpp Fri Jul 03 16:07:26 2009 +0000 +++ b/generator/dgenerator.cpp Fri Jul 03 20:53:07 2009 +0000 @@ -1671,11 +1671,21 @@ { Indentation indent(INDENT); +/* if(d_class->name() == "QObject") + s << INDENT << "if(!__no_real_delete) {" << endl + << INDENT << " __qobject_is_deleting = true;" << endl + << INDENT << " scope(exit) __qobject_is_deleting = false;" << endl + << INDENT << " __free_native_resources();" << endl + << INDENT << "}" << endl;*/ + if(d_class->name() == "QObject") s << INDENT << "if(!__gc_managed)" << endl - << INDENT << " remove(__gc_ref_list, this);" << endl - << INDENT << "if(!__no_real_delete && __gc_managed)" << endl - << INDENT << " __free_native_resources();" << endl; + << INDENT << " remove(__gc_ref_list, this);" << endl + << INDENT << "if(!__no_real_delete && __gc_managed) {" << endl + << INDENT << " __qobject_is_deleting = true;" << endl + << INDENT << " scope(exit) __qobject_is_deleting = false;" << endl + << INDENT << " __free_native_resources();" << endl + << INDENT << "}" << endl; else s << INDENT << "if(!__no_real_delete)" << endl << INDENT << " __free_native_resources();" << endl; @@ -2612,7 +2622,7 @@ << INDENT << " return null;" << endl << INDENT << "void* d_obj = qtd_" << class_name << "_d_pointer(__qt_return_value);" << endl << INDENT << "if (d_obj is null) {" << endl - << INDENT << " auto new_obj = new " << type_name << "(__qt_return_value, true);" << endl + << INDENT << " auto new_obj = new " << type_name << "(__qt_return_value, false);" << endl << INDENT << " qtd_" << class_name << "_create_link(new_obj.nativeId, cast(void*) new_obj);" << endl << INDENT << " new_obj.__no_real_delete = true;" << endl << INDENT << " return new_obj;" << endl @@ -2652,7 +2662,8 @@ s << "private extern (C) void qtd_D_" << d_class->name() << "_delete(void *d_ptr) {" << endl << " auto d_ref = cast(QObject) d_ptr;" << endl << " d_ref.__no_real_delete = true;" << endl - << " delete d_ref;" << endl + << " if(!d_ref.__qobject_is_deleting)" + << " delete d_ref;" << endl << "}" << endl << endl; } @@ -2834,7 +2845,11 @@ const ComplexTypeEntry *ctype = static_cast<const ComplexTypeEntry *>(type->typeEntry()); if(ctype->isAbstract()) type_name = type_name + "_ConcreteWrapper"; - +/* + s << INDENT << "scope " << arg_name << "_so = new StackObject!(" << type_name << ");" << endl + << INDENT << "auto " << arg_name << "_d_ref = " << arg_name << "_so(" << arg_name <<", true);" << endl + << INDENT << arg_name << "_d_ref.__no_real_delete = true;"; + */ s << INDENT << "scope " << arg_name << "_d_ref = new " << type_name << "(" << arg_name <<", true);" << endl << INDENT << arg_name << "_d_ref.__no_real_delete = true;"; }