Skip to content

Commit 15e6f13

Browse files
eregonhsbt
authored andcommitted
[ruby/fiddle] Fix Fiddle.last_error on FFI backend and improve test
to work for all (ruby/fiddle#173) ruby/fiddle@ef2382a7ef
1 parent b5b5097 commit 15e6f13

File tree

2 files changed

+28
-14
lines changed

2 files changed

+28
-14
lines changed

ext/fiddle/lib/fiddle.rb

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,30 @@
1010
require 'fiddle/version'
1111

1212
module Fiddle
13-
case RUBY_ENGINE
14-
when 'jruby'
13+
if RUBY_ENGINE != 'ruby' # FFI backend
1514
def self.last_error
16-
FFI.errno.nonzero?
15+
FFI.errno
1716
end
1817

19-
def self.last_error= error
18+
def self.last_error=(error)
2019
FFI.errno = error || 0
2120
end
2221

2322
if WINDOWS
2423
class << self
25-
alias win32_last_error last_error
26-
alias win32_last_error= last_error=
27-
alias win32_last_socket_error last_error
28-
alias win32_last_socket_error= last_error=
24+
def win32_last_error
25+
FFI.errno.nonzero?
26+
end
27+
def win32_last_error=(error)
28+
FFI.errno = error || 0
29+
end
30+
31+
def win32_last_socket_error
32+
FFI.errno.nonzero?
33+
end
34+
def win32_last_socket_error=(error)
35+
FFI.errno = error || 0
36+
end
2937
end
3038
end
3139
else

test/fiddle/test_function.rb

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ module Fiddle
88
class TestFunction < Fiddle::TestCase
99
def setup
1010
super
11-
Fiddle.last_error = nil
11+
Fiddle.last_error = 0
1212
if WINDOWS
1313
Fiddle.win32_last_error = nil
1414
Fiddle.win32_last_socket_error = nil
@@ -126,14 +126,20 @@ def call one
126126
end
127127

128128
def test_last_error
129-
if ffi_backend?
130-
omit("Fiddle.last_error doesn't work with FFI backend")
129+
if RUBY_ENGINE == 'jruby' && WINDOWS
130+
omit("Fiddle.last_error doesn't work well on JRuby on Windows")
131131
end
132132

133-
func = Function.new(@libc['strcpy'], [TYPE_VOIDP, TYPE_VOIDP], TYPE_VOIDP)
133+
require 'rbconfig/sizeof'
134134

135-
assert_nil Fiddle.last_error
136-
func.call(+"000", "123")
135+
strtol = Function.new(@libc['strtol'], [TYPE_VOIDP, TYPE_VOIDP, TYPE_INT], TYPE_LONG)
136+
137+
assert_equal 0, Fiddle.last_error
138+
139+
assert_equal RbConfig::LIMITS["LONG_MAX"], strtol.call((2**128).to_s, nil, 10) # overflow
140+
assert_equal Errno::ERANGE::Errno, Fiddle.last_error
141+
142+
assert_equal 123, strtol.call("123", nil, 10)
137143
refute_nil Fiddle.last_error
138144
end
139145

0 commit comments

Comments
 (0)