[前][次][番号順一覧][スレッド一覧]

ruby-changes:58143

From: aycabta <ko1@a...>
Date: Mon, 7 Oct 2019 14:16:12 +0900 (JST)
Subject: [ruby-changes:58143] 136116819e (master): Use built-in Win32API on JRuby

https://git.ruby-lang.org/ruby.git/commit/?id=136116819e

From 136116819eea66c5a053971efb9aba403a44e38a Mon Sep 17 00:00:00 2001
From: aycabta <aycabta@g...>
Date: Sat, 5 Oct 2019 23:46:16 +0900
Subject: Use built-in Win32API on JRuby

It's fixed for JRuby dedicatedly.

diff --git a/lib/reline/windows.rb b/lib/reline/windows.rb
index b23f9a8..01e1a5a 100644
--- a/lib/reline/windows.rb
+++ b/lib/reline/windows.rb
@@ -11,41 +11,45 @@ class Reline::Windows https://github.com/ruby/ruby/blob/trunk/lib/reline/windows.rb#L11
     [224, 79] => :ed_move_to_end,  # End
   }.each_key(&:freeze).freeze
 
-  class Win32API
-    DLL = {}
-    TYPEMAP = {"0" => Fiddle::TYPE_VOID, "S" => Fiddle::TYPE_VOIDP, "I" => Fiddle::TYPE_LONG}
-    POINTER_TYPE = Fiddle::SIZEOF_VOIDP == Fiddle::SIZEOF_LONG_LONG ? 'q*' : 'l!*'
-
-    WIN32_TYPES = "VPpNnLlIi"
-    DL_TYPES = "0SSI"
-
-    def initialize(dllname, func, import, export = "0", calltype = :stdcall)
-      @proto = [import].join.tr(WIN32_TYPES, DL_TYPES).sub(/^(.)0*$/, '\1')
-      import = @proto.chars.map {|win_type| TYPEMAP[win_type.tr(WIN32_TYPES, DL_TYPES)]}
-      export = TYPEMAP[export.tr(WIN32_TYPES, DL_TYPES)]
-      calltype = Fiddle::Importer.const_get(:CALL_TYPE_TO_ABI)[calltype]
-
-      handle = DLL[dllname] ||=
-               begin
-                 Fiddle.dlopen(dllname)
-               rescue Fiddle::DLError
-                 raise unless File.extname(dllname).empty?
-                 Fiddle.dlopen(dllname + ".dll")
-               end
-
-      @func = Fiddle::Function.new(handle[func], import, export, calltype)
-    rescue Fiddle::DLError => e
-      raise LoadError, e.message, e.backtrace
-    end
+  if defined? JRUBY_VERSION
+    require 'win32api'
+  else
+    class Win32API
+      DLL = {}
+      TYPEMAP = {"0" => Fiddle::TYPE_VOID, "S" => Fiddle::TYPE_VOIDP, "I" => Fiddle::TYPE_LONG}
+      POINTER_TYPE = Fiddle::SIZEOF_VOIDP == Fiddle::SIZEOF_LONG_LONG ? 'q*' : 'l!*'
+
+      WIN32_TYPES = "VPpNnLlIi"
+      DL_TYPES = "0SSI"
+
+      def initialize(dllname, func, import, export = "0", calltype = :stdcall)
+        @proto = [import].join.tr(WIN32_TYPES, DL_TYPES).sub(/^(.)0*$/, '\1')
+        import = @proto.chars.map {|win_type| TYPEMAP[win_type.tr(WIN32_TYPES, DL_TYPES)]}
+        export = TYPEMAP[export.tr(WIN32_TYPES, DL_TYPES)]
+        calltype = Fiddle::Importer.const_get(:CALL_TYPE_TO_ABI)[calltype]
+
+        handle = DLL[dllname] ||=
+                 begin
+                   Fiddle.dlopen(dllname)
+                 rescue Fiddle::DLError
+                   raise unless File.extname(dllname).empty?
+                   Fiddle.dlopen(dllname + ".dll")
+                 end
+
+        @func = Fiddle::Function.new(handle[func], import, export, calltype)
+      rescue Fiddle::DLError => e
+        raise LoadError, e.message, e.backtrace
+      end
 
-    def call(*args)
-      import = @proto.split("")
-      args.each_with_index do |x, i|
-        args[i], = [x == 0 ? nil : x].pack("p").unpack(POINTER_TYPE) if import[i] == "S"
-        args[i], = [x].pack("I").unpack("i") if import[i] == "I"
+      def call(*args)
+        import = @proto.split("")
+        args.each_with_index do |x, i|
+          args[i], = [x == 0 ? nil : x].pack("p").unpack(POINTER_TYPE) if import[i] == "S"
+          args[i], = [x].pack("I").unpack("i") if import[i] == "I"
+        end
+        ret, = @func.call(*args)
+        return ret || 0
       end
-      ret, = @func.call(*args)
-      return ret || 0
     end
   end
 
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]