From bc820ffb5d0454fcf6aefe166a49bab20c5a629f Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz Date: Tue, 5 Aug 2025 14:38:10 +0200 Subject: [PATCH] tests: Add scope="async" test to increase coverage --- tests/Makefile.am | 1 + tests/delegates/scope-async.c-expected | 167 +++++++++++++++++++++++++ tests/delegates/scope-async.vala | 29 +++++ 3 files changed, 197 insertions(+) create mode 100644 tests/delegates/scope-async.c-expected create mode 100644 tests/delegates/scope-async.vala diff --git a/tests/Makefile.am b/tests/Makefile.am index e8e9072e8..f60b145ae 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -489,6 +489,7 @@ TESTS = \ delegates/params-array-with-throws.vala \ delegates/reference_transfer.vala \ delegates/return-array-null-terminated.vala \ + delegates/scope-async.vala \ delegates/variadic.vala \ delegates/wrapper.vala \ delegates/bug519949.test \ diff --git a/tests/delegates/scope-async.c-expected b/tests/delegates/scope-async.c-expected new file mode 100644 index 000000000..8e3a2863b --- /dev/null +++ b/tests/delegates/scope-async.c-expected @@ -0,0 +1,167 @@ +/* delegates_scope_async.c generated by valac, the Vala compiler + * generated from delegates_scope_async.vala, do not modify */ + +#include + +#if !defined(VALA_STRICT_C) +#if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ >= 14) +#pragma GCC diagnostic warning "-Wincompatible-pointer-types" +#elif defined(__clang__) && (__clang_major__ >= 16) +#pragma clang diagnostic ignored "-Wincompatible-function-pointer-types" +#pragma clang diagnostic ignored "-Wincompatible-pointer-types" +#endif +#endif +#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 + +typedef void (*FooFunc) (gpointer user_data); +typedef void (*BarFunc) (gpointer user_data); +typedef struct _Block1Data Block1Data; +typedef struct _Block2Data Block2Data; +#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 _Block1Data { + int _ref_count_; + gint i; +}; + +struct _Block2Data { + int _ref_count_; + gint j; +}; + +VALA_EXTERN void foo (FooFunc f, + gpointer f_target); +VALA_EXTERN void bar (BarFunc f, + gpointer f_target); +static void _vala_main (void); +static Block1Data* block1_data_ref (Block1Data* _data1_); +static void block1_data_unref (void * _userdata_); +static void _vala_lambda0_ (Block1Data* _data1_); +static void __vala_lambda0__foo_func (gpointer self); +static Block2Data* block2_data_ref (Block2Data* _data2_); +static void block2_data_unref (void * _userdata_); +static void _vala_lambda1_ (Block2Data* _data2_); +static void __vala_lambda1__bar_func (gpointer self); + +void +foo (FooFunc f, + gpointer f_target) +{ + f (f_target); +} + +void +bar (BarFunc f, + gpointer f_target) +{ + f (f_target); +} + +static Block1Data* +block1_data_ref (Block1Data* _data1_) +{ + g_atomic_int_inc (&_data1_->_ref_count_); + return _data1_; +} + +static void +block1_data_unref (void * _userdata_) +{ + Block1Data* _data1_; + _data1_ = (Block1Data*) _userdata_; + if (g_atomic_int_dec_and_test (&_data1_->_ref_count_)) { + g_slice_free (Block1Data, _data1_); + } +} + +static void +_vala_lambda0_ (Block1Data* _data1_) +{ + gint _tmp0_; + _tmp0_ = _data1_->i; + _data1_->i = _tmp0_ + 1; +} + +static void +__vala_lambda0__foo_func (gpointer self) +{ + _vala_lambda0_ (self); + block1_data_unref (self); +} + +static Block2Data* +block2_data_ref (Block2Data* _data2_) +{ + g_atomic_int_inc (&_data2_->_ref_count_); + return _data2_; +} + +static void +block2_data_unref (void * _userdata_) +{ + Block2Data* _data2_; + _data2_ = (Block2Data*) _userdata_; + if (g_atomic_int_dec_and_test (&_data2_->_ref_count_)) { + g_slice_free (Block2Data, _data2_); + } +} + +static void +_vala_lambda1_ (Block2Data* _data2_) +{ + gint _tmp0_; + _tmp0_ = _data2_->j; + _data2_->j = _tmp0_ + 1; +} + +static void +__vala_lambda1__bar_func (gpointer self) +{ + _vala_lambda1_ (self); + block2_data_unref (self); +} + +static void +_vala_main (void) +{ + { + Block1Data* _data1_; + _data1_ = g_slice_new0 (Block1Data); + _data1_->_ref_count_ = 1; + _data1_->i = 0; + foo (__vala_lambda0__foo_func, block1_data_ref (_data1_)); + _vala_assert (_data1_->i == 1, "i == 1"); + block1_data_unref (_data1_); + _data1_ = NULL; + } + { + Block2Data* _data2_; + _data2_ = g_slice_new0 (Block2Data); + _data2_->_ref_count_ = 1; + _data2_->j = 0; + bar (__vala_lambda1__bar_func, block2_data_ref (_data2_)); + _vala_assert (_data2_->j == 1, "j == 1"); + block2_data_unref (_data2_); + _data2_ = NULL; + } +} + +int +main (int argc, + char ** argv) +{ + _vala_main (); + return 0; +} + diff --git a/tests/delegates/scope-async.vala b/tests/delegates/scope-async.vala new file mode 100644 index 000000000..57bbaaae8 --- /dev/null +++ b/tests/delegates/scope-async.vala @@ -0,0 +1,29 @@ +delegate void FooFunc (); + +void foo ([CCode (scope = "async")] owned FooFunc f) { + f (); +} + +[CCode (scope = "async")] +delegate void BarFunc (); + +void bar (owned BarFunc f) { + f (); +} + +void main () { + { + int i = 0; + foo (() => { + i++; + }); + assert (i == 1); + } + { + int j = 0; + bar (() => { + j++; + }); + assert (j == 1); + } +} -- 2.47.2