module Fiddle
A libffi wrapper for Ruby.
Description¶ ↑
Fiddle is an extension to translate a foreign function interface (FFI) with ruby.
It wraps libffi, a popular C library which provides a portable interface that allows code written in one language to clal code written in another language.
Example¶ ↑
Here we will use Fiddle::Function to wrap floor(3) from 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
Constants
- ALIGN_CHAR
-
The alignment size of a char
- ALIGN_DOUBLE
-
The alignment size of a double
- ALIGN_FLOAT
-
The alignment size of a float
- ALIGN_INT
-
The alignment size of an int
- ALIGN_INTPTR_T
-
The alignment size of a intptr_t
- ALIGN_LONG
-
The alignment size of a long
- ALIGN_LONG_LONG
-
The alignment size of a long long
- ALIGN_PTRDIFF_T
-
The alignment size of a ptrdiff_t
- ALIGN_SHORT
-
The alignment size of a short
- ALIGN_SIZE_T
-
The alignment size of a size_t
- ALIGN_SSIZE_T
-
The alignment size of a ssize_t
- ALIGN_UINTPTR_T
-
The alignment size of a uintptr_t
- ALIGN_VOIDP
-
The alignment size of a void*
- BUILD_RUBY_PLATFORM
-
Platform built against (i.e. “x86_64-linux”, etc.)
See also RUBY_PLATFORM
- RUBY_FREE
-
Address of the ruby_xfree() function
- SIZEOF_CHAR
-
size of a char
- SIZEOF_DOUBLE
-
size of a double
- SIZEOF_FLOAT
-
size of a float
- SIZEOF_INT
-
size of an int
- SIZEOF_INTPTR_T
-
size of a intptr_t
- SIZEOF_LONG
-
size of a long
- SIZEOF_LONG_LONG
-
size of a long long
- SIZEOF_PTRDIFF_T
-
size of a ptrdiff_t
- SIZEOF_SHORT
-
size of a short
- SIZEOF_SIZE_T
-
size of a size_t
- SIZEOF_SSIZE_T
-
size of a ssize_t
- SIZEOF_UINTPTR_T
-
size of a uintptr_t
- SIZEOF_VOIDP
-
size of a void*
- TYPE_CHAR
-
C type - char
- TYPE_DOUBLE
-
C type - double
- TYPE_FLOAT
-
C type - float
- TYPE_INT
-
C type - int
- TYPE_INTPTR_T
-
C type - intptr_t
- TYPE_LONG
-
C type - long
- TYPE_LONG_LONG
-
C type - long long
- TYPE_PTRDIFF_T
-
C type - ptrdiff_t
- TYPE_SHORT
-
C type - short
- TYPE_SIZE_T
-
C type - size_t
- TYPE_SSIZE_T
-
C type - ssize_t
- TYPE_UINTPTR_T
-
C type - uintptr_t
- TYPE_VOID
-
C type - void
- TYPE_VOIDP
-
C type - void*
- WINDOWS
Returns a boolean regarding whether the host is WIN32
Public Class Methods
Creates a new handler that opens library
, and returns an
instance of Fiddle::Handle.
See Fiddle::Handle.new for more.
# File ext/fiddle/lib/fiddle.rb, line 36 def dlopen library Fiddle::Handle.new library end
Returns the hexadecimal representation of a memory pointer address
addr
Example:
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"
VALUE rb_fiddle_ptr2value(VALUE self, VALUE addr) { rb_secure(4); return (VALUE)NUM2PTR(addr); }
Returns a memory pointer of a function's hexadecimal address location
val
Example:
lib = Fiddle.dlopen('/lib64/libc-2.15.so') => #<Fiddle::Handle:0x00000001342460> Fiddle.dlwrap(lib['strcpy'].to_s(16)) => 25522520
static VALUE rb_fiddle_value2ptr(VALUE self, VALUE val) { return PTR2NUM((void*)val); }
Free the memory at address addr
VALUE rb_fiddle_free(VALUE self, VALUE addr) { void *ptr = NUM2PTR(addr); rb_secure(4); ruby_xfree(ptr); return Qnil; }
Returns the last Error
of the current executing
Thread
or nil if none
# File ext/fiddle/lib/fiddle.rb, line 20 def self.last_error Thread.current[:__FIDDLE_LAST_ERROR__] end
Sets the last Error
of the current executing
Thread
to error
# File ext/fiddle/lib/fiddle.rb, line 25 def self.last_error= error Thread.current[:__DL2_LAST_ERROR__] = error Thread.current[:__FIDDLE_LAST_ERROR__] = error end
Allocate size
bytes of memory and return the integer memory
address for the allocated memory.
static VALUE rb_fiddle_malloc(VALUE self, VALUE size) { void *ptr; rb_secure(4); ptr = (void*)ruby_xmalloc(NUM2INT(size)); return PTR2NUM(ptr); }
Change the size of the memory allocated at the memory location
addr
to size
bytes. Returns the memory address
of the reallocated memory, which may be different than the address passed
in.
static VALUE rb_fiddle_realloc(VALUE self, VALUE addr, VALUE size) { void *ptr = NUM2PTR(addr); rb_secure(4); ptr = (void*)ruby_xrealloc(ptr, NUM2INT(size)); return PTR2NUM(ptr); }
Returns the last win32 Error
of the current executing
Thread
or nil if none
# File ext/fiddle/lib/fiddle.rb, line 9 def self.win32_last_error Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] end
Sets the last win32 Error
of the current executing
Thread
to error
# File ext/fiddle/lib/fiddle.rb, line 14 def self.win32_last_error= error Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] = error end
Private Instance Methods
Creates a new handler that opens library
, and returns an
instance of Fiddle::Handle.
See Fiddle::Handle.new for more.
# File ext/fiddle/lib/fiddle.rb, line 36 def dlopen library Fiddle::Handle.new library end