]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Accept CCode.type attribute on parameters
authorRico Tzschichholz <ricotz@ubuntu.com>
Sat, 27 Nov 2021 18:26:35 +0000 (19:26 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 29 Nov 2021 12:31:37 +0000 (13:31 +0100)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/876

codegen/valaccodearraymodule.vala
codegen/valaccodemethodmodule.vala
codegen/valagtypemodule.vala
tests/methods/parameter-ccode-type.vala [new file with mode: 0644]

index e9a8b0701cc839166f9d18f66640cb1b3da49019..117395d653924176d020f1c86d170dd6a865ef67 100644 (file)
@@ -842,23 +842,25 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
        }
 
        public override CCodeParameter generate_parameter (Parameter param, CCodeFile decl_space, Map<int,CCodeParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
-               if (param.params_array || !(param.variable_type is ArrayType)) {
+               unowned ArrayType? array_type = param.variable_type as ArrayType;
+               if (array_type == null || param.params_array) {
                        return base.generate_parameter (param, decl_space, cparam_map, carg_map);
                }
 
-               string ctypename = get_ccode_name (param.variable_type);
-               string name = get_ccode_name (param);
-               var array_type = (ArrayType) param.variable_type;
+               string? ctypename = get_ccode_type (param);
+               if (ctypename == null) {
+                       ctypename = get_ccode_name (param.variable_type);
 
-               if (array_type.fixed_length) {
-                       ctypename += "*";
-               }
+                       if (array_type.fixed_length) {
+                               ctypename += "*";
+                       }
 
-               if (param.direction != ParameterDirection.IN) {
-                       ctypename += "*";
+                       if (param.direction != ParameterDirection.IN) {
+                               ctypename += "*";
+                       }
                }
 
-               var main_cparam = new CCodeParameter (name, ctypename);
+               var main_cparam = new CCodeParameter (get_ccode_name (param), ctypename);
 
                generate_type_declaration (array_type.element_type, decl_space);
 
index 063c3aa1d39fc518e78209baaa5a08bd1981f049..b9e56f9097815b5b19fc0b87d90487cff33ea254 100644 (file)
@@ -873,26 +873,29 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
        public virtual CCodeParameter generate_parameter (Parameter param, CCodeFile decl_space, Map<int,CCodeParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
                CCodeParameter cparam;
                if (!param.ellipsis && !param.params_array) {
-                       string ctypename = get_ccode_name (param.variable_type);
-
                        generate_type_declaration (param.variable_type, decl_space);
 
-                       // pass non-simple structs always by reference
-                       unowned Struct? st = param.variable_type.type_symbol as Struct;
-                       if (st != null) {
-                               if (!st.is_simple_type () && param.direction == ParameterDirection.IN) {
-                                       if (st.is_immutable && !param.variable_type.value_owned) {
-                                               ctypename = "const " + ctypename;
-                                       }
+                       string? ctypename = get_ccode_type (param);
+                       if (ctypename == null) {
+                               ctypename = get_ccode_name (param.variable_type);
+
+                               // pass non-simple structs always by reference
+                               unowned Struct? st = param.variable_type.type_symbol as Struct;
+                               if (st != null) {
+                                       if (!st.is_simple_type () && param.direction == ParameterDirection.IN) {
+                                               if (st.is_immutable && !param.variable_type.value_owned) {
+                                                       ctypename = "const " + ctypename;
+                                               }
 
-                                       if (!param.variable_type.nullable) {
-                                               ctypename += "*";
+                                               if (!param.variable_type.nullable) {
+                                                       ctypename += "*";
+                                               }
                                        }
                                }
-                       }
 
-                       if (param.direction != ParameterDirection.IN) {
-                               ctypename += "*";
+                               if (param.direction != ParameterDirection.IN) {
+                                       ctypename += "*";
+                               }
                        }
 
                        cparam = new CCodeParameter (get_ccode_name (param), ctypename);
index edd417a3175aa26ee6cb125a62ff9955ca400994..735f7d72872ffbb4451a387368572ad6c2e14392 100644 (file)
@@ -31,10 +31,13 @@ public class Vala.GTypeModule : GErrorModule {
 
                generate_type_declaration (param.variable_type, decl_space);
 
-               string ctypename = get_ccode_name (param.variable_type);
+               string? ctypename = get_ccode_type (param);
+               if (ctypename == null) {
+                       ctypename = get_ccode_name (param.variable_type);
 
-               if (param.direction != ParameterDirection.IN) {
-                       ctypename = "%s*".printf (ctypename);
+                       if (param.direction != ParameterDirection.IN) {
+                               ctypename = "%s*".printf (ctypename);
+                       }
                }
 
                var cparam = new CCodeParameter (get_ccode_name (param), ctypename);
diff --git a/tests/methods/parameter-ccode-type.vala b/tests/methods/parameter-ccode-type.vala
new file mode 100644 (file)
index 0000000..c9f7206
--- /dev/null
@@ -0,0 +1,51 @@
+void foo ([CCode (array_length = false, type = "const gchar**")] string[]? sa) {
+       assert (sa[1] == "bar");
+}
+
+const string[] BARS = { "foo", "bar", null };
+
+void bar ([CCode (array_length = false, type = "const gchar***")] out unowned string[]? sa) {
+       sa = BARS;
+}
+
+void manam ([CCode (array_length = false, type = "const GObject**")] Object[]? oa) {
+       assert (oa[1] == null);
+}
+
+void faz ([CCode (type = "const GObject*")] Object? o) {
+       assert (o == null);
+}
+
+void baz ([CCode (type = "const GObject**")] out unowned Object? o) {
+       o = null ;
+}
+
+void minim ([CCode (type = "gpointer*")] out unowned void* p) {
+       p = null;
+}
+
+void main () {
+       {
+               foo ({ "foo", "bar", null });
+       }
+       {
+               unowned string[] sa;
+               bar (out sa);
+       }
+       {
+               manam ({ null });
+       }
+       {
+               faz (null);
+       }
+       {
+               unowned Object? o;
+               baz (out o);
+               assert (o == null);
+       }
+       {
+               unowned void* p;
+               minim (out p);
+               assert (p == null);
+       }
+}