mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-22 05:59:31 +08:00
A record built from unchecked element reads can hold undefined in a field the checker calls present. Such a record kept its widened layout only in an inferred binding: an annotated parameter or return, or an unannotated return, converted it to the declared layout with a checked narrow, which throws a TypeError for a missing element where Node passes undefined through. Record values that flow between bindings and the parameters and results of functions and methods whose every call is visible now form flow classes. A class takes the widened layout, with the union of its members' optional fields, when it is closed: each value entering it is a fresh object literal or comes from a member, each use of a member reads or writes its fields, passes it to another member or only inspects it, and every member declares the same shape. Members then share one layout, so no conversion runs at the boundary and the record keeps its identity. A class that reaches other storage keeps the declared layout for every member, including the inferred bindings and the record parameters the analysis widened before. Converting there copied the object, so writes through a parameter or a pushed record did not reach the caller's object; such a literal now converts once where it is created.