модуль 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
Константы
- ALIGN_CHAR
-
Размер выравнивания типа char
- ALIGN_DOUBLE
-
Размер выравнивания типа double
- ALIGN_FLOAT
-
Размер выравнивания типа float
- ALIGN_INT
-
Размер выравнивания типа int
- ALIGN_INT16_T
-
Размер выравнивания типа int16_t
- ALIGN_INT32_T
-
Размер выравнивания типа int32_t
- ALIGN_INT64_T
-
Размер выравнивания типа int64_t
- ALIGN_INT8_T
-
Размер выравнивания типа int8_t
- ALIGN_INTPTR_T
-
Размер выравнивания типа intptr_t
- ALIGN_LONG
-
Размер выравнивания типа long
- ALIGN_LONG_LONG
-
Размер выравнивания типа long long
- ALIGN_PTRDIFF_T
-
Размер выравнивания типа ptrdiff_t
- ALIGN_SHORT
-
Размер выравнивания типа short
- ALIGN_SIZE_T
-
Размер выравнивания типа size_t
- ALIGN_SSIZE_T
-
Размер выравнивания типа ssize_t
- ALIGN_UINTPTR_T
-
Размер выравнивания типа uintptr_t
- ALIGN_VOIDP
-
Размер выравнивания типа void*
- BUILD_RUBY_PLATFORM
-
Платформа, для которой был скомпилирован Ruby (например, “x86_64-linux”).
См. также RUBY_PLATFORM
- RUBY_FREE
-
Адрес функции ruby_xfree()
- SIZEOF_CHAR
-
Размер типа char
- SIZEOF_CONST_STRING
-
Размер типа const char*
- SIZEOF_DOUBLE
-
Размер типа double
- SIZEOF_FLOAT
-
Размер типа float
- SIZEOF_INT
-
Размер типа int
- SIZEOF_INT16_T
-
Размер типа int16_t
- SIZEOF_INT32_T
-
Размер типа int32_t
- SIZEOF_INT64_T
-
Размер типа int64_t
- SIZEOF_INT8_T
-
Размер типа int8_t
- SIZEOF_INTPTR_T
-
Размер типа intptr_t
- SIZEOF_LONG
-
Размер типа long
- SIZEOF_LONG_LONG
-
Размер типа long long
- SIZEOF_PTRDIFF_T
-
Размер типа ptrdiff_t
- SIZEOF_SHORT
-
Размер типа short
- SIZEOF_SIZE_T
-
Размер типа size_t
- SIZEOF_SSIZE_T
-
Размер типа ssize_t
- SIZEOF_UINTPTR_T
-
Размер типа uintptr_t
- SIZEOF_VOIDP
-
Размер типа void*
- TYPE_CHAR
-
Тип C — char
- TYPE_CONST_STRING
-
Тип C — const char* (‘0’ завершаемый const char*)
- TYPE_DOUBLE
-
Тип C — double
- TYPE_FLOAT
-
Тип C — float
- TYPE_INT
-
Тип C — int
- TYPE_INT16_T
-
Тип C — int16_t
- TYPE_INT32_T
-
Тип C — int32_t
- TYPE_INT64_T
-
Тип C — int64_t
- TYPE_INT8_T
-
Тип C — int8_t
- TYPE_INTPTR_T
-
Тип C — intptr_t
- TYPE_LONG
-
Тип C — long
- TYPE_LONG_LONG
-
Тип C — long long
- TYPE_PTRDIFF_T
-
Тип C — ptrdiff_t
- TYPE_SHORT
-
Тип C — short
- TYPE_SIZE_T
-
Тип C — size_t
- TYPE_SSIZE_T
-
Тип C — ssize_t
- TYPE_UINTPTR_T
-
Тип C — uintptr_t
- TYPE_VARIADIC
-
Тип C — …
- TYPE_VOID
-
Тип C — void
- TYPE_VOIDP
-
Тип C — void*
- VERSION
- WINDOWS
-
Возвращает булево значение, указывающее, является ли хост WIN32
Методы публичного класса
# File ext/fiddle/lib/fiddle.rb, line 60 def dlopen library Fiddle::Handle.new library end
Создаёт новый обработчик, открывающий library, и возвращает экземпляр Fiddle::Handle.
Если для library задано значение nil, используется Fiddle::Handle::DEFAULT, что эквивалентно RTLD_DEFAULT. Подробнее см. man 3 dlopen
lib = Fiddle.dlopen(nil)
Значение по умолчанию зависит от ОС и предоставляет обработчик для всех уже загруженных библиотек. Например, в большинстве случаев вы можете использовать его для доступа к функциям libc или функциям Руби, таким как rb_str_new
Подробнее см. Fiddle::Handle.new.
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" 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 VALUE
rb_fiddle_free(VALUE self, VALUE addr)
{
void *ptr = NUM2PTR(addr);
ruby_xfree(ptr);
return Qnil;
} Освобождает память по адресу addr
# File ext/fiddle/lib/fiddle.rb, line 35 def self.last_error Thread.current[:__FIDDLE_LAST_ERROR__] end
Возвращает последнюю Error текущего выполняемого Thread или nil, если нет
# File ext/fiddle/lib/fiddle.rb, line 40 def self.last_error= error Thread.current[:__DL2_LAST_ERROR__] = error Thread.current[:__FIDDLE_LAST_ERROR__] = error end
Устанавливает последнюю Error текущего выполняемого Thread на error
static VALUE
rb_fiddle_malloc(VALUE self, VALUE size)
{
void *ptr;
ptr = (void*)ruby_xcalloc(1, NUM2SIZET(size));
return PTR2NUM(ptr);
} Выделяет 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 байт. Возвращает адрес перевыделенной памяти, который может отличаться от переданного адреса.
# File ext/fiddle/lib/fiddle.rb, line 12 def self.win32_last_error Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] end
Возвращает последнюю win32 Error текущего выполняемого Thread или nil, если нет
# File ext/fiddle/lib/fiddle.rb, line 17 def self.win32_last_error= error Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] = error end
Устанавливает последнюю win32 Error текущего выполняемого Thread на error
# File ext/fiddle/lib/fiddle.rb, line 23 def self.win32_last_socket_error Thread.current[:__FIDDLE_WIN32_LAST_SOCKET_ERROR__] end
Возвращает последнюю win32 сокетную Error текущего выполняемого Thread или nil, если нет
# File ext/fiddle/lib/fiddle.rb, line 29 def self.win32_last_socket_error= error Thread.current[:__FIDDLE_WIN32_LAST_SOCKET_ERROR__] = error end
Устанавливает последнюю win32 сокетную Error текущего выполняемого Thread на error
Приватные методы экземпляра
# File ext/fiddle/lib/fiddle.rb, line 60 def dlopen library Fiddle::Handle.new library end
Создаёт новый обработчик, открывающий library, и возвращает экземпляр Fiddle::Handle.
Если для library задано значение nil, используется Fiddle::Handle::DEFAULT, что эквивалентно RTLD_DEFAULT. Подробнее см. man 3 dlopen
lib = Fiddle.dlopen(nil)
Значение по умолчанию зависит от ОС и предоставляет обработчик для всех уже загруженных библиотек. Например, в большинстве случаев вы можете использовать его для доступа к функциям libc или функциям Руби, таким как rb_str_new
Подробнее см. Fiddle::Handle.new.
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.