LuaJIT provides several new API functions organized into two libraries.
LuaJIT includes Coco — so have a look at the Coco API Extensions, too.
Standard Library Functions
All standard library functions have the same behaviour as in the Lua distribution LuaJIT is based on.
The Lua loader used by the standard require() library function has been modified to turn off compilation of the main chunk of a module. The main chunk is only run once when the module is loaded for the first time. There is no point in compiling it.
You might want to adapt this behaviour if you use your own utility functions (and not require()) to load modules.
Note that the subfunctions defined in a loaded module are of course compiled. See below if you want to override this.
The jit.* Library
This library holds several functions to control the behaviour of the JIT engine.
Turns the JIT engine on (default) or off.
These functions are typically used with the command line options -j on or -j off.
Enable (with jit.on, default) or disable (with jit.off) JIT compilation for a Lua function. The current function (the Lua function calling this library function) can be specified with true.
If the second argument is true, JIT compilation is also enabled/disabled recursively for all subfunctions of a function. With false only the subfunctions are affected.
Both library functions only set a flag which is checked when the function is executed for the first/next time. They do not trigger immediate compilation.
Typical usage is jit.off(true, true) in the main chunk of a module to turn off JIT compilation for the whole module. Note that require() already turns off compilation for the main chunk itself.
status = jit.compile(func [,args...])
Compiles a Lua function and returns the compilation status. Successful compilation is indicated with a nil status. Failure is indicated with a numeric status (see jit.util.status).
The optimizer pass of the compiler tries to derive hints from the passed arguments. Not passing any arguments or passing untypical arguments (esp. the wrong types) reduces the efficiency of the optimizer. The compiled function will still run, but probably not with maximum speed.
This library function is typically used for Ahead-Of-Time (AOT) compilation of time-critical functions or for testing/debugging.
status = jit.compilesub(func|true [,true])
Recursively compile all subfunctions of a Lua function. The current function (the Lua function calling this library function) can be specified with true. Note that the function itself is not compiled (use jit.compile()).
If the second argument is true, compilation will stop when the first error is encountered. Otherwise compilation will continue with the next subfunction.
The returned status is nil, if all subfunctions have been compiled successfully. A numeric status (see jit.util.status) indicates that at least one compilation failed and gives the status of the last failure (this is only helpful when stop on error is true).
Set the debug level for JIT compilation. If no level is given, the maximum debug level is set.
- Level 0 disables debugging: no checks for hooks are compiled into the code. This is the default when LuaJIT is started and provides the maximum performance.
- Level 1 enables function call debugging: call hooks and return hooks are checked in the function prologue and epilogue. This slows down function calls somewhat (by up to 10%).
- Level 2 enables full debugging: all hooks are checked. This slows down execution quite a bit, even when the hooks are not active.
Note that some compiler optimizations are turned off when debugging is enabled.
This function is typically used with the command line options -j debug or -j debug=level.
jit.attach(handler [, priority])
Attach a handler to the compiler pipeline with the given priority. The handler is detached if no priority is given.
The inner workings of the compiler pipeline and the API for handlers are still in flux. Please see the source code for more details.
Contains the LuaJIT version string.
Contains the version number of the LuaJIT core. Version xx.yy.zz is represented by the decimal number xxyyzz.
Contains the target architecture name (CPU and optional ABI).
The jit.util.* Library
This library holds many utility functions used by the provided extension modules for LuaJIT (e.g. the optimizer). The API may change in future versions.
stats = jit.util.stats(func)
Retrieves information about a function. Returns nil for C functions. Returns a table with the following fields for Lua functions:
- status: numeric compilation status (see jit.util.status).
- stackslots: number of stack slots.
- params: number of fixed parameters (arguments).
- consts: number of constants.
- upvalues: number of upvalues.
- subs: number of subfunctions (sub prototypes).
- bytecodes: number of bytecode instructions.
- isvararg: fixarg (false) or vararg (true) function.
- env: function environment table.
- mcodesize: size of the compiled machine code.
- mcodeaddr: start address of the compiled machine code.
mcodesize and mcodeaddr are not set if the function has not been compiled (yet).
op, a, b, c, test = jit.util.bytecode(func, pc)
Returns the fields of the bytecode instruction at the given pc for a Lua function. The first instruction is at pc = 1. Nothing is returned if pc is out of range.
The opcode name is returned as an uppercase string in op. The opcode arguments are returned as a, b and optionally c. Arguments that indicate an index into the array of constants are translated to negative numbers (the first constant is referred to with -1). Branch targets are signed numbers relative to the next instruction.
test is true if the instruction is a test (i.e. followed by a JMP).
const, ok = jit.util.const(func, idx)
Returns a constant from the array of constants for a Lua function. ok is true if idx is in range. Otherwise nothing is returned.
Constants are numbered starting with 1. A negative idx is mapped to a positive index.
upvalue, ok = jit.util.upvalue(func, idx)
Returns an upvalue from the array of upvalues for a Lua function. ok is true if idx is in range. Otherwise nothing is returned. Upvalues are numbered starting with 0.
nup = jit.util.closurenup(func, idx)
Returns the number of upvalues for the subfunction prototype with the given index idx for a Lua function. Nothing is returned if idx is out of range. Subfunctions are numbered starting with 0.
addr, mcode, mfmiter = jit.util.mcode(func, block])
Returns the numeric start address, the compiled machine code (converted to a string) and an iterator for the machine code fragment map for the specified machine code block associated with a Lua function.
Returns nil and a numeric status code (see jit.util.status) if the function has not been compiled yet or compilation has failed or compilation is disabled. Returns nothing if the selected machine code block does not exist.
The machine code fragment map is used for debugging and error handling. The format may change between versions and is an internal implementation detail of LuaJIT.
addr [, mcode] = jit.util.jsubmcode([idx])
If idx is omitted or nil: Returns the numeric start address and the compiled machine code (converted to a string) for internal subroutines used by the compiled machine code.
If idx is given: Returns the numeric start address of the machine code for a specific internal subroutine (0 based). Nothing is returned if idx is out of range.
This is a table that bidirectionally maps status numbers and status names (strings):
|Ok, code has been compiled.
|Nothing analyzed or compiled, yet (default).
|Compilation disabled for this function.
|JIT engine is turned off.
|Compilation delayed (recursive invocation).
|Bytecode or machine code is too large.
|Error from compiler frontend.
|Error from DynASM engine.
These two tables map compiler hint names to internal hint numbers.
The hint system is an internal implementation detail of LuaJIT. Please see the source code for more info.