mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 15:14:08 +00:00
FFI: Update docs on FFI semantics.
This commit is contained in:
parent
0b55e05d06
commit
425f67c7d6
@ -83,12 +83,6 @@ expect them to work. It should be straightforward to write
|
|||||||
applications using the LuaJIT FFI for developers with a C or C++
|
applications using the LuaJIT FFI for developers with a C or C++
|
||||||
background.
|
background.
|
||||||
</p>
|
</p>
|
||||||
<p class="indent" style="color: #c00000;">
|
|
||||||
Please note: this doesn't comprise the final specification for the FFI
|
|
||||||
semantics, yet. Some semantics may need to be changed, based on your
|
|
||||||
feedback. Please <a href="contact.html">report</a> any problems you may
|
|
||||||
encounter or any improvements you'd like to see — thank you!
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="clang">C Language Support</h2>
|
<h2 id="clang">C Language Support</h2>
|
||||||
<p>
|
<p>
|
||||||
@ -813,6 +807,55 @@ possibly provide.</li>
|
|||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<h2 id="param">Parameterized Types</h2>
|
||||||
|
<p>
|
||||||
|
To facilitate some abstractions, the two functions
|
||||||
|
<a href="ext_ffi_api.html#ffi_typeof"><tt>ffi.typeof</tt></a> and
|
||||||
|
<a href="ext_ffi_api.html#ffi_cdef"><tt>ffi.cdef</tt></a> support
|
||||||
|
parameterized types in C declarations. Note: none of the other API
|
||||||
|
functions taking a cdecl allow this.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Any place you can write a <b><tt>typedef</tt> name</b>, an
|
||||||
|
<b>identifier</b> or a <b>number</b> in a declaration, you can write
|
||||||
|
<tt>$</tt> (the dollar sign) instead. These placeholders are replaced in
|
||||||
|
order of appearance with the arguments following the cdecl string:
|
||||||
|
</p>
|
||||||
|
<pre class="code">
|
||||||
|
-- Declare a struct with a parameterized field type and name:
|
||||||
|
ffi.cdef([[
|
||||||
|
typedef struct { $ $; } foo_t;
|
||||||
|
]], type1, name1)
|
||||||
|
|
||||||
|
-- Anonymous struct with dynamic names:
|
||||||
|
local bar_t = ffi.typeof("struct { int $, $; }", name1, name2)
|
||||||
|
-- Derived pointer type:
|
||||||
|
local bar_ptr_t = ffi.typeof("$ *", bar_t)
|
||||||
|
|
||||||
|
-- Parameterized dimensions work even where a VLA won't work:
|
||||||
|
local matrix_t = ffi.typeof("uint8_t[$][$]", width, height)
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
Caveat: this is <em>not</em> simple text substitution! A passed ctype or
|
||||||
|
cdata object is treated like the underlying type, a passed string is
|
||||||
|
considered an identifier and a number is considered a number. You must
|
||||||
|
not mix this up: e.g. passing <tt>"int"</tt> as a string doesn't work in
|
||||||
|
place of a type, you'd need to use <tt>ffi.typeof("int")</tt> instead.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The main use for parameterized types are libraries implementing abstract
|
||||||
|
data types
|
||||||
|
(<a href="http://www.freelists.org/post/luajit/ffi-type-of-pointer-to,8"><span class="ext">»</span> example</a>),
|
||||||
|
similar to what can be achieved with C++ template metaprogramming.
|
||||||
|
Another use case are derived types of anonymous structs, which avoids
|
||||||
|
pollution of the global struct namespace.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Please note that parameterized types are a nice tool and indispensable
|
||||||
|
for certain use cases. But you'll want to use them sparingly in regular
|
||||||
|
code, e.g. when all types are actually fixed.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="gc">Garbage Collection of cdata Objects</h2>
|
<h2 id="gc">Garbage Collection of cdata Objects</h2>
|
||||||
<p>
|
<p>
|
||||||
All explicitly (<tt>ffi.new()</tt>, <tt>ffi.cast()</tt> etc.) or
|
All explicitly (<tt>ffi.new()</tt>, <tt>ffi.cast()</tt> etc.) or
|
||||||
@ -1156,10 +1199,8 @@ value.</li>
|
|||||||
<li>ctype <tt>__newindex</tt> tables and non-string lookups in ctype
|
<li>ctype <tt>__newindex</tt> tables and non-string lookups in ctype
|
||||||
<tt>__index</tt> tables.</li>
|
<tt>__index</tt> tables.</li>
|
||||||
<li><tt>tostring()</tt> for cdata types.</li>
|
<li><tt>tostring()</tt> for cdata types.</li>
|
||||||
<li>Calls to the following <a href="ext_ffi_api.html">ffi.* API</a>
|
<li>Calls to <tt>ffi.cdef()</tt>, <tt>ffi.load()</tt> and
|
||||||
functions: <tt>cdef</tt>, <tt>load</tt>, <tt>typeof</tt>,
|
<tt>ffi.metatype()</tt>.</li>
|
||||||
<tt>metatype</tt>, <tt>gc</tt>, <tt>sizeof</tt>, <tt>alignof</tt>,
|
|
||||||
<tt>offsetof</tt>.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<p>
|
||||||
Other missing features:
|
Other missing features:
|
||||||
|
Loading…
Reference in New Issue
Block a user