class DL::Packer
Public Class Methods
[](*types)
click to toggle source
# File ext/dl/lib/dl/pack.rb, line 66 def self.[](*types) new(types) end
new(types)
click to toggle source
# File ext/dl/lib/dl/pack.rb, line 70 def initialize(types) parse_types(types) end
Public Instance Methods
pack(ary)
click to toggle source
# File ext/dl/lib/dl/pack.rb, line 78 def pack(ary) case SIZEOF_VOIDP when SIZEOF_LONG ary.pack(@template) when SIZEOF_LONG_LONG ary.pack(@template) else raise(RuntimeError, "sizeof(void*)?") end end
size()
click to toggle source
# File ext/dl/lib/dl/pack.rb, line 74 def size() @size end
unpack(ary)
click to toggle source
# File ext/dl/lib/dl/pack.rb, line 89 def unpack(ary) case SIZEOF_VOIDP when SIZEOF_LONG ary.join().unpack(@template) when SIZEOF_LONG_LONG ary.join().unpack(@template) else raise(RuntimeError, "sizeof(void*)?") end end
Private Instance Methods
parse_types(types)
click to toggle source
# File ext/dl/lib/dl/pack.rb, line 102 def parse_types(types) @template = "" addr = 0 types.each{|t| orig_addr = addr if( t.is_a?(Array) ) addr = align(orig_addr, ALIGN_MAP[TYPE_VOIDP]) else addr = align(orig_addr, ALIGN_MAP[t]) end d = addr - orig_addr if( d > 0 ) @template << "x#{d}" end if( t.is_a?(Array) ) @template << (PACK_MAP[t[0]] * t[1]) addr += (SIZE_MAP[t[0]] * t[1]) else @template << PACK_MAP[t] addr += SIZE_MAP[t] end } addr = align(addr, ALIGN_MAP[TYPE_VOIDP]) @size = addr end