]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Allow boxing of non-external SimpleType structs
authorRico Tzschichholz <ricotz@ubuntu.com>
Mon, 3 Jan 2022 08:07:00 +0000 (09:07 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 3 Jan 2022 08:07:00 +0000 (09:07 +0100)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1273

codegen/valaccodeattribute.vala
tests/Makefile.am
tests/structs/simple-type-boxed.c-expected [new file with mode: 0644]
tests/structs/simple-type-boxed.vala [new file with mode: 0644]

index c3144e0c68c2cc62223dca0e2b91406d007075dd..8cf459107395b5f58546a6cf2e973f4c5f09388f 100644 (file)
@@ -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);
                        }
                }
index 5c201124dcdf81c10838337fb621e0dcec6b8c05..07002ecca7a24721d9bd87afe372c6d7d1f68357 100644 (file)
@@ -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 (file)
index 0000000..45da694
--- /dev/null
@@ -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 (file)
index 0000000..a2bae93
--- /dev/null
@@ -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);
+}