also use _vala_array_free to release string arrays as g_strfreev cannot
authorMathias Hasselmann <mathias.hasselmann@gmx.de>
Sun, 19 Aug 2007 22:03:31 +0000 (22:03 +0000)
committerMathias Hasselmann <hasselmm@src.gnome.org>
Sun, 19 Aug 2007 22:03:31 +0000 (22:03 +0000)
2007-08-19  Mathias Hasselmann  <mathias.hasselmann@gmx.de>

* gobject/valacodegenerator.vala: also use _vala_array_free to
release string arrays as g_strfreev cannot handle Vala's sized
arrays, which have a _length variable, but no NULL sentinel.
* gobject/valacodegeneratorsourcefile.vala: enhance _vala_array_free
to handle unsized (NULL sentinel terminated) arrays.
* tests/test-022.*: test behaviour of _vala_array_free. currently
fails because Vala forgets to release old element members when
assigning a new value.

svn path=/trunk/; revision=483

ChangeLog
gobject/valacodegenerator.vala
gobject/valacodegeneratorsourcefile.vala
tests/test-022.out
tests/test-022.vala

index 1734e2c..7993697 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2007-08-19  Mathias Hasselmann  <mathias.hasselmann@gmx.de>
 
+       * gobject/valacodegenerator.vala: also use _vala_array_free to
+       release string arrays as g_strfreev cannot handle Vala's sized
+       arrays, which have a _length variable, but no NULL sentinel.
+       * gobject/valacodegeneratorsourcefile.vala: enhance _vala_array_free
+       to handle unsized (NULL sentinel terminated) arrays.
+       * tests/test-022.*: test behaviour of _vala_array_free. currently
+       fails because Vala forgets to release old element members when 
+       assigning a new value.
+
+2007-08-19  Mathias Hasselmann  <mathias.hasselmann@gmx.de>
+
        * gobject/valacodegeneratorsourcefile.vala: move code generation
        for _vala_array_free and _vala_array_move into separate methods
        for readability.
index fd4a7db..300a840 100644 (file)
@@ -990,9 +990,7 @@ public class Vala.CodeGenerator : CodeVisitor {
                        ccall.add_argument (new CCodeConstant ("TRUE"));
                } else if (type.data_type is Array) {
                        var arr = (Array) type.data_type;
-                       if (arr.element_type == string_type.data_type) {
-                               ccall.call = new CCodeIdentifier ("g_strfreev");
-                       } else if (arr.element_type == null || arr.element_type.is_reference_type ()) {
+                       if (arr.element_type == null || arr.element_type.is_reference_type ()) {
                                requires_array_free = true;
 
                                bool first = true;
@@ -1392,6 +1390,10 @@ public class Vala.CodeGenerator : CodeVisitor {
                                        ma.ccodenode = element_expr;
                                        element_expr = get_ref_expression (ma);
 
+                                       var clendecl = new CCodeDeclaration ("int");
+                                       clendecl.add_declarator (CCodeVariableDeclarator.with_initializer (get_array_length_cname (collection_backup.name, 1), array_len));
+                                       cblock.add_statement (clendecl);
+
                                        var cfrag = new CCodeFragment ();
                                        append_temp_decl (cfrag, temp_vars);
                                        cbody.add_statement (cfrag);
index 97901b5..afeeff4 100644 (file)
@@ -29,6 +29,32 @@ public class Vala.CodeGenerator {
                return new CCodeIncludeDirective (filename, context.library == null);
        }
 
+       private CCodeForStatement get_vala_array_free_loop (bool have_length) {
+               var cbody = new CCodeBlock ();
+               var cptrarray = new CCodeCastExpression (new CCodeIdentifier ("array"), "gpointer*");
+               var cea = new CCodeElementAccess (cptrarray, new CCodeIdentifier ("i"));
+
+               var cfreecall = new CCodeFunctionCall (new CCodeIdentifier ("destroy_func"));
+               cfreecall.add_argument (cea);
+
+               CCodeExpression cforcond;
+
+               if (have_length) {
+                       var cfreecond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, cea, new CCodeConstant ("NULL"));
+                       cforcond = new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, new CCodeIdentifier ("i"), new CCodeIdentifier ("array_length"));
+                       cbody.add_statement (new CCodeIfStatement (cfreecond, new CCodeExpressionStatement (cfreecall)));
+               } else {
+                       cforcond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, cea, new CCodeConstant ("NULL"));
+                       cbody.add_statement (new CCodeExpressionStatement (cfreecall));
+               }
+
+               var cfor = new CCodeForStatement (cforcond, cbody);
+               cfor.add_initializer (new CCodeAssignment (new CCodeIdentifier ("i"), new CCodeConstant ("0")));
+               cfor.add_iterator (new CCodeAssignment (new CCodeIdentifier ("i"), new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeIdentifier ("i"), new CCodeConstant ("1"))));
+
+               return cfor;
+       }
+
        private void append_vala_array_free () {
                var fun = new CCodeFunction ("_vala_array_free", "void");
                fun.modifiers = CCodeModifiers.STATIC;
@@ -42,22 +68,10 @@ public class Vala.CodeGenerator {
                var citdecl = new CCodeDeclaration ("int");
                citdecl.add_declarator (new CCodeVariableDeclarator ("i"));
                cdofree.add_statement (citdecl);
-               
-               var cbody = new CCodeBlock ();
-               
-               var cptrarray = new CCodeCastExpression (new CCodeIdentifier ("array"), "gpointer*");
-               var cea = new CCodeElementAccess (cptrarray, new CCodeIdentifier ("i"));
-               var cfreecond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, cea, new CCodeConstant ("NULL"));
-               var cfreecall = new CCodeFunctionCall (new CCodeIdentifier ("destroy_func"));
-               cfreecall.add_argument (cea);
-               cbody.add_statement (new CCodeIfStatement (cfreecond, new CCodeExpressionStatement (cfreecall)));
 
-               var cforcond = new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, new CCodeIdentifier ("i"), new CCodeIdentifier ("array_length"));
-               
-               var cfor = new CCodeForStatement (cforcond, cbody);
-               cfor.add_initializer (new CCodeAssignment (new CCodeIdentifier ("i"), new CCodeConstant ("0")));
-               cfor.add_iterator (new CCodeAssignment (new CCodeIdentifier ("i"), new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeIdentifier ("i"), new CCodeConstant ("1"))));
-               cdofree.add_statement (cfor);
+               var clencheck = new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN_OR_EQUAL, new CCodeIdentifier ("array_length"), new CCodeConstant ("0"));
+               var ciflen = new CCodeIfStatement (clencheck, get_vala_array_free_loop (true), get_vala_array_free_loop (false));
+               cdofree.add_statement (ciflen);
 
                var ccondarr = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeIdentifier ("array"), new CCodeConstant ("NULL"));
                var ccondfunc = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeIdentifier ("destroy_func"), new CCodeConstant ("NULL"));
index 48a7780..faa113f 100644 (file)
@@ -1 +1,3 @@
 One dimensional array creation and assignment: 1 2 3 4 5 6 7 8 9 10 11
+String array creation and assignment: 1 2 3 4 5 6 7 8 9 10 11
+Object array creation and assignment: 1 2 3 4 5 6 7 8 9 10 11 c b a b a c a b c
index 805d9bd..9b2f4f8 100644 (file)
@@ -1,9 +1,18 @@
 using GLib;
 
 class Maman.Foo {
-       static int main (string[] args) {
+       public Foo (construct string bar) {
+       }
+
+       public ~Foo () {
+               stdout.printf (" %s", _bar);
+       }
+
+       public string bar { get; set construct; }
+
+       static void test_integer_array () {
                stdout.printf ("One dimensional array creation and assignment: 1");
-               
+
                int[] a = new int[4] {1,2};
                
                stdout.printf (" 2");
@@ -35,7 +44,93 @@ class Maman.Foo {
                stdout.printf (" %d", a.length);
        
                stdout.printf (" 11\n");
+       }
+
+       [NoArrayLength ()]
+       static string[] create_unsized_string_array () {
+               return new string[] { "a", "b", "c" };
+       }
+
+       static void test_string_array () {
+               stdout.printf ("String array creation and assignment: 1");
+               
+               var a = new string[3] { "a", "b", "c" };
+               var b = new string[] { "a", "b", "c" };
+               var c = create_unsized_string_array ();
+
+               if (3 == a.length) {
+                       stdout.printf (" 2");
+               }
+               if (3 == b.length) {
+                       stdout.printf (" 3");
+               }
+               if (-1 == c.length) {
+                       stdout.printf (" 4");
+               }
+               if (null == c[3]) {
+                       stdout.printf (" 5");
+               }
+
+               for (int i = 0; i < a.length; ++i) {
+                       if (a[i] == b[i]) {
+                               stdout.printf (" %d", i * 2 + 6);
+                       }
+                       if (a[i] == c[i]) {
+                               stdout.printf (" %d", i * 2 + 7);
+                       }
+               }
+
+               a[2] = null;
+               b[1] = null;
+
+               stdout.printf ("\n");
+       }
+
+       [NoArrayLength ()]
+       static Foo[] create_unsized_object_array () {
+               return new Foo[] { new Foo ("a"), new Foo ("b"), new Foo ("c") };
+       }
+
+       static void test_object_array () {
+               stdout.printf ("Object array creation and assignment: 1");
+
+               do {    
+                       var a = new Foo[3] { new Foo ("a"), new Foo ("b"), new Foo ("c") };
+                       var b = new Foo[] { new Foo ("a"), new Foo ("b"), new Foo ("c") };
+                       var c = create_unsized_object_array ();
+
+                       if (3 == a.length) {
+                               stdout.printf (" 2");
+                       }
+                       if (3 == b.length) {
+                               stdout.printf (" 3");
+                       }
+                       if (-1 == c.length) {
+                               stdout.printf (" 4");
+                       }
+                       if (null == c[3]) {
+                               stdout.printf (" 5");
+                       }
+
+                       for (int i = 0; i < a.length; ++i) {
+                               if (a[i].bar == b[i].bar) {
+                                       stdout.printf (" %d", i * 2 + 6);
+                               }
+                               if (a[i].bar == c[i].bar) {
+                                       stdout.printf (" %d", i * 2 + 7);
+                               }
+                       }
+
+                       a[2] = null;
+                       b[1] = null;
+               } while (false);
+
+               stdout.printf ("\n");
+       }
 
-               return 0;
+       static void main (string[] args) {
+               test_integer_array ();
+               test_string_array ();
+               test_object_array ();
        }
 }