Profile
After #594/#595, the frozen Temporal row is allocation-visible: makeTemporal, Object.ensureCold, GC-cell slab allocation/publication, malloc/free, and young collection are prominent sampled leaves. Every Temporal result currently performs three backing allocations: ObjectStorageState, the typed TemporalData record, and an ObjectColdState whose rare union carries only that record pointer. The 100-job row creates 47,788 GC cells and performs 80,824 backing allocations.
Scope
- Reuse the existing engine-owned
Object.private_dataword for the TemporalData pointer when the fresh wrapper has no competing internal/host payload, mirroring the Promise publication model. - Preserve the cold rare-state fallback and move the Temporal pointer there before C-API host private data or class metadata takes ownership of the hot word.
- Keep TemporalData allocation/finalization, backing accounting, GC reachability, relocation, OOM rollback, and exact brand semantics unchanged.
- Make the common published Temporal edge immutable and avoid a separate cold-sidecar allocation.
Acceptance
- C-API tests prove attaching host private data preserves Temporal state identity and behavior through the cold spill.
- GC/OOM/lifecycle and focused normal/TSan gates pass with zero leaks/races.
- Core and Intl402 Temporal subtrees remain exact.
- Exact-parent attribution reduces backing allocations by the expected per-object amount with matching checksum/GC-cell counts.
- Base and reversed frozen timings do not regress; full sharded units pass.
No-workaround rules
No untracked pointer, missing spill path, untraced GC edge, skipped finalizer/accounting, C-API refusal, broadened host-data aliasing, or process-global cache.