summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gir/Everything-1.0-expected.gir21
-rw-r--r--gir/everything.c21
-rw-r--r--gir/everything.h1
-rw-r--r--giscanner/annotationparser.py5
-rw-r--r--giscanner/transformer.py6
-rw-r--r--tests/scanner/annotation-1.0-expected.gir10
-rw-r--r--tests/scanner/annotation-1.0-expected.tgir10
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>