Documentation
¶
Overview ¶
Package lua provides a VM and compiler for Lua in Go.
Index ¶
- Constants
- Variables
- func ConfigureErrorMetadataExtractor(extractor ErrorMetadataExtractor)
- func IsErrorKind(err error, kind Kind) bool
- func IsIntegerValue(v LNumber) bool
- func LVAsBool(v LValue) bool
- func LVAsString(v LValue) string
- func LVCanConvToString(v LValue) bool
- func LVIsFalse(v LValue) bool
- func OpenBase(L *LState) int
- func OpenCoroutine(L *LState) int
- func OpenDebug(L *LState) int
- func OpenErrors(L *LState) int
- func OpenMath(L *LState) int
- func OpenPackage(L *LState) int
- func OpenString(L *LState) int
- func OpenTable(L *LState) int
- func OpenUtf8(L *LState) int
- func RegisterErrorMetatable(L *LState)
- func ReleaseSpawnRequest(sr *SpawnRequest)
- func SetErrorMetadataExtractor(extractor ErrorMetadataExtractor)
- func SetErrorMetatable(L *LState, e *Error)
- func TypeEquals(a, b *LType) bool
- func TypeIsSubtype(a, b *LType) bool
- func UpvalueIndex(i int) int
- type ApiError
- type ApiErrorType
- type CompileError
- type CompileOptions
- type DbgCall
- type DbgLocalInfo
- type Debug
- type Error
- func AsError(v LValue) (*Error, bool)
- func GetError(err error) *Error
- func NewError(message string) *Error
- func NewErrorf(format string, args ...any) *Error
- func NewLuaError(L *LState, message string) *Error
- func WrapError(err error, context string) *Error
- func WrapErrorWithLua(l *LState, err error, context string) *Error
- func WrapErrorWithMetadata(err error, context string, extractor ErrorMetadataExtractor) *Error
- func (e *Error) Details() map[string]any
- func (e *Error) Error() string
- func (e *Error) Kind() Kind
- func (e *Error) Retryable() Ternary
- func (e *Error) Stack() string
- func (e *Error) String() string
- func (e *Error) Type() LValueType
- func (e *Error) Unwrap() error
- func (e *Error) WithContext(ctx string) *Error
- func (e *Error) WithDetails(d map[string]any) *Error
- func (e *Error) WithKind(k Kind) *Error
- func (e *Error) WithRetryable(r bool) *Error
- type ErrorMetadata
- type ErrorMetadataExtractor
- type FunctionProto
- func Compile(chunk []ast.Stmt, name string) (proto *FunctionProto, err error)
- func CompileReader(reader io.Reader, name string) (*FunctionProto, error)
- func CompileString(source, name string) (*FunctionProto, error)
- func CompileWithOptions(chunk []ast.Stmt, name string, opts CompileOptions) (proto *FunctionProto, err error)
- type Global
- type Kind
- type LBool
- type LFunction
- type LGContinuation
- type LGFunction
- type LGoFunc
- type LInteger
- type LNilType
- type LNumber
- type LState
- func (ls *LState) ArgError(n int, message string)
- func (ls *LState) Call(nargs, nret int)
- func (ls *LState) CallByParam(cp P, args ...LValue) error
- func (ls *LState) CallK(nargs, nret int, cont LGContinuation, ctx any)
- func (ls *LState) CallMeta(obj LValue, event string) LValue
- func (ls *LState) CheckAny(n int) LValue
- func (ls *LState) CheckBool(n int) bool
- func (ls *LState) CheckFunction(n int) *LFunction
- func (ls *LState) CheckInt(n int) int
- func (ls *LState) CheckInt64(n int) int64
- func (ls *LState) CheckNumber(n int) LNumber
- func (ls *LState) CheckOption(n int, options []string) int
- func (ls *LState) CheckString(n int) string
- func (ls *LState) CheckTable(n int) *LTable
- func (ls *LState) CheckThread(n int) *LState
- func (ls *LState) CheckType(n int, typ LValueType)
- func (ls *LState) CheckTypes(n int, typs ...LValueType)
- func (ls *LState) CheckUserData(n int) *LUserData
- func (ls *LState) Close()
- func (ls *LState) Concat(values ...LValue) string
- func (ls *LState) Context() context.Context
- func (ls *LState) CreateTable(acap, hcap int) *LTable
- func (ls *LState) DoFile(path string) error
- func (ls *LState) DoString(source string) error
- func (ls *LState) Equal(lhs, rhs LValue) bool
- func (ls *LState) Error(lv LValue, level int)
- func (ls *LState) FindTable(obj *LTable, n string, size int) LValue
- func (ls *LState) ForEach(tb *LTable, cb func(LValue, LValue))
- func (ls *LState) GPCall(fn LGFunction, data LValue) error
- func (ls *LState) Get(idx int) LValue
- func (ls *LState) GetField(obj LValue, skey string) LValue
- func (ls *LState) GetGlobal(name string) LValue
- func (ls *LState) GetInfo(what string, dbg *Debug, fn LValue) (LValue, error)
- func (ls *LState) GetLocal(dbg *Debug, no int) (string, LValue)
- func (ls *LState) GetMetaField(obj LValue, event string) LValue
- func (ls *LState) GetMetatable(obj LValue) LValue
- func (ls *LState) GetStack(level int) (*Debug, bool)
- func (ls *LState) GetTable(obj LValue, key LValue) LValue
- func (ls *LState) GetTop() int
- func (ls *LState) GetTypeMetatable(typ string) LValue
- func (ls *LState) GetUpvalue(fn *LFunction, no int) (string, LValue)
- func (ls *LState) Insert(value LValue, index int)
- func (ls *LState) IsClosed() bool
- func (ls *LState) LessThan(lhs, rhs LValue) bool
- func (ls *LState) Load(reader io.Reader, name string) (*LFunction, error)
- func (ls *LState) LoadFile(path string) (*LFunction, error)
- func (ls *LState) LoadProto(proto *FunctionProto) *LFunction
- func (ls *LState) LoadString(source string) (*LFunction, error)
- func (ls *LState) NewClosure(fn LGFunction, upvalues ...LValue) *LFunction
- func (ls *LState) NewFunction(fn LGFunction) *LFunction
- func (ls *LState) NewFunctionFromProto(proto *FunctionProto) *LFunction
- func (ls *LState) NewTable() *LTable
- func (ls *LState) NewThread() (*LState, context.CancelFunc)
- func (ls *LState) NewThreadWithContext(ctx context.Context) *LState
- func (ls *LState) NewTypeMetatable(typ string) *LTable
- func (ls *LState) NewUserData() *LUserData
- func (ls *LState) Next(tb *LTable, key LValue) (LValue, LValue)
- func (ls *LState) ObjLen(v1 LValue) int
- func (ls *LState) OpenLibs()
- func (ls *LState) OptBool(n int, d bool) bool
- func (ls *LState) OptFunction(n int, d *LFunction) *LFunction
- func (ls *LState) OptInt(n int, d int) int
- func (ls *LState) OptInt64(n int, d int64) int64
- func (ls *LState) OptNumber(n int, d LNumber) LNumber
- func (ls *LState) OptString(n int, d string) string
- func (ls *LState) OptTable(n int, d *LTable) *LTable
- func (ls *LState) OptUserData(n int, d *LUserData) *LUserData
- func (ls *LState) PCall(nargs, nret int, errfunc *LFunction) (err error)
- func (ls *LState) Pop(n int)
- func (ls *LState) PreloadModule(name string, loader LGFunction)
- func (ls *LState) Push(value LValue)
- func (ls *LState) RaiseError(format string, args ...any)
- func (ls *LState) RawEqual(lhs, rhs LValue) bool
- func (ls *LState) RawGet(tb *LTable, key LValue) LValue
- func (ls *LState) RawGetInt(tb *LTable, key int) LValue
- func (ls *LState) RawSet(tb *LTable, key LValue, value LValue)
- func (ls *LState) RawSetInt(tb *LTable, key int, value LValue)
- func (ls *LState) Register(name string, fn LGFunction)
- func (ls *LState) RegisterGoModule(name string, funcs map[string]LGoFunc) LValue
- func (ls *LState) RegisterModule(name string, funcs map[string]LGFunction) LValue
- func (ls *LState) Remove(index int)
- func (ls *LState) RemoveContext() context.Context
- func (ls *LState) Replace(idx int, value LValue)
- func (ls *LState) Resume(th *LState, fn *LFunction, args ...LValue) (ResumeState, []LValue, error)
- func (ls *LState) ResumeInto(th *LState, fn *LFunction, retBuf []LValue, args ...LValue) (ResumeState, []LValue, error)
- func (ls *LState) SetContext(ctx context.Context)
- func (ls *LState) SetField(obj LValue, key string, value LValue)
- func (ls *LState) SetFuncs(tb *LTable, funcs map[string]LGFunction, upvalues ...LValue) *LTable
- func (ls *LState) SetGlobal(name string, value LValue)
- func (ls *LState) SetGoFuncs(tb *LTable, funcs map[string]LGoFunc) *LTable
- func (ls *LState) SetLocal(dbg *Debug, no int, lv LValue) string
- func (ls *LState) SetMetatable(obj LValue, mt LValue)
- func (ls *LState) SetTable(obj LValue, key LValue, value LValue)
- func (ls *LState) SetTop(idx int)
- func (ls *LState) SetUpvalue(fn *LFunction, no int, lv LValue) string
- func (ls *LState) Status(th *LState) string
- func (ls *LState) String() string
- func (ls *LState) ToBool(n int) bool
- func (ls *LState) ToFunction(n int) *LFunction
- func (ls *LState) ToInt(n int) int
- func (ls *LState) ToInt64(n int) int64
- func (ls *LState) ToNumber(n int) LNumber
- func (ls *LState) ToString(n int) string
- func (ls *LState) ToStringMeta(lv LValue) LValue
- func (ls *LState) ToTable(n int) *LTable
- func (ls *LState) ToThread(n int) *LState
- func (ls *LState) ToUserData(n int) *LUserData
- func (ls *LState) Type() LValueType
- func (ls *LState) TypeError(n int, typ LValueType)
- func (ls *LState) Where(level int) string
- func (ls *LState) XMoveTo(other *LState, n int)
- func (ls *LState) Yield(values ...LValue) int
- type LString
- type LTable
- func (tb *LTable) Append(value LValue) bool
- func (tb *LTable) ForEach(cb func(LValue, LValue))
- func (tb *LTable) Insert(i int, value LValue) bool
- func (tb *LTable) Len() int
- func (tb *LTable) MaxN() int
- func (tb *LTable) Next(key LValue) (LValue, LValue)
- func (tb *LTable) RawGet(key LValue) LValue
- func (tb *LTable) RawGetH(key LValue) LValue
- func (tb *LTable) RawGetInt(key int) LValue
- func (tb *LTable) RawGetString(key string) LValue
- func (tb *LTable) RawSet(key LValue, value LValue) bool
- func (tb *LTable) RawSetH(key LValue, value LValue) bool
- func (tb *LTable) RawSetInt(key int, value LValue) bool
- func (tb *LTable) RawSetString(key string, value LValue) bool
- func (tb *LTable) Remove(pos int) (LValue, bool)
- func (tb *LTable) String() string
- func (tb *LTable) Type() LValueType
- type LType
- type LUserData
- type LValue
- type LValueType
- type Options
- type P
- type ResumeState
- type SpawnRequest
- type StackFrame
- type StackTrace
- type Ternary
- type Upvalue
- type ValidationContext
- type ValidatorFunc
Constants ¶
const ( // BaseLibName is here for consistency; the base functions have no namespace/library. BaseLibName = "" // LoadLibName is here for consistency; the loading system has no namespace/library. LoadLibName = "package" // TabLibName is the name of the table Library. TabLibName = "table" // StringLibName is the name of the string Library. StringLibName = "string" // MathLibName is the name of the math Library. MathLibName = "math" // DebugLibName is the name of the debug Library. DebugLibName = "debug" // CoroutineLibName is the name of the coroutine Library. CoroutineLibName = "coroutine" // Utf8LibName is the name of the utf8 Library. Utf8LibName = "utf8" // ErrorsLibName is the name of the errors Library. ErrorsLibName = "errors" )
const ( OP_MOVE int = iota /* A B R(A) := R(B) */ OP_MOVEN /* A B R(A) := R(B); followed by R(C) MOVE ops */ OP_LOADK /* A Bx R(A) := Kst(Bx) */ OP_LOADBOOL /* A B C R(A) := (Bool)B; if (C) pc++ */ OP_LOADNIL /* A B R(A) := ... := R(B) := nil */ OP_GETUPVAL /* A B R(A) := UpValue[B] */ OP_GETGLOBAL /* A Bx R(A) := Gbl[Kst(Bx)] */ OP_GETTABLE /* A B C R(A) := R(B)[RK(C)] */ OP_GETTABLEKS /* A B C R(A) := R(B)[RK(C)] ; RK(C) is constant string */ OP_SETGLOBAL /* A Bx Gbl[Kst(Bx)] := R(A) */ OP_SETUPVAL /* A B UpValue[B] := R(A) */ OP_SETTABLE /* A B C R(A)[RK(B)] := RK(C) */ OP_SETTABLEKS /* A B C R(A)[RK(B)] := RK(C) ; RK(B) is constant string */ OP_NEWTABLE /* A B C R(A) := {} (size = BC) */ OP_SELF /* A B C R(A+1) := R(B); R(A) := R(B)[RK(C)] */ OP_ADD /* A B C R(A) := RK(B) + RK(C) */ OP_SUB /* A B C R(A) := RK(B) - RK(C) */ OP_MUL /* A B C R(A) := RK(B) * RK(C) */ OP_DIV /* A B C R(A) := RK(B) / RK(C) */ OP_MOD /* A B C R(A) := RK(B) % RK(C) */ OP_POW /* A B C R(A) := RK(B) ^ RK(C) */ OP_IDIV /* A B C R(A) := RK(B) // RK(C) */ OP_BAND /* A B C R(A) := RK(B) & RK(C) */ OP_BOR /* A B C R(A) := RK(B) | RK(C) */ OP_BXOR /* A B C R(A) := RK(B) ~ RK(C) */ OP_SHL /* A B C R(A) := RK(B) << RK(C) */ OP_SHR /* A B C R(A) := RK(B) >> RK(C) */ OP_UNM /* A B R(A) := -R(B) */ OP_BNOT /* A B R(A) := ~R(B) */ OP_NOT /* A B R(A) := not R(B) */ OP_LEN /* A B R(A) := length of R(B) */ OP_CONCAT /* A B C R(A) := R(B).. ... ..R(C) */ OP_JMP /* sBx pc+=sBx */ OP_EQ /* A B C if ((RK(B) == RK(C)) ~= A) then pc++ */ OP_LT /* A B C if ((RK(B) < RK(C)) ~= A) then pc++ */ OP_LE /* A B C if ((RK(B) <= RK(C)) ~= A) then pc++ */ OP_TEST /* A C if not (R(A) <=> C) then pc++ */ OP_TESTSET /* A B C if (R(B) <=> C) then R(A) := R(B) else pc++ */ OP_CALL /* A B C R(A) ... R(A+C-2) := R(A)(R(A+1) ... R(A+B-1)) */ OP_TAILCALL /* A B C return R(A)(R(A+1) ... R(A+B-1)) */ OP_RETURN /* A B return R(A) ... R(A+B-2) (see note) */ OP_FORLOOP /* A sBx R(A)+=R(A+2); if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/ OP_FORPREP /* A sBx R(A)-=R(A+2); pc+=sBx */ OP_TFORLOOP /* A C R(A+3) ... R(A+3+C) := R(A)(R(A+1) R(A+2)); if R(A+3) ~= nil then { pc++; R(A+2)=R(A+3); } */ OP_SETLIST /* A B C R(A)[(C-1)*FPF+i] := R(A+i) 1 <= i <= B */ OP_CLOSE /* A close all variables in the stack up to (>=) R(A)*/ OP_CLOSURE /* A Bx R(A) := closure(KPROTO[Bx] R(A) ... R(A+n)) */ OP_VARARG /* A B R(A) R(A+1) ... R(A+B-1) = vararg */ OP_NOP /* NOP */ OP_LOADTYPE /* A Bx R(A) := Type(Bx) (lookup by name) */ )
const EnvironIndex = -10001
const FramesPerSegment = 8
FramesPerSegment should be a power of 2 constant for performance reasons. It will allow the go compiler to change the divs and mods into bitshifts. Max is 256 due to current use of uint8 to count how many frames in a segment are used.
const GlobalsIndex = -10002
const LNumberBit = 64
const MultRet = -1
const PackageName = "GopherLua"
const PackageVersion = "0.2 Wippy Edition"
const RegistryIndex = -10000
const VarArgIsVarArg uint8 = 2
const Version = "Lua 5.3 - Wippy Modification"
Variables ¶
var ( LTypeNil = <ype{inner: typ.Nil, name: "nil"} LTypeBoolean = <ype{inner: typ.Boolean, name: "boolean"} LTypeNumber = <ype{inner: typ.Number, name: "number"} LTypeInteger = <ype{inner: typ.Integer, name: "integer"} LTypeString = <ype{inner: typ.String, name: "string"} LTypeAny = <ype{inner: typ.Any, name: "any"} LTypeUnknown = <ype{inner: typ.Unknown, name: "unknown"} LTypeNever = <ype{inner: typ.Never, name: "never"} )
Primitive type singletons - zero allocation for common types
var CallStackSize = 128
var DirSep string
var ExecDir = "!"
var FieldsPerFlush = 50
var IgMark = "-"
var LDir string // todo: drop it
var LFalse = LBool(false)
var LNil = LValue(&LNilType{})
var LTrue = LBool(true)
var MaxArrayIndex = 67108864
var MaxTableGetLoop = 100
var PathDefault string
var PathEnvVar = "LUA_PATH"
var PathMark = "?"
var PathSep = ";"
var RegistryGrowStep = 32
var RegistryMaxSize = 256 * 256
var RegistrySize = 256
Functions ¶
func ConfigureErrorMetadataExtractor ¶ added in v1.5.4
func ConfigureErrorMetadataExtractor(extractor ErrorMetadataExtractor)
ConfigureErrorMetadataExtractor sets the process-wide error metadata extractor once. Subsequent calls are ignored.
func IsErrorKind ¶
IsErrorKind checks if an error matches a specific kind.
func IsIntegerValue ¶
IsIntegerValue checks if the runtime LNumber value has no fractional part.
func LVAsString ¶
LVAsString returns string representation of a given LValue if the LValue is a string, number, or Error, otherwise an empty string.
func LVCanConvToString ¶
LVCanConvToString returns true if a given LValue is a string, number, or Error otherwise false.
func OpenCoroutine ¶
func OpenErrors ¶
OpenErrors registers the errors module and error metatable.
func OpenPackage ¶
func OpenString ¶
func RegisterErrorMetatable ¶
func RegisterErrorMetatable(L *LState)
RegisterErrorMetatable registers the cached error metatable for this LState. This must be called once per LState to enable error methods like :kind().
func ReleaseSpawnRequest ¶
func ReleaseSpawnRequest(sr *SpawnRequest)
ReleaseSpawnRequest returns a SpawnRequest to the pool.
func SetErrorMetadataExtractor ¶ added in v1.5.4
func SetErrorMetadataExtractor(extractor ErrorMetadataExtractor)
SetErrorMetadataExtractor overrides the process-wide extractor. This is primarily intended for tests.
func SetErrorMetatable ¶
SetErrorMetatable sets the error metatable on an Error value.
func TypeEquals ¶
TypeEquals checks structural equality of two types.
func TypeIsSubtype ¶
TypeIsSubtype checks if a is a subtype of b.
func UpvalueIndex ¶
Types ¶
type ApiError ¶
type ApiError struct {
Type ApiErrorType
Object LValue
StackTrace string
// Underlying error. This attribute is set only if the Type is ApiErrorFile or ApiErrorSyntax
Cause error
}
type ApiErrorType ¶
type ApiErrorType int
const ( ApiErrorSyntax ApiErrorType = iota ApiErrorFile ApiErrorRun ApiErrorError ApiErrorPanic )
type CompileError ¶
func (*CompileError) Error ¶
func (e *CompileError) Error() string
func (*CompileError) String ¶
func (e *CompileError) String() string
type CompileOptions ¶ added in v1.5.2
CompileOptions configures compile-time type resolution for type calls.
TypeInfo should contain the encoded manifest bytes. When provided, its type names are added to the compile-time type name set and stored on the proto. TypeNames can be used to supply additional compile-time type names directly.
type DbgLocalInfo ¶
type Error ¶
type Error struct {
Err error // Wrapped error (error chain)
Message string // Error message
LuaStack *StackTrace // Lua stack at wrap point
Context string // Context description
// contains filtered or unexported fields
}
Error is the unified error type for go-lua. It implements both error and LValue interfaces. Behaves like a string for concatenation and tostring().
func GetError ¶
GetError extracts a *Error from an error chain using errors.As. Returns nil if no *Error is found in the chain.
func NewLuaError ¶
NewLuaError creates an Error and sets up its metatable.
func WrapErrorWithLua ¶
WrapErrorWithLua wraps an error, captures Lua stack trace, and sets the error metatable.
func WrapErrorWithMetadata ¶ added in v1.5.4
func WrapErrorWithMetadata(err error, context string, extractor ErrorMetadataExtractor) *Error
WrapErrorWithMetadata wraps an error with an explicit metadata extractor.
func (*Error) Type ¶
func (e *Error) Type() LValueType
Type implements LValue - returns LTUserData.
func (*Error) WithContext ¶
WithContext adds context description.
func (*Error) WithDetails ¶
WithDetails sets structured metadata.
func (*Error) WithRetryable ¶
WithRetryable sets the retry status.
type ErrorMetadata ¶ added in v1.5.4
ErrorMetadata is portable metadata extracted from a Go error chain.
type ErrorMetadataExtractor ¶ added in v1.5.4
type ErrorMetadataExtractor func(err error) *ErrorMetadata
ErrorMetadataExtractor extracts metadata from an error chain.
type FunctionProto ¶
type FunctionProto struct {
SourceName string
LineDefined int
LastLineDefined int
NumUpvalues uint8
NumParameters uint8
IsVarArg uint8
NumUsedRegisters uint8
Code []uint32
Constants []LValue
FunctionPrototypes []*FunctionProto
DbgSourcePositions []int
DbgLocals []*DbgLocalInfo
DbgCalls []DbgCall
DbgUpvalues []string
// TypeInfo holds encoded type manifest for this module.
// Use types/io.EncodeManifest/DecodeManifest to work with this data.
// Stored on the root FunctionProto and propagated to nested functions.
TypeInfo []byte
// contains filtered or unexported fields
}
func CompileReader ¶
func CompileReader(reader io.Reader, name string) (*FunctionProto, error)
CompileReader compiles Lua source from a reader to bytecode.
func CompileString ¶
func CompileString(source, name string) (*FunctionProto, error)
CompileString compiles Lua source code to bytecode without requiring an LState. The returned FunctionProto can be reused across multiple LStates.
func CompileWithOptions ¶ added in v1.5.2
func CompileWithOptions(chunk []ast.Stmt, name string, opts CompileOptions) (proto *FunctionProto, err error)
CompileWithOptions compiles Lua source with compile-time type call resolution.
func (*FunctionProto) GetTypeInfo ¶
func (fp *FunctionProto) GetTypeInfo() []byte
GetTypeInfo returns the encoded type manifest bytes.
func (*FunctionProto) RebuildStringConstants ¶
func (fp *FunctionProto) RebuildStringConstants()
RebuildStringConstants rebuilds the stringConstants cache from Constants. This is needed after deserializing bytecode since stringConstants is not serialized. The stringConstants slice has the same length as Constants - each entry is either the string value (if Constants[i] is LString) or empty string (otherwise).
func (*FunctionProto) SetTypeInfo ¶
func (fp *FunctionProto) SetTypeInfo(data []byte)
SetTypeInfo sets the encoded type manifest bytes.
func (*FunctionProto) String ¶
func (fp *FunctionProto) String() string
type Kind ¶
type Kind string
Kind categorizes errors semantically.
func GetErrorKind ¶
GetErrorKind extracts the kind from an error.
type LFunction ¶
type LFunction struct {
IsG bool
Env *LTable
Proto *FunctionProto
GFunction LGFunction
Upvalues []*Upvalue
}
func (*LFunction) Type ¶
func (fn *LFunction) Type() LValueType
type LGContinuation ¶
type LGContinuation func(L *LState, ctx any, status ResumeState) int
LGContinuation is the type for Go function continuations after yield. ctx is user-defined context passed through yield, status is the resume result.
type LGFunction ¶
LGFunction is the Go function signature for Lua-callable functions.
type LGoFunc ¶
type LGoFunc LGFunction
LGoFunc is a stateless Go function that can be shared across all LStates. Unlike LFunction, it requires no per-state allocation and can be stored directly in tables or globals without wrapping.
Performance: LGoFunc avoids the LFunction allocation overhead and pointer indirection through Fn.GFunction. For modules that don't need upvalues or environments, using LGoFunc provides better performance.
TODO: Refactor all go-lua internal code to use LGoFunc natively: - Migrate internal libs (baselib, stringlib, mathlib, tablelib, etc.) to use LGoFunc - Simplify callFrame to primarily use GoFunc, remove Fn.IsG complexity - Update pushCallFrame, initCallFrame to assume GoFunc is the default - Remove legacy LFunction wrapping code and pinning state hacks - Update public API (SetGlobal, PreloadModule, etc.) to prefer LGoFunc This would eliminate the dual code paths in VM and simplify maintenance.
func (LGoFunc) Type ¶
func (gf LGoFunc) Type() LValueType
type LInteger ¶
type LInteger int64
func (LInteger) Type ¶
func (i LInteger) Type() LValueType
type LNilType ¶
type LNilType struct{}
func (*LNilType) Type ¶
func (nl *LNilType) Type() LValueType
type LNumber ¶
type LNumber float64
func LVAsNumber ¶
LVAsNumber tries to convert a given LValue to a number.
func (LNumber) Type ¶
func (nm LNumber) Type() LValueType
type LState ¶
type LState struct {
G *Global
Parent *LState
Env *LTable
Panic func(*LState)
Dead bool
Options Options
// contains filtered or unexported fields
}
func (*LState) CallK ¶
func (ls *LState) CallK(nargs, nret int, cont LGContinuation, ctx any)
CallK calls a function with a continuation for yield support. If the called function yields, the continuation will be called on resume instead of returning to the caller. The continuation receives the LState, user context, and resume status.
func (*LState) CheckFunction ¶
func (*LState) CheckInt64 ¶
func (*LState) CheckNumber ¶
func (*LState) CheckString ¶
func (*LState) CheckTable ¶
func (*LState) CheckThread ¶
func (*LState) CheckType ¶
func (ls *LState) CheckType(n int, typ LValueType)
func (*LState) CheckTypes ¶
func (ls *LState) CheckTypes(n int, typs ...LValueType)
func (*LState) CheckUserData ¶
func (*LState) Context ¶
Context returns the LState's context. To change the context, use WithContext.
func (*LState) CreateTable ¶
func (*LState) Error ¶
Error is equivalent to lua_error( http://www.lua.org/manual/5.1/manual.html#lua_error ).
func (*LState) GetMetatable ¶
func (*LState) GetTypeMetatable ¶
func (*LState) LoadProto ¶
func (ls *LState) LoadProto(proto *FunctionProto) *LFunction
LoadProto creates an LFunction from a precompiled FunctionProto. This is much faster than Load() since it skips parsing and compilation.
func (*LState) NewClosure ¶
func (ls *LState) NewClosure(fn LGFunction, upvalues ...LValue) *LFunction
func (*LState) NewFunction ¶
func (ls *LState) NewFunction(fn LGFunction) *LFunction
func (*LState) NewFunctionFromProto ¶
func (ls *LState) NewFunctionFromProto(proto *FunctionProto) *LFunction
func (*LState) NewThread ¶
func (ls *LState) NewThread() (*LState, context.CancelFunc)
NewThread creates a new coroutine thread with a cancellable context. Returns the thread and a cancel function that should be called when done.
func (*LState) NewThreadWithContext ¶
NewThreadWithContext returns a new LState with the given context. Pass nil for no context (faster execution without cancellation checks).
func (*LState) NewTypeMetatable ¶
func (*LState) NewUserData ¶
func (*LState) OpenLibs ¶
func (ls *LState) OpenLibs()
OpenLibs loads the built-in libraries. It is equivalent to running OpenLoad, then OpenBase, then iterating over the other OpenXXX functions in any order.
func (*LState) PreloadModule ¶
func (ls *LState) PreloadModule(name string, loader LGFunction)
PreloadModule sets a module loader to the package.preload table.
func (*LState) RaiseError ¶
RaiseError is equivalent to luaL_error( http://www.lua.org/manual/5.1/manual.html#luaL_error ).
func (*LState) Register ¶
func (ls *LState) Register(name string, fn LGFunction)
func (*LState) RegisterGoModule ¶
RegisterGoModule registers a module using LGoFunc functions. LGoFunc values are stored directly without wrapping.
func (*LState) RegisterModule ¶
func (ls *LState) RegisterModule(name string, funcs map[string]LGFunction) LValue
func (*LState) RemoveContext ¶
RemoveContext removes the context associated with this LState and returns this context.
func (*LState) ResumeInto ¶
func (ls *LState) ResumeInto(th *LState, fn *LFunction, retBuf []LValue, args ...LValue) (ResumeState, []LValue, error)
ResumeInto is like Resume but uses a pre-allocated buffer for return values. This avoids allocations in the hot path.
func (*LState) SetContext ¶
SetContext set a context ctx to this LState. The provided ctx must be non-nil.
func (*LState) SetGoFuncs ¶
SetGoFuncs sets LGoFunc values directly on the table.
func (*LState) SetMetatable ¶
func (*LState) ToFunction ¶
func (*LState) ToStringMeta ¶
ToStringMeta returns string representation of given LValue. This method calls the `__tostring` meta method if defined.
func (*LState) ToUserData ¶
func (*LState) Type ¶
func (ls *LState) Type() LValueType
func (*LState) TypeError ¶
func (ls *LState) TypeError(n int, typ LValueType)
type LString ¶
type LString string
func (LString) Type ¶
func (st LString) Type() LValueType
type LTable ¶
type LTable struct {
Metatable LValue
Immutable bool
Array []LValue
Dict map[LValue]LValue
Strdict map[string]LValue
Keys []LValue
K2i map[LValue]int
}
func CreateTable ¶
func (*LTable) ForEach ¶
ForEach iterates over this table of elements, yielding each in turn to a given function.
func (*LTable) Next ¶
Next is equivalent to lua_next ( http://www.lua.org/manual/5.1/manual.html#lua_next ).
func (*LTable) RawGet ¶
RawGet returns an LValue associated with a given key without __index metamethod.
func (*LTable) RawGetH ¶
RawGetH returns an LValue associated with a given key without __index metamethod.
func (*LTable) RawGetInt ¶
RawGetInt returns an LValue at position `key` without __index metamethod.
func (*LTable) RawGetString ¶
RawGetString returns an LValue associated with a given key without __index metamethod.
func (*LTable) RawSet ¶
RawSet sets a given LValue to a given index without the __newindex metamethod. It is recommended to use `RawSetString` or `RawSetInt` for performance if you already know the given LValue is a string or number.
func (*LTable) RawSetH ¶
RawSetH sets a given LValue to a given index without the __newindex metamethod. OPTIMIZED: No longer creates Keys/K2i or Dict until actually needed
func (*LTable) RawSetInt ¶
RawSetInt sets a given LValue at a position `key` without the __newindex metamethod.
func (*LTable) RawSetString ¶
RawSetString sets a given LValue to a given string index without the __newindex metamethod.
func (*LTable) Type ¶
func (tb *LTable) Type() LValueType
type LType ¶
type LType struct {
// contains filtered or unexported fields
}
LType is a runtime type value that can be used in Lua code. It wraps a typ.Type and implements the LValue interface. Types are first-class values: callable for validation, comparable, and support reflection via direct VM dispatch (no metatables).
func NewNamedLType ¶
NewNamedLType creates a new named LType.
func (*LType) KindString ¶
KindString returns a string representation of the type's kind.
func (*LType) Type ¶
func (lt *LType) Type() LValueType
type LUserData ¶
type LUserData struct {
Value interface{}
Metatable LValue
}
func (*LUserData) Type ¶
func (ud *LUserData) Type() LValueType
type LValue ¶
type LValue interface {
String() string
Type() LValueType
}
type LValueType ¶
type LValueType int
const ( LTNil LValueType = iota LTBool LTNumber LTInteger LTString LTFunction LTUserData LTThread LTTable LTChannel LTType )
func (LValueType) String ¶
func (vt LValueType) String() string
type Options ¶
type Options struct {
// Call stack size. This defaults to `lua.CallStackSize`.
CallStackSize int
// Data stack size. This defaults to `lua.RegistrySize`.
RegistrySize int
// Allow the registry to grow from the registry size specified up to a value of RegistryMaxSize. A value of 0
// indicates no growth is permitted. The registry will not shrink again after any growth.
RegistryMaxSize int
// If growth is enabled, step up by an additional `RegistryGrowStep` each time to avoid having to resize too often.
// This defaults to `lua.RegistryGrowStep`
RegistryGrowStep int
// Controls whether or not libraries are opened by default
SkipOpenLibs bool
// Tells whether a Go stacktrace should be included in a Lua stacktrace when panics occur.
IncludeGoStackTrace bool
// If `MinimizeStackMemory` is set, the call stack will be automatically grown or shrank up to a limit of
// `CallStackSize` in order to minimize memory usage. This does incur a slight performance penalty.
MinimizeStackMemory bool
}
Options is a configuration that is used to create a new LState.
type ResumeState ¶
type ResumeState int
const ( ResumeOK ResumeState = iota ResumeYield ResumeError )
type SpawnRequest ¶
type SpawnRequest struct {
Fn *LFunction
}
SpawnRequest is yielded by coroutine.spawn to signal the scheduler
func (*SpawnRequest) String ¶
func (s *SpawnRequest) String() string
func (*SpawnRequest) Type ¶
func (s *SpawnRequest) Type() LValueType
type StackFrame ¶
StackFrame represents a single frame in the Lua stack (for error reporting).
func (StackFrame) String ¶
func (sf StackFrame) String() string
type StackTrace ¶
type StackTrace struct {
ThreadID string
Frames []StackFrame
}
StackTrace represents a Lua stack trace.
func (StackTrace) String ¶
func (st StackTrace) String() string
type Ternary ¶
type Ternary int8
Ternary represents three-state logic for composable error handling.
type ValidationContext ¶
type ValidationContext struct {
// contains filtered or unexported fields
}
ValidationContext wraps validate.Registry for LValue validation.
func DefaultValidationContext ¶
func DefaultValidationContext() *ValidationContext
DefaultValidationContext returns context with built-in validators.
func NewValidationContext ¶
func NewValidationContext() *ValidationContext
NewValidationContext creates empty context.
func (*ValidationContext) RegisterValidator ¶
func (vc *ValidationContext) RegisterValidator(name string, fn ValidatorFunc)
RegisterValidator adds a validator that works with LValue.
Source Files
¶
- alloc.go
- auxlib.go
- baselib.go
- compile.go
- compile_options.go
- config.go
- coroutinelib.go
- debuglib.go
- error.go
- errorslib.go
- function.go
- linit.go
- loadlib.go
- ltype.go
- ltype_validate.go
- mathlib.go
- opcode.go
- package.go
- precompile.go
- registry.go
- state.go
- state_pool.go
- stringlib.go
- table.go
- tablelib.go
- typeinfo_runtime.go
- utf8lib.go
- utils.go
- value.go
- vm.go
Directories
¶
| Path | Synopsis |
|---|---|
|
compiler
|
|
|
ast
Package ast defines the abstract syntax tree for Lua source code.
|
Package ast defines the abstract syntax tree for Lua source code. |
|
bind
Package bind implements name resolution and symbol binding for Lua AST nodes.
|
Package bind implements name resolution and symbol binding for Lua AST nodes. |
|
bytecode
Package bytecode provides serialization and deserialization of compiled Lua bytecode.
|
Package bytecode provides serialization and deserialization of compiled Lua bytecode. |
|
cfg
Package cfg constructs control flow graphs from Lua AST nodes.
|
Package cfg constructs control flow graphs from Lua AST nodes. |
|
cfg/analysis
Package analysis provides pure graph analysis algorithms for CFGs.
|
Package analysis provides pure graph analysis algorithms for CFGs. |
|
cfg/extraction
Package extraction provides pure AST extraction functions for CFG construction.
|
Package extraction provides pure AST extraction functions for CFG construction. |
|
check
Package check implements a multi-phase, fixpoint-iterative type checking system for Lua.
|
Package check implements a multi-phase, fixpoint-iterative type checking system for Lua. |
|
check/api
Package api defines interfaces and types for the Lua type checker.
|
Package api defines interfaces and types for the Lua type checker. |
|
check/effects
Package effectops provides operations for function effect propagation.
|
Package effectops provides operations for function effect propagation. |
|
check/flowbuild
Package flowbuild implements flow constraint extraction from control flow graphs.
|
Package flowbuild implements flow constraint extraction from control flow graphs. |
|
check/flowbuild/assign
Package assign provides flow-sensitive assignment analysis for the type checker.
|
Package assign provides flow-sensitive assignment analysis for the type checker. |
|
check/flowbuild/cond
Package cond implements condition constraint extraction for the flow type system.
|
Package cond implements condition constraint extraction for the flow type system. |
|
check/flowbuild/constprop
Package constprop performs constant propagation for flow analysis.
|
Package constprop performs constant propagation for flow analysis. |
|
check/flowbuild/core
Package base provides shared context types for flowbuild operations.
|
Package base provides shared context types for flowbuild operations. |
|
check/flowbuild/decl
Package decl extracts type declarations from function parameters and locals.
|
Package decl extracts type declarations from function parameters and locals. |
|
check/flowbuild/guard
Package guard extracts type guard conditions from control flow branches.
|
Package guard extracts type guard conditions from control flow branches. |
|
check/flowbuild/keyscoll
Package keyscoll collects table keys from expressions for type inference.
|
Package keyscoll collects table keys from expressions for type inference. |
|
check/flowbuild/literal
Package literal handles literal expression type synthesis for flow analysis.
|
Package literal handles literal expression type synthesis for flow analysis. |
|
check/flowbuild/mutator
Package mutator extracts container mutation operations from call sites.
|
Package mutator extracts container mutation operations from call sites. |
|
check/flowbuild/numconst
Package numconst handles numeric constant analysis for type inference.
|
Package numconst handles numeric constant analysis for type inference. |
|
check/flowbuild/path
Package path constructs constraint paths from AST expressions.
|
Package path constructs constraint paths from AST expressions. |
|
check/flowbuild/predicate
Package predicate builds type predicates from comparison expressions.
|
Package predicate builds type predicates from comparison expressions. |
|
check/flowbuild/resolve
Package resolve provides symbol and type resolution utilities for flow constraint extraction.
|
Package resolve provides symbol and type resolution utilities for flow constraint extraction. |
|
check/flowbuild/returns
Package returns extracts return type information from function bodies.
|
Package returns extracts return type information from function bodies. |
|
check/flowbuild/sibling
Package sibling handles sibling function analysis in nested scopes.
|
Package sibling handles sibling function analysis in nested scopes. |
|
check/flowbuild/tblutil
Package tblutil provides utilities for table type analysis.
|
Package tblutil provides utilities for table type analysis. |
|
check/hooks
assign_check.go implements assignment type validation for the type checker.
|
assign_check.go implements assignment type validation for the type checker. |
|
check/infer/captured
Package captured computes captured variable types for nested functions.
|
Package captured computes captured variable types for nested functions. |
|
check/infer/interproc
Package interproc handles interprocedural analysis after flow solving.
|
Package interproc handles interprocedural analysis after flow solving. |
|
check/infer/nested
Package nestedinfer processes nested function definitions during type analysis.
|
Package nestedinfer processes nested function definitions during type analysis. |
|
check/infer/paramhints
Package paramhints infers parameter types from call site arguments.
|
Package paramhints infers parameter types from call site arguments. |
|
check/infer/return
Package infer infers function return types from body analysis.
|
Package infer infers function return types from body analysis. |
|
check/modules
Package modules handles module export type computation.
|
Package modules handles module export type computation. |
|
check/nested
Package nested handles nested function analysis coordination.
|
Package nested handles nested function analysis coordination. |
|
check/phase
Package phase implements individual analysis phases for type checking.
|
Package phase implements individual analysis phases for type checking. |
|
check/pipeline
This package handles post-analysis diagnostic operations:
|
This package handles post-analysis diagnostic operations: |
|
check/returns
Package returns provides interprocedural return type analysis.
|
Package returns provides interprocedural return type analysis. |
|
check/scope
Package scope provides lexical scope state for type checking.
|
Package scope provides lexical scope state for type checking. |
|
check/siblings
Package siblings manages sibling function type coordination.
|
Package siblings manages sibling function type coordination. |
|
check/store
Package store provides session state management for type checking.
|
Package store provides session state management for type checking. |
|
check/synth
Package synth implements type synthesis for Lua expressions.
|
Package synth implements type synthesis for Lua expressions. |
|
check/synth/intercept
Package intercept handles special-case type synthesis interceptions.
|
Package intercept handles special-case type synthesis interceptions. |
|
check/synth/ops
Package ops implements type synthesis operations for the type checker.
|
Package ops implements type synthesis operations for the type checker. |
|
check/synth/phase/core
Package shared provides shared utilities for synthesis phases.
|
Package shared provides shared utilities for synthesis phases. |
|
check/synth/phase/extract
Package extract handles expression extraction from CFG for synthesis.
|
Package extract handles expression extraction from CFG for synthesis. |
|
check/synth/phase/resolve
Package resolve performs final type resolution after synthesis.
|
Package resolve performs final type resolution after synthesis. |
|
check/synth/transform
Package transform provides type transformation operations.
|
Package transform provides type transformation operations. |
|
parse
Package parse implements lexical analysis and parsing for Lua source code.
|
Package parse implements lexical analysis and parsing for Lua source code. |
|
stdlib
Package stdlib provides type definitions for Lua's standard library.
|
Package stdlib provides type definitions for Lua's standard library. |
|
Package internal provides pure data structures for the type system.
|
Package internal provides pure data structures for the type system. |
|
Package lsp provides LSP query operations for the type system.
|
Package lsp provides LSP query operations for the type system. |
|
completion
Package completion provides code completion for LSP.
|
Package completion provides code completion for LSP. |
|
edit
Package edit provides text editing utilities for the language server.
|
Package edit provides text editing utilities for the language server. |
|
index
Package index provides per-function indexing for type checking results.
|
Package index provides per-function indexing for type checking results. |
|
refactor
Package refactor provides code refactoring operations for the language server.
|
Package refactor provides code refactoring operations for the language server. |
|
semantic
Package semantic provides semantic token analysis for syntax highlighting.
|
Package semantic provides semantic token analysis for syntax highlighting. |
|
signature
Package signature provides function signature help for the language server.
|
Package signature provides function signature help for the language server. |
|
Package pm provides Lua pattern matching functions for Go.
|
Package pm provides Lua pattern matching functions for Go. |
|
types
|
|
|
cfg
Package cfg provides control flow graph representation for dataflow analysis.
|
Package cfg provides control flow graph representation for dataflow analysis. |
|
constraint
Package constraint provides multi-path narrowing constraints for type refinement.
|
Package constraint provides multi-path narrowing constraints for type refinement. |
|
constraint/theory
Package theory provides modular constraint solving theories for SMT-style reasoning.
|
Package theory provides modular constraint solving theories for SMT-style reasoning. |
|
contract
Package contract provides function behavior specifications using Hoare-style contracts.
|
Package contract provides function behavior specifications using Hoare-style contracts. |
|
db
Package db provides a Salsa-style incremental computation database for efficient re-analysis when source files change.
|
Package db provides a Salsa-style incremental computation database for efficient re-analysis when source files change. |
|
diag
Package diag provides diagnostic reporting for the type checker.
|
Package diag provides diagnostic reporting for the type checker. |
|
effect
Effect label codecs for serialization and deserialization.
|
Effect label codecs for serialization and deserialization. |
|
flow
Package flow provides control flow type propagation and flow-sensitive analysis.
|
Package flow provides control flow type propagation and flow-sensitive analysis. |
|
flow/domain
Package domain provides abstract domain interfaces for constraint solving.
|
Package domain provides abstract domain interfaces for constraint solving. |
|
flow/join
Package join provides type joining operations for phi node merging.
|
Package join provides type joining operations for phi node merging. |
|
flow/numeric
domain.go implements the numeric subdomain for the flow solver's ProductDomain.
|
domain.go implements the numeric subdomain for the flow solver's ProductDomain. |
|
flow/pathkey
key.go provides path key construction and manipulation utilities.
|
key.go provides path key construction and manipulation utilities. |
|
flow/propagate
Package propagate computes type constraints at CFG points via forward propagation.
|
Package propagate computes type constraints at CFG points via forward propagation. |
|
io
Package io provides binary serialization and deserialization for Lua types.
|
Package io provides binary serialization and deserialization for Lua types. |
|
kind
Package kind defines type kind enumeration for efficient type discrimination.
|
Package kind defines type kind enumeration for efficient type discrimination. |
|
narrow
Package narrow provides type narrowing operations for control flow refinement.
|
Package narrow provides type narrowing operations for control flow refinement. |
|
query/core
Package core provides pure type inspection, query, and lookup operations for the Lua type system.
|
Package core provides pure type inspection, query, and lookup operations for the Lua type system. |
|
subtype
Package subtype provides subtype checking with seen-map cycle detection.
|
Package subtype provides subtype checking with seen-map cycle detection. |
|
typ
Package typ defines the core Type interface and type implementations.
|
Package typ defines the core Type interface and type implementations. |
|
typ/join
Package join provides type join operations for control flow merging.
|
Package join provides type join operations for control flow merging. |
|
typ/subst
Package subst provides type substitution operations for generics.
|
Package subst provides type substitution operations for generics. |
|
typ/union
Package union provides union type analysis operations.
|
Package union provides union type analysis operations. |
|
typ/unwrap
Package unwrap provides type unwrapping, extraction, and predicate operations.
|
Package unwrap provides type unwrapping, extraction, and predicate operations. |
|
Package validate provides validation for LValue types.
|
Package validate provides validation for LValue types. |