From a06892eaa472ad26233ddcbcfbaf8ebdf12015f8 Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz Date: Sat, 2 Nov 2019 07:37:33 +0100 Subject: [PATCH] codegen: Make type-parameter properties readable Those are immutable while being construct-only properties. See https://gitlab.gnome.org/GNOME/vala/issues/190 --- codegen/valagobjectmodule.vala | 43 +++++++++++++++++-- tests/Makefile.am | 1 + tests/generics/type-parameter-properties.vala | 29 +++++++++++++ 3 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 tests/generics/type-parameter-properties.vala diff --git a/codegen/valagobjectmodule.vala b/codegen/valagobjectmodule.vala index 65726fe68..674f18d8a 100644 --- a/codegen/valagobjectmodule.vala +++ b/codegen/valagobjectmodule.vala @@ -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)); @@ -284,6 +284,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 (); diff --git a/tests/Makefile.am b/tests/Makefile.am index 95c67c6a0..0265bc99c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -502,6 +502,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 index 000000000..3004d198a --- /dev/null +++ b/tests/generics/type-parameter-properties.vala @@ -0,0 +1,29 @@ +class Foo : Object { +} + +class Bar : Foo { +} + +void main () { + var bar = new Bar (); + { + 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); + } +} -- 2.47.2