summaryrefslogtreecommitdiff
path: root/codegen
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2023-02-05 19:33:15 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2023-02-05 20:05:32 +0100
commit0771248fd47770e0d25d139143de41eb16a6ee07 (patch)
tree711ab83e07a12afed1d53646d2eb669ae74878dd /codegen
parentfe1633c15bc5a572ba45b59c7612a3eb352503f2 (diff)
downloadvala-0771248fd47770e0d25d139143de41eb16a6ee07.tar.gz
codegen: Cast vfunc of property accessors by using cast_method_pointer()
Found by -Wincompatible-function-pointer-types See https://gitlab.gnome.org/GNOME/vala/issues/1408
Diffstat (limited to 'codegen')
-rw-r--r--codegen/valagtypemodule.vala44
1 files changed, 17 insertions, 27 deletions
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index 0d9fae482..34c0773d4 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -1365,14 +1365,16 @@ public class Vala.GTypeModule : GErrorModule {
if (prop.get_accessor != null) {
generate_property_accessor_declaration (prop.base_property.get_accessor, cfile);
- string cname = get_ccode_real_name (prop.get_accessor);
- ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "get_%s".printf (prop.name)), new CCodeIdentifier (cname));
+ CCodeExpression cfunc = new CCodeIdentifier (get_ccode_real_name (prop.get_accessor));
+ cfunc = cast_method_pointer (prop.base_property.get_accessor.get_method (), cfunc, base_type);
+ ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "get_%s".printf (prop.name)), cfunc);
}
if (prop.set_accessor != null) {
generate_property_accessor_declaration (prop.base_property.set_accessor, cfile);
- string cname = get_ccode_real_name (prop.set_accessor);
- ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "set_%s".printf (prop.name)), new CCodeIdentifier (cname));
+ CCodeExpression cfunc = new CCodeIdentifier (get_ccode_real_name (prop.set_accessor));
+ cfunc = cast_method_pointer (prop.base_property.set_accessor.get_method (), cfunc, base_type);
+ ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "set_%s".printf (prop.name)), cfunc);
}
}
}
@@ -1533,7 +1535,7 @@ public class Vala.GTypeModule : GErrorModule {
CCodeExpression cfunc = new CCodeIdentifier (cname);
if (prop.is_abstract || prop.is_virtual) {
- cfunc = cast_property_accessor_pointer (prop.get_accessor, cfunc, base_type);
+ cfunc = cast_method_pointer (prop.base_interface_property.get_accessor.get_method (), cfunc, base_type);
}
ccode.add_assignment (new CCodeMemberAccess.pointer (ciface, "get_%s".printf (prop.name)), cfunc);
}
@@ -1547,7 +1549,7 @@ public class Vala.GTypeModule : GErrorModule {
CCodeExpression cfunc = new CCodeIdentifier (cname);
if (prop.is_abstract || prop.is_virtual) {
- cfunc = cast_property_accessor_pointer (prop.set_accessor, cfunc, base_type);
+ cfunc = cast_method_pointer (prop.base_interface_property.set_accessor.get_method (), cfunc, base_type);
}
ccode.add_assignment (new CCodeMemberAccess.pointer (ciface, "set_%s".printf (prop.name)), cfunc);
}
@@ -1587,7 +1589,7 @@ public class Vala.GTypeModule : GErrorModule {
string cname = get_ccode_name (base_property.get_accessor);
CCodeExpression cfunc = new CCodeIdentifier (cname);
- cfunc = cast_property_accessor_pointer (prop.get_accessor, cfunc, iface);
+ cfunc = cast_method_pointer (base_property.get_accessor.get_method (), cfunc, iface);
ccode.add_assignment (new CCodeMemberAccess.pointer (ciface, "get_%s".printf (prop.name)), cfunc);
}
if (base_property.set_accessor != null && prop.set_accessor != null) {
@@ -1595,7 +1597,7 @@ public class Vala.GTypeModule : GErrorModule {
string cname = get_ccode_name (base_property.set_accessor);
CCodeExpression cfunc = new CCodeIdentifier (cname);
- cfunc = cast_property_accessor_pointer (prop.set_accessor, cfunc, iface);
+ cfunc = cast_method_pointer (base_property.set_accessor.get_method (), cfunc, iface);
ccode.add_assignment (new CCodeMemberAccess.pointer (ciface, "set_%s".printf (prop.name)), cfunc);
}
}
@@ -1605,20 +1607,6 @@ public class Vala.GTypeModule : GErrorModule {
cfile.add_function (iface_init);
}
- CCodeExpression cast_property_accessor_pointer (PropertyAccessor acc, CCodeExpression cfunc, ObjectTypeSymbol base_type) {
- string cast;
- if (acc.readable && acc.value_type.is_real_non_null_struct_type ()) {
- cast = "void (*) (%s *, %s *)".printf (get_ccode_name (base_type), get_ccode_name (acc.value_type));
- } else if (acc.readable) {
- cast = "%s (*) (%s *)".printf (get_ccode_name (acc.value_type), get_ccode_name (base_type));
- } else if (acc.value_type.is_real_non_null_struct_type ()) {
- cast = "void (*) (%s *, %s *)".printf (get_ccode_name (base_type), get_ccode_name (acc.value_type));
- } else {
- cast = "void (*) (%s *, %s)".printf (get_ccode_name (base_type), get_ccode_name (acc.value_type));
- }
- return new CCodeCastExpression (cfunc, cast);
- }
-
CCodeExpression cast_method_pointer (Method m, CCodeExpression cfunc, ObjectTypeSymbol base_type, int direction = 3) {
// Cast the function pointer to match the interface
string cast;
@@ -1710,7 +1698,7 @@ public class Vala.GTypeModule : GErrorModule {
if (prop.base_property == null || is_gsource) {
continue;
}
- var base_type = prop.base_property.parent_symbol;
+ var base_type = (ObjectTypeSymbol) prop.base_property.parent_symbol;
var ccast = new CCodeCastExpression (new CCodeIdentifier ("self"), "%s *".printf (get_ccode_name (base_type)));
@@ -1718,14 +1706,16 @@ public class Vala.GTypeModule : GErrorModule {
if (prop.get_accessor != null) {
generate_property_accessor_declaration (prop.base_property.get_accessor, cfile);
- string cname = get_ccode_real_name (prop.get_accessor);
- ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "get_%s".printf (prop.name)), new CCodeIdentifier (cname));
+ CCodeExpression cfunc = new CCodeIdentifier (get_ccode_real_name (prop.get_accessor));
+ cfunc = cast_method_pointer (prop.base_property.get_accessor.get_method (), cfunc, base_type);
+ ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "get_%s".printf (prop.name)), cfunc);
}
if (prop.set_accessor != null) {
generate_property_accessor_declaration (prop.base_property.set_accessor, cfile);
- string cname = get_ccode_real_name (prop.set_accessor);
- ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "set_%s".printf (prop.name)), new CCodeIdentifier (cname));
+ CCodeExpression cfunc = new CCodeIdentifier (get_ccode_real_name (prop.set_accessor));
+ cfunc = cast_method_pointer (prop.base_property.set_accessor.get_method (), cfunc, base_type);
+ ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "set_%s".printf (prop.name)), cfunc);
}
}
}