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
|
@@ -19,7 +19,13 @@
|
|
19
19
|
# Boston, MA 02111-1307, USA.
|
20
20
|
#
|
21
21
|
|
22
|
+
from __future__ import absolute_import
|
23
|
+
from __future__ import division
|
24
|
+
from __future__ import print_function
|
25
|
+
from __future__ import unicode_literals
|
26
|
+
|
22
27
|
import copy
|
28
|
+
import operator
|
23
29
|
from itertools import chain
|
24
30
|
|
25
31
|
from . import message
|
@@ -112,27 +118,43 @@ in contrast to the other create_type() functions."""
|
|
112
118
|
return Array(None, bare_utf8, ctype=None, gtype_name=gtype_name,
|
113
119
|
is_const=False)
|
114
120
|
|
115
|
-
# Workaround for Gdk.Rectangle being boxed alias for
|
116
|
-
# cairo.RectangleInt. G-I does not support boxing of aliases.
|
117
|
-
# See https://bugzilla.gnome.org/show_bug.cgi?id=655423
|
118
|
-
if gtype_name == 'GdkRectangle':
|
119
|
-
gtype_name = 'CairoRectangleInt'
|
120
|
-
|
121
121
|
return cls(gtype_name=gtype_name)
|
122
122
|
|
123
123
|
def get_giname(self):
|
124
124
|
assert self.target_giname is not None
|
125
125
|
return self.target_giname.split('.')[1]
|
126
126
|
|
127
|
-
def
|
127
|
+
def _compare(self, other, op):
|
128
128
|
if self.target_fundamental:
|
129
|
-
return
|
129
|
+
return op(self.target_fundamental, other.target_fundamental)
|
130
130
|
elif self.target_giname:
|
131
|
-
return
|
131
|
+
return op(self.target_giname, other.target_giname)
|
132
132
|
elif self.target_foreign:
|
133
|
-
return
|
133
|
+
return op(self.target_foreign, other.target_foreign)
|
134
134
|
else:
|
135
|
-
return
|
135
|
+
return op(self.ctype, other.ctype)
|
136
|
+
|
137
|
+
def __lt__(self, other):
|
138
|
+
return self._compare(other, operator.lt)
|
139
|
+
|
140
|
+
def __gt__(self, other):
|
141
|
+
return self._compare(other, operator.gt)
|
142
|
+
|
143
|
+
def __ge__(self, other):
|
144
|
+
return self._compare(other, operator.ge)
|
145
|
+
|
146
|
+
def __le__(self, other):
|
147
|
+
return self._compare(other, operator.le)
|
148
|
+
|
149
|
+
def __eq__(self, other):
|
150
|
+
return self._compare(other, operator.eq)
|
151
|
+
|
152
|
+
def __ne__(self, other):
|
153
|
+
return self._compare(other, operator.ne)
|
154
|
+
|
155
|
+
def __hash__(self):
|
156
|
+
return hash((self.target_fundamental, self.target_giname,
|
157
|
+
self.target_foreign, self.ctype))
|
136
158
|
|
137
159
|
def is_equiv(self, typeval):
|
138
160
|
"""Return True if the specified types are compatible at
|
@@ -178,13 +200,10 @@ class TypeUnknown(Type):
|
|
178
200
|
def __init__(self):
|
179
201
|
Type.__init__(self, _target_unknown=True)
|
180
202
|
|
181
|
-
|
182
|
-
## Fundamental types
|
183
|
-
######
|
184
|
-
# Two special ones
|
203
|
+
# Fundamental types, two special ones
|
185
204
|
TYPE_NONE = Type(target_fundamental='none', ctype='void')
|
186
205
|
TYPE_ANY = Type(target_fundamental='gpointer', ctype='gpointer')
|
187
|
-
# "Basic" types
|
206
|
+
# Fundamental types, "Basic" types
|
188
207
|
TYPE_BOOLEAN = Type(target_fundamental='gboolean', ctype='gboolean')
|
189
208
|
TYPE_INT8 = Type(target_fundamental='gint8', ctype='gint8')
|
190
209
|
TYPE_UINT8 = Type(target_fundamental='guint8', ctype='guint8')
|
@@ -223,13 +242,17 @@ TYPE_FILENAME = Type(target_fundamental='filename', ctype='gchar*')
|
|
223
242
|
|
224
243
|
TYPE_VALIST = Type(target_fundamental='va_list', ctype='va_list')
|
225
244
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
245
|
+
BASIC_TYPES = [TYPE_BOOLEAN, TYPE_INT8, TYPE_UINT8, TYPE_INT16,
|
246
|
+
TYPE_UINT16, TYPE_INT32, TYPE_UINT32, TYPE_INT64,
|
247
|
+
TYPE_UINT64, TYPE_CHAR, TYPE_SHORT, TYPE_USHORT, TYPE_INT,
|
248
|
+
TYPE_UINT, TYPE_LONG, TYPE_ULONG, TYPE_SIZE, TYPE_SSIZE,
|
249
|
+
TYPE_LONG_LONG, TYPE_LONG_ULONG,
|
250
|
+
TYPE_FLOAT, TYPE_DOUBLE,
|
251
|
+
TYPE_LONG_DOUBLE, TYPE_UNICHAR, TYPE_GTYPE]
|
252
|
+
|
253
|
+
BASIC_GIR_TYPES = [TYPE_INTPTR, TYPE_UINTPTR]
|
254
|
+
BASIC_GIR_TYPES.extend(BASIC_TYPES)
|
255
|
+
|
233
256
|
GIR_TYPES = [TYPE_NONE, TYPE_ANY]
|
234
257
|
GIR_TYPES.extend(BASIC_GIR_TYPES)
|
235
258
|
GIR_TYPES.extend([TYPE_STRING, TYPE_FILENAME, TYPE_VALIST])
|
@@ -321,6 +344,7 @@ type_names['FILE*'] = TYPE_ANY
|
|
321
344
|
# the relevant methods, but on the other hand, since these types are just
|
322
345
|
# integers it's easy enough to expand them.
|
323
346
|
type_names['size_t'] = type_names['gsize']
|
347
|
+
type_names['ssize_t'] = type_names['gssize']
|
324
348
|
type_names['time_t'] = TYPE_LONG
|
325
349
|
type_names['off_t'] = type_names['gsize']
|
326
350
|
type_names['pid_t'] = TYPE_INT
|
@@ -328,16 +352,11 @@ type_names['uid_t'] = TYPE_UINT
|
|
328
352
|
type_names['gid_t'] = TYPE_UINT
|
329
353
|
type_names['dev_t'] = TYPE_INT
|
330
354
|
type_names['socklen_t'] = TYPE_INT32
|
331
|
-
type_names['size_t'] = TYPE_ULONG
|
332
|
-
type_names['ssize_t'] = TYPE_LONG
|
333
355
|
|
334
356
|
# Obj-C
|
335
357
|
type_names['id'] = TYPE_ANY
|
336
358
|
|
337
|
-
|
338
|
-
## Parameters
|
339
|
-
##
|
340
|
-
|
359
|
+
# Parameters
|
341
360
|
PARAM_DIRECTION_IN = 'in'
|
342
361
|
PARAM_DIRECTION_OUT = 'out'
|
343
362
|
PARAM_DIRECTION_INOUT = 'inout'
|
@@ -471,11 +490,11 @@ functions via get_by_symbol()."""
|
|
471
490
|
def __iter__(self):
|
472
491
|
return iter(self.names)
|
473
492
|
|
474
|
-
def
|
475
|
-
return self.names.
|
493
|
+
def items(self):
|
494
|
+
return self.names.items()
|
476
495
|
|
477
|
-
def
|
478
|
-
return self.names.
|
496
|
+
def values(self):
|
497
|
+
return self.names.values()
|
479
498
|
|
480
499
|
def get(self, name):
|
481
500
|
return self.names.get(name)
|
@@ -487,7 +506,7 @@ functions via get_by_symbol()."""
|
|
487
506
|
return self.symbols.get(symbol)
|
488
507
|
|
489
508
|
def walk(self, callback):
|
490
|
-
for node in self.
|
509
|
+
for node in self.values():
|
491
510
|
node.walk(callback, [])
|
492
511
|
|
493
512
|
|
@@ -501,11 +520,26 @@ class Include(object):
|
|
501
520
|
def from_string(cls, string):
|
502
521
|
return cls(*string.split('-', 1))
|
503
522
|
|
504
|
-
def
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
return
|
523
|
+
def _compare(self, other, op):
|
524
|
+
return op((self.name, self.version), (other.name, other.version))
|
525
|
+
|
526
|
+
def __lt__(self, other):
|
527
|
+
return self._compare(other, operator.lt)
|
528
|
+
|
529
|
+
def __gt__(self, other):
|
530
|
+
return self._compare(other, operator.gt)
|
531
|
+
|
532
|
+
def __ge__(self, other):
|
533
|
+
return self._compare(other, operator.ge)
|
534
|
+
|
535
|
+
def __le__(self, other):
|
536
|
+
return self._compare(other, operator.le)
|
537
|
+
|
538
|
+
def __eq__(self, other):
|
539
|
+
return self._compare(other, operator.eq)
|
540
|
+
|
541
|
+
def __ne__(self, other):
|
542
|
+
return self._compare(other, operator.ne)
|
509
543
|
|
510
544
|
def __hash__(self):
|
511
545
|
return hash(str(self))
|
@@ -561,14 +595,32 @@ GIName. It's possible for nodes to contain or point to other nodes."""
|
|
561
595
|
assert self.namespace is not None
|
562
596
|
return Type(target_giname=('%s.%s' % (self.namespace.name, self.name)))
|
563
597
|
|
564
|
-
def
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
return
|
598
|
+
def _compare(self, other, op):
|
599
|
+
return op((self.namespace, self.name), (other.namespace, other.name))
|
600
|
+
|
601
|
+
def __lt__(self, other):
|
602
|
+
return self._compare(other, operator.lt)
|
603
|
+
|
604
|
+
def __gt__(self, other):
|
605
|
+
return self._compare(other, operator.gt)
|
606
|
+
|
607
|
+
def __ge__(self, other):
|
608
|
+
return self._compare(other, operator.ge)
|
609
|
+
|
610
|
+
def __le__(self, other):
|
611
|
+
return self._compare(other, operator.le)
|
612
|
+
|
613
|
+
def __eq__(self, other):
|
614
|
+
return self._compare(other, operator.eq)
|
615
|
+
|
616
|
+
def __ne__(self, other):
|
617
|
+
return self._compare(other, operator.ne)
|
618
|
+
|
619
|
+
def __hash__(self):
|
620
|
+
return hash((self.namespace, self.name))
|
569
621
|
|
570
622
|
def __repr__(self):
|
571
|
-
return
|
623
|
+
return "%s('%s')" % (self.__class__.__name__, self.name)
|
572
624
|
|
573
625
|
def inherit_file_positions(self, node):
|
574
626
|
self.file_positions.update(node.file_positions)
|
@@ -612,6 +664,34 @@ class Callable(Node):
|
|
612
664
|
self.instance_parameter = None # Parameter
|
613
665
|
self.parent = None # A Class or Interface
|
614
666
|
|
667
|
+
def _get_retval(self):
|
668
|
+
return self._retval
|
669
|
+
|
670
|
+
def _set_retval(self, value):
|
671
|
+
self._retval = value
|
672
|
+
if self._retval is not None:
|
673
|
+
self._retval.parent = self
|
674
|
+
retval = property(_get_retval, _set_retval)
|
675
|
+
|
676
|
+
def _get_instance_parameter(self):
|
677
|
+
return self._instance_parameter
|
678
|
+
|
679
|
+
def _set_instance_parameter(self, value):
|
680
|
+
self._instance_parameter = value
|
681
|
+
if value is not None:
|
682
|
+
value.parent = self
|
683
|
+
instance_parameter = property(_get_instance_parameter,
|
684
|
+
_set_instance_parameter)
|
685
|
+
|
686
|
+
def _get_parameters(self):
|
687
|
+
return self._parameters
|
688
|
+
|
689
|
+
def _set_parameters(self, value):
|
690
|
+
self._parameters = value
|
691
|
+
for param in self._parameters:
|
692
|
+
param.parent = self
|
693
|
+
parameters = property(_get_parameters, _set_parameters)
|
694
|
+
|
615
695
|
# Returns all parameters, including the instance parameter
|
616
696
|
@property
|
617
697
|
def all_parameters(self):
|
@@ -650,6 +730,8 @@ class Function(Callable):
|
|
650
730
|
# copy the parameters array so a change to self.parameters does not
|
651
731
|
# influence clone.parameters.
|
652
732
|
clone.parameters = self.parameters[:]
|
733
|
+
for param in clone.parameters:
|
734
|
+
param.parent = clone
|
653
735
|
return clone
|
654
736
|
|
655
737
|
def is_type_meta_function(self):
|
@@ -763,10 +845,12 @@ class Alias(Node):
|
|
763
845
|
class TypeContainer(Annotated):
|
764
846
|
"""A fundamental base class for Return and Parameter."""
|
765
847
|
|
766
|
-
def __init__(self, typenode, nullable, transfer):
|
848
|
+
def __init__(self, typenode, nullable, not_nullable, transfer, direction):
|
767
849
|
Annotated.__init__(self)
|
768
850
|
self.type = typenode
|
769
851
|
self.nullable = nullable
|
852
|
+
self.not_nullable = not_nullable
|
853
|
+
self.direction = direction
|
770
854
|
if transfer is not None:
|
771
855
|
self.transfer = transfer
|
772
856
|
elif typenode.is_const:
|
@@ -781,11 +865,12 @@ class Parameter(TypeContainer):
|
|
781
865
|
def __init__(self, argname, typenode, direction=None,
|
782
866
|
transfer=None, nullable=False, optional=False,
|
783
867
|
allow_none=False, scope=None,
|
784
|
-
caller_allocates=False):
|
785
|
-
TypeContainer.__init__(self, typenode, nullable,
|
868
|
+
caller_allocates=False, not_nullable=False):
|
869
|
+
TypeContainer.__init__(self, typenode, nullable, not_nullable,
|
870
|
+
transfer, direction)
|
786
871
|
self.argname = argname
|
787
|
-
self.direction = direction
|
788
872
|
self.optional = optional
|
873
|
+
self.parent = None # A Callable
|
789
874
|
|
790
875
|
if allow_none:
|
791
876
|
if self.direction == PARAM_DIRECTION_OUT:
|
@@ -798,13 +883,19 @@ class Parameter(TypeContainer):
|
|
798
883
|
self.closure_name = None
|
799
884
|
self.destroy_name = None
|
800
885
|
|
886
|
+
@property
|
887
|
+
def name(self):
|
888
|
+
return self.argname
|
889
|
+
|
801
890
|
|
802
891
|
class Return(TypeContainer):
|
803
892
|
"""A return value from a function."""
|
804
893
|
|
805
|
-
def __init__(self, rtype, nullable=False,
|
806
|
-
|
807
|
-
self
|
894
|
+
def __init__(self, rtype, nullable=False, not_nullable=False,
|
895
|
+
transfer=None):
|
896
|
+
TypeContainer.__init__(self, rtype, nullable, not_nullable, transfer,
|
897
|
+
direction=PARAM_DIRECTION_OUT)
|
898
|
+
self.parent = None # A Callable
|
808
899
|
|
809
900
|
|
810
901
|
class Enum(Node, Registered):
|
@@ -861,11 +952,32 @@ class Member(Annotated):
|
|
861
952
|
self.nick = nick
|
862
953
|
self.parent = None
|
863
954
|
|
864
|
-
def
|
865
|
-
return
|
955
|
+
def _compare(self, other, op):
|
956
|
+
return op(self.name, other.name)
|
957
|
+
|
958
|
+
def __lt__(self, other):
|
959
|
+
return self._compare(other, operator.lt)
|
960
|
+
|
961
|
+
def __gt__(self, other):
|
962
|
+
return self._compare(other, operator.gt)
|
963
|
+
|
964
|
+
def __ge__(self, other):
|
965
|
+
return self._compare(other, operator.ge)
|
966
|
+
|
967
|
+
def __le__(self, other):
|
968
|
+
return self._compare(other, operator.le)
|
969
|
+
|
970
|
+
def __eq__(self, other):
|
971
|
+
return self._compare(other, operator.eq)
|
972
|
+
|
973
|
+
def __ne__(self, other):
|
974
|
+
return self._compare(other, operator.ne)
|
975
|
+
|
976
|
+
def __hash__(self):
|
977
|
+
return hash(self.name)
|
866
978
|
|
867
979
|
def __repr__(self):
|
868
|
-
return
|
980
|
+
return "%s('%s')" % (self.__class__.__name__, self.name)
|
869
981
|
|
870
982
|
|
871
983
|
class Compound(Node, Registered):
|
@@ -934,11 +1046,32 @@ class Field(Annotated):
|
|
934
1046
|
self.namespace = None
|
935
1047
|
self.parent = None # a compound
|
936
1048
|
|
937
|
-
def
|
938
|
-
return
|
1049
|
+
def _compare(self, other, op):
|
1050
|
+
return op(self.name, other.name)
|
1051
|
+
|
1052
|
+
def __lt__(self, other):
|
1053
|
+
return self._compare(other, operator.lt)
|
1054
|
+
|
1055
|
+
def __gt__(self, other):
|
1056
|
+
return self._compare(other, operator.gt)
|
1057
|
+
|
1058
|
+
def __ge__(self, other):
|
1059
|
+
return self._compare(other, operator.ge)
|
1060
|
+
|
1061
|
+
def __le__(self, other):
|
1062
|
+
return self._compare(other, operator.le)
|
1063
|
+
|
1064
|
+
def __eq__(self, other):
|
1065
|
+
return self._compare(other, operator.eq)
|
1066
|
+
|
1067
|
+
def __ne__(self, other):
|
1068
|
+
return self._compare(other, operator.ne)
|
1069
|
+
|
1070
|
+
def __hash__(self):
|
1071
|
+
return hash(self.name)
|
939
1072
|
|
940
1073
|
def __repr__(self):
|
941
|
-
return
|
1074
|
+
return "%s('%s')" % (self.__class__.__name__, self.name)
|
942
1075
|
|
943
1076
|
|
944
1077
|
class Record(Compound):
|
Binary file
|
Binary file
|
@@ -18,8 +18,12 @@
|
|
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 errno
|
22
|
-
import cPickle
|
23
27
|
import glob
|
24
28
|
import hashlib
|
25
29
|
import os
|
@@ -27,61 +31,42 @@ import shutil
|
|
27
31
|
import sys
|
28
32
|
import tempfile
|
29
33
|
|
34
|
+
try:
|
35
|
+
import cPickle as pickle
|
36
|
+
except ImportError:
|
37
|
+
import pickle
|
38
|
+
|
30
39
|
import giscanner
|
31
40
|
|
41
|
+
from . import utils
|
42
|
+
|
43
|
+
|
32
44
|
_CACHE_VERSION_FILENAME = '.cache-version'
|
33
45
|
|
34
46
|
|
35
47
|
def _get_versionhash():
|
36
48
|
toplevel = os.path.dirname(giscanner.__file__)
|
37
|
-
|
38
|
-
sources = glob.glob(os.path.join(toplevel, '*.pyc'))
|
49
|
+
sources = glob.glob(os.path.join(toplevel, '*.py'))
|
39
50
|
sources.append(sys.argv[0])
|
40
51
|
# Using mtimes is a bit (5x) faster than hashing the file contents
|
41
52
|
mtimes = (str(os.stat(source).st_mtime) for source in sources)
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
def _get_cachedir():
|
46
|
-
if 'GI_SCANNER_DISABLE_CACHE' in os.environ:
|
47
|
-
return None
|
48
|
-
homedir = os.path.expanduser('~')
|
49
|
-
if homedir is None:
|
50
|
-
return None
|
51
|
-
if not os.path.exists(homedir):
|
52
|
-
return None
|
53
|
-
|
54
|
-
cachedir = os.path.join(homedir, '.cache')
|
55
|
-
if not os.path.exists(cachedir):
|
56
|
-
try:
|
57
|
-
os.mkdir(cachedir, 0o755)
|
58
|
-
except OSError:
|
59
|
-
return None
|
60
|
-
|
61
|
-
scannerdir = os.path.join(cachedir, 'g-ir-scanner')
|
62
|
-
if not os.path.exists(scannerdir):
|
63
|
-
try:
|
64
|
-
os.mkdir(scannerdir, 0o755)
|
65
|
-
except OSError:
|
66
|
-
return None
|
67
|
-
# If it exists and is a file, don't cache at all
|
68
|
-
elif not os.path.isdir(scannerdir):
|
69
|
-
return None
|
70
|
-
return scannerdir
|
53
|
+
# ASCII encoding is sufficient since we are only dealing with numbers.
|
54
|
+
return hashlib.sha1(''.join(mtimes).encode('ascii')).hexdigest()
|
71
55
|
|
72
56
|
|
73
57
|
class CacheStore(object):
|
74
58
|
|
75
59
|
def __init__(self):
|
76
|
-
|
77
|
-
self._directory = _get_cachedir()
|
78
|
-
except OSError as e:
|
79
|
-
if e.errno != errno.EPERM:
|
80
|
-
raise
|
81
|
-
self._directory = None
|
82
|
-
|
60
|
+
self._directory = self._get_cachedir()
|
83
61
|
self._check_cache_version()
|
84
62
|
|
63
|
+
def _get_cachedir(self):
|
64
|
+
if 'GI_SCANNER_DISABLE_CACHE' in os.environ:
|
65
|
+
return None
|
66
|
+
else:
|
67
|
+
cachedir = utils.get_user_cache_dir('g-ir-scanner')
|
68
|
+
return cachedir
|
69
|
+
|
85
70
|
def _check_cache_version(self):
|
86
71
|
if self._directory is None:
|
87
72
|
return
|
@@ -89,7 +74,8 @@ class CacheStore(object):
|
|
89
74
|
current_hash = _get_versionhash()
|
90
75
|
version = os.path.join(self._directory, _CACHE_VERSION_FILENAME)
|
91
76
|
try:
|
92
|
-
|
77
|
+
with open(version, 'r') as version_file:
|
78
|
+
cache_hash = version_file.read()
|
93
79
|
except IOError as e:
|
94
80
|
# File does not exist
|
95
81
|
if e.errno == errno.ENOENT:
|
@@ -100,11 +86,16 @@ class CacheStore(object):
|
|
100
86
|
if current_hash == cache_hash:
|
101
87
|
return
|
102
88
|
|
103
|
-
versiontmp = version + '.tmp'
|
104
|
-
|
105
89
|
self._clean()
|
90
|
+
|
91
|
+
tmp_fd, tmp_filename = tempfile.mkstemp(prefix='g-ir-scanner-cache-version-')
|
106
92
|
try:
|
107
|
-
|
93
|
+
with os.fdopen(tmp_fd, 'w') as tmp_file:
|
94
|
+
tmp_file.write(current_hash)
|
95
|
+
|
96
|
+
# On Unix, this would just be os.rename() but Windows
|
97
|
+
# doesn't allow that.
|
98
|
+
shutil.move(tmp_filename, version)
|
108
99
|
except IOError as e:
|
109
100
|
# Permission denied
|
110
101
|
if e.errno == errno.EACCES:
|
@@ -112,19 +103,15 @@ class CacheStore(object):
|
|
112
103
|
else:
|
113
104
|
raise
|
114
105
|
|
115
|
-
fp.write(current_hash)
|
116
|
-
fp.close()
|
117
|
-
# On Unix, this would just be os.rename() but Windows
|
118
|
-
# doesn't allow that.
|
119
|
-
shutil.move(versiontmp, version)
|
120
|
-
|
121
106
|
def _get_filename(self, filename):
|
122
107
|
# If we couldn't create the directory we're probably
|
123
108
|
# on a read only home directory where we just disable
|
124
109
|
# the cache all together.
|
125
110
|
if self._directory is None:
|
126
111
|
return
|
127
|
-
|
112
|
+
# Assume UTF-8 encoding for the filenames. This doesn't matter so much
|
113
|
+
# as long as the results of this method always produce the same hash.
|
114
|
+
hexdigest = hashlib.sha1(filename.encode('utf-8')).hexdigest()
|
128
115
|
return os.path.join(self._directory, hexdigest)
|
129
116
|
|
130
117
|
def _cache_is_valid(self, store_filename, filename):
|
@@ -163,7 +150,8 @@ class CacheStore(object):
|
|
163
150
|
|
164
151
|
tmp_fd, tmp_filename = tempfile.mkstemp(prefix='g-ir-scanner-cache-')
|
165
152
|
try:
|
166
|
-
|
153
|
+
with os.fdopen(tmp_fd, 'wb') as tmp_file:
|
154
|
+
pickle.dump(data, tmp_file)
|
167
155
|
except IOError as e:
|
168
156
|
# No space left on device
|
169
157
|
if e.errno == errno.ENOSPC:
|
@@ -186,7 +174,7 @@ class CacheStore(object):
|
|
186
174
|
if store_filename is None:
|
187
175
|
return
|
188
176
|
try:
|
189
|
-
fd = open(store_filename)
|
177
|
+
fd = open(store_filename, 'rb')
|
190
178
|
except IOError as e:
|
191
179
|
if e.errno == errno.ENOENT:
|
192
180
|
return None
|
@@ -195,8 +183,8 @@ class CacheStore(object):
|
|
195
183
|
if not self._cache_is_valid(store_filename, filename):
|
196
184
|
return None
|
197
185
|
try:
|
198
|
-
data =
|
199
|
-
except (AttributeError, EOFError, ValueError,
|
186
|
+
data = pickle.load(fd)
|
187
|
+
except (AttributeError, EOFError, ValueError, pickle.BadPickleGet):
|
200
188
|
# Broken cache entry, remove it
|
201
189
|
self._remove_filename(store_filename)
|
202
190
|
data = None
|