Generate *_instance_init function for compact classes to initialize
authorJared Moore <jaredm@svn.gnome.org>
Tue, 22 Jul 2008 01:10:17 +0000 (01:10 +0000)
committerJared William Moore <jaredm@src.gnome.org>
Tue, 22 Jul 2008 01:10:17 +0000 (01:10 +0000)
2008-07-22  Jared Moore  <jaredm@svn.gnome.org>

* gobject/valaccodeclassbinding.vala:
* goblect/valaccodemethodbinding.vala:

Generate *_instance_init function for compact classes to initialize
fields, fixes bug 529679.

* tests/classes-fields.vala: add test case

svn path=/trunk/; revision=1716

ChangeLog
gobject/valaccodeclassbinding.vala
gobject/valaccodemethodbinding.vala
tests/classes-fields.exp
tests/classes-fields.vala

index 6b5f139..92a5612 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008-07-22  Jared Moore  <jaredm@svn.gnome.org>
+
+       * gobject/valaccodeclassbinding.vala:
+       * goblect/valaccodemethodbinding.vala:
+
+       Generate *_instance_init function for compact classes to initialize
+       fields, fixes bug 529679.
+
+       * tests/classes-fields.vala: add test case
+
 2008-07-21  Jared Moore  <jaredm@svn.gnome.org>
 
        * vapi/packages/gtk+-2.0/gtk+-2.0.metadata:
index 04284c5..472fb75 100644 (file)
@@ -252,6 +252,8 @@ public class Vala.CCodeClassBinding : CCodeObjectTypeSymbolBinding {
                                codegen.source_type_member_definition.append (unref_fun);
                        }
                } else if (!cl.is_static) {
+                       add_instance_init_function (cl);
+
                        var function = new CCodeFunction (cl.get_lower_case_cprefix () + "free", "void");
                        if (cl.access == SymbolAccessibility.PRIVATE) {
                                function.modifiers = CCodeModifiers.STATIC;
@@ -560,10 +562,16 @@ public class Vala.CCodeClassBinding : CCodeObjectTypeSymbolBinding {
                instance_init.add_parameter (new CCodeFormalParameter ("self", "%s *".printf (cl.get_cname ())));
                instance_init.modifiers = CCodeModifiers.STATIC;
                
+               if (cl.is_compact) {
+                       // Add declaration, since the instance_init function is explicitly called
+                       // by the creation methods
+                       codegen.source_type_member_declaration.append (instance_init.copy ());
+               }
+
                var init_block = new CCodeBlock ();
                instance_init.block = init_block;
                
-               if (cl.has_private_fields || cl.get_type_parameters ().size > 0) {
+               if (!cl.is_compact && (cl.has_private_fields || cl.get_type_parameters ().size > 0)) {
                        var ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_PRIVATE".printf (cl.get_upper_case_cname (null))));
                        ccall.add_argument (new CCodeIdentifier ("self"));
                        init_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), ccall)));
index 05586f8..31b8382 100644 (file)
@@ -367,6 +367,10 @@ public class Vala.CCodeMethodBinding : CCodeBinding {
                                                ccall.add_argument (new CCodeIdentifier (cl.get_cname ()));
                                                cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("self", ccall));
                                                cinit.append (cdecl);
+
+                                               var cinitcall = new CCodeFunctionCall (new CCodeIdentifier ("%s_instance_init".printf (cl.get_lower_case_cname (null))));
+                                               cinitcall.add_argument (new CCodeIdentifier ("self"));
+                                               cinit.append (new CCodeExpressionStatement (cinitcall));
                                        } else {
                                                var st = (Struct) m.parent_symbol;
 
index e76fe4f..2be916e 100644 (file)
@@ -1 +1 @@
-Field Test: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
+Field Test: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
index 02e283e..0d091c7 100644 (file)
@@ -1,5 +1,10 @@
 using GLib;
 
+[Compact]
+class CompactTest {
+       public int initialized_field = 24;
+}
+
 class Maman.Foo : Object {
        public int public_base_field = 2;
        public class int public_class_field = 23;
@@ -55,8 +60,12 @@ class Maman.Bar : Foo {
 
                var foo = new Foo ();
                stdout.printf (" %d", foo.public_class_field);
-               stdout.printf (" 24\n");
                
+               var compact = new CompactTest ();
+               stdout.printf (" %d", compact.initialized_field);
+
+               stdout.printf (" 25\n");
+
                return 0;
        }
 }