From: Rico Tzschichholz Date: Sun, 30 Jan 2022 17:07:23 +0000 (+0100) Subject: tests: Generic type inference for static methods only in compact classes X-Git-Tag: 0.54.7~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=13d451e0e3c50592191adeb840355cd94fbc780f;p=thirdparty%2Fvala.git tests: Generic type inference for static methods only in compact classes --- diff --git a/tests/generics/inference-static-function.c-expected b/tests/generics/inference-static-function.c-expected index df2182982..56663f692 100644 --- a/tests/generics/inference-static-function.c-expected +++ b/tests/generics/inference-static-function.c-expected @@ -1,9 +1,7 @@ /* generics_inference_static_function.c generated by valac, the Vala compiler * generated from generics_inference_static_function.vala, do not modify */ -#include #include -#include #include #include @@ -17,66 +15,17 @@ #endif #endif -#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; -typedef struct _ParamSpecFoo ParamSpecFoo; struct _Foo { - GTypeInstance parent_instance; - volatile int ref_count; - FooPrivate * priv; -}; - -struct _FooClass { - GTypeClass parent_class; - void (*finalize) (Foo *self); -}; - -struct _FooPrivate { - GType g_type; - GBoxedCopyFunc g_dup_func; - GDestroyNotify g_destroy_func; + int dummy; }; -struct _ParamSpecFoo { - GParamSpec parent_instance; -}; - -static gint Foo_private_offset; -static gpointer foo_parent_class = NULL; - -VALA_EXTERN gpointer foo_ref (gpointer instance); -VALA_EXTERN void foo_unref (gpointer instance); -VALA_EXTERN GParamSpec* param_spec_foo (const gchar* name, - const gchar* nick, - const gchar* blurb, - GType object_type, - GParamFlags flags); -VALA_EXTERN void value_set_foo (GValue* value, - gpointer v_object); -VALA_EXTERN void value_take_foo (GValue* value, - gpointer v_object); -VALA_EXTERN gpointer value_get_foo (const GValue* value); -VALA_EXTERN GType foo_get_type (void) G_GNUC_CONST ; -G_DEFINE_AUTOPTR_CLEANUP_FUNC (Foo, foo_unref) +VALA_EXTERN void foo_free (Foo * self); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (Foo, foo_free) +static void foo_instance_init (Foo * self); VALA_EXTERN gpointer* foo_bar (gint* result_length1); -VALA_EXTERN Foo* foo_new (GType g_type, - GBoxedCopyFunc g_dup_func, - GDestroyNotify g_destroy_func); -VALA_EXTERN Foo* foo_construct (GType object_type, - GType g_type, - GBoxedCopyFunc g_dup_func, - GDestroyNotify g_destroy_func); -static void foo_finalize (Foo * obj); -static GType foo_get_type_once (void); +VALA_EXTERN Foo* foo_new (void); static void _vala_main (void); static void _vala_array_destroy (gpointer array, gssize array_length, @@ -85,12 +34,6 @@ static void _vala_array_free (gpointer array, gssize array_length, GDestroyNotify destroy_func); -static inline gpointer -foo_get_instance_private (Foo* self) -{ - return G_STRUCT_MEMBER_P (self, Foo_private_offset); -} - gpointer* foo_bar (gint* result_length1) { @@ -109,227 +52,23 @@ foo_bar (gint* result_length1) } Foo* -foo_construct (GType object_type, - GType g_type, - GBoxedCopyFunc g_dup_func, - GDestroyNotify g_destroy_func) +foo_new (void) { - Foo* self = NULL; - self = (Foo*) g_type_create_instance (object_type); - self->priv->g_type = g_type; - self->priv->g_dup_func = g_dup_func; - self->priv->g_destroy_func = g_destroy_func; + Foo* self; + self = g_slice_new0 (Foo); + foo_instance_init (self); return self; } -Foo* -foo_new (GType g_type, - GBoxedCopyFunc g_dup_func, - GDestroyNotify g_destroy_func) -{ - return foo_construct (TYPE_FOO, g_type, g_dup_func, g_destroy_func); -} - -static void -value_foo_init (GValue* value) -{ - value->data[0].v_pointer = NULL; -} - -static void -value_foo_free_value (GValue* value) -{ - if (value->data[0].v_pointer) { - foo_unref (value->data[0].v_pointer); - } -} - static void -value_foo_copy_value (const GValue* src_value, - GValue* dest_value) -{ - if (src_value->data[0].v_pointer) { - dest_value->data[0].v_pointer = foo_ref (src_value->data[0].v_pointer); - } else { - dest_value->data[0].v_pointer = NULL; - } -} - -static gpointer -value_foo_peek_pointer (const GValue* value) -{ - return value->data[0].v_pointer; -} - -static gchar* -value_foo_collect_value (GValue* value, - guint n_collect_values, - GTypeCValue* collect_values, - guint collect_flags) -{ - if (collect_values[0].v_pointer) { - Foo * object; - object = collect_values[0].v_pointer; - if (object->parent_instance.g_class == NULL) { - return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); - } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) { - return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); - } - value->data[0].v_pointer = foo_ref (object); - } else { - value->data[0].v_pointer = NULL; - } - return NULL; -} - -static gchar* -value_foo_lcopy_value (const GValue* value, - guint n_collect_values, - GTypeCValue* collect_values, - guint collect_flags) +foo_instance_init (Foo * self) { - Foo ** object_p; - object_p = collect_values[0].v_pointer; - if (!object_p) { - return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); - } - if (!value->data[0].v_pointer) { - *object_p = NULL; - } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) { - *object_p = value->data[0].v_pointer; - } else { - *object_p = foo_ref (value->data[0].v_pointer); - } - return NULL; -} - -GParamSpec* -param_spec_foo (const gchar* name, - const gchar* nick, - const gchar* blurb, - GType object_type, - GParamFlags flags) -{ - ParamSpecFoo* spec; - g_return_val_if_fail (g_type_is_a (object_type, TYPE_FOO), NULL); - spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags); - G_PARAM_SPEC (spec)->value_type = object_type; - return G_PARAM_SPEC (spec); -} - -gpointer -value_get_foo (const GValue* value) -{ - g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_FOO), NULL); - return value->data[0].v_pointer; -} - -void -value_set_foo (GValue* value, - gpointer v_object) -{ - Foo * old; - g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_FOO)); - old = value->data[0].v_pointer; - if (v_object) { - g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_FOO)); - g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); - value->data[0].v_pointer = v_object; - foo_ref (value->data[0].v_pointer); - } else { - value->data[0].v_pointer = NULL; - } - if (old) { - foo_unref (old); - } } void -value_take_foo (GValue* value, - gpointer v_object) -{ - Foo * old; - g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_FOO)); - old = value->data[0].v_pointer; - if (v_object) { - g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_FOO)); - g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); - value->data[0].v_pointer = v_object; - } else { - value->data[0].v_pointer = NULL; - } - if (old) { - foo_unref (old); - } -} - -static void -foo_class_init (FooClass * klass, - gpointer klass_data) -{ - foo_parent_class = g_type_class_peek_parent (klass); - ((FooClass *) klass)->finalize = foo_finalize; - g_type_class_adjust_private_offset (klass, &Foo_private_offset); -} - -static void -foo_instance_init (Foo * self, - gpointer klass) +foo_free (Foo * self) { - self->priv = foo_get_instance_private (self); - self->ref_count = 1; -} - -static void -foo_finalize (Foo * obj) -{ - Foo * self; - self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_FOO, Foo); - g_signal_handlers_destroy (self); -} - -static GType -foo_get_type_once (void) -{ - static const GTypeValueTable g_define_type_value_table = { value_foo_init, value_foo_free_value, value_foo_copy_value, value_foo_peek_pointer, "p", value_foo_collect_value, "p", value_foo_lcopy_value }; - 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, &g_define_type_value_table }; - static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) }; - GType foo_type_id; - foo_type_id = g_type_register_fundamental (g_type_fundamental_next (), "Foo", &g_define_type_info, &g_define_type_fundamental_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__volatile = 0; - if (g_once_init_enter (&foo_type_id__volatile)) { - GType foo_type_id; - foo_type_id = foo_get_type_once (); - g_once_init_leave (&foo_type_id__volatile, foo_type_id); - } - return foo_type_id__volatile; -} - -gpointer -foo_ref (gpointer instance) -{ - Foo * self; - self = instance; - g_atomic_int_inc (&self->ref_count); - return instance; -} - -void -foo_unref (gpointer instance) -{ - Foo * self; - self = instance; - if (g_atomic_int_dec_and_test (&self->ref_count)) { - FOO_GET_CLASS (self)->finalize (self); - g_type_free_instance ((GTypeInstance *) self); - } + g_slice_free (Foo, self); } static void diff --git a/tests/generics/inference-static-function.vala b/tests/generics/inference-static-function.vala index 4c004bb83..8b4aabcdf 100644 --- a/tests/generics/inference-static-function.vala +++ b/tests/generics/inference-static-function.vala @@ -1,3 +1,4 @@ +[Compact] class Foo { public static G[] bar () { return {};