class DL::Stack

Constants

ALIGN_MAP
PACK_MAP
SIZE_MAP

Public Class Methods

[](*types) click to toggle source
# File ext/dl/lib/dl/stack.rb, line 5
def self.[](*types)
  new(types)
end
new(types) click to toggle source
# File ext/dl/lib/dl/stack.rb, line 9
def initialize(types)
  parse_types(types)
end

Public Instance Methods

pack(ary) click to toggle source
# File ext/dl/lib/dl/stack.rb, line 21
def pack(ary)
  case SIZEOF_VOIDP
  when SIZEOF_LONG
    ary.pack(@template).unpack('l!*')
  when SIZEOF_LONG_LONG
    ary.pack(@template).unpack('q*')
  else
    raise(RuntimeError, "sizeof(void*)?")
  end
end
size() click to toggle source
# File ext/dl/lib/dl/stack.rb, line 13
def size()
  @size
end
types() click to toggle source
# File ext/dl/lib/dl/stack.rb, line 17
def types()
  @types
end
unpack(ary) click to toggle source
# File ext/dl/lib/dl/stack.rb, line 32
def unpack(ary)
  case SIZEOF_VOIDP
  when SIZEOF_LONG
    ary.pack('l!*').unpack(@template)
  when SIZEOF_LONG_LONG
    ary.pack('q*').unpack(@template)
  else
    raise(RuntimeError, "sizeof(void*)?")
  end
end

Private Instance Methods

add_padding(addr, align) click to toggle source
# File ext/dl/lib/dl/stack.rb, line 106
def add_padding(addr, align)
  orig_addr = addr
  addr = align(orig_addr, align)
  d = addr - orig_addr
  if( d > 0 )
    @template << "x#{d}"
  end
  addr
end
align(addr, align) click to toggle source
# File ext/dl/lib/dl/stack.rb, line 45
def align(addr, align)
  d = addr % align
  if( d == 0 )
    addr
  else
    addr + (align - d)
  end
end
parse_types(types) click to toggle source
# File ext/dl/lib/dl/stack.rb, line 89
def parse_types(types)
  @types = types
  @template = ""
  addr      = 0
  types.each{|t|
    addr = add_padding(addr, ALIGN_MAP[t])
    @template << PACK_MAP[t]
    addr += SIZE_MAP[t]
  }
  addr = add_padding(addr, ALIGN_MAP[SIZEOF_VOIDP])
  if( addr % SIZEOF_VOIDP == 0 )
    @size = addr / SIZEOF_VOIDP
  else
    @size = (addr / SIZEOF_VOIDP) + 1
  end
end