Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more

In Files

  • dl/lib/dl/struct.rb

DL::CStructEntity

Public Class Methods

malloc(types, func = nil) click to toggle source
 
               # 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
            
new(addr, types, func = nil) click to toggle source
 
               # File dl/lib/dl/struct.rb, line 79
def initialize(addr, types, func = nil)
  set_ctypes(types)
  super(addr, @size, func)
end
            
size(types) click to toggle source
 
               # 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
            

Public Instance Methods

[](name) click to toggle source
 
               # 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
            
[]=(name, val) click to toggle source
 
               # 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
            
assign_names(members) click to toggle source
 
               # File dl/lib/dl/struct.rb, line 84
def assign_names(members)
  @members = members
end
            
set_ctypes(types) click to toggle source
 
               # 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
            
to_s() click to toggle source
 
               # File dl/lib/dl/struct.rb, line 167
def to_s()
  super(@size)
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.