Summary
Split from #532 after a post-change eight-lane CPU sample showed the remaining present-property waits are primarily mutators yielding while the concurrent marker holds Object.property_lock. traceObject currently retains that object-local lock while every captured slot/accessor edge enters the heap marker; those mark calls perform GC-header lookup and can wait on allocation metadata, unnecessarily extending the object critical section.
Parent collector work: #476. Related object-model scaling: #478 and #532.
Requirements
- Snapshot only a representation whose complete edge set is bounded and stable while
property_lockis held; release the lock before heap marking only after copying all values and the immutable Shape identity needed for diagnostics. - Keep external/growable slots, accessor maps, C-API custom-accessor maps, and all other mutable backing stores on their locked trace paths.
- Preserve the concurrent-mark insertion-barrier invariant: writes after the snapshot must shade the new target.
- Preserve moving-GC relocation and world-stopped tracing behavior.
- Do not weaken locks globally, add benchmark recognition, or touch stacks, queues, jobs, Promise/microtask, or Worker lifecycle code.
Acceptance
- Focused concurrent-mark witness proves inline named values remain live while peers update and transition objects.
- No-GIL TSan and threadfuzz remain clean.
- Full unit suite passes without leaks.
- Exact invocation attribution retains frozen shape-transition checksums and shows reduced present-property lock waiting/contention under concurrent tracing.
- Exact-parent Object/Array/Proxy test262 has zero regressions.
- Any performance statement is backed by exact-parent stable evidence; diagnostic sampling alone is not a claim.