]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use g_once_init_{enter,leave}_pointer when targetting glib >= 2.80
authorSergey Bugaev <bugaevc@gmail.com>
Fri, 18 Apr 2025 10:43:00 +0000 (13:43 +0300)
committerRico Tzschichholz <ricotz@ubuntu.com>
Fri, 18 Apr 2025 14:29:26 +0000 (16:29 +0200)
See https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3577

codegen/valaccodebasemodule.vala
codegen/valatyperegisterfunction.vala
tests/glib/conditional-glib-api.vala

index 0c4c20358fd3481f6c4bbb91f1257a37dc993a42..5bdd88c69fce3d412725bdff2898f84d569fe992 100644 (file)
@@ -4511,10 +4511,15 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
                        push_function (fun);
 
-                       var once_enter_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter"));
-                       if (context.require_glib_version (2, 68)) {
+                       CCodeFunctionCall once_enter_call;
+                       if (context.require_glib_version (2, 80)) {
+                               once_enter_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter_pointer"));
+                               once_enter_call.add_argument (new CCodeConstant ("re"));
+                       } else if (context.require_glib_version (2, 68)) {
+                               once_enter_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter"));
                                once_enter_call.add_argument (new CCodeConstant ("(gsize*) re"));
                        } else {
+                               once_enter_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter"));
                                once_enter_call.add_argument (new CCodeConstant ("(volatile gsize*) re"));
                        }
                        ccode.open_if (once_enter_call);
@@ -4526,13 +4531,20 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        regex_new_call.add_argument (new CCodeConstant ("NULL"));
                        ccode.add_assignment (new CCodeIdentifier ("GRegex* val"), regex_new_call);
 
-                       var once_leave_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave"));
-                       if (context.require_glib_version (2, 68)) {
+                       CCodeFunctionCall once_leave_call;
+                       if (context.require_glib_version (2, 80)) {
+                               once_leave_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave_pointer"));
+                               once_leave_call.add_argument (new CCodeConstant ("re"));
+                               once_leave_call.add_argument (new CCodeConstant ("val"));
+                       } else if (context.require_glib_version (2, 68)) {
+                               once_leave_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave"));
                                once_leave_call.add_argument (new CCodeConstant ("(gsize*) re"));
+                               once_leave_call.add_argument (new CCodeConstant ("(gsize) val"));
                        } else {
+                               once_leave_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave"));
                                once_leave_call.add_argument (new CCodeConstant ("(volatile gsize*) re"));
+                               once_leave_call.add_argument (new CCodeConstant ("(gsize) val"));
                        }
-                       once_leave_call.add_argument (new CCodeConstant ("(gsize) val"));
                        ccode.add_expression (once_leave_call);
 
                        ccode.close ();
index bea70762e5b29dd29f98107f803ad59c8f52109a..a40dc22705bc00178bad3ee84bea947d6e0b55c6 100644 (file)
@@ -55,7 +55,11 @@ public abstract class Vala.TypeRegisterFunction {
                var type_once_block = new CCodeBlock ();
                CCodeDeclaration cdecl;
                if (!plugin) {
-                       cdecl = new CCodeDeclaration ("gsize");
+                       if (context.require_glib_version (2, 80)) {
+                               cdecl = new CCodeDeclaration ("GType");
+                       } else {
+                               cdecl = new CCodeDeclaration ("gsize");
+                       }
                        cdecl.add_declarator (new CCodeVariableDeclarator (type_id_name + "__once", new CCodeConstant ("0")));
                        if (context.require_glib_version (2, 68)) {
                                cdecl.modifiers = CCodeModifiers.STATIC;
@@ -287,10 +291,20 @@ public abstract class Vala.TypeRegisterFunction {
 
                if (!plugin) {
                        // the condition that guards the type initialisation
-                       var enter = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter"));
+                       CCodeFunctionCall enter;
+                       if (context.require_glib_version (2, 80)) {
+                               enter = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter_pointer"));
+                       } else {
+                               enter = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter"));
+                       }
                        enter.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (type_id_name + "__once")));
 
-                       var leave = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave"));
+                       CCodeFunctionCall leave;
+                       if (context.require_glib_version (2, 80)) {
+                               leave = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave_pointer"));
+                       } else {
+                               leave = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave"));
+                       }
                        leave.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (type_id_name + "__once")));
                        leave.add_argument (new CCodeIdentifier (type_id_name));
                        once_call_block.add_statement (new CCodeExpressionStatement (leave));
index 3c63e506b4a4068e14d638afba02d46062aefbe6..63758f9c7c5632bc9d8395c509c630b92e6bc67f 100644 (file)
@@ -33,6 +33,7 @@ void use_g_memdup2 () {
 
 // glib 2.68 drop volatile
 // glib 2.74 G_TYPE_FLAG_NONE
+// glib 2.80 g_once_init_{enter,leave}_pointer
 [SingleInstance]
 class FooVolatile : Object {
 }