Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more
CPtr
# 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 115 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 148 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) @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
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.