Skip to content

Commit 1067441

Browse files
committed
[ruby/fiddle] Fix PACK_MAP for unsigned types (ruby/fiddle#110)
ruby/fiddle@4a71246
1 parent 7232f26 commit 1067441

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

ext/fiddle/lib/fiddle/pack.rb

Lines changed: 8 additions & 7 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 = {
@@ -46,9 +46,10 @@ module PackInfo # :nodoc: all
4646
}
4747
if defined?(TYPE_LONG_LONG)
4848
ALIGN_MAP[TYPE_LONG_LONG] = ALIGN_MAP[-TYPE_LONG_LONG] = ALIGN_LONG_LONG
49-
PACK_MAP[TYPE_LONG_LONG] = PACK_MAP[-TYPE_LONG_LONG] = "q"
49+
PACK_MAP[TYPE_LONG_LONG] = "q"
50+
PACK_MAP[-TYPE_LONG_LONG] = "Q"
5051
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
52+
PACK_MAP[TYPE_VOIDP] = "Q" if SIZEOF_LONG_LONG == SIZEOF_VOIDP
5253
end
5354

5455
def align(addr, align)

test/fiddle/test_pack.rb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
if defined?(TYPE_LONG_LONG)
12+
assert_equal [0xffff_ffff_ffff_ffff], [0xffff_ffff_ffff_ffff].pack(PackInfo::PACK_MAP[-TYPE_LONG_LONG]).unpack(PackInfo::PACK_MAP[-TYPE_LONG_LONG])
13+
end
14+
15+
case Fiddle::SIZEOF_VOIDP
16+
when 8
17+
assert_equal [0xffff_ffff_ffff_ffff], [0xffff_ffff_ffff_ffff].pack(PackInfo::PACK_MAP[TYPE_VOIDP]).unpack(PackInfo::PACK_MAP[TYPE_VOIDP])
18+
when 4
19+
assert_equal [0xffff_ffff], [0xffff_ffff].pack(PackInfo::PACK_MAP[TYPE_VOIDP]).unpack(PackInfo::PACK_MAP[TYPE_VOIDP])
20+
end
21+
22+
case Fiddle::SIZEOF_LONG
23+
when 8
24+
assert_equal [0xffff_ffff_ffff_ffff], [0xffff_ffff_ffff_ffff].pack(PackInfo::PACK_MAP[-TYPE_LONG]).unpack(PackInfo::PACK_MAP[-TYPE_LONG])
25+
when 4
26+
assert_equal [0xffff_ffff], [0xffff_ffff].pack(PackInfo::PACK_MAP[-TYPE_LONG]).unpack(PackInfo::PACK_MAP[-TYPE_LONG])
27+
end
28+
29+
if Fiddle::SIZEOF_INT == 4
30+
assert_equal [0xffff_ffff], [0xffff_ffff].pack(PackInfo::PACK_MAP[-TYPE_INT]).unpack(PackInfo::PACK_MAP[-TYPE_INT])
31+
end
32+
33+
assert_equal [0xffff], [0xffff].pack(PackInfo::PACK_MAP[-TYPE_SHORT]).unpack(PackInfo::PACK_MAP[-TYPE_SHORT])
34+
assert_equal [0xff], [0xff].pack(PackInfo::PACK_MAP[-TYPE_CHAR]).unpack(PackInfo::PACK_MAP[-TYPE_CHAR])
35+
end
36+
end
37+
end

0 commit comments

Comments
 (0)