summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2020-04-08 20:04:03 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2021-07-29 11:19:01 +0100
commit6243afd9f89bd5b375868f4de21b582fa84bec55 (patch)
tree8787f88d58ebe9a24418bab7819c6939c08a5f35
parent793b46cc0458da6c04a8037db6aabb10f4409c21 (diff)
downloadgobject-introspection-scope-forever.tar.gz
Add "forever" scopescope-forever
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
-rw-r--r--girepository/girparser.c2
-rw-r--r--girepository/girwriter.c3
-rw-r--r--girepository/gitypes.h15
-rw-r--r--giscanner/annotationparser.py4
-rw-r--r--giscanner/ast.py1
-rw-r--r--giscanner/introspectablepass.py2
-rw-r--r--tests/warn/callback-invalid-scope.h4
-rw-r--r--tests/warn/callback-missing-scope.h2
8 files changed, 22 insertions, 11 deletions
diff --git a/girepository/girparser.c b/girepository/girparser.c
index f62b1de6..4838d1e6 100644
--- a/girepository/girparser.c
+++ b/girepository/girparser.c
@@ -1221,6 +1221,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 d092df10..f785ccf2 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 267542f9..a6542332 100644
--- a/giscanner/annotationparser.py
+++ b/giscanner/annotationparser.py
@@ -278,10 +278,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 9a0d95c7..c296e8c3 100644
--- a/giscanner/ast.py
+++ b/giscanner/ast.py
@@ -363,6 +363,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 e2056b42..bb3580c6 100644
--- a/giscanner/introspectablepass.py
+++ b/giscanner/introspectablepass.py
@@ -102,7 +102,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)