Class | DL::CStructEntity |
In: |
dl/lib/dl/struct.rb
|
Parent: | CPtr |
# File dl/lib/dl/struct.rb, line 51 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 74 def initialize(addr, types, func = nil) set_ctypes(types) super(addr, @size, func) end
# File dl/lib/dl/struct.rb, line 56 def CStructEntity.size(types) offset = 0 types.each_with_index{|t,i| orig_offset = offset if( t.is_a?(Array) ) offset = PackInfo.align(orig_offset, PackInfo::ALIGN_MAP[TYPE_VOIDP]) size = offset - orig_offset offset += (PackInfo::SIZE_MAP[t[0]] * t[1]) else offset = PackInfo.align(orig_offset, PackInfo::ALIGN_MAP[t]) size = offset - orig_offset offset += PackInfo::SIZE_MAP[t] end } offset = PackInfo.align(offset, PackInfo::ALIGN_MAP[TYPE_VOIDP]) offset end
# File dl/lib/dl/struct.rb, line 106 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 139 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 83 def set_ctypes(types) @ctypes = types @offset = [] offset = 0 types.each_with_index{|t,i| orig_offset = offset if( t.is_a?(Array) ) offset = align(orig_offset, ALIGN_MAP[TYPE_VOIDP]) else offset = align(orig_offset, ALIGN_MAP[t]) end 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 } offset = align(offset, ALIGN_MAP[TYPE_VOIDP]) @size = offset end