Class: FFI::FunctionType

### Home Classes Methods

### In Files

- ext/ffi_c/ffi.c

### Parent

FFI::Type

### Methods

- ::new
- #param_types
- #result_type

### Files

- Makefile
- LICENSE
- compile
- configure
- depcomp
- stamp-vti
- install-sh
- libtool-version
- mdate-sh
- missing

### Class/Module Index

Quicksearch

- FFI
- FFI::AutoPointer
- FFI::AutoPointer::CallableReleaser
- FFI::AutoPointer::DefaultReleaser
- FFI::AutoPointer::Releaser
- FFI::ConstGenerator
- FFI::ConstGenerator::Constant
- FFI::Enum
- FFI::Enums
- FFI::Function
- FFI::FunctionType
- FFI::Generator
- FFI::Generator::Task
- FFI::IO
- FFI::LastError
- FFI::ManagedStruct
- FFI::MemoryPointer
- FFI::NativeType
- FFI::Platform
- FFI::PlatformError
- FFI::Pointer
- FFI::StrPtrConverter
- FFI::Struct
- FFI::Struct::InlineArray
- FFI::Struct::ManagedStructConverter
- FFI::StructByReference
- FFI::StructByValue
- FFI::StructGenerator
- FFI::StructGenerator::Field
- FFI::StructLayout
- FFI::StructLayout::Array
- FFI::StructLayout::Enum
- FFI::StructLayout::Field
- FFI::StructLayout::Function
- FFI::StructLayout::InnerStruct
- FFI::StructLayout::Mapped
- FFI::StructLayout::Number
- FFI::StructLayout::Pointer
- FFI::StructLayout::String
- FFI::StructLayoutBuilder
- FFI::Type
- FFI::Type::Builtin
- FFI::TypesGenerator
- FFI::Union
- FFI::VariadicInvoker

No matching classes.

# FFI::FunctionType

### Public Class Methods

initialize(return_type, param_types, options={}) click to toggle source
@param [Type, Symbol] return_type return type for the function
@param [Array] param_types array of parameters types
@param [Hash] options
@option options [Boolean] :blocking set to true if the C function is a blocking call
@option options [Symbol] :convention calling convention see {FFI::Library#calling_convention}
@option options [FFI::Enums] :enums
@return [self]
A new FunctionType instance.

    static VALUE
    fntype_initialize(int argc, VALUE* argv, VALUE self)
    {
        FunctionType *fnInfo;
        ffi_status status;
        VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbOptions = Qnil;
        VALUE rbEnums = Qnil, rbConvention = Qnil, rbBlocking = Qnil;
    #if defined(_WIN32) || defined(__WIN32__)
        VALUE rbConventionStr;
    #endif
        int i, nargs;

        nargs = rb_scan_args(argc, argv, "21", &rbReturnType, &rbParamTypes, &rbOptions);
        if (nargs >= 3 && rbOptions != Qnil) {
            rbConvention = rb_hash_aref(rbOptions, ID2SYM(rb_intern("convention")));
            rbEnums = rb_hash_aref(rbOptions, ID2SYM(rb_intern("enums")));
            rbBlocking = rb_hash_aref(rbOptions, ID2SYM(rb_intern("blocking")));
        }

        Check_Type(rbParamTypes, T_ARRAY);

        Data_Get_Struct(self, FunctionType, fnInfo);
        fnInfo->parameterCount = (int) RARRAY_LEN(rbParamTypes);
        fnInfo->parameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->parameterTypes));
        fnInfo->ffiParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(ffi_type *));
        fnInfo->nativeParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->nativeParameterTypes));
        fnInfo->rbParameterTypes = rb_ary_new2(fnInfo->parameterCount);
        fnInfo->rbEnums = rbEnums;
        fnInfo->blocking = RTEST(rbBlocking);
        fnInfo->hasStruct = false;

        for (i = 0; i < fnInfo->parameterCount; ++i) {
            VALUE entry = rb_ary_entry(rbParamTypes, i);
            VALUE type = rbffi_Type_Lookup(entry);

            if (!RTEST(type)) {
                VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL);
                rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName));
            }

            if (rb_obj_is_kind_of(type, rbffi_FunctionTypeClass)) {
                REALLOC_N(fnInfo->callbackParameters, VALUE, fnInfo->callbackCount + 1);
                fnInfo->callbackParameters[fnInfo->callbackCount++] = type;
            }

            if (rb_obj_is_kind_of(type, rbffi_StructByValueClass)) {
                fnInfo->hasStruct = true;
            }

            rb_ary_push(fnInfo->rbParameterTypes, type);
            Data_Get_Struct(type, Type, fnInfo->parameterTypes[i]);
            fnInfo->ffiParameterTypes[i] = fnInfo->parameterTypes[i]->ffiType;
            fnInfo->nativeParameterTypes[i] = fnInfo->parameterTypes[i]->nativeType;
        }

        fnInfo->rbReturnType = rbffi_Type_Lookup(rbReturnType);
        if (!RTEST(fnInfo->rbReturnType)) {
            VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL);
            rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName));
        }

        if (rb_obj_is_kind_of(fnInfo->rbReturnType, rbffi_StructByValueClass)) {
            fnInfo->hasStruct = true;
        }

        Data_Get_Struct(fnInfo->rbReturnType, Type, fnInfo->returnType);
        fnInfo->ffiReturnType = fnInfo->returnType->ffiType;

    #if (defined(_WIN32) || defined(__WIN32__)) && defined(FFI_STDCALL)
        rbConventionStr = (rbConvention != Qnil) ? rb_funcall2(rbConvention, rb_intern("to_s"), 0, NULL) : Qnil;
        fnInfo->abi = (rbConventionStr != Qnil && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0)
                ? FFI_STDCALL : FFI_DEFAULT_ABI;
    #else
        fnInfo->abi = FFI_DEFAULT_ABI;
    #endif

        status = ffi_prep_cif(&fnInfo->ffi_cif, fnInfo->abi, fnInfo->parameterCount,
                fnInfo->ffiReturnType, fnInfo->ffiParameterTypes);
        switch (status) {
            case FFI_BAD_ABI:
                rb_raise(rb_eArgError, "Invalid ABI specified");
            case FFI_BAD_TYPEDEF:
                rb_raise(rb_eArgError, "Invalid argument type specified");
            case FFI_OK:
                break;
            default:
                rb_raise(rb_eArgError, "Unknown FFI error");
        }

        fnInfo->invoke = rbffi_GetInvoker(fnInfo);

        return self;
    }

### Public Instance Methods

param_types click to toggle source
@return [Array]
Get parameters types.

    static VALUE
    fntype_param_types(VALUE self)
    {
        FunctionType* ft;

        Data_Get_Struct(self, FunctionType, ft);

        return rb_ary_dup(ft->rbParameterTypes);
    }

result_type click to toggle source
@return [Type]
Get the return type of the function type

    static VALUE
    fntype_result_type(VALUE self)
    {
        FunctionType* ft;

        Data_Get_Struct(self, FunctionType, ft);

        return ft->rbReturnType;
    }

[Validate]

Generated with the Darkfish Rdoc Generator 2.