Skip to content

test: update test262 cases to latest#20959

Merged
alexander-akait merged 3 commits into
mainfrom
claude/update-test262-cases-DkRf4
May 14, 2026
Merged

test: update test262 cases to latest#20959
alexander-akait merged 3 commits into
mainfrom
claude/update-test262-cases-DkRf4

Conversation

@alexander-akait

Copy link
Copy Markdown
Member

Update the test262 submodule to commit 673e9bacbe28 (2026-05-11), which
adds two new ResolveExport conformance tests for star exports with cyclic
indirect re-exports:

  • module-code/instn-star-iee-single-cycle-same-name.js
  • module-code/instn-star-iee-multi-cycle-same-name.js

Both fail because webpack hoists star-exported names into the importer's
namespace without per-name cycle detection, so a cyclic indirect re-export
wins and the runtime ends up chasing a getter that points back at itself
("Maximum call stack size exceeded"). The spec requires the cyclic branch
to return null from ResolveExport and the star loop to fall through to a
non-cyclic path.

The fix would require a larger refactor of HarmonyExportImportedSpecifier
resolution, so both new cases are added to knownBugs with a comment
explaining the root cause.

Update the test262 submodule to commit 673e9bacbe28 (2026-05-11), which
adds two new ResolveExport conformance tests for star exports with cyclic
indirect re-exports:

- module-code/instn-star-iee-single-cycle-same-name.js
- module-code/instn-star-iee-multi-cycle-same-name.js

Both fail because webpack hoists star-exported names into the importer's
namespace without per-name cycle detection, so a cyclic indirect re-export
wins and the runtime ends up chasing a getter that points back at itself
("Maximum call stack size exceeded"). The spec requires the cyclic branch
to return null from ResolveExport and the star loop to fall through to a
non-cyclic path.

The fix would require a larger refactor of HarmonyExportImportedSpecifier
resolution, so both new cases are added to knownBugs with a comment
explaining the root cause.
Per the TC39 `ResolveExport` spec, when a star-reexported module
re-exports a name back to the importer cyclically, cycle detection
should return null from the cyclic branch and the star loop should
fall through to a non-cyclic source. In the new test262 cases:

  // a.js
  export * from './b.js';
  export * from './c.js';
  // b.js
  export { foo } from './a.js';
  // c.js
  export let foo = 42;

webpack previously hoisted every star-exported name into the
importer's namespace without per-name cycle detection, so b's cyclic
`foo` won over c's terminal binding. The generated bundle emitted

  a.foo = () => b.foo
  b.foo = () => a.foo

— a getter chain that recurses forever and throws "Maximum call
stack size exceeded" at runtime.

`HarmonyExportImportedSpecifierDependency` now detects when a
candidate star-export contribution's target chain loops back to the
importer under the same name and skips it. The check runs in both
`determineExportAssignments` (which builds the combined name set
for star reexports) and `getStarReexports` (which decides per-dep
contributions), walking the target chain one hop at a time with
visited tracking so namespace targets (`export * as ns from ...`)
and unrelated cycles don't trigger the latent infinite-loop in
`ExportsInfo._findTarget`.

The two test262 cases `instn-star-iee-single-cycle-same-name` and
`instn-star-iee-multi-cycle-same-name` now pass instead of throwing
at runtime.
The cycle detector in HarmonyExportImportedSpecifierDependency is called
for every export of every star-reexported module. In barrel-style code
(e.g. `export * from './depN.js'` repeated thousands of times, as in
the `side-effects-reexport` benchmark) this path is hot enough that
allocations and redundant work add a few percent to compile time.

Two small fixes:

- Probe the first chain hop before allocating the `visited` Set. For
  terminal local bindings (no `_target`) we now return immediately
  after one `findTarget` call without allocating the Set; only multi-hop
  chains pay for cycle tracking.
- Hoist the `() => true` filter into a module-level `RETURNS_TRUE`
  constant so each call doesn't allocate a fresh closure.
- In `getStarReexports`, check `hiddenExports` (a cheap `Set.has`)
  before running the cycle walk. Names that an earlier non-cyclic star
  already provided are guaranteed non-cyclic because
  `determineExportAssignments` excludes cyclic candidates from
  `hiddenExports` upstream.
Copilot AI review requested due to automatic review settings May 14, 2026 08:04
@changeset-bot

changeset-bot Bot commented May 14, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: d6845b1

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
webpack Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actions Bot commented May 14, 2026

Copy link
Copy Markdown
Contributor

This PR is packaged and the instant preview is available (e5ff221).

Install it locally:

  • npm
npm i -D webpack@https://pkg.pr.new/webpack@e5ff221
  • yarn
yarn add -D webpack@https://pkg.pr.new/webpack@e5ff221
  • pnpm
pnpm add -D webpack@https://pkg.pr.new/webpack@e5ff221

@github-actions

Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging claude/update-test262-cases-DkRf4 into main will be
98.94%
Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
bin
   webpack.js98.77%100%100%98.77%91
examples
   build-common.js100%100%100%100%
   buildAll.js100%100%100%100%
   examples.js100%100%100%100%
   template-common.js98.21%100%100%98.21%72
examples/custom-javascript-parser
   test.filter.js100%100%100%100%
examples/custom-javascript-parser/internals
   acorn-parse.js100%100%100%100%
   meriyah-parse.js100%100%100%100%
   oxc-parse.js91.30%100%100%91.30%140, 142–143, 145, 147, 153–154, 161, 168, 90
examples/markdown
   webpack.config.mjs100%100%100%100%
examples/typescript
   test.filter.js50%100%100%50%5
examples/virtual-modules
   test.filter.js100%100%100%100%
examples/wasm-bindgen-esm
   test.filter.js100%100%100%100%
examples/wasm-complex
   test.filter.js100%100%100%100%
examples/wasm-simple
   test.filter.js100%100%100%100%
examples/wasm-simple-source-phase
   test.filter.js100%100%100%100%
lib
   APIPlugin.js100%100%100%100%
   AsyncDependenciesBlock.js100%100%100%100%
   AutomaticPrefetchPlugin.js100%100%100%100%
   BannerPlugin.js100%100%100%100%
   Cache.js98.21%100%100%98.21%101
   CacheFacade.js100%100%100%100%
   Chunk.js99.72%100%100%99.72%37
   ChunkGraph.js100%100%100%100%
   ChunkGroup.js100%100%100%100%
   ChunkTemplate.js100%100%100%100%
   CleanPlugin.js98.72%100%100%98.72%206, 226, 382
   CodeGenerationResults.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.55%100%100%98.55%1554, 1850, 1857, 1865, 1887, 2783, 3208, 3870, 3899, 3952–3953, 3957, 3962, 3978–3979, 3993–3994, 3999–4000, 4477, 4503, 493, 498, 5211, 5292, 5307, 5332–5333, 5335, 5659, 5664, 5670, 5673, 5685, 5687, 5691, 5707, 5722, 5754, 5808, 5832, 5946, 712–713
   Compiler.js99.55%100%100%99.55%1116–1117, 1125
   ConcatenationScope.js98.59%100%100%98.59%189
   ConditionalInitFragment.js100%100%100%100%
   ConstPlugin.js100%100%100%100%
   ContextExclusionPlugin.js100%100%100%100%
   ContextModule.js100%100%100%100%
   ContextModuleFactory.js97.75%100%100%97.75%258, 393, 418, 443, 447, 458
   ContextReplacementPlugin.js100%100%100%100%
   DefinePlugin.js98.92%100%100%98.92%158–159, 175, 194, 268
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.20%100%100%98.20%379, 425
   DependencyTemplate.js100%100%100%100%
   DependencyTemplates.js100%100%100%100%
   DotenvPlugin.js97.88%100%100%97.88%237, 378, 391–392
   DynamicEntryPlugin.js100%100%100%100%
   EntryOptionPlugin.js100%100%100%100%
   EntryPlugin.js100%100%100%100%
   Entrypoint.js100%100%100%100%
   EnvironmentPlugin.js97.14%100%100%97.14%49
   ErrorHelpers.js100%100%100%100%
   EvalDevToolModulePlugin.js100%100%100%100%
   EvalSourceMapDevToolPlugin.js100%100%100%100%
   ExportsInfo.js100%100%100%100%
   ExportsInfoApiPlugin.js100%100%100%100%
   ExternalModule.js98.96%100%100%98.96%424–428, 576
   ExternalModuleFactoryPlugin.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FileSystemInfo.js99.50%100%100%99.50%182, 2252–2253, 2256, 2267, 2278, 2289, 278, 3694, 3709, 3733
   FlagAllModulesAsUsedPlugin.js100%100%100%100%
   FlagDependencyExportsPlugin.js98.74%100%100%98.74%399, 401, 405
   FlagDependencyUsagePlugin.js100%100%100%100%
   FlagEntryExportAsUsedPlugin.js100%100%100%100%
   Generator.js100%100%100%100%
   HotModuleReplacementPlugin.js100%100%100%100%
   HotUpdateChunk.js100%100%100%100%
   IgnorePlugin.js100%100%100%100%
   IgnoreWarningsPlugin.js100%100%100%100%
   InitFragment.js100%100%100%100%
   JavascriptMetaInfoPlugin.js100%100%100%100%
   LibraryTemplatePlugin.js100%100%100%100%
   LoaderOptionsPlugin.js100%100%100%100%
   LoaderTargetPlugin.js100%100%100%100%
   MainTemplate.js100%100%100%100%
   ManifestPlugin.js100%100%100%100%
   Module.js98.50%100%100%98.50%1304, 1309, 1370, 1384, 1446, 1455
   ModuleFactory.js100%100%100%100%
   ModuleFilenameHelpers.js98.85%100%100%98.85%106, 108
   ModuleGraph.js99.73%100%100%99.73%1004
   ModuleGraphConnection.js100%100%100%100%
   ModuleInfoHeaderPlugin.js100%100%100%100%
   ModuleProfile.js100%100%100%100%
   ModuleSourceTypeConstants.js100%100%100%100%
   ModuleTemplate.js100%100%100%100%
   ModuleTypeConstants.js100%100%100%100%
   MultiCompiler.js99.69%100%100%99.69%645
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js97.78%100%100%97.78%1020, 1036, 1123, 1774, 1779–1789, 708, 711, 728, 745, 986
   NormalModuleFactory.js99.47%100%100%99.47%1074, 1383, 473, 485
   NormalModuleReplacementPlugin.js100%100%100%100%
   NullFactory.js100%100%100%100%
   OptimizationStages.js100%100%100%100%
   OptionsApply.js100%100%100%100%
   Parser.js100%100%100%100%
   PlatformPlugin.js100%100%100%100%
   PrefetchPlugin.js100%100%100%100%
   ProgressPlugin.js98.85%100%100%98.85%519–520, 525, 527, 591
   ProvidePlugin.js100%100%100%100%
   RawModule.js100%100%100%100%
   RecordIdsPlugin.js100%100%100%100%
   RequestShortener.js100%100%100%100%
   ResolverFactory.js100%100%100%100%
   RuntimeGlobals.js100%100%100%100%
   RuntimeModule.js100%100%100%100%
   RuntimePlugin.js100%100%100%100%
   RuntimeTemplate.js100%100%100%100%
   SelfModuleFactory.js100%100%100%100%
   SingleEntryPlugin.js100%100%100%100%
   SourceMapDevToolModuleOptionsPlugin.js100%100%100%100%
   SourceMapDevToolPlugin.js99.16%100%100%99.16%267–268, 610
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js98.86%100%100%98.86%134–135
   UseStrictPlugin.js100%100%100%100%
   WarnCaseSensitiveModulesPlugin.js100%100%100%100%
   WarnDeprecatedOptionPlugin.js100%100%100%100%
   WarnNoModeSetPlugin.js100%100%100%100%
   WatchIgnorePlugin.js100%100%100%100%
   Watching.js100%100%100%100%
   WebpackError.js100%100%100%100%
   WebpackIsIncludedPlugin.js100%100%100%100%
   WebpackOptionsApply.js100%100%100%100%
   WebpackOptionsDefaulter.js100%100%100%100%
   buildChunkGraph.js99.87%100%100%99.87%325
   cli.js98.71%100%100%98.71%117, 469, 501, 543, 813
   index.js100%100%100%100%
   validateSchema.js94.67%100%100%94.67%100, 87, 89, 98
   webpack.js97.22%100%100%97.22%196, 218, 220
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModulesPlugin.js97.77%100%100%97.77%285, 309, 312, 364, 40
   AssetParser.js100%100%100%100%
   AssetSourceGenerator.js100%100%100%100%
   AssetSourceParser.js100%100%100%100%
   RawDataUrlModule.js100%100%100%100%
lib/async-modules
   AsyncModuleHelpers.js100%100%100%100%
   AwaitDependenciesInitFragment.js100%100%100%100%
   InferAsyncModulesPlugin.js100%100%100%100%
lib/cache
   AddBuildDependenciesPlugin.js100%100%100%100%
   AddManagedPathsPlugin.js100%100%100%100%
   IdleFileCachePlugin.js97.92%100%100%97.92%71, 83, 91
   MemoryCachePlugin.js95.83%100%100%95.83%33
   MemoryWithGcCachePlugin.js93.15%100%100%93.15%106, 113–114, 122, 89
   PackFileCacheStrategy.js96.40%100%100%96.40%1250, 1350, 1354, 1416, 628, 647, 657–659, 661, 677–678, 683, 686, 688, 693, 698, 722, 728, 762, 768, 774, 779, 790, 799, 804–805, 807, 824, 830–831, 833
   ResolverCachePlugin.js100%100%100%100%
   getLazyHashedEtag.js100%100%100%100%
   mergeEtags.js100%100%100%100%
lib/config
   browserslistTargetHandler.js100%100%100%100%
   defaults.js99.15%100%100%99.15%1327–1329, 1337, 271, 274, 279, 283, 472
   normalization.js99%100%100%99%191–192, 258, 273
   target.js100%100%100%100%
lib/container
   ContainerEntryDependency.js100%100%100%100%
   ContainerEntryModule.js100%100%100%100%
   ContainerEntryModuleFactory.js100%100%100%100%
   ContainerExposedDependency.js100%100%100%100%
   ContainerPlugin.js100%100%100%100%
   ContainerReferencePlugin.js100%100%100%100%
   FallbackDependency.js100%100%100%100%
   FallbackItemDependency.js100%100%100%100%
   FallbackModule.js100%100%100%100%
   FallbackModuleFactory.js100%100%100%100%
   HoistContainerReferencesPlugin.js100%100%100%100%
   ModuleFederationPlugin.js100%100%100%100%
   RemoteModule.js100%100%100%100%
   RemoteRuntimeModule.js100%100%100%100%
   

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

The PR title and description claim this only updates the test262 submodule and adds two new failing tests (cyclic indirect re-export with star exports) to knownBugs, deferring the actual fix. However, the diff actually implements a behavioral fix in HarmonyExportImportedSpecifierDependency: a new isStarReexportBackToParent helper performs a per-name cycle check to skip cyclic star-export contributions in both determineExportAssignments and getMode-style export collection, and a corresponding patch-level changeset is added. No test262 submodule update or knownBugs change is present in the provided diff.

Changes:

  • Add isStarReexportBackToParent helper that walks findTarget hops with cycle tracking to detect a star re-export that loops back to the importer under the same name.
  • Filter cyclic contributions in determineExportAssignments and in two collection loops of HarmonyExportImportedSpecifierDependency (the noExtraImports and hidden-based paths).
  • Add a patch-level changeset describing the fix.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

File Description
lib/dependencies/HarmonyExportImportedSpecifierDependency.js Introduces cycle-detection helper and applies it at three call sites where star-export names are aggregated.
.changeset/star-export-cyclic-indirect-reexport.md Patch changeset describing the cyclic indirect re-export fix.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +1 to +5
---
"webpack": patch
---

Fix `export *` resolution when a star-reexported module re-exports a name back to the importer cyclically. Previously, in a graph where `a` does `export * from "./b"; export * from "./c";` and `b` does `export { foo } from "./a";` while `c` provides the actual `foo` binding, webpack hoisted `foo` from `b` into `a`'s namespace without per-name cycle detection — emitting a getter chain (`a.foo` → `b.foo` → `a.foo`) that threw "Maximum call stack size exceeded" at runtime. The TC39 `ResolveExport` algorithm requires the cyclic branch to return null and the star loop to fall through to the non-cyclic source. Webpack's `HarmonyExportImportedSpecifierDependency` now detects when a candidate star-export contribution's target chain loops back to the importer under the same name and skips it, letting the sibling `export *` provide the binding.
@codecov

codecov Bot commented May 14, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 83.72093% with 7 lines in your changes missing coverage. Please review.
✅ Project coverage is 91.13%. Comparing base (724c209) to head (d6845b1).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
...encies/HarmonyExportImportedSpecifierDependency.js 83.72% 7 Missing ⚠️

❌ Your patch check has failed because the patch coverage (72.09%) is below the target coverage (90.00%). You can increase the patch coverage or adjust the target coverage.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #20959      +/-   ##
==========================================
- Coverage   91.36%   91.13%   -0.24%     
==========================================
  Files         569      569              
  Lines       57147    57581     +434     
  Branches    15227    15408     +181     
==========================================
+ Hits        52215    52475     +260     
- Misses       4932     5106     +174     
Flag Coverage Δ
integration 90.00% <72.09%> (-0.29%) ⬇️
test262 45.46% <83.72%> (+0.03%) ⬆️
unit 36.10% <4.65%> (-0.08%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@codspeed-hq

codspeed-hq Bot commented May 14, 2026

Copy link
Copy Markdown

Merging this PR will degrade performance by 38.6%

⚡ 5 improved benchmarks
❌ 9 regressed benchmarks
✅ 130 untouched benchmarks
⏩ 72 skipped benchmarks1

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "asset-modules-source", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 171 KB 3,722.6 KB -95.41%
Memory benchmark "lodash", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 135.2 KB 309.3 KB -56.27%
Memory benchmark "cache-filesystem", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 191.5 KB 850.5 KB -77.48%
Memory benchmark "many-chunks-esm", scenario '{"name":"mode-production","mode":"production"}' 10.5 MB 6.9 MB +51.59%
Memory benchmark "side-effects-reexport", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 408.8 KB 859.4 KB -52.43%
Memory benchmark "many-modules-commonjs", scenario '{"name":"mode-production","mode":"production"}' 8.7 MB 7.1 MB +22.21%
Memory benchmark "concatenate-modules", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 134.5 KB 168.5 KB -20.17%
Memory benchmark "asset-modules-resource", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 214.9 KB 529.6 KB -59.42%
Memory benchmark "context-esm", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 149.5 KB 661.9 KB -77.42%
Memory benchmark "many-modules-commonjs", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 305.4 KB 196.3 KB +55.56%
Memory benchmark "react", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 1,069.1 KB 136.9 KB ×7.8
Memory benchmark "devtool-eval-source-map", scenario '{"name":"mode-production","mode":"production"}' 7.4 MB 6.1 MB +20.68%
Memory benchmark "many-chunks-commonjs", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 175 KB 358.9 KB -51.24%
Memory benchmark "many-modules-esm", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 140.7 KB 270.8 KB -48.03%

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing claude/update-test262-cases-DkRf4 (d6845b1) with main (685bbaf)

Open in CodSpeed

Footnotes

  1. 72 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@alexander-akait alexander-akait merged commit e5ff221 into main May 14, 2026
63 of 66 checks passed
@alexander-akait alexander-akait deleted the claude/update-test262-cases-DkRf4 branch May 14, 2026 12:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants