diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2023-03-21 11:14:49 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2023-03-21 11:14:49 +0100 |
commit | 0b6996d602f220f0a803b2af1520db1dfb2e0904 (patch) | |
tree | 7b4397b48ba8d986a9c1c1187ec0e9a212113f02 | |
parent | 95e8155204d1ce85224cbb50661d36d53e9bd274 (diff) | |
download | vala-0b6996d602f220f0a803b2af1520db1dfb2e0904.tar.gz |
tests: Extend "struct-typed properties" tests to increase coverage
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/objects/property-struct-no-gtype.c-expected | 271 | ||||
-rw-r--r-- | tests/objects/property-struct-no-gtype.vala | 22 | ||||
-rw-r--r-- | tests/objects/property-struct.c-expected | 634 | ||||
-rw-r--r-- | tests/objects/property-struct.vala | 30 |
5 files changed, 946 insertions, 12 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index b2c8c53dc..6c59fd2e0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -587,6 +587,7 @@ TESTS = \ objects/property-real-struct-no-accessor.test \ objects/property-simple-type-struct-nullable.vala \ objects/property-static.vala \ + objects/property-struct.vala \ objects/property-struct-no-gtype.vala \ objects/property-strv-noaccessor.vala \ objects/property-write-only-member-read.test \ diff --git a/tests/objects/property-struct-no-gtype.c-expected b/tests/objects/property-struct-no-gtype.c-expected index 806eb3eb4..85c91ea63 100644 --- a/tests/objects/property-struct-no-gtype.c-expected +++ b/tests/objects/property-struct-no-gtype.c-expected @@ -1,8 +1,9 @@ /* objects_property_struct_no_gtype.c generated by valac, the Vala compiler * generated from objects_property_struct_no_gtype.vala, do not modify */ -#include <glib.h> +#include <stdlib.h> #include <string.h> +#include <glib.h> #include <glib-object.h> #if !defined(VALA_EXTERN) @@ -16,6 +17,8 @@ #endif typedef struct _Bar Bar; +#define _g_free0(var) (var = (g_free (var), NULL)) +typedef Bar Baz; #define TYPE_FOO (foo_get_type ()) #define FOO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_FOO, Foo)) @@ -39,6 +42,7 @@ static GParamSpec* foo_properties[FOO_NUM_PROPERTIES]; #define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); struct _Bar { + gchar* s; gint i; }; @@ -52,7 +56,10 @@ struct _FooClass { }; struct _FooPrivate { + Bar _foo; Bar _bar; + Baz _faz; + Baz _baz; }; static gint Foo_private_offset; @@ -60,14 +67,36 @@ static gpointer foo_parent_class = NULL; VALA_EXTERN Bar* bar_dup (const Bar* self); VALA_EXTERN void bar_free (Bar* self); +VALA_EXTERN void bar_copy (const Bar* self, + Bar* dest); +VALA_EXTERN void bar_destroy (Bar* self); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (Bar, bar_destroy) +VALA_EXTERN Baz* baz_dup (const Baz* self); +VALA_EXTERN void baz_free (Baz* self); +VALA_EXTERN void baz_copy (const Baz* self, + Baz* dest); +VALA_EXTERN void baz_destroy (Baz* self); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (Baz, baz_destroy) VALA_EXTERN GType foo_get_type (void) G_GNUC_CONST ; G_DEFINE_AUTOPTR_CLEANUP_FUNC (Foo, g_object_unref) VALA_EXTERN Foo* foo_new (void); VALA_EXTERN Foo* foo_construct (GType object_type); +VALA_EXTERN void foo_get_foo (Foo* self, + Bar * result); +VALA_EXTERN void foo_set_foo (Foo* self, + Bar * value); VALA_EXTERN void foo_get_bar (Foo* self, Bar * result); VALA_EXTERN void foo_set_bar (Foo* self, Bar * value); +VALA_EXTERN void foo_get_faz (Foo* self, + Baz * result); +VALA_EXTERN void foo_set_faz (Foo* self, + Baz * value); +VALA_EXTERN void foo_get_baz (Foo* self, + Baz * result); +VALA_EXTERN void foo_set_baz (Foo* self, + Baz * value); static void foo_finalize (GObject * obj); static GType foo_get_type_once (void); static void _vala_foo_get_property (GObject * object, @@ -80,18 +109,73 @@ static void _vala_foo_set_property (GObject * object, GParamSpec * pspec); static void _vala_main (void); +void +bar_copy (const Bar* self, + Bar* dest) +{ + const gchar* _tmp0_; + gchar* _tmp1_; + _tmp0_ = (*self).s; + _tmp1_ = g_strdup (_tmp0_); + _g_free0 ((*dest).s); + (*dest).s = _tmp1_; + (*dest).i = (*self).i; +} + +void +bar_destroy (Bar* self) +{ + _g_free0 ((*self).s); +} + Bar* bar_dup (const Bar* self) { Bar* dup; dup = g_new0 (Bar, 1); - memcpy (dup, self, sizeof (Bar)); + bar_copy (self, dup); return dup; } void bar_free (Bar* self) { + bar_destroy (self); + g_free (self); +} + +void +baz_copy (const Baz* self, + Baz* dest) +{ + const gchar* _tmp0_; + gchar* _tmp1_; + _tmp0_ = (*self).s; + _tmp1_ = g_strdup (_tmp0_); + _g_free0 ((*dest).s); + (*dest).s = _tmp1_; + (*dest).i = (*self).i; +} + +void +baz_destroy (Baz* self) +{ + bar_destroy (self); +} + +Baz* +baz_dup (const Baz* self) +{ + Baz* dup; + dup = g_new0 (Baz, 1); + baz_copy (self, dup); + return dup; +} + +void +baz_free (Baz* self) +{ + baz_destroy (self); g_free (self); } @@ -116,13 +200,43 @@ foo_new (void) } void +foo_get_foo (Foo* self, + Bar * result) +{ + Bar _tmp0_; + g_return_if_fail (IS_FOO (self)); + _tmp0_ = self->priv->_foo; + *result = _tmp0_; + return; +} + +void +foo_set_foo (Foo* self, + Bar * value) +{ + Bar _tmp0_; + Bar _tmp1_; + Bar _tmp2_ = {0}; + g_return_if_fail (IS_FOO (self)); + _tmp0_ = *value; + _tmp1_ = _tmp0_; + bar_copy (&_tmp1_, &_tmp2_); + bar_destroy (&self->priv->_foo); + self->priv->_foo = _tmp2_; +} + +void foo_get_bar (Foo* self, Bar * result) { Bar _tmp0_; + Bar _tmp1_; + Bar _tmp2_ = {0}; g_return_if_fail (IS_FOO (self)); _tmp0_ = self->priv->_bar; - *result = _tmp0_; + _tmp1_ = _tmp0_; + bar_copy (&_tmp1_, &_tmp2_); + *result = _tmp2_; return; } @@ -133,7 +247,64 @@ foo_set_bar (Foo* self, Bar _tmp0_; g_return_if_fail (IS_FOO (self)); _tmp0_ = *value; + memset (value, 0, sizeof (Bar)); + bar_destroy (&self->priv->_bar); self->priv->_bar = _tmp0_; + bar_destroy (value); +} + +void +foo_get_faz (Foo* self, + Baz * result) +{ + Baz _tmp0_; + g_return_if_fail (IS_FOO (self)); + _tmp0_ = self->priv->_faz; + *result = _tmp0_; + return; +} + +void +foo_set_faz (Foo* self, + Baz * value) +{ + Baz _tmp0_; + Baz _tmp1_; + Baz _tmp2_ = {0}; + g_return_if_fail (IS_FOO (self)); + _tmp0_ = *value; + _tmp1_ = _tmp0_; + baz_copy (&_tmp1_, &_tmp2_); + baz_destroy (&self->priv->_faz); + self->priv->_faz = _tmp2_; +} + +void +foo_get_baz (Foo* self, + Baz * result) +{ + Baz _tmp0_; + Baz _tmp1_; + Baz _tmp2_ = {0}; + g_return_if_fail (IS_FOO (self)); + _tmp0_ = self->priv->_baz; + _tmp1_ = _tmp0_; + baz_copy (&_tmp1_, &_tmp2_); + *result = _tmp2_; + return; +} + +void +foo_set_baz (Foo* self, + Baz * value) +{ + Baz _tmp0_; + g_return_if_fail (IS_FOO (self)); + _tmp0_ = *value; + memset (value, 0, sizeof (Baz)); + baz_destroy (&self->priv->_baz); + self->priv->_baz = _tmp0_; + baz_destroy (value); } static void @@ -159,6 +330,10 @@ foo_finalize (GObject * obj) { Foo * self; self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_FOO, Foo); + bar_destroy (&self->priv->_foo); + bar_destroy (&self->priv->_bar); + baz_destroy (&self->priv->_faz); + baz_destroy (&self->priv->_baz); G_OBJECT_CLASS (foo_parent_class)->finalize (obj); } @@ -219,16 +394,92 @@ _vala_main (void) { Foo* foo = NULL; Foo* _tmp0_; - Bar _tmp1_ = {0}; + gchar* _tmp1_; Bar _tmp2_ = {0}; - Bar _tmp3_; + Bar _tmp3_ = {0}; + Bar _tmp4_; + Bar _tmp5_; + const gchar* _tmp6_; + Bar _tmp7_ = {0}; + Bar _tmp8_; + Bar _tmp9_; + Bar _tmp10_ = {0}; + Bar _tmp11_ = {0}; + Bar _tmp12_; + const gchar* _tmp13_; + Bar _tmp14_ = {0}; + Bar _tmp15_; + gchar* _tmp16_; + Baz _tmp17_ = {0}; + Baz _tmp18_ = {0}; + Baz _tmp19_; + Baz _tmp20_; + const gchar* _tmp21_; + Baz _tmp22_ = {0}; + Baz _tmp23_; + Baz _tmp24_; + Baz _tmp25_ = {0}; + Baz _tmp26_ = {0}; + Baz _tmp27_; + const gchar* _tmp28_; + Baz _tmp29_ = {0}; + Baz _tmp30_; _tmp0_ = foo_new (); foo = _tmp0_; - _tmp1_.i = 23; - foo_set_bar (foo, &_tmp1_); - foo_get_bar (foo, &_tmp2_); - _tmp3_ = _tmp2_; - _vala_assert (_tmp3_.i == 23, "foo.bar.i == 23"); + _tmp1_ = g_strdup ("bar"); + _g_free0 (_tmp2_.s); + _tmp2_.s = _tmp1_; + _tmp2_.i = 23; + foo_set_bar (foo, &_tmp2_); + foo_get_bar (foo, &_tmp3_); + _tmp4_ = _tmp3_; + _tmp5_ = _tmp4_; + _tmp6_ = _tmp5_.s; + _vala_assert (g_strcmp0 (_tmp6_, "bar") == 0, "foo.bar.s == \"bar\""); + bar_destroy (&_tmp5_); + foo_get_bar (foo, &_tmp7_); + _tmp8_ = _tmp7_; + _tmp9_ = _tmp8_; + _vala_assert (_tmp9_.i == 23, "foo.bar.i == 23"); + bar_destroy (&_tmp9_); + _g_free0 (_tmp10_.s); + _tmp10_.s = "foo"; + _tmp10_.i = 42; + foo_set_foo (foo, &_tmp10_); + foo_get_foo (foo, &_tmp11_); + _tmp12_ = _tmp11_; + _tmp13_ = _tmp12_.s; + _vala_assert (g_strcmp0 (_tmp13_, "foo") == 0, "foo.foo.s == \"foo\""); + foo_get_foo (foo, &_tmp14_); + _tmp15_ = _tmp14_; + _vala_assert (_tmp15_.i == 42, "foo.foo.i == 42"); + _tmp16_ = g_strdup ("baz"); + _g_free0 (_tmp17_.s); + _tmp17_.s = _tmp16_; + _tmp17_.i = 4711; + foo_set_baz (foo, &_tmp17_); + foo_get_baz (foo, &_tmp18_); + _tmp19_ = _tmp18_; + _tmp20_ = _tmp19_; + _tmp21_ = _tmp20_.s; + _vala_assert (g_strcmp0 (_tmp21_, "baz") == 0, "foo.baz.s == \"baz\""); + baz_destroy (&_tmp20_); + foo_get_baz (foo, &_tmp22_); + _tmp23_ = _tmp22_; + _tmp24_ = _tmp23_; + _vala_assert (_tmp24_.i == 4711, "foo.baz.i == 4711"); + baz_destroy (&_tmp24_); + _g_free0 (_tmp25_.s); + _tmp25_.s = "faz"; + _tmp25_.i = 72; + foo_set_faz (foo, &_tmp25_); + foo_get_faz (foo, &_tmp26_); + _tmp27_ = _tmp26_; + _tmp28_ = _tmp27_.s; + _vala_assert (g_strcmp0 (_tmp28_, "faz") == 0, "foo.faz.s == \"faz\""); + foo_get_faz (foo, &_tmp29_); + _tmp30_ = _tmp29_; + _vala_assert (_tmp30_.i == 72, "foo.faz.i == 72"); _g_object_unref0 (foo); } diff --git a/tests/objects/property-struct-no-gtype.vala b/tests/objects/property-struct-no-gtype.vala index 98a2c9f7d..bfb03b27e 100644 --- a/tests/objects/property-struct-no-gtype.vala +++ b/tests/objects/property-struct-no-gtype.vala @@ -1,14 +1,32 @@ [CCode (has_type_id = false)] struct Bar { + public string s; public int i; } +[CCode (has_type_id = false)] +struct Baz : Bar { +} + class Foo : Object { - public Bar bar { get; set; } + public Bar foo { get; set; } + public Bar bar { owned get; owned set; } + public Baz faz { get; set; } + public Baz baz { owned get; owned set; } } void main () { var foo = new Foo (); - foo.bar = { 23 }; + foo.bar = { "bar", 23 }; + assert (foo.bar.s == "bar"); assert (foo.bar.i == 23); + foo.foo = { "foo", 42 }; + assert (foo.foo.s == "foo"); + assert (foo.foo.i == 42); + foo.baz = { "baz", 4711 }; + assert (foo.baz.s == "baz"); + assert (foo.baz.i == 4711); + foo.faz = { "faz", 72 }; + assert (foo.faz.s == "faz"); + assert (foo.faz.i == 72); } diff --git a/tests/objects/property-struct.c-expected b/tests/objects/property-struct.c-expected new file mode 100644 index 000000000..0c6da96ee --- /dev/null +++ b/tests/objects/property-struct.c-expected @@ -0,0 +1,634 @@ +/* objects_property_struct.c generated by valac, the Vala compiler + * generated from objects_property_struct.vala, do not modify */ + +#include <glib-object.h> +#include <stdlib.h> +#include <string.h> +#include <glib.h> + +#if !defined(VALA_EXTERN) +#if defined(_WIN32) || defined(__CYGWIN__) +#define VALA_EXTERN __declspec(dllexport) extern +#elif __GNUC__ >= 4 +#define VALA_EXTERN __attribute__((visibility("default"))) extern +#else +#define VALA_EXTERN extern +#endif +#endif + +#define TYPE_BAR (bar_get_type ()) +typedef struct _Bar Bar; +#define _g_free0(var) (var = (g_free (var), NULL)) + +#define TYPE_BAZ (baz_get_type ()) +typedef Bar Baz; + +#define TYPE_FOO (foo_get_type ()) +#define FOO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_FOO, Foo)) +#define FOO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_FOO, FooClass)) +#define IS_FOO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_FOO)) +#define IS_FOO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_FOO)) +#define FOO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_FOO, FooClass)) + +typedef struct _Foo Foo; +typedef struct _FooClass FooClass; +typedef struct _FooPrivate FooPrivate; +enum { + FOO_0_PROPERTY, + FOO_FOO_PROPERTY, + FOO_BAR_PROPERTY, + FOO_FAZ_PROPERTY, + FOO_BAZ_PROPERTY, + FOO_NUM_PROPERTIES +}; +static GParamSpec* foo_properties[FOO_NUM_PROPERTIES]; +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (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 _Bar { + gchar* s; + gint i; +}; + +struct _Foo { + GObject parent_instance; + FooPrivate * priv; +}; + +struct _FooClass { + GObjectClass parent_class; +}; + +struct _FooPrivate { + Bar _foo; + Bar _bar; + Baz _faz; + Baz _baz; +}; + +static gint Foo_private_offset; +static gpointer foo_parent_class = NULL; + +VALA_EXTERN GType bar_get_type (void) G_GNUC_CONST ; +VALA_EXTERN Bar* bar_dup (const Bar* self); +VALA_EXTERN void bar_free (Bar* self); +VALA_EXTERN void bar_copy (const Bar* self, + Bar* dest); +VALA_EXTERN void bar_destroy (Bar* self); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (Bar, bar_destroy) +VALA_EXTERN GType baz_get_type (void) G_GNUC_CONST ; +VALA_EXTERN Baz* baz_dup (const Baz* self); +VALA_EXTERN void baz_free (Baz* self); +VALA_EXTERN void baz_copy (const Baz* self, + Baz* dest); +VALA_EXTERN void baz_destroy (Baz* self); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (Baz, baz_destroy) +VALA_EXTERN GType foo_get_type (void) G_GNUC_CONST ; +G_DEFINE_AUTOPTR_CLEANUP_FUNC (Foo, g_object_unref) +VALA_EXTERN Foo* foo_new (void); +VALA_EXTERN Foo* foo_construct (GType object_type); +VALA_EXTERN void foo_get_foo (Foo* self, + Bar * result); +VALA_EXTERN void foo_set_foo (Foo* self, + Bar * value); +static gboolean _bar_equal (const Bar * s1, + const Bar * s2); +VALA_EXTERN void foo_get_bar (Foo* self, + Bar * result); +VALA_EXTERN void foo_set_bar (Foo* self, + Bar * value); +VALA_EXTERN void foo_get_faz (Foo* self, + Baz * result); +VALA_EXTERN void foo_set_faz (Foo* self, + Baz * value); +VALA_EXTERN void foo_get_baz (Foo* self, + Baz * result); +VALA_EXTERN void foo_set_baz (Foo* self, + Baz * value); +static void foo_finalize (GObject * obj); +static GType foo_get_type_once (void); +static void _vala_foo_get_property (GObject * object, + guint property_id, + GValue * value, + GParamSpec * pspec); +static void _vala_foo_set_property (GObject * object, + guint property_id, + const GValue * value, + GParamSpec * pspec); +static void _vala_main (void); + +void +bar_copy (const Bar* self, + Bar* dest) +{ + const gchar* _tmp0_; + gchar* _tmp1_; + _tmp0_ = (*self).s; + _tmp1_ = g_strdup (_tmp0_); + _g_free0 ((*dest).s); + (*dest).s = _tmp1_; + (*dest).i = (*self).i; +} + +void +bar_destroy (Bar* self) +{ + _g_free0 ((*self).s); +} + +Bar* +bar_dup (const Bar* self) +{ + Bar* dup; + dup = g_new0 (Bar, 1); + bar_copy (self, dup); + return dup; +} + +void +bar_free (Bar* self) +{ + bar_destroy (self); + g_free (self); +} + +static GType +bar_get_type_once (void) +{ + GType bar_type_id; + bar_type_id = g_boxed_type_register_static ("Bar", (GBoxedCopyFunc) bar_dup, (GBoxedFreeFunc) bar_free); + return bar_type_id; +} + +GType +bar_get_type (void) +{ + static volatile gsize bar_type_id__once = 0; + if (g_once_init_enter (&bar_type_id__once)) { + GType bar_type_id; + bar_type_id = bar_get_type_once (); + g_once_init_leave (&bar_type_id__once, bar_type_id); + } + return bar_type_id__once; +} + +void +baz_copy (const Baz* self, + Baz* dest) +{ + const gchar* _tmp0_; + gchar* _tmp1_; + _tmp0_ = (*self).s; + _tmp1_ = g_strdup (_tmp0_); + _g_free0 ((*dest).s); + (*dest).s = _tmp1_; + (*dest).i = (*self).i; +} + +void +baz_destroy (Baz* self) +{ + bar_destroy (self); +} + +Baz* +baz_dup (const Baz* self) +{ + Baz* dup; + dup = g_new0 (Baz, 1); + baz_copy (self, dup); + return dup; +} + +void +baz_free (Baz* self) +{ + baz_destroy (self); + g_free (self); +} + +static GType +baz_get_type_once (void) +{ + GType baz_type_id; + baz_type_id = g_boxed_type_register_static ("Baz", (GBoxedCopyFunc) baz_dup, (GBoxedFreeFunc) baz_free); + return baz_type_id; +} + +GType +baz_get_type (void) +{ + static volatile gsize baz_type_id__once = 0; + if (g_once_init_enter (&baz_type_id__once)) { + GType baz_type_id; + baz_type_id = baz_get_type_once (); + g_once_init_leave (&baz_type_id__once, baz_type_id); + } + return baz_type_id__once; +} + +static inline gpointer +foo_get_instance_private (Foo* self) +{ + return G_STRUCT_MEMBER_P (self, Foo_private_offset); +} + +Foo* +foo_construct (GType object_type) +{ + Foo * self = NULL; + self = (Foo*) g_object_new (object_type, NULL); + return self; +} + +Foo* +foo_new (void) +{ + return foo_construct (TYPE_FOO); +} + +void +foo_get_foo (Foo* self, + Bar * result) +{ + Bar _tmp0_; + g_return_if_fail (IS_FOO (self)); + _tmp0_ = self->priv->_foo; + *result = _tmp0_; + return; +} + +static gboolean +_bar_equal (const Bar * s1, + const Bar * s2) +{ + if (s1 == s2) { + return TRUE; + } + if (s1 == NULL) { + return FALSE; + } + if (s2 == NULL) { + return FALSE; + } + if (g_strcmp0 (s1->s, s2->s)) { + return FALSE; + } + if (s1->i != s2->i) { + return FALSE; + } + return TRUE; +} + +void +foo_set_foo (Foo* self, + Bar * value) +{ + Bar old_value; + g_return_if_fail (IS_FOO (self)); + foo_get_foo (self, &old_value); + if (_bar_equal (value, &old_value) != TRUE) { + Bar _tmp0_; + Bar _tmp1_; + Bar _tmp2_ = {0}; + _tmp0_ = *value; + _tmp1_ = _tmp0_; + bar_copy (&_tmp1_, &_tmp2_); + bar_destroy (&self->priv->_foo); + self->priv->_foo = _tmp2_; + g_object_notify_by_pspec ((GObject *) self, foo_properties[FOO_FOO_PROPERTY]); + } +} + +void +foo_get_bar (Foo* self, + Bar * result) +{ + Bar _tmp0_; + Bar _tmp1_; + Bar _tmp2_ = {0}; + g_return_if_fail (IS_FOO (self)); + _tmp0_ = self->priv->_bar; + _tmp1_ = _tmp0_; + bar_copy (&_tmp1_, &_tmp2_); + *result = _tmp2_; + return; +} + +void +foo_set_bar (Foo* self, + Bar * value) +{ + Bar old_value; + g_return_if_fail (IS_FOO (self)); + foo_get_bar (self, &old_value); + if (_bar_equal (value, &old_value) != TRUE) { + Bar _tmp0_; + _tmp0_ = *value; + memset (value, 0, sizeof (Bar)); + bar_destroy (&self->priv->_bar); + self->priv->_bar = _tmp0_; + bar_destroy (value); + g_object_notify_by_pspec ((GObject *) self, foo_properties[FOO_BAR_PROPERTY]); + } + bar_destroy (&old_value); +} + +void +foo_get_faz (Foo* self, + Baz * result) +{ + Baz _tmp0_; + g_return_if_fail (IS_FOO (self)); + _tmp0_ = self->priv->_faz; + *result = _tmp0_; + return; +} + +void +foo_set_faz (Foo* self, + Baz * value) +{ + Baz old_value; + g_return_if_fail (IS_FOO (self)); + foo_get_faz (self, &old_value); + if (_bar_equal (value, &old_value) != TRUE) { + Baz _tmp0_; + Baz _tmp1_; + Baz _tmp2_ = {0}; + _tmp0_ = *value; + _tmp1_ = _tmp0_; + baz_copy (&_tmp1_, &_tmp2_); + baz_destroy (&self->priv->_faz); + self->priv->_faz = _tmp2_; + g_object_notify_by_pspec ((GObject *) self, foo_properties[FOO_FAZ_PROPERTY]); + } +} + +void +foo_get_baz (Foo* self, + Baz * result) +{ + Baz _tmp0_; + Baz _tmp1_; + Baz _tmp2_ = {0}; + g_return_if_fail (IS_FOO (self)); + _tmp0_ = self->priv->_baz; + _tmp1_ = _tmp0_; + baz_copy (&_tmp1_, &_tmp2_); + *result = _tmp2_; + return; +} + +void +foo_set_baz (Foo* self, + Baz * value) +{ + Baz old_value; + g_return_if_fail (IS_FOO (self)); + foo_get_baz (self, &old_value); + if (_bar_equal (value, &old_value) != TRUE) { + Baz _tmp0_; + _tmp0_ = *value; + memset (value, 0, sizeof (Baz)); + baz_destroy (&self->priv->_baz); + self->priv->_baz = _tmp0_; + baz_destroy (value); + g_object_notify_by_pspec ((GObject *) self, foo_properties[FOO_BAZ_PROPERTY]); + } + baz_destroy (&old_value); +} + +static void +foo_class_init (FooClass * klass, + gpointer klass_data) +{ + foo_parent_class = g_type_class_peek_parent (klass); + g_type_class_adjust_private_offset (klass, &Foo_private_offset); + G_OBJECT_CLASS (klass)->get_property = _vala_foo_get_property; + G_OBJECT_CLASS (klass)->set_property = _vala_foo_set_property; + G_OBJECT_CLASS (klass)->finalize = foo_finalize; + g_object_class_install_property (G_OBJECT_CLASS (klass), FOO_FOO_PROPERTY, foo_properties[FOO_FOO_PROPERTY] = g_param_spec_boxed ("foo", "foo", "foo", TYPE_BAR, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), FOO_BAR_PROPERTY, foo_properties[FOO_BAR_PROPERTY] = g_param_spec_boxed ("bar", "bar", "bar", TYPE_BAR, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), FOO_FAZ_PROPERTY, foo_properties[FOO_FAZ_PROPERTY] = g_param_spec_boxed ("faz", "faz", "faz", TYPE_BAZ, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), FOO_BAZ_PROPERTY, foo_properties[FOO_BAZ_PROPERTY] = g_param_spec_boxed ("baz", "baz", "baz", TYPE_BAZ, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE)); +} + +static void +foo_instance_init (Foo * self, + gpointer klass) +{ + self->priv = foo_get_instance_private (self); +} + +static void +foo_finalize (GObject * obj) +{ + Foo * self; + self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_FOO, Foo); + bar_destroy (&self->priv->_foo); + bar_destroy (&self->priv->_bar); + baz_destroy (&self->priv->_faz); + baz_destroy (&self->priv->_baz); + G_OBJECT_CLASS (foo_parent_class)->finalize (obj); +} + +static GType +foo_get_type_once (void) +{ + static const GTypeInfo g_define_type_info = { sizeof (FooClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) foo_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Foo), 0, (GInstanceInitFunc) foo_instance_init, NULL }; + GType foo_type_id; + foo_type_id = g_type_register_static (G_TYPE_OBJECT, "Foo", &g_define_type_info, 0); + Foo_private_offset = g_type_add_instance_private (foo_type_id, sizeof (FooPrivate)); + return foo_type_id; +} + +GType +foo_get_type (void) +{ + static volatile gsize foo_type_id__once = 0; + if (g_once_init_enter (&foo_type_id__once)) { + GType foo_type_id; + foo_type_id = foo_get_type_once (); + g_once_init_leave (&foo_type_id__once, foo_type_id); + } + return foo_type_id__once; +} + +static void +_vala_foo_get_property (GObject * object, + guint property_id, + GValue * value, + GParamSpec * pspec) +{ + Foo * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_FOO, Foo); + switch (property_id) { + case FOO_FOO_PROPERTY: + { + Bar boxed; + foo_get_foo (self, &boxed); + g_value_set_boxed (value, &boxed); + } + break; + case FOO_BAR_PROPERTY: + { + Bar boxed; + foo_get_bar (self, &boxed); + g_value_set_boxed (value, &boxed); + bar_destroy (&boxed); + } + break; + case FOO_FAZ_PROPERTY: + { + Baz boxed; + foo_get_faz (self, &boxed); + g_value_set_boxed (value, &boxed); + } + break; + case FOO_BAZ_PROPERTY: + { + Baz boxed; + foo_get_baz (self, &boxed); + g_value_set_boxed (value, &boxed); + baz_destroy (&boxed); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +_vala_foo_set_property (GObject * object, + guint property_id, + const GValue * value, + GParamSpec * pspec) +{ + Foo * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_FOO, Foo); + switch (property_id) { + case FOO_FOO_PROPERTY: + foo_set_foo (self, g_value_get_boxed (value)); + break; + case FOO_BAR_PROPERTY: + foo_set_bar (self, g_value_get_boxed (value)); + break; + case FOO_FAZ_PROPERTY: + foo_set_faz (self, g_value_get_boxed (value)); + break; + case FOO_BAZ_PROPERTY: + foo_set_baz (self, g_value_get_boxed (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +_vala_main (void) +{ + Foo* foo = NULL; + Foo* _tmp0_; + gchar* _tmp1_; + Bar _tmp2_ = {0}; + Bar _tmp3_ = {0}; + Bar _tmp4_; + Bar _tmp5_; + const gchar* _tmp6_; + Bar _tmp7_ = {0}; + Bar _tmp8_; + Bar _tmp9_; + Bar _tmp10_ = {0}; + Bar _tmp11_ = {0}; + Bar _tmp12_; + const gchar* _tmp13_; + Bar _tmp14_ = {0}; + Bar _tmp15_; + gchar* _tmp16_; + Baz _tmp17_ = {0}; + Baz _tmp18_ = {0}; + Baz _tmp19_; + Baz _tmp20_; + const gchar* _tmp21_; + Baz _tmp22_ = {0}; + Baz _tmp23_; + Baz _tmp24_; + Baz _tmp25_ = {0}; + Baz _tmp26_ = {0}; + Baz _tmp27_; + const gchar* _tmp28_; + Baz _tmp29_ = {0}; + Baz _tmp30_; + _tmp0_ = foo_new (); + foo = _tmp0_; + _tmp1_ = g_strdup ("bar"); + _g_free0 (_tmp2_.s); + _tmp2_.s = _tmp1_; + _tmp2_.i = 23; + foo_set_bar (foo, &_tmp2_); + foo_get_bar (foo, &_tmp3_); + _tmp4_ = _tmp3_; + _tmp5_ = _tmp4_; + _tmp6_ = _tmp5_.s; + _vala_assert (g_strcmp0 (_tmp6_, "bar") == 0, "foo.bar.s == \"bar\""); + bar_destroy (&_tmp5_); + foo_get_bar (foo, &_tmp7_); + _tmp8_ = _tmp7_; + _tmp9_ = _tmp8_; + _vala_assert (_tmp9_.i == 23, "foo.bar.i == 23"); + bar_destroy (&_tmp9_); + _g_free0 (_tmp10_.s); + _tmp10_.s = "foo"; + _tmp10_.i = 42; + foo_set_foo (foo, &_tmp10_); + foo_get_foo (foo, &_tmp11_); + _tmp12_ = _tmp11_; + _tmp13_ = _tmp12_.s; + _vala_assert (g_strcmp0 (_tmp13_, "foo") == 0, "foo.foo.s == \"foo\""); + foo_get_foo (foo, &_tmp14_); + _tmp15_ = _tmp14_; + _vala_assert (_tmp15_.i == 42, "foo.foo.i == 42"); + _tmp16_ = g_strdup ("baz"); + _g_free0 (_tmp17_.s); + _tmp17_.s = _tmp16_; + _tmp17_.i = 4711; + foo_set_baz (foo, &_tmp17_); + foo_get_baz (foo, &_tmp18_); + _tmp19_ = _tmp18_; + _tmp20_ = _tmp19_; + _tmp21_ = _tmp20_.s; + _vala_assert (g_strcmp0 (_tmp21_, "baz") == 0, "foo.baz.s == \"baz\""); + baz_destroy (&_tmp20_); + foo_get_baz (foo, &_tmp22_); + _tmp23_ = _tmp22_; + _tmp24_ = _tmp23_; + _vala_assert (_tmp24_.i == 4711, "foo.baz.i == 4711"); + baz_destroy (&_tmp24_); + _g_free0 (_tmp25_.s); + _tmp25_.s = "faz"; + _tmp25_.i = 72; + foo_set_faz (foo, &_tmp25_); + foo_get_faz (foo, &_tmp26_); + _tmp27_ = _tmp26_; + _tmp28_ = _tmp27_.s; + _vala_assert (g_strcmp0 (_tmp28_, "faz") == 0, "foo.faz.s == \"faz\""); + foo_get_faz (foo, &_tmp29_); + _tmp30_ = _tmp29_; + _vala_assert (_tmp30_.i == 72, "foo.faz.i == 72"); + _g_object_unref0 (foo); +} + +int +main (int argc, + char ** argv) +{ + _vala_main (); + return 0; +} + diff --git a/tests/objects/property-struct.vala b/tests/objects/property-struct.vala new file mode 100644 index 000000000..0e12bcf16 --- /dev/null +++ b/tests/objects/property-struct.vala @@ -0,0 +1,30 @@ +struct Bar { + public string s; + public int i; +} + +struct Baz : Bar { +} + +class Foo : Object { + public Bar foo { get; set; } + public Bar bar { owned get; owned set; } + public Baz faz { get; set; } + public Baz baz { owned get; owned set; } +} + +void main () { + var foo = new Foo (); + foo.bar = { "bar", 23 }; + assert (foo.bar.s == "bar"); + assert (foo.bar.i == 23); + foo.foo = { "foo", 42 }; + assert (foo.foo.s == "foo"); + assert (foo.foo.i == 42); + foo.baz = { "baz", 4711 }; + assert (foo.baz.s == "baz"); + assert (foo.baz.i == 4711); + foo.faz = { "faz", 72 }; + assert (foo.faz.s == "faz"); + assert (foo.faz.i == 72); +} |