Method deprecated or moved
This method is deprecated or moved on the latest stable version. The last existing version (v2_1_10) is shown here.
bind(&block)public
No documentation available.
# File ext/dl/lib/dl/func.rb, line 117
def bind(&block)
if DL.fiddle?
@cfunc = Class.new(FiddleClosureCFunc) {
def initialize ctype, args, abi, name, block
super(ctype, args, abi, name)
@block = block
end
def call *args
@block.call(*args)
end
}.new(@cfunc.ctype, @args, abi, name, block)
@ptr = @cfunc
return nil
else
if( !block )
raise(RuntimeError, "block must be given.")
end
unless block.lambda?
block = Class.new(self.class){define_method(:call, block); def initialize(obj); obj.instance_variables.each{|s| instance_variable_set(s, obj.instance_variable_get(s))}; end}.new(self).method(:call)
end
if( @cfunc.ptr == 0 )
cb = Proc.new{|*args|
ary = @stack.unpack(args)
@stack.types.each_with_index{|ty, idx|
case ty
when TYPE_VOIDP
ary[idx] = CPtr.new(ary[idx])
end
}
r = block.call(*ary)
wrap_arg(r, @cfunc.ctype, [])
}
case @cfunc.calltype
when :cdecl
@cfunc.ptr = set_cdecl_callback(@cfunc.ctype, @stack.size, &cb)
when :stdcall
@cfunc.ptr = set_stdcall_callback(@cfunc.ctype, @stack.size, &cb)
else
raise(RuntimeError, "unsupported calltype: #{@cfunc.calltype}")
end
if( @cfunc.ptr == 0 )
raise(RuntimeException, "can't bind C function.")
end
end
end
end