]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Make type-parameter properties readable
authorRico Tzschichholz <ricotz@ubuntu.com>
Sat, 2 Nov 2019 06:37:33 +0000 (07:37 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 7 Nov 2019 11:11:48 +0000 (12:11 +0100)
Those are immutable while being construct-only properties.

See https://gitlab.gnome.org/GNOME/vala/issues/190

codegen/valagobjectmodule.vala
tests/Makefile.am
tests/generics/type-parameter-properties.vala [new file with mode: 0644]

index 8ad676ab9d1b195492fb7c0089112fc6607f6f92..61eb596457fd827cdba256461153a2f3b4b2dbd4 100644 (file)
@@ -93,7 +93,7 @@ public class Vala.GObjectModule : GTypeModule {
                        cspec.add_argument (new CCodeConstant ("\"type\""));
                        cspec.add_argument (new CCodeConstant ("\"type\""));
                        cspec.add_argument (new CCodeIdentifier ("G_TYPE_NONE"));
-                       cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY"));
+                       cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY"));
                        cinst.add_argument (cspec);
                        ccode.add_expression (cinst);
                        prop_enum.add_value (new CCodeEnumValue (enum_value));
@@ -109,7 +109,7 @@ public class Vala.GObjectModule : GTypeModule {
                        cspec.add_argument (func_name_constant);
                        cspec.add_argument (new CCodeConstant ("\"dup func\""));
                        cspec.add_argument (new CCodeConstant ("\"dup func\""));
-                       cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY"));
+                       cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY"));
                        cinst.add_argument (cspec);
                        ccode.add_expression (cinst);
                        prop_enum.add_value (new CCodeEnumValue (enum_value));
@@ -125,7 +125,7 @@ public class Vala.GObjectModule : GTypeModule {
                        cspec.add_argument (func_name_constant);
                        cspec.add_argument (new CCodeConstant ("\"destroy func\""));
                        cspec.add_argument (new CCodeConstant ("\"destroy func\""));
-                       cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY"));
+                       cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY"));
                        cinst.add_argument (cspec);
                        ccode.add_expression (cinst);
                        prop_enum.add_value (new CCodeEnumValue (enum_value));
@@ -279,6 +279,43 @@ public class Vala.GObjectModule : GTypeModule {
                        }
                        ccode.add_break ();
                }
+
+               /* type, dup func, and destroy func properties for generic types */
+               foreach (TypeParameter type_param in cl.get_type_parameters ()) {
+                       string func_name, enum_value;
+                       CCodeMemberAccess cfield;
+                       CCodeFunctionCall csetcall;
+
+                       func_name = "%s_type".printf (type_param.name.ascii_down ());
+                       enum_value = "%s_%s".printf (get_ccode_lower_case_name (cl, null), func_name).ascii_up ();
+                       ccode.add_case (new CCodeIdentifier (enum_value));
+                       cfield = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
+                       csetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_value_set_gtype"));
+                       csetcall.add_argument (new CCodeIdentifier ("value"));
+                       csetcall.add_argument (cfield);
+                       ccode.add_expression (csetcall);
+                       ccode.add_break ();
+
+                       func_name = "%s_dup_func".printf (type_param.name.ascii_down ());
+                       enum_value = "%s_%s".printf (get_ccode_lower_case_name (cl, null), func_name).ascii_up ();
+                       ccode.add_case (new CCodeIdentifier (enum_value));
+                       cfield = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
+                       csetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_value_set_pointer"));
+                       csetcall.add_argument (new CCodeIdentifier ("value"));
+                       csetcall.add_argument (cfield);
+                       ccode.add_expression (csetcall);
+                       ccode.add_break ();
+
+                       func_name = "%s_destroy_func".printf (type_param.name.ascii_down ());
+                       enum_value = "%s_%s".printf (get_ccode_lower_case_name (cl, null), func_name).ascii_up ();
+                       ccode.add_case (new CCodeIdentifier (enum_value));
+                       cfield = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
+                       csetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_value_set_pointer"));
+                       csetcall.add_argument (new CCodeIdentifier ("value"));
+                       csetcall.add_argument (cfield);
+                       ccode.add_expression (csetcall);
+                       ccode.add_break ();
+               }
                ccode.add_default ();
                emit_invalid_property_id_warn ();
                ccode.add_break ();
index c5e3f319fdf436387caf7ac972bc849003ca958d..cb6b699120ebc7140d9f3e5ff16c6f97eb55c0f6 100644 (file)
@@ -488,6 +488,7 @@ TESTS = \
        generics/constructor-chain-up.vala \
        generics/inference-static-function.vala \
        generics/parameter-sizeof-initializer.vala \
+       generics/type-parameter-properties.vala \
        generics/bug640330.test \
        generics/bug640330.vala \
        generics/bug694765-1.vala \
diff --git a/tests/generics/type-parameter-properties.vala b/tests/generics/type-parameter-properties.vala
new file mode 100644 (file)
index 0000000..3004d19
--- /dev/null
@@ -0,0 +1,29 @@
+class Foo<G> : Object {
+}
+
+class Bar<T> : Foo<T> {
+}
+
+void main () {
+       var bar = new Bar<string> ();
+       {
+               Type type;
+               BoxedCopyFunc dup_func;
+               DestroyNotify destroy_func;
+
+               bar.get ("t-type", out type, "t-dup-func", out dup_func, "t-destroy-func", out destroy_func);
+               assert (type == typeof(string));
+               assert (dup_func == (BoxedCopyFunc) string.dup);
+               assert (destroy_func == (DestroyNotify) free);
+       }
+       {
+               Type type;
+               BoxedCopyFunc dup_func;
+               DestroyNotify destroy_func;
+
+               bar.get ("g-type", out type, "g-dup-func", out dup_func, "g-destroy-func", out destroy_func);
+               assert (type == typeof(string));
+               assert (dup_func == (BoxedCopyFunc) string.dup);
+               assert (destroy_func == (DestroyNotify) free);
+       }
+}