OPT_ARRAY_LENGTH = 'length'
OPT_ARRAY_ZERO_TERMINATED = 'zero-terminated'
+OPT_SCOPE_ASYNC = 'async'
+OPT_SCOPE_CALL = 'call'
+OPT_SCOPE_NOTIFIED = 'notified'
class InvalidAnnotationError(Exception):
pass
def _parse_callable(self, callable, block):
self._parse_node_common(callable, block)
+ for i, param in enumerate(callable.parameters):
+ if param.type.name != 'GLib.DestroyNotify':
+ continue
+ if i < 2:
+ break
+ callback_param = callable.parameters[i-2]
+ if callback_param.closure_index != -1:
+ callback_param.scope = OPT_SCOPE_NOTIFIED
+ callback_param.transfer = PARAM_TRANSFER_NONE
+
self._parse_params(callable, callable.parameters, block)
self._parse_return(callable, callable.retval, block)
if block:
def _parse_param(self, parent, param, tag):
options = getattr(tag, 'options', {})
- if isinstance(parent, Function):
+ if isinstance(parent, Function) and not param.scope:
scope = options.get(OPT_SCOPE)
if scope:
param.scope = scope.one()
param.transfer = PARAM_TRANSFER_NONE
+ elif param.type.name == 'Gio.AsyncReadyCallback':
+ param.scope = OPT_SCOPE_ASYNC
+ param.transfer = PARAM_TRANSFER_NONE
+
destroy = options.get(OPT_DESTROY)
if destroy:
param.destroy_index = parent.get_parameter_index(destroy.one())
install-testlibLTLIBRARIES: # prevent it from being installed
AM_CPPFLAGS = -I$(top_srcdir)/girepository
-AM_CFLAGS = $(GOBJECT_CFLAGS) $(GTHREAD_CFLAGS)
+AM_CFLAGS = $(GIO_CFLAGS) $(GOBJECT_CFLAGS) $(GTHREAD_CFLAGS)
AM_LDFLAGS = -avoid-version
LIBS = $(GOBJECT_LIBS) $(GTHREAD_LIBS)
$(CHECK_DEBUG) $(SCANNER) \
--include=GObject-2.0 \
--include=utility-1.0 \
+ --include=Gio-2.0 \
--c-include="foo.h" \
--libtool="$(LIBTOOL)" \
--library=libfoo.la \
<parameters>
<parameter name="func"
transfer-ownership="none"
+ scope="notified"
closure="2"
destroy="3">
<type name="ForeachFunc" c:type="AnnotationForeachFunc"/>
<type name="none"/>
</return-value>
<parameters>
- <parameter name="func" transfer-ownership="none" closure="2" destroy="3">
+ <parameter name="func" transfer-ownership="none" scope="notified" closure="2" destroy="3">
<type name="ForeachFunc"/>
</parameter>
<parameter name="user_data" transfer-ownership="none">
xmlns:glib="http://www.gtk.org/introspection/glib/1.0">
<include name="GLib" version="2.0"/>
<include name="GObject" version="2.0"/>
+ <include name="Gio" version="2.0"/>
<include name="utility" version="1.0"/>
<package name="gobject-2.0"/>
<c:include name="foo.h"/>
</parameter>
</parameters>
</callback>
+ <function name="async_ready_callback"
+ c:identifier="foo_async_ready_callback">
+ <return-value transfer-ownership="none">
+ <type name="none" c:type="void"/>
+ </return-value>
+ <parameters>
+ <parameter name="cancellable" transfer-ownership="none">
+ <type name="Gio.Cancellable" c:type="GCancellable*"/>
+ </parameter>
+ <parameter name="callback" transfer-ownership="none" scope="async">
+ <type name="Gio.AsyncReadyCallback" c:type="GAsyncReadyCallback"/>
+ </parameter>
+ <parameter name="user_data" transfer-ownership="none">
+ <type name="any" c:type="gpointer"/>
+ </parameter>
+ </parameters>
+ </function>
+ <function name="destroy_notify_callback"
+ c:identifier="foo_destroy_notify_callback">
+ <return-value transfer-ownership="none">
+ <type name="none" c:type="void"/>
+ </return-value>
+ <parameters>
+ <parameter name="callback"
+ transfer-ownership="none"
+ scope="notified"
+ closure="1"
+ destroy="2">
+ <type name="Callback" c:type="FooCallback"/>
+ </parameter>
+ <parameter name="data" transfer-ownership="none">
+ <type name="any" c:type="gpointer"/>
+ </parameter>
+ <parameter name="destroy" transfer-ownership="none">
+ <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
+ </parameter>
+ </parameters>
+ </function>
<function name="enum_type_method" c:identifier="foo_enum_type_method">
<return-value transfer-ownership="none">
<type name="int" c:type="int"/>
xmlns:c="http://www.gtk.org/introspection/c/1.0"
xmlns:glib="http://www.gtk.org/introspection/glib/1.0">
<include name="utility" version="1.0"/>
+ <include name="Gio" version="2.0"/>
<include name="GObject" version="2.0"/>
<include name="GLib" version="2.0"/>
<namespace name="foo" version="1.0" shared-library="libfoo.so" c:prefix="foo">
<type name="utility.Struct"/>
</field>
</record>
+ <function name="async_ready_callback" c:identifier="foo_async_ready_callback">
+ <return-value transfer-ownership="none">
+ <type name="none"/>
+ </return-value>
+ <parameters>
+ <parameter name="cancellable" transfer-ownership="none">
+ <type name="Gio.Cancellable"/>
+ </parameter>
+ <parameter name="callback" transfer-ownership="none" scope="async">
+ <type name="Gio.AsyncReadyCallback"/>
+ </parameter>
+ <parameter name="user_data" transfer-ownership="none">
+ <type name="any"/>
+ </parameter>
+ </parameters>
+ </function>
+ <function name="destroy_notify_callback" c:identifier="foo_destroy_notify_callback">
+ <return-value transfer-ownership="none">
+ <type name="none"/>
+ </return-value>
+ <parameters>
+ <parameter name="callback" transfer-ownership="none" scope="notified" closure="1" destroy="2">
+ <type name="Callback"/>
+ </parameter>
+ <parameter name="data" transfer-ownership="none">
+ <type name="any"/>
+ </parameter>
+ <parameter name="destroy" transfer-ownership="none">
+ <type name="GLib.DestroyNotify"/>
+ </parameter>
+ </parameters>
+ </function>
<function name="enum_type_method" c:identifier="foo_enum_type_method">
<return-value transfer-ownership="none">
<type name="int"/>
#define __FOO_OBJECT_H__
#include <glib-object.h>
+#include <gio/gio.h> /* GAsyncReadyCallback */
#include "utility.h"
#define FOO_SUCCESS_INT 0x1138
void foo_test_varargs_callback3 (FooVarargsCallback callback,
FooVarargsCallback callback2);
+/* Make sure callbacks get the right scope by default */
+void foo_async_ready_callback(GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+void foo_destroy_notify_callback(FooCallback callback,
+ gpointer data,
+ GDestroyNotify destroy);
+
typedef enum {
FOO_ERROR_GOOD,
FOO_ERROR_BAD,
} FooSkippable;
void foo_skip_me (FooSkippable fs);
+
#endif /* __FOO_OBJECT_H__ */
</parameter>
<parameter name="func"
transfer-ownership="none"
+ scope="notified"
closure="3"
destroy="4">
<type name="FileFunc" c:type="UtilityFileFunc"/>
<parameter name="path" transfer-ownership="none">
<type name="utf8"/>
</parameter>
- <parameter name="func" transfer-ownership="none" closure="3" destroy="4">
+ <parameter name="func" transfer-ownership="none" scope="notified" closure="3" destroy="4">
<type name="FileFunc"/>
</parameter>
<parameter name="user_data" transfer-ownership="none">