類別 Fiddle::Closure

說明

FFI 閉包包裝器,用於處理回呼。

範例

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

屬性

args[R]

FFI 閉包的參數

ctype[R]

FFI 閉包回傳值的 C 型別

公開類別方法

create(*args) { |closure| ... } 按一下以切換來源

建立新的閉包。如果給定區塊,已建立的閉包會在執行給定的區塊後自動釋放。

所有給定的參數都會傳遞給 Fiddle::Closure.new。因此,在沒有區塊的情況下使用此方法等於 Fiddle::Closure.new

範例

Fiddle::Closure.create(TYPE_INT, [TYPE_INT]) do |closure|
  # closure is freed automatically when this block is finished.
end
# File ext/fiddle/lib/fiddle/closure.rb, line 16
def create(*args)
  if block_given?
    closure = new(*args)
    begin
      yield(closure)
    ensure
      closure.free
    end
  else
    new(*args)
  end
end
new(ret, args, abi = Fiddle::DEFAULT) 按一下以切換來源

建構新的 Closure 物件。

  • ret 是要回傳的 C 型別

  • args 是傳遞給回呼函式的 Array 參數

  • abi 是閉包的 abi

如果準備 ffi_cif 或 ffi_prep_closure 時發生錯誤,則會引發 RuntimeError

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);
}

公開實例方法

free() 按一下以切換來源

明確釋放此閉包。您無法再使用此閉包。

如果此閉包已釋放,則此動作不會執行任何操作。

static VALUE
closure_free(VALUE self)
{
    fiddle_closure *closure;
    TypedData_Get_Struct(self, fiddle_closure, &closure_data_type, closure);
    if (closure) {
        dealloc(closure);
        RTYPEDDATA_DATA(self) = NULL;
    }
    return RUBY_Qnil;
}
freed?() 按一下以切換來源

此閉包是否已明確釋放。

static VALUE
closure_freed_p(VALUE self)
{
    fiddle_closure *closure;
    TypedData_Get_Struct(self, fiddle_closure, &closure_data_type, closure);
    return closure ? RUBY_Qfalse : RUBY_Qtrue;
}
to_i() 按一下以切換來源

傳回此閉包的記憶體位址。

static VALUE
to_i(VALUE self)
{
    fiddle_closure *closure = get_raw(self);
    return PTR2NUM(closure->code);
}