0.699
Immutable
release. Only release title and notes can be modified.
Hello all! Another week, another release!
Analysis
- Fixed
table.clonein 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.clonein 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 error, claiming you cannot index into a `*error-type* | ~nil`
local _ = value[k]
end
end
end- Fix the
getmetatabletype function in the new solver to accept*error-type*andtableas valid type inputs. - Changed how error reporting for invalid
for ... inloops 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 of the incorrect types,
-- now we claim that `my_iter` is of the incorrect type, which can be considered
-- true, but is less helpful.
for a, b in my_iter, my_state, first_index do
endRuntime
- Introduced
lua_rawgetptaggedandlua_rawsetptagged, as well as Lua 5.2+ compatibility macroslua_rawgetpandlua_rawsetp, to be able to perform lookups into tables using tagged or untaggedlightuserdatawithout additional calls and stack manipulation. This enables a more efficient lookup way forlightuserdatakeys similar to howlua_rawgetfieldandlua_rawgetiavoid extra operations for their corresponding types.
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Annie Tang annietang@roblox.com
Co-authored-by: Ariel Weiss arielweiss@roblox.com
Co-authored-by: Hunter Goldstein hgoldstein@roblox.com
Co-authored-by: Varun Saini vsaini@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com