LuaVela Compiler Support

Introduction

Note

This page originates from the LuaJIT 2.0 NYI reference.

All aspects of Lua are implemented in interpreter, but not all of them are implemented in JIT compiler. This page serves as a quick reference to identify whether certain things are compiled or not.

It’s not a stated goal to compile everything, since the interpreter is fast enough for many tasks. And speed doesn’t matter for anything that’s done only a couple of times during the runtime of a program. E.g. it would be absolutely pointless to compile require() or module() (in fact, these should eventually be rewritten as plain Lua functions).

However, the number of JIT-compiled cases will grow over time, based on demand and user feedback.

The following tables provide an indication whether a feature is JIT-compiled or not:

  • yes: Always JIT-compiled.

  • partial: May be JIT-compiled, depending on the circumstances. Otherwise will fall back to the interpreter.

  • no: Not JIT-compiled (yet), will always fall back to the interpreter.

  • never: Ditto. Will not be JIT-compiled, even in future versions.

Bytecode

Almost all bytecodes are compiled, except for these:

Bytecode

Compiled?

Remarks

CALLT

partial

Tailcall. Some tailcalls to frames lower than the starting frame of the trace are not compiled.

CAT

partial

Concatenation operator ... Compiled with -Ojitcat. __concat metamethod is not compiled.

FNEW

no

Create closure.

FUNC*

partial

Call built-in function. See below.

ISNEXT

yes

Check for next() loop optimization. Compiled with -Ojitpairs enabled (since 0.22).

ITERN

partial

Optimized call to next() in a loop. Compiled with -Ojitpairs enabled except for the last iteration (since 0.22).

RET*

partial

Return from function. Returns to C frames and some returns to frames lower than the starting frame of the trace are not compiled.

TSETM

no

Initialize table with multiple return values. Compiled in LuaJIT 2.1.

UCLO

no

Close upvalues.

VARG

partial

Vararg operator .... Multi-result VARG is only compiled when used with select().

Notes:

  • Table accesses to mixed dense/sparse tables are not compiled.

  • Bytecode execution that would cause an error in the interpreter is never compiled.

Libraries

The following tables list whether or not calls to the various built-in library functions will get compiled. This may depend on the arguments passed (esp. their types) and the exact circumstances of the call.

Base Library

Function

Compiled?

Remarks

assert

yes

collectgarbage

no

dofile

never

error

never

gcinfo

no

getfenv

partial

Only getfenv(0) is compiled.

getmetatable

yes

ipairs

yes

load

never

loadfile

never

loadstring

never

module

never

newproxy

never

next

partial

Compiled with -Ojitpairs except for the case when the last element is passed as a second arg (since 0.22).

pairs

yes

Compiled with -Ojitpairs (since 0.22).

pcall

yes

print

no

rawequal

yes

rawget

yes

rawlen

yes

rawset

yes

require

never

select

partial

Only compiled when the first argument is a constant.

setfenv

no

setmetatable

yes

tonumber

partial

Won’t compile for bases other than 10, other exceptions apply.

tostring

partial

Only compiled for strings, numbers, booleans, nil, and values with a __tostring metamethod.

type

yes

unpack

no

xpcall

yes

String Library

Function

Compiled?

Remarks

string.byte

yes

string.char

no

Compiled in LuaJIT 2.1.

string.dump

never

string.find

partial

Compiled for plain string searches (no patterns) with -Ojitstr (since 0.20).

string.format

partial

Compiled for non-%p and non-string arguments for %s.

string.gmatch

no

string.gsub

no

string.len

yes

string.lower

yes

Compiled with -Ojitstr (since 0.20).

string.match

no

string.rep

no

Compiled in LuaJIT 2.1.

string.reverse

no

Compiled in LuaJIT 2.1.

string.sub

yes

string.upper

yes

Compiled with -Ojitstr (since 0.20).

Table Library

Function

Compiled?

Remarks

table.concat

yes

Compiled with -Ojittabcat (since 0.20).

table.foreach

never

Deprecated in Lua 5.1. Use pairs() instead.

table.foreachi

never

Deprecated in Lua 5.1. Use ipairs() instead, which is compiled.

table.getn

yes

table.insert

partial

Only when pushing.

table.maxn

no

table.pack

no

table.remove

partial

Only when popping; compiled in LuaJIT 2.1.

table.sort

no

table.unpack

no

Math Library

Function

Compiled?

Remarks

math.abs

yes

math.acos

yes

Since 0.23.

math.asin

yes

Since 0.23.

math.atan

yes

Since 0.23.

math.atan2

yes

Since 0.23.

math.ceil

yes

math.cos

yes

math.cosh

yes

Since 0.23.

math.deg

yes

math.exp

yes

math.floor

yes

math.fmod

no

math.frexp

no

math.huge

yes

math.ldexp

yes

math.log

yes

math.log10

yes

math.max

yes

math.min

yes

math.mod

no

Same as math.fmod.

math.modf

no

math.pi

yes

math.pow

yes

math.rad

yes

math.random

yes

math.randomseed

no

math.sin

yes

math.sinh

yes

Since 0.23.

math.sqrt

yes

math.tan

yes

math.tanh

yes

Since 0.23.

IO Library

Function

Compiled?

Remarks

io.close

no

io.flush

no

io.input

no

io.lines

no

io.open

no

io.output

no

io.popen

no

io.read

no

io.tmpfile

no

io.type

no

io.write

no

Bit Library

Function

Compiled?

Remarks

bit.arshift

yes

bit.band

yes

bit.bnot

yes

bit.bor

yes

bit.bswap

yes

bit.bxor

yes

bit.lshift

yes

bit.rol

yes

bit.ror

yes

bit.rshift

yes

bit.tobit

yes

bit.tohex

no

Compiled in LuaJIT 2.1.

FFI Library

Function

Compiled?

Remarks

ffi.alignof

yes

ffi.abi

yes

Since 0.22.

ffi.cast

partial

Same restrictions as ffi.new (casting is a form of cdata creation).

ffi.cdef

never

ffi.copy

yes

ffi.errno

partial

Not when setting a new value.

ffi.fill

yes

ffi.gc

partial

Not when clearing a finalizer. Compiled in LuaJIT 2.1.

ffi.istype

yes

ffi.load

never

ffi.metatype

never

ffi.new

partial

2.0: Not for VLA/VLS, > 8 byte alignment or > 128 bytes.

ffi.offsetof

yes

ffi.sizeof

partial

Not for VLA/VLS types (see below).

ffi.string

yes

ffi.typeof

partial

Only for cdata arguments. Never for cdecl strings.

Coroutine Library

No functions are compiled.

OS Library

No functions are compiled.

Package Library

No functions are compiled.

Debug Library

Function

Compiled?

Remarks

debug.getmetatable

no

Compiled in LuaJIT 2.1.

debug.*

no/never

Unlikely to change.

JIT Library

No functions are compiled.

uJIT Library

Function

Compiled?

Remarks

ujit.coverage.pause

never

ujit.coverage.start

never

ujit.coverage.stop

never

ujit.coverage.unpause

never

ujit.debug.gettableinfo

never

ujit.dump.bc

never

ujit.dump.bcins

never

ujit.dump.mcode

never

ujit.dump.stack

never

ujit.dump.start

never

ujit.dump.stop

never

ujit.dump.trace

never

ujit.getmetrics

no

ujit.immutable

yes

Since 0.18.

ujit.iprof.start

no

ujit.iprof.stop

no

ujit.math.isfinite

yes

ujit.math.isinf

yes

ujit.math.isnan

yes

ujit.math.isninf

yes

ujit.math.ispinf

yes

ujit.math.nan

yes

ujit.memprof.start

never

ujit.memprof.stop

never

ujit.profile.available

never

ujit.profile.init

never

ujit.profile.start

never

ujit.profile.stop

never

ujit.profile.terminate

never

ujit.seal

no

ujit.string.split

no

ujit.string.trim

yes

ujit.table.keys

yes

Since 0.20, via IR_CALLL.

ujit.table.rindex

partial

Since 0.23, compiles for tables without metatables (including nested lookups).

ujit.table.shallowcopy

yes

Since 0.20, via IR_TDUP.

ujit.table.size

yes

Since 0.22, via IR_CALLL.

ujit.table.toset

yes

Since 0.20, via IR_CALLL.

ujit.table.values

yes

Since 0.20, via IR_CALLL.

ujit.usesfenv

no