names=call
visibility=public
kind=defined

--- call(*arg)              -> DL::CPtr | Integer | Float | nil
--- call(*arg){|*v| ... }   -> DL::CPtr | Integer | Float | nil

自身が表す関数を呼び、返り値を Ruby のオブジェクトに変換して返します。

返り値と引数は [[m:DL::Function.new]] で指定したものが使われます。
より詳しくいうと、
  * 返り値は [[c:DL::CFunc]] オブジェクトに指定された型
  * 引数は new の argtypes 引数で指定した型
を用います。

引数の変換は以下の通りです。

: void* (つまり任意のポインタ型)
  nil ならば C の NULL に変換されます
  [[c:DL::CPtr]] は保持している C ポインタに変換されます。
  適当に変換してから、C のポインタに変換します。
  文字列であればその先頭ポインタになります。
  [[c:IO]] オブジェクトであれば FILE* が渡されます。
  整数であればそれがアドレスとみなされます。
  どれでもなければ to_ptr を呼び出し DL::CPtr オブジェクトに
  変換したのが用いられます。
  
: (unsigned) char/short/int/long/long long
  Ruby の整数を C の整数に変換します。

: double/float
  Ruby の整数 or 浮動小数点数を C の浮動小数点数に変換します
  
返り値の変換は以下の通りです。

: void
  nil を返します

: (unsigned) char/short/int/long/long long
  C の整数を Ruby の整数に変換します

: void*(つまり任意のポインタ型)
  C のポインタを保持した [[c:DL::CPtr]] を返します。

ブロックを与えた場合、引数の中に [[c:DL::Function]] オブジェクトが
もしあれば与えられたブロックをバインドし、その後上と同じように関数を呼びます。
複数の DL::Function オブジェクトを引数に渡した場合は、前にある
ほうにバインドされます。


@param arg 関数に与える引数を指定します。
           
例:
 require 'dl/import' 
 
 h = DL::Handle.new
 addr = h.sym('fread')
 cfunc = DL::CFunc.new(addr, DL::TYPE_INT)
 func = DL::Function.new(cfunc, [DL::TYPE_VOIDP, DL::TYPE_LONG, DL::TYPE_LONG, DL::TYPE_VOIDP])
 io = File.open('s.txt')
 s = " " * 8
 func.call(s, 4, 1, io)
 p s                    #=> "hoge    "

例:
 require 'dl/import' 

 h = DL::Handle.new
 addr = h.sym('strdup')
 cfunc = DL::CFunc.new(addr, DL::TYPE_VOIDP)
 func = DL::Function.new(cfunc, [DL::TYPE_VOIDP])
 s = 'abc'
 ptr = func.call(s)
 p ptr.to_s              #=> "abc"


