Spec-Zone.ru › Ruby 2.3

модуль Fiddle

Обёртка libffi для Ruby.

Описание

Fiddle — это расширение для перевода интерфейса внешних функций (FFI) с использованием ruby.

Он обёртку libffi, популярной C библиотеки, которая предоставляет переносимый интерфейс, позволяющий коду, написанному на одном языке, вызывать код, написанный на другом языке.

Пример

Здесь мы будем использовать Fiddle::Function для обертки floor(3) из libm

require 'fiddle'

libm = Fiddle.dlopen('/lib/libm.so.6')

floor = Fiddle::Function.new(
  libm['floor'],
  [Fiddle::TYPE_DOUBLE],
  Fiddle::TYPE_DOUBLE
)

puts floor.call(3.14159) #=> 3.0

frozen_string_literal: false

frozen_string_literal: false

frozen_string_literal: false

frozen_string_literal: false

Константы

ALIGN_CHAR

ALIGN_CHAR

Размер выравнивания типа char

ALIGN_DOUBLE

ALIGN_DOUBLE

Размер выравнивания типа double

ALIGN_FLOAT

ALIGN_FLOAT

Размер выравнивания типа float

ALIGN_INT

ALIGN_INT

Размер выравнивания типа int

ALIGN_INTPTR_T

ALIGN_INTPTR_T

Размер выравнивания типа intptr_t

ALIGN_LONG

ALIGN_LONG

Размер выравнивания типа long

ALIGN_LONG_LONG

ALIGN_LONG_LONG

Размер выравнивания типа long long

ALIGN_PTRDIFF_T

ALIGN_PTRDIFF_T

Размер выравнивания типа ptrdiff_t

ALIGN_SHORT

ALIGN_SHORT

Размер выравнивания типа short

ALIGN_SIZE_T

ALIGN_SIZE_T

Размер выравнивания типа size_t

ALIGN_SSIZE_T

ALIGN_SSIZE_T

Размер выравнивания типа ssize_t

ALIGN_UINTPTR_T

ALIGN_UINTPTR_T

Размер выравнивания типа uintptr_t

ALIGN_VOIDP

ALIGN_VOIDP

Размер выравнивания типа void*

BUILD_RUBY_PLATFORM

BUILD_RUBY_PLATFORM

Платформа, на которой был скомпилирован (например, “x86_64-linux” и т. д.)

См. также RUBY_PLATFORM

RUBY_FREE

RUBY_FREE

Адрес функции ruby_xfree()

SIZEOF_CHAR

SIZEOF_CHAR

размер типа char

SIZEOF_DOUBLE

SIZEOF_DOUBLE

размер типа double

SIZEOF_FLOAT

SIZEOF_FLOAT

размер типа float

SIZEOF_INT

SIZEOF_INT

размер типа int

SIZEOF_INTPTR_T

SIZEOF_INTPTR_T

размер типа intptr_t

SIZEOF_LONG

SIZEOF_LONG

размер типа long

SIZEOF_LONG_LONG

SIZEOF_LONG_LONG

размер типа long long

SIZEOF_PTRDIFF_T

SIZEOF_PTRDIFF_T

размер типа ptrdiff_t

SIZEOF_SHORT

SIZEOF_SHORT

размер типа short

SIZEOF_SIZE_T

SIZEOF_SIZE_T

размер типа size_t

SIZEOF_SSIZE_T

SIZEOF_SSIZE_T

размер типа ssize_t

SIZEOF_UINTPTR_T

SIZEOF_UINTPTR_T

размер типа uintptr_t

SIZEOF_VOIDP

SIZEOF_VOIDP

размер типа void*

TYPE_CHAR

TYPE_CHAR

Тип C - char

TYPE_DOUBLE

TYPE_DOUBLE

Тип C - double

TYPE_FLOAT

TYPE_FLOAT

Тип C - float

TYPE_INT

TYPE_INT

Тип C - int

TYPE_INTPTR_T

TYPE_INTPTR_T

Тип C - intptr_t

TYPE_LONG

TYPE_LONG

Тип C - long

TYPE_LONG_LONG

TYPE_LONG_LONG

Тип C - long long

TYPE_PTRDIFF_T

TYPE_PTRDIFF_T

Тип C - ptrdiff_t

TYPE_SHORT

TYPE_SHORT

Тип C - short

TYPE_SIZE_T

TYPE_SIZE_T

Тип C - size_t

TYPE_SSIZE_T

TYPE_SSIZE_T

Тип C - ssize_t

TYPE_UINTPTR_T

TYPE_UINTPTR_T

Тип C - uintptr_t

TYPE_VOID

TYPE_VOID

Тип C - void

TYPE_VOIDP

TYPE_VOIDP

Тип C - void*

WINDOWS

Возвращает булево значение, указывающее, является ли хост WIN32

Методы Общедоступного Класса

dlopen(library) → Fiddle::Handle Показать исходный код
# File ext/fiddle/lib/fiddle.rb, line 46
def dlopen library
  Fiddle::Handle.new library
end

Создаёт новый обработчик, открывающий library, и возвращает экземпляр Fiddle::Handle.

Если nil указано для library, используется Fiddle::Handle::DEFAULT, что эквивалентно RTLD_DEFAULT. См. man 3 dlopen для получения дополнительной информации.

lib = Fiddle.dlopen(nil)

По умолчанию зависит от ОС и предоставляет обработчик для всех уже загруженных библиотек. Например, в большинстве случаев это можно использовать для доступа к libc функциям или функциям Ruby, таким как rb_str_new.

См. Fiddle::Handle.new для получения дополнительной информации.

dlunwrap(addr) Показать исходный код
VALUE
rb_fiddle_ptr2value(VALUE self, VALUE addr)
{
    return (VALUE)NUM2PTR(addr);
}

Возвращает шестнадцатеричное представление адреса указателя памяти addr.

Пример:

lib = Fiddle.dlopen('/lib64/libc-2.15.so')
=> #<Fiddle::Handle:0x00000001342460>

lib['strcpy'].to_s(16)
=> "7f59de6dd240"

Fiddle.dlunwrap(Fiddle.dlwrap(lib['strcpy'].to_s(16)))
=> "7f59de6dd240"
dlwrap(val) Показать исходный код
static VALUE
rb_fiddle_value2ptr(VALUE self, VALUE val)
{
    return PTR2NUM((void*)val);
}

Возвращает указатель памяти на адрес функции в шестнадцатеричном формате val.

Пример:

lib = Fiddle.dlopen('/lib64/libc-2.15.so')
=> #<Fiddle::Handle:0x00000001342460>

Fiddle.dlwrap(lib['strcpy'].to_s(16))
=> 25522520
free(addr) Показать исходный код
VALUE
rb_fiddle_free(VALUE self, VALUE addr)
{
    void *ptr = NUM2PTR(addr);

    ruby_xfree(ptr);
    return Qnil;
}

Освобождает память по адресу addr.

last_error() Показать исходный код
# File ext/fiddle/lib/fiddle.rb, line 21
def self.last_error
  Thread.current[:__FIDDLE_LAST_ERROR__]
end

Возвращает последнюю Error текущего выполняемого Thread или nil, если нет.

last_error=(error) Показать исходный код
# File ext/fiddle/lib/fiddle.rb, line 26
def self.last_error= error
  Thread.current[:__DL2_LAST_ERROR__] = error
  Thread.current[:__FIDDLE_LAST_ERROR__] = error
end

Устанавливает последнюю Error текущего выполняемого Thread на error.

malloc(size) Показать исходный код
static VALUE
rb_fiddle_malloc(VALUE self, VALUE size)
{
    void *ptr;

    ptr = (void*)ruby_xmalloc(NUM2SIZET(size));
    return PTR2NUM(ptr);
}

Выделяет size байта памяти и возвращает целочисленный адрес выделенной памяти.

realloc(addr, size) Показать исходный код
static VALUE
rb_fiddle_realloc(VALUE self, VALUE addr, VALUE size)
{
    void *ptr = NUM2PTR(addr);

    ptr = (void*)ruby_xrealloc(ptr, NUM2SIZET(size));
    return PTR2NUM(ptr);
}

Изменяет размер памяти, выделенной по адресу addr, на size байт. Возвращает адрес перевыделенной памяти, который может отличаться от переданного адреса.

win32_last_error() Показать исходный код
# File ext/fiddle/lib/fiddle.rb, line 10
def self.win32_last_error
  Thread.current[:__FIDDLE_WIN32_LAST_ERROR__]
end

Возвращает последнюю win32 Error текущего выполняемого Thread или nil, если нет.

win32_last_error=(error) Показать исходный код
# File ext/fiddle/lib/fiddle.rb, line 15
def self.win32_last_error= error
  Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] = error
end

Устанавливает последнюю win32 Error текущего выполняемого Thread на error.

END_OF_DOCUMENT_MARKER

Приватные методы экземпляра

dlopen(library) → Fiddle::Handle Показать исходный код
# File ext/fiddle/lib/fiddle.rb, line 46
def dlopen library
  Fiddle::Handle.new library
end

Создаёт новый обработчик, который открывает library, и возвращает экземпляр Fiddle::Handle.

Если nil задано для library, используется Fiddle::Handle::DEFAULT, что эквивалентно RTLD_DEFAULT. Смотрите man 3 dlopen для более подробной информации.

lib = Fiddle.dlopen(nil)

Значение по умолчанию зависит от ОС и предоставляет обработчик для всех уже загруженных библиотек. Например, в большинстве случаев это позволяет получить доступ к libc функциям или к рубиевским функциям, таким как rb_str_new.

См. Fiddle::Handle.new для более подробной информации.

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

Spec-Zone.ru

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