mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-27 06:43:19 +08:00
The native CLI built from main aborted on the record-boundaries and value-objects benchmarks with "a narrowed value does not have the type its narrowing proved". record-results.ts builds recordSet statements in a map callback whose value field is a recordGet literal. Converting that array into IrStmt[] chose the break/continue arm: the literal also fits the shorter varRef-like expression arms, so its conversion into IrExpr was ambiguous, and an ambiguous field conversion made widthLiftPlan drop every arm that needed it. The one arm left was break/continue, reached by dropping obj, shapeId, field and value. The record kept kind "recordSet" under the break/continue tag, so mapStmtChildren's narrowing guard aborted. IR record shapes keep the discriminant as a plain string, so a record's layout alone cannot pick its arm. When a record that carries a discriminated union's discriminant field fits several arms, widthLiftPlan now plans a route through every arm it converts into, selected at run time by the discriminant's value, as JavaScript does (a value no arm names throws the catchable TypeError). Conversions that resolved before are unchanged; the zero-cost gate shows identical IR, LLVM and executables for the benchmarks and the corpus, and the native CLI now compiles every benchmark workload.