Flip Intl, Temporal and %AsyncFromSyncIteratorPrototype% to builtin shapes#2597
Merged
Conversation
…hapes; escalate obsolete Generators flag The three remaining generator-emitted dictionary hosts whose members became expressible with Factory slots (sebastienros#2590): Intl (10 intrinsic refs + 2 functions), Temporal (9 intrinsic refs) and %AsyncFromSyncIteratorPrototype% (3 functions). Intl cold-start allocations drop ~1.1 KB per fresh-engine format call (-4.3%); engine construction is unaffected (hosts are lazy). Audited and skipped: RegExpConstructor (21 hand-rolled legacy accessors like $1-$9 would need instance slots; low value), JsSegments (per-call instance, no representative traffic). Math/JSON/Reflect/Atomics/Generator prototypes already use BuiltinShapeObject. Rider: ExperimentalFeature.Generators [Obsolete] escalated to error: true (flag has been a no-op; removal candidate for next major). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S2U2y9voMQV9rvCkYeQbka
lahma
enabled auto-merge (squash)
July 7, 2026 08:24
lahma
added a commit
that referenced
this pull request
Jul 8, 2026
Re-run after the builtin-shapes rollout and the 2026-07 performance campaign (#2580-#2597). Highlights vs the 4.11.0 refresh: minimal script -47% time / -45% allocation (prepared execution now under a microsecond), evaluation -33% allocation, stopwatch-modern -22% (ahead of NiL.JS, 1.13x behind Jurassic, from 1.44x), object-string -14%, string-base64 -12% (taking the lead from NiL.JS), object-array -11%. Competitor versions unchanged; their rows served as thermal canaries. Claude-Session: https://claude.ai/code/session_01S2U2y9voMQV9rvCkYeQbka Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This was referenced Jul 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Flip Intl, Temporal and %AsyncFromSyncIteratorPrototype% to builtin shapes
Completes the host sweep for the builtin-shape system: after #2590 made intrinsic references and throwers expressible as Factory slots, three generator-emitted hosts were still on the dictionary path for no remaining reason:
Intl— 10 lazy intrinsic references (Collator … Segmenter) +getCanonicalLocales/supportedValuesOf+@@toStringTagTemporal— 9 lazy intrinsic references +@@toStringTag%AsyncFromSyncIteratorPrototype%—next/return/throwEach now gets
[JsObject(UseShape = true)]: process-shared layout, per-realm descriptor array, no per-realmPropertyDictionary.Results (BenchmarkDotNet default jobs)
IntlColdStartBenchmark(fresh engine per op): −1.07…−1.08 KB allocated per row (−4.3%) across all five benchmarks, time neutral.EngineConstructionBenchmarkbyte-identical — these hosts are lazily initialized, so engine construction never touches them.Audited and skipped
RegExpConstructor: its Initialize hand-rolls 21 Annex B legacy accessors ($1–$9,$`,$&, …) via rawSetProperty; a flip would need an instance slot per accessor. Low value for the churn — left on the dictionary path with this note.JsSegments: per-call instance (returned byIntl.Segmenter.prototype.segment), not a per-realm singleton, and no representative workload traffic.Math/JSON/Reflect/Atomics/GeneratorPrototype/AsyncGeneratorPrototype/TemporalNowalready useBuiltinShapeObjectstorage — nothing to do.Rider
ExperimentalFeature.Generators[Obsolete]escalated toerror: true— the flag has been a no-op since generators became fully supported; escalation stages its removal for the next major. No in-repo consumers;Jint.Tests.PublicInterfacegreen after the change.Testing
Jint.Tests,Jint.Tests.PublicInterface,Jint.Tests.SourceGeneratorsgreenObject.getOwnPropertyNames(Intl)/(Temporal)key order identical to the dictionary path; formatters construct and format;@@toStringTagintact🤖 Generated with Claude Code
https://claude.ai/code/session_01S2U2y9voMQV9rvCkYeQbka