mirror of
				https://github.com/openresty/openresty.git
				synced 2024-10-13 00:29:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			504 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			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 overriden).
 | |
| 
 | |
| 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 endianess 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.
 |