Class: FFI::StructLayout::Function

Inherits:
Field
  • Object
show all
Defined in:
ext/ffi_c/StructLayout.c,
ext/ffi_c/StructLayout.c

Overview

A function pointer Field in a FFI::StructLayout.

Instance Method Summary collapse

Methods inherited from Field

#alignment, #initialize, #name, #offset, #size, #type

Constructor Details

This class inherits a constructor from FFI::StructLayout::Field

Instance Method Details

#get(pointer) ⇒ Function

Get a FFI::StructLayout::Function from memory pointed by pointer.

Parameters:

Returns:



304
305
306
307
308
309
310
311
312
# File 'ext/ffi_c/StructLayout.c', line 304

static VALUE
function_field_get(VALUE self, VALUE pointer)
{
    StructField* f;

    TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);

    return rbffi_Function_NewInstance(f->rbType, (*rbffi_AbstractMemoryOps.pointer->get)(MEMORY(pointer), f->offset));
}

#put(pointer, proc) ⇒ Function

Set a FFI::StructLayout::Function to memory pointed by pointer as a function.

If a Proc is submitted as proc, it is automatically transformed to a FFI::StructLayout::Function.

Parameters:

Returns:



323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
# File 'ext/ffi_c/StructLayout.c', line 323

static VALUE
function_field_put(VALUE self, VALUE pointer, VALUE proc)
{
    StructField* f;
    VALUE value = Qnil;

    TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);

    if (NIL_P(proc) || rb_obj_is_kind_of(proc, rbffi_FunctionClass)) {
        value = proc;
    } else if (rb_obj_is_kind_of(proc, rb_cProc) || rb_respond_to(proc, rb_intern("call"))) {
        value = rbffi_Function_ForProc(f->rbType, proc);
    } else {
        rb_raise(rb_eTypeError, "wrong type (expected Proc or Function)");
    }

    (*rbffi_AbstractMemoryOps.pointer->put)(MEMORY(pointer), f->offset, value);

    return self;
}