класс 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
Атрибуты
аргументы FFI замыкания
тип C возвращаемого значения FFI замыкания
Публичные методы класса
Исходный код
# 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
Исходный код
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.
Исходный код
# 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 Публичные методы экземпляра
Исходный код
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;
} Явно освобождает это замыкание. Вы больше не можете использовать это замыкание.
Если это замыкание уже освобождено, ничего не происходит.
Исходный код
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;
} Указывает, было ли это замыкание явно освобождено.
Исходный код
static VALUE
to_i(VALUE self)
{
fiddle_closure *closure = get_raw(self);
return PTR2NUM(closure->code);
} Возвращает адрес памяти для этого замыкания.
Исходный код
# File ext/fiddle/lib/fiddle/ffi_backend.rb, line 196 def to_ptr @function end
Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.