diff options
Diffstat (limited to 'ext/fiddle/lib/fiddle/closure.rb')
-rw-r--r-- | ext/fiddle/lib/fiddle/closure.rb | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/ext/fiddle/lib/fiddle/closure.rb b/ext/fiddle/lib/fiddle/closure.rb index dc2b7a65be..beb90ecbe5 100644 --- a/ext/fiddle/lib/fiddle/closure.rb +++ b/ext/fiddle/lib/fiddle/closure.rb @@ -1,14 +1,45 @@ module Fiddle class Closure + + # the C type of the return of the FFI closure attr_reader :ctype + + # arguments of the FFI closure attr_reader :args + # Extends Fiddle::Closure to allow for building the closure in a block class BlockCaller < Fiddle::Closure + + # == Description + # + # Construct a new BlockCaller object. + # + # * +ctype+ is the C type to be returned + # * +args+ are passed the callback + # * +abi+ is the abi of the closure + # + # If there is an error in preparing the +ffi_cif+ or +ffi_prep_closure+, + # then a RuntimeError will be raised. + # + # == Example + # + # include Fiddle + # + # cb = Closure::BlockCaller.new(TYPE_INT, [TYPE_INT]) do |one| + # one + # end + # + # func = Function.new(cb, [TYPE_INT], TYPE_INT) + # def initialize ctype, args, abi = Fiddle::Function::DEFAULT, &block super(ctype, args, abi) @block = block end + # Calls the constructed BlockCaller, with +args+ + # + # For an example see Fiddle::Closure::BlockCaller.new + # def call *args @block.call(*args) end |