diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2022-01-03 09:07:00 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2022-01-03 09:07:00 +0100 |
commit | 5738468d939f933a9d4b22707811ecfff2e936ed (patch) | |
tree | 0fcdcd6e8606fa17944e5bd97571e4852be4a34a | |
parent | e556d70819d91c23d6a704466c418ef68ad92562 (diff) | |
download | vala-5738468d939f933a9d4b22707811ecfff2e936ed.tar.gz |
codegen: Allow boxing of non-external SimpleType structs
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1273
-rw-r--r-- | codegen/valaccodeattribute.vala | 5 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/structs/simple-type-boxed.c-expected | 59 | ||||
-rw-r--r-- | tests/structs/simple-type-boxed.vala | 11 |
4 files changed, 74 insertions, 2 deletions
diff --git a/codegen/valaccodeattribute.vala b/codegen/valaccodeattribute.vala index c3144e0c6..8cf459107 100644 --- a/codegen/valaccodeattribute.vala +++ b/codegen/valaccodeattribute.vala @@ -255,7 +255,8 @@ public class Vala.CCodeAttribute : AttributeCache { if (ccode != null) { _dup_function = ccode.get_string ("dup_function"); } - if (_dup_function == null && !sym.external_package && sym is Struct) { + if (_dup_function == null && !sym.external_package + && sym is Struct && !((Struct) sym).is_simple_type ()) { _dup_function = "%sdup".printf (lower_case_prefix); } dup_function_set = true; @@ -1037,7 +1038,7 @@ public class Vala.CCodeAttribute : AttributeCache { } return "%sfree".printf (lower_case_prefix); } else if (sym is Struct) { - if (!sym.external_package) { + if (!sym.external_package && !((Struct) sym).is_simple_type ()) { return "%sfree".printf (lower_case_prefix); } } diff --git a/tests/Makefile.am b/tests/Makefile.am index 5c201124d..07002ecca 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -381,6 +381,7 @@ TESTS = \ structs/gvalue-implicit-comparison.vala \ structs/properties.vala \ structs/simple-type-constructor.vala \ + structs/simple-type-boxed.vala \ structs/simple-type-disposable.test \ structs/bug530605.vala \ structs/bug572091.vala \ diff --git a/tests/structs/simple-type-boxed.c-expected b/tests/structs/simple-type-boxed.c-expected new file mode 100644 index 000000000..45da6945b --- /dev/null +++ b/tests/structs/simple-type-boxed.c-expected @@ -0,0 +1,59 @@ +/* structs_simple_type_boxed.c generated by valac, the Vala compiler + * generated from structs_simple_type_boxed.vala, do not modify */ + +#include <glib.h> +#include <string.h> + +typedef struct _Foo Foo; +#define _g_free0(var) ((var == NULL) ? NULL : (var = (g_free (var), NULL))) +#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); +#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; } +#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; } +#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); + +struct _Foo { + gint i; + guint j; +}; + +static void _vala_main (void); +static Foo* _foo_dup (Foo* self); + +static Foo* +_foo_dup (Foo* self) +{ + Foo* dup; + dup = g_new0 (Foo, 1); + memcpy (dup, self, sizeof (Foo)); + return dup; +} + +static gpointer +__foo_dup0 (gpointer self) +{ + return self ? _foo_dup (self) : NULL; +} + +static void +_vala_main (void) +{ + Foo* foo = NULL; + Foo _tmp0_ = {0}; + Foo* _tmp1_; + _tmp0_.i = 42; + _tmp0_.j = 4711U; + _tmp1_ = __foo_dup0 (&_tmp0_); + foo = _tmp1_; + _vala_assert ((*foo).i == 42, "foo.i == 42"); + _vala_assert ((*foo).j == 4711U, "foo.j == 4711U"); + _g_free0 (foo); +} + +int +main (int argc, + char ** argv) +{ + _vala_main (); + return 0; +} + diff --git a/tests/structs/simple-type-boxed.vala b/tests/structs/simple-type-boxed.vala new file mode 100644 index 000000000..a2bae9311 --- /dev/null +++ b/tests/structs/simple-type-boxed.vala @@ -0,0 +1,11 @@ +[SimpleType] +struct Foo { + public int i; + public uint j; +} + +void main () { + Foo? foo = { 42, 4711U }; + assert (foo.i == 42); + assert (foo.j == 4711U); +} |