diff options
| author | Mike Pall <mike> | 2011-01-20 22:14:17 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-01-20 22:14:17 +0100 |
| commit | e985aeda84d8af63c4bfaa176c3312dfb2f7f230 (patch) | |
| tree | 8a68df0aac6779db0972bb9dc07fbbe0c7629bc7 | |
| parent | 8396c3cdbc26e08fdf9dea204efb641dd6ad1f91 (diff) | |
| download | luajit-e985aeda84d8af63c4bfaa176c3312dfb2f7f230.tar.gz luajit-e985aeda84d8af63c4bfaa176c3312dfb2f7f230.tar.bz2 luajit-e985aeda84d8af63c4bfaa176c3312dfb2f7f230.zip | |
FFI: Add preliminary FFI documentation (still incomplete).
| -rw-r--r-- | doc/bluequad.css | 5 | ||||
| -rw-r--r-- | doc/changes.html | 11 | ||||
| -rw-r--r-- | doc/contact.html | 11 | ||||
| -rw-r--r-- | doc/ext_c_api.html | 11 | ||||
| -rw-r--r-- | doc/ext_ffi.html | 280 | ||||
| -rw-r--r-- | doc/ext_ffi_api.html | 410 | ||||
| -rw-r--r-- | doc/ext_ffi_int64.html | 73 | ||||
| -rw-r--r-- | doc/ext_ffi_semantics.html | 155 | ||||
| -rw-r--r-- | doc/ext_ffi_tutorial.html | 91 | ||||
| -rw-r--r-- | doc/ext_jit.html | 17 | ||||
| -rw-r--r-- | doc/extensions.html | 18 | ||||
| -rw-r--r-- | doc/faq.html | 11 | ||||
| -rw-r--r-- | doc/install.html | 11 | ||||
| -rw-r--r-- | doc/luajit.html | 11 | ||||
| -rw-r--r-- | doc/running.html | 11 | ||||
| -rw-r--r-- | doc/status.html | 26 |
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">»</span></a> | ||
| 54 | </li><li> | ||
| 55 | <a href="http://luajit.org/download.html">Download <span class="ext">»</span></a> | ||
| 56 | </li></ul> | ||
| 57 | </div> | ||
| 58 | <div id="main"> | ||
| 59 | <p> | ||
| 60 | The FFI library allows calling external C functions and the use | ||
| 61 | of C data structures from pure Lua code. | ||
| 62 | </p> | ||
| 63 | <p> | ||
| 64 | The FFI library largely obviates the need to write tedious manual | ||
| 65 | Lua/C bindings in C. It doesn't require learning a separate binding | ||
| 66 | language — it parses plain C declarations, which can be | ||
| 67 | cut-n-pasted from C header files or reference manuals. It's up to | ||
| 68 | the task of binding large libraries without the need for dealing with | ||
| 69 | fragile binding generators. | ||
| 70 | </p> | ||
| 71 | <p> | ||
| 72 | The FFI library is tightly integrated into LuaJIT (it's not available | ||
| 73 | as a separate module). The code generated by the JIT-compiler for | ||
| 74 | accesses to C data structures from Lua code is on par with the | ||
| 75 | code a C compiler would generate. Calls to C functions can | ||
| 76 | be inlined in the JIT-compiled code, unlike calls to functions bound | ||
| 77 | via the classic Lua/C API. | ||
| 78 | </p> | ||
| 79 | <p> | ||
| 80 | This page gives a short introduction to the usage of the FFI library. | ||
| 81 | Please 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> | ||
| 86 | It's really easy to call an external C library function: | ||
| 87 | </p> | ||
| 88 | <pre class="code"> | ||
| 89 | <span style="color:#000080;">local ffi = require("ffi")</span> | ||
| 90 | ffi.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> | ||
| 96 | So, let's pick that apart: the first line (in blue) loads the FFI | ||
| 97 | library. The next one adds a C declaration for the function. The | ||
| 98 | part between the double-brackets (in green) is just standard | ||
| 99 | C syntax. And the last line calls the named C function. Yes, | ||
| 100 | it's that simple! | ||
| 101 | </p> | ||
| 102 | <p style="font-size: 8pt;"> | ||
| 103 | Actually, what goes on behind the scenes is far from simple: the first | ||
| 104 | part of the last line (in orange) makes use of the standard | ||
| 105 | C library namespace <tt>ffi.C</tt>. Indexing this namespace with | ||
| 106 | a symbol name (<tt>"printf"</tt>) automatically binds it to the the | ||
| 107 | standard C library. The result is a special kind of object which, | ||
| 108 | when called, runs the <tt>printf</tt> function. The arguments passed | ||
| 109 | to this function are automatically converted from Lua objects to the | ||
| 110 | corresponding C types. | ||
| 111 | </p> | ||
| 112 | <p> | ||
| 113 | Ok, so maybe the use of <tt>printf()</tt> wasn't such a spectacular | ||
| 114 | example. 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> | ||
| 118 | So here's something to pop up a message box on Windows: | ||
| 119 | </p> | ||
| 120 | <pre class="code"> | ||
| 121 | local ffi = require("ffi") | ||
| 122 | ffi.cdef[[ | ||
| 123 | int MessageBoxA(void *w, const char *txt, const char *cap, int type); | ||
| 124 | ]] | ||
| 125 | ffi.C.MessageBoxA(nil, "Hello world!", "Test", 0) | ||
| 126 | </pre> | ||
| 127 | <p> | ||
| 128 | Bing! Again, that was far too easy, no? | ||
| 129 | </p> | ||
| 130 | <p style="font-size: 8pt;"> | ||
| 131 | Compare this with the effort required to bind that function using the | ||
| 132 | classic Lua/C API: create an extra C file, add a C function | ||
| 133 | that retrieves and checks the argument types passed from Lua and calls | ||
| 134 | the actual C function, add a list of module functions and their | ||
| 135 | names, add a <tt>luaopen_*</tt> function and register all module | ||
| 136 | functions, compile and link it into a shared library (DLL), move it to | ||
| 137 | the proper path, add Lua code that loads the module aaaand ... finally | ||
| 138 | call the binding function. Phew! | ||
| 139 | </p> | ||
| 140 | |||
| 141 | <h2 id="call">Motivating Example: Using C Data Structures</h2> | ||
| 142 | <p> | ||
| 143 | The FFI library allows you to create and access C data | ||
| 144 | structures. Of course the main use for this is for interfacing with | ||
| 145 | C functions. But they can be used stand-alone, too. | ||
| 146 | </p> | ||
| 147 | <p> | ||
| 148 | Lua is built upon high-level data types. They are flexible, extensible | ||
| 149 | and dynamic. That's why we all love Lua so much. Alas, this can be | ||
| 150 | inefficient for certain tasks, where you'd really want a low-level | ||
| 151 | data type. E.g. a large array of a fixed structure needs to be | ||
| 152 | implemented with a big table holding lots of tiny tables. This imposes | ||
| 153 | both a substantial memory overhead as well as a performance overhead. | ||
| 154 | </p> | ||
| 155 | <p> | ||
| 156 | Here's a sketch of a library that operates on color images plus a | ||
| 157 | simple benchmark. First, the plain Lua version: | ||
| 158 | </p> | ||
| 159 | <pre class="code"> | ||
| 160 | local floor = math.floor | ||
| 161 | |||
| 162 | local 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 | ||
| 169 | end | ||
| 170 | |||
| 171 | local 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 | ||
| 176 | end | ||
| 177 | |||
| 178 | local N = 400*400 | ||
| 179 | local img = image_ramp_green(N) | ||
| 180 | for i=1,1000 do | ||
| 181 | image_to_grey(img, N) | ||
| 182 | end | ||
| 183 | </pre> | ||
| 184 | <p> | ||
| 185 | This creates a table with 160.000 pixels, each of which is a table | ||
| 186 | holding four number values in the range of 0-255. First an image with | ||
| 187 | a green ramp is created (1D for simplicity), then the image is | ||
| 188 | converted to greyscale 1000 times. Yes, that's silly, but I was in | ||
| 189 | need of a simple example ... | ||
| 190 | </p> | ||
| 191 | <p> | ||
| 192 | And here's the FFI version. The modified parts have been marked in | ||
| 193 | bold: | ||
| 194 | </p> | ||
| 195 | <pre class="code"> | ||
| 196 | <b>local ffi = require("ffi") | ||
| 197 | ffi.cdef[[ | ||
| 198 | typedef struct { uint8_t red, green, blue, alpha; } rgba_pixel; | ||
| 199 | ]]</b> | ||
| 200 | |||
| 201 | local 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 | ||
| 209 | end | ||
| 210 | |||
| 211 | local 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 | ||
| 216 | end | ||
| 217 | |||
| 218 | local N = 400*400 | ||
| 219 | local img = image_ramp_green(N) | ||
| 220 | for i=1,1000 do | ||
| 221 | image_to_grey(img, N) | ||
| 222 | end | ||
| 223 | </pre> | ||
| 224 | <p> | ||
| 225 | Ok, so that wasn't too difficult: first, load the FFI library and | ||
| 226 | declare the low-level data type. Here we choose a <tt>struct</tt> | ||
| 227 | which holds four byte fields, one for each component of a 4x8 bit | ||
| 228 | RGBA pixel. | ||
| 229 | </p> | ||
| 230 | <p> | ||
| 231 | Creating the data structure with <tt>ffi.new()</tt> is straightforward | ||
| 232 | — the <tt>'?'</tt> is a placeholder for the number of elements | ||
| 233 | of a variable-length array. C arrays are zero-based, so the | ||
| 234 | indexes have to run from <tt>0</tt> to <tt>n-1</tt> (one might | ||
| 235 | allocate one more element instead to simplify converting legacy | ||
| 236 | code). Since <tt>ffi.new()</tt> zero-fills the array by default, we | ||
| 237 | only need to set the green and the alpha fields. | ||
| 238 | </p> | ||
| 239 | <p> | ||
| 240 | The calls to <tt>math.floor()</tt> can be omitted here, because | ||
| 241 | floating-point numbers are already truncated towards zero when | ||
| 242 | converting them to an integer. This happens implicitly when the number | ||
| 243 | is stored in the fields of each pixel. | ||
| 244 | </p> | ||
| 245 | <p> | ||
| 246 | Now let's have a look at the impact of the changes: first, memory | ||
| 247 | consumption for the image is down from 22 Megabytes to | ||
| 248 | 640 Kilobytes (400*400*4 bytes). That's a factor of 35x less! So, | ||
| 249 | yes, tables do have a noticeable overhead. BTW: The original program | ||
| 250 | would consume 40 Megabytes in plain Lua (on x64). | ||
| 251 | </p> | ||
| 252 | <p> | ||
| 253 | Next, performance: the pure Lua version runs in 9.57 seconds (52.9 | ||
| 254 | seconds with the Lua interpreter) and the FFI version runs in 0.48 | ||
| 255 | seconds on my machine (YMMV). That's a factor of 20x faster (110x | ||
| 256 | faster than with plain Lua). | ||
| 257 | </p> | ||
| 258 | <p style="font-size: 8pt;"> | ||
| 259 | The avid reader may notice that converting the pure Lua version over | ||
| 260 | to 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 | ||
| 262 | be 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 | ||
| 264 | error-prone. And it still doesn't get even close to the performance of | ||
| 265 | the FFI version of the code. Also, high-level data structures cannot | ||
| 266 | be easily passed to other C functions, especially I/O functions, | ||
| 267 | without undue conversion penalties. | ||
| 268 | </p> | ||
| 269 | <br class="flush"> | ||
| 270 | </div> | ||
| 271 | <div id="foot"> | ||
| 272 | <hr class="hide"> | ||
| 273 | Copyright © 2005-2011 Mike Pall | ||
| 274 | <span class="noprint"> | ||
| 275 | · | ||
| 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"> | ||
| 12 | table.abitable { width: 30em; line-height: 1.2; } | ||
| 13 | tr.abihead td { font-weight: bold; } | ||
| 14 | td.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">»</span></a> | ||
| 59 | </li><li> | ||
| 60 | <a href="http://luajit.org/download.html">Download <span class="ext">»</span></a> | ||
| 61 | </li></ul> | ||
| 62 | </div> | ||
| 63 | <div id="main"> | ||
| 64 | <p> | ||
| 65 | This page describes the API functions provided by the FFI library in | ||
| 66 | detail. 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> — An abstract C type declaration (a Lua | ||
| 74 | string).</li> | ||
| 75 | <li><b>ctype</b> — A C 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> — A C data object. It holds a value of the | ||
| 79 | corresponding <b>ctype</b>.</li> | ||
| 80 | <li><b>ct</b> — A C type specification which can be used for | ||
| 81 | most 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> — A variable-length array is declared with a | ||
| 84 | <tt>?</tt> instead of the number of elements, e.g. <tt>"int[?]"</tt>. | ||
| 85 | The 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> — A variable-length struct is a <tt>struct</tt> C | ||
| 88 | type where the last element is a <b>VLA</b>. The same rules for | ||
| 89 | declaration and creation apply.</li> | ||
| 90 | </ul> | ||
| 91 | |||
| 92 | <h2 id="decl">Declaring and Accessing External Symbols</h2> | ||
| 93 | <p> | ||
| 94 | External symbols must be declared first and can then be accessed by | ||
| 95 | indexing a <a href="ext_ffi_semantics.html#clib">C library | ||
| 96 | namespace</a>, which automatically binds the symbol to a specific | ||
| 97 | library. | ||
| 98 | </p> | ||
| 99 | |||
| 100 | <h3 id="ffi_cdef"><tt>ffi.cdef(def)</tt></h3> | ||
| 101 | <p> | ||
| 102 | Adds multiple C declarations for types or external symbols (named | ||
| 103 | variables or functions). <tt>def</tt> must be a Lua string. It's | ||
| 104 | recommended to use the syntactic sugar for string arguments as | ||
| 105 | follows: | ||
| 106 | </p> | ||
| 107 | <pre class="code"> | ||
| 108 | ffi.cdef[[ | ||
| 109 | <span style="color:#00a000;font-weight:bold;">typedef struct foo { int a, b; } foo_t; // Declare a struct and typedef. | ||
| 110 | int dofoo(foo_t *f, int n); /* Declare an external C function. */</span> | ||
| 111 | ]] | ||
| 112 | </pre> | ||
| 113 | <p> | ||
| 114 | The contents of the string (the part in green above) must be a | ||
| 115 | sequence of | ||
| 116 | <a href="ext_ffi_semantics.html#clang">C declarations</a>, | ||
| 117 | separated by semicolons. The trailing semicolon for a single | ||
| 118 | declaration may be omitted. | ||
| 119 | </p> | ||
| 120 | <p> | ||
| 121 | Please note that external symbols are only <em>declared</em>, but they | ||
| 122 | are <em>not bound</em> to any specific address, yet. Binding is | ||
| 123 | achieved with C library namespaces (see below). | ||
| 124 | </p> | ||
| 125 | <p style="color: #c00000;"> | ||
| 126 | C declarations are not passed through a C pre-processor, | ||
| 127 | yet. No pre-processor tokens are allowed, except for | ||
| 128 | <tt>#pragma pack</tt>. Replace <tt>#define</tt> in existing | ||
| 129 | C header files with <tt>enum</tt>, <tt>static const</tt> | ||
| 130 | or <tt>typedef</tt> and/or pass the files through an external | ||
| 131 | C pre-processor (once). Be careful not to include unneeded or | ||
| 132 | redundant declarations from unrelated header files. | ||
| 133 | </p> | ||
| 134 | |||
| 135 | <h3 id="ffi_C"><tt>ffi.C</tt></h3> | ||
| 136 | <p> | ||
| 137 | This is the default C library namespace — note the | ||
| 138 | uppercase <tt>'C'</tt>. It binds to the default set of symbols or | ||
| 139 | libraries on the target system. These are more or less the same as a | ||
| 140 | C compiler would offer by default, without specifying extra link | ||
| 141 | libraries. | ||
| 142 | </p> | ||
| 143 | <p> | ||
| 144 | On POSIX systems, this binds to symbols in the default or global | ||
| 145 | namespace. This includes all exported symbols from the executable and | ||
| 146 | any 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 | ||
| 149 | symbols from the Lua/C API provided by LuaJIT itself. | ||
| 150 | </p> | ||
| 151 | <p> | ||
| 152 | On Windows systems, this binds to symbols exported from the | ||
| 153 | <tt>*.exe</tt>, the <tt>lua51.dll</tt> (i.e. the Lua/C API | ||
| 154 | provided by LuaJIT itself), the C runtime library LuaJIT was linked | ||
| 155 | with (<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> | ||
| 161 | This loads the dynamic library given by <tt>name</tt> and returns | ||
| 162 | a new C library namespace which binds to its symbols. On POSIX | ||
| 163 | systems, if <tt>global</tt> is <tt>true</tt>, the library symbols are | ||
| 164 | loaded into the global namespace, too. | ||
| 165 | </p> | ||
| 166 | <p> | ||
| 167 | If <tt>name</tt> is a path, the library is loaded from this path. | ||
| 168 | Otherwise <tt>name</tt> is canonicalized in a system-dependent way and | ||
| 169 | searched in the default search path for dynamic libraries: | ||
| 170 | </p> | ||
| 171 | <p> | ||
| 172 | On POSIX systems, if the name contains no dot, the extension | ||
| 173 | <tt>.so</tt> is appended. Also, the <tt>lib</tt> prefix is prepended | ||
| 174 | if necessary. So <tt>ffi.load("z")</tt> looks for <tt>"libz.so"</tt> | ||
| 175 | in the default shared library search path. | ||
| 176 | </p> | ||
| 177 | <p> | ||
| 178 | On 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> | ||
| 185 | The following API functions create cdata objects (<tt>type()</tt> | ||
| 186 | returns <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> | ||
| 191 | cdata = <em>ctype</em>([nelem,] [init...])</tt></h3> | ||
| 192 | <p> | ||
| 193 | Creates a cdata object for the given <tt>ct</tt>. VLA/VLS types | ||
| 194 | require the <tt>nelem</tt> argument. The second syntax uses a ctype as | ||
| 195 | a constructor and is otherwise fully equivalent. | ||
| 196 | </p> | ||
| 197 | <p> | ||
| 198 | The <tt>init</tt> arguments provide optional initializers. The created | ||
| 199 | cdata object is filled with zero bytes if no initializers are given. | ||
| 200 | Scalar types accept a single initializer. Aggregates can either be | ||
| 201 | initialized with a flat list of initializers or a single aggregate | ||
| 202 | initializer (see the <a href="ext_ffi_semantics.html#convert">C type | ||
| 203 | conversion rules</a>). Excess initializers cause an error. | ||
| 204 | </p> | ||
| 205 | <p> | ||
| 206 | If a single initializer is given for an array, it's repeated for all | ||
| 207 | remaining elements. This doesn't happen if two or more initializers | ||
| 208 | are given — all uninitialized elements are filled with zero | ||
| 209 | bytes. The fields of a <tt>struct</tt> are initialized in the order of | ||
| 210 | their declaration. Uninitialized fields are filled with zero bytes. | ||
| 211 | Only the first field of <tt>union</tt> can be initialized with a flat | ||
| 212 | initializer. Elements or fields which are aggregates themselves are | ||
| 213 | initialized with a <em>single</em> <tt>init</tt> argument, but this | ||
| 214 | may be an aggregate initializer of course. | ||
| 215 | </p> | ||
| 216 | <p> | ||
| 217 | Performance notice: if you want to create many objects of one kind, | ||
| 218 | parse 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;"> | ||
| 222 | Please note that an anonymous <tt>struct</tt> declaration implicitly | ||
| 223 | creates 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, | ||
| 225 | especially if you create more than one cdata object. Different anonymous | ||
| 226 | <tt>structs</tt> are not considered assignment-compatible by the | ||
| 227 | C standard, even though they may have the same fields! Also, they | ||
| 228 | are considered different types by the JIT-compiler, which may cause an | ||
| 229 | excessive number of traces. It's strongly suggested to either declare | ||
| 230 | a named <tt>struct</tt> or <tt>typedef</tt> with <tt>ffi.cdef()</tt> | ||
| 231 | or to create a single ctype object for an anonymous <tt>struct</tt> | ||
| 232 | with <tt>ffi.typeof()</tt>. | ||
| 233 | </p> | ||
| 234 | |||
| 235 | <h3 id="ffi_typeof"><tt>ctype = ffi.typeof(ct)</tt></h3> | ||
| 236 | <p> | ||
| 237 | Creates a ctype object for the given <tt>ct</tt>. | ||
| 238 | </p> | ||
| 239 | <p> | ||
| 240 | This function is especially useful to parse a cdecl only once and then | ||
| 241 | use 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> | ||
| 246 | Creates a scalar cdata object for the given <tt>ct</tt>. The cdata | ||
| 247 | object is initialized with <tt>init</tt> using the "cast" variant of | ||
| 248 | the <a href="ext_ffi_semantics.html#convert">C type conversion | ||
| 249 | rules</a>. | ||
| 250 | </p> | ||
| 251 | <p> | ||
| 252 | This functions is mainly useful to override the pointer compatibility | ||
| 253 | rules or to convert pointers to addresses or vice versa. For maximum | ||
| 254 | portability you should convert a pointer to its address as follows: | ||
| 255 | </p> | ||
| 256 | <pre class="code"> | ||
| 257 | local addr = tonumber(ffi.cast("intptr_t", ptr)) | ||
| 258 | </pre> | ||
| 259 | |||
| 260 | <h2 id="info">C Type Information</h2> | ||
| 261 | <p> | ||
| 262 | The following API functions return information about C types. | ||
| 263 | They 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> | ||
| 268 | Returns the size of <tt>ct</tt> in bytes. Returns <tt>nil</tt> if | ||
| 269 | the size is not known (e.g. for <tt>"void"</tt> or function types). | ||
| 270 | Requires <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> | ||
| 275 | Returns 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> | ||
| 280 | Returns the offset (in bytes) of <tt>field</tt> relative to the start | ||
| 281 | of <tt>ct</tt>, which must be a <tt>struct</tt>. Additionally returns | ||
| 282 | the 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> | ||
| 289 | Creates an interned Lua string from the data pointed to by | ||
| 290 | <tt>ptr</tt>. | ||
| 291 | </p> | ||
| 292 | <p> | ||
| 293 | If the optional argument <tt>len</tt> is missing, <tt>ptr</tt> is | ||
| 294 | converted to a <tt>"char *"</tt> and the data is assumed to be | ||
| 295 | zero-terminated. The length of the string is computed with | ||
| 296 | <tt>strlen()</tt>. | ||
| 297 | </p> | ||
| 298 | <p> | ||
| 299 | Otherwise <tt>ptr</tt> is converted to a <tt>"void *"</tt> and | ||
| 300 | <tt>len</tt> gives the length of the data. The data may contain | ||
| 301 | embedded zeros and need not be byte-oriented (though this may cause | ||
| 302 | endianess issues). | ||
| 303 | </p> | ||
| 304 | <p> | ||
| 305 | This function is mainly useful to convert (temporary) | ||
| 306 | <tt>"const char *"</tt> pointers returned by | ||
| 307 | C functions to Lua strings and store them or pass them to other | ||
| 308 | functions expecting a Lua string. The Lua string is an (interned) copy | ||
| 309 | of the data and bears no relation to the original data area anymore. | ||
| 310 | Lua strings are 8 bit clean and may be used to hold arbitrary, | ||
| 311 | non-character data. | ||
| 312 | </p> | ||
| 313 | <p> | ||
| 314 | Performance notice: it's faster to pass the length of the string, if | ||
| 315 | it's known. E.g. when the length is returned by a C call like | ||
| 316 | <tt>sprintf()</tt>. | ||
| 317 | </p> | ||
| 318 | |||
| 319 | <h3 id="ffi_copy"><tt>ffi.copy(dst, src, len)<br> | ||
| 320 | ffi.copy(dst, str)</tt></h3> | ||
| 321 | <p> | ||
| 322 | Copies the data pointed to by <tt>src</tt> to <tt>dst</tt>. | ||
| 323 | <tt>dst</tt> is converted to a <tt>"void *"</tt> and <tt>src</tt> | ||
| 324 | is converted to a <tt>"const void *"</tt>. | ||
| 325 | </p> | ||
| 326 | <p> | ||
| 327 | In the first syntax, <tt>len</tt> gives the number of bytes to copy. | ||
| 328 | In case <tt>src</tt> is a Lua string, the maximum copy length is the | ||
| 329 | number of bytes of the string plus a zero-terminator. Caveat: the | ||
| 330 | copied data may not be zero-terminated if <tt>len ≤ #src</tt>. | ||
| 331 | </p> | ||
| 332 | <p> | ||
| 333 | In the second syntax, the source of the copy must be a Lua string. All | ||
| 334 | bytes of the string plus a zero-terminator are copied to <tt>dst</tt>. | ||
| 335 | </p> | ||
| 336 | <p> | ||
| 337 | Performance notice: <tt>ffi.copy()</tt> may be used as a faster | ||
| 338 | (inlineable) replacement for the C 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> | ||
| 344 | Fills the data pointed to by <tt>dst</tt> with <tt>len</tt> constant | ||
| 345 | bytes, given by <tt>c</tt>. If <tt>c</tt> is omitted, the data is | ||
| 346 | zero-filled. | ||
| 347 | </p> | ||
| 348 | <p> | ||
| 349 | Performance notice: <tt>ffi.fill()</tt> may be used as a faster | ||
| 350 | (inlineable) replacement for the C library function | ||
| 351 | <tt>memset(dst, c, len)</tt>. Please note the different | ||
| 352 | order 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> | ||
| 359 | Returns <tt>true</tt> if <tt>param</tt> (a Lua string) applies for the | ||
| 360 | target 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> | ||
| 390 | Contains 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> | ||
| 396 | Contains 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"> | ||
| 403 | Copyright © 2005-2011 Mike Pall | ||
| 404 | <span class="noprint"> | ||
| 405 | · | ||
| 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">»</span></a> | ||
| 54 | </li><li> | ||
| 55 | <a href="http://luajit.org/download.html">Download <span class="ext">»</span></a> | ||
| 56 | </li></ul> | ||
| 57 | </div> | ||
| 58 | <div id="main"> | ||
| 59 | <p> | ||
| 60 | TODO | ||
| 61 | </p> | ||
| 62 | <br class="flush"> | ||
| 63 | </div> | ||
| 64 | <div id="foot"> | ||
| 65 | <hr class="hide"> | ||
| 66 | Copyright © 2005-2011 Mike Pall | ||
| 67 | <span class="noprint"> | ||
| 68 | · | ||
| 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">»</span></a> | ||
| 54 | </li><li> | ||
| 55 | <a href="http://luajit.org/download.html">Download <span class="ext">»</span></a> | ||
| 56 | </li></ul> | ||
| 57 | </div> | ||
| 58 | <div id="main"> | ||
| 59 | <p> | ||
| 60 | TODO | ||
| 61 | </p> | ||
| 62 | |||
| 63 | <h2 id="clang">C Language Support</h2> | ||
| 64 | <p> | ||
| 65 | TODO | ||
| 66 | </p> | ||
| 67 | |||
| 68 | <h2 id="convert">C Type Conversion Rules</h2> | ||
| 69 | <p> | ||
| 70 | TODO | ||
| 71 | </p> | ||
| 72 | |||
| 73 | <h2 id="clib">C Library Namespaces</h2> | ||
| 74 | <p> | ||
| 75 | A C library namespace is a special kind of object which allows | ||
| 76 | access to the symbols contained in libraries. Indexing it with a | ||
| 77 | symbol name (a Lua string) automatically binds it to the library. | ||
| 78 | </p> | ||
| 79 | <p> | ||
| 80 | TODO | ||
| 81 | </p> | ||
| 82 | |||
| 83 | <h2 id="ops">Operations on cdata Objects</h2> | ||
| 84 | <p> | ||
| 85 | TODO | ||
| 86 | </p> | ||
| 87 | |||
| 88 | <h2 id="gc">Garbage Collection of cdata Objects</h2> | ||
| 89 | <p> | ||
| 90 | All explicitly (<tt>ffi.new()</tt> etc.) or implicitly (accessors) | ||
| 91 | created cdata objects are garbage collected. You need to ensure to | ||
| 92 | retain valid references to cdata objects somewhere on a Lua stack, an | ||
| 93 | upvalue or in a Lua table while they are still in use. Once the last | ||
| 94 | reference to a cdata object is gone, the garbage collector will | ||
| 95 | automatically free the memory used by it (at the end of the next GC | ||
| 96 | cycle). | ||
| 97 | </p> | ||
| 98 | <p> | ||
| 99 | Please note that pointers themselves are cdata objects, however they | ||
| 100 | are <b>not</b> followed by the garbage collector. So e.g. if you | ||
| 101 | assign a cdata array to a pointer, you must keep the cdata object | ||
| 102 | holding the array alive as long as the pointer is still in use: | ||
| 103 | </p> | ||
| 104 | <pre class="code"> | ||
| 105 | ffi.cdef[[ | ||
| 106 | typedef struct { int *a; } foo_t; | ||
| 107 | ]] | ||
| 108 | |||
| 109 | local s = ffi.new("foo_t", ffi.new("int[10]")) -- <span style="color:#c00000;">WRONG!</span> | ||
| 110 | |||
| 111 | local a = ffi.new("int[10]") -- <span style="color:#00a000;">OK</span> | ||
| 112 | local s = ffi.new("foo_t", a) | ||
| 113 | -- Now do something with 's', but keep 'a' alive until you're done. | ||
| 114 | </pre> | ||
| 115 | <p> | ||
| 116 | Similar rules apply for Lua strings which are implicitly converted to | ||
| 117 | <tt>"const char *"</tt>: the string object itself must be | ||
| 118 | referenced somewhere or it'll be garbage collected eventually. The | ||
| 119 | pointer will then point to stale data, which may have already beeen | ||
| 120 | overwritten. Note that string literals are automatically kept alive as | ||
| 121 | long as the function containing it (actually its prototype) is not | ||
| 122 | garbage collected. | ||
| 123 | </p> | ||
| 124 | <p> | ||
| 125 | Objects which are passed as an argument to an external C function | ||
| 126 | are kept alive until the call returns. So it's generally safe to | ||
| 127 | create temporary cdata objects in argument lists. This is a common | ||
| 128 | idiom for passing specific C types to vararg functions: | ||
| 129 | </p> | ||
| 130 | <pre class="code"> | ||
| 131 | ffi.cdef[[ | ||
| 132 | int printf(const char *fmt, ...); | ||
| 133 | ]] | ||
| 134 | ffi.C.printf("integer value: %d\n", ffi.new("int", x)) -- <span style="color:#00a000;">OK</span> | ||
| 135 | </pre> | ||
| 136 | <p> | ||
| 137 | Memory areas returned by C functions (e.g. from <tt>malloc()</tt>) | ||
| 138 | must be manually managed of course. Pointers to cdata objects are | ||
| 139 | indistinguishable from pointers returned by C functions (which is one | ||
| 140 | of 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"> | ||
| 148 | Copyright © 2005-2011 Mike Pall | ||
| 149 | <span class="noprint"> | ||
| 150 | · | ||
| 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">»</span></a> | ||
| 54 | </li><li> | ||
| 55 | <a href="http://luajit.org/download.html">Download <span class="ext">»</span></a> | ||
| 56 | </li></ul> | ||
| 57 | </div> | ||
| 58 | <div id="main"> | ||
| 59 | <p> | ||
| 60 | TODO | ||
| 61 | </p> | ||
| 62 | |||
| 63 | <h2 id="load">Loading the FFI Library</h2> | ||
| 64 | <p> | ||
| 65 | The FFI library is built into LuaJIT by default, but it's not loaded | ||
| 66 | and initialized by default. The suggested way to use the FFI library | ||
| 67 | is to add the following to the start of every Lua file that needs one | ||
| 68 | of its functions: | ||
| 69 | </p> | ||
| 70 | <pre class="code"> | ||
| 71 | local ffi = require("ffi") | ||
| 72 | </pre> | ||
| 73 | <p> | ||
| 74 | Please note this doesn't define an <tt>ffi</tt> variable in the table | ||
| 75 | of globals — 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"> | ||
| 84 | Copyright © 2005-2011 Mike Pall | ||
| 85 | <span class="noprint"> | ||
| 86 | · | ||
| 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> |
| 49 | The functions in this built-in module control the behavior | 60 | The functions in this built-in module control the behavior of the JIT |
| 50 | of the JIT compiler engine. | 61 | compiler engine. Note that JIT-compilation is fully automatic — |
| 62 | you probably won't need to use any of the following functions unless | ||
| 63 | you 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 | |||
| 114 | shared installation. | 125 | shared installation. |
| 115 | </p> | 126 | </p> |
| 116 | 127 | ||
| 128 | <h3 id="ffi"><tt>ffi.*</tt> — FFI library</h3> | ||
| 129 | <p> | ||
| 130 | The <a href="ext_ffi.html">FFI library</a> allows calling external | ||
| 131 | C functions and the use of C data structures from pure Lua | ||
| 132 | code. | ||
| 133 | </p> | ||
| 134 | |||
| 117 | <h3 id="jit"><tt>jit.*</tt> — JIT compiler control</h3> | 135 | <h3 id="jit"><tt>jit.*</tt> — JIT compiler control</h3> |
| 118 | <p> | 136 | <p> |
| 119 | The functions in this module | 137 | The 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 | |||
| 84 | confidentiality. | 95 | confidentiality. |
| 85 | </li> | 96 | </li> |
| 86 | <li> | 97 | <li> |
| 87 | The JIT compiler only generates code for CPUs with support for | 98 | The 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, |
| 89 | Atom or K8/K10 to get the full benefit.<br> | 100 | Atom or K8/K10 to get the full benefit.<br> |
| 90 | If you run LuaJIT on older CPUs without SSE2 support, the JIT compiler | 101 | If 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> |
| 132 | The <b>JIT compiler</b> is not complete (yet) and falls back to the | 143 | The <b>JIT compiler</b> falls back to the |
| 133 | interpreter in some cases. All of this works transparently, so unless | 144 | interpreter in some cases. All of this works transparently, so unless |
| 134 | you use <tt>-jv</tt>, you'll probably never notice (the interpreter is | 145 | you use <tt>-jv</tt>, you'll probably never notice (the interpreter is |
| 135 | <a href="http://luajit.org/performance.html"><span class="ext">»</span> quite fast</a>, too). Here are the known issues: | 146 | <a href="http://luajit.org/performance.html"><span class="ext">»</span> quite fast</a>, too). Here are the known issues: |
| @@ -221,7 +232,7 @@ commented, many basic design decisions are in need of an explanation. | |||
| 221 | The rather un-traditional compiler architecture and the many highly | 232 | The rather un-traditional compiler architecture and the many highly |
| 222 | optimized data structures are a barrier for outside participation in | 233 | optimized data structures are a barrier for outside participation in |
| 223 | the development. Alas, as I've repeatedly stated, I'm better at | 234 | the development. Alas, as I've repeatedly stated, I'm better at |
| 224 | writing code than papers and I'm not in need of any academical merits. | 235 | writing code than papers and I'm not in need of any academic merits. |
| 225 | Someday I will find the time for it. :-) | 236 | Someday 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 | |||
| 232 | way for emitting predicated instructions, which is a prerequisite | 243 | way for emitting predicated instructions, which is a prerequisite |
| 233 | for efficient <b>vectorization</b>. | 244 | for efficient <b>vectorization</b>. |
| 234 | </li> | 245 | </li> |
| 235 | <li> | ||
| 236 | Currently Lua is missing a standard library for access to <b>structured | ||
| 237 | binary data</b> and <b>arrays/buffers</b> holding low-level data types. | ||
| 238 | Allowing calls to arbitrary C functions (<b>FFI</b>) would obviate the | ||
| 239 | need to write manual bindings. A variety of Lua extension modules are | ||
| 240 | available, with different scope and capabilities. Alas, none of them has been | ||
| 241 | designed with a JIT compiler in mind. An FFI for LuaJIT is currently | ||
| 242 | in 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> |
