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