]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
tests: Add scope="async" test to increase coverage
authorRico Tzschichholz <ricotz@ubuntu.com>
Tue, 5 Aug 2025 12:38:10 +0000 (14:38 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 5 Aug 2025 12:38:10 +0000 (14:38 +0200)
tests/Makefile.am
tests/delegates/scope-async.c-expected [new file with mode: 0644]
tests/delegates/scope-async.vala [new file with mode: 0644]

index e8e9072e89ddfb774ee0d08f1edc9a24facb4242..f60b145ae11af108bf2d025655713cba899114ff 100644 (file)
@@ -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 (file)
index 0000000..8e3a286
--- /dev/null
@@ -0,0 +1,167 @@
+/* delegates_scope_async.c generated by valac, the Vala compiler
+ * generated from delegates_scope_async.vala, do not modify */
+
+#include <glib.h>
+
+#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 (file)
index 0000000..57bbaaa
--- /dev/null
@@ -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);
+       }
+}