Skip to content

Conversation

@andyfriesen
Copy link
Collaborator

@andyfriesen andyfriesen commented Dec 2, 2025

Hello!

This week, we've made a bunch of improvements to the performance and stability of the analysis system. We've also made some small improvements to inlining and native codegen.

Autocomplete

  • Suggest singleton string keys from indexers

General

  • Reduce stack utilization of the parser

Analysis

  • User-defined type functions don't need separate irreducible errors when they error.
  • Fix a performance problem that could occur when selecting an overload for a function call.
  • Fix a hang that could occur in function generalization.
  • Delete EqSat. It was a very promising experiment but it didn't work out.
  • Properly treat negation types as being contravariant in their operands. (ie if A <: B, then ~B <: ~A)
  • Add a new C++ utility function Frontend::parseType. This function allocates a TypeId from a string that contains a valid Luau type annotation.
  • Correctly infer the type of a property lookup on a table which contains an indexer which is a union of string singletons. (eg {["foo"|"bar"]: number})

VM

  • Reevaluate the inlining cost model using constant function arguments.
  • Constant-fold string.char and string.sub.

Native Codegen

  • Fix a perfermance regression that could happen when running out of registers.
  • 32-bit integer addition and subtraction using bit32 library can be performed by integer instructions without extra double conversions

Internal Contributors

Co-authored-by: Andy Friesen [email protected]
Co-authored-by: Ariel Weiss [email protected]
Co-authored-by: Hunter Goldstein [email protected]
Co-authored-by: Sora Kanosue [email protected]
Co-authored-by: Vyacheslav Egorov [email protected]

hgoldstein and others added 30 commits January 10, 2025 09:13
Note: Fixed conflicts by hand in:
- Analysis/src/ConstraintGenerator.cpp
- CodeGen/src/OptimizeConstProp.cpp
- VM/src/lmathlib.cpp
- tests/Conformance.test.cpp
a03c92095f6 #unflagged CLI-141149 Added lua_clonetable (#97902)
d66c43f36aa #flagged CLI-140903: Do not crash on duplicate keys in table literals (#97833)
8a2687f1690 #nonprod Luau: fix a test configuration issue breaking OSS CI. (#97878)
7add6d9dde9 #nojira CI-debugger revert #unflagged CLI-132461 Luau: refactor subtyping to also include the generic mapping it came up with. (#97872)
0c731fd3cc4 #flag-removal Clip `LuauNewSolverVisitErrorExprLvalues` (#96942)
2fe783b9615 #unflagged CLI-132461 Luau: refactor subtyping to also include the generic mapping it came up with. (#97803)
0cc41a0afae #unflagged CLI-141053 Luau buffer readbits/writebits implementation for big endian machines (#97826)
ae50bf04f99 #nonprod CLI-140027 Simplify require-by-string path resolution, fix bug when running CLI tools on unprefixed path (#97468)
77004599a6f #flag-removal Cleanup Luau VM and Compiler flags (#97799)
86777e269dd #flag-removal Remove LuauUserTypeFunPrintToError, LuauUserTypeFunNoExtraConstraint, LuauUserTypeFunUpdateAllEnvs, LuauUserTypeFunThreadBuffer and LuauUserTypeFunExportedAndLocal (#97624)
349b133fdc4 #nojira CI-debugger revert #unflagged CLI-132461 Luau: refactor subtyping to also include the generic mapping it came up with. (#97759)
2e820646ffa #flagged CLI-139615: Treat user defined type functions as opaque in eqSatSimplify (#96897)
c0845205e37 #flag-removal CLI-140688 Clean up `FFlagLuauIntersectNormalsNeedsToTrackResourceLimits` as `true`. (#97719)
3e07876a043 #flagged CLI-140571: Track interior free table types generated during constraint solving (#97498)
199b558dc36 #unflagged CLI-132461 Luau: refactor subtyping to also include the generic mapping it came up with. (#95646)
fd9255f62d3 #nonprod CLI-140762 unittest for fragment ac crash (#97669)
e9c710e017f #flag-removal FFlagLuauStoreCommentsForDefinitionFiles (#93359)
b184b940d55 CLI-140702 #unflagged Fix most clang-tidy warnings in TypeChecker2 (#97604)
1fc857f1bb3 CLI-140489 #unflagged Fix a potential hash collision bug in StringCache. (#97539)
58f62f900a2 #nonprod Some new unit testing macros for Luau tests. (#97336)
ab43a354b25 #flag-removal Remove LuauVectorMetatable and LuauVectorDefinitionsExtra (#97528)
c4c28694390 #flagged CLI-140485 Do not retain the Def/RefinementKey arenas when retainFullTypeGraphs is false (#97422)
This test fails due to a bad interaction when `FFlagLuauStoreCSTData` is
enabled, whilst `FFlagLexerFixInterpStringStart` is disabled.
The OSS test suite, when run with `--fflags=true`, enables all
flags starting with a `Luau` prefix, but does not enable any other flag.

To resolve this, we explicitly enable both fflags for the failing
interpolated string test cases. As a consequence, we technically lose
the check that these tests pass when all flags are disabled.
aatxe and others added 28 commits October 11, 2025 08:30
Hello all! Another week, another release!

* Fixed `table.clone` in the old solver to ensure intersections of tables were being entirely cloned: prior only the _first_ table in the intersection would be copied:
```
type FIRST = { some: string }
type SECOND = FIRST & { thing: string }
local b: SECOND
-- c's type used to be FIRST, but should be the full type of SECOND
local c = table.clone(b)
```
* Fixed `table.clone` in the old solver to be more permissive and treat a variadic return as having _at least_ one element. This works around some unfortunate behavior in the old solver version of nonstrict mode, see:
```
-- A.luau
--!nonstrict
return function()
    return {}
end
-- B.luau
local A = require("A")
-- This line would previously error as `A` has type `() -> (...any)`, so
-- we might not be providing enough parameters to `table.clone`.
local _ = table.clone(A())
```
* Fixed a bug in the new solver where error suppression was not kicking in for indexing, as in:
```
local function f(value: any)
    if value ~= nil then
        for k = 1, #value do
            -- Previously this would not error, claiming you cannot index into a `*error-type* | ~nil`
            local _ = value[k]
        end
    end
end
```
* Fix `getmetatable` in the new solver to accept `*error-type*` and `table` as valid type inputs.
* Changed how error reporting for invalid `for ... in` loops works: for now this may result in slightly worse error messages (see the example below), but should mean error suppression is more consistent going forward:
```
function my_iter(state: string, index: number)
    return state, index
end
local my_state = {}
local first_index = "first"
-- Prior we would claim `my_state` and `first_index` are the incorrect types,
-- now we claim that `my_iter` is of the incorrect type, which is still true
-- but less helpful.
for a, b in my_iter, my_state, first_index do
end
```

* Introduced `lua_rawgetptagged` and `lua_rawsetptagged`, as well as Lua 5.2+ compatibility macros `lua_rawgetp` and `lua_rawsetp`, to be able to perform lookups into tables using tagged or untagged `lightuserdata` without additional calls and stack manipulation. This enables a more efficient lookup way for `lightuserdata` keys similar to how `lua_rawgetfield` and `lua_rawgeti` avoid extra operations for their corresponding types.
@andyfriesen andyfriesen merged commit c836feb into master Dec 2, 2025
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants