summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--giscanner/transformer.py31
-rw-r--r--tests/scanner/Regress-1.0-expected.gir2
2 files changed, 20 insertions, 13 deletions
diff --git a/giscanner/transformer.py b/giscanner/transformer.py
index 000a4a44..b7d1facc 100644
--- a/giscanner/transformer.py
+++ b/giscanner/transformer.py
@@ -456,7 +456,7 @@ raise ValueError."""
func.add_symbol_reference(symbol)
return func
- def _create_source_type(self, source_type):
+ def _create_source_type(self, source_type, is_parameter=False):
assert source_type is not None
if source_type.type == CTYPE_VOID:
value = 'void'
@@ -464,15 +464,19 @@ raise ValueError."""
value = source_type.name
elif source_type.type == CTYPE_TYPEDEF:
value = source_type.name
+ elif (source_type.type == CTYPE_POINTER or
+ # Array to pointer adjustment as per 6.7.6.3.
+ # This is performed only on the outermost array,
+ # so we don't forward is_parameter.
+ (source_type.type == CTYPE_ARRAY and is_parameter)):
+ value = self._create_source_type(source_type.base_type) + '*'
elif source_type.type == CTYPE_ARRAY:
return self._create_source_type(source_type.base_type)
- elif source_type.type == CTYPE_POINTER:
- value = self._create_source_type(source_type.base_type) + '*'
else:
value = 'gpointer'
return value
- def _create_complete_source_type(self, source_type):
+ def _create_complete_source_type(self, source_type, is_parameter=False):
assert source_type is not None
const = (source_type.type_qualifier & TYPE_QUALIFIER_CONST)
@@ -492,16 +496,21 @@ raise ValueError."""
value = 'const ' + value
if volatile:
value = 'volatile ' + value
- elif source_type.type == CTYPE_ARRAY:
- return self._create_complete_source_type(source_type.base_type)
- elif source_type.type == CTYPE_POINTER:
+ return value
+ elif (source_type.type == CTYPE_POINTER or
+ # Array to pointer adjustment as per 6.7.6.3.
+ # This is performed only on the outermost array,
+ # so we don't forward is_parameter.
+ (source_type.type == CTYPE_ARRAY and is_parameter)):
value = self._create_complete_source_type(source_type.base_type) + '*'
# TODO: handle pointer to function as a special case?
if const:
value += ' const'
if volatile:
value += ' volatile'
-
+ return value
+ elif source_type.type == CTYPE_ARRAY:
+ return self._create_complete_source_type(source_type.base_type)
else:
if const:
value = 'gconstpointer'
@@ -511,8 +520,6 @@ raise ValueError."""
value = 'volatile ' + value
return value
- return value
-
def _create_parameters(self, symbol, base_type):
for i, child in enumerate(base_type.child_list):
yield self._create_parameter(symbol, i, child)
@@ -652,8 +659,8 @@ raise ValueError."""
return canonical
def _create_type_from_base(self, source_type, is_parameter=False, is_return=False):
- ctype = self._create_source_type(source_type)
- complete_ctype = self._create_complete_source_type(source_type)
+ ctype = self._create_source_type(source_type, is_parameter=is_parameter)
+ complete_ctype = self._create_complete_source_type(source_type, is_parameter=is_parameter)
const = ((source_type.type == CTYPE_POINTER) and
(source_type.base_type.type_qualifier & TYPE_QUALIFIER_CONST))
return self.create_type_from_ctype_string(ctype, is_const=const,
diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir
index 28a78ba3..5e859ad0 100644
--- a/tests/scanner/Regress-1.0-expected.gir
+++ b/tests/scanner/Regress-1.0-expected.gir
@@ -4536,7 +4536,7 @@ detection, and fixing it via annotations.</doc>
<type name="guint" c:type="guint"/>
</parameter>
<parameter name="properties" transfer-ownership="none">
- <array length="0" zero-terminated="0" c:type="gchar*">
+ <array length="0" zero-terminated="0" c:type="gchar**">
<type name="utf8"/>
</array>
</parameter>