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

ruby-changes:73518

From: Takashi <ko1@a...>
Date: Sun, 11 Sep 2022 15:35:07 +0900 (JST)
Subject: [ruby-changes:73518] 106744107b (master): [ruby/fiddle] Fix PACK_MAP for unsigned types (https://github.com/ruby/fiddle/pull/110)

https://git.ruby-lang.org/ruby.git/commit/?id=106744107b

From 106744107b485a371ed788fe590c6ce778de16df Mon Sep 17 00:00:00 2001
From: Takashi Kokubun <takashikkbn@g...>
Date: Mon, 5 Sep 2022 00:06:43 -0700
Subject: [ruby/fiddle] Fix PACK_MAP for unsigned types
 (https://github.com/ruby/fiddle/pull/110)

https://github.com/ruby/fiddle/commit/4a71246645ccff001292c9d80b855b2ef5bf06c1
---
 ext/fiddle/lib/fiddle/pack.rb | 15 ++++++++-------
 test/fiddle/test_pack.rb      | 37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+), 7 deletions(-)
 create mode 100644 test/fiddle/test_pack.rb

diff --git a/ext/fiddle/lib/fiddle/pack.rb b/ext/fiddle/lib/fiddle/pack.rb
index 22eccedb76..eb99fe090d 100644
--- a/ext/fiddle/lib/fiddle/pack.rb
+++ b/ext/fiddle/lib/fiddle/pack.rb
@@ -18,17 +18,17 @@ module Fiddle https://github.com/ruby/ruby/blob/trunk/ext/fiddle/lib/fiddle/pack.rb#L18
     }
 
     PACK_MAP = {
-      TYPE_VOIDP => "l!",
+      TYPE_VOIDP => "L!",
       TYPE_CHAR  => "c",
       TYPE_SHORT => "s!",
       TYPE_INT   => "i!",
       TYPE_LONG  => "l!",
       TYPE_FLOAT => "f",
       TYPE_DOUBLE => "d",
-      -TYPE_CHAR  => "c",
-      -TYPE_SHORT => "s!",
-      -TYPE_INT   => "i!",
-      -TYPE_LONG  => "l!",
+      -TYPE_CHAR  => "C",
+      -TYPE_SHORT => "S!",
+      -TYPE_INT   => "I!",
+      -TYPE_LONG  => "L!",
     }
 
     SIZE_MAP = {
@@ -46,9 +46,10 @@ module Fiddle https://github.com/ruby/ruby/blob/trunk/ext/fiddle/lib/fiddle/pack.rb#L46
     }
     if defined?(TYPE_LONG_LONG)
       ALIGN_MAP[TYPE_LONG_LONG] = ALIGN_MAP[-TYPE_LONG_LONG] = ALIGN_LONG_LONG
-      PACK_MAP[TYPE_LONG_LONG] = PACK_MAP[-TYPE_LONG_LONG] = "q"
+      PACK_MAP[TYPE_LONG_LONG] = "q"
+      PACK_MAP[-TYPE_LONG_LONG] = "Q"
       SIZE_MAP[TYPE_LONG_LONG] = SIZE_MAP[-TYPE_LONG_LONG] = SIZEOF_LONG_LONG
-      PACK_MAP[TYPE_VOIDP] = "q" if SIZEOF_LONG_LONG == SIZEOF_VOIDP
+      PACK_MAP[TYPE_VOIDP] = "Q" if SIZEOF_LONG_LONG == SIZEOF_VOIDP
     end
 
     def align(addr, align)
diff --git a/test/fiddle/test_pack.rb b/test/fiddle/test_pack.rb
new file mode 100644
index 0000000000..ade1dd5040
--- /dev/null
+++ b/test/fiddle/test_pack.rb
@@ -0,0 +1,37 @@ https://github.com/ruby/ruby/blob/trunk/test/fiddle/test_pack.rb#L1
+begin
+  require_relative 'helper'
+  require 'fiddle/pack'
+rescue LoadError
+  return
+end
+
+module Fiddle
+  class TestPack < TestCase
+    def test_pack_map
+      if defined?(TYPE_LONG_LONG)
+        assert_equal [0xffff_ffff_ffff_ffff], [0xffff_ffff_ffff_ffff].pack(PackInfo::PACK_MAP[-TYPE_LONG_LONG]).unpack(PackInfo::PACK_MAP[-TYPE_LONG_LONG])
+      end
+
+      case Fiddle::SIZEOF_VOIDP
+      when 8
+        assert_equal [0xffff_ffff_ffff_ffff], [0xffff_ffff_ffff_ffff].pack(PackInfo::PACK_MAP[TYPE_VOIDP]).unpack(PackInfo::PACK_MAP[TYPE_VOIDP])
+      when 4
+        assert_equal [0xffff_ffff], [0xffff_ffff].pack(PackInfo::PACK_MAP[TYPE_VOIDP]).unpack(PackInfo::PACK_MAP[TYPE_VOIDP])
+      end
+
+      case Fiddle::SIZEOF_LONG
+      when 8
+        assert_equal [0xffff_ffff_ffff_ffff], [0xffff_ffff_ffff_ffff].pack(PackInfo::PACK_MAP[-TYPE_LONG]).unpack(PackInfo::PACK_MAP[-TYPE_LONG])
+      when 4
+        assert_equal [0xffff_ffff], [0xffff_ffff].pack(PackInfo::PACK_MAP[-TYPE_LONG]).unpack(PackInfo::PACK_MAP[-TYPE_LONG])
+      end
+
+      if Fiddle::SIZEOF_INT == 4
+        assert_equal [0xffff_ffff], [0xffff_ffff].pack(PackInfo::PACK_MAP[-TYPE_INT]).unpack(PackInfo::PACK_MAP[-TYPE_INT])
+      end
+
+      assert_equal [0xffff], [0xffff].pack(PackInfo::PACK_MAP[-TYPE_SHORT]).unpack(PackInfo::PACK_MAP[-TYPE_SHORT])
+      assert_equal [0xff], [0xff].pack(PackInfo::PACK_MAP[-TYPE_CHAR]).unpack(PackInfo::PACK_MAP[-TYPE_CHAR])
+    end
+  end
+end
-- 
cgit v1.2.1


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

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