openresty/doc/LuaJIT-2.1/ext_ffi_api.pod

504 lines
16 KiB
C

=pod
LuaJIT
=head1 C<ffi.*> API Functions
=over
=item * LuaJIT
=over
=item * Download E<rchevron>
=item * Installation
=item * Running
=back
=item * Extensions
=over
=item * FFI Library
=over
=item * FFI Tutorial
=item * ffi.* API
=item * FFI Semantics
=back
=item * jit.* Library
=item * Lua/C API
=item * Profiler
=back
=item * Status
=over
=item * Changes
=back
=item * FAQ
=item * Performance E<rchevron>
=item * Wiki E<rchevron>
=item * Mailing List E<rchevron>
=back
This page describes the API functions provided by the FFI library in
detail. It's recommended to read through the introduction and the FFI
tutorial first.
=head2 Glossary
=over
=item * B<cdecl> E<mdash> An abstract C type declaration (a Lua
string).
=item * B<ctype> E<mdash> A C type object. This is a special kind of
B<cdata> returned by C<ffi.typeof()>. It serves as a B<cdata>
constructor when called.
=item * B<cdata> E<mdash> A C data object. It holds a value of the
corresponding B<ctype>.
=item * B<ct> E<mdash> A C type specification which can be used for
most of the API functions. Either a B<cdecl>, a B<ctype> or a B<cdata>
serving as a template type.
=item * B<cb> E<mdash> A callback object. This is a C data object
holding a special function pointer. Calling this function from C code
runs an associated Lua function.
=item * B<VLA> E<mdash> A variable-length array is declared with a C<?>
instead of the number of elements, e.g. C<"int[?]">. The number of
elements (C<nelem>) must be given when it's created.
=item * B<VLS> E<mdash> A variable-length struct is a C<struct> C type
where the last element is a B<VLA>. The same rules for declaration and
creation apply.
=back
=head2 Declaring and Accessing External Symbols
External symbols must be declared first and can then be accessed by
indexing a C library namespace, which automatically binds the symbol to
a specific library.
=head2 C<ffi.cdef(def)>
Adds multiple C declarations for types or external symbols (named
variables or functions). C<def> must be a Lua string. It's recommended
to use the syntactic sugar for string arguments as follows:
ffi.cdef[[
typedef struct foo { int a, b; } foo_t; // Declare a struct and typedef.
int dofoo(foo_t *f, int n); /* Declare an external C function. */
]]
The contents of the string (the part in green above) must be a sequence
of C declarations, separated by semicolons. The trailing semicolon for
a single declaration may be omitted.
Please note that external symbols are only I<declared>, but they are
I<not bound> to any specific address, yet. Binding is achieved with C
library namespaces (see below).
C declarations are not passed through a C pre-processor, yet. No
pre-processor tokens are allowed, except for C<#pragma pack>. Replace
C<#define> in existing C header files with C<enum>, C<static const> or
C<typedef> and/or pass the files through an external C pre-processor
(once). Be careful not to include unneeded or redundant declarations
from unrelated header files.
=head2 C<ffi.C>
This is the default C library namespace E<mdash> note the uppercase
C<'C'>. It binds to the default set of symbols or libraries on the
target system. These are more or less the same as a C compiler would
offer by default, without specifying extra link libraries.
On POSIX systems, this binds to symbols in the default or global
namespace. This includes all exported symbols from the executable and
any libraries loaded into the global namespace. This includes at least
C<libc>, C<libm>, C<libdl> (on Linux), C<libgcc> (if compiled with
GCC), as well as any exported symbols from the Lua/C API provided by
LuaJIT itself.
On Windows systems, this binds to symbols exported from the C<*.exe>,
the C<lua51.dll> (i.e. the Lua/C API provided by LuaJIT itself), the C
runtime library LuaJIT was linked with (C<msvcrt*.dll>),
C<kernel32.dll>, C<user32.dll> and C<gdi32.dll>.
=head2 C<clib = ffi.load(name [,global])>
This loads the dynamic library given by C<name> and returns a new C
library namespace which binds to its symbols. On POSIX systems, if
C<global> is C<true>, the library symbols are loaded into the global
namespace, too.
If C<name> is a path, the library is loaded from this path. Otherwise
C<name> is canonicalized in a system-dependent way and searched in the
default search path for dynamic libraries:
On POSIX systems, if the name contains no dot, the extension C<.so> is
appended. Also, the C<lib> prefix is prepended if necessary. So
C<ffi.load("z")> looks for C<"libz.so"> in the default shared library
search path.
On Windows systems, if the name contains no dot, the extension C<.dll>
is appended. So C<ffi.load("ws2_32")> looks for C<"ws2_32.dll"> in the
default DLL search path.
=head2 Creating cdata Objects
The following API functions create cdata objects (C<type()> returns
C<"cdata">). All created cdata objects are garbage collected.
=head2 cdata = ffi.new(ct [,nelem] [,init...])
cdata = I<ctype>([nelem,] [init...])
Creates a cdata object for the given C<ct>. VLA/VLS types require the
C<nelem> argument. The second syntax uses a ctype as a constructor and
is otherwise fully equivalent.
The cdata object is initialized according to the rules for
initializers, using the optional C<init> arguments. Excess initializers
cause an error.
Performance notice: if you want to create many objects of one kind,
parse the cdecl only once and get its ctype with C<ffi.typeof()>. Then
use the ctype as a constructor repeatedly.
Please note that an anonymous C<struct> declaration implicitly creates
a new and distinguished ctype every time you use it for C<ffi.new()>.
This is probably B<not> what you want, especially if you create more
than one cdata object. Different anonymous C<structs> are not
considered assignment-compatible by the C standard, even though they
may have the same fields! Also, they are considered different types by
the JIT-compiler, which may cause an excessive number of traces. It's
strongly suggested to either declare a named C<struct> or C<typedef>
with C<ffi.cdef()> or to create a single ctype object for an anonymous
C<struct> with C<ffi.typeof()>.
=head2 C<ctype = ffi.typeof(ct)>
Creates a ctype object for the given C<ct>.
This function is especially useful to parse a cdecl only once and then
use the resulting ctype object as a constructor.
=head2 C<cdata = ffi.cast(ct, init)>
Creates a scalar cdata object for the given C<ct>. The cdata object is
initialized with C<init> using the "cast" variant of the C type
conversion rules.
This functions is mainly useful to override the pointer compatibility
checks or to convert pointers to addresses or vice versa.
=head2 C<ctype = ffi.metatype(ct, metatable)>
Creates a ctype object for the given C<ct> and associates it with a
metatable. Only C<struct>/C<union> types, complex numbers and vectors
are allowed. Other types may be wrapped in a C<struct>, if needed.
The association with a metatable is permanent and cannot be changed
afterwards. Neither the contents of the C<metatable> nor the contents
of an C<__index> table (if any) may be modified afterwards. The
associated metatable automatically applies to all uses of this type, no
matter how the objects are created or where they originate from. Note
that pre-defined operations on types have precedence (e.g. declared
field names cannot be overridden).
All standard Lua metamethods are implemented. These are called
directly, without shortcuts and on any mix of types. For binary
operations, the left operand is checked first for a valid ctype
metamethod. The C<__gc> metamethod only applies to C<struct>/C<union>
types and performs an implicit C<ffi.gc()> call during creation of an
instance.
=head2 C<cdata = ffi.gc(cdata, finalizer)>
Associates a finalizer with a pointer or aggregate cdata object. The
cdata object is returned unchanged.
This function allows safe integration of unmanaged resources into the
automatic memory management of the LuaJIT garbage collector. Typical
usage:
local p = ffi.gc(ffi.C.malloc(n), ffi.C.free)
...
p = nil -- Last reference to p is gone.
-- GC will eventually run finalizer: ffi.C.free(p)
A cdata finalizer works like the C<__gc> metamethod for userdata
objects: when the last reference to a cdata object is gone, the
associated finalizer is called with the cdata object as an argument.
The finalizer can be a Lua function or a cdata function or cdata
function pointer. An existing finalizer can be removed by setting a
C<nil> finalizer, e.g. right before explicitly deleting a resource:
ffi.C.free(ffi.gc(p, nil)) -- Manually free the memory.
=head2 C Type Information
The following API functions return information about C types. They are
most useful for inspecting cdata objects.
=head2 C<size = ffi.sizeof(ct [,nelem])>
Returns the size of C<ct> in bytes. Returns C<nil> if the size is not
known (e.g. for C<"void"> or function types). Requires C<nelem> for
VLA/VLS types, except for cdata objects.
=head2 C<align = ffi.alignof(ct)>
Returns the minimum required alignment for C<ct> in bytes.
=head2 C<ofs [,bpos,bsize] = ffi.offsetof(ct, field)>
Returns the offset (in bytes) of C<field> relative to the start of
C<ct>, which must be a C<struct>. Additionally returns the position and
the field size (in bits) for bit fields.
=head2 C<status = ffi.istype(ct, obj)>
Returns C<true> if C<obj> has the C type given by C<ct>. Returns
C<false> otherwise.
C type qualifiers (C<const> etc.) are ignored. Pointers are checked
with the standard pointer compatibility rules, but without any special
treatment for C<void *>. If C<ct> specifies a C<struct>/C<union>, then
a pointer to this type is accepted, too. Otherwise the types must match
exactly.
Note: this function accepts all kinds of Lua objects for the C<obj>
argument, but always returns C<false> for non-cdata objects.
=head2 Utility Functions
=head2 C<err = ffi.errno([newerr])>
Returns the error number set by the last C function call which
indicated an error condition. If the optional C<newerr> argument is
present, the error number is set to the new value and the previous
value is returned.
This function offers a portable and OS-independent way to get and set
the error number. Note that only I<some> C functions set the error
number. And it's only significant if the function actually indicated an
error condition (e.g. with a return value of C<-1> or C<NULL>).
Otherwise, it may or may not contain any previously set value.
You're advised to call this function only when needed and as close as
possible after the return of the related C function. The C<errno> value
is preserved across hooks, memory allocations, invocations of the JIT
compiler and other internal VM activity. The same applies to the value
returned by C<GetLastError()> on Windows, but you need to declare and
call it yourself.
=head2 C<str = ffi.string(ptr [,len])>
Creates an interned Lua string from the data pointed to by C<ptr>.
If the optional argument C<len> is missing, C<ptr> is converted to a
C<"char *"> and the data is assumed to be zero-terminated. The length
of the string is computed with C<strlen()>.
Otherwise C<ptr> is converted to a C<"void *"> and C<len> gives the
length of the data. The data may contain embedded zeros and need not be
byte-oriented (though this may cause endianness issues).
This function is mainly useful to convert (temporary) C<"const char *">
pointers returned by C functions to Lua strings and store them or pass
them to other functions expecting a Lua string. The Lua string is an
(interned) copy of the data and bears no relation to the original data
area anymore. Lua strings are 8 bit clean and may be used to hold
arbitrary, non-character data.
Performance notice: it's faster to pass the length of the string, if
it's known. E.g. when the length is returned by a C call like
C<sprintf()>.
=head2 ffi.copy(dst, src, len)
ffi.copy(dst, str)
Copies the data pointed to by C<src> to C<dst>. C<dst> is converted to
a C<"void *"> and C<src> is converted to a C<"const void *">.
In the first syntax, C<len> gives the number of bytes to copy. Caveat:
if C<src> is a Lua string, then C<len> must not exceed C<#src+1>.
In the second syntax, the source of the copy must be a Lua string. All
bytes of the string I<plus a zero-terminator> are copied to C<dst>
(i.e. C<#src+1> bytes).
Performance notice: C<ffi.copy()> may be used as a faster (inlinable)
replacement for the C library functions C<memcpy()>, C<strcpy()> and
C<strncpy()>.
=head2 C<ffi.fill(dst, len [,c])>
Fills the data pointed to by C<dst> with C<len> constant bytes, given
by C<c>. If C<c> is omitted, the data is zero-filled.
Performance notice: C<ffi.fill()> may be used as a faster (inlinable)
replacement for the C library function C<memset(dst, c, len)>. Please
note the different order of arguments!
=head2 Target-specific Information
=head2 C<status = ffi.abi(param)>
Returns C<true> if C<param> (a Lua string) applies for the target ABI
(Application Binary Interface). Returns C<false> otherwise. The
following parameters are currently defined:
Parameter
Description
32bit
32 bit architecture
64bit
64 bit architecture
le
Little-endian architecture
be
Big-endian architecture
fpu
Target has a hardware FPU
softfp
softfp calling conventions
hardfp
hardfp calling conventions
eabi
EABI variant of the standard ABI
win
Windows variant of the standard ABI
gc64
64 bit GC references
=head2 C<ffi.os>
Contains the target OS name. Same contents as C<jit.os>.
=head2 C<ffi.arch>
Contains the target architecture name. Same contents as C<jit.arch>.
=head2 Methods for Callbacks
The C types for callbacks have some extra methods:
=head2 C<cb:free()>
Free the resources associated with a callback. The associated Lua
function is unanchored and may be garbage collected. The callback
function pointer is no longer valid and must not be called anymore (it
may be reused by a subsequently created callback).
=head2 C<cb:set(func)>
Associate a new Lua function with a callback. The C type of the
callback and the callback function pointer are unchanged.
This method is useful to dynamically switch the receiver of callbacks
without creating a new callback each time and registering it again
(e.g. with a GUI library).
=head2 Extended Standard Library Functions
The following standard library functions have been extended to work
with cdata objects:
=head2 C<n = tonumber(cdata)>
Converts a number cdata object to a C<double> and returns it as a Lua
number. This is particularly useful for boxed 64 bit integer values.
Caveat: this conversion may incur a precision loss.
=head2 C<s = tostring(cdata)>
Returns a string representation of the value of 64 bit integers
(C<B<">nnnB<LL">> or C<B<">nnnB<ULL">>) or complex numbers
(C<B<">reE<plusmn>imB<i">>). Otherwise returns a string representation
of the C type of a ctype object (C<B<"ctypeE<lt>>typeB<E<gt>">>) or a
cdata object (C<B<"cdataE<lt>>typeB<E<gt>: >address">), unless you
override it with a C<__tostring> metamethod (see C<ffi.metatype()>).
=head2 iter, obj, start = pairs(cdata)
iter, obj, start = ipairs(cdata)
Calls the C<__pairs> or C<__ipairs> metamethod of the corresponding
ctype.
=head2 Extensions to the Lua Parser
The parser for Lua source code treats numeric literals with the
suffixes C<LL> or C<ULL> as signed or unsigned 64 bit integers. Case
doesn't matter, but uppercase is recommended for readability. It
handles decimal (C<42LL>), hexadecimal (C<0x2aLL>) and binary
(C<0b101010LL>) literals.
The imaginary part of complex numbers can be specified by suffixing
number literals with C<i> or C<I>, e.g. C<12.5i>. Caveat: you'll need
to use C<1i> to get an imaginary part with the value one, since C<i>
itself still refers to a variable named C<i>.
----
Copyright E<copy> 2005-2017 Mike Pall E<middot> Contact
=cut
#Pod::HTML2Pod conversion notes:
#From file ext_ffi_api.html
# 21471 bytes of input
#Mon May 14 13:19:16 2018 agentzh
# No a_name switch not specified, so will not try to render <a name='...'>
# No a_href switch not specified, so will not try to render <a href='...'>
# Deleting phrasal "code" element (`tt_157) because it has super-phrasal elements (`br_3, `br_4) as children.
# Deleting phrasal "code" element (`tt_113) because it has super-phrasal elements (`br_2) as children.
# Deleting phrasal "code" element (`tt_41) because it has super-phrasal elements (`br_1) as children.