Spec-Zone.ru › Ruby 3.4
  1. Fiddle::
  2. Closure

class Fiddle::Closure

Родительский класс:
Object

Описание

Обёртка замыкания 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]

тип C возвращаемого значения замыкания FFI

Общедоступные методы класса

create (*args) { |closure| ... } Показать исходный код
# 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

Создаёт новое замыкание. Если передан блок, созданное замыкание автоматически освобождается после выполнения блока.

Все переданные аргументы передаются в 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
new(ret, args, abi = Fiddle::DEFAULT) Показать исходный код
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);
}

Создаёт новый объект Closure.

  • ret — тип C возвращаемого значения

  • args — Array аргументов, передаваемых функции обратного вызова

  • abi — ABI замыкания

Если при подготовке ffi_cif или ffi_prep_closure возникнет ошибка, будет вызвано исключение RuntimeError.

new (ret, args, abi = Function::DEFAULT) Показать исходный код
# File ext/fiddle/lib/fiddle/ffi_backend.rb, line 181
def initialize(ret, args, abi = Function::DEFAULT)
  raise TypeError.new "invalid argument types" unless args.is_a?(Array)

  @ctype, @args = ret, args
  ffi_args = @args.map { |t| Fiddle::FFIBackend.to_ffi_type(t) }
  if ffi_args.size == 1 && ffi_args[0] == FFI::Type::Builtin::VOID
    ffi_args = []
  end
  return_type = Fiddle::FFIBackend.to_ffi_type(@ctype)
  raise "#{self.class} must implement #call" unless respond_to?(:call)
  callable = method(:call)
  @function = FFI::Function.new(return_type, ffi_args, callable, convention: abi)
  @freed = false
end

Общедоступные методы экземпляра

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

Возвращает адрес памяти этого замыкания.

to_ptr () Показать исходный код
# File ext/fiddle/lib/fiddle/ffi_backend.rb, line 196
def to_ptr
  @function
end

Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API