call(*arg) -> DL::CPtr | Integer | Float | nil[permalink][rdoc]call(*arg) {|*v| ... } -> DL::CPtr | Integer | Float | nil-
自身が表す関数を呼び、返り値を Ruby のオブジェクトに変換して返します。
返り値と引数は DL::Function.new で指定したものが使われます。より詳しくいうと、
- 返り値は DL::CFunc オブジェクトに指定された型
- 引数は new の argtypes 引数で指定した型
を用います。
引数の変換は以下の通りです。
- void* (つまり任意のポインタ型)
-
nil ならば C の NULL に変換されます DL::CPtr は保持している 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 のポインタを保持した DL::CPtr を返します。
ブロックを与えた場合、引数の中に 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"