]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Implementing GLib.Source.prepare/check is optional since 2.36
authorRico Tzschichholz <ricotz@ubuntu.com>
Wed, 26 May 2021 16:39:20 +0000 (18:39 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 8 Jun 2021 08:48:57 +0000 (10:48 +0200)
codegen/valaccodemethodcallmodule.vala
tests/objects/gsource.vala
vapi/glib-2.0.vapi

index bbd08e00f797a6430e83c1f24cde89b56652202e..ceb9370ec21eefc11b1879065e7c5eaac6751536 100644 (file)
@@ -188,10 +188,27 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                // g_source_new
 
                                string class_prefix = get_ccode_lower_case_name (current_class);
+                               string prepare_func = "NULL";
+                               string check_func = "NULL";
+                               foreach (Method impl in current_class.get_methods ()) {
+                                       if (!impl.overrides) {
+                                               continue;
+                                       }
+                                       switch (impl.name) {
+                                       case "prepare":
+                                               prepare_func = "%s_real_prepare".printf (class_prefix);
+                                               break;
+                                       case "check":
+                                               check_func = "%s_real_check".printf (class_prefix);
+                                               break;
+                                       default:
+                                               break;
+                                       }
+                               }
 
                                var funcs = new CCodeDeclaration ("const GSourceFuncs");
                                funcs.modifiers = CCodeModifiers.STATIC;
-                               funcs.add_declarator (new CCodeVariableDeclarator ("_source_funcs", new CCodeConstant ("{ %s_real_prepare, %s_real_check, %s_real_dispatch, %s_finalize}".printf (class_prefix, class_prefix, class_prefix, class_prefix))));
+                               funcs.add_declarator (new CCodeVariableDeclarator ("_source_funcs", new CCodeConstant ("{ %s, %s, %s_real_dispatch, %s_finalize}".printf (prepare_func, check_func, class_prefix, class_prefix))));
                                ccode.add_statement (funcs);
 
                                ccall.add_argument (new CCodeCastExpression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_source_funcs")), "GSourceFuncs *"));
index 753d2c4d97517e973b81f57f56e33ada95ecc1ff..e1f4f07a3200e05742eca27e819c766410781525 100644 (file)
@@ -34,7 +34,14 @@ class BarSource : Source {
        }
 }
 
+class ManamSource : Source {
+       public override bool dispatch (SourceFunc? callback) {
+               return false;
+       }
+}
+
 void main () {
        var foo = new FooSource ();
        var bar = new BarSource (1000);
+       var manam = new ManamSource ();
 }
index 2a1456028adb4282ad0dacf4601d537b27993870..140d46a5deeb78c4159891c23e8e005054b592df 100644 (file)
@@ -2119,8 +2119,13 @@ namespace GLib {
                [CCode (cname = "G_SOURCE_REMOVE")]
                public const bool REMOVE;
 
+#if VALA_0_18
+               protected virtual bool prepare (out int timeout_);
+               protected virtual bool check ();
+#else
                protected abstract bool prepare (out int timeout_);
                protected abstract bool check ();
+#endif
                protected abstract bool dispatch (SourceFunc? _callback);
        }
 
@@ -2138,10 +2143,10 @@ namespace GLib {
 
        [CCode (has_type_id = false)]
        public struct SourceFuncs {
-               public SourcePrepareFunc prepare;
-               public SourceCheckFunc check;
+               public SourcePrepareFunc? prepare;
+               public SourceCheckFunc? check;
                public SourceDispatchFunc dispatch;
-               public SourceFinalizeFunc finalize;
+               public SourceFinalizeFunc? finalize;
        }
 
        [CCode (has_target = false)]