[vala/0.54] codegen: Allow boxing of non-external SimpleType structs
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/0.54] codegen: Allow boxing of non-external SimpleType structs
- Date: Tue, 4 Jan 2022 11:44:38 +0000 (UTC)
commit 6c2a60d18fab7243361f28d6fbde9bd187e75d5e
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Mon Jan 3 09:07:00 2022 +0100
codegen: Allow boxing of non-external SimpleType structs
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1273
codegen/valaccodeattribute.vala | 5 ++-
tests/Makefile.am | 1 +
tests/structs/simple-type-boxed.c-expected | 59 ++++++++++++++++++++++++++++++
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 d39fc284e..110518741 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;
@@ -1021,7 +1022,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 5ee35d51e..b57514962 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -378,6 +378,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);
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]