diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2022-10-29 18:09:23 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2023-01-08 14:50:28 +0000 |
commit | e9e3866133275cedcec6b9953adaf88fefcabbf8 (patch) | |
tree | 813abc2433ad2d50c23303a6cc0c7b09a8646a92 /giscanner/maintransformer.py | |
parent | 221b006625f2185b5a4d81d544bd0a2acf70ef60 (diff) | |
download | gobject-introspection-e9e3866133275cedcec6b9953adaf88fefcabbf8.tar.gz |
Add copy and free function annotations for POD types
Plain Old Data (POD) types with or without a representation in the GType
type system can still have a copy and/or a free function. We should
allow annotating these types with their corresponding functions for
copying their data into a new instance, and freeing their data.
From a language bindings perspective, POD types should have a boxed
GType wrapper around them, so they can use the generic GBoxed API to
copy and free instances; from a documentation perspective, though, it'd
be good to have a way to match a structured type, like a struct or a
union, with its copy and free functions.
In order to do that, we add two new header block annotations:
- (copy-func function_name)
- (free-func function_name)
These annotations work exactly like ref-func and unref-func for typed
instances:
/**
* GdkRGBA: (copy-func gdk_rgba_copy)
* (free-func gdk_rgba_free)
* @red: ...
* @green: ...
* @blue: ...
* @alpha: ...
*
* ...
*/
The function is stored in the GIR data as two new attributes for the
`<record>` and `<union>` elements:
<record name="RGBA"
c:type="GdkRGBA"
copy-function="gdk_rgba_copy"
free-function="gdk_rgba_free"
glib:type-name="GdkRGBA"
glib:get-type="gdk_rgba_get_type"
c:symbol-prefix="gdk_rgba">
The annotations are not mandatory.
See: #14
Diffstat (limited to 'giscanner/maintransformer.py')
-rw-r--r-- | giscanner/maintransformer.py | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py index 285712c7..4393e160 100644 --- a/giscanner/maintransformer.py +++ b/giscanner/maintransformer.py @@ -28,11 +28,13 @@ from .annotationparser import ( ANN_ATTRIBUTES, ANN_CLOSURE, ANN_CONSTRUCTOR, + ANN_COPY_FUNC, ANN_DEFAULT_VALUE, ANN_DESTROY, ANN_ELEMENT_TYPE, ANN_EMITTER, ANN_FOREIGN, + ANN_FREE_FUNC, ANN_GET_PROPERTY, ANN_GET_VALUE_FUNC, ANN_GETTER, @@ -310,6 +312,13 @@ class MainTransformer(object): node.get_value_func = annotation[0] if annotation else None if isinstance(node, ast.Constant): self._apply_annotations_constant(node) + if isinstance(node, (ast.Record, ast.Union)): + block = self._get_block(node) + if block: + annotation = block.annotations.get(ANN_COPY_FUNC) + node.copy_func = annotation[0] if annotation else None + annotation = block.annotations.get(ANN_FREE_FUNC) + node.free_func = annotation[0] if annotation else None return True def _adjust_container_type(self, parent, node, annotations): |