Parent: #475 Related benchmark/evidence: #460
Problem
Intl.ListFormat validates type and style at construction but stores the normalized values in a hidden ordinary object. Every format, formatToParts, and resolvedOptions call rereads that bag, while formatting also rereads the hidden locale. The resolved formatter state is immutable and should not pay generic named-property synchronization on its hot path.
The existing representative_intl_list_format_parts boundary performs 6,400 warmed formatToParts calls and consumes every part type/value byte. Current zig-js and system JSC agree on checksum 515925585. Exact-parent zig-js attribution for one 100-job invocation is:
- property-lock acquisitions:
4,706,794 - backing allocations:
2,439,308/335,620,156bytes - current backing:
72,844,632bytes; peak:74,926,278bytes - GC cells:
1,390,458; collections:51
Single diagnostic samples were 479.7 ms in zig-js and 31.5 ms in system JSC; these are diagnostic only, not publication evidence.
Scope
- Publish locale, type, and style atomically into an object-owned immutable native record after observable option reads complete.
- Make
format,formatToParts, andresolvedOptionsconsume that record directly and use the native slot as the receiver brand. - Preserve GetOptionsObject behavior, option order/coercion, iterator acquisition/draining/closing, output and part metadata, subclasses, and error ordering.
- Account/finalize the record through the bounded backing allocator; cover OOM, bounded heap, moving GC, and concurrent read safety.
- Compare exact-parent timing and attribution at the frozen checksum.
Acceptance
- No hidden ordinary options bag remains on newly constructed ListFormat objects.
- Focused ListFormat/test262, Intl402, OOM, GC movement, concurrent read, TSan, and full unit gates pass.
- Exact-parent comparison reports checksum equality and quantified retained changes; retain only a real improvement.
- No ICU/system-JSC runtime dependency, global mutable cache, skipped observable hook, or repro-specific shortcut.