diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2020-04-08 20:04:03 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2021-07-29 11:19:01 +0100 |
commit | 6243afd9f89bd5b375868f4de21b582fa84bec55 (patch) | |
tree | 8787f88d58ebe9a24418bab7819c6939c08a5f35 | |
parent | 793b46cc0458da6c04a8037db6aabb10f4409c21 (diff) | |
download | gobject-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.c | 2 | ||||
-rw-r--r-- | girepository/girwriter.c | 3 | ||||
-rw-r--r-- | girepository/gitypes.h | 15 | ||||
-rw-r--r-- | giscanner/annotationparser.py | 4 | ||||
-rw-r--r-- | giscanner/ast.py | 1 | ||||
-rw-r--r-- | giscanner/introspectablepass.py | 2 | ||||
-rw-r--r-- | tests/warn/callback-invalid-scope.h | 4 | ||||
-rw-r--r-- | 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 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) |