mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[ruby/fiddle] Fix PACK_MAP for unsigned types (https://github.com/ruby/fiddle/pull/110)
4a71246645
This commit is contained in:
parent
7232f264df
commit
106744107b
2 changed files with 45 additions and 7 deletions
|
@ -18,17 +18,17 @@ module Fiddle
|
|||
}
|
||||
|
||||
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
|
|||
}
|
||||
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)
|
||||
|
|
37
test/fiddle/test_pack.rb
Normal file
37
test/fiddle/test_pack.rb
Normal file
|
@ -0,0 +1,37 @@
|
|||
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
|
Loading…
Reference in a new issue