# class Fiddle::Closure

## Description¶ ↑

An FFI closure wrapper, for handling callbacks.

## Example¶ ↑

    closure = Class.new(Fiddle::Closure) {
      def call
        10
      end
    }.new(Fiddle::TYPE_INT, [])
       #=> #<#<Class:0x0000000150d308>:0x0000000150d240>
    func = Fiddle::Function.new(closure, [], Fiddle::TYPE_INT)
       #=> #<Fiddle::Function:0x00000001516e58>
    func.call
       #=> 10

### Attributes

args[R]

arguments of the FFI closure

ctype[R]

the C type of the return of the FFI closure

### Public Class Methods

new(ret, args, abi = Fiddle::DEFAULT) click to toggle source

Construct a new `Closure` object.

- `ret` is the C type to be returned

- `args` is an `Array` of arguments, passed to the callback function

- `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.

    static VALUE
    initialize(int argc, VALUE *argv, VALUE self)
    {
        initialize_data data;
        data.self = self;
        data.argc = argc;
        data.argv = argv;
        return rb_rescue(initialize_body, (VALUE)&data,
                         initialize_rescue, (VALUE)&data);
    }

### Public Instance Methods

to_i() click to toggle source

Returns the memory address for this closure

    static VALUE
    to_i(VALUE self)
    {
        fiddle_closure * cl;
        void *code;

        TypedData_Get_Struct(self, fiddle_closure, &closure_data_type, cl);

        code = cl->code;

        return PTR2NUM(code);
    }