aboutsummaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorMike Pall <mike>2011-01-20 22:14:17 +0100
committerMike Pall <mike>2011-01-20 22:14:17 +0100
commite985aeda84d8af63c4bfaa176c3312dfb2f7f230 (patch)
tree8a68df0aac6779db0972bb9dc07fbbe0c7629bc7 /doc
parent8396c3cdbc26e08fdf9dea204efb641dd6ad1f91 (diff)
downloadluajit-e985aeda84d8af63c4bfaa176c3312dfb2f7f230.tar.gz
luajit-e985aeda84d8af63c4bfaa176c3312dfb2f7f230.tar.bz2
luajit-e985aeda84d8af63c4bfaa176c3312dfb2f7f230.zip
FFI: Add preliminary FFI documentation (still incomplete).
Diffstat (limited to 'doc')
-rw-r--r--doc/bluequad.css5
-rw-r--r--doc/changes.html11
-rw-r--r--doc/contact.html11
-rw-r--r--doc/ext_c_api.html11
-rw-r--r--doc/ext_ffi.html280
-rw-r--r--doc/ext_ffi_api.html410
-rw-r--r--doc/ext_ffi_int64.html73
-rw-r--r--doc/ext_ffi_semantics.html155
-rw-r--r--doc/ext_ffi_tutorial.html91
-rw-r--r--doc/ext_jit.html17
-rw-r--r--doc/extensions.html18
-rw-r--r--doc/faq.html11
-rw-r--r--doc/install.html11
-rw-r--r--doc/luajit.html11
-rw-r--r--doc/running.html11
-rw-r--r--doc/status.html26
16 files changed, 1137 insertions, 15 deletions
diff --git a/doc/bluequad.css b/doc/bluequad.css
index 5ea9ad49..49849fb7 100644
--- a/doc/bluequad.css
+++ b/doc/bluequad.css
@@ -271,7 +271,10 @@ img.right {
271 color: #2142bf; 271 color: #2142bf;
272} 272}
273#nav ul ul a { 273#nav ul ul a {
274 padding: 0 1em 0 2em; 274 padding: 0 1em 0 1.7em;
275}
276#nav ul ul ul a {
277 padding: 0 0.5em 0 2.4em;
275} 278}
276#main { 279#main {
277 line-height: 1.5; 280 line-height: 1.5;
diff --git a/doc/changes.html b/doc/changes.html
index 332ba509..c79e00c9 100644
--- a/doc/changes.html
+++ b/doc/changes.html
@@ -30,6 +30,17 @@ div.major { max-width: 600px; padding: 1em; margin: 1em 0 1em 0; }
30</li><li> 30</li><li>
31<a href="extensions.html">Extensions</a> 31<a href="extensions.html">Extensions</a>
32<ul><li> 32<ul><li>
33<a href="ext_ffi.html">FFI Library</a>
34<ul><li>
35<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
36</li><li>
37<a href="ext_ffi_api.html">ffi.* API</a>
38</li><li>
39<a href="ext_ffi_int64.html">64 bit Integers</a>
40</li><li>
41<a href="ext_ffi_semantics.html">FFI Semantics</a>
42</li></ul>
43</li><li>
33<a href="ext_jit.html">jit.* Library</a> 44<a href="ext_jit.html">jit.* Library</a>
34</li><li> 45</li><li>
35<a href="ext_c_api.html">Lua/C API</a> 46<a href="ext_c_api.html">Lua/C API</a>
diff --git a/doc/contact.html b/doc/contact.html
index 120de3a9..a979cb2f 100644
--- a/doc/contact.html
+++ b/doc/contact.html
@@ -27,6 +27,17 @@
27</li><li> 27</li><li>
28<a href="extensions.html">Extensions</a> 28<a href="extensions.html">Extensions</a>
29<ul><li> 29<ul><li>
30<a href="ext_ffi.html">FFI Library</a>
31<ul><li>
32<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
33</li><li>
34<a href="ext_ffi_api.html">ffi.* API</a>
35</li><li>
36<a href="ext_ffi_int64.html">64 bit Integers</a>
37</li><li>
38<a href="ext_ffi_semantics.html">FFI Semantics</a>
39</li></ul>
40</li><li>
30<a href="ext_jit.html">jit.* Library</a> 41<a href="ext_jit.html">jit.* Library</a>
31</li><li> 42</li><li>
32<a href="ext_c_api.html">Lua/C API</a> 43<a href="ext_c_api.html">Lua/C API</a>
diff --git a/doc/ext_c_api.html b/doc/ext_c_api.html
index 94abe120..119c89f5 100644
--- a/doc/ext_c_api.html
+++ b/doc/ext_c_api.html
@@ -27,6 +27,17 @@
27</li><li> 27</li><li>
28<a href="extensions.html">Extensions</a> 28<a href="extensions.html">Extensions</a>
29<ul><li> 29<ul><li>
30<a href="ext_ffi.html">FFI Library</a>
31<ul><li>
32<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
33</li><li>
34<a href="ext_ffi_api.html">ffi.* API</a>
35</li><li>
36<a href="ext_ffi_int64.html">64 bit Integers</a>
37</li><li>
38<a href="ext_ffi_semantics.html">FFI Semantics</a>
39</li></ul>
40</li><li>
30<a href="ext_jit.html">jit.* Library</a> 41<a href="ext_jit.html">jit.* Library</a>
31</li><li> 42</li><li>
32<a class="current" href="ext_c_api.html">Lua/C API</a> 43<a class="current" href="ext_c_api.html">Lua/C API</a>
diff --git a/doc/ext_ffi.html b/doc/ext_ffi.html
new file mode 100644
index 00000000..e8e2a62b
--- /dev/null
+++ b/doc/ext_ffi.html
@@ -0,0 +1,280 @@
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2<html>
3<head>
4<title>FFI Library</title>
5<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6<meta name="Author" content="Mike Pall">
7<meta name="Copyright" content="Copyright (C) 2005-2011, Mike Pall">
8<meta name="Language" content="en">
9<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
10<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
11</head>
12<body>
13<div id="site">
14<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>
15</div>
16<div id="head">
17<h1>FFI Library</h1>
18</div>
19<div id="nav">
20<ul><li>
21<a href="luajit.html">LuaJIT</a>
22<ul><li>
23<a href="install.html">Installation</a>
24</li><li>
25<a href="running.html">Running</a>
26</li></ul>
27</li><li>
28<a href="extensions.html">Extensions</a>
29<ul><li>
30<a class="current" href="ext_ffi.html">FFI Library</a>
31<ul><li>
32<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
33</li><li>
34<a href="ext_ffi_api.html">ffi.* API</a>
35</li><li>
36<a href="ext_ffi_int64.html">64 bit Integers</a>
37</li><li>
38<a href="ext_ffi_semantics.html">FFI Semantics</a>
39</li></ul>
40</li><li>
41<a href="ext_jit.html">jit.* Library</a>
42</li><li>
43<a href="ext_c_api.html">Lua/C API</a>
44</li></ul>
45</li><li>
46<a href="status.html">Status</a>
47<ul><li>
48<a href="changes.html">Changes</a>
49</li></ul>
50</li><li>
51<a href="faq.html">FAQ</a>
52</li><li>
53<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>
54</li><li>
55<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>
56</li></ul>
57</div>
58<div id="main">
59<p>
60The FFI library allows calling external C&nbsp;functions and the use
61of C&nbsp;data structures from pure Lua code.
62</p>
63<p>
64The FFI library largely obviates the need to write tedious manual
65Lua/C bindings in C. It doesn't require learning a separate binding
66language &mdash; it parses plain C&nbsp;declarations, which can be
67cut-n-pasted from C&nbsp;header files or reference manuals. It's up to
68the task of binding large libraries without the need for dealing with
69fragile binding generators.
70</p>
71<p>
72The FFI library is tightly integrated into LuaJIT (it's not available
73as a separate module). The code generated by the JIT-compiler for
74accesses to C&nbsp;data structures from Lua code is on par with the
75code a C&nbsp;compiler would generate. Calls to C&nbsp;functions can
76be inlined in the JIT-compiled code, unlike calls to functions bound
77via the classic Lua/C API.
78</p>
79<p>
80This page gives a short introduction to the usage of the FFI library.
81Please use the FFI sub-topics in the navigation bar to learn more.
82</p>
83
84<h2 id="call">Motivating Example: Calling External C Functions</h2>
85<p>
86It's really easy to call an external C&nbsp;library function:
87</p>
88<pre class="code">
89<span style="color:#000080;">local ffi = require("ffi")</span>
90ffi.cdef[[
91<span style="color:#00a000;font-weight:bold;">int printf(const char *fmt, ...);</span>
92]]
93<span style="color:#c06000;font-weight:bold;">ffi.C</span>.printf("Hello %s!", "world")
94</pre>
95<p>
96So, let's pick that apart: the first line (in blue) loads the FFI
97library. The next one adds a C&nbsp;declaration for the function. The
98part between the double-brackets (in green) is just standard
99C&nbsp;syntax. And the last line calls the named C&nbsp;function. Yes,
100it's that simple!
101</p>
102<p style="font-size: 8pt;">
103Actually, what goes on behind the scenes is far from simple: the first
104part of the last line (in orange) makes use of the standard
105C&nbsp;library namespace <tt>ffi.C</tt>. Indexing this namespace with
106a symbol name (<tt>"printf"</tt>) automatically binds it to the the
107standard C&nbsp;library. The result is a special kind of object which,
108when called, runs the <tt>printf</tt> function. The arguments passed
109to this function are automatically converted from Lua objects to the
110corresponding C&nbsp;types.
111</p>
112<p>
113Ok, so maybe the use of <tt>printf()</tt> wasn't such a spectacular
114example. You could have done that with <tt>io.write()</tt> and
115<tt>string.format()</tt>, too. But you get the idea ...
116</p>
117<p>
118So here's something to pop up a message box on Windows:
119</p>
120<pre class="code">
121local ffi = require("ffi")
122ffi.cdef[[
123int MessageBoxA(void *w, const char *txt, const char *cap, int type);
124]]
125ffi.C.MessageBoxA(nil, "Hello world!", "Test", 0)
126</pre>
127<p>
128Bing! Again, that was far too easy, no?
129</p>
130<p style="font-size: 8pt;">
131Compare this with the effort required to bind that function using the
132classic Lua/C API: create an extra C&nbsp;file, add a C&nbsp;function
133that retrieves and checks the argument types passed from Lua and calls
134the actual C&nbsp;function, add a list of module functions and their
135names, add a <tt>luaopen_*</tt> function and register all module
136functions, compile and link it into a shared library (DLL), move it to
137the proper path, add Lua code that loads the module aaaand ... finally
138call the binding function. Phew!
139</p>
140
141<h2 id="call">Motivating Example: Using C Data Structures</h2>
142<p>
143The FFI library allows you to create and access C&nbsp;data
144structures. Of course the main use for this is for interfacing with
145C&nbsp;functions. But they can be used stand-alone, too.
146</p>
147<p>
148Lua is built upon high-level data types. They are flexible, extensible
149and dynamic. That's why we all love Lua so much. Alas, this can be
150inefficient for certain tasks, where you'd really want a low-level
151data type. E.g. a large array of a fixed structure needs to be
152implemented with a big table holding lots of tiny tables. This imposes
153both a substantial memory overhead as well as a performance overhead.
154</p>
155<p>
156Here's a sketch of a library that operates on color images plus a
157simple benchmark. First, the plain Lua version:
158</p>
159<pre class="code">
160local floor = math.floor
161
162local function image_ramp_green(n)
163 local img = {}
164 local f = 255/(n-1)
165 for i=1,n do
166 img[i] = { red = 0, green = floor((i-1)*f), blue = 0, alpha = 255 }
167 end
168 return img
169end
170
171local function image_to_grey(img, n)
172 for i=1,n do
173 local y = floor(0.3*img[i].red + 0.59*img[i].green + 0.11*img[i].blue)
174 img[i].red = y; img[i].green = y; img[i].blue = y
175 end
176end
177
178local N = 400*400
179local img = image_ramp_green(N)
180for i=1,1000 do
181 image_to_grey(img, N)
182end
183</pre>
184<p>
185This creates a table with 160.000 pixels, each of which is a table
186holding four number values in the range of 0-255. First an image with
187a green ramp is created (1D for simplicity), then the image is
188converted to greyscale 1000 times. Yes, that's silly, but I was in
189need of a simple example ...
190</p>
191<p>
192And here's the FFI version. The modified parts have been marked in
193bold:
194</p>
195<pre class="code">
196<b>local ffi = require("ffi")
197ffi.cdef[[
198typedef struct { uint8_t red, green, blue, alpha; } rgba_pixel;
199]]</b>
200
201local function image_ramp_green(n)
202 <b>local img = ffi.new("rgba_pixel[?]", n)</b>
203 local f = 255/(n-1)
204 for i=<b>0,n-1</b> do
205 <b>img[i].green = i*f</b>
206 <b>img[i].alpha = 255</b>
207 end
208 return img
209end
210
211local function image_to_grey(img, n)
212 for i=<b>0,n-1</b> do
213 local y = <b>0.3*img[i].red + 0.59*img[i].green + 0.11*img[i].blue</b>
214 img[i].red = y; img[i].green = y; img[i].blue = y
215 end
216end
217
218local N = 400*400
219local img = image_ramp_green(N)
220for i=1,1000 do
221 image_to_grey(img, N)
222end
223</pre>
224<p>
225Ok, so that wasn't too difficult: first, load the FFI library and
226declare the low-level data type. Here we choose a <tt>struct</tt>
227which holds four byte fields, one for each component of a 4x8&nbsp;bit
228RGBA pixel.
229</p>
230<p>
231Creating the data structure with <tt>ffi.new()</tt> is straightforward
232&mdash; the <tt>'?'</tt> is a placeholder for the number of elements
233of a variable-length array. C&nbsp;arrays are zero-based, so the
234indexes have to run from <tt>0</tt> to <tt>n-1</tt> (one might
235allocate one more element instead to simplify converting legacy
236code). Since <tt>ffi.new()</tt> zero-fills the array by default, we
237only need to set the green and the alpha fields.
238</p>
239<p>
240The calls to <tt>math.floor()</tt> can be omitted here, because
241floating-point numbers are already truncated towards zero when
242converting them to an integer. This happens implicitly when the number
243is stored in the fields of each pixel.
244</p>
245<p>
246Now let's have a look at the impact of the changes: first, memory
247consumption for the image is down from 22&nbsp;Megabytes to
248640&nbsp;Kilobytes (400*400*4 bytes). That's a factor of 35x less! So,
249yes, tables do have a noticeable overhead. BTW: The original program
250would consume 40&nbsp;Megabytes in plain Lua (on x64).
251</p>
252<p>
253Next, performance: the pure Lua version runs in 9.57 seconds (52.9
254seconds with the Lua interpreter) and the FFI version runs in 0.48
255seconds on my machine (YMMV). That's a factor of 20x faster (110x
256faster than with plain Lua).
257</p>
258<p style="font-size: 8pt;">
259The avid reader may notice that converting the pure Lua version over
260to use array indexes for the colors (<tt>[1]</tt> instead of
261<tt>.red</tt>, <tt>[2]</tt> instead of <tt>.green</tt> etc.) ought to
262be more compact and faster. This is certainly true (by a factor of
263~1.7x), but the resulting code would be less idiomatic and rather
264error-prone. And it still doesn't get even close to the performance of
265the FFI version of the code. Also, high-level data structures cannot
266be easily passed to other C&nbsp;functions, especially I/O functions,
267without undue conversion penalties.
268</p>
269<br class="flush">
270</div>
271<div id="foot">
272<hr class="hide">
273Copyright &copy; 2005-2011 Mike Pall
274<span class="noprint">
275&middot;
276<a href="contact.html">Contact</a>
277</span>
278</div>
279</body>
280</html>
diff --git a/doc/ext_ffi_api.html b/doc/ext_ffi_api.html
new file mode 100644
index 00000000..f985d965
--- /dev/null
+++ b/doc/ext_ffi_api.html
@@ -0,0 +1,410 @@
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2<html>
3<head>
4<title>ffi.* API Functions</title>
5<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6<meta name="Author" content="Mike Pall">
7<meta name="Copyright" content="Copyright (C) 2005-2011, Mike Pall">
8<meta name="Language" content="en">
9<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
10<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
11<style type="text/css">
12table.abitable { width: 30em; line-height: 1.2; }
13tr.abihead td { font-weight: bold; }
14td.abiparam { font-weight: bold; width: 6em; }
15</style>
16</head>
17<body>
18<div id="site">
19<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>
20</div>
21<div id="head">
22<h1><tt>ffi.*</tt> API Functions</h1>
23</div>
24<div id="nav">
25<ul><li>
26<a href="luajit.html">LuaJIT</a>
27<ul><li>
28<a href="install.html">Installation</a>
29</li><li>
30<a href="running.html">Running</a>
31</li></ul>
32</li><li>
33<a href="extensions.html">Extensions</a>
34<ul><li>
35<a href="ext_ffi.html">FFI Library</a>
36<ul><li>
37<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
38</li><li>
39<a class="current" href="ext_ffi_api.html">ffi.* API</a>
40</li><li>
41<a href="ext_ffi_int64.html">64 bit Integers</a>
42</li><li>
43<a href="ext_ffi_semantics.html">FFI Semantics</a>
44</li></ul>
45</li><li>
46<a href="ext_jit.html">jit.* Library</a>
47</li><li>
48<a href="ext_c_api.html">Lua/C API</a>
49</li></ul>
50</li><li>
51<a href="status.html">Status</a>
52<ul><li>
53<a href="changes.html">Changes</a>
54</li></ul>
55</li><li>
56<a href="faq.html">FAQ</a>
57</li><li>
58<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>
59</li><li>
60<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>
61</li></ul>
62</div>
63<div id="main">
64<p>
65This page describes the API functions provided by the FFI library in
66detail. It's recommended to read through the
67<a href="ext_ffi.html">introduction</a> and the
68<a href="ext_ffi_tutorial.html">FFI tutorial</a> first.
69</p>
70
71<h2 id="glossary">Glossary</h2>
72<ul>
73<li><b>cdecl</b> &mdash; An abstract C&nbsp;type declaration (a Lua
74string).</li>
75<li><b>ctype</b> &mdash; A C&nbsp;type object. This is a special kind of
76<b>cdata</b> returned by <tt>ffi.typeof()</tt>. It serves as a
77<b>cdata</b> <a href="#ffi_new">constructor</a> when called.</li>
78<li><b>cdata</b> &mdash; A C&nbsp;data object. It holds a value of the
79corresponding <b>ctype</b>.</li>
80<li><b>ct</b> &mdash; A C&nbsp;type specification which can be used for
81most of the API functions. Either a <b>cdecl</b>, a <b>ctype</b> or a
82<b>cdata</b> serving as a template type.</li>
83<li><b>VLA</b> &mdash; A variable-length array is declared with a
84<tt>?</tt> instead of the number of elements, e.g. <tt>"int[?]"</tt>.
85The number of elements (<tt>nelem</tt>) must be given when it's
86<a href="#ffi_new">created</a>.</li>
87<li><b>VLS</b> &mdash; A variable-length struct is a <tt>struct</tt> C
88type where the last element is a <b>VLA</b>. The same rules for
89declaration and creation apply.</li>
90</ul>
91
92<h2 id="decl">Declaring and Accessing External Symbols</h2>
93<p>
94External symbols must be declared first and can then be accessed by
95indexing a <a href="ext_ffi_semantics.html#clib">C&nbsp;library
96namespace</a>, which automatically binds the symbol to a specific
97library.
98</p>
99
100<h3 id="ffi_cdef"><tt>ffi.cdef(def)</tt></h3>
101<p>
102Adds multiple C&nbsp;declarations for types or external symbols (named
103variables or functions). <tt>def</tt> must be a Lua string. It's
104recommended to use the syntactic sugar for string arguments as
105follows:
106</p>
107<pre class="code">
108ffi.cdef[[
109<span style="color:#00a000;font-weight:bold;">typedef struct foo { int a, b; } foo_t; // Declare a struct and typedef.
110int dofoo(foo_t *f, int n); /* Declare an external C function. */</span>
111]]
112</pre>
113<p>
114The contents of the string (the part in green above) must be a
115sequence of
116<a href="ext_ffi_semantics.html#clang">C&nbsp;declarations</a>,
117separated by semicolons. The trailing semicolon for a single
118declaration may be omitted.
119</p>
120<p>
121Please note that external symbols are only <em>declared</em>, but they
122are <em>not bound</em> to any specific address, yet. Binding is
123achieved with C&nbsp;library namespaces (see below).
124</p>
125<p style="color: #c00000;">
126C&nbsp;declarations are not passed through a C&nbsp;pre-processor,
127yet. No pre-processor tokens are allowed, except for
128<tt>#pragma&nbsp;pack</tt>. Replace <tt>#define</tt> in existing
129C&nbsp;header files with <tt>enum</tt>, <tt>static&nbsp;const</tt>
130or <tt>typedef</tt> and/or pass the files through an external
131C&nbsp;pre-processor (once). Be careful not to include unneeded or
132redundant declarations from unrelated header files.
133</p>
134
135<h3 id="ffi_C"><tt>ffi.C</tt></h3>
136<p>
137This is the default C&nbsp;library namespace &mdash; note the
138uppercase <tt>'C'</tt>. It binds to the default set of symbols or
139libraries on the target system. These are more or less the same as a
140C&nbsp;compiler would offer by default, without specifying extra link
141libraries.
142</p>
143<p>
144On POSIX systems, this binds to symbols in the default or global
145namespace. This includes all exported symbols from the executable and
146any libraries loaded into the global namespace. This includes at least
147<tt>libc</tt>, <tt>libm</tt>, <tt>libdl</tt> (on Linux),
148<tt>libgcc</tt> (if compiled with GCC), as well as any exported
149symbols from the Lua/C&nbsp;API provided by LuaJIT itself.
150</p>
151<p>
152On Windows systems, this binds to symbols exported from the
153<tt>*.exe</tt>, the <tt>lua51.dll</tt> (i.e. the Lua/C&nbsp;API
154provided by LuaJIT itself), the C&nbsp;runtime library LuaJIT was linked
155with (<tt>msvcrt*.dll</tt>), <tt>kernel32.dll</tt>,
156<tt>user32.dll</tt> and <tt>gdi32.dll</tt>.
157</p>
158
159<h3 id="ffi_load"><tt>clib = ffi.load(name [,global])</tt></h3>
160<p>
161This loads the dynamic library given by <tt>name</tt> and returns
162a new C&nbsp;library namespace which binds to its symbols. On POSIX
163systems, if <tt>global</tt> is <tt>true</tt>, the library symbols are
164loaded into the global namespace, too.
165</p>
166<p>
167If <tt>name</tt> is a path, the library is loaded from this path.
168Otherwise <tt>name</tt> is canonicalized in a system-dependent way and
169searched in the default search path for dynamic libraries:
170</p>
171<p>
172On POSIX systems, if the name contains no dot, the extension
173<tt>.so</tt> is appended. Also, the <tt>lib</tt> prefix is prepended
174if necessary. So <tt>ffi.load("z")</tt> looks for <tt>"libz.so"</tt>
175in the default shared library search path.
176</p>
177<p>
178On Windows systems, if the name contains no dot, the extension
179<tt>.dll</tt> is appended. So <tt>ffi.load("ws2_32")</tt> looks for
180<tt>"ws2_32.dll"</tt> in the default DLL search path.
181</p>
182
183<h2 id="create">Creating cdata Objects</h2>
184<p>
185The following API functions create cdata objects (<tt>type()</tt>
186returns <tt>"cdata"</tt>). All created cdata objects are
187<a href="ext_ffi_semantics.html#gc">garbage collected</a>.
188</p>
189
190<h3 id="ffi_new"><tt>cdata = ffi.new(ct [,nelem] [,init...])<br>
191cdata = <em>ctype</em>([nelem,] [init...])</tt></h3>
192<p>
193Creates a cdata object for the given <tt>ct</tt>. VLA/VLS types
194require the <tt>nelem</tt> argument. The second syntax uses a ctype as
195a constructor and is otherwise fully equivalent.
196</p>
197<p>
198The <tt>init</tt> arguments provide optional initializers. The created
199cdata object is filled with zero bytes if no initializers are given.
200Scalar types accept a single initializer. Aggregates can either be
201initialized with a flat list of initializers or a single aggregate
202initializer (see the <a href="ext_ffi_semantics.html#convert">C&nbsp;type
203conversion rules</a>). Excess initializers cause an error.
204</p>
205<p>
206If a single initializer is given for an array, it's repeated for all
207remaining elements. This doesn't happen if two or more initializers
208are given &mdash; all uninitialized elements are filled with zero
209bytes. The fields of a <tt>struct</tt> are initialized in the order of
210their declaration. Uninitialized fields are filled with zero bytes.
211Only the first field of <tt>union</tt> can be initialized with a flat
212initializer. Elements or fields which are aggregates themselves are
213initialized with a <em>single</em> <tt>init</tt> argument, but this
214may be an aggregate initializer of course.
215</p>
216<p>
217Performance notice: if you want to create many objects of one kind,
218parse the cdecl only once and get its ctype with
219<tt>ffi.typeof()</tt>. Then use the ctype as a constructor repeatedly.
220</p>
221<p style="font-size: 8pt;">
222Please note that an anonymous <tt>struct</tt> declaration implicitly
223creates a new and distinguished ctype every time you use it for
224<tt>ffi.new()</tt>. This is probably <b>not</b> what you want,
225especially if you create more than one cdata object. Different anonymous
226<tt>structs</tt> are not considered assignment-compatible by the
227C&nbsp;standard, even though they may have the same fields! Also, they
228are considered different types by the JIT-compiler, which may cause an
229excessive number of traces. It's strongly suggested to either declare
230a named <tt>struct</tt> or <tt>typedef</tt> with <tt>ffi.cdef()</tt>
231or to create a single ctype object for an anonymous <tt>struct</tt>
232with <tt>ffi.typeof()</tt>.
233</p>
234
235<h3 id="ffi_typeof"><tt>ctype = ffi.typeof(ct)</tt></h3>
236<p>
237Creates a ctype object for the given <tt>ct</tt>.
238</p>
239<p>
240This function is especially useful to parse a cdecl only once and then
241use the resulting ctype object as a <a href="#ffi_new">constructor</a>.
242</p>
243
244<h3 id="ffi_cast"><tt>cdata = ffi.cast(ct, init)</tt></h3>
245<p>
246Creates a scalar cdata object for the given <tt>ct</tt>. The cdata
247object is initialized with <tt>init</tt> using the "cast" variant of
248the <a href="ext_ffi_semantics.html#convert">C&nbsp;type conversion
249rules</a>.
250</p>
251<p>
252This functions is mainly useful to override the pointer compatibility
253rules or to convert pointers to addresses or vice versa. For maximum
254portability you should convert a pointer to its address as follows:
255</p>
256<pre class="code">
257local addr = tonumber(ffi.cast("intptr_t", ptr))
258</pre>
259
260<h2 id="info">C&nbsp;Type Information</h2>
261<p>
262The following API functions return information about C&nbsp;types.
263They are most useful for inspecting cdata objects.
264</p>
265
266<h3 id="ffi_sizeof"><tt>size = ffi.sizeof(ct [,nelem])</tt></h3>
267<p>
268Returns the size of <tt>ct</tt> in bytes. Returns <tt>nil</tt> if
269the size is not known (e.g. for <tt>"void"</tt> or function types).
270Requires <tt>nelem</tt> for VLA/VLS types, except for cdata objects.
271</p>
272
273<h3 id="ffi_alignof"><tt>align = ffi.alignof(ct)</tt></h3>
274<p>
275Returns the minimum required alignment for <tt>ct</tt> in bytes.
276</p>
277
278<h3 id="ffi_offsetof"><tt>ofs [,bpos,bsize] = ffi.offsetof(ct, field)</tt></h3>
279<p>
280Returns the offset (in bytes) of <tt>field</tt> relative to the start
281of <tt>ct</tt>, which must be a <tt>struct</tt>. Additionally returns
282the position and the field size (in bits) for bit fields.
283</p>
284
285<h2 id="util">Utility Functions</h2>
286
287<h3 id="ffi_string"><tt>str = ffi.string(ptr [,len])</tt></h3>
288<p>
289Creates an interned Lua string from the data pointed to by
290<tt>ptr</tt>.
291</p>
292<p>
293If the optional argument <tt>len</tt> is missing, <tt>ptr</tt> is
294converted to a <tt>"char&nbsp;*"</tt> and the data is assumed to be
295zero-terminated. The length of the string is computed with
296<tt>strlen()</tt>.
297</p>
298<p>
299Otherwise <tt>ptr</tt> is converted to a <tt>"void&nbsp;*"</tt> and
300<tt>len</tt> gives the length of the data. The data may contain
301embedded zeros and need not be byte-oriented (though this may cause
302endianess issues).
303</p>
304<p>
305This function is mainly useful to convert (temporary)
306<tt>"const&nbsp;char&nbsp;*"</tt> pointers returned by
307C&nbsp;functions to Lua strings and store them or pass them to other
308functions expecting a Lua string. The Lua string is an (interned) copy
309of the data and bears no relation to the original data area anymore.
310Lua strings are 8&nbsp;bit clean and may be used to hold arbitrary,
311non-character data.
312</p>
313<p>
314Performance notice: it's faster to pass the length of the string, if
315it's known. E.g. when the length is returned by a C&nbsp;call like
316<tt>sprintf()</tt>.
317</p>
318
319<h3 id="ffi_copy"><tt>ffi.copy(dst, src, len)<br>
320ffi.copy(dst, str)</tt></h3>
321<p>
322Copies the data pointed to by <tt>src</tt> to <tt>dst</tt>.
323<tt>dst</tt> is converted to a <tt>"void&nbsp;*"</tt> and <tt>src</tt>
324is converted to a <tt>"const void&nbsp;*"</tt>.
325</p>
326<p>
327In the first syntax, <tt>len</tt> gives the number of bytes to copy.
328In case <tt>src</tt> is a Lua string, the maximum copy length is the
329number of bytes of the string plus a zero-terminator. Caveat: the
330copied data may not be zero-terminated if <tt>len&nbsp;&le;&nbsp;#src</tt>.
331</p>
332<p>
333In the second syntax, the source of the copy must be a Lua string. All
334bytes of the string plus a zero-terminator are copied to <tt>dst</tt>.
335</p>
336<p>
337Performance notice: <tt>ffi.copy()</tt> may be used as a faster
338(inlineable) replacement for the C&nbsp;library functions
339<tt>memcpy()</tt>, <tt>strcpy()</tt> and <tt>strncpy()</tt>.
340</p>
341
342<h3 id="ffi_fill"><tt>ffi.fill(dst, len [,c])</tt></h3>
343<p>
344Fills the data pointed to by <tt>dst</tt> with <tt>len</tt> constant
345bytes, given by <tt>c</tt>. If <tt>c</tt> is omitted, the data is
346zero-filled.
347</p>
348<p>
349Performance notice: <tt>ffi.fill()</tt> may be used as a faster
350(inlineable) replacement for the C&nbsp;library function
351<tt>memset(dst,&nbsp;c,&nbsp;len)</tt>. Please note the different
352order of arguments!
353</p>
354
355<h2 id="target">Target-specific Information</h2>
356
357<h3 id="ffi_abi"><tt>status = ffi.abi(param)</tt></h3>
358<p>
359Returns <tt>true</tt> if <tt>param</tt> (a Lua string) applies for the
360target ABI (Application Binary Interface). Otherwise returns
361<tt>false</tt>. The following parameters are currently defined:
362</p>
363<table class="abitable">
364<tr class="abihead">
365<td class="abiparam">Parameter</td>
366<td class="abidesc">Description</td>
367</tr>
368<tr class="odd separate">
369<td class="abiparam">32bit</td><td class="abidesc">32 bit architecture</td></tr>
370<tr class="even">
371<td class="abiparam">64bit</td><td class="abidesc">64 bit architecture</td></tr>
372<tr class="odd separate">
373<td class="abiparam">le</td><td class="abidesc">Little-endian architecture</td></tr>
374<tr class="even">
375<td class="abiparam">be</td><td class="abidesc">Big-endian architecture</td></tr>
376<tr class="odd separate">
377<td class="abiparam">fpu</td><td class="abidesc">Target has a hardware FPU</td></tr>
378<tr class="even">
379<td class="abiparam">softfp</td><td class="abidesc">softfp calling conventions</td></tr>
380<tr class="odd">
381<td class="abiparam">hardfp</td><td class="abidesc">hardfp calling conventions</td></tr>
382<tr class="even separate">
383<td class="abiparam">eabi</td><td class="abidesc">EABI variant of the standard ABI</td></tr>
384<tr class="odd">
385<td class="abiparam">win</td><td class="abidesc">Windows variant of the standard ABI</td></tr>
386</table>
387
388<h3 id="ffi_os"><tt>ffi.os</tt></h3>
389<p>
390Contains the target OS name. Same contents as
391<a href="ext_jit.html#jit_os"><tt>jit.os</tt></a>.
392</p>
393
394<h3 id="ffi_arch"><tt>ffi.arch</tt></h3>
395<p>
396Contains the target architecture name. Same contents as
397<a href="ext_jit.html#jit_arch"><tt>jit.arch</tt></a>.
398</p>
399<br class="flush">
400</div>
401<div id="foot">
402<hr class="hide">
403Copyright &copy; 2005-2011 Mike Pall
404<span class="noprint">
405&middot;
406<a href="contact.html">Contact</a>
407</span>
408</div>
409</body>
410</html>
diff --git a/doc/ext_ffi_int64.html b/doc/ext_ffi_int64.html
new file mode 100644
index 00000000..fa155825
--- /dev/null
+++ b/doc/ext_ffi_int64.html
@@ -0,0 +1,73 @@
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2<html>
3<head>
4<title>64 bit Integers</title>
5<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6<meta name="Author" content="Mike Pall">
7<meta name="Copyright" content="Copyright (C) 2005-2011, Mike Pall">
8<meta name="Language" content="en">
9<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
10<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
11</head>
12<body>
13<div id="site">
14<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>
15</div>
16<div id="head">
17<h1>64 bit Integers</h1>
18</div>
19<div id="nav">
20<ul><li>
21<a href="luajit.html">LuaJIT</a>
22<ul><li>
23<a href="install.html">Installation</a>
24</li><li>
25<a href="running.html">Running</a>
26</li></ul>
27</li><li>
28<a href="extensions.html">Extensions</a>
29<ul><li>
30<a href="ext_ffi.html">FFI Library</a>
31<ul><li>
32<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
33</li><li>
34<a href="ext_ffi_api.html">ffi.* API</a>
35</li><li>
36<a class="current" href="ext_ffi_int64.html">64 bit Integers</a>
37</li><li>
38<a href="ext_ffi_semantics.html">FFI Semantics</a>
39</li></ul>
40</li><li>
41<a href="ext_jit.html">jit.* Library</a>
42</li><li>
43<a href="ext_c_api.html">Lua/C API</a>
44</li></ul>
45</li><li>
46<a href="status.html">Status</a>
47<ul><li>
48<a href="changes.html">Changes</a>
49</li></ul>
50</li><li>
51<a href="faq.html">FAQ</a>
52</li><li>
53<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>
54</li><li>
55<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>
56</li></ul>
57</div>
58<div id="main">
59<p>
60TODO
61</p>
62<br class="flush">
63</div>
64<div id="foot">
65<hr class="hide">
66Copyright &copy; 2005-2011 Mike Pall
67<span class="noprint">
68&middot;
69<a href="contact.html">Contact</a>
70</span>
71</div>
72</body>
73</html>
diff --git a/doc/ext_ffi_semantics.html b/doc/ext_ffi_semantics.html
new file mode 100644
index 00000000..598d44c9
--- /dev/null
+++ b/doc/ext_ffi_semantics.html
@@ -0,0 +1,155 @@
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2<html>
3<head>
4<title>FFI Semantics</title>
5<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6<meta name="Author" content="Mike Pall">
7<meta name="Copyright" content="Copyright (C) 2005-2011, Mike Pall">
8<meta name="Language" content="en">
9<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
10<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
11</head>
12<body>
13<div id="site">
14<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>
15</div>
16<div id="head">
17<h1>FFI Semantics</h1>
18</div>
19<div id="nav">
20<ul><li>
21<a href="luajit.html">LuaJIT</a>
22<ul><li>
23<a href="install.html">Installation</a>
24</li><li>
25<a href="running.html">Running</a>
26</li></ul>
27</li><li>
28<a href="extensions.html">Extensions</a>
29<ul><li>
30<a href="ext_ffi.html">FFI Library</a>
31<ul><li>
32<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
33</li><li>
34<a href="ext_ffi_api.html">ffi.* API</a>
35</li><li>
36<a href="ext_ffi_int64.html">64 bit Integers</a>
37</li><li>
38<a class="current" href="ext_ffi_semantics.html">FFI Semantics</a>
39</li></ul>
40</li><li>
41<a href="ext_jit.html">jit.* Library</a>
42</li><li>
43<a href="ext_c_api.html">Lua/C API</a>
44</li></ul>
45</li><li>
46<a href="status.html">Status</a>
47<ul><li>
48<a href="changes.html">Changes</a>
49</li></ul>
50</li><li>
51<a href="faq.html">FAQ</a>
52</li><li>
53<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>
54</li><li>
55<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>
56</li></ul>
57</div>
58<div id="main">
59<p>
60TODO
61</p>
62
63<h2 id="clang">C Language Support</h2>
64<p>
65TODO
66</p>
67
68<h2 id="convert">C Type Conversion Rules</h2>
69<p>
70TODO
71</p>
72
73<h2 id="clib">C Library Namespaces</h2>
74<p>
75A C&nbsp;library namespace is a special kind of object which allows
76access to the symbols contained in libraries. Indexing it with a
77symbol name (a Lua string) automatically binds it to the library.
78</p>
79<p>
80TODO
81</p>
82
83<h2 id="ops">Operations on cdata Objects</h2>
84<p>
85TODO
86</p>
87
88<h2 id="gc">Garbage Collection of cdata Objects</h2>
89<p>
90All explicitly (<tt>ffi.new()</tt> etc.) or implicitly (accessors)
91created cdata objects are garbage collected. You need to ensure to
92retain valid references to cdata objects somewhere on a Lua stack, an
93upvalue or in a Lua table while they are still in use. Once the last
94reference to a cdata object is gone, the garbage collector will
95automatically free the memory used by it (at the end of the next GC
96cycle).
97</p>
98<p>
99Please note that pointers themselves are cdata objects, however they
100are <b>not</b> followed by the garbage collector. So e.g. if you
101assign a cdata array to a pointer, you must keep the cdata object
102holding the array alive as long as the pointer is still in use:
103</p>
104<pre class="code">
105ffi.cdef[[
106typedef struct { int *a; } foo_t;
107]]
108
109local s = ffi.new("foo_t", ffi.new("int[10]")) -- <span style="color:#c00000;">WRONG!</span>
110
111local a = ffi.new("int[10]") -- <span style="color:#00a000;">OK</span>
112local s = ffi.new("foo_t", a)
113-- Now do something with 's', but keep 'a' alive until you're done.
114</pre>
115<p>
116Similar rules apply for Lua strings which are implicitly converted to
117<tt>"const&nbsp;char&nbsp;*"</tt>: the string object itself must be
118referenced somewhere or it'll be garbage collected eventually. The
119pointer will then point to stale data, which may have already beeen
120overwritten. Note that string literals are automatically kept alive as
121long as the function containing it (actually its prototype) is not
122garbage collected.
123</p>
124<p>
125Objects which are passed as an argument to an external C&nbsp;function
126are kept alive until the call returns. So it's generally safe to
127create temporary cdata objects in argument lists. This is a common
128idiom for passing specific C&nbsp;types to vararg functions:
129</p>
130<pre class="code">
131ffi.cdef[[
132int printf(const char *fmt, ...);
133]]
134ffi.C.printf("integer value: %d\n", ffi.new("int", x)) -- <span style="color:#00a000;">OK</span>
135</pre>
136<p>
137Memory areas returned by C functions (e.g. from <tt>malloc()</tt>)
138must be manually managed of course. Pointers to cdata objects are
139indistinguishable from pointers returned by C functions (which is one
140of the reasons why the GC cannot follow them).
141</p>
142
143<h2>TODO</h2>
144<br class="flush">
145</div>
146<div id="foot">
147<hr class="hide">
148Copyright &copy; 2005-2011 Mike Pall
149<span class="noprint">
150&middot;
151<a href="contact.html">Contact</a>
152</span>
153</div>
154</body>
155</html>
diff --git a/doc/ext_ffi_tutorial.html b/doc/ext_ffi_tutorial.html
new file mode 100644
index 00000000..11e83339
--- /dev/null
+++ b/doc/ext_ffi_tutorial.html
@@ -0,0 +1,91 @@
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2<html>
3<head>
4<title>FFI Tutorial</title>
5<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6<meta name="Author" content="Mike Pall">
7<meta name="Copyright" content="Copyright (C) 2005-2011, Mike Pall">
8<meta name="Language" content="en">
9<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
10<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
11</head>
12<body>
13<div id="site">
14<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>
15</div>
16<div id="head">
17<h1>FFI Tutorial</h1>
18</div>
19<div id="nav">
20<ul><li>
21<a href="luajit.html">LuaJIT</a>
22<ul><li>
23<a href="install.html">Installation</a>
24</li><li>
25<a href="running.html">Running</a>
26</li></ul>
27</li><li>
28<a href="extensions.html">Extensions</a>
29<ul><li>
30<a href="ext_ffi.html">FFI Library</a>
31<ul><li>
32<a class="current" href="ext_ffi_tutorial.html">FFI Tutorial</a>
33</li><li>
34<a href="ext_ffi_api.html">ffi.* API</a>
35</li><li>
36<a href="ext_ffi_int64.html">64 bit Integers</a>
37</li><li>
38<a href="ext_ffi_semantics.html">FFI Semantics</a>
39</li></ul>
40</li><li>
41<a href="ext_jit.html">jit.* Library</a>
42</li><li>
43<a href="ext_c_api.html">Lua/C API</a>
44</li></ul>
45</li><li>
46<a href="status.html">Status</a>
47<ul><li>
48<a href="changes.html">Changes</a>
49</li></ul>
50</li><li>
51<a href="faq.html">FAQ</a>
52</li><li>
53<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>
54</li><li>
55<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>
56</li></ul>
57</div>
58<div id="main">
59<p>
60TODO
61</p>
62
63<h2 id="load">Loading the FFI Library</h2>
64<p>
65The FFI library is built into LuaJIT by default, but it's not loaded
66and initialized by default. The suggested way to use the FFI library
67is to add the following to the start of every Lua file that needs one
68of its functions:
69</p>
70<pre class="code">
71local ffi = require("ffi")
72</pre>
73<p>
74Please note this doesn't define an <tt>ffi</tt> variable in the table
75of globals &mdash; you really need to use the local variable. The
76<tt>require</tt> function ensures the library is only loaded once.
77</p>
78
79<h2>TODO</h2>
80<br class="flush">
81</div>
82<div id="foot">
83<hr class="hide">
84Copyright &copy; 2005-2011 Mike Pall
85<span class="noprint">
86&middot;
87<a href="contact.html">Contact</a>
88</span>
89</div>
90</body>
91</html>
diff --git a/doc/ext_jit.html b/doc/ext_jit.html
index e01db331..fc494382 100644
--- a/doc/ext_jit.html
+++ b/doc/ext_jit.html
@@ -27,6 +27,17 @@
27</li><li> 27</li><li>
28<a href="extensions.html">Extensions</a> 28<a href="extensions.html">Extensions</a>
29<ul><li> 29<ul><li>
30<a href="ext_ffi.html">FFI Library</a>
31<ul><li>
32<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
33</li><li>
34<a href="ext_ffi_api.html">ffi.* API</a>
35</li><li>
36<a href="ext_ffi_int64.html">64 bit Integers</a>
37</li><li>
38<a href="ext_ffi_semantics.html">FFI Semantics</a>
39</li></ul>
40</li><li>
30<a class="current" href="ext_jit.html">jit.* Library</a> 41<a class="current" href="ext_jit.html">jit.* Library</a>
31</li><li> 42</li><li>
32<a href="ext_c_api.html">Lua/C API</a> 43<a href="ext_c_api.html">Lua/C API</a>
@@ -46,8 +57,10 @@
46</div> 57</div>
47<div id="main"> 58<div id="main">
48<p> 59<p>
49The functions in this built-in module control the behavior 60The functions in this built-in module control the behavior of the JIT
50of the JIT compiler engine. 61compiler engine. Note that JIT-compilation is fully automatic &mdash;
62you probably won't need to use any of the following functions unless
63you have special needs.
51</p> 64</p>
52 65
53<h3 id="jit_onoff"><tt>jit.on()<br> 66<h3 id="jit_onoff"><tt>jit.on()<br>
diff --git a/doc/extensions.html b/doc/extensions.html
index 5eeecd6f..b9a055c5 100644
--- a/doc/extensions.html
+++ b/doc/extensions.html
@@ -44,6 +44,17 @@ td.excinterop {
44</li><li> 44</li><li>
45<a class="current" href="extensions.html">Extensions</a> 45<a class="current" href="extensions.html">Extensions</a>
46<ul><li> 46<ul><li>
47<a href="ext_ffi.html">FFI Library</a>
48<ul><li>
49<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
50</li><li>
51<a href="ext_ffi_api.html">ffi.* API</a>
52</li><li>
53<a href="ext_ffi_int64.html">64 bit Integers</a>
54</li><li>
55<a href="ext_ffi_semantics.html">FFI Semantics</a>
56</li></ul>
57</li><li>
47<a href="ext_jit.html">jit.* Library</a> 58<a href="ext_jit.html">jit.* Library</a>
48</li><li> 59</li><li>
49<a href="ext_c_api.html">Lua/C API</a> 60<a href="ext_c_api.html">Lua/C API</a>
@@ -114,6 +125,13 @@ This way you can use bit operations from both Lua and LuaJIT on a
114shared installation. 125shared installation.
115</p> 126</p>
116 127
128<h3 id="ffi"><tt>ffi.*</tt> &mdash; FFI library</h3>
129<p>
130The <a href="ext_ffi.html">FFI library</a> allows calling external
131C&nbsp;functions and the use of C&nbsp;data structures from pure Lua
132code.
133</p>
134
117<h3 id="jit"><tt>jit.*</tt> &mdash; JIT compiler control</h3> 135<h3 id="jit"><tt>jit.*</tt> &mdash; JIT compiler control</h3>
118<p> 136<p>
119The functions in this module 137The functions in this module
diff --git a/doc/faq.html b/doc/faq.html
index 4f040c7e..4ec69882 100644
--- a/doc/faq.html
+++ b/doc/faq.html
@@ -30,6 +30,17 @@ dd { margin-left: 1.5em; }
30</li><li> 30</li><li>
31<a href="extensions.html">Extensions</a> 31<a href="extensions.html">Extensions</a>
32<ul><li> 32<ul><li>
33<a href="ext_ffi.html">FFI Library</a>
34<ul><li>
35<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
36</li><li>
37<a href="ext_ffi_api.html">ffi.* API</a>
38</li><li>
39<a href="ext_ffi_int64.html">64 bit Integers</a>
40</li><li>
41<a href="ext_ffi_semantics.html">FFI Semantics</a>
42</li></ul>
43</li><li>
33<a href="ext_jit.html">jit.* Library</a> 44<a href="ext_jit.html">jit.* Library</a>
34</li><li> 45</li><li>
35<a href="ext_c_api.html">Lua/C API</a> 46<a href="ext_c_api.html">Lua/C API</a>
diff --git a/doc/install.html b/doc/install.html
index 31f2b476..73755619 100644
--- a/doc/install.html
+++ b/doc/install.html
@@ -56,6 +56,17 @@ td.compatno {
56</li><li> 56</li><li>
57<a href="extensions.html">Extensions</a> 57<a href="extensions.html">Extensions</a>
58<ul><li> 58<ul><li>
59<a href="ext_ffi.html">FFI Library</a>
60<ul><li>
61<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
62</li><li>
63<a href="ext_ffi_api.html">ffi.* API</a>
64</li><li>
65<a href="ext_ffi_int64.html">64 bit Integers</a>
66</li><li>
67<a href="ext_ffi_semantics.html">FFI Semantics</a>
68</li></ul>
69</li><li>
59<a href="ext_jit.html">jit.* Library</a> 70<a href="ext_jit.html">jit.* Library</a>
60</li><li> 71</li><li>
61<a href="ext_c_api.html">Lua/C API</a> 72<a href="ext_c_api.html">Lua/C API</a>
diff --git a/doc/luajit.html b/doc/luajit.html
index 127538ff..aea5c657 100644
--- a/doc/luajit.html
+++ b/doc/luajit.html
@@ -28,6 +28,17 @@
28</li><li> 28</li><li>
29<a href="extensions.html">Extensions</a> 29<a href="extensions.html">Extensions</a>
30<ul><li> 30<ul><li>
31<a href="ext_ffi.html">FFI Library</a>
32<ul><li>
33<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
34</li><li>
35<a href="ext_ffi_api.html">ffi.* API</a>
36</li><li>
37<a href="ext_ffi_int64.html">64 bit Integers</a>
38</li><li>
39<a href="ext_ffi_semantics.html">FFI Semantics</a>
40</li></ul>
41</li><li>
31<a href="ext_jit.html">jit.* Library</a> 42<a href="ext_jit.html">jit.* Library</a>
32</li><li> 43</li><li>
33<a href="ext_c_api.html">Lua/C API</a> 44<a href="ext_c_api.html">Lua/C API</a>
diff --git a/doc/running.html b/doc/running.html
index 09bcfe7e..cb96eabb 100644
--- a/doc/running.html
+++ b/doc/running.html
@@ -49,6 +49,17 @@ td.param_default {
49</li><li> 49</li><li>
50<a href="extensions.html">Extensions</a> 50<a href="extensions.html">Extensions</a>
51<ul><li> 51<ul><li>
52<a href="ext_ffi.html">FFI Library</a>
53<ul><li>
54<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
55</li><li>
56<a href="ext_ffi_api.html">ffi.* API</a>
57</li><li>
58<a href="ext_ffi_int64.html">64 bit Integers</a>
59</li><li>
60<a href="ext_ffi_semantics.html">FFI Semantics</a>
61</li></ul>
62</li><li>
52<a href="ext_jit.html">jit.* Library</a> 63<a href="ext_jit.html">jit.* Library</a>
53</li><li> 64</li><li>
54<a href="ext_c_api.html">Lua/C API</a> 65<a href="ext_c_api.html">Lua/C API</a>
diff --git a/doc/status.html b/doc/status.html
index c99371eb..5ce3bf4c 100644
--- a/doc/status.html
+++ b/doc/status.html
@@ -30,6 +30,17 @@ ul li { padding-bottom: 0.3em; }
30</li><li> 30</li><li>
31<a href="extensions.html">Extensions</a> 31<a href="extensions.html">Extensions</a>
32<ul><li> 32<ul><li>
33<a href="ext_ffi.html">FFI Library</a>
34<ul><li>
35<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
36</li><li>
37<a href="ext_ffi_api.html">ffi.* API</a>
38</li><li>
39<a href="ext_ffi_int64.html">64 bit Integers</a>
40</li><li>
41<a href="ext_ffi_semantics.html">FFI Semantics</a>
42</li></ul>
43</li><li>
33<a href="ext_jit.html">jit.* Library</a> 44<a href="ext_jit.html">jit.* Library</a>
34</li><li> 45</li><li>
35<a href="ext_c_api.html">Lua/C API</a> 46<a href="ext_c_api.html">Lua/C API</a>
@@ -84,7 +95,7 @@ especially when they contain lengthy debug output or if you require
84confidentiality. 95confidentiality.
85</li> 96</li>
86<li> 97<li>
87The JIT compiler only generates code for CPUs with support for 98The x86 JIT compiler only generates code for CPUs with support for
88<b>SSE2</b> instructions. I.e. you need at least a P4, Core 2/i3/i5/i7, 99<b>SSE2</b> instructions. I.e. you need at least a P4, Core 2/i3/i5/i7,
89Atom or K8/K10 to get the full benefit.<br> 100Atom or K8/K10 to get the full benefit.<br>
90If you run LuaJIT on older CPUs without SSE2 support, the JIT compiler 101If you run LuaJIT on older CPUs without SSE2 support, the JIT compiler
@@ -129,7 +140,7 @@ demonstrable need is shown.
129</ul> 140</ul>
130</li> 141</li>
131<li> 142<li>
132The <b>JIT compiler</b> is not complete (yet) and falls back to the 143The <b>JIT compiler</b> falls back to the
133interpreter in some cases. All of this works transparently, so unless 144interpreter in some cases. All of this works transparently, so unless
134you use <tt>-jv</tt>, you'll probably never notice (the interpreter is 145you use <tt>-jv</tt>, you'll probably never notice (the interpreter is
135<a href="http://luajit.org/performance.html"><span class="ext">&raquo;</span>&nbsp;quite fast</a>, too). Here are the known issues: 146<a href="http://luajit.org/performance.html"><span class="ext">&raquo;</span>&nbsp;quite fast</a>, too). Here are the known issues:
@@ -221,7 +232,7 @@ commented, many basic design decisions are in need of an explanation.
221The rather un-traditional compiler architecture and the many highly 232The rather un-traditional compiler architecture and the many highly
222optimized data structures are a barrier for outside participation in 233optimized data structures are a barrier for outside participation in
223the development. Alas, as I've repeatedly stated, I'm better at 234the development. Alas, as I've repeatedly stated, I'm better at
224writing code than papers and I'm not in need of any academical merits. 235writing code than papers and I'm not in need of any academic merits.
225Someday I will find the time for it. :-) 236Someday I will find the time for it. :-)
226</li> 237</li>
227<li> 238<li>
@@ -232,15 +243,6 @@ price of a major redesign of the compiler. This would also pave the
232way for emitting predicated instructions, which is a prerequisite 243way for emitting predicated instructions, which is a prerequisite
233for efficient <b>vectorization</b>. 244for efficient <b>vectorization</b>.
234</li> 245</li>
235<li>
236Currently Lua is missing a standard library for access to <b>structured
237binary data</b> and <b>arrays/buffers</b> holding low-level data types.
238Allowing calls to arbitrary C functions (<b>FFI</b>) would obviate the
239need to write manual bindings. A variety of Lua extension modules are
240available, with different scope and capabilities. Alas, none of them has been
241designed with a JIT compiler in mind. An FFI for LuaJIT is currently
242in the design phase, but there's no ETA, yet.
243</li>
244</ul> 246</ul>
245<br class="flush"> 247<br class="flush">
246</div> 248</div>