[gobject-introspection/scope-forever: 52/52] Add "forever" scope




commit b712c7cdb7a7b12874f6fd5e127dfc1fd457ef34
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Wed Apr 8 20:04:03 2020 +0100

    Add "forever" scope
    
    Some functions are meant to exist for the entire duration of the
    process, and thus have no need for a notification function because
    one will never be called.
    
    Fixes: #49

 girepository/girparser.c            |  2 ++
 girepository/girwriter.c            |  3 +++
 girepository/gitypes.h              | 15 +++++++++------
 giscanner/annotationparser.py       |  4 +++-
 giscanner/ast.py                    |  1 +
 giscanner/introspectablepass.py     |  2 +-
 tests/warn/callback-invalid-scope.h |  4 ++--
 tests/warn/callback-missing-scope.h |  2 +-
 8 files changed, 22 insertions(+), 11 deletions(-)
---
diff --git a/girepository/girparser.c b/girepository/girparser.c
index 470f0933..e5878b43 100644
--- a/girepository/girparser.c
+++ b/girepository/girparser.c
@@ -1244,6 +1244,8 @@ start_parameter (GMarkupParseContext *context,
     param->scope = GI_SCOPE_TYPE_ASYNC;
   else if (scope && strcmp (scope, "notified") == 0)
     param->scope = GI_SCOPE_TYPE_NOTIFIED;
+  else if (scope && strcmp (scope, "forever") == 0)
+    param->scope = GI_SCOPE_TYPE_FOREVER;
   else
     param->scope = GI_SCOPE_TYPE_INVALID;
 
diff --git a/girepository/girwriter.c b/girepository/girwriter.c
index a45edfd8..44e18801 100644
--- a/girepository/girwriter.c
+++ b/girepository/girwriter.c
@@ -532,6 +532,9 @@ write_callable_info (const gchar    *namespace,
         case GI_SCOPE_TYPE_NOTIFIED:
           xml_printf (file, " scope=\"notified\"");
           break;
+        case GI_SCOPE_TYPE_FOREVER:
+          xml_printf (file, " scope=\"forever\"");
+          break;
         default:
           g_assert_not_reached ();
         }
diff --git a/girepository/gitypes.h b/girepository/gitypes.h
index 33897520..83268e89 100644
--- a/girepository/gitypes.h
+++ b/girepository/gitypes.h
@@ -358,12 +358,14 @@ typedef enum  {
  * GIScopeType:
  * @GI_SCOPE_TYPE_INVALID: The argument is not of callback type.
  * @GI_SCOPE_TYPE_CALL: The callback and associated user_data is only
- * used during the call to this function.
+ *   used during the call to this function.
  * @GI_SCOPE_TYPE_ASYNC: The callback and associated user_data is
- * only used until the callback is invoked, and the callback.
- * is invoked always exactly once.
- * @GI_SCOPE_TYPE_NOTIFIED: The callback and and associated
- * user_data is used until the caller is notfied via the destroy_notify.
+ *   only used until the callback is invoked, and the callback.
+ *   is invoked always exactly once.
+ * @GI_SCOPE_TYPE_NOTIFIED: The callback and associated
+ *   user_data is used until the caller is notfied via the destroy_notify.
+ * @GI_SCOPE_TYPE_FOREVER: The callback and associated user_data is
+ *   used until the process terminates
  *
  * Scope type of a #GIArgInfo representing callback, determines how the
  * callback is invoked and is used to decided when the invoke structs
@@ -373,7 +375,8 @@ typedef enum {
   GI_SCOPE_TYPE_INVALID,
   GI_SCOPE_TYPE_CALL,
   GI_SCOPE_TYPE_ASYNC,
-  GI_SCOPE_TYPE_NOTIFIED
+  GI_SCOPE_TYPE_NOTIFIED,
+  GI_SCOPE_TYPE_FOREVER
 } GIScopeType;
 
 /**
diff --git a/giscanner/annotationparser.py b/giscanner/annotationparser.py
index 3307327e..9bba315b 100644
--- a/giscanner/annotationparser.py
+++ b/giscanner/annotationparser.py
@@ -286,10 +286,12 @@ NOT_OPTIONS = [OPT_NOT_NULLABLE]
 OPT_SCOPE_ASYNC = 'async'
 OPT_SCOPE_CALL = 'call'
 OPT_SCOPE_NOTIFIED = 'notified'
+OPT_SCOPE_FOREVER = 'forever'
 
 SCOPE_OPTIONS = [OPT_SCOPE_ASYNC,
                  OPT_SCOPE_CALL,
-                 OPT_SCOPE_NOTIFIED]
+                 OPT_SCOPE_NOTIFIED,
+                 OPT_SCOPE_FOREVER]
 
 # (transfer) annotation options
 OPT_TRANSFER_CONTAINER = 'container'
diff --git a/giscanner/ast.py b/giscanner/ast.py
index b760c71d..c99c93d8 100644
--- a/giscanner/ast.py
+++ b/giscanner/ast.py
@@ -365,6 +365,7 @@ PARAM_DIRECTION_INOUT = 'inout'
 PARAM_SCOPE_CALL = 'call'
 PARAM_SCOPE_ASYNC = 'async'
 PARAM_SCOPE_NOTIFIED = 'notified'
+PARAM_SCOPE_FOREVER = 'forever'
 
 PARAM_TRANSFER_NONE = 'none'
 PARAM_TRANSFER_CONTAINER = 'container'
diff --git a/giscanner/introspectablepass.py b/giscanner/introspectablepass.py
index 305e192e..d09b12a4 100644
--- a/giscanner/introspectablepass.py
+++ b/giscanner/introspectablepass.py
@@ -103,7 +103,7 @@ class IntrospectablePass(object):
                 parent,
                 node,
                 "Missing (scope) annotation for callback without "
-                "GDestroyNotify (valid: %s, %s)" % (ast.PARAM_SCOPE_CALL, ast.PARAM_SCOPE_ASYNC))
+                "GDestroyNotify (valid: %s, %s, %s)" % (ast.PARAM_SCOPE_CALL, ast.PARAM_SCOPE_ASYNC, 
ast.PARAM_SCOPE_FOREVER))
 
             parent.introspectable = False
             return
diff --git a/tests/warn/callback-invalid-scope.h b/tests/warn/callback-invalid-scope.h
index 34292a89..a0d18abf 100644
--- a/tests/warn/callback-invalid-scope.h
+++ b/tests/warn/callback-invalid-scope.h
@@ -28,5 +28,5 @@ void test_callback_invalid3(GCallback *callback, gpointer user_data);
 // EXPECT:23: Warning: Test: "scope" annotation needs one option, 2 given
 // EXPECT:23: Warning: Test: invalid "scope" annotation option: "invalid"
 
-// EXPECT:12: Warning: Test: test_callback_invalid2: argument callback: Missing (scope) annotation for 
callback without GDestroyNotify (valid: call, async)
-// EXPECT:21: Warning: Test: test_callback_invalid3: argument callback: Missing (scope) annotation for 
callback without GDestroyNotify (valid: call, async)
+// EXPECT:12: Warning: Test: test_callback_invalid2: argument callback: Missing (scope) annotation for 
callback without GDestroyNotify (valid: call, async, forever)
+// EXPECT:21: Warning: Test: test_callback_invalid3: argument callback: Missing (scope) annotation for 
callback without GDestroyNotify (valid: call, async, forever)
diff --git a/tests/warn/callback-missing-scope.h b/tests/warn/callback-missing-scope.h
index 7932198e..7fa0e732 100644
--- a/tests/warn/callback-missing-scope.h
+++ b/tests/warn/callback-missing-scope.h
@@ -2,4 +2,4 @@
 
 void test_callback(GCallback *callback, gpointer user_data);
 
-// EXPECT:3: Warning: Test: test_callback: argument callback: Missing (scope) annotation for callback 
without GDestroyNotify (valid: call, async)
+// EXPECT:3: Warning: Test: test_callback: argument callback: Missing (scope) annotation for callback 
without GDestroyNotify (valid: call, async, forever)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]