summaryrefslogtreecommitdiff
path: root/giscanner/transformer.py
diff options
context:
space:
mode:
authorTomasz Miąsko <tomasz.miasko@gmail.com>2018-02-09 00:00:00 +0000
committerTomasz Miąsko <tomasz.miasko@gmail.com>2018-04-28 23:06:21 +0200
commit781d94977f2c9310b15ce69952ea4a06915cd678 (patch)
tree3c0b73d3624c6ab54fa40161ab5dace334229e05 /giscanner/transformer.py
parenteb4e0fc8f9e278e81a3191f5e30610aaf4aaa762 (diff)
downloadgobject-introspection-781d94977f2c9310b15ce69952ea4a06915cd678.tar.gz
Perform array to pointer adjustment in function parameters.
A declaration of a parameter as "array of type" shall be adjusted to "qualified pointer to type". This change performs this adjustment. For example, this makes parameters of following functions equivalent: ``` void f1(const char s[]); void f2(const char s[10]); void f3(const char *s); ``` Fixes issue #189.
Diffstat (limited to 'giscanner/transformer.py')
-rw-r--r--giscanner/transformer.py31
1 files changed, 19 insertions, 12 deletions
diff --git a/giscanner/transformer.py b/giscanner/transformer.py
index 50018cd2..d9651f1a 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,