gir_ffi 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +12 -0
- data/TODO.rdoc +10 -0
- data/examples/04_webkit.rb +16 -0
- data/lib/gir_ffi/arg_helper.rb +130 -38
- data/lib/gir_ffi/builder/argument.rb +552 -0
- data/lib/gir_ffi/{class_builder.rb → builder/class.rb} +89 -67
- data/lib/gir_ffi/{function_definition_builder.rb → builder/function.rb} +10 -10
- data/lib/gir_ffi/{module_builder.rb → builder/module.rb} +17 -16
- data/lib/gir_ffi/builder.rb +33 -28
- data/lib/gir_ffi/class_base.rb +7 -2
- data/lib/gir_ffi/i_base_info.rb +8 -0
- data/lib/gir_ffi/i_repository.rb +6 -0
- data/lib/gir_ffi/i_struct_info.rb +5 -1
- data/lib/gir_ffi/lib.rb +2 -0
- data/lib/gir_ffi/overrides/glib.rb +30 -0
- data/lib/gir_ffi/overrides/gobject.rb +143 -26
- data/tasks/test.rake +14 -0
- data/test/arg_helper_test.rb +19 -3
- data/test/builder_test.rb +85 -73
- data/test/class_builder_test.rb +15 -11
- data/test/function_definition_builder_test.rb +32 -49
- data/test/g_object_overrides_test.rb +103 -48
- data/test/{generated_everything_test.rb → generated_regress_test.rb} +229 -167
- data/test/i_object_info_test.rb +2 -2
- data/test/i_repository_test.rb +2 -2
- data/test/lib/Makefile.am +30 -0
- data/test/lib/autogen.sh +87 -0
- data/test/lib/configure.ac +30 -0
- data/test/lib/m4/jhflags.m4 +21 -0
- data/test/module_builder_test.rb +10 -10
- data/test/test_helper.rb +14 -10
- metadata +22 -12
- data/lib/gir_ffi/argument_builder.rb +0 -382
@@ -2,11 +2,13 @@ require 'gir_ffi/builder_helper'
|
|
2
2
|
module GirFFI
|
3
3
|
# Builds a class based on information found in the introspection
|
4
4
|
# repository.
|
5
|
-
class
|
5
|
+
class Builder::Class
|
6
6
|
include BuilderHelper
|
7
|
-
|
8
|
-
|
9
|
-
@
|
7
|
+
|
8
|
+
def initialize info
|
9
|
+
@info = info
|
10
|
+
@namespace = @info.namespace
|
11
|
+
@classname = @info.name.gsub(/^(.)/) { $1.upcase }
|
10
12
|
end
|
11
13
|
|
12
14
|
def generate
|
@@ -18,7 +20,8 @@ module GirFFI
|
|
18
20
|
meta = (class << klass; self; end)
|
19
21
|
|
20
22
|
go = method_introspection_data method
|
21
|
-
|
23
|
+
raise NoMethodError unless go
|
24
|
+
attach_and_define_method method, go, meta
|
22
25
|
end
|
23
26
|
|
24
27
|
def setup_instance_method method
|
@@ -26,11 +29,11 @@ module GirFFI
|
|
26
29
|
result = attach_and_define_method method, go, build_class
|
27
30
|
|
28
31
|
unless result
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
if parent
|
33
|
+
return superclass.gir_ffi_builder.setup_instance_method method
|
34
|
+
else
|
35
|
+
return false
|
36
|
+
end
|
34
37
|
end
|
35
38
|
|
36
39
|
true
|
@@ -42,8 +45,8 @@ module GirFFI
|
|
42
45
|
return sig if sig.name == signal_name
|
43
46
|
end
|
44
47
|
end
|
45
|
-
if
|
46
|
-
|
48
|
+
if parent
|
49
|
+
return superclass.gir_ffi_builder.find_signal signal_name
|
47
50
|
end
|
48
51
|
end
|
49
52
|
|
@@ -51,42 +54,53 @@ module GirFFI
|
|
51
54
|
|
52
55
|
def build_class
|
53
56
|
unless defined? @klass
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
57
|
+
case info.type
|
58
|
+
when :object, :struct, :interface
|
59
|
+
instantiate_struct_class
|
60
|
+
when :union
|
61
|
+
instantiate_union_class
|
62
|
+
when :enum, :flags
|
63
|
+
instantiate_enum_class
|
64
|
+
when :callback
|
65
|
+
instantiate_callback_class
|
66
|
+
else
|
67
|
+
raise NotImplementedError, "Cannot build classes of type #{info.type}"
|
68
|
+
end
|
64
69
|
end
|
65
70
|
@klass
|
66
71
|
end
|
67
72
|
|
68
73
|
def info
|
69
74
|
unless defined? @info
|
70
|
-
|
71
|
-
|
75
|
+
@info = gir.find_by_name @namespace, @classname
|
76
|
+
raise "Class #{@classname} not found in namespace #{@namespace}" if @info.nil?
|
72
77
|
end
|
73
78
|
@info
|
74
79
|
end
|
75
80
|
|
76
81
|
def parent
|
77
82
|
unless defined? @parent
|
78
|
-
|
83
|
+
if info.type == :object
|
84
|
+
pr = info.parent
|
85
|
+
if pr.nil? or (pr.name == @classname and pr.namespace == @namespace)
|
86
|
+
@parent = nil
|
87
|
+
else
|
88
|
+
@parent = pr
|
89
|
+
end
|
90
|
+
else
|
91
|
+
@parent = nil
|
92
|
+
end
|
79
93
|
end
|
80
94
|
@parent
|
81
95
|
end
|
82
96
|
|
83
97
|
def superclass
|
84
98
|
unless defined? @superclass
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
99
|
+
if parent
|
100
|
+
@superclass = Builder.build_class parent
|
101
|
+
else
|
102
|
+
@superclass = GirFFI::ClassBase
|
103
|
+
end
|
90
104
|
end
|
91
105
|
@superclass
|
92
106
|
end
|
@@ -113,8 +127,16 @@ module GirFFI
|
|
113
127
|
|
114
128
|
def instantiate_enum_class
|
115
129
|
@klass = optionally_define_constant namespace_module, @classname do
|
116
|
-
|
117
|
-
|
130
|
+
vals = info.values.map {|vinfo| [vinfo.name.to_sym, vinfo.value]}.flatten
|
131
|
+
lib.enum(@classname.to_sym, vals)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def instantiate_callback_class
|
136
|
+
@klass = optionally_define_constant namespace_module, @classname do
|
137
|
+
args = Builder.ffi_function_argument_types info
|
138
|
+
ret = Builder.ffi_function_return_type info
|
139
|
+
lib.callback @classname.to_sym, args, ret
|
118
140
|
end
|
119
141
|
end
|
120
142
|
|
@@ -135,48 +157,48 @@ module GirFFI
|
|
135
157
|
|
136
158
|
def layout_specification
|
137
159
|
fields = if info.type == :interface
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
160
|
+
[]
|
161
|
+
else
|
162
|
+
info.fields
|
163
|
+
end
|
142
164
|
|
143
165
|
if fields.empty?
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
166
|
+
if parent
|
167
|
+
return [:parent, superclass.const_get(:Struct), 0]
|
168
|
+
else
|
169
|
+
return [:dummy, :char, 0]
|
170
|
+
end
|
149
171
|
end
|
150
172
|
|
151
173
|
fields.map do |finfo|
|
152
|
-
|
153
|
-
|
154
|
-
|
174
|
+
[ finfo.name.to_sym,
|
175
|
+
itypeinfo_to_ffitype_for_struct(finfo.type),
|
176
|
+
finfo.offset ]
|
155
177
|
end.flatten
|
156
178
|
end
|
157
179
|
|
158
180
|
def itypeinfo_to_ffitype_for_struct typeinfo
|
159
181
|
ffitype = Builder.itypeinfo_to_ffitype typeinfo
|
160
182
|
if ffitype.kind_of?(Class) and const_defined_for ffitype, :Struct
|
161
|
-
|
183
|
+
ffitype = ffitype.const_get :Struct
|
162
184
|
end
|
163
185
|
if ffitype == :bool
|
164
|
-
|
186
|
+
ffitype = :int
|
165
187
|
end
|
166
188
|
ffitype
|
167
189
|
end
|
168
190
|
|
169
191
|
def stub_methods
|
170
192
|
info.methods.each do |minfo|
|
171
|
-
|
193
|
+
@klass.class_eval method_stub(minfo.name, minfo.method?)
|
172
194
|
end
|
173
195
|
end
|
174
196
|
|
175
197
|
def method_stub symbol, is_instance_method
|
176
198
|
"
|
177
|
-
|
178
|
-
|
179
|
-
|
199
|
+
def #{is_instance_method ? '' : 'self.'}#{symbol} *args, &block
|
200
|
+
setup_and_call :#{symbol}, *args, &block
|
201
|
+
end
|
180
202
|
"
|
181
203
|
end
|
182
204
|
|
@@ -185,23 +207,23 @@ module GirFFI
|
|
185
207
|
return if getter.nil? or getter == "intern"
|
186
208
|
lib.attach_function getter.to_sym, [], :size_t
|
187
209
|
@klass.class_eval "
|
188
|
-
|
189
|
-
|
190
|
-
|
210
|
+
def self.get_gtype
|
211
|
+
::#{lib}.#{getter}
|
212
|
+
end
|
191
213
|
"
|
192
214
|
end
|
193
215
|
|
194
216
|
def setup_vfunc_invokers
|
195
217
|
info.vfuncs.each do |vfinfo|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
218
|
+
invoker = vfinfo.invoker
|
219
|
+
next if invoker.nil?
|
220
|
+
next if invoker.name == vfinfo.name
|
221
|
+
|
222
|
+
@klass.class_eval "
|
223
|
+
def #{vfinfo.name} *args, &block
|
224
|
+
#{invoker.name}(*args, &block)
|
225
|
+
end
|
226
|
+
"
|
205
227
|
end
|
206
228
|
end
|
207
229
|
|
@@ -209,7 +231,7 @@ module GirFFI
|
|
209
231
|
return if info.find_method 'new'
|
210
232
|
|
211
233
|
(class << @klass; self; end).class_eval {
|
212
|
-
|
234
|
+
alias_method :new, :allocate
|
213
235
|
}
|
214
236
|
end
|
215
237
|
|
@@ -232,7 +254,7 @@ module GirFFI
|
|
232
254
|
end
|
233
255
|
|
234
256
|
def function_definition go
|
235
|
-
|
257
|
+
Builder::Function.new(go, lib).generate
|
236
258
|
end
|
237
259
|
|
238
260
|
def attach_and_define_method method, go, modul
|
@@ -245,15 +267,15 @@ module GirFFI
|
|
245
267
|
|
246
268
|
def gir
|
247
269
|
unless defined? @gir
|
248
|
-
|
249
|
-
|
270
|
+
@gir = IRepository.default
|
271
|
+
@gir.require @namespace, nil
|
250
272
|
end
|
251
273
|
@gir
|
252
274
|
end
|
253
275
|
|
254
276
|
def get_or_define_class namespace, name, parent
|
255
277
|
optionally_define_constant(namespace, name) {
|
256
|
-
|
278
|
+
Class.new parent
|
257
279
|
}
|
258
280
|
end
|
259
281
|
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require 'gir_ffi/
|
1
|
+
require 'gir_ffi/builder/argument'
|
2
2
|
|
3
|
-
module GirFFI
|
3
|
+
module GirFFI::Builder
|
4
4
|
# Implements the creation of a Ruby function definition out of a GIR
|
5
5
|
# IFunctionInfo.
|
6
|
-
class
|
6
|
+
class Function
|
7
7
|
def initialize info, libmodule
|
8
8
|
@info = info
|
9
9
|
@libmodule = libmodule
|
@@ -11,19 +11,20 @@ module GirFFI
|
|
11
11
|
|
12
12
|
def generate
|
13
13
|
setup_accumulators
|
14
|
-
@data = @info.args.map {|arg|
|
15
|
-
@rvdata =
|
14
|
+
@data = @info.args.map {|arg| Argument.build self, arg, @libmodule}
|
15
|
+
@rvdata = ReturnValue.build self, @info
|
16
16
|
|
17
17
|
alldata = @data.dup << @rvdata
|
18
18
|
|
19
19
|
alldata.each {|data|
|
20
20
|
data.prepare
|
21
21
|
idx = data.type.array_length
|
22
|
-
|
22
|
+
if idx > -1
|
23
|
+
data.length_arg = @data[idx]
|
24
|
+
@data[idx].length_arg_for = data
|
25
|
+
end
|
23
26
|
}
|
24
27
|
|
25
|
-
alldata.each {|data| data.process }
|
26
|
-
|
27
28
|
adjust_accumulators
|
28
29
|
return filled_out_template
|
29
30
|
end
|
@@ -35,10 +36,9 @@ module GirFFI
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def adjust_accumulators
|
38
|
-
klass = @info.throws? ?
|
39
|
+
klass = @info.throws? ? ErrorArgument : NullArgument
|
39
40
|
@errarg = klass.new(self)
|
40
41
|
@errarg.prepare
|
41
|
-
@errarg.process
|
42
42
|
end
|
43
43
|
|
44
44
|
def filled_out_template
|
@@ -4,7 +4,7 @@ require 'gir_ffi/module_base'
|
|
4
4
|
module GirFFI
|
5
5
|
# Builds a module based on information found in the introspection
|
6
6
|
# repository.
|
7
|
-
class
|
7
|
+
class Builder::Module
|
8
8
|
include BuilderHelper
|
9
9
|
|
10
10
|
def initialize namespace
|
@@ -32,16 +32,17 @@ module GirFFI
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def build_class classname
|
35
|
-
|
35
|
+
info = gir.find_by_name @namespace, classname.to_s
|
36
|
+
Builder.build_class info
|
36
37
|
end
|
37
38
|
|
38
39
|
private
|
39
40
|
|
40
41
|
def build_module
|
41
42
|
unless defined? @module
|
42
|
-
|
43
|
-
|
44
|
-
|
43
|
+
instantiate_module
|
44
|
+
setup_lib_for_ffi
|
45
|
+
setup_module unless already_set_up
|
45
46
|
end
|
46
47
|
@module
|
47
48
|
end
|
@@ -54,8 +55,8 @@ module GirFFI
|
|
54
55
|
@module.extend ModuleBase
|
55
56
|
@module.const_set :GIR_FFI_BUILDER, self
|
56
57
|
begin
|
57
|
-
|
58
|
-
|
58
|
+
require "gir_ffi/overrides/#{@namespace.downcase}"
|
59
|
+
@module.class_eval "include GirFFI::Overrides::#{@namespace}"
|
59
60
|
rescue LoadError
|
60
61
|
end
|
61
62
|
end
|
@@ -68,10 +69,10 @@ module GirFFI
|
|
68
69
|
@lib = get_or_define_module @module, :Lib
|
69
70
|
|
70
71
|
unless (class << @lib; self.include? FFI::Library; end)
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
72
|
+
@lib.extend FFI::Library
|
73
|
+
libs = gir.shared_library(@namespace).split(/,/)
|
74
|
+
@lib.ffi_lib_flags :global, :lazy
|
75
|
+
@lib.ffi_lib(*libs)
|
75
76
|
end
|
76
77
|
|
77
78
|
optionally_define_constant(@lib, :CALLBACKS) { [] }
|
@@ -81,20 +82,20 @@ module GirFFI
|
|
81
82
|
info = gir.find_by_name @namespace, function.to_s
|
82
83
|
|
83
84
|
if info.type == :function
|
84
|
-
|
85
|
+
info
|
85
86
|
else
|
86
|
-
|
87
|
+
nil
|
87
88
|
end
|
88
89
|
end
|
89
90
|
|
90
91
|
def function_definition info, libmodule
|
91
|
-
|
92
|
+
Builder::Function.new(info, libmodule).generate
|
92
93
|
end
|
93
94
|
|
94
95
|
def gir
|
95
96
|
unless defined? @gir
|
96
|
-
|
97
|
-
|
97
|
+
@gir = IRepository.default
|
98
|
+
@gir.require @namespace, nil
|
98
99
|
end
|
99
100
|
@gir
|
100
101
|
end
|
data/lib/gir_ffi/builder.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'gir_ffi/arg_helper'
|
2
|
-
require 'gir_ffi/
|
2
|
+
require 'gir_ffi/builder/function'
|
3
3
|
require 'gir_ffi/class_base'
|
4
|
-
require 'gir_ffi/
|
5
|
-
require 'gir_ffi/
|
4
|
+
require 'gir_ffi/builder/class'
|
5
|
+
require 'gir_ffi/builder/module'
|
6
6
|
require 'gir_ffi/builder_helper'
|
7
7
|
|
8
8
|
module GirFFI
|
@@ -10,13 +10,33 @@ module GirFFI
|
|
10
10
|
# introspection repository. Call its build_module and build_class methods
|
11
11
|
# to create the modules and classes used in your program.
|
12
12
|
module Builder
|
13
|
+
FFI_TYPE_FOR_SSIZE_T = "int#{FFI.type_size(:size_t) * 8}".to_sym
|
14
|
+
|
13
15
|
extend BuilderHelper
|
14
|
-
|
15
|
-
|
16
|
+
|
17
|
+
TAG_TYPE_MAP = {
|
18
|
+
:boolean => :bool,
|
19
|
+
:GType => :size_t,
|
20
|
+
:size => :size_t,
|
21
|
+
:gboolean => :bool,
|
22
|
+
:gint8 => :int8,
|
23
|
+
:guint8 => :uint8,
|
24
|
+
:gint16 => :int16,
|
25
|
+
:guint16 => :uint16,
|
26
|
+
:gint32 => :int32,
|
27
|
+
:guint32 => :uint32,
|
28
|
+
:gint64 => :int64,
|
29
|
+
:guint64 => :uint64,
|
30
|
+
:gfloat => :float,
|
31
|
+
:gdouble => :double,
|
32
|
+
}
|
33
|
+
|
34
|
+
def self.build_class info
|
35
|
+
Builder::Class.new(info).generate
|
16
36
|
end
|
17
37
|
|
18
38
|
def self.build_module namespace
|
19
|
-
|
39
|
+
Builder::Module.new(namespace).generate
|
20
40
|
end
|
21
41
|
|
22
42
|
def self.attach_ffi_function lib, info
|
@@ -27,8 +47,6 @@ module GirFFI
|
|
27
47
|
lib.attach_function sym, argtypes, rt
|
28
48
|
end
|
29
49
|
|
30
|
-
# All methods below will be made private at the end.
|
31
|
-
|
32
50
|
def self.ffi_function_argument_types info
|
33
51
|
types = info.args.map do |arg|
|
34
52
|
tp = iarginfo_to_ffitype arg
|
@@ -56,20 +74,15 @@ module GirFFI
|
|
56
74
|
case tag
|
57
75
|
when :interface
|
58
76
|
interface = info.interface
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
77
|
+
return build_class interface
|
78
|
+
when :ssize
|
79
|
+
return FFI_TYPE_FOR_SSIZE_T
|
80
|
+
else
|
81
|
+
if TAG_TYPE_MAP[tag]
|
82
|
+
return TAG_TYPE_MAP[tag]
|
64
83
|
else
|
65
|
-
|
84
|
+
return tag
|
66
85
|
end
|
67
|
-
when :boolean
|
68
|
-
return :bool
|
69
|
-
when :GType, :size
|
70
|
-
return :size_t
|
71
|
-
else
|
72
|
-
return tag
|
73
86
|
end
|
74
87
|
end
|
75
88
|
|
@@ -91,13 +104,5 @@ module GirFFI
|
|
91
104
|
lib.callback sym, args, ret
|
92
105
|
end
|
93
106
|
end
|
94
|
-
|
95
|
-
# Set up method access.
|
96
|
-
(self.public_methods - Module.public_methods).each do |method|
|
97
|
-
private_class_method method.to_sym
|
98
|
-
end
|
99
|
-
public_class_method :build_module, :build_class
|
100
|
-
public_class_method :itypeinfo_to_ffitype
|
101
|
-
public_class_method :attach_ffi_function
|
102
107
|
end
|
103
108
|
end
|
data/lib/gir_ffi/class_base.rb
CHANGED
@@ -3,6 +3,7 @@ module GirFFI
|
|
3
3
|
# Base class for all generated classes. Contains code for dealing with
|
4
4
|
# the generated Struct classes.
|
5
5
|
class ClassBase
|
6
|
+
# TODO: Make separate base for :struct, :union, :object.
|
6
7
|
extend Forwardable
|
7
8
|
def_delegators :@struct, :[], :[]=, :to_ptr
|
8
9
|
|
@@ -25,8 +26,7 @@ module GirFFI
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def self.setup_and_call method, *arguments, &block
|
28
|
-
|
29
|
-
return super unless result
|
29
|
+
gir_ffi_builder.setup_method method.to_s
|
30
30
|
self.send method, *arguments, &block
|
31
31
|
end
|
32
32
|
|
@@ -51,6 +51,11 @@ module GirFFI
|
|
51
51
|
_real_new ptr
|
52
52
|
end
|
53
53
|
|
54
|
+
# TODO: Only makes sense for :objects.
|
55
|
+
def constructor_wrap ptr
|
56
|
+
wrap ptr
|
57
|
+
end
|
58
|
+
|
54
59
|
def allocate
|
55
60
|
_real_new
|
56
61
|
end
|
data/lib/gir_ffi/i_base_info.rb
CHANGED
@@ -35,12 +35,20 @@ module GirFFI
|
|
35
35
|
def name
|
36
36
|
Lib.g_base_info_get_name @gobj
|
37
37
|
end
|
38
|
+
|
38
39
|
def type
|
39
40
|
Lib.g_base_info_get_type @gobj
|
40
41
|
end
|
42
|
+
|
41
43
|
def namespace
|
42
44
|
Lib.g_base_info_get_namespace @gobj
|
43
45
|
end
|
46
|
+
|
47
|
+
def container
|
48
|
+
ptr = Lib.g_base_info_get_container @gobj
|
49
|
+
IRepository.wrap_ibaseinfo_pointer ptr
|
50
|
+
end
|
51
|
+
|
44
52
|
def deprecated?
|
45
53
|
Lib.g_base_info_is_deprecated @gobj
|
46
54
|
end
|
data/lib/gir_ffi/i_repository.rb
CHANGED
@@ -62,6 +62,12 @@ module GirFFI
|
|
62
62
|
self.instance
|
63
63
|
end
|
64
64
|
|
65
|
+
# TODO: Make sure GType is initialized first.
|
66
|
+
def self.prepend_search_path path
|
67
|
+
Lib.g_irepository_prepend_search_path path
|
68
|
+
end
|
69
|
+
|
70
|
+
# TODO: Make sure GType is initialized first.
|
65
71
|
def self.type_tag_to_string type
|
66
72
|
Lib.g_type_tag_to_string type
|
67
73
|
end
|
@@ -22,8 +22,12 @@ module GirFFI
|
|
22
22
|
##
|
23
23
|
build_array_method :methods
|
24
24
|
|
25
|
+
def methods_hash
|
26
|
+
@methods_hash ||= methods.inject({}) {|h,m| h[m.name] = m; h}
|
27
|
+
end
|
28
|
+
|
25
29
|
def find_method(name)
|
26
|
-
|
30
|
+
methods_hash[name]
|
27
31
|
end
|
28
32
|
def size
|
29
33
|
Lib.g_struct_info_get_size @gobj
|
data/lib/gir_ffi/lib.rb
CHANGED
@@ -9,6 +9,7 @@ module GirFFI
|
|
9
9
|
enum :IRepositoryLoadFlags, [:LAZY, (1<<0)]
|
10
10
|
|
11
11
|
attach_function :g_irepository_get_default, [], :pointer
|
12
|
+
attach_function :g_irepository_prepend_search_path, [:string], :void
|
12
13
|
attach_function :g_irepository_require,
|
13
14
|
[:pointer, :string, :string, :IRepositoryLoadFlags, :pointer],
|
14
15
|
:pointer
|
@@ -49,6 +50,7 @@ module GirFFI
|
|
49
50
|
attach_function :g_base_info_get_type, [:pointer], :IInfoType
|
50
51
|
attach_function :g_base_info_get_name, [:pointer], :string
|
51
52
|
attach_function :g_base_info_get_namespace, [:pointer], :string
|
53
|
+
attach_function :g_base_info_get_container, [:pointer], :pointer
|
52
54
|
attach_function :g_base_info_is_deprecated, [:pointer], :bool
|
53
55
|
attach_function :g_base_info_equal, [:pointer, :pointer], :bool
|
54
56
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module GirFFI
|
2
|
+
module Overrides
|
3
|
+
module GLib
|
4
|
+
def self.included base
|
5
|
+
base.extend ClassMethods
|
6
|
+
attach_non_introspectable_functions(base)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.attach_non_introspectable_functions base
|
10
|
+
base::Lib.attach_function :g_slist_prepend, [:pointer, :pointer],
|
11
|
+
:pointer
|
12
|
+
base::Lib.attach_function :g_list_append, [:pointer, :pointer],
|
13
|
+
:pointer
|
14
|
+
end
|
15
|
+
|
16
|
+
module ClassMethods
|
17
|
+
# FIXME: Should not be so visible for end users.
|
18
|
+
def slist_prepend slist, data
|
19
|
+
::GLib::SList.wrap(::GLib::Lib.g_slist_prepend slist, data)
|
20
|
+
end
|
21
|
+
|
22
|
+
# FIXME: Should not be so visible for end users.
|
23
|
+
def list_append list, data
|
24
|
+
::GLib::List.wrap(::GLib::Lib.g_list_append list, data)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|