Re: [Vala] arrays of strings not properly initialized.



Fixed the array length problem and simplified the patchset.
-- 
Mathias Hasselmann <mathias hasselmann gmx de>
http://taschenorakel.de/
diff --git a/ChangeLog b/ChangeLog
index cddfd22..d4a98c8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2007-08-18  Mathias Hasselmann  <mathias hasselmann gmx de>
 
+       * gobject/valacodegenerator.vala: terminate array initializer
+       with NULL sentinal to make destructors like g_strfreev happy
+
+2007-08-18  Mathias Hasselmann  <mathias hasselmann gmx de>
+
        * vapi/Makefile.am: erm, well.. also should install enchant.vala
 
 2007-08-18  Mathias Hasselmann  <mathias hasselmann gmx de>
diff --git a/gobject/valacodegenerator.vala b/gobject/valacodegenerator.vala
index 5b5f67f..fd4a7db 100644
--- a/gobject/valacodegenerator.vala
+++ b/gobject/valacodegenerator.vala
@@ -1860,11 +1860,13 @@ public class Vala.CodeGenerator : CodeVisitor {
                bool first = true;
                CCodeExpression cexpr = null;
                foreach (Expression size in expr.get_sizes ()) {
+                       var csize = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, (CCodeExpression) 
size.ccodenode, new CCodeConstant ("1"));
+
                        if (first) {
-                               cexpr = (CCodeExpression) size.ccodenode;
+                               cexpr = csize;
                                first = false;
                        } else {
-                               cexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, cexpr, 
(CCodeExpression) size.ccodenode);
+                               cexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, cexpr, csize);
                        }
                }
                gnew.add_argument (cexpr);
-- 
1.5.2.3

diff --git a/ChangeLog b/ChangeLog
index d4a98c8..1734e2c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
 2007-08-18  Mathias Hasselmann  <mathias hasselmann gmx de>
 
        * gobject/valacodegenerator.vala: terminate array initializer
diff --git a/gobject/valacodegeneratorsourcefile.vala b/gobject/valacodegeneratorsourcefile.vala
index 579e79a..97901b5 100644
--- a/gobject/valacodegeneratorsourcefile.vala
+++ b/gobject/valacodegeneratorsourcefile.vala
@@ -29,6 +29,99 @@ public class Vala.CodeGenerator {
                return new CCodeIncludeDirective (filename, context.library == null);
        }
 
+       private void append_vala_array_free () {
+               var fun = new CCodeFunction ("_vala_array_free", "void");
+               fun.modifiers = CCodeModifiers.STATIC;
+               fun.add_parameter (new CCodeFormalParameter ("array", "gpointer"));
+               fun.add_parameter (new CCodeFormalParameter ("array_length", "gint"));
+               fun.add_parameter (new CCodeFormalParameter ("destroy_func", "GDestroyNotify"));
+               source_type_member_declaration.append (fun.copy ());
+
+               var cdofree = new CCodeBlock ();
+
+               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 ccondarr = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeIdentifier 
("array"), new CCodeConstant ("NULL"));
+               var ccondfunc = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new 
CCodeIdentifier ("destroy_func"), new CCodeConstant ("NULL"));
+               var cif = new CCodeIfStatement (new CCodeBinaryExpression (CCodeBinaryOperator.AND, ccondarr, 
ccondfunc), cdofree);
+               fun.block = new CCodeBlock ();
+               fun.block.add_statement (cif);
+
+               var carrfree = new CCodeFunctionCall (new CCodeIdentifier ("g_free"));
+               carrfree.add_argument (new CCodeIdentifier ("array"));
+               fun.block.add_statement (new CCodeExpressionStatement (carrfree));
+
+               source_type_member_definition.append (fun);
+       }
+
+       private void append_vala_array_move () {
+               string_h_needed = true;
+
+               // assumes that overwritten array elements are null before invocation
+               // FIXME will leak memory if that's not the case
+               var fun = new CCodeFunction ("_vala_array_move", "void");
+               fun.modifiers = CCodeModifiers.STATIC;
+               fun.add_parameter (new CCodeFormalParameter ("array", "gpointer"));
+               fun.add_parameter (new CCodeFormalParameter ("element_size", "gsize"));
+               fun.add_parameter (new CCodeFormalParameter ("src", "gint"));
+               fun.add_parameter (new CCodeFormalParameter ("dest", "gint"));
+               fun.add_parameter (new CCodeFormalParameter ("length", "gint"));
+               source_type_member_declaration.append (fun.copy ());
+
+               var array = new CCodeIdentifier ("array");
+               var element_size = new CCodeIdentifier ("element_size");
+               var length = new CCodeIdentifier ("length");
+               var src = new CCodeIdentifier ("src");
+               var dest = new CCodeIdentifier ("dest");
+               var src_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new 
CCodeBinaryExpression (CCodeBinaryOperator.MUL, src, element_size));
+               var dest_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new 
CCodeBinaryExpression (CCodeBinaryOperator.MUL, dest, element_size));
+               var dest_end_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new 
CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeParenthesizedExpression (new CCodeBinaryExpression 
(CCodeBinaryOperator.PLUS, dest, length)), element_size));
+
+               fun.block = new CCodeBlock ();
+
+               var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_memmove"));
+               ccall.add_argument (dest_address);
+               ccall.add_argument (src_address);
+               ccall.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, length, 
element_size));
+               fun.block.add_statement (new CCodeExpressionStatement (ccall));
+
+               var czero1 = new CCodeFunctionCall (new CCodeIdentifier ("memset"));
+               czero1.add_argument (src_address);
+               czero1.add_argument (new CCodeConstant ("0"));
+               czero1.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new 
CCodeParenthesizedExpression (new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, dest, src)), 
element_size));
+               var czeroblock1 = new CCodeBlock ();
+               czeroblock1.add_statement (new CCodeExpressionStatement (czero1));
+
+               var czero2 = new CCodeFunctionCall (new CCodeIdentifier ("memset"));
+               czero2.add_argument (dest_end_address);
+               czero2.add_argument (new CCodeConstant ("0"));
+               czero2.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new 
CCodeParenthesizedExpression (new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, src, dest)), 
element_size));
+               var czeroblock2 = new CCodeBlock ();
+               czeroblock2.add_statement (new CCodeExpressionStatement (czero2));
+
+               fun.block.add_statement (new CCodeIfStatement (new CCodeBinaryExpression 
(CCodeBinaryOperator.LESS_THAN, src, dest), czeroblock1, czeroblock2));
+
+               source_type_member_definition.append (fun);
+       }
+
        public override void visit_source_file (SourceFile! source_file) {
                header_begin = new CCodeFragment ();
                header_type_declaration = new CCodeFragment ();
@@ -111,95 +204,10 @@ public class Vala.CodeGenerator {
                        source_begin.append (new CCodeMacroReplacement ("VALA_FREE_CHECKED(o,f)", "((o) == 
NULL ? NULL : ((o) = (f (o), NULL)))"));
                }
                if (requires_array_free) {
-                       var fun = new CCodeFunction ("_vala_array_free", "void");
-                       fun.modifiers = CCodeModifiers.STATIC;
-                       fun.add_parameter (new CCodeFormalParameter ("array", "gpointer"));
-                       fun.add_parameter (new CCodeFormalParameter ("array_length", "gint"));
-                       fun.add_parameter (new CCodeFormalParameter ("destroy_func", "GDestroyNotify"));
-                       source_type_member_declaration.append (fun.copy ());
-
-                       var cdofree = new CCodeBlock ();
-
-                       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 ccondarr = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new 
CCodeIdentifier ("array"), new CCodeConstant ("NULL"));
-                       var ccondfunc = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new 
CCodeIdentifier ("destroy_func"), new CCodeConstant ("NULL"));
-                       var cif = new CCodeIfStatement (new CCodeBinaryExpression (CCodeBinaryOperator.AND, 
ccondarr, ccondfunc), cdofree);
-                       fun.block = new CCodeBlock ();
-                       fun.block.add_statement (cif);
-
-                       var carrfree = new CCodeFunctionCall (new CCodeIdentifier ("g_free"));
-                       carrfree.add_argument (new CCodeIdentifier ("array"));
-                       fun.block.add_statement (new CCodeExpressionStatement (carrfree));
-
-                       source_type_member_definition.append (fun);
+                       append_vala_array_free ();
                }
                if (requires_array_move) {
-                       string_h_needed = true;
-
-                       // assumes that overwritten array elements are null before invocation
-                       // FIXME will leak memory if that's not the case
-                       var fun = new CCodeFunction ("_vala_array_move", "void");
-                       fun.modifiers = CCodeModifiers.STATIC;
-                       fun.add_parameter (new CCodeFormalParameter ("array", "gpointer"));
-                       fun.add_parameter (new CCodeFormalParameter ("element_size", "gsize"));
-                       fun.add_parameter (new CCodeFormalParameter ("src", "gint"));
-                       fun.add_parameter (new CCodeFormalParameter ("dest", "gint"));
-                       fun.add_parameter (new CCodeFormalParameter ("length", "gint"));
-                       source_type_member_declaration.append (fun.copy ());
-
-                       var array = new CCodeIdentifier ("array");
-                       var element_size = new CCodeIdentifier ("element_size");
-                       var length = new CCodeIdentifier ("length");
-                       var src = new CCodeIdentifier ("src");
-                       var dest = new CCodeIdentifier ("dest");
-                       var src_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new 
CCodeBinaryExpression (CCodeBinaryOperator.MUL, src, element_size));
-                       var dest_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new 
CCodeBinaryExpression (CCodeBinaryOperator.MUL, dest, element_size));
-                       var dest_end_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, 
new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeParenthesizedExpression (new 
CCodeBinaryExpression (CCodeBinaryOperator.PLUS, dest, length)), element_size));
-
-                       fun.block = new CCodeBlock ();
-
-                       var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_memmove"));
-                       ccall.add_argument (dest_address);
-                       ccall.add_argument (src_address);
-                       ccall.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, length, 
element_size));
-                       fun.block.add_statement (new CCodeExpressionStatement (ccall));
-
-                       var czero1 = new CCodeFunctionCall (new CCodeIdentifier ("memset"));
-                       czero1.add_argument (src_address);
-                       czero1.add_argument (new CCodeConstant ("0"));
-                       czero1.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new 
CCodeParenthesizedExpression (new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, dest, src)), 
element_size));
-                       var czeroblock1 = new CCodeBlock ();
-                       czeroblock1.add_statement (new CCodeExpressionStatement (czero1));
-
-                       var czero2 = new CCodeFunctionCall (new CCodeIdentifier ("memset"));
-                       czero2.add_argument (dest_end_address);
-                       czero2.add_argument (new CCodeConstant ("0"));
-                       czero2.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new 
CCodeParenthesizedExpression (new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, src, dest)), 
element_size));
-                       var czeroblock2 = new CCodeBlock ();
-                       czeroblock2.add_statement (new CCodeExpressionStatement (czero2));
-
-                       fun.block.add_statement (new CCodeIfStatement (new CCodeBinaryExpression 
(CCodeBinaryOperator.LESS_THAN, src, dest), czeroblock1, czeroblock2));
-
-                       source_type_member_definition.append (fun);
+                       append_vala_array_move ();
                }
                
                if (string_h_needed) {
-- 
1.5.2.3

diff --git a/ChangeLog b/ChangeLog
index 1734e2c..7993697 100644
--- 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.
diff --git a/gobject/valacodegenerator.vala b/gobject/valacodegenerator.vala
index fd4a7db..089d5e4 100644
--- a/gobject/valacodegenerator.vala
+++ b/gobject/valacodegenerator.vala
@@ -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;
diff --git a/gobject/valacodegeneratorsourcefile.vala b/gobject/valacodegeneratorsourcefile.vala
index 97901b5..afeeff4 100644
--- a/gobject/valacodegeneratorsourcefile.vala
+++ b/gobject/valacodegeneratorsourcefile.vala
@@ -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"));
diff --git a/tests/test-022.out b/tests/test-022.out
index 48a7780..faa113f 100644
--- a/tests/test-022.out
+++ b/tests/test-022.out
@@ -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
diff --git a/tests/test-022.vala b/tests/test-022.vala
index 805d9bd..9b2f4f8 100644
--- a/tests/test-022.vala
+++ b/tests/test-022.vala
@@ -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 ();
        }
 }
-- 
1.5.2.3

Attachment: signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]