Skip to content

Commit

Permalink
Fix PACK_MAP for unsigned types
Browse files Browse the repository at this point in the history
  • Loading branch information
k0kubun committed Sep 5, 2022
1 parent 8a10ec1 commit 9742ea5
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 6 deletions.
12 changes: 6 additions & 6 deletions lib/fiddle/pack.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand All @@ -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)
Expand Down
32 changes: 32 additions & 0 deletions test/fiddle/test_pack.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
begin
require_relative 'helper'
require 'fiddle/pack'
rescue LoadError
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

0 comments on commit 9742ea5

Please sign in to comment.