)]}'
{
  "log": [
    {
      "commit": "e1413c34b671e5932e0a77618c3224cf73152b56",
      "tree": "8fb7bb3105f1e4b242c0f5a5cd3c1ac51f73b673",
      "parents": [
        "661afafb9b35247d1877cd19033f7f663cd266c4"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Oct 08 23:37:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 23:37:00 2026"
      },
      "message": "Consolidate `acorn_optimizer` calls in `minify_wasm_js`. NFC (#27928)\n\nPreviously, at `-O3`/`-Os`/`-Oz` (`expensive_optimizations`),\n`minify_wasm_js` invoked `acorn-optimizer.mjs` up to four separate times\nto parse and reprint JS:\n1. Pre-`metadce` (`AJSDCE`, `stripDefaultUndefined`,\n`--minify-whitespace`)\n2. Inside `metadce` (`applyDCEGraphRemovals`, `--minify-whitespace`)\n3. Post-`metadce` (`AJSDCE`, `--minify-whitespace`)\n4. Inside `minify_wasm_imports_and_exports`\n(`applyImportAndExportNameChanges`, `--minify-whitespace`)\n\nHave `metadce` and `minify_wasm_imports_and_exports` return their\nremoval/renaming metadata instead of invoking `acorn_optimizer`\ndirectly, and consolidate `applyDCEGraphRemovals`, post-`metadce`\n`AJSDCE`, `applyImportAndExportNameChanges`, `stripDefaultUndefined`,\nand `--minify-whitespace` into a single final `acorn_optimizer` pass.\n\nSplit out from #27926"
    },
    {
      "commit": "661afafb9b35247d1877cd19033f7f663cd266c4",
      "tree": "59fd268cef14a8b72fa75f3338ee7f3fc33b5d09",
      "parents": [
        "6c0aed6896308b20041c91b26fb329b3cb4ddaa6"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Oct 08 23:36:14 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 23:36:14 2026"
      },
      "message": "[test] Enable `other.test_dot_a_all_contents_invalid` on macOS. NFC (#27930)\n\nSince #21114 (and llvm/llvm-project#78658), `wasm-ld` inspects all\narchive members upfront rather than relying on the archive symbol index,\nand warns whenever an archive member is neither a Wasm object file nor\nLLVM bitcode regardless of the host object or archive format.\n\nFixes: #16649"
    },
    {
      "commit": "6c0aed6896308b20041c91b26fb329b3cb4ddaa6",
      "tree": "71aefbf3f5432f45604287fb55b2fd49301c2dfe",
      "parents": [
        "fc889644b47caae0e85801bb12d5b1a921f984ea"
      ],
      "author": {
        "name": "emscripten-bot",
        "email": "179889221+emscripten-bot@users.noreply.github.com",
        "time": "Thu Oct 08 22:50:53 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 22:50:53 2026"
      },
      "message": "Mark 6.0.12 as released (#27931)\n\nCo-authored-by: emscripten-bot \u003cemscripten-bot@users.noreply.github.com\u003e"
    },
    {
      "commit": "fc889644b47caae0e85801bb12d5b1a921f984ea",
      "tree": "ff3a6c860e2313a6286ff834b2061039c2269220",
      "parents": [
        "19ad2dcc07aeb3329398d2d537d141c564ea8bab"
      ],
      "author": {
        "name": "Guy Bedford",
        "email": "guybedford@gmail.com",
        "time": "Thu Oct 08 22:17:34 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 22:17:34 2026"
      },
      "message": "NODERAWSOCKETS: make setsockopt/getsockopt symmetric (#27921)\n\nThis makes `setsockopt` and `getsockopt` consistent under\n`-sNODERAWSOCKETS`, resolves #27888.\n\nPreviously `setsockopt` accepted any unknown option silently while\n`getsockopt` returned `ENOPROTOOPT` for it, so a value that had just\nbeen set successfully could not be read back (e.g. `SO_RCVTIMEO`).\n`SO_REUSEADDR` also always read back as 1 but was never actually applied\nto UDP binds.\n\n* `SO_RCVTIMEO`/`SO_SNDTIMEO` are stored and reported as a `struct\ntimeval`, validated as the kernel does (`EINVAL` on a short length,\n`EDOM` on an out-of-range `tv_usec`). Nothing blocks in this backend, so\nthis matches kernel semantics for an `O_NONBLOCK` socket, where the\ntimeout is stored but never fires.\n* `SO_REUSEADDR` and `SO_REUSEPORT` are now passed to the UDP bind (both\nthe public `dgram` and `udp_wrap` paths), so datagram sockets can share\na port. `IPV6_V6ONLY` is passed through for UDP too.\n* `SO_ACCEPTCONN`, `SO_DOMAIN` and `SO_PROTOCOL` are reported.\n* Options that are not modelled now fail with `ENOPROTOOPT` in\n`setsockopt` as well, so everything accepted can be read back.\n\n`test_socket_options.c` is extended to cover the above and a new\n`test_udp_reuseaddr.c` checks that two UDP sockets with the option can\nbind the same port while a third without it gets `EADDRINUSE`. Both\ntests also pass natively on Linux.\n\n_Made with AI assistance under my review_"
    },
    {
      "commit": "19ad2dcc07aeb3329398d2d537d141c564ea8bab",
      "tree": "e350b95d26c931b5b7c7224037dc68cf2490dbb9",
      "parents": [
        "5488e0871d46d19a3209988190fa6a653126256f"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Oct 08 20:12:55 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 20:12:55 2026"
      },
      "message": "Use strict equality (`\u003d\u003d\u003d`/`!\u003d\u003d`) for `typeof` checks (#27927)\n\nIn Emscripten we historically have used loose equality checks when\ncomparing `typeof xxx` with a string constant. This was done because it\nsaved a few bytes of output size without any runtime cost (since the\nengine knows that both sides are strings, it will do a strict check\nanyway). See #21708, for example.\n\nHowever, this is not considered modern JS style. Instead, strict checks\nare preferred.\n\nThis change converts all remaining loose `typeof` comparisons across\n`src/` and `tools/` to use `\u003d\u003d\u003d` and `!\u003d\u003d`, accepting the small code\nsize increase in generated JS output (+0.08% average across codesize\ntests).\\\n\nSee #27851 for the version of this change the preserves the codesize but\nat the cost of adding an acorn pass."
    },
    {
      "commit": "5488e0871d46d19a3209988190fa6a653126256f",
      "tree": "5363325f2ab9e1fbb42431f835853c1f04ca984f",
      "parents": [
        "7deb8a07b5cea06fc304ebf7e4951cdff0bdd773"
      ],
      "author": {
        "name": "emscripten-bot",
        "email": "179889221+emscripten-bot@users.noreply.github.com",
        "time": "Thu Oct 08 15:26:15 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 15:26:15 2026"
      },
      "message": "Update emsdk version from f7eab863 to d68fe7d3 (#27924)\n\nThis is an automatic change generated by tools/maint/rebaseline_tests.py\n--update-emsdk.\n\nemsdk version updated: f7eab863 \u003d\u003e d68fe7d3\n\nThe following revisions were included in this update:\n\n```\n- d68fe7d3 Roll binaryen from 6fddddf71fab to 93d6e9de7e1d (1 revision)\n- 4cc4e1fc Roll llvm-project from 55c58be525fd to 97aa2aeb3b0b (49 revisions)\n- b89f22e1 Roll emscripten from a8d736e977d6 to d23d98befa18 (1 revision)\n- f553a429 Roll binaryen from bee0b57cf3b6 to 6fddddf71fab (4 revisions)\n- c20dbdde Roll emscripten from 0ff60ccb1dc0 to a8d736e977d6 (12 revisions)\n- da91b79e Roll binaryen from a63f313c1bda to bee0b57cf3b6 (1 revision)\n- e4f3677b Roll llvm-project from 65cb0aa9afee to 55c58be525fd (219 revisions)\n- cfb5c632 Roll binaryen from b8e22b47d303 to a63f313c1bda (3 revisions)\n- ef11e4eb Roll emscripten from 5372a12809f8 to 0ff60ccb1dc0 (1 revision)\n- 8fa24709 Roll binaryen from a7a6b52c69f3 to b8e22b47d303 (2 revisions)\n- 6c13295f Roll v8 from a6723a2f8e8c to 56d94ea65ee3 (57 revisions)\n```\n\nFull log:\nhttps://chromium.googlesource.com/emscripten-releases/+log/f7eab863..d68fe7d3\n\nCo-authored-by: emscripten-bot \u003cemscripten-bot@users.noreply.github.com\u003e"
    },
    {
      "commit": "7deb8a07b5cea06fc304ebf7e4951cdff0bdd773",
      "tree": "2040134b1ed7d86283fa7c39c95426f375cdd037",
      "parents": [
        "d23d98befa18f92fa0f3b89f921c75cbc94628cf"
      ],
      "author": {
        "name": "Ioulios P.",
        "email": "ipat@hotmail.gr",
        "time": "Thu Oct 08 15:24:34 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 15:24:34 2026"
      },
      "message": "[WasmFS] Fix statfs inode counts and fsid to match JS FS (#27925)\n\n`doStatFS` set `f_files` to the file\u0027s inode number and `f_ffree` to\n1000000. WasmFS inode numbers are the address of the `File` object, so\n`f_files` was a relatively small value that changed depending on the\npath passed to `statfs`, and `f_ffree` was larger than `f_files` (which\nmeant `doStatFS` was reporting more free inodes than total inodes).\n`f_fsid` was also 0, while `test_statvfs` expects 42.\n\nThese values were copied from the JS FS when `doStatFS` was added in\n#16971, using the file\u0027s inode in place of `FS.nextInode`. #22932 later\nchanged the JS FS to report `f_ffree \u003c\u003d f_files` and updated\n`test_statvfs` to check this. WasmFS was not updated, so the test failed\nand was ultimately skipped.\n\nThis change uses fixed placeholder values (`f_files \u003d 1000000`, `f_ffree\n\u003d 500000`), the same as the other counts in `doStatFS`, and sets\n`f_fsid` to 42 to match the JS FS.\n\nThis re-enables `test_statvfs` and `test_fs_nodefs_statvfs` under\nWasmFS.\n\nPart of #25035"
    },
    {
      "commit": "d23d98befa18f92fa0f3b89f921c75cbc94628cf",
      "tree": "9d9ccc243973e50e4ed77b0d437f071f606c3714",
      "parents": [
        "a8d736e977d6d755ad138aba01e2362a30f3f231"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Oct 07 21:50:49 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 21:50:49 2026"
      },
      "message": "[SDL] Remove unused methods and properties from `libsdl.js`. NFC (#27913)\n\n- Remove unused `loadColorToCSSRGBA`, `translateRGBAToColor`, and\n`debugSurface` from `$SDL`.\n- Remove write-only `mixerFormat` and `mixerChunkSize` properties from\n`$SDL`."
    },
    {
      "commit": "a8d736e977d6d755ad138aba01e2362a30f3f231",
      "tree": "20ff7df25026807e8b04252e6edb16f4ede245c9",
      "parents": [
        "f61e737509116cd3a2235b95df1dac53ca04d332"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Oct 07 20:36:28 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 20:36:28 2026"
      },
      "message": "[SDL2] Remove explicit export of `createContext`. NFC (#27914)\n\nThis was fixed upstream in https://github.com/libsdl-org/SDL/pull/12970"
    },
    {
      "commit": "f61e737509116cd3a2235b95df1dac53ca04d332",
      "tree": "3b28db237e3279e279e2af62b21d5c9d95a904a5",
      "parents": [
        "d4851bdc94ce7b3f1e3005d28f911fe25d825544"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Oct 07 20:35:06 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 20:35:06 2026"
      },
      "message": "Remove unused `$Sockets` object from `libcore.js`. NFC (#27915)\n\n`$Sockets` was leftover from the legacy pre-`SOCKFS` / `SOCKET_WEBRTC`\nsocket implementation and is no longer referenced anywhere in the\ncodebase."
    },
    {
      "commit": "d4851bdc94ce7b3f1e3005d28f911fe25d825544",
      "tree": "e24f5b131b09bcf438626c0771885fa618ab0899",
      "parents": [
        "c73f1ed8eac737200aa7a63e90b6f1112775141e"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Oct 07 20:07:31 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 20:07:31 2026"
      },
      "message": "Remove legacy `cpuprofiler_add_hooks` and `memoryprofiler_add_hooks`. NFC (#27912)\n\nThese backwards-compatibility shims were added in 2016 (`e4fa671645`)\nand are no longer called anywhere."
    },
    {
      "commit": "c73f1ed8eac737200aa7a63e90b6f1112775141e",
      "tree": "bdf4242351b45bdf997a8638925197e307f5d8d9",
      "parents": [
        "7946564694d6ebb4cf5766c99678a0cb0476d0c8"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Oct 07 19:53:40 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 19:53:40 2026"
      },
      "message": "Remove unused `GL.usedTempBuffers` from `libwebgl.js`. NFC (#27917)\n\n`GL.usedTempBuffers` has been unused since 1951e2b803."
    },
    {
      "commit": "7946564694d6ebb4cf5766c99678a0cb0476d0c8",
      "tree": "cecf62c2b94ee8aa566f18a793d45a51568e76a7",
      "parents": [
        "4e364a6988e7c8e6bd299e218804ae1781faa4f3"
      ],
      "author": {
        "name": "Thomas Steiner",
        "email": "tomac@google.com",
        "time": "Wed Oct 07 19:47:38 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 19:47:38 2026"
      },
      "message": "Check for `getFileHandle()` before taking the Cross-Origin Storage path (#27916)\n\nFollow-up to #27907: checking only for `navigator.crossOriginStorage`\nmisses implementations without `getFileHandle()`, so this checks for the\nmethod itself."
    },
    {
      "commit": "4e364a6988e7c8e6bd299e218804ae1781faa4f3",
      "tree": "52ddf3385bbd92b1e4d572acc6f8d806df00a32a",
      "parents": [
        "e57eaeab845cd1c7dab84c4c369678acd73c3956"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Oct 07 18:20:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 18:20:17 2026"
      },
      "message": "Remove unused properties from `libglemu.js`. NFC (#27910)\n\nRemove unused `GLEmulation.lightModelLocalViewer`,\n`GLImmediate.tempMatrix`, `GLImmediate.initted`, and write-only\n`GLImmediate.indexData` (which also allocated an unused `Uint16Array` at\ninitialization time)."
    },
    {
      "commit": "e57eaeab845cd1c7dab84c4c369678acd73c3956",
      "tree": "016bcc33c99e571f1e4c2d089e03b0555ff0b87c",
      "parents": [
        "ccc0fe2fb54068ba72af2949d20b8c70ddb45527"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Oct 07 18:18:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 18:18:47 2026"
      },
      "message": "[glut] Clean up unused properties and legacy fullscreen listeners. NFC (#27911)\n\n- Remove write-only `windowX` and `windowY` properties from `$GLUT`.\n- Remove obsolete `mozfullscreenchange` listeners and guard\n`webkitfullscreenchange` listeners with `#if MIN_SAFARI_VERSION \u003c\n160400`, matching `#27347`."
    },
    {
      "commit": "ccc0fe2fb54068ba72af2949d20b8c70ddb45527",
      "tree": "30bbbc1e0304c8791d8d6576a8265df40d2187e7",
      "parents": [
        "d85969f47adba9eae67d5b339f70553acb6b82fe"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Oct 07 18:16:57 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 18:16:57 2026"
      },
      "message": "Remove unused `Browser.getUserMedia` and `$getUserMedia`. NFC (#27909)\n\n`Browser.getUserMedia` was originally added in `4fb9a41526` for the\nnow-removed `SOCKET_WEBRTC` socket backend and has no remaining callers\nor references in the codebase."
    },
    {
      "commit": "d85969f47adba9eae67d5b339f70553acb6b82fe",
      "tree": "286ce409c7fdc3cb4baaac1731fad3a367878103",
      "parents": [
        "1559c53533541a6d96fdb584bfad17f43fd96b75"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Oct 07 18:15:52 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 18:15:52 2026"
      },
      "message": "Replace vendored `third_party/terser` with npm `terser` package (#27902)\n\nAdd `terser` to `package.json` and use Terser\u0027s public\n`minify_sync` API in `tools/acorn-optimizer.mjs` and\n`tools/unsafe_optimizations.mjs`.   We already had an\nindirect dependency on terser so that node_modules\ndirectory is actually unchanged here.\n\nPreviously we maintained a custom fork of Terser in `third_party/terser`\nsolely for `AST_ParenthesizedExpression` support. With `makeSequence`\nupdated in #27903 to emit a standard `SequenceExpression` directly, the\nonly remaining `ParenthesizedExpression` nodes come from Acorn in\n`--closure-friendly` mode (`preserveParens`). Instead of custom Terser\nAST support, unwrap those `ParenthesizedExpression` nodes after parsing\nwhile recording their source spans so `reattachComments` can wrap their\n`_codegen` in `output.with_parens`, keeping JSDoc `@type` cast comments\noutside the parentheses for Closure Compiler."
    },
    {
      "commit": "1559c53533541a6d96fdb584bfad17f43fd96b75",
      "tree": "d0c53ebbb9ed41494e89728c320712dd06e2581e",
      "parents": [
        "6fdcd6e91ca2e22f2582f394e798a30bd3e0573b"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Oct 07 18:05:57 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 18:05:57 2026"
      },
      "message": "Add a codesize test that does not use closure compiler (#27908)\n\nThis allows is to track the size of our builds for users who are not\nusing closure compiler.Add a codesize test that does not use closure\ncompiler\n\nSplit out from #27871"
    },
    {
      "commit": "6fdcd6e91ca2e22f2582f394e798a30bd3e0573b",
      "tree": "be44808885a4920b218332eb74466146c0124092",
      "parents": [
        "d6f5c0a249b6a459352ba8ae447017fe41b051ed"
      ],
      "author": {
        "name": "Thomas Steiner",
        "email": "tomac@google.com",
        "time": "Wed Oct 07 17:28:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 17:28:35 2026"
      },
      "message": "Rename `requestFileHandle()` to `getFileHandle()` for Cross-Origin Storage (#27907)\n\nThe Cross-Origin Storage API renamed `requestFileHandle()` to\n`getFileHandle()` in\nhttps://github.com/WICG/cross-origin-storage/pull/86. This updates the\n`-sCROSS_ORIGIN_STORAGE` runtime and its docs to match."
    },
    {
      "commit": "d6f5c0a249b6a459352ba8ae447017fe41b051ed",
      "tree": "e70d9139d2e048bdc2a317faa765560487a4f3fb",
      "parents": [
        "0ff60ccb1dc07e0b74bf4954dc569f62f852e1c7"
      ],
      "author": {
        "name": "emscripten-bot",
        "email": "179889221+emscripten-bot@users.noreply.github.com",
        "time": "Wed Oct 07 16:46:45 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 16:46:45 2026"
      },
      "message": "Update emsdk version from f97bc361 to f7eab863 (#27905)\n\nThis is an automatic change generated by tools/maint/rebaseline_tests.py\n--update-emsdk.\n\nemsdk version updated: f97bc361 \u003d\u003e f7eab863\n\nThe following revisions were included in this update:\n\n```\n- f7eab863 Roll emscripten from 86cb7e78cc6a to 5372a12809f8 (1 revision)\n- d2dc03d1 Roll emscripten from 5ddd9265c264 to 86cb7e78cc6a (3 revisions)\n- 24b19113 Roll binaryen from 84692ae3d15e to a7a6b52c69f3 (1 revision)\n- c2ed2bfb Roll llvm-project from 18f9e623e4c8 to 65cb0aa9afee (67 revisions)\n- a044e325 Roll emscripten from 05672c5c9ec5 to 5ddd9265c264 (3 revisions)\n- e91dc98e Roll binaryen from 1d7748aa4ef4 to 84692ae3d15e (1 revision)\n- 854d03a5 Roll emscripten from d38fd5a360e2 to 05672c5c9ec5 (4 revisions)\n- 2ee90d01 Roll llvm-project from 28f349c30963 to 18f9e623e4c8 (75 revisions)\n- 2770a036 Roll emscripten from 7c3a7a9a08cb to d38fd5a360e2 (3 revisions)\n- 0cc7d282 Roll emscripten from c5b9b37fb7d9 to 7c3a7a9a08cb (1 revision)\n- 9e3f1978 Roll llvm-project from 6973db57ff08 to 28f349c30963 (33 revisions)\n- bd5baec3 Roll v8 from 5c52bfb643b2 to a6723a2f8e8c (53 revisions)\n- 5a60ad84 Roll llvm-project from f42afb122770 to 6973db57ff08 (22 revisions)\n```\n\nFull log:\nhttps://chromium.googlesource.com/emscripten-releases/+log/f97bc361..f7eab863\n\nThe following (17) test expectation files were updated by\nrunning the tests with `--rebaseline`:\n\n```\ncodesize/test_codesize_cxx_ctors1.json: 153159 \u003d\u003e 153159 [+0 bytes / +0.00%]\ncodesize/test_codesize_cxx_ctors2.json: 152564 \u003d\u003e 152564 [+0 bytes / +0.00%]\ncodesize/test_codesize_cxx_except.json: 199261 \u003d\u003e 199261 [+0 bytes / +0.00%]\ncodesize/test_codesize_cxx_except_wasm.json: 168623 \u003d\u003e 168623 [+0 bytes / +0.00%]\ncodesize/test_codesize_cxx_except_wasm_legacy.json: 166483 \u003d\u003e 166483 [+0 bytes / +0.00%]\ncodesize/test_codesize_cxx_lto.json: 119550 \u003d\u003e 119550 [+0 bytes / +0.00%]\ncodesize/test_codesize_cxx_noexcept.json: 155066 \u003d\u003e 155066 [+0 bytes / +0.00%]\ncodesize/test_codesize_hello_dylink.json: 43344 \u003d\u003e 43344 [+0 bytes / +0.00%]\ncodesize/test_codesize_hello_dylink_all.json: 860764 \u003d\u003e 860761 [-3 bytes / -0.00%]\ncodesize/test_codesize_mem_O3.json: 9134 \u003d\u003e 9134 [+0 bytes / +0.00%]\ncodesize/test_codesize_mem_O3_grow.json: 9469 \u003d\u003e 9469 [+0 bytes / +0.00%]\ncodesize/test_codesize_mem_O3_standalone.json: 9140 \u003d\u003e 9140 [+0 bytes / +0.00%]\ncodesize/test_codesize_mem_O3_standalone_lib.json: 8334 \u003d\u003e 8334 [+0 bytes / +0.00%]\ncodesize/test_codesize_mem_O3_standalone_narg.json: 8455 \u003d\u003e 8455 [+0 bytes / +0.00%]\ncodesize/test_codesize_mem_O3_standalone_narg_flto.json: 7386 \u003d\u003e 7386 [+0 bytes / +0.00%]\ncodesize/test_codesize_minimal_pthreads.json: 26064 \u003d\u003e 26064 [+0 bytes / +0.00%]\ncodesize/test_codesize_minimal_pthreads_memgrowth.json: 26523 \u003d\u003e 26523 [+0 bytes / +0.00%]\n\nAverage change: -0.00% (-0.00% - +0.00%)\n```\n\nCo-authored-by: emscripten-bot \u003cemscripten-bot@users.noreply.github.com\u003e"
    },
    {
      "commit": "0ff60ccb1dc07e0b74bf4954dc569f62f852e1c7",
      "tree": "c8c23faa2f61b41c4fa9304cc416cef45ecacf66",
      "parents": [
        "5372a12809f8f73c77c1940832eed570b7077d7d"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Oct 07 16:18:33 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 16:18:33 2026"
      },
      "message": "Simplify `makeSequence` and `reattachComments` in `acorn-optimizer.mjs`. NFC (#27903)\n\n- Return a `SequenceExpression` directly from `makeSequence` without\nwrapping it in a non-standard `ParenthesizedExpression` node; Terser\u0027s\n`AST_Sequence` printer already emits parentheses wherever operator\nprecedence requires them.\n- Push plain `{type, value, nlb}` comment objects into `comments_before`\nin `reattachComments` instead of constructing internal\n`terser.AST_Token` instances.\n\nSplit out from #27902"
    },
    {
      "commit": "5372a12809f8f73c77c1940832eed570b7077d7d",
      "tree": "a04c8d87600e35f3e82ede6aed260c9c1c704012",
      "parents": [
        "86cb7e78cc6a025eabb31a894a989cadf355d4c3"
      ],
      "author": {
        "name": "Josep Maria Blasco",
        "email": "124881707+JosepMariaBlasco@users.noreply.github.com",
        "time": "Wed Oct 07 03:39:50 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 03:39:50 2026"
      },
      "message": "Proxy `_emscripten_lookup_name` and `getnameinfo` to the main thread (#27889)\n\nThe fake DNS table of the socket emulation lives in JS, so every thread\nhas its\nown copy. `getaddrinfo` and the socket syscalls are proxied to the main\nthread,\nbut `_emscripten_lookup_name` (used by `gethostbyname`) and\n`getnameinfo` were\nnot. Under `PROXY_TO_PTHREAD` they used the calling worker\u0027s table:\n`gethostbyname` returned an address that `connect` could not map back to\nthe\nhost name (opening e.g. `ws://172.29.1.0:8080/`), and `getnameinfo`\ncould not\nreverse an address that `getaddrinfo` had handed out.\n\n`getnameinfo` was not in the issue: it has the same cause and showed up\nwhile\nwriting the test (with only `_emscripten_lookup_name` proxied, the new\ntest\nstill fails there with \"Name does not resolve\").\n\nThe new test (`test_dns_table`, with and without `PROXY_TO_PTHREAD`)\nresolves\nnames through `getaddrinfo` and `gethostbyname` and checks that they\nagree and\nthat `getnameinfo` maps both addresses back. Without this change the\npthreads\nvariant fails; with it both pass.\n\nFixes: #27886"
    },
    {
      "commit": "86cb7e78cc6a025eabb31a894a989cadf355d4c3",
      "tree": "a817501e30c5507777ffd7013e49d1ece4722dfb",
      "parents": [
        "b6b35a5079d68b80fea834ce20bb71693c2a6081"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Oct 07 00:00:58 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 00:00:58 2026"
      },
      "message": "Update third_party/terser to v5.51.2. NFC (#27901)\n\nMost of our downstream patches in `emscripten-core/terser` (preserving\nquoted object properties, `ImportExpression` and `BigInt` handling in\n`MOZ_TO_ME`, and source-phase imports) have now landed upstream.\n\nYou can see the remaining diff here\nhttps://github.com/terser/terser/compare/v5.51.2...emscripten-core:terser:emscripten_patches_v5.51.2?expand\u003d1\n\nRebundle from the `emscripten_patches_v5.51.2` branch of\n`emscripten-core/terser`, which retains only `ParenthesizedExpression`\nsupport and the minimal `main.js` entry point."
    },
    {
      "commit": "b6b35a5079d68b80fea834ce20bb71693c2a6081",
      "tree": "a5789bca52a52dcc0457f588e7b2c4f2e805f16c",
      "parents": [
        "c8fb80a3b9e73ebebca41e37d2652ffe2142f7f5"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Oct 06 23:55:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 23:55:46 2026"
      },
      "message": "[embind] Move `$getInheritedInstanceCount` and `$getLiveInheritedInstances` to `liblegacy.js` (#27899)\n\nThese functions were previously exported by default prior to #22705,\nand are no longer referenced or exported anywhere in the codebase or\ntests. Move them to `liblegacy.js` so that any external users will\nreceive a deprecation warning."
    },
    {
      "commit": "c8fb80a3b9e73ebebca41e37d2652ffe2142f7f5",
      "tree": "5e4002e2b7b64dbdd27937ebc55a34772b00be2a",
      "parents": [
        "5ddd9265c26438b676311d0b4d103e1e882c4f68"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Oct 06 23:52:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 23:52:47 2026"
      },
      "message": "Remove legacy `asm.js` `closure`/`cleanup` passes from `js_optimizer.py`. NFC (#27900)\n\n`js_optimizer.py` is now only used by `wasm2js` for `minifyNames` and\n`--minify-whitespace`. The `closure` and `cleanup` passes in\n`js_optimizer.py` and their corresponding `waka*` externs in\n`closure-externs.js` were leftover from the `asm.js` era and are no\nlonger used anywhere."
    },
    {
      "commit": "5ddd9265c26438b676311d0b4d103e1e882c4f68",
      "tree": "bc7fa3ae2d13b26d080c66c2880a665963cb14c7",
      "parents": [
        "ebf46b54b1f9728c21b3d3ad761cacd02789cf83"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Oct 06 22:17:41 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 22:17:41 2026"
      },
      "message": "Clean up `$Browser` unused properties and dependencies. NFC (#27892)\n\n- Remove unused `windowedWidth` and `windowedHeight` from `$Browser`.\n- Remove unused `$callUserCallback` and `$warnOnce` from\n`$Browser__deps`, and move `$safeSetTimeout` under `#if FILESYSTEM`\n(where its only remaining use in `$Browser` is after `#27876`).\n- Add missing `$callUserCallback` dependency to\n`emscripten_async_load_script__deps`.\n- Fix `$getPreloadedImageData__data` typo to\n`$getPreloadedImageData__deps`."
    },
    {
      "commit": "ebf46b54b1f9728c21b3d3ad761cacd02789cf83",
      "tree": "2ca24b270d99d1129cdb21caf320b10ad252ef03",
      "parents": [
        "3a2a2357c11880e0982c08bb9431b304997f740c"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Oct 06 22:16:22 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 22:16:22 2026"
      },
      "message": "[test] Remove top-level static keywords from C/C++ tests. NFC (#27873)\n\nSince almost all tests are single-file anyway, top-level `static`\nkeywords add unnecessary visual noise.\n\nDocument this guideline in `docs/process.md` and remove top-level\n`static` keywords from existing C/C++ tests.\n\nThe idea here with changing some of the existing tests is that folks\noften use existing tests as a guide when writing new ones to its good to\nhave the existing tests follow our conversions."
    },
    {
      "commit": "3a2a2357c11880e0982c08bb9431b304997f740c",
      "tree": "532a40894de69af12176c0ba0f87792b0cdc0dc5",
      "parents": [
        "05672c5c9ec5db01551ea1709fb0fdf297b05d75"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Oct 06 22:15:44 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 22:15:44 2026"
      },
      "message": "Disable `test_fs_subms_times` under deno. NFC (#27898)\n\nI\u0027m not sure why exactly its failing but it was failing when it landed.\n\nSee #27890"
    },
    {
      "commit": "05672c5c9ec5db01551ea1709fb0fdf297b05d75",
      "tree": "be17af3968ab9880205b434d1b967bbaf005f4ed",
      "parents": [
        "f55eee5187eb1e78312c67aad19192294e806eb5"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Oct 06 20:58:12 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 20:58:12 2026"
      },
      "message": "Fix JS library decorator and legacy alias typos. NFC (#27893)\n\n- Fix `$detachFinalizer_deps` -\u003e `$detachFinalizer__deps` in\n`src/lib/libembind.js`.\n- Fix `$emClearImmediate_deps` -\u003e `$emClearImmediate__deps` in\n`src/lib/libeventloop.js`.\n- Fix `$emAudioExpectNodeOrContext_internal` -\u003e\n`$emAudioExpectNodeOrContext__internal` in `src/lib/libwebaudio.js`.\n- Fix `stackRestore: \u0027$stackSave\u0027` -\u003e `stackRestore: \u0027$stackRestore\u0027` in\n`src/lib/libcore.js`."
    },
    {
      "commit": "f55eee5187eb1e78312c67aad19192294e806eb5",
      "tree": "efcc9a220ec987aad007bcbe751b32e1ca4ce628",
      "parents": [
        "6c6851df152d69a07da33c0dc30e07f9d30d284a"
      ],
      "author": {
        "name": "Hood Chatham",
        "email": "roberthoodchatham@gmail.com",
        "time": "Tue Oct 06 20:51:12 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 20:51:12 2026"
      },
      "message": "[CI] Codesize ci check: Add newline at end of diff when it fails (#27897)\n\nI want to copy the patch and apply it with `patch -p1`, but it complains\nthat the last line is truncated unless there is a trailing newline."
    },
    {
      "commit": "6c6851df152d69a07da33c0dc30e07f9d30d284a",
      "tree": "0dae81695f029445eceb55163809917865115faf",
      "parents": [
        "d0504f1dd1f5dfddb7cf1554be91670ccfe452d5"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Oct 06 20:09:59 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 20:09:59 2026"
      },
      "message": "Fix error reporting in file_packager. NFC (#27877)"
    },
    {
      "commit": "d0504f1dd1f5dfddb7cf1554be91670ccfe452d5",
      "tree": "3ac7476883c88d4b719b5a79378f075198681798",
      "parents": [
        "d38fd5a360e239619690eb3818ef8fc353c76f55"
      ],
      "author": {
        "name": "Josep Maria Blasco",
        "email": "124881707+JosepMariaBlasco@users.noreply.github.com",
        "time": "Tue Oct 06 19:02:53 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 19:02:53 2026"
      },
      "message": "Return sub-millisecond file times from MEMFS `stat()` (#27890)\n\n`MEMFS.node_ops.getattr` returned the times only as `Date` objects,\nwhich hold whole milliseconds, so `stat()` truncated them even after\n`utimensat()` had stored a sub-millisecond value (#27794 keeps 10 µs). \nThis also returns `atimeMs`/`mtimeMs`/`ctimeMs` with the exact values,\nas NODEFS does since #27787, and lets `SYSCALLS.writeStat` prefer the\n`*Ms` properties in every environment, not only when \n`ENVIRONMENT_MAY_BE_NODE` (MEMFS is used in the\nbrowser too). The `Date` properties stay, for JS users of `FS.stat`.\n\nThe new test (`test_fs_subms_times`, all filesystems) sets a time with\n`utimensat()` and reads it back with `stat()` and `fstat()`; before this\nchange only the MEMFS variant failed. Checked as well with\n`-sENVIRONMENT\u003dweb` in Chromium (`.123000000` before, `.123449951`\nafter).\n\nCodesize: +54 bytes of JS where MEMFS is included; wasm unchanged.\n\nNot included: the second suggestion in the issue (stamping files with a\nsub-millisecond clock instead of `Date.now()`), which touches more\nplaces and changes behaviour; happy to do it as a follow-up if wanted.\n\nFixes: #27885"
    },
    {
      "commit": "d38fd5a360e239619690eb3818ef8fc353c76f55",
      "tree": "e730819c875e307b8e74764c55b9f51dfe642d2c",
      "parents": [
        "49a4a1a6d311dae32bda584ae41c5c130f81bc7d"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Oct 06 16:23:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 16:23:08 2026"
      },
      "message": "Avoid setting legacy `alt_names` in `STRICT` mode (#27883)\n\nWhen `STRICT` is enabled, `SettingsManager` removes `legacy_settings`\nfrom `self.attrs`. However, modifying any setting that has a legacy\nalias in `self.alt_names` (such as `INITIAL_MEMORY` -\u003e `TOTAL_MEMORY`\nor `WASM` -\u003e `BINARYEN`) after `STRICT\u003d1` was set would unconditionally\nwrite `self.attrs[alt_name] \u003d value`, re-introducing the legacy setting\ninto `self.attrs` and `external_dict()`.\n\nOnly update `self.attrs[alt_name]` when not in `STRICT` mode."
    },
    {
      "commit": "49a4a1a6d311dae32bda584ae41c5c130f81bc7d",
      "tree": "11688c6280cae159a92b84406201a084b5c79c63",
      "parents": [
        "e3a184098c5253e6568c2790a175c0c5ca1580b0"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Oct 06 15:20:30 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 15:20:30 2026"
      },
      "message": "Use `cDefs.SDL_FULLSCREEN` instead of hardcoded constant in `libbrowser.js`. NFC (#27875)"
    },
    {
      "commit": "e3a184098c5253e6568c2790a175c0c5ca1580b0",
      "tree": "5e4d46122cc28ec6a8ef77bce726d122a697e253",
      "parents": [
        "7c3a7a9a08cb434f76d192270c012f8134cd77af"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Oct 06 15:12:18 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 15:12:18 2026"
      },
      "message": "Remove old code for supported old version of SDL2. NFC (#27876)"
    },
    {
      "commit": "7c3a7a9a08cb434f76d192270c012f8134cd77af",
      "tree": "bdc9e8b5f2ee5b44f52f3f87077ce41df365aa4d",
      "parents": [
        "c5b9b37fb7d9e0d29a5c6f742d9b7b264873b3af"
      ],
      "author": {
        "name": "emscripten-bot",
        "email": "179889221+emscripten-bot@users.noreply.github.com",
        "time": "Tue Oct 06 15:07:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 15:07:46 2026"
      },
      "message": "Update emsdk version from 96ca7111 to f97bc361 (#27884)\n\nThis is an automatic change generated by tools/maint/rebaseline_tests.py\n--update-emsdk.\n\nemsdk version updated: 96ca7111 \u003d\u003e f97bc361\n\nThe following revisions were included in this update:\n\n```\n- f97bc361 Roll llvm-project from 1def37acda3f to f42afb122770 (36 revisions)\n- 4491131e Roll binaryen from 36a0c5e49cb3 to 1d7748aa4ef4 (2 revisions)\n- 17d170dc Roll llvm-project from 8262a4b73915 to 1def37acda3f (68 revisions)\n- 9f682efb Roll emscripten from c21f4d950bba to c5b9b37fb7d9 (1 revision)\n- 85ecd565 Roll binaryen from 5fcecf3318de to 36a0c5e49cb3 (1 revision)\n- bf1ff6bc Roll emscripten from b669e1b8ab04 to c21f4d950bba (5 revisions)\n- e40b97ff Roll binaryen from 941e923299aa to 5fcecf3318de (1 revision)\n- 9483f35c Roll llvm-project from 4ab5e4e472cd to 8262a4b73915 (80 revisions)\n- 35342161 Roll llvm-project from 09910aa04480 to 4ab5e4e472cd (63 revisions)\n- f9ea6903 Roll v8 from 25f453581b58 to 5c52bfb643b2 (4 revisions)\n- b508cebf Roll llvm-project from f7e8e3d0bf7c to 09910aa04480 (13 revisions)\n```\n\nFull log:\nhttps://chromium.googlesource.com/emscripten-releases/+log/96ca7111..f97bc361\n\nThe following (1) test expectation files were updated by\nrunning the tests with `--rebaseline`:\n\n```\ncodesize/test_codesize_hello_dylink_all.json: 860706 \u003d\u003e 860710 [+4 bytes / +0.00%]\n\nAverage change: +0.00% (+0.00% - +0.00%)\n```\n\nCo-authored-by: emscripten-bot \u003cemscripten-bot@users.noreply.github.com\u003e"
    },
    {
      "commit": "c5b9b37fb7d9e0d29a5c6f742d9b7b264873b3af",
      "tree": "4a4d551b59c67e76a0e58c466703ce773298424b",
      "parents": [
        "c21f4d950bba32ab82ddc1fc26248c6a3df1b6fe"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Mon Oct 05 22:36:16 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 22:36:16 2026"
      },
      "message": "Fix `tools/emcoverage.py`  (#27869)\n\n1. In `tools/emcoverage.py`, strip `-E` passed by compiler entry point\nscripts, and resolve commands to root `.py` files.\n2. In `tools/config.py`, normalize `EMSDK_PYTHON` with\n`os.path.abspath()` instead of `sys.executable`, which prevented child\nprocesses from executing under custom wrappers.\n3. In `tools/emcoverage.py`, pass `ignore_errors\u003dTrue` to `rmtree`\nduring reset."
    },
    {
      "commit": "c21f4d950bba32ab82ddc1fc26248c6a3df1b6fe",
      "tree": "a139615a5c234a1df62e6f0a403c26af534c17d0",
      "parents": [
        "0baa59c788a1e1d87babd81d11a4f8299aa3f6ac"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Mon Oct 05 20:10:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 20:10:48 2026"
      },
      "message": "Fix gen_struct_info flakiness (#27864)\n\nWhen `gen_struct_info.py` runs, it executes a compiled Wasm binary via\nNode.js over a pipe. In #24489, `fd_write` in `src/lib/libbootstrap.js`\nwas implemented using `process.stdout.write(HEAPU8.subarray(...))`.\n\nHowever, in Node.js on POSIX, `process.stdout.write` is asynchronous\nwhen writing to a pipe. When the kernel pipe buffer fills up, Node\nbuffers a reference to the `Uint8Array` slice rather than copying it.\nBecause Wasm continues running synchronously, musl libc reuses the same\n1024-byte `stdout` buffer in Wasm memory for subsequent `printf` calls.\nWhen Node later flushes its buffer, it transmits the overwritten memory,\nleading to corrupted JSON and intermittent failures in\n`other.test_gen_struct_info`.\n\nUse `fs.writeSync(fd, ...)` instead to perform synchronous writes and\navoid buffering references into Wasm linear memory. Also remove the\nflaky annotation added in #25207.\n\nFixes: #25206"
    },
    {
      "commit": "0baa59c788a1e1d87babd81d11a4f8299aa3f6ac",
      "tree": "c4531bcb35386bb0fd8297518b6b39ba13d10a87",
      "parents": [
        "862dc0d48acc4134a0088d27ac8f5dd18baba1cd"
      ],
      "author": {
        "name": "benedikt brunner",
        "email": "122370755+Benedikt-Brunner@users.noreply.github.com",
        "time": "Mon Oct 05 19:57:26 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 19:57:26 2026"
      },
      "message": "[FS] Fix rename test windows (#27872)\n\nFollow-up to #27861, see\nhttps://github.com/emscripten-core/emscripten/pull/27861#issuecomment-5999483004.\n\n`test_absolute_root` mounted NODEFS at `process.cwd()` so host and VFS\npaths differ. On Windows that path is `C:\\...`, which `PATH.isAbs`\ndoesn\u0027t recognize, so `test_fs_rename_on_existing_nodefs` fails on the\nWindows autoroller.\n\nReplace it with `test_second_mount`, which needs no absolute host path:\n\n- Mount NODEFS with `root: \u0027.\u0027` a second time at `/other`.\n- Create an unrelated MEMFS file `/memcwd/other_b` and `chdir` into\n`/memcwd`.\n- Rename `/other/other_a` onto `/other/other_b`.\n\nThe target\u0027s host path is then `other_b`, which the old NODEFS code\npassed to `FS.unlink` and which resolved in the VFS cwd to\n`/memcwd/other_b`. So the test still covers both failures from #27860:\nthe unrelated file gets deleted, and the stale node stays in\n`FS.nameTable`.\n\nWith the library changes from #27861 reverted, the `nodefs` variant\nfails at the MEMFS file check. With that check disabled as well, it\nfails at `access(\"/other/other_b\", F_OK)`. With them in place, all\nvariants pass in `core0`, `core2` and `core3`. I couldn\u0027t run it on\nWindows locally.\n\nThis change was prepared with the help of an AI assistant (Claude). I\nreviewed it to the best of my ability."
    },
    {
      "commit": "862dc0d48acc4134a0088d27ac8f5dd18baba1cd",
      "tree": "ef98501b905dd8e634d3659e1c8c9b92d673e4f8",
      "parents": [
        "2b6e96a4b0b7d8a3831788908d9d6fe84edc02ff"
      ],
      "author": {
        "name": "emscripten-bot",
        "email": "179889221+emscripten-bot@users.noreply.github.com",
        "time": "Mon Oct 05 15:27:50 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 15:27:50 2026"
      },
      "message": "Update emsdk version from 5a61bb5e to 96ca7111 (#27870)\n\nThis is an automatic change generated by tools/maint/rebaseline_tests.py\n--update-emsdk.\n\nemsdk version updated: 5a61bb5e \u003d\u003e 96ca7111\n\nThe following revisions were included in this update:\n\n```\n- 96ca7111 Roll binaryen from 82439ad019a4 to 941e923299aa (1 revision)\n- c4aa144f Roll llvm-project from 5e1edea79061 to f7e8e3d0bf7c (19 revisions)\n- 811f9cbf Roll llvm-project from 2f99c9c58eb6 to 5e1edea79061 (14 revisions)\n- d4a36dba Roll llvm-project from eddb17da45c0 to 2f99c9c58eb6 (9 revisions)\n- b1ea4309 Roll llvm-project from 72b39c854fd7 to eddb17da45c0 (11 revisions)\n```\n\nFull log:\nhttps://chromium.googlesource.com/emscripten-releases/+log/5a61bb5e..96ca7111\n\nCo-authored-by: emscripten-bot \u003cemscripten-bot@users.noreply.github.com\u003e"
    },
    {
      "commit": "2b6e96a4b0b7d8a3831788908d9d6fe84edc02ff",
      "tree": "8ced22ee8238ed6d84e1b1ad2d3414d688f899db",
      "parents": [
        "6e79c0d6c3c97b24beff3813e60f8c304e1a5d4f"
      ],
      "author": {
        "name": "emscripten-bot",
        "email": "179889221+emscripten-bot@users.noreply.github.com",
        "time": "Mon Oct 05 00:17:06 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 00:17:06 2026"
      },
      "message": "Update emsdk version from 99a65d83 to 5a61bb5e (#27867)\n\nThis is an automatic change generated by tools/maint/rebaseline_tests.py\n--update-emsdk.\n\nemsdk version updated: 99a65d83 \u003d\u003e 5a61bb5e\n\nThe following revisions were included in this update:\n\n```\n- 5a61bb5e Roll llvm-project from 65a82906cff9 to 72b39c854fd7 (22 revisions)\n- bbcf044d Roll v8 from e3ddb93205db to 25f453581b58 (3 revisions)\n- c4114dd6 Roll llvm-project from 9efb84184097 to 65a82906cff9 (14 revisions)\n- 7cdd9dcc Roll llvm-project from 1e60b852a9d7 to 9efb84184097 (22 revisions)\n- 2f8e1f40 Roll emscripten from 5977eccc5ca1 to b669e1b8ab04 (1 revision)\n- 6cff651b Roll llvm-project from 7516fa2ca8a4 to 1e60b852a9d7 (22 revisions)\n- f78bde51 Roll llvm-project from 8a0b352d3ef8 to 7516fa2ca8a4 (30 revisions)\n```\n\nFull log:\nhttps://chromium.googlesource.com/emscripten-releases/+log/99a65d83..5a61bb5e\n\nCo-authored-by: emscripten-bot \u003cemscripten-bot@users.noreply.github.com\u003e"
    },
    {
      "commit": "6e79c0d6c3c97b24beff3813e60f8c304e1a5d4f",
      "tree": "4bcdc849c9d1e8b2666fbc518097cee59d36653c",
      "parents": [
        "b669e1b8ab04193c794d5e2b3dd4684b0f5f5913"
      ],
      "author": {
        "name": "benedikt brunner",
        "email": "122370755+Benedikt-Brunner@users.noreply.github.com",
        "time": "Sat Oct 03 18:43:41 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 18:43:41 2026"
      },
      "message": "[FS] Fix rename onto an existing file in NODEFS and PROXYFS (#27861)\n\nFixes #27860.\n\nWhen `rename()` replaces an existing file, the replaced file\u0027s node has\nto leave `FS.nameTable`, or it keeps the path visible after that file is\nunlinked: `access()` succeeds and `open(O_CREAT | O_EXCL)` fails with\nEEXIST, while `stat()` fails with ENOENT. #23074 made each backend\nresponsible for that, and only MEMFS got it right:\n\n- NODEFS called `FS.unlink(newPath)` with the target\u0027s *host* path. That\nonly resolves to the target when the mount\u0027s root is `.` and the current\ndirectory is the mount point, which is the setup of\n`test/setup_nodefs.js`. With any other mount it either silently fails,\nleaving the stale node, or unlinks an unrelated VFS file that lives at\nthat host path.\n- PROXYFS never evicted the node.\n\nEvict the replaced node once in `FS.rename`, which already looks it up,\nafter the backend rename succeeded, and drop the per-backend evictions\n(MEMFS\u0027s and NODEFS\u0027s `FS.unlink`). Evicting before a failed rename\nwould change the target\u0027s inode number on NODEFS, which reports\n`node.id` as `st_ino`.\n\n`test_fs_rename_on_existing` now also covers a NODEFS mount by absolute\npath (including the unrelated-file case) and a PROXYFS mount. Without\nthe library changes, the `nodefs` and default variants fail; with them,\nall variants pass in `core0`, `core2` and `core3`.\n\nThis change was prepared with the help of an AI assistant (Claude). I\nreviewed it to the best of my ability.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "b669e1b8ab04193c794d5e2b3dd4684b0f5f5913",
      "tree": "d1ff062093dc939d531a6f57ba6558bb7b1bc47a",
      "parents": [
        "5977eccc5ca16a50e829c7d020d6cd3a8e02a6f8"
      ],
      "author": {
        "name": "emscripten-bot",
        "email": "179889221+emscripten-bot@users.noreply.github.com",
        "time": "Sat Oct 03 15:19:09 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 15:19:09 2026"
      },
      "message": "Update emsdk version from dbaebb43 to 99a65d83 (#27865)\n\nThis is an automatic change generated by tools/maint/rebaseline_tests.py\n--update-emsdk.\n\nemsdk version updated: dbaebb43 \u003d\u003e 99a65d83\n\nThe following revisions were included in this update:\n\n```\n- 99a65d83 Roll emscripten from 30f57a088359 to 5977eccc5ca1 (1 revision)\n- 4dc20c2d Roll llvm-project from f616c059510b to 8a0b352d3ef8 (49 revisions)\n- 5bd78331 Roll v8 from 224636ddeac8 to e3ddb93205db (29 revisions)\n- da4887a1 Roll emscripten from 020821958255 to 30f57a088359 (2 revisions)\n- 945165ee Roll emscripten from e277c5b7a296 to 020821958255 (4 revisions)\n- 223eb5c8 Roll llvm-project from 7e18d9610ab3 to f616c059510b (90 revisions)\n- 826093a4 Roll binaryen from ee134268758c to 82439ad019a4 (1 revision)\n- 40229bc6 Roll emscripten from 03e07f834a0b to e277c5b7a296 (3 revisions)\n- 40a710c0 Roll binaryen from f3ab99600941 to ee134268758c (2 revisions)\n- 809e4f15 Roll emscripten from a0014542110d to 03e07f834a0b (1 revision)\n- ece9c77a Roll llvm-project from f718ebe87341 to 7e18d9610ab3 (59 revisions)\n- f6264d4a Version 6.0.11 RC\n- f38241a0 Roll llvm-project from d3e9891b54da to f718ebe87341 (45 revisions)\n```\n\nFull log:\nhttps://chromium.googlesource.com/emscripten-releases/+log/dbaebb43..99a65d83\n\nCo-authored-by: emscripten-bot \u003cemscripten-bot@users.noreply.github.com\u003e"
    },
    {
      "commit": "5977eccc5ca16a50e829c7d020d6cd3a8e02a6f8",
      "tree": "4c51bbec54e5bed1cb5da080ad9a3df23950f3c7",
      "parents": [
        "30f57a0883597de57ceced5d496098a4f04a53cd"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Sat Oct 03 01:20:16 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 01:20:16 2026"
      },
      "message": "[GL] Update alias targets when renaming GL functions in JS library (#27855)\n\nWhen `recordGLProcAddressGet` renames GL functions to `emscripten_gl*`,\nit was leaving alias targets pointing to the original un-prefixed name.\nIf the alias target happens to be exported from WebAssembly (such as\nwhen compiled with `-sEXPORT_ALL\u003d1` and native GL proxy wrappers),\n`jsifier` would mistake the JS alias for a native symbol alias, failing\nto generate the JS function and causing an undefined property error when\nsetting `.sig` under `-sMAIN_MODULE`.\n\nAlso, guard against setting `.sig` on native aliases in `jsifier.mjs`\nunder `-sMAIN_MODULE`.\n\nFixes: #27852"
    },
    {
      "commit": "30f57a0883597de57ceced5d496098a4f04a53cd",
      "tree": "176a3ae601804d25abe110732e35d7b658e22e59",
      "parents": [
        "994494bf2cbc7a855be65310ddbc290138bb87f5"
      ],
      "author": {
        "name": "Guy Bedford",
        "email": "guybedford@gmail.com",
        "time": "Sat Oct 03 00:05:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 00:05:08 2026"
      },
      "message": "Add emscripten_epoll_listener_add/remove for epoll readiness callbacks (#27547)\n\nFollow-on to #27207.\n\nAdds experimental `emscripten_epoll_listener_add` and\n`emscripten_epoll_listener_remove` under a new experimental\n`\u003cemscripten/epoll.h\u003e`, to allow registering for readiness on an epoll\nfd. The runtime then invokes the callback from the event loop whenever\nthe set has uncollected ready events. The callback itself does not\ncollect ready events, rather a zero-timeout `epoll_wait` within the\ncallback itself is able to do this. Allows supporting epoll on a single\nthread without blocking the main thread or requiring JSPI.\n\n* Any number of listeners, identified by the (callback, userdata) pair\nas for the HTML5 event handlers; a duplicate pair is `EEXIST`, and\n`emscripten_epoll_listener_remove(epfd, callback, userdata)` removes by\npair.\n* Every listener is signalled while uncollected ready events remain, and\ncollectors race over the single shared ready list. `EPOLLET` and\n`EPOLLONESHOT` items are therefore collected by exactly one listener,\nmatching distribution between multiple blocking `epoll_wait` callers.\n* Firing is gated on the same readiness derivation used by the epoll\nfd\u0027s own poll handler, so stale ready-list entries never spuriously\nfire. Delivery occurs on a later event-loop task, never re-entrantly\nunder the frames that made the set ready.\n* A listener is an unref\u0027d handle: it does not keep the runtime alive. A\nprogram whose only reason to stay alive is a listener holds the runtime\nitself with `emscripten_runtime_keepalive_push()`/`pop()`. The runtime\nonly takes a temporary hold for scheduled delivery.\n* Listeners are main-thread-only. With pthreads, registration from\nanother thread returns `ENOTSUP`; pthreads can use blocking\n`epoll_wait()` directly.\n* If a callback leaves the set ready, another delivery task is\nscheduled, yielding to I/O between level-triggered callbacks. A fatal\nerror escaping the callback remains an uncaught task exception rather\nthan an unhandled rejection.\n* Listeners are epoll-instance state: they are shared across dup\u0027d fds\nand removed on the last close."
    },
    {
      "commit": "994494bf2cbc7a855be65310ddbc290138bb87f5",
      "tree": "03c5203646a75f741028bfcdb349870560654d35",
      "parents": [
        "020821958255e906889808b41ef3b836c6e9b239"
      ],
      "author": {
        "name": "Alexis Williams",
        "email": "typedrat@users.noreply.github.com",
        "time": "Fri Oct 02 23:03:10 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 23:03:10 2026"
      },
      "message": "Honor MAXIMUM_MEMORY for an imported memory without growth (#27862)\n\nWithout `ALLOW_MEMORY_GROWTH`, emcc drops a user-set `MAXIMUM_MEMORY`\nwith a warning and links with `--no-growable-memory`, so an imported\nmemory must be exactly `INITIAL_MEMORY`. With `IMPORTED_MEMORY` the\nembedder creates the memory, so a larger maximum lets one build run in a\nmemory sized at load time.\n\nThis keeps a user-set `MAXIMUM_MEMORY` when `IMPORTED_MEMORY` is set and\npasses it to wasm-ld as `--max-memory`, even without growth. Nothing\nelse changes without growth: the memory is never grown,\n`emscripten_resize_heap()` still fails, and a memory Emscripten creates\nitself is still `INITIAL_MEMORY`. As discussed in the issue, the module\ntakes the embedder\u0027s word that the memory won\u0027t be grown from outside;\nthe setting\u0027s documentation now says so, and suggests creating the\nmemory with its maximum equal to its initial size. The ChangeLog is\nupdated.\n\nTest: `test_bad_memory_size` now also checks that a 50MB imported memory\nworks without growth given `-sMAXIMUM_MEMORY\u003d64mb` (with `-Werror`, so\nno warning). It fails on `main` and passes with this change.\n`test_invalid_memory_max` gets the new warning text.\n\nFixes: #27859"
    },
    {
      "commit": "020821958255e906889808b41ef3b836c6e9b239",
      "tree": "679256eca0881b8c9749927f31993720b9a27e0d",
      "parents": [
        "ce6d2aad8bbf1e508e5a6d112f986617198bdc0d"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Fri Oct 02 21:58:29 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 21:58:29 2026"
      },
      "message": "Bump google-closure-compiler to 20260909.0.0 (#27857)\n\nUpdate `google-closure-compiler` dependency to version 20260909.0.0.\n\nRebaseline codesize test expectations for the updated compiler output."
    },
    {
      "commit": "ce6d2aad8bbf1e508e5a6d112f986617198bdc0d",
      "tree": "994be12de35d2ab55e0b8bac82bbe956267d50d0",
      "parents": [
        "9aad1ecbff605c83a125355dd3f7ad6fa6ffc08f"
      ],
      "author": {
        "name": "emscripten-bot",
        "email": "179889221+emscripten-bot@users.noreply.github.com",
        "time": "Fri Oct 02 20:50:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 20:50:46 2026"
      },
      "message": "Mark 6.0.11 as released (#27856)\n\nCo-authored-by: emscripten-bot \u003cemscripten-bot@users.noreply.github.com\u003e"
    },
    {
      "commit": "9aad1ecbff605c83a125355dd3f7ad6fa6ffc08f",
      "tree": "b5336c1721beb7bf4d61e7ad4effade97e4294d3",
      "parents": [
        "fd9124b53d4933176e331aa58dcbc13c506db0a1"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Fri Oct 02 20:21:26 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 20:21:26 2026"
      },
      "message": "[esm-integration] Sequentialize uncaught exceptions in Node.js workers (#27854)\n\nIn #25041, uncaught exceptions in Node.js worker threads were captured\nand sequentialized over the `postMessage` pipe to resolve a race\ncondition where Node.js delivers worker uncaught exception events before\nearlier `postMessage`s (such as proxied `onAbort` handlers). That change\nfixed #15014 for non-ESM builds.\n\nHowever, that workaround in `src/runtime_common.js` was omitted under\n`-sWASM_ESM_INTEGRATION` because worker threads bootstrap via\n`src/pthread_esm_startup.mjs` instead. As a result, `test_pthread_abort`\nremained flaky under `esm_integration`.\n\nThis installs the same `process.on(\u0027uncaughtException\u0027)` handler in\n`src/pthread_esm_startup.mjs` and removes the `@flaky` annotation from\n`test_pthread_abort`.\n\nSee: #15014\nFixes: #25151"
    },
    {
      "commit": "fd9124b53d4933176e331aa58dcbc13c506db0a1",
      "tree": "8989bdedb7b85a16dd3134aed73f0bc96ce36cb3",
      "parents": [
        "e277c5b7a296baabffb194f2d27e2000ae4761df"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Fri Oct 02 19:48:29 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 19:48:29 2026"
      },
      "message": "[FS] Fix Closure compiler arity and type warnings with `-sEXPORT_ES6` (#27749)\n\nWhen `-sEXPORT_ES6` is enabled, Closure Compiler compiles output in ES\nmodule mode (`--chunk_output_type ES_MODULES`), which enforces strict\narity checks (`JSC_WRONG_ARGUMENT_COUNT`) and object property type\nchecks (`JSC_TYPE_MISMATCH`) that are otherwise silently ignored in\ntraditional global script mode.\n\nGive optional parameters default values (`\u003d undefined` or appropriate\ndefaults like `dontFollow \u003d false`), initialize `nameTable: []` instead\nof `null`, and remove surplus arguments at call sites in `libsyscall.js`\nand `libnodefs.js`.\n\nSee https://github.com/google/closure-compiler/issues/4344\n\nFixes: #27747"
    },
    {
      "commit": "e277c5b7a296baabffb194f2d27e2000ae4761df",
      "tree": "cf99e90aeabd4cc1a89fed52be6ff5c5f4647162",
      "parents": [
        "af00896bf5b88257679c23f0f6a905f4d6932e6a"
      ],
      "author": {
        "name": "Brendan Dahl",
        "email": "brendan.dahl@gmail.com",
        "time": "Fri Oct 02 18:39:26 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 18:39:26 2026"
      },
      "message": "Bump google-closure-compiler to 20260831.0.0 (#27689)\n\nUpdate google-closure-compiler dependency to version 20260831.0.0.\n\nRemove the WebAssembly.Memory.prototype.toResizableBuffer extern\ndefinition, which is now provided natively by Closure Compiler.\n\nUpdate the fixedGetContext return type annotation to RenderingContext to\nmatch Closure\u0027s updated HTMLCanvasElement getContext extern.\n\nRebaseline codesize test expectations for the updated compiler output."
    },
    {
      "commit": "af00896bf5b88257679c23f0f6a905f4d6932e6a",
      "tree": "b16dd8cdc19efafe4c805b38d12f9633b6a0fc0c",
      "parents": [
        "2f63577277d0dacc97d86871e70dbfbae89c35a3"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Fri Oct 02 17:28:19 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 17:28:19 2026"
      },
      "message": "Mark SCons support (`emscons` and `tools/scons`) as deprecated (#27848)\n\nEmit a deprecation warning from both `emscons.py` and the SCons tool in\n`tools/scons/site_scons/site_tools/emscripten/emscripten.py`.\n\nSee: #27835"
    },
    {
      "commit": "2f63577277d0dacc97d86871e70dbfbae89c35a3",
      "tree": "1beff12f622ebebf4af49f590c2aed182eaffa92",
      "parents": [
        "03e07f834a0b54fa3953fc6df22236f315b80020"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Fri Oct 02 16:48:25 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 16:48:25 2026"
      },
      "message": "Add `stripDefaultUndefined` pass to `acorn-optimizer.mjs` (#27839)\n\nDefault parameter values of `\u003d undefined` are useful for satisfying\nClosure Compiler arity checks in ES module mode (`-sEXPORT_ES6`), but\nhave no runtime semantic effect in JavaScript.\n\nAdd an Acorn optimizer pass `stripDefaultUndefined` to strip `\u003d\nundefined` from `AssignmentPattern` nodes during `minify_wasm_js` when\nClosure Compiler is not used (Closure Compiler already strips them\nitself when enabled).\n\nSee: #27749"
    },
    {
      "commit": "03e07f834a0b54fa3953fc6df22236f315b80020",
      "tree": "948264001f73c8691f2250ac16082e2af19ca27e",
      "parents": [
        "a0014542110d6078c3a1a7941fa1ddb3a2281f16"
      ],
      "author": {
        "name": "emscripten-bot",
        "email": "179889221+emscripten-bot@users.noreply.github.com",
        "time": "Fri Oct 02 15:53:06 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 15:53:06 2026"
      },
      "message": "Update emsdk version from c366a3c2 to dbaebb43 (#27850)\n\nThis is an automatic change generated by tools/maint/rebaseline_tests.py\n--update-emsdk.\n\nemsdk version updated: c366a3c2 \u003d\u003e dbaebb43\n\nThe following revisions were included in this update:\n\n```\n- dbaebb43 Roll llvm-project from 20a018a6d9e1 to d3e9891b54da (32 revisions)\n- 8ea58e72 Roll llvm-project from f13b065a777a to 20a018a6d9e1 (61 revisions)\n- 398b85a7 Roll emscripten from f9ce3a19e7d6 to a0014542110d (3 revisions)\n- 93a88888 Roll binaryen from 6212e86b002e to f3ab99600941 (1 revision)\n- c95fa85a Roll emscripten from 04df3de0b990 to f9ce3a19e7d6 (5 revisions)\n- 233e09b2 Roll v8 from 96cf05b94228 to 224636ddeac8 (46 revisions)\n- f52d2c8e Roll llvm-project from ee0fac8539ed to f13b065a777a (58 revisions)\n- 7baac43d Roll emscripten from 15cba8d2b638 to 04df3de0b990 (6 revisions)\n- 9b10bb0c Roll binaryen from 06f14fc52237 to 6212e86b002e (3 revisions)\n- 6aea15b5 Roll emscripten from 2151200a7af9 to 15cba8d2b638 (2 revisions)\n- ab400a20 Roll binaryen from 4d8ac549e2ab to 06f14fc52237 (1 revision)\n- 9f11a945 Roll llvm-project from eb7c25df7553 to ee0fac8539ed (52 revisions)\n- 6eb5b14a Roll llvm-project from 1f5222198a91 to eb7c25df7553 (24 revisions)\n```\n\nFull log:\nhttps://chromium.googlesource.com/emscripten-releases/+log/c366a3c2..dbaebb43\n\nThe following (1) test expectation files were updated by\nrunning the tests with `--rebaseline`:\n\n```\ncodesize/test_codesize_hello_dylink_all.json: 859799 \u003d\u003e 859823 [+24 bytes / +0.00%]\n\nAverage change: +0.00% (+0.00% - +0.00%)\n```\n\nCo-authored-by: emscripten-bot \u003cemscripten-bot@users.noreply.github.com\u003e"
    },
    {
      "commit": "a0014542110d6078c3a1a7941fa1ddb3a2281f16",
      "tree": "e92f695a3ef41e5b0e717b729516496a8255d7bf",
      "parents": [
        "e457c759cade007927c7d421bf269e7b3b2145de"
      ],
      "author": {
        "name": "Alexis Williams",
        "email": "typedrat@users.noreply.github.com",
        "time": "Fri Oct 02 00:04:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 00:04:35 2026"
      },
      "message": "[WasmFS] Report pipes as S_IFIFO (#27842)\n\nUnder WasmFS, `fstat()` on either end of a `pipe()` reports `S_IFREG`,\nso `S_ISFIFO()` is false. The legacy JS file system already reports\n`S_IFIFO`.\n\n`PipeFile` used the `DataFile` constructor that always sets `S_IFREG`;\nit now passes `S_IFIFO`, as the special files already do with `S_IFCHR`.\nPipes stay non-seekable through the existing `seekable` flag.\n\nTest: `test/unistd/pipe.c` asserts `S_ISFIFO()` on both ends.\n`wasmfs.test_unistd_pipe` and `wasmfs.test_unistd_pipe_rawfs` fail\nwithout the fix and pass with it.\n\nFixes: #27827"
    },
    {
      "commit": "e457c759cade007927c7d421bf269e7b3b2145de",
      "tree": "ad509ebd08f4b9bf71340d30bbb2181267375901",
      "parents": [
        "85a69585fb9a828cb5ccb80555912a97bc2cee4f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 23:43:22 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 23:43:22 2026"
      },
      "message": "[deps]: Bump the development-dependencies group across 1 directory with 11 updates (#27836)\n\nBumps the development-dependencies group with 11 updates in the /\ndirectory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [@eslint/eslintrc](https://github.com/eslint/eslintrc) | `3.3.5` |\n`3.3.7` |\n| [es-check](https://github.com/yowainwright/es-check) | `9.6.4` |\n`9.8.1` |\n| [eslint](https://github.com/eslint/eslint) | `10.6.0` | `10.11.0` |\n| [globals](https://github.com/sindresorhus/globals) | `17.7.0` |\n`17.12.0` |\n| [prettier](https://github.com/prettier/prettier) | `3.9.4` | `3.9.9` |\n| [rollup](https://github.com/rollup/rollup) | `4.62.2` | `4.63.5` |\n| [source-map](https://github.com/mozilla/source-map) | `0.7.6` |\n`0.8.0` |\n| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) |\n`8.1.2` | `8.3.1` |\n| [webpack](https://github.com/webpack/webpack) | `5.108.3` | `5.111.1`\n|\n| [webpack-cli](https://github.com/webpack/webpack-cli) | `7.1.0` |\n`7.2.3` |\n| [ws](https://github.com/websockets/ws) | `8.21.0` | `8.22.0` |\n\nUnlike most npm deps updates this change comes with a slight codesize\nwin (due to terser upgrade which is used in html-minifier-terser)\n\n---------\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Sam Clegg \u003csbc@chromium.org\u003e"
    },
    {
      "commit": "85a69585fb9a828cb5ccb80555912a97bc2cee4f",
      "tree": "a007a02a8f988dc22815d4aaeb00af2cc785a297",
      "parents": [
        "f9ce3a19e7d6b34d5c74cd71dd245962aab6f6f5"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 23:15:32 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 23:15:32 2026"
      },
      "message": "[deps]: Bump github/codeql-action/upload-sarif from 4.37.9 to 4.38.2 (#27837)"
    },
    {
      "commit": "f9ce3a19e7d6b34d5c74cd71dd245962aab6f6f5",
      "tree": "d73a342823834f197495c3f1d9930ec83c42a3e1",
      "parents": [
        "c0edf5bd731de4e5886e7bdbf77a06af8c4b37db"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Oct 01 22:51:04 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 22:51:04 2026"
      },
      "message": "[test] Fix WebGL errors in `full_es2_sdlproc.c` (#27834)\n\n`draw_gear` in `full_es2_sdlproc.c` was calling `glDrawElements` with\n`GL_FLOAT` (an invalid index type in OpenGL ES 2.0 / WebGL) and passing\nan integer vertex offset (`gear-\u003estrips[n].first`) as the client-side\n`indices` pointer without a bound `GL_ELEMENT_ARRAY_BUFFER`.\n\nConstruct a valid `GLushort` index array for each strip and pass\n`GL_UNSIGNED_SHORT` to `glDrawElements`, call `gears_reshape(300, 300)`\nbefore `gears_draw()`, and assert `glGetError() \u003d\u003d GL_NO_ERROR`. Also\nremove the `-Wno-int-conversion` workaround from `test_fulles2_sdlproc`."
    },
    {
      "commit": "c0edf5bd731de4e5886e7bdbf77a06af8c4b37db",
      "tree": "1ea25968f27b308759eb182e0f11bafb2fa28e99",
      "parents": [
        "e81f85424d09439b4af1f2066ca8a2408878c2e5"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Oct 01 22:47:18 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 22:47:18 2026"
      },
      "message": "[GLUT/GLFW] Stop resizing canvas to 1x1 on exit/termination (#27833)\n\nIn 2012, `Module[\"canvas\"].width \u003d Module[\"canvas\"].height \u003d 1` was\nadded to the GLUT exit handler in `libglut.js` (#357) to simulate\nclosing the window when a GLUT program calls `exit()`.\n\nWhen `libglfw.js` was created in 2013 (#1006), it was copied from\n`libglut.js` as a template along with the `atexit` handler in\n`glfwInit`, which was later moved into `glfwTerminate` when GLFW 3\nsupport was added in 2014 (#1887).\n\nRemove this 1x1 canvas resize from both libraries:\n- Neither SDL1, SDL2, nor EGL resizes the canvas to 1x1 on shutdown or\nexit.\n- Calling `glfwInit()` followed by `glfwTerminate()` (even without\ncreating a window) unexpectedly clobbers the canvas dimensions.\n- Resizing the canvas clears its bitmap, which destroys rendered output\nif an application renders a static frame and then calls\n`glfwTerminate()` or exits with `EXIT_RUNTIME\u003d1`.\n- In GLFW HiDPI mode, inline CSS dimensions remain set on the canvas, so\nsetting `width` and `height` to 1 only shrinks the backing buffer while\nleaving the element at its previous CSS size."
    },
    {
      "commit": "e81f85424d09439b4af1f2066ca8a2408878c2e5",
      "tree": "0efde6bd4786fc8e0adb55041ca5adb0f43fe5b8",
      "parents": [
        "941e5145e12a1a16889bf0fadb9f48bb82d6dda7"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Oct 01 22:21:26 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 22:21:26 2026"
      },
      "message": "[test] Deflake `test_pthread_kill` (#27819)\n\nRemove the racing `printf(\"SIGTERM sent\\n\")` call on the main thread\nimmediately after `pthread_kill(child_thread, SIGTERM)`, which raced\nwith `child_thread` printing from its `SIGTERM` signal handler. Also\nwait for `got_sigusr1` before `pthread_join` so all output lines have a\nstrict happens-before ordering.\n\nFixes: #24725"
    },
    {
      "commit": "941e5145e12a1a16889bf0fadb9f48bb82d6dda7",
      "tree": "e3b00b90ae4d35b545ee2ae462e31cb2a3a87f2f",
      "parents": [
        "076fd4a45bb518b1d656f792743c83fe017b48a4"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Oct 01 21:50:59 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 21:50:59 2026"
      },
      "message": "Remove HAVE_BUILTIN_SINCOS from hello_world_gles.c tests (#27820)\n\nAll these tests are based on the same original code. Simplify the build\nprocess by removing `HAVE_BUILTIN_SINCOS`."
    },
    {
      "commit": "076fd4a45bb518b1d656f792743c83fe017b48a4",
      "tree": "eb59510388f3eaded72cc6255678f24000c206a6",
      "parents": [
        "04df3de0b990c6d572cf25332e7a7bd92d1e6dcf"
      ],
      "author": {
        "name": "Brendan Dahl",
        "email": "brendan.dahl@gmail.com",
        "time": "Thu Oct 01 21:44:55 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 21:44:55 2026"
      },
      "message": "[fetch] Fix error handling in FetchXHR (#27821)\n\nPreviously, FetchXHR fired onerror/ontimeout before setting readyState\nto DONE (4), and then unconditionally fired onload in the finally block.\nThis caused emscripten_fetch_close() in onerror to recursively re-invoke\nonerror, and otherwise triggered a duplicate callback.\n\nFixed #27788"
    },
    {
      "commit": "04df3de0b990c6d572cf25332e7a7bd92d1e6dcf",
      "tree": "cefc26d94742e4a462e9b65bee0f800e65880303",
      "parents": [
        "33589c046023ebace5c94b93ade7c49d1cf02dad"
      ],
      "author": {
        "name": "arsnyder16",
        "email": "asnyder@minitab.com",
        "time": "Thu Oct 01 20:01:43 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 20:01:43 2026"
      },
      "message": "Update OpenMP to LLVM commit 9076414489ed (#27809)\n\nThis updates OpenMP from LLVM 22.1.8 to LLVM commit 9076414489ed:\n\nhttps://github.com/llvm/llvm-project/commit/9076414489edb1db74ec6f7bc22a715d1cd66f0c\n\nThis pins OpenMP to an LLVM 24 development commit because no stable LLVM\nrelease currently contains all of the changes needed here. We can move\nOpenMP to the stable LLVM 24 release once it becomes available.\n\nThis update includes:\n\n* Simplify the generic microtask dispatcher:\n  https://github.com/llvm/llvm-project/pull/214004\n* Support up to 32 arguments in the generic microtask dispatcher:\n  https://github.com/llvm/llvm-project/pull/211071\n* Add WebAssembly 64-bit support to OpenMP:\n  https://github.com/llvm/llvm-project/pull/181669\n\nAdditional changes:\n\n* Add the newly required OpenMP runtime sources, including\n`kmp_invoke_microtask.cpp`, to Emscripten\u0027s `libopenmp` build.\n* Enable `libopenmp` for Wasm64 and run the existing OpenMP coverage for\nboth Wasm32 and Wasm64.\n* Add coverage for OpenMP regions requiring 32 microtask arguments.\n\nFixes #27221"
    },
    {
      "commit": "33589c046023ebace5c94b93ade7c49d1cf02dad",
      "tree": "c91e2bac9d7280d27ee2a5a1df268f11fa662e37",
      "parents": [
        "f360e933e1281f7752cbd5ba31ace0ddec6c7c86"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Oct 01 19:59:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 19:59:17 2026"
      },
      "message": "Remove process.stdin.fd workaround in FS_stdin_getChar. NFC (#27818)"
    },
    {
      "commit": "f360e933e1281f7752cbd5ba31ace0ddec6c7c86",
      "tree": "765db265c0e2bf1f306101a4ca7b7ca414938619",
      "parents": [
        "22334e81c775826b6cb36a90c201355ea1748ad4"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Oct 01 18:54:32 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 18:54:32 2026"
      },
      "message": "Remove use of Node\u0027s deprecated Buffer.slice. NFC (#27817)\n\nFixes: #27813"
    },
    {
      "commit": "22334e81c775826b6cb36a90c201355ea1748ad4",
      "tree": "d867c81a7b3299102f6ec1ae1f3dc91d403b8229",
      "parents": [
        "b7f0b70a41a56ef524f8d5ca37b42931eb59979b"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Oct 01 18:49:16 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 18:49:16 2026"
      },
      "message": "Remove no_wasm64 from dylink tests. NFC (#27816)\n\nThis issue was closes in\nhttps://github.com/llvm/llvm-project/pull/225979"
    },
    {
      "commit": "b7f0b70a41a56ef524f8d5ca37b42931eb59979b",
      "tree": "1f7d3dac4b3bfadb8492577cae19a7ff3a11fc05",
      "parents": [
        "ceb01e7318352ae54b9a8fdeee41053fbfdf4806"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Oct 01 18:41:54 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 18:41:54 2026"
      },
      "message": "Use JS numeric separators (e.g. `1_000_000`) in JS libraries. NFC (#27812)\n\nAll supported JS engines support numeric separators (ES2021). Using a\nsingle numeric literal also allows `acorn-optimizer.mjs` to emit `1e6`\ninstead of `1e3 * 1e3`.\n\nAlso, replace 1e3 with 1000 in the source code since acorn will use\nthe shorter form in the final optimized output anyway."
    },
    {
      "commit": "ceb01e7318352ae54b9a8fdeee41053fbfdf4806",
      "tree": "8bbce3ff5d44a40825b2242d4e60c555ee80027c",
      "parents": [
        "15cba8d2b638d121acebc441b75cb1a5f31b4c78"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Oct 01 16:44:01 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 16:44:01 2026"
      },
      "message": "[AUDIO_WORKLET] Fix `performance.now` check in `emscripten_get_now_res` (#27811)\n\nIn #25417, the `typeof` check on `performance.now` in\n`emscripten_get_now_res` (`src/lib/libcore.js`) was replaced with\n`globalThis.performance?.now \u003d\u003d \u0027function\u0027`, which always evaluated to\n`false`.\n\nAs a result, when building with `-sAUDIO_WORKLET`,\n`emscripten_get_now_res` (and `clock_getres(CLOCK_MONOTONIC, ...)`)\nincorrectly reported millisecond resolution (`1000000` ns) instead of\nmicrosecond resolution (`1000` ns) even when `performance.now` was\navailable."
    },
    {
      "commit": "15cba8d2b638d121acebc441b75cb1a5f31b4c78",
      "tree": "c9071818af898449c77620510b79c5bc3b5af095",
      "parents": [
        "ccea361dd872d10301e170fb8b874c3808359fae"
      ],
      "author": {
        "name": "emscripten-bot",
        "email": "179889221+emscripten-bot@users.noreply.github.com",
        "time": "Thu Oct 01 16:38:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 16:38:48 2026"
      },
      "message": "Update emsdk version from 27974d29 to c366a3c2 (#27814)\n\nThis is an automatic change generated by tools/maint/rebaseline_tests.py\n--update-emsdk.\n\nemsdk version updated: 27974d29 \u003d\u003e c366a3c2\n\nThe following revisions were included in this update:\n\n```\n- c366a3c2 Roll llvm-project from 5c20fe98552a to 1f5222198a91 (605 revisions)\n- addd8852 Roll emscripten from 9410f00ee71f to 2151200a7af9 (4 revisions)\n- b664395d Roll binaryen from b0155c5bdb9c to 4d8ac549e2ab (1 revision)\n- ce6871f0 Roll emscripten from 7e165b0b2332 to 9410f00ee71f (3 revisions)\n- ab16c362 Roll v8 from 342410146633 to 96cf05b94228 (49 revisions)\n- 618c6dcb Roll emscripten from 59f4772b815a to 7e165b0b2332 (1 revision)\n- 9a7c9fce Roll binaryen from 4064a84684d8 to b0155c5bdb9c (1 revision)\n```\n\nFull log:\nhttps://chromium.googlesource.com/emscripten-releases/+log/27974d29..c366a3c2\n\nThe following (11) test expectation files were updated by\nrunning the tests with `--rebaseline`:\n\n```\ncodesize/test_codesize_cxx_ctors1.json: 153199 \u003d\u003e 153223 [+24 bytes / +0.02%]\ncodesize/test_codesize_cxx_ctors2.json: 152604 \u003d\u003e 152628 [+24 bytes / +0.02%]\ncodesize/test_codesize_cxx_except.json: 199300 \u003d\u003e 199324 [+24 bytes / +0.01%]\ncodesize/test_codesize_cxx_except_wasm.json: 168663 \u003d\u003e 168687 [+24 bytes / +0.01%]\ncodesize/test_codesize_cxx_except_wasm_legacy.json: 166523 \u003d\u003e 166547 [+24 bytes / +0.01%]\ncodesize/test_codesize_cxx_lto.json: 119599 \u003d\u003e 119615 [+16 bytes / +0.01%]\ncodesize/test_codesize_cxx_mangle.json: 265630 \u003d\u003e 265654 [+24 bytes / +0.01%]\ncodesize/test_codesize_cxx_noexcept.json: 155106 \u003d\u003e 155130 [+24 bytes / +0.02%]\ncodesize/test_codesize_cxx_wasmfs.json: 180211 \u003d\u003e 180235 [+24 bytes / +0.01%]\ncodesize/test_codesize_hello_dylink.json: 43410 \u003d\u003e 43419 [+9 bytes / +0.02%]\ncodesize/test_codesize_hello_dylink_all.json: 859861 \u003d\u003e 859860 [-1 bytes / -0.00%]\n\nAverage change: +0.01% (-0.00% - +0.02%)\n```\n\nCo-authored-by: emscripten-bot \u003cemscripten-bot@users.noreply.github.com\u003e"
    },
    {
      "commit": "ccea361dd872d10301e170fb8b874c3808359fae",
      "tree": "c2513f465c1506859ecf77a7414f6d210aed23e7",
      "parents": [
        "2151200a7af99703f006ef86b261c0bb6d4322f3"
      ],
      "author": {
        "name": "Ioulios P.",
        "email": "ipat@hotmail.gr",
        "time": "Thu Oct 01 16:30:51 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 16:30:51 2026"
      },
      "message": "[WasmFS] Fix tcgetpgrp and pipe2 errors and enable test_unistd_misc (#27815)\n\n`test_unistd_misc` was skipped under WasmFS because of failures in\nfdatasync (fixed in #27806), tcgetpgrp and pipe. This fixes tcgetpgrp\nand pipe and re-enables the test.\n\n`tcgetpgrp` was failing because `__syscall_ioctl` did not handle the\n`TIOCGPGRP` request and returned `-EINVAL` instead. This adds a case for\nit that sets `*argp` to 0 and returns 0, matching how JS FS handles it\nin `libsyscall.js`.\n\n`pipe2` was failing for two reasons. First, there was no check for a\nnull fd array pointer. It now returns `-EFAULT`. Second, `O_NONBLOCK`\nwas rejected with `-ENOTSUP`. Just like JS FS handles `O_NONBLOCK`,\n`pipe2` now stores it in both fds of the pipe.\n\nPart of #25035"
    },
    {
      "commit": "2151200a7af99703f006ef86b261c0bb6d4322f3",
      "tree": "e5d8cb094965c37d2fd869983f9070e038bfa10c",
      "parents": [
        "38ff2387102285fa64a1eb4cfd2a4870a697dcde"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Sep 30 23:33:51 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 23:33:51 2026"
      },
      "message": "[docs] Clarify stack restoration when catching exceptions from JS (#27748)\n\nClarify that Emscripten does not automatically restore the shadow stack\npointer during exception unwinding when an exception escapes into\nJavaScript, and that callers catching exceptions in JS must use\n`stackSave()` and `stackRestore()` to avoid leaking stack memory.\n\nSee: #27610"
    },
    {
      "commit": "38ff2387102285fa64a1eb4cfd2a4870a697dcde",
      "tree": "385ed2618d3ca74d358791743b4ef147d274d899",
      "parents": [
        "babcd98a9e8c0defa1fcbb4ed061ca913dfe5ddd"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Sep 30 22:59:02 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 22:59:02 2026"
      },
      "message": "[wasm_workers] Wrap async acquire callbacks in `callUserCallback` (#27804)\n\nWrap callback invocations in `emscripten_lock_async_acquire` and\n`emscripten_semaphore_async_acquire` in `callUserCallback`. This matches\n`emscripten_atomic_wait_async` and other asynchronous APIs, and ensures\nthat if the callback calls `exit()` or throws an unwinding exception, it\nis caught and handled rather than escaping into the Promise microtask\nqueue as an unhandled rejection.\n\nAlso update `test/wasm_worker/semaphore_async_and_sync_acquire.c` to use\n`emscripten_force_exit` instead of `exit`, since `main()` exits with a\nlive runtime."
    },
    {
      "commit": "babcd98a9e8c0defa1fcbb4ed061ca913dfe5ddd",
      "tree": "b16ca2a9f11685a72e7a2a4e078ea763d71ec05a",
      "parents": [
        "566b3e0fb1023de63c82b37576f97d07d55163e4"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Sep 30 22:43:27 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 22:43:27 2026"
      },
      "message": "[dylink] Fix TARGET_ARCH parsing and error message (#27810)\n\nThis code just landed in #27797 but was broken.\n\nSee https://github.com/llvm/llvm-project/pull/225979."
    },
    {
      "commit": "566b3e0fb1023de63c82b37576f97d07d55163e4",
      "tree": "0bef86545dc83da88563dc365123fad1d4e5d359",
      "parents": [
        "9410f00ee71f26c2fab1993fbd864c1651370f2c"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Sep 30 21:54:30 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 21:54:30 2026"
      },
      "message": "Allow passing arguments to callUserCallback (#27805)\n\nAllow `callUserCallback` to accept and forward arguments (`...args`) to\nthe target callback. This avoids allocating intermediate arrow function\nclosures at each async callback site (such as `setInterval`,\n`_setitimer_js`, or `emscripten_set_immediate`) and simplifies the call\nsites.\n\nAlso update `Asyncify.sleepCallbacks` to iterate with a loop instead of\n`forEach` so that `forEach` arguments (`index`, `array`) are not passed\nthrough to the callbacks.\n\nRegarding code size this can be slight win or a slight loss depending on\nhow many call sites are included. Overall, I would call it a wash."
    },
    {
      "commit": "9410f00ee71f26c2fab1993fbd864c1651370f2c",
      "tree": "2355c528fb1e8e9d2d6a2d0fc941dca4478480c0",
      "parents": [
        "2f01b3376f69644b35d2393c9ba8a4a1714c5e8b"
      ],
      "author": {
        "name": "Ioulios P.",
        "email": "ipat@hotmail.gr",
        "time": "Wed Sep 30 18:28:18 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 18:28:18 2026"
      },
      "message": "[WasmFS] Return negative errno from fdatasync (#27806)\n\nUnder WasmFS, `__syscall_fdatasync` returned the result of\n`__wasi_fd_sync` directly. That is a positive WASI errno, but syscalls\nare expected to return a negative errno. musl only treats -4095..-1 as\nerrors, so `fdatasync()` on an invalid fd returned `__WASI_ERRNO_BADF`\n(i.e. 8) and left `errno` at 0 instead of returning -1 with `errno` set\nto `EBADF`.\n\nThis change negates the result, similar to how `_msync_js` handles\n`__wasi_fd_pwrite` in syscalls.cpp.\n\nAdded the invalid fd case to `test/wasmfs/wasmfs_fdatasync.c`.\n\n`test_unistd_misc` also covers this but is skipped under WasmFS because\nof other failures on tcgetpgrp and pipe (according to #25035).\n\nFixes #26713"
    },
    {
      "commit": "2f01b3376f69644b35d2393c9ba8a4a1714c5e8b",
      "tree": "8fa2b2f55b226110df996af656dffaac69047728",
      "parents": [
        "8091fdfa1ea7d07343cff401cc844417ed7ae33d"
      ],
      "author": {
        "name": "emscripten-bot",
        "email": "179889221+emscripten-bot@users.noreply.github.com",
        "time": "Wed Sep 30 18:18:22 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 18:18:22 2026"
      },
      "message": "Update emsdk version from 23877739 to 27974d29 (#27807)\n\nThis is an automatic change generated by tools/maint/rebaseline_tests.py\n--update-emsdk.\n\nemsdk version updated: 23877739 \u003d\u003e 27974d29\n\nThe following revisions were included in this update:\n\n```\n- 27974d29 Roll binaryen from a93fe20bd85d to 4064a84684d8 (3 revisions)\n- d1900056 Roll emscripten from f99d5010b70b to 59f4772b815a (1 revision)\n- 867c715d Roll emscripten from 5bd3cf2b154c to f99d5010b70b (6 revisions)\n- ccd2df5c Roll binaryen from 53bf1f8e1c50 to a93fe20bd85d (2 revisions)\n- 20934a65 Roll binaryen from 39cd18ac41d2 to 53bf1f8e1c50 (3 revisions)\n- 3954283a Roll binaryen from d1a6b253c7f7 to 39cd18ac41d2 (1 revision)\n- 167f1499 Roll v8 from 11593aa58d1a to 342410146633 (40 revisions)\n- 864b8d2e Roll emscripten from 38f371142b44 to 5bd3cf2b154c (3 revisions)\n- 16b786b8 Migrate .vpython3 specs to standard vpython.toml and uv lockfiles\n- fe8b4502 Roll emscripten from 41345239670f to 38f371142b44 (1 revision)\n- 7434b0f0 Roll binaryen from eacbf2333a8c to d1a6b253c7f7 (1 revision)\n- 87e0eb8d Roll emscripten from fed649297077 to 41345239670f (2 revisions)\n- 899d92e7 Roll emscripten from c404dd46149a to fed649297077 (1 revision)\n- 85d2e75f Roll llvm-project from c786529445a1 to 5c20fe98552a (55 revisions)\n- 3dcf2ef2 Roll emscripten from 7ea8509facc2 to c404dd46149a (1 revision)\n- 122eefb0 Roll v8 from fe8f6737e1c0 to 11593aa58d1a (13 revisions)\n- fd27a44f Roll emscripten from 887305e67c41 to 7ea8509facc2 (1 revision)\n- 708a6744 Roll llvm-project from a98dcad4fed0 to c786529445a1 (30 revisions)\n- 7aa9fdfc Roll llvm-project from cef4b65cbd0d to a98dcad4fed0 (13 revisions)\n- 2fb71ae2 Roll llvm-project from 61b428e0edfe to cef4b65cbd0d (16 revisions)\n- 50ef7c63 Roll llvm-project from 6909c17f1468 to 61b428e0edfe (9 revisions)\n- 1343c8ab Roll llvm-project from 126dbd97fc5d to 6909c17f1468 (7 revisions)\n- 9a3dfe71 Roll v8 from 7b50b62cb18f to fe8f6737e1c0 (1 revision)\n- 2cac63e6 Roll llvm-project from 7615da10b75c to 126dbd97fc5d (13 revisions)\n- 452469ab Roll llvm-project from fc99ddb16876 to 7615da10b75c (6 revisions)\n- 9761c130 Roll llvm-project from 8b96ddbf9cb3 to fc99ddb16876 (15 revisions)\n- a184c4fd Roll emscripten from 0dd50018817c to 887305e67c41 (1 revision)\n- cb77b82d Roll llvm-project from 5f609f950d2e to 8b96ddbf9cb3 (14 revisions)\n- 5108d130 Roll llvm-project from 201e76d4559e to 5f609f950d2e (17 revisions)\n- 6aab6409 Roll v8 from a2b0edcc8c68 to 7b50b62cb18f (31 revisions)\n  ... (and more, see full log)\n```\n\nFull log:\nhttps://chromium.googlesource.com/emscripten-releases/+log/23877739..27974d29\n\nThe following (10) test expectation files were updated by\nrunning the tests with `--rebaseline`:\n\n```\ncodesize/test_codesize_cxx_lto.json: 119626 \u003d\u003e 119602 [-24 bytes / -0.02%]\ncodesize/test_codesize_files_wasmfs.json: 54638 \u003d\u003e 54626 [-12 bytes / -0.02%]\ncodesize/test_codesize_hello_dylink.json: 43401 \u003d\u003e 43393 [-8 bytes / -0.02%]\ncodesize/test_codesize_hello_dylink_all.json: 859902 \u003d\u003e 859867 [-35 bytes / -0.00%]\ncodesize/test_codesize_minimal_pthreads.json: 26051 \u003d\u003e 26039 [-12 bytes / -0.05%]\ncodesize/test_codesize_minimal_pthreads_memgrowth.json: 26510 \u003d\u003e 26498 [-12 bytes / -0.05%]\ncodesize/test_minimal_runtime_code_size_audio_worklet.json: 16387 \u003d\u003e 16383 [-4 bytes / -0.02%]\ncodesize/test_minimal_runtime_code_size_hello_wasm_worker.json: 4102 \u003d\u003e 4099 [-3 bytes / -0.07%]\ncodesize/test_minimal_runtime_code_size_random_printf_wasm.json: 11035 \u003d\u003e 11017 [-18 bytes / -0.16%]\ncodesize/test_minimal_runtime_code_size_random_printf_wasm2js.json: 17338 \u003d\u003e 17338 [+0 bytes / +0.00%]\n\nAverage change: -0.04% (-0.16% - +0.00%)\n```\n\nCo-authored-by: emscripten-bot \u003cemscripten-bot@users.noreply.github.com\u003e"
    },
    {
      "commit": "8091fdfa1ea7d07343cff401cc844417ed7ae33d",
      "tree": "32bff5d394ccf3ba566a7176303a04dff6cadd56",
      "parents": [
        "7e165b0b23322f38706bc472f2b0f8213ba55069"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Sep 30 17:42:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 17:42:35 2026"
      },
      "message": "[test] Deflake `test_wasm_worker_lock_async_acquire` (#27795)\n\nIn `test/wasm_worker/lock_async_acquire.c`, `work()` is executed by both\nthe main thread and Wasm Workers. When the main thread happened to be\nthe thread that reached the completion condition, it called\n`emscripten_wasm_worker_post_function_v(EMSCRIPTEN_WASM_WORKER_ID_PARENT,\n...)`, which fails on the main thread because `_wasmWorkers[0]` is only\npopulated on Wasm Workers. Instead, schedule `do_exit` via\n`emscripten_set_timeout` when already on the main thread.\n\nFixes: #25270"
    },
    {
      "commit": "7e165b0b23322f38706bc472f2b0f8213ba55069",
      "tree": "9e2d03082ea218b47179d361512b57750c94a849",
      "parents": [
        "59f4772b815a13e48b4edcbdd5c74bf09104818c"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Wed Sep 30 16:51:37 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 16:51:37 2026"
      },
      "message": "Rename NODEFS.setattr/getattr to doSetAttr/doGetAttr. NFC (#27802)\n\nThis matches the naming of the existing goGetAttr in FS, and avoids\nconfusing with the `getattr`/`setattr` properties node_ops and\nstream_ops."
    },
    {
      "commit": "59f4772b815a13e48b4edcbdd5c74bf09104818c",
      "tree": "f94c37273af8a13214225ac38aa9262b7e94414b",
      "parents": [
        "f99d5010b70b049ef5b3bebe13a7ea76ff7c35b8"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Sep 29 23:16:18 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 23:16:18 2026"
      },
      "message": "Fix for MAIN_MODULE+1 + pthreads + dynamic linking (#27799)\n\nTreat AUTO_NATIVE_LIBRARIES similarly to AUTO_JS_LIBRARIES in\nMAIN_MODULE\u003d1 + STRICT mode. These two setting really need to go\ntogether since e.g. libhtml.js has references to libhtml5.a and vice\nversa."
    },
    {
      "commit": "f99d5010b70b049ef5b3bebe13a7ea76ff7c35b8",
      "tree": "7f172a71397293eb13d0c58f075ee50aaedc4948",
      "parents": [
        "f2875ce5379674c4d8b10e6810bb1bcea8c994d1"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Sep 29 23:00:04 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 23:00:04 2026"
      },
      "message": "Fix test_futimens_nodefs under Windows (#27801)\n\nIn #27794 we clamped sub-second timestamps near the 1-second boundary\nto prevent double-precision rounding from incrementing the second.\nHowever, under Windows, Node.js (`libuv`) converts Unix timestamps to\nWindows `FILETIME` (100-nanosecond intervals since Jan 1, 1601 UTC):\n\n  filetime \u003d (time + 11644473600) * 10000000;\n\nAdding the 11.6 billion second epoch offset reduces floating-point\nprecision (1 ULP becomes ~1.9 microseconds). When `tv_nsec` was close\nto 1e9 (e.g. 999,999,900 ns in `test_futimens`), adding the offset\nstill rounded the result up into the next integer second on Windows.\n\nInstead of performing floating-point clamping near `maxSec`, round\n`tv_nsec` down to the nearest 10 microseconds (10,000 ns). This leaves\nsufficient headroom below the next whole second while preserving\nsub-millisecond timestamp precision.\n\nSee: #25280"
    },
    {
      "commit": "f2875ce5379674c4d8b10e6810bb1bcea8c994d1",
      "tree": "3c0f373b69ed606ce6b5e53754631325a248e78d",
      "parents": [
        "f6916853b555b024b6b6180880ad732e68336c08"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Sep 29 20:34:20 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 20:34:20 2026"
      },
      "message": "Always return the event loop in `emscripten_semaphore_async_acquire` (#27798)\n\nExtend the fix from #25670 (`emscripten_lock_async_acquire`) to\n`emscripten_semaphore_async_acquire`, so that acquiring the semaphore is\nalways dispatched asynchronously via `setTimeout`.\n\nAlso update `makeDynCall` in `emscripten_semaphore_async_acquire` from\n`\u0027viiii\u0027` to `\u0027vpiip\u0027` to match\n`emscripten_async_wait_volatile_callback_t`."
    },
    {
      "commit": "f6916853b555b024b6b6180880ad732e68336c08",
      "tree": "e4a25248cd3f738a7b2726709c430f2f7c91a42e",
      "parents": [
        "89631a5b209b4254fa99faea7c0c2dd158018091"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Sep 29 19:11:37 2026"
      },
      "committer": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Sep 29 19:11:37 2026"
      },
      "message": "Rebaseline tests after accidental checkin of invalid results\n"
    },
    {
      "commit": "89631a5b209b4254fa99faea7c0c2dd158018091",
      "tree": "f3af2fdb5f6697707c3f7d30366a8a0a12462f69",
      "parents": [
        "81cdc6d08a4e381813ea64784aed7bc01fa4cdb5"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Sep 29 18:44:18 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 18:44:18 2026"
      },
      "message": "Add support for new TARGET_ARCH dylink sub-section (#27797)\n\nThis is needed to unblock the llvm roller after\nhttps://github.com/llvm/llvm-project/pull/225979"
    },
    {
      "commit": "81cdc6d08a4e381813ea64784aed7bc01fa4cdb5",
      "tree": "cd8fd8c4bfb804a1dd7b9557d6cdaff28d2b3e4e",
      "parents": [
        "436755800a9cffd3904e37eed9489dd737c36e02"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Sep 29 16:08:03 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 16:08:03 2026"
      },
      "message": "[WebGL] Remove surplus argument in `glDrawElements` (#27793)\n\n`GL.postDrawHandleClientVertexAttribBindings` takes no arguments, but\n`glDrawElements` was passing `count` to it.\n\nIt looks like this error has always been there since this function was\nfirst added in a0a5e19ded9d2610c60c27a8cb65009365fc33c5."
    },
    {
      "commit": "436755800a9cffd3904e37eed9489dd737c36e02",
      "tree": "10b5d80e4acc87f8f43778bd4e2609cc2dcce826",
      "parents": [
        "5bd3cf2b154c7a926298f3a8e7ebd901542f882c"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Sep 29 04:24:07 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 04:24:07 2026"
      },
      "message": "[FS] Reduce rounding errors when setting file timestamps (#27794)\n\nAvoid double-conversion loss when converting `struct timespec` in\n`__syscall_utimensat` and WasmFS by computing seconds directly as\n`seconds + (nanoseconds / 1e9)` rather than adding nanoseconds divided\nby 1,000,000 to large millisecond timestamps.\n\nAdditionally, clamp sub-second timestamps near the 1-second boundary\nso that floating-point rounding cannot cause timestamps with\n`tv_nsec \u003c 1_000_000_000` to round up to the next integer second.\n\nAlso prefer `stat.atimeMs` over `stat.atime.getTime()` in `writeStat`\nwhen reading host `fs.Stats` in `NODERAWFS` to avoid millisecond\nquantization rounding near second boundaries.\n\nFixes: #25280"
    },
    {
      "commit": "5bd3cf2b154c7a926298f3a8e7ebd901542f882c",
      "tree": "e0761fd6daae19c70b24ecbcf5b78b9709c1f164",
      "parents": [
        "8a3103e6b4aacb2d95d40283e5f54801895e923b"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Sep 29 00:14:38 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 00:14:38 2026"
      },
      "message": "Centralize usage of get_binaryen_bin in test code. NFC (#27790)\n\nSee #27666"
    },
    {
      "commit": "8a3103e6b4aacb2d95d40283e5f54801895e923b",
      "tree": "6308cba5768a2c318db8b34d6c41911689355337",
      "parents": [
        "1dc4d8bcbd230693e773536308a2084079c7b67a"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Tue Sep 29 00:14:24 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 00:14:24 2026"
      },
      "message": "[websocket] Avoid Closure compiler receiver collapse warning in `getSocketEvent` (#27792)\n\nUse `WS.socketEvent` instead of `this.socketEvent` to avoid Closure\ncompiler\u0027s `JSC_RECEIVER_AFFECTED_BY_COLLAPSE` warning when collapsing\nproperties."
    },
    {
      "commit": "1dc4d8bcbd230693e773536308a2084079c7b67a",
      "tree": "fafa7b56db5fcabd2ac0f03e3a79885bf9e78e42",
      "parents": [
        "38f371142b44b37ae152941fd268d4e8aeb79485"
      ],
      "author": {
        "name": "Alon Zakai",
        "email": "azakai@google.com",
        "time": "Mon Sep 28 23:49:41 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 23:49:41 2026"
      },
      "message": "Fix excessive logging in benchmark suite (#27791)\n\nPreviously we set verbose logging on, so that our printing of the times\nand sizes actually was shown. But that also showed all build logging, which\nis extremely verbose in the large tests.\n\nTo avoid this, remove the verbose logging trick and just print directly\nto stdout the things that we always want printed there."
    },
    {
      "commit": "38f371142b44b37ae152941fd268d4e8aeb79485",
      "tree": "8e45b54f5aa019d41ea7e8e238c89a1f88051108",
      "parents": [
        "41345239670f84711462a5a1eaa282a2f0ae7032"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Mon Sep 28 21:59:24 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 21:59:24 2026"
      },
      "message": "[FS] Deprecate `FS.analyzePath` and remove internal usages (#27765)\n\nReplace the remaining internal calls to `FS.analyzePath`:\n- In `emscripten_run_preload_plugins` (`src/lib/libbrowser.js`), read\nthe file contents directly via `FS.readFile(_file)`.\n- In `src/lib/liblz4.js`, use `FS.lookupPath` directly to get the\nunderlying `FSNode`.\n- Remove the stub `FS.analyzePath` from `src/lib/libwasmfs.js` (which\nwas only added in #19634 for `emscripten_run_preload_plugins`) and drop\n`_wasmfs_identify` from `REQUIRED_EXPORTS` in `tools/link.py`.\n\nAlso move `FS.analyzePath` documentation to the legacy section in\n`advanced-apis.rst` and emit a `warnOnce` deprecation notice in\n`ASSERTIONS` builds.\n\nWhy are we doing this:\n\n- The analyzePath returns a large grab-bag of properties and no callers\nseem to need\n- Supported it in wasmfs fully seems hard/impossible.\n- Its dead code (once we remove our internal usage of it)"
    },
    {
      "commit": "41345239670f84711462a5a1eaa282a2f0ae7032",
      "tree": "679bda46f73dac853e18ede81987eee92646f317",
      "parents": [
        "e3fb447b02941552503d722325ea483d2a27d493"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Mon Sep 28 19:43:43 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 19:43:43 2026"
      },
      "message": "[NODEFS] Pass timestamps in seconds to utimes instead of Date instances (#27787)\n\nNode\u0027s `fs.utimesSync`, `fs.lutimesSync`, and `fs.futimesSync` accept\ntimestamps either as `Date` instances or as numbers in seconds.\n\nPassing seconds directly has multiple advantages:\n1. Avoids allocating two temporary `Date` instances on each `setattr`.\n2. Preserves sub-millisecond timestamp precision down to the host\nfilesystem call rather than quantizing to integer milliseconds.\n3. Aligns `NODEFS` with `NODERAWFS`, which already passes timestamps in\nseconds.\n4. When preserving unspecified timestamps, reads `atimeMs` / `mtimeMs`\ninstead of `atime` / `mtime` `Date` objects from `stat(arg)`.\n\nThis may also help reduce flakiness in timestamp tests (such as\n`test_futimens`) when converting and checking sub-millisecond precision.\n\nSee: #25280"
    },
    {
      "commit": "e3fb447b02941552503d722325ea483d2a27d493",
      "tree": "90a703d568385d991f8de759c57fc99b0cbe97f3",
      "parents": [
        "fed6492970770c61210982cb0a97335b4369db95"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Mon Sep 28 18:58:13 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 18:58:13 2026"
      },
      "message": "Fix flakiness in `test_itimer_proxy_to_pthread` (#27789)\n\nFollowup to #27778.\n\nCalling `printf` in these signal handlers was causing issues since it\nrequires taking the stdio lock which in turn can run more proxied work\n(signal handler all run on the main thread). In this case, the flake is\ncaused by the `setitimer` which cancels the timers running *during* the\nprintf call (and before the counter is incremented), i.e. in the middle\nof the signal handler. This means that worker thread can observe the\neffect of the timer (the counter being incremented) *after* the timer is\ncancelled (because the cancellation effectively ran during the execution\nof the signal handler).\n\nPossible followups to avoid this type of thing in the future:\n\n1. Mask signals during handler (This is the default, but we don\u0027t\nimplement it yet in emscirpten, it prevents the timer signal running\nbefore the previous one has finished).\n2. Don\u0027t run proxied work during a signal handler. Signal handler should\nalways be fast so the main thread should be able to delay running any\nproxied work until the end of a given signal handler.\n\nFixes: #20125"
    },
    {
      "commit": "fed6492970770c61210982cb0a97335b4369db95",
      "tree": "438d9560aea0fd24f3ffdb23df397536bbc6af20",
      "parents": [
        "c404dd46149ab53520545c301f183ce0d45a0ba3"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Mon Sep 28 16:38:43 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 16:38:43 2026"
      },
      "message": "[test] Clean up `NULL` handling in `sdl2_net_server.c` (#27784)\n\n- Pass `NULL` instead of `INADDR_ANY` to `SDLNet_ResolveHost`.\n`SDLNet_ResolveHost` expects `const char *host`. Passing `INADDR_ANY`\nrelied on `SDL_net.h` defining it as `0x00000000` (an integer 0), which\naccidentally converted to a null pointer in C. Passing `NULL` directly\nmatches the parameter type and the comment above the call.\n\n- Check for `NULL` after `SDLNet_TCP_Accept`. If `SDLNet_TCP_Accept`\nreturns `NULL` (e.g. spurious socket readiness or an error during\naccept), log the error and return early instead of passing the null\npointer to `SDLNet_TCP_GetPeerAddress` and adding it to the socket set."
    },
    {
      "commit": "c404dd46149ab53520545c301f183ce0d45a0ba3",
      "tree": "a7acbf9408e34d09e62ae9344475f4b28b399ae4",
      "parents": [
        "7ea8509facc244dfe414fae0f5a9da16fa60f77e"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Mon Sep 28 15:41:04 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 15:41:04 2026"
      },
      "message": "Avoid nested launcher invocation when _EMCC_CCACHE is set. NFC (#27773)\n\nInstead of reinvoking `$0` (or `%~n0.bat`) via ccache and running\nthrough the launcher script a second time, invoke ccache directly with\npython and the script path. This avoids an extra shell/batch process and\nmatches the behavior of `run_python_compiler.ps1` and `pylauncher`.\n\nAlso add a new simple test for `_EMCC_CACHE` which was previously\ncompletely untested here."
    },
    {
      "commit": "7ea8509facc244dfe414fae0f5a9da16fa60f77e",
      "tree": "89276ec9c7d059c4b1c2c1779ead766ead982f67",
      "parents": [
        "887305e67c418ce26cdf20ea60bc78777f2b0b8f"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Mon Sep 28 00:30:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 00:30:48 2026"
      },
      "message": "[SOCKFS] Correctly report and surface server listen errors in Node.js (#27783)\n\nWhen `listen()` fails in Node.js (for example, when binding fails with\n`EADDRINUSE`), `ws.Server` emits an `error` event. Previously, the\nerror handler in `src/lib/libsockfs.js` hardcoded `EHOSTUNREACH`\ninstead of mapping the Node error code to its corresponding errno, and\nsilently swallowed the error. In addition, `poll()` ignored `sock.error`\non listening sockets, causing `poll()` and `select()` to hang without\nreporting `POLLERR`.\n\nThis change:\n- Maps the Node server error code via `ERRNO_CODES` (e.g. `EADDRINUSE`).\n- Tears down `sock.server` on listen error so subsequent `poll()`\n  reports `POLLHUP` and `accept()` reports `EINVAL`.\n- Reports `POLLERR` in `poll()` when `sock.error` is set.\n- Reports and consumes pending listen errors in `accept()`.\n- Sets `sock.listening \u003d true` only after `ws.Server` is constructed.\n- Adds a test in `test_sockets_node.py` verifying that attempting to\n  listen on an in-use port triggers `EADDRINUSE` via the socket error\n  callback, `poll()` (`POLLERR`), and `getsockopt` with `SO_ERROR`.\n\nSee: #27783"
    },
    {
      "commit": "887305e67c418ce26cdf20ea60bc78777f2b0b8f",
      "tree": "ef4bd9822bfc1dbaaa2d061cbe200fd8c5afe801",
      "parents": [
        "0dd50018817c33767ae777155bc24c1fc18ea02f"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Sat Sep 26 16:35:02 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 26 16:35:02 2026"
      },
      "message": "Extract readTimespec helper in __syscall_utimensat. NFC (#27786)\n\nExtract duplicated `timespec` reading logic in `__syscall_utimensat`\ninto a local `readTimespec` helper function."
    },
    {
      "commit": "0dd50018817c33767ae777155bc24c1fc18ea02f",
      "tree": "4ac559d66574dfc5b5efd0625f7087e9e03bd78a",
      "parents": [
        "1d378e3aa4efcba352da3eaa5d3b2194b660cbe0"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Fri Sep 25 19:41:54 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 19:41:54 2026"
      },
      "message": "[test] Deflake `test_itimer` (#27778)\n\nIn `test/other/test_itimer.c`, decouple the pre-expiration `getitimer`\ncheck (using a 5-second timer) from the short 50ms expiration check in\n`test_oneoff`, and wait in a loop for `NUM_TIMERS` alarms in\n`test_sequence` before verifying that canceling the timer stops further\nsignals. This avoids failures when OS / JS event loop scheduling delays\ncoalesce missed `setitimer` intervals during a fixed `usleep`.\n\nFixes: #20125"
    },
    {
      "commit": "1d378e3aa4efcba352da3eaa5d3b2194b660cbe0",
      "tree": "1fdb251627ed8df5b69c07139951cdb91812bf3a",
      "parents": [
        "d318efc342b176161aaf54a53ae7b1fba49e8d02"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Fri Sep 25 19:16:31 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 19:16:31 2026"
      },
      "message": "[test] Move socket test ports below ephemeral port range (#27782)\n\nMove hardcoded test server ports in `test_sockets_browser.py` and\n`test_sockets_node.py` from the 49xxx/59xxx range down to 24xxx/25xxx.\nThis should help fix some of the startup flakiness we see when running\nthe socket tests in CI.\n\nThe default Linux ephemeral port range (`ip_local_port_range`) is\n32768–60999 (and 49152–65535 per IANA). Outbound TCP connections from\nthe test harness, Chrome, and Node randomly allocate client ports from\nthis range. When those connections close, the local port remains in\n`TIME_WAIT` for 60 seconds. When a test server subsequently attempts to\nbind `0.0.0.0` or `127.0.0.1` on that same port, `bind()` fails with\n`EADDRINUSE`.\n\nAlso assign a dedicated port to `test_sockets_echo_pthreads` and\n`test_nodejs_sockets_echo_subprotocol_runtime` to prevent collisions\nwith sibling tests."
    },
    {
      "commit": "d318efc342b176161aaf54a53ae7b1fba49e8d02",
      "tree": "61e44694c42ef65f3701ad45abbdee0f2ae0c332",
      "parents": [
        "fcfb73cc68c4e4d0d2470853be8e9df3f7fa3cac"
      ],
      "author": {
        "name": "emscripten-bot",
        "email": "179889221+emscripten-bot@users.noreply.github.com",
        "time": "Fri Sep 25 17:43:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 17:43:00 2026"
      },
      "message": "Update emsdk version from 7eb65927 to 23877739 (#27781)\n\nThis is an automatic change generated by tools/maint/rebaseline_tests.py\n--update-emsdk.\n\nemsdk version updated: 7eb65927 \u003d\u003e 23877739\n\nThe following revisions were included in this update:\n\n```\n- 23877739 Roll llvm-project from 482bb48e9dd8 to f91a3b1bcd7b (36 revisions)\n- 903c0136 Roll binaryen from b40790ffeb79 to eacbf2333a8c (4 revisions)\n- a1f71e1d Roll v8 from 36de2a2334c9129db7f6fe0db76fd7d5fa64df78 to a2b0edcc8c68 (23 revisions)\n- 3dc644fb Roll emscripten from 265f1dc1ac79 to fcfb73cc68c4 (1 revision)\n- aa1e798a Roll llvm-project from 3501bbfcff7a to 482bb48e9dd8 (98 revisions)\n- da10b8a8 Roll emscripten from f51e64a80387 to 265f1dc1ac79 (2 revisions)\n- 9bd6763a Roll binaryen from 296af3158ff3 to b40790ffeb79 (3 revisions)\n- 79d6eac3 Roll binaryen from d00111222996 to 296af3158ff3 (1 revision)\n- 2d2b6cbd Roll emscripten from 25c255b66fe5 to f51e64a80387 (1 revision)\n- 5866790e Roll llvm-project from b5683453d42e to 3501bbfcff7a (41 revisions)\n- ccddfba7 Roll llvm-project from 74a53743efe6 to b5683453d42e (52 revisions)\n```\n\nFull log:\nhttps://chromium.googlesource.com/emscripten-releases/+log/7eb65927..23877739\n\nThe following (7) test expectation files were updated by\nrunning the tests with `--rebaseline`:\n\n```\ncodesize/test_codesize_cxx_ctors1.json: 153195 \u003d\u003e 153199 [+4 bytes / +0.00%]\ncodesize/test_codesize_cxx_ctors2.json: 152604 \u003d\u003e 152604 [+0 bytes / +0.00%]\ncodesize/test_codesize_cxx_lto.json: 119632 \u003d\u003e 119626 [-6 bytes / -0.01%]\ncodesize/test_codesize_files_wasmfs.json: 54647 \u003d\u003e 54638 [-9 bytes / -0.02%]\ncodesize/test_codesize_hello_dylink_all.json: 858661 \u003d\u003e 858607 [-54 bytes / -0.01%]\ncodesize/test_codesize_minimal_pthreads.json: 26050 \u003d\u003e 26051 [+1 bytes / +0.00%]\ncodesize/test_codesize_minimal_pthreads_memgrowth.json: 26509 \u003d\u003e 26510 [+1 bytes / +0.00%]\n\nAverage change: -0.00% (-0.02% - +0.00%)\n```\n\nCo-authored-by: emscripten-bot \u003cemscripten-bot@users.noreply.github.com\u003e"
    },
    {
      "commit": "fcfb73cc68c4e4d0d2470853be8e9df3f7fa3cac",
      "tree": "33a01ce1b6b2915258e2a9297aa5d967ec787f52",
      "parents": [
        "265f1dc1ac79d7beef3ef61aed2778ef2995eae8"
      ],
      "author": {
        "name": "Derek Schuff",
        "email": "dschuff@chromium.org",
        "time": "Fri Sep 25 00:21:25 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 00:21:25 2026"
      },
      "message": "Remove check for __cpp_threadsafe_static_init from test_cxx11 (#27780)\n\nThese were added for eae20fe2a3 when we Emscripten was passing\nthe flag manually, but now the behavior is implemented and tested\nupstream."
    },
    {
      "commit": "265f1dc1ac79d7beef3ef61aed2778ef2995eae8",
      "tree": "741a03ee864d31f32d57f5a09dd79893069be418",
      "parents": [
        "953c30cf23b1f856ec315c4e1e9e2c0c38a5c230"
      ],
      "author": {
        "name": "Sam Clegg",
        "email": "sbc@chromium.org",
        "time": "Thu Sep 24 20:52:33 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 20:52:33 2026"
      },
      "message": "Normalize `tv_usec` in `getitimer` and `setitimer` (#27779)\n\nPreviously `__getitimer` in `setitimer.c` assigned `remaining_ms *\n1000` directly to `tv_usec` without taking the remainder modulo\n`1000000`. For any timer or interval \u003e\u003d 1 second, this duplicated the\nwhole seconds into `tv_usec` and violated the POSIX `0 \u003c\u003d tv_usec \u003c\n1000000` invariant."
    }
  ],
  "next": "953c30cf23b1f856ec315c4e1e9e2c0c38a5c230"
}
