]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Write array length of formal parameters with fixed length
authorRico Tzschichholz <ricotz@ubuntu.com>
Wed, 26 Jan 2022 18:34:06 +0000 (19:34 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Wed, 26 Jan 2022 19:02:48 +0000 (20:02 +0100)
"void foo (gint i[3]) { ... }" instead of "void foo (gint* i) { ... }"

ccode/valaccodeparameter.vala
codegen/valaccodearraymodule.vala
tests/arrays/fixed-length-enum-value.c-expected
tests/asynchronous/captured-fixed-array.c-expected
tests/basic-types/arrays.c-expected
tests/basic-types/arrays.vala
tests/methods/parameter-fixed-array-initializer.c-expected
tests/parser/array-length.c-expected
tests/posix/arrays.c-expected

index b4bc749635dae3b4cee81fc522477b5fd0bd5dc3..8e90695a7b23cea4db4fddc015a8d77bcb741c7f 100644 (file)
@@ -42,6 +42,8 @@ public class Vala.CCodeParameter : CCodeNode {
         */
        public bool ellipsis { get; set; }
 
+       CCodeDeclarator? declarator;
+
        public CCodeParameter (string n, string type) {
                name = n;
                type_name = type;
@@ -51,11 +53,21 @@ public class Vala.CCodeParameter : CCodeNode {
                ellipsis = true;
        }
 
+       public CCodeParameter.with_declarator (string type, CCodeDeclarator decl) {
+               name = decl.name;
+               type_name = type;
+               declarator = decl;
+       }
+
        public override void write (CCodeWriter writer) {
                if (!ellipsis) {
                        writer.write_string (type_name);
                        writer.write_string (" ");
-                       writer.write_string (name);
+                       if (declarator != null) {
+                               declarator.write (writer);
+                       } else {
+                               writer.write_string (name);
+                       }
                } else {
                        writer.write_string ("...");
                }
index 2b3021a5f6b0505a9c4382a41c7df57d7b6e5cd4..9a84ef8481c77c06e63154ea0be31999960b4f65 100644 (file)
@@ -861,16 +861,12 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                if (ctypename == null) {
                        ctypename = get_ccode_name (param.variable_type);
 
-                       if (array_type.fixed_length) {
-                               ctypename += "*";
-                       }
-
                        if (param.direction != ParameterDirection.IN) {
                                ctypename += "*";
                        }
                }
 
-               var main_cparam = new CCodeParameter (get_ccode_name (param), ctypename);
+               var main_cparam = new CCodeParameter.with_declarator (ctypename, new CCodeVariableDeclarator (get_ccode_name (param), null, get_ccode_declarator_suffix (array_type)));
 
                generate_type_declaration (array_type.element_type, decl_space);
 
index 0ea904fc37afa56cedb2149d1ccf5a30496aa66c..372dcf4ae3ce19beedd9fc6c54f7a9172c5f2a13 100644 (file)
@@ -36,7 +36,7 @@ VALA_EXTERN GType foo_get_type (void) G_GNUC_CONST ;
 VALA_EXTERN GType bar_get_type (void) G_GNUC_CONST ;
 VALA_EXTERN Bar* bar_dup (const Bar* self);
 VALA_EXTERN void bar_free (Bar* self);
-VALA_EXTERN void foo (guint* array);
+VALA_EXTERN void foo (guint array[FOO_BAR]);
 static void _vala_main (void);
 
 static GType
@@ -96,7 +96,7 @@ bar_get_type (void)
 }
 
 void
-foo (guint* array)
+foo (guint array[FOO_BAR])
 {
        _vala_assert (FOO_BAR == 23, "array.length == 23");
 }
index 8f153f06423474109c99efa7822aa21e1906e6c2..9d6faa29903a43f397155925ad2474e344ec3491 100644 (file)
@@ -34,7 +34,7 @@ struct _FooData {
 };
 
 static void foo_data_free (gpointer _data);
-VALA_EXTERN void foo (gint* array_param,
+VALA_EXTERN void foo (gint array_param[3],
           GAsyncReadyCallback _callback_,
           gpointer _user_data_);
 VALA_EXTERN void foo_finish (GAsyncResult* _res_);
@@ -50,7 +50,7 @@ foo_data_free (gpointer _data)
 }
 
 void
-foo (gint* array_param,
+foo (gint array_param[3],
      GAsyncReadyCallback _callback_,
      gpointer _user_data_)
 {
index eb8a047deaa5d1bcb89649255f8bb93d8ee51e43..5c4a167092470270c64c8b1fc9ce6ff912f154f1 100644 (file)
@@ -153,9 +153,9 @@ static gboolean _bar_equal (const Bar * s1,
 static gboolean _vala_bar_array_contains (Bar * stack,
                                    gssize stack_length,
                                    const Bar * needle);
-VALA_EXTERN void give_fixed_array (gint** i);
-VALA_EXTERN void take_fixed_array (gint* i);
-VALA_EXTERN void change_fixed_array (gint** i);
+VALA_EXTERN void give_fixed_array (gint* i[3]);
+VALA_EXTERN void take_fixed_array (gint i[3]);
+VALA_EXTERN void change_fixed_array (gint* i[3]);
 VALA_EXTERN void test_fixed_array (void);
 static void _vala_main (void);
 static void _vala_array_destroy (gpointer array,
@@ -1547,21 +1547,16 @@ test_struct_array (void)
 }
 
 void
-give_fixed_array (gint** i)
+give_fixed_array (gint* i[3])
 {
        gint _vala_i[3] = {0};
-       gint _tmp0_[3] = {0};
-       _tmp0_[0] = 3;
-       _tmp0_[1] = 4;
-       _tmp0_[2] = 5;
-       memcpy (_vala_i, _tmp0_, 3 * sizeof (gint));
        if (i) {
                *i = _vala_i;
        }
 }
 
 void
-take_fixed_array (gint* i)
+take_fixed_array (gint i[3])
 {
        gint _tmp0_;
        _vala_assert (3 == 3, "i.length == 3");
@@ -1570,35 +1565,62 @@ take_fixed_array (gint* i)
 }
 
 void
-change_fixed_array (gint** i)
+change_fixed_array (gint* i[3])
 {
+       gint _tmp0_;
        _vala_assert (3 == 3, "i.length == 3");
+       _tmp0_ = (*i)[1];
+       _vala_assert (_tmp0_ == 7, "i[1] == 7");
+       (*i)[1] = 9;
 }
 
 void
 test_fixed_array (void)
 {
-       gint i[3] = {0};
-       gint _tmp0_[3] = {0};
-       gint k[3] = {0};
-       gint _tmp1_[3] = {0};
-       gint j[3] = {0};
-       gint _tmp2_[3] = {0};
+       gint* i = NULL;
+       gint* _tmp0_;
+       gint i_length1;
+       gint _i_size_;
+       gint* k = NULL;
+       gint* _tmp1_;
+       gint k_length1;
+       gint _k_size_;
+       gint* _tmp2_;
+       gint _tmp2__length1;
+       gint* _tmp3_;
+       gint _tmp3__length1;
+       gint _tmp4_;
+       gint* j = NULL;
+       gint j_length1 = 0;
+       gint _j_size_ = 0;
+       _tmp0_ = g_new0 (gint, 4);
        _tmp0_[0] = 1;
        _tmp0_[1] = 2;
        _tmp0_[2] = 3;
-       memcpy (i, _tmp0_, 3 * sizeof (gint));
-       _vala_assert (3 == 3, "i.length == 3");
+       _tmp0_[3] = 4;
+       i = _tmp0_;
+       i_length1 = 4;
+       _i_size_ = i_length1;
+       _vala_assert (i_length1 == 4, "i.length == 4");
        take_fixed_array (i);
+       _tmp1_ = g_new0 (gint, 3);
        _tmp1_[0] = 6;
        _tmp1_[1] = 7;
        _tmp1_[2] = 8;
-       memcpy (k, _tmp1_, 3 * sizeof (gint));
+       k = _tmp1_;
+       k_length1 = 3;
+       _k_size_ = k_length1;
        change_fixed_array (&k);
-       _vala_assert (3 == 3, "k.length == 3");
-       give_fixed_array (&_tmp2_);
-       memcpy (j, _tmp2_, 3 * sizeof (gint));
-       _vala_assert (3 == 3, "j.length == 3");
+       _tmp2_ = k;
+       _tmp2__length1 = k_length1;
+       _vala_assert (_tmp2__length1 == 3, "k.length == 3");
+       _tmp3_ = k;
+       _tmp3__length1 = k_length1;
+       _tmp4_ = _tmp3_[1];
+       _vala_assert (_tmp4_ == 9, "k[1] == 9");
+       j = (g_free (j), NULL);
+       k = (g_free (k), NULL);
+       i = (g_free (i), NULL);
 }
 
 static void
index 8f5e1c78f8c8d5216886a81cd5c85466dd1026a1..1321c1b31e7e3716439df6e053e52b2046dba54d 100644 (file)
@@ -258,7 +258,7 @@ void test_struct_array () {
 }
 
 void give_fixed_array (out int i[3]) {
-       i = { 3, 4, 5 };
+       //FIXME i = { 3, 4, 5 };
 }
 
 void take_fixed_array (int i[3]) {
@@ -268,24 +268,24 @@ void take_fixed_array (int i[3]) {
 
 void change_fixed_array (ref int i[3]) {
        assert (i.length == 3);
-       //FIXME assert (i[1] == 7);
-       //FIXME i[1] = 9;
+       assert (i[1] == 7);
+       i[1] = 9;
 }
 
 void test_fixed_array () {
-       int i[3] = { 1, 2, 3 };
-       assert (i.length == 3);
+       int[] i = { 1, 2, 3, 4 };
+       assert (i.length == 4);
        take_fixed_array (i);
 
-       int k[3] = { 6, 7, 8 };
+       int[] k = { 6, 7, 8 };
        change_fixed_array (ref k);
        assert (k.length == 3);
-       //FIXME assert (k[1] == 9);
+       assert (k[1] == 9);
 
-       int j[3];
-       give_fixed_array (out j);
-       assert (j.length == 3);
-       //FIXME assert (j[1] == 4);
+       int[] j;
+       //give_fixed_array (out j);
+       //assert (j.length == 3);
+       //assert (j[1] == 4);
 }
 
 void main () {
index fdc6d729dd0e6880ec83a106df71a8b6485a0b21..b940fab63abadb5318cc3eb724e6acc091b8dab9 100644 (file)
@@ -32,8 +32,8 @@ struct _Bar {
 VALA_EXTERN GType bar_get_type (void) G_GNUC_CONST ;
 VALA_EXTERN Bar* bar_dup (const Bar* self);
 VALA_EXTERN void bar_free (Bar* self);
-VALA_EXTERN void foo (gint* a);
-VALA_EXTERN void bar (Bar* b);
+VALA_EXTERN void foo (gint a[3]);
+VALA_EXTERN void bar (Bar b[3]);
 static void _vala_main (void);
 
 Bar*
@@ -72,7 +72,7 @@ bar_get_type (void)
 }
 
 void
-foo (gint* a)
+foo (gint a[3])
 {
        gint _tmp0_;
        _tmp0_ = a[2];
@@ -80,7 +80,7 @@ foo (gint* a)
 }
 
 void
-bar (Bar* b)
+bar (Bar b[3])
 {
        Bar _tmp0_;
        Bar _tmp1_;
index 8cca3c9c396baebcc5d5b2ef239ca02801b25d78..9ef0f8f97e061b277659789e7d65ef647c77d001 100644 (file)
@@ -13,7 +13,7 @@
 #endif
 #endif
 
-typedef guint8* (*FooFunc) (guint8* param0, gsize param0_length1, guint8** param1, gint64* param1_length1, guint8** param2, guint* param2_length1, guint8* param3, guint64* result_length1, gpointer user_data);
+typedef guint8* (*FooFunc) (guint8* param0, gsize param0_length1, guint8** param1, gint64* param1_length1, guint8** param2, guint* param2_length1, guint8 param3[42], guint64* result_length1, gpointer user_data);
 
 VALA_EXTERN guint8* field0;
 VALA_EXTERN gssize field0_length1;
@@ -29,7 +29,7 @@ VALA_EXTERN guint8* func (guint8* param0,
               gint64* param1_length1,
               guint8** param2,
               guint* param2_length1,
-              guint8* param3,
+              guint8 param3[42],
               guint64* result_length1);
 static void _vala_main (void);
 
@@ -40,7 +40,7 @@ func (guint8* param0,
       gint64* param1_length1,
       guint8** param2,
       guint* param2_length1,
-      guint8* param3,
+      guint8 param3[42],
       guint64* result_length1)
 {
        guint8* _vala_param2 = NULL;
index 20eb68d257f133966da058b7f4ddbd9f06cfa7fe..b59712f6b07af91ac26fb24d06cde5f0e6d8e686 100644 (file)
@@ -144,9 +144,9 @@ static bool _bar_equal (const Bar * s1,
 static bool _vala_bar_array_contains (Bar * stack,
                                ssize_t stack_length,
                                const Bar * needle);
-VALA_EXTERN void give_fixed_array (int** i);
-VALA_EXTERN void take_fixed_array (int* i);
-VALA_EXTERN void change_fixed_array (int** i);
+VALA_EXTERN void give_fixed_array (int* i[3]);
+VALA_EXTERN void take_fixed_array (int i[3]);
+VALA_EXTERN void change_fixed_array (int* i[3]);
 VALA_EXTERN void test_fixed_array (void);
 static void _vala_main (void);
 static void _vala_array_destroy (void* array,
@@ -1525,21 +1525,16 @@ test_struct_array (void)
 }
 
 void
-give_fixed_array (int** i)
+give_fixed_array (int* i[3])
 {
        int _vala_i[3] = {0};
-       int _tmp0_[3] = {0};
-       _tmp0_[0] = 3;
-       _tmp0_[1] = 4;
-       _tmp0_[2] = 5;
-       memcpy (_vala_i, _tmp0_, 3 * sizeof (int));
        if (i) {
                *i = _vala_i;
        }
 }
 
 void
-take_fixed_array (int* i)
+take_fixed_array (int i[3])
 {
        int _tmp0_;
        assert (3 == 3);
@@ -1548,35 +1543,62 @@ take_fixed_array (int* i)
 }
 
 void
-change_fixed_array (int** i)
+change_fixed_array (int* i[3])
 {
+       int _tmp0_;
        assert (3 == 3);
+       _tmp0_ = (*i)[1];
+       assert (_tmp0_ == 7);
+       (*i)[1] = 9;
 }
 
 void
 test_fixed_array (void)
 {
-       int i[3] = {0};
-       int _tmp0_[3] = {0};
-       int k[3] = {0};
-       int _tmp1_[3] = {0};
-       int j[3] = {0};
-       int _tmp2_[3] = {0};
+       int* i = NULL;
+       int* _tmp0_;
+       int i_length1;
+       int _i_size_;
+       int* k = NULL;
+       int* _tmp1_;
+       int k_length1;
+       int _k_size_;
+       int* _tmp2_;
+       int _tmp2__length1;
+       int* _tmp3_;
+       int _tmp3__length1;
+       int _tmp4_;
+       int* j = NULL;
+       int j_length1 = 0;
+       int _j_size_ = 0;
+       _tmp0_ = calloc (4, sizeof (int));
        _tmp0_[0] = 1;
        _tmp0_[1] = 2;
        _tmp0_[2] = 3;
-       memcpy (i, _tmp0_, 3 * sizeof (int));
-       assert (3 == 3);
+       _tmp0_[3] = 4;
+       i = _tmp0_;
+       i_length1 = 4;
+       _i_size_ = i_length1;
+       assert (i_length1 == 4);
        take_fixed_array (i);
+       _tmp1_ = calloc (3, sizeof (int));
        _tmp1_[0] = 6;
        _tmp1_[1] = 7;
        _tmp1_[2] = 8;
-       memcpy (k, _tmp1_, 3 * sizeof (int));
+       k = _tmp1_;
+       k_length1 = 3;
+       _k_size_ = k_length1;
        change_fixed_array (&k);
-       assert (3 == 3);
-       give_fixed_array (&_tmp2_);
-       memcpy (j, _tmp2_, 3 * sizeof (int));
-       assert (3 == 3);
+       _tmp2_ = k;
+       _tmp2__length1 = k_length1;
+       assert (_tmp2__length1 == 3);
+       _tmp3_ = k;
+       _tmp3__length1 = k_length1;
+       _tmp4_ = _tmp3_[1];
+       assert (_tmp4_ == 9);
+       j = (free (j), NULL);
+       k = (free (k), NULL);
+       i = (free (i), NULL);
 }
 
 static void