Main resolves computed createRequire specifiers at run time, so the
package's computed require no longer makes an island; a spread argument
list still does.
An island package's declaration file declares its values ambiently, and
main's typeof folds an ambient const that nothing defines to
"undefined"; the island defines it.
The computed createRequire note main added ('…, such as a native addon,
ends the program') matched the native-addon pattern, so every package with
a computed require became a runtime island; it is a deferred gap now, like
other fences that may never run.
The nested trampoline never returns (setcontext back), so the redzones
around its locals stayed poisoned in the shadow of Node's stack, and
Node's own frames tripped over them later (stack-buffer-underflow in
__bzero, sanitized corpus 6822/6823/6831/6832/6894 on macOS). Linux's
ASan clears a context's stack in its swapcontext interceptor; macOS's has
none.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A nested entry below the mark makes its context with ni_make_context,
so macOS clears only the top slice of the range instead of the whole of
Node's stack below the mark on every nested call (17 ms per call, and
the cross-heap GC test ran past its timeout).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The libnode-linux action becomes .github/actions/libnode, which serves
the Linux x64 and macOS lanes: the libnode-packs cache for the runner's
platform, else the development pack.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
macOS binds libnode's own calls to v8::base::Stack inside libnode, so the
bridge's definitions cannot give V8 Node's stack as they do on Linux; V8
took the main thread's stack start and its conservative scan faulted in
the gap above Node's stack. While Node starts on its stack, the main
thread's pthread record now names that stack, which V8 reads once and
keeps.
macOS's makecontext clears the whole stack it is given, so it gets only
the top slice of Node's stack (no 64 MiB pass per context).
CI: dev-pack.json pins mirrored darwin-arm64 and darwin-x64 libnode
builds of the pinned Node 24.22.0 from the libnode-packs workflow, the
dev-pack action serves either platform, and the macOS lanes provision it,
so island tests fail rather than skip on macOS CI. The arm64 LLVM job
runs the island harness; the Intel job runs it and the island corpus.
bridge-smoke loads the .dylib bridge on macOS.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The TypeScript session reads initialize's answer to tell a 7.1 server
(caseSensitivity) from a 7.0 one (useCaseSensitiveFileNames), and on a
7.1 server sends 7.1's requests and reads its answers:
- snapshots: the first comes from createSnapshot and later ones from
updateSnapshot with the latest snapshot as the base, which the server
keeps until the next update. Each asks for current programs
(ensurePrograms), and a project's root files and options come from its
parsed command line. Projects an update does not list carry over from
the base.
- symbols: a symbol is named by its reference, a source file or the
snapshot and project that owns it plus its id. The semantic model keeps
numeric symbol ids: each reference, and each compact reference other
answers hold, gets a local id, and requests send the reference back.
Symbol property methods take it in `symbol`.
- requests: getApparentType, getConstraintOfTypeParameter,
getNonNullableType and getReturnTypeOfSignature name their type or
signature in `objectId`, the diagnostics methods take `files`, and
signatureToSignatureDeclaration's kind is a 7.1 SyntaxKind.
- answers: isTupleType is read from the type, JsxEmit's React and
ReactNative values are swapped back, and parseConfigFile returns the
options and file names.
- file system callbacks reply with {kind, value}: a value, "missing" for
a hidden path, or "useOS" to delegate to the server.
The session, checker and semantic checker tests run against tsc 7.0.2 and
against tsc 7.1.0-beta, from the typescript-7.1 test dependency.