From b81a7b76638590429e5787f67faa13ef2d78a603 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Sun, 4 Sep 2022 22:15:11 -0700 Subject: [PATCH 1/2] Fix PACK_MAP for unsigned types --- lib/fiddle/pack.rb | 12 ++++++------ test/fiddle/test_pack.rb | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 test/fiddle/test_pack.rb diff --git a/lib/fiddle/pack.rb b/lib/fiddle/pack.rb index 22eccedb..b997a640 100644 --- a/lib/fiddle/pack.rb +++ b/lib/fiddle/pack.rb @@ -18,17 +18,17 @@ module PackInfo # :nodoc: all } 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 = { @@ -48,7 +48,7 @@ module PackInfo # :nodoc: all ALIGN_MAP[TYPE_LONG_LONG] = ALIGN_MAP[-TYPE_LONG_LONG] = ALIGN_LONG_LONG PACK_MAP[TYPE_LONG_LONG] = 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 00000000..fc1233ab --- /dev/null +++ b/test/fiddle/test_pack.rb @@ -0,0 +1,33 @@ +begin + require_relative 'helper' + require 'fiddle/pack' +rescue LoadError + return +end + +module Fiddle + class TestPack < TestCase + def test_pack_map + 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 From 43b1fe4cfd95b719d8bef67f3b49d60f439cfd9e Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Sun, 4 Sep 2022 23:34:50 -0700 Subject: [PATCH 2/2] Fix unsigned long long as well --- lib/fiddle/pack.rb | 3 ++- test/fiddle/test_pack.rb | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/fiddle/pack.rb b/lib/fiddle/pack.rb index b997a640..eb99fe09 100644 --- a/lib/fiddle/pack.rb +++ b/lib/fiddle/pack.rb @@ -46,7 +46,8 @@ module PackInfo # :nodoc: all } 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 end diff --git a/test/fiddle/test_pack.rb b/test/fiddle/test_pack.rb index fc1233ab..ade1dd50 100644 --- a/test/fiddle/test_pack.rb +++ b/test/fiddle/test_pack.rb @@ -8,6 +8,10 @@ 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])