1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
|
=pod
LuaJIT
=head1 Extensions
=over
=item * LuaJIT
=over
=item * Download E<rchevron>
=item * Installation
=item * Running
=back
=item * Extensions
=over
=item * FFI Library
=over
=item * FFI Tutorial
=item * ffi.* API
=item * FFI Semantics
=back
=item * jit.* Library
=item * Lua/C API
=item * Profiler
=back
=item * Status
=over
=item * Changes
=back
=item * FAQ
=item * Performance E<rchevron>
=item * Wiki E<rchevron>
=item * Mailing List E<rchevron>
=back
LuaJIT is fully upwards-compatible with Lua 5.1. It supports all
E<rchevron> standard Lua library functions and the full set of
E<rchevron> Lua/C API functions.
LuaJIT is also fully ABI-compatible to Lua 5.1 at the linker/dynamic
loader level. This means you can compile a C module against the
standard Lua headers and load the same shared library from either Lua
or LuaJIT.
LuaJIT extends the standard Lua VM with new functionality and adds
several extension modules. Please note this page is only about
I<functional> enhancements and not about performance enhancements, such
as the optimized VM, the faster interpreter or the JIT compiler.
=head2 Extensions Modules
LuaJIT comes with several built-in extension modules:
=head2 C<bit.*> E<mdash> Bitwise operations
LuaJIT supports all bitwise operations as defined by E<rchevron> Lua
BitOp:
bit.tobit bit.tohex bit.bnot bit.band bit.bor bit.bxor
bit.lshift bit.rshift bit.arshift bit.rol bit.ror bit.bswap
This module is a LuaJIT built-in E<mdash> you don't need to download or
install Lua BitOp. The Lua BitOp site has full documentation for all
E<rchevron> Lua BitOp API functions. The FFI adds support for 64 bit
bitwise operations, using the same API functions.
Please make sure to C<require> the module before using any of its
functions:
local bit = require("bit")
An already installed Lua BitOp module is ignored by LuaJIT. This way
you can use bit operations from both Lua and LuaJIT on a shared
installation.
=head2 C<ffi.*> E<mdash> FFI library
The FFI library allows calling external C functions and the use of C
data structures from pure Lua code.
=head2 C<jit.*> E<mdash> JIT compiler control
The functions in this module control the behavior of the JIT compiler
engine.
=head2 C API extensions
LuaJIT adds some extra functions to the Lua/C API.
=head2 Profiler
LuaJIT has an integrated profiler.
=head2 Enhanced Standard Library Functions
=head2 C<xpcall(f, err [,args...])> passes arguments
Unlike the standard implementation in Lua 5.1, C<xpcall()> passes any
arguments after the error function to the function which is called in a
protected context.
=head2 C<loadfile()> etc. handle UTF-8 source code
Non-ASCII characters are handled transparently by the Lua source code
parser. This allows the use of UTF-8 characters in identifiers and
strings. A UTF-8 BOM is skipped at the start of the source code.
=head2 C<tostring()> etc. canonicalize NaN and E<plusmn>Inf
All number-to-string conversions consistently convert non-finite
numbers to the same strings on all platforms. NaN results in C<"nan">,
positive infinity results in C<"inf"> and negative infinity results in
C<"-inf">.
=head2 C<tonumber()> etc. use builtin string to number conversion
All string-to-number conversions consistently convert integer and
floating-point inputs in decimal, hexadecimal and binary on all
platforms. C<strtod()> is I<not> used anymore, which avoids numerous
problems with poor C library implementations. The builtin conversion
function provides full precision according to the IEEE-754 standard, it
works independently of the current locale and it supports hex
floating-point numbers (e.g. C<0x1.5p-3>).
=head2 C<string.dump(f [,strip])> generates portable bytecode
An extra argument has been added to C<string.dump()>. If set to
C<true>, 'stripped' bytecode without debug information is generated.
This speeds up later bytecode loading and reduces memory usage. See
also the C<-b> command line option.
The generated bytecode is portable and can be loaded on any
architecture that LuaJIT supports, independent of word size or
endianness. However the bytecode compatibility versions must match.
Bytecode stays compatible for dot releases (x.y.0 E<rarr> x.y.1), but
may change with major or minor releases (2.0 E<rarr> 2.1) or between
any beta release. Foreign bytecode (e.g. from Lua 5.1) is incompatible
and cannot be loaded.
Note: C<LJ_GC64> mode requires a different frame layout, which implies
a different, incompatible bytecode format for ports that use this mode
(e.g. ARM64 or MIPS64) or when explicitly enabled for x64. This may be
rectified in the future.
=head2 C<table.new(narray, nhash)> allocates a pre-sized table
An extra library function C<table.new()> can be made available via
C<require("table.new")>. This creates a pre-sized table, just like the
C API equivalent C<lua_createtable()>. This is useful for big tables if
the final table size is known and automatic table resizing is too
expensive.
=head2 C<table.clear(tab)> clears a table
An extra library function C<table.clear()> can be made available via
C<require("table.clear")>. This clears all keys and values from a
table, but preserves the allocated array/hash sizes. This is useful
when a table, which is linked from multiple places, needs to be cleared
and/or when recycling a table for use by the same context. This avoids
managing backlinks, saves an allocation and the overhead of incremental
array/hash part growth.
Please note this function is meant for very specific situations. In
most cases it's better to replace the (usually single) link with a new
table and let the GC do its work.
=head2 Enhanced PRNG for C<math.random()>
LuaJIT uses a Tausworthe PRNG with period 2^223 to implement
C<math.random()> and C<math.randomseed()>. The quality of the PRNG
results is much superior compared to the standard Lua implementation
which uses the platform-specific ANSI rand().
The PRNG generates the same sequences from the same seeds on all
platforms and makes use of all bits in the seed argument.
C<math.random()> without arguments generates 52 pseudo-random bits for
every call. The result is uniformly distributed between 0.0 and 1.0.
It's correctly scaled up and rounded for C<math.random(n [,m])> to
preserve uniformity.
=head2 C<io.*> functions handle 64 bit file offsets
The file I/O functions in the standard C<io.*> library handle 64 bit
file offsets. In particular this means it's possible to open files
larger than 2 Gigabytes and to reposition or obtain the current file
position for offsets beyond 2 GB (C<fp:seek()> method).
=head2 C<debug.*> functions identify metamethods
C<debug.getinfo()> and C<lua_getinfo()> also return information about
invoked metamethods. The C<namewhat> field is set to C<"metamethod">
and the C<name> field has the name of the corresponding metamethod
(e.g. C<"__index">).
=head2 Fully Resumable VM
The LuaJIT VM is fully resumable. This means you can yield from a
coroutine even across contexts, where this would not possible with the
standard Lua 5.1 VM: e.g. you can yield across C<pcall()> and
C<xpcall()>, across iterators and across metamethods.
=head2 Extensions from Lua 5.2
LuaJIT supports some language and library extensions from Lua 5.2.
Features that are unlikely to break existing code are unconditionally
enabled:
=over
=item * C<goto> and C<::labels::>.
=item * Hex escapes C<'\x3F'> and C<'\*'> escape in strings.
=item * C<load(string|reader [, chunkname [,mode [,env]]])>.
=item * C<loadstring()> is an alias for C<load()>.
=item * C<loadfile(filename [,mode [,env]])>.
=item * C<math.log(x [,base])>.
=item * C<string.rep(s, n [,sep])>.
=item * C<string.format()>: C<%q> reversible. C<%s> checks
C<__tostring>. C<%a> and C<"%A> added.
=item * String matching pattern C<%g> added.
=item * C<io.read("*L")>.
=item * C<io.lines()> and C<file:lines()> process C<io.read()> options.
=item * C<os.exit(status|true|false [,close])>.
=item * C<package.searchpath(name, path [, sep [, rep]])>.
=item * C<package.loadlib(name, "*")>.
=item * C<debug.getinfo()> returns C<nparams> and C<isvararg> for
option C<"u">.
=item * C<debug.getlocal()> accepts function instead of level.
=item * C<debug.getlocal()> and C<debug.setlocal()> accept negative
indexes for varargs.
=item * C<debug.getupvalue()> and C<debug.setupvalue()> handle C
functions.
=item * C<debug.upvalueid()> and C<debug.upvaluejoin()>.
=item * Lua/C API extensions: C<lua_version()> C<lua_upvalueid()>
C<lua_upvaluejoin()> C<lua_loadx()> C<lua_copy()> C<lua_tonumberx()>
C<lua_tointegerx()> C<luaL_fileresult()> C<luaL_execresult()>
C<luaL_loadfilex()> C<luaL_loadbufferx()> C<luaL_traceback()>
C<luaL_setfuncs()> C<luaL_pushmodule()> C<luaL_newlibtable()>
C<luaL_newlib()> C<luaL_testudata()> C<luaL_setmetatable()>
=item * Command line option C<-E>.
=item * Command line checks C<__tostring> for errors.
=back
Other features are only enabled, if LuaJIT is built with
C<-DLUAJIT_ENABLE_LUA52COMPAT>:
=over
=item * C<goto> is a keyword and not a valid variable name anymore.
=item * C<break> can be placed anywhere. Empty statements (C<;;>) are
allowed.
=item * C<__lt>, C<__le> are invoked for mixed types.
=item * C<__len> for tables. C<rawlen()> library function.
=item * C<pairs()> and C<ipairs()> check for C<__pairs> and
C<__ipairs>.
=item * C<coroutine.running()> returns two results.
=item * C<table.pack()> and C<table.unpack()> (same as C<unpack()>).
=item * C<io.write()> and C<file:write()> return file handle instead of
C<true>.
=item * C<os.execute()> and C<pipe:close()> return detailed exit
status.
=item * C<debug.setmetatable()> returns object.
=item * C<debug.getuservalue()> and C<debug.setuservalue()>.
=item * Remove C<math.mod()>, C<string.gfind()>.
=item * C<package.searchers>.
=item * C<module()> returns the module table.
=back
Note: this provides only partial compatibility with Lua 5.2 at the
language and Lua library level. LuaJIT is API+ABI-compatible with Lua
5.1, which prevents implementing features that would otherwise break
the Lua/C API and ABI (e.g. C<_ENV>).
=head2 Extensions from Lua 5.3
LuaJIT supports some extensions from Lua 5.3:
=over
=item * Unicode escape C<'\u{XX...}'> embeds the UTF-8 encoding in
string literals.
=item * The argument table C<arg> can be read (and modified) by
C<LUA_INIT> and C<-e> chunks.
=item * C<io.read()> and C<file:read()> accept formats with or without
a leading C<*>.
=item * C<table.move(a1, f, e, t [,a2])>.
=item * C<coroutine.isyieldable()>.
=item * Lua/C API extensions: C<lua_isyieldable()>
=back
=head2 C++ Exception Interoperability
LuaJIT has built-in support for interoperating with C++ exceptions. The
available range of features depends on the target platform and the
toolchain used to compile LuaJIT:
Platform
Compiler
Interoperability
POSIX/x64, DWARF2 unwinding
GCC 4.3+, Clang
B<Full>
ARM C<-DLUAJIT_UNWIND_EXTERNAL>
GCC, Clang
B<Full>
Other platforms, DWARF2 unwinding
GCC, Clang
B<Limited>
Windows/x64
MSVC or WinSDK
B<Full>
Windows/x86
Any
B<Full>
Other platforms
Other compilers
B<No>
B<Full interoperability> means:
=over
=item * C++ exceptions can be caught on the Lua side with C<pcall()>,
C<lua_pcall()> etc.
=item * C++ exceptions will be converted to the generic Lua error
C<"C++ exception">, unless you use the C call wrapper feature.
=item * It's safe to throw C++ exceptions across non-protected Lua
frames on the C stack. The contents of the C++ exception object pass
through unmodified.
=item * Lua errors can be caught on the C++ side with C<catch(...)>.
The corresponding Lua error message can be retrieved from the Lua
stack.
=item * Throwing Lua errors across C++ frames is safe. C++ destructors
will be called.
=back
B<Limited interoperability> means:
=over
=item * C++ exceptions can be caught on the Lua side with C<pcall()>,
C<lua_pcall()> etc.
=item * C++ exceptions will be converted to the generic Lua error
C<"C++ exception">, unless you use the C call wrapper feature.
=item * C++ exceptions will be caught by non-protected Lua frames and
are rethrown as a generic Lua error. The C++ exception object will be
destroyed.
=item * Lua errors B<cannot> be caught on the C++ side.
=item * Throwing Lua errors across C++ frames will B<not> call C++
destructors.
=back
B<No interoperability> means:
=over
=item * It's B<not> safe to throw C++ exceptions across Lua frames.
=item * C++ exceptions B<cannot> be caught on the Lua side.
=item * Lua errors B<cannot> be caught on the C++ side.
=item * Throwing Lua errors across C++ frames will B<not> call C++
destructors.
=back
----
Copyright E<copy> 2005-2017 Mike Pall E<middot> Contact
=cut
#Pod::HTML2Pod conversion notes:
#From file extensions.html
# 17733 bytes of input
#Mon May 14 13:19:16 2018 agentzh
# No a_name switch not specified, so will not try to render <a name='...'>
# No a_href switch not specified, so will not try to render <a href='...'>
|