diff options
| author | Mike Pall <mike> | 2010-11-09 18:11:35 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2010-11-09 18:11:35 +0100 |
| commit | b45e3246cee8c92b72622808f03b5cb7d539e244 (patch) | |
| tree | 20ee73228a325afa5a879850556336651c2f7add /doc/extensions.html | |
| parent | ad29c1f39feb55d4d443b9352448a12a1be8ee23 (diff) | |
| download | luajit-b45e3246cee8c92b72622808f03b5cb7d539e244.tar.gz luajit-b45e3246cee8c92b72622808f03b5cb7d539e244.tar.bz2 luajit-b45e3246cee8c92b72622808f03b5cb7d539e244.zip | |
Split up extension/API docs into sub-pages.
Diffstat (limited to 'doc/extensions.html')
| -rw-r--r-- | doc/extensions.html | 303 |
1 files changed, 303 insertions, 0 deletions
diff --git a/doc/extensions.html b/doc/extensions.html new file mode 100644 index 00000000..e302952d --- /dev/null +++ b/doc/extensions.html | |||
| @@ -0,0 +1,303 @@ | |||
| 1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> | ||
| 2 | <html> | ||
| 3 | <head> | ||
| 4 | <title>Extensions</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-2010, 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.exc { | ||
| 13 | line-height: 1.2; | ||
| 14 | } | ||
| 15 | tr.exchead td { | ||
| 16 | font-weight: bold; | ||
| 17 | } | ||
| 18 | td.excplatform { | ||
| 19 | width: 48%; | ||
| 20 | } | ||
| 21 | td.exccompiler { | ||
| 22 | width: 29%; | ||
| 23 | } | ||
| 24 | td.excinterop { | ||
| 25 | width: 23%; | ||
| 26 | } | ||
| 27 | </style> | ||
| 28 | </head> | ||
| 29 | <body> | ||
| 30 | <div id="site"> | ||
| 31 | <a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a> | ||
| 32 | </div> | ||
| 33 | <div id="head"> | ||
| 34 | <h1>Extensions</h1> | ||
| 35 | </div> | ||
| 36 | <div id="nav"> | ||
| 37 | <ul><li> | ||
| 38 | <a href="luajit.html">LuaJIT</a> | ||
| 39 | <ul><li> | ||
| 40 | <a href="install.html">Installation</a> | ||
| 41 | </li><li> | ||
| 42 | <a href="running.html">Running</a> | ||
| 43 | </li></ul> | ||
| 44 | </li><li> | ||
| 45 | <a class="current" href="extensions.html">Extensions</a> | ||
| 46 | <ul><li> | ||
| 47 | <a href="ext_jit.html">jit.* Library</a> | ||
| 48 | </li><li> | ||
| 49 | <a href="ext_c_api.html">Lua/C API</a> | ||
| 50 | </li></ul> | ||
| 51 | </li><li> | ||
| 52 | <a href="status.html">Status</a> | ||
| 53 | <ul><li> | ||
| 54 | <a href="changes.html">Changes</a> | ||
| 55 | </li></ul> | ||
| 56 | </li><li> | ||
| 57 | <a href="faq.html">FAQ</a> | ||
| 58 | </li><li> | ||
| 59 | <a href="http://luajit.org/performance.html">Performance <span class="ext">»</span></a> | ||
| 60 | </li><li> | ||
| 61 | <a href="http://luajit.org/download.html">Download <span class="ext">»</span></a> | ||
| 62 | </li></ul> | ||
| 63 | </div> | ||
| 64 | <div id="main"> | ||
| 65 | <p> | ||
| 66 | LuaJIT is fully upwards-compatible with Lua 5.1. It supports all | ||
| 67 | <a href="http://www.lua.org/manual/5.1/manual.html#5"><span class="ext">»</span> standard Lua | ||
| 68 | library functions</a> and the full set of | ||
| 69 | <a href="http://www.lua.org/manual/5.1/manual.html#3"><span class="ext">»</span> Lua/C API | ||
| 70 | functions</a>. | ||
| 71 | </p> | ||
| 72 | <p> | ||
| 73 | LuaJIT is also fully ABI-compatible to Lua 5.1 at the linker/dynamic | ||
| 74 | loader level. This means you can compile a C module against the | ||
| 75 | standard Lua headers and load the same shared library from either Lua | ||
| 76 | or LuaJIT. | ||
| 77 | </p> | ||
| 78 | <p> | ||
| 79 | LuaJIT extends the standard Lua VM with new functionality and adds | ||
| 80 | several extension modules. Please note that this page is only about | ||
| 81 | <em>functional</em> enhancements and not about performance enhancements, | ||
| 82 | such as the optimized VM, the faster interpreter or the JIT compiler. | ||
| 83 | </p> | ||
| 84 | |||
| 85 | <h2 id="modules">Extensions Modules</h2> | ||
| 86 | <p> | ||
| 87 | LuaJIT comes with several built-in extension modules: | ||
| 88 | </p> | ||
| 89 | |||
| 90 | <h3 id="bit"><tt>bit.*</tt> — Bitwise operations</h3> | ||
| 91 | <p> | ||
| 92 | LuaJIT supports all bitwise operations as defined by | ||
| 93 | <a href="http://bitop.luajit.org"><span class="ext">»</span> Lua BitOp</a>: | ||
| 94 | </p> | ||
| 95 | <pre class="code"> | ||
| 96 | bit.tobit bit.tohex bit.bnot bit.band bit.bor bit.bxor | ||
| 97 | bit.lshift bit.rshift bit.arshift bit.rol bit.ror bit.bswap | ||
| 98 | </pre> | ||
| 99 | <p> | ||
| 100 | This module is a LuaJIT built-in — you don't need to download or | ||
| 101 | install Lua BitOp. The Lua BitOp site has full documentation for all | ||
| 102 | <a href="http://bitop.luajit.org/api.html"><span class="ext">»</span> Lua BitOp API functions</a>. | ||
| 103 | </p> | ||
| 104 | <p> | ||
| 105 | Please make sure to <tt>require</tt> the module before using any of | ||
| 106 | its functions: | ||
| 107 | </p> | ||
| 108 | <pre class="code"> | ||
| 109 | local bit = require("bit") | ||
| 110 | </pre> | ||
| 111 | <p> | ||
| 112 | An already installed Lua BitOp module is ignored by LuaJIT. | ||
| 113 | This way you can use bit operations from both Lua and LuaJIT on a | ||
| 114 | shared installation. | ||
| 115 | </p> | ||
| 116 | |||
| 117 | <h3 id="jit"><tt>jit.*</tt> — JIT compiler control</h3> | ||
| 118 | <p> | ||
| 119 | The functions in this module | ||
| 120 | <a href="ext_jit.html">control the behavior of the JIT compiler engine</a>. | ||
| 121 | </p> | ||
| 122 | |||
| 123 | <h3 id="c_api">C API extensions</h3> | ||
| 124 | <p> | ||
| 125 | LuaJIT adds some | ||
| 126 | <a href="ext_c_api.html">extra functions to the Lua/C API</a>. | ||
| 127 | </p> | ||
| 128 | |||
| 129 | <h2 id="library">Enhanced Standard Library Functions</h2> | ||
| 130 | |||
| 131 | <h3 id="xpcall"><tt>xpcall(f, err [,args...])</tt> passes arguments</h3> | ||
| 132 | <p> | ||
| 133 | Unlike the standard implementation in Lua 5.1, <tt>xpcall()</tt> | ||
| 134 | passes any arguments after the error function to the function | ||
| 135 | which is called in a protected context. | ||
| 136 | </p> | ||
| 137 | |||
| 138 | <h3 id="load"><tt>loadfile()</tt> etc. handle UTF-8 source code</h3> | ||
| 139 | <p> | ||
| 140 | Non-ASCII characters are handled transparently by the Lua source code parser. | ||
| 141 | This allows the use of UTF-8 characters in identifiers and strings. | ||
| 142 | A UTF-8 BOM is skipped at the start of the source code. | ||
| 143 | </p> | ||
| 144 | |||
| 145 | <h3 id="tostring"><tt>tostring()</tt> etc. canonicalize NaN and ±Inf</h3> | ||
| 146 | <p> | ||
| 147 | All number-to-string conversions consistently convert non-finite numbers | ||
| 148 | to the same strings on all platforms. NaN results in <tt>"nan"</tt>, | ||
| 149 | positive infinity results in <tt>"inf"</tt> and negative infinity results | ||
| 150 | in <tt>"-inf"</tt>. | ||
| 151 | </p> | ||
| 152 | |||
| 153 | <h3 id="math_random">Enhanced PRNG for <tt>math.random()</tt></h3> | ||
| 154 | <p> | ||
| 155 | LuaJIT uses a Tausworthe PRNG with period 2^223 to implement | ||
| 156 | <tt>math.random()</tt> and <tt>math.randomseed()</tt>. The quality of | ||
| 157 | the PRNG results is much superior compared to the standard Lua | ||
| 158 | implementation which uses the platform-specific ANSI rand(). | ||
| 159 | </p> | ||
| 160 | <p> | ||
| 161 | The PRNG generates the same sequences from the same seeds on all | ||
| 162 | platforms and makes use of all bits in the seed argument. | ||
| 163 | <tt>math.random()</tt> without arguments generates 52 pseudo-random bits | ||
| 164 | for every call. The result is uniformly distributed between 0 and 1. | ||
| 165 | It's correctly scaled up and rounded for <tt>math.random(n [,m])</tt> to | ||
| 166 | preserve uniformity. | ||
| 167 | </p> | ||
| 168 | |||
| 169 | <h3 id="io"><tt>io.*</tt> functions handle 64 bit file offsets</h3> | ||
| 170 | <p> | ||
| 171 | The file I/O functions in the standard <tt>io.*</tt> library handle | ||
| 172 | 64 bit file offsets. In particular this means it's possible | ||
| 173 | to open files larger than 2 Gigabytes and to reposition or obtain | ||
| 174 | the current file position for offsets beyond 2 GB | ||
| 175 | (<tt>fp:seek()</tt> method). | ||
| 176 | </p> | ||
| 177 | |||
| 178 | <h3 id="debug_meta"><tt>debug.*</tt> functions identify metamethods</h3> | ||
| 179 | <p> | ||
| 180 | <tt>debug.getinfo()</tt> and <tt>lua_getinfo()</tt> also return information | ||
| 181 | about invoked metamethods. The <tt>namewhat</tt> field is set to | ||
| 182 | <tt>"metamethod"</tt> and the <tt>name</tt> field has the name of | ||
| 183 | the corresponding metamethod (e.g. <tt>"__index"</tt>). | ||
| 184 | </p> | ||
| 185 | |||
| 186 | <h2 id="resumable">Fully Resumable VM</h2> | ||
| 187 | <p> | ||
| 188 | The LuaJIT 2.x VM is fully resumable. This means you can yield from a | ||
| 189 | coroutine even across contexts, where this would not possible with | ||
| 190 | the standard Lua 5.1 VM: e.g. you can yield across <tt>pcall()</tt> | ||
| 191 | and <tt>xpcall()</tt>, across iterators and across metamethods. | ||
| 192 | </p> | ||
| 193 | <p> | ||
| 194 | Note however that LuaJIT 2.x doesn't use | ||
| 195 | <a href="http://coco.luajit.org/"><span class="ext">»</span> Coco</a> anymore. This means the | ||
| 196 | overhead for creating coroutines is much smaller and no extra | ||
| 197 | C stacks need to be allocated. OTOH you can no longer yield | ||
| 198 | across arbitrary C functions. Keep this in mind when | ||
| 199 | upgrading from LuaJIT 1.x. | ||
| 200 | </p> | ||
| 201 | |||
| 202 | <h2 id="exceptions">C++ Exception Interoperability</h2> | ||
| 203 | <p> | ||
| 204 | LuaJIT has built-in support for interoperating with C++ exceptions. | ||
| 205 | The available range of features depends on the target platform and | ||
| 206 | the toolchain used to compile LuaJIT: | ||
| 207 | </p> | ||
| 208 | <table class="exc"> | ||
| 209 | <tr class="exchead"> | ||
| 210 | <td class="excplatform">Platform</td> | ||
| 211 | <td class="exccompiler">Compiler</td> | ||
| 212 | <td class="excinterop">Interoperability</td> | ||
| 213 | </tr> | ||
| 214 | <tr class="odd separate"> | ||
| 215 | <td class="excplatform">POSIX/x64, DWARF2 unwinding</td> | ||
| 216 | <td class="exccompiler">GCC 4.3+</td> | ||
| 217 | <td class="excinterop"><b style="color: #00a000;">Full</td> | ||
| 218 | </tr> | ||
| 219 | <tr class="even"> | ||
| 220 | <td class="excplatform">Other platforms, DWARF2 unwinding</td> | ||
| 221 | <td class="exccompiler">GCC</td> | ||
| 222 | <td class="excinterop"><b style="color: #c06000;">Limited</b></td> | ||
| 223 | </tr> | ||
| 224 | <tr class="odd"> | ||
| 225 | <td class="excplatform">Windows/x64</td> | ||
| 226 | <td class="exccompiler">MSVC or WinSDK</td> | ||
| 227 | <td class="excinterop"><b style="color: #00a000;">Full</td> | ||
| 228 | </tr> | ||
| 229 | <tr class="even"> | ||
| 230 | <td class="excplatform">Windows/x86</td> | ||
| 231 | <td class="exccompiler">Any</td> | ||
| 232 | <td class="excinterop"><b style="color: #a00000;">No</b></td> | ||
| 233 | </tr> | ||
| 234 | <tr class="odd"> | ||
| 235 | <td class="excplatform">Other platforms</td> | ||
| 236 | <td class="exccompiler">Other compilers</td> | ||
| 237 | <td class="excinterop"><b style="color: #a00000;">No</b></td> | ||
| 238 | </tr> | ||
| 239 | </table> | ||
| 240 | <p> | ||
| 241 | <b style="color: #00a000;">Full interoperability</b> means: | ||
| 242 | </p> | ||
| 243 | <ul> | ||
| 244 | <li>C++ exceptions can be caught on the Lua side with <tt>pcall()</tt>, | ||
| 245 | <tt>lua_pcall()</tt> etc.</li> | ||
| 246 | <li>C++ exceptions will be converted to the generic Lua error | ||
| 247 | <tt>"C++ exception"</tt>, unless you use the | ||
| 248 | <a href="ext_c_api.html#mode_wrapcfunc">C call wrapper</a> feature.</li> | ||
| 249 | <li>It's safe to throw C++ exceptions across non-protected Lua frames | ||
| 250 | on the C stack. The contents of the C++ exception object | ||
| 251 | pass through unmodified.</li> | ||
| 252 | <li>Lua errors can be caught on the C++ side with <tt>catch(...)</tt>. | ||
| 253 | The corresponding Lua error message can be retrieved from the Lua stack.</li> | ||
| 254 | <li>Throwing Lua errors across C++ frames is safe. C++ destructors | ||
| 255 | will be called.</li> | ||
| 256 | </ul> | ||
| 257 | <p> | ||
| 258 | <b style="color: #c06000;">Limited interoperability</b> means: | ||
| 259 | </p> | ||
| 260 | <ul> | ||
| 261 | <li>C++ exceptions can be caught on the Lua side with <tt>pcall()</tt>, | ||
| 262 | <tt>lua_pcall()</tt> etc.</li> | ||
| 263 | <li>C++ exceptions will be converted to the generic Lua error | ||
| 264 | <tt>"C++ exception"</tt>, unless you use the | ||
| 265 | <a href="ext_c_api.html#mode_wrapcfunc">C call wrapper</a> feature.</li> | ||
| 266 | <li>C++ exceptions will be caught by non-protected Lua frames and | ||
| 267 | are rethrown as a generic Lua error. The C++ exception object will | ||
| 268 | be destroyed.</li> | ||
| 269 | <li>Lua errors <b>cannot</b> be caught on the C++ side.</li> | ||
| 270 | <li>Throwing Lua errors across C++ frames will <b>not</b> call | ||
| 271 | C++ destructors.</li> | ||
| 272 | </ul> | ||
| 273 | |||
| 274 | <p> | ||
| 275 | <b style="color: #a00000;">No interoperability</b> means: | ||
| 276 | </p> | ||
| 277 | <ul> | ||
| 278 | <li>It's <b>not</b> safe to throw C++ exceptions across Lua frames.</li> | ||
| 279 | <li>C++ exceptions <b>cannot</b> be caught on the Lua side.</li> | ||
| 280 | <li>Lua errors <b>cannot</b> be caught on the C++ side.</li> | ||
| 281 | <li>Throwing Lua errors across C++ frames will <b>not</b> call | ||
| 282 | C++ destructors.</li> | ||
| 283 | <li>Additionally, on Windows/x86 with SEH-based C++ exceptions: | ||
| 284 | it's <b>not</b> safe to throw a Lua error across any frames containing | ||
| 285 | a C++ function with any try/catch construct or using variables with | ||
| 286 | (implicit) destructors. This also applies to any functions which may be | ||
| 287 | inlined in such a function. It doesn't matter whether <tt>lua_error()</tt> | ||
| 288 | is called inside or outside of a try/catch or whether any object actually | ||
| 289 | needs to be destroyed: the SEH chain is corrupted and this will eventually | ||
| 290 | lead to the termination of the process.</li> | ||
| 291 | </ul> | ||
| 292 | <br class="flush"> | ||
| 293 | </div> | ||
| 294 | <div id="foot"> | ||
| 295 | <hr class="hide"> | ||
| 296 | Copyright © 2005-2010 Mike Pall | ||
| 297 | <span class="noprint"> | ||
| 298 | · | ||
| 299 | <a href="contact.html">Contact</a> | ||
| 300 | </span> | ||
| 301 | </div> | ||
| 302 | </body> | ||
| 303 | </html> | ||
