# LuaJIT standard library
Every name a checked program can use without declaring it, and every module LuaJIT loads by name, as the compiler itself declares them. `nupp` reads these files to decide what a call means, so a signature here is the signature the checker enforces.
## Globals
The functions and values a program can name anywhere. Their declarations are loaded before any source is checked, so nothing requires them and nothing can shadow them by accident.
### `assert` _function_
```nupp
local assert: function(takes v: T?, msg: any?): T preserves v
```
Raises `msg` when `v` is nil or false, and otherwise returns `v`.
#### Type parameters
| Name | Description |
| --- | --- |
| `T` | the asserted type |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `takes v` | `T?` | the value to test |
| `msg` | `any?` | the error to raise, "assertion failed!" by default |
#### Returns
| Type | Description |
| --- | --- |
| `T preserves v` | `v`, now known not to be nil or false |
### `collectgarbage` _function_
```nupp
local collectgarbage: function(): number
& function(opt: 'collect' | 'stop' | 'restart' | 'count' | 'setpause' | 'setstepmul', arg: number?): number
& function(opt: 'step' | 'isrunning', arg: number?): boolean
```
Controls the garbage collector. `opt` is "collect" for a full cycle, the default, or
"stop", "restart", "count", "step", "setpause", "setstepmul" or "isrunning".
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `opt` | `'collect' | 'stop' | 'restart' | 'count' | 'setpause' | 'setstepmul'` | the operation to perform |
| `arg` | `number?` | the step size or parameter that the operation takes |
#### Returns
| Type | Description |
| --- | --- |
| `number` | what the operation reports: "count" gives the kilobytes in use, while "step" and "isrunning" answer a boolean |
### `dofile` _function_
```nupp
local dofile: function(path: string?): any
```
Loads and runs the file at `path`, or standard input when it is omitted. Errors from
the chunk propagate to the caller.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `path` | `string?` | the file to run, or nil for standard input |
#### Returns
| Type | Description |
| --- | --- |
| `any` | whatever the chunk returns |
### `error` _function_
```nupp
local error: nosuspend function(msg: any, level: number?): never
```
Raises `msg` as an error, unwinding to the nearest `pcall`. A string message is
prefixed with a source position chosen by `level`: 1, the default, blames the caller
of `error`, 2 blames its caller in turn, and 0 adds no position at all.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `msg` | `any` | the error value to raise |
| `level` | `number?` | whose position to blame, or 0 for none |
#### Returns
| Type | Description |
| --- | --- |
| `never` | |
### `gcinfo` _function_
```nupp
local gcinfo: function(): integer
```
Returns the amount of memory in use, in kilobytes. Superseded by
`collectgarbage("count")`.
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the kilobytes currently allocated |
### `getfenv` _function_
```nupp
local getfenv: function(f: any?): table
```
Returns the environment a function sees as its globals, addressed the way `setfenv`
addresses one.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `any?` | the function to ask about, or a stack level |
#### Returns
| Type | Description |
| --- | --- |
| `table` | that function's globals |
### `getmetatable` _function_
```nupp
local getmetatable: function(v: T): metatable?
```
Returns the metatable of `v`, or the value of its `__metatable` field when it has
one, or nil when there is no metatable.
#### Type parameters
| Name | Description |
| --- | --- |
| `T` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `v` | `T` | the value to inspect |
#### Returns
| Type | Description |
| --- | --- |
| `metatable\?` | the metatable, its `__metatable` stand-in, or nil |
### `ipairs` _function_
```nupp
const ipairs: nosuspend function(borrows t: const{V}): nosuspend function(): (integer, V) borrows (t)
```
Returns an iterator over the array part of `t`, from index 1 up to the first missing
element.
#### Type parameters
| Name | Description |
| --- | --- |
| `V` | the element type |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `borrows t` | `const{V}` | the array to traverse |
#### Returns
| Type | Description |
| --- | --- |
| `nosuspend function(): (integer, V) borrows (t)` | an iterator yielding each index and the element stored there |
### `load` _function_
```nupp
local load: function(chunk: any, name: string?, mode: string?, env: table?): (any, string?)
```
Compiles a chunk read piecewise from `chunk`, a function returning successive pieces
of source, without running it.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `chunk` | `any` | the reader function, or the source string |
| `name` | `string?` | the chunk name to use in error messages |
| `mode` | `string?` | "b", "t" or "bt", limiting binary or text sources |
| `env` | `table?` | the environment the chunk sees as its globals |
#### Returns
| Type | Description |
| --- | --- |
| `any` | the compiled chunk, or nil when it does not compile |
| `string?` | the compile error, when there was one |
### `loadfile` _function_
```nupp
local loadfile: function(path: string?, mode: string?, env: table?): (any, string?)
```
Compiles the file at `path`, or standard input when it is omitted, without running
it.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `path` | `string?` | the file to compile, or nil for standard input |
| `mode` | `string?` | "b", "t" or "bt", limiting binary or text sources |
| `env` | `table?` | the environment the chunk sees as its globals |
#### Returns
| Type | Description |
| --- | --- |
| `any` | the compiled chunk, or nil when it does not load |
| `string?` | the load error, when there was one |
### `loadstring` _function_
```nupp
local loadstring: function(s: string, name: string?): (any, string?)
```
Compiles the string `s` as a chunk, without running it.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the source to compile |
| `name` | `string?` | the chunk name to use in error messages |
#### Returns
| Type | Description |
| --- | --- |
| `any` | the compiled chunk, or nil when it does not compile |
| `string?` | the compile error, when there was one |
### `newproxy` _constructor_
```nupp
local newproxy: function(mt: any?): userdata
```
Creates a userdata with a fresh empty metatable, with no metatable, or sharing the
metatable of an existing proxy.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `mt` | `any?` | true for a new metatable, false or nil for none, or a proxy to share a metatable with |
#### Returns
| Type | Description |
| --- | --- |
| `userdata` | the new userdata |
### `next` _function_
```nupp
local next: nosuspend function(t: table, k: any?): (any, any)
```
Returns the pair that follows key `k` in `t`. Passing nil, or omitting `k`, returns
the first pair; the traversal order is unspecified.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `t` | `table` | the table to step through |
| `k` | `any?` | the key to step past, or nil to start the traversal |
#### Returns
| Type | Description |
| --- | --- |
| `any` | the next key, or nil once the traversal is done |
| `any` | the value stored at that key |
### `pairs` _function_
```nupp
local pairs: nosuspend function(t: {readonly [K]: V}): nosuspend function(): (K, V)
```
Returns an iterator over every key/value pair of `t`, in unspecified order. New keys
must not be added to `t` during the traversal.
#### Type parameters
| Name | Description |
| --- | --- |
| `K` | the key type |
| `V` | the value type |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `t` | `{readonly \[K\]: V}` | the table to traverse |
#### Returns
| Type | Description |
| --- | --- |
| `nosuspend function(): (K, V)` | an iterator yielding each key and its value, and nil when done |
### `pcall` _function_
```nupp
local pcall: function(scoped f: function(A...): R..., A...): ((true, R...) | (false, unknown))
& function(takes f: function(A...): R..., A...): ((true, R...) | (false, unknown))
```
Calls `f` with the given arguments, trapping any error it raises.
so has to be narrowed or cast before it is used as anything in particular
#### Type parameters
| Name | Description |
| --- | --- |
| `A` | |
| `R` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `scoped f` | `function(A...): R...` | the function to call |
| `?` | `A...` | |
### `print` _function_
```nupp
local print: nosuspend function(borrows ...: any)
```
Writes every argument to standard output, converted with `tostring`, separated by
tabs and followed by a newline.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `borrows ?` | `any` | |
### `rawequal` _function_
```nupp
local rawequal: nosuspend function(borrows a: any, borrows b: any): boolean
```
Compares two values for primitive equality, without an `__eq` metamethod.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `borrows a` | `any` | the left value |
| `borrows b` | `any` | the right value |
#### Returns
| Type | Description |
| --- | --- |
| `boolean` | whether the values are primitively equal |
### `rawget` _function_
```nupp
local rawget: nosuspend function(t: table, k: any): any
```
Reads `t[k]` without consulting an `__index` metamethod.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `t` | `table` | the table to read |
| `k` | `any` | the key to read |
#### Returns
| Type | Description |
| --- | --- |
| `any` | the stored value, or nil when the key is absent |
### `rawlen` _function_
```nupp
local rawlen: nosuspend function(borrows v: any): integer
```
Returns the length of a table or string without consulting a `__len` metamethod.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `borrows v` | `any` | the table or string to measure |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the length |
### `rawset` _function_
```nupp
local rawset: nosuspend function(t: table, k: any, v: any): table
```
Assigns `t[k] = v` without consulting a `__newindex` metamethod.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `t` | `table` | the table to write to |
| `k` | `any` | the key to write |
| `v` | `any` | the value to store |
#### Returns
| Type | Description |
| --- | --- |
| `table` | `t` |
### `require` _function_
```nupp
local require: function(name: string): any
```
Loads module `name` the first time it is asked for and returns its value. Later
calls hand back the value cached in `package.loaded`.
A call through the unshadowed builtin with a literal name is resolved by the
checker to the module's declared type, and one with a computed name answers
`unknown` in a strict file. The `any` declared here is what a gradual file gets
for a computed name, and what any call through a shadowing binding gets.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `name` | `string` | the module name, with `.` separating path components |
#### Returns
| Type | Description |
| --- | --- |
| `any` | the value the module returned |
### `select` _function_
```nupp
local select: function(n: '#', A...): integer & function(n: number, A...): A...
```
Selects from a vararg list. With a number, returns every argument from the nth
onwards, counting from the end when `n` is negative; with "#", returns how many
arguments follow.
#### Type parameters
| Name | Description |
| --- | --- |
| `A` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `n` | `'#'` | the 1-based index to select from, or the string "#" |
| `?` | `A...` | |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the selected arguments, or their count |
### `setfenv` _function_
```nupp
local setfenv: function(f: any, env: table): any
```
Sets the environment a function sees as its globals. `f` is the function itself, or
a stack level: 1 is the caller, 0 the running thread.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `any` | the function whose globals are being replaced, or a stack level |
| `env` | `table` | the table to use as that function's globals |
#### Returns
| Type | Description |
| --- | --- |
| `any` | `f`, when it was a function |
### `setmetatable` _function_
```nupp
local setmetatable: function(takes t: T, mt: metatable?): T preserves t
```
Sets `t`'s metatable, or removes it when `mt` is nil. Raises when the current
metatable has a `__metatable` field.
#### Type parameters
| Name | Description |
| --- | --- |
| `T` | the table type |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `takes t` | `T` | the table to change |
| `mt` | `metatable\?` | the new metatable, or nil to remove the current one |
#### Returns
| Type | Description |
| --- | --- |
| `T preserves t` | `t` |
### `tonumber` _function_
```nupp
local tonumber: nosuspend function(v: any, base: number?): number?
```
Converts a value to a number, or nil when it has no numeric meaning. With `base`,
`v` is read as an unsigned integer numeral in that base.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `v` | `any` | the value to convert |
| `base` | `number?` | the numeral base, 2 through 36; decimal when omitted |
#### Returns
| Type | Description |
| --- | --- |
| `number?` | the number, or nil when `v` does not denote one |
### `tostring` _function_
```nupp
local tostring: nosuspend function(borrows v: any): string
```
Converts a value to a string, honoring a `__tostring` metamethod.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `borrows v` | `any` | the value to convert |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the string form of `v` |
### `type` _function_
```nupp
local type: nosuspend function(borrows v: any): ("nil"
| "boolean"
| "number"
| "string"
| "table"
| "function"
| "thread"
| "userdata"
| "cdata")
```
Returns the type name of a value: "nil", "boolean", "number", "string", "table",
"function", "thread" or "userdata", plus "cdata" for FFI values.
The result is the closed set of those names rather than `string`, so a comparison
against one of them narrows, a chain over all of them is exhaustive, and a
comparison against a name LuaJIT never returns is caught where it is written.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `borrows v` | `any` | the value to classify |
#### Returns
| Type | Description |
| --- | --- |
| `"nil"
| "boolean"
| "number"
| "string"
| "table"
| "function"
| "thread"
| "userdata"
| "cdata"` | the type name |
### `unpack` _function_
```nupp
local unpack: function(t: const{T}, i: number?, j: number?): ...T
```
Returns the elements of `t` from index `i` through `j` as separate values.
#### Type parameters
| Name | Description |
| --- | --- |
| `T` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `t` | `const{T}` | the array to expand |
| `i` | `number?` | the first index, 1 by default |
| `j` | `number?` | the last index, `#t` by default |
### `xpcall` _function_
```nupp
local xpcall: function(
scoped f: function(A...): R...,
scoped handler: function(any): E,
A...
): ((true, R...) | (false, E))
& function(
takes f: function(A...): R...,
scoped handler: function(any): E,
A...
): ((true, R...) | (false, E))
```
Like `pcall`, but runs `handler` on the error before the stack unwinds, so it can
still collect a traceback.
#### Type parameters
| Name | Description |
| --- | --- |
| `E` | |
| `A` | |
| `R` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `scoped f` | `function(A...): R...` | the function to call |
| `scoped handler` | `function(any): E` | called with the error value at the point of the failure |
| `?` | `A...` | |
### `arg` _variable_
```nupp
local arg: {string}
```
The command-line arguments of the running script, where `arg[1]` is the first one.
Index 0 holds the script name, and negative indices hold the interpreter and the
options it was given.
## `string`
String manipulation and pattern matching. Every function here is also reachable as a
method on a string value, so `s:upper()` means `string.upper(s)`.
### `string.byte` _function_
```nupp
local byte: nosuspend function(s: string, i: number?, j: number?): ...integer
```
Returns the numeric codes of the characters of `s` from `i` to `j`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the string to read |
| `i` | `number?` | the first index, 1 by default; negative counts from the end |
| `j` | `number?` | the last index, `i` by default |
### `string.char` _function_
```nupp
local char: nosuspend function(...: number): string
```
Builds a string from the given character codes.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `...` | `number` | the character codes, each 0 through 255 |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the assembled string |
### `string.dump` _function_
```nupp
local dump: nosuspend function(f: any, strip: (boolean | string)?): string
```
Returns a binary representation of a Lua function that has no upvalues, in a
form `loadstring` accepts.
LuaJIT also accepts a mode string in place of the boolean: `s` discards debug
information as `true` does, and `d` writes the entries of a template table in
sorted order rather than in the order its keys hash, which is what makes two
dumps of one function compare equal across processes.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `any` | the function to dump |
| `strip` | `(boolean | string)?` | whether to discard debug information, or a LuaJIT mode string |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the bytecode string |
### `string.find` _function_
```nupp
local find: nosuspend function(
s: string,
pat: Pattern,
init: number?,
plain: Plain?
): unpackof __NuppFindResults(Pattern, Plain)
```
Finds the first match of pattern `pat` in `s`, at or after `init`. Any captures
the pattern has follow the two returned indices.
#### Type parameters
| Name | Description |
| --- | --- |
| `Pattern` | |
| `Plain` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the string to search |
| `pat` | `Pattern` | the pattern to look for |
| `init` | `number?` | where to start, 1 by default; negative counts from the end |
| `plain` | `Plain?` | whether to match `pat` literally, ignoring pattern syntax |
### `string.format` _function_
```nupp
local format: nosuspend function(
fmt: Format,
...: unpackof __NuppFormatArguments(Format, nupp.Debug)
): string
```
Formats the arguments into `fmt` using LuaJIT's bounded-width `printf` subset,
plus `%q` quoting, `%p` object identity, and hexadecimal floats with `%a`/`%A`.
#### Type parameters
| Name | Description |
| --- | --- |
| `Format` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `fmt` | `Format` | the format string |
| `...` | `unpackof \_\_NuppFormatArguments(Format, nupp.Debug)` | the values that the directives consume |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the formatted string |
### `string.gmatch` _function_
```nupp
local gmatch: nosuspend function(
s: string,
pat: Pattern
): function(): ((unpackof __NuppGmatchResults(Pattern)) | (nil))
```
Returns an iterator over each successive match of `pat` in `s`, or over that
match's captures when the pattern has any. Anchors have no special meaning here.
run out
#### Type parameters
| Name | Description |
| --- | --- |
| `Pattern` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the string to scan |
| `pat` | `Pattern` | the pattern to repeat across `s` |
#### Returns
| Type | Description |
| --- | --- |
| `function(): ((unpackof \_\_NuppGmatchResults(Pattern)) | (nil))` | an iterator yielding one match at a time, and nothing once the matches |
### `string.gsub` _function_
```nupp
local gsub: nosuspend function(
s: string,
pat: Pattern,
repl: any,
n: number?
): unpackof __NuppGsubResults(Pattern)
```
Replaces matches of `pat` in `s`. `repl` may be a string, in which `%1` through
`%9` stand for captures and `%0` for the whole match, a table looked up by the
first capture, or a function called with the captures.
#### Type parameters
| Name | Description |
| --- | --- |
| `Pattern` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the subject string |
| `pat` | `Pattern` | the pattern to replace |
| `repl` | `any` | the replacement string, table or function |
| `n` | `number?` | how many matches to replace at most, all of them by default |
### `string.len` _function_
```nupp
local len: nosuspend function(s: string): integer
```
Returns the length of `s` in bytes.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the string to measure |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the byte count |
### `string.lower` _function_
```nupp
local lower: nosuspend function(s: string): string
```
Returns `s` with every ASCII letter folded to lower case.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the string to fold |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the lowercased string |
### `string.match` _function_
```nupp
local match: nosuspend function(
s: string,
pat: Pattern,
init: number?
): unpackof __NuppMatchResults(Pattern)
```
Returns the captures of the first match of `pat` in `s`, or the whole match when
the pattern has no captures.
#### Type parameters
| Name | Description |
| --- | --- |
| `Pattern` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the string to search |
| `pat` | `Pattern` | the pattern to look for |
| `init` | `number?` | where to start, 1 by default; negative counts from the end |
### `string.rep` _function_
```nupp
local rep: nosuspend function(s: string, n: number, sep: string?): string
```
Returns `n` copies of `s`, with `sep` between consecutive copies.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the string to repeat |
| `n` | `number` | how many copies to produce |
| `sep` | `string?` | what to place between copies, nothing by default |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the repeated string |
### `string.reverse` _function_
```nupp
local reverse: nosuspend function(s: string): string
```
Returns the bytes of `s` in reverse order.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the string to reverse |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the reversed string |
### `string.sub` _function_
```nupp
local sub: nosuspend function(s: string, i: number, j: number?): string
```
Returns the substring of `s` running from `i` through `j`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the string to slice |
| `i` | `number` | the first index; negative counts from the end |
| `j` | `number?` | the last index, -1 by default |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the selected substring |
### `string.upper` _function_
```nupp
local upper: nosuspend function(s: string): string
```
Returns `s` with every ASCII letter folded to upper case.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the string to fold |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the uppercased string |
## `table`
Table manipulation. These functions work on the array part of a table: the integer
keys 1 through `#t`.
### `table.clear` _function_
```nupp
local clear: function(t: table)
```
Removes every key from `t` while keeping the space it has already allocated, so
it can be refilled without reallocating.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `t` | `table` | the table to empty |
### `table.clone` _function_
```nupp
local clone: nosuspend function(t: T): T
```
Copies `t` one level deep: every key it holds directly, and its metatable, are
carried over, while a value that is itself a table stays shared between the two.
Neither `__index` nor `__pairs` is consulted, so what comes back is what `next`
would have walked.
#### Type parameters
| Name | Description |
| --- | --- |
| `T` | the table type |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `t` | `T` | the table to copy |
#### Returns
| Type | Description |
| --- | --- |
| `T` | a new table holding the same keys, values and metatable |
### `table.concat` _function_
```nupp
local concat: nosuspend function(t: table, sep: string?, i: number?, j: number?): string
```
Joins the elements `t[i]` through `t[j]`, each of which must be a string or a
number, into a single string.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `t` | `table` | the array to join |
| `sep` | `string?` | what to place between elements, nothing by default |
| `i` | `number?` | the first index, 1 by default |
| `j` | `number?` | the last index, `#t` by default |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the joined string |
### `table.maxn` _function_
```nupp
local maxn: nosuspend function(t: table): number
```
Returns the largest positive numeric key of `t`, or 0 when it has none.
Deprecated, and unlike `#t` it also sees keys past a hole.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `t` | `table` | the table to scan |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the largest positive numeric key |
### `table.new` _constructor_
```nupp
local new: function(narray: number, nhash: number): table
```
Creates a table preallocated for `narray` array slots and `nhash` hash slots, so
filling it in does not have to rehash.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `narray` | `number` | how many array slots to reserve |
| `nhash` | `number` | how many hash slots to reserve |
#### Returns
| Type | Description |
| --- | --- |
| `table` | the new table |
### `table.remove` _function_
```nupp
local remove: nosuspend function(t: table, pos: number?): any
```
Removes the element at `pos`, shifting later elements down.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `t` | `table` | the array to remove from |
| `pos` | `number?` | the position to remove, `#t` by default |
#### Returns
| Type | Description |
| --- | --- |
| `any` | the element that was removed |
### `table.sort` _function_
```nupp
local sort: function(t: {V}, scoped cmp: (function(V, V): boolean)?)
```
Sorts `t` in place, between indices 1 and `#t`. The sort is not stable, and
`cmp` must be a strict order or it may raise.
#### Type parameters
| Name | Description |
| --- | --- |
| `V` | the element type |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `t` | `{V}` | the array to sort |
| `scoped cmp` | `(function(V, V): boolean)?` | returns true when its first argument must come first; `<` is used when it is omitted |
### `table.insert` _variable_
```nupp
local insert: (nosuspend function(t: {V}, value: V): nil)
& (nosuspend function(t: {V}, pos: integer, value: V): nil)
```
Inserts `value` at position `pos`, shifting later elements up. Called with two
arguments, appends that value to the end instead.
## `math`
Mathematical functions and constants, operating on the doubles that plain Lua
numbers are.
### `math.abs` _function_
```nupp
local abs: nosuspend function(x: number): number
```
Returns the absolute value of `x`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to take the magnitude of |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the absolute value |
### `math.acos` _function_
```nupp
local acos: nosuspend function(x: number): number
```
Returns the arc cosine of `x`, in radians.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the cosine to invert, -1 through 1 |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the angle in radians |
### `math.asin` _function_
```nupp
local asin: nosuspend function(x: number): number
```
Returns the arc sine of `x`, in radians.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the sine to invert, -1 through 1 |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the angle in radians |
### `math.atan` _function_
```nupp
local atan: nosuspend function(x: number): number
```
Returns the arc tangent of `x`, in radians.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the tangent to invert |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the angle in radians |
### `math.atan2` _function_
```nupp
local atan2: nosuspend function(y: number, x: number): number
```
Returns the arc tangent of `y / x`, using the sign of both arguments to place
the result in the right quadrant.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `y` | `number` | the numerator |
| `x` | `number` | the denominator |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the angle in radians |
### `math.ceil` _function_
```nupp
local ceil: nosuspend function(x: number): integer
```
Returns the smallest integer that is not less than `x`. NaN and the
infinities pass through unchanged, so the result is a whole number only
when `x` is finite.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to round up |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the rounded value |
### `math.cos` _function_
```nupp
local cos: nosuspend function(x: number): number
```
Returns the cosine of `x`, which is in radians.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the angle in radians |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the cosine |
### `math.cosh` _function_
```nupp
local cosh: nosuspend function(x: number): number
```
Returns the hyperbolic cosine of `x`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the argument |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the hyperbolic cosine |
### `math.deg` _function_
```nupp
local deg: nosuspend function(r: number): number
```
Converts the angle `r` from radians to degrees.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `r` | `number` | the angle in radians |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the angle in degrees |
### `math.exp` _function_
```nupp
local exp: nosuspend function(x: number): number
```
Returns e raised to the power `x`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the exponent |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the result |
### `math.floor` _function_
```nupp
local floor: nosuspend function(x: number): integer
```
Returns the largest integer that is not greater than `x`. NaN and the
infinities pass through unchanged, so the result is a whole number only
when `x` is finite.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to round down |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the rounded value |
### `math.fmod` _function_
```nupp
local fmod: nosuspend function(x: number, y: number): number
```
Returns the remainder of `x / y`, keeping the sign of `x`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the dividend |
| `y` | `number` | the divisor |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the remainder |
### `math.frexp` _function_
```nupp
local frexp: nosuspend function(x: number): (number, number)
```
Splits `x` into a fraction in [0.5,1) and an exponent, such that `x` equals the
fraction times 2 raised to the exponent.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to split |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the fraction |
| `number` | the exponent |
### `math.ldexp` _function_
```nupp
local ldexp: nosuspend function(m: number, e: number): number
```
Returns `m` times 2 raised to the power `e`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `m` | `number` | the mantissa |
| `e` | `number` | the exponent |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the result |
### `math.log` _function_
```nupp
local log: nosuspend function(x: number, base: number?): number
```
Returns the natural logarithm of `x`, or its logarithm in `base`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to take the logarithm of |
| `base` | `number?` | the base to use, e by default |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the logarithm |
### `math.max` _function_
```nupp
local max: function(...: N): N
```
Returns the largest of its arguments. Comparing integers gives an integer back,
so a bound taken this way stays usable as an index.
#### Type parameters
| Name | Description |
| --- | --- |
| `N` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `...` | `N` | the numbers to compare, at least one |
#### Returns
| Type | Description |
| --- | --- |
| `N` | the largest of them |
### `math.min` _function_
```nupp
local min: function(...: N): N
```
Returns the smallest of its arguments. Comparing integers gives an integer back,
so a bound taken this way stays usable as an index.
#### Type parameters
| Name | Description |
| --- | --- |
| `N` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `...` | `N` | the numbers to compare, at least one |
#### Returns
| Type | Description |
| --- | --- |
| `N` | the smallest of them |
### `math.modf` _function_
```nupp
local modf: nosuspend function(x: number): (number, number)
```
Splits `x` into its integral and fractional parts, both keeping the sign of `x`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to split |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the integral part |
| `number` | the fractional part |
### `math.pow` _function_
```nupp
local pow: nosuspend function(x: number, y: number): number
```
Returns `x` raised to the power `y`, the same as `x ^ y`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the base |
| `y` | `number` | the exponent |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the result |
### `math.rad` _function_
```nupp
local rad: nosuspend function(d: number): number
```
Converts the angle `d` from degrees to radians.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `d` | `number` | the angle in degrees |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the angle in radians |
### `math.random` _function_
```nupp
local random: nosuspend function(): number & function(m: number): number & function(m: number, n: number): number
```
Returns a pseudo-random number: a float in [0,1) with no arguments, a bounded
number with one, or a number between `m` and `n` with two.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `m` | `number` | the upper bound, or the lower bound when `n` is given too |
| `n` | `number` | the upper bound |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the generated number |
### `math.randomseed` _function_
```nupp
local randomseed: nosuspend function(seed: number)
```
Seeds the pseudo-random generator, which starts from a fixed state.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `seed` | `number` | the seed to start from |
### `math.sin` _function_
```nupp
local sin: nosuspend function(x: number): number
```
Returns the sine of `x`, which is in radians.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the angle in radians |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the sine |
### `math.sinh` _function_
```nupp
local sinh: nosuspend function(x: number): number
```
Returns the hyperbolic sine of `x`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the argument |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the hyperbolic sine |
### `math.sqrt` _function_
```nupp
local sqrt: nosuspend function(x: number): number
```
Returns the square root of `x`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to take the root of |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the square root |
### `math.tan` _function_
```nupp
local tan: nosuspend function(x: number): number
```
Returns the tangent of `x`, which is in radians.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the angle in radians |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the tangent |
### `math.tanh` _function_
```nupp
local tanh: nosuspend function(x: number): number
```
Returns the hyperbolic tangent of `x`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the argument |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the hyperbolic tangent |
### `math.huge` _variable_
```nupp
local huge: number
```
Positive infinity, which compares greater than any other number.
### `math.pi` _variable_
```nupp
local pi: number
```
The ratio of a circle's circumference to its diameter.
## `os`
Operating-system facilities: clocks and calendars, the environment, processes and
file names.
### `os.clock` _function_
```nupp
local clock: function(): number
```
Returns the CPU time the program has used, in seconds. It measures intervals of
work, not wall-clock time.
#### Returns
| Type | Description |
| --- | --- |
| `number` | the CPU seconds consumed so far |
### `os.date` _function_
```nupp
local date: function(fmt: Format?, t: number?): __NuppDateResult(Format, DateFields)
```
Formats the time `t` as text according to `fmt`. A leading "!" formats in UTC
rather than local time, and a `fmt` of "*t" returns a table of date fields
instead of a string.
A literal `fmt` decides which of those two the call answers: "*t" and "!*t" give
`DateFields`, and every other literal gives a string. A `fmt` the compiler
cannot read gives either, so narrow it before use.
#### Type parameters
| Name | Description |
| --- | --- |
| `Format` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `fmt` | `Format?` | the `strftime` format, "%c" by default |
| `t` | `number?` | the time to format, the current time by default |
#### Returns
| Type | Description |
| --- | --- |
| `\_\_NuppDateResult(Format, DateFields)` | the formatted string, or the field table for "*t" |
### `os.difftime` _function_
```nupp
local difftime: function(t2: number, t1: number): number
```
Returns the number of seconds from `t1` to `t2`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `t2` | `number` | the later time |
| `t1` | `number` | the earlier time |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the difference in seconds |
### `os.execute` _function_
```nupp
local execute: function(cmd: string?): any
```
Runs `cmd` with the system shell and waits for it. With no argument it instead
reports whether a shell is available at all.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `cmd` | `string?` | the command line to run |
#### Returns
| Type | Description |
| --- | --- |
| `any` | the command's exit status, or whether a shell exists |
### `os.exit` _function_
```nupp
local exit: function(code: any?): never
```
Ends the process, closing the interpreter state on the way out.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `code` | `any?` | the exit status: true or 0 for success, false or another number for failure |
#### Returns
| Type | Description |
| --- | --- |
| `never` | |
### `os.getenv` _function_
```nupp
local getenv: function(name: string): string?
```
Returns the value of the environment variable `name`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `name` | `string` | the variable to read |
#### Returns
| Type | Description |
| --- | --- |
| `string?` | its value, or nil when it is not set |
### `os.remove` _function_
```nupp
local remove: function(path: string): (boolean?, string?)
```
Deletes the file, or the empty directory, at `path`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `path` | `string` | what to delete |
#### Returns
| Type | Description |
| --- | --- |
| `boolean?` | true on success, or nil on failure |
| `string?` | the reason it failed |
### `os.rename` _function_
```nupp
local rename: function(from: string, to: string): (boolean?, string?)
```
Renames the file or directory at `from` to `to`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `from` | `string` | the existing path |
| `to` | `string` | the new path |
#### Returns
| Type | Description |
| --- | --- |
| `boolean?` | true on success, or nil on failure |
| `string?` | the reason it failed |
### `os.time` _function_
```nupp
local time: function(spec: table?): number
```
Returns the current time, or the time that `spec` describes.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `spec` | `table?` | a table with `year`, `month` and `day`, and optionally `hour`, `min`, `sec` and `isdst` |
#### Returns
| Type | Description |
| --- | --- |
| `number` | the time, in the system's own epoch-based encoding |
### `os.tmpname` _function_
```nupp
local tmpname: function(): string
```
Returns a file name usable for a temporary file. The file itself is neither
created nor removed for you.
#### Returns
| Type | Description |
| --- | --- |
| `string` | the temporary file name |
## `package`
### `package.loadlib` _function_
```nupp
local loadlib: function(path: string, symbol: string): (any, string?)
```
Opens a shared object and answers the named C entry point, or nil and why
when it could not be opened.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `path` | `string` | |
| `symbol` | `string` | |
#### Returns
| Type | Description |
| --- | --- |
| `any` | |
| `string?` | |
### `package.config` _variable_
```nupp
local config: string
```
Platform path separators and template markers.
### `package.cpath` _variable_
```nupp
local cpath: string
```
Search templates used by `require` for C modules.
### `package.loaded` _variable_
```nupp
local loaded: {[string]: any}
```
Every module `require` has already returned, by the name it was asked for.
Writing an entry makes that name resolve without a search.
### `package.loaders` _variable_
```nupp
local loaders: {function(string): any}
```
Lua 5.1 and Lua 5.2 names for the module-loader chain.
### `package.path` _variable_
```nupp
local path: string
```
Search templates used by `require` for Lua modules.
### `package.preload` _variable_
```nupp
local preload: {[string]: function(...: any): any}
```
Modules made available without consulting the filesystem.
### `package.searchers` _variable_
```nupp
local searchers: {function(string): any}?
```
## `io`
### `io.close` _function_
```nupp
local close: function(f: LuaFile?): boolean?
```
Closes `f`, or the default output file when it is omitted.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `LuaFile?` | the file to close |
#### Returns
| Type | Description |
| --- | --- |
| `boolean?` | whether the file closed cleanly |
### `io.input` _function_
```nupp
local input: function(f: (LuaFile | string)?): LuaFile
```
Sets the default input file, opening `f` first when it is a name. With no
argument it returns the current one instead.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `(LuaFile | string)?` | the file handle or name to switch to |
#### Returns
| Type | Description |
| --- | --- |
| `LuaFile` | the default input file |
### `io.lines` _function_
```nupp
local lines: function(path: string?): nosuspend function(): string?
```
Returns an iterator over the lines of the file at `path`, closing it once the
iterator runs out, or over the default input file when `path` is omitted.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `path` | `string?` | the file to read, or nil for the default input file |
#### Returns
| Type | Description |
| --- | --- |
| `nosuspend function(): string?` | an iterator yielding one line at a time, and nil once the file is read |
### `io.open` _function_
```nupp
local open: function(path: string, mode: string?): (affine(LuaFile, _)?, string?)
```
Opens the file at `path`. Modes are "r", "w" and "a", with "+" added for update
and a trailing "b" for binary.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `path` | `string` | the file to open |
| `mode` | `string?` | the mode to open it in, "r" by default |
#### Returns
| Type | Description |
| --- | --- |
| `affine(LuaFile, \_)?` | the file handle, or nil when it cannot be opened |
| `string?` | the reason it could not be opened |
### `io.output` _function_
```nupp
local output: function(f: (LuaFile | string)?): LuaFile
```
Sets the default output file, opening `f` first when it is a name. With no
argument it returns the current one instead.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `(LuaFile | string)?` | the file handle or name to switch to |
#### Returns
| Type | Description |
| --- | --- |
| `LuaFile` | the default output file |
### `io.popen` _function_
```nupp
local popen: function(cmd: string, mode: string?): (affine(LuaFile, _)?, string?)
```
Runs `cmd` in a separate process and returns a handle on one of its streams: its
standard output for "r", its standard input for "w".
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `cmd` | `string` | the command line to run |
| `mode` | `string?` | which stream to connect, "r" by default |
#### Returns
| Type | Description |
| --- | --- |
| `affine(LuaFile, \_)?` | the file handle, or nil when the process cannot start |
| `string?` | the reason it could not start |
### `io.read` _function_
```nupp
local read: function(...: any): any
```
Reads the default input file according to the given formats: "*l" for a line,
"*n" for a number, "*a" for the rest, or a byte count.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `...` | `any` | the formats to read, "*l" by default |
#### Returns
| Type | Description |
| --- | --- |
| `any` | one value per format, or nil where the read came up short |
### `io.tmpfile` _function_
```nupp
local tmpfile: function(): affine(LuaFile, _)?
```
Opens a temporary file in update mode, removed when the program ends.
#### Returns
| Type | Description |
| --- | --- |
| `affine(LuaFile, \_)?` | the file handle |
### `io.write` _function_
```nupp
local write: function(...: any): any
```
Writes each argument, which must be a string or a number, to the default output
file.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `...` | `any` | the values to write |
#### Returns
| Type | Description |
| --- | --- |
| `any` | the file that was written to |
### `io.stderr` _variable_
```nupp
local stderr: LuaFile
```
The standard error stream.
### `io.stdin` _variable_
```nupp
local stdin: LuaFile
```
The standard input stream.
### `io.stdout` _variable_
```nupp
local stdout: LuaFile
```
The standard output stream.
### `io.type` _variable_
```nupp
local type: nosuspend function(value: any): ("file" | "closed file")?
```
Classifies an open or closed file handle.
## `coroutine`
### `coroutine.create` _function_
```nupp
local create: function(f: any): thread
```
Creates a coroutine with `f` as its body. The body does not start running until
the first `resume`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `any` | the function to run inside the coroutine |
#### Returns
| Type | Description |
| --- | --- |
| `thread` | the new coroutine |
### `coroutine.isyieldable` _function_
```nupp
local isyieldable: function(): boolean
```
Whether the running coroutine is allowed to yield, which is false on the main
coroutine.
#### Returns
| Type | Description |
| --- | --- |
| `boolean` | whether a `yield` would succeed here |
### `coroutine.resume` _function_
```nupp
local resume: function(co: thread, A...): ...any
```
Starts or continues `co`. The extra arguments go to its body on the first call,
and become the results of the `yield` that suspended it on later ones.
#### Type parameters
| Name | Description |
| --- | --- |
| `A` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `co` | `thread` | the coroutine to run |
| `?` | `A...` | |
### `coroutine.running` _function_
```nupp
local running: function(): (thread?, boolean)
```
Returns the coroutine that is running.
#### Returns
| Type | Description |
| --- | --- |
| `thread?` | the running coroutine |
| `boolean` | whether that is the main coroutine |
### `coroutine.status` _function_
```nupp
local status: function(co: thread): string
```
Returns the state of `co`: "running", "suspended", "normal" for one that resumed
another coroutine, or "dead".
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `co` | `thread` | the coroutine to inspect |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the state name |
### `coroutine.wrap` _function_
```nupp
local wrap: function(f: any): any
```
Creates a coroutine and returns a function that resumes it, passing along its
own arguments. Errors propagate to the caller instead of being returned as a
status.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `any` | the function to run inside the coroutine |
#### Returns
| Type | Description |
| --- | --- |
| `any` | a function that resumes the coroutine |
### `coroutine.yield` _function_
```nupp
local yield: function(Y...): ...any
```
Suspends the running coroutine. The arguments become the results of the `resume`
that started it.
#### Type parameters
| Name | Description |
| --- | --- |
| `Y` | |
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `?` | `Y...` | |
## `bit`
### `bit.arshift` _function_
```nupp
local arshift: nosuspend function(x: number, n: number): integer
```
Shifts `x` right by `n` bits, copying the sign bit down.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to shift |
| `n` | `number` | how many bits to shift by, taken modulo 32 |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the shifted value |
### `bit.band` _function_
```nupp
local band: nosuspend function(...: number): integer
```
Returns the bitwise and of every argument.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `...` | `number` | the numbers to combine |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the combined value |
### `bit.bnot` _function_
```nupp
local bnot: nosuspend function(x: number): integer
```
Returns the bitwise complement of `x`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to complement |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the complement |
### `bit.bor` _function_
```nupp
local bor: nosuspend function(...: number): integer
```
Returns the bitwise or of every argument.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `...` | `number` | the numbers to combine |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the combined value |
### `bit.bswap` _function_
```nupp
local bswap: nosuspend function(x: number): integer
```
Swaps the byte order of `x`, converting between endiannesses.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to byte-swap |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the swapped value |
### `bit.bxor` _function_
```nupp
local bxor: nosuspend function(...: number): integer
```
Returns the bitwise exclusive or of every argument.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `...` | `number` | the numbers to combine |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the combined value |
### `bit.lshift` _function_
```nupp
local lshift: nosuspend function(x: number, n: number): integer
```
Shifts `x` left by `n` bits, filling with zeros.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to shift |
| `n` | `number` | how many bits to shift by, taken modulo 32 |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the shifted value |
### `bit.rol` _function_
```nupp
local rol: nosuspend function(x: number, n: number): integer
```
Rotates `x` left by `n` bits.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to rotate |
| `n` | `number` | how many bits to rotate by, taken modulo 32 |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the rotated value |
### `bit.ror` _function_
```nupp
local ror: nosuspend function(x: number, n: number): integer
```
Rotates `x` right by `n` bits.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to rotate |
| `n` | `number` | how many bits to rotate by, taken modulo 32 |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the rotated value |
### `bit.rshift` _function_
```nupp
local rshift: nosuspend function(x: number, n: number): integer
```
Shifts `x` right by `n` bits without sign extension.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to shift |
| `n` | `number` | how many bits to shift by, taken modulo 32 |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the shifted value |
### `bit.tobit` _function_
```nupp
local tobit: nosuspend function(x: number): integer
```
Normalizes `x` into the signed 32-bit integer range, wrapping around.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to normalize |
#### Returns
| Type | Description |
| --- | --- |
| `integer` | the normalized value |
### `bit.tohex` _function_
```nupp
local tohex: nosuspend function(x: number, n: number?): string
```
Returns `x` in hexadecimal, using `n` digits.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `x` | `number` | the number to convert |
| `n` | `number?` | how many digits to print, 8 by default; a negative count prints uppercase digits |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the hexadecimal text |
## `jit`
### `jit.attach` _function_
```nupp
local attach: function(callback: function(...: any), event: string?)
```
Adds or removes a handler for a compiler event, so a program can watch the JIT
as it works. Omitting `event` removes the handler.
The handler's own signature is decided by the event, which is why this one is
variadic:
* `"bc"`: `(func)`, once per function the VM records bytecode for. * `"trace"`:
`(what, tr, func, pc, otr, oex)`, where `what` is
`"start"`, `"stop"`, `"abort"`, `"flush"` or `"free"`. On
`"abort"`, `otr` is an error code to look up in
`require("jit.vmdef").traceerr` and `oex` is its argument; on
`"start"` for a side trace they are the parent trace and its exit.
* `"record"`: `(tr, func, pc, depth)`, per bytecode recorded. * `"texit"`:
`(tr, ex, ngpr, nfpr)`, per trace exit.
A handler runs inside the compiler, so it must not allocate heavily, raise, or
re-enter the VM in ways that would trigger further compilation. Dropping the
last reference to a handler does not detach it: hold onto it and pass it back
with no `event` to remove it.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `callback` | `function(...: any)` | the handler to add, or the one to remove |
| `event` | `string?` | which event to attach to, or nil to detach |
### `jit.flush` _function_
```nupp
local flush: function(f: any?, recursive: boolean?)
```
Flushes compiled code, for `f` or for the whole cache when it is omitted, so the
affected code is traced again from scratch. A trace number flushes that one
trace.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `any?` | the function to flush, a trace number, or nil for the whole cache |
| `recursive` | `boolean?` | whether to flush nested functions too |
### `jit.off` _function_
```nupp
local off: function(f: any?, recursive: boolean?)
```
Turns compilation off for `f`, or for the whole VM when it is omitted, leaving
already compiled code in place.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `any?` | the function to disable, or nil for the whole VM |
| `recursive` | `boolean?` | whether to apply the change to nested functions too |
### `jit.on` _function_
```nupp
local on: function(f: any?, recursive: boolean?)
```
Turns compilation on for `f`, or for the whole VM when it is omitted.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `any?` | the function to enable, or nil for the whole VM |
| `recursive` | `boolean?` | whether to apply the change to nested functions too |
### `jit.security` _function_
```nupp
local security: function(param: string): any
```
Reports how the VM was built for a security-relevant parameter, such as `"prng"`
or `"strhash"`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `param` | `string` | the parameter to report on |
#### Returns
| Type | Description |
| --- | --- |
| `any` | the setting in force |
### `jit.status` _function_
```nupp
local status: function(): (boolean, any)
```
Reports whether the compiler is enabled.
#### Returns
| Type | Description |
| --- | --- |
| `boolean` | whether compilation is currently on |
| `any` | the optimization flags in force, one per result |
### `jit.arch` _variable_
```nupp
local arch: string
```
The target architecture, such as "x64" or "arm64".
### `jit.opt` _variable_
```nupp
local opt: {start: function(...: any)}
```
The optimization submodule. `jit.opt.start` takes flags such as `"hotloop=10"`
or `"-fold"`, each as its own argument.
### `jit.os` _variable_
```nupp
local os: string
```
The operating system, such as "Linux", "OSX" or "Windows".
### `jit.version` _variable_
```nupp
local version: string
```
The LuaJIT version string, such as "LuaJIT 2.1.0".
### `jit.version_num` _variable_
```nupp
local version_num: number
```
The LuaJIT version as a number, where 2.1.0 reads as 20100.
## `debug`
### `debug.gethook` _function_
```nupp
local gethook: function(): any
```
Returns the hook currently installed.
#### Returns
| Type | Description |
| --- | --- |
| `any` | the hook function, its mask and its count |
### `debug.getinfo` _function_
```nupp
local getinfo: function(f: any, what: string?): any
```
Describes a function, or the activation record at a stack level.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `any` | the function to describe, or a stack level counted from here |
| `what` | `string?` | which fields to fill in, all of them by default |
#### Returns
| Type | Description |
| --- | --- |
| `any` | the description table, or nil when the level is out of range |
### `debug.getlocal` _function_
```nupp
local getlocal: function(level: any, idx: number): (string?, any)
```
Reads local variable `idx` of the function at a stack level.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `level` | `any` | the stack level, or a function to inspect |
| `idx` | `number` | the 1-based index of the local |
#### Returns
| Type | Description |
| --- | --- |
| `string?` | the variable's name, or nil past the last one |
| `any` | its current value |
### `debug.getmetatable` _function_
```nupp
local getmetatable: function(v: any): table?
```
Returns the metatable of `v`, ignoring any `__metatable` field.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `v` | `any` | the value to inspect |
#### Returns
| Type | Description |
| --- | --- |
| `table?` | the metatable, or nil when there is none |
### `debug.getregistry` _function_
```nupp
local getregistry: function(): table
```
Returns the registry, the table where C code anchors its references.
#### Returns
| Type | Description |
| --- | --- |
| `table` | the registry table |
### `debug.getupvalue` _function_
```nupp
local getupvalue: function(f: any, idx: number): (string?, any)
```
Reads upvalue `idx` of the function `f`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `any` | the function to inspect |
| `idx` | `number` | the 1-based index of the upvalue |
#### Returns
| Type | Description |
| --- | --- |
| `string?` | the upvalue's name, or nil past the last one |
| `any` | its current value |
### `debug.sethook` _function_
```nupp
local sethook: function(...: any)
```
Installs a debug hook: a function, a mask built from "c", "r" and "l", and an
optional instruction count.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `...` | `any` | the hook function, its mask, and the count |
### `debug.setlocal` _function_
```nupp
local setlocal: function(level: any, idx: number, v: any): string?
```
Assigns `v` to local variable `idx` at a stack level.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `level` | `any` | the stack level to write into |
| `idx` | `number` | the 1-based index of the local |
| `v` | `any` | the value to store |
#### Returns
| Type | Description |
| --- | --- |
| `string?` | the variable's name, or nil past the last one |
### `debug.setmetatable` _function_
```nupp
local setmetatable: function(v: any, mt: table?): any
```
Sets `v`'s metatable, ignoring any `__metatable` field.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `v` | `any` | the value to change |
| `mt` | `table?` | the new metatable, or nil to remove the current one |
#### Returns
| Type | Description |
| --- | --- |
| `any` | `v` |
### `debug.setupvalue` _function_
```nupp
local setupvalue: function(f: any, idx: number, v: any): string?
```
Assigns `v` to upvalue `idx` of the function `f`.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `any` | the function to modify |
| `idx` | `number` | the 1-based index of the upvalue |
| `v` | `any` | the value to store |
#### Returns
| Type | Description |
| --- | --- |
| `string?` | the upvalue's name, or nil past the last one |
### `debug.traceback` _function_
```nupp
local traceback: function(msg: any?, level: number?): string
```
Returns a traceback of the call stack, with `msg` at the front.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `msg` | `any?` | the message to prepend, returned as-is when not a string |
| `level` | `number?` | the stack level to start at, 1 by default |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the traceback text |
### `debug.upvaluejoin` _function_
```nupp
local upvaluejoin: function(f: any, idx: number, source: any, sourceIdx: number)
```
Makes one function's upvalue refer to the same lexical cell as another's.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `f` | `any` | the function whose upvalue is replaced |
| `idx` | `number` | its 1-based upvalue index |
| `source` | `any` | the function providing the cell |
| `sourceIdx` | `number` | its 1-based upvalue index |
## `ffi`
Declarations for LuaJIT's ffi module, loaded for `require("ffi")`.
Most C work in Nupp goes through `cdef` declarations and `struct`, which need
none of this. These are for the cases that stay explicitly at the machine level:
converting C strings back to Lua strings, bulk memory moves, casts, and loading
libraries by hand.
The names are the library's own, so they are never restyled.
### `ffi.ffi` _record_
```nupp
local record ffi
string: function(ptr: any, len: (integer | int64 | uint64)?): string
new: function(ct: any, ...: any): any
typeof: function(ct: any, ...: any): any
cast: function(ct: any, value: any): any
metatype: function(ct: any, mt: table): any
gc: function(obj: any, finalizer: any): any
istype: function(ct: any, obj: any): boolean
sizeof: function(ct: any, nelem: integer?): integer?
alignof: function(ct: any): integer
offsetof: function(ct: any, field: string): integer?
copy: function(borrows dst: any, borrows src: any, len: (integer | int64 | uint64)?)
fill: function(dst: any, len: integer | int64 | uint64, c: integer?)
cdef: function(def: string)
load: function(name: string, global: boolean?): any
abi: function(param: string): boolean
errno: function(newerr: integer?): integer
typeinfo: function(id: integer): any
C: any
os: string
arch: string
end
```
#### Methods
##### `string`
```nupp
string: function(ptr: any, len: (integer | int64 | uint64)?): string
```
Copies a C string (or `len` bytes) into a Lua string. A `size_t` read out
of C memory is a boxed length, and the call takes it as readily as a number.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `ptr` | `any` | |
| `len` | `(integer | int64 | uint64)?` | |
###### Returns
| Type | Description |
| --- | --- |
| `string` | |
##### `new`
```nupp
new: function(ct: any, ...: any): any
```
Allocates a cdata object of the given type.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `ct` | `any` | |
| `...` | `any` | |
###### Returns
| Type | Description |
| --- | --- |
| `any` | |
##### `typeof`
```nupp
typeof: function(ct: any, ...: any): any
```
Returns the ctype object for a C type declaration.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `ct` | `any` | |
| `...` | `any` | |
###### Returns
| Type | Description |
| --- | --- |
| `any` | |
##### `cast`
```nupp
cast: function(ct: any, value: any): any
```
Reinterprets a value as another C type.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `ct` | `any` | |
| `value` | `any` | |
###### Returns
| Type | Description |
| --- | --- |
| `any` | |
##### `metatype`
```nupp
metatype: function(ct: any, mt: table): any
```
Associates a metatable with a ctype; returns the ctype.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `ct` | `any` | |
| `mt` | `table` | |
###### Returns
| Type | Description |
| --- | --- |
| `any` | |
##### `gc`
```nupp
gc: function(obj: any, finalizer: any): any
```
Attaches a finalizer to a cdata object; returns the object.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `obj` | `any` | |
| `finalizer` | `any` | |
###### Returns
| Type | Description |
| --- | --- |
| `any` | |
##### `istype`
```nupp
istype: function(ct: any, obj: any): boolean
```
True when `obj` has the given ctype.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `ct` | `any` | |
| `obj` | `any` | |
###### Returns
| Type | Description |
| --- | --- |
| `boolean` | |
##### `sizeof`
```nupp
sizeof: function(ct: any, nelem: integer?): integer?
```
Size in bytes, or nil for incomplete types.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `ct` | `any` | |
| `nelem` | `integer?` | |
###### Returns
| Type | Description |
| --- | --- |
| `integer?` | |
##### `alignof`
```nupp
alignof: function(ct: any): integer
```
Alignment in bytes.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `ct` | `any` | |
###### Returns
| Type | Description |
| --- | --- |
| `integer` | |
##### `offsetof`
```nupp
offsetof: function(ct: any, field: string): integer?
```
Byte offset of a struct field.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `ct` | `any` | |
| `field` | `string` | |
###### Returns
| Type | Description |
| --- | --- |
| `integer?` | |
##### `copy`
```nupp
copy: function(borrows dst: any, borrows src: any, len: (integer | int64 | uint64)?)
```
Bulk copy between cdata (or from a Lua string).
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `borrows dst` | `any` | |
| `borrows src` | `any` | |
| `len` | `(integer | int64 | uint64)?` | |
##### `fill`
```nupp
fill: function(dst: any, len: integer | int64 | uint64, c: integer?)
```
Fills memory with a byte value (zero by default).
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `dst` | `any` | |
| `len` | `integer | int64 | uint64` | |
| `c` | `integer?` | |
##### `cdef`
```nupp
cdef: function(def: string)
```
Adds C declarations to the global C namespace.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `def` | `string` | |
##### `load`
```nupp
load: function(name: string, global: boolean?): any
```
Loads a shared library and returns its namespace.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `name` | `string` | |
| `global` | `boolean?` | |
###### Returns
| Type | Description |
| --- | --- |
| `any` | |
##### `abi`
```nupp
abi: function(param: string): boolean
```
True when the ABI parameter holds (e.g. "64bit", "le").
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `param` | `string` | |
###### Returns
| Type | Description |
| --- | --- |
| `boolean` | |
##### `errno`
```nupp
errno: function(newerr: integer?): integer
```
Reads, and optionally sets, the C errno.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `newerr` | `integer?` | |
###### Returns
| Type | Description |
| --- | --- |
| `integer` | |
##### `typeinfo`
```nupp
typeinfo: function(id: integer): any
```
Reads LuaJIT's own record of a declared C type. Internal to the implementation
rather than part of the documented FFI, but it is how a program can learn what a
cdef declared.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `id` | `integer` | |
###### Returns
| Type | Description |
| --- | --- |
| `any` | |
#### Fields
##### `C`
```nupp
C: any
```
The default C namespace: symbols in the running process.
##### `os`
```nupp
os: string
```
##### `arch`
```nupp
arch: string
```
## `string.buffer`
Declarations for LuaJIT's string.buffer module, loaded for
`require("string.buffer")`.
A buffer is a FIFO: the `put*` and `encode` methods append to the end, and the
`get*` and `decode` methods consume from the front. Methods chain;
`putcdata`, `ref`, and `reserve` sit at the FFI boundary.
Length with `#buf`, concatenation with `..`, and `tostring` are metamethods, so
they are not members of the record below; use `buf:tostring()`.
### `string.buffer.decode` _function_
```nupp
local decode: function(s: string): any
```
Deserializes a whole encoded string. Raises on malformed input, and also when
anything is left over after one top-level object.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `s` | `string` | the encoded bytes |
#### Returns
| Type | Description |
| --- | --- |
| `any` | the decoded value, of any supported type |
### `string.buffer.encode` _function_
```nupp
local encode: function(v: any): string
```
Serializes `v` to a string. Raises on unsupported types, circular references, and
nesting too deep to encode.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `v` | `any` | the value to serialize |
#### Returns
| Type | Description |
| --- | --- |
| `string` | the encoded bytes |
### `string.buffer.new` _constructor_
```nupp
local new: function(size: (integer | table)?, options: table?): Buffer
```
Creates a buffer. The options table may carry a `dict` array of string keys that
occur often and a `metatable` array of metatables, which the serializer encodes as
indexes; an encoder and its decoder must share them, and neither table may be
modified afterwards.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `size` | `(integer | table)?` | a minimum initial buffer size, or the options table when it is the only argument |
| `options` | `table?` | the serialization options |
#### Returns
| Type | Description |
| --- | --- |
| `Buffer` | the new buffer |
### `string.buffer.Buffer` _record_
```nupp
record Buffer
metamethod __len: function(self): integer
metamethod __concat: function(self, other: any): string
metamethod __tostring: function(self): string
put: function(exclusive b: Buffer, ...: any): Buffer borrows (b)
putf: function(exclusive b: Buffer, fmt: string, ...: any): Buffer borrows (b)
putcdata: function(exclusive b: Buffer, data: voidptr, len: integer): Buffer borrows (b)
set: function(exclusive b: Buffer, data: any, len: integer?): Buffer borrows (b)
get: function(exclusive b: Buffer, ...: integer?): (string,...string)
tostring: function(b: Buffer): string
reset: function(exclusive b: Buffer): Buffer borrows (b)
free: function(exclusive b: Buffer): Buffer borrows (b)
skip: function(exclusive b: Buffer, n: integer): Buffer borrows (b)
ref: function(borrows b: Buffer): (uint8[?] borrows (b), integer)
reserve: function(exclusive b: Buffer, size: integer): (uint8[?] borrows (b), integer)
commit: function(exclusive b: Buffer, used: integer): Buffer borrows (b)
encode: function(exclusive b: Buffer, obj: any): Buffer borrows (b)
decode: function(exclusive b: Buffer): any
end
```
A mutable, binary-transparent byte sequence. Methods with nothing else to return
hand back the buffer itself, so calls chain.
Exported, so code that passes buffers around can name the type: `function
render(out: string.buffer.Buffer): string.buffer.Buffer`.
#### Methods
##### `__len`
```nupp
__len: function(self): integer
```
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `?` | `self` | |
###### Returns
| Type | Description |
| --- | --- |
| `integer` | |
##### `__concat`
```nupp
__concat: function(self, other: any): string
```
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `?` | `self` | |
| `other` | `any` | |
###### Returns
| Type | Description |
| --- | --- |
| `string` | |
##### `__tostring`
```nupp
__tostring: function(self): string
```
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `?` | `self` | |
###### Returns
| Type | Description |
| --- | --- |
| `string` | |
##### `put`
```nupp
put: function(exclusive b: Buffer, ...: any): Buffer borrows (b)
```
Appends each argument: a string, a number, another buffer, or any object with a
`__tostring` metamethod.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive b` | `Buffer` | the buffer to append to |
| `...` | `any` | the values to append, in order |
###### Returns
| Type | Description |
| --- | --- |
| `Buffer borrows (b)` | `b` |
##### `putf`
```nupp
putf: function(exclusive b: Buffer, fmt: string, ...: any): Buffer borrows (b)
```
Appends the arguments formatted by `fmt`, which takes the same directives as
`string.format`.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive b` | `Buffer` | the buffer to append to |
| `fmt` | `string` | the format string |
| `...` | `any` | the values that the directives consume |
###### Returns
| Type | Description |
| --- | --- |
| `Buffer borrows (b)` | `b` |
##### `putcdata`
```nupp
putcdata: function(exclusive b: Buffer, data: voidptr, len: integer): Buffer borrows (b)
```
Appends `len` bytes read from the memory that `data` points to. The cdata object
has to be convertible to a pointer.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive b` | `Buffer` | the buffer to append to |
| `data` | `voidptr` | the memory to copy from |
| `len` | `integer` | how many bytes to copy |
###### Returns
| Type | Description |
| --- | --- |
| `Buffer borrows (b)` | `b` |
##### `set`
```nupp
set: function(exclusive b: Buffer, data: any, len: integer?): Buffer borrows (b)
```
Replaces the buffer contents with a reference to `data`, freeing any space
already allocated. Nothing is copied until the buffer is written to again, and
the reference keeps `data` alive meanwhile.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive b` | `Buffer` | the buffer to reset onto `data` |
| `data` | `any` | the string, or cdata pointer, to reference |
| `len` | `integer?` | how many bytes `data` holds, required for cdata |
###### Returns
| Type | Description |
| --- | --- |
| `Buffer borrows (b)` | `b` |
##### `get`
```nupp
get: function(exclusive b: Buffer, ...: integer?): (string,...string)
```
Consumes bytes from the front of the buffer and returns them. With no argument
the whole buffer is consumed; each further argument takes one more string, and a
nil argument takes whatever remains.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive b` | `Buffer` | the buffer to read from |
| `...` | `integer?` | how many bytes each returned string takes |
###### Returns
| Type | Description |
| --- | --- |
| `string` | one string per argument, or the whole buffer when given none |
##### `tostring`
```nupp
tostring: function(b: Buffer): string
```
Returns the buffer contents as a string, without consuming them.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `b` | `Buffer` | the buffer to read |
###### Returns
| Type | Description |
| --- | --- |
| `string` | the buffer contents |
##### `reset`
```nupp
reset: function(exclusive b: Buffer): Buffer borrows (b)
```
Empties the buffer, keeping the space it has already allocated so it can be
refilled without reallocating.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive b` | `Buffer` | the buffer to empty |
###### Returns
| Type | Description |
| --- | --- |
| `Buffer borrows (b)` | `b` |
##### `free`
```nupp
free: function(exclusive b: Buffer): Buffer borrows (b)
```
Frees the buffer space at once, leaving the object itself intact and empty. The
collector does this on its own, so it is only worth calling when the memory has
to go back immediately.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive b` | `Buffer` | the buffer to free |
###### Returns
| Type | Description |
| --- | --- |
| `Buffer borrows (b)` | `b` |
##### `skip`
```nupp
skip: function(exclusive b: Buffer, n: integer): Buffer borrows (b)
```
Consumes `n` bytes from the front of the buffer and discards them, stopping at
the end of the data.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive b` | `Buffer` | the buffer to skip in |
| `n` | `integer` | how many bytes to discard |
###### Returns
| Type | Description |
| --- | --- |
| `Buffer borrows (b)` | `b` |
##### `ref`
```nupp
ref: function(borrows b: Buffer): (uint8[?] borrows (b), integer)
```
Returns a pointer to the buffer data, for zero-copy reads and in-place writes.
The data is not zero-terminated, so the length has to travel with the pointer.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `borrows b` | `Buffer` | the buffer to point into |
###### Returns
| Type | Description |
| --- | --- |
| `uint8\[?\] borrows (b)` | the unconsumed data, as the zero-based `uint8_t *` view that bytewise reads and writes go through |
| `integer` | how many bytes are readable there |
##### `reserve`
```nupp
reserve: function(exclusive b: Buffer, size: integer): (uint8[?] borrows (b), integer)
```
Reserves at least `size` bytes of write space and returns a pointer to it. The
space is uninitialized, and joins the buffer data only once `commit` says how
much of it was written.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive b` | `Buffer` | the buffer to reserve space in |
| `size` | `integer` | how many bytes are needed at least |
###### Returns
| Type | Description |
| --- | --- |
| `uint8\[?\] borrows (b)` | the write space, as the zero-based `uint8_t *` view that bytewise writes go through |
| `integer` | how many bytes are actually available, at least `size` |
##### `commit`
```nupp
commit: function(exclusive b: Buffer, used: integer): Buffer borrows (b)
```
Appends the first `used` bytes of the space handed out by the last `reserve` to
the buffer data.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive b` | `Buffer` | the buffer that space was reserved in |
| `used` | `integer` | how many bytes were written |
###### Returns
| Type | Description |
| --- | --- |
| `Buffer borrows (b)` | `b` |
##### `encode`
```nupp
encode: function(exclusive b: Buffer, obj: any): Buffer borrows (b)
```
Serializes `obj` and appends the encoding to the buffer. Encodings concatenate,
so several objects can be streamed into one buffer.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive b` | `Buffer` | the buffer to append to |
| `obj` | `any` | the value to serialize |
###### Returns
| Type | Description |
| --- | --- |
| `Buffer borrows (b)` | `b` |
##### `decode`
```nupp
decode: function(exclusive b: Buffer): any
```
Deserializes one object from the front of the buffer, leaving any data after it
in place. Raises on malformed or truncated input.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive b` | `Buffer` | the buffer to read from |
###### Returns
| Type | Description |
| --- | --- |
| `any` | the decoded value, of any supported type |
## `jit.util`
Declarations for LuaJIT's jit.util module, loaded for `require("jit.util")`.
Not a field on `jit`: LuaJIT registers this under `package.loaded` only, so it
has to be require()d.
Everything here reads VM internals, meaning bytecode, IR, snapshots and machine code,
whose shape tracks the LuaJIT build rather than any stable contract, and an index
that does not exist answers nil rather than raising. Treat the results as
diagnostic output to print, not as data to compute with.
### `jit.util.JitUtil` _record_
```nupp
local record JitUtil
funcinfo: function(func: any, pc: integer?): {[string]: any}
funcbc: function(func: any, pc: integer): (integer?, integer?)
funck: function(func: any, idx: integer): any
funcuvname: function(func: any, idx: integer): string?
traceinfo: function(tr: integer): {[string]: any}?
traceir: function(tr: integer, idx: integer): (integer, integer, integer, integer, integer)
tracek: function(tr: integer, idx: integer): (any, integer, integer?)
tracesnap: function(tr: integer, sn: integer): {[string]: any}?
tracemc: function(tr: integer): (string?, integer?, integer?)
traceexitstub: function(tr: integer, exitno: integer): integer?
ircalladdr: function(idx: integer): integer
end
```
#### Methods
##### `funcinfo`
```nupp
funcinfo: function(func: any, pc: integer?): {[string]: any}
```
Describes a function, or the bytecode position `pc` inside it.
The two kinds of function answer with different keys, so read the one you want
only after checking it is there. A Lua function reports `source`, `loc`,
`linedefined`, `lastlinedefined`, `params`, `stackslots`, `upvalues`,
`bytecodes`, `gcconsts`, `nconsts`, `children`, `isvararg`, `proto`, and
`currentline` when `pc` is given. A builtin reports `ffid`, `addr` and
`upvalues`, and nothing else.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `func` | `any` | the function to describe |
| `pc` | `integer?` | the bytecode index to resolve `currentline` from |
###### Returns
| Type | Description |
| --- | --- |
| `{\[string\]: any}` | a freshly allocated description table |
##### `funcbc`
```nupp
funcbc: function(func: any, pc: integer): (integer?, integer?)
```
Reads one bytecode instruction.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `func` | `any` | the function to read from |
| `pc` | `integer` | the bytecode index, counting from 0 |
###### Returns
| Type | Description |
| --- | --- |
| `integer?` | the instruction word, or nil when `pc` is past the end |
| `integer?` | the opcode, an index into the packed `bcnames` of `require("jit.vmdef")` |
##### `funck`
```nupp
funck: function(func: any, idx: integer): any
```
Reads a constant from a function's constant table.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `func` | `any` | the function to read from |
| `idx` | `integer` | the constant index: non-negative for a number, negative for a garbage-collected constant |
###### Returns
| Type | Description |
| --- | --- |
| `any` | the constant, or nil when the index is out of range |
##### `funcuvname`
```nupp
funcuvname: function(func: any, idx: integer): string?
```
Names an upvalue.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `func` | `any` | the function to read from |
| `idx` | `integer` | the upvalue index, counting from 0 |
###### Returns
| Type | Description |
| --- | --- |
| `string?` | the name, or nil when the index is out of range |
##### `traceinfo`
```nupp
traceinfo: function(tr: integer): {[string]: any}?
```
Describes a compiled trace: its link, extent, exit count, and the machine code
it occupies.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `tr` | `integer` | the trace number |
###### Returns
| Type | Description |
| --- | --- |
| `{\[string\]: any}?` | the description table, or nil when no such trace exists |
##### `traceir`
```nupp
traceir: function(tr: integer, idx: integer): (integer, integer, integer, integer, integer)
```
Reads one IR instruction from a trace.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `tr` | `integer` | the trace number |
| `idx` | `integer` | the IR reference |
###### Returns
| Type | Description |
| --- | --- |
| `integer` | the IR mode, the opcode and type byte, the two operands, and the previous reference in the chain |
| `integer` | |
| `integer` | |
| `integer` | |
| `integer` | |
##### `tracek`
```nupp
tracek: function(tr: integer, idx: integer): (any, integer, integer?)
```
Reads a constant referenced by a trace's IR.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `tr` | `integer` | the trace number |
| `idx` | `integer` | the IR reference of the constant |
###### Returns
| Type | Description |
| --- | --- |
| `any` | the constant value |
| `integer` | its IR type |
| `integer?` | the stack slot it was loaded from, when there was one |
##### `tracesnap`
```nupp
tracesnap: function(tr: integer, sn: integer): {[string]: any}?
```
Reads a trace snapshot: the stack map an exit restores from.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `tr` | `integer` | the trace number |
| `sn` | `integer` | the snapshot index |
###### Returns
| Type | Description |
| --- | --- |
| `{\[string\]: any}?` | the snapshot table, or nil when the index is out of range |
##### `tracemc`
```nupp
tracemc: function(tr: integer): (string?, integer?, integer?)
```
Returns a trace's machine code.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `tr` | `integer` | the trace number |
###### Returns
| Type | Description |
| --- | --- |
| `string?` | the machine code as a byte string |
| `integer?` | the address it was assembled to run at |
| `integer?` | the loop offset within it |
##### `traceexitstub`
```nupp
traceexitstub: function(tr: integer, exitno: integer): integer?
```
Address of the exit stub for one of a trace's exits.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `tr` | `integer` | the trace number |
| `exitno` | `integer` | the exit number |
###### Returns
| Type | Description |
| --- | --- |
| `integer?` | the address, or nil when the exit does not exist |
##### `ircalladdr`
```nupp
ircalladdr: function(idx: integer): integer
```
Address of an IR call target, for naming a call in a disassembly.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `idx` | `integer` | the index into the IR call table, which `require("jit.vmdef").ircall` names |
###### Returns
| Type | Description |
| --- | --- |
| `integer` | the address |
## `jit.profile`
Declarations for LuaJIT's jit.profile module, loaded for
`require("jit.profile")`.
The low-level sampling profiler: a timer interrupt, a callback, and a stack
dumper. It samples and attributes; deciding what a report looks like is the
caller's job, which is why there is no report type here.
One profiler runs at a time, and `start` while one is running replaces it.
### `jit.profile.JitProfile` _record_
```nupp
local record JitProfile
start: function(mode: string, cb: function(thread: any, samples: integer, vmstate: string))
stop: function()
dumpstack: function(thread: any?, fmt: string, depth: integer): string
end
```
#### Methods
##### `start`
```nupp
start: function(mode: string, cb: function(thread: any, samples: integer, vmstate: string))
```
Starts sampling, calling `cb` for each batch of samples.
`mode` is a string of option characters:
* `"f"`: sample the function, `"l"` the line, `"z"` the zone (see
the bundled `jit.zone` module).
* `"i"`: sample every `n` milliseconds, 10 by default. Below
about 10 the timer starts taking real time away from the thread it
is measuring.
* `"r"`: report raw sample counts rather than accumulating. * `"v"`: report
the VM state.
The callback runs on the interrupted thread, so it must not allocate heavily or
raise; it is also the only place `dumpstack` sees the sampled stack. `vmstate`
is one character: `"N"` running compiled code, `"I"` interpreting, `"C"` in a C
function, `"G"` collecting, `"J"` compiling.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `mode` | `string` | the option string described above |
| `cb` | `function(thread: any, samples: integer, vmstate: string)` | receives the sampled thread, how many samples this batch stands for, and the VM state |
##### `stop`
```nupp
stop: function()
```
Stops the running profiler. Safe to call when none is running.
##### `dumpstack`
```nupp
dumpstack: function(thread: any?, fmt: string, depth: integer): string
```
Renders a sampled stack as text.
`fmt` is a template applied once per frame: `"p"` is the function, `"f"` its
name, `"F"` the name with its source, and `"l"` the source line. Anything else
is a literal, so the tail of the format is the separator between frames.
`"Z"` is not a frame at all: it stops the format there on the last frame, which
is how the separator is kept from trailing. `"lZ;"` is `a;b;c`, where `"l;"`
would be `a;b;c;`.
`depth` counts frames from the top; a negative count walks from the bottom
instead, which is the order a collapsed-stack profile wants. Frames the JIT
inlined into a trace are not there to walk, so a compiled call chain arrives
shorter than its source reads.
Meaningful only for the thread handed to a `start` callback, and only while that
callback is running.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `thread` | `any?` | the sampled thread; omit for the current one |
| `fmt` | `string` | the per-frame format described above |
| `depth` | `integer` | how many frames, negative to walk bottom-up |
###### Returns
| Type | Description |
| --- | --- |
| `string` | the rendered stack |
## `jit.zone`
Declarations for LuaJIT's jit.zone module, loaded for `require("jit.zone")`.
A hierarchical zone stack, which is what `jit.profile`'s `"z"` mode and
`dumpstack`'s `"Z"` frame format attribute samples to. Pushing names a region of
work; popping ends it.
The value is literally the stack: a plain table whose array part holds the pushed
names, with `flush` and `get` on it and `__call` doing the pushing and popping.
Reading the array directly is possible but not typed here, so it needs a cast.
The stock implementation does its table work whether or not a profiler is
listening, which makes an instrumented hot path pay for zones it is not being
measured with. `nupp.profile.zone` wraps this and gates it; prefer that over calling
this module directly.
### `jit.zone.Zone` _record_
```nupp
record Zone
metamethod __call: function(z: Zone, name: string?): string?
flush: function(z: Zone)
get: function(z: Zone): string?
end
```
The profiler zone stack. Callable: with a name it pushes, with no argument it pops
and returns the name it removed.
Exported, so code that holds the stack can name what it is holding.
#### Methods
##### `__call`
```nupp
__call: function(z: Zone, name: string?): string?
```
Pushes `name`, or pops and returns the innermost zone when `name` is omitted.
Popping an empty stack raises "empty zone stack".
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `z` | `Zone` | the zone stack |
| `name` | `string?` | the zone to push, or nil to pop |
###### Returns
| Type | Description |
| --- | --- |
| `string?` | the popped zone, when popping |
##### `flush`
```nupp
flush: function(z: Zone)
```
Discards every pushed zone, leaving the stack empty.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `z` | `Zone` | the zone stack |
##### `get`
```nupp
get: function(z: Zone): string?
```
Returns the innermost zone without popping it.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `z` | `Zone` | the zone stack |
###### Returns
| Type | Description |
| --- | --- |
| `string?` | the innermost zone, or nil when nothing is pushed |
## Types
The types the declarations above name in their signatures. They are written by the prelude rather than by a program, which is why they have no module of their own to be documented from.
### `DateFields` _interface_
```nupp
local interface DateFields
year: integer
month: integer
day: integer
hour: integer
min: integer
sec: integer
wday: integer
yday: integer
isdst: boolean
end
```
The fields `os.date("*t")` answers.
Every one is present, which is what separates this from the table `os.time` accepts:
there a partial civil time is completed for you, and here the platform has already
done it. `wday` counts from Sunday and `yday` from January 1st, both from 1.
#### Fields
##### `year`
```nupp
year: integer
```
The full year, not an offset from 1900.
##### `month`
```nupp
month: integer
```
The month, 1 through 12.
##### `day`
```nupp
day: integer
```
The day of the month, 1 through 31.
##### `hour`
```nupp
hour: integer
```
The hour, 0 through 23.
##### `min`
```nupp
min: integer
```
The minute, 0 through 59.
##### `sec`
```nupp
sec: integer
```
The second, 0 through 60, the last of which is a leap second.
##### `wday`
```nupp
wday: integer
```
The day of the week, 1 for Sunday.
##### `yday`
```nupp
yday: integer
```
The day of the year, 1 for January 1st.
##### `isdst`
```nupp
isdst: boolean
```
Whether daylight saving time is in effect where the time was interpreted.
### `LuaFile` _interface_
```nupp
local interface LuaFile
close: nosuspend function(self: LuaFile): (boolean?, string?)
flush: function(self: LuaFile): (boolean?, string?)
lines: function(self: LuaFile, ...: any): nosuspend function(): any
read: function(self: LuaFile, ...: any): any
seek: function(self: LuaFile, whence: string?, offset: number?): (number?, string?)
setvbuf: function(self: LuaFile, mode: string, size: number?): (boolean?, string?)
write: function(self: LuaFile, ...: any): (LuaFile?, string?)
end
```
A Lua file handle. Ownership is attached by producers rather than this interface, so
standard streams and borrowed handles use the same type.
#### Methods
##### `close`
```nupp
close: nosuspend function(self: LuaFile): (boolean?, string?)
```
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `LuaFile` | |
###### Returns
| Type | Description |
| --- | --- |
| `boolean?` | |
| `string?` | |
##### `flush`
```nupp
flush: function(self: LuaFile): (boolean?, string?)
```
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `LuaFile` | |
###### Returns
| Type | Description |
| --- | --- |
| `boolean?` | |
| `string?` | |
##### `lines`
```nupp
lines: function(self: LuaFile, ...: any): nosuspend function(): any
```
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `LuaFile` | |
| `...` | `any` | |
###### Returns
| Type | Description |
| --- | --- |
| `nosuspend function(): any` | |
##### `read`
```nupp
read: function(self: LuaFile, ...: any): any
```
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `LuaFile` | |
| `...` | `any` | |
###### Returns
| Type | Description |
| --- | --- |
| `any` | |
##### `seek`
```nupp
seek: function(self: LuaFile, whence: string?, offset: number?): (number?, string?)
```
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `LuaFile` | |
| `whence` | `string?` | |
| `offset` | `number?` | |
###### Returns
| Type | Description |
| --- | --- |
| `number?` | |
| `string?` | |
##### `setvbuf`
```nupp
setvbuf: function(self: LuaFile, mode: string, size: number?): (boolean?, string?)
```
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `LuaFile` | |
| `mode` | `string` | |
| `size` | `number?` | |
###### Returns
| Type | Description |
| --- | --- |
| `boolean?` | |
| `string?` | |
##### `write`
```nupp
write: function(self: LuaFile, ...: any): (LuaFile?, string?)
```
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `LuaFile` | |
| `...` | `any` | |
###### Returns
| Type | Description |
| --- | --- |
| `LuaFile?` | |
| `string?` | |
## Reflection
What the compiler hands a program about a reified `struct`'s memory. `layoutof` answers with a [](Layout); semantic descriptors instead live with the callable `nupp.reflect` namespace. Layout types sit apart from the types above because reading them is metaprogramming rather than calling a library.
### `Layout` _interface_
```nupp
local interface Layout
name: string
size: integer
alignment: integer
fingerprint: string
fields: {LayoutField}
end
```
How a reified `struct` is laid out, as `layoutof` answers it.
Every number here is this platform's: sizes and offsets come from the FFI at load
rather than being baked in, because padding depends on the target. The fingerprint
therefore describes one platform's layout, which is what makes it usable for
detecting that saved data no longer matches.
#### Fields
##### `name`
```nupp
name: string
```
The declaration's name.
##### `size`
```nupp
size: integer
```
Bytes one instance occupies, padding included.
##### `alignment`
```nupp
alignment: integer
```
Required byte alignment of the complete struct.
##### `fingerprint`
```nupp
fingerprint: string
```
A canonical description of the fields and the size, for detecting drift between
the layout that wrote data and the layout reading it.
##### `fields`
```nupp
fields: {LayoutField}
```
The fields, in declaration order.
### `LayoutField` _interface_
```nupp
local interface LayoutField
name: string
ctype: string
offset: integer
size: integer
alignment: integer
padding: integer
end
```
One field of a reified `struct`, as it is actually laid out in C memory.
`size` is the field's own, from its C type. `padding` is what follows it before the
next field starts, or before the struct ends. They are separate because they answer
different questions: a reader wants the size, and a writer walking bytes has to know
about the gap. An `int8` before a `number` has size 1 and padding 7.
#### Fields
##### `name`
```nupp
name: string
```
The field's name, as the declaration spells it.
##### `ctype`
```nupp
ctype: string
```
Its C type, as the generated `ffi.typeof` spells it.
##### `offset`
```nupp
offset: integer
```
Bytes from the start of the struct.
##### `size`
```nupp
size: integer
```
Bytes the field itself occupies.
##### `alignment`
```nupp
alignment: integer
```
Required byte alignment of the field's C type.
##### `padding`
```nupp
padding: integer
```
Bytes of alignment padding after it.