gobject-introspection 3.0.7-x86-mingw32 → 3.0.8-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +2 -2
- data/ext/gobject-introspection/extconf.rb +1 -0
- data/ext/gobject-introspection/rb-gi-argument.c +123 -26
- data/ext/gobject-introspection/rb-gi-function-info.c +558 -19
- data/ext/gobject-introspection/rb-gi-repository.c +9 -0
- data/ext/gobject-introspection/rb-gobject-introspection.h +3 -0
- data/lib/2.2/gobject_introspection.so +0 -0
- data/lib/2.3/gobject_introspection.so +0 -0
- data/lib/gobject-introspection/loader.rb +1 -1
- data/vendor/local/bin/g-ir-compiler.exe +0 -0
- data/vendor/local/bin/g-ir-generate.exe +0 -0
- data/vendor/local/bin/libgirepository-1.0-1.dll +0 -0
- data/vendor/local/include/gobject-introspection-1.0/gistructinfo.h +4 -0
- data/vendor/local/lib/girepository-1.0/GIRepository-2.0.typelib +0 -0
- data/vendor/local/lib/girepository-1.0/GLib-2.0.typelib +0 -0
- data/vendor/local/lib/girepository-1.0/GModule-2.0.typelib +0 -0
- data/vendor/local/lib/girepository-1.0/GObject-2.0.typelib +0 -0
- data/vendor/local/lib/girepository-1.0/Gio-2.0.typelib +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/__init__.py +1 -1
- data/vendor/local/lib/gobject-introspection/giscanner/__init__.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/__init__.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.py +39 -11
- data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.py +187 -164
- data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/ast.py +191 -58
- data/vendor/local/lib/gobject-introspection/giscanner/ast.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/ast.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/cachestore.py +42 -54
- data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.py +272 -82
- data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/codegen.py +18 -11
- data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.py +4 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.py +25 -13
- data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/docmain.py +21 -19
- data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/docwriter.py +19 -16
- data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/dumper.py +148 -158
- data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.py +31 -21
- data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/girparser.py +13 -5
- data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/girwriter.py +12 -13
- data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.py +5 -1
- data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.py +11 -9
- data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.py +150 -45
- data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/message.py +56 -19
- data/vendor/local/lib/gobject-introspection/giscanner/message.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/message.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/msvccompiler.py +101 -0
- data/vendor/local/lib/gobject-introspection/giscanner/msvccompiler.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/msvccompiler.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/scannermain.py +41 -22
- data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.py +6 -1
- data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/shlibs.py +8 -2
- data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.py +42 -56
- data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.py +19 -5
- data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/transformer.py +73 -37
- data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/utils.py +92 -14
- data/vendor/local/lib/gobject-introspection/giscanner/utils.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/utils.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.py +30 -11
- data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyo +0 -0
- data/vendor/local/lib/libgirepository-1.0.a +0 -0
- data/vendor/local/lib/libgirepository-1.0.dll.a +0 -0
- data/vendor/local/lib/libgirepository-1.0.la +1 -1
- data/vendor/local/lib/pkgconfig/gobject-introspection-1.0.pc +1 -1
- data/vendor/local/lib/pkgconfig/gobject-introspection-no-export-1.0.pc +1 -1
- data/vendor/local/share/gir-1.0/GIRepository-2.0.gir +57 -13
- data/vendor/local/share/gir-1.0/GLib-2.0.gir +2018 -894
- data/vendor/local/share/gir-1.0/GModule-2.0.gir +2 -1
- data/vendor/local/share/gir-1.0/GObject-2.0.gir +1107 -674
- data/vendor/local/share/gir-1.0/Gio-2.0.gir +5589 -1287
- data/vendor/local/share/gobject-introspection-1.0/Makefile.introspection +4 -2
- data/vendor/local/share/gobject-introspection-1.0/gdump.c +8 -0
- data/vendor/local/share/gobject-introspection-1.0/tests/everything.c +273 -323
- data/vendor/local/share/gobject-introspection-1.0/tests/everything.h +58 -38
- data/vendor/local/share/gobject-introspection-1.0/tests/gimarshallingtests.c +1 -1
- data/vendor/local/share/gobject-introspection-1.0/tests/regress.c +177 -23
- data/vendor/local/share/gobject-introspection-1.0/tests/regress.h +40 -0
- data/vendor/local/share/man/man1/g-ir-compiler.1 +7 -7
- metadata +9 -7
- data/lib/2.0/gobject_introspection.so +0 -0
- data/lib/2.1/gobject_introspection.so +0 -0
Binary file
|
Binary file
|
@@ -18,6 +18,11 @@
|
|
18
18
|
# Boston, MA 02111-1307, USA.
|
19
19
|
#
|
20
20
|
|
21
|
+
from __future__ import absolute_import
|
22
|
+
from __future__ import division
|
23
|
+
from __future__ import print_function
|
24
|
+
from __future__ import unicode_literals
|
25
|
+
|
21
26
|
import os
|
22
27
|
import sys
|
23
28
|
import tempfile
|
@@ -84,12 +89,12 @@ class GDumpParser(object):
|
|
84
89
|
"""
|
85
90
|
|
86
91
|
# First pass: parsing
|
87
|
-
for node in self._namespace.
|
92
|
+
for node in self._namespace.values():
|
88
93
|
if isinstance(node, ast.Function):
|
89
94
|
self._initparse_function(node)
|
90
95
|
|
91
96
|
if self._namespace.name == 'GObject' or self._namespace.name == 'GLib':
|
92
|
-
for node in self._namespace.
|
97
|
+
for node in self._namespace.values():
|
93
98
|
if isinstance(node, ast.Record):
|
94
99
|
self._initparse_gobject_record(node)
|
95
100
|
|
@@ -116,16 +121,16 @@ class GDumpParser(object):
|
|
116
121
|
self._introspect_type(child)
|
117
122
|
|
118
123
|
# Pair up boxed types and class records
|
119
|
-
for name, boxed in self._boxed_types.
|
124
|
+
for name, boxed in self._boxed_types.items():
|
120
125
|
self._pair_boxed_type(boxed)
|
121
|
-
for node in self._namespace.
|
126
|
+
for node in self._namespace.values():
|
122
127
|
if isinstance(node, (ast.Class, ast.Interface)):
|
123
128
|
self._find_class_record(node)
|
124
129
|
|
125
130
|
# Clear the _get_type functions out of the namespace;
|
126
131
|
# Anyone who wants them can get them from the ast.Class/Interface/Boxed
|
127
132
|
to_remove = []
|
128
|
-
for name, node in self._namespace.
|
133
|
+
for name, node in self._namespace.items():
|
129
134
|
if isinstance(node, ast.Registered) and node.get_type is not None:
|
130
135
|
get_type_name = node.get_type
|
131
136
|
if get_type_name == 'intern':
|
@@ -145,19 +150,24 @@ class GDumpParser(object):
|
|
145
150
|
"""Load the library (or executable), returning an XML
|
146
151
|
blob containing data gleaned from GObject's primitive introspection."""
|
147
152
|
in_path = os.path.join(self._binary.tmpdir, 'functions.txt')
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
f.close()
|
153
|
+
with open(in_path, 'w') as f:
|
154
|
+
for func in self._get_type_functions:
|
155
|
+
f.write('get-type:')
|
156
|
+
f.write(func)
|
157
|
+
f.write('\n')
|
158
|
+
for func in self._error_quark_functions:
|
159
|
+
f.write('error-quark:')
|
160
|
+
f.write(func)
|
161
|
+
f.write('\n')
|
158
162
|
out_path = os.path.join(self._binary.tmpdir, 'dump.xml')
|
159
163
|
|
160
164
|
args = []
|
165
|
+
|
166
|
+
# Prepend the launcher command and arguments, if defined
|
167
|
+
launcher = os.environ.get('GI_CROSS_LAUNCHER')
|
168
|
+
if launcher:
|
169
|
+
args.extend(launcher.split())
|
170
|
+
|
161
171
|
args.extend(self._binary.args)
|
162
172
|
args.append('--introspect-dump=%s,%s' % (in_path, out_path))
|
163
173
|
|
@@ -203,7 +213,7 @@ blob containing data gleaned from GObject's primitive introspection."""
|
|
203
213
|
|
204
214
|
def _initparse_gobject_record(self, record):
|
205
215
|
if (record.name.startswith('ParamSpec')
|
206
|
-
and
|
216
|
+
and record.name not in ('ParamSpecPool', 'ParamSpecClass', 'ParamSpecTypeInfo')):
|
207
217
|
parent = None
|
208
218
|
if record.name != 'ParamSpec':
|
209
219
|
parent = ast.Type(target_giname='GObject.ParamSpec')
|
@@ -297,7 +307,7 @@ blob containing data gleaned from GObject's primitive introspection."""
|
|
297
307
|
(ns, name) = self._transformer.split_csymbol(get_type)
|
298
308
|
assert ns is self._namespace
|
299
309
|
if name in ('get_type', '_get_gtype'):
|
300
|
-
message.fatal("""The GObject name %
|
310
|
+
message.fatal("""The GObject name '%s' isn't compatible
|
301
311
|
with the configured identifier prefixes:
|
302
312
|
%r
|
303
313
|
The class would have no name. Most likely you want to specify a
|
@@ -350,7 +360,7 @@ different --identifier-prefix.""" % (xmlnode.attrib['name'], self._namespace.ide
|
|
350
360
|
if isinstance(record, ast.Record):
|
351
361
|
node.ctype = record.ctype
|
352
362
|
else:
|
353
|
-
message.warn_node(node, "Couldn't find associated structure for '%
|
363
|
+
message.warn_node(node, "Couldn't find associated structure for '%s'" % (node.name, ))
|
354
364
|
|
355
365
|
# GtkFileChooserEmbed is an example of a private interface, we
|
356
366
|
# just filter them out
|
@@ -359,7 +369,7 @@ different --identifier-prefix.""" % (xmlnode.attrib['name'], self._namespace.ide
|
|
359
369
|
else:
|
360
370
|
self._namespace.append(node, replace=True)
|
361
371
|
|
362
|
-
|
372
|
+
# WORKAROUND
|
363
373
|
# https://bugzilla.gnome.org/show_bug.cgi?id=550616
|
364
374
|
def _introspect_boxed_gstreamer_workaround(self, xmlnode):
|
365
375
|
node = ast.Boxed('ParamSpecMiniObject', gtype_name='GParamSpecMiniObject',
|
@@ -439,8 +449,8 @@ different --identifier-prefix.""" % (xmlnode.attrib['name'], self._namespace.ide
|
|
439
449
|
def _parse_parents(self, xmlnode, node):
|
440
450
|
parents_str = xmlnode.attrib.get('parents', '')
|
441
451
|
if parents_str != '':
|
442
|
-
parent_types = map(lambda s: ast.Type.create_from_gtype_name(s),
|
443
|
-
|
452
|
+
parent_types = list(map(lambda s: ast.Type.create_from_gtype_name(s),
|
453
|
+
parents_str.split(',')))
|
444
454
|
else:
|
445
455
|
parent_types = []
|
446
456
|
node.parent_chain = parent_types
|
Binary file
|
Binary file
|
@@ -18,6 +18,11 @@
|
|
18
18
|
# Boston, MA 02111-1307, USA.
|
19
19
|
#
|
20
20
|
|
21
|
+
from __future__ import absolute_import
|
22
|
+
from __future__ import division
|
23
|
+
from __future__ import print_function
|
24
|
+
from __future__ import unicode_literals
|
25
|
+
|
21
26
|
import os
|
22
27
|
|
23
28
|
from xml.etree.cElementTree import parse
|
@@ -313,7 +318,7 @@ class GIRParser(object):
|
|
313
318
|
raise ValueError('node %r has no return-value' % (name, ))
|
314
319
|
transfer = returnnode.attrib.get('transfer-ownership')
|
315
320
|
nullable = returnnode.attrib.get('nullable') == '1'
|
316
|
-
retval = ast.Return(self._parse_type(returnnode), nullable, transfer)
|
321
|
+
retval = ast.Return(self._parse_type(returnnode), nullable, False, transfer)
|
317
322
|
self._parse_generic_attribs(returnnode, retval)
|
318
323
|
parameters = []
|
319
324
|
|
@@ -366,6 +371,9 @@ class GIRParser(object):
|
|
366
371
|
|
367
372
|
self._parse_type_array_length(parameters, returnnode, retval.type)
|
368
373
|
|
374
|
+
# Re-set the function's parameters to notify it of changes to the list.
|
375
|
+
func.parameters = parameters
|
376
|
+
|
369
377
|
self._parse_generic_attribs(node, func)
|
370
378
|
|
371
379
|
self._namespace.track(func)
|
@@ -455,8 +463,8 @@ class GIRParser(object):
|
|
455
463
|
return ast.Type(ctype=ctype)
|
456
464
|
elif name in ['GLib.List', 'GLib.SList']:
|
457
465
|
subchild = self._find_first_child(typenode,
|
458
|
-
map(_corens, ('callback', 'array',
|
459
|
-
'varargs', 'type')))
|
466
|
+
list(map(_corens, ('callback', 'array',
|
467
|
+
' varargs', 'type'))))
|
460
468
|
if subchild is not None:
|
461
469
|
element_type = self._parse_type(typenode)
|
462
470
|
else:
|
@@ -464,7 +472,7 @@ class GIRParser(object):
|
|
464
472
|
return ast.List(name, element_type, ctype=ctype)
|
465
473
|
elif name == 'GLib.HashTable':
|
466
474
|
subchildren = self._find_children(typenode, _corens('type'))
|
467
|
-
subchildren_types = map(self._parse_type_simple, subchildren)
|
475
|
+
subchildren_types = list(map(self._parse_type_simple, subchildren))
|
468
476
|
while len(subchildren_types) < 2:
|
469
477
|
subchildren_types.append(ast.TYPE_ANY)
|
470
478
|
return ast.Map(subchildren_types[0], subchildren_types[1], ctype=ctype)
|
@@ -489,7 +497,7 @@ class GIRParser(object):
|
|
489
497
|
lenidx = typenode.attrib.get('length')
|
490
498
|
if lenidx is not None:
|
491
499
|
idx = int(lenidx)
|
492
|
-
assert idx < len(siblings), "%r %d >= %d" % (
|
500
|
+
assert idx < len(siblings), "%r %d >= %d" % (siblings, idx, len(siblings))
|
493
501
|
if isinstance(siblings[idx], ast.Field):
|
494
502
|
typeval.length_param_name = siblings[idx].name
|
495
503
|
else:
|
Binary file
|
Binary file
|
@@ -20,6 +20,10 @@
|
|
20
20
|
#
|
21
21
|
|
22
22
|
from __future__ import with_statement
|
23
|
+
from __future__ import absolute_import
|
24
|
+
from __future__ import division
|
25
|
+
from __future__ import print_function
|
26
|
+
from __future__ import unicode_literals
|
23
27
|
|
24
28
|
from . import ast
|
25
29
|
from .xmlwriter import XMLWriter
|
@@ -78,17 +82,12 @@ class GIRWriter(XMLWriter):
|
|
78
82
|
# We define a custom sorting function here because
|
79
83
|
# we want aliases to be first. They're a bit
|
80
84
|
# special because the typelib compiler expands them.
|
81
|
-
def nscmp(
|
82
|
-
if isinstance(
|
83
|
-
|
84
|
-
return cmp(a.name, b.name)
|
85
|
-
else:
|
86
|
-
return -1
|
87
|
-
elif isinstance(b, ast.Alias):
|
88
|
-
return 1
|
85
|
+
def nscmp(val):
|
86
|
+
if isinstance(val, ast.Alias):
|
87
|
+
return 0, val
|
89
88
|
else:
|
90
|
-
return
|
91
|
-
for node in sorted(namespace.
|
89
|
+
return 1, val
|
90
|
+
for node in sorted(namespace.values(), key=nscmp):
|
92
91
|
self._write_node(node)
|
93
92
|
|
94
93
|
def _write_node(self, node):
|
@@ -116,7 +115,7 @@ class GIRWriter(XMLWriter):
|
|
116
115
|
elif isinstance(node, ast.Constant):
|
117
116
|
self._write_constant(node)
|
118
117
|
else:
|
119
|
-
print
|
118
|
+
print('WRITER: Unhandled node', node)
|
120
119
|
|
121
120
|
def _append_version(self, node, attrs):
|
122
121
|
if node.version:
|
@@ -215,7 +214,7 @@ class GIRWriter(XMLWriter):
|
|
215
214
|
attrs.append(('transfer-ownership', return_.transfer))
|
216
215
|
if return_.skip:
|
217
216
|
attrs.append(('skip', '1'))
|
218
|
-
if return_.nullable:
|
217
|
+
if return_.nullable and not return_.not_nullable:
|
219
218
|
attrs.append(('nullable', '1'))
|
220
219
|
with self.tagcontext('return-value', attrs):
|
221
220
|
self._write_generic(return_)
|
@@ -241,7 +240,7 @@ class GIRWriter(XMLWriter):
|
|
241
240
|
if parameter.transfer:
|
242
241
|
attrs.append(('transfer-ownership',
|
243
242
|
parameter.transfer))
|
244
|
-
if parameter.nullable:
|
243
|
+
if parameter.nullable and not parameter.not_nullable:
|
245
244
|
attrs.append(('nullable', '1'))
|
246
245
|
if parameter.direction != ast.PARAM_DIRECTION_OUT:
|
247
246
|
attrs.append(('allow-none', '1'))
|
Binary file
|
Binary file
|
@@ -16,6 +16,10 @@
|
|
16
16
|
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
17
17
|
# Boston, MA 02111-1307, USA.
|
18
18
|
#
|
19
|
+
from __future__ import absolute_import
|
20
|
+
from __future__ import division
|
21
|
+
from __future__ import print_function
|
22
|
+
from __future__ import unicode_literals
|
19
23
|
|
20
24
|
from . import ast
|
21
25
|
from . import message
|
@@ -96,7 +100,7 @@ class IntrospectablePass(object):
|
|
96
100
|
|
97
101
|
if (is_parameter
|
98
102
|
and isinstance(target, ast.Callback)
|
99
|
-
and
|
103
|
+
and node.type.target_giname not in ('GLib.DestroyNotify', 'Gio.AsyncReadyCallback')
|
100
104
|
and node.scope is None):
|
101
105
|
self._parameter_warning(
|
102
106
|
parent,
|
Binary file
|
Binary file
|
@@ -18,9 +18,13 @@
|
|
18
18
|
# Boston, MA 02111-1307, USA.
|
19
19
|
#
|
20
20
|
|
21
|
+
from __future__ import absolute_import
|
22
|
+
from __future__ import division
|
23
|
+
from __future__ import print_function
|
24
|
+
from __future__ import unicode_literals
|
25
|
+
|
21
26
|
import imp
|
22
27
|
import os
|
23
|
-
import platform
|
24
28
|
import sys
|
25
29
|
|
26
30
|
from .utils import extract_libtool
|
@@ -54,16 +58,14 @@ class LibtoolImporter(object):
|
|
54
58
|
|
55
59
|
def load_module(self, name):
|
56
60
|
realpath = extract_libtool(self.path)
|
57
|
-
platform_system = platform.system()
|
58
61
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
extension = '.so'
|
62
|
+
# The first item of the suffix tuple (which can be, depending on platform,
|
63
|
+
# one or more valid filename extensions used to name c extension modules)
|
64
|
+
# is ignored by imp.load_module(). Thus, there is no use in pretending it
|
65
|
+
# is important and we set it to an empty string.
|
66
|
+
suffix = ('', 'rb', imp.C_EXTENSION)
|
65
67
|
|
66
|
-
mod = imp.load_module(name, open(realpath), realpath,
|
68
|
+
mod = imp.load_module(name, open(realpath), realpath, suffix)
|
67
69
|
mod.__loader__ = self
|
68
70
|
return mod
|
69
71
|
|
Binary file
|
Binary file
|
@@ -17,6 +17,11 @@
|
|
17
17
|
# Boston, MA 02111-1307, USA.
|
18
18
|
#
|
19
19
|
|
20
|
+
from __future__ import absolute_import
|
21
|
+
from __future__ import division
|
22
|
+
from __future__ import print_function
|
23
|
+
from __future__ import unicode_literals
|
24
|
+
|
20
25
|
import re
|
21
26
|
|
22
27
|
from . import ast
|
@@ -27,10 +32,11 @@ from .annotationparser import (ANN_ALLOW_NONE, ANN_ARRAY, ANN_ATTRIBUTES, ANN_CL
|
|
27
32
|
ANN_GET_VALUE_FUNC, ANN_IN, ANN_INOUT, ANN_METHOD, ANN_OUT,
|
28
33
|
ANN_REF_FUNC, ANN_RENAME_TO, ANN_SCOPE, ANN_SET_VALUE_FUNC,
|
29
34
|
ANN_SKIP, ANN_TRANSFER, ANN_TYPE, ANN_UNREF_FUNC, ANN_VALUE,
|
30
|
-
ANN_VFUNC, ANN_NULLABLE, ANN_OPTIONAL)
|
35
|
+
ANN_VFUNC, ANN_NULLABLE, ANN_OPTIONAL, ANN_NOT)
|
31
36
|
from .annotationparser import (OPT_ARRAY_FIXED_SIZE, OPT_ARRAY_LENGTH, OPT_ARRAY_ZERO_TERMINATED,
|
32
37
|
OPT_OUT_CALLEE_ALLOCATES, OPT_OUT_CALLER_ALLOCATES,
|
33
|
-
OPT_TRANSFER_FLOATING, OPT_TRANSFER_NONE
|
38
|
+
OPT_TRANSFER_CONTAINER, OPT_TRANSFER_FLOATING, OPT_TRANSFER_NONE,
|
39
|
+
OPT_NOT_NULLABLE)
|
34
40
|
|
35
41
|
from .utils import to_underscores_noprefix
|
36
42
|
|
@@ -74,14 +80,14 @@ class MainTransformer(object):
|
|
74
80
|
self._namespace.walk(self._pass_type_resolution)
|
75
81
|
|
76
82
|
# Generate a reverse mapping "bar_baz" -> BarBaz
|
77
|
-
for node in self._namespace.
|
83
|
+
for node in self._namespace.values():
|
78
84
|
if isinstance(node, ast.Registered) and node.get_type is not None:
|
79
85
|
self._uscore_type_names[node.c_symbol_prefix] = node
|
80
86
|
elif isinstance(node, (ast.Record, ast.Union)):
|
81
87
|
uscored = to_underscores_noprefix(node.name).lower()
|
82
88
|
self._uscore_type_names[uscored] = node
|
83
89
|
|
84
|
-
for node in list(self._namespace.
|
90
|
+
for node in list(self._namespace.values()):
|
85
91
|
if isinstance(node, ast.Function):
|
86
92
|
# Discover which toplevel functions are actually methods
|
87
93
|
self._pair_function(node)
|
@@ -126,7 +132,7 @@ class MainTransformer(object):
|
|
126
132
|
origin_name = 'return value'
|
127
133
|
message.log_node(
|
128
134
|
message.FATAL, parent,
|
129
|
-
"can't find parameter %s referenced by %s of %
|
135
|
+
"can't find parameter %s referenced by %s of '%s'"
|
130
136
|
% (param_name, origin_name, parent.name))
|
131
137
|
|
132
138
|
return param.argname
|
@@ -140,7 +146,7 @@ class MainTransformer(object):
|
|
140
146
|
origin_name = 'field %s' % (origin.name, )
|
141
147
|
message.log_node(
|
142
148
|
message.FATAL, parent,
|
143
|
-
"can't find field %s referenced by %s of %
|
149
|
+
"can't find field %s referenced by %s of '%s'"
|
144
150
|
% (field_name, origin_name, parent.name))
|
145
151
|
|
146
152
|
return field.name
|
@@ -155,17 +161,17 @@ class MainTransformer(object):
|
|
155
161
|
target = self._namespace.get_by_symbol(rename_to)
|
156
162
|
if not target:
|
157
163
|
message.warn_node(node,
|
158
|
-
"Can't find symbol %
|
164
|
+
"Can't find symbol '%s' referenced by \"rename-to\" annotation" % (rename_to, ))
|
159
165
|
elif target.shadowed_by:
|
160
166
|
message.warn_node(node,
|
161
|
-
"Function %
|
162
|
-
"with %
|
167
|
+
"Function '%s' already shadowed by '%s', can't overwrite "
|
168
|
+
"with '%s'" % (target.symbol,
|
163
169
|
target.shadowed_by,
|
164
170
|
rename_to))
|
165
171
|
elif target.shadows:
|
166
172
|
message.warn_node(node,
|
167
|
-
"Function %
|
168
|
-
"with %
|
173
|
+
"Function '%s' already shadows '%s', can't multiply shadow "
|
174
|
+
"with '%s'" % (target.symbol,
|
169
175
|
target.shadows,
|
170
176
|
rename_to))
|
171
177
|
else:
|
@@ -203,7 +209,7 @@ class MainTransformer(object):
|
|
203
209
|
elif isinstance(node, ast.Registered) and node.gtype_name is not None:
|
204
210
|
return node.gtype_name
|
205
211
|
return node.c_name
|
206
|
-
raise AssertionError("Unhandled node %
|
212
|
+
raise AssertionError("Unhandled node '%s'" % (node, ))
|
207
213
|
|
208
214
|
def _get_block(self, node):
|
209
215
|
return self._blocks.get(self._get_annotation_name(node))
|
@@ -293,7 +299,7 @@ class MainTransformer(object):
|
|
293
299
|
elif isinstance(base, ast.Map) and len(rest) == 2:
|
294
300
|
return ast.Map(*rest)
|
295
301
|
message.warn(
|
296
|
-
"Too many parameters in type specification %
|
302
|
+
"Too many parameters in type specification '%s'" % (type_str, ))
|
297
303
|
return base
|
298
304
|
|
299
305
|
def top_combiner(base, *rest):
|
@@ -303,7 +309,7 @@ class MainTransformer(object):
|
|
303
309
|
|
304
310
|
result, rest = grab_one(type_str, resolver, top_combiner, combiner)
|
305
311
|
if rest:
|
306
|
-
message.warn("Trailing components in type specification %
|
312
|
+
message.warn("Trailing components in type specification '%s'" % (
|
307
313
|
type_str, ))
|
308
314
|
|
309
315
|
if not result.resolved:
|
@@ -313,7 +319,7 @@ class MainTransformer(object):
|
|
313
319
|
position = self._get_position(parent, node)
|
314
320
|
else:
|
315
321
|
text = type_str
|
316
|
-
message.warn_node(parent, "%s: Unknown type: %
|
322
|
+
message.warn_node(parent, "%s: Unknown type: '%s'" %
|
317
323
|
(text, type_str), positions=position)
|
318
324
|
return result
|
319
325
|
|
@@ -349,7 +355,7 @@ class MainTransformer(object):
|
|
349
355
|
# (except enums and flags) or basic types that are
|
350
356
|
# as big as a gpointer
|
351
357
|
if array_type == ast.Array.GLIB_PTRARRAY:
|
352
|
-
if ((element_type in ast.BASIC_GIR_TYPES and not
|
358
|
+
if ((element_type in ast.BASIC_GIR_TYPES and element_type not in ast.POINTER_TYPES)
|
353
359
|
or isinstance(element_type, (ast.Enum, ast.Bitfield))):
|
354
360
|
message.warn("invalid (element-type) for a GPtrArray, "
|
355
361
|
"must be a pointer", annotations.position)
|
@@ -358,7 +364,7 @@ class MainTransformer(object):
|
|
358
364
|
if array_type == ast.Array.GLIB_BYTEARRAY:
|
359
365
|
if element_type == ast.TYPE_ANY:
|
360
366
|
array.element_type = ast.TYPE_UINT8
|
361
|
-
elif not
|
367
|
+
elif element_type not in [ast.TYPE_UINT8, ast.TYPE_INT8, ast.TYPE_CHAR]:
|
362
368
|
message.warn("invalid (element-type) for a GByteArray, "
|
363
369
|
"must be one of guint8, gint8 or gchar",
|
364
370
|
annotations.position)
|
@@ -467,7 +473,7 @@ class MainTransformer(object):
|
|
467
473
|
def _get_transfer_default_returntype_basic(self, typeval):
|
468
474
|
if (typeval.is_equiv(ast.BASIC_GIR_TYPES)
|
469
475
|
or typeval.is_const
|
470
|
-
or typeval.is_equiv(ast.TYPE_NONE)):
|
476
|
+
or typeval.is_equiv((ast.TYPE_ANY, ast.TYPE_NONE))):
|
471
477
|
return ast.PARAM_TRANSFER_NONE
|
472
478
|
elif typeval.is_equiv(ast.TYPE_STRING):
|
473
479
|
# Non-const strings default to FULL
|
@@ -508,7 +514,11 @@ class MainTransformer(object):
|
|
508
514
|
elif isinstance(parent, ast.Function) and parent.is_constructor:
|
509
515
|
if isinstance(target, ast.Class):
|
510
516
|
initially_unowned_type = ast.Type(target_giname='GObject.InitiallyUnowned')
|
511
|
-
|
517
|
+
try:
|
518
|
+
initially_unowned = self._transformer.lookup_typenode(initially_unowned_type)
|
519
|
+
except KeyError as e:
|
520
|
+
message.error_node(node, "constructor found but GObject is not in includes")
|
521
|
+
return None
|
512
522
|
if initially_unowned and self._is_gi_subclass(typeval, initially_unowned_type):
|
513
523
|
return ast.PARAM_TRANSFER_NONE
|
514
524
|
else:
|
@@ -537,6 +547,63 @@ class MainTransformer(object):
|
|
537
547
|
else:
|
538
548
|
raise AssertionError(node)
|
539
549
|
|
550
|
+
def _is_pointer_type(self, node, annotations):
|
551
|
+
if (not isinstance(node, ast.Return) and
|
552
|
+
node.direction in (ast.PARAM_DIRECTION_OUT,
|
553
|
+
ast.PARAM_DIRECTION_INOUT)):
|
554
|
+
return True
|
555
|
+
|
556
|
+
target = self._transformer.lookup_typenode(node.type)
|
557
|
+
target = self._transformer.resolve_aliases(target)
|
558
|
+
target = node.type if target is None else target
|
559
|
+
|
560
|
+
return (not isinstance(target, ast.Type) or
|
561
|
+
target not in ast.BASIC_TYPES or
|
562
|
+
target.ctype.endswith('*'))
|
563
|
+
|
564
|
+
def _apply_transfer_annotation(self, parent, node, annotations):
|
565
|
+
transfer_annotation = annotations.get(ANN_TRANSFER)
|
566
|
+
if not transfer_annotation or len(transfer_annotation) != 1:
|
567
|
+
return
|
568
|
+
|
569
|
+
transfer = transfer_annotation[0]
|
570
|
+
|
571
|
+
target = self._transformer.lookup_typenode(node.type)
|
572
|
+
target = self._transformer.resolve_aliases(target)
|
573
|
+
target = node.type if target is None else target
|
574
|
+
node_type = target if isinstance(target, ast.Type) else node.type
|
575
|
+
|
576
|
+
if transfer == OPT_TRANSFER_FLOATING:
|
577
|
+
transfer = OPT_TRANSFER_NONE
|
578
|
+
|
579
|
+
if (not isinstance(target, (ast.Class, ast.Interface))
|
580
|
+
and node_type.target_giname != 'GLib.Variant'):
|
581
|
+
message.warn('invalid "transfer" annotation for {0}: '
|
582
|
+
'only valid for object and GVariant types'.format(target),
|
583
|
+
annotations.position)
|
584
|
+
return
|
585
|
+
|
586
|
+
elif transfer == OPT_TRANSFER_CONTAINER:
|
587
|
+
if (ANN_ARRAY not in annotations and
|
588
|
+
not isinstance(target, (ast.Array, ast.List, ast.Map))):
|
589
|
+
message.warn('invalid "transfer" annotation for {0}: '
|
590
|
+
'only valid for container types'.format(target),
|
591
|
+
annotations.position)
|
592
|
+
return
|
593
|
+
|
594
|
+
elif (not self._is_pointer_type(node, annotations) and
|
595
|
+
node_type not in (ast.TYPE_STRING, ast.TYPE_FILENAME) and
|
596
|
+
not isinstance(target, (ast.Array, ast.List, ast.Map,
|
597
|
+
ast.Record, ast.Compound, ast.Boxed,
|
598
|
+
ast.Class, ast.Interface))):
|
599
|
+
message.warn('invalid "transfer" annotation for {0}: '
|
600
|
+
'only valid for array, struct, union, boxed, '
|
601
|
+
'object and interface types'.format(target),
|
602
|
+
annotations.position)
|
603
|
+
return
|
604
|
+
|
605
|
+
node.transfer = transfer
|
606
|
+
|
540
607
|
def _apply_annotations_param_ret_common(self, parent, node, tag):
|
541
608
|
annotations = tag.annotations if tag else {}
|
542
609
|
|
@@ -577,32 +644,55 @@ class MainTransformer(object):
|
|
577
644
|
# Also reset the transfer default if we're toggling direction
|
578
645
|
node.transfer = self._get_transfer_default(parent, node)
|
579
646
|
|
580
|
-
|
581
|
-
if transfer_annotation and len(transfer_annotation) == 1:
|
582
|
-
transfer = transfer_annotation[0]
|
583
|
-
if transfer == OPT_TRANSFER_FLOATING:
|
584
|
-
transfer = OPT_TRANSFER_NONE
|
585
|
-
node.transfer = transfer
|
586
|
-
|
647
|
+
self._apply_transfer_annotation(parent, node, annotations)
|
587
648
|
self._adjust_container_type(parent, node, annotations)
|
588
649
|
|
589
|
-
|
650
|
+
# gpointer parameters and return values are always nullable unless:
|
651
|
+
# - annotated with (type) and not also with (nullable); or
|
652
|
+
# - annotated with (element-type) and not also with (nullable); or
|
653
|
+
# - annotated (not nullable)
|
654
|
+
# See: https://bugzilla.gnome.org/show_bug.cgi?id=719966#c22
|
655
|
+
if node.type.is_equiv(ast.TYPE_ANY):
|
590
656
|
node.nullable = True
|
657
|
+
if ANN_NULLABLE in annotations:
|
658
|
+
if self._is_pointer_type(node, annotations):
|
659
|
+
node.nullable = True
|
660
|
+
node.not_nullable = False
|
661
|
+
else:
|
662
|
+
message.warn('invalid "nullable" annotation: '
|
663
|
+
'only valid for pointer types and out parameters',
|
664
|
+
annotations.position)
|
591
665
|
|
592
666
|
if ANN_OPTIONAL in annotations:
|
593
|
-
node.
|
667
|
+
if (not isinstance(node, ast.Return) and
|
668
|
+
node.direction == ast.PARAM_DIRECTION_OUT):
|
669
|
+
node.optional = True
|
670
|
+
else:
|
671
|
+
message.warn('invalid "optional" annotation: '
|
672
|
+
'only valid for out parameters',
|
673
|
+
annotations.position)
|
594
674
|
|
595
675
|
if ANN_ALLOW_NONE in annotations:
|
596
|
-
if node.direction == ast.PARAM_DIRECTION_OUT
|
676
|
+
if (node.direction == ast.PARAM_DIRECTION_OUT and
|
677
|
+
not isinstance(node, ast.Return)):
|
597
678
|
node.optional = True
|
598
|
-
|
679
|
+
elif self._is_pointer_type(node, annotations):
|
599
680
|
node.nullable = True
|
681
|
+
else:
|
682
|
+
message.warn('invalid "allow-none" annotation: '
|
683
|
+
'only valid for pointer types and out parameters',
|
684
|
+
annotations.position)
|
600
685
|
|
601
686
|
if (node.direction != ast.PARAM_DIRECTION_OUT and
|
602
687
|
(node.type.target_giname == 'Gio.AsyncReadyCallback' or
|
603
688
|
node.type.target_giname == 'Gio.Cancellable')):
|
604
689
|
node.nullable = True
|
605
690
|
|
691
|
+
# Final override for nullability
|
692
|
+
if ANN_NOT in annotations:
|
693
|
+
node.nullable = False
|
694
|
+
node.not_nullable = True
|
695
|
+
|
606
696
|
if tag and tag.description:
|
607
697
|
node.doc = tag.description
|
608
698
|
|
@@ -708,6 +798,12 @@ class MainTransformer(object):
|
|
708
798
|
tag = block.tags.get(TAG_RETURNS)
|
709
799
|
else:
|
710
800
|
tag = None
|
801
|
+
|
802
|
+
if tag is not None and return_.type == ast.TYPE_NONE:
|
803
|
+
message.warn('%s: invalid return annotation' % (block.name,),
|
804
|
+
tag.position)
|
805
|
+
tag = None
|
806
|
+
|
711
807
|
self._apply_annotations_param_ret_common(parent, return_, tag)
|
712
808
|
|
713
809
|
def _apply_annotations_params(self, parent, params, block):
|
@@ -740,13 +836,14 @@ class MainTransformer(object):
|
|
740
836
|
text = ''
|
741
837
|
elif len(unused) == 1:
|
742
838
|
(param, ) = unused
|
743
|
-
text =
|
839
|
+
text = ", should be '%s'" % (param, )
|
744
840
|
else:
|
745
|
-
text =
|
841
|
+
text = ", should be one of %s" % \
|
842
|
+
(', '.join("'%s'" % p for p in sorted(unused)), )
|
746
843
|
|
747
844
|
param = block.params.get(doc_name)
|
748
|
-
message.warn(
|
749
|
-
|
845
|
+
message.warn("%s: unknown parameter '%s' in documentation "
|
846
|
+
"comment%s" % (block.name, doc_name, text),
|
750
847
|
param.position)
|
751
848
|
|
752
849
|
def _apply_annotations_callable(self, node, chain, block):
|
@@ -767,7 +864,7 @@ class MainTransformer(object):
|
|
767
864
|
try:
|
768
865
|
self._adjust_container_type(parent, field, tag.annotations)
|
769
866
|
except AttributeError as ex:
|
770
|
-
print
|
867
|
+
print(ex)
|
771
868
|
|
772
869
|
def _apply_annotations_property(self, parent, prop):
|
773
870
|
prefix = self._get_annotation_name(parent)
|
@@ -794,7 +891,6 @@ class MainTransformer(object):
|
|
794
891
|
|
795
892
|
if block:
|
796
893
|
self._apply_annotations_annotated(signal, block)
|
797
|
-
|
798
894
|
# We're only attempting to name the signal parameters if
|
799
895
|
# the number of parameters (@foo) is the same or greater
|
800
896
|
# than the number of signal parameters
|
@@ -865,7 +961,7 @@ class MainTransformer(object):
|
|
865
961
|
break
|
866
962
|
if not matched:
|
867
963
|
message.warn_node(node,
|
868
|
-
"Virtual slot %
|
964
|
+
"Virtual slot '%s' not found for '%s' annotation" % (invoker_name,
|
869
965
|
ANN_VFUNC))
|
870
966
|
return True
|
871
967
|
|
@@ -925,14 +1021,14 @@ the ones that failed to resolve removed."""
|
|
925
1021
|
# but only covers enums that are registered as GObject enums.
|
926
1022
|
# Create a fallback mapping based on all known enums in this module.
|
927
1023
|
uscore_enums = {}
|
928
|
-
for enum in self._namespace.
|
1024
|
+
for enum in self._namespace.values():
|
929
1025
|
if not isinstance(enum, ast.Enum):
|
930
1026
|
continue
|
931
1027
|
uscored = to_underscores_noprefix(enum.name).lower()
|
932
1028
|
uscore_enums[uscored] = enum
|
933
1029
|
uscore_enums[enum.name] = enum
|
934
1030
|
|
935
|
-
for node in self._namespace.
|
1031
|
+
for node in self._namespace.values():
|
936
1032
|
if not isinstance(node, ast.ErrorQuarkFunction):
|
937
1033
|
continue
|
938
1034
|
full = node.symbol[:-len('_quark')]
|
@@ -1196,7 +1292,7 @@ method or constructor of some type."""
|
|
1196
1292
|
if func.is_constructor:
|
1197
1293
|
message.warn_node(
|
1198
1294
|
func,
|
1199
|
-
"Can't find matching type for constructor; symbol
|
1295
|
+
"Can't find matching type for constructor; symbol='%s'" % (func.symbol, ))
|
1200
1296
|
return False
|
1201
1297
|
|
1202
1298
|
# Some sanity checks; only objects and boxeds can have ctors
|
@@ -1229,7 +1325,7 @@ method or constructor of some type."""
|
|
1229
1325
|
if parent is None:
|
1230
1326
|
message.warn_node(func,
|
1231
1327
|
"Return value is not superclass for constructor; "
|
1232
|
-
"symbol
|
1328
|
+
"symbol='%s' constructed='%s' return='%s'" %
|
1233
1329
|
(func.symbol,
|
1234
1330
|
str(origin_node.create_type()),
|
1235
1331
|
str(func.retval.type)))
|
@@ -1237,8 +1333,8 @@ method or constructor of some type."""
|
|
1237
1333
|
else:
|
1238
1334
|
if origin_node != target:
|
1239
1335
|
message.warn_node(func,
|
1240
|
-
"Constructor return type mismatch symbol
|
1241
|
-
"constructed
|
1336
|
+
"Constructor return type mismatch symbol='%s' "
|
1337
|
+
"constructed='%s' return='%s'" %
|
1242
1338
|
(func.symbol,
|
1243
1339
|
str(origin_node.create_type()),
|
1244
1340
|
str(func.retval.type)))
|
@@ -1250,8 +1346,8 @@ method or constructor of some type."""
|
|
1250
1346
|
"""Look for virtual methods from the class structure."""
|
1251
1347
|
if not node.glib_type_struct:
|
1252
1348
|
# https://bugzilla.gnome.org/show_bug.cgi?id=629080
|
1253
|
-
#message.warn_node(node,
|
1254
|
-
# "Failed to find class structure for %
|
1349
|
+
# message.warn_node(node,
|
1350
|
+
# "Failed to find class structure for '%s'" % (node.name, ))
|
1255
1351
|
return
|
1256
1352
|
|
1257
1353
|
node_type = node.create_type()
|
@@ -1357,6 +1453,15 @@ method or constructor of some type."""
|
|
1357
1453
|
param.argname.endswith('data')):
|
1358
1454
|
callback_param.closure_name = param.argname
|
1359
1455
|
|
1456
|
+
for param in params:
|
1457
|
+
# By convention, closure user_data parameters are always nullable.
|
1458
|
+
if param.closure_name is not None:
|
1459
|
+
idx = node.get_parameter_index(param.closure_name)
|
1460
|
+
assert idx >= 0
|
1461
|
+
closure_param = params[idx]
|
1462
|
+
if not closure_param.not_nullable:
|
1463
|
+
closure_param.nullable = True
|
1464
|
+
|
1360
1465
|
def _pass3_callable_throws(self, node):
|
1361
1466
|
"""Check to see if we have anything that looks like a
|
1362
1467
|
callback+user_data+GDestroyNotify set."""
|