module DL::ValueUtil

Public Instance Methods

signed_value(val, ty) click to toggle source
# File ext/dl/lib/dl/value.rb, line 22
def signed_value(val, ty)
 case ty.abs
 when TYPE_CHAR
 [val].pack("C").unpack("c")[0]
 when TYPE_SHORT
 [val].pack("S!").unpack("s!")[0]
 when TYPE_INT
 [val].pack("I!").unpack("i!")[0]
 when TYPE_LONG
 [val].pack("L!").unpack("l!")[0]
 when TYPE_LONG_LONG
 [val].pack("Q").unpack("q")[0]
 else
 val
 end
end
unsigned_value(val, ty) click to toggle source
# File ext/dl/lib/dl/value.rb, line 5
def unsigned_value(val, ty)
 case ty.abs
 when TYPE_CHAR
 [val].pack("c").unpack("C")[0]
 when TYPE_SHORT
 [val].pack("s!").unpack("S!")[0]
 when TYPE_INT
 [val].pack("i!").unpack("I!")[0]
 when TYPE_LONG
 [val].pack("l!").unpack("L!")[0]
 when TYPE_LONG_LONG
 [val].pack("q").unpack("Q")[0]
 else
 val
 end
end
wrap_arg(arg, ty, funcs = [], &block) click to toggle source
# File ext/dl/lib/dl/value.rb, line 48
def wrap_arg(arg, ty, funcs = [], &block)
 require 'dl/func'
 funcs ||= []
 case arg
 when nil
 return 0
 when CPtr
 return arg.to_i
 when IO
 case ty
 when TYPE_VOIDP
 return CPtr[arg].to_i
 else
 return arg.to_i
 end
 when Function
 if( block )
 arg.bind_at_call(&block)
 funcs.push(arg)
 elsif !arg.bound?
 raise(RuntimeError, "block must be given.")
 end
 return arg.to_i
 when String
 if( ty.is_a?(Array) )
 return arg.unpack('C*')
 else
 case SIZEOF_VOIDP
 when SIZEOF_LONG
 return [arg].pack("p").unpack("l!")[0]
 when SIZEOF_LONG_LONG
 return [arg].pack("p").unpack("q")[0]
 else
 raise(RuntimeError, "sizeof(void*)?")
 end
 end
 when Float, Integer
 return arg
 when Array
 if( ty.is_a?(Array) ) # used only by struct
 case ty[0]
 when TYPE_VOIDP
 return arg.collect{|v| Integer(v)}
 when TYPE_CHAR
 if( arg.is_a?(String) )
 return val.unpack('C*')
 end
 end
 return arg
 else
 return arg
 end
 else
 if( arg.respond_to?(:to_ptr) )
 return arg.to_ptr.to_i
 else
 begin
 return Integer(arg)
 rescue
 raise(ArgumentError, "unknown argument type: #{arg.class}")
 end
 end
 end
end
wrap_args(args, tys, funcs, &block) click to toggle source
# File ext/dl/lib/dl/value.rb, line 39
def wrap_args(args, tys, funcs, &block)
 result = []
 tys ||= []
 args.each_with_index{|arg, idx|
 result.push(wrap_arg(arg, tys[idx], funcs, &block))
 }
 result
end