Skip to content

Commit 798b2ff

Browse files
committed
Rename the FFI backend since it is no longer JRuby-specific
1 parent 41c21f5 commit 798b2ff

File tree

12 files changed

+103
-136
lines changed

12 files changed

+103
-136
lines changed

fiddle.gemspec

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,10 @@ Gem::Specification.new do |spec|
3838
"lib/fiddle.rb",
3939
"lib/fiddle/closure.rb",
4040
"lib/fiddle/cparser.rb",
41+
"lib/fiddle/ffi_backend.rb",
4142
"lib/fiddle/function.rb",
4243
"lib/fiddle/import.rb",
43-
"lib/fiddle/jruby.rb",
4444
"lib/fiddle/pack.rb",
45-
"lib/fiddle/ruby.rb",
4645
"lib/fiddle/struct.rb",
4746
"lib/fiddle/truffleruby.rb",
4847
"lib/fiddle/types.rb",

lib/fiddle.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# frozen_string_literal: true
22

3-
require "fiddle/#{RUBY_ENGINE}"
3+
if RUBY_ENGINE == 'ruby'
4+
require 'fiddle.so'
5+
else
6+
require 'fiddle/ffi_backend'
7+
end
48
require 'fiddle/closure'
59
require 'fiddle/function'
610
require 'fiddle/version'

lib/fiddle/jruby.rb renamed to lib/fiddle/ffi_backend.rb

Lines changed: 60 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# This is part of JRuby's FFI-based fiddle implementation.
1+
# This is based on JRuby's FFI-based fiddle implementation.
22

33
require 'ffi'
44

@@ -74,7 +74,7 @@ module Types
7474

7575
WINDOWS = FFI::Platform.windows?
7676

77-
module JRuby
77+
module FFIBackend
7878
FFITypes = {
7979
'c' => FFI::Type::INT8,
8080
'h' => FFI::Type::INT16,
@@ -104,16 +104,16 @@ module JRuby
104104
Types::VARIADIC => FFI::Type::Builtin::VARARGS,
105105
}
106106

107-
def self.__ffi_type__(dl_type)
108-
if dl_type.is_a?(Symbol)
109-
dl_type = Types.const_get(dl_type.to_s.upcase)
107+
def self.to_ffi_type(fiddle_type)
108+
if fiddle_type.is_a?(Symbol)
109+
fiddle_type = Types.const_get(fiddle_type.to_s.upcase)
110110
end
111-
if !dl_type.is_a?(Integer) && dl_type.respond_to?(:to_int)
112-
dl_type = dl_type.to_int
111+
if !fiddle_type.is_a?(Integer) && fiddle_type.respond_to?(:to_int)
112+
fiddle_type = fiddle_type.to_int
113113
end
114-
ffi_type = FFITypes[dl_type]
115-
ffi_type = FFITypes[-dl_type] if ffi_type.nil? && dl_type.is_a?(Integer) && dl_type < 0
116-
raise TypeError.new("cannot convert #{dl_type} to ffi") unless ffi_type
114+
ffi_type = FFITypes[fiddle_type]
115+
ffi_type = FFITypes[-fiddle_type] if ffi_type.nil? && fiddle_type.is_a?(Integer) && fiddle_type < 0
116+
raise TypeError.new("cannot convert #{fiddle_type} to ffi") unless ffi_type
117117
ffi_type
118118
end
119119
end
@@ -133,8 +133,8 @@ def initialize(ptr, args, return_type, abi = DEFAULT, kwargs = nil)
133133
@ptr, @args, @return_type, @abi = ptr, args, return_type, abi
134134
raise TypeError.new "invalid argument types" unless args.is_a?(Array)
135135

136-
ffi_return_type = Fiddle::JRuby::__ffi_type__(@return_type)
137-
ffi_args = @args.map { |t| Fiddle::JRuby.__ffi_type__(t) }
136+
ffi_return_type = Fiddle::FFIBackend.to_ffi_type(@return_type)
137+
ffi_args = @args.map { |t| Fiddle::FFIBackend.to_ffi_type(t) }
138138
pointer = FFI::Pointer.new(ptr.to_i)
139139
options = {convention: @abi}
140140
if ffi_args.last == FFI::Type::Builtin::VARARGS
@@ -156,7 +156,7 @@ def call(*args, &block)
156156
if args[i] == :const_string || args[i] == Types::CONST_STRING
157157
args[i + 1] = String.try_convert(args[i + 1]) || args[i + 1]
158158
end
159-
args[i] = Fiddle::JRuby.__ffi_type__(args[i])
159+
args[i] = Fiddle::FFIBackend.to_ffi_type(args[i])
160160
end
161161
else
162162
args.map! do |arg|
@@ -181,11 +181,11 @@ def initialize(ret, args, abi = Function::DEFAULT)
181181
raise TypeError.new "invalid argument types" unless args.is_a?(Array)
182182

183183
@ctype, @args = ret, args
184-
ffi_args = @args.map { |t| Fiddle::JRuby.__ffi_type__(t) }
184+
ffi_args = @args.map { |t| Fiddle::FFIBackend.to_ffi_type(t) }
185185
if ffi_args.size == 1 && ffi_args[0] == FFI::Type::Builtin::VOID
186186
ffi_args = []
187187
end
188-
return_type = Fiddle::JRuby.__ffi_type__(@ctype)
188+
return_type = Fiddle::FFIBackend.to_ffi_type(@ctype)
189189
raise "#{self.class} must implement #call" unless respond_to?(:call)
190190
callable = method(:call)
191191
@function = FFI::Function.new(return_type, ffi_args, callable, convention: abi)
@@ -563,51 +563,51 @@ def cleared?
563563
RUBY_FREE = Fiddle::Pointer::LibC::FREE.address
564564
NULL = Fiddle::Pointer.new(0)
565565

566-
ALIGN_VOIDP = Fiddle::JRuby::FFITypes[Types::VOIDP].alignment
567-
ALIGN_CHAR = Fiddle::JRuby::FFITypes[Types::CHAR].alignment
568-
ALIGN_SHORT = Fiddle::JRuby::FFITypes[Types::SHORT].alignment
569-
ALIGN_INT = Fiddle::JRuby::FFITypes[Types::INT].alignment
570-
ALIGN_LONG = Fiddle::JRuby::FFITypes[Types::LONG].alignment
571-
ALIGN_LONG_LONG = Fiddle::JRuby::FFITypes[Types::LONG_LONG].alignment
572-
ALIGN_INT8_T = Fiddle::JRuby::FFITypes[Types::INT8_T].alignment
573-
ALIGN_INT16_T = Fiddle::JRuby::FFITypes[Types::INT16_T].alignment
574-
ALIGN_INT32_T = Fiddle::JRuby::FFITypes[Types::INT32_T].alignment
575-
ALIGN_INT64_T = Fiddle::JRuby::FFITypes[Types::INT64_T].alignment
576-
ALIGN_FLOAT = Fiddle::JRuby::FFITypes[Types::FLOAT].alignment
577-
ALIGN_DOUBLE = Fiddle::JRuby::FFITypes[Types::DOUBLE].alignment
578-
ALIGN_BOOL = Fiddle::JRuby::FFITypes[Types::BOOL].alignment
579-
ALIGN_SIZE_T = Fiddle::JRuby::FFITypes[Types::SIZE_T].alignment
566+
ALIGN_VOIDP = Fiddle::FFIBackend::FFITypes[Types::VOIDP].alignment
567+
ALIGN_CHAR = Fiddle::FFIBackend::FFITypes[Types::CHAR].alignment
568+
ALIGN_SHORT = Fiddle::FFIBackend::FFITypes[Types::SHORT].alignment
569+
ALIGN_INT = Fiddle::FFIBackend::FFITypes[Types::INT].alignment
570+
ALIGN_LONG = Fiddle::FFIBackend::FFITypes[Types::LONG].alignment
571+
ALIGN_LONG_LONG = Fiddle::FFIBackend::FFITypes[Types::LONG_LONG].alignment
572+
ALIGN_INT8_T = Fiddle::FFIBackend::FFITypes[Types::INT8_T].alignment
573+
ALIGN_INT16_T = Fiddle::FFIBackend::FFITypes[Types::INT16_T].alignment
574+
ALIGN_INT32_T = Fiddle::FFIBackend::FFITypes[Types::INT32_T].alignment
575+
ALIGN_INT64_T = Fiddle::FFIBackend::FFITypes[Types::INT64_T].alignment
576+
ALIGN_FLOAT = Fiddle::FFIBackend::FFITypes[Types::FLOAT].alignment
577+
ALIGN_DOUBLE = Fiddle::FFIBackend::FFITypes[Types::DOUBLE].alignment
578+
ALIGN_BOOL = Fiddle::FFIBackend::FFITypes[Types::BOOL].alignment
579+
ALIGN_SIZE_T = Fiddle::FFIBackend::FFITypes[Types::SIZE_T].alignment
580580
ALIGN_SSIZE_T = ALIGN_SIZE_T
581-
ALIGN_PTRDIFF_T = Fiddle::JRuby::FFITypes[Types::PTRDIFF_T].alignment
582-
ALIGN_INTPTR_T = Fiddle::JRuby::FFITypes[Types::INTPTR_T].alignment
583-
ALIGN_UINTPTR_T = Fiddle::JRuby::FFITypes[Types::UINTPTR_T].alignment
584-
585-
SIZEOF_VOIDP = Fiddle::JRuby::FFITypes[Types::VOIDP].size
586-
SIZEOF_CHAR = Fiddle::JRuby::FFITypes[Types::CHAR].size
587-
SIZEOF_UCHAR = Fiddle::JRuby::FFITypes[Types::UCHAR].size
588-
SIZEOF_SHORT = Fiddle::JRuby::FFITypes[Types::SHORT].size
589-
SIZEOF_USHORT = Fiddle::JRuby::FFITypes[Types::USHORT].size
590-
SIZEOF_INT = Fiddle::JRuby::FFITypes[Types::INT].size
591-
SIZEOF_UINT = Fiddle::JRuby::FFITypes[Types::UINT].size
592-
SIZEOF_LONG = Fiddle::JRuby::FFITypes[Types::LONG].size
593-
SIZEOF_ULONG = Fiddle::JRuby::FFITypes[Types::ULONG].size
594-
SIZEOF_LONG_LONG = Fiddle::JRuby::FFITypes[Types::LONG_LONG].size
595-
SIZEOF_ULONG_LONG = Fiddle::JRuby::FFITypes[Types::ULONG_LONG].size
596-
SIZEOF_INT8_T = Fiddle::JRuby::FFITypes[Types::INT8_T].size
597-
SIZEOF_UINT8_T = Fiddle::JRuby::FFITypes[Types::UINT8_T].size
598-
SIZEOF_INT16_T = Fiddle::JRuby::FFITypes[Types::INT16_T].size
599-
SIZEOF_UINT16_T = Fiddle::JRuby::FFITypes[Types::UINT16_T].size
600-
SIZEOF_INT32_T = Fiddle::JRuby::FFITypes[Types::INT32_T].size
601-
SIZEOF_UINT32_T = Fiddle::JRuby::FFITypes[Types::UINT32_T].size
602-
SIZEOF_INT64_T = Fiddle::JRuby::FFITypes[Types::INT64_T].size
603-
SIZEOF_UINT64_T = Fiddle::JRuby::FFITypes[Types::UINT64_T].size
604-
SIZEOF_FLOAT = Fiddle::JRuby::FFITypes[Types::FLOAT].size
605-
SIZEOF_DOUBLE = Fiddle::JRuby::FFITypes[Types::DOUBLE].size
606-
SIZEOF_BOOL = Fiddle::JRuby::FFITypes[Types::BOOL].size
607-
SIZEOF_SIZE_T = Fiddle::JRuby::FFITypes[Types::SIZE_T].size
581+
ALIGN_PTRDIFF_T = Fiddle::FFIBackend::FFITypes[Types::PTRDIFF_T].alignment
582+
ALIGN_INTPTR_T = Fiddle::FFIBackend::FFITypes[Types::INTPTR_T].alignment
583+
ALIGN_UINTPTR_T = Fiddle::FFIBackend::FFITypes[Types::UINTPTR_T].alignment
584+
585+
SIZEOF_VOIDP = Fiddle::FFIBackend::FFITypes[Types::VOIDP].size
586+
SIZEOF_CHAR = Fiddle::FFIBackend::FFITypes[Types::CHAR].size
587+
SIZEOF_UCHAR = Fiddle::FFIBackend::FFITypes[Types::UCHAR].size
588+
SIZEOF_SHORT = Fiddle::FFIBackend::FFITypes[Types::SHORT].size
589+
SIZEOF_USHORT = Fiddle::FFIBackend::FFITypes[Types::USHORT].size
590+
SIZEOF_INT = Fiddle::FFIBackend::FFITypes[Types::INT].size
591+
SIZEOF_UINT = Fiddle::FFIBackend::FFITypes[Types::UINT].size
592+
SIZEOF_LONG = Fiddle::FFIBackend::FFITypes[Types::LONG].size
593+
SIZEOF_ULONG = Fiddle::FFIBackend::FFITypes[Types::ULONG].size
594+
SIZEOF_LONG_LONG = Fiddle::FFIBackend::FFITypes[Types::LONG_LONG].size
595+
SIZEOF_ULONG_LONG = Fiddle::FFIBackend::FFITypes[Types::ULONG_LONG].size
596+
SIZEOF_INT8_T = Fiddle::FFIBackend::FFITypes[Types::INT8_T].size
597+
SIZEOF_UINT8_T = Fiddle::FFIBackend::FFITypes[Types::UINT8_T].size
598+
SIZEOF_INT16_T = Fiddle::FFIBackend::FFITypes[Types::INT16_T].size
599+
SIZEOF_UINT16_T = Fiddle::FFIBackend::FFITypes[Types::UINT16_T].size
600+
SIZEOF_INT32_T = Fiddle::FFIBackend::FFITypes[Types::INT32_T].size
601+
SIZEOF_UINT32_T = Fiddle::FFIBackend::FFITypes[Types::UINT32_T].size
602+
SIZEOF_INT64_T = Fiddle::FFIBackend::FFITypes[Types::INT64_T].size
603+
SIZEOF_UINT64_T = Fiddle::FFIBackend::FFITypes[Types::UINT64_T].size
604+
SIZEOF_FLOAT = Fiddle::FFIBackend::FFITypes[Types::FLOAT].size
605+
SIZEOF_DOUBLE = Fiddle::FFIBackend::FFITypes[Types::DOUBLE].size
606+
SIZEOF_BOOL = Fiddle::FFIBackend::FFITypes[Types::BOOL].size
607+
SIZEOF_SIZE_T = Fiddle::FFIBackend::FFITypes[Types::SIZE_T].size
608608
SIZEOF_SSIZE_T = SIZEOF_SIZE_T
609-
SIZEOF_PTRDIFF_T = Fiddle::JRuby::FFITypes[Types::PTRDIFF_T].size
610-
SIZEOF_INTPTR_T = Fiddle::JRuby::FFITypes[Types::INTPTR_T].size
611-
SIZEOF_UINTPTR_T = Fiddle::JRuby::FFITypes[Types::UINTPTR_T].size
612-
SIZEOF_CONST_STRING = Fiddle::JRuby::FFITypes[Types::VOIDP].size
609+
SIZEOF_PTRDIFF_T = Fiddle::FFIBackend::FFITypes[Types::PTRDIFF_T].size
610+
SIZEOF_INTPTR_T = Fiddle::FFIBackend::FFITypes[Types::INTPTR_T].size
611+
SIZEOF_UINTPTR_T = Fiddle::FFIBackend::FFITypes[Types::UINTPTR_T].size
612+
SIZEOF_CONST_STRING = Fiddle::FFIBackend::FFITypes[Types::VOIDP].size
613613
end

lib/fiddle/ruby.rb

Lines changed: 0 additions & 1 deletion
This file was deleted.

lib/fiddle/truffleruby.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
require_relative 'jruby'
1+
require_relative 'ffi_backend'

test/fiddle/helper.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,10 @@ def teardown
183183
end
184184
end
185185

186+
def ffi_backend?
187+
RUBY_ENGINE != 'ruby'
188+
end
189+
186190
def under_gc_stress
187191
stress, GC.stress = GC.stress, true
188192
yield

test/fiddle/test_closure.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ def call thing
5858
end
5959

6060
def test_const_string
61-
if RUBY_ENGINE == "jruby" or RUBY_ENGINE == "truffleruby"
61+
if ffi_backend?
6262
omit("Closure with :const_string works but " +
63-
"Function with :const_string doesn't work with JRuby")
63+
"Function with :const_string doesn't work with FFI backend")
6464
end
6565

6666
closure_class = Class.new(Closure) do

test/fiddle/test_fiddle.rb

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,8 @@
66

77
class TestFiddle < Fiddle::TestCase
88
def test_nil_true_etc
9-
if RUBY_ENGINE == "jruby"
10-
omit("Fiddle::Q* aren't supported with JRuby")
11-
end
12-
if RUBY_ENGINE == "truffleruby"
13-
omit("Fiddle::Q* aren't supported with TruffleRuby")
9+
if ffi_backend?
10+
omit("Fiddle::Q* aren't supported with FFI backend")
1411
end
1512

1613
assert_equal Fiddle::Qtrue, Fiddle.dlwrap(true)
@@ -33,8 +30,8 @@ def test_dlopen_linker_script_input_linux
3330
if Dir.glob("/usr/lib/*/libncurses.so").empty?
3431
omit("libncurses.so is needed")
3532
end
36-
if RUBY_ENGINE == "truffleruby"
37-
omit("Fiddle::Handle#file_name doesn't exist in TruffleRuby")
33+
if ffi_backend?
34+
omit("Fiddle::Handle#file_name doesn't exist in FFI backend")
3835
end
3936

4037
# libncurses.so uses INPUT() on Debian GNU/Linux
@@ -51,8 +48,8 @@ def test_dlopen_linker_script_input_linux
5148

5249
def test_dlopen_linker_script_group_linux
5350
omit("This is only for Linux") unless RUBY_PLATFORM.match?("linux")
54-
if RUBY_ENGINE == "truffleruby"
55-
omit("Fiddle::Handle#file_name doesn't exist in TruffleRuby")
51+
if ffi_backend?
52+
omit("Fiddle::Handle#file_name doesn't exist in FFI backend")
5653
end
5754

5855
# libc.so uses GROUP() on Debian GNU/Linux

test/fiddle/test_function.rb

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,8 @@ def call one
112112
end
113113

114114
def test_last_error
115-
if RUBY_ENGINE == "jruby"
116-
omit("Fiddle.last_error doesn't work with JRuby")
117-
end
118-
if RUBY_ENGINE == "truffleruby"
119-
omit("Fiddle.last_error doesn't work with TruffleRuby")
115+
if ffi_backend?
116+
omit("Fiddle.last_error doesn't work with FFI backend")
120117
end
121118

122119
func = Function.new(@libc['strcpy'], [TYPE_VOIDP, TYPE_VOIDP], TYPE_VOIDP)

test/fiddle/test_handle.rb

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,17 @@ class TestHandle < TestCase
99
include Fiddle
1010

1111
def test_to_i
12-
if RUBY_ENGINE == "jruby"
13-
omit("Fiddle::Handle#to_i is unavailable with JRuby")
14-
end
15-
if RUBY_ENGINE == "truffleruby"
16-
omit("Fiddle::Handle#to_i is unavailable with TruffleRuby")
12+
if ffi_backend?
13+
omit("Fiddle::Handle#to_i is unavailable with FFI backend")
1714
end
1815

1916
handle = Fiddle::Handle.new(LIBC_SO)
2017
assert_kind_of Integer, handle.to_i
2118
end
2219

2320
def test_to_ptr
24-
if RUBY_ENGINE == "jruby"
25-
omit("Fiddle::Handle#to_i is unavailable with JRuby")
26-
end
27-
if RUBY_ENGINE == "truffleruby"
28-
omit("Fiddle::Handle#to_i is unavailable with TruffleRuby")
21+
if ffi_backend?
22+
omit("Fiddle::Handle#to_i is unavailable with FFI backend")
2923
end
3024

3125
handle = Fiddle::Handle.new(LIBC_SO)
@@ -40,11 +34,8 @@ def test_static_sym_unknown
4034
end
4135

4236
def test_static_sym
43-
if RUBY_ENGINE == "jruby"
44-
omit("We can't assume static symbols with JRuby")
45-
end
46-
if RUBY_ENGINE == "truffleruby"
47-
omit("We can't assume static symbols with TruffleRuby")
37+
if ffi_backend?
38+
omit("We can't assume static symbols with FFI backend")
4839
end
4940

5041
begin
@@ -142,11 +133,8 @@ def test_disable_close
142133
end
143134

144135
def test_file_name
145-
if RUBY_ENGINE == "jruby"
146-
omit("Fiddle::Handle#file_name doesn't exist in JRuby")
147-
end
148-
if RUBY_ENGINE == "truffleruby"
149-
omit("Fiddle::Handle#file_name doesn't exist in TruffleRuby")
136+
if ffi_backend?
137+
omit("Fiddle::Handle#file_name doesn't exist in FFI backend")
150138
end
151139

152140
file_name = Handle.new(LIBC_SO).file_name
@@ -167,11 +155,8 @@ def test_file_name
167155
end
168156

169157
def test_NEXT
170-
if RUBY_ENGINE == "jruby"
171-
omit("Fiddle::Handle::NEXT doesn't exist in JRuby")
172-
end
173-
if RUBY_ENGINE == "truffleruby"
174-
omit("Fiddle::Handle::NEXT doesn't exist in TruffleRuby")
158+
if ffi_backend?
159+
omit("Fiddle::Handle::NEXT doesn't exist in FFI backend")
175160
end
176161

177162
begin

0 commit comments

Comments
 (0)