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