# File dl/lib/dl/struct.rb, line 50
def CStructEntity.malloc(types, func = nil)
addr = DL.malloc(CStructEntity.size(types))
CStructEntity.new(addr, types, func)
end
# File dl/lib/dl/struct.rb, line 79
def initialize(addr, types, func = nil)
set_ctypes(types)
super(addr, @size, func)
end
# File dl/lib/dl/struct.rb, line 55
def CStructEntity.size(types)
offset = 0
max_align = 0
types.each_with_index{|t,i|
orig_offset = offset
if( t.is_a?(Array) )
align = PackInfo::ALIGN_MAP[t[0]]
offset = PackInfo.align(orig_offset, align)
size = offset - orig_offset
offset += (PackInfo::SIZE_MAP[t[0]] * t[1])
else
align = PackInfo::ALIGN_MAP[t]
offset = PackInfo.align(orig_offset, align)
size = offset - orig_offset
offset += PackInfo::SIZE_MAP[t]
end
if (max_align < align)
max_align = align
end
}
offset = PackInfo.align(offset, max_align)
offset
end
# File dl/lib/dl/struct.rb, line 116
def [](name)
idx = @members.index(name)
if( idx.nil? )
raise(ArgumentError, "no such member: #{name}")
end
ty = @ctypes[idx]
if( ty.is_a?(Array) )
r = super(@offset[idx], SIZE_MAP[ty[0]] * ty[1])
else
r = super(@offset[idx], SIZE_MAP[ty.abs])
end
packer = Packer.new([ty])
val = packer.unpack([r])
case ty
when Array
case ty[0]
when TYPE_VOIDP
val = val.collect{|v| CPtr.new(v)}
end
when TYPE_VOIDP
val = CPtr.new(val[0])
else
val = val[0]
end
if( ty.is_a?(Integer) && (ty < 0) )
return unsigned_value(val, ty)
elsif( ty.is_a?(Array) && (ty[0] < 0) )
return val.collect{|v| unsigned_value(v,ty[0])}
else
return val
end
end
# File dl/lib/dl/struct.rb, line 149
def []=(name, val)
idx = @members.index(name)
if( idx.nil? )
raise(ArgumentError, "no such member: #{name}")
end
ty = @ctypes[idx]
packer = Packer.new([ty])
val = wrap_arg(val, ty, [])
buff = packer.pack([val].flatten())
super(@offset[idx], buff.size, buff)
if( ty.is_a?(Integer) && (ty < 0) )
return unsigned_value(val, ty)
elsif( ty.is_a?(Array) && (ty[0] < 0) )
return val.collect{|v| unsigned_value(v,ty[0])}
else
return val
end
end
# File dl/lib/dl/struct.rb, line 84
def assign_names(members)
@members = members
end
# File dl/lib/dl/struct.rb, line 88
def set_ctypes(types)
@ctypes = types
@offset = []
offset = 0
max_align = 0
types.each_with_index{|t,i|
orig_offset = offset
if( t.is_a?(Array) )
align = ALIGN_MAP[t[0]]
else
align = ALIGN_MAP[t]
end
offset = PackInfo.align(orig_offset, align)
size = offset - orig_offset
@offset[i] = offset
if( t.is_a?(Array) )
offset += (SIZE_MAP[t[0]] * t[1])
else
offset += SIZE_MAP[t]
end
if (max_align < align)
max_align = align
end
}
offset = PackInfo.align(offset, max_align)
@size = offset
end