]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix leaks in non-GObject classes, based on patch by Andrea Del Signore,
authorJürg Billeter <j@bitron.ch>
Fri, 17 Oct 2008 12:54:46 +0000 (12:54 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Fri, 17 Oct 2008 12:54:46 +0000 (12:54 +0000)
2008-10-17  Jürg Billeter  <j@bitron.ch>

* gobject/valaccodeclassbinding.vala:
* gobject/valaccodegenerator.vala:
* vapi/glib-2.0.vapi:

Fix leaks in non-GObject classes,
based on patch by Andrea Del Signore, fixes bug 554844

svn path=/trunk/; revision=1850

ChangeLog
gobject/valaccodeclassbinding.vala
gobject/valaccodegenerator.vala
vapi/glib-2.0.vapi

index e0fb68d08ab2f500d91579723b3783c0626c0117..11843982698ac1a10be166a461da45ffa09ebe80 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-10-17  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valaccodeclassbinding.vala:
+       * gobject/valaccodegenerator.vala:
+       * vapi/glib-2.0.vapi:
+
+       Fix leaks in non-GObject classes,
+       based on patch by Andrea Del Signore, fixes bug 554844
+
 2008-10-17  Jürg Billeter  <j@bitron.ch>
 
        * vala/valabinaryexpression.vala:
index 3ed8ec26412778581054feda052d59da374d0ba1..585f4ece3b37197441a19175a112e091886b4de3 100644 (file)
@@ -196,10 +196,8 @@ public class Vala.CCodeClassBinding : CCodeObjectTypeSymbolBinding {
                        
                        add_instance_init_function (cl);
 
-                       if (is_gobject) {
-                               if (cl.get_fields ().size > 0 || cl.destructor != null) {
-                                       add_finalize_function (cl);
-                               }
+                       if (!cl.is_compact && (cl.get_fields ().size > 0 || cl.destructor != null || cl.is_fundamental ())) {
+                               add_finalize_function (cl);
                        }
 
                        var type_fun = new ClassRegisterFunction (cl, codegen);
@@ -256,6 +254,15 @@ public class Vala.CCodeClassBinding : CCodeObjectTypeSymbolBinding {
                                var destroy_block = new CCodeBlock ();
                                var get_class = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS".printf (cl.get_upper_case_cname (null))));
                                get_class.add_argument (new CCodeIdentifier ("self"));
+
+                               // finalize class
+                               var ccast = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS".printf (cl.get_upper_case_cname (null))));
+                               ccast.add_argument (new CCodeIdentifier ("self"));
+                               ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (ccast, "finalize"));
+                               ccall.add_argument (new CCodeIdentifier ("self"));
+                               destroy_block.add_statement (new CCodeExpressionStatement (ccall));
+
+                               // free type instance
                                var free = new CCodeFunctionCall (new CCodeIdentifier ("g_type_free_instance"));
                                free.add_argument (new CCodeCastExpression (new CCodeIdentifier ("self"), "GTypeInstance *"));
                                destroy_block.add_statement (new CCodeExpressionStatement (free));
@@ -683,6 +690,20 @@ public class Vala.CCodeClassBinding : CCodeObjectTypeSymbolBinding {
                var parent_assignment = new CCodeAssignment (new CCodeIdentifier ("%s_parent_class".printf (cl.get_lower_case_cname (null))), ccall);
                init_block.add_statement (new CCodeExpressionStatement (parent_assignment));
                
+
+               if (!cl.is_compact && !cl.is_static && !cl.is_subtype_of (codegen.gobject_type) && (cl.get_fields ().size > 0 || cl.destructor != null || cl.is_fundamental ())) {
+                       // set finalize function
+                       var fundamental_class = cl;
+                       while (fundamental_class.base_class != null) {
+                               fundamental_class = fundamental_class.base_class;
+                       }
+
+                       ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_CLASS".printf (fundamental_class.get_upper_case_cname (null))));
+                       ccall.add_argument (new CCodeIdentifier ("klass"));
+                       var finalize_assignment = new CCodeAssignment (new CCodeMemberAccess.pointer (ccall, "finalize"), new CCodeIdentifier (cl.get_lower_case_cprefix () + "finalize"));
+                       init_block.add_statement (new CCodeExpressionStatement (finalize_assignment));
+               }
+
                /* add struct for private fields */
                if (cl.has_private_fields || cl.get_type_parameters ().size > 0) {
                        ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_type_class_add_private"));
@@ -1039,9 +1060,14 @@ public class Vala.CCodeClassBinding : CCodeObjectTypeSymbolBinding {
        private void add_finalize_function (Class cl) {
                var function = new CCodeFunction ("%s_finalize".printf (cl.get_lower_case_cname (null)), "void");
                function.modifiers = CCodeModifiers.STATIC;
-               
-               function.add_parameter (new CCodeFormalParameter ("obj", "GObject *"));
-               
+
+               var fundamental_class = cl;
+               while (fundamental_class.base_class != null) {
+                       fundamental_class = fundamental_class.base_class;
+               }
+
+               function.add_parameter (new CCodeFormalParameter ("obj", fundamental_class.get_cname () + "*"));
+
                codegen.source_type_member_declaration.append (function.copy ());
 
 
@@ -1061,11 +1087,13 @@ public class Vala.CCodeClassBinding : CCodeObjectTypeSymbolBinding {
                cblock.add_statement (codegen.instance_finalize_fragment);
 
                // chain up to finalize function of the base class
-               var ccast = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_CLASS"));
-               ccast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (cl.get_lower_case_cname (null))));
-               ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (ccast, "finalize"));
-               ccall.add_argument (new CCodeIdentifier ("obj"));
-               cblock.add_statement (new CCodeExpressionStatement (ccall));
+               if (cl.base_class != null) {
+                       var ccast = new CCodeFunctionCall (new CCodeIdentifier ("%s_CLASS".printf (fundamental_class.get_upper_case_cname ())));
+                       ccast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (cl.get_lower_case_cname (null))));
+                       ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (ccast, "finalize"));
+                       ccall.add_argument (new CCodeIdentifier ("obj"));
+                       cblock.add_statement (new CCodeExpressionStatement (ccall));
+               }
 
 
                function.block = cblock;
index f5bb38bb7bee1923a3112dd4e7629309d87e7aa4..792d5f0114b7d7af9e1fb283f3f4ae74020e6952 100644 (file)
@@ -1646,7 +1646,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
 
                var cisnull = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, cvar, new CCodeConstant ("NULL"));
                if (type.type_parameter != null) {
-                       if (!(current_type_symbol is Class) || !current_class.is_subtype_of (gobject_type)) {
+                       if (!(current_type_symbol is Class) || current_class.is_compact) {
                                return new CCodeConstant ("NULL");
                        }
 
index f1a91cc50573bbfa39091253af5c17330d5469ea..5e2270f19abb889b8cfa8bdd0911bf51bc01e3d1 100644 (file)
@@ -850,11 +850,6 @@ namespace GLib {
                public uint instance_size;
        }
 
-       // deprecated
-       [CCode (has_type_id = true)]
-       public class TypeInstance {
-       }
-
        [Compact]
        [CCode (ref_function = "g_type_class_ref", unref_function = "g_type_class_unref")]
        public class TypeClass {
@@ -949,7 +944,7 @@ namespace GLib {
        public static delegate void WeakNotify (void *data, Object object);
 
        [CCode (ref_function = "g_object_ref", unref_function = "g_object_unref", marshaller_type_name = "OBJECT", get_value_function = "g_value_get_object", set_value_function = "g_value_set_object", param_spec_function = "g_param_spec_object", cheader_filename = "glib-object.h")]
-       public class Object : TypeInstance {
+       public class Object {
                public uint ref_count;
 
                public static Object @new (Type type, ...);