Problem
The fixed-shape object-allocation quick loop still calls Interpreter.newObject() for every fresh object. That helper resolves %Object.prototype% by walking to the realm environment and taking its binding lock on every allocation, even though the intrinsic identity is cached and immutable after bootstrap.
A current symbolized object_churn profile on main shows Interpreter.objectProto / TLS and binding-lock work in the remaining hot path. This is general fixed-shape allocation overhead, not workload source specialization.
Parent: #62
Proposed slice
- Resolve the ordinary-object intrinsic prototype once when entering a validated fixed-shape allocation loop.
- Add a general object-allocation helper that accepts an already-resolved prototype.
- Preserve bootstrap/null-prototype semantics and the ordinary
newObject()path. - Keep the quick path disabled for shared/escaped frames exactly as today.
Acceptance criteria
- Focused VM tests prove the quick path still executes and preserves exact step accounting/checksums.
- A targeted test proves the pre-resolved helper installs the supplied prototype and does not re-read a shadowed global
Objectbinding. - Order-balanced fresh-process A/B on the exact
object_churnchecksum shows a repeatable improvement; reject and revert if it does not. - Full zig-js unit and benchmark-harness suites pass before merge.
- Commit references this issue and is pushed as a small conventional commit.