diff options
-rw-r--r-- | gir/Everything-1.0-expected.gir | 21 | ||||
-rw-r--r-- | gir/everything.c | 21 | ||||
-rw-r--r-- | gir/everything.h | 1 | ||||
-rw-r--r-- | giscanner/annotationparser.py | 5 | ||||
-rw-r--r-- | giscanner/transformer.py | 6 | ||||
-rw-r--r-- | tests/scanner/annotation-1.0-expected.gir | 10 | ||||
-rw-r--r-- | tests/scanner/annotation-1.0-expected.tgir | 10 |
7 files changed, 57 insertions, 17 deletions
diff --git a/gir/Everything-1.0-expected.gir b/gir/Everything-1.0-expected.gir index aaacee55..2a96e2bb 100644 --- a/gir/Everything-1.0-expected.gir +++ b/gir/Everything-1.0-expected.gir @@ -1083,7 +1083,26 @@ call and can be released on return."> </parameter> </parameters> </function> - <function name="test_strv_out" c:identifier="test_strv_out"> + <function name="test_strv_out" + c:identifier="test_strv_out" + doc="No annotations here. We want the default to Do The Right Thing."> + <return-value transfer-ownership="full"> + <array c:type="char**"> + <type name="utf8"/> + </array> + </return-value> + </function> + <function name="test_strv_out_c" + c:identifier="test_strv_out_c" + doc="No annotations here. We want the default to Do The Right Thing."> + <return-value transfer-ownership="none"> + <array c:type="char**"> + <type name="utf8"/> + </array> + </return-value> + </function> + <function name="test_strv_out_container" + c:identifier="test_strv_out_container"> <return-value transfer-ownership="container"> <array c:type="char**"> <type name="utf8"/> diff --git a/gir/everything.c b/gir/everything.c index 341f8493..e01a3a93 100644 --- a/gir/everything.c +++ b/gir/everything.c @@ -377,6 +377,11 @@ test_array_gtype_in (int n_types, GType *types) return g_string_free (string, FALSE); } +/** + * test_strv_out: + * + * No annotations here. We want the default to Do The Right Thing. + */ char ** test_strv_out (void) { @@ -439,6 +444,22 @@ int test_array_int_in_take (int n_ints, int *ints) } /** + * test_strv_out_c: + * + * No annotations here. We want the default to Do The Right Thing. + */ +const char * const* +test_strv_out_c (void) +{ + static char **ret = NULL; + + if (ret == NULL) + ret = test_strv_out (); + + return (const char * const *) ret; +} + +/** * test_array_int_full_out: * @len: length of the returned array. * Returns: (array length=len) (transfer full): a new array of integers. diff --git a/gir/everything.h b/gir/everything.h index 583ccda9..59a7a106 100644 --- a/gir/everything.h +++ b/gir/everything.h @@ -45,6 +45,7 @@ gint64 test_array_gint64_in (int n_ints, gint64 *ints); char *test_array_gtype_in (int n_types, GType *types); char **test_strv_out_container (void); char **test_strv_out (void); +const char * const * test_strv_out_c (void); void test_strv_outarg (char ***retp); /* transfer tests */ diff --git a/giscanner/annotationparser.py b/giscanner/annotationparser.py index 5458ee17..8c901a25 100644 --- a/giscanner/annotationparser.py +++ b/giscanner/annotationparser.py @@ -560,6 +560,7 @@ class AnnotationApplier(object): if (not isinstance(node, Field) and (not has_element_type and (node.direction is None + or isinstance(node, Return) or node.direction == PARAM_DIRECTION_IN))): if self._guess_array(node): has_array = True @@ -588,6 +589,7 @@ class AnnotationApplier(object): container_type = Array(node.type.ctype, element_type_name) + container_type.is_const = node.type.is_const if OPT_ARRAY_ZERO_TERMINATED in array_values: container_type.zeroterminated = array_values.get( OPT_ARRAY_ZERO_TERMINATED) == '1' @@ -724,12 +726,9 @@ class AnnotationApplier(object): if node.transfer is not None: return node.transfer - if isinstance(node.type, Array): - return PARAM_TRANSFER_NONE # Anything with 'const' gets none if node.type.is_const: return PARAM_TRANSFER_NONE - elif node.type.name in [TYPE_NONE, TYPE_ANY]: return PARAM_TRANSFER_NONE elif isinstance(node.type, Varargs): diff --git a/giscanner/transformer.py b/giscanner/transformer.py index c0846065..88cbc150 100644 --- a/giscanner/transformer.py +++ b/giscanner/transformer.py @@ -475,9 +475,9 @@ class Transformer(object): rettype.derefed_canonical = self._canonicalize_ctype(derefed_ctype) canontype = type_name_from_ctype(ctype) - if ((canontype == TYPE_STRING or - source_type.type == CTYPE_POINTER) and - source_type.base_type.type_qualifier & TYPE_QUALIFIER_CONST): + # Is it a const char * or a const gpointer? + if ((canontype == TYPE_STRING or source_type.type == CTYPE_POINTER) and + (source_type.base_type.type_qualifier & TYPE_QUALIFIER_CONST)): rettype.is_const = True return rettype diff --git a/tests/scanner/annotation-1.0-expected.gir b/tests/scanner/annotation-1.0-expected.gir index c4e0fa0d..46a30065 100644 --- a/tests/scanner/annotation-1.0-expected.gir +++ b/tests/scanner/annotation-1.0-expected.gir @@ -344,7 +344,7 @@ intentionally similar example to gtk_container_get_children"> </parameter> <parameter name="argv" direction="inout" - transfer-ownership="none" + transfer-ownership="full" doc="Argument vector"> <array length="1" c:type="char***"> <type name="utf8"/> @@ -574,7 +574,7 @@ detection, and fixing it via annotations."> </parameter> <parameter name="argv" direction="inout" - transfer-ownership="none" + transfer-ownership="full" doc="The arguments."> <array length="0" c:type="char***"> <type name="utf8"/> @@ -583,7 +583,7 @@ detection, and fixing it via annotations."> </parameters> </function> <function name="return_array" c:identifier="annotation_return_array"> - <return-value transfer-ownership="none" doc="The return value"> + <return-value transfer-ownership="full" doc="The return value"> <array length="0" c:type="char**"> <type name="utf8"/> </array> @@ -609,7 +609,7 @@ detection, and fixing it via annotations."> </function> <function name="string_zero_terminated" c:identifier="annotation_string_zero_terminated"> - <return-value transfer-ownership="none" doc="The return value"> + <return-value transfer-ownership="full" doc="The return value"> <array c:type="char**"> <type name="utf8"/> </array> @@ -621,7 +621,7 @@ detection, and fixing it via annotations."> <type name="none" c:type="void"/> </return-value> <parameters> - <parameter name="out" direction="inout" transfer-ownership="none"> + <parameter name="out" direction="inout" transfer-ownership="full"> <array c:type="char***"> <type name="utf8"/> </array> diff --git a/tests/scanner/annotation-1.0-expected.tgir b/tests/scanner/annotation-1.0-expected.tgir index 46af2ec4..0041cda5 100644 --- a/tests/scanner/annotation-1.0-expected.tgir +++ b/tests/scanner/annotation-1.0-expected.tgir @@ -254,7 +254,7 @@ <parameter name="argc" transfer-ownership="full" direction="inout"> <type name="int"/> </parameter> - <parameter name="argv" transfer-ownership="none" direction="inout"> + <parameter name="argv" transfer-ownership="full" direction="inout"> <array length="1" zero-terminated="1"> <type name="utf8"/> </array> @@ -423,7 +423,7 @@ <parameter name="argc" transfer-ownership="full" direction="inout"> <type name="int"/> </parameter> - <parameter name="argv" transfer-ownership="none" direction="inout"> + <parameter name="argv" transfer-ownership="full" direction="inout"> <array length="0" zero-terminated="1"> <type name="utf8"/> </array> @@ -431,7 +431,7 @@ </parameters> </function> <function name="return_array" c:identifier="annotation_return_array"> - <return-value transfer-ownership="none"> + <return-value transfer-ownership="full"> <array length="0" zero-terminated="1"> <type name="utf8"/> </array> @@ -453,7 +453,7 @@ </parameters> </function> <function name="string_zero_terminated" c:identifier="annotation_string_zero_terminated"> - <return-value transfer-ownership="none"> + <return-value transfer-ownership="full"> <array zero-terminated="1"> <type name="utf8"/> </array> @@ -464,7 +464,7 @@ <type name="none"/> </return-value> <parameters> - <parameter name="out" transfer-ownership="none" direction="inout"> + <parameter name="out" transfer-ownership="full" direction="inout"> <array zero-terminated="1"> <type name="utf8"/> </array> |