gir_ffi 0.7.6 → 0.7.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|