Class: FFI::Function

Inherits:
Pointer show all
Defined in:
lib/ffi/function.rb,
ext/ffi_c/Function.c

Constant Summary

Constants inherited from Pointer

Pointer::NULL, Pointer::SIZE

Instance Method Summary collapse

Methods inherited from Pointer

#+, #==, #address, #inspect, #null?, #order, #read, #read_array_of_type, #read_string, #read_string_length, #read_string_to_null, size, #slice, #to_ptr, #to_s, #type_size, #write, #write_array_of_type, #write_string, #write_string_length

Methods inherited from AbstractMemory

#[], #__copy_from__, #clear, #freeze, #get, #get_array_of_float32, #get_array_of_float64, #get_array_of_pointer, #get_array_of_string, #get_bytes, #get_float32, #get_float64, #get_pointer, #get_string, #put, #put_array_of_float32, #put_array_of_float64, #put_array_of_pointer, #put_bytes, #put_float32, #put_float64, #put_pointer, #put_string, #read_array_of_double, #read_array_of_float, #read_array_of_pointer, #read_array_of_string, #read_bytes, #read_double, #read_float, #read_pointer, #size_limit?, #total, #type_size, #write_array_of_double, #write_array_of_float, #write_array_of_pointer, #write_bytes, #write_double, #write_float, #write_pointer

Constructor Details

#initialize(return_type, param_types, options = {}) {|i| ... } ⇒ self #initialize(return_type, param_types, proc, options = {}) ⇒ self

A new Function instance.

Define a function from a Proc or a block.

Overloads:

  • #initialize(return_type, param_types, options = {}) {|i| ... } ⇒ self

    Yield Parameters:

    • i

      parameters for the function

  • #initialize(return_type, param_types, proc, options = {}) ⇒ self

    Parameters:

    • proc (Proc)

Parameters:

  • return_type (Type, Symbol)

    return type for the function

  • param_types (Array<Type, Symbol>)

    array of parameters types

  • options (Hash)

    see FFI::FunctionType for available options



346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
# File 'ext/ffi_c/Function.c', line 346

static VALUE
function_initialize(int argc, VALUE* argv, VALUE self)
{

    VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbProc = Qnil, rbOptions = Qnil;
    VALUE rbFunctionInfo = Qnil;
    VALUE infoArgv[3];
    int nargs;

    nargs = rb_scan_args(argc, argv, "22", &rbReturnType, &rbParamTypes, &rbProc, &rbOptions);

    /*
     * Callback with block,
     * e.g. Function.new(:int, [ :int ]) { |i| blah }
     * or   Function.new(:int, [ :int ], { :convention => :stdcall }) { |i| blah }
     */
    if (rb_block_given_p()) {
        if (nargs > 3) {
            rb_raise(rb_eArgError, "cannot create function with both proc/address and block");
        }
        rbOptions = rbProc;
        rbProc = rb_block_proc();
    } else {
        /* Callback with proc, or Function with address
         * e.g. Function.new(:int, [ :int ], Proc.new { |i| })
         *      Function.new(:int, [ :int ], Proc.new { |i| }, { :convention => :stdcall })
         *      Function.new(:int, [ :int ], addr)
         *      Function.new(:int, [ :int ], addr, { :convention => :stdcall })
         */
    }

    infoArgv[0] = rbReturnType;
    infoArgv[1] = rbParamTypes;
    infoArgv[2] = rbOptions;
    rbFunctionInfo = rb_class_new_instance(rbOptions != Qnil ? 3 : 2, infoArgv, rbffi_FunctionTypeClass);

    function_init(self, rbFunctionInfo, rbProc);

    return self;
}

Instance Method Details

#attach(m, name) ⇒ self

Attach a Function to the Module m as name.

Parameters:

  • m (Module)
  • name (String)

Returns:

  • (self)


56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/ffi/function.rb', line 56

def attach(mod, name)
  this = self
  body = proc do |*args, &block|
    this.call(*args, &block)
  end

  mod.define_method(name, body)
  mod.define_singleton_method(name, body)

  # Store function Proc's for re-definition as Ractor-shareable in Library#freeze
  funcs = mod.instance_variable_get("@ffi_function_procs")
  unless funcs
    funcs = {}
    mod.instance_variable_set("@ffi_function_procs", funcs)
  end
  funcs[name] = self

  self
end

#autoreleaseBoolean

Get autorelease attribute. Synonymous for #autorelease?.

Returns:

  • (Boolean)


561
562
563
564
565
566
567
568
569
# File 'ext/ffi_c/Function.c', line 561

static VALUE
function_autorelease_p(VALUE self)
{
    Function* fn;

    TypedData_Get_Struct(self, Function, &function_data_type, fn);

    return fn->autorelease ? Qtrue : Qfalse;
}

#autorelease=(autorelease) ⇒ self

Set autorelease attribute (See Pointer).

Parameters:

  • autorelease (Boolean)

Returns:

  • (self)


548
549
550
551
552
553
554
555
556
557
558
559
# File 'ext/ffi_c/Function.c', line 548

static VALUE
function_set_autorelease(VALUE self, VALUE autorelease)
{
    Function* fn;

    rb_check_frozen(self);
    TypedData_Get_Struct(self, Function, &function_data_type, fn);

    fn->autorelease = RTEST(autorelease);

    return self;
}

#autorelease?Boolean

Get autorelease attribute.

Returns:

  • (Boolean)

    autorelease attribute



561
562
563
564
565
566
567
568
569
# File 'ext/ffi_c/Function.c', line 561

static VALUE
function_autorelease_p(VALUE self)
{
    Function* fn;

    TypedData_Get_Struct(self, Function, &function_data_type, fn);

    return fn->autorelease ? Qtrue : Qfalse;
}

#call(*args) ⇒ FFI::Type

Call the function

Parameters:

  • args (Array)

    function arguments

Returns:



493
494
495
496
497
498
499
500
501
# File 'ext/ffi_c/Function.c', line 493

static VALUE
function_call(int argc, VALUE* argv, VALUE self)
{
    Function* fn;

    TypedData_Get_Struct(self, Function, &function_data_type, fn);

    return (*fn->info->invoke)(argc, argv, fn->base.memory.address, fn->info);
}

#freeself

Free memory allocated by Function.

Returns:

  • (self)


586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
# File 'ext/ffi_c/Function.c', line 586

static VALUE
function_release(VALUE self)
{
    Function* fn;

    TypedData_Get_Struct(self, Function, &function_data_type, fn);

    if (fn->closure == NULL) {
        rb_raise(rb_eRuntimeError, "cannot free function which was not allocated");
    }

    rbffi_Closure_Free(fn->closure);
    fn->closure = NULL;

    return self;
}

#initialize_copy(other) ⇒ nil

DO NOT CALL THIS METHOD

Returns:

  • (nil)


392
393
394
395
396
397
# File 'ext/ffi_c/Function.c', line 392

static VALUE
function_initialize_copy(VALUE self, VALUE other)
{
    rb_raise(rb_eRuntimeError, "cannot duplicate function instances");
    return Qnil;
}

#param_typesArray<FFI::Type>

Retrieve Array of parameter types

This method returns an Array of FFI types accepted as function parameters.

Returns:



49
50
51
# File 'lib/ffi/function.rb', line 49

def param_types
  type.param_types
end

#return_typeFFI::Type

Retrieve the return type of the function

This method returns FFI type returned by the function.

Returns:



40
41
42
# File 'lib/ffi/function.rb', line 40

def return_type
  type.return_type
end