gir_ffi 0.7.6 → 0.7.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.
- checksums.yaml +4 -4
- data/Changelog.md +13 -0
- data/Rakefile +0 -1
- data/TODO.md +4 -0
- data/gir_ffi.gemspec +41 -0
- data/lib/ffi-glib/main_loop.rb +1 -3
- data/lib/ffi-glib/variant.rb +1 -1
- data/lib/ffi-gobject/ruby_closure.rb +1 -1
- data/lib/ffi-gobject_introspection/i_constant_info.rb +15 -11
- data/lib/gir_ffi/builders/user_defined_builder.rb +2 -1
- data/lib/gir_ffi/builders/with_layout.rb +1 -1
- data/lib/gir_ffi/class_base.rb +2 -2
- data/lib/gir_ffi/enum_base.rb +1 -1
- data/lib/gir_ffi/in_out_pointer.rb +1 -1
- data/lib/gir_ffi/info_ext/i_callable_info.rb +1 -1
- data/lib/gir_ffi/info_ext/i_callback_info.rb +1 -1
- data/lib/gir_ffi/info_ext/i_registered_type_info.rb +2 -1
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +1 -1
- data/lib/gir_ffi/method_stubber.rb +1 -1
- data/lib/gir_ffi/version.rb +1 -1
- data/tasks/test.rake +1 -1
- data/test/ffi-glib/iconv_test.rb +1 -1
- data/test/ffi-glib/main_loop_test.rb +27 -0
- data/test/ffi-gobject_introspection/i_constant_info_test.rb +19 -5
- data/test/gir_ffi/class_base_test.rb +4 -4
- data/test/gir_ffi/method_stubber_test.rb +4 -4
- data/test/lib/autogen.sh +1 -0
- data/test/lib/configure.ac +1 -0
- metadata +7 -109
- data/examples/demo_ffi_inherited_layout.rb +0 -21
- data/examples/demo_ffi_nested_struct.rb +0 -17
- data/examples/demo_ffi_safe_inherited_layout.rb +0 -43
- data/examples/hard_coded.rb +0 -167
- data/examples/leak_test.rb +0 -11
- data/examples/print_class.rb +0 -61
- data/tasks/valgrind.rake +0 -3
- data/test/integration/idle_loop_test.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d42de354fa7299aa1335fbc7853d71c290e40672
|
4
|
+
data.tar.gz: 5ac34874e3b063d78efae9e6d866d1c53250a139
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24484386533238755050906dc1d1dbbf31e4d8baf49fb739a9c42cb85176a561f3b280e83eaa06ff249cbb3f77c8b08867f532f0db926618e8be67ad8bb96f19
|
7
|
+
data.tar.gz: 35251a7d050dbf35c96ebb59c6c06588d190551a68629df365267c1723cb85a1d813e1e0bfff1b7850ef7661fecaed0453d6f4bf813968c8b3081e65e1c08538
|
data/Changelog.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.7.7 / 2014-10-21
|
4
|
+
|
5
|
+
* Handle introspecting boolean constants
|
6
|
+
* Provide config.h for versions of the test libs that need it
|
7
|
+
* Include gemspec in the gem
|
8
|
+
* Avoid needless casting from string to symbol by making #setup_and_call take a
|
9
|
+
string
|
10
|
+
* Avoid argument list unpacking by making #setup_and_call take an array of
|
11
|
+
arguments rather than a variable number of arguments
|
12
|
+
* Remove old example files
|
13
|
+
* Let rubygems know about required Ruby version
|
14
|
+
* Various clean-ups
|
15
|
+
|
3
16
|
## 0.7.6 / 2014-08-22
|
4
17
|
|
5
18
|
* Work around respond_to? behavior in JRuby 1.6.13
|
data/Rakefile
CHANGED
data/TODO.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# TODO
|
2
2
|
|
3
|
+
MAKE CONSTRUCTOR_WRAP CHECK TYPES?
|
4
|
+
|
3
5
|
## Memory managment
|
4
6
|
|
5
7
|
GirFFI does not attempt to free any memory at the moment, or lower the
|
@@ -8,6 +10,8 @@ reference count of any objects it gets from GObject. This task therefore involve
|
|
8
10
|
- Free non-GObject pointers as needed (at garbage-collection time)
|
9
11
|
- Lower reference count of GObjects (at garbage-collection time)
|
10
12
|
|
13
|
+
**Use memory_profiler to check memory use (https://github.com/SamSaffron/memory_profiler)**
|
14
|
+
|
11
15
|
## Refactorings
|
12
16
|
|
13
17
|
These in the order they occured to me, and may therefore be fixed in any order.
|
data/gir_ffi.gemspec
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.join(File.dirname(__FILE__), 'lib/gir_ffi/version.rb')
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "gir_ffi"
|
6
|
+
s.version = GirFFI::VERSION
|
7
|
+
|
8
|
+
s.summary = "FFI-based GObject binding using the GObject Introspection Repository"
|
9
|
+
s.required_ruby_version = %q{>= 1.9.3}
|
10
|
+
|
11
|
+
s.authors = ["Matijs van Zuijlen"]
|
12
|
+
s.email = ["matijs@matijs.net"]
|
13
|
+
s.homepage = "http://www.github.com/mvz/ruby-gir-ffi"
|
14
|
+
|
15
|
+
s.license = 'LGPL-2.1'
|
16
|
+
|
17
|
+
s.description = <<-DESC
|
18
|
+
GirFFI creates bindings for GObject-based libraries at runtime based on introspection
|
19
|
+
data provided by the GObject Introspection Repository (GIR) system. Bindings are created
|
20
|
+
at runtime and use FFI to interface with the C libraries. In cases where the GIR does not
|
21
|
+
provide enough or correct information to create sane bindings, overrides may be created.
|
22
|
+
DESC
|
23
|
+
|
24
|
+
s.files = Dir[ '{lib,test,tasks,examples}/**/*',
|
25
|
+
"*.md",
|
26
|
+
"*.gemspec",
|
27
|
+
"Rakefile",
|
28
|
+
"COPYING.LIB" ] & `git ls-files -z`.split("\0")
|
29
|
+
|
30
|
+
s.rdoc_options = ["--main", "README.md"]
|
31
|
+
s.extra_rdoc_files = ["DESIGN.md", "Changelog.md", "README.md", "TODO.md"]
|
32
|
+
|
33
|
+
s.add_runtime_dependency('ffi', ["~> 1.8"])
|
34
|
+
s.add_runtime_dependency('indentation', ["~> 0.1.1"])
|
35
|
+
|
36
|
+
s.add_development_dependency('minitest', ["~> 5.2"])
|
37
|
+
s.add_development_dependency('rr', ["~> 1.1.2"])
|
38
|
+
s.add_development_dependency('rake', ["~> 10.1"])
|
39
|
+
|
40
|
+
s.require_paths = ["lib"]
|
41
|
+
end
|
data/lib/ffi-glib/main_loop.rb
CHANGED
@@ -5,7 +5,7 @@ GLib.load_class :MainLoop
|
|
5
5
|
module GLib
|
6
6
|
# Overrides for GMainLoop, GLib's event loop
|
7
7
|
class MainLoop
|
8
|
-
# Class
|
8
|
+
# Class encapsulationg logic for running an idle handler to make Ruby code
|
9
9
|
# run during GLib's event loop.
|
10
10
|
class ThreadEnabler
|
11
11
|
include Singleton
|
@@ -33,8 +33,6 @@ module GLib
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
setup_instance_method "run_with_thread_enabler"
|
37
|
-
|
38
36
|
def run_with_thread_enabler
|
39
37
|
case RUBY_ENGINE
|
40
38
|
when 'jruby'
|
data/lib/ffi-glib/variant.rb
CHANGED
@@ -2,21 +2,25 @@ module GObjectIntrospection
|
|
2
2
|
# Wraps a GIConstantInfo struct; represents a constant.
|
3
3
|
class IConstantInfo < IBaseInfo
|
4
4
|
TYPE_TAG_TO_UNION_MEMBER = {
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
gboolean: :v_boolean,
|
6
|
+
gint8: :v_int8,
|
7
|
+
gint16: :v_int16,
|
8
|
+
gint32: :v_int32,
|
9
|
+
gint64: :v_int64,
|
10
|
+
guint8: :v_uint8,
|
11
|
+
guint16: :v_uint16,
|
12
|
+
guint32: :v_uint32,
|
13
|
+
guint64: :v_uint64,
|
14
|
+
gdouble: :v_double,
|
15
|
+
utf8: :v_string
|
15
16
|
}
|
16
17
|
|
17
18
|
def value
|
18
|
-
|
19
|
+
case type_tag
|
20
|
+
when :utf8
|
19
21
|
raw_value.force_encoding("utf-8")
|
22
|
+
when :gboolean
|
23
|
+
raw_value != 0
|
20
24
|
else
|
21
25
|
raw_value
|
22
26
|
end
|
@@ -117,7 +117,8 @@ module GirFFI
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def setup_vfuncs object_class_ptr
|
120
|
-
super_class_struct =
|
120
|
+
super_class_struct =
|
121
|
+
superclass.gir_ffi_builder.object_class_struct::Struct.new(object_class_ptr)
|
121
122
|
|
122
123
|
info.vfunc_implementations.each do |impl|
|
123
124
|
setup_vfunc super_class_struct, impl
|
data/lib/gir_ffi/class_base.rb
CHANGED
@@ -11,7 +11,7 @@ module GirFFI
|
|
11
11
|
attr_reader :struct
|
12
12
|
def_delegators :@struct, :to_ptr
|
13
13
|
|
14
|
-
def setup_and_call method,
|
14
|
+
def setup_and_call method, arguments, &block
|
15
15
|
method_name = self.class.try_in_ancestors(:setup_instance_method, method.to_s)
|
16
16
|
|
17
17
|
unless method_name
|
@@ -27,7 +27,7 @@ module GirFFI
|
|
27
27
|
other.class == self.class && to_ptr.address == other.to_ptr.address
|
28
28
|
end
|
29
29
|
|
30
|
-
def self.setup_and_call method,
|
30
|
+
def self.setup_and_call method, arguments, &block
|
31
31
|
method_name = try_in_ancestors(:setup_method, method.to_s)
|
32
32
|
|
33
33
|
unless method_name
|
data/lib/gir_ffi/enum_base.rb
CHANGED
@@ -4,7 +4,7 @@ module GirFFI
|
|
4
4
|
# TODO: Merge implementation with ICallbackInfo and ISignalInfo extensions.
|
5
5
|
module IVFuncInfo
|
6
6
|
def argument_ffi_types
|
7
|
-
args.map
|
7
|
+
args.map(&:to_callback_ffitype).tap do |types|
|
8
8
|
types << :pointer if throws?
|
9
9
|
end
|
10
10
|
end
|
@@ -9,7 +9,7 @@ module GirFFI
|
|
9
9
|
def method_stub
|
10
10
|
<<-STUB.reset_indentation
|
11
11
|
def #{@info.method? ? '' : 'self.'}#{@info.safe_name} *args, &block
|
12
|
-
setup_and_call #{@info.name
|
12
|
+
setup_and_call "#{@info.name}", args, &block
|
13
13
|
end
|
14
14
|
STUB
|
15
15
|
end
|
data/lib/gir_ffi/version.rb
CHANGED
data/tasks/test.rake
CHANGED
@@ -189,6 +189,6 @@ file "test/lib/Makefile" => "test/lib/configure" do
|
|
189
189
|
sh %{cd test/lib && ./configure --enable-maintainer-mode}
|
190
190
|
end
|
191
191
|
|
192
|
-
file "test/lib/configure" do
|
192
|
+
file "test/lib/configure" => ["test/lib/autogen.sh", "test/lib/configure.ac"] do
|
193
193
|
sh %{cd test/lib && NOCONFIGURE=1 ./autogen.sh}
|
194
194
|
end
|
data/test/ffi-glib/iconv_test.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'gir_ffi_test_helper'
|
2
|
+
|
3
|
+
describe GLib::MainLoop do
|
4
|
+
describe "#run" do
|
5
|
+
it "allows other threads to run" do
|
6
|
+
main_loop = GLib::MainLoop.new nil, false
|
7
|
+
|
8
|
+
a = []
|
9
|
+
GLib.timeout_add(GLib::PRIORITY_DEFAULT, 100,
|
10
|
+
proc { main_loop.quit },
|
11
|
+
nil, nil)
|
12
|
+
|
13
|
+
slow_thread = Thread.new do
|
14
|
+
sleep 0.001
|
15
|
+
a << "During run"
|
16
|
+
end
|
17
|
+
|
18
|
+
a << "Before run"
|
19
|
+
main_loop.run
|
20
|
+
a << "After run"
|
21
|
+
|
22
|
+
slow_thread.join
|
23
|
+
|
24
|
+
a.last.must_equal "After run"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -2,16 +2,30 @@ require 'introspection_test_helper'
|
|
2
2
|
|
3
3
|
describe GObjectIntrospection::IConstantInfo do
|
4
4
|
describe "for GLib::USEC_PER_SEC, a constant of type :gint32" do
|
5
|
-
|
6
|
-
@info = get_introspection_data 'GLib', 'USEC_PER_SEC'
|
7
|
-
end
|
5
|
+
let(:constant_info) { get_introspection_data 'GLib', 'USEC_PER_SEC' }
|
8
6
|
|
9
7
|
it "returns :gint32 as its type" do
|
10
|
-
assert_equal :gint32,
|
8
|
+
assert_equal :gint32, constant_info.constant_type.tag
|
11
9
|
end
|
12
10
|
|
13
11
|
it "returns 1_000_000 as its value" do
|
14
|
-
assert_equal 1_000_000,
|
12
|
+
assert_equal 1_000_000, constant_info.value
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "for GLib::SOURCE_CONTINUE, a constant of type :gboolean" do
|
17
|
+
let(:constant_info) { get_introspection_data 'GLib', 'SOURCE_CONTINUE' }
|
18
|
+
|
19
|
+
before do
|
20
|
+
skip unless constant_info
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns :gboolean as its type" do
|
24
|
+
assert_equal :gboolean, constant_info.constant_type.tag
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns true as its value" do
|
28
|
+
assert_equal true, constant_info.value
|
15
29
|
end
|
16
30
|
end
|
17
31
|
end
|
@@ -82,7 +82,7 @@ describe GirFFI::ClassBase do
|
|
82
82
|
end
|
83
83
|
sub_klass.const_set :GIR_FFI_BUILDER, sub_builder
|
84
84
|
|
85
|
-
sub_klass.setup_and_call :foo
|
85
|
+
sub_klass.setup_and_call :foo, []
|
86
86
|
end
|
87
87
|
|
88
88
|
it "calls the method given by the result of .setup_method" do
|
@@ -95,7 +95,7 @@ describe GirFFI::ClassBase do
|
|
95
95
|
end
|
96
96
|
klass.const_set :GIR_FFI_BUILDER, builder
|
97
97
|
|
98
|
-
result = klass.setup_and_call :foo
|
98
|
+
result = klass.setup_and_call :foo, []
|
99
99
|
result.must_equal "correct-result"
|
100
100
|
end
|
101
101
|
end
|
@@ -116,7 +116,7 @@ describe GirFFI::ClassBase do
|
|
116
116
|
|
117
117
|
obj = sub_klass.new
|
118
118
|
|
119
|
-
obj.setup_and_call :foo
|
119
|
+
obj.setup_and_call :foo, []
|
120
120
|
end
|
121
121
|
|
122
122
|
it "calls the method given by the result of .setup_instance_method" do
|
@@ -131,7 +131,7 @@ describe GirFFI::ClassBase do
|
|
131
131
|
|
132
132
|
obj = klass.new
|
133
133
|
|
134
|
-
result = obj.setup_and_call :foo
|
134
|
+
result = obj.setup_and_call :foo, []
|
135
135
|
result.must_equal "correct-result"
|
136
136
|
end
|
137
137
|
end
|
@@ -12,7 +12,7 @@ describe GirFFI::MethodStubber do
|
|
12
12
|
it "creates a method stub" do
|
13
13
|
result.must_equal <<-STUB.reset_indentation
|
14
14
|
def instance_method *args, &block
|
15
|
-
setup_and_call
|
15
|
+
setup_and_call "instance_method", args, &block
|
16
16
|
end
|
17
17
|
STUB
|
18
18
|
end
|
@@ -25,7 +25,7 @@ describe GirFFI::MethodStubber do
|
|
25
25
|
it "creates a class method stub" do
|
26
26
|
result.must_equal <<-STUB.reset_indentation
|
27
27
|
def self.static_method *args, &block
|
28
|
-
setup_and_call
|
28
|
+
setup_and_call "static_method", args, &block
|
29
29
|
end
|
30
30
|
STUB
|
31
31
|
end
|
@@ -38,7 +38,7 @@ describe GirFFI::MethodStubber do
|
|
38
38
|
it "creates a module method stub" do
|
39
39
|
result.must_equal <<-STUB.reset_indentation
|
40
40
|
def self.test_int *args, &block
|
41
|
-
setup_and_call
|
41
|
+
setup_and_call "test_int", args, &block
|
42
42
|
end
|
43
43
|
STUB
|
44
44
|
end
|
@@ -50,7 +50,7 @@ describe GirFFI::MethodStubber do
|
|
50
50
|
it "creates a method stub with a safe name that sets up the unsafe method" do
|
51
51
|
result.must_equal <<-STUB.reset_indentation
|
52
52
|
def _ *args, &block
|
53
|
-
setup_and_call
|
53
|
+
setup_and_call "", args, &block
|
54
54
|
end
|
55
55
|
STUB
|
56
56
|
end
|
data/test/lib/autogen.sh
CHANGED
data/test/lib/configure.ac
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gir_ffi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matijs van Zuijlen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -101,13 +101,8 @@ files:
|
|
101
101
|
- README.md
|
102
102
|
- Rakefile
|
103
103
|
- TODO.md
|
104
|
-
- examples/demo_ffi_inherited_layout.rb
|
105
|
-
- examples/demo_ffi_nested_struct.rb
|
106
|
-
- examples/demo_ffi_safe_inherited_layout.rb
|
107
|
-
- examples/hard_coded.rb
|
108
|
-
- examples/leak_test.rb
|
109
104
|
- examples/main_loop.rb
|
110
|
-
-
|
105
|
+
- gir_ffi.gemspec
|
111
106
|
- lib/ffi-glib.rb
|
112
107
|
- lib/ffi-glib/array.rb
|
113
108
|
- lib/ffi-glib/array_methods.rb
|
@@ -251,7 +246,6 @@ files:
|
|
251
246
|
- lib/gir_ffi/vfunc_implementation.rb
|
252
247
|
- lib/gir_ffi/zero_terminated.rb
|
253
248
|
- tasks/test.rake
|
254
|
-
- tasks/valgrind.rake
|
255
249
|
- test/base_test_helper.rb
|
256
250
|
- test/ffi-glib/array_test.rb
|
257
251
|
- test/ffi-glib/byte_array_test.rb
|
@@ -259,6 +253,7 @@ files:
|
|
259
253
|
- test/ffi-glib/hash_table_test.rb
|
260
254
|
- test/ffi-glib/iconv_test.rb
|
261
255
|
- test/ffi-glib/list_test.rb
|
256
|
+
- test/ffi-glib/main_loop_test.rb
|
262
257
|
- test/ffi-glib/ptr_array_test.rb
|
263
258
|
- test/ffi-glib/ruby_closure_test.rb
|
264
259
|
- test/ffi-glib/s_list_test.rb
|
@@ -340,7 +335,6 @@ files:
|
|
340
335
|
- test/integration/generated_pango_test.rb
|
341
336
|
- test/integration/generated_regress_test.rb
|
342
337
|
- test/integration/generated_secret_test.rb
|
343
|
-
- test/integration/idle_loop_test.rb
|
344
338
|
- test/integration/method_lookup_test.rb
|
345
339
|
- test/introspection_test_helper.rb
|
346
340
|
- test/lib/Makefile.am
|
@@ -362,7 +356,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
362
356
|
requirements:
|
363
357
|
- - ">="
|
364
358
|
- !ruby/object:Gem::Version
|
365
|
-
version:
|
359
|
+
version: 1.9.3
|
366
360
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
367
361
|
requirements:
|
368
362
|
- - ">="
|
@@ -370,104 +364,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
370
364
|
version: '0'
|
371
365
|
requirements: []
|
372
366
|
rubyforge_project:
|
373
|
-
rubygems_version: 2.
|
367
|
+
rubygems_version: 2.4.1
|
374
368
|
signing_key:
|
375
369
|
specification_version: 4
|
376
370
|
summary: FFI-based GObject binding using the GObject Introspection Repository
|
377
|
-
test_files:
|
378
|
-
- test/base_test_helper.rb
|
379
|
-
- test/ffi-glib/array_test.rb
|
380
|
-
- test/ffi-glib/byte_array_test.rb
|
381
|
-
- test/ffi-glib/bytes_test.rb
|
382
|
-
- test/ffi-glib/hash_table_test.rb
|
383
|
-
- test/ffi-glib/iconv_test.rb
|
384
|
-
- test/ffi-glib/list_test.rb
|
385
|
-
- test/ffi-glib/ptr_array_test.rb
|
386
|
-
- test/ffi-glib/ruby_closure_test.rb
|
387
|
-
- test/ffi-glib/s_list_test.rb
|
388
|
-
- test/ffi-glib/strv_test.rb
|
389
|
-
- test/ffi-glib/variant_test.rb
|
390
|
-
- test/ffi-gobject/gobject_test.rb
|
391
|
-
- test/ffi-gobject/object_class_test.rb
|
392
|
-
- test/ffi-gobject/object_test.rb
|
393
|
-
- test/ffi-gobject/value_test.rb
|
394
|
-
- test/ffi-gobject_introspection/i_base_info_test.rb
|
395
|
-
- test/ffi-gobject_introspection/i_constant_info_test.rb
|
396
|
-
- test/ffi-gobject_introspection/i_enum_info_test.rb
|
397
|
-
- test/ffi-gobject_introspection/i_function_info_test.rb
|
398
|
-
- test/ffi-gobject_introspection/i_object_info_test.rb
|
399
|
-
- test/ffi-gobject_introspection/i_registered_type_info_test.rb
|
400
|
-
- test/ffi-gobject_introspection/i_repository_test.rb
|
401
|
-
- test/ffi-gobject_introspection/i_type_info_test.rb
|
402
|
-
- test/ffi-gobject_introspection/lib_test.rb
|
403
|
-
- test/ffi-gobject_test.rb
|
404
|
-
- test/gir_ffi-base/glib/boolean_test.rb
|
405
|
-
- test/gir_ffi-base/glib/strv_test.rb
|
406
|
-
- test/gir_ffi/arg_helper_test.rb
|
407
|
-
- test/gir_ffi/builder_test.rb
|
408
|
-
- test/gir_ffi/builders/argument_builder_test.rb
|
409
|
-
- test/gir_ffi/builders/base_argument_builder_test.rb
|
410
|
-
- test/gir_ffi/builders/callback_argument_builder_test.rb
|
411
|
-
- test/gir_ffi/builders/callback_builder_test.rb
|
412
|
-
- test/gir_ffi/builders/callback_return_value_builder_test.rb
|
413
|
-
- test/gir_ffi/builders/constant_builder_test.rb
|
414
|
-
- test/gir_ffi/builders/enum_builder_test.rb
|
415
|
-
- test/gir_ffi/builders/field_builder_test.rb
|
416
|
-
- test/gir_ffi/builders/function_builder_test.rb
|
417
|
-
- test/gir_ffi/builders/interface_builder_test.rb
|
418
|
-
- test/gir_ffi/builders/module_builder_test.rb
|
419
|
-
- test/gir_ffi/builders/object_builder_test.rb
|
420
|
-
- test/gir_ffi/builders/property_builder_test.rb
|
421
|
-
- test/gir_ffi/builders/registered_type_builder_test.rb
|
422
|
-
- test/gir_ffi/builders/return_value_builder_test.rb
|
423
|
-
- test/gir_ffi/builders/signal_closure_builder_test.rb
|
424
|
-
- test/gir_ffi/builders/struct_builder_test.rb
|
425
|
-
- test/gir_ffi/builders/unintrospectable_builder_test.rb
|
426
|
-
- test/gir_ffi/builders/union_builder_test.rb
|
427
|
-
- test/gir_ffi/builders/user_defined_builder_test.rb
|
428
|
-
- test/gir_ffi/builders/vfunc_builder_test.rb
|
429
|
-
- test/gir_ffi/callback_base_test.rb
|
430
|
-
- test/gir_ffi/class_base_test.rb
|
431
|
-
- test/gir_ffi/error_type_info_test.rb
|
432
|
-
- test/gir_ffi/ffi_ext/pointer_test.rb
|
433
|
-
- test/gir_ffi/g_type_test.rb
|
434
|
-
- test/gir_ffi/in_out_pointer_test.rb
|
435
|
-
- test/gir_ffi/in_pointer_test.rb
|
436
|
-
- test/gir_ffi/info_ext/i_callable_info_test.rb
|
437
|
-
- test/gir_ffi/info_ext/i_callback_info_test.rb
|
438
|
-
- test/gir_ffi/info_ext/i_field_info_test.rb
|
439
|
-
- test/gir_ffi/info_ext/i_function_info_test.rb
|
440
|
-
- test/gir_ffi/info_ext/i_signal_info_test.rb
|
441
|
-
- test/gir_ffi/info_ext/i_type_info_test.rb
|
442
|
-
- test/gir_ffi/info_ext/safe_constant_name_test.rb
|
443
|
-
- test/gir_ffi/info_ext/safe_function_name_test.rb
|
444
|
-
- test/gir_ffi/interface_base_test.rb
|
445
|
-
- test/gir_ffi/method_stubber_test.rb
|
446
|
-
- test/gir_ffi/object_base_test.rb
|
447
|
-
- test/gir_ffi/sized_array_test.rb
|
448
|
-
- test/gir_ffi/type_map_test.rb
|
449
|
-
- test/gir_ffi/unintrospectable_type_info_test.rb
|
450
|
-
- test/gir_ffi/user_defined_property_info_test.rb
|
451
|
-
- test/gir_ffi/user_defined_type_info_test.rb
|
452
|
-
- test/gir_ffi/variable_name_generator_test.rb
|
453
|
-
- test/gir_ffi/version_test.rb
|
454
|
-
- test/gir_ffi/zero_terminated_test.rb
|
455
|
-
- test/gir_ffi_test.rb
|
456
|
-
- test/gir_ffi_test_helper.rb
|
457
|
-
- test/integration/derived_classes_test.rb
|
458
|
-
- test/integration/generated_gimarshallingtests_test.rb
|
459
|
-
- test/integration/generated_gio_test.rb
|
460
|
-
- test/integration/generated_glib_test.rb
|
461
|
-
- test/integration/generated_gobject_test.rb
|
462
|
-
- test/integration/generated_pango_ft2_test.rb
|
463
|
-
- test/integration/generated_pango_test.rb
|
464
|
-
- test/integration/generated_regress_test.rb
|
465
|
-
- test/integration/generated_secret_test.rb
|
466
|
-
- test/integration/idle_loop_test.rb
|
467
|
-
- test/integration/method_lookup_test.rb
|
468
|
-
- test/introspection_test_helper.rb
|
469
|
-
- test/lib/Makefile.am
|
470
|
-
- test/lib/autogen.sh
|
471
|
-
- test/lib/configure.ac
|
472
|
-
- test/lib/m4/jhflags.m4
|
473
|
-
- test/minitest/stats_plugin.rb
|
371
|
+
test_files: []
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# Demonstration program for FFI functionality.
|
2
|
-
#
|
3
|
-
# Show what happens if we call layout again in a subclass. This works in
|
4
|
-
# JRuby, but not in MRI (gives warnings with ffi 0.6.3, is explicitely
|
5
|
-
# forbidden later).
|
6
|
-
#
|
7
|
-
require 'ffi'
|
8
|
-
|
9
|
-
class Foo < FFI::Struct
|
10
|
-
layout :a, :int, :b, :int
|
11
|
-
end
|
12
|
-
|
13
|
-
class Bar < Foo
|
14
|
-
layout :p, Foo, :c, :int
|
15
|
-
end
|
16
|
-
|
17
|
-
bar = Bar.new
|
18
|
-
foo = Foo.new(bar.to_ptr)
|
19
|
-
foo[:a] = 20
|
20
|
-
puts "bar[:p][:a] = #{bar[:p][:a]}"
|
21
|
-
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# Demonstration program for FFI functionality.
|
2
|
-
#
|
3
|
-
# Basic demo of nested struct. Works in MRI, YARV, and JRuby. Does not work
|
4
|
-
# in Rubinius.
|
5
|
-
#
|
6
|
-
require 'ffi'
|
7
|
-
|
8
|
-
module LibTest
|
9
|
-
class Foo < FFI::Struct
|
10
|
-
layout :a, :int, :b, :int
|
11
|
-
end
|
12
|
-
|
13
|
-
class Bar < FFI::Struct
|
14
|
-
layout :f, Foo, :g, :int
|
15
|
-
end
|
16
|
-
end
|
17
|
-
puts LibTest::Bar.members.inspect
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# Demonstrate safe inheritance with layout.
|
2
|
-
#
|
3
|
-
# Uses nested Struct class to separate inheritance from FFI::Struct from
|
4
|
-
# main inheritance structure. Works with MRI and JRuby, without warnings.
|
5
|
-
|
6
|
-
require 'ffi'
|
7
|
-
require 'forwardable'
|
8
|
-
|
9
|
-
class Foo
|
10
|
-
extend Forwardable
|
11
|
-
def_delegators :@struct, :[], :to_ptr
|
12
|
-
|
13
|
-
class Struct < FFI::Struct
|
14
|
-
layout :a, :int, :b, :int
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize(ptr=nil)
|
18
|
-
@struct = ptr.nil? ?
|
19
|
-
self.ffi_structure.new :
|
20
|
-
self.ffi_structure.new(ptr)
|
21
|
-
end
|
22
|
-
|
23
|
-
def ffi_structure
|
24
|
-
self.class.ffi_structure
|
25
|
-
end
|
26
|
-
|
27
|
-
class << self
|
28
|
-
def ffi_structure
|
29
|
-
self.const_get(:Struct)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
class Bar < Foo
|
35
|
-
class Struct < FFI::Struct
|
36
|
-
layout :p, Foo.ffi_structure, :c, :int
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
bar = Bar.new
|
41
|
-
bar[:p][:a] = 20
|
42
|
-
foo = Foo.new(bar.to_ptr)
|
43
|
-
puts foo[:a]
|
data/examples/hard_coded.rb
DELETED
@@ -1,167 +0,0 @@
|
|
1
|
-
# Hard-code FFI-based Gtk+ test program. Nothing is generated here.
|
2
|
-
require 'ffi'
|
3
|
-
module GObject
|
4
|
-
|
5
|
-
module Lib
|
6
|
-
extend FFI::Library
|
7
|
-
CALLBACKS = []
|
8
|
-
ffi_lib "gobject-2.0"
|
9
|
-
callback :GCallback, [], :void
|
10
|
-
enum :GConnectFlags, [:AFTER, (1<<0), :SWAPPED, (1<<1)]
|
11
|
-
|
12
|
-
attach_function :g_signal_connect_data, [:pointer, :string, :GCallback,
|
13
|
-
:pointer, :pointer, :GConnectFlags], :ulong
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.signal_connect_data gobject, signal, prc, data, destroy_data, connect_flags
|
17
|
-
Lib::CALLBACKS << prc
|
18
|
-
Lib.g_signal_connect_data gobject.to_ptr, signal, prc, data, destroy_data, connect_flags
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
module Gtk
|
23
|
-
module Lib
|
24
|
-
extend FFI::Library
|
25
|
-
|
26
|
-
ffi_lib "gtk-x11-2.0"
|
27
|
-
attach_function :gtk_init, [:pointer, :pointer], :void
|
28
|
-
attach_function :gtk_main, [], :void
|
29
|
-
attach_function :gtk_main_quit, [], :void
|
30
|
-
|
31
|
-
attach_function :gtk_widget_show, [:pointer], :pointer
|
32
|
-
attach_function :gtk_widget_destroy, [:pointer], :void
|
33
|
-
attach_function :gtk_container_add, [:pointer, :pointer], :void
|
34
|
-
|
35
|
-
enum :GtkWindowType, [:GTK_WINDOW_TOPLEVEL, :GTK_WINDOW_POPUP]
|
36
|
-
attach_function :gtk_window_new, [:GtkWindowType], :pointer
|
37
|
-
attach_function :gtk_button_new, [], :pointer
|
38
|
-
attach_function :gtk_button_new_with_label, [:string], :pointer
|
39
|
-
attach_function :gtk_label_new, [:string], :pointer
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.init size, ary
|
43
|
-
argv = self.string_array_to_inoutptr ary
|
44
|
-
argc = self.int_to_inoutptr(size)
|
45
|
-
|
46
|
-
Lib.gtk_init argc, argv
|
47
|
-
|
48
|
-
outsize = self.outptr_to_int argc
|
49
|
-
outary = self.outptr_to_string_array argv, ary.nil? ? 0 : ary.size
|
50
|
-
|
51
|
-
return outsize, outary
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.int_to_inoutptr val
|
55
|
-
ptr = FFI::MemoryPointer.new(:int)
|
56
|
-
ptr.write_int val
|
57
|
-
return ptr
|
58
|
-
end
|
59
|
-
|
60
|
-
# Note: This implementation would dump core if the garbage collector runs
|
61
|
-
# before the contents of the pointers is used.
|
62
|
-
def self.string_array_to_inoutptr ary
|
63
|
-
ptrs = ary.map {|a| FFI::MemoryPointer.from_string(a)}
|
64
|
-
block = FFI::MemoryPointer.new(:pointer, ptrs.length)
|
65
|
-
block.write_array_of_pointer ptrs
|
66
|
-
argv = FFI::MemoryPointer.new(:pointer)
|
67
|
-
argv.write_pointer block
|
68
|
-
argv
|
69
|
-
end
|
70
|
-
|
71
|
-
def self.outptr_to_int ptr
|
72
|
-
return ptr.read_int
|
73
|
-
end
|
74
|
-
|
75
|
-
def self.outptr_to_string_array ptr, size
|
76
|
-
block = ptr.read_pointer
|
77
|
-
ptrs = block.read_array_of_pointer(size)
|
78
|
-
return ptrs.map {|p| p.null? ? nil : p.read_string}
|
79
|
-
end
|
80
|
-
|
81
|
-
def self.main; Lib.gtk_main; end
|
82
|
-
def self.main_quit; Lib.gtk_main_quit; end
|
83
|
-
|
84
|
-
class Widget
|
85
|
-
def show
|
86
|
-
Lib.gtk_widget_show(@gobj)
|
87
|
-
end
|
88
|
-
def destroy
|
89
|
-
Lib.gtk_widget_destroy(@gobj)
|
90
|
-
end
|
91
|
-
def to_ptr
|
92
|
-
@gobj
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
class Container < Widget
|
97
|
-
def add widget
|
98
|
-
Lib.gtk_container_add self.to_ptr, widget.to_ptr
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
class Window < Container
|
103
|
-
def initialize type
|
104
|
-
@gobj = Lib.gtk_window_new(type)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
class Button < Container
|
109
|
-
class << self
|
110
|
-
alias :real_new :new
|
111
|
-
end
|
112
|
-
|
113
|
-
def self.new *args
|
114
|
-
obj = self.real_new *args
|
115
|
-
ptr = Lib.gtk_button_new()
|
116
|
-
obj.instance_variable_set :@gobj, ptr
|
117
|
-
obj
|
118
|
-
end
|
119
|
-
|
120
|
-
def self.new_with_label text, *args
|
121
|
-
obj = self.real_new *args
|
122
|
-
ptr = Lib.gtk_button_new_with_label(text)
|
123
|
-
obj.instance_variable_set :@gobj, ptr
|
124
|
-
obj
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
class MyButton < Button
|
129
|
-
def initialize sym
|
130
|
-
puts "Initializing a #{self.class} with symbol #{sym}"
|
131
|
-
end
|
132
|
-
|
133
|
-
def self.new
|
134
|
-
super :foo
|
135
|
-
end
|
136
|
-
|
137
|
-
def self.new_with_label sym
|
138
|
-
super "Hello world", sym
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
(my_len, my_args) = Gtk.init ARGV.length + 1, [$0, *ARGV]
|
144
|
-
p [my_len, my_args]
|
145
|
-
win = Gtk::Window.new(:GTK_WINDOW_TOPLEVEL)
|
146
|
-
|
147
|
-
#btn = Gtk::Button.new_with_label('Hello World')
|
148
|
-
#btn = Gtk::MyButton.new
|
149
|
-
btn = Gtk::MyButton.new_with_label :foobar2
|
150
|
-
|
151
|
-
win.add btn
|
152
|
-
|
153
|
-
quit_prc = Proc.new { Gtk.main_quit }
|
154
|
-
|
155
|
-
# We can create callbacks with a different signature by using FFI::Function
|
156
|
-
# directly.
|
157
|
-
del_prc = FFI::Function.new(:bool, [:pointer, :pointer]) {|a, b|
|
158
|
-
puts "delete event occured"
|
159
|
-
true
|
160
|
-
}
|
161
|
-
GObject.signal_connect_data(win, "destroy", quit_prc, nil, nil, 0)
|
162
|
-
GObject.signal_connect_data(win, "delete-event", del_prc, nil, nil, 0)
|
163
|
-
GObject.signal_connect_data(btn, "clicked", Proc.new { win.destroy }, nil, nil, :SWAPPED)
|
164
|
-
|
165
|
-
btn.show
|
166
|
-
win.show
|
167
|
-
Gtk.main
|
data/examples/leak_test.rb
DELETED
data/examples/print_class.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
-
require 'gir_ffi'
|
3
|
-
|
4
|
-
# File activesupport/lib/active_support/inflector/methods.rb, line 48
|
5
|
-
def underscore(camel_cased_word)
|
6
|
-
word = camel_cased_word.to_s.dup
|
7
|
-
word.gsub!(/::/, '/')
|
8
|
-
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
9
|
-
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
10
|
-
word.tr!("-", "_")
|
11
|
-
word.downcase!
|
12
|
-
word
|
13
|
-
end
|
14
|
-
|
15
|
-
namespace = 'GObject'
|
16
|
-
GirFFI.setup namespace
|
17
|
-
modul = Kernel.const_get(namespace)
|
18
|
-
|
19
|
-
gir = GObjectIntrospection::IRepository.default
|
20
|
-
gir.require namespace, nil
|
21
|
-
infos = gir.infos namespace
|
22
|
-
|
23
|
-
main_file = File.open(File.join('.', "#{underscore(namespace)}.rb"), 'w')
|
24
|
-
|
25
|
-
main_file.write "module #{namespace}\n"
|
26
|
-
|
27
|
-
infos.each do |info|
|
28
|
-
case info.info_type
|
29
|
-
when :function
|
30
|
-
fbuilder = GirFFI::Builder::Function.new info, modul::Lib
|
31
|
-
main_file.write "\n"
|
32
|
-
main_file.write fbuilder.generate
|
33
|
-
main_file.write "\n"
|
34
|
-
when :object
|
35
|
-
main_file.write "class #{info.name} < #{info.parent.name}\n"
|
36
|
-
info.get_methods.each do |minfo|
|
37
|
-
main_file.write "\n"
|
38
|
-
unless minfo.method?
|
39
|
-
main_file.write "class << self\n"
|
40
|
-
end
|
41
|
-
if minfo.constructor?
|
42
|
-
main_file.write "# This method is a constructor\n"
|
43
|
-
end
|
44
|
-
main_file.write "# @return [#{minfo.return_type.tag}]\n"
|
45
|
-
|
46
|
-
fbuilder = GirFFI::Builder::Function.new minfo, modul::Lib
|
47
|
-
main_file.write fbuilder.generate
|
48
|
-
unless minfo.method?
|
49
|
-
main_file.write "end\n"
|
50
|
-
end
|
51
|
-
main_file.write "\n"
|
52
|
-
end
|
53
|
-
main_file.write "end\n"
|
54
|
-
else
|
55
|
-
puts "#{info.info_type}: #{info.name}\n"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
main_file.write "end\n"
|
60
|
-
main_file.close
|
61
|
-
|
data/tasks/valgrind.rake
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'gir_ffi_test_helper'
|
2
|
-
|
3
|
-
describe "threading" do
|
4
|
-
it "works while a MainLoop is running" do
|
5
|
-
main_loop = GLib::MainLoop.new nil, false
|
6
|
-
|
7
|
-
a = []
|
8
|
-
GLib.timeout_add(GLib::PRIORITY_DEFAULT, 100,
|
9
|
-
proc { main_loop.quit },
|
10
|
-
nil, nil)
|
11
|
-
|
12
|
-
slow_thread = Thread.new do
|
13
|
-
sleep 0.001
|
14
|
-
a << "During run"
|
15
|
-
end
|
16
|
-
|
17
|
-
a << "Before run"
|
18
|
-
main_loop.run
|
19
|
-
a << "After run"
|
20
|
-
|
21
|
-
slow_thread.join
|
22
|
-
|
23
|
-
a.last.must_equal "After run"
|
24
|
-
end
|
25
|
-
end
|