summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2025-02-01 05:58:54 +0900
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2025-02-03 10:22:15 +0900
commitb5b509766309f693f3bf0ea1e5214a1d727662ce (patch)
treebe63dfb1fa5fa91bbb463c2caf4ad24e3de7a999
parent56c814a8d3d7ec778345a66d5ba66f4f0f43c4a9 (diff)
[ruby/fiddle] Define Fiddle.last_error family and Fiddle.dlopen
statically (https://github.com/ruby/fiddle/pull/172) `RUBY_ENGINE` and `Fiddle::WINDOWS` should not change in a process, no need to be checked inside the methods. Also, `win32_last_error` and `win32_last_socket_error` are equal to `last_error` on JRuby. https://github.com/ruby/fiddle/commit/50ac00ed53
-rw-r--r--ext/fiddle/lib/fiddle.rb145
1 files changed, 69 insertions, 76 deletions
diff --git a/ext/fiddle/lib/fiddle.rb b/ext/fiddle/lib/fiddle.rb
index 4723d708b3..3976a7874c 100644
--- a/ext/fiddle/lib/fiddle.rb
+++ b/ext/fiddle/lib/fiddle.rb
@@ -10,98 +10,72 @@ require 'fiddle/function'
require 'fiddle/version'
module Fiddle
- if WINDOWS
- # Returns the last win32 +Error+ of the current executing +Thread+ or nil
- # if none
- def self.win32_last_error
- if RUBY_ENGINE == 'jruby'
- errno = FFI.errno
- errno == 0 ? nil : errno
- else
- Thread.current[:__FIDDLE_WIN32_LAST_ERROR__]
- end
+ case RUBY_ENGINE
+ when 'jruby'
+ def self.last_error
+ FFI.errno.nonzero?
end
- # Sets the last win32 +Error+ of the current executing +Thread+ to +error+
- def self.win32_last_error= error
- if RUBY_ENGINE == 'jruby'
- FFI.errno = error || 0
- else
- Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] = error
- end
- end
-
- # Returns the last win32 socket +Error+ of the current executing
- # +Thread+ or nil if none
- def self.win32_last_socket_error
- if RUBY_ENGINE == 'jruby'
- errno = FFI.errno
- errno == 0 ? nil : errno
- else
- Thread.current[:__FIDDLE_WIN32_LAST_SOCKET_ERROR__]
- end
+ def self.last_error= error
+ FFI.errno = error || 0
end
- # Sets the last win32 socket +Error+ of the current executing
- # +Thread+ to +error+
- def self.win32_last_socket_error= error
- if RUBY_ENGINE == 'jruby'
- FFI.errno = error || 0
- else
- Thread.current[:__FIDDLE_WIN32_LAST_SOCKET_ERROR__] = error
+ if WINDOWS
+ class << self
+ alias win32_last_error last_error
+ alias win32_last_error= last_error=
+ alias win32_last_socket_error last_error
+ alias win32_last_socket_error= last_error=
end
end
- end
-
- # Returns the last +Error+ of the current executing +Thread+ or nil if none
- def self.last_error
- if RUBY_ENGINE == 'jruby'
- errno = FFI.errno
- errno == 0 ? nil : errno
- else
+ else
+ # Returns the last +Error+ of the current executing +Thread+ or nil if none
+ def self.last_error
Thread.current[:__FIDDLE_LAST_ERROR__]
end
- end
- # Sets the last +Error+ of the current executing +Thread+ to +error+
- def self.last_error= error
- if RUBY_ENGINE == 'jruby'
- FFI.errno = error || 0
- else
+ # Sets the last +Error+ of the current executing +Thread+ to +error+
+ def self.last_error= error
Thread.current[:__DL2_LAST_ERROR__] = error
Thread.current[:__FIDDLE_LAST_ERROR__] = error
end
+
+ if WINDOWS
+ # Returns the last win32 +Error+ of the current executing +Thread+ or nil
+ # if none
+ def self.win32_last_error
+ Thread.current[:__FIDDLE_WIN32_LAST_ERROR__]
+ end
+
+ # Sets the last win32 +Error+ of the current executing +Thread+ to +error+
+ def self.win32_last_error= error
+ Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] = error
+ end
+
+ # Returns the last win32 socket +Error+ of the current executing
+ # +Thread+ or nil if none
+ def self.win32_last_socket_error
+ Thread.current[:__FIDDLE_WIN32_LAST_SOCKET_ERROR__]
+ end
+
+ # Sets the last win32 socket +Error+ of the current executing
+ # +Thread+ to +error+
+ def self.win32_last_socket_error= error
+ Thread.current[:__FIDDLE_WIN32_LAST_SOCKET_ERROR__] = error
+ end
+ end
end
- # call-seq: dlopen(library) => Fiddle::Handle
- #
- # Creates a new handler that opens +library+, and returns an instance of
- # Fiddle::Handle.
- #
- # If +nil+ is given for the +library+, Fiddle::Handle::DEFAULT is used, which
- # is the equivalent to RTLD_DEFAULT. See <code>man 3 dlopen</code> for more.
- #
- # lib = Fiddle.dlopen(nil)
- #
- # The default is dependent on OS, and provide a handle for all libraries
- # already loaded. For example, in most cases you can use this to access
- # +libc+ functions, or ruby functions like +rb_str_new+.
- #
- # See Fiddle::Handle.new for more.
- def dlopen library
- begin
+ case RUBY_PLATFORM
+ when /linux/
+ def dlopen library
Fiddle::Handle.new(library)
rescue DLError => error
- case RUBY_PLATFORM
- when /linux/
- case error.message
- when /\A(\/.+?): (?:invalid ELF header|file too short)/
- # This may be a linker script:
- # https://sourceware.org/binutils/docs/ld.html#Scripts
- path = $1
- else
- raise
- end
+ case error.message
+ when /\A(\/.+?): (?:invalid ELF header|file too short)/
+ # This may be a linker script:
+ # https://sourceware.org/binutils/docs/ld.html#Scripts
+ path = $1
else
raise
end
@@ -123,6 +97,25 @@ module Fiddle
# Not found
raise
end
+ else
+ # call-seq: dlopen(library) => Fiddle::Handle
+ #
+ # Creates a new handler that opens +library+, and returns an instance of
+ # Fiddle::Handle.
+ #
+ # If +nil+ is given for the +library+, Fiddle::Handle::DEFAULT is used, which
+ # is the equivalent to RTLD_DEFAULT. See <code>man 3 dlopen</code> for more.
+ #
+ # lib = Fiddle.dlopen(nil)
+ #
+ # The default is dependent on OS, and provide a handle for all libraries
+ # already loaded. For example, in most cases you can use this to access
+ # +libc+ functions, or ruby functions like +rb_str_new+.
+ #
+ # See Fiddle::Handle.new for more.
+ def dlopen library
+ Fiddle::Handle.new(library)
+ end
end
module_function :dlopen