Skip to content

Commit b81a7b7

Browse files
committed
Fix PACK_MAP for unsigned types
1 parent 8a10ec1 commit b81a7b7

File tree

2 files changed

+39
-6
lines changed

2 files changed

+39
-6
lines changed

lib/fiddle/pack.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ module PackInfo # :nodoc: all
1818
}
1919

2020
PACK_MAP = {
21-
TYPE_VOIDP => "l!",
21+
TYPE_VOIDP => "L!",
2222
TYPE_CHAR => "c",
2323
TYPE_SHORT => "s!",
2424
TYPE_INT => "i!",
2525
TYPE_LONG => "l!",
2626
TYPE_FLOAT => "f",
2727
TYPE_DOUBLE => "d",
28-
-TYPE_CHAR => "c",
29-
-TYPE_SHORT => "s!",
30-
-TYPE_INT => "i!",
31-
-TYPE_LONG => "l!",
28+
-TYPE_CHAR => "C",
29+
-TYPE_SHORT => "S!",
30+
-TYPE_INT => "I!",
31+
-TYPE_LONG => "L!",
3232
}
3333

3434
SIZE_MAP = {
@@ -48,7 +48,7 @@ module PackInfo # :nodoc: all
4848
ALIGN_MAP[TYPE_LONG_LONG] = ALIGN_MAP[-TYPE_LONG_LONG] = ALIGN_LONG_LONG
4949
PACK_MAP[TYPE_LONG_LONG] = PACK_MAP[-TYPE_LONG_LONG] = "q"
5050
SIZE_MAP[TYPE_LONG_LONG] = SIZE_MAP[-TYPE_LONG_LONG] = SIZEOF_LONG_LONG
51-
PACK_MAP[TYPE_VOIDP] = "q" if SIZEOF_LONG_LONG == SIZEOF_VOIDP
51+
PACK_MAP[TYPE_VOIDP] = "Q" if SIZEOF_LONG_LONG == SIZEOF_VOIDP
5252
end
5353

5454
def align(addr, align)

test/fiddle/test_pack.rb

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
begin
2+
require_relative 'helper'
3+
require 'fiddle/pack'
4+
rescue LoadError
5+
return
6+
end
7+
8+
module Fiddle
9+
class TestPack < TestCase
10+
def test_pack_map
11+
case Fiddle::SIZEOF_VOIDP
12+
when 8
13+
assert_equal [0xffff_ffff_ffff_ffff], [0xffff_ffff_ffff_ffff].pack(PackInfo::PACK_MAP[TYPE_VOIDP]).unpack(PackInfo::PACK_MAP[TYPE_VOIDP])
14+
when 4
15+
assert_equal [0xffff_ffff], [0xffff_ffff].pack(PackInfo::PACK_MAP[TYPE_VOIDP]).unpack(PackInfo::PACK_MAP[TYPE_VOIDP])
16+
end
17+
18+
case Fiddle::SIZEOF_LONG
19+
when 8
20+
assert_equal [0xffff_ffff_ffff_ffff], [0xffff_ffff_ffff_ffff].pack(PackInfo::PACK_MAP[-TYPE_LONG]).unpack(PackInfo::PACK_MAP[-TYPE_LONG])
21+
when 4
22+
assert_equal [0xffff_ffff], [0xffff_ffff].pack(PackInfo::PACK_MAP[-TYPE_LONG]).unpack(PackInfo::PACK_MAP[-TYPE_LONG])
23+
end
24+
25+
if Fiddle::SIZEOF_INT == 4
26+
assert_equal [0xffff_ffff], [0xffff_ffff].pack(PackInfo::PACK_MAP[-TYPE_INT]).unpack(PackInfo::PACK_MAP[-TYPE_INT])
27+
end
28+
29+
assert_equal [0xffff], [0xffff].pack(PackInfo::PACK_MAP[-TYPE_SHORT]).unpack(PackInfo::PACK_MAP[-TYPE_SHORT])
30+
assert_equal [0xff], [0xff].pack(PackInfo::PACK_MAP[-TYPE_CHAR]).unpack(PackInfo::PACK_MAP[-TYPE_CHAR])
31+
end
32+
end
33+
end

0 commit comments

Comments
 (0)