Releases: luau-lang/luau
0.614
What's changed?
Add program argument passing to scripts run using the Luau REPL! You can now pass --program-args
(or shorthand -a
) to the REPL which will treat all remaining arguments as arguments to pass to executed scripts. These values can be accessed through variadic argument expansion.
Native Code Generation
- Improve A64 lowering for vector operations by using vector instructions
- Resolve a developer reported divergence in VM and NCG code by fixing lowering issues in IR value location tracking!
New Type Solver
- Apply substitution to type families, and emit new constraints to reduce those further
- More progress on reducing comparison (
lt/le
) type families - Resolve two major sources of cyclic types in the new solver
- Turned internal compiler errors (ICEs) in the new subtyping algorithm into errors
Full Changelog: 0.613...0.614
0.613
What's changed?
- Compiler now targets bytecode version 5 by default, this includes support for vector type literals and sub/div opcodes with a constant on lhs
New Type Solver
- Normalizer type inhabitance check has been optimized
- Added ability to reduce cyclic
and
/or
type families
Native Code Generation
CodeGen::compile
now returns more specific causes of a code generation failure- Fixed linking issues on platforms that don't support unwind frame data registration
Full Changelog: 0.612...0.613
0.612
What's changed?
New solver
- Fix bugs where bidirectional type inference would fail to take effect
at the proper stage. - Improve inference of mutually recursive functions
- Fix crashes
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
Full Changelog: 0.611...0.612
0.611
What's changed?
Native Code Generation
- Fixed an UAF relating to reusing a hash key after a weak table has undergone some GC.
- Fixed a bounds check on arm64 to allow access to the last byte of a buffer.
New Type Solver
- Type states now preserves error-suppression, i.e.
local x: any = 5
andx.foo
does not error. - Made error-suppression logic in subtyping more accurate.
- Subtyping now knows how to reduce type families.
- Fixed function call overload resolution so that the return type resolves to the correct overload.
- Fixed a case where we attempted to reduce irreducible type families a few too many times, leading to duplicate errors.
- Type checker needs to type check annotations in function signatures to be able to report errors relating to those annotations.
- Fixed an UAF from a pointer to stack-allocated data in Subtyping's
explainReasonings
.
Nonstrict Type Checker
- Fixed a crash when calling a checked function of the form
math.abs
with an incorrect argument type. - Fixed a crash when calling a checked function with a number of arguments that did not exactly match the number of parameters required.
Internal Contributors
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
0.610
What's changed?
- Check interrupt handler inside the pattern match engine to eliminate potential for programs to hang during string library function execution.
- Allow iteration over table properties to pass the old type solver.
Native Code Generation
- Use in-place memory operands for math library operations on x64.
- Replace opaque bools with separate enum classes in IrDump to improve code maintainability.
- Translate operations on inferred vectors to IR.
- Enable support for debugging native-compiled functions in Roblox Studio.
New Type Solver
- Rework type inference for boolean and string literals to introduce bounded free types (bounded below by the singleton type, and above by the primitive type) and reworked primitive type constraint to decide which is the appropriate type for the literal.
- Introduce
FunctionCheckConstraint
to handle bidirectional typechecking for function calls, pushing the expected parameter types from the function onto the arguments. - Introduce
union
andintersect
type families to compute deferred simplified unions and intersections to be employed by the constraint generation logic in the new solver. - Implement support for expanding the domain of local types in
Unifier2
. - Rework type inference for iteration variables bound by for in loops to use local types.
- Change constraint blocking logic to use a set to prevent accidental re-blocking.
- Add logic to detect missing return statements in functions.
Internal Contributors
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Alexander McCord amccord@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Aviral Goel agoel@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
0.609
What's Changed
- Syntax for read-only and write-only properties is now parsed, but is not yet supported in typechecking
- Fixed missing include for
std::exchange
by @Gskartwii in #1147
New Type Solver
keyof
andrawkeyof
type operators have been updated to match final text of the RFC- Fixed issues with cyclic type families that were generated for mutable loop variables
Native Code Generation
- Fixed inference for number / vector operation that caused an unnecessary VM assist
New Contributors
- @Gskartwii made their first contribution in #1147
Full Changelog: 0.608...0.609
0.608
Old Solver:
- Fix a bug in the old solver where a user could use the keyword
typeof
as the name of a type alias. - Fix stringification of scientific notation to omit a trailing decimal place when not followed by a digit e.g.
1.e+20
->1e+20
New Solver
- Continuing work on the New non-strict mode
- Introduce
keyof
andrawkeyof
type function for acquiring the type of all keys in a table or class (luau-lang/rfcs#16)
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Alexander McCord amccord@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Aviral Goel agoel@roblox.com
Co-authored-by: Lily Brown lbrown@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
Co-authored-by: Vighnesh Vijay vvijay@roblox.com
0.607
What's changed?
- Fix up the
std::iterator_traits
definitions for some Luau data structures. - Replace some of the usages of
std::unordered_set
andstd::unordered_map
with Luau-provided data structures to increase performance and reduce overall number of heap allocations. - Update some of the documentation links in comments throughout the codebase to correctly point to the moved repository.
- Expanded JSON encoder for AST to support singleton types.
- Fixed a bug in
luau-analyze
where exceptions in the last module being checked during multithreaded analysis would not be rethrown.
New type solver
- Introduce a
refine
type family to handle deferred refinements during type inference, replacing the oldRefineConstraint
. - Continued work on the implementation of type states, fixing some known bugs/blockers.
- Added support for variadic functions in new non-strict mode, enabling broader support for builtins and the Roblox API.
Internal Contributors
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Alexander McCord amccord@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
0.606
New Solver
- Improvements to data flow analysis
Native Code Generation
- Block limit is now per-function instead of per-module
Full Changelog: 0.605...0.606
0.605
What's Changed
- Include module name for definitions files by @JohnnyMorganz in #861
- Add SUBRK and DIVRK bytecode instructions to bytecode v5 by @zeux in #1115
- Added
--vector-lib
,--vector-ctor
and--vector-type
options to luau-compile to support code with vectors - Experimental implementation of Require by String with Relative Paths and Require by String with Aliases RFCs with support for
paths
andaliases
arrays in .luaurc file. This implementation is under an experimental flag and will be finalized in the upcoming releases.
New Solver
- Correctness fixes to subtyping
- Improvements to dataflow analysis
Native Code Generation
- Added bytecode analysis pass to predict type tags used in operations
- Fixed rare cases of numerical loops being generated without an interrupt instruction
- Restored optimization data propagation into the linear block
- Duplicate buffer length checks are optimized away
Miscellaneous
- Small performance improvements to new non-strict mode
- Introduced more scripts for fuzzing Luau and processing the results, including fuzzer build support for CMake
New Contributors
- @WheretIB made their first contribution in #1119
- @menarulalam made their first contribution in #1123
Full Changelog: 0.604...0.605