Module: FFI

Defined in:
lib/ffi/io.rb,
lib/ffi/enum.rb,
lib/ffi/errno.rb,
lib/ffi/types.rb,
lib/ffi/union.rb,
lib/ffi/compat.rb,
lib/ffi/struct.rb,
lib/ffi/library.rb,
lib/ffi/pointer.rb,
lib/ffi/version.rb,
lib/ffi/function.rb,
lib/ffi/platform.rb,
lib/ffi/variadic.rb,
lib/ffi/autopointer.rb,
lib/ffi/library_path.rb,
lib/ffi/managedstruct.rb,
lib/ffi/struct_layout.rb,
lib/ffi/data_converter.rb,
lib/ffi/abstract_memory.rb,
lib/ffi/dynamic_library.rb,
lib/ffi/tools/generator.rb,
lib/ffi/struct_by_reference.rb,
lib/ffi/struct_layout_builder.rb,
lib/ffi/tools/const_generator.rb,
lib/ffi/tools/types_generator.rb,
lib/ffi/tools/struct_generator.rb,
ext/ffi_c/ffi.c,
ext/ffi_c/ffi.c

Overview

This module embbed type constants from NativeType.

Defined Under Namespace

Modules: DataConverter, IO, LastError, Library, NativeType, Platform Classes: AbstractMemory, ArrayType, AutoPointer, Bitmask, Buffer, ConstGenerator, DynamicLibrary, Enum, Enums, Function, FunctionType, Generator, LibraryPath, ManagedStruct, MemoryPointer, NotFoundError, NullPointerError, PlatformError, Pointer, StrPtrConverter, Struct, StructByReference, StructByValue, StructGenerator, StructLayout, StructLayoutBuilder, Type, TypesGenerator, Union, VariadicInvoker

Constant Summary collapse

CURRENT_PROCESS =
USE_THIS_PROCESS_AS_LIBRARY = FFI.make_shareable(Object.new)
VERSION =
'1.16.2'
TypeDefs =

FFI::TypeDefs

Document-constant
CallbackInfo =
rbffi_FunctionTypeClass
FunctionInfo =
rbffi_FunctionTypeClass
NativeLibrary =

backwards compat library

LibraryClass

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.add_typedef(old, add) ⇒ Type

Add a definition type to type definitions.

The type definition is local per Ractor.

Parameters:

Returns:



57
58
59
# File 'lib/ffi/types.rb', line 57

def self.add_typedef(old, add)
  typedef old, add
end

.custom_typedefsObject

Truffleruby and JRuby don’t support Ractor so far. So they don’t need separation between builtin and custom types.



39
40
41
# File 'lib/ffi/types.rb', line 39

def self.custom_typedefs
  TypeDefs
end

.errnoNumeric

Returns:

  • (Numeric)

See Also:



34
35
36
# File 'lib/ffi/errno.rb', line 34

def self.errno
  FFI::LastError.error
end

.errno=(error) ⇒ nil

Parameters:

  • error (Numeric)

Returns:

  • (nil)

See Also:



40
41
42
# File 'lib/ffi/errno.rb', line 40

def self.errno=(error)
  FFI::LastError.error = error
end

.find_type(name, type_map = nil) ⇒ Type

Find a type in type_map (TypeDefs, by default) from a type objet, a type name (symbol). If name is a DataConverter, a new FFI::Type::Mapped is created.

Parameters:

Returns:



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/ffi/types.rb', line 76

def self.find_type(name, type_map = nil)
  if name.is_a?(Type)
    name

  elsif type_map&.has_key?(name)
    type_map[name]

  elsif (tm=custom_typedefs).has_key?(name)
    tm[name]

  elsif TypeDefs.has_key?(name)
    TypeDefs[name]

  elsif name.is_a?(DataConverter)
    (type_map || TypeDefs)[name] = Type::Mapped.new(name)
  else
    raise TypeError, "unable to resolve type '#{name}'"
  end
end

.make_shareable(obj) ⇒ Object

This is for FFI internal use only.



35
36
37
# File 'lib/ffi/compat.rb', line 35

def self.make_shareable(obj)
  Ractor.make_shareable(obj)
end

.map_library_name(lib) ⇒ String

Transform a generic library name to a platform library name

Examples:

# Linux
FFI.map_library_name 'c'     # -> "libc.so.6"
FFI.map_library_name 'jpeg'  # -> "libjpeg.so"
# Windows
FFI.map_library_name 'c'     # -> "msvcrt.dll"
FFI.map_library_name 'jpeg'  # -> "jpeg.dll"

Parameters:

Returns:

  • (String)

    library name formatted for current platform



46
47
48
49
# File 'lib/ffi/library.rb', line 46

def self.map_library_name(lib)
  # Mangle the library name to reflect the native library naming conventions
  LibraryPath.wrap(lib).to_s
end

.type_size(type) ⇒ Numeric

Get type size, in bytes.

Parameters:

  • type

    type is an instance of class accepted by find_type

Returns:

  • (Numeric)


199
200
201
# File 'lib/ffi/types.rb', line 199

def self.type_size(type)
  find_type(type).size
end

.typedef(old, add) ⇒ Type

Add a definition type to type definitions.

The type definition is local per Ractor.

Parameters:

Returns:



51
52
53
54
# File 'lib/ffi/types.rb', line 51

def self.typedef(old, add)
  tm = custom_typedefs
  tm[add] = self.find_type(old)
end

Instance Method Details

#__typedef(old, add) ⇒ Object (private)



62
63
64
# File 'lib/ffi/types.rb', line 62

private def __typedef(old, add)
  TypeDefs[add] = self.find_type(old)
end

#custom_typedefsObject (private)