From d858d840f92d3239710ea2cd90724f001251ee27 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 08:46:44 -0500 Subject: [PATCH 01/67] Accept file URL paths in synchronous fs functions readFileSync, writeFileSync, appendFileSync, statSync, lstatSync, readdirSync, mkdirSync, rmSync, rmdirSync, mkdtempSync, accessSync, unlinkSync, chmodSync, chownSync, lchownSync, truncateSync, copyFileSync, renameSync, realpathSync, realpathSync.native, openSync and opendirSync accept a file: URL wherever they accept a path. The URL converts as fileURLToPath converts it, with Node's errors for other schemes, hosts, encoded separators and null bytes. Arguments after a URL path that have side effects are evaluated into hidden locals before the conversion, so they run even when it throws. A URL path after a string path, or with options that are not literals, fails with SC2020, because Node checks those arguments before it converts the URL. existsSync and the fs.promises functions also fail with SC2020 for URL paths: existsSync answers false for a URL it cannot convert, and fs.promises reports conversion errors as rejections. Fixes #1616 Co-authored-by: jlucaso1 <55464917+jlucaso1@users.noreply.github.com> --- docs/content/docs/limitations.mdx | 2 + .../builtin-apis/filesystem-url-paths.mdx | 3 + .../ambient/scriptc-node-fallback.d.ts | 81 +++---- .../lowering/builtins/filesystem-calls.ts | 17 +- .../frontend/lowering/builtins/filesystem.ts | 7 +- .../frontend/lowering/builtins/fs-paths.ts | 212 ++++++++++++++++++ .../lowering/builtins/module-calls.ts | 12 +- .../compiler/src/frontend/lowering/lowerer.ts | 22 +- .../tests/corpus/6931-fs-url-paths.ts.json | 6 + .../diagnostics/fs-url-path-fences.ts.json | 6 + .../node-types/fs-url-path-fences.ts.json | 6 + .../fixtures/node-types/fs-url-paths.ts.json | 6 + tests/corpus/6931-fs-url-paths.ts | 96 ++++++++ tests/diagnostics/fs-url-path-fences.ts | 15 ++ .../fixtures/node-types/fs-url-path-fences.ts | 9 + tests/fixtures/node-types/fs-url-paths.ts | 10 + .../__snapshots__/fs-url-path-fences.ts.txt | 35 +++ .../corpus-costs/6931-fs-url-paths.ts.json | 1 + tests/harness/project-config.test.ts | 29 +++ 19 files changed, 522 insertions(+), 53 deletions(-) create mode 100644 docs/content/limitations/builtin-apis/filesystem-url-paths.mdx create mode 100644 packages/compiler/src/frontend/lowering/builtins/fs-paths.ts create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6931-fs-url-paths.ts.json create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/diagnostics/fs-url-path-fences.ts.json create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/fixtures/node-types/fs-url-path-fences.ts.json create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/fixtures/node-types/fs-url-paths.ts.json create mode 100644 tests/corpus/6931-fs-url-paths.ts create mode 100644 tests/diagnostics/fs-url-path-fences.ts create mode 100644 tests/fixtures/node-types/fs-url-path-fences.ts create mode 100644 tests/fixtures/node-types/fs-url-paths.ts create mode 100644 tests/harness/__snapshots__/fs-url-path-fences.ts.txt create mode 100644 tests/harness/corpus-costs/6931-fs-url-paths.ts.json diff --git a/docs/content/docs/limitations.mdx b/docs/content/docs/limitations.mdx index 05f9d329a..5be38a924 100644 --- a/docs/content/docs/limitations.mdx +++ b/docs/content/docs/limitations.mdx @@ -82,6 +82,8 @@ title: "Limitations" ../limitations/builtin-apis/filesystem-flags.mdx +../limitations/builtin-apis/filesystem-url-paths.mdx + ../limitations/builtin-apis/copy.mdx ../limitations/builtin-apis/glob.mdx diff --git a/docs/content/limitations/builtin-apis/filesystem-url-paths.mdx b/docs/content/limitations/builtin-apis/filesystem-url-paths.mdx new file mode 100644 index 000000000..d5079ed5a --- /dev/null +++ b/docs/content/limitations/builtin-apis/filesystem-url-paths.mdx @@ -0,0 +1,3 @@ +- **Filesystem URL paths:** Synchronous `fs` functions accept `file:` URL paths and convert them as `fileURLToPath` does. + `existsSync` and the `fs.promises` functions refuse URL paths; pass `fileURLToPath(url)` instead. + A URL path after a string path, or with options that are not literals, is refused, because Node checks those arguments before it converts the URL. diff --git a/packages/compiler/ambient/scriptc-node-fallback.d.ts b/packages/compiler/ambient/scriptc-node-fallback.d.ts index fb107ef99..ee7c794f1 100644 --- a/packages/compiler/ambient/scriptc-node-fallback.d.ts +++ b/packages/compiler/ambient/scriptc-node-fallback.d.ts @@ -1379,13 +1379,13 @@ interface ImportMeta { * `recursive`); empty directories go through `rmdirSync`. */ declare module "node:fs" { import { Readable, Writable } from "stream"; - export function readFileSync(path: string | number, encoding: BufferEncoding): string; + export function readFileSync(path: string | number | URL, encoding: BufferEncoding): string; export function readFileSync( - path: string | number, + path: string | number | URL, options: { encoding: BufferEncoding }, ): string; - export function readFileSync(path: string | number): Buffer; - export function readFileSync(path: string, options: unknown): string | Buffer; + export function readFileSync(path: string | number | URL): Buffer; + export function readFileSync(path: string | URL, options: unknown): string | Buffer; /* Error-first callbacks select string or Buffer data from their encoding. * Unknown options retain that union until the caller validates the value. */ export function readFile( @@ -1397,7 +1397,7 @@ declare module "node:fs" { * Node — an existing file keeps its permissions) and/or the utf8 * encoding spelling. */ export function writeFileSync( - path: string, + path: string | URL, data: string, /* The options-record stance (see http.RequestOptions): flag fences * by name at the call site; undocumented keys drop like Node. */ @@ -1409,14 +1409,17 @@ declare module "node:fs" { }, ): void; /* The bare-encoding spelling — the options record's encoding key alone. */ - export function writeFileSync(path: string, data: string, encoding: "utf8" | "utf-8"): void; - export function writeFileSync(path: string, data: string | Uint8Array): void; - export function appendFileSync(path: string, data: string | Uint8Array): void; + export function writeFileSync(path: string | URL, data: string, encoding: "utf8" | "utf-8"): void; + export function writeFileSync(path: string | URL, data: string | Uint8Array): void; + export function appendFileSync(path: string | URL, data: string | Uint8Array): void; export function existsSync(path: string): boolean; - export function mkdirSync(path: string): void; - export function mkdirSync(path: string, options: { recursive?: boolean; mode?: number }): void; - export function unlinkSync(path: string): void; - export function chmodSync(path: string, mode: number): void; + export function mkdirSync(path: string | URL): void; + export function mkdirSync( + path: string | URL, + options: { recursive?: boolean; mode?: number }, + ): void; + export function unlinkSync(path: string | URL): void; + export function chmodSync(path: string | URL, mode: number): void; export function fchmodSync(fd: number, mode: number): void; export function fsyncSync(fd: number): void; export function linkSync( @@ -1514,29 +1517,29 @@ declare module "node:fs" { path: string | Uint8Array | URL, options: string | { encoding?: string | null } | null, ): string | Buffer; - export function chownSync(path: string, uid: number, gid: number): void; - export function lchownSync(path: string, uid: number, gid: number): void; + export function chownSync(path: string | URL, uid: number, gid: number): void; + export function lchownSync(path: string | URL, uid: number, gid: number): void; export function fchownSync(fd: number, uid: number, gid: number): void; - export function truncateSync(path: string, len?: number): void; + export function truncateSync(path: string | URL, len?: number): void; /* The 2-argument form only (Node's mode flags have no lowering). The * destination is created or truncated carrying the SOURCE's mode. */ - export function copyFileSync(src: string, dest: string): void; + export function copyFileSync(src: string | URL, dest: string | URL): void; export function rename( oldPath: string, newPath: string, callback: (err: NodeJS.ErrnoException | null) => void, ): void; - export function renameSync(oldPath: string, newPath: string): void; - export function rmSync(path: string): void; + export function renameSync(oldPath: string | URL, newPath: string | URL): void; + export function rmSync(path: string | URL): void; /* maxRetries/retryDelay are accepted no-ops (Node retries around * EBUSY-class races; the synchronous lowering has no re-entrancy that * needs them). */ export function rmSync( - path: string, + path: string | URL, options: { recursive?: boolean; force?: boolean; maxRetries?: number; retryDelay?: number }, ): void; - export function rmdirSync(path: string): void; - export function readdirSync(path: string): string[]; + export function rmdirSync(path: string | URL): void; + export function readdirSync(path: string | URL): string[]; /* The withFileTypes form: Dirent rows (name + parentPath + the type * probes — the honest subset of Node's Dirent surface). The type is * interned explicitly in type-mapper.ts (the record's hidden %dtype field @@ -1550,7 +1553,7 @@ declare module "node:fs" { isSymbolicLink(): boolean; } export function readdirSync( - path: string, + path: string | URL, /* The options-record stance (see http.RequestOptions): recursive * fences by name at the call site; undocumented keys drop like Node. */ options: { withFileTypes: true; recursive?: boolean; [option: string]: unknown }, @@ -1599,7 +1602,7 @@ declare module "node:fs" { encoding?: "utf8" | "utf-8"; bufferSize?: number; } - export function opendirSync(path: string, options?: OpenDirOptions): Dir; + export function opendirSync(path: string | URL, options?: OpenDirOptions): Dir; /* fs.ReadStream / fs.WriteStream: runtime Readable and Writable streams * over a file (scr_fs_stream.c). The options are checked at runtime * with Node's rules; flags and mode are checked when the file opens, so @@ -1641,8 +1644,8 @@ declare module "node:fs" { path: string | Buffer | URL, options?: BufferEncoding | WriteStreamOptions, ): WriteStream; - export function accessSync(path: string, mode?: number): void; - export function mkdtempSync(prefix: string): string; + export function accessSync(path: string | URL, mode?: number): void; + export function mkdtempSync(prefix: string | URL): string; export const constants: { readonly F_OK: number; readonly R_OK: number; @@ -1745,34 +1748,34 @@ declare module "node:fs" { bigint?: boolean; throwIfNoEntry?: boolean; } - export function statSync(path: string, options?: undefined): Stats; + export function statSync(path: string | URL, options?: undefined): Stats; export function statSync( - path: string, + path: string | URL, options: StatSyncOptions & { bigint?: false; throwIfNoEntry: false }, ): Stats | undefined; export function statSync( - path: string, + path: string | URL, options: StatSyncOptions & { bigint?: false; throwIfNoEntry?: true }, ): Stats; /* bigint: true type-checks so the lowering can name it as unsupported. */ - export function statSync(path: string, options: StatSyncOptions & { bigint: true }): Stats; - export function statSync(path: string, options: StatSyncOptions): Stats | undefined; - export function lstatSync(path: string, options?: undefined): Stats; + export function statSync(path: string | URL, options: StatSyncOptions & { bigint: true }): Stats; + export function statSync(path: string | URL, options: StatSyncOptions): Stats | undefined; + export function lstatSync(path: string | URL, options?: undefined): Stats; export function lstatSync( - path: string, + path: string | URL, options: StatSyncOptions & { bigint?: false; throwIfNoEntry: false }, ): Stats | undefined; export function lstatSync( - path: string, + path: string | URL, options: StatSyncOptions & { bigint?: false; throwIfNoEntry?: true }, ): Stats; /* bigint: true type-checks so the lowering can name it as unsupported. */ - export function lstatSync(path: string, options: StatSyncOptions & { bigint: true }): Stats; - export function lstatSync(path: string, options: StatSyncOptions): Stats | undefined; + export function lstatSync(path: string | URL, options: StatSyncOptions & { bigint: true }): Stats; + export function lstatSync(path: string | URL, options: StatSyncOptions): Stats | undefined; /* The fd pair behind spawn's fd-stdio form: openSync(path, flags) → * the raw fd. Numeric flags use an inline OR of the O_* constants. */ - export function openSync(path: string, flags: string): number; - export function openSync(path: string, flags: number, mode?: number): number; + export function openSync(path: string | URL, flags: string): number; + export function openSync(path: string | URL, flags: number, mode?: number): number; export function closeSync(fd: number): void; export function fdatasyncSync(fd: number): void; export function ftruncateSync(fd: number, len?: number): void; @@ -1853,9 +1856,9 @@ declare module "node:fs" { export function fstatSync(fd: number): Stats; /* realpath(3) — resolves symlinks, `.`/`..`, throwing Node's fs error * shapes for missing paths. */ - export function realpathSync(path: string): string; + export function realpathSync(path: string | URL): string; export namespace realpathSync { - function native(path: string): string; + function native(path: string | URL): string; } /* statfs(2)/statvfs(3) — the filesystem-capacity snapshot (the fields * Node's statfsSync reports; bavail × bsize is the free-space probe). */ diff --git a/packages/compiler/src/frontend/lowering/builtins/filesystem-calls.ts b/packages/compiler/src/frontend/lowering/builtins/filesystem-calls.ts index 05028e1df..f23dff029 100644 --- a/packages/compiler/src/frontend/lowering/builtins/filesystem-calls.ts +++ b/packages/compiler/src/frontend/lowering/builtins/filesystem-calls.ts @@ -1,6 +1,7 @@ import { dynUndefinedExpr, boolLit, numLit, varRef } from "../../../ir/build.js"; import * as ts from "../../ts7/adapter.js"; import { type Lowerer } from "../lowerer.js"; +import { lowerFsPath } from "./fs-paths.js"; import { locOf } from "../../program.js"; import { type BuiltinModuleFn, @@ -231,7 +232,7 @@ export function lowerFsNumericOpenCall( "use an inline bitwise OR of fs.constants.O_RDONLY/O_WRONLY/O_RDWR/O_CREAT/O_EXCL/O_NOFOLLOW/O_NONBLOCK/O_TRUNC/O_APPEND", ); } - const path = lowerer.lowerExprExpecting(expr.arguments.nodes[0]!, STRING); + const path = lowerFsPath(lowerer, expr.arguments.nodes[0]!); const mode = expr.arguments.nodes[2] ? lowerer.lowerExprExpecting(expr.arguments.nodes[2]!, F64) : ({ kind: "numLit", value: 0o666, type: F64, loc } satisfies IrExpr); @@ -640,7 +641,9 @@ export function lowerFsEncodedRead( return null; } const sourceType = descriptor ? F64 : STRING; - const source = lowerer.lowerExprExpecting(expr.arguments.nodes[0]!, sourceType); + const source = descriptor + ? lowerer.lowerExprExpecting(expr.arguments.nodes[0]!, sourceType) + : lowerFsPath(lowerer, expr.arguments.nodes[0]!); const encoding: IrExpr = optionsType.kind === "string" ? lowerer.lowerExprExpecting(options, STRING) @@ -742,7 +745,7 @@ export function lowerFsOpendirCall( ) { lowerer.noLowering(`${member} with ${expr.arguments.nodes.length} arguments`, expr); } - const path = lowerer.lowerExprExpecting(expr.arguments.nodes[0]!, STRING); + const path = lowerFsPath(lowerer, expr.arguments.nodes[0]!); let bufferSize: IrExpr = { kind: "numLit", value: 32, type: F64, loc }; const optsNode = expr.arguments.nodes[1]; if (optsNode && !(ts.isIdentifier(optsNode) && optsNode.text === "undefined")) { @@ -812,7 +815,7 @@ export function lowerFsMkdirSyncCall( ); } const { recursive, modeNode } = options; - const path = lowerer.lowerExprExpecting(expr.arguments.nodes[0]!, STRING); + const path = lowerFsPath(lowerer, expr.arguments.nodes[0]!); const mode: IrExpr | null = modeNode ? lowerer.lowerExprExpecting(modeNode, F64) : null; if (!recursive) { return mode @@ -884,7 +887,7 @@ export function lowerFsRemoveCall(lowerer: Lowerer, expr: ts.CallExpression, loc "the recursive/force flags must be boolean literals; maxRetries/retryDelay are numbers; other options have no lowering", ); } - const path = lowerer.lowerExprExpecting(expr.arguments.nodes[0]!, STRING); + const path = lowerFsPath(lowerer, expr.arguments.nodes[0]!); const recursive = boolLit(opts.bools["recursive"] === true, loc); const force = boolLit(opts.bools["force"] === true, loc); @@ -941,7 +944,7 @@ export function lowerFsWriteBytesCall( "byte writes take Uint8Array/Buffer data", ); } - const path = lowerer.lowerExprExpecting(expr.arguments.nodes[0]!, STRING); + const path = lowerFsPath(lowerer, expr.arguments.nodes[0]!); const data = lowerer.lowerExprExpecting(expr.arguments.nodes[1]!, BYTES_U8); if (bi.module === "fs/promises") { return { @@ -981,7 +984,7 @@ export function lowerFsWriteOptionsCall( // values in object-literal order before issuing the write; otherwise a // call/getter statically typed as the accepted utf8 literal can vanish. const finishWrite = (optionValues: WriteOptionValue[]): IrExpr => { - const path = lowerer.lowerExprExpecting(expr.arguments.nodes[0]!, STRING); + const path = lowerFsPath(lowerer, expr.arguments.nodes[0]!); const data = lowerer.lowerExprExpecting(expr.arguments.nodes[1]!, STRING); const pathLocal = lowerer.declareHiddenLocal("%writePath", STRING); const dataLocal = lowerer.declareHiddenLocal("%writeData", STRING); diff --git a/packages/compiler/src/frontend/lowering/builtins/filesystem.ts b/packages/compiler/src/frontend/lowering/builtins/filesystem.ts index 49875e004..0e1c062c5 100644 --- a/packages/compiler/src/frontend/lowering/builtins/filesystem.ts +++ b/packages/compiler/src/frontend/lowering/builtins/filesystem.ts @@ -1,6 +1,7 @@ import { dynUndefinedExpr, boolLit, numLit, varRef } from "../../../ir/build.js"; import * as ts from "../../ts7/adapter.js"; import { type Lowerer, ladderFenceExpr } from "../lowerer.js"; +import { lowerFsPath } from "./fs-paths.js"; import { isJsSourceFile, locOf } from "../../program.js"; import { builtinModuleFnOf, @@ -513,7 +514,7 @@ export function lowerStringOrBytesWrite( kind: "call", callee: helper, args: [ - lowerer.lowerExprExpecting(call.arguments.nodes[0]!, STRING), + lowerFsPath(lowerer, call.arguments.nodes[0]!), lowerer.lowerExprExpecting(call.arguments.nodes[1]!, dataType), ], type: VOID, @@ -1376,7 +1377,7 @@ export function lowerFsReaddirTypesCall( ) { fence(); } - const path = lowerer.lowerExprExpecting(call.arguments.nodes[0]!, STRING); + const path = lowerFsPath(lowerer, call.arguments.nodes[0]!); return { kind: "libCall", fn: promiseForm ? "fsp.readdirTypes" : "fs.readdirTypesSync", @@ -1405,7 +1406,7 @@ export function lowerFsStatOptionsCall( const spelling = noFollow ? "lstatSync" : "statSync"; const plainFn: IrLibFn = noFollow ? "fs.lstatSync" : "fs.statSync"; const optsNode = call.arguments.nodes[1]!; - const path = lowerer.lowerExprExpecting(call.arguments.nodes[0]!, STRING); + const path = lowerFsPath(lowerer, call.arguments.nodes[0]!); // The path binds first, then the options' effects, then the stat runs. const plainAfter = (effect: IrExpr | null): IrExpr => { if (effect === null) return { kind: "libCall", fn: plainFn, args: [path], type: STATS_T, loc }; diff --git a/packages/compiler/src/frontend/lowering/builtins/fs-paths.ts b/packages/compiler/src/frontend/lowering/builtins/fs-paths.ts new file mode 100644 index 000000000..fb9176b53 --- /dev/null +++ b/packages/compiler/src/frontend/lowering/builtins/fs-paths.ts @@ -0,0 +1,212 @@ +/* fs path arguments given as file: URLs. Node converts a URL path with + * fileURLToPath inside each function (getValidatedPath), after every + * argument has been evaluated, and validates some arguments before the + * path and others after it. A URL-typed path lowers to the same + * conversion (url.fileURLToPathUrl). Later arguments with side effects are + * evaluated into hidden locals before the conversion, so they run even + * when it throws. The conversion keeps Node's error order when every + * earlier path is a URL too and each argument Node validates before the + * path is absent or a literal that passes that validation; other URL + * forms fence with SC2020, as do the fs.promises functions, whose + * conversion errors are rejections rather than throws, and existsSync, + * which answers false for a URL it cannot convert. */ +import * as ts from "../../ts7/adapter.js"; +import { type Lowerer } from "../lowerer.js"; +import { locOf } from "../../program.js"; +import { sideEffectFreeOptionValue } from "../surfaces.js"; +import { type IrExpr, type IrStmt, STRING, URL_T } from "../../../ir/ir.js"; + +/** The fs functions whose path parameters accept a URL: the path + * parameter indexes, and whether Node validates the paths before every + * other argument (otherwise the options come first). */ +const FS_URL_PATHS: Readonly< + Record +> = { + accessSync: { paths: [0], pathsFirst: true }, + appendFileSync: { paths: [0], pathsFirst: false }, + chmodSync: { paths: [0], pathsFirst: true }, + chownSync: { paths: [0], pathsFirst: true }, + copyFileSync: { paths: [0, 1], pathsFirst: true }, + lchownSync: { paths: [0], pathsFirst: true }, + lstatSync: { paths: [0], pathsFirst: true }, + mkdirSync: { paths: [0], pathsFirst: false }, + mkdtempSync: { paths: [0], pathsFirst: false }, + openSync: { paths: [0], pathsFirst: true }, + opendirSync: { paths: [0], pathsFirst: true }, + readFileSync: { paths: [0], pathsFirst: false }, + readdirSync: { paths: [0], pathsFirst: false }, + realpathSync: { paths: [0], pathsFirst: false }, + "realpathSync.native": { paths: [0], pathsFirst: false }, + renameSync: { paths: [0, 1], pathsFirst: true }, + rmSync: { paths: [0], pathsFirst: false }, + rmdirSync: { paths: [0], pathsFirst: true }, + statSync: { paths: [0], pathsFirst: true }, + truncateSync: { paths: [0], pathsFirst: true }, + unlinkSync: { paths: [0], pathsFirst: true }, + writeFileSync: { paths: [0], pathsFirst: false }, +}; + +/** The fs.promises functions with path parameters, by path indexes. */ +const FSP_PATHS: Readonly> = { + access: [0], + appendFile: [0], + chmod: [0], + chown: [0], + copyFile: [0, 1], + lchown: [0], + lstat: [0], + mkdir: [0], + mkdtemp: [0], + open: [0], + opendir: [0], + readFile: [0], + readdir: [0], + realpath: [0], + rename: [0, 1], + rm: [0], + rmdir: [0], + stat: [0], + truncate: [0], + unlink: [0], + writeFile: [0], +}; + +function isUrlArgument(lowerer: Lowerer, node: ts.Expression | undefined): boolean { + return node !== undefined && lowerer.mapTypeOf(lowerer.typeOf(node))?.kind === "url"; +} + +/** A literal that Node's option validation accepts before it reads the + * path: a string (the checker admits only the declared encodings, flags + * and type names), a boolean, an integer in [0, 2^31 - 1] (every numeric + * option of these functions accepts that range), undefined or null, or an + * object literal of those. */ +function preValidatedLiteral(node: ts.Expression): boolean { + let e = node; + while (ts.isParenthesizedExpression(e)) e = e.expression; + if (ts.isStringLiteralLike(e)) return true; + if ( + e.kind === ts.SyntaxKind.TrueKeyword || + e.kind === ts.SyntaxKind.FalseKeyword || + e.kind === ts.SyntaxKind.NullKeyword + ) + return true; + if (ts.isIdentifier(e)) return e.text === "undefined"; + if (ts.isNumericLiteral(e)) { + const value = Number(e.text); + return Number.isInteger(value) && value >= 0 && value <= 2147483647; + } + if (ts.isObjectLiteralExpression(e)) { + return e.properties.nodes.every( + (p) => + ts.isPropertyAssignment(p) && + !ts.isComputedPropertyName(p.name) && + preValidatedLiteral(p.initializer), + ); + } + return false; +} + +/** SC2020 when the call passes a URL path in a form whose conversion + * order would differ from Node's (see the file comment). */ +function checkUrlPaths( + lowerer: Lowerer, + call: ts.CallExpression, + module: string, + member: string, +): void { + const args = call.arguments.nodes; + const name = module === "fs/promises" ? `fs.promises.${member}` : member; + const hint = "convert the URL first: fileURLToPath(url) from node:url"; + if (module === "fs/promises") { + if ((FSP_PATHS[member] ?? []).some((i) => isUrlArgument(lowerer, args[i]))) + lowerer.noLowering(`${name} with a URL path`, call, hint); + return; + } + if (member === "existsSync" && isUrlArgument(lowerer, args[0])) + lowerer.noLowering(`${name} with a URL path`, call, hint); + const row = FS_URL_PATHS[member]; + if (!row) return; + const first = row.paths.find((i) => isUrlArgument(lowerer, args[i])); + if (first === undefined) return; + if (args.some(ts.isSpreadElement)) + lowerer.noLowering(`${name} with spread arguments and a URL path`, call); + // The runtime checks a string path after the conversion, so a string + // path Node checks first cannot precede the URL. + if (row.paths.some((i) => i < first && args[i] !== undefined)) + lowerer.noLowering(`${name} with a string path before a URL path`, call, hint); + const staged: ts.Expression[] = []; + for (let i = first + 1; i < args.length; i++) { + const arg = args[i]!; + if (sideEffectFreeOptionValue(arg)) continue; + // Literals are read by their members, so a whole-value slot cannot + // hold them. + let e = arg; + while (ts.isParenthesizedExpression(e)) e = e.expression; + if (ts.isObjectLiteralExpression(e) || ts.isArrayLiteralExpression(e)) + lowerer.noLowering(`${name} with a URL path and a later literal that has effects`, arg, hint); + staged.push(e); + } + if (staged.length > 0) { + lowerer.stagedAfterPath.set(args[first]!, staged); + for (const e of staged) lowerer.stagedArguments.set(e, null); + } + if (row.pathsFirst) return; + // writeFileSync/appendFileSync's data is checked after the path. + const data = member === "writeFileSync" || member === "appendFileSync" ? 1 : -1; + for (let i = 0; i < args.length; i++) { + if (row.paths.includes(i) || i === data || preValidatedLiteral(args[i]!)) continue; + lowerer.noLowering(`${name} with a URL path and options that are not literals`, args[i]!, hint); + } +} + +/** Fences URL paths that cannot convert in Node's order: the check every + * fs and fs.promises call runs before lowering its arguments. */ +export function checkFsUrlPaths( + lowerer: Lowerer, + call: ts.CallExpression, + bi: { module: string; member: string }, +): void { + if (bi.module === "fs" || bi.module === "fs/promises") + checkUrlPaths(lowerer, call, bi.module, bi.member); +} + +/** An fs path argument as a string: a URL converts with fileURLToPath's + * conversion (url.fileURLToPathUrl), which throws Node's errors for other + * schemes, hosts and encoded separators. */ +export function lowerFsPath(lowerer: Lowerer, node: ts.Expression): IrExpr { + if (!isUrlArgument(lowerer, node)) return lowerer.lowerExprExpecting(node, STRING); + const loc = locOf(node); + const url = lowerer.lowerExprExpecting(node, URL_T); + const staged = lowerer.stagedAfterPath.get(node); + if (staged === undefined) + return { kind: "libCall", fn: "url.fileURLToPathUrl", args: [url], type: STRING, loc }; + // The URL and the later arguments with effects, in source order, then + // the conversion. + const saved = lowerer.declareHiddenLocal("%fsUrl", URL_T); + const stmts: IrStmt[] = [{ kind: "varDecl", localId: saved.id, init: url, loc }]; + for (const arg of staged) { + lowerer.stagedArguments.delete(arg); + const value = lowerer.lowerExpr(arg); + const slot = lowerer.declareHiddenLocal("%fsArg", value.type); + stmts.push({ kind: "varDecl", localId: slot.id, init: value, loc: locOf(arg) }); + lowerer.stagedArguments.set(arg, { localId: slot.id, type: value.type }); + } + return { + kind: "seqExpr", + stmts, + result: { + kind: "libCall", + fn: "url.fileURLToPathUrl", + args: [{ kind: "varRef", localId: saved.id, type: URL_T, loc }], + type: STRING, + loc, + }, + type: STRING, + loc, + }; +} + +/** Whether `index` is a path parameter of the fs function `member`. */ +export function isFsPathParam(member: string, index: number): boolean { + return FS_URL_PATHS[member]?.paths.includes(index) === true; +} diff --git a/packages/compiler/src/frontend/lowering/builtins/module-calls.ts b/packages/compiler/src/frontend/lowering/builtins/module-calls.ts index c85f2c777..d33585d83 100644 --- a/packages/compiler/src/frontend/lowering/builtins/module-calls.ts +++ b/packages/compiler/src/frontend/lowering/builtins/module-calls.ts @@ -25,6 +25,7 @@ import { lowerFsWriteOptionsCall, lowerFsReadPathCall, } from "./filesystem-calls.js"; +import { checkFsUrlPaths, isFsPathParam, lowerFsPath } from "./fs-paths.js"; import { lowerBufferEncodingCall } from "./text-codecs.js"; import { lowerUtilTypeCall } from "./util-types.js"; import { InternalCompilerError } from "../../../errors.js"; @@ -58,6 +59,7 @@ export function lowerBuiltinModuleCall( loc: SrcLoc, ): IrExpr { const name = ts.getTextOfNode(expr.expression); + checkFsUrlPaths(lowerer, expr, bi); if (bi.module === "util/types") { return lowerUtilTypeCall(lowerer, expr, bi, loc, name); } @@ -240,7 +242,7 @@ export function lowerBuiltinModuleCall( expr.arguments.nodes.length === 1 && lowerer.mapTypeOf(lowerer.typeOf(expr.arguments.nodes[0]!))?.kind !== "f64" ) { - const path = lowerer.lowerExprExpecting(expr.arguments.nodes[0]!, STRING); + const path = lowerFsPath(lowerer, expr.arguments.nodes[0]!); return { kind: "libCall", fn: "fs.readFileSyncBytes", args: [path], type: BYTES_U8, loc }; } if ( @@ -305,7 +307,7 @@ export function lowerBuiltinModuleCall( if (expr.arguments.nodes.length < 1 || expr.arguments.nodes.length > 2) { lowerer.noLowering(`${bi.member} with ${expr.arguments.nodes.length} arguments`, expr); } - const path = lowerer.lowerExprExpecting(expr.arguments.nodes[0]!, STRING); + const path = lowerFsPath(lowerer, expr.arguments.nodes[0]!); const second: IrExpr = expr.arguments.nodes[1] ? lowerer.lowerExprExpecting(expr.arguments.nodes[1], F64) : { kind: "numLit", value: 0, type: F64, loc }; @@ -467,7 +469,11 @@ export function lowerBuiltinModuleCall( ); args = lowerer.completeArgs(expr.arguments.nodes, shapes, loc, expr); } else { - args = expr.arguments.nodes.map((a, i) => lowerer.lowerExprExpecting(a, fn.params[i])); + args = expr.arguments.nodes.map((a, i) => + bi.module === "fs" && isFsPathParam(bi.member, i) + ? lowerFsPath(lowerer, a) + : lowerer.lowerExprExpecting(a, fn.params[i]), + ); for (let i = args.length; i < fn.params.length; i++) { const dflt = fn.defaults![i - required]!; args.push({ kind: "strLit", value: dflt, type: STRING, loc }); diff --git a/packages/compiler/src/frontend/lowering/lowerer.ts b/packages/compiler/src/frontend/lowering/lowerer.ts index 543149f83..80b2a5938 100644 --- a/packages/compiler/src/frontend/lowering/lowerer.ts +++ b/packages/compiler/src/frontend/lowering/lowerer.ts @@ -2918,6 +2918,12 @@ export class Lowerer { * for the duration of that call, the receiver lowers to the Transform of * the value held in the named local. */ readonly hashStreamReceivers = new Map(); + /** fs call arguments evaluated ahead of a URL path's conversion + * (builtins/fs-paths.ts): each lowers to the hidden local that holds its + * value, which is null until the path's lowering has saved it. */ + readonly stagedArguments = new Map(); + /** The staged arguments that follow each such URL path, in order. */ + readonly stagedAfterPath = new Map(); readonly moduleNsParamOverrides = new Map< ts.ParameterDeclaration, IrType & { kind: "moduleNs" } @@ -10003,6 +10009,8 @@ export class Lowerer { // retain their own checked conversion and must not be erased here. while (ts.isParenthesizedExpression(node) || ts.isSatisfiesExpression(node)) node = node.expression; + const staged = this.stagedArgument(node); + if (staged) return expected ? this.coerceInto(node, staged, expected) : staged; if (expected) { if (ts.isConditionalExpression(node)) return lowerTernary(this, node, expected); const escaped = this.neverAssertionInto(node, expected); @@ -12035,7 +12043,19 @@ export class Lowerer { lowerExpr(expr: ts.Expression): IrExpr { const hash = this.hashStreamReceivers.get(expr); if (hash) return hashStreamOf(varRef(hash.localId, hash.type, locOf(expr))); - return lowerExpr(this, expr); + return this.stagedArgument(expr) ?? lowerExpr(this, expr); + } + + /** The saved value of a staged fs argument (stagedArguments), or null for + * every other expression. */ + private stagedArgument(node: ts.Expression): IrExpr | null { + if (this.stagedArguments.size === 0) return null; + while (ts.isParenthesizedExpression(node)) node = node.expression; + if (!this.stagedArguments.has(node)) return null; + const slot = this.stagedArguments.get(node); + if (!slot) + throw new InternalCompilerError("an fs argument lowered before the URL path it follows"); + return varRef(slot.localId, slot.type, locOf(node)); } lowerIntrinsicProperty(expr: ts.PropertyAccessExpression): IrExpr | null { diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6931-fs-url-paths.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6931-fs-url-paths.ts.json new file mode 100644 index 000000000..6a1574e04 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6931-fs-url-paths.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6931-fs-url-paths.ts" + ], + "diags": [] +} diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/diagnostics/fs-url-path-fences.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/diagnostics/fs-url-path-fences.ts.json new file mode 100644 index 000000000..c25c78ec0 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/diagnostics/fs-url-path-fences.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/diagnostics/fs-url-path-fences.ts" + ], + "diags": [] +} diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/fixtures/node-types/fs-url-path-fences.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/fixtures/node-types/fs-url-path-fences.ts.json new file mode 100644 index 000000000..7b63a5564 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/fixtures/node-types/fs-url-path-fences.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/fixtures/node-types/fs-url-path-fences.ts" + ], + "diags": [] +} diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/fixtures/node-types/fs-url-paths.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/fixtures/node-types/fs-url-paths.ts.json new file mode 100644 index 000000000..cdc4ee43f --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/fixtures/node-types/fs-url-paths.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/fixtures/node-types/fs-url-paths.ts" + ], + "diags": [] +} diff --git a/tests/corpus/6931-fs-url-paths.ts b/tests/corpus/6931-fs-url-paths.ts new file mode 100644 index 000000000..91a630d1b --- /dev/null +++ b/tests/corpus/6931-fs-url-paths.ts @@ -0,0 +1,96 @@ +// fs functions given file: URL paths: the URL converts as fileURLToPath +// converts it, so names with spaces and non-ASCII characters reach the same +// file, and URLs with another scheme, a host or an encoded separator throw +// Node's errors. +import * as fs from "node:fs"; +import * as os from "node:os"; +import * as path from "node:path"; +import { pathToFileURL } from "node:url"; + +const dir = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), "fs-url-"))); +const at = (name: string): URL => pathToFileURL(path.join(dir, name)); +// Arguments after a URL path are evaluated before the URL converts. +function logged(name: string): URL { + console.log("evaluated", name); + return at(name); +} +function mode(): number { + console.log("evaluated mode"); + return 0o600; +} + +function clean(text: string): string { + return text.split(dir).join(""); +} + +function attempt(label: string, run: () => void): void { + try { + run(); + console.log(label, "returned"); + } catch (error) { + if (error instanceof Error) { + const code = (error as NodeJS.ErrnoException).code; + console.log(label, error.name, code, clean(error.message)); + } + } +} + +const file = at("a b ü.txt"); +fs.writeFileSync(file, "hello"); +console.log(fs.readFileSync(file, "utf8")); +console.log(fs.readFileSync(file).length); +console.log(fs.readFileSync(file, { encoding: "utf8" })); +console.log(fs.readFileSync(file, "base64")); +fs.appendFileSync(file, " world"); +fs.writeFileSync(at("bytes.bin"), new Uint8Array([1, 2, 3])); +fs.writeFileSync(at("mode.txt"), "m", { mode: 0o600 }); +console.log(fs.readFileSync(path.join(dir, "a b ü.txt"), "utf8")); +console.log(fs.statSync(file).size, fs.lstatSync(file).isFile(), fs.statSync(at("bytes.bin")).size); +console.log(fs.statSync(at("missing"), { throwIfNoEntry: false }) === undefined); +fs.accessSync(file); +fs.accessSync(file, fs.constants.R_OK); +fs.chmodSync(file, 0o644); +console.log((fs.statSync(file).mode & 0o777).toString(8)); + +fs.mkdirSync(at("sub/deep"), { recursive: true }); +fs.mkdirSync(at("plain")); +console.log(fs.readdirSync(at("sub"))); +console.log(fs.readdirSync(at("sub"), { withFileTypes: true }).map((entry) => entry.name)); +fs.copyFileSync(file, at("sub/copy.txt")); +fs.renameSync(at("sub/copy.txt"), at("sub/moved.txt")); +console.log(fs.readFileSync(at("sub/moved.txt"), "utf8")); +fs.truncateSync(at("sub/moved.txt"), 4); +console.log(fs.readFileSync(at("sub/moved.txt"), "utf8")); +const fd = fs.openSync(at("sub/moved.txt"), "r"); +console.log(typeof fd); +fs.closeSync(fd); +console.log(clean(fs.realpathSync(at("sub/../sub/moved.txt")))); +console.log(clean(fs.realpathSync.native(at("sub")))); +const temp = fs.mkdtempSync(at("tmp-")); +console.log(path.dirname(temp) === dir, path.basename(temp).length); +fs.rmdirSync(pathToFileURL(temp)); +const opened = fs.opendirSync(at("sub")); +console.log(opened.path === path.join(dir, "sub")); +opened.closeSync(); +fs.unlinkSync(at("sub/moved.txt")); +fs.rmSync(at("sub"), { recursive: true, force: true }); +fs.rmSync(at("plain"), { recursive: true }); +console.log(fs.readdirSync(dir).sort()); + +attempt("scheme", () => fs.readFileSync(new URL("http://example.com/a.txt"), "utf8")); +attempt("host", () => fs.statSync(new URL("file://example.com/a.txt"))); +attempt("separator", () => fs.readFileSync(new URL("file:///tmp/a%2Fb"), "utf8")); +attempt("lowercase separator", () => fs.unlinkSync(new URL("file:///tmp/a%2fb"))); +attempt("null byte", () => fs.readFileSync(new URL("file:///tmp/a%00b"))); +attempt("missing", () => fs.readFileSync(at("missing.txt"), "utf8")); +attempt("both bad", () => fs.copyFileSync(new URL("http://a/"), new URL("file://b/c"))); +attempt("rename", () => fs.renameSync(at("missing.txt"), at("other.txt"))); +attempt("mkdir", () => { + fs.mkdirSync(new URL("ftp://a/b"), { recursive: true }); +}); +attempt("later effects", () => fs.copyFileSync(new URL("http://a/"), logged("dest.txt"))); +attempt("later mode", () => fs.chmodSync(new URL("http://a/"), mode())); +attempt("chmod", () => fs.chmodSync(new URL("data:text/plain,a"), 0o600)); + +fs.rmSync(dir, { recursive: true, force: true }); +console.log("done", fs.existsSync(dir)); diff --git a/tests/diagnostics/fs-url-path-fences.ts b/tests/diagnostics/fs-url-path-fences.ts new file mode 100644 index 000000000..080c561e1 --- /dev/null +++ b/tests/diagnostics/fs-url-path-fences.ts @@ -0,0 +1,15 @@ +// URL paths whose conversion would run in a different order than Node's. +import * as fs from "node:fs"; + +const url = new URL("file:///tmp/fs-url-path-fences"); +const encoding: BufferEncoding = process.argv.length > 9 ? "latin1" : "utf8"; +const recursive = process.argv.length > 9; + +// Node validates the string source before converting the URL destination. +fs.copyFileSync("/tmp/source", url); +// Node validates the options before the path. +console.log(fs.readFileSync(url, encoding)); +fs.mkdirSync(url, { recursive }); +// A literal's members are lowered one by one, so they cannot be evaluated +// ahead of the conversion as one value. +console.log(fs.statSync(url, { throwIfNoEntry: process.argv.length > 9 })); diff --git a/tests/fixtures/node-types/fs-url-path-fences.ts b/tests/fixtures/node-types/fs-url-path-fences.ts new file mode 100644 index 000000000..4ae142189 --- /dev/null +++ b/tests/fixtures/node-types/fs-url-path-fences.ts @@ -0,0 +1,9 @@ +import { existsSync } from "node:fs"; +import { readFile, stat } from "node:fs/promises"; + +const url = new URL("file:///tmp/node-types-url-fences"); +// existsSync answers false for a URL it cannot convert. +console.log(existsSync(url)); +// The fs.promises functions reject for a URL they cannot convert. +void readFile(url, "utf8"); +void stat(url); diff --git a/tests/fixtures/node-types/fs-url-paths.ts b/tests/fixtures/node-types/fs-url-paths.ts new file mode 100644 index 000000000..6d33d708d --- /dev/null +++ b/tests/fixtures/node-types/fs-url-paths.ts @@ -0,0 +1,10 @@ +import { mkdtempSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { pathToFileURL } from "node:url"; + +const dir = mkdtempSync(join(tmpdir(), "node-types-url-")); +const file = pathToFileURL(join(dir, "a b.txt")); +writeFileSync(file, "hello"); +console.log(readFileSync(file, "utf8"), readFileSync(file).length, statSync(file).size); +rmSync(pathToFileURL(dir), { recursive: true }); diff --git a/tests/harness/__snapshots__/fs-url-path-fences.ts.txt b/tests/harness/__snapshots__/fs-url-path-fences.ts.txt new file mode 100644 index 000000000..1a53f8df5 --- /dev/null +++ b/tests/harness/__snapshots__/fs-url-path-fences.ts.txt @@ -0,0 +1,35 @@ +fs-url-path-fences.ts:9:1 - error SC2020: 'copyFileSync with a string path before a URL path' is part of the standard library types but has no scriptc lowering yet + + 8 | // Node validates the string source before converting the URL destination. + 9 | fs.copyFileSync("/tmp/source", url); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 10 | // Node validates the options before the path. + + hint: convert the URL first: fileURLToPath(url) from node:url + +fs-url-path-fences.ts:11:34 - error SC2020: 'readFileSync with a URL path and options that are not literals' is part of the standard library types but has no scriptc lowering yet + + 10 | // Node validates the options before the path. + 11 | console.log(fs.readFileSync(url, encoding)); + | ^~~~~~~~ + 12 | fs.mkdirSync(url, { recursive }); + + hint: convert the URL first: fileURLToPath(url) from node:url + +fs-url-path-fences.ts:12:19 - error SC2020: 'mkdirSync with a URL path and options that are not literals' is part of the standard library types but has no scriptc lowering yet + + 11 | console.log(fs.readFileSync(url, encoding)); + 12 | fs.mkdirSync(url, { recursive }); + | ^~~~~~~~~~~~~ + 13 | // A literal's members are lowered one by one, so they cannot be evaluated + + hint: convert the URL first: fileURLToPath(url) from node:url + +fs-url-path-fences.ts:15:30 - error SC2020: 'statSync with a URL path and a later literal that has effects' is part of the standard library types but has no scriptc lowering yet + + 14 | // ahead of the conversion as one value. + 15 | console.log(fs.statSync(url, { throwIfNoEntry: process.argv.length > 9 })); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 16 | + + hint: convert the URL first: fileURLToPath(url) from node:url \ No newline at end of file diff --git a/tests/harness/corpus-costs/6931-fs-url-paths.ts.json b/tests/harness/corpus-costs/6931-fs-url-paths.ts.json new file mode 100644 index 000000000..458abd256 --- /dev/null +++ b/tests/harness/corpus-costs/6931-fs-url-paths.ts.json @@ -0,0 +1 @@ +{ "plain": 4139, "san": 50584 } diff --git a/tests/harness/project-config.test.ts b/tests/harness/project-config.test.ts index c7a5202f2..dabb9b0bf 100644 --- a/tests/harness/project-config.test.ts +++ b/tests/harness/project-config.test.ts @@ -764,6 +764,35 @@ test("node-types: exec's numeric ExecException.code remains a named fence", asyn } }); +test("node-types: fs functions take URL paths under @types/node's PathLike", async () => { + const dir = outDirFor("node-fs-url-paths"); + const result = await compile(join(nodeTypesDir, "fs-url-paths.ts"), { + outPath: join(dir, "fs-url-paths"), + outDir: dir, + sanitize, + }); + expect(result.ok, !result.ok ? JSON.stringify(result.diagnostics, null, 2) : "").toBe(true); + if (!result.ok) return; + const { stdout } = await execFileAsync(result.binaryPath); + expect(stdout).toBe("hello 5 5\n"); +}); + +test("node-types: existsSync and fs.promises URL paths remain named fences", async () => { + const dir = outDirFor("node-fs-url-path-fences"); + const result = await compile(join(nodeTypesDir, "fs-url-path-fences.ts"), { + outPath: join(dir, "fs-url-path-fences"), + outDir: dir, + sanitize, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.diagnostics.map((diagnostic) => [diagnostic.code, diagnostic.message])).toEqual([ + ["SC2020", expect.stringContaining("'existsSync with a URL path'")], + ["SC2020", expect.stringContaining("'fs.promises.readFile with a URL path'")], + ["SC2020", expect.stringContaining("'fs.promises.stat with a URL path'")], + ]); +}); + test("node-types: path and os lower statically under @types/node's shapes", async () => { const outDir = outDirFor("node-path-os"); const result = await compile(join(nodeTypesDir, "path-os.ts"), { From fd8ac00e63ab536e4065ab55cb06932d00c7c7c9 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 08:53:09 -0500 Subject: [PATCH 02/67] Convert global isFinite's argument with ToNumber Global isFinite now converts any argument with ToNumber before the test, the same way global isNaN does, and only Number.isFinite stays strict. Before, an argument that wasn't typed as a number, such as a checker-unknown or dynamic value, refused with SC2012. The shared ToNumber conversion for these arguments (isNaN, isFinite, the Math functions, String.fromCharCode, DataView offsets) now handles every value kind: strings parse as numeric literals, booleans and null convert to numbers, undefined is NaN, and dynamic values call valueOf/toString or throw Node's TypeError for a Symbol or BigInt. Before, a dynamic value went through a checked number cast and threw a TypeError for a string, and a string or boolean in a JavaScript file reached a run-time SC1090. Fixes #1386 Co-authored-by: espetro <26749475+espetro@users.noreply.github.com> --- .../src/frontend/lowering/lower-calls.ts | 84 +++++++------------ .../src/frontend/lowering/lower-exprs.ts | 22 +++++ .../corpus/6905-isfinite-coercion.ts.json | 6 ++ .../corpus/6906-tonumber-arguments.mjs.json | 6 ++ tests/corpus/6905-isfinite-coercion.ts | 38 +++++++++ tests/corpus/6906-tonumber-arguments.mjs | 32 +++++++ 6 files changed, 135 insertions(+), 53 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6905-isfinite-coercion.ts.json create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6906-tonumber-arguments.mjs.json create mode 100644 tests/corpus/6905-isfinite-coercion.ts create mode 100644 tests/corpus/6906-tonumber-arguments.mjs diff --git a/packages/compiler/src/frontend/lowering/lower-calls.ts b/packages/compiler/src/frontend/lowering/lower-calls.ts index d768cec9b..9d871ca8b 100644 --- a/packages/compiler/src/frontend/lowering/lower-calls.ts +++ b/packages/compiler/src/frontend/lowering/lower-calls.ts @@ -166,7 +166,6 @@ import { lowerReflectCall } from "./builtins/reflection.js"; import { lowerAbsenceProbe, v8CalleeText, - lowerOptionalNumber, lowerPromiseAllTupleCall, lowerPromiseRejectCall, lowerToNumberArgument, @@ -1008,10 +1007,9 @@ export function lowerCall(lowerer: Lowerer, expr: ts.CallExpression): IrExpr { // excludes shadowed names. parseInt's omitted radix completes // to 0 — the spec's "undefined" (base 10 with the 0x hex escape); // parseFloat lowers the STRING form only (Node would ToString other - // values — no static story); isNaN/isFinite's arguments are - // checker-pinned (or checked) to number, where the global's ToNumber - // coercion is the identity and the tests are Number.isNaN / - // Number.isFinite exactly (ms's `isFinite(val)` guard). + // values — no static story); isNaN/isFinite apply the global's + // ToNumber to any argument, then test like Number.isNaN / + // Number.isFinite. if ( (expr.expression.text === "parseInt" || expr.expression.text === "isNaN" || @@ -1130,18 +1128,14 @@ export function lowerCall(lowerer: Lowerer, expr: ts.CallExpression): IrExpr { } if (islFn && expr.arguments.nodes.length === islFn.args.length) { // The static forms above already took the exactly-typed argument - // (a string for parseFloat, a number for isFinite): name the - // argument type that refused the call, so the message states the - // condition rather than reading as if the global itself were - // unsupported. + // (a string for parseFloat): name the argument type that refused + // the call, so the message states the condition rather than + // reading as if the global itself were unsupported. const argText = loweredArgumentText(lowerer, expr.arguments.nodes[0]!); - const exact = expr.expression.text === "isFinite" ? "number" : "string"; lowerer.refuseUnsupportedApi( `'${expr.expression.text}' with a '${argText}' argument`, expr, - exact === "string" - ? "only a string argument compiles statically: convert the argument explicitly first (for example String(x), or narrow the union)" - : "only a number argument compiles statically: narrow the argument to a number first", + "only a string argument compiles statically: convert the argument explicitly first (for example String(x), or narrow the union)", ); } } @@ -10298,7 +10292,7 @@ export function lowerStaticNumberGlobal( args: readonly ts.Expression[], loc: SrcLoc, ): IrExpr | null { - if (name === "parseInt" || name === "isNaN") { + if (name === "parseInt" || name === "isNaN" || name === "isFinite") { const maxArgs = name === "parseInt" ? 2 : 1; if (args.length < 1 || args.length > maxArgs) { lowerer.noLowering( @@ -10306,10 +10300,12 @@ export function lowerStaticNumberGlobal( call, ); } - if (name === "isNaN") { - // The global's ToNumber turns a missing value into NaN. + if (name === "isNaN" || name === "isFinite") { + // The global's ToNumber turns a missing value into NaN, converts + // strings, booleans and null, and calls valueOf/toString on objects. const x = lowerToNumberArgument(lowerer, args[0]!); - return { kind: "libCall", fn: "num.isNaN", args: [x], type: BOOL, loc }; + const fn = name === "isNaN" ? "num.isNaN" : "number.isFinite"; + return { kind: "libCall", fn, args: [x], type: BOOL, loc }; } const radix: IrExpr = args[1] ? lowerer.lowerExprExpecting(args[1], F64) @@ -10445,32 +10441,28 @@ export function lowerStaticNumberGlobal( : lowerer.lowerExprExpecting(args[0]!, STRING); return { kind: "libCall", fn: "num.parseInt", args: [s, radix], type: F64, loc }; } - // STATIC parseFloat/isFinite over exactly-typed arguments — - // parseInt's siblings (num.parseFloat is ECMA 19.2.4's decimal- - // literal prefix parse in scr_string.c; a number-typed isFinite IS - // Number.isFinite — the global's ToNumber coercion is the identity - // there, ms's `isFinite(val)` guard). Other argument types retain - // their native coercion checks or the SC2012 refusal. The probe never - // emits — lowering is IR construction. - if ((name === "parseFloat" || name === "isFinite") && args.length === 1) { - if (name === "parseFloat") { - const optional = optionalCallValue(lowerer, args[0]!); - if (optional) { - const parsed = lowerOptionalStringNumber( - lowerer, - optional, - loc, - "num.parseFloat", - "parseFloat", - ); - if (parsed) return parsed; - } + // STATIC parseFloat over string arguments — parseInt's sibling + // (num.parseFloat is ECMA 19.2.4's decimal-literal prefix parse in + // scr_string.c). Other argument types retain their native coercion + // checks or the SC2012 refusal. The probe never emits — lowering is IR + // construction. + if (name === "parseFloat" && args.length === 1) { + const optional = optionalCallValue(lowerer, args[0]!); + if (optional) { + const parsed = lowerOptionalStringNumber( + lowerer, + optional, + loc, + "num.parseFloat", + "parseFloat", + ); + if (parsed) return parsed; } const probed = tryLowerExpression(lowerer, args[0]!); - if (name === "parseFloat" && probed?.type.kind === "string") { + if (probed?.type.kind === "string") { return { kind: "libCall", fn: "num.parseFloat", args: [probed], type: F64, loc }; } - if (name === "parseFloat" && probed?.type.kind === "dyn") { + if (probed?.type.kind === "dyn") { return { kind: "libCall", fn: "num.parseFloat", @@ -10479,20 +10471,6 @@ export function lowerStaticNumberGlobal( loc, }; } - if (name === "isFinite" && probed?.type.kind === "f64") { - return { kind: "libCall", fn: "number.isFinite", args: [probed], type: BOOL, loc }; - } - // A number the checker trusts but storage may hold missing (an - // out-of-range read): the global's ToNumber makes undefined NaN. - if ( - name === "isFinite" && - probed?.type.kind === "union" && - lowerer.armTag(probed.type.unionId, UNDEFINED_T) >= 0 && - lowerer.stripUndefinedArm(probed.type).kind === "f64" - ) { - const x = lowerOptionalNumber(lowerer, probed, loc, args[0]); - return { kind: "libCall", fn: "number.isFinite", args: [x], type: BOOL, loc }; - } } return null; } diff --git a/packages/compiler/src/frontend/lowering/lower-exprs.ts b/packages/compiler/src/frontend/lowering/lower-exprs.ts index 591057cab..4b03e915d 100644 --- a/packages/compiler/src/frontend/lowering/lower-exprs.ts +++ b/packages/compiler/src/frontend/lowering/lower-exprs.ts @@ -1438,6 +1438,28 @@ export function lowerToNumberArgument(lowerer: Lowerer, node: ts.Expression): Ir if (ts.isConditionalExpression(inner)) return lowerer.lowerExprExpecting(node, F64); const value = lowerer.lowerExpr(node); if (isOptionalNumber(value)) return lowerOptionalNumber(lowerer, value, loc, inner); + // Other values convert with ToNumber: strings parse as numeric literals, + // booleans and null are numbers, and checked-dynamic values call + // valueOf/toString or throw Node's TypeError for a Symbol or BigInt. + const num = (value: number): IrExpr => ({ kind: "numLit", value, type: F64, loc }); + switch (value.type.kind) { + case "string": + return { kind: "libCall", fn: "num.fromString", args: [value], type: F64, loc }; + case "bool": + return { kind: "ternary", cond: value, then: num(1), else_: num(0), type: F64, loc }; + case "nullT": + return defaultAfterUndefined(value, num(0)); + case "undefinedT": + return defaultAfterUndefined(value, num(NaN)); + case "dyn": + return { kind: "libCall", fn: "dyn.toNumberCoerce", args: [value], type: F64, loc }; + case "union": + if (lowerer.dynConvertible(value.type)) { + const boxed = lowerer.coerceToExpected(value, DYN); + return { kind: "libCall", fn: "dyn.toNumberCoerce", args: [boxed], type: F64, loc }; + } + break; + } return lowerer.coerceInto(node, value, F64); } diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6905-isfinite-coercion.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6905-isfinite-coercion.ts.json new file mode 100644 index 000000000..210987798 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6905-isfinite-coercion.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6905-isfinite-coercion.ts" + ], + "diags": [] +} diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6906-tonumber-arguments.mjs.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6906-tonumber-arguments.mjs.json new file mode 100644 index 000000000..2fc650f3a --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6906-tonumber-arguments.mjs.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6906-tonumber-arguments.mjs" + ], + "diags": [] +} diff --git a/tests/corpus/6905-isfinite-coercion.ts b/tests/corpus/6905-isfinite-coercion.ts new file mode 100644 index 000000000..57e158c72 --- /dev/null +++ b/tests/corpus/6905-isfinite-coercion.ts @@ -0,0 +1,38 @@ +// Global isFinite applies ToNumber to its argument before the test, like +// global isNaN: strings parse as numeric literals, booleans and null are 0 +// and 1, undefined is NaN, and objects convert through valueOf/toString. +// Number.isFinite stays strict and answers false for anything not a number. +const values: unknown[] = ["12", "", " 0x10 ", "abc", "1e400", true, false, null, undefined, {}, [], [7], [1, 2]]; +for (const value of values) { + console.log(JSON.stringify(value) ?? "undefined", isFinite(value as any), Number.isFinite(value)); +} + +const u: unknown = 12; +console.log(isFinite(u as any)); + +let calls = ""; +const boxed: unknown = { valueOf: () => ((calls += "v"), 5) }; +console.log(isFinite(boxed as any), calls); +const text: unknown = { toString: () => "Infinity" }; +console.log(isFinite(text as any)); + +class Cache { + #maxAge: unknown; + constructor(maxAge?: number) { + this.#maxAge = maxAge; + } + expires(): boolean { + return isFinite(this.#maxAge as any); + } +} +console.log(new Cache(1000).expires(), new Cache().expires()); + +const throwing: unknown[] = [Symbol("s"), 10n]; +for (const value of throwing) { + try { + isFinite(value as any); + } catch (e) { + console.log(e instanceof TypeError); + } +} +console.log(isFinite(1 / 0), isFinite(-1 / 0), isFinite(0 / 0), isFinite(-0)); diff --git a/tests/corpus/6906-tonumber-arguments.mjs b/tests/corpus/6906-tonumber-arguments.mjs new file mode 100644 index 000000000..23b150eb8 --- /dev/null +++ b/tests/corpus/6906-tonumber-arguments.mjs @@ -0,0 +1,32 @@ +// Arguments that the global number functions convert with ToNumber, in a +// JavaScript file where they arrive as strings, booleans, null, undefined +// or dynamic values: isNaN, isFinite, Math functions and +// String.fromCharCode match Node for each. +console.log(isNaN("12"), isNaN("abc"), isNaN(true), isNaN(null), isNaN(undefined)); +console.log(isFinite("12"), isFinite("abc"), isFinite(true), isFinite(null), isFinite(undefined)); +console.log(Math.floor("3.7"), Math.max("4", 2), Math.abs(false), Math.sqrt(null), String.fromCharCode("65", true)); + +const parsed = JSON.parse('["12", " 0x10 ", "", "1e400", true, null, {}, [], [7]]'); +for (const value of parsed) console.log(JSON.stringify(value), isNaN(value), isFinite(value), Math.trunc(value)); + +let calls = ""; +const boxed = { valueOf: () => ((calls += "v"), 4.5), toString: () => ((calls += "s"), "9") }; +console.log(isFinite(boxed), isNaN(boxed), Math.round(boxed), calls); + +class LruCache { + constructor(config) { + this.maxAge = config.maxAge; + } + hasMaxAge() { + return isFinite(this.maxAge); + } +} +console.log(new LruCache({ maxAge: 1000 }).hasMaxAge(), new LruCache({}).hasMaxAge()); + +for (const value of [Symbol("s"), 10n]) { + try { + isFinite(value); + } catch (e) { + console.log(e instanceof TypeError, e.message); + } +} From 9b70fb5e7b0fde8a6eeb87bb903e47c7b2d40b88 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 08:58:29 -0500 Subject: [PATCH 03/67] Negotiate ALPN and bound the TLS version in tls.connect and tls.createServer tls.connect and tls.createServer accept ALPNProtocols as an array of strings, a Buffer or a Uint8Array in the wire format. The server answers with the first of its own protocols that the client offers, and both sockets report it as alpnProtocol. A client that offers none of the server's protocols fails with ERR_SSL_TLSV1_ALERT_NO_APPLICATION_PROTOCOL. minVersion and maxVersion bound the handshake, and getProtocol() reports the version it picked. Ranges that do not overlap fail with Node's ERR_SSL_TLSV1_ALERT_PROTOCOL_VERSION or ERR_SSL_NO_PROTOCOLS_AVAILABLE, and invalid versions throw Node's TypeError. tls.connect's timeout option arms the socket's inactivity timeout before it connects. Refs #1438 Co-authored-by: saboursepideh <25549001+saboursepideh@users.noreply.github.com> --- .../src/generated/node-v24-compatibility.json | 12 +- .../generated/node-v24-internal.json | 18 +- internal/compatibility/static-support.json | 2 + .../src/frontend/lowering/lower-server.ts | 30 +- .../corpus/6721-tls-alpn-protocols.ts.json | 6 + .../corpus/6722-tls-min-max-version.ts.json | 6 + .../corpus/6723-tls-connect-timeout.ts.json | 6 + packages/runtime/src/scr_error.c | 5 + packages/runtime/src/scr_tls.c | 443 ++++++++++++++++-- tests/corpus/6721-tls-alpn-protocols.ts | 75 +++ tests/corpus/6722-tls-min-max-version.ts | 85 ++++ tests/corpus/6723-tls-connect-timeout.ts | 51 ++ .../6721-tls-alpn-protocols.ts.json | 1 + .../6722-tls-min-max-version.ts.json | 1 + .../6723-tls-connect-timeout.ts.json | 1 + 15 files changed, 694 insertions(+), 48 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6721-tls-alpn-protocols.ts.json create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6722-tls-min-max-version.ts.json create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6723-tls-connect-timeout.ts.json create mode 100644 tests/corpus/6721-tls-alpn-protocols.ts create mode 100644 tests/corpus/6722-tls-min-max-version.ts create mode 100644 tests/corpus/6723-tls-connect-timeout.ts create mode 100644 tests/harness/corpus-costs/6721-tls-alpn-protocols.ts.json create mode 100644 tests/harness/corpus-costs/6722-tls-min-max-version.ts.json create mode 100644 tests/harness/corpus-costs/6723-tls-connect-timeout.ts.json diff --git a/docs/src/generated/node-v24-compatibility.json b/docs/src/generated/node-v24-compatibility.json index ed717c35e..66b0ba3dd 100644 --- a/docs/src/generated/node-v24-compatibility.json +++ b/docs/src/generated/node-v24-compatibility.json @@ -68082,9 +68082,9 @@ "inherited": true }, "static": { - "status": "not-implemented", - "detail": "No static compiler lowering is registered for this API yet.", - "verification": "registry-gap" + "status": "partial", + "detail": "Implemented for the documented scriptc module-loader subset.", + "verification": "test-backed" } }, { @@ -68289,9 +68289,9 @@ "inherited": true }, "static": { - "status": "not-implemented", - "detail": "No static compiler lowering is registered for this API yet.", - "verification": "registry-gap" + "status": "partial", + "detail": "Implemented for the documented scriptc module-loader subset.", + "verification": "test-backed" } }, { diff --git a/internal/compatibility/generated/node-v24-internal.json b/internal/compatibility/generated/node-v24-internal.json index bbf177d52..c6a7a102c 100644 --- a/internal/compatibility/generated/node-v24-internal.json +++ b/internal/compatibility/generated/node-v24-internal.json @@ -95364,7 +95364,9 @@ "tests/corpus/2331-tls-server-options-typed.ts", "tests/corpus/2500-net-autosel-timeout.ts", "tests/corpus/2557-tls-ca-store.ts", - "tests/corpus/2596-net-arg-ladders.cjs" + "tests/corpus/2596-net-arg-ladders.cjs", + "tests/corpus/6721-tls-alpn-protocols.ts", + "tests/corpus/6722-tls-min-max-version.ts" ] }, "anchorSource": "chapter" @@ -96365,8 +96367,11 @@ "inherited": true }, "static": { - "status": "not-implemented", - "evidence": "compiler-unmatched:tls" + "status": "partial", + "evidence": "compiler-feature:tls.tlsSocket.getProtocol", + "tests": [ + "tests/corpus/6722-tls-min-max-version.ts" + ] }, "anchorSource": "exact" }, @@ -96572,8 +96577,11 @@ "inherited": true }, "static": { - "status": "not-implemented", - "evidence": "compiler-unmatched:tls" + "status": "partial", + "evidence": "compiler-feature:tls.alpnProtocol", + "tests": [ + "tests/corpus/6721-tls-alpn-protocols.ts" + ] }, "anchorSource": "ancestor" }, diff --git a/internal/compatibility/static-support.json b/internal/compatibility/static-support.json index 1f713630b..23c7a159b 100644 --- a/internal/compatibility/static-support.json +++ b/internal/compatibility/static-support.json @@ -365,6 +365,8 @@ { "chapter": "stream", "signatures": ["`writable` Type: {boolean}"], "status": "partial", "evidence": ["tests/corpus/2893-child-stdin-duplex.ts", "tests/corpus/2895-child-stdin-write-after-end.ts"] }, { "chapter": "stream", "signatures": ["Event: `'drain'`"], "status": "partial", "evidence": ["tests/corpus/2894-child-stdin-backpressure.ts"] }, { "chapter": "console", "signatures": ["Class: `Console`"], "status": "partial", "evidence": ["tests/corpus/4900-console-instances.ts", "tests/corpus/4901-console-instance-errors.ts"] }, + { "chapter": "tls", "signatures": ["`alpnProtocol` Type: {string|boolean|null}"], "status": "partial", "evidence": ["tests/corpus/6721-tls-alpn-protocols.ts"] }, + { "chapter": "tls", "signatures": ["`tlsSocket.getProtocol()`"], "status": "partial", "evidence": ["tests/corpus/6722-tls-min-max-version.ts"] }, { "chapter": "webstreams", "signatures": ["`readableStream.values([options])`"], "status": "partial", "evidence": ["tests/corpus/2862-web-readable-async-iteration.ts"] }, { "chapter": "webstreams", "signatures": ["`streamConsumers.text(stream)`", "`streamConsumers.json(stream)`", "`streamConsumers.buffer(stream)`"], "status": "partial", "evidence": ["tests/corpus/2629-stream-consumers.ts", "tests/corpus/2630-stream-consumers-errors.ts"] }, { "chapter": "webstreams", "signatures": ["`streamConsumers.arrayBuffer(stream)`"], "status": "partial", "evidence": ["tests/corpus/4875-stream-consumers-array-buffer.ts"] }, diff --git a/packages/compiler/src/frontend/lowering/lower-server.ts b/packages/compiler/src/frontend/lowering/lower-server.ts index f0da85bf8..4a7c00d84 100644 --- a/packages/compiler/src/frontend/lowering/lower-server.ts +++ b/packages/compiler/src/frontend/lowering/lower-server.ts @@ -4877,12 +4877,14 @@ const TLS_VALIDATED_OPTIONS: ReadonlySet = new Set([ ]); /** True when a literal options bag must ride the runtime walker: JS uses - * it for the typed TLS validation ladders, and HTTPS uses it for + * it for the typed TLS validation ladders, HTTPS uses it for * keepAliveTimeoutBuffer so the HTTP option is consumed without losing - * the literal's evaluation order. */ + * the literal's evaluation order, and `runtimeKeys` names options only the + * runtime walk implements (tls.createServer's ALPNProtocols). */ function tlsLiteralNeedsRuntimeWalk( node: ts.ObjectLiteralExpression, includeHttpTimeoutOptions = false, + runtimeKeys: ReadonlySet = new Set(), ): boolean { const jsSource = isJsSourceFile(ts.getSourceFileOfNode(node)); return node.properties.nodes.some( @@ -4890,19 +4892,29 @@ function tlsLiteralNeedsRuntimeWalk( (ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p)) && (ts.isIdentifier(p.name) || ts.isStringLiteral(p.name)) && ((includeHttpTimeoutOptions && p.name.text === "keepAliveTimeoutBuffer") || + runtimeKeys.has(p.name.text) || (jsSource && TLS_VALIDATED_OPTIONS.has(p.name.text))), ); } +/** tls.createServer options the runtime walk implements and the literal + * cert/key lowering does not. */ +const TLS_SERVER_RUNTIME_OPTIONS: ReadonlySet = new Set([ + "ALPNProtocols", + "minVersion", + "maxVersion", +]); + function lowerTlsServerOptionsOrDyn( lowerer: Lowerer, node: ts.Expression, what: string, includeHttpTimeoutOptions = false, + runtimeKeys: ReadonlySet = new Set(), ): { cert: IrExpr; key: IrExpr; dyn?: undefined } | { dyn: IrExpr } { if ( ts.isObjectLiteralExpression(node) && - !tlsLiteralNeedsRuntimeWalk(node, includeHttpTimeoutOptions) + !tlsLiteralNeedsRuntimeWalk(node, includeHttpTimeoutOptions, runtimeKeys) ) { return lowerTlsServerOptions(lowerer, node, what); } @@ -4934,14 +4946,14 @@ function lowerTlsServerOptionsOrDyn( * connect(options[, cb]) and connect(port[, host][, options][, cb]) with * a RUNTIME options record (the checked-dynamic JS lane's shape — a dyn * value, or a record that converts): the runtime walk implements - * port/host/rejectUnauthorized/ca/servername and throws the catchable + * port/host/rejectUnauthorized/ca/servername/ALPNProtocols/minVersion/maxVersion/timeout and throws the catchable * fence for other documented members (the divergence-66 stance). The * callback (and 'secureConnect'/'connect' listeners) fires * post-handshake — Node's secureConnect timing. */ function lowerTlsConnectCall(lowerer: Lowerer, expr: ts.CallExpression, loc: SrcLoc): IrExpr { const args = expr.arguments.nodes; const FORMS_HINT = - "the supported forms are connect(options[, cb]) and connect(port[, host][, options][, cb]) — options implement port/host/rejectUnauthorized/ca/servername"; + "the supported forms are connect(options[, cb]) and connect(port[, host][, options][, cb]) — options implement port/host/rejectUnauthorized/ca/servername/ALPNProtocols/minVersion/maxVersion/timeout"; if (args.length < 1 || args.length > 4 || args.some(ts.isSpreadElement)) { lowerer.noLowering(`tls.connect with ${args.length} arguments`, expr, FORMS_HINT); } @@ -5060,7 +5072,13 @@ function lowerTlsModuleCall( "the supported form is createServer({ cert, key }, socket => ...)", ); } - const opts = lowerTlsServerOptionsOrDyn(lowerer, args[0]!, "tls.createServer"); + const opts = lowerTlsServerOptionsOrDyn( + lowerer, + args[0]!, + "tls.createServer", + false, + TLS_SERVER_RUNTIME_OPTIONS, + ); if (args.length === 1) { return opts.dyn !== undefined ? { kind: "libCall", fn: "tls.createServerDyn", args: [opts.dyn], type: NETSERVER_T, loc } diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6721-tls-alpn-protocols.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6721-tls-alpn-protocols.ts.json new file mode 100644 index 000000000..b86035ce7 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6721-tls-alpn-protocols.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6721-tls-alpn-protocols.ts" + ], + "diags": [] +} diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6722-tls-min-max-version.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6722-tls-min-max-version.ts.json new file mode 100644 index 000000000..0100ffe8f --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6722-tls-min-max-version.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6722-tls-min-max-version.ts" + ], + "diags": [] +} diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6723-tls-connect-timeout.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6723-tls-connect-timeout.ts.json new file mode 100644 index 000000000..cc239efba --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6723-tls-connect-timeout.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6723-tls-connect-timeout.ts" + ], + "diags": [] +} diff --git a/packages/runtime/src/scr_error.c b/packages/runtime/src/scr_error.c index 4f514681b..94523fc43 100644 --- a/packages/runtime/src/scr_error.c +++ b/packages/runtime/src/scr_error.c @@ -422,6 +422,11 @@ const char *scr_error_message_code(const ScrStr *msg) { { "self-signed certificate", false, "DEPTH_ZERO_SELF_SIGNED_CERT" }, { "unable to verify the first certificate", false, "UNABLE_TO_VERIFY_LEAF_SIGNATURE" }, { "Hostname/IP does not match certificate's altnames", false, "ERR_TLS_CERT_ALTNAME_INVALID" }, + { "error:0A000460:SSL routines:ssl3_read_bytes:tlsv1 alert no application protocol", true, + "ERR_SSL_TLSV1_ALERT_NO_APPLICATION_PROTOCOL" }, + { "error:0A00042E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version", true, + "ERR_SSL_TLSV1_ALERT_PROTOCOL_VERSION" }, + { "error:0A0000BF:SSL routines::no protocols available", true, "ERR_SSL_NO_PROTOCOLS_AVAILABLE" }, }; for (size_t i = 0; i < sizeof known / sizeof known[0]; i++) { size_t n = strlen(known[i].prefix); diff --git a/packages/runtime/src/scr_tls.c b/packages/runtime/src/scr_tls.c index 804e51d69..59f3c2c0a 100644 --- a/packages/runtime/src/scr_tls.c +++ b/packages/runtime/src/scr_tls.c @@ -255,6 +255,93 @@ void scr_secure_ctx_release_v(void *p) { scr_secure_ctx_release((ScrSecureCtx *) /* ── the server config (one per created server, rc'd) ────────────────── */ +/* An owned ALPN name list (NULL-terminated; NULL frees nothing). */ +static void scr_tls_alpn_free(char **names) { + if (names == NULL) return; + for (char **n = names; *n != NULL; n++) free(*n); + free(names); +} + +static bool scr_tls_alpn_dyn(const ScrDyn *v, char ***out); +static void scr_tls_opt_fence(const char *api, const char *key, const char *hint); +static bool scr_tls_dyn_truthy(const ScrDyn *v); + +/* Node's toV over a minVersion/maxVersion value: 'TLSv1' through 'TLSv1.3' + * as 10 through 13, null or undefined as `def`. Anything else throws + * ERR_TLS_INVALID_PROTOCOL_VERSION ("%j is not a valid TLS protocol + * version"). False with the exception pending. */ +static bool scr_tls_version_dyn(const ScrDyn *v, const char *which, int def, int *out) { + if (v == NULL || v->kind == SCR_DYN_UNDEF || v->kind == SCR_DYN_NULL) { + *out = def; + return true; + } + if (v->kind == SCR_DYN_STR) { + static const struct { const char *name; int version; } names[] = { + { "TLSv1", 10 }, { "TLSv1.1", 11 }, { "TLSv1.2", 12 }, { "TLSv1.3", 13 }, + }; + for (size_t i = 0; i < sizeof names / sizeof names[0]; i++) { + if (v->v.str->len == strlen(names[i].name) && + memcmp(v->v.str->data, names[i].name, v->v.str->len) == 0) { + *out = names[i].version; + return true; + } + } + } + ScrStr *shown = scr_util_format_j(v); + if (shown == NULL) return false; + char msg[300]; + int m = snprintf(msg, sizeof msg, "%.*s is not a valid %s TLS protocol version", + (int)(shown->len < 200 ? shown->len : 200), shown->data, which); + scr_str_release(shown); + scr_throw_error_msg_code(SCR_ERR_TYPE, msg, (size_t)m, "ERR_TLS_INVALID_PROTOCOL_VERSION"); + return false; +} + +/* The version range on an mbedTLS config. mbedTLS implements TLS 1.2 and + * 1.3, so a minimum of TLSv1 or TLSv1.1 offers from 1.2, the lowest version + * Node's default security level allows too. Answers false when no version + * in [min, max] is available (a maximum below 1.2, or min above max), which + * Node reports as ERR_SSL_NO_PROTOCOLS_AVAILABLE when the handshake starts. */ +static bool scr_tls_conf_versions(mbedtls_ssl_config *conf, int min, int max) { + if (min < 12) min = 12; + if (max < min) return false; + mbedtls_ssl_conf_min_tls_version(conf, min == 13 ? MBEDTLS_SSL_VERSION_TLS1_3 : MBEDTLS_SSL_VERSION_TLS1_2); + mbedtls_ssl_conf_max_tls_version(conf, max == 13 ? MBEDTLS_SSL_VERSION_TLS1_3 : MBEDTLS_SSL_VERSION_TLS1_2); + return true; +} + +/* Node's SecureContext checks, in its order: secureProtocol conflicts with + * an explicit minVersion or maxVersion, then each version. The range lands + * in *min / *max (Node's defaults TLSv1.2 and TLSv1.3). False with the + * exception pending. */ +static bool scr_tls_versions_dyn(const ScrDyn *opts, int *min, int *max) { + const ScrDyn *vmin = opts != NULL && opts->kind == SCR_DYN_OBJ ? scr_dyn_obj_get(opts, "minVersion", 10) : NULL; + const ScrDyn *vmax = opts != NULL && opts->kind == SCR_DYN_OBJ ? scr_dyn_obj_get(opts, "maxVersion", 10) : NULL; + const ScrDyn *proto = opts != NULL && opts->kind == SCR_DYN_OBJ ? scr_dyn_obj_get(opts, "secureProtocol", 14) : NULL; + if (proto != NULL && scr_tls_dyn_truthy(proto)) { + const ScrDyn *version = vmin != NULL && vmin->kind != SCR_DYN_UNDEF && vmin->kind != SCR_DYN_NULL ? vmin + : vmax != NULL && vmax->kind != SCR_DYN_UNDEF && vmax->kind != SCR_DYN_NULL ? vmax + : NULL; + if (version != NULL) { + ScrStr *a = scr_util_format_j(version); + if (a == NULL) return false; + ScrStr *b = scr_util_format_j(proto); + if (b == NULL) { + scr_str_release(a); + return false; + } + char msg[400]; + int m = snprintf(msg, sizeof msg, "TLS protocol version %.*s conflicts with secureProtocol %.*s", + (int)(a->len < 150 ? a->len : 150), a->data, (int)(b->len < 150 ? b->len : 150), b->data); + scr_str_release(a); + scr_str_release(b); + scr_throw_error_msg_code(SCR_ERR_TYPE, msg, (size_t)m, "ERR_TLS_PROTOCOL_VERSION_CONFLICT"); + return false; + } + } + return scr_tls_version_dyn(vmin, "minimum", 12, min) && scr_tls_version_dyn(vmax, "maximum", 13, max); +} + typedef struct ScrTlsSrv { size_t rc; mbedtls_ssl_config conf; @@ -275,6 +362,12 @@ typedef struct ScrTlsSrv { * thunk that becomes each minted answer closure's fn */ ScrClosure *sni_cb; void *sni_answer_fn; + /* tls.createServer's ALPNProtocols (owned; NULL when none), in the + * server's preference order. */ + char **alpn; + /* maxVersion TLSv1.2: the ClientHello is pre-parsed so a hello that + * offers only later versions gets OpenSSL's protocol_version alert. */ + bool max_tls12; } ScrTlsSrv; /* The ALPN answers (static storage — mbedTLS keeps the pointers). Plain @@ -325,6 +418,7 @@ static void scr_tls_srv_release(ScrTlsSrv *s) { mbedtls_ssl_config_free(&s->conf); mbedtls_x509_crt_free(&s->cert); mbedtls_pk_free(&s->pk); + scr_tls_alpn_free(s->alpn); free(s); } @@ -342,6 +436,13 @@ typedef struct ScrTlsCli { * VERIFY_NONE socket (the https client's rejectUnauthorized:false) * never verified, so authorized answers false like Node's. */ bool verify_recorded; + /* The ALPNProtocols option's names, NULL-terminated, in the caller's + * order (mbedtls_ssl_conf_alpn_protocols keeps the pointer); NULL when + * none are offered. */ + char **alpn; + /* No TLS version is in the configured range: the handshake fails as + * soon as it starts (Node's ERR_SSL_NO_PROTOCOLS_AVAILABLE). */ + bool no_protocols; } ScrTlsCli; /* The default trust anchors when no `ca` option is given: the host trust @@ -490,6 +591,7 @@ static ScrTlsCli *scr_tls_cli_new(ScrStr *host, bool reject_unauthorized, const static void scr_tls_cli_free(ScrTlsCli *c) { mbedtls_ssl_config_free(&c->conf); + scr_tls_alpn_free(c->alpn); mbedtls_x509_crt_free(&c->ca); free(c->hostname); free(c->verify_name); @@ -725,8 +827,13 @@ static int scr_tls_f_sni(void *p, mbedtls_ssl_context *ssl, const unsigned char * random, session id, cipher suites, compression, then the extension list * — server_name (type 0) holds one host_name (type 0) entry. Answers 1 * with `out` set, 2 for a well-formed hello without SNI or anything - * malformed (the real handshake will judge it). */ -static int scr_tls_parse_ch_body(const unsigned char *b, size_t n, char *out, size_t out_cap) { + * malformed (the real handshake will judge it). *offers12 answers whether + * the hello offers TLS 1.2: true without a supported_versions extension + * (type 43), else whether its list holds 0x0303. */ +static int scr_tls_parse_ch_body(const unsigned char *b, size_t n, char *out, size_t out_cap, + bool *offers12) { + *offers12 = true; + int found = 2; size_t i = 34; /* version(2) + random(32) */ if (i + 1 > n) return 2; i += 1 + b[i]; /* session id: length byte + body */ @@ -744,24 +851,35 @@ static int scr_tls_parse_ch_body(const unsigned char *b, size_t n, char *out, si size_t el = ((size_t)b[i + 2] << 8) | b[i + 3]; i += 4; if (i + el > end) return 2; - if (et == 0) { + if (et == 0 && found == 2) { /* server_name: list length(2), then entry type(1) + length(2) + name */ - if (el < 5 || b[i + 2] != 0) return 2; - size_t nl = ((size_t)b[i + 3] << 8) | b[i + 4]; - if (nl == 0 || nl + 5 > el || nl + 1 > out_cap) return 2; - memcpy(out, b + i + 5, nl); - out[nl] = 0; - return 1; + if (el >= 5 && b[i + 2] == 0) { + size_t nl = ((size_t)b[i + 3] << 8) | b[i + 4]; + if (nl > 0 && nl + 5 <= el && nl + 1 <= out_cap) { + memcpy(out, b + i + 5, nl); + out[nl] = 0; + found = 1; + } + } + } else if (et == 43 && el >= 1) { + /* supported_versions: list length(1), then 2-byte versions */ + size_t vl = b[i] < el - 1 ? b[i] : el - 1; + *offers12 = false; + for (size_t v = 0; v + 1 < vl; v += 2) { + if (b[i + 1 + v] == 0x03 && b[i + 2 + v] == 0x03) *offers12 = true; + } } i += el; } - return 2; + return found; } /* Reassemble the handshake stream from the raw record flight and look for * the server_name extension. 0 = need more bytes; 1 = found (out set); * 2 = no SNI / not parseable (serve the default cert). */ -static int scr_tls_parse_sni(const unsigned char *buf, size_t len, char *out, size_t out_cap) { +static int scr_tls_parse_sni(const unsigned char *buf, size_t len, char *out, size_t out_cap, + bool *offers12) { + *offers12 = true; unsigned char *hs = NULL; size_t hs_len = 0, hs_cap = 0; size_t off = 0; @@ -785,7 +903,7 @@ static int scr_tls_parse_sni(const unsigned char *buf, size_t len, char *out, si size_t chlen = ((size_t)hs[1] << 16) | ((size_t)hs[2] << 8) | hs[3]; if (chlen > 131072) { free(hs); return 2; } if (hs_len >= 4 + chlen) { - int r = scr_tls_parse_ch_body(hs + 4, chlen, out, out_cap); + int r = scr_tls_parse_ch_body(hs + 4, chlen, out, out_cap, offers12); free(hs); return r; } @@ -811,8 +929,19 @@ static int scr_tls_sni_collect(ScrTlsSock *t) { char servername[256]; for (;;) { if (t->hello_len > 0) { - int r = scr_tls_parse_sni(t->hello, t->hello_len, servername, sizeof servername); - if (r == 2 || t->hello_len > 65536) { + bool offers12; + int r = scr_tls_parse_sni(t->hello, t->hello_len, servername, sizeof servername, &offers12); + if (r != 0 && t->srv->max_tls12 && !offers12) { + /* A TLS 1.2 server and a hello offering only later versions: + * OpenSSL answers with a fatal protocol_version alert, which the + * client reports as ERR_SSL_TLSV1_ALERT_PROTOCOL_VERSION. */ + static const unsigned char alert[] = { 0x15, 0x03, 0x03, 0x00, 0x02, 0x02, 0x46 }; + int fd = scr_net_sock_fd(t->sock); + if (fd >= 0) (void)!write(fd, alert, sizeof alert); + scr_net_sock_transport_error(t->sock, NULL); + return -1; + } + if (r == 2 || t->hello_len > 65536 || (r == 1 && t->srv->sni_cb == NULL)) { /* no SNI (or unparseable): skip the callback, serve the default * pair — Node's SNICallback never fires without a server_name */ t->sni_state = SCR_SNI_DONE; @@ -899,6 +1028,12 @@ void scr_tls_sni_answer(ScrClosure *self, bool has_err, ScrSecureCtx *ctx /*move static int scr_tls_handshake(void *tctx) { ScrTlsSock *t = (ScrTlsSock *)tctx; + if (t->cli != NULL && t->cli->no_protocols) { + /* OpenSSL's reason without its per-process prefix (SEMANTICS.md + * divergence 55); scr_error_message_code gives Node's code. */ + scr_net_sock_transport_error(t->sock, "error:0A0000BF:SSL routines::no protocols available"); + return -1; + } if (t->sni_state == SCR_SNI_COLLECT) { t->in_handshake = true; int c = scr_tls_sni_collect(t); @@ -927,6 +1062,20 @@ static int scr_tls_handshake(void *tctx) { * at this level and let the closed hook classify it */ scr_net_sock_transport_error(t->sock, NULL); return -1; + } else if (r == MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE && + t->ssl.MBEDTLS_PRIVATE(in_msg) != NULL && + t->ssl.MBEDTLS_PRIVATE(in_msg)[1] == MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL) { + /* The server shares none of the ALPNProtocols: OpenSSL's reason, which + * Node reports as ERR_SSL_TLSV1_ALERT_NO_APPLICATION_PROTOCOL + * (scr_error_message_code), without its per-process prefix and source + * location (SEMANTICS.md divergence 55). */ + snprintf(msg, sizeof msg, + "error:0A000460:SSL routines:ssl3_read_bytes:tlsv1 alert no application protocol"); + } else if (r == MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE && + t->ssl.MBEDTLS_PRIVATE(in_msg) != NULL && + t->ssl.MBEDTLS_PRIVATE(in_msg)[1] == MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION) { + /* The server accepts none of the offered versions. */ + snprintf(msg, sizeof msg, "error:0A00042E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version"); } else { /* non-verify handshake failures: honest but not Node's exact openssl * string (SEMANTICS.md divergence 55) */ @@ -1012,19 +1161,44 @@ static void scr_tls_srv_on_conn(void *ctx, ScrNetSocket *sock) { if (mbedtls_ssl_setup(&t->ssl, &srv->conf) != 0) scr_tls_oom(); t->sock = sock; t->srv = scr_tls_srv_retain(srv); - if (srv->sni_cb != NULL) t->sni_state = SCR_SNI_COLLECT; /* pre-parse the hello */ + if (srv->sni_cb != NULL || srv->max_tls12) t->sni_state = SCR_SNI_COLLECT; /* pre-parse the hello */ mbedtls_ssl_set_bio(&t->ssl, t, scr_tls_bio_send, scr_tls_bio_recv, NULL); scr_net_sock_set_transport(sock, &SCR_TLS_OPS, t); } +static ScrNetServer *scr_tls_create_server_alpn(const char *cert, size_t cert_len, + const char *key, size_t key_len, + ScrClosure *handler /*moves, nullable*/, + ScrNetConnFn fn, char **alpn /*moves, nullable*/, + int min_version, int max_version) { + ScrTlsSrv *srv = scr_tls_srv_new(cert, cert_len, key, key_len, false); + srv->max_tls12 = max_version == 12; + if (!scr_tls_conf_versions(&srv->conf, min_version, max_version)) { + /* Node's server then fails every handshake; nothing here models + * that, so it stays a refusal. */ + scr_tls_srv_release(srv); + scr_closure_release(handler); + scr_tls_alpn_free(alpn); + scr_tls_opt_fence("tls.createServer", "maxVersion", + "a version range with neither TLSv1.2 nor TLSv1.3 has no lowering"); + return NULL; + } + if (alpn != NULL) { + /* mbedTLS picks the first of these the client offers (Node's server + * preference) and sends no_application_protocol when it offers none. */ + srv->alpn = alpn; + mbedtls_ssl_conf_alpn_protocols(&srv->conf, (const char **)srv->alpn); + } + ScrNetServer *s = scr_net_create_server(handler, fn); + scr_net_server_set_native_conn(s, &scr_tls_srv_on_conn, srv, &scr_tls_srv_release_v); + scr_net_server_defer_connections(s); /* the handler is 'secureConnection' */ + return s; +} + ScrNetServer *scr_tls_create_server(const char *cert, size_t cert_len, const char *key, size_t key_len, ScrClosure *handler /*moves, nullable*/, ScrNetConnFn fn) { - ScrTlsSrv *srv = scr_tls_srv_new(cert, cert_len, key, key_len, false); - ScrNetServer *s = scr_net_create_server(handler, fn); - scr_net_server_set_native_conn(s, &scr_tls_srv_on_conn, srv, &scr_tls_srv_release_v); - scr_net_server_defer_connections(s); /* the handler is 'secureConnection' */ - return s; + return scr_tls_create_server_alpn(cert, cert_len, key, key_len, handler, fn, NULL, 12, 13); } ScrNetServer *scr_https_create_server(const char *cert, size_t cert_len, const char *key, @@ -1730,8 +1904,10 @@ static bool scr_tls_opts_validate(const ScrDyn *opts) { * dyn options record; false = exception pending (partial results released). * Exported runtime-internally: scr_http2.c's createSecureServerDyn rides * the same walk (scr_http2.c always links alongside this unit). */ -bool scr_tls_srv_opts_walk(const ScrDyn *opts, const char *api, ScrBytes **cert_out, - ScrBytes **key_out) { +/* `server_ok`: tls.createServer reads ALPNProtocols, minVersion and + * maxVersion itself; the walk's other callers keep their fences. */ +static bool scr_tls_srv_opts_walk_ex(const ScrDyn *opts, const char *api, ScrBytes **cert_out, + ScrBytes **key_out, bool server_ok) { *cert_out = NULL; *key_out = NULL; if (opts == NULL || opts->kind != SCR_DYN_OBJ) { @@ -1770,6 +1946,9 @@ bool scr_tls_srv_opts_walk(const ScrDyn *opts, const char *api, ScrBytes **cert_ if (strcmp(e->key, "rejectUnauthorized") == 0) { continue; /* meaningful only with requestCert, which fences */ } + if (server_ok && (strcmp(e->key, "ALPNProtocols") == 0 || strcmp(e->key, "minVersion") == 0 || + strcmp(e->key, "maxVersion") == 0)) + continue; if (strcmp(e->key, "SNICallback") == 0) { scr_tls_opt_fence(api, "SNICallback", "SNICallback lowers only on http2.createSecureServer({ allowHTTP1: true, ... }) with a literal options object"); @@ -1803,6 +1982,11 @@ bool scr_tls_srv_opts_walk(const ScrDyn *opts, const char *api, ScrBytes **cert_ return ok; } +bool scr_tls_srv_opts_walk(const ScrDyn *opts, const char *api, ScrBytes **cert_out, + ScrBytes **key_out) { + return scr_tls_srv_opts_walk_ex(opts, api, cert_out, key_out, false); +} + /* createSecureContext over a RUNTIME options record: Node's typed * validations first (scr_tls_opts_validate), then the pem walk — a bag * that validates AND carries both cert and key builds the real context; @@ -1845,13 +2029,29 @@ void scr_tls_ca_certs_chk(const ScrDyn *type, const ScrStr *fence) { ScrNetServer *scr_tls_create_server_dyn(const ScrDyn *opts /*borrowed*/, ScrClosure *handler /*moves, nullable*/, ScrNetConnFn fn) { - ScrBytes *cert, *key; - if (!scr_tls_srv_opts_walk(opts, "tls.createServer", &cert, &key)) { + int min_version = 12, max_version = 13; + if (!scr_tls_versions_dyn(opts, &min_version, &max_version)) { scr_closure_release(handler); return NULL; } - ScrNetServer *s = scr_tls_create_server((const char *)cert->data, cert->len, - (const char *)key->data, key->len, handler, fn); + ScrBytes *cert, *key; + if (!scr_tls_srv_opts_walk_ex(opts, "tls.createServer", &cert, &key, true)) { + scr_closure_release(handler); + return NULL; + } + /* The Server constructor converts ALPNProtocols after the secure + * context validates (Node's order). */ + char **alpn = NULL; + const ScrDyn *protocols = scr_dyn_obj_get(opts, "ALPNProtocols", 13); + if (protocols != NULL && !scr_tls_alpn_dyn(protocols, &alpn)) { + scr_bytes_release(cert); + scr_bytes_release(key); + scr_closure_release(handler); + return NULL; + } + ScrNetServer *s = scr_tls_create_server_alpn((const char *)cert->data, cert->len, + (const char *)key->data, key->len, handler, fn, + alpn, min_version, max_version); scr_bytes_release(cert); scr_bytes_release(key); return s; @@ -1896,20 +2096,157 @@ ScrNetServer *scr_https_create_server_dyn(const ScrDyn *opts /*borrowed*/, /* ── tls.connect (the TLS client socket) ──────────────────────────────── */ +/* Node's inspect of a Buffer inside ERR_INVALID_ARG_VALUE's message: + * "" with at most 50 bytes, the whole rendering cut at + * 128 characters with "...". */ +static void scr_tls_alpn_value_fail(const char *reason, const uint8_t *data, size_t len) { + char inspected[400]; + size_t n = (size_t)snprintf(inspected, sizeof inspected, " shown) n += (size_t)snprintf(inspected + n, sizeof inspected - n, " ... %zu more byte%s", len - shown, len - shown == 1 ? "" : "s"); + snprintf(inspected + n, sizeof inspected - n, ">"); + if (strlen(inspected) > 128) strcpy(inspected + 128, "..."); + char msg[600]; + int m = snprintf(msg, sizeof msg, "The argument 'ALPNProtocols' %s. Received %s", reason, inspected); + scr_throw_error_msg_code(SCR_ERR_TYPE, msg, (size_t)m, "ERR_INVALID_ARG_VALUE"); +} + +/* The wire list (...) as mbedTLS's NULL-terminated names, after + * Node's validateALPNBuffer. An empty list offers nothing (*out stays + * NULL). False with the exception pending. */ +static bool scr_tls_alpn_from_wire(const uint8_t *data, size_t len, char ***out) { + size_t count = 0; + for (size_t at = 0; at < len;) { + size_t n = data[at]; + if (n == 0) { + scr_tls_alpn_value_fail("must not contain zero-length protocol", data, len); + return false; + } + if (at + 1 + n > len) { + scr_tls_alpn_value_fail("contains truncated protocol", data, len); + return false; + } + at += 1 + n; + count++; + } + if (count == 0) return true; + char **names = calloc(count + 1, sizeof *names); + if (!names) scr_tls_oom(); + size_t k = 0; + for (size_t at = 0; at < len; at += 1 + data[at]) { + names[k] = malloc((size_t)data[at] + 1); + if (!names[k]) scr_tls_oom(); + memcpy(names[k], data + at + 1, data[at]); + names[k][data[at]] = '\0'; + k++; + } + *out = names; + return true; +} + +/* tls.connect's ALPNProtocols (Node's convertALPNProtocols, then + * setALPNProtocols): an array of non-empty strings of at most 255 bytes, a + * Uint8Array or other ArrayBufferView in the wire format, or a falsy value + * (no ALPN). Any other truthy value is the binding's TypeError. False with + * the exception pending. */ +static bool scr_tls_alpn_dyn(const ScrDyn *v, char ***out) { + *out = NULL; + ScrDyn *own = NULL; + if (v->kind == SCR_DYN_TYPED_REF) { + own = scr_dyn_typed_ref_materialize(v); + if (own == NULL) return false; + v = own; + } + bool ok = true; + if (v->kind == SCR_DYN_ARR) { + /* convertProtocols: Buffer.byteLength of every entry first (strings, + * or the ArrayBuffer and view entries byteLength also measures), then + * each length's checks, then buff.write, which takes strings only. */ + size_t count = v->v.arr.len; + size_t total = 0; + for (size_t i = 0; ok && i < count; i++) { + const ScrDyn *e = v->v.arr.items[i]; + size_t n; + if (e->kind == SCR_DYN_STR) { + n = e->v.str->len; + } else if (e->kind == SCR_DYN_BYTES || scr_buffer_storage_is(e)) { + ScrBytes *view = scr_bytes_buffer_source(e); + if (view == NULL) { + ok = false; + break; + } + n = view->len; + scr_bytes_release(view); + } else { + scr_dyn_arg_type_fail("string", "of type string or an instance of Buffer or ArrayBuffer", e); + ok = false; + break; + } + if (n == 0) { + char name[32]; + snprintf(name, sizeof name, "protocols[%zu]", i); + scr_dyn_arg_value_fail(name, "must be a non-empty string", e); + ok = false; + break; + } + if (n > 255) { + char msg[160]; + int m = snprintf(msg, sizeof msg, + "The byte length of the protocol at index %zu exceeds the maximum length. It must be <= 255. Received %zu", + i, n); + scr_throw_error_msg_code(SCR_ERR_RANGE, msg, (size_t)m, "ERR_OUT_OF_RANGE"); + ok = false; + break; + } + total += 1 + n; + } + uint8_t *wire = ok ? malloc(total + 1) : NULL; + if (ok && !wire) scr_tls_oom(); + size_t at = 0; + for (size_t i = 0; ok && i < count; i++) { + const ScrDyn *e = v->v.arr.items[i]; + if (e->kind != SCR_DYN_STR) { + static const char msg[] = "argument must be a string"; + scr_throw_error_msg_code(SCR_ERR_TYPE, msg, sizeof msg - 1, "ERR_INVALID_ARG_TYPE"); + ok = false; + break; + } + wire[at++] = (uint8_t)e->v.str->len; + memcpy(wire + at, e->v.str->data, e->v.str->len); + at += e->v.str->len; + } + if (ok) ok = scr_tls_alpn_from_wire(wire, at, out); + free(wire); + } else if (v->kind == SCR_DYN_BYTES) { + ScrBytes *view = scr_bytes_buffer_source(v); + if (view == NULL) ok = false; + else { + ok = scr_tls_alpn_from_wire(view->data, view->len, out); + scr_bytes_release(view); + } + } else if (scr_tls_dyn_truthy(v)) { + static const char msg[] = "Must give a Buffer as first argument"; + scr_throw_error_msg(SCR_ERR_TYPE, msg, sizeof msg - 1); + ok = false; + } + scr_dyn_release(own); + return ok; +} + /* tls.connect's documented keys outside the implemented set: present * throws (the server walk's stance). */ static const char *const SCR_TLS_CONNECT_FENCED_OPTIONS[] = { - "ALPNProtocols", "allowHalfOpen", "autoSelectFamily", + "allowHalfOpen", "autoSelectFamily", "autoSelectFamilyAttemptTimeout", "cert", "certificateCompression", "checkServerIdentity", "ciphers", "clientCertEngine", "crl", "dhparam", "ecdhCurve", "enableTrace", "family", "fd", "hints", "highWaterMark", "honorCipherOrder", "keepAlive", "keepAliveInitialDelay", "key", - "localAddress", "localPort", "lookup", "maxVersion", "minDHSize", - "minVersion", "noDelay", "onread", "passphrase", "path", "pfx", + "localAddress", "localPort", "lookup", "minDHSize", "noDelay", "onread", "passphrase", "path", "pfx", "privateKeyEngine", "privateKeyIdentifier", "pskCallback", "readable", "secureContext", "secureOptions", "secureProtocol", "session", "sessionIdContext", "sigalgs", "signal", "socket", "ticketKeys", - "timeout", "writable", NULL, + "writable", NULL, }; ScrNetSocket *scr_tls_connect_dyn(double port, ScrStr *host /*borrowed, nullable*/, @@ -1920,12 +2257,19 @@ ScrNetSocket *scr_tls_connect_dyn(double port, ScrStr *host /*borrowed, nullable ScrBytes *ca = NULL; const ScrStr *servername = NULL; const ScrStr *opt_host = NULL; + char **alpn = NULL; + const ScrDyn *alpn_value = NULL; + const ScrDyn *timeout_value = NULL; + int min_version = 12, max_version = 13; bool ok = true; if (opts != NULL && opts->kind != SCR_DYN_UNDEF && opts->kind != SCR_DYN_NULL) { if (opts->kind != SCR_DYN_OBJ) { scr_dyn_arg_type_fail("options", "of type object", opts); ok = false; } + /* createSecureContext's version checks come before its other options + * (Node's SecureContext constructor). */ + if (ok && !scr_tls_versions_dyn(opts, &min_version, &max_version)) ok = false; for (size_t i = 0; ok && i < opts->v.obj.len; i++) { const ScrDynEntry *e = &opts->v.obj.entries[i]; const ScrDyn *v = e->value; @@ -1974,6 +2318,16 @@ ScrNetSocket *scr_tls_connect_dyn(double port, ScrStr *host /*borrowed, nullable if (ca == NULL) ok = false; continue; } + if (strcmp(e->key, "ALPNProtocols") == 0) { + alpn_value = v; /* converted after the context options, as TLSSocket does */ + continue; + } + if (strcmp(e->key, "minVersion") == 0 || strcmp(e->key, "maxVersion") == 0) continue; + if (strcmp(e->key, "timeout") == 0) { + /* `if (options.timeout) tlssock.setTimeout(options.timeout)` */ + timeout_value = scr_tls_dyn_truthy(v) ? v : NULL; + continue; + } if (strcmp(e->key, "servername") == 0) { if (v->kind == SCR_DYN_STR) servername = v->v.str; else { @@ -1985,7 +2339,7 @@ ScrNetSocket *scr_tls_connect_dyn(double port, ScrStr *host /*borrowed, nullable for (size_t k = 0; SCR_TLS_CONNECT_FENCED_OPTIONS[k] != NULL; k++) { if (strcmp(e->key, SCR_TLS_CONNECT_FENCED_OPTIONS[k]) == 0) { scr_tls_opt_fence("tls.connect", e->key, - "port/host/rejectUnauthorized/ca/servername are the honestly-implemented members of a runtime options record"); + "port/host/rejectUnauthorized/ca/servername/ALPNProtocols/minVersion/maxVersion/timeout are the implemented members of a runtime options record"); ok = false; break; } @@ -1993,6 +2347,26 @@ ScrNetSocket *scr_tls_connect_dyn(double port, ScrStr *host /*borrowed, nullable /* anything else: an undocumented key, dropped like Node drops it */ } } + if (ok && alpn_value != NULL && !scr_tls_alpn_dyn(alpn_value, &alpn)) ok = false; + /* socket.setTimeout(msecs) runs after the TLSSocket exists and before it + * connects: Node's msecs checks, then the inactivity timer below. */ + double timeout_ms = 0; + if (ok && timeout_value != NULL) { + if (timeout_value->kind != SCR_DYN_NUM) { + scr_dyn_arg_type_fail("msecs", "of type number", timeout_value); + ok = false; + } else if (!isfinite(timeout_value->v.num) || timeout_value->v.num < 0) { + char recv[48], msg[160]; + scr_num_received(timeout_value->v.num, recv); + int m = snprintf(msg, sizeof msg, + "The value of \"msecs\" is out of range. It must be a non-negative finite number. Received %s", + recv); + scr_throw_error_msg_code(SCR_ERR_RANGE, msg, (size_t)m, "ERR_OUT_OF_RANGE"); + ok = false; + } else { + timeout_ms = timeout_value->v.num; + } + } if (ok && port < 0) { scr_dyn_arg_type_fail("options.port", "of type number", scr_dyn_undefined()); ok = false; @@ -2000,6 +2374,7 @@ ScrNetSocket *scr_tls_connect_dyn(double port, ScrStr *host /*borrowed, nullable ScrStr *dial_host = (ScrStr *)(host != NULL && host->len > 0 ? host : opt_host); if (ok && !scr_net_host_chk(dial_host)) ok = false; if (!ok) { + scr_tls_alpn_free(alpn); scr_bytes_release(ca); scr_closure_release(cb); return NULL; @@ -2022,7 +2397,13 @@ ScrNetSocket *scr_tls_connect_dyn(double port, ScrStr *host /*borrowed, nullable ca != NULL ? (const char *)ca->data : NULL, ca != NULL ? ca->len : 0, !reject); if (servername != NULL) scr_tls_cli_set_servername(cli, servername); + if (alpn != NULL) { + cli->alpn = alpn; /* moves */ + mbedtls_ssl_conf_alpn_protocols(&cli->conf, (const char **)cli->alpn); + } + cli->no_protocols = !scr_tls_conf_versions(&cli->conf, min_version, max_version); scr_tls_cli_wrap(s, cli); + if (timeout_ms > 0) scr_net_sock_set_timeout(s, timeout_ms); scr_str_release(localhost_fallback); scr_bytes_release(ca); return s; diff --git a/tests/corpus/6721-tls-alpn-protocols.ts b/tests/corpus/6721-tls-alpn-protocols.ts new file mode 100644 index 000000000..f68fb2840 --- /dev/null +++ b/tests/corpus/6721-tls-alpn-protocols.ts @@ -0,0 +1,75 @@ +// tls.connect and tls.createServer with ALPNProtocols: the server answers +// with the first of its own protocols the client offers, both sockets +// report it as alpnProtocol, and a client that offers none of the +// server's fails with ERR_SSL_TLSV1_ALERT_NO_APPLICATION_PROTOCOL. An +// array of strings, a Buffer or a Uint8Array in the wire format, an empty +// list and a falsy value all work as in Node, and invalid values throw +// Node's errors from tls.connect. +import * as tls from "node:tls"; +import { readFileSync } from "node:fs"; + +const dir = "tests/fixtures/server/certs/"; +const ca = readFileSync(dir + "ca.pem"); +const server = tls.createServer( + { + cert: readFileSync(dir + "localhost.pem"), + key: readFileSync(dir + "localhost-key.pem"), + ALPNProtocols: ["h2", "x/1"], + }, + (socket) => { + socket.end(`server:${String(socket.alpnProtocol)}`); + }, +); + +function attempt(port: number, label: string, protocols: unknown): Promise { + return new Promise((resolve) => { + const socket = tls.connect({ host: "localhost", port, ca, ALPNProtocols: protocols as any }, () => { + console.log(label, "client:", JSON.stringify(socket.alpnProtocol)); + }); + let data = ""; + socket.on("data", (chunk: Buffer) => (data += chunk.toString())); + socket.on("end", () => { + console.log(label, data); + resolve(); + }); + socket.on("error", (err) => { + console.log(label, "error:", (err as NodeJS.ErrnoException).code); + resolve(); + }); + }); +} + +function invalid(label: string, protocols: unknown): void { + try { + const socket = tls.connect({ host: "127.0.0.1", port: 1, ALPNProtocols: protocols as any }); + socket.on("error", () => {}); + socket.destroy(); + console.log(label, "accepted"); + } catch (e) { + const err = e as NodeJS.ErrnoException; + console.log(label, err.name, err.code, err.message); + } +} + +server.listen(0, "127.0.0.1", async () => { + const port = (server.address() as { port: number }).port; + await attempt(port, "strings", ["x/1", "h2"]); + await attempt(port, "only-second", ["zz", "x/1"]); + await attempt(port, "buffer", Buffer.from([2, 0x68, 0x32])); + await attempt(port, "uint8array", new Uint8Array([3, 0x78, 0x2f, 0x31])); + await attempt(port, "absent", undefined); + await attempt(port, "empty", []); + await attempt(port, "falsy", 0); + await attempt(port, "no-match", ["zz"]); + server.close(); + + invalid("string", "h2"); + invalid("object", {}); + invalid("buffer-element", [Buffer.from("h2")]); + invalid("number-element", [1]); + invalid("empty-element", ["h2", ""]); + invalid("too-long", ["a".repeat(256)]); + invalid("zero-length", Buffer.from([0])); + invalid("truncated", Buffer.from([5, 0x68])); + invalid("long-zero", Buffer.alloc(60)); +}); diff --git a/tests/corpus/6722-tls-min-max-version.ts b/tests/corpus/6722-tls-min-max-version.ts new file mode 100644 index 000000000..07d01867d --- /dev/null +++ b/tests/corpus/6722-tls-min-max-version.ts @@ -0,0 +1,85 @@ +// tls.connect and tls.createServer with minVersion and maxVersion: the +// handshake picks the highest version both ranges allow and getProtocol() +// reports it. A range the server does not share fails with +// ERR_SSL_TLSV1_ALERT_PROTOCOL_VERSION, a client range with neither TLSv1.2 +// nor TLSv1.3 fails with ERR_SSL_NO_PROTOCOLS_AVAILABLE once the handshake +// starts, and an invalid version or a secureProtocol conflict throws Node's +// TypeError from tls.connect. +import * as tls from "node:tls"; +import { readFileSync } from "node:fs"; + +const dir = "tests/fixtures/server/certs/"; +const ca = readFileSync(dir + "ca.pem"); +const cert = readFileSync(dir + "localhost.pem"); +const key = readFileSync(dir + "localhost-key.pem"); + +const upTo12 = tls.createServer({ cert, key, maxVersion: "TLSv1.2" }, (s) => s.end(`server:${s.getProtocol()}`)); +const from13 = tls.createServer({ cert, key, minVersion: "TLSv1.3" }, (s) => s.end(`server:${s.getProtocol()}`)); +const any = tls.createServer({ cert, key }, (s) => s.end(`server:${s.getProtocol()}`)); + +function listen(server: tls.Server): Promise { + return new Promise((resolve) => + server.listen(0, "127.0.0.1", () => resolve((server.address() as { port: number }).port)), + ); +} + +interface Versions { + minVersion?: unknown; + maxVersion?: unknown; + secureProtocol?: string; +} + +function attempt(label: string, port: number, versions: Versions): Promise { + return new Promise((resolve) => { + let socket: tls.TLSSocket; + try { + const options = { + host: "localhost", + port, + ca, + minVersion: versions.minVersion as any, + maxVersion: versions.maxVersion as any, + secureProtocol: versions.secureProtocol, + }; + socket = tls.connect(options, () => console.log(label, "client:", socket.getProtocol())); + } catch (e) { + const err = e as NodeJS.ErrnoException; + console.log(label, err.name, err.code, err.message); + resolve(); + return; + } + let data = ""; + socket.on("data", (chunk: Buffer) => (data += chunk.toString())); + socket.on("end", () => { + console.log(label, data); + resolve(); + }); + socket.on("error", (err) => { + console.log(label, "error:", (err as NodeJS.ErrnoException).code); + resolve(); + }); + }); +} + +async function main(): Promise { + const p12 = await listen(upTo12); + const p13 = await listen(from13); + const pAny = await listen(any); + await attempt("defaults", pAny, {}); + await attempt("max-1.2", pAny, { maxVersion: "TLSv1.2" }); + await attempt("min-1.3", pAny, { minVersion: "TLSv1.3" }); + await attempt("min-1-against-1.2", p12, { minVersion: "TLSv1" }); + await attempt("min-1.3-against-1.2", p12, { minVersion: "TLSv1.3" }); + await attempt("max-1.2-against-1.3", p13, { maxVersion: "TLSv1.2" }); + await attempt("max-1.1", pAny, { maxVersion: "TLSv1.1" }); + await attempt("min-above-max", pAny, { minVersion: "TLSv1.3", maxVersion: "TLSv1.2" }); + await attempt("null-min", pAny, { minVersion: null }); + await attempt("invalid-min", pAny, { minVersion: "TLSv9" }); + await attempt("invalid-max", pAny, { maxVersion: 3 }); + await attempt("conflict", pAny, { minVersion: "TLSv1.2", secureProtocol: "TLSv1_2_method" }); + upTo12.close(); + from13.close(); + any.close(); +} + +void main(); diff --git a/tests/corpus/6723-tls-connect-timeout.ts b/tests/corpus/6723-tls-connect-timeout.ts new file mode 100644 index 000000000..68f40ec37 --- /dev/null +++ b/tests/corpus/6723-tls-connect-timeout.ts @@ -0,0 +1,51 @@ +// tls.connect's timeout option arms the socket's inactivity timeout +// before it connects, so a handshake the peer never answers emits +// 'timeout'. Node applies it only when truthy, so 0 and NaN arm nothing, +// and setTimeout's msecs checks throw from tls.connect for a value that is +// not a number, negative, or not finite. +import * as net from "node:net"; +import * as tls from "node:tls"; + +// The server reads (and ignores) what arrives, so each connection closes +// when its client is destroyed. +const silent = net.createServer((socket) => { + socket.resume(); +}); + +function attempt(port: number, label: string, timeout: unknown): Promise { + return new Promise((resolve) => { + let socket: tls.TLSSocket; + try { + socket = tls.connect({ host: "127.0.0.1", port, timeout: timeout as any }); + } catch (e) { + const err = e as NodeJS.ErrnoException; + console.log(label, err.name, err.code, err.message); + resolve(); + return; + } + const fallback = setTimeout(() => { + console.log(label, "no timeout event"); + socket.destroy(); + resolve(); + }, 300); + socket.on("timeout", () => { + console.log(label, "timeout"); + clearTimeout(fallback); + socket.destroy(); + resolve(); + }); + socket.on("error", (err) => console.log(label, "error", (err as NodeJS.ErrnoException).code)); + }); +} + +silent.listen(0, "127.0.0.1", async () => { + const port = (silent.address() as net.AddressInfo).port; + await attempt(port, "50ms", 50); + await attempt(port, "fractional", 30.7); + await attempt(port, "zero", 0); + await attempt(port, "nan", NaN); + await attempt(port, "negative", -1); + await attempt(port, "infinite", Infinity); + await attempt(port, "string", "x"); + silent.close(); +}); diff --git a/tests/harness/corpus-costs/6721-tls-alpn-protocols.ts.json b/tests/harness/corpus-costs/6721-tls-alpn-protocols.ts.json new file mode 100644 index 000000000..ab6ff1c99 --- /dev/null +++ b/tests/harness/corpus-costs/6721-tls-alpn-protocols.ts.json @@ -0,0 +1 @@ +{ "plain": 4300, "san": 60600 } diff --git a/tests/harness/corpus-costs/6722-tls-min-max-version.ts.json b/tests/harness/corpus-costs/6722-tls-min-max-version.ts.json new file mode 100644 index 000000000..c1b1d2d17 --- /dev/null +++ b/tests/harness/corpus-costs/6722-tls-min-max-version.ts.json @@ -0,0 +1 @@ +{ "plain": 3000, "san": 4700 } diff --git a/tests/harness/corpus-costs/6723-tls-connect-timeout.ts.json b/tests/harness/corpus-costs/6723-tls-connect-timeout.ts.json new file mode 100644 index 000000000..9ebfb8b9d --- /dev/null +++ b/tests/harness/corpus-costs/6723-tls-connect-timeout.ts.json @@ -0,0 +1 @@ +{ "plain": 6200, "san": 60300 } From 237a5111745865115764083495978ae58b50e827 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 09:05:05 -0500 Subject: [PATCH 04/67] Resolve conditional member types over literal class type arguments A generic class instance bound its type parameters only to their mapped IR types, so a literal argument widened (K = "required" became string) and a member typed by a conditional over it, such as `get(): Value` with `type Value = K extends "required" ? T : T | undefined`, refused with SC2001. Class instantiation now also keeps the type arguments as checker types for the members it collects and lowers, as generic functions do. A literal argument for a type parameter that a conditional type in the class depends on is part of the instance key, so Field and Field are separate instances. The conditional evaluation decides `X extends Y` by assignability when both sides are primitive or literal types. Fixes #1240 Co-authored-by: blurname <50226652+blurname@users.noreply.github.com> --- .../src/frontend/lowering/lower-classes.ts | 70 ++++++++++++++++++- .../compiler/src/frontend/lowering/lowerer.ts | 6 +- packages/compiler/src/frontend/type-mapper.ts | 28 +++++++- ...-generic-class-literal-conditional.ts.json | 6 ++ .../6908-generic-class-literal-conditional.ts | 50 +++++++++++++ 5 files changed, 155 insertions(+), 5 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6908-generic-class-literal-conditional.ts.json create mode 100644 tests/corpus/6908-generic-class-literal-conditional.ts diff --git a/packages/compiler/src/frontend/lowering/lower-classes.ts b/packages/compiler/src/frontend/lowering/lower-classes.ts index 371541df8..ae03a748c 100644 --- a/packages/compiler/src/frontend/lowering/lower-classes.ts +++ b/packages/compiler/src/frontend/lowering/lower-classes.ts @@ -688,6 +688,9 @@ export interface ClassInfo { path: InstantiationPath; family: ClassInfo; bindings: Map; + /** The type arguments as checker types, for the resolutions that need + * literal identity (a conditional type over a literal argument). */ + tsBindings: Map; typeArgsText: string; ordinal: number; }; @@ -767,6 +770,9 @@ export interface GenericClassInfo { typeParams: ts.Symbol[]; family: ClassInfo; instances: Map; + /** The type parameters a conditional type in the class depends on + * (literalSensitiveTypeParams), computed on first instantiation. */ + literalSensitive?: Set; } /** The KEY symbol behind a LATE-BOUND (`__@name@id`) property: resolved @@ -1766,6 +1772,7 @@ export function collectClassShapeInner( family: ClassInfo; name: string; bindings: Map; + tsBindings: Map; typeArgsText: string; ordinal: number; }, @@ -4442,6 +4449,7 @@ export function collectClassShapeInner( path: inst.path, family: inst.family, bindings: inst.bindings, + tsBindings: inst.tsBindings, typeArgsText: inst.typeArgsText, ordinal: inst.ordinal, }; @@ -4582,8 +4590,10 @@ export function genericClassInstanceType( .getTypeArguments(ref as ts.TypeReference) .slice(0, gci.typeParams.length); const mapped: IrType[] = []; + const tsArgs: ts.Type[] = []; if (args.length === gci.typeParams.length) { for (const a of args) { + tsArgs.push(lowerer.typeParamTsResolver(a) ?? a); const m = lowerer.mapTypeOf(a, mapArgument); if (!m || m.kind === "void") { // An UNBOUND type parameter argument (`Box` outside any @@ -4602,9 +4612,26 @@ export function genericClassInstanceType( const b = lowerer.typeParamBindings?.get(tp); if (!b) return null; mapped.push(b); + const bound = lowerer.typeParamTsBindings?.get(tp); + if (bound) tsArgs.push(bound); } } - const key = mapped.map(typeKey).join(","); + // A literal argument for a type parameter that a conditional type + // depends on (`K extends "required" ? T : T | undefined`) selects the + // members' types, so it keys its own instance; mapType alone widens it. + gci.literalSensitive ??= literalSensitiveTypeParams(lowerer, gci); + const literalKey = (i: number): string | null => { + if (!gci.literalSensitive!.has(gci.typeParams[i]!)) return null; + const arg = tsArgs[i]; + if (arg?.isStringLiteralType()) return JSON.stringify(arg.value); + if (arg?.isNumberLiteralType()) return String(arg.value); + if (arg && arg.flags & ts.TypeFlags.BooleanLiteral) return lowerer.checker.typeToString(arg); + return null; + }; + const literals = gci.typeParams.map((_, i) => literalKey(i)); + const key = + mapped.map(typeKey).join(",") + + (literals.some((l) => l !== null) ? `@${literals.map((l) => l ?? "*").join(",")}` : ""); const existing = gci.instances.get(key); if (existing) { if (existing.info) lowerer.noteGenericClassInstanceDemand(existing.info); @@ -4626,13 +4653,18 @@ export function genericClassInstanceType( gci.instances.set(key, entry); const bindings = new Map(); gci.typeParams.forEach((tp, i) => bindings.set(tp, mapped[i]!)); - const rendered = mapped.map((m) => lowerer.fmt(m)).join(", "); + const tsBindings = new Map(); + if (tsArgs.length === gci.typeParams.length) + gci.typeParams.forEach((tp, i) => tsBindings.set(tp, tsArgs[i]!)); + const rendered = mapped.map((m, i) => literals[i] ?? lowerer.fmt(m)).join(", "); const typeArgsText = `<${rendered.length > 80 ? rendered.slice(0, 77) + "..." : rendered}>`; const prevBindings = lowerer.typeParamBindings; + const prevTsBindings = lowerer.typeParamTsBindings; const prevContext = lowerer.instantiationContext; const previousPath = lowerer.genericInstantiationPath; lowerer.genericInstantiationPath = path; lowerer.typeParamBindings = bindings; + lowerer.typeParamTsBindings = tsBindings; lowerer.instantiationContext = `instantiating class '${gci.baseName}' with ${typeArgsText}`; try { lowerer.collectClassShapeInner(decl, undefined, { @@ -4640,6 +4672,7 @@ export function genericClassInstanceType( family: gci.family, name, bindings, + tsBindings, typeArgsText, ordinal, }); @@ -4651,6 +4684,7 @@ export function genericClassInstanceType( return null; } finally { lowerer.typeParamBindings = prevBindings; + lowerer.typeParamTsBindings = prevTsBindings; lowerer.instantiationContext = prevContext; lowerer.genericInstantiationPath = previousPath; } @@ -4666,6 +4700,35 @@ export function genericClassInstanceType( return { kind: "object", className: name }; } +/** The class's type parameters that a conditional type inside it depends + * on: the parameters named within a type node that is a conditional type + * or refers to one (`get(): Value` with `type Value = K + * extends "required" ? T : T | undefined`). Their literal arguments pick + * the conditional's branch. */ +function literalSensitiveTypeParams(lowerer: Lowerer, gci: GenericClassInfo): Set { + const params = new Set(gci.typeParams); + const found = new Set(); + const collect = (node: ts.Node): void => { + if (ts.isTypeReferenceNode(node) && ts.isIdentifier(node.typeName)) { + const symbol = lowerer.checker.getSymbolAtLocation(node.typeName); + if (symbol && params.has(symbol)) found.add(symbol); + } + ts.forEachChild(node, collect); + }; + const visit = (node: ts.Node): void => { + if ( + ts.isConditionalTypeNode(node) || + (ts.isTypeReferenceNode(node) && + lowerer.checker.getTypeFromTypeNode(node).isConditionalType()) + ) { + collect(node); + } + ts.forEachChild(node, visit); + }; + for (const member of gci.decl.members.nodes) visit(member); + return found; +} + /** Runs a member-lowering thunk under an INSTANTIATION's type-parameter * bindings (the generic-fn typeParamResolver mechanism) — the checker * keeps reporting the unsubstituted `T`s inside the shared body AST. @@ -4699,17 +4762,20 @@ function withInstanceBindings(lowerer: Lowerer, info: ClassInfo, fn: () => T) } } const prevBindings = lowerer.typeParamBindings; + const prevTsBindings = lowerer.typeParamTsBindings; const prevContext = lowerer.instantiationContext; const prevSuppress = lowerer.suppressStats; const previousPath = lowerer.genericInstantiationPath; lowerer.genericInstantiationPath = gi.path; lowerer.typeParamBindings = gi.bindings; + lowerer.typeParamTsBindings = gi.tsBindings; lowerer.instantiationContext = `instantiating class '${gi.family.generic?.baseName ?? info.def.jsName ?? ""}' with ${gi.typeArgsText}`; lowerer.suppressStats = prevSuppress || gi.ordinal > 0; try { return fn(); } finally { lowerer.typeParamBindings = prevBindings; + lowerer.typeParamTsBindings = prevTsBindings; lowerer.instantiationContext = prevContext; lowerer.suppressStats = prevSuppress; lowerer.genericInstantiationPath = previousPath; diff --git a/packages/compiler/src/frontend/lowering/lowerer.ts b/packages/compiler/src/frontend/lowering/lowerer.ts index 543149f83..d3ea6aa2d 100644 --- a/packages/compiler/src/frontend/lowering/lowerer.ts +++ b/packages/compiler/src/frontend/lowering/lowerer.ts @@ -8644,8 +8644,9 @@ export class Lowerer { /** The ts-level twin of typeParamResolver: the bound CHECKER type of a * type parameter in the current instantiation (typeParamTsBindings), for * the resolutions where mapType's widening already dropped what the body - * needs (indexed accesses over literal-bound keys). Inert outside - * call-keyed generic instantiation. */ + * needs (indexed accesses over literal-bound keys, conditional types + * over literal arguments). Inert outside generic function and class + * instantiation. */ readonly typeParamTsResolver = (t: ts.Type): ts.Type | null => { if (!this.typeParamTsBindings || !(t.flags & ts.TypeFlags.TypeParameter)) return null; const sym: ts.Symbol | undefined = t.getSymbol(); @@ -10838,6 +10839,7 @@ export class Lowerer { family: ClassInfo; name: string; bindings: Map; + tsBindings: Map; typeArgsText: string; ordinal: number; }, diff --git a/packages/compiler/src/frontend/type-mapper.ts b/packages/compiler/src/frontend/type-mapper.ts index ca838cea2..3448545f8 100644 --- a/packages/compiler/src/frontend/type-mapper.ts +++ b/packages/compiler/src/frontend/type-mapper.ts @@ -5836,7 +5836,9 @@ function evalMappedTemplate( if (!checkType || !extendsType) return null; const checked = evalMappedTemplate(checkType, keys, scope, ctx); if (!checked) return null; - const inferred = matchInferReference(checked, extendsType, ctx); + const inferred = + primitiveExtendsCheck(checked, extendsType, ctx) ?? + matchInferReference(checked, extendsType, ctx); if (inferred === undefined) return null; const branch = inferred ? type.getTrueType() : type.getFalseType(); const branchScope = inferred ? new Map([...scope, ...inferred]) : scope; @@ -5845,6 +5847,30 @@ function evalMappedTemplate( return mentionsMappedParams(type, keys, aliases) ? null : type; } +/** `checked extends X` where X is a primitive or literal type, or a union of + * them (`K extends "required" ? ...`), and `checked` is one such type: + * X has no infer positions, so assignability decides the branch (an empty + * binding map for the true branch). A union `checked` distributes and stays + * undecided here (undefined), as do other shapes. */ +function primitiveExtendsCheck( + checked: ts.Type, + extendsType: ts.Type, + ctx: TypeMapperCtx, +): Map | false | undefined { + const primitive = + ts.TypeFlags.StringLike | + ts.TypeFlags.NumberLike | + ts.TypeFlags.BooleanLike | + ts.TypeFlags.BigIntLike | + ts.TypeFlags.Null | + ts.TypeFlags.Undefined; + const isPrimitive = (t: ts.Type): boolean => + !t.isUnionType() && (t.flags & primitive) !== 0 && (t.flags & ts.TypeFlags.TypeParameter) === 0; + const extendsParts = extendsType.isUnionType() ? ts.constituentTypes(extendsType) : [extendsType]; + if (!isPrimitive(checked) || !extendsParts.every(isPrimitive)) return undefined; + return ctx.checker.isTypeAssignableTo(checked, extendsType) ? new Map() : false; +} + /** `checked extends G<..., infer T, ...>`: the infer bindings when * `checked` is a reference to the same generic `G` (its arguments bind the * infer positions; other positions must be the same types), false when it diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6908-generic-class-literal-conditional.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6908-generic-class-literal-conditional.ts.json new file mode 100644 index 000000000..d0403f33f --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6908-generic-class-literal-conditional.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6908-generic-class-literal-conditional.ts" + ], + "diags": [] +} diff --git a/tests/corpus/6908-generic-class-literal-conditional.ts b/tests/corpus/6908-generic-class-literal-conditional.ts new file mode 100644 index 000000000..d06669be3 --- /dev/null +++ b/tests/corpus/6908-generic-class-literal-conditional.ts @@ -0,0 +1,50 @@ +// A generic class whose member types are conditional types over a literal +// type parameter: each literal argument selects the conditional's branch, +// so Field.get() returns T and Field.get() +// returns T | undefined. +type Kind = "required" | "optional"; +type Value = K extends "required" ? T : T | undefined; + +class Field { + value: T; + kind: K; + present: boolean; + constructor(value: T, kind: K, present = true) { + this.value = value; + this.kind = kind; + this.present = present; + } + get(): Value { + return (this.present ? this.value : undefined) as Value; + } + describe(): string { + return `${this.kind}:${String(this.get())}`; + } +} + +console.log(new Field("hello", "required").get()); +const name = new Field("ada", "required"); +const nick = new Field("ad", "optional", false); +const age = new Field(36, "optional"); +console.log(name.get().toUpperCase(), nick.get() ?? "(none)", (age.get() ?? 0) + 1); +console.log(name.describe(), nick.describe(), age.describe()); + +function read(field: Field): string { + return field.get(); +} +function readOptional(field: Field): string { + return field.get() ?? "missing"; +} +console.log(read(name), readOptional(nick), readOptional(new Field("x", "optional"))); + +type Flag = B extends true ? "on" : "off"; +class Switch { + readonly state: B; + constructor(state: B) { + this.state = state; + } + label(): Flag { + return (this.state ? "on" : "off") as Flag; + } +} +console.log(new Switch(true).label(), new Switch(false).label()); From 96c82719b6ae406c1fdf2420d72e4872e2da6891 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 10:07:56 -0500 Subject: [PATCH 05/67] Deliver queued worker messages before immediates, as Node does A thread's event loop delivered one message from its workers or its parent per loop turn, so timers and setImmediate callbacks ran between messages that were already queued. Node's MessagePort delivers, in one callback, the messages queued when it starts and those that arrive meanwhile until it has taken 1000, with a microtask checkpoint after each, before the loop goes on to the check phase. - scr_worker_dispatch starts a batch when it delivers a message: the messages queued then, and at least 1000 in all. - scr_workers_more continues the loop pass while the next event in the thread's mailbox is a message and the batch has room; other events (online, exit, error, stdio) keep their order and their turns. - scr_mailbox_head_kind and scr_mailbox_count_kind read the mailbox's first event kind and the number of queued events of a kind. - Corpus 6211 checks the order of messages, nextTick, microtasks and setImmediate for worker-to-parent and parent-to-worker messages against Node. --- .../limitations/native-worker-threads.mdx | 1 + .../6211-worker-message-batches.ts.json | 6 ++ packages/runtime/src/scr_mailbox.c | 15 ++++ packages/runtime/src/scr_mailbox.h | 4 + packages/runtime/src/scr_worker_events.c | 30 ++++++- tests/corpus/6211-worker-message-batches.ts | 87 +++++++++++++++++++ .../6211-worker-message-batches.ts.json | 1 + 7 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6211-worker-message-batches.ts.json create mode 100644 tests/corpus/6211-worker-message-batches.ts create mode 100644 tests/harness/corpus-costs/6211-worker-message-batches.ts.json diff --git a/docs/content/limitations/native-worker-threads.mdx b/docs/content/limitations/native-worker-threads.mdx index e45d12ad3..5bd259114 100644 --- a/docs/content/limitations/native-worker-threads.mdx +++ b/docs/content/limitations/native-worker-threads.mdx @@ -18,6 +18,7 @@ An unhandled rejection whose reason is not error-like arrives as an `UnhandledPr A thrown value that does not clone, such as a function, arrives as an `ERR_WORKER_UNSERIALIZABLE_ERROR` Error, where Node sends its `util.inspect` string. `new MessageChannel()` from `node:worker_threads` makes two entangled MessagePorts, in one thread or across threads once a port is transferred, with `receiveMessageOnPort`. Port messages arrive in Node's order: each port's queued messages as one batch before `setImmediate` callbacks, a port's own `'close'` after the poll phase, and the other port's `'close'` after its queued messages while the loop keeps running. +A worker's messages to its parent, and the parent's messages in the worker, also arrive as one batch before `setImmediate` callbacks, each followed by its microtasks, as in Node: the messages queued when delivery starts, and those that arrive meanwhile until the batch holds 1000. `receiveMessageOnPort(parentPort)` in a worker takes the parent's next message. A port's `onmessage` property and `addEventListener` are unsupported. `BroadcastChannel` delivers each message to every other open channel with the same name, in any thread, as a `'message'` `MessageEvent` through `onmessage` and `addEventListener`; an open channel keeps the process alive until `close()` or `unref()`. diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6211-worker-message-batches.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6211-worker-message-batches.ts.json new file mode 100644 index 000000000..a9cc11603 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6211-worker-message-batches.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6211-worker-message-batches.ts" + ], + "diags": [] +} diff --git a/packages/runtime/src/scr_mailbox.c b/packages/runtime/src/scr_mailbox.c index 361a43791..39e7801ed 100644 --- a/packages/runtime/src/scr_mailbox.c +++ b/packages/runtime/src/scr_mailbox.c @@ -226,6 +226,21 @@ bool scr_mailbox_pending(ScrMailbox *mailbox) { return pending; } +unsigned scr_mailbox_head_kind(ScrMailbox *mailbox) { + scr_mailbox_lock(mailbox); + unsigned kind = mailbox->head ? mailbox->head->kind : 0; + scr_mailbox_unlock(mailbox); + return kind; +} + +size_t scr_mailbox_count_kind(ScrMailbox *mailbox, unsigned kind) { + scr_mailbox_lock(mailbox); + size_t count = 0; + for (ScrMailEvent *event = mailbox->head; event; event = event->next) count += event->kind == kind; + scr_mailbox_unlock(mailbox); + return count; +} + /* A taker that finds the mailbox empty spins this long before it blocks. * Replies between threads usually arrive within a few microseconds, and a * blocked taker pays a sleep and a wakeup for each one. */ diff --git a/packages/runtime/src/scr_mailbox.h b/packages/runtime/src/scr_mailbox.h index 678d17723..ac8493057 100644 --- a/packages/runtime/src/scr_mailbox.h +++ b/packages/runtime/src/scr_mailbox.h @@ -26,6 +26,10 @@ ScrMailEvent *scr_mailbox_take_kind(ScrMailbox *mailbox, unsigned kind, uint64_t void scr_mail_event_free(ScrMailEvent *event); void scr_mailbox_close(ScrMailbox *mailbox); bool scr_mailbox_pending(ScrMailbox *mailbox); +/* The kind of the first queued event, or 0 when none is queued. */ +unsigned scr_mailbox_head_kind(ScrMailbox *mailbox); +/* The number of queued events of this kind. */ +size_t scr_mailbox_count_kind(ScrMailbox *mailbox, unsigned kind); void scr_mailbox_wait(ScrMailbox *mailbox, double milliseconds); int scr_mailbox_pollfd(const ScrMailbox *mailbox); diff --git a/packages/runtime/src/scr_worker_events.c b/packages/runtime/src/scr_worker_events.c index b4efa3e0d..f7778f3fa 100644 --- a/packages/runtime/src/scr_worker_events.c +++ b/packages/runtime/src/scr_worker_events.c @@ -57,6 +57,15 @@ static SCR_TL uint64_t scr_channel_poll_gen; /* the loop pass continues a phase (scr_channel_more answered true) */ static SCR_TL bool scr_channel_continuing; static SCR_TL bool scr_channel_closing_phase; +/* Messages from the thread's workers and its parent are delivered in + * batches, as Node's MessagePort delivers them: one callback takes the + * messages queued when it starts, and those that arrive meanwhile until it + * has taken SCR_WORKER_BATCH_MIN, with a microtask checkpoint after each, + * before the loop goes on to timers and immediates. A delivered message + * starts a batch; the loop pass continues it (scr_workers_more) while the + * next event is a message and the batch has room. */ +#define SCR_WORKER_BATCH_MIN 1000 +static SCR_TL size_t scr_worker_batch_left; static const char *const scr_worker_method_names[] = { "ref", "unref", "hasRef", "terminate", "postMessage", "on", "once", "addListener", "prependListener", "prependOnceListener", "off", "removeListener", "removeAllListeners", @@ -700,6 +709,14 @@ static bool scr_channel_more(void) { return more; } +static bool scr_workers_more(void) { + if (scr_channel_more()) return true; + if (scr_worker_batch_left == 0) return false; + if (scr_worker_events && scr_mailbox_head_kind(scr_worker_events) == SCR_WORKER_MESSAGE) return true; + scr_worker_batch_left = 0; + return false; +} + static void scr_worker_dispatch(void) { if (scr_channel_dispatch()) return; ScrWorkerView *port = scr_worker_port; @@ -718,7 +735,16 @@ static void scr_worker_dispatch(void) { port->queued_head = event->next; if (!port->queued_head) port->queued_tail = NULL; event->next = NULL; - } else event = scr_mailbox_take(scr_worker_events); + } else { + event = scr_mailbox_take(scr_worker_events); + if (event && event->kind == SCR_WORKER_MESSAGE) { + if (scr_worker_batch_left == 0) { + size_t queued = 1 + scr_mailbox_count_kind(scr_worker_events, SCR_WORKER_MESSAGE); + scr_worker_batch_left = queued > SCR_WORKER_BATCH_MIN ? queued : SCR_WORKER_BATCH_MIN; + } + scr_worker_batch_left--; + } + } if (!event) return; if (event->kind == SCR_WORKER_WAKE) { scr_mail_event_free(event); return; } if (event->kind == SCR_WORKER_STDIN) { @@ -869,7 +895,7 @@ static bool scr_worker_events_install(void) { if (scr_context_atexit(scr_worker_events_cleanup) != 0) scr_trap("scriptc: out of memory\n"); scr_loop_set_workers(scr_workers_pending, scr_worker_events_ready, scr_worker_dispatch, scr_worker_events_pollfd, scr_worker_events_wait); - scr_loop_set_workers_more(scr_channel_more); + scr_loop_set_workers_more(scr_workers_more); return true; } diff --git a/tests/corpus/6211-worker-message-batches.ts b/tests/corpus/6211-worker-message-batches.ts new file mode 100644 index 000000000..75583c027 --- /dev/null +++ b/tests/corpus/6211-worker-message-batches.ts @@ -0,0 +1,87 @@ +import { Worker, isMainThread, parentPort, workerData } from "node:worker_threads"; + +// Messages queued for a thread while one of its 'message' listeners runs +// are delivered before the loop goes on to immediates, in both directions: +// worker to parent, and parent to worker. Microtasks a listener queues run +// before the next message. The first listener waits on a shared flag until +// the other thread has posted the rest, so they are queued before it +// returns. +type Setup = { role: "sender" | "receiver"; flag: Int32Array }; + +function waitFor(flag: Int32Array, index: number): void { + while (Atomics.load(flag, index) === 0) Atomics.wait(flag, index, 0, 50); +} + +function signal(flag: Int32Array, index: number): void { + Atomics.store(flag, index, 1); + Atomics.notify(flag, index); +} + +/** Records the order of the batch the first message's listener waits for. */ +function receive(on: (listener: (m: unknown) => void) => void, flag: Int32Array, done: (log: string[]) => void): void { + const log: string[] = []; + let count = 0; + on((m) => { + count++; + log.push(`message ${String(m)}`); + if (count === 1) { + signal(flag, 0); + waitFor(flag, 1); + process.nextTick(() => log.push("tick")); + queueMicrotask(() => log.push("microtask")); + setImmediate(() => { + log.push("immediate"); + done(log); + }); + } + if (count === 4) queueMicrotask(() => log.push(`microtask after ${String(m)}`)); + }); +} + +function send(post: (m: string) => void, flag: Int32Array, prefix: string): void { + post(`${prefix}1`); + waitFor(flag, 0); + for (let i = 2; i <= 6; i++) post(`${prefix}${i}`); + signal(flag, 1); +} + +if (isMainThread) { + // Worker to parent: the worker sends, this thread receives. + const first = new Int32Array(new SharedArrayBuffer(8)); + const sender = new Worker(new URL(import.meta.url), { workerData: { role: "sender", flag: first } satisfies Setup }); + receive( + (listener) => sender.on("message", listener), + first, + (log) => { + console.log("worker to parent"); + for (const line of log) console.log(line); + }, + ); + sender.on("exit", () => { + // Parent to worker: this thread sends, the worker receives and reports its log. + const second = new Int32Array(new SharedArrayBuffer(8)); + const receiver = new Worker(new URL(import.meta.url), { + workerData: { role: "receiver", flag: second } satisfies Setup, + }); + receiver.on("message", (log: unknown) => { + if (!Array.isArray(log)) return; + console.log("parent to worker"); + for (const line of log) console.log(String(line)); + }); + receiver.on("online", () => send((m) => receiver.postMessage(m), second, "p")); + receiver.on("exit", (code: number) => console.log("exit", code)); + }); +} else { + const setup = workerData as Setup; + const port = parentPort!; + if (setup.role === "sender") send((m) => port.postMessage(m), setup.flag, "w"); + else + receive( + (listener) => port.on("message", listener), + setup.flag, + (log) => { + port.postMessage(log); + port.close(); + }, + ); +} diff --git a/tests/harness/corpus-costs/6211-worker-message-batches.ts.json b/tests/harness/corpus-costs/6211-worker-message-batches.ts.json new file mode 100644 index 000000000..75b17b215 --- /dev/null +++ b/tests/harness/corpus-costs/6211-worker-message-batches.ts.json @@ -0,0 +1 @@ +{ "plain": 2507, "san": 20224 } From 9a73f63b0655b8180c23a86bdbb970b1af69314b Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 12:17:22 -0500 Subject: [PATCH 06/67] Pass undefined as the zlib callback result on errors Node calls a zlib callback with (err, undefined) when the operation fails. The callback adapter passed a NULL Buffer in the result's static Buffer slot instead: member reads crashed and typeof printed "object". This applied to deflate, inflate, deflateRaw, inflateRaw, gzip, gunzip and unzip, with and without options, for callback literals and for function values. A function shaped (err, out), with err typed Error | null and out a Buffer that the body reads, now tests out on entry (bytes.isAbsent). With a Buffer, the body runs as before. With the NULL Buffer, a second copy of the body runs with out read as any holding undefined, so typeof, comparisons, templates, optional chains and console.log give Node's answers and member reads throw Node's TypeError. Passed on into a Buffer slot, out stays the NULL Buffer, which a callee with the same entry test reads as undefined. The parameter keeps its static type, so callers and adapters are unchanged. A copy that has no such lowering throws SC2020 when it runs. Conditions on the error parameter fold in the error-path copy, and in the success copy for a literal that only the adapter calls. Inside an error-path copy, a nested callback lowers once with its result read as any, so nested callbacks grow linearly in code size. --- .../compiler/src/backend/llvm/lib-dispatch.ts | 8 + .../frontend/lowering/builtins/arguments.ts | 45 ++- .../src/frontend/lowering/lower-functions.ts | 377 ++++++++++++++---- .../compiler/src/frontend/lowering/lowerer.ts | 42 ++ .../src/frontend/lowering/static-typeof.ts | 42 +- .../compiler/src/ir/builtin-signatures.ts | 8 + .../6920-zlib-callback-error-result.ts.json | 6 + .../corpus/6920-zlib-callback-error-result.ts | 195 +++++++++ .../6920-zlib-callback-error-result.ts.json | 1 + 9 files changed, 634 insertions(+), 90 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6920-zlib-callback-error-result.ts.json create mode 100644 tests/corpus/6920-zlib-callback-error-result.ts create mode 100644 tests/harness/corpus-costs/6920-zlib-callback-error-result.ts.json diff --git a/packages/compiler/src/backend/llvm/lib-dispatch.ts b/packages/compiler/src/backend/llvm/lib-dispatch.ts index 924027ee2..526d4b7e0 100644 --- a/packages/compiler/src/backend/llvm/lib-dispatch.ts +++ b/packages/compiler/src/backend/llvm/lib-dispatch.ts @@ -758,6 +758,14 @@ export function emitLibCall(host: LlvmEmitterContext, e: LibCallExpr): LlValue { const inline = emitInlineAtomicsOp(host, e); if (inline) return inline; } + if (e.fn === "bytes.isAbsent") { + // A borrowed read: retaining an absent Buffer would dereference NULL. + const value = host.emitReadReceiver(e.args[0]!); + const t = host.B.tmp(); + host.B.line(`${t} = icmp eq ptr ${value.name}, null`); + return { name: t, type: e.type }; + } + if (e.fn === "bytes.absent") return host.own({ name: "null", type: e.type }); const prefix = e.fn.slice(0, e.fn.indexOf(".")) as LibCallPrefix; // events.once builds typed listener adapters beside the emitter calls. if (e.fn === "events.once" || e.fn === "events.onceSignal") diff --git a/packages/compiler/src/frontend/lowering/builtins/arguments.ts b/packages/compiler/src/frontend/lowering/builtins/arguments.ts index 5e21f6cb3..d3bf46774 100644 --- a/packages/compiler/src/frontend/lowering/builtins/arguments.ts +++ b/packages/compiler/src/frontend/lowering/builtins/arguments.ts @@ -238,6 +238,25 @@ export function errorFirstBytesCallback( ); } +/** Whether `type` is an error-first callback's error parameter type: + * Error | null, optionally with undefined, or dyn. */ +export function isErrorFirstErrorType(lowerer: Lowerer, type: IrType): boolean { + if (type.kind === "dyn") return true; + if (type.kind !== "union") return false; + const def = lowerer.unions.get(type.unionId); + return ( + !!def && + def.arms.some((arm) => arm.kind === "nullT") && + def.arms.some((arm) => arm.kind === "object" && arm.className === "%Error") && + def.arms.every( + (arm) => + arm.kind === "nullT" || + arm.kind === "undefinedT" || + (arm.kind === "object" && arm.className === "%Error"), + ) + ); +} + /** An error-first callback (error, value) whose error parameter is * Error | null or dyn and whose value parameter is dyn or accepted by * `acceptValue`; `values` names the accepted values in the refusal. */ @@ -248,6 +267,12 @@ export function errorFirstCallback( acceptValue: (value: IrType) => boolean, values: string, ): IrExpr { + // A literal here is called only by the callback adapter, which passes + // null as the error whenever it passes a result (lowerUndefinedResultBody). + let literal: ts.Expression = node; + while (ts.isParenthesizedExpression(literal)) literal = literal.expression; + if (ts.isArrowFunction(literal) || ts.isFunctionExpression(literal)) + lowerer.errorFirstLiterals.add(literal); let callback = lowerer.lowerExpr(node); if (callback.type.kind === "dyn") { callback = { @@ -261,24 +286,8 @@ export function errorFirstCallback( lowerer.unsupported("SC1090", node, `${api} callbacks must accept at most (error, buffer)`); } const error = callback.type.params[0]; - if (error !== undefined && error.kind !== "dyn") { - if (error.kind !== "union") { - lowerer.unsupported("SC1090", node, `${api} callback error parameters must be Error | null`); - } - const def = lowerer.unions.get(error.unionId); - const valid = - !!def && - def.arms.some((arm) => arm.kind === "nullT") && - def.arms.some((arm) => arm.kind === "object" && arm.className === "%Error") && - def.arms.every( - (arm) => - arm.kind === "nullT" || - arm.kind === "undefinedT" || - (arm.kind === "object" && arm.className === "%Error"), - ); - if (!valid) - lowerer.unsupported("SC1090", node, `${api} callback error parameters must be Error | null`); - } + if (error !== undefined && !isErrorFirstErrorType(lowerer, error)) + lowerer.unsupported("SC1090", node, `${api} callback error parameters must be Error | null`); const value = callback.type.params[1]; if (value !== undefined && value.kind !== "dyn" && !acceptValue(value)) { lowerer.unsupported( diff --git a/packages/compiler/src/frontend/lowering/lower-functions.ts b/packages/compiler/src/frontend/lowering/lower-functions.ts index 0ddfa0ac4..9254e6213 100644 --- a/packages/compiler/src/frontend/lowering/lower-functions.ts +++ b/packages/compiler/src/frontend/lowering/lower-functions.ts @@ -1,14 +1,19 @@ import { declareTypedArguments } from "./typed-arguments.js"; -import { varRef } from "../../ir/build.js"; +import { dynUndefinedExpr, varRef } from "../../ir/build.js"; +import { everyStmtList, transformStmtList } from "../../ir/traverse.js"; +import { bindingNeverReassigned } from "./binding-analysis.js"; +import { isErrorFirstErrorType } from "./builtins/arguments.js"; import { InternalCompilerError } from "../../errors.js"; import * as ts from "../ts7/adapter.js"; import { isRebindableFunctionSymbol } from "./rebindable-functions.js"; import { bodyReadsArguments } from "../arguments-usage.js"; import type { Lowerer } from "./lowerer.js"; import { + BOOL, DYN, type IrExpr, type IrFunction, + type IrLocal, type IrParam, type IrStmt, type SrcLoc, @@ -253,6 +258,14 @@ export function lowerLambda( shapes, funcType, ); + // An error-first callback that reads its Buffer result: undefined on the + // error path, as in Node. + const undefinedResult = undefinedResultParam( + lowerer, + node, + shapes, + lowerer.errorFirstLiterals.has(node), + ); const nameIdent = !ts.isArrowFunction(node) && node.name && ts.isIdentifier(node.name) ? node.name : null; const baseName = nameIdent ? nameIdent.text : ""; @@ -340,78 +353,84 @@ export function lowerLambda( !shapes.some((s) => s.mode === "dynRest"), ); - let body: IrStmt[]; - if (ts.isBlock(node.body!)) { - body = lowerer.lowerStmts(node.body!.statements.nodes); - } else { - // Bare-expression arrow body: `x => e` is `x => { return e; }` - // (or an expression statement when the signature returns void — or - // when a union-returning signature wraps a void expression, whose - // value is the implicit undefined arm appended below). - const bodyExpr = node.body as ts.Expression; - if (bodyReturn.kind === "void") { - // `() => undefined` — the return type maps to void (standalone - // undefined IS void in the type mapping) and the body value is a - // bare unit literal: a pure no-op, dropped rather than tripping - // the validator's bare-unitLit rule (typeCheckReturnExpression). - // A `void e` body rides the statement lowering (the value is - // discarded here, so the operand evaluates for effect alone — - // `(name) => void doThing(name)`, the fire-and-forget arrow). A - // conditional body does the same so its void arms become lazy - // statement branches instead of a forbidden void-valued ternary. - let stripped: ts.Expression = bodyExpr; - while (ts.isParenthesizedExpression(stripped)) stripped = stripped.expression; - if (ts.isVoidExpression(stripped) || ts.isConditionalExpression(stripped)) { - body = [lowerer.lowerExprStatement(stripped)]; + const lowerBody = (): IrStmt[] => { + let body: IrStmt[]; + if (ts.isBlock(node.body!)) { + body = lowerer.lowerStmts(node.body!.statements.nodes); + } else { + // Bare-expression arrow body: `x => e` is `x => { return e; }` + // (or an expression statement when the signature returns void — or + // when a union-returning signature wraps a void expression, whose + // value is the implicit undefined arm appended below). + const bodyExpr = node.body as ts.Expression; + if (bodyReturn.kind === "void") { + // `() => undefined` — the return type maps to void (standalone + // undefined IS void in the type mapping) and the body value is a + // bare unit literal: a pure no-op, dropped rather than tripping + // the validator's bare-unitLit rule (typeCheckReturnExpression). + // A `void e` body rides the statement lowering (the value is + // discarded here, so the operand evaluates for effect alone — + // `(name) => void doThing(name)`, the fire-and-forget arrow). A + // conditional body does the same so its void arms become lazy + // statement branches instead of a forbidden void-valued ternary. + let stripped: ts.Expression = bodyExpr; + while (ts.isParenthesizedExpression(stripped)) stripped = stripped.expression; + if (ts.isVoidExpression(stripped) || ts.isConditionalExpression(stripped)) { + body = [lowerer.lowerExprStatement(stripped)]; + } else { + const value = lowerer.lowerExpr(bodyExpr); + // `async () => p` with a void result still resolves the + // function's promise with p (its settlement, rejections included); + // a maybe-promise value adopts only its promise arm. + const flattened = isAsync ? lowerer.maybePromiseReturn(bodyExpr, value, VOID) : null; + body = flattened + ? [flattened] + : value.kind === "unitLit" + ? [] + : isAsync && value.type.kind === "promise" + ? [lowerer.adoptingReturn(value, VOID, (e) => e)] + : [{ kind: "exprStmt", expr: value, loc: locOf(node.body!) }]; + } } else { - const value = lowerer.lowerExpr(bodyExpr); - // `async () => p` with a void result still resolves the - // function's promise with p (its settlement, rejections included); - // a maybe-promise value adopts only its promise arm. - const flattened = isAsync ? lowerer.maybePromiseReturn(bodyExpr, value, VOID) : null; + // Concise and block bodies use the same destination layout for + // fresh literals. Async bodies must inspect promises first. + let value = + isAsync || fnCtx.inferReturn + ? lowerer.lowerExpr(bodyExpr) + : lowerer.lowerExprExpecting(bodyExpr, bodyReturn); + // An async concise body whose value is itself a promise + // (`async () => p`): the async machinery RESOLVES the returned + // thenable into the function's own promise — lowerReturnValue's + // await-through, applied to the implicit return. + if (isAsync && value.type.kind === "promise" && bodyReturn.kind !== "promise") { + value = lowerer.returnedPromiseAwait(value); + } + const flattened = + isAsync && !fnCtx.inferReturn + ? lowerer.maybePromiseReturn(bodyExpr, value, bodyReturn) + : null; body = flattened ? [flattened] - : value.kind === "unitLit" - ? [] - : isAsync && value.type.kind === "promise" - ? [lowerer.adoptingReturn(value, VOID, (e) => e)] - : [{ kind: "exprStmt", expr: value, loc: locOf(node.body!) }]; + : value.type.kind === "void" && lowerer.wrappedUndefined(bodyReturn, locOf(node.body!)) + ? [{ kind: "exprStmt", expr: value, loc: locOf(node.body!) }] + : [ + { + kind: "return", + value: fnCtx.inferReturn + ? value + : lowerer.coerceInto(bodyExpr, value, bodyReturn), + loc: locOf(node.body!), + }, + ]; + if (fnCtx.inferReturn && body[0]?.kind === "return") + fnCtx.inferReturn.entries.push({ stmt: body[0], node: bodyExpr }); } - } else { - // Concise and block bodies use the same destination layout for - // fresh literals. Async bodies must inspect promises first. - let value = - isAsync || fnCtx.inferReturn - ? lowerer.lowerExpr(bodyExpr) - : lowerer.lowerExprExpecting(bodyExpr, bodyReturn); - // An async concise body whose value is itself a promise - // (`async () => p`): the async machinery RESOLVES the returned - // thenable into the function's own promise — lowerReturnValue's - // await-through, applied to the implicit return. - if (isAsync && value.type.kind === "promise" && bodyReturn.kind !== "promise") { - value = lowerer.returnedPromiseAwait(value); - } - const flattened = - isAsync && !fnCtx.inferReturn - ? lowerer.maybePromiseReturn(bodyExpr, value, bodyReturn) - : null; - body = flattened - ? [flattened] - : value.type.kind === "void" && lowerer.wrappedUndefined(bodyReturn, locOf(node.body!)) - ? [{ kind: "exprStmt", expr: value, loc: locOf(node.body!) }] - : [ - { - kind: "return", - value: fnCtx.inferReturn - ? value - : lowerer.coerceInto(bodyExpr, value, bodyReturn), - loc: locOf(node.body!), - }, - ]; - if (fnCtx.inferReturn && body[0]?.kind === "return") - fnCtx.inferReturn.entries.push({ stmt: body[0], node: bodyExpr }); } - } + return body; + }; + let body = undefinedResult + ? lowerUndefinedResultBody(lowerer, node, undefinedResult, lowerBody) + : lowerBody(); if (fnCtx.inferReturn) { bodyReturn = resolveInferredReturn( lowerer, @@ -537,7 +556,14 @@ export function lowerFunction(lowerer: Lowerer, decl: ts.FunctionDeclaration): I "function declarations whose block body the frontend cannot locate", ); } - const body = [...prologue, ...lowerer.lowerStmts(bodyBlock.statements.nodes)]; + const undefinedResult = undefinedResultParam(lowerer, decl, sig.params, false); + const lowerBody = (): IrStmt[] => lowerer.lowerStmts(bodyBlock.statements.nodes); + const body = [ + ...prologue, + ...(undefinedResult + ? lowerUndefinedResultBody(lowerer, decl, undefinedResult, lowerBody) + : lowerBody()), + ]; appendImplicitUndefinedReturn(lowerer, body, bodyReturn, locOf(decl)); const fn: IrFunction = { name: sig.name, @@ -594,3 +620,216 @@ export function lowerFunction(lowerer: Lowerer, decl: ts.FunctionDeclaration): I lowerer.fnStack.pop(); } } + +/** The parameters of an error-first callback whose Buffer result its body + * reads: `(err, out)` with err typed Error | null (or any) and out a + * Buffer. The callback adapters of zlib and crypto pass a NULL Buffer + * after an error, where Node passes undefined. `error` is the error + * parameter's symbol when nothing writes it; `onlyAdapterCalls` marks a + * literal passed straight to such a function, which nothing else calls. */ +interface UndefinedResultParam { + symbol: ts.Symbol; + name: ts.Identifier; + error: ts.Symbol | null; + onlyAdapterCalls: boolean; +} + +function undefinedResultParam( + lowerer: Lowerer, + node: ts.SignatureDeclaration, + shapes: readonly ParamShape[], + onlyAdapterCalls: boolean, +): UndefinedResultParam | null { + const params = node.parameters.nodes.filter((p) => !isThisParameter(p)); + if (params.length !== 2 || shapes.length !== 2 || node.asteriskToken !== undefined) return null; + const [errorDecl, decl] = params as [ts.ParameterDeclaration, ts.ParameterDeclaration]; + const [errorShape, shape] = shapes as [ParamShape, ParamShape]; + if ( + !ts.isIdentifier(decl.name) || + decl.initializer !== undefined || + decl.questionToken !== undefined || + decl.dotDotDotToken !== undefined || + shape.mode !== "required" || + shape.type.kind !== "bytes" || + shape.type.elem !== "u8" || + errorShape.mode !== "required" || + !isErrorFirstErrorType(lowerer, errorShape.type) + ) + return null; + const symbol = lowerer.checker.getSymbolAtLocation(decl.name); + if ( + symbol === undefined || + node.body === undefined || + !readsSymbol(lowerer, node.body, symbol, decl.name) + ) + return null; + const errorSymbol = ts.isIdentifier(errorDecl.name) + ? lowerer.checker.getSymbolAtLocation(errorDecl.name) + : undefined; + const error = + errorSymbol !== undefined && + errorDecl.initializer === undefined && + bindingNeverReassigned(lowerer, errorSymbol, errorDecl) + ? errorSymbol + : null; + return { symbol, name: decl.name, error, onlyAdapterCalls }; +} + +/** Whether `body` reads `symbol` (other than at its declaration `name`). */ +function readsSymbol( + lowerer: Lowerer, + body: ts.Node, + symbol: ts.Symbol, + name: ts.Identifier, +): boolean { + let read = false; + const visit = (n: ts.Node): void => { + if (read) return; + if (ts.isShorthandPropertyAssignment(n)) { + if (lowerer.checker.getShorthandAssignmentValueSymbol(n) === symbol) read = true; + } else if (ts.isIdentifier(n)) { + if (n !== name && lowerer.checker.getSymbolAtLocation(n) === symbol) read = true; + } else { + ts.forEachChild(n, visit); + } + }; + visit(body); + return read; +} + +/** The body of an error-first callback whose Buffer result may be absent. + * With a result, the body lowers as written. Without one (the adapter's + * NULL Buffer after an error), the body lowers again with the result read + * as `any` holding undefined and the error parameter holding an Error. + * Conditions on the error parameter fold in that copy (staticCondition), + * and in the first copy too, as null, for a literal only the adapter + * calls: a body that returns after `if (err)` then keeps the rest of its + * statements in the first copy only. + * + * Inside an error-path copy, a nested callback lowers once with the result + * read as `any`, so nested callbacks do not double at every level. An + * error-path copy with no lowering throws a coded error when it runs. */ +function lowerUndefinedResultBody( + lowerer: Lowerer, + node: ts.SignatureDeclaration, + result: UndefinedResultParam, + lowerBody: () => IrStmt[], +): IrStmt[] { + const loc = locOf(node); + const param = lowerer.bindingIn(lowerer.ctx, result.symbol); + if (param === null) throw new InternalCompilerError("lowerer bug: callback result unbound"); + const absent: IrExpr = { + kind: "libCall", + fn: "bytes.isAbsent", + args: [varRef(param.id, param.type, loc)], + type: BOOL, + loc, + }; + const fence: IrStmt = { + kind: "runtimeFence", + code: "SC2020", + message: `the callback's '${result.name.text}' is undefined after an error, and this callback has no lowering that reads it as undefined`, + loc, + }; + const withKnownError = (error: boolean | null, lower: () => IrStmt[]): IrStmt[] => { + if (result.error === null || error === null) return lower(); + lowerer.knownErrors.set(result.error, error); + try { + return lower(); + } finally { + lowerer.knownErrors.delete(result.error); + } + }; + /** The body with the result read as `any` from `slot`, or null when it + * has no such lowering or converts the result into a static slot. */ + const lowerDynamic = (slot: IrLocal, knownError: boolean | null): IrStmt[] | null => { + const diags = lowerer.diags.length; + const stats = lowerer.suppressStats; + lowerer.scopes.push(new Map([[result.symbol, slot]])); + lowerer.anySymbols.add(result.symbol); + lowerer.suppressStats = true; + lowerer.errorPathCopies++; + try { + // Passed on into a Buffer slot, the result stays the absent Buffer + // the adapter passed: a callee with this entry test reads it as + // undefined. + const body = transformStmtList(withKnownError(knownError, lowerBody), { + expr: (e) => + e.kind === "dynCheck" && + e.value.kind === "varRef" && + e.value.localId === slot.id && + e.type.kind === "bytes" && + e.type.elem === "u8" + ? { kind: "libCall", fn: "bytes.absent", args: [], type: e.type, loc: e.loc } + : e, + stmt: (stmt) => stmt, + }); + if (lowerer.diags.length > diags || !readsSlotDynamically(body, slot.id)) + throw new PoisonError(); + return body; + } catch (error) { + if (error instanceof InternalCompilerError) throw error; + lowerer.diags.length = diags; + return null; + } finally { + lowerer.errorPathCopies--; + lowerer.anySymbols.delete(result.symbol); + lowerer.scopes.pop(); + lowerer.suppressStats = stats; + } + }; + const slot = lowerer.declareHiddenLocal("%result", DYN); + const undefinedResult: IrStmt = { + kind: "varDecl", + localId: slot.id, + init: dynUndefinedExpr(loc), + loc, + }; + if (lowerer.errorPathCopies > 0) { + // One copy for both paths, with the result boxed when present. + const dynamic = lowerDynamic(slot, null); + if (dynamic !== null) + return [ + { + kind: "varDecl", + localId: slot.id, + init: { + kind: "ternary", + cond: absent, + then: dynUndefinedExpr(loc), + else_: lowerer.coerceInto(result.name, varRef(param.id, param.type, loc), DYN), + type: DYN, + loc, + }, + loc, + }, + ...dynamic, + ]; + } + const withResult = withKnownError(result.onlyAdapterCalls ? false : null, lowerBody); + const withoutResult = lowerDynamic(slot, true); + return [ + { + kind: "if", + cond: absent, + then: withoutResult === null ? [fence] : [undefinedResult, ...withoutResult], + else_: withResult, + loc, + }, + ]; +} + +/** Whether the error-path copy reads the checked-dynamic result slot only as + * a checked-dynamic value, never converted into a static slot (where Node + * would hold undefined). */ +function readsSlotDynamically(body: IrStmt[], slotId: string): boolean { + const isSlot = (e: IrExpr): boolean => e.kind === "varRef" && e.localId === slotId; + return everyStmtList(body, { + expr: (e) => { + if (isSlot(e)) return e.type.kind === "dyn"; + if (e.kind === "dynCheck" && isSlot(e.value)) return false; + return true; + }, + stmt: () => true, + }); +} diff --git a/packages/compiler/src/frontend/lowering/lowerer.ts b/packages/compiler/src/frontend/lowering/lowerer.ts index d81ac546e..40b0bc874 100644 --- a/packages/compiler/src/frontend/lowering/lowerer.ts +++ b/packages/compiler/src/frontend/lowering/lowerer.ts @@ -2655,6 +2655,19 @@ export class Lowerer { /** True while re-lowering a base function's 2nd+ instance: the same source * statements were already counted for the first instance. */ suppressStats = false; + /** Callback literals passed straight to an error-first zlib or crypto + * function: only that function's callback adapter calls them + * (lowerUndefinedResultBody). */ + readonly errorFirstLiterals = new Set(); + /** Parameters read as `any` in the error-path copy of an error-first + * callback. */ + readonly anySymbols = new Set(); + /** Error parameters of an error-first callback with a known value in + * the copy being lowered: true while it holds an Error, false while it + * holds null (staticCondition folds conditions on them). */ + readonly knownErrors = new Map(); + /** The number of error-path callback copies being lowered. */ + errorPathCopies = 0; /** Comparisons interned by operand representations and equality semantics. */ readonly equalityHelpers = new Map(); /** Synthetic array-HOF loop functions (map/filter/forEach desugar), @@ -8382,7 +8395,36 @@ export class Lowerer { return fenceStaticReadableStreamMember(this, access, use); } + /** Whether `node` reads an anySymbols parameter, or a member, element or + * call result of one: the error-path copy of a callback reads those as + * `any`. */ + private readsAnySymbol(node: ts.Node): boolean { + let base: ts.Node = node; + for (;;) { + if ( + ts.isPropertyAccessExpression(base) || + ts.isElementAccessExpression(base) || + ts.isNonNullExpression(base) || + ts.isParenthesizedExpression(base) + ) { + base = base.expression; + } else if (ts.isCallExpression(base) && ts.isPropertyAccessExpression(base.expression)) { + base = base.expression.expression; + } else { + break; + } + } + if (!ts.isIdentifier(base)) return false; + const parent = base.parent; + const symbol = + parent !== undefined && ts.isShorthandPropertyAssignment(parent) && parent.name === base + ? this.checker.getShorthandAssignmentValueSymbol(parent) + : this.checker.getSymbolAtLocation(base); + return symbol !== undefined && this.anySymbols.has(symbol); + } + typeOf(node: ts.Node): ts.Type { + if (this.anySymbols.size > 0 && this.readsAnySymbol(node)) return this.checker.getAnyType(); if (ts.isPropertyAccessExpression(node) && isJsSourceFile(ts.getSourceFileOfNode(node))) { const receiver = node.expression.kind === ts.SyntaxKind.ThisKeyword && this.fnStack.length > 0 diff --git a/packages/compiler/src/frontend/lowering/static-typeof.ts b/packages/compiler/src/frontend/lowering/static-typeof.ts index 54f2fdfa0..852cc3117 100644 --- a/packages/compiler/src/frontend/lowering/static-typeof.ts +++ b/packages/compiler/src/frontend/lowering/static-typeof.ts @@ -63,9 +63,44 @@ export function staticTypeofComparison(lowerer: Lowerer, e: ts.BinaryExpression) } } +/** Whether a callback's error parameter holds an Error (true) or null + * (false) in the copy of the callback body being lowered + * (lowerUndefinedResultBody), or null for other expressions. */ +function knownError(lowerer: Lowerer, e: ts.Expression): boolean | null { + while (ts.isParenthesizedExpression(e)) e = e.expression; + if (lowerer.knownErrors.size === 0 || !ts.isIdentifier(e)) return null; + const symbol = lowerer.checker.getSymbolAtLocation(e); + return symbol === undefined ? null : (lowerer.knownErrors.get(symbol) ?? null); +} + +/** A comparison of a known error parameter against `null` + * (`err !== null`, `err == null`), folded. Null for other shapes. */ +function knownErrorComparison(lowerer: Lowerer, e: ts.BinaryExpression): boolean | null { + const isNull = (x: ts.Expression): boolean => { + while (ts.isParenthesizedExpression(x)) x = x.expression; + return x.kind === ts.SyntaxKind.NullKeyword; + }; + const error = isNull(e.right) + ? knownError(lowerer, e.left) + : isNull(e.left) + ? knownError(lowerer, e.right) + : null; + if (error === null) return null; + switch (e.operatorToken.kind) { + case ts.SyntaxKind.EqualsEqualsEqualsToken: + case ts.SyntaxKind.EqualsEqualsToken: + return !error; + case ts.SyntaxKind.ExclamationEqualsEqualsToken: + case ts.SyntaxKind.ExclamationEqualsToken: + return error; + default: + return null; + } +} + /** The value of a condition built from statically answered typeof - * comparisons, `!`, `&&` and `||` (the global-detection chains), or null - * when any operand needs evaluation. */ + * comparisons, known callback error parameters, `!`, `&&` and `||` (the + * global-detection chains), or null when any operand needs evaluation. */ export function staticCondition(lowerer: Lowerer, expr: ts.Expression): boolean | null { let e = expr; while (ts.isParenthesizedExpression(e)) e = e.expression; @@ -73,6 +108,7 @@ export function staticCondition(lowerer: Lowerer, expr: ts.Expression): boolean const inner = staticCondition(lowerer, e.operand); return inner === null ? null : !inner; } + if (ts.isIdentifier(e)) return knownError(lowerer, e); if (!ts.isBinaryExpression(e)) return null; const op = e.operatorToken.kind; if (op === ts.SyntaxKind.AmpersandAmpersandToken || op === ts.SyntaxKind.BarBarToken) { @@ -82,7 +118,7 @@ export function staticCondition(lowerer: Lowerer, expr: ts.Expression): boolean if (left !== isAnd) return left; return staticCondition(lowerer, e.right); } - return staticTypeofComparison(lowerer, e); + return staticTypeofComparison(lowerer, e) ?? knownErrorComparison(lowerer, e); } /** The expression a value reduces to once statically decided conditions diff --git a/packages/compiler/src/ir/builtin-signatures.ts b/packages/compiler/src/ir/builtin-signatures.ts index 9f383c695..28da4ff61 100644 --- a/packages/compiler/src/ir/builtin-signatures.ts +++ b/packages/compiler/src/ir/builtin-signatures.ts @@ -4616,6 +4616,14 @@ export const LIB_FN_SIGS = defineLibFnSignatures({ * lone surrogate as U+FFFD). Borrowed arg; owned (+1) string; never throws. */ "text.decode": { argTypes: [BYTES_U8], result: STRING }, "bytes.bufferSource": { argTypes: [DYN], result: BYTES_U8 }, + /** Whether an error-first callback's Buffer result is absent: the zlib + * and crypto callback adapters pass NULL after an error. Borrowed arg; + * never throws. */ + "bytes.isAbsent": { argTypes: [BYTES_U8], result: BOOL }, + /** The absent Buffer result itself (NULL), where an error-path callback + * body passes its undefined result on into a Buffer slot. Owned (+1); + * never throws. */ + "bytes.absent": { argTypes: [], result: BYTES_U8 }, /** The Buffer brand of a Uint8Array source onto a fresh Uint8Array * result (map and filter of a Buffer return a Buffer). */ "bytes.copyBrand": { argTypes: [BYTES_U8, BYTES_U8], result: VOID }, diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6920-zlib-callback-error-result.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6920-zlib-callback-error-result.ts.json new file mode 100644 index 000000000..05e138441 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6920-zlib-callback-error-result.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6920-zlib-callback-error-result.ts" + ], + "diags": [] +} diff --git a/tests/corpus/6920-zlib-callback-error-result.ts b/tests/corpus/6920-zlib-callback-error-result.ts new file mode 100644 index 000000000..50998d37f --- /dev/null +++ b/tests/corpus/6920-zlib-callback-error-result.ts @@ -0,0 +1,195 @@ +// zlib callbacks receive undefined as the result when they fail, as in +// Node: the result reads as undefined in logs, templates, typeof and +// comparisons, member reads throw Node's TypeError, and the same callbacks +// read the Buffer as before when the operation succeeds. This holds for +// callback literals and for function values. +import * as zlib from "node:zlib"; + +const good = zlib.deflateSync("hello callbacks"); +const bad = Buffer.from("not deflate data"); + +function report(label: string, run: () => void): void { + try { + run(); + } catch (e) { + console.log(label, "threw", (e as Error).name, (e as Error).message); + } +} + +function check(label: string, input: Buffer, next: () => void): void { + zlib.inflate(input, (err, out) => { + console.log(label, "error", err?.code ?? null); + console.log(label, "value", out); + console.log(label, "template", `${out}`, String(out), out + ""); + console.log(label, "typeof", typeof out, out === undefined, out !== undefined); + console.log(label, "optional", out?.length, out?.toString()); + console.log(label, "isBuffer", Buffer.isBuffer(out)); + console.log(label, out ? "truthy" : "falsy"); + report(label + " length", () => console.log(label, "length", out.length)); + report(label + " toString", () => console.log(label, "text", out.toString())); + report(label + " inflateSync", () => console.log(label, "again", zlib.inflateSync(out).length)); + setTimeout(() => { + console.log(label, "later", typeof out, out?.byteLength); + next(); + }); + }); +} + +function guarded(next: () => void): void { + // A callback that checks the error first reads the Buffer only on success. + zlib.gunzip(bad, (err, out) => { + if (err) { + console.log("guarded error", err.code, err.errno); + zlib.gzip("guarded text", (err2, packed) => { + if (err2) throw err2; + zlib.gunzip(packed, (err3, plain) => { + console.log("guarded round trip", err3, plain.toString()); + next(); + }); + }); + return; + } + console.log("guarded value", out.toString()); + }); +} + +function expressions(): void { + // Expression bodies. + zlib.unzip(bad, (err, out) => + zlib.deflateRaw("raw", (err2, raw) => console.log("expression", err?.code, out, err2, raw.length > 0)), + ); +} + +function everyFunction(next: () => void): void { + // Each callback function, with and without options. maxOutputLength makes + // the compressors fail; a non-matching format makes the decompressors fail. + const text = "every function ".repeat(20); + const opts = { maxOutputLength: 8 }; + zlib.deflate(text, opts, (err, out) => { + console.log("deflate", err?.code, typeof out, out?.length); + zlib.deflateRaw(text, opts, (err, out) => { + console.log("deflateRaw", err?.code, typeof out, out?.length); + zlib.gzip(text, opts, (err, out) => { + console.log("gzip", err?.code, typeof out, out?.length); + zlib.inflateRaw(bad, (err, out) => { + console.log("inflateRaw", err?.code, typeof out, out?.length); + zlib.inflate(zlib.deflateSync(text), opts, (err, out) => { + console.log("inflate options", err?.code, typeof out, out?.length); + zlib.gunzip(zlib.gzipSync(text), opts, (err, out) => { + console.log("gunzip options", err?.code, typeof out, out?.length); + zlib.unzip(bad, {}, (err, out) => { + console.log("unzip options", err?.code, typeof out, out?.length); + zlib.inflateRaw(zlib.deflateRawSync(text), {}, (err, out) => { + console.log("inflateRaw options", err, out.toString() === text); + zlib.deflate(text, {}, (err, out) => { + console.log("deflate options", err, zlib.inflateSync(out).toString() === text); + next(); + }); + }); + }); + }); + }); + }); + }); + }); + }); +} + +function folded(input: Buffer, next: () => void): void { + // Conditions on the error parameter. + zlib.inflateRaw(input, (err, out) => { + if (err !== null) console.log("folded error", err.code, typeof out); + else console.log("folded value", out.length); + if (!err) console.log("folded ok", out.toString()); + console.log("folded both", err == null ? out.length : typeof out, err && err.code); + if (err) return; + console.log("folded after", out.byteLength); + }); + setTimeout(next, 10); +} + +// Function values: declarations, const arrows and forwarded parameters +// receive undefined too, and a direct call still passes its arguments. +const steps: (() => void)[] = []; +function step(): void { + const run = steps.shift(); + if (run) run(); +} +function named(err: Error | null, out: Buffer): void { + if (err) console.log("named error", (err as NodeJS.ErrnoException).code, typeof out, out === undefined); + else console.log("named value", out.toString()); + console.log("named both", err !== null, typeof out, `${out}`, out?.length); + step(); +} +const arrow = (err: Error | null, out: Buffer): void => { + console.log("arrow", err?.message ?? null, typeof out, String(out)); + report("arrow length", () => console.log("arrow length", out.length)); + step(); +}; +function captures(err: Error | null, out: Buffer): void { + setTimeout(() => { + console.log("captured", err !== null, typeof out, out?.length); + step(); + }); +} +function forward(input: Buffer, cb: (err: Error | null, out: Buffer) => void): void { + zlib.inflate(input, cb); +} +function forwardGzip(text: string, cb: (err: Error | null, out: Buffer) => void): void { + zlib.gzip(text, { maxOutputLength: 4 }, cb); +} + +function forwardLiteral(input: Buffer, cb: (err: Error | null, out: Buffer) => void): void { + // The literal passes its result on to a typed callback. + zlib.inflate(input, (err, out) => cb(err, out)); +} +function inflated(input: Buffer): Promise { + return new Promise((resolve, reject) => + zlib.inflate(input, (err, out) => (err ? reject(err) : resolve(out))), + ); +} + +function functionValues(next: () => void): void { + steps.push( + () => zlib.inflate(good, named), + () => zlib.inflate(bad, named), + () => zlib.inflate(good, arrow), + () => zlib.inflate(bad, arrow), + () => forward(bad, named), + () => forwardLiteral(bad, named), + () => forwardLiteral(good, arrow), + () => + inflated(bad).then( + (out) => console.log("promise value", out.length), + (e) => { + console.log("promise rejected", (e as NodeJS.ErrnoException).code); + step(); + }, + ), + () => + void inflated(good).then((out) => { + console.log("promise value", out.toString()); + step(); + }), + () => forwardGzip("text that does not fit", arrow), + () => zlib.inflate(bad, captures), + () => zlib.inflate(good, captures), + () => { + named(new Error("direct"), Buffer.from("both")); + }, + next, + ); + step(); +} + +check("good", good, () => + check("bad", bad, () => + guarded(() => + everyFunction(() => + folded(zlib.deflateRawSync("folded text"), () => + folded(bad, () => functionValues(expressions)), + ), + ), + ), + ), +); diff --git a/tests/harness/corpus-costs/6920-zlib-callback-error-result.ts.json b/tests/harness/corpus-costs/6920-zlib-callback-error-result.ts.json new file mode 100644 index 000000000..1241a31c0 --- /dev/null +++ b/tests/harness/corpus-costs/6920-zlib-callback-error-result.ts.json @@ -0,0 +1 @@ +{ "plain": 5517, "san": 7607 } From 349ab75298a9c7534b5b8f084645a9824eb0a5b9 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 12:50:14 -0500 Subject: [PATCH 07/67] Evaluate every ToNumber argument before converting, and convert conditionals The Math functions and String.fromCharCode/fromCodePoint evaluate all of their arguments before they convert any, as in Node. When an argument's conversion can run program code (valueOf or toString on a dynamic value) and a later argument follows, the arguments now evaluate into temporaries first and convert in order after (lowerToNumberArguments). Before, a dynamic argument converted before the next one was evaluated. A conditional argument whose branches are not both numbers boxes its value and converts it like any dynamic value, so `isFinite(flag ? "12" : "abc")` in a JavaScript file returns a boolean instead of reaching a run-time fence. A statement inside an expression can end its block (an argument call that always throws). The expression's later statements and result now emit in a block with no predecessors, so the instructions there read only values defined in it. --- .../src/backend/llvm/expr-primitives.ts | 11 +- .../src/frontend/lowering/builtins/strings.ts | 18 ++- .../src/frontend/lowering/lower-exprs.ts | 106 +++++++++++++++--- .../src/frontend/lowering/lower-stdlib.ts | 26 +++-- tests/corpus/6906-tonumber-arguments.mjs | 45 ++++++++ 5 files changed, 174 insertions(+), 32 deletions(-) diff --git a/packages/compiler/src/backend/llvm/expr-primitives.ts b/packages/compiler/src/backend/llvm/expr-primitives.ts index 69f4def2e..3ab628d69 100644 --- a/packages/compiler/src/backend/llvm/expr-primitives.ts +++ b/packages/compiler/src/backend/llvm/expr-primitives.ts @@ -524,8 +524,15 @@ export function emitOperatorExpr( case "seqExpr": { // Statements mid-expression: each emits in place (its own frame, // exactly statement position); the result is an ordinary temp of - // the current frame. No jump can leave the expression's region. - for (const s of e.stmts) host.emitStmt(s); + // the current frame. No jump can leave the expression's region. A + // statement can still end the block (a call that always throws): + // what follows then emits in a block with no predecessors, so every + // value it reads is defined there, and LLVM deletes it. + for (const s of e.stmts) { + if (host.B.isTerminated()) host.B.startBlock(host.B.newLabel("seq.dead")); + host.emitStmt(s); + } + if (host.B.isTerminated()) host.B.startBlock(host.B.newLabel("seq.dead")); return host.emitExpr(e.result); } default: { diff --git a/packages/compiler/src/frontend/lowering/builtins/strings.ts b/packages/compiler/src/frontend/lowering/builtins/strings.ts index 54ab22c05..4b4a8b29b 100644 --- a/packages/compiler/src/frontend/lowering/builtins/strings.ts +++ b/packages/compiler/src/frontend/lowering/builtins/strings.ts @@ -3,7 +3,7 @@ import * as ts from "../../ts7/adapter.js"; import { type Lowerer } from "../lowerer.js"; import { locOf } from "../../program.js"; import { lowerOptionalArgument, lowerStringSearchArgument } from "../optional-arguments.js"; -import { lowerToNumberArgument } from "../lower-exprs.js"; +import { lowerToNumberArguments } from "../lower-exprs.js"; import { BOOL, DYN, @@ -115,11 +115,19 @@ export function lowerStringStaticCall( const packed = lowerer.lowerExprExpecting(spread.expression, arrayOf(F64)); return { kind: "libCall", fn: `string.${member}`, args: [packed], type: STRING, loc }; } - // Each code converts with ToNumber: a missing value is NaN (code unit 0 - // for fromCharCode, a RangeError for fromCodePoint), exactly Node. - const elems = call.arguments.nodes.map((a) => lowerToNumberArgument(lowerer, a)); + // Each code converts with ToNumber after every argument is evaluated: a + // missing value is NaN (code unit 0 for fromCharCode, a RangeError for + // fromCodePoint), exactly Node. + const { stmts, values: elems } = lowerToNumberArguments(lowerer, call.arguments.nodes); const packed: IrExpr = { kind: "arrayLit", elems, type: arrayOf(F64), loc }; - return { kind: "libCall", fn: `string.${member}`, args: [packed], type: STRING, loc }; + const result: IrExpr = { + kind: "libCall", + fn: `string.${member}`, + args: [packed], + type: STRING, + loc, + }; + return stmts.length === 0 ? result : { kind: "seqExpr", stmts, result, type: STRING, loc }; } /** `String.fromCharCode.apply(thisArg, codes)`, the btoa chunking idiom diff --git a/packages/compiler/src/frontend/lowering/lower-exprs.ts b/packages/compiler/src/frontend/lowering/lower-exprs.ts index 4b03e915d..23892d43e 100644 --- a/packages/compiler/src/frontend/lowering/lower-exprs.ts +++ b/packages/compiler/src/frontend/lowering/lower-exprs.ts @@ -1420,9 +1420,65 @@ export function lowerOptionalNumber( * out-of-range read, a local or field holding one, or a hole — converts to * NaN instead of trusting the checker's number type. */ export function lowerToNumberArgument(lowerer: Lowerer, node: ts.Expression): IrExpr { + const operand = numberOperand(lowerer, node); + return operand.convert ? operand.convert(operand.value) : operand.value; +} + +/** The ToNumber arguments of one call (the Math functions, + * String.fromCharCode): Node evaluates every argument before it converts + * any. When an argument's conversion can run program code (valueOf or + * toString on a dynamic value) and a later argument follows, the arguments + * evaluate into temporaries first and convert in order after. `lowerOther` + * lowers an argument that takes no conversion (a spread), or returns null + * for a ToNumber argument. Returns the temporaries' statements (empty when + * none are needed) and the converted values. */ +export function lowerToNumberArguments( + lowerer: Lowerer, + nodes: readonly ts.Expression[], + lowerOther?: (node: ts.Expression) => IrExpr | null, +): { stmts: IrStmt[]; values: IrExpr[] } { + const operands = nodes.map((node): NumberOperand => { + const other = lowerOther?.(node); + return other ? { value: other, convert: null, runsCode: false } : numberOperand(lowerer, node); + }); + const late = operands.slice(0, -1).some((operand) => operand.runsCode); + if (!late) { + const values = operands.map((o) => (o.convert ? o.convert(o.value) : o.value)); + return { stmts: [], values }; + } + const stmts: IrStmt[] = []; + const values = operands.map((operand) => { + if (operand.value.kind === "numLit") return operand.value; + const temp = lowerer.declareHiddenLocal("%numberArgument", operand.value.type); + const loc = operand.value.loc; + stmts.push({ kind: "varDecl", localId: temp.id, init: operand.value, loc }); + const read = varRef(temp.id, operand.value.type, loc); + return operand.convert ? operand.convert(read) : read; + }); + return { stmts, values }; +} + +/** An argument a ToNumber site lowers: its evaluated value and the + * conversion that makes it a number (null when the value already is one). + * `runsCode`: the conversion can call program code. */ +interface NumberOperand { + value: IrExpr; + convert: ((value: IrExpr) => IrExpr) | null; + runsCode: boolean; +} + +function numberOperand(lowerer: Lowerer, node: ts.Expression): NumberOperand { let inner = node; while (ts.isParenthesizedExpression(inner)) inner = inner.expression; const loc = locOf(inner); + const number = (value: IrExpr): NumberOperand => ({ value, convert: null, runsCode: false }); + const dynToNumber = (value: IrExpr): IrExpr => ({ + kind: "libCall", + fn: "dyn.toNumberCoerce", + args: [value], + type: F64, + loc, + }); const isOptionalNumber = (value: IrExpr): boolean => value.type.kind === "union" && lowerer.armTag(value.type.unionId, UNDEFINED_T) >= 0 && @@ -1433,34 +1489,54 @@ export function lowerToNumberArgument(lowerer: Lowerer, node: ts.Expression): Ir ? lowerAbsenceProbe(lowerer, inner) : null; if (optional && isOptionalNumber(optional)) - return lowerOptionalNumber(lowerer, optional, loc, inner); - // A conditional builds each branch for the destination. - if (ts.isConditionalExpression(inner)) return lowerer.lowerExprExpecting(node, F64); + return number(lowerOptionalNumber(lowerer, optional, loc, inner)); + // A conditional with number branches builds each branch as a number; + // other branches box, and the value converts like any dynamic value. + if (ts.isConditionalExpression(inner)) { + const branch = (b: ts.Expression) => lowerer.mapTypeOf(lowerer.typeOf(b))?.kind; + if (branch(inner.whenTrue) === "f64" && branch(inner.whenFalse) === "f64") + return number(lowerer.lowerExprExpecting(node, F64)); + return { value: lowerer.lowerExprExpecting(node, DYN), convert: dynToNumber, runsCode: true }; + } const value = lowerer.lowerExpr(node); - if (isOptionalNumber(value)) return lowerOptionalNumber(lowerer, value, loc, inner); + if (isOptionalNumber(value)) return number(lowerOptionalNumber(lowerer, value, loc, inner)); // Other values convert with ToNumber: strings parse as numeric literals, // booleans and null are numbers, and checked-dynamic values call // valueOf/toString or throw Node's TypeError for a Symbol or BigInt. - const num = (value: number): IrExpr => ({ kind: "numLit", value, type: F64, loc }); + const num = (n: number): IrExpr => ({ kind: "numLit", value: n, type: F64, loc }); + const pure = (convert: (value: IrExpr) => IrExpr): NumberOperand => ({ + value, + convert, + runsCode: false, + }); switch (value.type.kind) { case "string": - return { kind: "libCall", fn: "num.fromString", args: [value], type: F64, loc }; + return pure((v) => ({ kind: "libCall", fn: "num.fromString", args: [v], type: F64, loc })); case "bool": - return { kind: "ternary", cond: value, then: num(1), else_: num(0), type: F64, loc }; + return pure((v) => ({ + kind: "ternary", + cond: v, + then: num(1), + else_: num(0), + type: F64, + loc, + })); case "nullT": - return defaultAfterUndefined(value, num(0)); + return pure((v) => defaultAfterUndefined(v, num(0))); case "undefinedT": - return defaultAfterUndefined(value, num(NaN)); + return pure((v) => defaultAfterUndefined(v, num(NaN))); case "dyn": - return { kind: "libCall", fn: "dyn.toNumberCoerce", args: [value], type: F64, loc }; + return { value, convert: dynToNumber, runsCode: true }; case "union": - if (lowerer.dynConvertible(value.type)) { - const boxed = lowerer.coerceToExpected(value, DYN); - return { kind: "libCall", fn: "dyn.toNumberCoerce", args: [boxed], type: F64, loc }; - } + if (lowerer.dynConvertible(value.type)) + return { + value: lowerer.coerceToExpected(value, DYN), + convert: dynToNumber, + runsCode: true, + }; break; } - return lowerer.coerceInto(node, value, F64); + return number(lowerer.coerceInto(node, value, F64)); } /** The stored value of an identifier whose storage holds an undefined arm diff --git a/packages/compiler/src/frontend/lowering/lower-stdlib.ts b/packages/compiler/src/frontend/lowering/lower-stdlib.ts index e968af638..2ad3657c7 100644 --- a/packages/compiler/src/frontend/lowering/lower-stdlib.ts +++ b/packages/compiler/src/frontend/lowering/lower-stdlib.ts @@ -2,7 +2,7 @@ import { dynUndefinedExpr, nodeThrowExpr } from "../../ir/build.js"; import { InternalCompilerError } from "../../errors.js"; import * as ts from "../ts7/adapter.js"; -import { lowerToNumberArgument } from "./lower-exprs.js"; +import { lowerToNumberArguments } from "./lower-exprs.js"; import type { Lowerer } from "./lowerer.js"; import { isDeclaredInAmbientNamespace } from "../type-mapper.js"; import { @@ -2415,8 +2415,14 @@ export function lowerStdlibMethodCall( const staticMath = isMath ? own(STATIC_MATH_FNS, name) : undefined; // A missing element (a hole bound by a loop, a local or field holding a // missing read, or the read itself) converts to NaN, ToNumber's answer - // for undefined, instead of trusting the checker's number type. - const mathArg = (a: ts.Expression): IrExpr => lowerToNumberArgument(lowerer, a); + // for undefined, instead of trusting the checker's number type. The + // arguments are all evaluated before any converts (lowerToNumberArguments). + const mathArgs = ( + nodes: readonly ts.Expression[], + lowerOther?: (node: ts.Expression) => IrExpr | null, + ) => lowerToNumberArguments(lowerer, nodes, lowerOther); + const afterArguments = (stmts: IrStmt[], result: IrExpr): IrExpr => + stmts.length === 0 ? result : { kind: "seqExpr", stmts, result, type: result.type, loc }; // Math.hypot, and Math.max/Math.min with a spread among other arguments // (`Math.max(...xs, 5)`): the arguments in order, spreads flattened, as // one number[] the runtime folds. @@ -2427,8 +2433,8 @@ export function lowerStdlibMethodCall( call.arguments.nodes.length > 1 && call.arguments.nodes.some(ts.isSpreadElement))) ) { - const elems = call.arguments.nodes.map((a) => - ts.isSpreadElement(a) ? lowerer.lowerExprExpecting(a.expression, arrayOf(F64)) : mathArg(a), + const { stmts, values: elems } = mathArgs(call.arguments.nodes, (a) => + ts.isSpreadElement(a) ? lowerer.lowerExprExpecting(a.expression, arrayOf(F64)) : null, ); const spreads = call.arguments.nodes.flatMap((a, i) => (ts.isSpreadElement(a) ? [i] : [])); const packed: IrExpr = { @@ -2439,7 +2445,7 @@ export function lowerStdlibMethodCall( loc, }; const fn = name === "max" ? "math.maxArr" : name === "min" ? "math.minArr" : staticMath.fn; - return { kind: "libCall", fn, args: [packed], type: F64, loc }; + return afterArguments(stmts, { kind: "libCall", fn, args: [packed], type: F64, loc }); } if (staticMath && call.arguments.nodes.every((a) => !ts.isSpreadElement(a))) { // Math.max/Math.min at ANY plain arity — Node's are variadic. The @@ -2455,16 +2461,16 @@ export function lowerStdlibMethodCall( if (call.arguments.nodes.length === 0) { return { kind: "numLit", value: name === "max" ? -Infinity : Infinity, type: F64, loc }; } - const args = call.arguments.nodes.map(mathArg); + const { stmts, values: args } = mathArgs(call.arguments.nodes); let acc = args[0]!; for (let i = 1; i < args.length; i++) { acc = { kind: "libCall", fn: staticMath.fn, args: [acc, args[i]!], type: F64, loc }; } - return acc; + return afterArguments(stmts, acc); } if (call.arguments.nodes.length === staticMath.arity) { - const args = call.arguments.nodes.map(mathArg); - return { kind: "libCall", fn: staticMath.fn, args, type: F64, loc }; + const { stmts, values: args } = mathArgs(call.arguments.nodes); + return afterArguments(stmts, { kind: "libCall", fn: staticMath.fn, args, type: F64, loc }); } } // `Math.max(...xs)` / `Math.min(...xs)` over a number[]: a STATIC diff --git a/tests/corpus/6906-tonumber-arguments.mjs b/tests/corpus/6906-tonumber-arguments.mjs index 23b150eb8..55da6bb1f 100644 --- a/tests/corpus/6906-tonumber-arguments.mjs +++ b/tests/corpus/6906-tonumber-arguments.mjs @@ -30,3 +30,48 @@ for (const value of [Symbol("s"), 10n]) { console.log(e instanceof TypeError, e.message); } } + +// A conditional argument converts whichever branch it takes. +for (const flag of [true, false]) { + console.log(isFinite(flag ? "12" : "abc"), isNaN(flag ? null : "x"), Math.floor(flag ? "3.7" : true)); +} + +// Every argument is evaluated before any converts, as in Node: valueOf runs +// after the last argument, and an argument that throws stops the call +// before any conversion. +let order = ""; +const valued = (name, n) => ({ valueOf: () => ((order += "v" + name), n) }); +const arg = (name, n) => ((order += "e" + name), valued(name, n)); +console.log(Math.max(arg("a", 1), arg("b", 5), arg("c", 3)), order); +order = ""; +console.log(Math.pow(arg("a", 2), arg("b", 10)), order); +order = ""; +console.log(Math.hypot(arg("a", 3), ...[4], arg("c", 12)), order); +order = ""; +console.log(String.fromCharCode(arg("a", 72), arg("b", 105)), order); +order = ""; +try { + Math.max( + arg("a", 1), + (() => { + order += "throw"; + throw new Error("boom"); + })(), + ); +} catch (e) { + console.log(e.message, order); +} +order = ""; +try { + Math.min( + { + valueOf() { + order += "x"; + throw new TypeError("first"); + }, + }, + arg("b", 2), + ); +} catch (e) { + console.log(e.message, order); +} From 1bf49286d1aba8c6cb505d2704a2519a210a556a Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 12:50:36 -0500 Subject: [PATCH 08/67] Document when builds use multiple cores How It Works gains a Build parallelism section: the frontend runs on one thread, executables divide into partitions by the size of their LLVM text, the LLVM helper compiles partitions on a thread per hardware thread, what dev and optimized builds run in parallel and in order, what a rebuild compiles again, and what profile-guided optimization adds to build time. The CLI reference links to it from --emit, --optimization, --profile-use, SCRIPTC_CACHE_DIR, and Profile-guided optimization. Fixes #1340 Co-authored-by: Quino Terrasa <26749475+espetro@users.noreply.github.com> --- docs/content/docs/cli.mdx | 10 ++--- docs/content/docs/how-it-works.mdx | 61 +++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/docs/content/docs/cli.mdx b/docs/content/docs/cli.mdx index 9b6e88628..daeb37ea0 100644 --- a/docs/content/docs/cli.mdx +++ b/docs/content/docs/cli.mdx @@ -109,7 +109,7 @@ With `--sparse`, the profile leaves out the functions the runs never reached. Th
Primary artifact path. An explicit path is exact. Defaults are .scriptc/<name>.ir.json, .ll, .s, .o, or the platform executable name.
--emit <ir|llvm|asm|obj|exe>
-
Select the primary artifact: serialized typed IR (ir), textual LLVM IR (llvm), assembly (asm), a relocatable object (obj), or an executable (exe, the default). Every kind except exe is produced without an external compiler, linker, or SDK.
+
Select the primary artifact: serialized typed IR (ir), textual LLVM IR (llvm), assembly (asm), a relocatable object (obj), or an executable (exe, the default). Every kind except exe is produced without an external compiler, linker, or SDK. Assembly and object output is compiled as one module; only executables are divided into partitions that compile in parallel (see Build parallelism).
--print <native-link-info|diagnostics>
native-link-info: build an object (equivalent to --emit=obj) and print its machine-readable external link recipe as JSON instead of printing the artifact path. The document names the exact installed precompiled runtime pack and all link inputs, but does not invoke a linker. diagnostics: for build and coverage, print the versioned JSON diagnostics document described in Coverage Reports instead of the human output.
@@ -127,7 +127,7 @@ With `--sparse`, the profile leaves out the functions the runs never reached. Th
Remove symbol and debug payload when linking an executable, including cross-compiled targets. This flag preserves code optimization.
--optimization <release|dev|speed>
-
Select native optimization for executable, assembly, or object output. The default is release (-O2), which emits string retains and the retains and releases of dynamic values inline and lets LLVM inline small runtime functions that keep no internal runtime state into executable code; programs large enough to be compiled in parallel partitions skip that inlining to keep build time and size in check. dev uses -O0 and emits source locations for TypeScript and JavaScript breakpoints and stack frames. LLVM builds include source variable names and native storage descriptions; see Native debugging for the supported representations. macOS executable builds also produce an adjacent .dSYM bundle. speed is -O2 plus optimizations that trade binary size and build time for run-time speed: it lets LLVM inline more small runtime functions into program code, emits the remaining reference counting inline, and on x86-64 starts every runtime function on a cache-line boundary. Expect larger executables and longer cold builds than release; how much faster a program runs depends on how much of its time is spent in the runtime. Runtime inlining needs a runtime pack built with the LLVM helper; where a runtime pack lacks it, programs link the same runtime without it and speed links the release runtime and keeps inline reference counting. Selecting speed never changes what release builds produce, and the two never share cached artifacts. Library profiles accept "optimization": "speed" for inline reference counting.
+
Select native optimization for executable, assembly, or object output. The default is release (-O2), which emits string retains and the retains and releases of dynamic values inline and lets LLVM inline small runtime functions that keep no internal runtime state into executable code; programs large enough to be compiled in parallel partitions skip that inlining to keep build time and size in check. dev uses -O0 and emits source locations for TypeScript and JavaScript breakpoints and stack frames. LLVM builds include source variable names and native storage descriptions; see Native debugging for the supported representations. macOS executable builds also produce an adjacent .dSYM bundle. speed is -O2 plus optimizations that trade binary size and build time for run-time speed: it lets LLVM inline more small runtime functions into program code, emits the remaining reference counting inline, and on x86-64 starts every runtime function on a cache-line boundary. Expect larger executables and longer cold builds than release; how much faster a program runs depends on how much of its time is spent in the runtime. Runtime inlining needs a runtime pack built with the LLVM helper; where a runtime pack lacks it, programs link the same runtime without it and speed links the release runtime and keeps inline reference counting. Selecting speed never changes what release builds produce, and the two never share cached artifacts. Library profiles accept "optimization": "speed" for inline reference counting. In executables large enough to be divided into partitions, dev compiles each partition on its own, and release and speed add a step that lets partitions import small functions from each other; see Build parallelism.
--windows-subsystem <console|gui>
Select the subsystem of a Windows executable. console is the default; gui prevents Windows from opening a console window for the app. Valid only for executable builds targeting Windows.
@@ -139,7 +139,7 @@ With `--sparse`, the profile leaves out the functions the runs never reached. Th
On Linux, build an instrumented executable for profile-guided optimization. Each run writes a raw profile to the path pattern, where %p expands to the process ID; the LLVM_PROFILE_FILE environment variable overrides the pattern at run time. A relative pattern resolves from the current working directory. Instrumented programs run slower. Valid only for executable builds with --optimization=release or speed.
--profile-use <file.profdata>
-
Optimize the executable with a profile from scriptc merge-profiles: code is laid out, inlined, and split by how the profiled runs used it. Code the profile does not describe, or describes from an older version of the program, is optimized as without a profile, so a stale profile only loses part of its gain. Valid only for executable builds with --optimization=release or speed.
+
Optimize the executable with a profile from scriptc merge-profiles: code is laid out, inlined, and split by how the profiled runs used it. Code the profile does not describe, or describes from an older version of the program, is optimized as without a profile, so a stale profile only loses part of its gain. A new or changed profile compiles every partition of the program again. Valid only for executable builds with --optimization=release or speed.
--npm-static <pkg[,pkg…]|auto>
Name npm packages to compile even if they don't ship their own type declarations (repeatable). A trailing ..., as in fs-extra..., also names every package that package depends on. auto uses the default automatic selection. Packages that can't compile produce diagnostics. See npm Dependencies.
@@ -182,7 +182,7 @@ With `--sparse`, the profile leaves out the functions the runs never reached. Th
SCRIPTC_CACHE_DIR
-
Override the persistent build-cache root. By default it is $XDG_CACHE_HOME/scriptc/build when set, $HOME/Library/Caches/scriptc/build on macOS, %LOCALAPPDATA%\scriptc\cache\build on Windows, and $HOME/.cache/scriptc/build elsewhere. Cached frontend results and LLVM artifacts are verified against their source, helper, target, and compilation settings. Native outputs also depend on the selected runtime pack and linker inputs. FFI objects, archives, and system libraries relink against their current dependencies. Sanitizer development builds additionally cache instrumented runtime objects and verify external compiler and header inputs. An existing POSIX override must already be private; otherwise caching is bypassed without changing the directory's permissions.
+
Override the persistent build-cache root. By default it is $XDG_CACHE_HOME/scriptc/build when set, $HOME/Library/Caches/scriptc/build on macOS, %LOCALAPPDATA%\scriptc\cache\build on Windows, and $HOME/.cache/scriptc/build elsewhere. Cached frontend results and LLVM artifacts, including the compiled partitions of large executables, are verified against their source, helper, target, and compilation settings. Native outputs also depend on the selected runtime pack and linker inputs. FFI objects, archives, and system libraries relink against their current dependencies. Sanitizer development builds additionally cache instrumented runtime objects and verify external compiler and header inputs. An existing POSIX override must already be private; otherwise caching is bypassed without changing the directory's permissions.
SCRIPTC_NO_CACHE
Set to 1 to bypass all build-cache reads and writes. An explicitly empty SCRIPTC_CACHE_DIR has the same effect.
@@ -223,7 +223,7 @@ $ scriptc merge-profiles -o app.profdata profiles/*.profraw $ scriptc build app.ts --optimization=speed --profile-use app.profdata ``` -Train on workloads like the ones the program will run: code the training never reached is optimized as without a profile. The profile can be committed and reused as the program changes. Functions whose control flow changed since the profile was collected lose their profile, and the rest keep theirs, so regenerate it when much of the program has changed. +Train on workloads like the ones the program will run: code the training never reached is optimized as without a profile. The profile can be committed and reused as the program changes. Functions whose control flow changed since the profile was collected lose their profile, and the rest keep theirs, so regenerate it when much of the program has changed. [Build parallelism](/docs/how-it-works#build-parallelism) describes what a profile adds to build time. ## LLVM backend diff --git a/docs/content/docs/how-it-works.mdx b/docs/content/docs/how-it-works.mdx index 5c6d7be63..f1b64948d 100644 --- a/docs/content/docs/how-it-works.mdx +++ b/docs/content/docs/how-it-works.mdx @@ -27,11 +27,70 @@ Runtime pack and linker -> executable 1. **Frontend:** TypeScript parses and checks the program against `es2025`, scriptc's ambient declarations, and available project declarations. `tsconfig.json` controls checker strictness. The compiler uses the checked types and narrowing information to lower supported operations; unsupported operations produce diagnostics. JavaScript files that TypeScript checks (a `// @ts-check` comment, or `checkJs` in `tsconfig.json`) report values that do not match their JSDoc types as errors, and their classes use those types the way TypeScript classes use annotations. 2. **Typed IR:** A validated, serializable intermediate representation connects the frontend and backend. Types are concrete: generic functions are specialized, unions use tags, and closures have explicit captures. `--emit=ir` writes this representation as JSON. -3. **LLVM backend:** `--emit=llvm` writes textual LLVM IR. The matching LLVM 22 helper generates assembly or objects on supported macOS, Linux, and Windows hosts, including output targeting WASI. Executable and library builds use this backend. Large executables, native and WASI alike, are divided into partitions that are optimized and compiled in parallel; optimized builds summarize every partition first so small functions can still be inlined across partitions. The partition count depends only on the program, so output is the same on every host, and a rebuild reuses the compiled partitions that an edit does not affect. +3. **LLVM backend:** `--emit=llvm` writes textual LLVM IR. The matching LLVM 22 helper generates assembly or objects on supported macOS, Linux, and Windows hosts, including output targeting WASI. Executable and library builds use this backend. Large executables, native and WASI alike, are divided into partitions that are optimized and compiled in parallel; see [Build parallelism](#build-parallelism). 4. **Linking:** Runtime packs contain the precompiled C runtime and vendored libraries. A hashed manifest selects the artifacts the program needs for its features, optimization mode, and (for libraries) state model. The target linker and SDK or sysroot produce the executable. Sanitizer builds use an instrumented C runtime. `comptime` calls run during the frontend stage in an isolated evaluator inside the compiler, based on QuickJS. Their results are embedded in the program as constants. +## Build parallelism + +Most of a build runs on one CPU core. The LLVM helper uses more cores only when it compiles an executable in partitions. + +### Frontend + +Parsing, type checking, lowering, and LLVM IR generation run one after another on one thread. The type checker runs in a separate process that the compiler waits on. When none of a build's inputs has changed since an earlier build, the frontend's results come from the build cache and this stage is skipped. A change to any input runs the whole stage again. + +### Partitions + +The LLVM helper divides an executable's LLVM IR into partitions by its size: one partition per 4 MiB of LLVM text, rounded up to a power of two, and at most 64. `--emit=llvm` writes this text, so its file size shows how many partitions a program gets. + + + + + + + + + + + + + + +
LLVM textPartitions
Up to 4 MiB1
Over 4 MiB, up to 8 MiB2
Over 8 MiB, up to 16 MiB4
Over 16 MiB, up to 32 MiB8
Over 32 MiB, up to 64 MiB16
Over 64 MiB, up to 128 MiB32
Over 128 MiB64
+ +The count depends only on the size of the LLVM text, so a program has the same partitions, and builds the same executable, on every host. A function's partition follows from its name, and a small internal function goes with the one function that calls it, so an edit leaves the other functions in their partitions. + +These builds are not divided into partitions and compile on one thread: `--emit=asm`, `--emit=obj`, and `--print=native-link-info` output, library builds (`--lib`; `dev` library builds are compiled in pieces, one after another), and `--sanitize` builds, which compile the LLVM IR with the C compiler. + +The helper compiles partitions on a pool with one thread per hardware thread of the host, so an executable with two partitions uses at most two cores in the backend. A program of one partition is optimized and compiled on one thread. + +How partitions are compiled depends on `--optimization`: + +- `dev` compiles each partition on its own, all in parallel. +- `release` and `speed` optimize each partition and write a summary of its functions, all in parallel. Then a serial step reads every summary and decides which small functions each partition imports from the others, so that calls between partitions can still be inlined. Last, the partitions are optimized with their imports and compiled, again in parallel. + +Reading the LLVM text and dividing it into partitions, and the import step, run on one thread. + +### Rebuilds + +With two or more partitions, the helper keeps each partition's summary and object in the build cache (see `SCRIPTC_CACHE_DIR` in the [CLI reference](/docs/cli#environment-variables)). A rebuild after an edit compiles again only the partitions whose functions changed and, in `release` and `speed` builds, the partitions that import a changed function; the others come from the cache. Dividing the program, the import step, and linking run on every build. A cold build, with nothing cached, compiles every partition. + +A program of one partition has no partition cache: a rebuild after an edit compiles the whole program again, and a rebuild that leaves the LLVM text unchanged takes the compiled code from the build cache. + +When the LLVM text grows past a partition boundary (4, 8, 16 MiB, and so on), the partition count doubles, functions move to new partitions, and the next build compiles every partition again. + +### Profile-guided optimization + +Building with a profile adds these costs (see [Profile-guided optimization](/docs/cli#profile-guided-optimization)): + +- `--profile-generate` builds an instrumented executable, which runs slower while it records the profile. +- The profile's contents are part of every partition's cache key. A new or changed profile compiles every partition again; builds without a profile keep their own cache entries. +- With a profile, the import step lets a hot call import a function of up to twice the usual size limit. LLVM's default limits for profiled calls are 10 and 100 times as large, and on large programs they tripled the build's time and memory without making the program measurably faster. +- The profile does not change which partition a function is in. + +Collecting a profile takes an instrumented build, the training runs, and the merge. With a committed profile, later builds skip those steps and are one optimized build each. + ## Inspect compiler output The following examples use this program: From 96f31cbc1838044295653308be2392fce6cca757 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 13:04:07 -0500 Subject: [PATCH 09/67] Shrink the array header to 32 bytes An array's element ops are a registry id in `spare` instead of a pointer field: descriptors get their id on their first array (emitted descriptors are writable for it), and a program with more element types than the id holds keeps the rest in the array's out-of-line storage. The out-of-line storage (sparse indices, noncanonical numeric properties, match metadata) is no longer a header field. An array that has it keeps its pointer in the 8 bytes before its dense allocation and sets SCR_ARR_HAS_EXT; such an array always has a dense allocation of its own (inline slots move out, an empty array gets the prefix alone), and every allocation, reallocation and free of the dense storage accounts for the prefix. Loops over elements look the ops up once, and the state lookup below the dense capacity reads no out-of-line storage. --- .../compiler/src/backend/llvm/array-search.ts | 3 +- packages/compiler/src/backend/llvm/common.ts | 4 +- .../compiler/src/backend/llvm/emit-module.ts | 18 +- .../src/backend/llvm/expr-stream-bridges.ts | 5 +- packages/compiler/src/backend/llvm/shapes.ts | 7 +- packages/runtime/src/scr_array.c | 350 ++++++++++++------ packages/runtime/src/scr_array.h | 91 ++++- packages/runtime/src/scr_async_dyn.c | 2 +- packages/runtime/src/scr_bytes_io.c | 4 +- packages/runtime/src/scr_copying.c | 4 +- packages/runtime/src/scr_cycle.c | 2 +- packages/runtime/src/scr_events_emitter.c | 2 +- packages/runtime/src/scr_itable.c | 10 +- packages/runtime/src/scr_json.c | 2 +- packages/runtime/src/scr_json.test.c | 2 +- packages/runtime/src/scr_lib.c | 2 +- packages/runtime/src/scr_map.c | 2 +- packages/runtime/src/scr_publish.c | 8 +- packages/runtime/src/scr_regex.c | 10 +- packages/runtime/src/scr_region.c | 14 +- packages/runtime/src/scr_region.test.c | 2 +- packages/runtime/src/scr_stream.c | 2 +- packages/runtime/test/test_array.c | 66 +++- packages/runtime/test/test_lib.c | 2 +- packages/runtime/test/test_map.c | 2 +- packages/runtime/test/test_regex.c | 2 +- 26 files changed, 441 insertions(+), 177 deletions(-) diff --git a/packages/compiler/src/backend/llvm/array-search.ts b/packages/compiler/src/backend/llvm/array-search.ts index 74d79f7be..d61d91e5c 100644 --- a/packages/compiler/src/backend/llvm/array-search.ts +++ b/packages/compiler/src/backend/llvm/array-search.ts @@ -23,6 +23,7 @@ * is little-endian, which the short-string words assume. */ import type { IrType } from "../../ir/ir.js"; +import { SCR_ARR_FIELD } from "./common.js"; import { FN_ATTRS } from "./shapes.js"; export type ArraySearchKind = "ptr" | "str"; @@ -72,7 +73,7 @@ export function emitArraySearchHelpers( ` %dense = icmp eq ${sz} %f, %len`, ` br i1 %dense, label %scan, label %slow`, `scan:`, - ` %dp = getelementptr inbounds %ScrArr, ptr %a, i32 0, i32 8`, + ` %dp = getelementptr inbounds %ScrArr, ptr %a, i32 0, i32 ${SCR_ARR_FIELD.data}`, ` %data = load ptr, ptr %dp`, ); if (kind === "ptr") { diff --git a/packages/compiler/src/backend/llvm/common.ts b/packages/compiler/src/backend/llvm/common.ts index e6fc56f6f..822ee29e2 100644 --- a/packages/compiler/src/backend/llvm/common.ts +++ b/packages/compiler/src/backend/llvm/common.ts @@ -21,9 +21,7 @@ export const SCR_ARR_FIELD = { cyc: 4, spare: 5, filled: 6, - ops: 7, - data: 8, - ext: 9, + data: 7, } as const; /** Loads the i32 `len` or `cap` of a %ScrArr at `ptr` into `dest` as a diff --git a/packages/compiler/src/backend/llvm/emit-module.ts b/packages/compiler/src/backend/llvm/emit-module.ts index 732a21ee6..17b27fe8d 100644 --- a/packages/compiler/src/backend/llvm/emit-module.ts +++ b/packages/compiler/src/backend/llvm/emit-module.ts @@ -439,15 +439,17 @@ export function emitModuleParts(emitter: LlEmitter): string[] { `%ScrFfiTable = type { ptr, ${emitter.sizeType}, ${emitter.sizeType}, ptr, i8, ptr, ptr, ${emitter.sizeType}, ${emitter.sizeType}, ${emitter.sizeType}, ptr, ptr }`, `%ScrRegex = type { ${emitter.sizeType}, ptr, ptr, ptr, double, ptr, ptr, ptr }`, // ScrArr mirrors scr_runtime.h field-for-field: { rc, len (i32), cap - // (i32), elem, cyc, spare, filled, ops, data, ext } (field numbers in + // (i32), elem, cyc, spare, filled, data } (field numbers in // SCR_ARR_FIELD), where the dense states follow the cap value slots at - // data, filled bounds the hole-free prefix, ops points at the element type's constant RC descriptor - // (%ScrArrOps, SCR_ELEM_REF only) and ext at the out-of-line sparse, - // property and metadata storage (NULL until first used). Live dynamic - // stream commits swap its dense, presence and out-of-line storage while + // data, filled bounds the hole-free prefix, and spare holds the storage + // flags and the registry id of the element type's RC descriptor + // (%ScrArrOps, SCR_ELEM_REF only; the runtime assigns ids). An array + // with out-of-line sparse, property or metadata storage keeps a pointer + // to it in the word before its dense allocation. Live dynamic stream + // commits swap its dense, presence and out-of-line storage while // preserving the target object's identity. - `%ScrArr = type { ${emitter.sizeType}, i32, i32, i8, i8, i16, i32, ptr, ptr, ptr }`, - `%ScrArrOps = type { ptr, ptr, ptr }`, + `%ScrArr = type { ${emitter.sizeType}, i32, i32, i8, i8, i16, i32, ptr }`, + `%ScrArrOps = type { ptr, ptr, ptr, i32 }`, // The ScrMap prefix { rc, key_kind, val_kind, traced } — the inline // RC fast paths test the traced byte (shapes.ts). ...(emitter.rcHelpers === null ? [] : [`%ScrMapRc = type { ${emitter.sizeType}, i8, i8, i8 }`]), @@ -709,7 +711,7 @@ export function emitModuleParts(emitter: LlEmitter): string[] { wide ? `ptr ${s}` : `<{ ptr, i32 }> <{ ptr ${s}, i32 0 }>`; out.push( `@${inst.sym}_data = internal constant <{ [${n} x ${slot}], [${n} x i8] }> <{ [${n} x ${slot}] [ ${inst.slots.map(slotValue).join(", ")} ], [${n} x i8] ${present} }>, align 8`, - `@${inst.sym} = internal global %ScrArr { ${emitter.sizeType} -1, i32 ${n}, i32 ${n}, i8 2, i8 0, i16 0, i32 ${n}, ptr null, ptr @${inst.sym}_data, ptr null }`, + `@${inst.sym} = internal global %ScrArr { ${emitter.sizeType} -1, i32 ${n}, i32 ${n}, i8 2, i8 0, i16 0, i32 ${n}, ptr @${inst.sym}_data }`, ); } if (emitter.templateStringsInstances.size > 0) out.push(``); diff --git a/packages/compiler/src/backend/llvm/expr-stream-bridges.ts b/packages/compiler/src/backend/llvm/expr-stream-bridges.ts index 6b51f9afa..ce33aa2cd 100644 --- a/packages/compiler/src/backend/llvm/expr-stream-bridges.ts +++ b/packages/compiler/src/backend/llvm/expr-stream-bridges.ts @@ -193,7 +193,10 @@ export function streamTypedRefCommitAdapter( { name: "cap", index: SCR_ARR_FIELD.cap, type: "i32" }, { name: "data", index: SCR_ARR_FIELD.data, type: "ptr" }, { name: "filled", index: SCR_ARR_FIELD.filled, type: "i32" }, - { name: "ext", index: SCR_ARR_FIELD.ext, type: "ptr" }, + // The out-of-line storage's pointer lives before the dense allocation + // and moves with data; its flag is in spare, whose element ops id the + // two arrays share. + { name: "spare", index: SCR_ARR_FIELD.spare, type: "i16" }, ]; for (const member of storageMembers) { lines.push( diff --git a/packages/compiler/src/backend/llvm/shapes.ts b/packages/compiler/src/backend/llvm/shapes.ts index 8844921c5..58295e42b 100644 --- a/packages/compiler/src/backend/llvm/shapes.ts +++ b/packages/compiler/src/backend/llvm/shapes.ts @@ -1074,15 +1074,16 @@ export function arrNewCall( return `call ptr @scr_arr_new_ops(ptr ${arrOps(host, elem)}, ${host.sizeType} ${capText})`; } -/** The constant %ScrArrOps descriptor (retain, release, trace) of a REF - * element type, defined once per module and shared by all its arrays. */ +/** The %ScrArrOps descriptor (retain, release, trace, registry id) of a REF + * element type, defined once per module and shared by all its arrays. It is + * writable: the runtime stores its registry id on the first array. */ export function arrOps(host: ShapeHost, elem: IrType): string { const v = vAdapters(host, elem); const trace = traceArg(host, elem); const part = (sym: string): string => sym.replace(/^@/, "").replace(/[^A-Za-z0-9_.]/g, "_"); const name = `@sc_arrops.${part(v.retain)}.${part(v.release)}.${part(trace)}`; host.declare( - `${name} = internal constant %ScrArrOps { ptr ${v.retain}, ptr ${v.release}, ptr ${trace} }`, + `${name} = internal global %ScrArrOps { ptr ${v.retain}, ptr ${v.release}, ptr ${trace}, i32 0 }`, ); return name; } diff --git a/packages/runtime/src/scr_array.c b/packages/runtime/src/scr_array.c index 4887f23ff..51853afce 100644 --- a/packages/runtime/src/scr_array.c +++ b/packages/runtime/src/scr_array.c @@ -42,14 +42,100 @@ static void scr_arr_oom(void) { static const ScrArrExt scr_arr_no_ext; SCR_TL bool (*scr_arr_match_copy)(ScrArr *a, ScrDyn *target) = NULL; -#define SCR_AX(a) ((const ScrArrExt *)((a)->ext ? (a)->ext : &scr_arr_no_ext)) +static inline const ScrArrExt *scr_arr_ax(const ScrArr *a) { + const ScrArrExt *x = scr_arr_ext_of(a); + return x ? x : &scr_arr_no_ext; +} +#define SCR_AX(a) scr_arr_ax(a) + +static void scr_arr_move_inline(ScrArr *a, size_t cap, size_t unit); + +/* Bytes before the dense slots' allocation start: the ext pointer's word. */ +static size_t scr_arr_prefix(const ScrArr *a) { + return (a->spare & SCR_ARR_HAS_EXT) ? SCR_ARR_EXT_PREFIX : 0; +} + +/* The start of the block the dense storage was allocated as. */ +static void *scr_arr_alloc_start(const ScrArr *a) { + return (char *)scr_arr_block(a) - scr_arr_prefix(a); +} + +/* Bytes per dense slot with its state: an 8-byte value, or a boolean byte. */ +static size_t scr_arr_slot_unit(const ScrArr *a) { + return a->elem == SCR_ELEM_BOOL ? 2 * sizeof(uint8_t) : sizeof(uint64_t) + sizeof(uint8_t); +} + +/* Bytes of dense storage (head room included) after the prefix. */ +static size_t scr_arr_storage_bytes(const ScrArr *a) { + return ((size_t)(a->data - scr_arr_block(a)) + a->cap) * scr_arr_slot_unit(a); +} ScrArrExt *scr_arr_ext(ScrArr *a) { - if (!a->ext) { - a->ext = scr_mem_calloc(sizeof(ScrArrExt)); - if (!a->ext) scr_arr_oom(); + ScrArrExt *x = scr_arr_ext_of(a); + if (x) return x; + x = scr_mem_calloc(sizeof(ScrArrExt)); + if (!x) scr_arr_oom(); + /* The pointer goes in the word before the dense allocation, which an + * array with ext always has: inline slots move out, and an array without + * storage gets an allocation of the word alone. */ + if (a->spare & SCR_ARR_INLINE_SLOTS) scr_arr_move_inline(a, a->cap, scr_arr_slot_unit(a)); + char *start; + if (!a->data) { + start = scr_mem_alloc(SCR_ARR_EXT_PREFIX); + if (!start) scr_arr_oom(); + a->data = (uint64_t *)(start + SCR_ARR_EXT_PREFIX); + a->cap = 0; + } else { + size_t bytes = scr_arr_storage_bytes(a); + size_t head = (size_t)(a->data - scr_arr_block(a)); + if (a->rc == SIZE_MAX) { + /* An immortal array's storage may be static: copy it, never move it. */ + start = scr_mem_alloc(bytes + SCR_ARR_EXT_PREFIX); + if (!start) scr_arr_oom(); + memcpy(start + SCR_ARR_EXT_PREFIX, scr_arr_block(a), bytes); + } else { + start = scr_mem_realloc(scr_arr_block(a), bytes + SCR_ARR_EXT_PREFIX); + if (!start) scr_arr_oom(); + memmove(start + SCR_ARR_EXT_PREFIX, start, bytes); + } + a->data = (uint64_t *)(start + SCR_ARR_EXT_PREFIX) + head; } - return a->ext; + memcpy(start, &x, sizeof x); + a->spare |= SCR_ARR_HAS_EXT; + return x; +} + +/* Registry of element ops by id (scr_arr_ops); slot 0 is no ops. */ +const ScrArrOps *scr_arr_ops_table[SCR_ARR_OPS_OVERFLOW] = {0}; +static uint32_t scr_arr_ops_count = 1; + +/* Assign `ops` its id on its first array; any thread may get there first, + * and every thread then sees the same id. A lost race leaves one table + * slot unused. Once the table is full, later descriptors get + * SCR_ARR_OPS_OVERFLOW. */ +uint32_t scr_arr_ops_register(ScrArrOps *ops) { + uint32_t id = __atomic_load_n(&ops->id, __ATOMIC_ACQUIRE); + if (id) return id; + uint32_t fresh = __atomic_fetch_add(&scr_arr_ops_count, 1, __ATOMIC_RELAXED); + if (fresh < SCR_ARR_OPS_OVERFLOW) { + __atomic_store_n(&scr_arr_ops_table[fresh], ops, __ATOMIC_RELEASE); + } else { + fresh = SCR_ARR_OPS_OVERFLOW; + } + uint32_t expected = 0; + if (__atomic_compare_exchange_n(&ops->id, &expected, fresh, false, __ATOMIC_ACQ_REL, + __ATOMIC_ACQUIRE)) + return fresh; + return expected; +} + +const ScrArrOps *scr_arr_ops_overflow(const ScrArr *a) { return scr_arr_ext_of(a)->ops; } + +/* Record `ops` as the element ops of `a` (NULL for none). */ +static void scr_arr_set_ops(ScrArr *a, const ScrArrOps *ops) { + uint32_t id = scr_arr_ops_id(ops); + a->spare = (uint16_t)((a->spare & ((1u << SCR_ARR_OPS_SHIFT) - 1)) | (id << SCR_ARR_OPS_SHIFT)); + if (id == SCR_ARR_OPS_OVERFLOW) scr_arr_ext(a)->ops = ops; } /* Canonical array indices grow indexed storage and may leave holes. Negative, @@ -133,24 +219,36 @@ static bool scr_elem_is_ref(ScrElemKind k) { k == SCR_ELEM_REF; } -static void scr_elem_release(const ScrArr *a, uint64_t slot) { +/* Releases an element slot of kind `elem`, with element ops `ops` for + * SCR_ELEM_REF. An array's kind and ops never change, so loops look them up + * once (element releases may run teardown, which reloads anything read + * through the array). */ +static inline void scr_elem_release_with(uint8_t elem, const ScrArrOps *ops, uint64_t slot) { void *p = scr_slot_to_ptr(slot); if (!p) return; - if (a->elem == SCR_ELEM_STR) scr_str_release((ScrStr *)p); - else if (a->elem == SCR_ELEM_ARR) scr_arr_release((ScrArr *)p); - else if (a->elem == SCR_ELEM_BYTES) scr_bytes_release((ScrBytes *)p); - else if (a->elem == SCR_ELEM_REF) a->ops->release(p); + if (elem == SCR_ELEM_STR) scr_str_release((ScrStr *)p); + else if (elem == SCR_ELEM_ARR) scr_arr_release((ScrArr *)p); + else if (elem == SCR_ELEM_BYTES) scr_bytes_release((ScrBytes *)p); + else if (elem == SCR_ELEM_REF) ops->release(p); +} + +static inline uint64_t scr_elem_retain_with(uint8_t elem, const ScrArrOps *ops, uint64_t slot) { + if (!scr_elem_is_ref(elem)) return slot; + void *p = scr_slot_to_ptr(slot); + if (!p) return slot; + if (elem == SCR_ELEM_STR) p = scr_str_retain((ScrStr *)p); + else if (elem == SCR_ELEM_ARR) p = scr_arr_retain((ScrArr *)p); + else if (elem == SCR_ELEM_BYTES) p = scr_bytes_retain((ScrBytes *)p); + else p = ops->retain(p); + return scr_slot_from_ptr(p); +} + +static void scr_elem_release(const ScrArr *a, uint64_t slot) { + scr_elem_release_with(a->elem, scr_arr_ops(a), slot); } static uint64_t scr_elem_retain_slot(const ScrArr *a, uint64_t slot) { - if (!scr_elem_is_ref(a->elem)) return slot; - void *p = scr_slot_to_ptr(slot); - if (!p) return slot; - if (a->elem == SCR_ELEM_STR) p = scr_str_retain((ScrStr *)p); - else if (a->elem == SCR_ELEM_ARR) p = scr_arr_retain((ScrArr *)p); - else if (a->elem == SCR_ELEM_BYTES) p = scr_bytes_retain((ScrBytes *)p); - else p = a->ops->retain(p); - return scr_slot_from_ptr(p); + return scr_elem_retain_with(a->elem, scr_arr_ops(a), slot); } static uint64_t scr_arr_retain_state_slot(const ScrArr *a, uint64_t slot, @@ -310,7 +408,6 @@ static void scr_arr_sparse_drop_prefix(ScrArr *a, size_t count) { * `spare` records it. Growth past the inline capacity moves the slots to an * ordinary allocation; the inline room then stays unused until the array is * freed. */ -#define SCR_ARR_INLINE_SLOTS 1u /* Where inline slots start in the array's block (8-byte aligned on every * target). */ #define SCR_ARR_INLINE_OFFSET ((sizeof(ScrArr) + 7) & ~(size_t)7) @@ -329,11 +426,10 @@ static bool scr_arr_inline(const ScrArr *a) { return (a->spare & SCR_ARR_INLINE_ * slot just before `data` holds its size (scr_arr_head). Every reader * indexes from `data` and `cap` as before (emitted code included); only the * code that frees, reallocates or swaps the allocation needs its start. - * Static and inline storage never has head room. */ -#define SCR_ARR_HEAD_ROOM 2u -/* An unshift had to move every element: the next one that would have to - * move them again opens head room instead (scr_arr_open_head). */ -#define SCR_ARR_UNSHIFTED 4u + * Static and inline storage never has head room. SCR_ARR_UNSHIFTED in + * `spare` records that an unshift had to move every element, so the next + * one that would have to move them again opens head room instead + * (scr_arr_open_head). */ /* Arrays shorter than this keep moving their elements on unshift. */ #define SCR_ARR_HEAD_MIN ((size_t)16) @@ -351,8 +447,6 @@ static void scr_arr_set_head(ScrArr *a, size_t head) { a->spare |= SCR_ARR_HEAD_ROOM; } -/* The start of the dense allocation. */ -static void *scr_arr_block(const ScrArr *a) { return a->data - scr_arr_head(a); } /* Give the head room of an array back to its capacity: the populated dense * prefix and its states move to the start of the allocation. */ @@ -404,8 +498,8 @@ static bool scr_arr_drop_front(ScrArr *a, size_t count) { } /* Slots requested by the small constructions. The small allocator rounds - * them up to fill its block: 3 eight-byte slots after a plain header in an - * 80-byte block (88 after a collector header), or 8 booleans in a 64-byte + * them up to fill its block: 3 eight-byte slots after a plain header in a + * 64-byte block (72 after a collector header), or 4 booleans in a 40-byte * block. Most small arrays hold up to three elements; two slots make * arrays that grow past them move their storage often enough to slow * programs that build many short lists. */ @@ -497,8 +591,8 @@ static void scr_arr_grow_dense_slow(ScrArr *a, size_t need, ScrArrGrow mode); * paths pick the same capacity. */ static inline void scr_arr_grow_dense_to(ScrArr *a, size_t need, ScrArrGrow mode) { if (need <= a->cap) return; - if (a->elem == SCR_ELEM_BOOL || (a->spare & (SCR_ARR_INLINE_SLOTS | SCR_ARR_HEAD_ROOM)) || - (a->ext && a->ext->sparse_len) || need > SCR_ARR_DENSE_LIMIT) { + if (a->elem == SCR_ELEM_BOOL || (a->spare & (SCR_ARR_INLINE_SLOTS | SCR_ARR_HEAD_ROOM | SCR_ARR_HAS_EXT)) || + need > SCR_ARR_DENSE_LIMIT) { scr_arr_grow_dense_slow(a, need, mode); return; } @@ -524,6 +618,7 @@ static inline void scr_arr_grow_dense_to(ScrArr *a, size_t need, ScrArrGrow mode /* Sparse entries below a raised capacity move into the packed slots. */ static void scr_arr_absorb_sparse(ScrArr *a) { + if (!(a->spare & SCR_ARR_HAS_EXT)) return; size_t moved = scr_arr_sparse_lower_bound(SCR_AX(a)->sparse, SCR_AX(a)->sparse_len, a->cap); for (size_t i = 0; i < moved; i++) { scr_arr_dense_put(a, SCR_AX(a)->sparse[i].index, SCR_AX(a)->sparse[i].slot); @@ -585,8 +680,10 @@ static void scr_arr_grow_dense_slow(ScrArr *a, size_t need, ScrArrGrow mode) { /* Values and states share one allocation. Move the old states to its new * end before publishing the larger capacity: their previous location is * now part of the value area. */ - uint64_t *data = scr_mem_realloc(a->data, cap * unit); - if (!data) scr_arr_oom(); + size_t prefix = scr_arr_prefix(a); + char *start = scr_mem_realloc((char *)a->data - prefix, prefix + cap * unit); + if (!start) scr_arr_oom(); + uint64_t *data = (uint64_t *)(start + prefix); uint8_t *end = (uint8_t *)data + cap * (width + 1); if (a->cap) memmove(end - a->cap, (uint8_t *)data + a->cap * width, a->cap); memset(end - cap, SCR_ARR_HOLE, cap - a->cap); @@ -621,8 +718,12 @@ static bool scr_arr_open_head(ScrArr *a, size_t count) { size_t room = count + (len + count) / 2; if (room > SCR_ARR_MAX_LENGTH || a->cap > SIZE_MAX / SCR_ARR_SLOT_BYTES - room) return false; size_t total = room + a->cap; - uint64_t *block = scr_mem_alloc(total * SCR_ARR_SLOT_BYTES); - if (!block) scr_arr_oom(); + size_t prefix = scr_arr_prefix(a); + char *start = scr_mem_alloc(prefix + total * SCR_ARR_SLOT_BYTES); + if (!start) scr_arr_oom(); + /* The ext pointer's word moves with the allocation. */ + if (prefix) memcpy(start, scr_arr_alloc_start(a), prefix); + uint64_t *block = (uint64_t *)(start + prefix); /* The window's states end `room` bytes before the allocation does; the * room's states past it are holes. */ uint8_t *end = (uint8_t *)(block + total) + a->cap; @@ -630,7 +731,7 @@ static bool scr_arr_open_head(ScrArr *a, size_t count) { memset(end, SCR_ARR_HOLE, room); memcpy(end - len, scr_arr_state_run(a, 0, len), len); memset(end - a->cap, SCR_ARR_HOLE, a->cap - len); - scr_mem_free(scr_arr_block(a)); + scr_mem_free(scr_arr_alloc_start(a)); a->data = block + room; head = room; } @@ -700,21 +801,40 @@ static uint8_t scr_arr_state_at_storage(const ScrArrStorage *s, size_t index, return s->sparse[pos].state; } -static bool scr_arr_slot_at_storage(const ScrArrStorage *s, size_t index, - uint64_t *out) { - return scr_arr_state_at_storage(s, index, out) != SCR_ARR_HOLE; +/* A state and its slot (zero for a hole). */ +typedef struct { + uint64_t slot; + uint8_t state; +} ScrArrStateSlot; + +/* scr_arr_state_at past the dense capacity: the sorted sparse entries. It + * only reads memory, so callers keep the array's fields in registers across + * it. */ +static __attribute__((noinline, pure)) ScrArrStateSlot scr_arr_sparse_state_at(const ScrArr *a, + size_t index) { + const ScrArrExt *x = SCR_AX(a); + size_t pos = scr_arr_sparse_lower_bound(x->sparse, x->sparse_len, index); + if (pos == x->sparse_len || x->sparse[pos].index != index) return (ScrArrStateSlot){0, SCR_ARR_HOLE}; + return (ScrArrStateSlot){x->sparse[pos].slot, x->sparse[pos].state}; } -static bool scr_arr_slot_at(const ScrArr *a, size_t index, uint64_t *out) { - ScrArrStorage s = {a->data, scr_arr_states_end(a), a->cap, SCR_AX(a)->sparse, - SCR_AX(a)->sparse_len, SCR_AX(a)->sparse_cap, a->elem, NULL}; - return scr_arr_slot_at_storage(&s, index, out); +/* The state at `index` and, unless it is a hole, its slot in `out`: the + * dense storage below `cap` (without touching the out-of-line storage), the + * sparse entries above it. */ +static inline uint8_t scr_arr_state_at(const ScrArr *a, size_t index, uint64_t *out) { + if (index < a->cap) { + uint8_t state = *scr_arr_state_in(scr_arr_states_end(a), index); + if (state == SCR_ARR_HOLE) return SCR_ARR_HOLE; + if (out) *out = scr_arr_dense_get(a, index); + return state; + } + ScrArrStateSlot sparse = scr_arr_sparse_state_at(a, index); + if (sparse.state != SCR_ARR_HOLE && out) *out = sparse.slot; + return sparse.state; } -static uint8_t scr_arr_state_at(const ScrArr *a, size_t index, uint64_t *out) { - ScrArrStorage s = {a->data, scr_arr_states_end(a), a->cap, SCR_AX(a)->sparse, - SCR_AX(a)->sparse_len, SCR_AX(a)->sparse_cap, a->elem, NULL}; - return scr_arr_state_at_storage(&s, index, out); +static inline bool scr_arr_slot_at(const ScrArr *a, size_t index, uint64_t *out) { + return scr_arr_state_at(a, index, out) != SCR_ARR_HOLE; } /* Store an owned slot into an empty index. The caller has already established @@ -843,7 +963,7 @@ static void scr_arr_prop_set(ScrArr *a, double key, uint64_t slot) { char *copy = malloc(len + 1); if (!copy) scr_arr_oom(); memcpy(copy, text, len + 1); - a->ext->props[a->ext->prop_len++] = (ScrArrProp){copy, len, slot, SCR_ARR_VALUE}; + scr_arr_ext_of(a)->props[scr_arr_ext_of(a)->prop_len++] = (ScrArrProp){copy, len, slot, SCR_ARR_VALUE}; } static void scr_arr_prop_set_undefined(ScrArr *a, double key) { @@ -864,7 +984,7 @@ static void scr_arr_prop_set_undefined(ScrArr *a, double key) { char *copy = malloc(len + 1); if (!copy) scr_arr_oom(); memcpy(copy, text, len + 1); - a->ext->props[a->ext->prop_len++] = (ScrArrProp){copy, len, 0, SCR_ARR_UNDEFINED}; + scr_arr_ext_of(a)->props[scr_arr_ext_of(a)->prop_len++] = (ScrArrProp){copy, len, 0, SCR_ARR_UNDEFINED}; } static bool scr_arr_prop_delete(ScrArr *a, double key) { @@ -877,7 +997,7 @@ static bool scr_arr_prop_delete(ScrArr *a, double key) { free(SCR_AX(a)->props[pos].key); memmove(SCR_AX(a)->props + pos, SCR_AX(a)->props + pos + 1, (SCR_AX(a)->prop_len - pos - 1) * sizeof(*SCR_AX(a)->props)); - a->ext->prop_len--; + scr_arr_ext_of(a)->prop_len--; if (old_state == SCR_ARR_VALUE && scr_elem_is_ref(a->elem)) { scr_elem_release(a, old); } @@ -885,17 +1005,25 @@ static bool scr_arr_prop_delete(ScrArr *a, double key) { } static ScrArrStorage scr_arr_take_storage(ScrArr *a) { + ScrArrExt *x = scr_arr_ext_of(a); ScrArrStorage old = {a->data, scr_arr_states_end(a), a->cap, SCR_AX(a)->sparse, SCR_AX(a)->sparse_len, SCR_AX(a)->sparse_cap, a->elem, - scr_arr_inline(a) ? NULL : scr_arr_block(a)}; - a->spare &= (uint16_t)~(SCR_ARR_INLINE_SLOTS | SCR_ARR_HEAD_ROOM); + scr_arr_inline(a) ? NULL : scr_arr_alloc_start(a)}; + a->spare &= (uint16_t)~(SCR_ARR_INLINE_SLOTS | SCR_ARR_HEAD_ROOM | SCR_ARR_HAS_EXT); a->data = NULL; a->cap = 0; a->filled = 0; - if (a->ext) { - a->ext->sparse = NULL; - a->ext->sparse_len = 0; - a->ext->sparse_cap = 0; + if (x) { + /* The ext pointer's word left with the old allocation: the array keeps + * its ext in an allocation of the word alone. */ + char *start = scr_mem_alloc(SCR_ARR_EXT_PREFIX); + if (!start) scr_arr_oom(); + memcpy(start, &x, sizeof x); + a->data = (uint64_t *)(start + SCR_ARR_EXT_PREFIX); + a->spare |= SCR_ARR_HAS_EXT; + x->sparse = NULL; + x->sparse_len = 0; + x->sparse_cap = 0; } return old; } @@ -910,7 +1038,7 @@ static void scr_arr_free_storage(ScrArrStorage *s) { * operations move ownership with the slots and move the states alongside * them; they never inspect an uninitialized hole payload. */ static bool scr_arr_is_dense(const ScrArr *a) { - return a->len <= a->cap && SCR_AX(a)->sparse_len == 0; + return a->len <= a->cap && (!(a->spare & SCR_ARR_HAS_EXT) || scr_arr_ext_of(a)->sparse_len == 0); } static void scr_arr_move_dense(ScrArr *a, size_t to, size_t from, size_t count) { @@ -1025,9 +1153,11 @@ static void scr_arr_copy_dense(ScrArr *dst, size_t to, const ScrArr *src, } bool refs = scr_elem_is_ref(src->elem); if (!refs && !materialize_holes) return; + uint8_t elem = src->elem; + const ScrArrOps *ops = scr_arr_ops(src); for (size_t i = to; i < to + count; i++) { if (*scr_arr_state_in(dst_states, i) == SCR_ARR_VALUE) { - if (refs) dst->data[i] = scr_elem_retain_slot(src, dst->data[i]); + if (refs) dst->data[i] = scr_elem_retain_with(elem, ops, dst->data[i]); } else if (materialize_holes && *scr_arr_state_in(dst_states, i) == SCR_ARR_HOLE) { scr_arr_dense_put(dst, i, 0); *scr_arr_state_in(dst_states, i) = SCR_ARR_UNDEFINED; @@ -1060,9 +1190,7 @@ static inline __attribute__((always_inline)) ScrArr *scr_arr_make(ScrElemKind el a->cyc = 0; a->spare = 0; a->filled = 0; - a->ops = NULL; a->data = NULL; - a->ext = NULL; if (inline_cap) scr_arr_use_inline(a, inline_cap); else if (initial_cap > 0) scr_arr_grow_dense_to(a, initial_cap, SCR_ARR_GROW_EXACT); #ifdef SCR_RC_AUDIT @@ -1094,9 +1222,7 @@ ScrArr *scr_arr_new_inline(ScrElemKind elem, size_t cap) { a->cyc = 0; a->spare = 0; a->filled = 0; - a->ops = NULL; a->data = NULL; - a->ext = NULL; scr_arr_use_inline(a, cap); #ifdef SCR_RC_AUDIT scr_live_arrays++; @@ -1159,20 +1285,25 @@ void scr_arr_trace_v(void *a0, ScrTraceVisit visit, void *ctx) { } /* Frees the out-of-line storage; callers check for it first, since most - * arrays have none. */ + * arrays have none. The word that pointed at it stays in the dense + * allocation until that is freed. */ static void scr_arr_ext_free(ScrArr *a) { - ScrArrExt *x = a->ext; + ScrArrExt *x = scr_arr_ext_of(a); scr_arr_sparse_free(x->sparse); for (size_t i = 0; i < x->prop_len; i++) free(x->props[i].key); free(x->props); scr_mem_free(x); - a->ext = NULL; +} + +/* Frees the dense allocation and the out-of-line storage of a dying array. */ +static inline __attribute__((always_inline)) void scr_arr_free_parts(ScrArr *a) { + if (a->spare & SCR_ARR_HAS_EXT) scr_arr_ext_free(a); + if (!scr_arr_inline(a)) scr_mem_free(scr_arr_alloc_start(a)); } static void scr_arr_gc_free(void *a0) { ScrArr *a = (ScrArr *)a0; - if (!scr_arr_inline(a)) scr_mem_free(scr_arr_block(a)); - if (a->ext) scr_arr_ext_free(a); + scr_arr_free_parts(a); #ifdef SCR_RC_AUDIT scr_live_arrays--; #endif @@ -1199,9 +1330,8 @@ static ScrArr *scr_arr_make_ops(const ScrArrOps *ops, size_t initial_cap, bool s a->cyc = cyc; a->spare = 0; a->filled = 0; - a->ops = ops; a->data = NULL; - a->ext = NULL; + scr_arr_set_ops(a, ops); if (inline_cap) scr_arr_use_inline(a, inline_cap); else if (initial_cap > 0) scr_arr_grow_dense_to(a, initial_cap, SCR_ARR_GROW_EXACT); #ifdef SCR_RC_AUDIT @@ -1218,9 +1348,9 @@ ScrArr *scr_arr_new_ops_small(const ScrArrOps *ops) { return scr_arr_make_ops(op static void scr_arr_destroy(void *object) { ScrArr *a = object; - if (a->ext) { - scr_dyn_release(a->ext->metadata); - a->ext->metadata = NULL; + if (scr_arr_ext_of(a)) { + scr_dyn_release(scr_arr_ext_of(a)->metadata); + scr_arr_ext_of(a)->metadata = NULL; } if (scr_elem_is_ref(a->elem)) { size_t end = a->len < a->cap ? a->len : a->cap; @@ -1243,30 +1373,32 @@ static void scr_arr_destroy(void *object) { } } else { uint8_t *states = scr_arr_states_end(a); + uint8_t elem = a->elem; + const ScrArrOps *ops = scr_arr_ops(a); for (size_t i = 0; i < end; i++) { if (*scr_arr_state_in(states, i) != SCR_ARR_HOLE) { uint64_t old = a->data[i]; uint8_t state = *scr_arr_state_in(states, i); *scr_arr_state_in(states, i) = 0; a->data[i] = 0; - if (state == SCR_ARR_VALUE) scr_elem_release(a, old); + if (state == SCR_ARR_VALUE) scr_elem_release_with(elem, ops, old); } } } - if (a->ext) { - while (a->ext->sparse_len > 0) { - size_t i = a->ext->sparse_len - 1; - uint64_t old = a->ext->sparse[i].slot; - uint8_t state = a->ext->sparse[i].state; - a->ext->sparse_len = i; + if (scr_arr_ext_of(a)) { + while (scr_arr_ext_of(a)->sparse_len > 0) { + size_t i = scr_arr_ext_of(a)->sparse_len - 1; + uint64_t old = scr_arr_ext_of(a)->sparse[i].slot; + uint8_t state = scr_arr_ext_of(a)->sparse[i].state; + scr_arr_ext_of(a)->sparse_len = i; if (state == SCR_ARR_VALUE) scr_elem_release(a, old); } - while (a->ext->prop_len > 0) { - size_t i = a->ext->prop_len - 1; - uint64_t old = a->ext->props[i].slot; - uint8_t state = a->ext->props[i].state; - free(a->ext->props[i].key); - a->ext->prop_len = i; + while (scr_arr_ext_of(a)->prop_len > 0) { + size_t i = scr_arr_ext_of(a)->prop_len - 1; + uint64_t old = scr_arr_ext_of(a)->props[i].slot; + uint8_t state = scr_arr_ext_of(a)->props[i].state; + free(scr_arr_ext_of(a)->props[i].key); + scr_arr_ext_of(a)->prop_len = i; if (state == SCR_ARR_VALUE) scr_elem_release(a, old); } } @@ -1274,8 +1406,7 @@ static void scr_arr_destroy(void *object) { if (a->cyc) { scr_arr_gc_free(a); } else { - if (!scr_arr_inline(a)) scr_mem_free(scr_arr_block(a)); - if (a->ext) scr_arr_ext_free(a); + scr_arr_free_parts(a); #ifdef SCR_RC_AUDIT scr_live_arrays--; #endif @@ -1303,7 +1434,10 @@ bool scr_arr_has(const ScrArr *a, double i) { return scr_arr_slot_at(a, idx, NULL); } -double scr_arr_state(const ScrArr *a, double i) { +/* Emitted element reads call this on their cold path. It stays out of line + * so that, under link-time optimization, those reads stay small enough to + * inline where they are used. */ +__attribute__((noinline)) double scr_arr_state(const ScrArr *a, double i) { size_t idx; if (!scr_arr_valid_index(i, &idx)) { uint8_t state; @@ -1359,13 +1493,13 @@ void scr_arr_set_len(ScrArr *a, double length) { if (state == SCR_ARR_VALUE) scr_elem_release(a, old); } } - if (a->ext) { - size_t keep = scr_arr_sparse_lower_bound(a->ext->sparse, a->ext->sparse_len, next); - while (a->ext->sparse_len > keep) { - size_t i = a->ext->sparse_len - 1; - uint64_t old = a->ext->sparse[i].slot; - uint8_t state = a->ext->sparse[i].state; - a->ext->sparse_len = i; + if (scr_arr_ext_of(a)) { + size_t keep = scr_arr_sparse_lower_bound(scr_arr_ext_of(a)->sparse, scr_arr_ext_of(a)->sparse_len, next); + while (scr_arr_ext_of(a)->sparse_len > keep) { + size_t i = scr_arr_ext_of(a)->sparse_len - 1; + uint64_t old = scr_arr_ext_of(a)->sparse[i].slot; + uint8_t state = scr_arr_ext_of(a)->sparse[i].state; + scr_arr_ext_of(a)->sparse_len = i; if (state == SCR_ARR_VALUE) scr_elem_release(a, old); } } @@ -1375,7 +1509,7 @@ void scr_arr_set_len(ScrArr *a, double length) { memset(scr_arr_dense_at(a, dense_stop), 0, (dense_end - dense_stop) * scr_arr_slot_width(a)); } - if (a->ext) a->ext->sparse_len = scr_arr_sparse_lower_bound(a->ext->sparse, a->ext->sparse_len, next); + if (scr_arr_ext_of(a)) scr_arr_ext_of(a)->sparse_len = scr_arr_sparse_lower_bound(scr_arr_ext_of(a)->sparse, scr_arr_ext_of(a)->sparse_len, next); } } a->len = next; @@ -1709,7 +1843,7 @@ void *scr_arr_get_ref(ScrArr *a, double i) { if (!p) return NULL; if (a->elem == SCR_ELEM_STR) scr_str_retain((ScrStr *)p); else if (a->elem == SCR_ELEM_BYTES) scr_bytes_retain((ScrBytes *)p); - else if (a->elem == SCR_ELEM_REF) p = a->ops->retain(p); + else if (a->elem == SCR_ELEM_REF) p = scr_arr_ops(a)->retain(p); else scr_arr_retain((ScrArr *)p); return p; } @@ -2193,7 +2327,7 @@ ScrArr *scr_arr_splice(ScrArr *a, double start, double deleteCount) { size_t hint = scr_arr_is_dense(a) || n <= SCR_ARR_DENSE_LIMIT ? n : SCR_ARR_DENSE_LIMIT; ScrArr *out = a->elem == SCR_ELEM_REF - ? scr_arr_new_ops(a->ops, hint ? hint : 1) + ? scr_arr_new_ops(scr_arr_ops(a), hint ? hint : 1) : scr_arr_new(a->elem, hint ? hint : 1); out->len = n; size_t old_len = a->len; @@ -2273,7 +2407,7 @@ ScrArr *scr_arr_splice_insert(ScrArr *a, double start, double deleteCount, ScrArr *snapshot = items == a ? scr_arr_slice(a, 0, INFINITY) : NULL; if (snapshot) items = snapshot; ScrArr *removed = a->elem == SCR_ELEM_REF - ? scr_arr_new_ops(a->ops, n) + ? scr_arr_new_ops(scr_arr_ops(a), n) : scr_arr_new(a->elem, n); if (n) { memcpy(removed->data, scr_arr_dense_at(a, from), n * scr_arr_slot_width(a)); @@ -2319,7 +2453,7 @@ void scr_arr_splice_drop(ScrArr *a, double start, double deleteCount, size_t cou bool refs = scr_elem_is_ref(a->elem); if (!scr_arr_is_dense(a) || !scr_arr_dense_ok(a, next_len, count)) { ScrArr *items = a->elem == SCR_ELEM_REF - ? scr_arr_new_ops(a->ops, count) + ? scr_arr_new_ops(scr_arr_ops(a), count) : scr_arr_new(a->elem, count); scr_arr_push_many(items, count, slots); scr_arr_release(scr_arr_splice_insert(a, start, deleteCount, items)); @@ -2400,10 +2534,10 @@ ScrArr *scr_arr_flat_copy(const ScrArr *a, ScrArr *out, bool flatten) { static bool scr_arr_ref_eq(const ScrArr *a, uint64_t slot, void *v) { void *p = scr_slot_to_ptr(slot); if (a->elem == SCR_ELEM_STR) return scr_str_eq((ScrStr *)p, (ScrStr *)v); - if (a->elem == SCR_ELEM_REF && a->ops->retain == scr_dyn_retain_v) { + if (a->elem == SCR_ELEM_REF && scr_arr_ops(a)->retain == scr_dyn_retain_v) { return scr_dyn_strict_eq((ScrDyn *)p, (ScrDyn *)v); } - if (a->elem == SCR_ELEM_REF && a->ops->retain == scr_closure_retain_v) + if (a->elem == SCR_ELEM_REF && scr_arr_ops(a)->retain == scr_closure_retain_v) return scr_closure_identity_equal((ScrClosure *)p, (ScrClosure *)v); return p == v; } @@ -2461,7 +2595,7 @@ bool scr_arr_includes_bool(ScrArr *a, bool v) { } bool scr_arr_includes_ref(ScrArr *a, void *v) { - if (a->elem == SCR_ELEM_REF && a->ops->retain == scr_dyn_retain_v) { + if (a->elem == SCR_ELEM_REF && scr_arr_ops(a)->retain == scr_dyn_retain_v) { const ScrDyn *needle = (const ScrDyn *)v; if (needle->kind == SCR_DYN_NUM && needle->v.num != needle->v.num) { const uint8_t *states = scr_arr_states_end(a); @@ -2525,7 +2659,7 @@ ScrArr *scr_arr_slice(ScrArr *a, double start, double end) { size_t hint = to <= a->cap || n <= SCR_ARR_DENSE_LIMIT ? n : SCR_ARR_DENSE_LIMIT; ScrArr *out = a->elem == SCR_ELEM_REF - ? scr_arr_new_ops(a->ops, hint ? hint : 1) + ? scr_arr_new_ops(scr_arr_ops(a), hint ? hint : 1) : scr_arr_new(a->elem, hint ? hint : 1); out->len = n; if (to <= a->cap && to <= a->filled && a->elem != SCR_ELEM_BOOL && !scr_elem_is_ref(a->elem)) { @@ -2828,7 +2962,7 @@ static ScrSortCompare scr_sort_compare_for(const ScrArr *a, ScrClosure *f, uint3 if (a->elem == SCR_ELEM_STR) c.retain = scr_sort_retain_str; else if (a->elem == SCR_ELEM_ARR) c.retain = scr_sort_retain_arr; else if (a->elem == SCR_ELEM_BYTES) c.retain = scr_sort_retain_bytes; - else if (a->elem == SCR_ELEM_REF) c.retain = a->ops->retain; + else if (a->elem == SCR_ELEM_REF) c.retain = scr_arr_ops(a)->retain; else scr_trap("scriptc: invalid comparator sort element kind\n"); } return c; @@ -4441,6 +4575,8 @@ const uint64_t *scr_arr_dense_slots(const ScrArr *a, size_t *len) { * slots of `a` in place. */ bool scr_arr_sort_dense(ScrArr *a, ScrClosure *f, uint32_t arity, bool owned, int32_t order, ScrClosure *key) { + uint8_t elem = a->elem; + const ScrArrOps *ops = scr_arr_ops(a); if (a->rc == SIZE_MAX || !scr_arr_dense_values(a)) return false; size_t n = a->len; if (n < 2) return true; @@ -4459,10 +4595,10 @@ bool scr_arr_sort_dense(ScrArr *a, ScrClosure *f, uint32_t arity, bool owned, in if (!src) scr_arr_oom(); memcpy(src, a->data, n * sizeof(*src)); if (retained) - for (size_t i = 0; i < n; i++) src[i] = scr_elem_retain_slot(a, src[i]); + for (size_t i = 0; i < n; i++) src[i] = scr_elem_retain_with(elem, ops, src[i]); if (!scr_sort_slots(src, n, &c, true)) { if (retained) - for (size_t i = 0; i < n; i++) scr_elem_release(a, src[i]); + for (size_t i = 0; i < n; i++) scr_elem_release_with(elem, ops, src[i]); free(src); return true; } @@ -4470,7 +4606,7 @@ bool scr_arr_sort_dense(ScrArr *a, ScrClosure *f, uint32_t arity, bool owned, in /* The comparator published the array: the first write fails as in Node * (scr_throw_published_array's index write). */ if (retained) - for (size_t i = 0; i < n; i++) scr_elem_release(a, src[i]); + for (size_t i = 0; i < n; i++) scr_elem_release_with(elem, ops, src[i]); static const char assign[] = "Cannot assign to read only property '0' of object '[object Array]'"; static const char add[] = "Cannot add property 0, object is not extensible"; if (a->len > 0) scr_throw_error_msg(SCR_ERR_TYPE, assign, sizeof assign - 1); diff --git a/packages/runtime/src/scr_array.h b/packages/runtime/src/scr_array.h index 1678d1568..95ee7ce00 100644 --- a/packages/runtime/src/scr_array.h +++ b/packages/runtime/src/scr_array.h @@ -60,6 +60,9 @@ typedef struct ScrArrOps { void *(*retain)(void *); void (*release)(void *); ScrTraceFn trace; + /* Registry id (scr_arr_ops_table), 0 until scr_arr_ops_register assigns + * it on the first array of the type. Descriptors are writable for it. */ + uint32_t id; } ScrArrOps; typedef struct ScrArr { @@ -78,7 +81,10 @@ typedef struct ScrArr { * ref elements and the historic element kinds keep the lean 1-word * header. Kept beside `elem` so the RC fast paths test it with one load. */ uint8_t cyc; - /* Storage flags private to scr_array.c (inline slots, head room). */ + /* The low SCR_ARR_OPS_SHIFT bits: storage flags (SCR_ARR_INLINE_SLOTS, + * SCR_ARR_HEAD_ROOM, SCR_ARR_UNSHIFTED, SCR_ARR_HAS_EXT). The rest: the + * registry id of the element type's ops (scr_arr_ops), 0 for every kind + * but SCR_ELEM_REF. */ uint16_t spare; /* A lower bound on the hole-free prefix: filled <= len, filled <= cap, * and every dense state below it is SCR_ARR_VALUE. Element reads below @@ -87,17 +93,15 @@ typedef struct ScrArr { * undefined) or move states below it lowers it first (scr_arr_cut); * 0 is always valid. */ uint32_t filled; - /* SCR_ELEM_REF only; NULL for every other element kind. */ - const ScrArrOps *ops; /* Dense values: `cap` 8-byte slots, or `cap` bytes for SCR_ELEM_BOOL * (scr_arr_slot_width), followed in the same allocation by one state byte * per slot in reverse slot order (scr_arr_states_end). Sparse entries and properties keep 8-byte - * slots for every kind; a bool slot is 0 or 1 wherever it lives. */ + * slots for every kind; a bool slot is 0 or 1 wherever it lives. Rarely + * used storage (sparse indices, noncanonical numeric properties, + * match-result metadata) lives out of line, and an array that has it + * (SCR_ARR_HAS_EXT) keeps a pointer to it in the word before the dense + * allocation (scr_arr_ext_of). */ uint64_t *data; - /* Rarely used storage (sparse indices, noncanonical numeric properties, - * match-result metadata) lives out of line: NULL until first needed, so - * the common dense array stays small. */ - struct ScrArrExt *ext; } ScrArr; typedef struct ScrArrExt { @@ -113,11 +117,14 @@ typedef struct ScrArrExt { * scr_regex.c), and match_index is the result's UTF-16 start index. */ struct ScrDyn *metadata; double match_index; + /* The element ops of an array whose ops have no registry id + * (SCR_ARR_OPS_OVERFLOW). */ + const ScrArrOps *ops; } ScrArrExt; /* The LLVM backend mirrors ScrArr as %ScrArr: its inline retain/release read * `cyc` (field 4, i8) to decide mark-live / candidate buffering exactly like * scr_arr_retain and scr_arr_release; its inline element access uses len and - * cap (fields 1 and 2, i32), filled (field 6, i32) and data (field 8), and + * cap (fields 1 and 2, i32), filled (field 6, i32) and data (field 7), and * finds the state of slot i at data + cap * (slot width + 1) - 1 - i. */ _Static_assert(offsetof(ScrArr, len) == sizeof(size_t) && sizeof(((ScrArr *)0)->len) == 4, "emitted length reads load ScrArr.len as %ScrArr field 1, an i32"); @@ -127,10 +134,68 @@ _Static_assert(offsetof(ScrArr, cyc) == sizeof(size_t) + 9, "inline RC fast paths read ScrArr.cyc as %ScrArr field 4"); _Static_assert(offsetof(ScrArr, filled) == sizeof(size_t) + 12, "inline element access reads ScrArr.filled as %ScrArr field 6"); -_Static_assert(offsetof(ScrArr, data) == sizeof(size_t) + 16 + sizeof(void *), - "inline element reads use ScrArr.data as %ScrArr field 8"); -_Static_assert(sizeof(ScrArr) == sizeof(size_t) + 16 + 3 * sizeof(void *), - "ScrArr is 48 bytes on 64-bit targets"); +_Static_assert(offsetof(ScrArr, data) == sizeof(size_t) + 16, + "inline element reads use ScrArr.data as %ScrArr field 7"); +_Static_assert(sizeof(ScrArr) == sizeof(size_t) + 16 + sizeof(void *), + "ScrArr is 32 bytes on 64-bit targets"); + +/* Storage flags in `spare`. Inline slots: the dense slots live in the + * array's own block, after the header. Head room: `data` has advanced past + * vacated slots of its allocation, and the slot before `data` holds their + * count. Unshifted: an unshift had to move every element. Has ext: the word + * before the dense allocation (head room included) points at the array's + * ScrArrExt; such an array always has an allocation of its own, without + * inline slots. */ +#define SCR_ARR_INLINE_SLOTS 1u +#define SCR_ARR_HEAD_ROOM 2u +#define SCR_ARR_UNSHIFTED 4u +#define SCR_ARR_HAS_EXT 8u + +/* The start of the dense slots' allocation: `data` less any head room. */ +static inline uint64_t *scr_arr_block(const ScrArr *a) { + return (a->spare & SCR_ARR_HEAD_ROOM) ? a->data - (size_t)a->data[-1] : a->data; +} + +/* Bytes before the dense allocation of an array with out-of-line storage: + * its pointer, in a word that keeps the 8-byte slots aligned on every + * target. */ +#define SCR_ARR_EXT_PREFIX sizeof(uint64_t) + +/* The out-of-line storage of `a`, or NULL while it has none. */ +static inline struct ScrArrExt *scr_arr_ext_of(const ScrArr *a) { + if (!(a->spare & SCR_ARR_HAS_EXT)) return NULL; + struct ScrArrExt *x; + memcpy(&x, (const char *)scr_arr_block(a) - SCR_ARR_EXT_PREFIX, sizeof x); + return x; +} + +/* Element ops by registry id: `spare >> SCR_ARR_OPS_SHIFT` of an array. + * Id 0 is no ops; ids are assigned on each descriptor's first array, in + * any thread. A program with more element types than the field holds keeps + * the ops of the rest in the array's ext (SCR_ARR_OPS_OVERFLOW). */ +#define SCR_ARR_OPS_SHIFT 4 +#define SCR_ARR_OPS_OVERFLOW (UINT16_MAX >> SCR_ARR_OPS_SHIFT) +extern const ScrArrOps *scr_arr_ops_table[SCR_ARR_OPS_OVERFLOW]; +/* Assigns the id on a descriptor's first array; out of line, so the id + * load in scr_arr_ops_id stays the only cost on later arrays. */ +__attribute__((cold, noinline)) uint32_t scr_arr_ops_register(ScrArrOps *ops); + +/* The registry id an array of element ops `ops` stores (0 for NULL). */ +static inline uint32_t scr_arr_ops_id(const ScrArrOps *ops) { + if (!ops) return 0; + uint32_t id = __atomic_load_n(&ops->id, __ATOMIC_ACQUIRE); + return id ? id : scr_arr_ops_register((ScrArrOps *)ops); +} + +/* The element ops of an array whose ops have no registry id. */ +const ScrArrOps *scr_arr_ops_overflow(const ScrArr *a); + +/* The element ops of `a`: NULL for every kind but SCR_ELEM_REF. */ +static inline const ScrArrOps *scr_arr_ops(const ScrArr *a) { + uint32_t id = (uint32_t)a->spare >> SCR_ARR_OPS_SHIFT; + if (__builtin_expect(id == SCR_ARR_OPS_OVERFLOW, 0)) return scr_arr_ops_overflow(a); + return scr_arr_ops_table[id]; +} /* Bytes per dense value slot. */ static inline size_t scr_arr_slot_width(const ScrArr *a) { diff --git a/packages/runtime/src/scr_async_dyn.c b/packages/runtime/src/scr_async_dyn.c index ec4dad794..a6cd813de 100644 --- a/packages/runtime/src/scr_async_dyn.c +++ b/packages/runtime/src/scr_async_dyn.c @@ -1274,7 +1274,7 @@ static void scr_dyn_all_result(ScrPromise *destination, ScrPromise *source) { scr_promise_fulfill_ref(destination, result, scr_dyn_retain_v, scr_dyn_release_v, scr_dyn_trace_v); } -static const ScrArrOps scr_dyn_arr_ops = { scr_dyn_retain_v, scr_dyn_release_v, scr_dyn_trace_v }; +static ScrArrOps scr_dyn_arr_ops = { scr_dyn_retain_v, scr_dyn_release_v, scr_dyn_trace_v }; /* ── Thenable adoption (PromiseResolve over a checked-dynamic value) ── * A non-promise object whose `then` is callable resolves through diff --git a/packages/runtime/src/scr_bytes_io.c b/packages/runtime/src/scr_bytes_io.c index eb3661fc6..5532d96da 100644 --- a/packages/runtime/src/scr_bytes_io.c +++ b/packages/runtime/src/scr_bytes_io.c @@ -6,8 +6,8 @@ * exact source lists). */ #include "scr_runtime.h" -static const ScrArrOps scr_bytes_io_str_ops = { scr_str_retain_v, scr_str_release_v, NULL }; -static const ScrArrOps scr_bytes_io_bytes_ops = { scr_bytes_retain_v, scr_bytes_release_v, NULL }; +static ScrArrOps scr_bytes_io_str_ops = { scr_str_retain_v, scr_str_release_v, NULL }; +static ScrArrOps scr_bytes_io_bytes_ops = { scr_bytes_retain_v, scr_bytes_release_v, NULL }; #include #include diff --git a/packages/runtime/src/scr_copying.c b/packages/runtime/src/scr_copying.c index 6864a6262..df4da1738 100644 --- a/packages/runtime/src/scr_copying.c +++ b/packages/runtime/src/scr_copying.c @@ -23,7 +23,7 @@ static bool copying_elem_is_ref(ScrElemKind kind) { static ScrArr *copying_arr_new_like(const ScrArr *a, size_t cap) { ScrArr *out = a->elem == SCR_ELEM_REF - ? scr_arr_new_ops(a->ops, cap ? cap : 1) + ? scr_arr_new_ops(scr_arr_ops(a), cap ? cap : 1) : scr_arr_new(a->elem, cap ? cap : 1); out->len = cap; return out; @@ -35,7 +35,7 @@ static uint64_t copying_arr_retain_slot(const ScrArr *a, uint64_t slot) { if (a->elem == SCR_ELEM_STR) p = scr_str_retain((ScrStr *)p); else if (a->elem == SCR_ELEM_ARR) p = scr_arr_retain((ScrArr *)p); else if (a->elem == SCR_ELEM_BYTES) p = scr_bytes_retain((ScrBytes *)p); - else p = a->ops->retain(p); + else p = scr_arr_ops(a)->retain(p); return copying_slot_from_ptr(p); } diff --git a/packages/runtime/src/scr_cycle.c b/packages/runtime/src/scr_cycle.c index ce4dfa5fa..682f8bfcd 100644 --- a/packages/runtime/src/scr_cycle.c +++ b/packages/runtime/src/scr_cycle.c @@ -1239,7 +1239,7 @@ void scr_cyc_on_release(void *obj) { * cycle-capable array and through the type's trace otherwise. */ #define SCR_CYC_CHILDREN(obj, type, ARRAY_WALK, VISIT, depth) \ do { \ - if ((type)->kind == SCR_CYC_KIND_ARRAY && ((const ScrArr *)(obj))->ext == NULL) \ + if ((type)->kind == SCR_CYC_KIND_ARRAY && !(((const ScrArr *)(obj))->spare & SCR_ARR_HAS_EXT)) \ ARRAY_WALK((const ScrArr *)(obj), (void *)(depth)); \ else \ (type)->trace((obj), (VISIT), (void *)(depth)); \ diff --git a/packages/runtime/src/scr_events_emitter.c b/packages/runtime/src/scr_events_emitter.c index c11b7897d..901e2d114 100644 --- a/packages/runtime/src/scr_events_emitter.c +++ b/packages/runtime/src/scr_events_emitter.c @@ -1352,7 +1352,7 @@ ScrArr *scr_emitter_event_names(ScrEmitter *em) { * The once wrapper is runtime-internal here, so BOTH forms answer the * original listeners (SEMANTICS.md documents the rawListeners * divergence). */ -static const ScrArrOps scr_ee_closure_arr_ops = { &scr_closure_retain_v, &scr_closure_release_v, +static ScrArrOps scr_ee_closure_arr_ops = { &scr_closure_retain_v, &scr_closure_release_v, &scr_closure_trace_v }; ScrArr *scr_emitter_listeners(ScrEmitter *em, ScrStr *name) { diff --git a/packages/runtime/src/scr_itable.c b/packages/runtime/src/scr_itable.c index 7b5202b81..a333aab95 100644 --- a/packages/runtime/src/scr_itable.c +++ b/packages/runtime/src/scr_itable.c @@ -474,11 +474,11 @@ static ScrArrState scr_itable_element(ScrITableElements *w, size_t i, uint64_t * *slot = a->data[i]; return (ScrArrState)*scr_arr_state_ptr(a, i); } - if (a->ext) { - while (w->sparse < a->ext->sparse_len && a->ext->sparse[w->sparse].index < i) w->sparse++; - if (w->sparse < a->ext->sparse_len && a->ext->sparse[w->sparse].index == i) { - *slot = a->ext->sparse[w->sparse].slot; - return (ScrArrState)a->ext->sparse[w->sparse].state; + if (scr_arr_ext_of(a)) { + while (w->sparse < scr_arr_ext_of(a)->sparse_len && scr_arr_ext_of(a)->sparse[w->sparse].index < i) w->sparse++; + if (w->sparse < scr_arr_ext_of(a)->sparse_len && scr_arr_ext_of(a)->sparse[w->sparse].index == i) { + *slot = scr_arr_ext_of(a)->sparse[w->sparse].slot; + return (ScrArrState)scr_arr_ext_of(a)->sparse[w->sparse].state; } } return SCR_ARR_HOLE; diff --git a/packages/runtime/src/scr_json.c b/packages/runtime/src/scr_json.c index d18ce85e4..adcc96560 100644 --- a/packages/runtime/src/scr_json.c +++ b/packages/runtime/src/scr_json.c @@ -12445,7 +12445,7 @@ ScrDynEntryPairs *scr_dyn_obj_entry_pairs(const ScrDyn *v) { void scr_dyn_entry_pairs_free(ScrDynEntryPairs *pairs) { free(pairs); } -static const ScrArrOps scr_dyn_value_list_ops = {scr_dyn_retain_v, scr_dyn_release_v, scr_dyn_trace_v}; +static ScrArrOps scr_dyn_value_list_ops = {scr_dyn_retain_v, scr_dyn_release_v, scr_dyn_trace_v}; /* A native array of `count` owned dyn values, moved in with one dense push. * Frees `values` unless it is `stack`. */ diff --git a/packages/runtime/src/scr_json.test.c b/packages/runtime/src/scr_json.test.c index 3946331be..736eca540 100644 --- a/packages/runtime/src/scr_json.test.c +++ b/packages/runtime/src/scr_json.test.c @@ -520,7 +520,7 @@ static void test_item_release(void *ptr) { static ScrArr *test_tags_new(size_t cap) { return scr_arr_new(SCR_ELEM_STR, cap); } static ScrArr *test_list_new(size_t cap) { - static const ScrArrOps item_ops = { test_item_retain, test_item_release, NULL }; + static ScrArrOps item_ops = { test_item_retain, test_item_release, NULL }; return scr_arr_new_ops(&item_ops, cap); } static void test_arr_release(void *ptr) { scr_arr_release(ptr); } diff --git a/packages/runtime/src/scr_lib.c b/packages/runtime/src/scr_lib.c index db0926690..3441e6142 100644 --- a/packages/runtime/src/scr_lib.c +++ b/packages/runtime/src/scr_lib.c @@ -5788,7 +5788,7 @@ void scr_fs_symlink(ScrStr *target, ScrStr *destination, int kind) { if (!scr_fs_path_ok(target, "target")) return; if (!scr_fs_path_ok(destination, "path")) return; #ifdef _WIN32 - static const ScrArrOps str_ops = { scr_str_retain_v, scr_str_release_v, NULL }; + static ScrArrOps str_ops = { scr_str_retain_v, scr_str_release_v, NULL }; ScrArr *parts = scr_arr_new_ops(&str_ops, 3); scr_arr_push_ref(parts, scr_str_retain(destination)); scr_arr_push_ref(parts, scr_str_new("..", 2)); diff --git a/packages/runtime/src/scr_map.c b/packages/runtime/src/scr_map.c index 5d4935ed0..99caa31a8 100644 --- a/packages/runtime/src/scr_map.c +++ b/packages/runtime/src/scr_map.c @@ -1558,7 +1558,7 @@ void scr_map_values_into(ScrMap *set, const ScrMap *source, bool checked) { } ScrArr *scr_set_to_arr_dyn(const ScrMap *map) { - static const ScrArrOps dyn_ops = { scr_dyn_retain_v, scr_dyn_release_v, scr_dyn_trace_v }; + static ScrArrOps dyn_ops = { scr_dyn_retain_v, scr_dyn_release_v, scr_dyn_trace_v }; ScrArr *out = scr_arr_new_ops(&dyn_ops, map->nlive); for (size_t i = 0; i < map->nentries; i++) { if (scr_map_iter_live(map, (double)i)) scr_arr_push_ref(out, scr_map_dyn_key(map, (double)i)); diff --git a/packages/runtime/src/scr_publish.c b/packages/runtime/src/scr_publish.c index 025e13a51..675a13ca9 100644 --- a/packages/runtime/src/scr_publish.c +++ b/packages/runtime/src/scr_publish.c @@ -201,7 +201,7 @@ static void scr_pub_slot(ScrPub *ctx, uint64_t slot, ScrPubFn fn) { void scr_pub_arr(void *v, ScrPub *ctx, ScrPubFn elem) { ScrArr *a = v; - if (a->ext && (a->ext->props || a->ext->metadata)) { + if (scr_arr_ext_of(a) && (scr_arr_ext_of(a)->props || scr_arr_ext_of(a)->metadata)) { scr_pub_refuse(ctx, "Cannot publish an array with non-index properties"); return; } @@ -212,9 +212,9 @@ void scr_pub_arr(void *v, ScrPub *ctx, ScrPubFn elem) { const uint8_t *states = scr_arr_states_end(a); for (size_t i = 0; i < dense; i++) if (!states || *scr_arr_state_in(states, i)) scr_pub_slot(ctx, a->data[i], fn); - if (a->ext) - for (size_t i = 0; i < a->ext->sparse_len; i++) - if (a->ext->sparse[i].state) scr_pub_slot(ctx, a->ext->sparse[i].slot, fn); + if (scr_arr_ext_of(a)) + for (size_t i = 0; i < scr_arr_ext_of(a)->sparse_len; i++) + if (scr_arr_ext_of(a)->sparse[i].state) scr_pub_slot(ctx, scr_arr_ext_of(a)->sparse[i].slot, fn); } /* publish() of a scalar Node.js refuses (a Date): nothing to walk. */ diff --git a/packages/runtime/src/scr_regex.c b/packages/runtime/src/scr_regex.c index 73440c110..b62cba896 100644 --- a/packages/runtime/src/scr_regex.c +++ b/packages/runtime/src/scr_regex.c @@ -667,7 +667,7 @@ static void scr_regex_defer_metadata(ScrArr *row, ScrDyn *source, int index) { /* The pending match source of a result, or NULL once its metadata exists. */ static ScrRegexMatchSource *scr_regex_pending(const ScrArr *a) { - const ScrDyn *metadata = a->ext ? a->ext->metadata : NULL; + const ScrDyn *metadata = scr_arr_ext_of(a) ? scr_arr_ext_of(a)->metadata : NULL; if (!metadata || metadata->kind != SCR_DYN_HANDLE || metadata->v.handle.tag != SCR_DYNH_MATCH_SOURCE) return NULL; return metadata->v.handle.ptr; @@ -707,7 +707,7 @@ static ScrDyn *scr_regex_groups_of(const ScrArr *a, uint8_t *bc) { static void scr_regex_materialize_metadata(ScrArr *a) { ScrRegexMatchSource *src = scr_regex_pending(a); if (!src) return; - ScrArrExt *x = a->ext; + ScrArrExt *x = scr_arr_ext_of(a); ScrDyn *source = x->metadata; ScrDyn *props = scr_dyn_new_obj(); scr_dyn_obj_set(props, "index", 5, scr_dyn_new_num(x->match_index)); @@ -724,7 +724,7 @@ static bool scr_regex_copy_pending_metadata(ScrArr *a, ScrDyn *target) { scr_regex_materialize_metadata(a); return false; } - scr_dyn_arr_named_put(target, "index", 5, scr_dyn_new_num(a->ext->match_index)); + scr_dyn_arr_named_put(target, "index", 5, scr_dyn_new_num(scr_arr_ext_of(a)->match_index)); scr_dyn_arr_named_put(target, "input", 5, scr_regex_source_input(src)); scr_dyn_arr_named_put(target, "groups", 6, scr_regex_groups_of(a, scr_regex_bc(src->re))); return true; @@ -734,11 +734,11 @@ ScrDyn *scr_regex_result_prop(ScrArr *a, ScrStr *key) { ScrRegexMatchSource *src = scr_regex_pending(a); if (src) { if (key->len == 5 && memcmp(key->data, "index", 5) == 0) - return scr_dyn_new_num(a->ext->match_index); + return scr_dyn_new_num(scr_arr_ext_of(a)->match_index); if (key->len == 5 && memcmp(key->data, "input", 5) == 0) return scr_regex_source_input(src); scr_regex_materialize_metadata(a); } - ScrDyn *metadata = a->ext ? a->ext->metadata : NULL; + ScrDyn *metadata = scr_arr_ext_of(a) ? scr_arr_ext_of(a)->metadata : NULL; ScrDyn *value = metadata ? scr_dyn_obj_get(metadata, key->data, key->len) : NULL; return scr_dyn_retain(value ? value : scr_dyn_undefined()); } diff --git a/packages/runtime/src/scr_region.c b/packages/runtime/src/scr_region.c index 3a7dad541..dbd74f3ac 100644 --- a/packages/runtime/src/scr_region.c +++ b/packages/runtime/src/scr_region.c @@ -803,17 +803,17 @@ static void *scr_rgn_slot_ptr(uint64_t slot) { static void scr_rgn_walk_arr(ScrRgnWalk *w, ScrArr *a) { if (a->elem != SCR_ELEM_REF && a->elem != SCR_ELEM_ARR) return; ScrRgnSlotKind k = a->elem == SCR_ELEM_ARR ? (ScrRgnSlotKind){SCR_RGN_W_ARR, NULL} - : scr_rgn_slot_kind(a->ops ? a->ops->release : NULL); + : scr_rgn_slot_kind(scr_arr_ops(a) ? scr_arr_ops(a)->release : NULL); size_t dense = a->len < a->cap ? a->len : a->cap; const uint8_t *states = scr_arr_states_end(a); for (size_t i = 0; i < dense; i++) if (!states || *scr_arr_state_in(states, i) == SCR_ARR_VALUE) scr_rgn_slot_as(w, scr_rgn_slot_ptr(a->data[i]), k); - if (!a->ext) return; - for (size_t i = 0; i < a->ext->sparse_len; i++) - if (a->ext->sparse[i].state == SCR_ARR_VALUE) scr_rgn_slot_as(w, scr_rgn_slot_ptr(a->ext->sparse[i].slot), k); - for (size_t i = 0; i < a->ext->prop_len; i++) - if (a->ext->props[i].state == SCR_ARR_VALUE) scr_rgn_slot_as(w, scr_rgn_slot_ptr(a->ext->props[i].slot), k); - scr_rgn_enter(w, a->ext->metadata, SCR_RGN_W_DYN, NULL); + if (!scr_arr_ext_of(a)) return; + for (size_t i = 0; i < scr_arr_ext_of(a)->sparse_len; i++) + if (scr_arr_ext_of(a)->sparse[i].state == SCR_ARR_VALUE) scr_rgn_slot_as(w, scr_rgn_slot_ptr(scr_arr_ext_of(a)->sparse[i].slot), k); + for (size_t i = 0; i < scr_arr_ext_of(a)->prop_len; i++) + if (scr_arr_ext_of(a)->props[i].state == SCR_ARR_VALUE) scr_rgn_slot_as(w, scr_rgn_slot_ptr(scr_arr_ext_of(a)->props[i].slot), k); + scr_rgn_enter(w, scr_arr_ext_of(a)->metadata, SCR_RGN_W_DYN, NULL); } static void scr_rgn_walk_map(ScrRgnWalk *w, ScrMap *m) { diff --git a/packages/runtime/src/scr_region.test.c b/packages/runtime/src/scr_region.test.c index 31e98942a..ad1f92518 100644 --- a/packages/runtime/src/scr_region.test.c +++ b/packages/runtime/src/scr_region.test.c @@ -61,7 +61,7 @@ static void node_release(void *o) { if (c) c->count--; } -static const ScrArrOps node_ops = {node_retain, node_release, NULL}; +static ScrArrOps node_ops = {node_retain, node_release, NULL}; /* ── the "emitted" ordinary class (acyclic, plain heap block) ────────── */ diff --git a/packages/runtime/src/scr_stream.c b/packages/runtime/src/scr_stream.c index 7d7ec04ed..f7330b615 100644 --- a/packages/runtime/src/scr_stream.c +++ b/packages/runtime/src/scr_stream.c @@ -4420,7 +4420,7 @@ static ScrPromise *scr_sc_consume(ScrStream *s, int kind) { scr_promise_reject_pending(p); return p; } - static const ScrArrOps bytes_ops = { scr_bytes_retain_v, scr_bytes_release_v, NULL }; + static ScrArrOps bytes_ops = { scr_bytes_retain_v, scr_bytes_release_v, NULL }; ScrArr *chunks = scr_arr_new_ops(&bytes_ops, 4); ScrStreamErrInv fin_inv = kind == SCR_SC_TEXT ? &scr_sc_fin_text : kind == SCR_SC_JSON ? &scr_sc_fin_json diff --git a/packages/runtime/test/test_array.c b/packages/runtime/test/test_array.c index 3eea84dcf..02da2fac2 100644 --- a/packages/runtime/test/test_array.c +++ b/packages/runtime/test/test_array.c @@ -19,7 +19,7 @@ #include /* Sparse entries live in the array's out-of-line storage. */ -static size_t arr_sparse_len(const ScrArr *a) { return a->ext ? a->ext->sparse_len : 0; } +static size_t arr_sparse_len(const ScrArr *a) { return scr_arr_ext_of(a) ? scr_arr_ext_of(a)->sparse_len : 0; } #ifdef SCR_RC_AUDIT long scr_str_live_count(void); /* provided by scr_string.c */ @@ -396,8 +396,8 @@ static MockRec *mock_cyc_new(int value) { return r; } -static const ScrArrOps mock_ops = { &mock_retain, &mock_release, NULL }; -static const ScrArrOps mock_cyc_ops = { &mock_cyc_retain, &mock_cyc_release, &mock_trace }; +static ScrArrOps mock_ops = { &mock_retain, &mock_release, NULL }; +static ScrArrOps mock_cyc_ops = { &mock_cyc_retain, &mock_cyc_release, &mock_trace }; static void test_ref_elements(void) { #ifdef SCR_RC_AUDIT @@ -444,6 +444,58 @@ static void test_ref_elements(void) { #endif } +/* Element ops past the registry's capacity: every descriptor still finds its + * own retain and release, and the first ones keep their registry ids. */ +static void test_ops_overflow(void) { + enum { N = SCR_ARR_OPS_OVERFLOW + 8 }; + static ScrArrOps many[N]; + static ScrArr *arrays[N]; + for (int i = 0; i < N; i++) many[i] = (ScrArrOps){ &mock_retain, &mock_release, NULL, 0 }; + for (int i = 0; i < N; i++) { + arrays[i] = scr_arr_new_ops(&many[i], 0); + scr_arr_push_ref(arrays[i], mock_new(i)); + } + check(scr_arr_ops(arrays[0]) == &many[0], "a registered descriptor answers by id"); + check(scr_arr_ops(arrays[N - 1]) == &many[N - 1], "an overflow descriptor answers through the array"); + check(many[N - 1].id == SCR_ARR_OPS_OVERFLOW, "descriptors past the table get the overflow id"); + MockRec *r = (MockRec *)scr_arr_get_ref(arrays[N - 1], 0); + check(r->rc == 2 && r->value == N - 1, "an overflow array retains through its own ops"); + mock_release(r); + for (int i = 0; i < N; i++) scr_arr_release(arrays[i]); + check(mock_live == 0, "overflow arrays release their elements"); +} + +/* An array with out-of-line storage keeps it through every change of its + * dense allocation: growth, head room, unshift into new room, sorting + * (which rebuilds the storage) and a sparse tail. */ +static void test_ext_through_storage_changes(void) { + ScrArr *a = scr_arr_new(SCR_ELEM_F64, 0); + scr_arr_set_f64(a, -1, 7); /* a noncanonical property: out-of-line storage */ + check(scr_arr_ext_of(a) != NULL, "a numeric property creates out-of-line storage"); + for (int i = 0; i < 100; i++) scr_arr_push_f64(a, 100 - i); + check_f64(scr_arr_get_f64(a, -1), 7, "the property survives growth"); + for (int i = 0; i < 40; i++) scr_arr_shift_f64(a); + check_f64(scr_arr_get_f64(a, -1), 7, "the property survives head room"); + for (int i = 0; i < 60; i++) scr_arr_unshift_f64(a, 1000 + i); + check_f64(scr_arr_len(a), 120, "unshift after shifts keeps the length"); + check_f64(scr_arr_get_f64(a, -1), 7, "the property survives new head room"); + ScrArr *same = scr_arr_sort_primitive(a, false); + check(same == a, "an in-place sort returns the array"); + check_f64(scr_arr_get_f64(a, 0), 1, "sorting reorders the values"); + check_f64(scr_arr_get_f64(a, -1), 7, "the property survives a sort"); + scr_arr_set_f64(a, 5000000, 9); /* a sparse tail entry */ + check(arr_sparse_len(a) == 1 && scr_arr_get_f64(a, 5000000) == 9, "a sparse entry joins the out-of-line storage"); + scr_arr_release(same); /* the sort's result reference */ + scr_arr_release(a); + + ScrArr *empty = scr_arr_new(SCR_ELEM_F64, 0); + scr_arr_set_f64(empty, 0.5, 3); + check_f64(scr_arr_get_f64(empty, 0.5), 3, "an array without elements keeps a property"); + scr_arr_push_f64(empty, 1); + check_f64(scr_arr_get_f64(empty, 0.5), 3, "the property survives the first element"); + scr_arr_release(empty); +} + static void test_ref_cycle(void) { #ifdef SCR_RC_AUDIT long arrays0 = scr_arr_live_count(); @@ -1522,7 +1574,11 @@ static void test_inline_slots(void) { scr_arr_push_ref(words, scr_str_new("a", 1)); scr_arr_push_ref(words, scr_str_new("b", 1)); scr_arr_set_ref(words, 3000000, scr_str_new("far", 3)); - check(inline_slots(words) && arr_sparse_len(words) == 1, "a far index leaves inline slots in place"); + /* A sparse entry needs out-of-line storage, whose pointer lives before the + * dense allocation: the inline slots move out of line with their values. */ + check(!inline_slots(words) && arr_sparse_len(words) == 1 && + strcmp(((ScrStr *)scr_arr_peek_ref(words, 1))->data, "b") == 0, + "a far index moves the inline slots out of line"); scr_arr_unshift_ref(words, scr_str_new("z", 1)); check(!inline_slots(words) && scr_arr_len(words) == 3000002 && strcmp(((ScrStr *)scr_arr_peek_ref(words, 0))->data, "z") == 0 && @@ -2149,6 +2205,8 @@ int main(int argc, char **argv) { test_nested_rc(); test_index_of_includes(); test_ref_elements(); + test_ops_overflow(); + test_ext_through_storage_changes(); test_ref_cycle(); test_ref_truncate_cycle(); test_ref_trace_storage_boundaries(); diff --git a/packages/runtime/test/test_lib.c b/packages/runtime/test/test_lib.c index db8d29693..6bdbb085d 100644 --- a/packages/runtime/test/test_lib.c +++ b/packages/runtime/test/test_lib.c @@ -22,7 +22,7 @@ #include /* Sparse entries live in the array's out-of-line storage. */ -static size_t arr_sparse_len(const ScrArr *a) { return a->ext ? a->ext->sparse_len : 0; } +static size_t arr_sparse_len(const ScrArr *a) { return scr_arr_ext_of(a) ? scr_arr_ext_of(a)->sparse_len : 0; } #endif static int checks = 0; diff --git a/packages/runtime/test/test_map.c b/packages/runtime/test/test_map.c index 9957a994c..32bdb7be1 100644 --- a/packages/runtime/test/test_map.c +++ b/packages/runtime/test/test_map.c @@ -636,7 +636,7 @@ static void test_value_keys_and_copies(void) { } #ifdef SCR_RC_AUDIT -static const ScrArrOps map_arr_ops = { scr_map_retain_v, scr_map_release_v, scr_map_trace_v }; +static ScrArrOps map_arr_ops = { scr_map_retain_v, scr_map_release_v, scr_map_trace_v }; static void test_identity_cycles(void) { scr_collect_cycles(); diff --git a/packages/runtime/test/test_regex.c b/packages/runtime/test/test_regex.c index 6084c5102..6afa8391e 100644 --- a/packages/runtime/test/test_regex.c +++ b/packages/runtime/test/test_regex.c @@ -333,7 +333,7 @@ static void test_exec_groups(void) { check(full && lean && full->len == lean->len && lean->len == 2, "exec_groups keeps the capture count"); check(*scr_arr_state_ptr(lean, 0) == SCR_ARR_UNDEFINED && *scr_arr_state_ptr(lean, 1) == SCR_ARR_UNDEFINED, "exec_groups: unselected and nonparticipating captures are undefined"); - check(lean->ext == NULL || lean->ext->metadata == NULL, "exec_groups: no index/input properties"); + check(scr_arr_ext_of(lean) == NULL || scr_arr_ext_of(lean)->metadata == NULL, "exec_groups: no index/input properties"); scr_arr_release(full); scr_arr_release(lean); ScrStr *ab = S("ab"); From 5c851762d6d96b263557c61d79d88c595916a674 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 13:12:24 -0500 Subject: [PATCH 10/67] Read ASCII characters of strings inline in charAt and indexing charAt and s[i] on a string proven ASCII at an exact in-range index now return the character from a module-level table of the 128 one-character strings, emitted with the helper as immortal literals with the same capacity word and key hash as the runtime's single-character statics. An exact integer index (a counted-loop counter) skips the double conversion. Every other string or index calls scr_str_char_at as before. --- .../src/backend/llvm/expr-containers.ts | 25 ++++-- .../src/backend/llvm/string-lifetimes.test.ts | 3 +- .../compiler/src/backend/llvm/string-reads.ts | 86 +++++++++++++++++++ .../test/string-char-at-emission.test.ts | 55 ++++++++++++ 4 files changed, 160 insertions(+), 9 deletions(-) create mode 100644 packages/compiler/test/string-char-at-emission.test.ts diff --git a/packages/compiler/src/backend/llvm/expr-containers.ts b/packages/compiler/src/backend/llvm/expr-containers.ts index bf8d502a1..8d1d1d28f 100644 --- a/packages/compiler/src/backend/llvm/expr-containers.ts +++ b/packages/compiler/src/backend/llvm/expr-containers.ts @@ -45,6 +45,8 @@ import { emitBorrowedInput } from "./borrowed-inputs.js"; import { emitFusedMapSet, rememberMapEntry } from "./map-entry-fusion.js"; import { emitScratchStringSlice, emitStringSliceRead } from "./string-slices.js"; import { + STRING_CHAR_AT_DECL, + STRING_CHAR_AT_INT_MARKER, STRING_CHAR_CODE_AT_DECL, STRING_CHAR_CODE_AT_INT_MARKER, STRING_UTF16_LEN_DECL, @@ -325,14 +327,21 @@ export function emitStrIntrinsic( B.line(`${t} = call double @sc_str_char_code_at(ptr ${r.name}, double ${args[0]!.name})`); return { name: t, type: e.type }; } - case "charAt": - return call( - "scr_str_char_at", - "ptr (ptr, double)", - `ptr ${r.name}, double ${args[0]!.name}`, - "ptr", - true, - ); + case "charAt": { + // sc_str_char_at (string-reads.ts) answers proven-ASCII strings inline. + host.declare(STRING_CHAR_AT_DECL); + const t = B.tmp(); + const index = e.args[0] ? exactInteger(host, args[0]!, e.args[0]) : null; + if (index) { + host.declare(STRING_CHAR_AT_INT_MARKER); + const wide = widenInteger(host, index); + B.line(`${t} = call ptr @sc_str_char_at_int(ptr ${r.name}, i64 ${wide})`); + } else { + const at = args[0]?.name ?? f64Lit(0); + B.line(`${t} = call ptr @sc_str_char_at(ptr ${r.name}, double ${at})`); + } + return host.own({ name: t, type: e.type }); + } case "indexOf": return call( "scr_str_index_of", diff --git a/packages/compiler/src/backend/llvm/string-lifetimes.test.ts b/packages/compiler/src/backend/llvm/string-lifetimes.test.ts index 8622085b4..f85addcf8 100644 --- a/packages/compiler/src/backend/llvm/string-lifetimes.test.ts +++ b/packages/compiler/src/backend/llvm/string-lifetimes.test.ts @@ -311,7 +311,8 @@ const methodCases: { // enters through the double ABI. { method: "charCodeAt", args: [num(1)], result: F64, target: "char_code_at_int", inline: true }, { method: "charCodeAt", args: [num(1.5)], result: F64, target: "char_code_at", inline: true }, - { method: "charAt", args: [num(1)], result: STRING, target: "char_at" }, + { method: "charAt", args: [num(1)], result: STRING, target: "char_at_int", inline: true }, + { method: "charAt", args: [num(1.5)], result: STRING, target: "char_at", inline: true }, { method: "indexOf", args: [ref("argument"), num(1)], result: F64, target: "index_of" }, { method: "includes", args: [ref("argument")], result: BOOL, target: "includes" }, { diff --git a/packages/compiler/src/backend/llvm/string-reads.ts b/packages/compiler/src/backend/llvm/string-reads.ts index d7bbed272..03a9fa282 100644 --- a/packages/compiler/src/backend/llvm/string-reads.ts +++ b/packages/compiler/src/backend/llvm/string-reads.ts @@ -18,6 +18,8 @@ */ import { exactIndexLines, sizeToDouble } from "./common.js"; +import { wtf8Bytes } from "../literals.js"; +import { literalCapWord, literalCapWord32 } from "./string-key-hash.js"; export const STRING_UTF16_LEN_DECL = "declare double @scr_str_utf16_len(ptr)"; export const STRING_CHAR_CODE_AT_DECL = "declare double @scr_str_char_code_at(ptr, double)"; @@ -31,6 +33,9 @@ const READ_CALL_ATTRS = "cold nocallback nounwind willreturn"; /** Requests the integer-index helper below; an LLVM comment line among the * declarations, so it never declares anything itself. */ export const STRING_CHAR_CODE_AT_INT_MARKER = "; uses @sc_str_char_code_at_int"; +export const STRING_CHAR_AT_DECL = "declare ptr @scr_str_char_at(ptr, double)"; +/** Requests the integer-index charAt helper, as the marker above does. */ +export const STRING_CHAR_AT_INT_MARKER = "; uses @sc_str_char_at_int"; /** Load the proven-ASCII flag of `%s` into `%ascii`. */ function asciiTest(): string[] { @@ -85,6 +90,34 @@ function scanRead(): string[] { ]; } +/** The one-character strings of the ASCII range as immortal literals + * ({ rc = SIZE_MAX, len = 1, capacity word, char, NUL }), indexed by + * character code: the inline charAt result. Their bytes, capacity words + * and key hashes equal those of the runtime's single-character statics, so + * they are interchangeable with the strings the runtime returns. */ +function asciiCharTable(sz: string): string[] { + const type = `{ ${sz}, ${sz}, ${sz}, [2 x i8] }`; + const entries: string[] = []; + for (let c = 0; c < 128; c++) { + const bytes = wtf8Bytes(String.fromCharCode(c)); + const word = sz === "i64" ? literalCapWord(bytes) : literalCapWord32(bytes); + entries.push(`${type} { ${sz} -1, ${sz} 1, ${sz} ${word}, [2 x i8] [i8 ${c}, i8 0] }`); + } + return [`@sc_ascii_chars = internal constant [128 x ${type}] [${entries.join(", ")}]`]; +} + +/** The table entry for byte `%byte` of a proven-ASCII string. */ +function asciiCharRead(sz: string): string[] { + return [ + ` %data = getelementptr inbounds %ScrStr, ptr %s, i32 1`, + ` %p = getelementptr inbounds i8, ptr %data, i64 %k`, + ` %byte = load i8, ptr %p`, + ` %code = zext i8 %byte to i64`, + ` %char = getelementptr inbounds [128 x { ${sz}, ${sz}, ${sz}, [2 x i8] }], ptr @sc_ascii_chars, i64 0, i64 %code`, + ` ret ptr %char`, + ]; +} + export interface StringReadHelper { decl: string; define(sz: string, attrs: string, scan: boolean): string[]; @@ -200,4 +233,57 @@ export const STRING_READ_HELPERS: readonly StringReadHelper[] = [ `}`, ], }, + { + // charAt of a proven-ASCII string at an exact in-range index is the + // table entry for its byte; every other case calls the runtime, which + // keeps the complete semantics. The table is defined with the helper. + decl: STRING_CHAR_AT_DECL, + define: (sz, attrs) => { + let n = 0; + const exactIndex = exactIndexLines("%i", "%len", sz, () => `%ix${n++}`); + return [ + ...asciiCharTable(sz), + ``, + `define internal ptr @sc_str_char_at(ptr %s, double %i) ${attrs} {`, + `entry:`, + ...asciiTest(), + ` br i1 %ascii, label %bounds, label %slow`, + `bounds:`, + ...loadLength(sz), + ...exactIndex.lines.map((line) => ` ${line}`), + ` br i1 ${exactIndex.ok}, label %read, label %slow`, + `read:`, + ` %k = add i64 ${exactIndex.wide}, 0`, + ...asciiCharRead(sz), + `slow:`, + ` %r = call ptr @scr_str_char_at(ptr %s, double %i) ${READ_CALL_ATTRS}`, + ` ret ptr %r`, + `}`, + ]; + }, + }, + { + // An exact integer index, as for sc_str_char_code_at_int. Requested + // together with STRING_CHAR_AT_DECL, which defines the table. + decl: STRING_CHAR_AT_INT_MARKER, + define: (sz, attrs) => [ + `define internal ptr @sc_str_char_at_int(ptr %s, i64 %i) ${attrs} {`, + `entry:`, + ...asciiTest(), + ` br i1 %ascii, label %bounds, label %slow`, + `bounds:`, + ...loadLength(sz), + ...(sz === "i64" ? [] : [` %len64 = zext ${sz} %len to i64`]), + ` %ok = icmp ult i64 %i, ${sz === "i64" ? "%len" : "%len64"}`, + ` br i1 %ok, label %read, label %slow`, + `read:`, + ` %k = add i64 %i, 0`, + ...asciiCharRead(sz), + `slow:`, + ` %d = sitofp i64 %i to double`, + ` %r = call ptr @scr_str_char_at(ptr %s, double %d) ${READ_CALL_ATTRS}`, + ` ret ptr %r`, + `}`, + ], + }, ]; diff --git a/packages/compiler/test/string-char-at-emission.test.ts b/packages/compiler/test/string-char-at-emission.test.ts new file mode 100644 index 000000000..8e5814120 --- /dev/null +++ b/packages/compiler/test/string-char-at-emission.test.ts @@ -0,0 +1,55 @@ +import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { expect, test } from "vitest"; +import { compile, deserializeModule, validateModule } from "../src/index.js"; +import { emitLlvmModule } from "../src/backend/llvm/emitter.js"; +import { literalCapWord } from "../src/backend/llvm/string-key-hash.js"; +import type { IrModule } from "../src/ir/ir.js"; + +async function lower(source: string): Promise { + const dir = await mkdtemp(join(tmpdir(), "scriptc-char-at-")); + try { + const entry = join(dir, "main.ts"); + const outPath = join(dir, "main.ir.json"); + await writeFile(entry, source); + const result = await compile(entry, { outDir: dir, outPath, outputKind: "ir" }); + if (!result.ok) + throw new Error(result.diagnostics.map((d) => `${d.code}: ${d.message}`).join("\n")); + const mod = deserializeModule(await readFile(outPath, "utf8")); + expect(validateModule(mod)).toEqual([]); + return mod; + } finally { + await rm(dir, { recursive: true, force: true }); + } +} + +const options = { targetTriple: "x86_64-unknown-linux-gnu", pointerBits: 64 } as const; + +test("charAt reads proven-ASCII strings through the module's character table", async () => { + const mod = await lower( + 'const s = process.argv.length > 9 ? "x" : "hello";\nconst i: number = process.argv.length - 1;\nconsole.log(s.charAt(i), s[i]);\n', + ); + const ir = emitLlvmModule(mod, options); + expect(ir).toContain("define internal ptr @sc_str_char_at(ptr %s, double %i)"); + expect(ir).toContain("call ptr @scr_str_char_at(ptr %s, double %i) cold"); + // Each entry is an immortal one-character literal with the runtime's + // capacity word (length, proven-ASCII bit and key hash). + const word = literalCapWord(new Uint8Array([65])); + expect(ir).toContain(`{ i64 -1, i64 1, i64 ${word}, [2 x i8] [i8 65, i8 0] }`); + expect(ir.match(/^@sc_ascii_chars = internal constant \[128 x /gm)).toHaveLength(1); +}); + +test("charAt at a counted-loop index uses the integer helper", async () => { + const mod = await lower( + 'const s = process.argv.length > 9 ? "x" : "hello";\nlet out = "";\nfor (let i = 0; i < s.length; i++) out += s.charAt(i);\nconsole.log(out);\n', + ); + const ir = emitLlvmModule(mod, options); + expect(ir).toContain("define internal ptr @sc_str_char_at_int(ptr %s, i64 %i)"); + expect(ir).toMatch(/call ptr @sc_str_char_at_int\(ptr %\w+, i64 %\w+\)/); +}); + +test("programs without charAt carry no character table", async () => { + const mod = await lower('console.log("hello".length + process.argv.length);\n'); + expect(emitLlvmModule(mod, options)).not.toContain("@sc_ascii_chars"); +}); From a4d32a8e38fd765dc688ff057110c8ace10b7d3a Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 13:22:56 -0500 Subject: [PATCH 11/67] Use the default TLS version bound for null minVersion and maxVersion in tls.createServer tls.createServer validated minVersion and maxVersion with its own loop, which threw ERR_TLS_INVALID_PROTOCOL_VERSION for null. It now uses the same check as tls.connect, where null and undefined select the default bound, as in Node. --- packages/runtime/src/scr_tls.c | 37 ++++-------------------- tests/corpus/6722-tls-min-max-version.ts | 18 +++++++++++- 2 files changed, 22 insertions(+), 33 deletions(-) diff --git a/packages/runtime/src/scr_tls.c b/packages/runtime/src/scr_tls.c index 59f3c2c0a..526dd7760 100644 --- a/packages/runtime/src/scr_tls.c +++ b/packages/runtime/src/scr_tls.c @@ -1813,38 +1813,11 @@ static bool scr_tls_opts_validate(const ScrDyn *opts) { return false; } } - static const char *const VERSION_OPTS[] = { "minVersion", "maxVersion", NULL }; - for (size_t i = 0; VERSION_OPTS[i] != NULL; i++) { - const ScrDyn *v = scr_dyn_obj_get(opts, VERSION_OPTS[i], strlen(VERSION_OPTS[i])); - if (v == NULL || v->kind == SCR_DYN_UNDEF) continue; - bool valid = false; - if (v->kind == SCR_DYN_STR) { - static const char *const KNOWN[] = { "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3", NULL }; - for (size_t k = 0; KNOWN[k] != NULL; k++) { - if (v->v.str->len == strlen(KNOWN[k]) && memcmp(v->v.str->data, KNOWN[k], v->v.str->len) == 0) { - valid = true; - break; - } - } - } - if (!valid) { - /* %j: strings render JSON-quoted, everything else inspect-lite. */ - char rendered[96]; - if (v->kind == SCR_DYN_STR) { - snprintf(rendered, sizeof rendered, "\"%.*s\"", - (int)(v->v.str->len < 80 ? v->v.str->len : 80), v->v.str->data); - } else { - /* %j over non-strings: JSON.stringify's scalar renderings. */ - char lite[64]; - snprintf(rendered, sizeof rendered, "%s", scr_dyn_inspect_lite(v, lite, sizeof lite)); - } - char msg[192]; - int len = snprintf(msg, sizeof msg, "%s is not a valid %s TLS protocol version", - rendered, VERSION_OPTS[i][2] == 'n' ? "minimum" : "maximum"); - scr_throw_error_msg_code(SCR_ERR_TYPE, msg, (size_t)len, "ERR_TLS_INVALID_PROTOCOL_VERSION"); - return false; - } - } + /* Node's toV: null and undefined select the default bound. */ + int version; + if (!scr_tls_version_dyn(scr_dyn_obj_get(opts, "minVersion", 10), "minimum", 12, &version) || + !scr_tls_version_dyn(scr_dyn_obj_get(opts, "maxVersion", 10), "maximum", 13, &version)) + return false; static const char *const NUM_OPTS[] = { "handshakeTimeout", "keepAliveInitialDelay", NULL }; for (size_t i = 0; NUM_OPTS[i] != NULL; i++) { const ScrDyn *v = scr_dyn_obj_get(opts, NUM_OPTS[i], strlen(NUM_OPTS[i])); diff --git a/tests/corpus/6722-tls-min-max-version.ts b/tests/corpus/6722-tls-min-max-version.ts index 07d01867d..70cddae52 100644 --- a/tests/corpus/6722-tls-min-max-version.ts +++ b/tests/corpus/6722-tls-min-max-version.ts @@ -4,7 +4,8 @@ // ERR_SSL_TLSV1_ALERT_PROTOCOL_VERSION, a client range with neither TLSv1.2 // nor TLSv1.3 fails with ERR_SSL_NO_PROTOCOLS_AVAILABLE once the handshake // starts, and an invalid version or a secureProtocol conflict throws Node's -// TypeError from tls.connect. +// TypeError from tls.connect and tls.createServer. null selects the default +// bound, as undefined does. import * as tls from "node:tls"; import { readFileSync } from "node:fs"; @@ -16,6 +17,17 @@ const key = readFileSync(dir + "localhost-key.pem"); const upTo12 = tls.createServer({ cert, key, maxVersion: "TLSv1.2" }, (s) => s.end(`server:${s.getProtocol()}`)); const from13 = tls.createServer({ cert, key, minVersion: "TLSv1.3" }, (s) => s.end(`server:${s.getProtocol()}`)); const any = tls.createServer({ cert, key }, (s) => s.end(`server:${s.getProtocol()}`)); +const nullBounds = tls.createServer({ cert, key, minVersion: null as any, maxVersion: null as any }, (s) => + s.end(`server:${s.getProtocol()}`), +); +for (const maxVersion of [3, "TLSv9"]) { + try { + tls.createServer({ cert, key, maxVersion: maxVersion as any }); + } catch (e) { + const err = e as NodeJS.ErrnoException; + console.log("createServer", err.name, err.code, err.message); + } +} function listen(server: tls.Server): Promise { return new Promise((resolve) => @@ -74,12 +86,16 @@ async function main(): Promise { await attempt("max-1.1", pAny, { maxVersion: "TLSv1.1" }); await attempt("min-above-max", pAny, { minVersion: "TLSv1.3", maxVersion: "TLSv1.2" }); await attempt("null-min", pAny, { minVersion: null }); + const pNull = await listen(nullBounds); + await attempt("null-server", pNull, {}); + await attempt("null-both", pNull, { minVersion: null, maxVersion: null }); await attempt("invalid-min", pAny, { minVersion: "TLSv9" }); await attempt("invalid-max", pAny, { maxVersion: 3 }); await attempt("conflict", pAny, { minVersion: "TLSv1.2", secureProtocol: "TLSv1_2_method" }); upTo12.close(); from13.close(); any.close(); + nullBounds.close(); } void main(); From 23ec584deb26ef1d50834d548abd0c1a7b463604 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 13:24:10 -0500 Subject: [PATCH 12/67] Read nullable union chunks of push and write by their representation Readable.push and Writable.write with a union chunk (Buffer, string and null arms) read the chunk's tag and payload from a tagged union box. A union with one reference arm and null, such as `string | null` or `Buffer | null`, is the arm pointer itself, so `push(line)` with `line: string | null` and `push(done ? null : text)` read past the string and crashed. Both now read the tag and payload with unionTag and unionPeek, as the other union consumers do. unshift and end refuse union chunks and are unchanged. --- .../compiler/src/backend/llvm/lib-stream.ts | 12 +-- .../6820-stream-push-nullable-chunks.ts.json | 6 ++ ...6821-stream-write-nullable-chunks.cjs.json | 6 ++ .../6820-stream-push-nullable-chunks.ts | 77 +++++++++++++++++++ .../6821-stream-write-nullable-chunks.cjs | 23 ++++++ .../6820-stream-push-nullable-chunks.ts.json | 1 + ...6821-stream-write-nullable-chunks.cjs.json | 1 + 7 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6820-stream-push-nullable-chunks.ts.json create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6821-stream-write-nullable-chunks.cjs.json create mode 100644 tests/corpus/6820-stream-push-nullable-chunks.ts create mode 100644 tests/corpus/6821-stream-write-nullable-chunks.cjs create mode 100644 tests/harness/corpus-costs/6820-stream-push-nullable-chunks.ts.json create mode 100644 tests/harness/corpus-costs/6821-stream-write-nullable-chunks.cjs.json diff --git a/packages/compiler/src/backend/llvm/lib-stream.ts b/packages/compiler/src/backend/llvm/lib-stream.ts index a319d0257..d3b4b1f5b 100644 --- a/packages/compiler/src/backend/llvm/lib-stream.ts +++ b/packages/compiler/src/backend/llvm/lib-stream.ts @@ -274,10 +274,9 @@ export function emitStreamLibCall(host: LlvmEmitterContext, e: LibCallExpr): LlV .filter((a) => a.tag >= 0); if (present.length === 0) throw new InternalCompilerError(`llvm emitter bug: ${e.fn} union lacks its arms`); - const tagP = B.tmp(); - const tag = B.tmp(); - B.line(`${tagP} = getelementptr inbounds %ScrUnion, ptr ${args[1]!.name}, i64 0, i32 1`); - B.line(`${tag} = load i32, ptr ${tagP}`); + // A tagged box, or the arm pointer itself for a nullable union + // (`string | null`, `Buffer | null`). + const tag = host.unionTag(args[1]!.name, t.unionId); const slot = B.slot(); B.entryAllocas.push(`${slot} = alloca i1`); const lj = B.newLabel("scu.j"); @@ -290,10 +289,7 @@ export function emitStreamLibCall(host: LlvmEmitterContext, e: LibCallExpr): LlV B.line(`store i1 ${r}, ptr ${slot}`); return; } - const pk = B.tmp(); - const pv = B.tmp(); - B.line(`${pk} = getelementptr inbounds %ScrUnion, ptr ${args[1]!.name}, i64 0, i32 5`); - B.line(`${pv} = load ptr, ptr ${pk} ; borrowed payload`); + const pv = host.unionPeek(args[1]!.name, t.unionId); // borrowed payload const r = B.tmp(); if (pushing) { host.declare(`declare zeroext i1 @${entry}(ptr, ptr)`); diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6820-stream-push-nullable-chunks.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6820-stream-push-nullable-chunks.ts.json new file mode 100644 index 000000000..26bb4ae9e --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6820-stream-push-nullable-chunks.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6820-stream-push-nullable-chunks.ts" + ], + "diags": [] +} diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6821-stream-write-nullable-chunks.cjs.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6821-stream-write-nullable-chunks.cjs.json new file mode 100644 index 000000000..e296beb66 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6821-stream-write-nullable-chunks.cjs.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6821-stream-write-nullable-chunks.cjs" + ], + "diags": [] +} diff --git a/tests/corpus/6820-stream-push-nullable-chunks.ts b/tests/corpus/6820-stream-push-nullable-chunks.ts new file mode 100644 index 000000000..5b79525b1 --- /dev/null +++ b/tests/corpus/6820-stream-push-nullable-chunks.ts @@ -0,0 +1,77 @@ +// Readable subclasses pushing `string | null` and `Buffer | null` chunks, a +// conditional `push(done ? null : chunk)`, and writes of `string | Buffer` +// chunks. +import { Readable, Writable } from "node:stream"; + +class Lines extends Readable { + private index = 0; + private readonly lines: string[]; + constructor(lines: string[]) { + super(); + this.lines = lines; + } + next(): string | null { + return this.index < this.lines.length ? this.lines[this.index++]! : null; + } + _read(): void { + const line: string | null = this.next(); + this.push(line); + } +} + +class Blocks extends Readable { + private sent = 0; + _read(): void { + const block: Buffer | null = this.sent < 3 ? Buffer.from([65 + this.sent, 10]) : null; + this.sent++; + this.push(block); + } +} + +class Countdown extends Readable { + private left: number; + constructor(left: number) { + super({ encoding: "utf8" }); + this.left = left; + } + _read(): void { + this.left--; + this.push(this.left < 0 ? null : `t-${this.left} `); + } +} + +function collect(label: string, stream: Readable): Promise { + return new Promise((resolve) => { + const parts: string[] = []; + stream.on("data", (chunk: Buffer | string) => + parts.push(typeof chunk === "string" ? chunk : chunk.toString()), + ); + stream.on("end", () => { + console.log(label, JSON.stringify(parts.join("")), parts.length); + resolve(); + }); + }); +} + +async function main(): Promise { + await collect("lines", new Lines(["a\n", "bb\n", "ccc\n"])); + await collect("empty lines", new Lines([])); + await collect("blocks", new Blocks()); + await collect("countdown", new Countdown(3)); + + const written: string[] = []; + const sink = new Writable({ + write(chunk: Buffer, _encoding, callback) { + written.push(chunk.toString()); + callback(); + }, + }); + const pieces: (string | Buffer)[] = ["x", Buffer.from("y"), "z"]; + for (const piece of pieces) { + const chunk: string | Buffer = piece; + console.log("write", Buffer.isBuffer(chunk) ? "buffer" : "string", sink.write(chunk)); + } + sink.end(() => console.log("written", JSON.stringify(written.join("")))); +} + +void main(); diff --git a/tests/corpus/6821-stream-write-nullable-chunks.cjs b/tests/corpus/6821-stream-write-nullable-chunks.cjs new file mode 100644 index 000000000..c7bf32bc0 --- /dev/null +++ b/tests/corpus/6821-stream-write-nullable-chunks.cjs @@ -0,0 +1,23 @@ +// Writes and pushes of a chunk that is a string or null: a null write throws +// ERR_STREAM_NULL_VALUES, and a null push ends the readable. +const { Writable, Readable } = require("node:stream"); +const written = []; +const sink = new Writable({ + write(chunk, _encoding, callback) { + written.push(chunk.toString()); + callback(); + }, +}); +for (let i = 0; i < 3; i++) { + const chunk = i === 1 ? null : `c${i}`; + try { + console.log("write", JSON.stringify(chunk), sink.write(chunk)); + } catch (error) { + console.log("write threw", error.name, error.code, error.message); + } +} +const r = new Readable({ read() {} }); +for (let i = 0; i < 3; i++) r.push(i === 2 ? null : `r${i}`); +r.on("data", (d) => console.log("data", String(d))); +r.on("end", () => console.log("end")); +sink.end(() => console.log("written", JSON.stringify(written.join("")))); diff --git a/tests/harness/corpus-costs/6820-stream-push-nullable-chunks.ts.json b/tests/harness/corpus-costs/6820-stream-push-nullable-chunks.ts.json new file mode 100644 index 000000000..dd2eae649 --- /dev/null +++ b/tests/harness/corpus-costs/6820-stream-push-nullable-chunks.ts.json @@ -0,0 +1 @@ +{ "plain": 3100, "san": 41100 } diff --git a/tests/harness/corpus-costs/6821-stream-write-nullable-chunks.cjs.json b/tests/harness/corpus-costs/6821-stream-write-nullable-chunks.cjs.json new file mode 100644 index 000000000..24b9052ff --- /dev/null +++ b/tests/harness/corpus-costs/6821-stream-write-nullable-chunks.cjs.json @@ -0,0 +1 @@ +{ "plain": 2400, "san": 40400 } From 1d6f26a071f35f64b9a5addf20428fa37dfa4c89 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 13:26:50 -0500 Subject: [PATCH 13/67] Give arrays of a known final length exact dense capacity --- .../src/backend/llvm/expr-containers.ts | 6 +- .../src/backend/llvm/expr-primitives.ts | 16 ++++- .../array-exact-capacity-builders.ts.json | 6 ++ packages/runtime/src/scr_array.c | 37 +++++++++++ packages/runtime/src/scr_array.h | 9 +++ tests/corpus/array-exact-capacity-builders.ts | 65 +++++++++++++++++++ .../array-exact-capacity-builders.ts.json | 1 + 7 files changed, 136 insertions(+), 4 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/array-exact-capacity-builders.ts.json create mode 100644 tests/corpus/array-exact-capacity-builders.ts create mode 100644 tests/harness/corpus-costs/array-exact-capacity-builders.ts.json diff --git a/packages/compiler/src/backend/llvm/expr-containers.ts b/packages/compiler/src/backend/llvm/expr-containers.ts index 8d1d1d28f..8970aa3be 100644 --- a/packages/compiler/src/backend/llvm/expr-containers.ts +++ b/packages/compiler/src/backend/llvm/expr-containers.ts @@ -647,10 +647,12 @@ export function emitArrIntrinsic( return { name: t, type: e.type }; } case "concatSpread": { + // Appends to concat's fresh result: its storage grows to exactly + // the combined length (scr_arr_concat_copy_exact). const src = emitBorrowedInput(host, e.args[0]!); - host.declare(`declare double @scr_arr_concat_copy(ptr, ptr)`); + host.declare(`declare double @scr_arr_concat_copy_exact(ptr, ptr)`); const t = B.tmp(); - B.line(`${t} = call double @scr_arr_concat_copy(ptr ${r.name}, ptr ${src.name})`); + B.line(`${t} = call double @scr_arr_concat_copy_exact(ptr ${r.name}, ptr ${src.name})`); return { name: t, type: e.type }; } case "unshift": { diff --git a/packages/compiler/src/backend/llvm/expr-primitives.ts b/packages/compiler/src/backend/llvm/expr-primitives.ts index 69f4def2e..cc6053f4b 100644 --- a/packages/compiler/src/backend/llvm/expr-primitives.ts +++ b/packages/compiler/src/backend/llvm/expr-primitives.ts @@ -855,11 +855,15 @@ export function emitContainerExpr( const elem = e.type.elem; const arr = B.tmp(); const small = host.appendedArrayLiterals.has(e); - const capacity = small ? 0 : (e.capacity ?? e.elems.length); + const spreadSet = new Set(e.spreads ?? []); + // With spreads, storage starts at the plain elements before the first + // spread, and each spread reserves exactly its source's length plus + // the plain elements up to the next one (scr_arr_reserve_spread). + const firstSpread = e.elems.findIndex((_, i) => spreadSet.has(i)); + const capacity = small ? 0 : (e.capacity ?? (firstSpread < 0 ? e.elems.length : firstSpread)); B.line(`${arr} = ${arrNewCall(host.shapeHost, elem, String(capacity), small)}`); const out = host.own({ name: arr, type: e.type }); const acc = elemAccess(elem); - const spreadSet = new Set(e.spreads ?? []); let pending: LlValue[] = []; let buffer: string | undefined; const flush = (): void => { @@ -874,6 +878,12 @@ export function emitContainerExpr( if (spreadSet.has(i)) { flush(); const v = host.emitExpr(el); + let plain = 0; + for (let j = i + 1; j < e.elems.length && !spreadSet.has(j); j++) plain++; + host.declare(`declare void @scr_arr_reserve_spread(ptr, ptr, ${host.sizeType})`); + B.line( + `call void @scr_arr_reserve_spread(ptr ${arr}, ptr ${v.name}, ${host.sizeType} ${plain})`, + ); host.emitArrayCopyLoop(arr, v.name, acc); return; } @@ -895,6 +905,8 @@ export function emitContainerExpr( const n = host.emitExpr(e.length); const arr = B.tmp(); B.line(`${arr} = ${arrNewCall(host.shapeHost, elem, "0")}`); + host.declare(`declare void @scr_arr_reserve_len(ptr, double)`); + B.line(`call void @scr_arr_reserve_len(ptr ${arr}, double ${n.name})`); const out = host.own({ name: arr, type: e.type }); const acc = elemAccess(elem); let fill = acc === "f64" ? f64Lit(0) : acc === "bool" ? "false" : "null"; diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/array-exact-capacity-builders.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/array-exact-capacity-builders.ts.json new file mode 100644 index 000000000..20dc485de --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/array-exact-capacity-builders.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/array-exact-capacity-builders.ts" + ], + "diags": [] +} diff --git a/packages/runtime/src/scr_array.c b/packages/runtime/src/scr_array.c index 51853afce..f8b5813a2 100644 --- a/packages/runtime/src/scr_array.c +++ b/packages/runtime/src/scr_array.c @@ -1470,6 +1470,14 @@ static void scr_arr_invalid_length(double length) { scr_throw_error_msg(SCR_ERR_RANGE, msg, sizeof msg - 1); } +static void scr_arr_reserve_exact(ScrArr *a, size_t need); + +/* A length set on an empty array without storage of its own (`new + * Array(n)`, Array.prototype.map's result) reserves exactly that many + * slots, as holes, up to this many; the writes that fill the array then + * need no geometric growth. */ +#define SCR_ARR_PRESIZE_LIMIT ((size_t)1 << 16) + void scr_arr_set_len(ScrArr *a, double length) { if (!(length >= 0) || !isfinite(length) || length != trunc(length) || length > (double)SCR_ARR_MAX_LENGTH) { @@ -1511,6 +1519,8 @@ void scr_arr_set_len(ScrArr *a, double length) { } if (scr_arr_ext_of(a)) scr_arr_ext_of(a)->sparse_len = scr_arr_sparse_lower_bound(scr_arr_ext_of(a)->sparse, scr_arr_ext_of(a)->sparse_len, next); } + } else if (a->len == 0 && next <= SCR_ARR_PRESIZE_LIMIT && (a->cap == 0 || scr_arr_inline(a))) { + scr_arr_reserve_exact(a, next); } a->len = next; } @@ -2037,6 +2047,33 @@ double scr_arr_concat_copy(ScrArr *a, const ScrArr *src) { return SCR_ARR_LEN_F64(a->len); } +/* Dense capacity of exactly `need` (rounded to the storage block) for an + * array whose final length is known: a fresh concat result, a spread + * literal, or a length set on an empty array. Arrays with sparse entries, + * and lengths past the dense cutoff, keep their ordinary growth. */ +static void scr_arr_reserve_exact(ScrArr *a, size_t need) { + if (need <= a->cap || need > SCR_ARR_DENSE_LIMIT || SCR_AX(a)->sparse_len != 0) return; + scr_arr_grow_dense_to(a, need, SCR_ARR_GROW_EXACT); +} + +double scr_arr_concat_copy_exact(ScrArr *a, const ScrArr *src) { + if (src != a && scr_arr_is_dense(src) && src->len <= SCR_ARR_MAX_LENGTH - a->len) + scr_arr_reserve_exact(a, (size_t)a->len + src->len); + return scr_arr_concat_copy(a, src); +} + +void scr_arr_reserve_spread(ScrArr *a, const ScrArr *src, size_t plain) { + if (src == a || !scr_arr_is_dense(src)) return; + size_t need = (size_t)a->len + src->len; + if (plain > SCR_ARR_DENSE_LIMIT || need > SCR_ARR_DENSE_LIMIT) return; + scr_arr_reserve_exact(a, need + plain); +} + +void scr_arr_reserve_len(ScrArr *a, double n) { + if (!(n >= 1) || n > (double)SCR_ARR_DENSE_LIMIT) return; + scr_arr_reserve_exact(a, (size_t)n); +} + /* ── unshift / reverse ────────────────────────────────────────────────── * Single-element unshift takes ownership, matching push. The emitter calls * it from right to left after evaluating every variadic argument, preserving diff --git a/packages/runtime/src/scr_array.h b/packages/runtime/src/scr_array.h index 95ee7ce00..2068a324d 100644 --- a/packages/runtime/src/scr_array.h +++ b/packages/runtime/src/scr_array.h @@ -442,6 +442,15 @@ double scr_arr_unshift_many(ScrArr *a, size_t count, const uint64_t *slots); double scr_arr_push_spread(ScrArr *a, const ScrArr *src); /* Append a concat argument by indexed property copy, preserving holes. */ double scr_arr_concat_copy(ScrArr *a, const ScrArr *src); +/* The same append for Array.prototype.concat's fresh result: dense storage + * grows to exactly the combined length instead of geometrically. */ +double scr_arr_concat_copy_exact(ScrArr *a, const ScrArr *src); +/* Exact dense capacity for an array literal about to copy `src` and then + * `plain` more elements (a spread position). */ +void scr_arr_reserve_spread(ScrArr *a, const ScrArr *src, size_t plain); +/* Exact dense capacity for `n` elements of an array that is filled to that + * length next (Array.from({ length: n })); no effect for other lengths. */ +void scr_arr_reserve_len(ScrArr *a, double n); /* unshift returns the new length and _ref takes ownership. The spread form * borrows a same-element-kind source, retains copied refs, and snapshots diff --git a/tests/corpus/array-exact-capacity-builders.ts b/tests/corpus/array-exact-capacity-builders.ts new file mode 100644 index 000000000..da3a587ed --- /dev/null +++ b/tests/corpus/array-exact-capacity-builders.ts @@ -0,0 +1,65 @@ +// Arrays whose final length is known while they are built: map results, +// new Array(n) filled by index, concat results, spread literals and +// Array.from({ length: n }). Holes, lengths and later appends behave as +// in JavaScript. +class Item { + id: number; + constructor(id: number) { + this.id = id; + } +} +const items: Item[] = []; +for (let i = 0; i < 9; i++) items.push(new Item(i)); +const ids = (xs: Item[]): string => xs.map((x) => x.id).join(","); + +const doubled = items.map((x) => new Item(x.id * 2)); +console.log(doubled.length, ids(doubled)); +doubled.push(new Item(99)); +console.log(doubled.length, ids(doubled)); + +const filled: Item[] = new Array(5); +for (let i = 0; i < filled.length; i++) filled[i] = items[i]!; +console.log(filled.length, ids(filled)); +const partial: number[] = new Array(6); +partial[1] = 10; +partial[4] = 40; +console.log(partial.length, 0 in partial, 1 in partial, JSON.stringify(partial)); +partial.push(7); +console.log(partial.length, JSON.stringify(partial)); + +const wide: number[] = []; +wide.length = 200000; +wide[150000] = 1; +console.log(wide.length, wide[150000], 5 in wide); +const empty: number[] = []; +empty.length = 0; +empty.push(3); +console.log(empty.length, empty[0]); + +const left = items.slice(0, 3); +const right = items.slice(3, 7); +const joined = left.concat(right, items.slice(8)); +console.log(joined.length, ids(joined)); +const holey: number[] = [1, 2, 3]; +holey.length = 5; +const withHoles = holey.concat([6, 7]); +console.log(withHoles.length, 3 in withHoles, 4 in withHoles, JSON.stringify(withHoles)); + +const spread = [new Item(-1), ...left, new Item(-2), ...right, new Item(-3)]; +console.log(spread.length, ids(spread)); +const spreadHoles = [...holey, 9]; +console.log(spreadHoles.length, 3 in spreadHoles, JSON.stringify(spreadHoles)); +const self = [...left, ...left]; +console.log(self.length, ids(self)); + +const zeros = Array.from({ length: 7 }, () => 0); +console.log(zeros.length, zeros.join("")); +const counted = Array.from({ length: 4 }, (_, i) => i * i); +console.log(counted.join(",")); +const none = Array.from({ length: 0 }, () => 1); +console.log(none.length); + +const sparseSource: number[] = []; +sparseSource[3] = 30; +const mapped = sparseSource.map((x) => x + 1); +console.log(mapped.length, 0 in mapped, 3 in mapped, mapped[3]); diff --git a/tests/harness/corpus-costs/array-exact-capacity-builders.ts.json b/tests/harness/corpus-costs/array-exact-capacity-builders.ts.json new file mode 100644 index 000000000..5a4cc1dfd --- /dev/null +++ b/tests/harness/corpus-costs/array-exact-capacity-builders.ts.json @@ -0,0 +1 @@ +{ "plain": 4230, "san": 6130 } From a7e84cd48c34bfee5ab3c5e09460e0d85d5b069d Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 13:56:07 -0500 Subject: [PATCH 14/67] Support SNICallback in tls.createServer tls.createServer({ cert, key, SNICallback }) hands each ClientHello's servername to the callback and serves the SecureContext it answers, synchronously or later, or the default cert and key when it answers none. An error answer closes that connection. This uses the SNI handling that http2.createSecureServer already has. A callback expression with side effects, or SNICallback combined with ALPNProtocols, minVersion, maxVersion or the other options the runtime walk reads, fails with SC2020. A tls.connect or https.request client whose peer closes or resets the connection before the handshake completes now fails with Node's ECONNRESET "Client network socket disconnected before secure TLS connection was established" instead of closing without an error. Refs #1438 Co-authored-by: saboursepideh <25549001+saboursepideh@users.noreply.github.com> --- .../compiler/src/backend/llvm/lib-http2.ts | 34 ++-- packages/compiler/src/backend/llvm/lib-tls.ts | 22 +++ .../src/frontend/lowering/lower-server.ts | 157 ++++++++++++------ .../compiler/src/ir/builtin-signatures.ts | 5 + .../corpus/6933-tls-sni-callback.ts.json | 6 + .../6934-tls-handshake-disconnect.ts.json | 6 + .../tls-sni-callback-fences.ts.json | 6 + packages/runtime/src/scr_error.c | 6 +- packages/runtime/src/scr_tls.c | 35 +++- packages/runtime/src/scr_tls.h | 3 + tests/corpus/6933-tls-sni-callback.ts | 65 ++++++++ tests/corpus/6934-tls-handshake-disconnect.ts | 27 +++ tests/diagnostics/tls-sni-callback-fences.ts | 15 ++ .../tls-sni-callback-fences.ts.txt | 17 ++ 14 files changed, 330 insertions(+), 74 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6933-tls-sni-callback.ts.json create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6934-tls-handshake-disconnect.ts.json create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/diagnostics/tls-sni-callback-fences.ts.json create mode 100644 tests/corpus/6933-tls-sni-callback.ts create mode 100644 tests/corpus/6934-tls-handshake-disconnect.ts create mode 100644 tests/diagnostics/tls-sni-callback-fences.ts create mode 100644 tests/harness/__snapshots__/tls-sni-callback-fences.ts.txt diff --git a/packages/compiler/src/backend/llvm/lib-http2.ts b/packages/compiler/src/backend/llvm/lib-http2.ts index 0254db555..791987f86 100644 --- a/packages/compiler/src/backend/llvm/lib-http2.ts +++ b/packages/compiler/src/backend/llvm/lib-http2.ts @@ -3,6 +3,7 @@ import type { IrType } from "../../ir/ir.js"; import { typeKey } from "../../ir/ir.js"; import type { LibCallExpr, LlValue, LlvmEmitterContext } from "./expr-context.js"; import { + type AbiArgument, abiValue, callbackAdapter, callbackType, @@ -84,6 +85,23 @@ function sniAnswer(host: LlvmEmitterContext, type: IrType): string { return symbol; } +/** The (closure, answer thunk) pair of an SNICallback argument: a function, + * or a function | undefined union whose undefined arm passes no callback. */ +export function sniCallbackArgs(host: LlvmEmitterContext, cb: LlValue): AbiArgument[] { + let type = cb.type, + value = cb.name; + if (type.kind === "union") { + const arms = host.unionsById.get(type.unionId)?.arms ?? []; + const tag = arms.findIndex((arm) => arm.kind === "func"); + if (tag < 0) throw new InternalCompilerError("SNI callback union lacks its function arm"); + type = arms[tag]!; + value = host.unwrapNullableClosure(value, tag); + } else host.toHeap(cb); + if (type.kind !== "func" || type.params[1] === undefined) + throw new InternalCompilerError("SNI callback lacks its answer function"); + return [ptr(value), ptr("@" + sniAnswer(host, type.params[1]))]; +} + export function emitHttp2LibCall(host: LlvmEmitterContext, e: LibCallExpr): LlValue { const args = e.args.map((arg) => host.emitExpr(arg)), a = args.map((arg) => abiValue(host, arg)); @@ -160,21 +178,7 @@ export function emitHttp2LibCall(host: LlvmEmitterContext, e: LibCallExpr): LlVa let handler = [ptr(), ptr()], sni = [ptr(), ptr()]; if (e.fn === "http2.createSecureServerReq") handler = requestHandler(host, args[2]!); - if (e.fn === "http2.createSecureServerSni") { - const cb = args[2]!; - let type = cb.type, - value = cb.name; - if (type.kind === "union") { - const arms = host.unionsById.get(type.unionId)?.arms ?? []; - const tag = arms.findIndex((arm) => arm.kind === "func"); - if (tag < 0) throw new InternalCompilerError("SNI callback union lacks its function arm"); - type = arms[tag]!; - value = host.unwrapNullableClosure(value, tag); - } else host.toHeap(cb); - if (type.kind !== "func" || type.params[1] === undefined) - throw new InternalCompilerError("SNI callback lacks its answer function"); - sni = [ptr(value), ptr("@" + sniAnswer(host, type.params[1]))]; - } + if (e.fn === "http2.createSecureServerSni") sni = sniCallbackArgs(host, args[2]!); return finishRuntimeCall(host, e, "scr_http2_create_secure_server_allow_http1", [ ...rawBytes(host, args[0]!), ...rawBytes(host, args[1]!), diff --git a/packages/compiler/src/backend/llvm/lib-tls.ts b/packages/compiler/src/backend/llvm/lib-tls.ts index 18fc006d4..c5c77d3a6 100644 --- a/packages/compiler/src/backend/llvm/lib-tls.ts +++ b/packages/compiler/src/backend/llvm/lib-tls.ts @@ -11,6 +11,7 @@ import { rawBytes, requestHandler, } from "./lib-abi.js"; +import { sniCallbackArgs } from "./lib-http2.js"; import { emitAlwaysThrowLibCall } from "./lib-shared.js"; export function emitTlsLibCall(host: LlvmEmitterContext, e: LibCallExpr): LlValue { @@ -43,6 +44,27 @@ export function emitTlsLibCall(host: LlvmEmitterContext, e: LibCallExpr): LlValu [...rawBytes(host, args[0]!), ...rawBytes(host, args[1]!), ...handler], ); } + case "tls.createServerSni": + case "tls.createServerSniCb": { + const cb = args[3]; + const handler = + cb === undefined + ? [ptr(), ptr()] + : callbackAdapter( + host, + cb, + callbackType(cb).params.length === 0 + ? "scr_net_conn_thunk0" + : "scr_net_conn_thunk_sock", + ["ptr", "ptr"], + ); + return finishRuntimeCall(host, e, "scr_tls_create_server_sni", [ + ...rawBytes(host, args[0]!), + ...rawBytes(host, args[1]!), + ...handler, + ...sniCallbackArgs(host, args[2]!), + ]); + } case "tls.createServerDyn": case "tls.createServerDynCb": case "https.createServerDyn": diff --git a/packages/compiler/src/frontend/lowering/lower-server.ts b/packages/compiler/src/frontend/lowering/lower-server.ts index 4a7c00d84..c27b2513e 100644 --- a/packages/compiler/src/frontend/lowering/lower-server.ts +++ b/packages/compiler/src/frontend/lowering/lower-server.ts @@ -4749,7 +4749,8 @@ function lowerTlsServerOptions( lowerer: Lowerer, node: ts.Expression, what: string, -): { cert: IrExpr; key: IrExpr } { + allowSni = false, +): { cert: IrExpr; key: IrExpr; sni?: IrExpr } { if (!ts.isObjectLiteralExpression(node)) { lowerer.noLowering( `${what} with a non-literal options argument`, @@ -4760,6 +4761,7 @@ function lowerTlsServerOptions( const loc = locOf(node); let cert: IrExpr | null = null; let key: IrExpr | null = null; + let sni: IrExpr | undefined; for (const prop of node.properties.nodes) { let initializer: ts.Expression | null; if ( @@ -4777,6 +4779,23 @@ function lowerTlsServerOptions( ); } const k = (prop.name as ts.Identifier | ts.StringLiteral).text; + if (k === "SNICallback" && allowSni) { + // The callback is a value read (a function or a binding), so it may + // be read after cert and key without changing what the program sees. + if (initializer !== null && !sideEffectFreeOptionValue(initializer)) { + lowerer.noLowering( + `a ${what} SNICallback expression with side effects`, + prop, + "pass a function or a variable that holds one", + ); + } + const value = + initializer !== null + ? lowerer.lowerExpr(initializer) + : lowerer.lowerShorthandValue(prop as ts.ShorthandPropertyAssignment); + sni = checkSniCallbackValue(lowerer, value, prop, what); + continue; + } if (k !== "cert" && k !== "key") { const init = ts.isPropertyAssignment(prop) ? prop.initializer : null; if ( @@ -4801,7 +4820,7 @@ function lowerTlsServerOptions( "cert and key (PEM strings or Buffers) are the supported options", { SNICallback: - "SNICallback lowers only on http2.createSecureServer({ allowHTTP1: true, ... }) — serve one cert/key pair here", + "SNICallback lowers on tls.createServer and http2.createSecureServer({ allowHTTP1: true, ... }) — serve one cert/key pair here", requestCert: "client-certificate handshakes are not modeled (SEMANTICS.md divergence 55) — requestCert: false is the lowered value", }, @@ -4848,7 +4867,7 @@ function lowerTlsServerOptions( "the supported options object is { cert, key } (PEM strings or Buffers)", ); } - return { cert, key }; + return sni === undefined ? { cert, key } : { cert, key, sni }; } /** The options argument of tls/https createServer, split three ways: an @@ -4911,12 +4930,24 @@ function lowerTlsServerOptionsOrDyn( what: string, includeHttpTimeoutOptions = false, runtimeKeys: ReadonlySet = new Set(), -): { cert: IrExpr; key: IrExpr; dyn?: undefined } | { dyn: IrExpr } { - if ( - ts.isObjectLiteralExpression(node) && - !tlsLiteralNeedsRuntimeWalk(node, includeHttpTimeoutOptions, runtimeKeys) - ) { - return lowerTlsServerOptions(lowerer, node, what); + allowSni = false, +): { cert: IrExpr; key: IrExpr; sni?: IrExpr; dyn?: undefined } | { dyn: IrExpr } { + if (ts.isObjectLiteralExpression(node)) { + if (!tlsLiteralNeedsRuntimeWalk(node, includeHttpTimeoutOptions, runtimeKeys)) + return lowerTlsServerOptions(lowerer, node, what, allowSni); + const sniOption = node.properties.nodes.find( + (p) => + (ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p)) && + (ts.isIdentifier(p.name) || ts.isStringLiteral(p.name)) && + p.name.text === "SNICallback", + ); + if (allowSni && sniOption !== undefined) { + lowerer.noLowering( + `${what} with SNICallback and options the runtime walk reads`, + sniOption, + "SNICallback lowers with cert and key; ALPNProtocols, minVersion, maxVersion and the validated options are not combined with it yet", + ); + } } const v = lowerer.lowerExpr(node); if (v.type.kind === "dyn") return { dyn: v }; @@ -5078,10 +5109,25 @@ function lowerTlsModuleCall( "tls.createServer", false, TLS_SERVER_RUNTIME_OPTIONS, + true, ); if (args.length === 1) { - return opts.dyn !== undefined - ? { kind: "libCall", fn: "tls.createServerDyn", args: [opts.dyn], type: NETSERVER_T, loc } + if (opts.dyn !== undefined) + return { + kind: "libCall", + fn: "tls.createServerDyn", + args: [opts.dyn], + type: NETSERVER_T, + loc, + }; + return opts.sni !== undefined + ? { + kind: "libCall", + fn: "tls.createServerSni", + args: [opts.cert, opts.key, opts.sni], + type: NETSERVER_T, + loc, + } : { kind: "libCall", fn: "tls.createServer", @@ -5099,11 +5145,19 @@ function lowerTlsModuleCall( "use (socket) or ()", [NETSOCKET_T], ); - return opts.dyn !== undefined + if (opts.dyn !== undefined) + return { + kind: "libCall", + fn: "tls.createServerDynCb", + args: [opts.dyn, cb], + type: NETSERVER_T, + loc, + }; + return opts.sni !== undefined ? { kind: "libCall", - fn: "tls.createServerDynCb", - args: [opts.dyn, cb], + fn: "tls.createServerSniCb", + args: [opts.cert, opts.key, opts.sni, cb], type: NETSERVER_T, loc, } @@ -5481,6 +5535,44 @@ const SNI_HINT = "...(x ? { SNICallback: x } : {}) — the callback is (servername, cb) => void " + "with cb: (err: Error | null, ctx?: tls.SecureContext) => void"; +/** An SNICallback option value: (servername: string, cb) => void where cb + * is (err: Error | null, ctx?: SecureContext) => void, or that function + * unioned with undefined (no callback). cb may declare fewer params (the + * emitted answer thunk matches its ABI), but what it does declare must + * carry the arms the thunk decodes. */ +function lowerSniCallbackValue( + lowerer: Lowerer, + node: ts.Expression, + blame: ts.Node, + what: string, +): IrExpr { + return checkSniCallbackValue(lowerer, lowerer.lowerExpr(node), blame, what); +} + +function checkSniCallbackValue(lowerer: Lowerer, v: IrExpr, blame: ts.Node, what: string): IrExpr { + const shapeOk = (t: IrType): boolean => { + if (t.kind !== "func" || t.ret.kind !== "void" || t.params.length !== 2) return false; + if (t.params[0]!.kind !== "string") return false; + const cbT = t.params[1]!; + if (cbT.kind !== "func" || cbT.ret.kind !== "void" || cbT.params.length > 2) return false; + const armKinds = (u: IrType): string[] => + u.kind === "union" ? (lowerer.unions.get(u.unionId)?.arms ?? []).map((a) => a.kind) : []; + const p0 = cbT.params[0]; + if (p0 !== undefined && !armKinds(p0).includes("nullT")) return false; + const p1 = cbT.params[1]; + if (p1 !== undefined && !armKinds(p1).includes("secureCtx")) return false; + return true; + }; + const arms = v.type.kind === "union" ? (lowerer.unions.get(v.type.unionId)?.arms ?? []) : []; + const funcArm = v.type.kind === "func" ? v.type : arms.find((a) => a.kind === "func"); + const unionOk = + v.type.kind !== "union" || (arms.length === 2 && arms.some((a) => a.kind === "undefinedT")); + if (funcArm === undefined || !unionOk || !shapeOk(funcArm)) { + lowerer.noLowering(`a ${what} SNICallback of '${lowerer.fmt(v.type)}' values`, blame, SNI_HINT); + } + return v; +} + /** Strips parentheses and type assertions: the portless spelling wraps * an options spread as `...({ ... } as Record)`. */ function stripParensAndCasts(node: ts.Expression): ts.Expression { @@ -5733,43 +5825,8 @@ function lowerHttp2ModuleCall( let sni: IrExpr | null = null; let allowHttp1 = false; let enableConnectProtocol = false; - // The SNICallback value shape: (servername: string, cb) => void where - // cb is (err: Error | null, ctx?: SecureContext) => void — cb may - // declare fewer params (the emitted answer thunk matches its ABI), - // but what it does declare must carry the arms the thunk decodes. - const sniShapeOk = (t: IrType): boolean => { - if (t.kind !== "func" || t.ret.kind !== "void" || t.params.length !== 2) return false; - if (t.params[0]!.kind !== "string") return false; - const cbT = t.params[1]!; - if (cbT.kind !== "func" || cbT.ret.kind !== "void" || cbT.params.length > 2) return false; - const armKinds = (u: IrType): string[] => - u.kind === "union" ? (lowerer.unions.get(u.unionId)?.arms ?? []).map((a) => a.kind) : []; - const p0 = cbT.params[0]; - if (p0 !== undefined && !armKinds(p0).includes("nullT")) return false; - const p1 = cbT.params[1]; - if (p1 !== undefined && !armKinds(p1).includes("secureCtx")) return false; - return true; - }; const lowerSniValue = (node: ts.Expression, blame: ts.Node): void => { - const v = lowerer.lowerExpr(node); - const funcArm = - v.type.kind === "func" - ? v.type - : v.type.kind === "union" - ? (lowerer.unions.get(v.type.unionId)?.arms ?? []).find((a) => a.kind === "func") - : undefined; - const unionOk = - v.type.kind !== "union" || - ((lowerer.unions.get(v.type.unionId)?.arms ?? []).length === 2 && - (lowerer.unions.get(v.type.unionId)?.arms ?? []).some((a) => a.kind === "undefinedT")); - if (funcArm === undefined || !unionOk || !sniShapeOk(funcArm)) { - lowerer.noLowering( - `a createSecureServer SNICallback of '${lowerer.fmt(v.type)}' values`, - blame, - SNI_HINT, - ); - } - sni = v; + sni = lowerSniCallbackValue(lowerer, node, blame, "createSecureServer"); }; const lowerOption = (prop: ts.ObjectLiteralElementLike): void => { if (ts.isSpreadAssignment(prop)) { diff --git a/packages/compiler/src/ir/builtin-signatures.ts b/packages/compiler/src/ir/builtin-signatures.ts index 9f383c695..da045a6f5 100644 --- a/packages/compiler/src/ir/builtin-signatures.ts +++ b/packages/compiler/src/ir/builtin-signatures.ts @@ -2110,6 +2110,11 @@ export const LIB_FN_SIGS = defineLibFnSignatures({ * surface — the handles are the same kinds. */ "tls.createServer": { argTypes: [null, null], result: NETSERVER_T }, "tls.createServerCb": { argTypes: [null, null, null], result: NETSERVER_T }, + /** The SNICallback forms: (cert, key, SNICallback[, handler]). The + * callback is http2.createSecureServerSni's shape, a function or a + * function | undefined union. */ + "tls.createServerSni": { argTypes: [null, null, null], result: NETSERVER_T }, + "tls.createServerSniCb": { argTypes: [null, null, null, null], result: NETSERVER_T }, // The runtime options records (divergence 66's stance): a dyn options // value whose members read at runtime; pemDyn extracts a runtime-valued // cert/key member (arg 1 is the precomposed fence label). diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6933-tls-sni-callback.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6933-tls-sni-callback.ts.json new file mode 100644 index 000000000..4cf80592f --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6933-tls-sni-callback.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6933-tls-sni-callback.ts" + ], + "diags": [] +} diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6934-tls-handshake-disconnect.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6934-tls-handshake-disconnect.ts.json new file mode 100644 index 000000000..ae362a423 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6934-tls-handshake-disconnect.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6934-tls-handshake-disconnect.ts" + ], + "diags": [] +} diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/diagnostics/tls-sni-callback-fences.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/diagnostics/tls-sni-callback-fences.ts.json new file mode 100644 index 000000000..ee2ea72f0 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/diagnostics/tls-sni-callback-fences.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/diagnostics/tls-sni-callback-fences.ts" + ], + "diags": [] +} diff --git a/packages/runtime/src/scr_error.c b/packages/runtime/src/scr_error.c index 94523fc43..b974474bf 100644 --- a/packages/runtime/src/scr_error.c +++ b/packages/runtime/src/scr_error.c @@ -409,13 +409,15 @@ SCR_TL ScrError *scr_event_error_payload = NULL; /* The code Node attaches to the runtime's event-error messages whose text * carries no errno name: connResetException's "socket hang up" and - * "aborted", the HTTP parser's header overflow, and the TLS verification - * failures (the openssl reason Node reports as the code). NULL for any + * "aborted", the TLS client's disconnect before the handshake completes, + * the HTTP parser's header overflow, and the TLS verification failures (the openssl reason Node reports as the code). NULL for any * other message. */ const char *scr_error_message_code(const ScrStr *msg) { static const struct { const char *prefix; bool whole; const char *code; } known[] = { { "socket hang up", true, "ECONNRESET" }, { "aborted", true, "ECONNRESET" }, + { "Client network socket disconnected before secure TLS connection was established", true, + "ECONNRESET" }, { "Parse Error: Header overflow", true, "HPE_HEADER_OVERFLOW" }, { "certificate has expired", true, "CERT_HAS_EXPIRED" }, { "self-signed certificate in certificate chain", true, "SELF_SIGNED_CERT_IN_CHAIN" }, diff --git a/packages/runtime/src/scr_tls.c b/packages/runtime/src/scr_tls.c index 526dd7760..b4d125cb2 100644 --- a/packages/runtime/src/scr_tls.c +++ b/packages/runtime/src/scr_tls.c @@ -1057,10 +1057,10 @@ static int scr_tls_handshake(void *tctx) { if (r == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) { scr_tls_verify_msg(t, msg, sizeof msg); } else if (r == MBEDTLS_ERR_SSL_CONN_EOF || r == MBEDTLS_ERR_NET_CONN_RESET) { - /* the peer died mid-handshake: the http layer's own premature-close - * shape ('socket hang up') is Node's message — tear down without an error - * at this level and let the closed hook classify it */ - scr_net_sock_transport_error(t->sock, NULL); + /* The peer closed or reset the connection mid-handshake: Node's + * ECONNRESET for tls.connect and https.request alike. */ + scr_net_sock_transport_error( + t->sock, "Client network socket disconnected before secure TLS connection was established"); return -1; } else if (r == MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE && t->ssl.MBEDTLS_PRIVATE(in_msg) != NULL && @@ -1170,8 +1170,15 @@ static ScrNetServer *scr_tls_create_server_alpn(const char *cert, size_t cert_le const char *key, size_t key_len, ScrClosure *handler /*moves, nullable*/, ScrNetConnFn fn, char **alpn /*moves, nullable*/, - int min_version, int max_version) { + int min_version, int max_version, + ScrClosure *sni_cb /*moves, nullable*/, + void *sni_answer_fn) { ScrTlsSrv *srv = scr_tls_srv_new(cert, cert_len, key, key_len, false); + if (sni_cb != NULL) { + srv->sni_cb = sni_cb; /* moves; released with srv */ + srv->sni_answer_fn = sni_answer_fn; + mbedtls_ssl_conf_sni(&srv->conf, &scr_tls_f_sni, NULL); + } srv->max_tls12 = max_version == 12; if (!scr_tls_conf_versions(&srv->conf, min_version, max_version)) { /* Node's server then fails every handshake; nothing here models @@ -1198,7 +1205,21 @@ static ScrNetServer *scr_tls_create_server_alpn(const char *cert, size_t cert_le ScrNetServer *scr_tls_create_server(const char *cert, size_t cert_len, const char *key, size_t key_len, ScrClosure *handler /*moves, nullable*/, ScrNetConnFn fn) { - return scr_tls_create_server_alpn(cert, cert_len, key, key_len, handler, fn, NULL, 12, 13); + return scr_tls_create_server_alpn(cert, cert_len, key, key_len, handler, fn, NULL, 12, 13, NULL, + NULL); +} + +/* tls.createServer({ cert, key, SNICallback }): the pre-parse machinery + * (design note atop the SNI section) hands each ClientHello's servername + * to the callback and serves the context it answers, or the default pair + * for none. A NULL sni_cb (the callback union's undefined arm) is + * scr_tls_create_server. */ +ScrNetServer *scr_tls_create_server_sni(const char *cert, size_t cert_len, const char *key, + size_t key_len, ScrClosure *handler /*moves, nullable*/, + ScrNetConnFn fn, ScrClosure *sni_cb /*moves, nullable*/, + void *sni_answer_fn) { + return scr_tls_create_server_alpn(cert, cert_len, key, key_len, handler, fn, NULL, 12, 13, sni_cb, + sni_answer_fn); } ScrNetServer *scr_https_create_server(const char *cert, size_t cert_len, const char *key, @@ -2024,7 +2045,7 @@ ScrNetServer *scr_tls_create_server_dyn(const ScrDyn *opts /*borrowed*/, } ScrNetServer *s = scr_tls_create_server_alpn((const char *)cert->data, cert->len, (const char *)key->data, key->len, handler, fn, - alpn, min_version, max_version); + alpn, min_version, max_version, NULL, NULL); scr_bytes_release(cert); scr_bytes_release(key); return s; diff --git a/packages/runtime/src/scr_tls.h b/packages/runtime/src/scr_tls.h index 0b1714eb3..fcb221b42 100644 --- a/packages/runtime/src/scr_tls.h +++ b/packages/runtime/src/scr_tls.h @@ -15,6 +15,9 @@ * (port 443 default, `ca` / rejectUnauthorized for local-CA flows — * cert/key/ca all arrive as borrowed PEM bytes). */ ScrNetServer *scr_tls_create_server(const char *cert, size_t cert_len, const char *key, size_t key_len, ScrClosure *handler /*moves, nullable*/, ScrNetConnFn fn); /* +1 */ +/* The SNICallback form: sni_cb (moves, nullable) receives (servername, answer), and + * sni_answer_fn is the emitted thunk that hands the answer to scr_tls_sni_answer. */ +ScrNetServer *scr_tls_create_server_sni(const char *cert, size_t cert_len, const char *key, size_t key_len, ScrClosure *handler /*moves, nullable*/, ScrNetConnFn fn, ScrClosure *sni_cb /*moves, nullable*/, void *sni_answer_fn); /* +1 */ /* ── RUNTIME tls/https options records (the divergence-66 stance: a * non-literal options value reads its members at runtime; members whose diff --git a/tests/corpus/6933-tls-sni-callback.ts b/tests/corpus/6933-tls-sni-callback.ts new file mode 100644 index 000000000..7958882d5 --- /dev/null +++ b/tests/corpus/6933-tls-sni-callback.ts @@ -0,0 +1,65 @@ +// tls.createServer with an SNICallback: the callback receives each +// ClientHello's servername and answers a SecureContext synchronously or +// later, or none, so the default cert/key pair serves; an error answer +// fails that handshake. Clients that trust the CA see the certificate the +// answer chose: alt.localhost verifies only with the alt context, and a +// name served the default localhost pair fails Node's hostname check. +import { readFileSync } from "node:fs"; +import * as net from "node:net"; +import * as tls from "node:tls"; + +const certs = "tests/fixtures/server/certs"; +const ca = readFileSync(`${certs}/ca.pem`); +const cert = readFileSync(`${certs}/localhost.pem`); +const key = readFileSync(`${certs}/localhost-key.pem`); +const altContext = tls.createSecureContext({ + cert: readFileSync(`${certs}/alt.pem`), + key: readFileSync(`${certs}/alt-key.pem`), +}); + +const server = tls.createServer( + { + cert, + key, + SNICallback: (servername: string, cb: (err: Error | null, ctx?: tls.SecureContext) => void) => { + console.log("sni", servername); + if (servername === "alt.localhost") setTimeout(() => cb(null, altContext), 5); + else if (servername === "fail.localhost") cb(new Error(`no certificate for ${servername}`)); + else cb(null, undefined); + }, + }, + (socket) => { + socket.end("hello"); + }, +); + +function attempt(port: number, servername: string, next: () => void): void { + let done = false; + const finish = (line: string): void => { + if (done) return; + done = true; + console.log(servername, line); + next(); + }; + const socket = tls.connect({ port, host: "127.0.0.1", servername, ca }, () => { + let text = ""; + socket.on("data", (data: Buffer) => { + text += data.toString(); + }); + socket.on("end", () => finish(`authorized ${socket.authorized} ${text}`)); + }); + socket.on("error", (error: Error) => { + finish(`error ${(error as NodeJS.ErrnoException).code}`); + }); +} + +server.listen(0, "127.0.0.1", () => { + const port = (server.address() as net.AddressInfo).port; + attempt(port, "localhost", () => + attempt(port, "alt.localhost", () => + attempt(port, "other.localhost", () => + attempt(port, "fail.localhost", () => server.close(() => console.log("closed"))), + ), + ), + ); +}); diff --git a/tests/corpus/6934-tls-handshake-disconnect.ts b/tests/corpus/6934-tls-handshake-disconnect.ts new file mode 100644 index 000000000..1f13c6684 --- /dev/null +++ b/tests/corpus/6934-tls-handshake-disconnect.ts @@ -0,0 +1,27 @@ +// A server that closes the connection before the TLS handshake completes: +// tls.connect and https.get fail with ECONNRESET and Node's "Client network +// socket disconnected before secure TLS connection was established". +import * as https from "node:https"; +import * as net from "node:net"; +import * as tls from "node:tls"; + +const server = net.createServer((socket) => { + socket.end(); +}); + +server.listen(0, "127.0.0.1", () => { + const port = (server.address() as net.AddressInfo).port; + const client = tls.connect({ port, host: "127.0.0.1", rejectUnauthorized: false }, () => { + console.log("tls connected"); + }); + client.on("error", (error: Error) => { + console.log("tls", (error as NodeJS.ErrnoException).code, error.message); + const request = https.get({ host: "127.0.0.1", port, rejectUnauthorized: false }, () => { + console.log("https response"); + }); + request.on("error", (err: Error) => { + console.log("https", (err as NodeJS.ErrnoException).code, err.message); + server.close(); + }); + }); +}); diff --git a/tests/diagnostics/tls-sni-callback-fences.ts b/tests/diagnostics/tls-sni-callback-fences.ts new file mode 100644 index 000000000..0c745365c --- /dev/null +++ b/tests/diagnostics/tls-sni-callback-fences.ts @@ -0,0 +1,15 @@ +// tls.createServer SNICallback forms that have no lowering. +import { readFileSync } from "node:fs"; +import * as tls from "node:tls"; + +const cert = readFileSync("cert.pem"); +const key = readFileSync("key.pem"); +type Answer = (err: Error | null, ctx?: tls.SecureContext) => void; +function makeSni(): (servername: string, cb: Answer) => void { + return (_servername, cb) => cb(null, undefined); +} + +// The callback expression has side effects. +tls.createServer({ cert, key, SNICallback: makeSni() }, (socket) => socket.end()); +// SNICallback with options the runtime options walk reads. +tls.createServer({ cert, key, ALPNProtocols: ["h2"], SNICallback: makeSni }); diff --git a/tests/harness/__snapshots__/tls-sni-callback-fences.ts.txt b/tests/harness/__snapshots__/tls-sni-callback-fences.ts.txt new file mode 100644 index 000000000..920e65532 --- /dev/null +++ b/tests/harness/__snapshots__/tls-sni-callback-fences.ts.txt @@ -0,0 +1,17 @@ +tls-sni-callback-fences.ts:13:31 - error SC2020: 'a tls.createServer SNICallback expression with side effects' is part of the standard library types but has no scriptc lowering yet + + 12 | // The callback expression has side effects. + 13 | tls.createServer({ cert, key, SNICallback: makeSni() }, (socket) => socket.end()); + | ^~~~~~~~~~~~~~~~~~~~~~ + 14 | // SNICallback with options the runtime options walk reads. + + hint: pass a function or a variable that holds one + +tls-sni-callback-fences.ts:15:54 - error SC2020: 'tls.createServer with SNICallback and options the runtime walk reads' is part of the standard library types but has no scriptc lowering yet + + 14 | // SNICallback with options the runtime options walk reads. + 15 | tls.createServer({ cert, key, ALPNProtocols: ["h2"], SNICallback: makeSni }); + | ^~~~~~~~~~~~~~~~~~~~ + 16 | + + hint: SNICallback lowers with cert and key; ALPNProtocols, minVersion, maxVersion and the validated options are not combined with it yet \ No newline at end of file From fc38e627915826a2e56e9f1843f3c5bc56df9752 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 14:10:23 -0500 Subject: [PATCH 15/67] Stop importing runtime bitcode into program builds --- docs/content/docs/cli.mdx | 2 +- native/llvm-codegen/README.md | 2 +- .../src/backend/native-codegen.test.ts | 24 ------ .../compiler/src/backend/native-codegen.ts | 8 -- packages/compiler/src/backend/optimization.ts | 4 +- .../compiler/src/backend/runtime-pack.test.ts | 79 +------------------ packages/compiler/src/backend/runtime-pack.ts | 46 ----------- packages/compiler/src/index.ts | 35 +------- 8 files changed, 11 insertions(+), 189 deletions(-) diff --git a/docs/content/docs/cli.mdx b/docs/content/docs/cli.mdx index daeb37ea0..efdb03d7d 100644 --- a/docs/content/docs/cli.mdx +++ b/docs/content/docs/cli.mdx @@ -127,7 +127,7 @@ With `--sparse`, the profile leaves out the functions the runs never reached. Th
Remove symbol and debug payload when linking an executable, including cross-compiled targets. This flag preserves code optimization.
--optimization <release|dev|speed>
-
Select native optimization for executable, assembly, or object output. The default is release (-O2), which emits string retains and the retains and releases of dynamic values inline and lets LLVM inline small runtime functions that keep no internal runtime state into executable code; programs large enough to be compiled in parallel partitions skip that inlining to keep build time and size in check. dev uses -O0 and emits source locations for TypeScript and JavaScript breakpoints and stack frames. LLVM builds include source variable names and native storage descriptions; see Native debugging for the supported representations. macOS executable builds also produce an adjacent .dSYM bundle. speed is -O2 plus optimizations that trade binary size and build time for run-time speed: it lets LLVM inline more small runtime functions into program code, emits the remaining reference counting inline, and on x86-64 starts every runtime function on a cache-line boundary. Expect larger executables and longer cold builds than release; how much faster a program runs depends on how much of its time is spent in the runtime. Runtime inlining needs a runtime pack built with the LLVM helper; where a runtime pack lacks it, programs link the same runtime without it and speed links the release runtime and keeps inline reference counting. Selecting speed never changes what release builds produce, and the two never share cached artifacts. Library profiles accept "optimization": "speed" for inline reference counting. In executables large enough to be divided into partitions, dev compiles each partition on its own, and release and speed add a step that lets partitions import small functions from each other; see Build parallelism.
+
Select native optimization for executable, assembly, or object output. The default is release (-O2), which emits string retains and the retains and releases of dynamic values inline. dev uses -O0 and emits source locations for TypeScript and JavaScript breakpoints and stack frames. LLVM builds include source variable names and native storage descriptions; see Native debugging for the supported representations. macOS executable builds also produce an adjacent .dSYM bundle. speed is -O2 plus optimizations that trade binary size and build time for run-time speed: it emits the remaining reference counting inline and, on x86-64, starts every runtime function on a cache-line boundary. Expect larger executables and longer cold builds than release; how much faster a program runs depends on how much of its time is spent in the runtime. Where a runtime pack has no speed runtime, speed links the release runtime and keeps inline reference counting. Selecting speed never changes what release builds produce, and the two never share cached artifacts. Library profiles accept "optimization": "speed" for inline reference counting. In executables large enough to be divided into partitions, dev compiles each partition on its own, and release and speed add a step that lets partitions import small functions from each other; see Build parallelism.
--windows-subsystem <console|gui>
Select the subsystem of a Windows executable. console is the default; gui prevents Windows from opening a console window for the app. Valid only for executable builds targeting Windows.
diff --git a/native/llvm-codegen/README.md b/native/llvm-codegen/README.md index 8debaeeaf..0e8abbc47 100644 --- a/native/llvm-codegen/README.md +++ b/native/llvm-codegen/README.md @@ -39,7 +39,7 @@ WebAssembly code generation differs from LLVM's default pipeline in two ways tha `--cache-dir ` names a private directory the caller owns for one helper build. Simplified partitions are stored under the hash of their exact source and objects under the hash of the exact module after importing, each with a trailing digest and published by rename, so a rebuild recompiles only the partitions an edit can affect. -Unsanitized `speed` program builds, and unsanitized `release` builds of programs small enough for one partition, pass `--import-bitcode ` once per runtime-pack unit the program links that ships bitcode. Small runtime functions reachable from the program's runtime calls are imported as `available_externally` so LLVM can inline them; the runtime objects remain the only definitions. The helper never runs a sanitizer pass, so with import it also drops the emitter's inert `sanitize_address` attributes, which would otherwise block that inlining. Without `--import-bitcode` the module is optimized exactly as emitted. +`--import-bitcode `, given once per runtime-pack unit that ships bitcode, imports runtime functions for inlining; scriptc's program builds do not pass it. Small runtime functions reachable from the program's runtime calls are imported as `available_externally` so LLVM can inline them; the runtime objects remain the only definitions. The helper never runs a sanitizer pass, so with import it also drops the emitter's inert `sanitize_address` attributes, which would otherwise block that inlining. Without `--import-bitcode` the module is optimized exactly as emitted. Runtime-pack builds emit each unit of the executable `speed` flavor through the helper: diff --git a/packages/compiler/src/backend/native-codegen.test.ts b/packages/compiler/src/backend/native-codegen.test.ts index 21c74e51c..545711a60 100644 --- a/packages/compiler/src/backend/native-codegen.test.ts +++ b/packages/compiler/src/backend/native-codegen.test.ts @@ -168,30 +168,6 @@ test("resolves a package helper, emits atomically, and caches by all native inpu expect(secondArtifact.dependencies).toEqual(firstArtifact.dependencies); }); -test("runtime bitcode imports reach the helper and key the native cache", async () => { - const pkg = await fakePackage(); - const base = request(pkg.root, pkg.packageJson, join(pkg.root, "plain.o")); - await emitNativeArtifact(base); - const imported = { - ...request(pkg.root, pkg.packageJson, join(pkg.root, "imported.o")), - importBitcode: { - paths: ["/pack/a.bc", "/pack/b.bc"], - digests: ["a".repeat(64), "b".repeat(64)], - }, - }; - await emitNativeArtifact(imported); - await emitNativeArtifact({ - ...imported, - outputPath: join(pkg.root, "changed.o"), - importBitcode: { ...imported.importBitcode, digests: ["a".repeat(64), "c".repeat(64)] }, - }); - await emitNativeArtifact({ ...imported, outputPath: join(pkg.root, "again.o") }); - const calls = (await readFile(pkg.log, "utf8")).trim().split("\n"); - expect(calls).toHaveLength(3); - expect(calls[0]).not.toContain("--import-bitcode"); - expect(calls[1]).toContain("--import-bitcode /pack/a.bc --import-bitcode /pack/b.bc"); -}); - test("profiles reach the helper and key the native cache by their bytes", async () => { const pkg = await fakePackage(); const base = request(pkg.root, pkg.packageJson, join(pkg.root, "plain.o")); diff --git a/packages/compiler/src/backend/native-codegen.ts b/packages/compiler/src/backend/native-codegen.ts index 39e570cd5..5b91c60e7 100644 --- a/packages/compiler/src/backend/native-codegen.ts +++ b/packages/compiler/src/backend/native-codegen.ts @@ -111,8 +111,6 @@ export interface NativeCodegenOptions { cacheRoot?: string | null; /** Program partitions, written to nativePartitionPaths(outputPath). */ partitions?: number; - /** Runtime bitcode whose small functions the helper imports for inlining. */ - importBitcode?: { paths: readonly string[]; digests: readonly string[] }; /** Profile-guided optimization: instrumentation or an indexed profile. */ profile?: NativeProfileOptions; } @@ -339,11 +337,6 @@ function cacheKey( .update("\0") .update(options.sourcePath) .update((options.partitions ?? 1) > 1 ? `\0partitions:${options.partitions}` : "") - .update( - options.importBitcode === undefined - ? "" - : `\0import:${options.importBitcode.digests.join(",")}`, - ) .update(options.profile === undefined ? "" : `\0${nativeProfileKey(options.profile)}`) .digest("hex"); } @@ -482,7 +475,6 @@ export async function emitNativeArtifact( "json", "--source-path", options.sourcePath, - ...(options.importBitcode?.paths ?? []).flatMap((path) => ["--import-bitcode", path]), ...(partitionCache === null ? [] : ["--cache-dir", partitionCache]), ...nativeProfileHelperArgs(options.profile), ]); diff --git a/packages/compiler/src/backend/optimization.ts b/packages/compiler/src/backend/optimization.ts index f26b99dcc..05e275afd 100644 --- a/packages/compiler/src/backend/optimization.ts +++ b/packages/compiler/src/backend/optimization.ts @@ -3,8 +3,8 @@ * - `release` (default): -O2 program code against the release runtime flavor. * - `dev`: -O0, source line tables, and cached object shards. * - `speed`: -O2 plus optimizations that trade binary size and build time for - * run-time speed (a size-for-speed runtime flavor, runtime bitcode import, - * inline reference counting). Release output never depends on them. + * run-time speed (a size-for-speed runtime flavor, inline reference + * counting). Release output never depends on them. * * Speed is an optimized posture everywhere release is: it shares -O2, release * linker flags, and release-only program partitioning. Cache keys spell it diff --git a/packages/compiler/src/backend/runtime-pack.test.ts b/packages/compiler/src/backend/runtime-pack.test.ts index 4fd53c01e..ee2301172 100644 --- a/packages/compiler/src/backend/runtime-pack.test.ts +++ b/packages/compiler/src/backend/runtime-pack.test.ts @@ -9,7 +9,6 @@ import type { NativeLinkFeatures } from "./native-link-info.js"; import { effectiveRuntimeFeatures, evaluateRuntimePredicate, - loadRuntimeBitcode, loadRuntimePack, parseRuntimePackManifest, RuntimePackError, @@ -262,80 +261,10 @@ describe("runtime pack manifests", () => { expect(fileHandle.archives.map((path) => path.split("/").at(-1))).toEqual(["zlib.a"]); }); - test("runtime bitcode follows the selected flavor variant and is verified", async () => { - const { root, packagePath, manifest } = await fixture(); - const bitcode = async (path: string, bytes: string) => { - await writeFile(join(root, path), bytes); - return { - path, - sha256: createHash("sha256").update(bytes).digest("hex"), - size: Buffer.byteLength(bytes), - }; - }; - const unit = manifest.flavors.release!.runtime_units[0]!; - const withBitcode: RuntimePackManifest = { - ...manifest, - flavors: { - ...manifest.flavors, - speed: { - optimization: "-O2", - runtime_units: [ - { - ...unit, - variants: [ - { ...unit.variants[0]!, bitcode: await bitcode("artifacts/base.bc", "base-bc") }, - { - ...unit.variants[1]!, - bitcode: await bitcode("artifacts/legacy.bc", "legacy-bc"), - }, - unit.variants[2]!, - ], - }, - ], - }, - }, - }; - const resolver = () => packagePath; - const speed = { target: MACOS_ARM64_TARGET, optimization: "speed" } as const; - // Release programs import their own units' bitcode. Speed programs - // never import release bitcode: without a speed flavor they import none. - await writeFile( - join(root, "runtime-pack.json"), - JSON.stringify({ - ...withBitcode, - flavors: { ...withBitcode.flavors, release: withBitcode.flavors.speed, speed: undefined }, - }), - ); - expect(await loadRuntimeBitcode({ ...speed, features: BASE, resolver })).toBeNull(); - const release = await loadRuntimeBitcode({ - target: MACOS_ARM64_TARGET, - optimization: "release", - features: BASE, - resolver, - }); - expect(release?.paths.map((path) => basename(path))).toEqual(["base.bc"]); - await writeFile(join(root, "runtime-pack.json"), JSON.stringify(withBitcode)); - const legacy = await loadRuntimeBitcode({ - ...speed, - features: { ...BASE, textDecoderLegacy: true }, - resolver, - }); - expect(legacy?.paths.map((path) => basename(path))).toEqual(["legacy.bc"]); - expect(legacy?.digests).toEqual([createHash("sha256").update("legacy-bc").digest("hex")]); - // A variant without bitcode imports nothing. - expect( - await loadRuntimeBitcode({ - ...speed, - features: { ...BASE, fileHandle: true }, - resolver, - }), - ).toBeNull(); - await writeFile(join(root, "artifacts/base.bc"), "damaged"); - await expect(loadRuntimeBitcode({ ...speed, features: BASE, resolver })).rejects.toThrow( - "hash mismatch", - ); - const malformed = structuredClone(withBitcode); - malformed.flavors.speed!.runtime_units[0]!.variants[0]!.bitcode = { + test("runtime unit bitcode must stay inside the pack", async () => { + const { manifest } = await fixture(); + const malformed = structuredClone(manifest); + malformed.flavors.release!.runtime_units[0]!.variants[0]!.bitcode = { path: "../escape.bc", sha256: "0".repeat(64), size: 1, diff --git a/packages/compiler/src/backend/runtime-pack.ts b/packages/compiler/src/backend/runtime-pack.ts index 5f813802c..2bfe71756 100644 --- a/packages/compiler/src/backend/runtime-pack.ts +++ b/packages/compiler/src/backend/runtime-pack.ts @@ -46,8 +46,6 @@ export interface RuntimePackSelection { sourceDependencies: NativeArtifactDependency[]; selectedRuntimeArtifacts: RuntimePackArtifact[]; selectedArchiveArtifacts: RuntimePackArtifact[]; - /** Bitcode of the selected runtime units that ship it, in unit order. */ - selectedRuntimeBitcode: RuntimePackArtifact[]; } async function verifyArtifact(root: string, artifact: RuntimePackArtifact): Promise { @@ -249,49 +247,5 @@ export async function loadRuntimePack(options: { sourceDependencies, selectedRuntimeArtifacts: selectedVariants, selectedArchiveArtifacts: selectedArchives, - selectedRuntimeBitcode: selectedVariants.flatMap((variant) => - variant.bitcode === undefined ? [] : [variant.bitcode], - ), - }; -} - -export interface RuntimeBitcodeImport { - paths: string[]; - /** Content digests, in path order, for cache keys. */ - digests: string[]; - dependencies: NativeArtifactDependency[]; -} - -/** Verified bitcode for the runtime units of the given flavor that a program - * links, for the helper's available_externally import. Release units carry - * their compiled bitcode reduced to the bodies that need no unit-local - * state; speed units carry their promoted bitcode. Null when the selected - * units ship no bitcode (a pack built without the helper, or no speed - * flavor). */ -export async function loadRuntimeBitcode(options: { - target: NativeTargetSpec; - features: NativeLinkFeatures; - optimization: "release" | "speed"; - env?: NodeJS.ProcessEnv; - resolver?: (specifier: string) => string; -}): Promise { - const pack = await loadRuntimePack(options); - // Without a speed flavor, speed programs link release units; only the - // speed flavor's promoted objects match speed bitcode. - if (options.optimization === "speed" && pack.manifest.flavors.speed === undefined) return null; - if (pack.selectedRuntimeBitcode.length === 0) return null; - const paths = await Promise.all( - pack.selectedRuntimeBitcode.map((artifact) => verifyArtifact(pack.root, artifact)), - ); - let dependencies: NativeArtifactDependency[]; - try { - dependencies = await snapshotDependencies([pack.manifestPath, ...paths]); - } catch { - throw new RuntimePackError("runtime pack bitcode changed during selection", "invalid"); - } - return { - paths, - digests: pack.selectedRuntimeBitcode.map((artifact) => artifact.sha256), - dependencies, }; } diff --git a/packages/compiler/src/index.ts b/packages/compiler/src/index.ts index 08457f86b..8b0ea6825 100644 --- a/packages/compiler/src/index.ts +++ b/packages/compiler/src/index.ts @@ -82,7 +82,7 @@ import { privateSiblingPath } from "./backend/build-cache.js"; import { nativeCodegenTarget, nativeCodegenTargetRefusal } from "./backend/targets.js"; import { windowsSubsystemLinkerArgs, type WindowsSubsystem } from "./backend/targets.js"; import { createNativeLinkInfo } from "./backend/native-link-info.js"; -import { RuntimePackError, loadRuntimeBitcode } from "./backend/runtime-pack.js"; +import { RuntimePackError } from "./backend/runtime-pack.js"; import { createNativeLinkPlan } from "./backend/link-plan.js"; import { nativeProfileKey, @@ -634,7 +634,6 @@ async function emitNativeProgramObject( entryPath: string, opts: CompileRequestOptions, llvm: LlvmInput, - features: EarlyExecutableNativeFeatures, profile: NativeProfileOptions | undefined, ): Promise { const stem = basename(entryPath).replace(/\.(ts|mts|cts|js|mjs|cjs)$/, ""); @@ -648,24 +647,6 @@ async function emitNativeProgramObject( const llvmBytes = llvmInputBytes(llvm); const partitions = opts.nativeProgramObject === true || target === null ? 1 : nativeProgramPartitions(llvmBytes); - // Optimized programs import small runtime functions from the bitcode of - // the exact runtime units they link, so LLVM can inline across the - // boundary. Release units ship only the bodies that need none of their - // unit-local state, which keeps the import cheap; speed units promote - // that state and offer more. Every partition reads the bitcode again, so - // release imports only into programs small enough for one partition: in - // larger ones the build-time and size cost outgrows the gain. - const runtimeBitcode = - opts.sanitize !== true && - target !== null && - (opts.optimization === "speed" || - (opts.optimization !== "dev" && nativeProgramPartitions(llvmBytes) === 1)) - ? await loadRuntimeBitcode({ - target, - features, - optimization: opts.optimization === "speed" ? "speed" : "release", - }) - : null; try { const artifact = await emitNativeArtifact({ outputPath: linkPath, @@ -675,16 +656,13 @@ async function emitNativeProgramObject( optimization: opts.optimization === "dev" ? "0" : "2", ...(opts.sanitize === undefined ? {} : { sanitize: opts.sanitize }), partitions, - ...(runtimeBitcode === null - ? {} - : { importBitcode: { paths: runtimeBitcode.paths, digests: runtimeBitcode.digests } }), ...(profile === undefined ? {} : { profile }), }); return { linkPath, partitionPaths: artifact.outputPaths.slice(1), artifactPath, - dependencies: [...artifact.dependencies, ...(runtimeBitcode?.dependencies ?? [])], + dependencies: artifact.dependencies, }; } catch (error) { await removeNativeProgramObject(linkPath, nativePartitionPaths(linkPath, partitions)); @@ -1467,7 +1445,6 @@ async function compileTracked( // A large program's LLVM exceeds the engine's string limit as one // string; the emitter takes it in parts, as on a cold build. await readTextParts(earlyHit.llvmPath), - earlyHit.native, profile, ); nativeInputPath = nativeProgramObject.linkPath; @@ -1583,13 +1560,7 @@ async function compileTracked( ); } try { - nativeProgramObject = await emitNativeProgramObject( - entryPath, - opts, - llvmSource, - nativeFeatures, - profile, - ); + nativeProgramObject = await emitNativeProgramObject(entryPath, opts, llvmSource, profile); timing("native-object"); await recordEarlyExecutableNativeBuild(cacheRoot, executableCacheOptions).catch( () => undefined, From 453bcf8e3887f33f9b47b6f07cdfc4266d38f6f1 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 14:19:48 -0500 Subject: [PATCH 16/67] Revisit only the changed sites of the optional-read fixed point --- .../compiler/src/frontend/lowering/lowerer.ts | 87 ++++++++++++++++--- .../lowering/runtime-optional-elements.ts | 22 ++++- .../lowering/site-dependencies.test.ts | 56 ++++++++++++ .../frontend/lowering/site-dependencies.ts | 79 +++++++++++++++++ 4 files changed, 232 insertions(+), 12 deletions(-) create mode 100644 packages/compiler/src/frontend/lowering/site-dependencies.test.ts create mode 100644 packages/compiler/src/frontend/lowering/site-dependencies.ts diff --git a/packages/compiler/src/frontend/lowering/lowerer.ts b/packages/compiler/src/frontend/lowering/lowerer.ts index cbd70a913..1b5e30545 100644 --- a/packages/compiler/src/frontend/lowering/lowerer.ts +++ b/packages/compiler/src/frontend/lowering/lowerer.ts @@ -121,6 +121,7 @@ import { ArrayElementStates } from "./runtime-optional-elements.js"; import { indexReadInBounds } from "./runtime-optional-bounds.js"; import { ArrayOwnership } from "./runtime-optional-ownership.js"; import { RecordFlowClasses } from "./runtime-optional-records.js"; +import { SiteDependencies } from "./site-dependencies.js"; import { StringIndexBounds } from "./string-index-bounds.js"; import { NanCodedReads } from "./nan-coded-reads.js"; import { RuntimeOptionalLocals } from "./runtime-optional-locals.js"; @@ -4688,10 +4689,15 @@ export class Lowerer { // resolveValueSymbol also flushes deferred diagnostics and applies // merged-namespace fences, whose authority remains ordinary lowering. this.checker.prefetchSymbolRoots(sourceFiles, true); + // The facts each fixed-point site reads, by the symbols, nodes and + // element keys they belong to (created with the site list below). + let siteDependencies: SiteDependencies | null = null; const symbolOf = (node: ts.Node): ts.Symbol | null => { const s = this.checker.getSymbolAtLocation(node); if (!s) return null; - return s.flags & ts.SymbolFlags.Alias ? this.checker.getAliasedSymbol(s) : s; + const symbol = s.flags & ts.SymbolFlags.Alias ? this.checker.getAliasedSymbol(s) : s; + siteDependencies?.read(symbol); + return symbol; }; const signatureOf = (node: ts.Identifier): FnSig | null => { const symbol = symbolOf(node); @@ -4876,7 +4882,10 @@ export class Lowerer { const callableSymbols = new Map(); const callableSymbolOf = (node: ts.Expression): ts.Symbol | null => { const cached = callableSymbols.get(node); - if (cached !== undefined) return cached; + if (cached !== undefined) { + if (cached !== null) siteDependencies?.read(cached); + return cached; + } let symbol = symbolOf(ts.isPropertyAccessExpression(node) ? node.name : node); if (symbol === null || signatureBySymbol.has(symbol)) { callableSymbols.set(node, symbol); @@ -5165,7 +5174,10 @@ export class Lowerer { if (ts.isPropertyAccessExpression(e) && isSettledIteratorValueRead(this, e)) return true; if (ts.isPropertyAccessExpression(e) && isOsConstantsSymbol(symbolOf(e.expression), this)) return true; - if (ts.isCallExpression(e) && this.runtimeOptionalReduceTypes.has(e)) return true; + if (ts.isCallExpression(e)) { + siteDependencies?.read(e); + if (this.runtimeOptionalReduceTypes.has(e)) return true; + } if ( ts.isCallExpression(e) && e.arguments.nodes.length === 0 && @@ -5663,6 +5675,7 @@ export class Lowerer { if (fnType?.kind === "func" && bodyReturnsOptional(fn)) { const widenedReturn = this.runtimeOptionalType(fnType.ret); provenance?.note("callback-return", fn, provenanceSite); + siteDependencies?.read(fn); const previousReturn = this.runtimeOptionalFunctionReturnType(fn, fnType.ret); this.runtimeOptionalFunctionReturns.set(fn, widenedReturn); if (!typeEquals(previousReturn, widenedReturn)) changed = true; @@ -5898,8 +5911,10 @@ export class Lowerer { arm.elem.kind === "union" ? this.armTag(arm.elem.unionId, UNDEFINED_T) >= 0 : isUnitType(arm.elem) || arm.elem.kind === "void" - ) + ) { + if (!optionalElementKeys.has(key)) siteDependencies?.changed(key); optionalElementKeys.add(key); + } keys.push(key); } return keys; @@ -6011,7 +6026,10 @@ export class Lowerer { return keys; }; const elementStates = new ArrayElementStates({ - elementAdmitsUndefined: (key) => optionalElementKeys.has(key), + elementAdmitsUndefined: (key) => { + siteDependencies?.read(key); + return optionalElementKeys.has(key); + }, ownerOf: (node) => ownership.ownerOf(node), allocationOwner: (node) => ownership.allocationOwner(node), arrayKeys: arrayKeysOf, @@ -6084,6 +6102,8 @@ export class Lowerer { note: provenance ? (fact, key, site) => provenance.note(`element-${fact}`, site, site, key) : null, + read: (fact) => siteDependencies?.read(fact), + changed: (fact) => siteDependencies?.changed(fact), }); // Each pass revisits every array callback site; the last visit holds // the decision at the fixed point. @@ -6385,6 +6405,7 @@ export class Lowerer { ) { if (promoteHofCallback(callback, [0, 1])) changed = true; const result = this.runtimeOptionalType(this.irTypeOf(node)); + siteDependencies?.read(node); const previous = this.runtimeOptionalReduceTypes.get(node); if (!previous || !typeEquals(previous, result)) { this.runtimeOptionalReduceTypes.set(node, result); @@ -6452,6 +6473,7 @@ export class Lowerer { ) continue; for (const target of familyBySymbol.get(symbol) ?? [symbol]) { + siteDependencies?.read(target); const shape = signatureBySymbol.get(target)?.params[i]; if (!shape || shape.mode !== "required") continue; const widened = addUndefined(shape.type); @@ -6496,6 +6518,7 @@ export class Lowerer { if (!ts.isSpreadElement(arg) && shape && i !== restAt && fieldsOfValue(arg)) { const fields = fieldsOfValue(arg)!; for (const target of familyBySymbol.get(symbol) ?? [symbol]) { + siteDependencies?.read(target); const parameterShape = signatureBySymbol.get(target)?.params[i]; const parameter = functionDeclBySymbol.get(target)?.parameters?.nodes[i]; if (!parameterShape || parameterShape.type.kind !== "record") continue; @@ -6541,6 +6564,7 @@ export class Lowerer { // argument can make its elements undefined, not the pack. // Keep every virtual implementation on the same array ABI. for (const target of familyBySymbol.get(symbol) ?? [symbol]) { + siteDependencies?.read(target); const rest = signatureBySymbol.get(target)?.params[i]; if (rest?.mode !== "rest" || rest.type.kind !== "array") continue; const widened = arrayOf(addUndefined(rest.type.elem)); @@ -6562,6 +6586,7 @@ export class Lowerer { // downstream calls and returns see the same optional value. const family = familyBySymbol.get(symbol); for (const target of family ?? [symbol]) { + siteDependencies?.read(target); const parameterShape = signatureBySymbol.get(target)?.params[i]; if (!parameterShape) continue; parameterShape.type = addUndefined(parameterShape.type); @@ -6592,8 +6617,21 @@ export class Lowerer { }); } }; - for (const node of sitesOf(sf)) scan(node); - return changed; + // A site whose facts are unchanged since its last visit would compute + // that visit's result again, except in a full pass. + const base = siteBase.get(sf)!; + const dependencies = siteDependencies!; + const sites = sitesOf(sf); + let fileChanged = false; + for (let i = 0; i < sites.length; i++) { + if (!fullPass && !dependencies.isStale(base + i)) continue; + changed = false; + dependencies.begin(base + i); + scan(sites[i]!); + dependencies.end(changed); + if (changed) fileChanged = true; + } + return fileChanged; }; const scanReturns = (symbol: ts.Symbol, decl: ts.FunctionLikeDeclaration): boolean => { let changed = false; @@ -6643,23 +6681,41 @@ export class Lowerer { optionalSymbols.add(symbol); this.earlyReadVars.add(symbol); } - let changed = true; - while (changed) { + // Number the sites of every file. The first and the last pass visit + // every site; the passes between visit only the sites whose facts + // changed (SiteDependencies). When such a pass changes nothing, a full + // pass confirms the fixed point, and the iteration resumes if it + // changes a fact after all. + const siteBase = new Map(); + let siteCount = 0; + for (const sf of sourceFiles) { + siteBase.set(sf, siteCount); + siteCount += sitesOf(sf).length; + } + siteDependencies = new SiteDependencies(siteCount); + let fullPass = true; + for (let changed = true, first = true; changed || !fullPass; first = false) { + fullPass = first || !changed; changed = false; for (const [symbol, field] of staticFieldsBySymbol) { if (!optionalSymbols.has(symbol) && mayBeOptional(field.initializer)) { optionalSymbols.add(symbol); + siteDependencies.changed(symbol); provenance?.note("static-field", field.initializer.parent, field.initializer); changed = true; } } for (const sf of sourceFiles) if (scanFile(sf)) changed = true; - for (const [symbol, decl] of functionDeclBySymbol) - if (scanReturns(symbol, decl)) changed = true; + for (const [symbol, decl] of functionDeclBySymbol) { + if (!scanReturns(symbol, decl)) continue; + siteDependencies.changed(symbol); + changed = true; + } const noteGenericReturn = (symbol: ts.Symbol, decl: ts.FunctionLikeDeclaration): void => { if (optionalReturns.has(symbol) || isJsSourceFile(ts.getSourceFileOfNode(decl))) return; if (!returnsOf(decl).some(genericMayBeOptional)) return; optionalReturns.add(symbol); + siteDependencies!.changed(symbol); this.runtimeOptionalGenericReturns.add(decl); provenance?.note("return", decl.name ?? decl, decl); changed = true; @@ -6696,6 +6752,7 @@ export class Lowerer { : previous; if (!typeEquals(previous, next)) { this.runtimeOptionalFunctionReturns.set(fn, next); + siteDependencies.changed(fn); provenance?.note("lambda-return", fn, fn.body); changed = true; } @@ -6713,10 +6770,12 @@ export class Lowerer { if (symbol && next.kind === "union" && this.armTag(next.unionId, UNDEFINED_T) >= 0) { if (!optionalReturns.has(symbol)) { optionalReturns.add(symbol); + siteDependencies.changed(symbol); changed = true; } } else if (symbol && !arithmeticReturns.has(symbol)) { arithmeticReturns.set(symbol, next); + siteDependencies.changed(symbol); changed = true; } } @@ -6733,6 +6792,7 @@ export class Lowerer { : this.runtimeOptionalType(previous); if (!typeEquals(previous, next)) { this.runtimeOptionalFunctionReturns.set(fn, next); + siteDependencies.changed(fn); changed = true; } } @@ -6746,6 +6806,7 @@ export class Lowerer { for (const symbol of optional ? family : []) { if (!optionalReturns.has(symbol)) { optionalReturns.add(symbol); + siteDependencies.changed(symbol); provenance?.note( "return", functionDeclBySymbol.get(symbol), @@ -6768,10 +6829,14 @@ export class Lowerer { const previous = arithmeticReturns.get(symbol); if (previous && typeEquals(previous, joined)) continue; arithmeticReturns.set(symbol, joined); + siteDependencies.changed(symbol); changed = true; } } } + // The site facts serve only the fixed point; release them for the rest + // of lowering. + siteDependencies = null; // NaN-coded slots convert optional values on entry instead of holding // the union, so promotion never applies to them. for (const symbol of [...optionalSymbols]) diff --git a/packages/compiler/src/frontend/lowering/runtime-optional-elements.ts b/packages/compiler/src/frontend/lowering/runtime-optional-elements.ts index 5ed011ce1..96d20d2c4 100644 --- a/packages/compiler/src/frontend/lowering/runtime-optional-elements.ts +++ b/packages/compiler/src/frontend/lowering/runtime-optional-elements.ts @@ -39,8 +39,16 @@ export interface ElementStateHost { allocationOwner(node: ts.Expression): ts.Symbol | null; /** Debug provenance for a new fact. */ note: ((fact: "undefined" | "holes", key: string, site: ts.Node | undefined) => void) | null; + /** The scan read, or added to, the facts of an element key, of an owning + * slot, or of every array (ANY_ARRAY), for dependency tracking + * (SiteDependencies). */ + read?(fact: string | ts.Symbol): void; + changed?(fact: string | ts.Symbol): void; } +/** The fact name of the facts shared by every array. */ +const ANY_ARRAY = "*"; + /** What an array value can contain besides present values. */ interface Contents { undefined: boolean; @@ -179,8 +187,10 @@ export class ArrayElementStates { if (built !== undefined) return built; } const owner = this.host.ownerOf(e); - if (owner !== null) + if (owner !== null) { + this.host.read?.(owner); return { undefined: this.undefinedOwners.has(owner), holes: this.holeyOwners.has(owner) }; + } return this.stored(this.host.arrayKeys(e)); } @@ -317,7 +327,9 @@ export class ArrayElementStates { /** The facts recorded for arrays with these element ABIs. */ private stored(keys: readonly string[] | null): Contents | null { if (this.ownFactsOnly) return NOTHING; + this.host.read?.(ANY_ARRAY); if (keys === null) return null; + for (const key of keys) this.host.read?.(key); return { undefined: this.anyUndefined || @@ -333,6 +345,7 @@ export class ArrayElementStates { const keys = this.host.arrayKeys(node); if (keys !== null && keys.length === 0) return false; const contents = this.contents(node); + this.host.read?.(ANY_ARRAY); return contents === null ? this.anyUndefined || this.anyHoley : contents.undefined || contents.holes; @@ -368,6 +381,7 @@ export class ArrayElementStates { this.holeyOwners.add(owner); changed = true; } + if (changed) this.host.changed?.(owner); return changed; } let changed = false; @@ -406,6 +420,7 @@ export class ArrayElementStates { if (owner === null) return this.addUndefined(this.host.arrayKeys(receiver)); if (this.undefinedOwners.has(owner)) return false; this.undefinedOwners.add(owner); + this.host.changed?.(owner); return true; } @@ -415,6 +430,7 @@ export class ArrayElementStates { if (owner === null) return this.addHoles(this.host.arrayKeys(receiver)); if (this.holeyOwners.has(owner)) return false; this.holeyOwners.add(owner); + this.host.changed?.(owner); return true; } @@ -422,6 +438,7 @@ export class ArrayElementStates { if (keys === null) { if (this.anyUndefined) return false; this.anyUndefined = true; + this.host.changed?.(ANY_ARRAY); this.host.note?.("undefined", "*", this.site); return true; } @@ -429,6 +446,7 @@ export class ArrayElementStates { for (const key of keys) { if (this.undefinedKeys.has(key)) continue; this.undefinedKeys.add(key); + this.host.changed?.(key); this.host.note?.("undefined", key, this.site); changed = true; } @@ -439,6 +457,7 @@ export class ArrayElementStates { if (keys === null) { if (this.anyHoley) return false; this.anyHoley = true; + this.host.changed?.(ANY_ARRAY); this.host.note?.("holes", "*", this.site); return true; } @@ -446,6 +465,7 @@ export class ArrayElementStates { for (const key of keys) { if (this.holeyKeys.has(key)) continue; this.holeyKeys.add(key); + this.host.changed?.(key); this.host.note?.("holes", key, this.site); changed = true; } diff --git a/packages/compiler/src/frontend/lowering/site-dependencies.test.ts b/packages/compiler/src/frontend/lowering/site-dependencies.test.ts new file mode 100644 index 000000000..ca5affcbe --- /dev/null +++ b/packages/compiler/src/frontend/lowering/site-dependencies.test.ts @@ -0,0 +1,56 @@ +import { expect, test } from "vitest"; +import { SiteDependencies } from "./site-dependencies.js"; + +test("a changed fact makes the sites that read it stale", () => { + const dependencies = new SiteDependencies(3); + const a = {}; + const b = "key"; + dependencies.begin(0); + dependencies.read(a); + dependencies.end(false); + dependencies.begin(1); + dependencies.read(b); + dependencies.end(false); + expect([0, 1, 2].map((site) => dependencies.isStale(site))).toEqual([false, false, false]); + dependencies.changed(b); + expect([0, 1, 2].map((site) => dependencies.isStale(site))).toEqual([false, true, false]); + dependencies.begin(1); + expect(dependencies.isStale(1)).toBe(false); +}); + +test("a visit that changes a fact makes every reader of its facts stale", () => { + const dependencies = new SiteDependencies(3); + const shared = {}; + const own = {}; + dependencies.begin(0); + dependencies.read(shared); + dependencies.end(false); + dependencies.begin(2); + dependencies.read(own); + dependencies.end(false); + dependencies.begin(1); + dependencies.read(shared); + dependencies.read(shared); + dependencies.end(true); + expect([0, 1, 2].map((site) => dependencies.isStale(site))).toEqual([true, true, false]); +}); + +test("reads outside a visit are not recorded", () => { + const dependencies = new SiteDependencies(1); + const fact = {}; + dependencies.read(fact); + dependencies.changed(fact); + expect(dependencies.isStale(0)).toBe(false); +}); + +test("a site visited again is listed once per fact", () => { + const dependencies = new SiteDependencies(3); + const fact = {}; + for (const site of [0, 2, 1, 2, 0]) { + dependencies.begin(site); + dependencies.read(fact); + dependencies.end(false); + } + dependencies.changed(fact); + expect([0, 1, 2].map((site) => dependencies.isStale(site))).toEqual([true, true, true]); +}); diff --git a/packages/compiler/src/frontend/lowering/site-dependencies.ts b/packages/compiler/src/frontend/lowering/site-dependencies.ts new file mode 100644 index 000000000..da8531e48 --- /dev/null +++ b/packages/compiler/src/frontend/lowering/site-dependencies.ts @@ -0,0 +1,79 @@ +/** The facts each site of a fixed-point scan read on its last visit, so that + * a pass visits again only the sites whose facts changed since. + * + * Sites are numbered from 0. A fact is any value usable as a Map key: a + * symbol, a syntax node, or a string that names a derived fact. A visit + * reports what it reads (`read`). When a visit changes a fact, every site + * that read one of the facts this visit read is visited again: the facts a + * visit changes belong to what it read. Facts changed outside a visit, or + * not read before they change, are reported with `changed`. + * + * A site that is not visited again would compute what its last visit + * computed, as long as every fact it reads is reported. The scan confirms + * that with a pass over every site once a pass changes nothing, and resumes + * when that pass changes a fact: a fact this tracking misses costs passes, + * not a different result. */ +export class SiteDependencies { + /** Each fact's entry: the visit that last read it, so that a visit lists a + * fact once, followed by the sites that read it, ascending. */ + private readonly readers = new Map(); + private readonly stale: Uint8Array; + private site = -1; + private visit = 0; + private facts: unknown[] = []; + + constructor(siteCount: number) { + this.stale = new Uint8Array(siteCount); + } + + /** A fact that site `index` read changed since its last visit. */ + isStale(index: number): boolean { + return this.stale[index] === 1; + } + + /** Starts a visit of site `index`. */ + begin(index: number): void { + this.site = index; + this.visit++; + this.stale[index] = 0; + this.facts = []; + } + + /** Ends the visit; `changed` when it changed a fact. */ + end(changed: boolean): void { + this.site = -1; + if (changed) for (const fact of this.facts) this.changed(fact); + } + + /** The site being visited read `fact`. */ + read(fact: unknown): void { + if (this.site < 0) return; + const entry = this.readers.get(fact); + if (entry === undefined) { + this.readers.set(fact, [this.visit, this.site]); + this.facts.push(fact); + return; + } + if (entry[0] === this.visit) return; + entry[0] = this.visit; + this.facts.push(fact); + // A pass visits sites in ascending order, so a site is new at the end; + // a site visited again is usually listed already. + const site = this.site; + let low = 1; + let high = entry.length; + if (entry[high - 1]! < site) low = high; + while (low < high) { + const middle = (low + high) >>> 1; + if (entry[middle]! < site) low = middle + 1; + else high = middle; + } + if (entry[low] !== site) entry.splice(low, 0, site); + } + + /** `fact` changed: every site that read it is visited again. */ + changed(fact: unknown): void { + const entry = this.readers.get(fact); + if (entry !== undefined) for (let i = 1; i < entry.length; i++) this.stale[entry[i]!] = 1; + } +} From 558fb7c8bab2c969592df5c0ff8224a8d7cc56b6 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 14:20:20 -0500 Subject: [PATCH 17/67] Bind only conditional-dependent class type arguments as checker types A generic class instance now binds a type parameter to its checker type only when a conditional type in the class depends on it, and that checker type keys the instance. Before, every type argument was bound while only literal arguments of those parameters were in the key, so two instances such as Holder and Holder with a `T[K]` field shared the first instance's layout. The other parameters get no checker binding, so member types that depend on their literal identity stay unresolved, as before. Detection now follows the type aliases and interfaces a member's type refers to, so a conditional wrapped in a union alias, such as `(K extends "required" ? T : T | undefined) | null`, also separates the instances. --- .../src/frontend/lowering/lower-classes.ts | 77 ++++++++++++++----- .../6908-generic-class-literal-conditional.ts | 15 ++++ 2 files changed, 71 insertions(+), 21 deletions(-) diff --git a/packages/compiler/src/frontend/lowering/lower-classes.ts b/packages/compiler/src/frontend/lowering/lower-classes.ts index ae03a748c..3db208f55 100644 --- a/packages/compiler/src/frontend/lowering/lower-classes.ts +++ b/packages/compiler/src/frontend/lowering/lower-classes.ts @@ -4616,22 +4616,28 @@ export function genericClassInstanceType( if (bound) tsArgs.push(bound); } } - // A literal argument for a type parameter that a conditional type - // depends on (`K extends "required" ? T : T | undefined`) selects the - // members' types, so it keys its own instance; mapType alone widens it. + // A type parameter that a conditional type in the class depends on + // (`K extends "required" ? T : T | undefined`) is bound to its checker + // type for the members, and that type keys the instance: mapType alone + // widens a literal, so Field and Field would otherwise share one layout. The other parameters get + // no checker binding, so nothing in the members depends on a literal + // the key does not carry. gci.literalSensitive ??= literalSensitiveTypeParams(lowerer, gci); - const literalKey = (i: number): string | null => { - if (!gci.literalSensitive!.has(gci.typeParams[i]!)) return null; - const arg = tsArgs[i]; + const sensitive = (i: number): boolean => + tsArgs.length === gci.typeParams.length && gci.literalSensitive!.has(gci.typeParams[i]!); + const checkerKey = gci.typeParams + .map((_, i) => (sensitive(i) ? `#${tsArgs[i]!.id}` : "*")) + .join(","); + const key = + mapped.map(typeKey).join(",") + (gci.literalSensitive.size > 0 ? `@${checkerKey}` : ""); + const literalText = (i: number): string | null => { + const arg = sensitive(i) ? tsArgs[i] : undefined; if (arg?.isStringLiteralType()) return JSON.stringify(arg.value); if (arg?.isNumberLiteralType()) return String(arg.value); if (arg && arg.flags & ts.TypeFlags.BooleanLiteral) return lowerer.checker.typeToString(arg); return null; }; - const literals = gci.typeParams.map((_, i) => literalKey(i)); - const key = - mapped.map(typeKey).join(",") + - (literals.some((l) => l !== null) ? `@${literals.map((l) => l ?? "*").join(",")}` : ""); const existing = gci.instances.get(key); if (existing) { if (existing.info) lowerer.noteGenericClassInstanceDemand(existing.info); @@ -4654,9 +4660,10 @@ export function genericClassInstanceType( const bindings = new Map(); gci.typeParams.forEach((tp, i) => bindings.set(tp, mapped[i]!)); const tsBindings = new Map(); - if (tsArgs.length === gci.typeParams.length) - gci.typeParams.forEach((tp, i) => tsBindings.set(tp, tsArgs[i]!)); - const rendered = mapped.map((m, i) => literals[i] ?? lowerer.fmt(m)).join(", "); + gci.typeParams.forEach((tp, i) => { + if (sensitive(i)) tsBindings.set(tp, tsArgs[i]!); + }); + const rendered = mapped.map((m, i) => literalText(i) ?? lowerer.fmt(m)).join(", "); const typeArgsText = `<${rendered.length > 80 ? rendered.slice(0, 77) + "..." : rendered}>`; const prevBindings = lowerer.typeParamBindings; const prevTsBindings = lowerer.typeParamTsBindings; @@ -4702,12 +4709,43 @@ export function genericClassInstanceType( /** The class's type parameters that a conditional type inside it depends * on: the parameters named within a type node that is a conditional type - * or refers to one (`get(): Value` with `type Value = K - * extends "required" ? T : T | undefined`). Their literal arguments pick - * the conditional's branch. */ + * or reaches one through the type aliases and interfaces it refers to + * (`get(): Value` with `type Value = K extends "required" ? T + * : T | undefined`, also when the alias wraps the conditional in a union + * or another alias). Their arguments pick the conditional's branch. */ function literalSensitiveTypeParams(lowerer: Lowerer, gci: GenericClassInfo): Set { const params = new Set(gci.typeParams); const found = new Set(); + const reaches = new Map(); + const declarationsReach = (symbol: ts.Symbol): boolean => { + const target = + symbol.flags & ts.SymbolFlags.Alias ? lowerer.checker.getAliasedSymbol(symbol) : symbol; + const known = reaches.get(target); + if (known !== undefined) return known; + reaches.set(target, false); // a recursive alias reaches through its other parts + const result = target.declarations.some((d) => + ts.isTypeAliasDeclaration(d) + ? reachesConditional(d.type) + : ts.isInterfaceDeclaration(d) + ? d.members.nodes.some(reachesConditional) + : false, + ); + reaches.set(target, result); + return result; + }; + const reachesConditional = (node: ts.Node): boolean => { + if (ts.isConditionalTypeNode(node)) return true; + if (ts.isTypeReferenceNode(node)) { + const name = ts.isIdentifier(node.typeName) ? node.typeName : node.typeName.right; + const symbol = lowerer.checker.getSymbolAtLocation(name); + if (symbol && !params.has(symbol) && declarationsReach(symbol)) return true; + } + let found = false; + ts.forEachChild(node, (child) => { + if (!found && reachesConditional(child)) found = true; + }); + return found; + }; const collect = (node: ts.Node): void => { if (ts.isTypeReferenceNode(node) && ts.isIdentifier(node.typeName)) { const symbol = lowerer.checker.getSymbolAtLocation(node.typeName); @@ -4716,12 +4754,9 @@ function literalSensitiveTypeParams(lowerer: Lowerer, gci: GenericClassInfo): Se ts.forEachChild(node, collect); }; const visit = (node: ts.Node): void => { - if ( - ts.isConditionalTypeNode(node) || - (ts.isTypeReferenceNode(node) && - lowerer.checker.getTypeFromTypeNode(node).isConditionalType()) - ) { + if (ts.isTypeNode(node) && reachesConditional(node)) { collect(node); + return; } ts.forEachChild(node, visit); }; diff --git a/tests/corpus/6908-generic-class-literal-conditional.ts b/tests/corpus/6908-generic-class-literal-conditional.ts index d06669be3..8bf7a0533 100644 --- a/tests/corpus/6908-generic-class-literal-conditional.ts +++ b/tests/corpus/6908-generic-class-literal-conditional.ts @@ -48,3 +48,18 @@ class Switch { } } console.log(new Switch(true).label(), new Switch(false).label()); + +// A conditional wrapped in a union alias selects its branch the same way. +type MaybeValue = (K extends "required" ? T : T | undefined) | null; +class Slot { + value: MaybeValue; + kind: K; + constructor(value: MaybeValue, kind: K) { + this.value = value; + this.kind = kind; + } +} +const filled = new Slot("a", "required"); +const empty = new Slot(undefined, "optional"); +const cleared = new Slot(null, "optional"); +console.log(filled.value, empty.value, cleared.value, filled.kind, empty.kind); From 644f42373471845ab82d9ea9c66bb472ece533bc Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 14:22:51 -0500 Subject: [PATCH 18/67] Evaluate fs arguments up to the last one with effects before a URL path conversion A synchronous fs call with a URL path evaluated only the later arguments with effects ahead of the path conversion. When such an argument reassigned the variable an earlier argument reads, as in fs.chownSync(url, uid, next()), the earlier argument was read after the reassignment. Every argument from the URL through the last one with effects is now evaluated in source order before the conversion. The npm fixture node24-fs-descriptors now reaches its SC2020 refusal for writeSync with a hex encoding, since openSync accepts its file URL. --- .../frontend/lowering/builtins/fs-paths.ts | 31 +++++++++++++------ tests/corpus/6931-fs-url-paths.ts | 12 +++++++ tests/harness/npm.test.ts | 2 +- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/packages/compiler/src/frontend/lowering/builtins/fs-paths.ts b/packages/compiler/src/frontend/lowering/builtins/fs-paths.ts index fb9176b53..181e27e34 100644 --- a/packages/compiler/src/frontend/lowering/builtins/fs-paths.ts +++ b/packages/compiler/src/frontend/lowering/builtins/fs-paths.ts @@ -2,9 +2,10 @@ * fileURLToPath inside each function (getValidatedPath), after every * argument has been evaluated, and validates some arguments before the * path and others after it. A URL-typed path lowers to the same - * conversion (url.fileURLToPathUrl). Later arguments with side effects are - * evaluated into hidden locals before the conversion, so they run even - * when it throws. The conversion keeps Node's error order when every + * conversion (url.fileURLToPathUrl). The later arguments through the last + * one with side effects are evaluated into hidden locals before the + * conversion, in source order, so they run even when it throws and each + * reads what it reads in Node. The conversion keeps Node's error order when every * earlier path is a URL too and each argument Node validates before the * path is absent or a literal that passes that validation; other URL * forms fence with SC2020, as do the fs.promises functions, whose @@ -134,16 +135,26 @@ function checkUrlPaths( // path Node checks first cannot precede the URL. if (row.paths.some((i) => i < first && args[i] !== undefined)) lowerer.noLowering(`${name} with a string path before a URL path`, call, hint); + // Every argument from the URL through the last one with effects is + // evaluated ahead of the conversion, in source order: a later argument's + // effect (an assignment, say) must not change what an earlier one read. + let last = first; + for (let i = first + 1; i < args.length; i++) if (!sideEffectFreeOptionValue(args[i]!)) last = i; const staged: ts.Expression[] = []; - for (let i = first + 1; i < args.length; i++) { - const arg = args[i]!; - if (sideEffectFreeOptionValue(arg)) continue; + for (let i = first + 1; i <= last; i++) { + let e = args[i]!; + while (ts.isParenthesizedExpression(e)) e = e.expression; // Literals are read by their members, so a whole-value slot cannot // hold them. - let e = arg; - while (ts.isParenthesizedExpression(e)) e = e.expression; - if (ts.isObjectLiteralExpression(e) || ts.isArrayLiteralExpression(e)) - lowerer.noLowering(`${name} with a URL path and a later literal that has effects`, arg, hint); + if (ts.isObjectLiteralExpression(e) || ts.isArrayLiteralExpression(e)) { + lowerer.noLowering( + sideEffectFreeOptionValue(e) + ? `${name} with a URL path and a literal before a later argument that has effects` + : `${name} with a URL path and a later literal that has effects`, + e, + hint, + ); + } staged.push(e); } if (staged.length > 0) { diff --git a/tests/corpus/6931-fs-url-paths.ts b/tests/corpus/6931-fs-url-paths.ts index 91a630d1b..cf6889066 100644 --- a/tests/corpus/6931-fs-url-paths.ts +++ b/tests/corpus/6931-fs-url-paths.ts @@ -18,6 +18,13 @@ function mode(): number { console.log("evaluated mode"); return 0o600; } +// A later argument that reassigns an earlier argument's variable runs after +// that argument was read. +let uid = -1; +function bumpUid(): number { + uid = 123456; + return -1; +} function clean(text: string): string { return text.split(dir).join(""); @@ -91,6 +98,11 @@ attempt("mkdir", () => { attempt("later effects", () => fs.copyFileSync(new URL("http://a/"), logged("dest.txt"))); attempt("later mode", () => fs.chmodSync(new URL("http://a/"), mode())); attempt("chmod", () => fs.chmodSync(new URL("data:text/plain,a"), 0o600)); +attempt("chown order", () => fs.chownSync(file, uid, bumpUid())); +console.log("uid", uid); +uid = -1; +attempt("chown order scheme", () => fs.chownSync(new URL("http://a/"), uid, bumpUid())); +console.log("uid", uid); fs.rmSync(dir, { recursive: true, force: true }); console.log("done", fs.existsSync(dir)); diff --git a/tests/harness/npm.test.ts b/tests/harness/npm.test.ts index 9ab93f287..2df0d87ef 100644 --- a/tests/harness/npm.test.ts +++ b/tests/harness/npm.test.ts @@ -72,7 +72,7 @@ const KNOWN: Record = { "node24-esm-metadata": { run: "SC1090" }, "node24-event-emitter": { run: "SC2020" }, "node24-file-url-conversion": { build: "SC1090" }, - "node24-fs-descriptors": { run: "SC1090" }, + "node24-fs-descriptors": { run: "SC2020" }, "node24-mime": { run: "SC2020" }, "node24-mime-errors": { run: "SC1090" }, "node24-no-error-assertions": { run: "SC2020" }, From 3b35db6b6bee6c3a0785cea52b0952108d8f632a Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 14:24:57 -0500 Subject: [PATCH 19/67] Resolve the stream-construction fixture's file read on close readFileStream resolved on 'end' while its 'close' listener printed "released". 'close' follows 'end' once the descriptor is closed, so the line landed wherever that completion fell among the child processes the fixture starts next, and the comparison with Node depended on timing. The read now resolves from its 'close' listener, after the line is printed. --- tests/fixtures/node-types/stream-construction.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/fixtures/node-types/stream-construction.ts b/tests/fixtures/node-types/stream-construction.ts index a28643f7c..dfe4a2320 100644 --- a/tests/fixtures/node-types/stream-construction.ts +++ b/tests/fixtures/node-types/stream-construction.ts @@ -42,17 +42,21 @@ function gunzipThrough(payload: Buffer): Promise { }); } +// Resolves after 'close', which follows 'end' once the descriptor is +// closed: the result never races the child processes started next. function readFileStream(file: string): Promise { return new Promise((resolve) => { const stream = fs.createReadStream(file); let text = ""; - const release = () => console.log("released"); + const release = () => { + console.log("released"); + resolve(text); + }; stream.on("close", release); stream.on("error", release); stream.on("data", (chunk) => { text += chunk.toString(); }); - stream.on("end", () => resolve(text)); }); } From c1b413e5ccfe14f3375dbfad85172cbcda0e0f08 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 14:25:23 -0500 Subject: [PATCH 20/67] Shorten the cycle collector's per-object paths markGray's edge visitor kept a stack frame on every call, though most edges end at an object that is skipped or already gray. Those now return without one, and the first visit and skipped cross-generation edges tail-call out of line, as the scan visitors already do. The walks no longer call the dense-array walker for an empty array. The routing of nursery candidates past bypassed levels inlines its bypass test, and the end of each pass tests its work vectors' capacity inline. What is collected, and when, is unchanged. --- packages/runtime/src/scr_cycle.c | 77 ++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/packages/runtime/src/scr_cycle.c b/packages/runtime/src/scr_cycle.c index 682f8bfcd..591f544b8 100644 --- a/packages/runtime/src/scr_cycle.c +++ b/packages/runtime/src/scr_cycle.c @@ -991,7 +991,8 @@ static inline ScrCycKind *scr_cyc_kind(uint32_t kind) { /* Whether a candidate of this type at level `gen` (nursery or mature) * skips that level's passes (see above). The last candidate a bypass sends * past the level opens a probe window, with fresh counts. */ -static inline bool scr_cyc_bypassed(const ScrCycType *type, unsigned gen) { +static inline __attribute__((always_inline)) bool scr_cyc_bypassed(const ScrCycType *type, + unsigned gen) { uint32_t kind = type->kind; if (kind >= scr_cyc_kinds_cap) return false; ScrCycLevelStat *k = &scr_cyc_kinds[kind].level[gen]; @@ -1006,8 +1007,10 @@ static inline bool scr_cyc_bypassed(const ScrCycType *type, unsigned gen) { } /* The generation a release buffers an object into: its own, or past the - * levels its type bypasses. */ -static inline unsigned scr_cyc_buffer_gen(const ScrCycType *type, unsigned gen) { + * levels its type bypasses. Both run once per candidate that the routing + * below moves, so they are inlined there too. */ +static inline __attribute__((always_inline)) unsigned scr_cyc_buffer_gen(const ScrCycType *type, + unsigned gen) { if (gen == SCR_CYC_NURSERY && scr_cyc_bypassed(type, SCR_CYC_NURSERY)) gen = SCR_CYC_MATURE; if (gen == SCR_CYC_MATURE && scr_cyc_bypassed(type, SCR_CYC_MATURE)) gen = SCR_CYC_OLD; return gen; @@ -1236,13 +1239,17 @@ void scr_cyc_on_release(void *obj) { } /* Visit every child of `obj` with VISIT, through ARRAY_WALK for a dense - * cycle-capable array and through the type's trace otherwise. */ + * cycle-capable array and through the type's trace otherwise. An empty + * dense array has no children to visit, and ARRAY_WALK is not called. */ #define SCR_CYC_CHILDREN(obj, type, ARRAY_WALK, VISIT, depth) \ - do { \ - if ((type)->kind == SCR_CYC_KIND_ARRAY && !(((const ScrArr *)(obj))->spare & SCR_ARR_HAS_EXT)) \ - ARRAY_WALK((const ScrArr *)(obj), (void *)(depth)); \ - else \ - (type)->trace((obj), (VISIT), (void *)(depth)); \ + do { \ + if ((type)->kind == SCR_CYC_KIND_ARRAY && \ + !(((const ScrArr *)(obj))->spare & SCR_ARR_HAS_EXT)) { \ + if (((const ScrArr *)(obj))->len != 0) \ + ARRAY_WALK((const ScrArr *)(obj), (void *)(depth)); \ + } else { \ + (type)->trace((obj), (VISIT), (void *)(depth)); \ + } \ } while (0) static void scr_mg_visit(void *child, void *ctx); @@ -1253,12 +1260,23 @@ SCR_CYC_ARRAY_WALK(scr_sb_array, scr_sb_visit) SCR_CYC_ARRAY_WALK(scr_scan_array, scr_scan_visit) static inline __attribute__((always_inline)) void scr_mark_gray(void *obj, uintptr_t depth); +/* An edge into a generation this pass does not walk, for settle. */ +static __attribute__((noinline)) void scr_mg_skip_edge(void *child) { + scr_cyc_push_work(&scr_xgen_edges, scr_gray_holder); + scr_cyc_push_work(&scr_xgen_edges, child); +} +/* The first visit of an object: gray it and walk its children. */ +static __attribute__((noinline)) void scr_mg_first(void *child, void *ctx) { + scr_mark_gray(child, (uintptr_t)ctx); +} +/* Most edges end at an object that is skipped or gray already. Those + * return without a stack frame; the other two cases tail-call out of + * line. */ static void scr_mg_visit(void *child, void *ctx) { if (child == NULL || SCR_RC(child) == SCR_RC_IMMORTAL) return; ScrCycHdr *h = scr_cyc_hdr(child); if (SCR_CYC_WALK_GEN(h) > scr_gen_limit) { - scr_cyc_push_work(&scr_xgen_edges, scr_gray_holder); - scr_cyc_push_work(&scr_xgen_edges, child); + scr_mg_skip_edge(child); return; } size_t rc = --SCR_RC(child); @@ -1269,7 +1287,7 @@ static void scr_mg_visit(void *child, void *ctx) { } return; } - scr_mark_gray(child, (uintptr_t)ctx); + scr_mg_first(child, ctx); } /* markGray reaches `obj` (its count already trial-decremented): gray it, * number it with the walk's component, record it, count it while it is @@ -1436,6 +1454,25 @@ static SCR_CYC_COMPACT void scr_xg_release(void *obj) { scr_rc_destroy(obj, scr_xg_destroy); } +/* A work vector that holds more than this many entries is freed at the end + * of a pass that used less than a quarter of it, so a spike in one pass + * does not keep its buffers for the rest of the program, while passes of a + * steady size keep reusing theirs. */ +#define SCR_CYC_KEEP_VECTOR 65536 + +static SCR_CYC_COMPACT void scr_cyc_trim_free(ScrVec *vec) { + free(vec->v); + vec->v = NULL; + vec->cap = 0; +} +/* Every pass ends by trimming its work vectors, and most of them stay + * small: only the capacity test runs inline. */ +static inline void scr_cyc_trim(ScrVec *vec) { + if (vec->cap > SCR_CYC_KEEP_VECTOR && vec->n == 0 && vec->used < vec->cap / 4) + scr_cyc_trim_free(vec); + vec->used = 0; +} + #ifdef SCR_YIN /* ── young-in nursery ─────────────────────────────────────────────────── */ @@ -1488,7 +1525,6 @@ static SCR_CYC_COMPACT void scr_xg_release(void *obj) { * deletion reaches the survivor from the root's candidate; garbage formed * after the promotion has a candidate from the release that formed it, * since survivors are no longer young. */ -static void scr_cyc_trim(ScrVec *vec); #define SCR_YIN_DEFAULT_SIZE 4096 #define SCR_CYC_YIN_PROMOTED SCR_CYC_NURSERY @@ -1928,21 +1964,6 @@ static SCR_CYC_COMPACT size_t scr_cyc_settle(unsigned gen_limit, bool doomed) { return freed; } -/* A work vector that holds more than this many entries is freed at the end - * of a pass that used less than a quarter of it, so a spike in one pass - * does not keep its buffers for the rest of the program, while passes of a - * steady size keep reusing theirs. */ -#define SCR_CYC_KEEP_VECTOR 65536 - -static SCR_CYC_COMPACT void scr_cyc_trim(ScrVec *vec) { - if (vec->n == 0 && vec->cap > SCR_CYC_KEEP_VECTOR && vec->used < vec->cap / 4) { - free(vec->v); - vec->v = NULL; - vec->cap = 0; - } - vec->used = 0; -} - /* The end of every pass. The candidate list keeps its count, which the * scheduler reads; its buffer goes when this pass's candidates filled * less than a quarter of it. */ From 7ff0ea472d28a05788dd39fbdb421c01d0fceea5 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 14:59:26 -0500 Subject: [PATCH 21/67] Walk AST subtrees by their node ranges --- .../src/frontend/lowering/lower-stmts.test.ts | 2 +- .../compiler/src/frontend/program.test.ts | 2 +- .../src/frontend/ts7/ast-node.test.ts | 34 +++++++++ .../compiler/src/frontend/ts7/ast-node.ts | 53 +++++++++++--- .../compiler/src/frontend/ts7/ast-wire.ts | 71 +++++++++++++++++++ packages/compiler/src/frontend/ts7/ast.ts | 59 ++++++++++++++- 6 files changed, 207 insertions(+), 14 deletions(-) diff --git a/packages/compiler/src/frontend/lowering/lower-stmts.test.ts b/packages/compiler/src/frontend/lowering/lower-stmts.test.ts index 322b21b2a..8e0c809b7 100644 --- a/packages/compiler/src/frontend/lowering/lower-stmts.test.ts +++ b/packages/compiler/src/frontend/lowering/lower-stmts.test.ts @@ -54,7 +54,7 @@ function mutate(value) { captured = value; compound += value; let shadow = 0; sh ctx.bind(shadow, []); ctx.bind(untouched, []); ctx.bind(innerShadow, [at(ctx.assignments, 2)]); - const walk = vi.spyOn(ctx.file, "appendChildIndices"); + const walk = vi.spyOn(ctx.file.file.wire, "preorder"); for (let i = 0; i < 20; i++) { expect(jsBindingHasOpenWrites(ctx.lowerer, captured)).toBe(true); expect(jsBindingHasOpenWrites(ctx.lowerer, compound)).toBe(true); diff --git a/packages/compiler/src/frontend/program.test.ts b/packages/compiler/src/frontend/program.test.ts index c1bd183f2..bdd6260ed 100644 --- a/packages/compiler/src/frontend/program.test.ts +++ b/packages/compiler/src/frontend/program.test.ts @@ -351,7 +351,7 @@ test("repeated cycle edges reuse a file's binding index", () => { [peer, peerImports.map((stmt) => ({ dep: main, stmt }))], ]); const admit = makeCycleAdmission(load.program, (file) => edges.get(file) ?? []); - const walk = vi.spyOn(peer, "appendChildIndices"); + const walk = vi.spyOn(peer.file.wire, "preorder"); try { expect(admit(peer, edges.get(peer)![0]!)).toBeNull(); expect(walk).toHaveBeenCalled(); diff --git a/packages/compiler/src/frontend/ts7/ast-node.test.ts b/packages/compiler/src/frontend/ts7/ast-node.test.ts index 60bfaa005..6b2725b93 100644 --- a/packages/compiler/src/frontend/ts7/ast-node.test.ts +++ b/packages/compiler/src/frontend/ts7/ast-node.test.ts @@ -511,6 +511,40 @@ test("preorder traversal preserves depth, skipped subtrees and early termination expect(prefix).toEqual(expected.slice(0, 7)); }); +test("preorder walks from every node match a recursive visit of every file", () => { + const kinds = new Set([AstKind.Identifier, AstKind.JSDocTypeLiteral]); + for (const [name, { file, oracle }] of decoded) { + expect(file.wire.preorder(), name).not.toBeNull(); + for (let index = 1; index < file.wire.nodeCount; index++) { + if (file.wire.kind(index) === KIND_NODE_LIST) continue; + const expected: [number, number][] = []; + const selected: [number, number][] = []; + const visit = (node: OracleNode, depth: number): void => { + expected.push([node.index, depth]); + if (kinds.has(node.kind)) selected.push([node.index, depth]); + node.forEachChild((child) => { + visit(child as OracleNode, depth + 1); + }); + }; + visit(oracle.getOrCreateNodeAtIndex(index), 0); + const actual: [number, number][] = []; + walkPreorder(file.node(index), (node, depth) => { + actual.push([node.index, depth]); + }); + expect(actual, `${name}:${index}`).toEqual(expected); + const actualSelected: [number, number][] = []; + walkPreorder( + file.node(index), + (node, depth) => { + actualSelected.push([node.index, depth]); + }, + kinds, + ); + expect(actualSelected, `${name}:${index}`).toEqual(selected); + } + } +}); + test("child traversal still rejects a sibling belonging to another parent", () => { const { file, bytes } = decoded.get("main.ts")!; let parent = 0; diff --git a/packages/compiler/src/frontend/ts7/ast-node.ts b/packages/compiler/src/frontend/ts7/ast-node.ts index f337bd623..be2745616 100644 --- a/packages/compiler/src/frontend/ts7/ast-node.ts +++ b/packages/compiler/src/frontend/ts7/ast-node.ts @@ -9,6 +9,7 @@ import { import { astLineOfPosition, astLineStarts, astSkipTrivia } from "./ast-text.js"; import { AstWireFile, + PREORDER_LIST, parseAstNodeHandle, type AstFileReference, type AstNodeHandle, @@ -359,6 +360,32 @@ export class AstNode { forEachChild( visitNode: (node: AstNode) => T, visitList?: (nodes: AstNodeList) => T, + ): T | undefined { + const wire = this.file.wire; + const tree = wire.preorder(); + if (tree === null) return this.forEachLinkedChild(visitNode, visitList); + // In the checked preorder tree, the first child follows its parent and + // each later child starts where the previous child's subtree ends. + const kinds = tree.kinds; + const ends = tree.ends; + const stop = ends[this.index]!; + for (let index = this.index + 1; index < stop; index = ends[index]!) { + const kind = kinds[index]!; + if (kind === PREORDER_LIST) { + const result = this.visitChildList(index, visitNode, visitList); + if (result) return result; + } else if (kind !== AstKind.JSDoc) { + const result = visitNode(this.file.node(index)); + if (result) return result; + } + } + return undefined; + } + + /** forEachChild through the sibling and parent links. */ + private forEachLinkedChild( + visitNode: (node: AstNode) => T, + visitList?: (nodes: AstNodeList) => T, ): T | undefined { const wire = this.file.wire; // Walk the immutable sibling links directly. Repeated semantic scans @@ -368,16 +395,8 @@ export class AstNode { throw new AstDecodeError("sibling belongs to another parent"); const kind = wire.kind(index); if (kind === KIND_NODE_LIST) { - const list = this.file.list(index); - if (visitList !== undefined) { - const result = visitList(list); - if (result) return result; - } else { - for (const node of list.nodes) { - const result = visitNode(node); - if (result) return result; - } - } + const result = this.visitChildList(index, visitNode, visitList); + if (result) return result; } else if (kind !== AstKind.JSDoc) { const result = visitNode(this.file.node(index)); if (result) return result; @@ -386,6 +405,20 @@ export class AstNode { return undefined; } + private visitChildList( + index: number, + visitNode: (node: AstNode) => T, + visitList?: (nodes: AstNodeList) => T, + ): T | undefined { + const list = this.file.list(index); + if (visitList !== undefined) return visitList(list); + for (const node of list.nodes) { + const result = visitNode(node); + if (result) return result; + } + return undefined; + } + get jsDoc(): AstNode[] | undefined { const docs: AstNode[] = []; for (const index of this.file.wire.children(this.index)) { diff --git a/packages/compiler/src/frontend/ts7/ast-wire.ts b/packages/compiler/src/frontend/ts7/ast-wire.ts index a2466a743..ff70148df 100644 --- a/packages/compiler/src/frontend/ts7/ast-wire.ts +++ b/packages/compiler/src/frontend/ts7/ast-wire.ts @@ -32,6 +32,16 @@ import { astChildOrder, } from "./ast-schema.generated.js"; +/** A node table read as a preorder tree (AstWireFile.preorder): each + * node's kind, with PREORDER_LIST for lists, and the end of its subtree. */ +export interface AstPreorder { + readonly kinds: Uint16Array; + readonly ends: Uint32Array; +} + +/** The kind AstPreorder records for a list (KIND_NODE_LIST on the wire). */ +export const PREORDER_LIST = 0xffff; + export interface AstFileReference { pos: number; end: number; @@ -125,6 +135,7 @@ export class AstWireFile { private readonly words: Uint32Array; /** Decoded strings by string word index / 2. */ private readonly stringCache: (string | undefined)[]; + private preorderTree: AstPreorder | null | undefined; constructor(private readonly bytes: Uint8Array) { astBounds(bytes, 0, HEADER_SIZE); @@ -317,6 +328,66 @@ export class AstWireFile { return children; } + /** The node table as a preorder tree, built on first use: every node's + * subtree is the index range up to `ends[index]`, and `kinds[index]` is its + * kind. The pass checks the links the linked walk checks one child at a + * time: each node's parent is open, the first child follows its parent, + * each sibling link names the end of the previous sibling's subtree, a + * last child has no sibling link, and each list holds `data` nodes and no + * lists. null when any check fails; walks then follow the links and fail + * where they read the inconsistent node. */ + preorder(): AstPreorder | null { + if (this.preorderTree === undefined) this.preorderTree = this.buildPreorder(); + return this.preorderTree; + } + + private buildPreorder(): AstPreorder | null { + const count = this.nodeCount; + const words = this.words; + const kinds = new Uint16Array(count); + const ends = new Uint32Array(count); + // The nodes whose subtrees contain the current index, innermost last, + // with the number of children each has so far. + const open: number[] = [1]; + const children: number[] = [0]; + const rootKind = words[NODE_WORDS + WORD_KIND]!; + if (rootKind >= PREORDER_LIST) return null; + kinds[1] = rootKind; + for (let index = 2; index <= count; index++) { + const word = index * NODE_WORDS; + const parent = index < count ? words[word + WORD_PARENT]! : 0; + let previous = 0; + while (open.length > 0 && open[open.length - 1] !== parent) { + const closed = open.pop()!; + const closedChildren = children.pop()!; + ends[closed] = index; + const closedWord = closed * NODE_WORDS; + if (kinds[closed] === PREORDER_LIST && closedChildren !== words[closedWord + WORD_DATA]!) + return null; + if (open.length > 0 && open[open.length - 1] === parent) previous = closed; + else if (closed !== 1 && words[closedWord + WORD_NEXT]! !== 0) return null; + } + if (index === count) break; + if (open.length === 0 || parent >= index) return null; + if ( + previous !== 0 ? words[previous * NODE_WORDS + WORD_NEXT]! !== index : index !== parent + 1 + ) + return null; + const kind = words[word + WORD_KIND]!; + if (kind === KIND_NODE_LIST) { + if (kinds[parent] === PREORDER_LIST) return null; + kinds[index] = PREORDER_LIST; + } else { + if (kind >= PREORDER_LIST) return null; + kinds[index] = kind; + } + children[children.length - 1] = children[children.length - 1]! + 1; + open.push(index); + children.push(0); + } + return { kinds, ends }; + } + /** The semantic walk flattens lists and omits attached JSDoc trees. * Validate the same list links as list(), without materializing nodes * that a selective syntax scan will never inspect. */ diff --git a/packages/compiler/src/frontend/ts7/ast.ts b/packages/compiler/src/frontend/ts7/ast.ts index a92cfafd8..369213d89 100644 --- a/packages/compiler/src/frontend/ts7/ast.ts +++ b/packages/compiler/src/frontend/ts7/ast.ts @@ -47,6 +47,8 @@ import { } from "./ast-guards.generated.js"; import type { Ts7DiagnosticData as Diagnostic } from "./session-schema.generated.js"; import { ModifierFlags, SyntaxKind } from "./enums.js"; +import { AstKind } from "./ast-schema.generated.js"; +import { PREORDER_LIST } from "./ast-wire.js"; /* ---- everything 7 kept under the same name ---- */ @@ -101,7 +103,7 @@ export function forEachChild( return node.forEachChild(cbNode, cbNodes); } -/** Preorder walk over a whole subtree with an EXPLICIT stack. The idiomatic +/** Preorder walk over a whole subtree without recursion. The idiomatic * recursive forEachChild visit costs two JS frames per AST level, so a * pathologically deep tree — the ~6500-term left-nested binary chain of the * binderBinaryExpressionStress corpus pair — overflows the stack as an ICE @@ -110,11 +112,64 @@ export function forEachChild( * detection) walk this way instead, so absurd nesting always reaches the * named fence. The callback may answer "skip" to leave a node's children * unvisited (scope and depth cut-offs — `depth` counts levels below the - * root) or "stop" to end the walk early. */ + * root) or "stop" to end the walk early. + * + * The wire stores nodes in preorder, so the walk visits the subtree's index + * range in order: it enters lists without a level of their own, and passes + * over attached JSDoc trees and skipped subtrees by their end index. A table + * that is not a checked preorder tree (AstWireFile.preorder) is walked + * through its links instead. */ export function walkPreorder( root: Node, cb: (node: Node, depth: number) => void | "skip" | "stop", kinds?: ReadonlySet, +): void { + const file = root.file; + const tree = file.wire.preorder(); + if (tree === null) { + walkLinkedPreorder(root, cb, kinds); + return; + } + const nodeKinds = tree.kinds; + const ends = tree.ends; + const start = root.index; + const stop = ends[start]!; + // The subtree ends of the visited nodes that contain the current index. + const open: number[] = []; + let index = start; + while (index < stop) { + const kind = nodeKinds[index]!; + if (kind === PREORDER_LIST) { + index++; + continue; + } + if ( + kind === AstKind.JSDoc && + index !== start && + nodeKinds[file.wire.parent(index)] !== PREORDER_LIST + ) { + index = ends[index]!; + continue; + } + while (open.length > 0 && open[open.length - 1]! <= index) open.pop(); + const node = kinds === undefined || kinds.has(kind) ? file.node(index) : undefined; + const verdict = node === undefined ? undefined : cb(node, open.length); + if (verdict === "stop") return; + if (verdict === "skip") { + index = ends[index]!; + continue; + } + open.push(ends[index]!); + index++; + } +} + +/** walkPreorder through the sibling and parent links, with an explicit + * stack. */ +function walkLinkedPreorder( + root: Node, + cb: (node: Node, depth: number) => void | "skip" | "stop", + kinds?: ReadonlySet, ): void { const file = root.file; const stack: number[] = [root.index]; From ca68d63c1c4a70267668d82aea9159712f7dee8e Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 15:00:22 -0500 Subject: [PATCH 22/67] Finish a worker message batch before port messages, and count queued messages as they arrive - Port messages that a 'message' listener posts while more worker messages are queued are delivered after those messages and before setImmediate callbacks, as in Node. The ports' poll phase waits while a batch's next message is queued, and the loop pass continues once more after the batch when a port has something to deliver. - A mailbox counts its queued events per kind as they are posted and taken, so starting a batch reads the count instead of scanning the queue under the lock. Messages that alternate with a worker's captured stdout or stderr start a batch each, which made delivery quadratic: 20000 such messages took 5.6 s to drain, and now take 0.5 s (Node 0.57 s). - The continue hook passes on that the batch's next message is at the head, so the dispatch that follows does not lock the mailbox again. - Corpus 6212 checks the order of worker messages, a MessageChannel message posted by the first listener, and setImmediate against Node. 6211's costs are now taken from its CI timings. --- .../6212-worker-message-batch-ports.ts.json | 6 +++ packages/runtime/src/scr_mailbox.c | 10 +++- packages/runtime/src/scr_mailbox.h | 3 +- packages/runtime/src/scr_worker_events.c | 37 +++++++++++++-- .../corpus/6212-worker-message-batch-ports.ts | 47 +++++++++++++++++++ .../6211-worker-message-batches.ts.json | 2 +- .../6212-worker-message-batch-ports.ts.json | 1 + 7 files changed, 97 insertions(+), 9 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6212-worker-message-batch-ports.ts.json create mode 100644 tests/corpus/6212-worker-message-batch-ports.ts create mode 100644 tests/harness/corpus-costs/6212-worker-message-batch-ports.ts.json diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6212-worker-message-batch-ports.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6212-worker-message-batch-ports.ts.json new file mode 100644 index 000000000..76d4c8da7 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6212-worker-message-batch-ports.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6212-worker-message-batch-ports.ts" + ], + "diags": [] +} diff --git a/packages/runtime/src/scr_mailbox.c b/packages/runtime/src/scr_mailbox.c index 39e7801ed..a8dc7e5cc 100644 --- a/packages/runtime/src/scr_mailbox.c +++ b/packages/runtime/src/scr_mailbox.c @@ -25,11 +25,15 @@ #endif #endif +/* Event kinds below this have their queued events counted (scr_mailbox_count_kind). */ +#define SCR_MAILBOX_COUNTED_KINDS 16u + struct ScrMailbox { atomic_size_t references; ScrMailEvent *head; ScrMailEvent **tail; bool closed; + size_t queued[SCR_MAILBOX_COUNTED_KINDS]; /* under the lock */ /* head != NULL || closed, written under the lock, read without it by * scr_mailbox_wait's spin. */ atomic_bool ready; @@ -167,6 +171,7 @@ bool scr_mailbox_post(ScrMailbox *mailbox, ScrMailEvent *event) { event->next = NULL; *mailbox->tail = event; mailbox->tail = &event->next; + if (event->kind < SCR_MAILBOX_COUNTED_KINDS) mailbox->queued[event->kind]++; atomic_store_explicit(&mailbox->ready, true, memory_order_release); scr_mailbox_unlock(mailbox); /* Signaled after the unlock: a woken or spinning taker then finds the @@ -182,6 +187,7 @@ ScrMailEvent *scr_mailbox_take(ScrMailbox *mailbox) { if (event) { mailbox->head = event->next; event->next = NULL; + if (event->kind < SCR_MAILBOX_COUNTED_KINDS) mailbox->queued[event->kind]--; } if (!mailbox->head) { mailbox->tail = &mailbox->head; @@ -201,6 +207,7 @@ ScrMailEvent *scr_mailbox_take_kind(ScrMailbox *mailbox, unsigned kind, uint64_t *slot = event->next; if (mailbox->tail == &event->next) mailbox->tail = slot; event->next = NULL; + if (event->kind < SCR_MAILBOX_COUNTED_KINDS) mailbox->queued[event->kind]--; } if (!mailbox->head) { mailbox->tail = &mailbox->head; @@ -235,8 +242,7 @@ unsigned scr_mailbox_head_kind(ScrMailbox *mailbox) { size_t scr_mailbox_count_kind(ScrMailbox *mailbox, unsigned kind) { scr_mailbox_lock(mailbox); - size_t count = 0; - for (ScrMailEvent *event = mailbox->head; event; event = event->next) count += event->kind == kind; + size_t count = kind < SCR_MAILBOX_COUNTED_KINDS ? mailbox->queued[kind] : 0; scr_mailbox_unlock(mailbox); return count; } diff --git a/packages/runtime/src/scr_mailbox.h b/packages/runtime/src/scr_mailbox.h index ac8493057..4e5f253b5 100644 --- a/packages/runtime/src/scr_mailbox.h +++ b/packages/runtime/src/scr_mailbox.h @@ -28,7 +28,8 @@ void scr_mailbox_close(ScrMailbox *mailbox); bool scr_mailbox_pending(ScrMailbox *mailbox); /* The kind of the first queued event, or 0 when none is queued. */ unsigned scr_mailbox_head_kind(ScrMailbox *mailbox); -/* The number of queued events of this kind. */ +/* The number of queued events of this kind, kept as events are posted and + * taken; 0 for kinds of 16 and above. */ size_t scr_mailbox_count_kind(ScrMailbox *mailbox, unsigned kind); void scr_mailbox_wait(ScrMailbox *mailbox, double milliseconds); int scr_mailbox_pollfd(const ScrMailbox *mailbox); diff --git a/packages/runtime/src/scr_worker_events.c b/packages/runtime/src/scr_worker_events.c index f7778f3fa..252230372 100644 --- a/packages/runtime/src/scr_worker_events.c +++ b/packages/runtime/src/scr_worker_events.c @@ -63,9 +63,22 @@ static SCR_TL bool scr_channel_closing_phase; * has taken SCR_WORKER_BATCH_MIN, with a microtask checkpoint after each, * before the loop goes on to timers and immediates. A delivered message * starts a batch; the loop pass continues it (scr_workers_more) while the - * next event is a message and the batch has room. */ + * next event is a message and the batch has room. Port messages that a + * listener posts meanwhile wait for the batch to end, and the pass then + * continues once more so they are delivered before immediates, as in Node. */ #define SCR_WORKER_BATCH_MIN 1000 static SCR_TL size_t scr_worker_batch_left; +static SCR_TL bool scr_worker_batch_ended; +/* scr_workers_more found the batch's next message at the head of the + * mailbox. Only this thread takes events and others append them, so it is + * still there when the pass dispatches. */ +static SCR_TL bool scr_worker_batch_queued; + +/* Whether a batch is open and its next message is queued. */ +static bool scr_worker_batch_next(void) { + return scr_worker_batch_left > 0 && scr_worker_events && + scr_mailbox_head_kind(scr_worker_events) == SCR_WORKER_MESSAGE; +} static const char *const scr_worker_method_names[] = { "ref", "unref", "hasRef", "terminate", "postMessage", "on", "once", "addListener", "prependListener", "prependOnceListener", "off", "removeListener", "removeAllListeners", @@ -710,15 +723,29 @@ static bool scr_channel_more(void) { } static bool scr_workers_more(void) { + if (scr_worker_batch_left > 0) { + if (scr_worker_batch_next()) { + scr_worker_batch_queued = true; + return true; + } + scr_worker_batch_left = 0; + scr_worker_batch_ended = true; + } if (scr_channel_more()) return true; - if (scr_worker_batch_left == 0) return false; - if (scr_worker_events && scr_mailbox_head_kind(scr_worker_events) == SCR_WORKER_MESSAGE) return true; - scr_worker_batch_left = 0; + /* One more pass after a batch when a port has something to deliver: the + * ports' poll phase for what its listeners posted. */ + bool ended = scr_worker_batch_ended; + scr_worker_batch_ended = false; + if (ended) + for (ScrWorkerView *view = scr_channel_ports; view; view = view->next) + if (scr_channel_port_ready(view)) return true; return false; } static void scr_worker_dispatch(void) { - if (scr_channel_dispatch()) return; + bool batch = scr_worker_batch_queued; + scr_worker_batch_queued = false; + if (!batch && scr_channel_dispatch()) return; ScrWorkerView *port = scr_worker_port; if (port && port->closing) { port->closing = false; diff --git a/tests/corpus/6212-worker-message-batch-ports.ts b/tests/corpus/6212-worker-message-batch-ports.ts new file mode 100644 index 000000000..3f5a2a476 --- /dev/null +++ b/tests/corpus/6212-worker-message-batch-ports.ts @@ -0,0 +1,47 @@ +import { MessageChannel, Worker, isMainThread, parentPort, workerData } from "node:worker_threads"; + +// A MessageChannel message that a worker 'message' listener posts while +// more worker messages are queued arrives after those messages and before +// setImmediate callbacks, as in Node. The listener waits on a shared flag +// until the worker has posted the rest. +function waitFor(flag: Int32Array, index: number): void { + while (Atomics.load(flag, index) === 0) Atomics.wait(flag, index, 0, 50); +} +function signal(flag: Int32Array, index: number): void { + Atomics.store(flag, index, 1); + Atomics.notify(flag, index); +} + +if (isMainThread) { + const flag = new Int32Array(new SharedArrayBuffer(8)); + const worker = new Worker(new URL(import.meta.url), { workerData: flag }); + const channel = new MessageChannel(); + const log: string[] = []; + channel.port2.on("message", (m: unknown) => { + log.push(`channel ${String(m)}`); + }); + let count = 0; + worker.on("message", (m: unknown) => { + count++; + log.push(`worker ${String(m)}`); + if (count === 1) { + signal(flag, 0); + waitFor(flag, 1); + channel.port1.postMessage("c1"); + setImmediate(() => { + log.push("immediate"); + setImmediate(() => { + log.push("second immediate"); + for (const line of log) console.log(line); + channel.port1.close(); + }); + }); + } + }); +} else { + const flag = workerData as Int32Array; + parentPort!.postMessage("w1"); + waitFor(flag, 0); + for (let i = 2; i <= 6; i++) parentPort!.postMessage(`w${i}`); + signal(flag, 1); +} diff --git a/tests/harness/corpus-costs/6211-worker-message-batches.ts.json b/tests/harness/corpus-costs/6211-worker-message-batches.ts.json index 75b17b215..af8e672d4 100644 --- a/tests/harness/corpus-costs/6211-worker-message-batches.ts.json +++ b/tests/harness/corpus-costs/6211-worker-message-batches.ts.json @@ -1 +1 @@ -{ "plain": 2507, "san": 20224 } +{ "plain": 3694, "san": 3271 } diff --git a/tests/harness/corpus-costs/6212-worker-message-batch-ports.ts.json b/tests/harness/corpus-costs/6212-worker-message-batch-ports.ts.json new file mode 100644 index 000000000..fb0e48437 --- /dev/null +++ b/tests/harness/corpus-costs/6212-worker-message-batch-ports.ts.json @@ -0,0 +1 @@ +{ "plain": 5538, "san": 3201 } From eca349d2440b2c4274823b952d6201022992b9c3 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 15:32:52 -0500 Subject: [PATCH 23/67] Forward nested zlib callback results and keep self-calling callbacks' error checks A nested callback lowered inside an outer error path passed the absent Buffer on into a Buffer slot even when its own operation succeeded, so a callee such as (err, out) => cb(err, out) received undefined instead of the result. The forwarded value is now the Buffer when there is one. A named function expression passed to zlib can call itself, and a function expression can reach itself through arguments.callee, with an error and a Buffer. Such functions no longer count as called only by the adapter, so their success copy keeps the runtime error checks instead of folding them to the success case. --- .../frontend/lowering/builtins/arguments.ts | 8 ++++- .../src/frontend/lowering/lower-functions.ts | 24 ++++++++++----- .../corpus/6920-zlib-callback-error-result.ts | 29 +++++++++++++++++++ .../6920-zlib-callback-error-result.ts.json | 2 +- 4 files changed, 53 insertions(+), 10 deletions(-) diff --git a/packages/compiler/src/frontend/lowering/builtins/arguments.ts b/packages/compiler/src/frontend/lowering/builtins/arguments.ts index d3bf46774..7f862f603 100644 --- a/packages/compiler/src/frontend/lowering/builtins/arguments.ts +++ b/packages/compiler/src/frontend/lowering/builtins/arguments.ts @@ -20,6 +20,7 @@ import * as ts from "../../ts7/adapter.js"; import { type Lowerer } from "../lowerer.js"; import { locOf } from "../../program.js"; import { lowerAbsenceProbe } from "../lower-exprs.js"; +import { bodyReadsArguments } from "../../arguments-usage.js"; import { defaultAfterUndefined, lowerStaticallyUndefinedArgument } from "../optional-arguments.js"; import { voidizedCallback } from "../lower-server.js"; export function optionalStringTags( @@ -269,9 +270,14 @@ export function errorFirstCallback( ): IrExpr { // A literal here is called only by the callback adapter, which passes // null as the error whenever it passes a result (lowerUndefinedResultBody). + // A named function expression can also call itself, and a function + // expression can reach itself through `arguments.callee`. let literal: ts.Expression = node; while (ts.isParenthesizedExpression(literal)) literal = literal.expression; - if (ts.isArrowFunction(literal) || ts.isFunctionExpression(literal)) + if ( + ts.isArrowFunction(literal) || + (ts.isFunctionExpression(literal) && literal.name === undefined && !bodyReadsArguments(literal)) + ) lowerer.errorFirstLiterals.add(literal); let callback = lowerer.lowerExpr(node); if (callback.type.kind === "dyn") { diff --git a/packages/compiler/src/frontend/lowering/lower-functions.ts b/packages/compiler/src/frontend/lowering/lower-functions.ts index 9254e6213..6fc083468 100644 --- a/packages/compiler/src/frontend/lowering/lower-functions.ts +++ b/packages/compiler/src/frontend/lowering/lower-functions.ts @@ -718,13 +718,13 @@ function lowerUndefinedResultBody( const loc = locOf(node); const param = lowerer.bindingIn(lowerer.ctx, result.symbol); if (param === null) throw new InternalCompilerError("lowerer bug: callback result unbound"); - const absent: IrExpr = { + const absent = (): IrExpr => ({ kind: "libCall", fn: "bytes.isAbsent", args: [varRef(param.id, param.type, loc)], type: BOOL, loc, - }; + }); const fence: IrStmt = { kind: "runtimeFence", code: "SC2020", @@ -750,9 +750,10 @@ function lowerUndefinedResultBody( lowerer.suppressStats = true; lowerer.errorPathCopies++; try { - // Passed on into a Buffer slot, the result stays the absent Buffer - // the adapter passed: a callee with this entry test reads it as - // undefined. + // Passed on into a Buffer slot, the result stays what the adapter + // passed: the Buffer, or the absent Buffer, which a callee with this + // entry test reads as undefined. (The copy that serves both paths + // reaches this with a Buffer.) const body = transformStmtList(withKnownError(knownError, lowerBody), { expr: (e) => e.kind === "dynCheck" && @@ -760,7 +761,14 @@ function lowerUndefinedResultBody( e.value.localId === slot.id && e.type.kind === "bytes" && e.type.elem === "u8" - ? { kind: "libCall", fn: "bytes.absent", args: [], type: e.type, loc: e.loc } + ? { + kind: "ternary", + cond: absent(), + then: { kind: "libCall", fn: "bytes.absent", args: [], type: e.type, loc: e.loc }, + else_: varRef(param.id, param.type, e.loc), + type: e.type, + loc: e.loc, + } : e, stmt: (stmt) => stmt, }); @@ -795,7 +803,7 @@ function lowerUndefinedResultBody( localId: slot.id, init: { kind: "ternary", - cond: absent, + cond: absent(), then: dynUndefinedExpr(loc), else_: lowerer.coerceInto(result.name, varRef(param.id, param.type, loc), DYN), type: DYN, @@ -811,7 +819,7 @@ function lowerUndefinedResultBody( return [ { kind: "if", - cond: absent, + cond: absent(), then: withoutResult === null ? [fence] : [undefinedResult, ...withoutResult], else_: withResult, loc, diff --git a/tests/corpus/6920-zlib-callback-error-result.ts b/tests/corpus/6920-zlib-callback-error-result.ts index 50998d37f..cc9128221 100644 --- a/tests/corpus/6920-zlib-callback-error-result.ts +++ b/tests/corpus/6920-zlib-callback-error-result.ts @@ -149,6 +149,33 @@ function inflated(input: Buffer): Promise { ); } +function sink(err: Error | null, out: Buffer): void { + console.log("sink", err, typeof out, out?.length); + step(); +} +function nestedForward(): void { + // On the outer error path, the nested callback forwards its own result. + zlib.inflate(bad, (err, out) => { + console.log("outer", err?.code, typeof out); + zlib.inflate(good, (err2, out2) => sink(err2, out2)); + }); +} +let attempts = 0; +function namedRetry(): void { + // A named callback that calls itself with an error and a Buffer. + zlib.inflate(bad, function retry(err, out) { + attempts++; + if (err) { + if (attempts < 3) return retry(new Error("again"), Buffer.from("x")); + console.log("gave up", attempts, err.message, out.length); + step(); + return; + } + console.log("retry value", out.length); + step(); + }); +} + function functionValues(next: () => void): void { steps.push( () => zlib.inflate(good, named), @@ -174,6 +201,8 @@ function functionValues(next: () => void): void { () => forwardGzip("text that does not fit", arrow), () => zlib.inflate(bad, captures), () => zlib.inflate(good, captures), + nestedForward, + namedRetry, () => { named(new Error("direct"), Buffer.from("both")); }, diff --git a/tests/harness/corpus-costs/6920-zlib-callback-error-result.ts.json b/tests/harness/corpus-costs/6920-zlib-callback-error-result.ts.json index 1241a31c0..247292295 100644 --- a/tests/harness/corpus-costs/6920-zlib-callback-error-result.ts.json +++ b/tests/harness/corpus-costs/6920-zlib-callback-error-result.ts.json @@ -1 +1 @@ -{ "plain": 5517, "san": 7607 } +{ "plain": 6386, "san": 8023 } From 2b48451cf4dcf3669a213defda4bde701b419c7a Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 15:33:37 -0500 Subject: [PATCH 24/67] Build the native compiler with profile-guided optimization --- RELEASING.md | 2 + packages/compiler/native/cli.profdata.gz | Bin 0 -> 1452782 bytes scripts/build-native-cli.mts | 38 ++++- scripts/refresh-cli-profile.mjs | 205 +++++++++++++++++++++++ 4 files changed, 240 insertions(+), 5 deletions(-) create mode 100644 packages/compiler/native/cli.profdata.gz create mode 100644 scripts/refresh-cli-profile.mjs diff --git a/RELEASING.md b/RELEASING.md index 6cafe84a3..b6c5239ee 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -16,6 +16,8 @@ CI (`.github/workflows/release.yml`) compares the version in `packages/cli/packa The release job builds each pinned LLVM helper, precompiled runtime pack, and native CLI on its matching host. The native CLI bundles its TypeScript checker, LLVM helper, runtime pack, declarations, and comptime evaluator. npm postinstall installs the matching native executable; Node is needed for npm installation but not native compilation or execution. The user's toolchain performs the final platform link. Sanitized builds also use it to instrument program LLVM and compile the C runtime. Platform packages publish ahead of `@scriptc/compiler` and `scriptc`. The GitHub release attaches standalone compiler archives, their SHA-256 checksums, and the surface manifest after npm publication succeeds. +Release builds of the native CLI optimize the compiler with the committed profile `packages/compiler/native/cli.profdata` on every platform. Code the profile does not describe, or describes from older compiler sources, is optimized as without a profile. Refresh the profile on a quiet Linux x64 host when compiler code has changed substantially since the last refresh: `node scripts/refresh-cli-profile.mjs --tsc-ts ` builds an instrumented compiler, runs it on tsc-ts, a slice of the corpus, and the runtime benchmark workloads, and writes the merged sparse profile. Commit the new profile on its own. + Publishing uses npm trusted publishing (OIDC) — there is no npm token secret. Each published package must have a GitHub Actions trusted publisher for `release.yml` and the `Release` environment. A missing configuration fails diff --git a/packages/compiler/native/cli.profdata.gz b/packages/compiler/native/cli.profdata.gz new file mode 100644 index 0000000000000000000000000000000000000000..55523e76548ae821bbce8762876d84a3b3ccd182 GIT binary patch literal 1452782 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�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 z zWk0`YeEVhNgTZOnFKnXwZJJIM4>7Tgjvk z`^Bk=sJ~KiTr+6F*$-ppgQKRmc`R~JZBI7hEJF`(bokHFZI?vBBVrrWQZW!6hjG63=cr1;<9Gh3H@;9U7#eDyqbdJG|j?{VFK4nn)O`Q&(Ba+- zfw6{!Ws|@tjTJ>r(Ct z2ATm~g@h;WI4JbamHFr;GZu?D-9HTauO68zHJeI-ta zg5{1YDLqGWCa_XV#23FBHy$+eWT|E*7?Mc+Y3@b$Xa=j!XuiD0gPuI9zu}>mzvrRr z@Qw!-@$_!~ke?gjq4yMi%F(Ay{-Nv0)gSwa1;QFAf}$~w#Ys$jQ~DU+K~0eH997yo zH_oon6ari5E~0i%Co!YjP_>^WxxK|?%QU&tHnqLhv%rR#p|Cu~g*@$S3)42K+%LXf z0i+jeoT50`i?zQFpL4Pa*Ul(kvG}&^i=z@IVD9*_BpzZPzdNDR`RKIZrXvUv5c-Vr zsqmcg%`aH&wGc({D}}eOmC`ahuMnAaUhdwSzqC>jsVzB{FxA`U^Nu-A&=f4kZwr&- zLQ&evHMWN*=0$FL2{3)#W$M8bnZI?fWtOozp3aSX7y zuT*!iI9-QculwNgh9U~EY;{2F_krFQq(3;oQT#5Cukcj^=M%$u3}P=&RtfjXlaYaN z;1@~BmwvT9!LA3Mh)^|8 zEB$Q#g4)$rFBDDc8ZTZ`9jWFNhs7P4l4fCF;Dl0$VPT3;`nzi?tgT00=@7O6gxX=H z0@E{u(Pnj7941>wxBOb)k?yu}E{oYaU)+8qL>u6Q{!QjN3O_BN()%sIa^@Ctq|6f9 zdy}V(Z}wewO#0$d!aU0`-1kiq=Qr)3EX9xJena>e)NczrxE1eQbQm8mZ%-Q!qo`Eg z^Ik1}I*s7p2bzsf_%bE)yM*>UGhH4fy>=YoXW?`utmW~*q0vHZ9R?YZ@=&bpzC}+415L~_*2A>!6t*BM+0~ocpH9$Prs5Cy<0T|a{+=Bc-Kf>b)PJdiurC|I#Er9t5&%-ciUhFF- ztWkkv}X#jk`G9^}S<-Etm(SxzXgg(CX(<`rBSS|%r{!NfPtANTA4Idiq z6Uw_lZeNFx}ranPvi<=`D81jrmDXfQ_9J@LE`S6$DAo;McA_)Ef z9P{#N*KfJ-^WniJ&r|3Uo+FdEl_QCXMY6@TM3q>~onK$LL;b9dkiOLrl7ApGno`hy zY!Ecj(jmGJMAw065~52$W>O&#T@d1v2O%St+7Mk4GNW1wF}iV(*^m~Z??W5@&*j{*|HO8^YBgTJDft&Z;aLp`uhE^j(2ky#;Co7mC=QJuUrZg_$3X+WE!?>d%Q1&=tU3>g^W_X1MBY~+6L<#A=(PjaEwqmR*e~=;h0s%0OwOnnekso zX8c!^(R27qm(Y&C|JsGczn~*t8*l=)6}ZTErksg?&S_3*ZRy5$#~nI>(=6-` zJ&WItRFzRnW|j3#qnb-qSK?Y zwd+bDUZs@gGC2)eM%&VHdj0j^K!Zxy^f@eM<3MY&E6vD}@9GEW2-uW62(W==Sdua@ zggA?pt37F#50TD7qir{&xMI=YV8BZp>Iw}nZ5igaDTb;AKdbH?TAB(_Ud_pVbaM0d znOo7;R|W<*uq0vN3?xS26kI=hoE&e_X`6?9xbd^!(Y-{m1cB2u!LYP}Cv&KUVp94D3 z_W^8_aVoIUPp1R$duX;@OWQ?X+S*I4-|1JJ4=E!s%BrOPB4zf5OL)2w*IdejYny0l} z|Au0Tk^|cW{@Y*q+nZ~7IbAhJT5X0B&p(B?Tf91R*J-}pfA`=+KSJB6!Z`y69!LtW z%bJNY12GYS|7(yVR0RX!?o@bbV2 z!b>0Gjf+5g9Difogyix&MJ~U8)xn$Fdhd5zYlq&=GOn2hZUe~p*JT+tzuoJ``aNvl z(9Z8z_iCq#U;_7+UO=tMgW5Wb28{WB!yoUqzf`#ZNP&JNEe7;>7%IRp97B}o4ej~& z2V82O2}A&KoWT@3M^WtC_hZ|iPdpV17R2HZ&bx`-UfX=*DrGWTNGvOPU)sV6tZ@13 zMsJC!Mu2&>*Jipxnr-)Z4QY>Fe4p&MPDaj_2N0Ro- z$8r6)94;kZq;upxjxstd107bErSYIl2fQ5DJ%Cz{J7|^7B9;$7U%>~XC24*+c3=B) z8?m;|NY1i7aRFSSP4Umhg)9!Co^pW9{jYPw=d{u)6`i#siZ;EK@MD6H(S>6a!NOyz zQUof=uG-pN`~5JfZ$TeP(gvD?Q@k_{m11{oxpM z&xlRGeAd?Y?NN+m7jVy(Mm)RQ%iAlu)x7rzYXNJwvHp`Wnaq^7G|aHsJh9SRS_XeKxv}mibvyI}q}@ zTruhQ8$s!S_u%L43QIq4uJG^qm@wZ*UN7EC&_^4VK6+hx1ddiPA)*wvb7Yt;PG>tl zQZ*c@@bGMZuXUKUiyn~wYE=)95st?CmX2 z;xxGTg^ksT>USQl3kSQ%40b|I58E zSKhoTXApvrmrzw^+Mfa&g3q6DR+42P?e$(Cht@?8AJo+EvF zOuZ6ELz%&4fRER|MpQ!XyBGa?psuN`6w&}LD{}Wd|78iAHsXy7)f!9%yQ^lRE#MPh z6BLX6**c+w>A}VrAT9w<1A%)S$kblSm~l7iOSM?}=84@7mMPN6$B^z|a->>ZPB@<+f{ z`1W^eGx3GWUN6~_RG+^kfWpAlek&P_;?BuDY#AZr`)v^sje6!54+S|2; zt8U=c(F{{6Yp2;{GdbE@oLM%Pn|(JOKOx#ws76HZ07v7-T&hlO`8-Q{@ObuE>Hn<( zp3D@B5N;sy8$kD;=NH10(Eq?z z5Sxl=nLq7R=NZZVD#ZkC{idbf{^>qAuUw4~c7aJKM;i7`8kpcV=miq<5Ge5>h)jq0 zS-85nd=IrmOwcB5omfBdU-a2BK{2q5r-|^0r@;BZ_-h^=>$g^?as~)tIO2KX7OyAuAGlp znl|0}ox+~wXJBd#e)8H|}3POJOOrcG9QAB)4@ z=I)usr)NjIf-&2CLZIH#wyK_O|39z%gAjxuJU>1Yg!}>Ea5)m91LgOjGWco7fn2`% zwY~(wzxEE!=OE;-+&^18h%GU;n+5DtMoVe2aQ8hr7j`rqE3q{!ukFY~0xt8%+WJYq z)!iBkc4gide?0eofU3%vWH)6x(=yy9FKJHrCeSCPrLj22`P#H|XDa+qE8Bs)N}`o0 ziZZ+vxo&XNE}y7?O0qqK6%Y+3cqc@q!Shp4_soVk>pv0F&)ds1DtN!hQ|?4h1?N=0 zg7@KSxI%n3S4kmFD-{d1;Wv)|eCZ>f7R&^OiR_I{NEOx+?U}PT3Pl`8Dqcv6G#CsV zMRNwqK#~Sn@zQyXCzCXUJLM%>s%7N`U2gzOhjJ)GH{4+4?=>|snN7(Sw?pX^i_4tm z@u=*!$afAZ+Hcx{f@5M}uVRzddM*y`UGKraU5*vdb0>I8cZ|2*uT({dUB+U zdgltlvpX;dxdCOcpI?affH#S+$?yvlX!0okKmjiABtIJxSYq9LPVL^}1yS+>$)tEb zkH^pe$GyMJV^h9Z?HK-y=5=Hqwe!oiw@7$F%AtBj{h3$m*MAN66@4+wCq5tfAg|zvO4uGs8U7s+lviG;@$K*WTI)Hl z*RT41`ekX?&}Y=nk~gj$f7WPX z@1D~-Qs_UT@U8Te-$&$ed4SyXU-ds21R);@gVxD}VABM_$G$M~Ddl|yV!!mVLT>8~ zuYX`2{_Z6=T7TZ>;FVtT@f7irmK(?wK<^3Ui;4L(p5^pL3TS;p?F(O(^{#p@`F39M zwIIA0>q`)V5QJ9;&`xz$YE?hZ+tq&wG9(Gbu<-q45c3ZNr*g`y7AnOm?a{W)-`@Bp z2sbrI!qpeWkVboEy4yjc)!a7IZAodeC0T4K?)$_Rw?CRU+Gu@$zHh zN;Z-#zI|$sYwtZUWE<3i&{iKqA{^=@4P>=WJLcHe`(nQWmpr^2-Fv&0rwH!&&iMyI zHnCwqmYxFL_5k#_0)fv#rC<(zt=&~bV@^-?6}^R}3HZ*&_eyCjZrz>Q^Zkz|eZ3GJ z+K8Yj1BV+hlEr9-q~Q+S+}o4(;>yxl?9?_Hcl7Mho{7i|NS4D0mcVI}qZv#TI*B&~ z{}Rz_O2vNdr@wA4aeoo$-*!^{Mi2}){X}1`OY<{IFaXNU@w8XJRN?KK(J3BWd$#Yv zuT&h;p0z2KPpMZ>T)CVJFCQ)r6v!`1 z28;7MsXdc?%_$Cx#T_lfP)Pm8rNb-q5rA0_QVB8a z&1w)dUMoWFu0(9dRf-GRrgzqv_s9B*Aixj=1>flDq?4}V1#R?-W1X4~L~}|8Cuo*r zXdI_7j$~m@wrPbYi==`mW_(H8s>zY&9WSD<4B@x|qX>$`35KQ!5wl#(uSg`Kn=Wa0 zeKqdDi8leO+$_1oQ4C@3a29*}`?-ojP(r`0lpY5KAlz<*G~OL4{axNmuUEBSJ}6yi z+#9|fkFf?E?*CeyREX}mrtP$o-2O)$a8+k?qF7YLIsAzO>m--MYEN~?QPF<7rf0qV zd*VT0%n3XO;ZFYGnZv$9c{|lXEoLbFdp<=F_@d5W)8O`xOxlFg^IC?zuw$K><;l1s1gGj1={Gal#93MK^@P%^I!LCyv!p98rbU?A^AC@IS~$E}Y`uO5g7r{H*5$XkP=v3@9Hs-4wolt9h(Na4%k59Re0pkm0fUp7@7wj`KfGUD0=M0(pj+6Nx)CW}$c$?M;k zDDbyOQh9VtC{p%H$}exM{vK)N9FPC0E&tB)!|iT^BC}FOHeeVY zexUoiiC*>$%KrXlaZ6i$-xoWqp9O7Wkf zg-isT=Kqg>q3cKwE{SM}uG>9o?A7;#JY&+=9x?q2U#5n9vGv`AJYZ%#A(*S3_-3#| ztS0WL2OnzV!F{03d-i7OyilyVjtQTG_eb&4@B+SI+6&UW3HhAIvv?yCa;tCN*5YT+ zHqFWJ68nEE+_rs-Q1*a!t9`-u5FE$}>4`7+HH4z+p8AyK`yu*u>G_{C+V5yTi(Woz z$$^sS36*8HX4s!NJ5DtkSp0Z@#Tf69;&=EHw#BlxEswOzcV8~E@h1t3sO*_#$}~DH zmSiK&9bbKAk5pX7Ee0W89fry;R9A7-sRxQQFbMAD*u)AVpVIV(u}(IAL9Z|{U(Eb& zcze*@T6jx@klK!#*#E1*KUGE2MS+g84gW;|#f7L7?#Ns|L ztb1orTl40Qz^9gk`Bpkk5Fox|Gm9e0;~_WkYyqH;T!_FkA(3k;j~76Cw(zIa zr>LOxQE_y0s$E2PwGYKP5&%2wt&|e?FpA_tS4Adf^tcsQ-p{gB3{bA45cpLCbXZfJ z?$h%LDOVN%YYoizvWrtBTg^%mscF-fH}o=8RLaa;ovv_1m*&HN2lA&^^wb<{QjUeK zN%ath`%~{Xd#a#2+`7riSvS$vo-}J9F#yCsJHL{lF_s_+Ok@{d1ez}5VO>@C$W?vu zg3u~x4lZUTPM0awl9Z9Batr>RYs5osp@#B*)&>vVUXaO;8XK5QJIDE%J}Me* z%V$(SxZItg@c`o>1mW4p^t5i7Qrr2!yWnWfJ7jnE%^QLu;qcsrf4cGnJ1+h91Xnod z(I%WKTS!2QbF86Tdvx!@iD%29m-BQSqm5}MXR8dmB`M3{$VfH0EbxV9AS1f4ubzy}f#F5f_4M6RF8t8g))BD|R0B*Eo zDx@`nR%bh#$!c$yVRzpsv^d<7MPkMKwxt`W5K#Q12$AimGH*tI16}u$b(hY$PN2)m z4@btBWJx#KT~;%H<<01@^v|+5T~GeU@d7X)8zNOZK%`C#lBtB&gU+Z zAX(8}qZZ{+TfIiQil&dE+H?gIvt1!^*AWcm);qZ)$|qS}c7 znF*|<5A&ihxE#43C;}K^r3&!{dKe}gqCkzBU+MjXNN)&~UIL$&@eF5C-s$NxEI&=jRl{dQIf#(NKdl2GAqY zx8?_wr+!yqzA)}nOS)X}dl=$53~)Pua_jjD)3(9Ar|Jg7cMqCVv?Ijqt5;L}{Ai z5b2hb$qztufbFL6GhI0V^O-}WqvxL&3ozX{#mfcda@lS{2tp8o5QHE|!Nh0eJ;Pfq z87bJ$Hr1`VJMfp(%|N*&=?)5~Xm0=1xm@4w&InLqe{GO*lwK`$9bSL?t;khi(~7WZ zu?(;{1{-l2Bb>!Y?zVcFwd^e@#4t2Lyyx%xQmrLa;lAJ|tszyBIUzGUMsI8K5Pgcl!b=Mz85 z>-=g%81^#2Lb!H5)kiM;Ap4Z<^Iwza{%hrYRm&fQAV~4OoXvV?9oxZLr09OM6Jv%U zFq$J724gXdAYsdSZHy4ZS*R4fbpLzU_Tp`4DRCA+A7HkboKB<3>9japMv@X`;*9fM zuU@*5TR*(<$Jl}pzxOuAqZt~5uj@ARv)z=66kW>9xob8&mM|LgiZ*~#B746T$a{n7 zx<8}8xm2MrxF03DQ-#xn=u#DcYw`Y;+^%cYV0yV(?}L)REpGl4J7*y1`>OVLu9h8I zAUh@!eF#pEXmHM7Q4k^vbD)b zwj{Y67E`)&&6h6IAu?Y+<$#5Yg zN0U_-*ZAM;w!NYvpdzVqSwyr7cZlx0S=YyR(*X~O7sW+-qI}MBx-Tl@X@4dDP_6pB z0)SKRMHG1RzPo(8(@u{^#BX~_YN@eHe2jP!fJet8*0Lw3!IZBRLi$o!wv zS3`B`BOk|q_ABVC#gc4*;W%5>`max_*)7|Q=10CM)fD89c}r?PVS9SSO#h3SStt7#3y zcVF;+AG#}q7-bz+_&G~UD#Zw0U8-`QVWmL{Hz1~{)#mOk9OsxJd$wIz@S`OLjNLYf zvnuc$#sFHyNn-#z;5Y$@F%7?m8lod~_vioHcQ=L%{6pZJ!9Y+9MbIpci6TSY;2W(i zk^_&^by>RVHO>h?#qlkC@?Y8M$;;C4$c*9oK7G5eUn#*N`kohiWAWYCT z*H3-#Tm>)?evw$Gaf88V>f^MyFOR3Y-d{4Q!s2?%;(?{rtbaVI7h*i0;{3_o1Kt)4 zb~xOaH(~vXZ{k1r!qn$+Yu-jHif^3!N_Pf7BBJ?OUVVY@=WTWh>)Y=gPbazRdgz8F zJ-xV}zk>vxm*np#|I7yhgXucocxYf6eaa!k;5m3NznH=V-J9{BZo5{?r)wb6K#E)g zY5dGUshF(m+M>1d=5k=&c}6P89!D8dG8~Of<}^=OJ(DBV;xd~1;LFC(`^UUVmgQN4lbh-4xwk zHud9wqJR1aNz-yk#5}sRkVf5NZqPja{Rm( z5vJ+x4eW4o-iJUemxyQQ_BLd(yBt=F)5u^`-)^1I)hn)DnNT5y!GT!GK@q0ulHRC7 zpF9f$gx+3i1ee2Pc3(mz$kepyJrZJXXNw6tA?)wwy&Qs8DyHl9SA5sDDITdwq9_U@ z448qYF^Z!(3Kk*i@m{#zjzo>nk94ua`d=SfDoQ-?lg&ng=HS8J8_{MVirKobuiont zJ-LK$$@5B>okB4tw2s}!A(m&gvzr`_jDbd+pkS{XA126c{Fdv!J`(X& z?7QF^VP=Sg1nzMo&>$nrp4`$hI3uNvTSjS^VNbStBCW4#G&F48mP>IduNbEw^7#9{ zZ9{z1JSL$b3`ertg~;c92rFcsDgF(jqU>7B>vRjrO=8(!TyM08QABsTv2j5>^t3H)yAqZ zM zh~j{*?jGab(N{|$Ro^Lgqbb>x=`xZAgVCCvX@h$*s`o(2#1H7EY&p_(QB9eiWF>oY z?E>FeoY{$v|GUxl5PFtzG=?z*gV8iWk*uhxINqD|mq_!nLptu#kk9JeuYw-xJi{hf zV+V)D0$8>=!|rrBvdpdw2i$h6kpuIHZhOa@El=!A@GUWrB7tE?qHlpgsrXfQrOuB@ zk2OAq6^0oMEW;W&1C6sR+*Un!TnSnFUAL5OR9uv@UdP8ddvEVE3|LV%f(z)@Vt$x*D3YQqx=w-FBqSlbhR}E|cAC z$w>L=JkR^}`JAqA9mo8se?^FUJK1dH zdj37Cvv==<@I z^8!VqFbqwUfjvk4k6yj5>SFeMV8XsA<3q?~aAWddyXU5I6H~g?HW*g&6jR9^68QGkgkMc5v#yWUA=}QD|}SjccU>F4mVm4 zK8I>b-&j2UZ|VMM*8S~%1$s5T#YPdo5^8v zYxLS@WQY#&(Tn9>-B15!cD+7GqM^J^s7a#vd}r4Umlj5WhFaJ(GM60bvF`MzYj$16 zvn^ucq|UxboT}G9)HUd%kkBo8tQ3CMo2BQSFA5S~@%(}igdhYV2tjxjP}0xmArLMO z;gZ3o3_=is5Corqws=?RV~E)D#;d?IT_U8bw@W#aFuKw#_9huNTgJeWk>w|NpN50& zc_;#lH@IQ?DhV-@|96K38(eYj;?QqTeA=~hWSA{ZXKRZqEhE`&D}SI{iKX5rycMqb zyUPyOfB54~n2Dh{f?rgI4D_s7%(YuwK1gJ((DPr|=Dsb%T#y$;|4J?PlDz`A1 zq+|6T?z{PYx0=Y)Mzh~16mLi*i?LK>?F2||#n zYkVCcJshH^LRXM<&>f|5P=wCkNg=%)^3$)b4&_%(NH>D~@&8;!NcVqTNGCzG5jrud z4ADh+x>vEox9zdIj?IdLzA3DKpe@vPUiO*Q8Hwob4Cc9B(8*-WvTQ8!kgD+KPbydm z7jm(T0RJ`CGel<~T=IV(|f)+(QVaXYZwR*m^#v7{Ht!~(_n-pSl{ctt;f9Tu+a2FUgf1>EgHQ;g$viX9Ie5_?|9f$`xM@=y4C48(XEOUIO&|wcAo$jT-+8 z=rS9oB_1?8euF*j7nPyoa!FU7aQwvKDt-3?CRnD+)^gwOO&SYFA^^kc`sHoaT}xtV zz+~?in;d)l_RMYd1~F}A2p>Y3Qn2YQ zr{8?MSgD+wMbfr394U&UrrsyrSmpE~ceIz{JA*k{PKjtLhs#Lg9BnlB!Dd{#KH`z( zVtk+x9iBI&=kwt~PMdzC?Qk*S6JKEp83Qhgs2+tJ&^rAd^`Pc0+k+=wq5qQ2Mv9?J zp1yN=LlIGolg%52g4&dRA$d|mr9!XAxBOUt$~2^a$B`lduVhG|xs=ye*|Yzyv!+By zOfUN&&Hya0N)FsIi&(KN1mtLjumVAEfF>N=j_`#;z03p-lcD9V()#NNT&bv}pEXf8 z_w%(S&=UL;GtGu3r=@`{!`u(H1v+zICBWiNsH|T!cUgn((@UZk5pP2snqW$-Z2tTD zOADh=X1?kG{obn-xcV^^J zpEKi0h6eunZ(c6O3HkxofAQv{PO(g)cqHUZM~T<(vN=s+O4$_ z{>49FSQ?Iha6%=-FziRX=kNRSRiO2~|LRk4$m^BRD{eZ@(8gp(MrKF*K!@8v(B96G zk!f+b1~)LJI{(qxD;BPID^hOx1y(&_Dj_c5=XX_=zTXE;8jtw?d5uz~!l1uiea+%< zV=;-vDaUe!WDSybrE(a~FGNv8zvr)}t(%_oDV4D}L%=Kk>xd+4=+~cnb9?k(J}pWZ zjKN!Xt^C#G?vFyi1gcgbBv)-#LqGX$`C;!aE-P*^_iE0MN|H6U%j#pZI@2u4?g+?E z_|{7lLXtsuRZTtCw?%V9{X%Fx-xDW~I4#-^82rtnw*H#_FY~E5pYj+IIfq(~ z>gZKBCvMr<4D6H(7M56bF~*~ibo&l$ospbnvw&HA({ZEvKGl1w9>ExAK?p(+f)Iot z1R)4P2*NXi>2sB@R6aonLJ)!wgdn_#;H?z*J~FGLFMG|lXNwwWlBKRSQw9#c)%>MO z8Ux7D0M^&*J9QXQVZM*Mk_OU1(;Q(S3gyp zs5zE&9EQV2d$;%oIVB?^?SedQ3dQM z;Zyb>0uCzPMgRHaOC9I*LdPL++qhCJ!!jJhhxjU%Dx?ZORi0>t5~9it246 z;y@Zp9+nhf06oTds@F75IwBVQ9O=&ai`y+WyPA|)#s68vdHQbeGE>*J&wjU$evD$p zjj&0;ZT;wK;ySp!fj=2`_1$J#z!!K-%G`6OE`AmF6F*-7i{zlP7JvrFOrADD?dtEr z1R_RQcK$_P(UmOv1uIWp1wFP#yd3p?R_&43V2w}&K>{kiBI7Q<$6x46)()*-ka-jO zip-Pf|7iceDC^*>0->*V^`7~-ds*5)TJhh2*1>reT&IHkI0(V{^Pe7{;V*c4K?w5u zpd9t`%>N)fpZ?qUg5Q)dzohyC7mr8Cym#>#O{5Ws{s;M^iqTy8bos@GKcD*7e@Z@8 zB%kJ+zv~vPCj)eJF28?TfYbB09PoOFDi?Sj>ZiQk8p;oRpWAx-D>s0An+KS#Ts^u+ zEmFZVs&UQEhC5qrx8JVI*zqg;Z9@7ro z4)O{V>2Ntr<|m=sNSr1|UplpZYxeD+ca+i?Ko`jKxk|`*lWxJD%9E*U2X_l=2` zmcjMSZl~&#$_>9TN4Yk#3sh3r71I=G_#`2Qjof$n{r!IpcJuAivYLkw)qxlD%xLkfAQ{Fu(CSKSo@&olY4LzdWj0@Y;V6f)Iot1mP8g!oem8LJ*!Ac>B-r_VcS$WaynO3UQO` zmg1kx5O3zZeYE2Y$9=+vrJQ>A$I!MfN#&_rx`JpFbh7(WK+Ya4Q@?Cl=z_THcuT3dc3D#6ztqwE3@XI{)e9j zO6L@Pke(TDc(YWtlZtub)^WRkNy%_DHks3m3};ZDJa~bewJQcVYxpYFza9ba!MJl} z|GtOcL;J)ZqMy^FF2z*`9!L;w{Zp*=WFtI(mA5TY2azq)MCfi{CcuUtgcz~-_zj5y1&ub-;Ocq-)1i2#_82c*_4@ zbO7Zqmdj;Ar5L4ObL6iogGz#cg=yj`$Ggm-abqi6<8*f<4TsTbv02QnB$vtD&t`Et z>pKVA&96;9-sODasaUWajNx$&r4T>u+BQnR|Kr!I)Hn!E272cdIp<`6C7J90+^RgR zMA2~Y-J*ot;Jk)Ew!c)lKmmv~=N9fOh3VY) z+wa+EeS-_Dt`C|AWL&R9kb!-`fdx$)9hOX!!)Zx!rMuwMkZ@$;WA(FZOnPnO-$)Nt zILVO=Lo*yp(*$i0Il=mqPYZpHHA#Q7p0z>$9zLUlFgPtb7iwM_mE`;SMt^O5_`{6? zDBg-QG!Apu1_3j>kMw3+r|p|27nR5+o4-=DbT}2Q3>IfMQ-5XTh_G{uk+H=n4ud0) zbl@9nfZvsxt-tbEH>qiIL7$bv@%>Zha(%lyBS22IcnrlQ71234eWEWvr8=qTO-SU# zXT%>YkfgDx#cpw!Tp5l=gYBkttGSWYnQ3yF(ooCm9Swxd5M|{znUDOZCcH74FumfOKw088D9G3>=Ob zIEJF&dEI~?g*6e~yHwwy_`>j#r^Rs_$ zGf5&+vsaiLf@a|OZV9pzVVQnn=fm^1Uj=V2mfUXPBz7x&Z{uaP`^JJ7n?o3Y2Ju{h z;KF%zwPGvW#h3bO&1U|5x)<2tzAd$05;O^d{~43#?k@JN>(7!(kj5XiLIk+% zOyP4B!2ef-m^~~(_Rs!rqdtCGNX&dgf>_Pt-7FkEaj&_jvza3{K971N($DAe&Hk5mRxcbjhPTM))Dk&RdpWGijbANkDGug!oG;v~HS#gZ5YMkkzfEV4DW=;PXNy;P7W z;j1+a6lP!y3`w$>$ai!tJ`X!0i!FN1h7tw)e(zJd<`_m&0xTqh#Z9$UU+(UOGIYbD z;%&26QxVvc>^8SLUGZw!p#>r!jwpvw926y|sT4oxkL@`0P6z|OxTunvsx)5X@N28j zs!A5<3ihMxJ$PInVNRd%5-!ef7c)D05*)|#{1MSY{R3#wseG||tNC8z=Tj;|54KHa zU;KF~-_vdZpYg=^d0~j3;A{E+J956&aG&#Cvj?zcX!4EsQwR$bibHgl`oeMpXuxxk zs?g3X0^-_Hh~pjLp_qZ5gK7c;N3bkCZskenUQ=QJ{_|s~;JpP6m4cNrjkow(P(Zk$ z1aOz9J4WYEd%_d-2Yuh6e|InX7kU#+vhdFS4ll=Ti}rVQ*`>E;Rv9w#9kkkm#aR|( zaE4_mTw;4vir>_#kvq=addu}i{p>Y;2V-SPT9Uu1WUx5DJ^Bm({QT$l?}B+ZS}dvx zjzS5XdTYsN6W36y!hzA>lK-=JxVI1a%(vv0cuID^WN~63~%^TG+%lH0DjZI z%;L-R zXNNm~{Ot|E2t=03ah$4XE9Ifa-DUj2oyJMYzb48gl3?f)safs@$?y6C#(K5H}zc@^4hDwc?_EAn`g6` zM%&ndY-TqrYqPkrvX_oXNw`*Ue&x+5ekdzq6A-+YLPP~Rp8my{dJpZmfWABj_iV;6 z=se~noTdqwCtrHcn{7+TEM1sETK{c>t3_aF6_;DcGcto+hC!^$Wp&sG*-g2wY=@i4 zV%`0njxns+efk=4Xx=SDG7u%fRVcwIqVB)cINfzJAwB9?KCz^6B)X3p1`fHyk~}Fp|(4F+#5+34_7+da4Aa|2mvb zfB3z;`p;|Y_-4ST4EsIPEQ1jgoJHbvu^v5}p1(l1dQ0DWKqD;7B+H!XWLcq6oZ4u> zrDL1Yqrs5f12xeek)ey;Q*XA__~6p&0&Vw}h93gd;h1;tNL0=j(vQ$tvwEe2 z4-cq)bH-`Hds$Gys$vh;mdiRlqQLAOeP;Cj`&iUp2&F+O^KW=SL0-)703yq2GA`?U zl`;wUBb4_^zS7x8Y5Yr&An}jDARSZTBesn5OSn(lxuVitu&$5Oq#-3i!hMT~LsA<^ zkN{9!Y61xoMDZ$Q7#?;oJj=OYUvTe(Y5_Y`?GTki8KC}NTJ|rod}D*u_r&xgNw1LR zAqf&BNRUu=kk%I^NRS{w!u^QCoq)flJLNrJ&i)O3h>J8(7_Bp41`?+!+-Ga?$5Xw^ zc$;|PEEKZK>20e{9-S}=>`xc)ashUzGo4)SAyy~b&1z#Ai^**oL3CPIbdzPT7;99~ zP^^NN(;MIJuxRqp6m;Gm-xnli+Szscjrh|Ao?4bX7i>%ZmahM%=R?os`8`HY>M7#v zoxwAyxV;6gBU;Y!9^Ep|@P=#>DvN9B=lZ3{M`8`QCjvXmb1+QDxUx;T>=1|3(t|Zw zSSP&Cye+a0|D@NqM4pjfj`hvJVrFp6=T!A53tU^3>fhOFb(w=D61)#VeM|G zm31)~W?V9(Ps*^KKgmJIKGlXF!fzmxsH`(tg1!X95^95yK z%-O7YtY>3u*NM5#Z~ht1tX$S3LeG&ne1s|7aWug{sfIg(HL{fyp*o6|mRvsVCAOIX z-lGkwYp7(CT1BV(iZWh;rTfS*X{U-hPD38Lg)sXyDbG@8bAMm@ggz2Kj z0gx9^N1fp~O1^-{Rj_hMX&w_Jy!QS{%@tfwkzwoLw^FlWQYqGJoYLI z$FRp<{kU${!AIi2>+d5HejgDJ_I-d!A`LVtz=oV8FcArzyuOugn3z7|z+--$3*tsn z(D{}j(tikR=W^M9=|3G^wDb8Nfw)z~xsuCm%4(HI;D%SzkH7YD|42D-r?mAaIWLq@ zJk0&FblR^=Io0R4l(NaEka};YkDJpmEhZ(c2=@^fECkAl==nHQ$}-hwTb5jU90N|` zi&)b6F5qb$)6MCyyIH$s5bGRoHM6dJL$lhsCWObkD=@6@lk-CusNV~V6rtK^e0apAj!@*u8CDVic5caYv0p7Oi@6#i{A7dm$Yg(G;$u z=zGq`^*W=EyI?RyS`j%!tA2my&CQKY0H6OoP-6$vGlSS1lih7K56;hJ;mdwzjy!j- zbDVFc-pjh>|Ge(L8{F{r*&Ac!h#JPKI_eBZiX9>jRO@&g)sIbNOPVD$->{E zUG&7O-ai?=X?(XT0zF&6Z}l_{_vDjGeom;+ckonEby&0X^q0?pd(3zHItR@mF}=qd zQfB@jYnI*Q&U3Pzt#*smp5c>wYhBqKy=>GkQwG#$^gQ zXh`T@g@QO6B7#A?`L3p#;IjRydOiipnSWghZ6I2%YdwEOzmc(^F-q#Q5mlsWsxGIL z>zgi0@uwhR2FeKE0~9F}HU&o_yQ{Wp+{`t{`_)PIt-F)+kme)^3U-OMbP7L&0Y4YJ z9-)1~Zz|QbonyDk&w%-CB1)9Nb$VuyBhP7Odppb~x7A^HF=mI|<#y(o-45sU_tQ1G zD|W;J@;dNb8(yZl9r+`&H^;ATRpG}`Sb%I&wJOH^dgHots`yImg*OQp2^}n{4@!>| zOi?MrRSi}T>s!MP=6aMTPJ^E5ZJLyyVaoN)5I#;guSD@f05K<=@d(z2t6rL$d%bQP z@Zh&nd3l1(#?EU0;D2X!?8Ol5RbJ z`Yn0@_hM~sL^p+mq@G+EW^y6RUA{Ywn?1gf^BF|JeF$7wmt%1KxPm;7sKQWaR)ANu zwkm{WDFAT0$#(9;zc~&DBDEc|~yr1lrf%i2O1jqb#_s6lk+u75x4^c!rZpxM5+`^VR%aTzfvM@HO^&VByM} zfoLFQz$9%@)zCis#n&qWu&8@n^1~K&)HRcx5%FN(N6nbBAb&@_hq9>4Wk%JgcQ4`X zKLH}b3?Xv>PB3PZ%{JO(9^1)c%5}3&`TO5I*=feu1hFf(#01JNTdO`kb!OA- z!)Qmwm=4zyItth82^~)BU{g(%=e**~z`H1-X{U;R@|$x%{G95K)nb@YN5H%`DPV(B zd)41Fy6?vwfY)wS3gkf=3Elo)_^n#cH;QseldgmyFf2sROPXJ(z8fYIhMQ#AUX|#Y zHmm1RAd74jo_So39G1Ze1C<(^mxnbvmjoEXEG0jb$%Nx#&&4dE#j$|$IdTWpg;y_D zHO#CBNpDb1Gp%+@PrHSk$PfmDkzW4L@&6j$hz1;U<62?;`TCm*zj4%aVw!M$;pgaT zbyW46^TMXA?`lIrChQ6xBRr>tJST-_ha-YhU% zlN7~RJ(rWZyScjL+xt5mxvbNj|9rFTceJMxoUv9O zcyJk4b10M{;xZ81QouAa+fT~*l&POaLM4sLE+Tu4kdi<2Sr_tuD6r`2S$ zPGaBu;P)jSGkFp;SX2S#8|?eyqkUIf*IlahjCu&aD1zrKLB7aN;SBIVn5yA_K8Km%)1JW5JoPnP8SR?C=TDVcLmDt z3>4oE#kWCmvHeQ$b&l^s@wHI=H7LFeio<4zIZ)gs5+5NV0)d%E^t5d{f;! zYv<1O#((G52teGItqfING;Dd+{7JH}itF@P->r7WX(aUU5#fH3!l7>lkEpu5UEeu+ zdv*VmX%O7Aw>HIp=$qXr)yA);J>C3P!G)O!8PwtIYBFat1ZlurHD^yc+qX_Mu$de~ z>>`1mgE$B`A$CN-&(YG|Xw|U9s76!X0<%t!LR)~-yI$kObvQ*VxOD1+Jq3MX=&chB z3-VL)CEGN}D!Sqn-&*wZF@D_CgC9TAl^@?$gP-0GsB?Njm-3x})}FUP@s7|i(L(Xp zAmi3VDDHyd1EF{aD83!CVZ8;#pMc_SC~k$~W+;9Oa{fLqMr!|XXn(mZQ+2*UglX#v ze+#YzPWvplPB+LA>?cc=(y`&r*1y&Fl`@O$2*7bYGun}7x3HEWPOF=Bo`3X(2bVn= z2^zW$qYFi20_CqPTkI7}XPLTb_2c0yF4$ad696?N&E~>y0(Bh4U61 z91uH%OCXb53kq~EAZl;nK57571PKx(NRS{wf`l?ap)5aE_21*&|6KnQ(8h}%bKB@XIis7D^UGSPM6i5)x~PcvO8REtJzgmb(JaVxGvah#BHkSXGgdENe^0MosedO z&3JZ(D(|VCiWG#D4*;|TRET;nbiJFSI`UTjh_^@jx$D@;nwbe!i#waa^q$>x?|pi! zW&$vDJ+CZo&Q8@szvfO|-zvqIu8Qs&$MliEAKGZzG{t9^T4N^JZydd0-KF~a*7gO~ zR&~%>^EckoRN5!CyR6!p*sCNC-XFF>P*aLY7pl||b22SkG+F>JS z1{BH=@xm6*Q`LBMwQ+WV)letY;(8LJBNy~(R&#q^|+ z!i+Rd8I5{9Zh$u-9pN^7eu>B-U)AE<*UmrjyTB>VLUX%^R5Mv8Yd5p7siGN;YLrQ; z-93K1wCGa0j87`i-f)uEF&SWYJZs6YnOrW`b(fwfj~jnE9#F;Ah~Pqitwl)GGqMyO z2ox6pb$5AL|1OtJR@Hj1+q^AuKvScHXbQ&+w7tdSa?jZhc*!-Iv)a59;N6gDW6f06 z_6>F0?@;zQbmQYQ?Qd&mZlSRD=$=B3p78jHH>- z4om(KXUd2lb9%(UXO60f*tOu_#p1>N4vvHR%}}*#IrPg38*2#gxWe@t0;2>MJ>(*x z?@*ql>ZLbq?YbE-2V=4?lOPB^WAhxFy*GlpnB1l=tjp}Q=DHou*G?|X{P)AR;?5x0 zon(rWAVGoz2@>ufNb|k~2@)hoxSxSGz06jv={R(wu3$^mfkI8c(DH&AHVpsk;>|@f zW8hQW$^wIk7X~PliI@OF4U}D_(9|$Twc^nCLx=W4pSsjhMp|d2^*WsqCw#Bx>BDU~ zZ=pbCF<+JTLYK!|zX>eF0%u%`8maZTvB!U7w)bgwE(YvY(kjA}jtc9zKvngXJ#%ih z_wSsKLOSQW&{ip!vO=~{weg?BH9P;^#Fruq4aNq-YYQ6UaE@i2eOR~2bGK3Es4sgT z|6*1IOr`K))`kIA7j+00Y;&t7@_seMcc?gMgoUc+*PA?Y^}YB`hNE{8Ymp5s%39RAn5gJ)xPWXtPOt!iv=rd`%)E2a#YpZ;c&5i z^K7;ZM^3KE$sU{-l|B3Xl=!~IyuP7Pm<{97x<90Oh|`OfN$p*db}#MQMxtdBB!n;S zH$D)q2sNK*P)_wwNc1GpuLKDaBuEGwXhWPHFe2!ou(ae;FpobVGXFF}%=-^O`d&2R zy$C1_cD_>}bnX54Ama?w_rxodJJALtBJguXQgV!;u&xKJs6}Y=sMUymcU8-D%HPhW3<@GNjQe3UNG^y^*xDN%&T;K}|qbMWn4C?tP;m|jSHL5!ApPs(-Nl;dS zLxjMC7|9IEHs!Jd*(|He?aXJ!vibcocc;&OPIJ+rOcCj66u?1}R}jD7;P!F+7+`uf z+HYfZ>nKCB3|sS=YdcN7@Qk=UQ$n@ph_RA zUTGRN`&vHo;3G!p^cY4{I!Z?yjTpQSs6OY+F$p<@cB-zu_}AUjub_`s8jQ4#Byfy2 z(0bA*2lZaA@u#73*rmF2Mlr{DyoqlPg|xv~U0o;UI$4*?>bVflvg&h(0L@Jl zqB;7WvtZ9I6?PyvM0$At(5Gj#y-{$()=I7g$8hdU*KrLN6VDGzN>jU4%IhgtEU%^c zXKfw_(hRBB6USo4)q3pUKT!z?g$&hn5kV?)iU670Zq?CE-#*o^dH{DG5(dHm-+73< z_#KW1=&G4T2ot}FRF@6-&ci*b73X%&mv2l%GgnWAy)=#M^^3Or_}`VD+oE756c2?k zVZL;p6dpq^1asfD49;y(aaf6=8u}-wwd)nQs)5V%ScYgJ>yWA$bne|+*x%kvb z`LmguAGPauq9T`=_{g_m%3c!?Qo_tM%*C!(b$cr*qVwepaiuJW6C%4>aqqR2`NXobH9d zqsI-zlxZ`$`I8IY= zH%u2T^eNS@2fq8X=~=%XUnm2igRiw7Cz|wW)y|Ki^3M;U(3TycE6d&NpuAkxnNfJr zXje-X3!8t2DFfv=XH>5(`S;BiFM<028p;u70H>S52#R9NqjfJ_x;pbVdoj6T1)EQk z%4ohmqcXp_aZ(qv-z&T+9ge!fTNd=-I1%m#5}#oj%S_ujFHymc7Aqb z>o&@0U=8?-^NUrtb6`1x_u-HTP?Uq;L-X1Ts)rT*ANVR4slDSm+DKyrf$4Ca-k^ua zIIzXWBkcnhRim~&**Uin$l-uLLl}Y6a||u|&e;1(fe{e2p_teHSe&7zK(2kw&Jk$!#6aW|+*`ER*ZZv$MGe-)VSl>Mx0HV69j#9Ktr~xEOv2 zKL@zUjf$_Kd{A*PMa_dolQ{txH26q>ewWFF-viQIsJHVM*HiV6F{Q)BP~|~+8kEa^ zRXy`fOolrSJrU!2oFsHQTxT@sb(oKdtqymX?-S%Y$W>JiRlni(6KEqIPU{F#XV6o) zf%cv1f92SK9XSzRQ*9X8dQ=S}1w9dF+DTeR#hq-s;?Og*BI^g)uG2VKy)_r6D};Xs z&$|E%r%1ZbKyq83GIF;U+@0dBJLGQ)0ZFt ziG)g0&IG9|0~F`~QO$k-6&0c*^6zH?CyM$n9%b-7tfZ>!7g`nlQlulKC#oB)pe zf6rOxqn`GLSGZYaOEh2I1lYq(Gp~Kd8Nh+RVUBx8bETWb6=gU#*>8&Bf8UM!?)?tl zaPlACa3@!nHS4_zTs!HFFX_V1_bBJCcp>+ljazlnHuHXW^e1n8J-2rBX;bg>B&fVO zoPSyH9Hay8tpqm}PUJ+Hr5}VRF(_sKsyeRi=ITs<)u8W$^%Ku(5T@7b*R;=Det1E* zg46e-yZDy};NL+U4pHAt>*c>9Q$&7;zekA`|EhF` zFV?Moe(Qr@PNyi+5E*ypEKpOv75;rALeN*m2G^6-dwat<7eh-K|Ei7;O@Dss&=g-Q zgNw5=w93N`M!aRh+BqKE9WXOQLy8jIzX~K@x}_RcV?}ebmKjC98dMDUUnpFkj^Y=+8zFasLt(*zW}vD=tibII!oT z!W$3qFP{fDpo?g^}9al-X_g*!Dh zD6(|Y>pBu@r*b;YkQio8CYyygy(%KV55@hialEWjW549|RYCxW>k=9{4wlDK9v0?LD0~p0;GbAd`obv0^ACfZZ&#L4 zc_)_e`@_c4EuYvPSs$%Gx^(41l$KvvAlANL7BgMgsNAK3%sa4L9gmR1>qADHg73L= zJ0^}0=N#aNFxrGkKLgaQpmZ!oUMWGg1B@0BUF*1ctWF|71bigT%#ZisHaRuRJ@ANN=t~i>YUplum-}|8zN@&yaoa{#xlupF>BW^Xz1Iqop2X;CUODk2WjXbKq{#dP%g4cr zX=N>^NbsUpX-(LrjD{h8?`)XZNrL5Tu|dkWWhJjkC|^FNl$yRmqPXjPD69~Xd&+w} z-!0|eONu$=EQplXC5KhZnJy%Guz2(Gohrq99*L0S%S&#nC@3#^tv19Ta?5zU#1(V? z3RgK3UQe5*4DR=eKF?GZRFrw+p%^LOim0z?6;ggB0q~yQC&K^llOxMUE=emVI=fgg zhC`XjYr&qsEGasdP>!qU@@1lkp7{)-1H|l{KrV&PVPIk2t|S+t_QB8N+V!%cVx}hs zZ5g+JsO?zcrcX$EK;@GEe<>$J-1lXaPdYR}x|Gub!oTH2|10I?)6Vt6Oz;qE{+ean zKcT)0Ostz=yp-t-^mn~L^#<-euuTB{KmxyIWSF<#g8{a0X|-!zuDy!uM{Sv+boqH{ z`MDYah25a`Xecs&NBAc{B!K@OcpKHzLH2VL6xJwVdw~9LTFUf35^84<{wdP#!L~D) zPZ|VBKOkS=&jic|H6u!g?t-lk3_w54N}5m^p&=9o>SscXKc>n{8Z3AsoV(03BdilTMztzCF;N&2%p4EtJ zubU+_bfV-zv3uqLeTMsd+bm4^GRz;(ir5oiRJL`t(%zrAHafKLl{EmLlH>~svSRqp zD=WHbCZhkr(>#ethZM<&g!I8c5rN=4D@6EGdF|^fEk2J|(s3a#;W!Bu{fD~W78lc= z93`R$z^GBm?GtEu;QE%dTw}_(9*aY~&RavIUiZnd-7-h0&J_fzrd9TSEGzz8Qa)VP z<2%%-5$63~R*?8&c=wOg&Vliv(w=uJOM9W_lbA}<9)TiG8fp@MlOWNX)ZP*#Nc1K_ zf&>Yrj7PYQJrlWjp8)SqJs`qR(-1z-Z8BGmTgJw~N>0nWoTg;_XR8*6g03^Ng@ zm>kTYXL_3^7_inu~XW*q~i6DW# zTsvu@GK1&v?^?Nk4O}iuP~SSS{Zz-lL6O!87l|FuI`bIq{jWRl!d+|R7 zKNJJ}J_x4AO#;S`(?i*Nc9I^E z{qAL+uUi!*oI_ppKeg7hI-QFgTm)$}U<6GYbvh$KkOVxqoO*Bg4U!t_se88i@Knx- zG~Y@9YH+ecB)g~J;+ zVAzrq1C8z1$0|TOJ}jDay84IbemQjWsfOsJy|u#$oEbQ=zsc!hos2mf?y>#c3544T zsGORqpE=ej<4Y2(F$|Rp5ILqd819kz?%t<0mm5q;1eQ5NfT0W#kCF2SUo!N&vVz4G zBANv%E|)b|&sA+VM6rJ73Yx@dc&_M*AR?u#g}U9AgI)gWT8De`oo|vkgx<(lT@RaV zdF(*eWN9|=`s!J#wm#!f>;zX+S$G08Mho?;<}0y@FM~;cT_j>WVKm9~wspz3GnRb& zV8h$NJKXr=rTmpCG!XXNoT-Y888;40KL4pJc<&BO-CdF38_`Zeu zz@IBu=Rcn)AhX-q35*jX^w?jG2Rzdr z+)k4jsE|0u40ag?=9)8XR@UxToteG$T8c3V(rgpwW6PB@X_<2 z1f%2vVlIYZ2HKYV)%jQFTjZKzHgZWfTZnBMiz;Kz7^?gVi7!LFZ|R{%`Om0je4ANO z{eZ*>k0fl$v6}lk9a&COPS2cNhtuuqmpT2ZA-g=bC7=u5j1mrmFIZRgq^Gj${_wvv zl%ays>1Yf$=t+veaifo&LV1zTEqrt6t{!l1@b`27*MNI6BT+y#B6W=0(cfv!vAV6} z*&bHA+xXJ{nMN-qD)+zgl>Axzt#o(&-V zdJ&h-`&>FnLDD{$c+;awr~ekq!=wMES^514F#K!I%sY?2waUeL&a!dseQhj%o&eqO zPa9dKq>n~WJU+2(cskI&#WwivFQX00(s&5(@leuna2OI`J0SSu>j*(NnVV5tBYszl z$fKb~S?}8~Z94j!>wpSgW6`)(fh`ybc6-zzvep%L^7z61T+y$-R z?RleVy~(_vcpQr*{bFrw0%XSw5bF%Gm=bz+Cky}{hF%uZvpr2b;`QePVH{@V6?UnPxKmotM7r9qqkUBo@ka6BxF#KOo z`1C@a-D7TZvTjorgW)=Cl`%5&)SS;F`c)8;tSOUFnNdj0gVkHdJ@Z+^RP>SoM$+(- zK~jJmwlJF^>itjLIkNmQzYF{nq0_?){C$y04paY7XYdz8AFGYFfqSgSnGR=HlR2BA zb$VCL*^|!ptrHC{2;1^M;bOzjK^%k@m+*J+bF?9Nlsc~C2QxRR8&;- zQ_4*0=l@EYK4>^{OB<;pjTnjPD1tEPaNqr+yC-|Yc2$H2nMwVwsprRv?X@6{z9^Yu zIKjA0W7&Qa?5yS3IK#T#+vX)kK`L`xG5M28{meIuM|K$n7DHG1E|_qGMWn(P@4 z3v2Og<#90Qh) zLFrY8AD;H-hUx_~d9+N}7Kxt8ZR#(QF4y>Bxu1QsI#Q>jaXn5MC`@mJna=nmu`KNB zZ+dBdt9*r6Z>`EN7xX$&#IIhyy z*Yh)e3N+Yb-hf4DL2qC6hBs>R z!9}(s8wEGrTh0DM-*M(vAFDHVXx;54Q)R2g)j`?&paDG=WkGfawY z91iw9)bHq{H51g9gQ>L^eAEmr$#5HHD2(ZC>zZSAyIChQ-sBv}W@b3@?Cz(#H~DE- zPkST~ZR#1J)r7{v&(UlyUro7p4aLW3(NjeZL12uN&9t#*H*2{!LwNV@-`lesb!7OQ zv<=IXl~AR`vR25Zt6SClr)kVkjo2)OV|u24-e{ZEl|95{8_POfOm3blyUXs^j?^rY zvx}qH9-N@pJYG2G>FQc@Tm6{!VijLCuyC8V0V828P={>98S3hXem|Ts4lE}2R|+(u zp7c(!ot#cnem9%xo>*8H@6r2A<{*UyN?XisR9fd{L7DCa_k7SuM-V37uGh%M}ZC)K&b zE}XYT*Fjs^JQKRh;dJ+6^BJ7Nd=6hWLpJ?l_3xK!J$T?hzrqQw(+dhGNg|=T&vW<2!O@`~|EuF9@}c-bkd#2OV#d zvp*pjQf$N&9I-=1Q6(HMa@iZ|7Tq^(Nr|uFS6A^YT?#2H@&GL*h4!?K>b2c&PuD!; z&#r}0dK}ia-dGVOnBqqDhIiY(SXYzkt4VX|S?yLggBgjr1Ebazb%;`pBZqyWzH8o6 zcX-X9>~JK2({~=PL-6UlM$lx6ilagp1fthli0mJLzeA6x_teW?oO@uvR)3vD8htzI z`tCSH6MmrXerCwQ(cNNwQ?!^FOlO3X>J){dpbynu$P08F<*f~7~uJIYoD*V_R+)7xwtAwD?wpx zKT+>>wdjNW1~zOg5SqMjjIp{rRkT^{?BM)d)^cI(%2bd12=<=doa!y%O_o3O5+-}& zq2At9Sb=@&Pk-6dYsXKhiQLEU6x9BBMiFlHW^!{6%jiF zb+iETI;bXI($;8sv9@ncHj9%XD3ZxBxml;xWV23UnJm`*d;JMJtixT=u%N3z2)Mot z^|`ur&h?rtqYKWAZV|8q6NJ|i+|_nZL>c0=y4ma*JKrDh^K9jc8q$m=L4pJc5+vL& z=*`I%rZV0(1O)JEP&xAC{>zys4^6&-J}>Qd&y%)mN#ibzAT|!hE2O@=XT_={^$3;^ zSJe8!=1$rGzj7YF;Fzrm2t+liMDU6?gG`|-Yj|TW2 z%3+Q|>ZhQPAj#c9L2_jx@d*jRBLdRDK>LqCynnNd%GC{ue=c=Zh2n$YXjW91w^v_@ zWI_UP2=rm8DI`ezy~3ch`E=D1@?-d-@rFUljf!%rhlH|$q$ZaQ5~U^xOTHxOt%2#S z5`nicxGKE6YVRsd$gg(-B>c)M4}W=|=r3ZB_92w- zc$W|wp!UYT; zLyd~M|0c15wD0{!PbiR;Y&@10LNy)-apA`bei$s?ke95#!)1R8sDHySDMx9Kvta#P z!*YF~pGO4wevbg#p|sC+!gR@oX@7>go?`w`%gR4#9>Om(Sw{UYhG6L-Sig#)CY#eEvdan zton%}dTK>OZ;6FgD2U0sKpqMAb6Z31vwj0|_O<(zZfl4z){1`4uxTl!8|XPRT?L_k z388^>-a*3sh~@Wr{qGmK37#)*meG6?i7>3O`!0O`M?$em*4 zOpr)X;W?BuJ1TA?y)T!tdm=L+V|hG=Ay&OJId`6c@V8%;-#pnTS(N zrXAB!gl<;y?=^L`_C%ucR6=2}Wl_owtCb(WH)BGT6z)k6p|VgUX{f5YdUr#7Oaw63 z{87v-53AQKPTI1-2(EM0_-1(TPYzBogI$I}jy$KC%`lm>S;lN*P0qV_@BVf)u1_2= z`|gvY^7;9(&wiZuD7dahSD25>?PSL>7=;;0oq-^XBuN_$isa^lyF79x4w!GUHhUAE zkL<=H>W}WUKJw4g0!>%giYO2rA-OKdvSVSEPA6+) zO)i#kVtNDi)sk1}F~eQaVAIG%?u#7|CBgB+tWKyGeevvPJ9ky{n-#^lY>o++hCP0w z=7#0TAh+hK1iztgZYS06zyDf-aaeud-U3vSgAt6?HQ40LV%$7C+Pph!o!ohGxV8*oxj5eqJz`e08I zAg+`3ghPO#MV3xHl~X`=OL$o&(70T7LA|PHwGXRo0z|q%F2GWZG)atl-Zgu|bNR}a zm1JfBJAhCplLFnzm{`U$nOt^JJz{9P?`LnW?r*Rg3E|NWI4~;o&F-@LjhMdm#xwy( z;*3J0U1wx+O!h1r+sT!0H+Ql)a@`pwn=R_d@HuH4mL~%`uN815e^ZZGzH9IH`~-nY z+Sv(=lP2iD8V`J8)U9ptpl(C;-q0ZrG?zcrFYmZABfovBzX=u7QIv6pI-*(M_<02j zAW={lc=ugXPkZEK)T#-78R^k@?~}EORRzoFfi9=lMZ{5|Oyqf>`4nyCKuKRH9n_FW z(9|BJj(;)=IcpekgX-|Z)BfC0y^mPiovhnrwKGnG zL4Wqn;F(n1-U1PCML+M z!wb4a0FkD(NJgy@@zx^WgXdz)%EA7QqQ|P5zdE-3&G52hTlWAr(9N3GidMhYbi@=35-7P;Nu1e?J-Dn%C*AdaFJ3t^rhk2n$FMa zKAut=oMm6E5EzGgoUvG4W~VjBYB$;4{U+F1r;9O<*6nzES$d;?evT=whr!`tDvb;; zrSFE9@V((8@4?}tGU54H2K^4dA1s=LiL_W-bLE#1nCd00{(gCIzk~RG zdFfD^T-HMK%ZyEvj^xzvXQ99enie!sOpo;+`nEr=dEjX4pZ6$%#I#kY{dE{K!RpS= z$T!>Ao_4Fdo6VHv>b2%@_W_SBOiBr|?)9OtS_6K(v`4dC)>bpdyza4GPuK7(THtz2 zP`D5?U!Z<3Z1eV-F+aRbwp|5UE?dZSf|Dfm^FK@~b9F%i*m^pgv(o6Q^6BsR$&xjR zLe@d!&LgiZclli&G2(>&f`0yxqBj0ucdLR{=%D$#OY+_Ww^Go{Bbjy_BYn)rhGli>re;(2{Rv=)c)bn{&JaBa}hH{pZ}n?FFVLGXF6H7 za0hlLm)o6jQ?3kS7>-mS$0%=d^T}6Tz2T!Hyo)-GX{1NGOkP%fO$ z13_*h&x+)iyRmUT8q<_ViiNQ9}IzZ|P1|1V(zDgB<_xX`k7M z?|uq1Wv#65`32T@vGwCXu{y~9m;y$adQbevPDFUV2ibAh3 zVaiu3I$f1k`vE=StWj8iYFRZf{Q_WmzrgafEBN{Zh=ch!7LqRk-+6=!_d)G78KDP0 zC(>|0e}L!nOs-sD2l1O+IFAe4LffmNpm_-NQ)6ta9Xrw62s3Ux~ zsZV~(yOwL&wa&pY(z`tFaS=3-&FpQpv##a)FRe`6x-23Z zGL^)YuRi6-Zp+r)(hL z-SS7)c+=RK=gs4%2cmg#-<)P?oSU#ktEPdYPNQo1HY=&87@K1P>+H_j`>^h8hsAR^ zd~nV4H)FndFhL{Y(W+A!56wp;?&KE=sr|yb{lySf!r$*VNbMm(f&>W?B$U3~A}x_f z@~YG>!6SD=VDEJbP_G`dLHIq?63J*N{}Cd3;fN5m2mD=Xfo($gJ^1}#_qnz$;rHP} zFU{|h@uiUXNTn=KxasARouFbNN~)iPN{GU>nR%MUU7mQTbq9Z*fpHxMdnDEVAsqT< z@Py{Sft!ae+6yueI=@O|6ufRVv_}LY!6!8XGwc)2zUkM2nchhFB)Rq`s*DRYQ|V`8 zu^9yyN(d#15j5u3eVgOCE+^Ov6vVcEtPir^B4mp+bGI(~^QGCK$Ug}cnV?8r8+X;U0(C-qk!HZIC&@_#yV8F5^-5LrG_yfR-P+PNF8=v%q8@J zZ*h^P%D&mFKWm2e21pnvj3fvW!!Zvphj(&}I^<0{hed5VSfOdM_{C_`aP;K|IE7P~ zL2txpnxILa%_5iXc+X>Qo{)^lVy)(d@e{sySDPfzu$&tK+(2e!FCCGRaIL_3!n!Av zyiitT<}KQGFk6a(8uMDgyRU2deU_ZvEE%xC14_RvkTB}x8yAc}F>H5y9{0r$JG}GA zD_kBALT)?GZsVqT?)M$s^9MLX%12OH!O8QNxp?ax-Uk;s&(g~u#;4PDT=+H@zAteV31KC_Z`QQ2 zzu0QmSHMy?%J%{mAxA6s_(9i+9xmnH*!80wIrApQXo^T$9=yjTwFxkH$YU++b5ZQO zrn1ug9{j$6OK534KMsCZb6RiT`u=}!8lp~8$llh(9Zq^~bvkhAzSvh-zjvvH)o$tO z@g=|zgpPKNj8n`S(=HD1#548$XV+IF9QF`74+Z~@+JE`BCim>?V-kP$>mZ#VFrA=- zbTE6NLSM>$Pjh(xKZc{@{azVI5=O!7wvY55`ewI9)Bd-=&3Oasp>@CDuCTD*F&Bvw+h@~ zgs-=A1x&>|H1Y;nW6pL%Z@)F_F(YjxNSvk!%0R*r)fz6(cM)0a&_o~p`lrDs!1WVC zKDZ4eV>h|2lpZ!Ow3&@+xQ{jJdJ&5ctprI<6mpzQ8x2&;+XrQn{+uH3#k~ladJRZ?MnM66 zCx+5aKMwjXuAK5yh}1t0@w__}2do&}s{*!8*G0T1L#RI}4*@8TLZxM<1tj{hX8GBP zO240ih@1d^&Kf`WDx5U1a>Y zFU$T+vq>@JX5M+AhZi}vVKFlpfit5Wmi*5~BwXFSZC)bmkcX9vL2* zAbdM9aA61z@d1J8A%r8=JShGKY+-?>td#+-XovyGV-_y#so)EhVz(}X{FfkR06o{G ze<=9G4V*{-F&{LGi3>M#;nQ3OUo-6DM4;5zYK5#jC z+1%u6T#Y(&N$=#2eRkvQMmJXQOEVKHoir5hZ)E=>wLu_|Hg`*qAVK0Al^Z=zdBd&e zq_zkrBuGtgU!vXTQX3S-RLPO81PRi7BcV*OQfdMT5+pt?K|&EkN=+a^La8GP!S@qF zG!IDghy)46heBjrg^QDhh+@{Gw4e+TUktZRO)JW05p5rN<*5v9auq;V!en)f6~kPy!NMIkbO$z|VYs&!9J za}Q;L&Z730j}~|MDV`{L;^^lx`@&@33?9FnF^=3j$dwoe_MLPQ6u<2+<~O3 zja7xqQJ?cJ^4&;2dBYwr!RMnJ@}E1S_~G1jUT7^9@epXB2bgGt;F#D}$+8A+Li?xJ>uH?CX`IySjFe6fyE^UkrZ_N=B@@-wp=dcS=mSm$A3s`HQ-#@sRS?;o#rlF0G7`?8T@#a5*F>W z=2u6@%{f;A^%posNL7+3N6y z|7tujS}qvQJMI5F_;<8#>t8fE{qlcrcT3}Y0_&>owiR8C`TtmIRr`3OHK?lwqGAxaIr4kpc~0xOS$aDLN~A>BfvAtx{E_ zPp@bO)TlDz?at_Cr;RvH8A%;U=xC#!fSdiVcf93{P@;PFUrm*apN70+2Fo7;_mBDB zfpX6~`@<$@7uIa+ZFRYiJW^|Y{rCY&kW1g#z*vf0rqovJ|50c4zy5EvAqk&bZR!Nc zz2ve8ZM}Z`{`vWd1c9vX-P1$U2KbsDL(sWIX}`|C`PjQ_0Jq&7DKH3WimcssczW#R zEfL_}iaC9~eWo7DAB^8|>!2sPdBZo3co))sOY**#z^y;JAd>3Et+!QWykT{2z2fZ{ zU;6dn6|mqd7yiBKe7@q-hYJDEZp~f(HejRo%W?a>@s=DZ>c@FQH9~-o<$j3e_+mTm zq9<@q$2P7V!TlWVxbS<3J)#tarO@*SxNr&=Mpp8Exc(-;KMJO|7T)lkS^S)Cb3+)g zz)^^W>Nc?zv!6@5J+5U{Nc)tT&i{Pj80(U{rnRNc|KF^_<1(d7G1N`R%7dDphzXQ+V_hr!gWd*c&7pI;1 zMgJ#mn*H8uswai7QEe9KKlGhQ;o>m=xc-o&EsuxUGdL1|DL8I3c z9xR2qq-e7qZGCiMT@_lW&mky-NAxn~_h#)`?rhJbZ*rPE*Pp>6esyGRYHD5SI_5hj z*;mYPdM@j-+8HNK5NGcUo=L^+O#(!vog*CjijQ@*BT^@vP96&k7(L_y715Jk(WR58 zHiKA`)12+OSZ4Oo8gmzQq7~54lO31)kE4Kk4;<_|ESFU(fL^Gp-K?+v+4Lt}Fs-RaJFhp-d(m7uz~lyWqEa z+UD2x{A_;{DWsDGMeB{EUQg*M(t!I2>FZZ}FDb)1CL%^peXXP4UB!|y=qz-4il%7_ z$4N>@kUra5=C9*7p|9DYq4rZdp1NsNjBnq$EeuA$ou+v)O)#Z~+NU3QylK|EX{e$a zah;yh>kOoU#z8KtMRDJf z$TAra3Rx5F8&kiUv`?FY)@n2DIAI{&x^HuIwe~~;62Q1HnPVDJ97|jR-S&6`vRppM zg(tZV=)Ro)T&&1Vw7ETdo7oF>e5W13)+Gq?`?p>nR#a&k5p*l5wGFk~KHl*S7=w$2 zm^Z0oJlEcj&9IqVu6q}5W;oe<(@^Uf?WTSG^OsSrL^9l8$@p%#&I4-g|JJ?rRB|sM z()B>u6fiwAh|MwC-B$A;yD8U|?Qk<$th>L{F@`m}zgqV5lZ%JnR)Vo=cq4)r2CkHA zw4Ix`nf{`y71}Z;w0DlpvATztT-I)RwoI$d2Ajg(3IW#1`O_AB9p|JE*74#W zJjIX8-TX@R8_thUYRQkgoABd*HRQ*$>+$2=p!h40?QzmwNS*kPAAkK8KmPj-e*CMy z`SC7)K! zb02m0NCt}gIw8s1NHbP9>omC?&WBC5Ja%dQKYQ(Z_M8&F@;43XojsKa6X#SJNoJ4HtrrhV(%HBH`d`Q4L@8*~^fzq~UNl_aH2ZP@t0+=DfN zL?ah8M7tbLH$zk83zx3Wyv<%rZdk#Xb!?ffXm!$F?fKMS3oiqa`2~evk-|tBRv9BR zPtEx}qMtOUN)SL6XXK=|2r~$<6bO_-^+9hqExBa0+)1nWVBlW|pFtllFc6fH(qlRT z#|e@)z}gL1hZ&7zXc^k3RleD%8UvKx{(?#`;Z=I8oohmPBqU&1_&b6h!azMQ%)Ynw zc$=M1zwh#=!qd2qHu%m{5s1OxNBe8sABStM2KL>>z6Z;4a8iFy*6QtWt*k5Q z*EvVFJ!ws{Koi4AD0D+1s(nTvNCHB7MnonW(j9UgI!V#=gd;TI#rkZrvvof zLn`6tGK94o1&|*=2a)gK{Q9T@t1q07g!0AEBJx;_x5MS02Q_c~(7NTtQC|Wf<-<`u z{#Je+|08%8{H{R6`)HZtBd2`*vcHpB1f};m`BfJw6!gE6{58iS z>IJNf4$ux*|JuBDU#IwL$6Up&cB`Ag^uP5>XlL^NQv$AThMt-pVm=Za|6NC=KFp@A32GT$n zFnER^pCl#@kI~K=weZ((4Ykq6h@#>!Vf5KH@)YIOP0Wp=1@joA9Xik4Y2dPG-^G?O zxeRsjc%RpbF0$n93bZ4}YG={2X1t(Bj}QZ)herrJmx?P4PVKSBhA;gWtATEz9E>(F zV?7(fT(DW@Q4t}>sZH8agZ^U)vJyB=({LpcgC<&+c4^diF%1h=))otmIo!xNS&ywN z!;zEgw&t)Ird)TPlXZ<*(y-t6xrqV$wu(fAp;PGHT1&556Pon%ySt2}^gc3gf@o9a zY0Zy~>NOYlGw6&YMH2>`q%hJz`K+Ma;HqmvW-(sd;+1D&4%e>lJ0uE83db3%-Db73 z1I^t`IaXVK)REzH(l#syJ_cmericK0f2#I&#*wSqP}POTy1J zBI#-ZX6(zg^lP=2GLJuiHlcEZLT6+KxjidzCYx=v$voD@m>qVP+nHx}JDe~Pqdgg{ z(Dv#0!Hnx#|1$|q`s`D-h_a2BwN=lx`R~y_$kk_$U53&dNF3K02%XRBb7R~aZbRnq zs`gJTvhz_Ldag2%dO~k77-^EAb(qm73$9)IA+uPkrS_e9`$U#sn>Iny2Dr&%kV&r7 zx*n71$2al6%~nt9VF}v8HHeC1#A!+VxUcZ`hW6&kDzj&=tnFL+38VSu^ImK|LmPeA zU*}Q6X}_UOZ@uWFFSO}?v=~xvU`FRzZI*jme7ZRuIo^Nl^2zzP?;NTU8z1CcTXOAX zqc-hCpQEcD@goXg7%U24F??IOxX`>w`&7#C)Zrh3F8)d`Ks7Xp8|`BoHF=n9q|i&| z5*{Lgw6!S${Jpd(Y?Jnd#Ejn}o)@qu6dBtFoL;bM1lTpc!tC7 z*(>69F}Y4ht|`mpF3_w#+os+&qwNhjSR&0B%@5(F)8a0z78d_~?TvpYeE95Kz!5Ks zDEvD8e9XDW{nSoHEkxQ)_J@Xq>XtHz))g@W%4HvD+sq>6w-PGa|(}g@m314 zcG{!O>3Qp!wSDUZX1>Bml7Qv7R-&D;S9_H?J=xVE1!AVW$&4cP)bI26CD;Az(S+9A zdtm#;KyIE-*;Aldy#4YRV%Zx6WJ3t)Ya3{ilB7UcB1=FJ1e7I1hN4V=fPkQE1Y{2Zk)a?% zQ4j@01b?42@7mPT)B4plpA#?aA~|AmnS_ z@XcJ@CQLdlhu`|4jO6oO3w<4kg6DO9^iU9HmdKrqVTunp@pwnzPPU0MV{}2=Kk~@~X;FH-iQjV5E zpE=yztlLv5ZJ>#X@9n6NexOG*$leXHyTi{xx}f<1^p^Rc-T~5@-T_NHPbRNkUAqsz z18DTD^7lvsDGFH)p*I{CrNmrtx+RVIKV5rv6PM5{M= znC?}pr0;>idlW|H5A;NII{C^+ZKg2kp!w3?)@hWpby&Xvp5h@A5_f+VV^>m{3cAJ;+<7(Fe{C0A~H*YLw>zoHrgLrIEib}9X1adj7x z_oi3MyjZ8aczH>l4l$ao%hr2?JQSNJ{{j7+@Qm^^D#gX*?zac6yIvZ!c$DP$;j{rW zeb%%Ux3NuhL2r0lK=dm_Mz)A@?0+%&z^PsPFX$4XweGvqFf>-Ya*MHHNgX2PV(o+! zveT4`?~)&%tDX7ccg4g_akyo5ZWSKJke)HCS7Pk1d7=XA!z3T9@Y*uH7aQCmBb3r< zrQ%BROZz`@?Vg_$$h{tci!SzzazPm2e26sa`D&RST^;aNcP)ALMSSx6%_P_ir?B+( z**Igs#&rx|?yV5CHPjcQ2laaL;`rvnE|ddS`jUowv|Gu=Y)`jYhVrSMJoi4%k(S0Q z8|@huDrd6?i(4~`Xf+p=g^b{iLy-feQSDBYX-DGUM7;(X~J*_dg$8Z|?HO>SmtesD}B zw38-Qq=Fk(;JxU6@+s4RIf=gq>~M}INgQ@KCnvr_-EYY$MMVWH@PCj@*PdLz)y^m} z%kN4xk{Bma5NKB&(IbB*mzkkonw2+$Bza}lKuY>rs2rm5iwm+Me82Ef@`+bn1K-<= zoDQV;N`nlLlIDN>+jN-u7|t8WJmye~;?=@iZwEjAbL zur=pxyu)H{X>+bnkon!;t^J{tX$N`+ zgsBh3uSo6sy`KY=w;M#7!kHse2Pe8YRB&J_tV$UQRE5lk-smFL^EYRcFTCp4oP;rm zJjFCY&f0kO=f9`Cb-#H=RtyE^r0+!F?0- zegiaq5s*mmrqGcf#8a~HoB#(tuq!}kX)r#&Ciiy)jeFz~*W zgzUmH>SoKG54IEshwkOlUC0mO9XUn{HyE-S&FE9NUPwedBtHmLo`F(l3-k~b7BDB1 zr2gby>&??G;H+0WQp`va2KRkSPCvJ8r`6)*JMykN1-9;fvX7NiBDLqEH4Y zUl9I-pbFL(gnz;Od{#B!gAn9IJ-kLa0Chl$zxA&ruee_NE09Y)oHStYr5^AGc1A|w z1oj#Rr%}(fGV1B@d$j1Jf_nIZ85c*Ufm7wBa0#x8WsUZJZnN^Hwrnf!@zvasH}jT3 zyyJ!Wr<3*7j3H+V*x7O}X{g}l5)gz0*X>h*@MpAL4Fg;^s()x6g$Jij5dOu?fJ#wI zUFzP9SxFA05je||B+FnViE}i;aIhW&FrX-gsG*j6VCK(r8mzAB@2BV=d`EKCZOp>a<;ttw<%snDq3S}^gety;g@xE#ldv~kg) zI`rxV6<+9--4|S%NgLf7XxN0mWf@P|FI#;}hST{qVd|GFzi{ir>tMLW`sp6$D+CT} zj>);*@N(R%KArgRr(^GdTc`|C9r^CxvINI(Mw}zBwQu>}{Oe38N{ix?%0+diAk-;; zRbJWPmVcjjwCIxZb!3U8y7`N9%04U+h*Ca9uxqx|8lTmFT6h`6>L_Sh?s=e`N73I0 zGwKBwKG=R|C|c`>5`|{NRDrc7zx!ErWK6qbqaFkGDhZc^R*JzqA!0gZJF+sfoo-hr z&SqDNZ}4_F_)CQlA6)o3R!?2#&zVg>PC%RN5+tnOVvO`<9EZ!+lA<2HVl%g)n9O=6 z2ohe;wTlJ1o*S#?SLtvb-HQ>o~zrjGvF zr}Zju4+LDu$VZs;+y=Ez8~$Lwu2@rB+-Lu?dmykvO9)*JZvKZr>XmlkyOs&6Yxpzv z9Z%Zrk%}M$;pqcR;fn{mBsebr!1p~bP*mgiyokt~)q1ku&s^cbqsJDq{wHjIpnMA8 zA1WjG0ifww62b~ZS`pxTRe+6hA%g<|qSRug=hzdR}^;1cc>)K;YB>f1eugnDkY*ezn@jIT)}3x+L~o zWhEHGm}+sF9Tuy_X0o~354Q0R=hlzsE?ZZzUtF6)&YQoUQO2vV?UMT)cwg9js5A=K z6E?>BhIe{HI|Hk$0hV>AbaJR%=F1qPGkOW|$IsN>++6 zI(Vl&a}eJ-CyQ@laqwoBWe{H_D|G#VU3(*72jeKF=V>eFp{4t&>fYrNUYN8Ne6&GA zWr-w6qdm*5r)0|PY_al=7A9M2Ccm)D+i%`)J4Usukd2Bf;PZb9l+S5ASWPssC_=EtB9CrAdi=wl;%F%0l~Rwi)YZp1P+C=2#G)LCVKy5sH7BIB1J zdlaV#4kHXKMX?OYFd~mP#g}=CJBJ*!LFylzZC<@z2e|RwC*`QrXi7C@xr~_6V$I47 zKi2bPvquy2!VRIKGXa1e^DyET~pN75mRA?i!}+bmjc2SS6}5(i<5#yxl4Ei6u# zJ>6llw&h(J_EfjtNvp6egC2ijit8#vB9?*meKWWL1mW3*DiVyEHw;lH)%k5r_XTCd z(pGXa!R>jq9M6~oj&4k>?l zNe+|k9z6bQfH5vJS>1TAQZ-TB7!r;*D(D_yerQ6DEu`nYS3T*+u z%SZ-Mp0|~Xaq6n%n^WTslogX2H+u<8vyGjdY-jhiXFAMl0@$Mrl-C@u{&;f}rcZr9 z-4;o4%q&SVH5>Nm=4|1JEv!#l*xB_45jI)@rQKsEI zppiQiYOae=lf#w!B<%LVZ@i;fFDvQkkiWiG`W+#aVz%12VZoG_Uk8-qx>QUyf+PrI zCU0}CG-h7z^;?@f;YFlSe71~|U>Cu$!K*Th0FGKQ^a<%spe$)Sr8GVGrGWKqcuH3} zv!L_`h?6Xc{=7ovpA~*m0OQ+ENWUiR#|@!&l@#{fxq{D6aMPoMSUl7XV&@`mH%f*) zTRp$cq4Vu}fqr@^RJ1C5;hFfYL3lPHpAVR)HXXlu@L*4L40_t&K4_8z%P<_l(C|TUo8BYX zN~soxsN!AqFS)fM{^08#GS(6Tox$eQN{;uov1a zOCg@;w|{{;yI=YEPrfLR=8V1FXj3drE6*SQo}9NordR>j18N-w8bhHtU&o-Y_u{n=>8gWyCA z!ao3=5`ujYgnu8Dj}P`i5T5)Hvq;_WxBs1Z`AT3>7%{eZRCYFA^-3`y>E0~h4N&=; z5%q4CX;)SOzaz^J)9!2iuvC3_tBy*a4lZZ{3h9)q5|$ePuPtxw$2**GJg3?L9~PIX zf34l6^U1A=P|JP9wlt0ts~S&!<;P7W^KMMu7bICVLVQ1Kw6bWXfKu_k`lWfhzbjh- z=`)DKIgBJIj5OdJPKg}#RX^luN;a~F^NuzI)39 zz_3yBGKt0*V<)pci%+qcGIN|3C+bEia35JK)kiukm_2D5xP}SHEgNl+^UAiX$mYyy zby6I+s^v=(@r*N59Y&6E$M5DH7E`8WDF03AZ%RLixfmhm@vJVQx)8-0^(KPqes8ef z8#bJzvCo_D_~>%dh1jCv>r@3CLb;w>qqg1pd~e%3Ku$ede0$?9r#8^^5<^(pg|T0T zwh!)FMFK|zS(;q@$Dajlqn<*>H<|{+pZLz?X8S+*^gdepi8D0A;uJyO+AliWJDTL!UL-rVU%K@{ z#Ma=r1tADe9YP_DdLM)!{2iN=Qt^p;>HG$r2MjMRW>md6N1PzADW^KN^EM5PL|_Gy zOWmTbJ7oS3U9QQTrae*QI1XbII_>igf1(!lw`7^Ca&@@>H0t?vnR4OxsMGWob;q^~ z2VP18$GK6c;~Zy9ak|<%)3b7~y-aQuD3ils%4x&f(p?!{v;IfFR{wXUoci>ef79gH zqAr(iOFz~MdF~|)97Qk`f#EdE(G<+USOw4XZy_h&Hudguonw=G1!77=;UZI-pZ=%v z!Qu*btLxtx@cYGDfmA@_7+k@E;wm33uHXyx=(*QMG^fGxnI>g8i4!!FhQ7fb!Cjqw>}~Jy;kX4-)o4)@LGs8hCvW|D31M2#{yKp)rQTXp!)L{ z>_K&xS4L#_(SpfwRGJ)llm`g9_}MN^KB!+hPbE2AW)ClDJnK-1lE@vULkoE%2b1@p zy1n*DorlHBK(abXr%^NutFTV5h+5T$)!o)yuG4k3-v|ICE{Xt9UnpXPkZu&=n-iF#rW_8t-osQ5Zajwh4lxH-rKHHqkdNuIOv^Hz6Nh zZ=GJss}seul^~4HO#9&NZ7$ZnS$TLIFf9BvK&(KdYeOTZMC4a0&a3BK#a|!vCJ>BC zXgc`_##nsq63yHnHkHit4ADm=J?YbgN-IK@%ds6N9(z{Pp8@ll->Q?6P4@rwFOTMn zyuSgbNc{ah-G&UizDc$**+sm|({enqPk#ZqQA|_~zFq?U zK)`bmSOMh+&)Y%o=gOo(J?kJkx6aRIqVT%4+6kqHK>6WvDj>?O@We;fpVY*WMw`RB z`i*Z+U<3j0HZ_q&{;J;Guxj{#d4QJ`-zVjU9wAArM}u=eb!&M^3B==Ofimq;7VT

G>GB?pJ9lsn7T9^&;R4I!N&a zIBm$~3rb$8PEPCjC6XJ_u0MFMVs}IveZr<_k^nJK^lKX~{At}t5dlB3u$7Zrx z%uOuLEH@oP#gkc%tTIy5ea|1e%D)e)+AhKJ;v{P{+pSsIF21qd=5#r-&FCxf-^IvEpogctx#I#14cEQh^A()Pi0sdYk z{C+KBuC4ut+zKYaX6kt}pqQpakBi9_5&&hLAjRu&q=9x}r>*W#Q$_8dGPJ-{vbg4* zdk?O+oRcJ`-1*Ct!1AIG7O(p9jgzZhhyWjciuA=eq&aqqEEvZgoA<7?CZo?lc0h6f zUdl+0qG2y(hioa6~__-Joijb@N8W!+Yi>s5%>UzKTwn2-^4~%*P$a~bD_Ghg0r27j* z`I5kT8lYyJ5wu*co%dk7P<=mPE-e&Jv+oOZr-{&Rm+&0)3#@yAJz;w`3-x~~Jnt!B zpvv`zQ1PZn-}ZxBu2gvuXkZ-j> z>PABC_`b0x{h~0xzZJ~mL3waFCJ+})C}*R>H$SR8P!7lko`Zbgcku561t}`^Ph7Gk zX%59)-M8_}GU6>NkFVm4Ca0^BJ=>P*yfd@cC3^E;QLq9|N&SRKDO~syMtRMUTfYsj z`bGmWiwhg-8yjcv<^jB;naONQ<&EjQtCJ<&W^!da_+}2fwFz&|G&yojsg8}J$!#rd zVW>039bvV0=ox4;D`<9>EPn8p-vUv>B`}PGm2gpPRzaT!`d%(S`dCv*GxE)@AGsRK zoH+=|GsngRUkn3yek~r=(N#6kZ%vsMxieWTbIsT0BuUcPoVW1~lgsXa&K$7!*w2;z zuZG1^sHyqt!q0uGP4(+xgQO|g z0mcAA8jEYFrBSymMfT;v1l*pl#OM@;QJ+oFw4p-%tLu_psHg;j^q`g3vk6hbE_83GfO7#4wB@NJJ}s$Mn@^$SQHWU%HK54r&o|pqi~+=fA4@Wsps%} zxZEa(7WiOPJ5XRQ=|6v+$iTkuc>%faebV>ll7TLUx*9{y-n}1Qme85VXBjA(skXKI zQtzb=dl4QVB28tyV!3NJjeF(tH~W#X+$oxY7xyc|Y>fzbU#PFqc3AV#+OdHMzcAbY z3%>%@iwzBs=tdNhSVsg%td)uenzUBS-ao08@!&}ku*Sl|OQn3U0(vg)+ZLK1jOn#^ zSpCL*H!wH`i~b4ZUfM>p$A}qEwnI(|&cMP}TOfQvpnd?`Xp&MJpIE!0m{_631AY;~2Lg2ZxLFAKw?8$;BhK z*>;-ubv2hqmGGxDLlBfm^XeXQ)pgc%-uLSSQ}aB1C`sRU1_PH^*}DGzy)n@*6%ir* zxTG&G?C;>;qssfZkSC?Zi3Mv{Ve5?-rtcVp6l6^Jv$-L9)3;C``qovWG<|+zW$`-V zQ!~V^k#26So!uiPG7ce4MzdQs&^XhS?c`wt;qb6Pca)x*72~?p>bV4r;3z4oN3b+y zKKM~$%BTUcfOoC;Uc3)}tG=&5W=VVB#ez8D{IWc!~pFt34#gQU;2lF9&iss z_LuN^s)ev`UJ!Cblh$m~ z9J%`0l6u>bmJ@Eqfx%e@qY1b7JD79$Cc~GT7uPUAbD1gM>QP0F961(Wg*M7@@y<@X zYxc2U_PLJ|ArL=@3TKsHxmELa>ann$YFP(w-o7Go$wo&v)o5$V$};uK=K2 zwIsOMTt@`7w<7{$hRF%f#bO9LlwZZGnmH+Zs+0~z-}{pWoTX`uq-c`F#1RFq3dgL5 z$SOu_?A3ba42bkAW~3<$i;QVE`g5<_r$CJ5+&c zCul0nSXQ?0!Xz|zkZ%P?;Iy;Mm;;v2C&hrX8CWkU-W@ox0Qq1nmtXFzJ3&*mPN)5+ z@8WW#N8~A{iErRAm=~P#U7(ZtEzLvYfJMhA2ND3#fU%FM8!6t>g`$S!BKjR#x-d&) zDAj#gOBGTfRpS(_KZc^QP@{QCC+xI!%j z;V`J*E6C6%74*JT5se@GyK=!H3&Ouj4!TnF+SIZ~_q7EFhrS_F5)7Os!p^+4soNrR z98gexT9;J+7Sj5xv@_%hk01s8-p~N0l|hhOiW@Ws!Ym{AO-AZj5R3uVvv}d2XS{)) zMFX2$Et@rA_`FHg2m9AWA#joRj2kLntWZd&^Q+pW`7Qh>>d*)v%v>%$@#pF0Q!K^Q zt1~pFUcHbApo1P$z*9$z3=Z`7@*=mBn$E|Lk6%65uegQ5#6C^7A;;xwP3t;GHNT$% zEQEwB37;Trtl{&IUvHmQe^3|@(S(ORYcu*AO=8Ds`bJhDXGB=3yG5}C#bAxie{8s0 zjs67r1!DljEie7@3H3Qb~Yi*796F>~da2CT^j>HT!E{Y_bEL<#g zMJhU9(IlKbh?e=CeqJ>B2^_gI-5n%R>}EFXwgkHlGqVK|J#S=wNr z3DM#_FPzXrkt^vZP0ITC35VPJb?-(IEC*{6{1WZI^(w_Jjk5ZLi>B!>h)Er!KVfi3 z!tTU7o$igfpT%Z!mrZ zcMS93(E{#}?ZFr9oX_v74d4RmtzR`WFD!i&cD1ya_0QXUOj$-J&!-wm^4!`V4@w2% zn5p!|X~_NaH_e9RJvX+G08YMIgo*3JInv{U!R~Oi=5taU>CUw5vTO^RC2Cm#Cq>=h z&J~0wfDXYf2!dO|5~3%yq51Kw&y#!td`~m&+V_XfukbJH!5AEt^&~+>q3mMw_u>1R z*$X=x8odt0eqIK*sb(XAlg57b)STf-HK%`nF;P|g8SAnH#CP4-?A(}Ee)DOxNRB08 zd$`|(?UfAJ*!2(1hqGQ9Rr|+C@i{ZqYNSNUgR795ze?@i<=0OpX#6mVG|9SMvQsq4 zu((LMxVYdsGC34gMTmA*%We&qmh^ilra7^Jnf^~ykzv~A^tGLLo1#w(6ipatmc-fI zVBn%y;3tJ>IPkp6pPu2`H={PJw)gkjYLek-xYflFqZY1R(UWOhX9ti~wUFke2Dr_x zahzRVB6G#Y8%v{r9E5=|4BL^DB})5;HT3%jtpvY81+%rW+fs9-39t&)j#Gio)oAVE zZ@G#yS&3s;zLGV@VmPeBHdt13JVt9N*}sB)Uv>0}&Pp0B&Q2zm#hGT|olS>iIXq`C zxH5IEMLt+uS%Nlo{odN@cK#%AoPiL{hjB;&SxN1j`5A|nmh>}=Ny5M|1jcd(&OnLQ zUe$!FxwUl2dIwQOlJ=K#!;**XsS2b=`6})nBS{blkTs^bLq)V7Y~vly3`^GGwVPHt z8`KN~N8j}!(l}G*JqiPONtrLEi^^3S762ObuqRB*xv>xXm!_49^4dvjC$E~nFA;r4 zbKCE-n9_bQ!uxm@S3vGSrKqf3z4_gjPq!$KUT;1gw=qH#hU|#SeQ>l9ktfSy3tm^g{z-mHiav%W}PjV8Qa2NDXc4dEdq-%mZ{eL5aL_pa_=z z>E!w9A<65aDj<3h)vI#P*4Hy*A@$!*pXJdXslEStK2P ztmoJyFFUQK%0M@AT>E&}0^(F1|9l)FzQQaOiz<@TE^2vo=r3vh!}M|-{pjp(btk<` z#DVQ7T5x7)6Fy^yz;%r%vXHBc7GJJN-u@|?F{TX|Nf9iCu@pu!B7yYSFFkEJf|wN{ zin`jVI}g9|%|}(x3&%=vZU&}aR~w6qcbGEw{jz$q`x+N;nyEsS2bBIXfCEMB zT)eKfbnmYm^VcN!n|mzD!Bg+m*g(rCFCBecHom%e;z7=Fb>s4ArdsK zC;&y~Rf-htk#G8rI9nS@!wl}QqXvW9i3LStq9fNS;h}|G#q1i2jeS+ke~l{ny$r2mjXS zDuK?!2t^S74fHt(&lluh>9yDP`F8kNVjEDplZw#i302>f@0a3q^45NtIc{^!qdk}G zyqt6)7Lc%w=^kCJ5xYHDV=kH|suZ2HmiOo*17n34iBcX=tvHDp&F)ap%`ALoY9n{d z5DQ719LO%;?&aPXh7m6+3)GfQ+BpxnQ+G$8^(+hoW55j*$1=2mB}9hEKMD0sLXO8P z+ET~gwJsS5ZmwsGKQ=$&A7h|i*}0{JV%{kgP`TO>>x*H4pTqgL$>=%2@6p%KU9?B1 z>^Qk}1o94^qA?sZusBDvtN{}#j2;%k4`(3NAi8NUC4cqMk_u{&uw-=bX5(N>sw=}C zYo$%Q@C(U3JB5N>2}B+30^x$MqMlm1|6bL#Bw$l{9kGh6rmWmZm$|xSd}@l>%sZXm z>@T(Xr@CK;1Es$H?L&O


-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

9@G2l`O^Bm$7zIt3&vEbZ*C2w6W@t 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 builds a compiler that writes a +// raw profile per run (scripts/refresh-cli-profile.mjs). Optimized builds +// otherwise use the committed profile, or the indexed profile that +// SCRIPTC_NATIVE_PROFILE_USE names; an empty SCRIPTC_NATIVE_PROFILE_USE +// builds without one. +const profileGenerate = process.env["SCRIPTC_NATIVE_PROFILE_GENERATE"] || undefined; +const committedProfile = join(root, "packages/compiler/native/cli.profdata.gz"); +const requestedProfile = process.env["SCRIPTC_NATIVE_PROFILE_USE"]; +const useProfile = + profileGenerate === undefined && + optimization !== "dev" && + !sanitize && + requestedProfile !== "" && + (requestedProfile !== undefined || existsSync(committedProfile)); let target = nativeCodegenTarget(); if (target === null || target.platform === "wasi") throw new Error("a supported native host is required to build the compiler"); // Release executables use the runtime pack's libc baseline, even when the -// build host has a newer libc. Sanitizer builds use the host's sanitizer SDK. -if (target.name.endsWith("-gnu") && process.env["SCRIPTC_SAN"] !== "1") { +// build host has a newer libc. Sanitizer builds use the host's sanitizer SDK, +// and instrumented builds the host compiler driver's profile runtime. +if (target.name.endsWith("-gnu") && !sanitize && profileGenerate === undefined) { const architecture = target.architecture === "x64" ? "x86_64" : "aarch64"; process.env["SCRIPTC_TARGET"] = `${architecture}-linux-gnu.2.34`; target = nativeCodegenTarget()!; @@ -25,6 +43,14 @@ const bin = join(output, "bin"); const lib = join(output, "lib"); const seed = join(dirname(output), ".scriptc", basename(output) + "-seed"); for (const dir of [bin, lib, seed]) mkdirSync(dir, { recursive: true }); +let profileUse: string | undefined; +if (useProfile) { + profileUse = requestedProfile; + if (profileUse === undefined) { + profileUse = join(seed, "cli.profdata"); + writeFileSync(profileUse, gunzipSync(readFileSync(committedProfile))); + } +} const compiler = process.env["SCRIPTC_CC"] ?? target.defaultLinker; const compilerArgs = process.env["SCRIPTC_CC"] === undefined ? [...target.defaultLinkerArgs] : []; // Zig's C debug mode otherwise inserts UBSan calls into these objects. They @@ -84,10 +110,12 @@ const result = await compile(join(root, "packages/compiler/src/native/cli.ts"), outDir: seed, outPath: executable, backend: "llvm", - optimization: process.env["SCRIPTC_NATIVE_OPTIMIZATION"] === "dev" ? "dev" : "release", + optimization, strip: process.env["SCRIPTC_NATIVE_KEEP_SYMBOLS"] !== "1", ffiProfilePath: ffi, - sanitize: process.env["SCRIPTC_SAN"] === "1", + sanitize, + ...(profileGenerate === undefined ? {} : { profileGenerate }), + ...(profileUse === undefined ? {} : { profileUse }), emitIr: process.env["SCRIPTC_NATIVE_EMIT_IR"] === "1", }); if (!result.ok) diff --git a/scripts/refresh-cli-profile.mjs b/scripts/refresh-cli-profile.mjs new file mode 100644 index 000000000..e9554e911 --- /dev/null +++ b/scripts/refresh-cli-profile.mjs @@ -0,0 +1,205 @@ +#!/usr/bin/env node +/* Refreshes packages/compiler/native/cli.profdata.gz, the profile that release + * builds of the native compiler optimize with (scripts/build-native-cli.mts). + * + * Builds an instrumented native compiler for this Linux host, runs it on the + * training builds below, and merges the raw profiles it writes into one + * sparse indexed profile. The training builds are tsc-ts (a cold `speed` + * build, then a rebuild after an edit), every seventh corpus program at the + * default optimization and a further slice in `dev`, and the runtime + * benchmark workloads. Run it on a quiet Linux x64 host after changes that + * move much compiler code; a stale profile only loses part of its gain. A + * refresh takes about 11 minutes on 16 cores. + * + * node scripts/refresh-cli-profile.mjs --tsc-ts [--jobs 8] + */ +import { spawn, spawnSync } from "node:child_process"; +import { + appendFileSync, + existsSync, + mkdirSync, + mkdtempSync, + readFileSync, + readdirSync, + rmSync, + statSync, + writeFileSync, +} from "node:fs"; +import { cpus, tmpdir } from "node:os"; +import { join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { parseArgs } from "node:util"; +import { constants, gzipSync } from "node:zlib"; + +const root = fileURLToPath(new URL("..", import.meta.url)); +const { values } = parseArgs({ + options: { + "tsc-ts": { type: "string" }, + jobs: { type: "string", default: String(Math.max(1, Math.floor(cpus().length / 2))) }, + output: { type: "string", default: join(root, "packages/compiler/native/cli.profdata.gz") }, + work: { type: "string" }, + instrumented: { type: "string" }, + help: { type: "boolean", default: false }, + }, +}); +if (values.help || values["tsc-ts"] === undefined) { + console.log( + "Usage: node scripts/refresh-cli-profile.mjs --tsc-ts [--jobs N] [--output ] [--work ] [--instrumented ]", + ); + process.exit(values.help ? 0 : 2); +} +if (process.platform !== "linux" || process.arch !== "x64") + throw new Error("the compiler profile is collected on Linux x64"); +const tscTs = resolve(values["tsc-ts"]); +const tscTsPackage = join(tscTs, "packages/tsc-ts"); +if (!existsSync(join(tscTsPackage, "src/main.ts"))) + throw new Error(`${tscTs} is not a tsc-ts checkout with installed dependencies`); +const jobs = Number(values.jobs); +const work = resolve(values.work ?? mkdtempSync(join(tmpdir(), "scriptc-cli-profile-"))); +const raw = join(work, "raw"); +const builds = join(work, "builds"); +rmSync(raw, { recursive: true, force: true }); +for (const dir of [raw, builds]) mkdirSync(dir, { recursive: true }); +const log = join(work, "training.log"); + +// Every run merges its counters into one of four pooled raw profiles. +const profileFile = join(raw, "cli-%4m.profraw"); +// --instrumented reuses a compiler an earlier run built in /cli. +const cli = resolve(values.instrumented ?? join(work, "cli")); +if (values.instrumented === undefined) { + console.log(`building the instrumented compiler in ${cli}`); + const built = spawnSync( + process.execPath, + [ + "--max-old-space-size=8192", + "--import", + "tsx", + join(root, "scripts/build-native-cli.mts"), + cli, + ], + { + cwd: root, + stdio: "inherit", + env: { ...process.env, SCRIPTC_NATIVE_PROFILE_GENERATE: profileFile }, + }, + ); + if (built.status !== 0) throw new Error("the instrumented compiler did not build"); +} +const scriptc = join(cli, "bin/scriptc"); +// The compiler trains with the helper it bundles, so a helper override in +// the environment does not apply. +const trainingEnv = { ...process.env, LLVM_PROFILE_FILE: profileFile }; +delete trainingEnv["SCRIPTC_LLVM_HELPER"]; + +/** Runs the instrumented compiler; a failing build still profiles the + * paths it took. */ +function run(args, options) { + return new Promise((done) => { + const child = spawn(scriptc, args, { + cwd: options.cwd, + stdio: ["ignore", "pipe", "pipe"], + env: { ...trainingEnv, SCRIPTC_CACHE_DIR: options.cache }, + }); + let output = ""; + child.stdout.on("data", (chunk) => (output += chunk)); + child.stderr.on("data", (chunk) => (output += chunk)); + child.on("close", (code) => { + appendFileSync(log, `$ scriptc ${args.join(" ")}\n${output}exit ${code}\n`); + done(code === 0); + }); + }); +} + +async function pool(tasks) { + let next = 0; + let passed = 0; + await Promise.all( + Array.from({ length: jobs }, async () => { + while (next < tasks.length) if (await tasks[next++]()) passed++; + }), + ); + return passed; +} + +const programNumber = (name) => Number.parseInt(name, 10); +const corpus = readdirSync(join(root, "tests/corpus")) + .filter((name) => /^\d+-.*\.ts$/.test(name)) + .sort((a, b) => programNumber(a) - programNumber(b)); +const training = [ + ...corpus + .filter((name) => programNumber(name) % 7 === 0) + .map((name) => ({ file: join(root, "tests/corpus", name), optimization: "release" })), + ...corpus + .filter((name) => programNumber(name) % 14 === 7) + .map((name) => ({ file: join(root, "tests/corpus", name), optimization: "dev" })), + ...readdirSync(join(root, "benchmarks/runtime/workloads")) + .filter((name) => name.endsWith(".ts")) + .map((name) => ({ + file: join(root, "benchmarks/runtime/workloads", name), + optimization: "release", + })), +]; + +const started = Date.now(); +console.log("training: tsc-ts, cold and after an edit"); +const tscCache = join(work, "cache-tsc-ts"); +const tscArgs = [ + "build", + "src/main.ts", + "--optimization=speed", + "--detached-exit", + "-o", + join(builds, "tsc"), +]; +await run(tscArgs, { cwd: tscTsPackage, cache: tscCache }); +const edited = join(tscTsPackage, "src/main.ts"); +const source = readFileSync(edited, "utf8"); +try { + writeFileSync(edited, source + "\n// profile training edit\n"); + await run(tscArgs, { cwd: tscTsPackage, cache: tscCache }); +} finally { + writeFileSync(edited, source); +} + +console.log(`training: ${training.length} programs, ${jobs} at a time`); +const passed = await pool( + training.map((program, index) => () => { + const cache = join(work, `cache-${index}`); + return run( + [ + "build", + program.file, + `--optimization=${program.optimization}`, + "-o", + join(builds, `program-${index}`), + ], + { cwd: root, cache }, + ).then((ok) => { + rmSync(cache, { recursive: true, force: true }); + rmSync(join(builds, `program-${index}`), { force: true }); + return ok; + }); + }), +); +console.log( + `trained in ${Math.round((Date.now() - started) / 1000)} s; ${passed} of ${training.length} programs built (failures still profile; see ${log})`, +); + +const profiles = readdirSync(raw) + .filter((name) => name.endsWith(".profraw")) + .map((name) => join(raw, name)); +rmSync(builds, { recursive: true, force: true }); +const indexed = join(work, "cli.profdata"); +const merged = spawnSync(scriptc, ["merge-profiles", "--sparse", "-o", indexed, ...profiles], { + stdio: "inherit", + env: { ...trainingEnv, LLVM_PROFILE_FILE: join(work, "merge.profraw") }, +}); +if (merged.status !== 0) throw new Error("merge-profiles failed"); +// The indexed profile compresses to about an eighth of its size. +const output = resolve(values.output); +writeFileSync(output, gzipSync(readFileSync(indexed), { level: constants.Z_BEST_COMPRESSION })); +console.log( + `wrote ${output} (${statSync(output).size} bytes; ${statSync(indexed).size} uncompressed)`, +); +// A work directory the caller named stays for inspection. +if (values.work === undefined) rmSync(work, { recursive: true, force: true }); From 692569a8040dfc357dc769c6587388c2e78444f9 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 15:50:32 -0500 Subject: [PATCH 25/67] Collect the compiler's heap as lowering and LLVM emission grow it --- packages/cli/src/main.ts | 4 ++ .../compiler/src/backend/llvm/emit-module.ts | 2 + packages/compiler/src/backend/llvm/emitter.ts | 3 + packages/compiler/src/frontend-process.ts | 7 +- .../compiler/src/frontend/lowering/lowerer.ts | 4 ++ packages/compiler/src/heap-collection.test.ts | 64 +++++++++++++++++++ packages/compiler/src/heap-collection.ts | 49 ++++++++++++++ packages/compiler/src/heap-pressure.ts | 13 ++++ packages/compiler/src/index.ts | 1 + 9 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 packages/compiler/src/heap-collection.test.ts create mode 100644 packages/compiler/src/heap-collection.ts create mode 100644 packages/compiler/src/heap-pressure.ts diff --git a/packages/cli/src/main.ts b/packages/cli/src/main.ts index 99d0f78e3..8203b959e 100644 --- a/packages/cli/src/main.ts +++ b/packages/cli/src/main.ts @@ -4,6 +4,7 @@ import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import { analyzeCached, + collectGarbageUnderHeapPressure, compile, compileLibrary, mergeProfiles, @@ -26,6 +27,9 @@ function version(): string { return manifest.version ?? "unknown"; } +// The compiler process collects its heap as lowering and LLVM emission grow it. +collectGarbageUnderHeapPressure(); + process.exitCode = await runCli(process.argv.slice(2), { version, analyze: analyzeCached, diff --git a/packages/compiler/src/backend/llvm/emit-module.ts b/packages/compiler/src/backend/llvm/emit-module.ts index 17b27fe8d..5ccf7ccd8 100644 --- a/packages/compiler/src/backend/llvm/emit-module.ts +++ b/packages/compiler/src/backend/llvm/emit-module.ts @@ -1,4 +1,5 @@ /* LlEmitter's module-level output: module parts, helper definitions, library declarations and FFI callback definitions. */ +import { relieveHeapPressure } from "../../heap-pressure.js"; import { emitWasmModules } from "./wasm-modules.js"; import { type LlEmitter, ffiCallbackDummyLl, llStrBytes } from "./emitter.js"; import { JS_IC_WORDS } from "./js-ic.js"; @@ -66,6 +67,7 @@ export function emitModuleParts(emitter: LlEmitter): string[] { const def = emitter.emitFunction(fn); fnDefs.push(def); emitter.fnDefText.set(fn.name, def); + relieveHeapPressure(); } emitter.selectStacklessAsync(fnDefs); const errorViews: string[] = []; diff --git a/packages/compiler/src/backend/llvm/emitter.ts b/packages/compiler/src/backend/llvm/emitter.ts index 05e297304..1dcd1f6c8 100644 --- a/packages/compiler/src/backend/llvm/emitter.ts +++ b/packages/compiler/src/backend/llvm/emitter.ts @@ -1,3 +1,4 @@ +import { relieveHeapPressure } from "../../heap-pressure.js"; import { wasmBoundsChecks } from "./wasm-modules.js"; import { jsTruthy } from "./jsval.js"; import { JsIcSites } from "../../ir/js-ic.js"; @@ -458,6 +459,8 @@ export function emitLlvmModuleSource( input: IrModule, options: LlvmTargetOptions = {}, ): string | readonly string[] { + // IR validation, contracts and the frontend's disposal run after lowering without checks. + relieveHeapPressure(true); const mod = unshareNodes(input); const parts = new LlEmitter( options.debugSources === undefined diff --git a/packages/compiler/src/frontend-process.ts b/packages/compiler/src/frontend-process.ts index a3d59516f..dc2388038 100644 --- a/packages/compiler/src/frontend-process.ts +++ b/packages/compiler/src/frontend-process.ts @@ -8,11 +8,14 @@ try { } catch { // Bytecode caching only speeds up loading. } -const { runFrontendProcess } = await import("./index.js"); +const { collectGarbageUnderHeapPressure, runFrontendProcess } = await import("./index.js"); let input = ""; for await (const chunk of process.stdin) input += String(chunk); const [requestPath, resultPath] = input.split("\n"); -if (requestPath !== undefined && requestPath !== "" && resultPath !== undefined) +if (requestPath !== undefined && requestPath !== "" && resultPath !== undefined) { + // As in the CLI process, lowering and LLVM emission collect the heap as they grow it. + collectGarbageUnderHeapPressure(); await runFrontendProcess(requestPath, resultPath); +} // The frontend's own helpers (the checker process, timers) must not keep this process alive. process.exit(0); diff --git a/packages/compiler/src/frontend/lowering/lowerer.ts b/packages/compiler/src/frontend/lowering/lowerer.ts index a6278a2a3..c4d24cef1 100644 --- a/packages/compiler/src/frontend/lowering/lowerer.ts +++ b/packages/compiler/src/frontend/lowering/lowerer.ts @@ -1,3 +1,4 @@ +import { relieveHeapPressure } from "../../heap-pressure.js"; import { onlyForwarded } from "./typed-arguments.js"; import { needsGeneralNodeStreams, @@ -7789,6 +7790,7 @@ export class Lowerer { this.shapes.withDeclaredOrderPriority(ref, () => this.lowerClassMembers(info)), ), ); + relieveHeapPressure(); } } while (instLowered < this.instantiationQueue.length) { @@ -7816,6 +7818,7 @@ export class Lowerer { ), ), ); + relieveHeapPressure(); } catch (e) { if (!(e instanceof PoisonError)) throw e; } @@ -7892,6 +7895,7 @@ export class Lowerer { this.shapes.withDeclaredOrderPriority(priority, unit.lower), ); if (fn) loweredUnits.set(name, fn); + relieveHeapPressure(); } catch (e) { if (!(e instanceof PoisonError)) throw e; } diff --git a/packages/compiler/src/heap-collection.test.ts b/packages/compiler/src/heap-collection.test.ts new file mode 100644 index 000000000..39baaf147 --- /dev/null +++ b/packages/compiler/src/heap-collection.test.ts @@ -0,0 +1,64 @@ +import { expect, test } from "vitest"; +import { heapPressureCheck } from "./heap-collection.js"; + +const MB = 1024 * 1024; + +/** A heap whose used size the test sets; a collection leaves `live` bytes. */ +function fakeHeap(initial: number) { + const heap = { used: initial, live: initial, collections: 0, reads: 0 }; + const check = heapPressureCheck( + () => { + heap.reads++; + return heap.used; + }, + () => { + heap.collections++; + heap.used = heap.live; + }, + ); + return { heap, check }; +} + +test("the check reads the heap every 64th call and at phase ends", () => { + const { heap, check } = fakeHeap(100 * MB); + heap.reads = 0; + for (let i = 0; i < 63; i++) check(false); + expect(heap.reads).toBe(0); + check(false); + expect(heap.reads).toBe(1); + check(true); + expect(heap.reads).toBe(2); +}); + +test("the check collects once the heap doubles and grows by 512 MB", () => { + const { heap, check } = fakeHeap(100 * MB); + // Five times the size, but only 400 MB more: no collection. + heap.used = 500 * MB; + check(true); + expect(heap.collections).toBe(0); + heap.used = 612 * MB; + check(true); + expect(heap.collections).toBe(1); + // The size after the collection is the new baseline: 400 MB live needs 912 MB. + heap.live = 400 * MB; + heap.used = 1000 * MB; + check(true); + expect(heap.collections).toBe(2); + heap.used = 900 * MB; + check(true); + expect(heap.collections).toBe(2); + heap.used = 912 * MB; + check(true); + expect(heap.collections).toBe(3); + // From 1 GB live, doubling is the larger bound. + heap.live = 1024 * MB; + heap.used = 2000 * MB; + check(true); + expect(heap.collections).toBe(4); + heap.used = 2047 * MB; + check(true); + expect(heap.collections).toBe(4); + heap.used = 2048 * MB; + check(true); + expect(heap.collections).toBe(5); +}); diff --git a/packages/compiler/src/heap-collection.ts b/packages/compiler/src/heap-collection.ts new file mode 100644 index 000000000..f7ef34e4e --- /dev/null +++ b/packages/compiler/src/heap-collection.ts @@ -0,0 +1,49 @@ +import { getHeapStatistics, setFlagsFromString } from "node:v8"; +import { runInNewContext } from "node:vm"; +import { setHeapPressureCheck } from "./heap-pressure.js"; + +/** Calls of the check between two reads of the heap size, outside phase ends. */ +const SAMPLE_INTERVAL = 64; +/** The heap grows by at least this much before a collection. */ +const MIN_GROWTH_BYTES = 512 * 1024 * 1024; + +/** + * The check `collectGarbageUnderHeapPressure` installs: every 64th call, and at every phase end, + * reads the used heap size and runs `collect` once it is at least twice the size after the + * previous collection and 512 MB above it. + */ +export function heapPressureCheck( + usedHeap: () => number, + collect: () => void, +): (phase: boolean) => void { + let live = usedHeap(); + let calls = 0; + return (phase) => { + if (!phase && ++calls % SAMPLE_INTERVAL !== 0) return; + const used = usedHeap(); + if (used < Math.max(2 * live, live + MIN_GROWTH_BYTES)) return; + collect(); + live = usedHeap(); + }; +} + +/** + * Runs a full garbage collection from the compiler's allocation-heavy loops + * (`relieveHeapPressure`) as `heapPressureCheck` decides. Without it, V8 lets the heap of a long + * lowering or LLVM emission grow to several times its live size between full collections, and + * Node keeps those pages for the life of the process. + * + * This sets --expose-gc for the process, so only the compiler's own processes call it (the CLI and + * the frontend process, frontend-process.ts), not `compile()` callers. + */ +export function collectGarbageUnderHeapPressure(): void { + setFlagsFromString("--expose-gc"); + const gc: unknown = runInNewContext("gc"); + if (typeof gc !== "function") return; + setHeapPressureCheck( + heapPressureCheck( + () => getHeapStatistics().used_heap_size, + () => (gc as () => void)(), + ), + ); +} diff --git a/packages/compiler/src/heap-pressure.ts b/packages/compiler/src/heap-pressure.ts new file mode 100644 index 000000000..fa8b35b43 --- /dev/null +++ b/packages/compiler/src/heap-pressure.ts @@ -0,0 +1,13 @@ +/** Allocation-heavy loops (lowering reached bodies and generic instances, emitting LLVM + * functions) call `relieveHeapPressure` between units of work. It does nothing unless the process + * installed a check with `setHeapPressureCheck` (collectGarbageUnderHeapPressure in + * heap-collection.ts). `phase` is true where a phase that allocates without these calls ends. */ +let check: (phase: boolean) => void = () => {}; + +export function relieveHeapPressure(phase = false): void { + check(phase); +} + +export function setHeapPressureCheck(next: (phase: boolean) => void): void { + check = next; +} diff --git a/packages/compiler/src/index.ts b/packages/compiler/src/index.ts index 8b0ea6825..a1f8601cc 100644 --- a/packages/compiler/src/index.ts +++ b/packages/compiler/src/index.ts @@ -180,6 +180,7 @@ export { } from "./backend/external-c.js"; export { warmNativeCaches } from "./backend/warm-cache.js"; export { mergeNativeProfiles as mergeProfiles } from "./backend/native-codegen.js"; +export { collectGarbageUnderHeapPressure } from "./heap-collection.js"; export { ANDROID_MIN_API, IPHONEOS_MIN_VERSION, From 47671d5bedcd89897fc73ecf92fddda9dce86ee9 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 15:54:23 -0500 Subject: [PATCH 26/67] Give the fs corpus programs per-process scratch directories 5568-fs-cp-errors built its fixture in a /tmp directory named after the program file, which it deletes and recreates. The Node oracle and the native runs of one program run at the same time, so two runs with the same name deleted each other's files and the program exited 1 on random shards. Its root, and that of the five other corpus programs that name a /tmp/scr-* directory after the program file alone, now ends in the process id, as 5571-fs-cp-deep's does. --- tests/corpus/1541-fs-readdir-dirent.ts | 2 +- tests/corpus/5565-fs-dirent-untyped.mjs | 2 +- tests/corpus/5567-fs-cpsync.ts | 2 +- tests/corpus/5568-fs-cp-errors.js | 2 +- tests/corpus/5569-fs-cp-symlinks.ts | 2 +- tests/corpus/5570-fs-cp-async.ts | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/corpus/1541-fs-readdir-dirent.ts b/tests/corpus/1541-fs-readdir-dirent.ts index ac30ab615..8db6243b2 100644 --- a/tests/corpus/1541-fs-readdir-dirent.ts +++ b/tests/corpus/1541-fs-readdir-dirent.ts @@ -15,7 +15,7 @@ function tail(path: string): string { } return path.slice(i + 1); } -const dir = `/tmp/scr-dirent-${tail(process.argv[1] === undefined ? "x" : process.argv[1])}`; +const dir = `/tmp/scr-dirent-${tail(process.argv[1] === undefined ? "x" : process.argv[1])}-${process.pid}`; if (fs.existsSync(dir)) fs.rmSync(dir, { recursive: true, force: true }); fs.mkdirSync(dir); fs.mkdirSync(`${dir}/sub-a`); diff --git a/tests/corpus/5565-fs-dirent-untyped.mjs b/tests/corpus/5565-fs-dirent-untyped.mjs index acb5be704..9751c3d1f 100644 --- a/tests/corpus/5565-fs-dirent-untyped.mjs +++ b/tests/corpus/5565-fs-dirent-untyped.mjs @@ -9,7 +9,7 @@ function tail(path) { while (i >= 0 && path.charAt(i) !== "/" && path.charAt(i) !== "\\") i = i - 1; return path.slice(i + 1); } -const dir = `/tmp/scr-dirent-untyped-${tail(process.argv[1] === undefined ? "x" : process.argv[1])}`; +const dir = `/tmp/scr-dirent-untyped-${tail(process.argv[1] === undefined ? "x" : process.argv[1])}-${process.pid}`; if (fs.existsSync(dir)) fs.rmSync(dir, { recursive: true, force: true }); fs.mkdirSync(`${dir}/sub`, { recursive: true }); fs.writeFileSync(`${dir}/a.txt`, "x"); diff --git a/tests/corpus/5567-fs-cpsync.ts b/tests/corpus/5567-fs-cpsync.ts index 7e258ca85..ef736ec92 100644 --- a/tests/corpus/5567-fs-cpsync.ts +++ b/tests/corpus/5567-fs-cpsync.ts @@ -8,7 +8,7 @@ function tail(path: string): string { while (i >= 0 && path.charAt(i) !== "/" && path.charAt(i) !== "\\") i = i - 1; return path.slice(i + 1); } -const root = `/tmp/scr-cpsync-${tail(process.argv[1] === undefined ? "x" : process.argv[1])}`; +const root = `/tmp/scr-cpsync-${tail(process.argv[1] === undefined ? "x" : process.argv[1])}-${process.pid}`; if (fs.existsSync(root)) fs.rmSync(root, { recursive: true, force: true }); fs.mkdirSync(root); const home = process.cwd(); diff --git a/tests/corpus/5568-fs-cp-errors.js b/tests/corpus/5568-fs-cp-errors.js index e9a87f14e..9089d612c 100644 --- a/tests/corpus/5568-fs-cp-errors.js +++ b/tests/corpus/5568-fs-cp-errors.js @@ -11,7 +11,7 @@ function tail(path) { while (i >= 0 && path.charAt(i) !== "/" && path.charAt(i) !== "\\") i = i - 1; return path.slice(i + 1); } -const root = `/tmp/scr-cp-errors-${tail(process.argv[1] === undefined ? "x" : process.argv[1])}`; +const root = `/tmp/scr-cp-errors-${tail(process.argv[1] === undefined ? "x" : process.argv[1])}-${process.pid}`; if (fs.existsSync(root)) fs.rmSync(root, { recursive: true, force: true }); fs.mkdirSync(root); const home = process.cwd(); diff --git a/tests/corpus/5569-fs-cp-symlinks.ts b/tests/corpus/5569-fs-cp-symlinks.ts index ae4621ce6..2bc3c8ba4 100644 --- a/tests/corpus/5569-fs-cp-symlinks.ts +++ b/tests/corpus/5569-fs-cp-symlinks.ts @@ -9,7 +9,7 @@ function tail(path: string): string { while (i >= 0 && path.charAt(i) !== "/" && path.charAt(i) !== "\\") i = i - 1; return path.slice(i + 1); } -const root = `/tmp/scr-cp-links-${tail(process.argv[1] === undefined ? "x" : process.argv[1])}`; +const root = `/tmp/scr-cp-links-${tail(process.argv[1] === undefined ? "x" : process.argv[1])}-${process.pid}`; if (fs.existsSync(root)) fs.rmSync(root, { recursive: true, force: true }); fs.mkdirSync(root); const home = process.cwd(); diff --git a/tests/corpus/5570-fs-cp-async.ts b/tests/corpus/5570-fs-cp-async.ts index 9f3ce6c87..d83750095 100644 --- a/tests/corpus/5570-fs-cp-async.ts +++ b/tests/corpus/5570-fs-cp-async.ts @@ -9,7 +9,7 @@ function tail(path: string): string { while (i >= 0 && path.charAt(i) !== "/" && path.charAt(i) !== "\\") i = i - 1; return path.slice(i + 1); } -const root = `/tmp/scr-cp-async-${tail(process.argv[1] === undefined ? "x" : process.argv[1])}`; +const root = `/tmp/scr-cp-async-${tail(process.argv[1] === undefined ? "x" : process.argv[1])}-${process.pid}`; if (fs.existsSync(root)) fs.rmSync(root, { recursive: true, force: true }); fs.mkdirSync(root); const home = process.cwd(); From ea4d570e597f9a317eb9146901c8d681f3fe291d Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 16:12:52 -0500 Subject: [PATCH 27/67] Speed up split, indexOf, slice and Number() on ASCII fields Number() of a string with an optional sign and 1 to 15 digits returns the integer directly; every other string keeps the full StringToNumber grammar, out of line. split() with a separator collects its first batch of pieces before creating the result, so the result is an inline array of exactly that size, filled in place. A split's default limit skips the uint32 conversion, and pieces of a proven-ASCII string are created ASCII, including the scratch pieces of split loops. indexOf() from the start of a proven-ASCII string searches bytes directly, and slice() of one skips the UTF-16 index map. The one-byte case of the byte search reaches memchr without a stack frame. --- packages/runtime/src/scr_string.c | 107 +++++++++++++++--- tests/corpus/6950-string-field-fast-paths.ts | 48 ++++++++ .../6950-string-field-fast-paths.ts.json | 1 + 3 files changed, 138 insertions(+), 18 deletions(-) create mode 100644 tests/corpus/6950-string-field-fast-paths.ts create mode 100644 tests/harness/corpus-costs/6950-string-field-fast-paths.ts.json diff --git a/packages/runtime/src/scr_string.c b/packages/runtime/src/scr_string.c index 41588f25a..9b21dd722 100644 --- a/packages/runtime/src/scr_string.c +++ b/packages/runtime/src/scr_string.c @@ -1769,14 +1769,9 @@ static inline double scr_to_integer_or_infinity(double x) { return isnan(x) ? 0.0 : x; } -/* Byte substring search (needle and hay are both canonical WTF-8, - * so any byte-level match starts on a char boundary — UTF-8 is - * self-synchronizing). Empty needle matches at hay. */ -static const char *scr_byte_find(const char *hay, size_t hay_len, - const char *nee, size_t nee_len) { - if (nee_len == 0) return hay; - if (nee_len > hay_len) return NULL; - if (nee_len == 1) return memchr(hay, (unsigned char)nee[0], hay_len); +/* scr_byte_find for a needle of at least two bytes, no longer than hay. */ +static __attribute__((noinline)) const char *scr_byte_find_long(const char *hay, size_t hay_len, + const char *nee, size_t nee_len) { const unsigned char first = (unsigned char)nee[0]; const unsigned char second = (unsigned char)nee[1]; /* The last possible match start. */ @@ -1826,6 +1821,18 @@ static const char *scr_byte_find(const char *hay, size_t hay_len, return NULL; } +/* Byte substring search (needle and hay are both canonical WTF-8, + * so any byte-level match starts on a char boundary — UTF-8 is + * self-synchronizing). Empty needle matches at hay. The one-byte case, + * every split on a separator character, goes to memchr without a frame. */ +static inline const char *scr_byte_find(const char *hay, size_t hay_len, + const char *nee, size_t nee_len) { + if (nee_len == 0) return hay; + if (nee_len > hay_len) return NULL; + if (nee_len == 1) return memchr(hay, (unsigned char)nee[0], hay_len); + return scr_byte_find_long(hay, hay_len, nee, nee_len); +} + /* ── searches for a needle that can match half of a surrogate pair ───── * Canonical storage makes byte matches exact for every needle except one * that starts with a lone low surrogate or ends with a lone high one: JS @@ -2020,6 +2027,13 @@ double scr_str_char_code_at(ScrStr *s, double i) { } double scr_str_index_of(ScrStr *s, ScrStr *needle, double fromIndex) { + /* A search from the start of a proven-ASCII receiver: byte offsets are + * UTF-16 indexes, and a needle with other bytes is never found. A start + * index that is not positive (NaN, -0 or negative) clamps to 0. */ + if (s->ascii && !(fromIndex > 0)) { + const char *found = scr_byte_find(s->data, s->len, needle->data, needle->len); + return found ? (double)(found - s->data) : -1.0; + } double pos = scr_to_integer_or_infinity(fromIndex); if (needle->len > s->len) return -1.0; ScrSidx *e = scr_sidx_for(s); @@ -2142,6 +2156,12 @@ static size_t scr_slice_boundary(double v, size_t len16) { } ScrStr *scr_str_slice(ScrStr *s, double start, double end) { + /* A proven-ASCII receiver needs no index map (scr_str_slice_units). */ + if (s->ascii) { + size_t from = scr_slice_boundary(scr_to_integer_or_infinity(start), s->len); + size_t to = scr_slice_boundary(scr_to_integer_or_infinity(end), s->len); + return scr_str_slice_units(s, NULL, from, to); + } ScrSidx *e = scr_sidx_for(s); size_t len16 = scr_sidx_len(s, e); size_t from = scr_slice_boundary(scr_to_integer_or_infinity(start), len16); @@ -2407,8 +2427,10 @@ void scr_str_split_cursor_init(ScrSplitCursor *cursor, uint32_t limit) { cursor->pending_unit = 0; } -static ScrStr *scr_str_split_piece(const char *bytes, size_t len, ScrStr **scratch) { - if (!scratch || len <= 4) return scr_str_from_span(bytes, len); +/* `ascii`: the bytes are a span of a proven-ASCII string. */ +static ScrStr *scr_str_split_piece(const char *bytes, size_t len, ScrStr **scratch, bool ascii) { + if (!scratch || len <= 4) return ascii ? scr_str_from_span_ascii(bytes, len) + : scr_str_from_span(bytes, len); ScrStr *piece = *scratch; if (piece && piece->rc == 1 && piece->cap >= len) { /* The scratch owner is the only remaining reference. Invalidate all @@ -2419,10 +2441,12 @@ static ScrStr *scr_str_split_piece(const char *bytes, size_t len, ScrStr **scrat memcpy(piece->data, bytes, len); piece->len = len; piece->data[len] = '\0'; + piece->ascii = ascii; } else { ScrStr *fresh = scr_str_alloc_raw(len, len < 64 ? 64 : len); memcpy(fresh->data, bytes, len); fresh->data[len] = '\0'; + fresh->ascii = ascii; *scratch = fresh; scr_str_release(piece); piece = fresh; @@ -2480,7 +2504,7 @@ const char *scr_str_split_cursor_span(ScrStr *s, ScrStr *sep, ScrSplitCursor *cu } ScrStr *scr_str_split_materialize(const char *bytes, size_t length, ScrStr **scratch) { - return scr_str_split_piece(bytes, length, scratch); + return scr_str_split_piece(bytes, length, scratch, false); } ScrStr *scr_str_split_cursor_next(ScrStr *s, ScrStr *sep, ScrSplitCursor *cursor, @@ -2488,7 +2512,7 @@ ScrStr *scr_str_split_cursor_next(ScrStr *s, ScrStr *sep, ScrSplitCursor *cursor size_t len; const char *bytes = scr_str_split_span(s, sep, cursor, sep->len == 0, &len); if (!bytes) return NULL; - return scr_str_split_piece(bytes, len, scratch); + return scr_str_split_piece(bytes, len, scratch, s->ascii); } /* Move a bounded batch of pieces into array storage in one operation. @@ -2513,7 +2537,8 @@ static void scr_str_split_fill(ScrArr *out, ScrStr *s, ScrStr *sep, size_t count = 0, len; const char *bytes; while (count < 64 && (bytes = scr_str_split_span(s, sep, cursor, units, &len))) { - ScrStr *piece = scr_str_from_span(bytes, len); + ScrStr *piece = + s->ascii ? scr_str_from_span_ascii(bytes, len) : scr_str_from_span(bytes, len); slots[count++] = (uint64_t)(uintptr_t)piece; } if (count) scr_arr_push_many(out, count, slots); @@ -2522,18 +2547,43 @@ static void scr_str_split_fill(ScrArr *out, ScrStr *s, ScrStr *sep, } ScrArr *scr_str_split_limit(ScrStr *s, ScrStr *sep, double limit_num) { - uint32_t limit = scr_to_uint32(limit_num); + /* split(sep) passes the default limit, 2^32 - 1. */ + uint32_t limit = limit_num == 4294967295.0 ? UINT32_MAX : scr_to_uint32(limit_num); /* An empty separator yields one piece per UTF-16 unit: size it once. */ size_t pieces = 0; if (sep->len == 0) { pieces = s->ascii ? s->len : scr_sidx_len(s, scr_sidx(s)); if (pieces > limit) pieces = limit; } - ScrArr *out = scr_arr_new(SCR_ELEM_STR, pieces); ScrSplitCursor cursor; scr_str_split_cursor_init(&cursor, limit); - if (sep->len == 0) scr_str_split_fill(out, s, sep, &cursor, true); - else scr_str_split_fill(out, s, sep, &cursor, false); + if (sep->len == 0) { + ScrArr *out = scr_arr_new(SCR_ELEM_STR, pieces); + scr_str_split_fill(out, s, sep, &cursor, true); + return out; + } + /* Most splits fit one batch: its count sizes the result, whose slots then + * share the header's block (scr_arr_new_inline). A longer split appends + * the rest batch by batch. */ + uint64_t slots[64]; + size_t count = 0, len; + const char *bytes; + while (count < 64 && (bytes = scr_str_split_span(s, sep, &cursor, false, &len))) + slots[count++] = (uint64_t)(uintptr_t)(s->ascii ? scr_str_from_span_ascii(bytes, len) + : scr_str_from_span(bytes, len)); + ScrArr *out = scr_arr_new_inline(SCR_ELEM_STR, count); + if (count) { + /* A fresh inline array of exactly `count` slots: store the pieces and + * their states directly. */ + uint8_t *states = scr_arr_states_end(out); + for (size_t k = 0; k < count; k++) { + out->data[k] = slots[k]; + *scr_arr_state_in(states, k) = SCR_ARR_VALUE; + } + out->len = (uint32_t)count; + out->filled = (uint32_t)count; + } + if (count == 64) scr_str_split_fill(out, s, sep, &cursor, false); return out; } @@ -3104,7 +3154,7 @@ double scr_string_to_number(ScrStr *s) { return scr_bytes_to_number(s->data, s->len); } -double scr_bytes_to_number(const char *p, size_t len) { +static __attribute__((noinline)) double scr_bytes_to_number_any(const char *p, size_t len) { size_t b = 0, e = len; while (b < e) { unsigned char c = (unsigned char)p[b]; @@ -3164,6 +3214,27 @@ double scr_bytes_to_number(const char *p, size_t len) { return r; } +/* An optional sign and 1 to 15 decimal digits, the common shape of a + * parsed field, is an exact integer below 2^53 with no whitespace to trim + * and no other grammar to apply ("-0" is -0, leading zeros are decimal). + * Everything else takes the full grammar. */ +double scr_bytes_to_number(const char *p, size_t len) { + if (len - 1 < 16) { + size_t i = p[0] == '-' || p[0] == '+'; + if (i < len && len - i <= 15) { + int64_t m = 0; + size_t k = i; + for (; k < len; k++) { + unsigned d = (unsigned)(unsigned char)p[k] - '0'; + if (d > 9) break; + m = m * 10 + d; + } + if (k == len) return p[0] == '-' ? -(double)m : (double)m; + } + } + return scr_bytes_to_number_any(p, len); +} + ScrStr *scr_f64_to_scrstr(double x) { if (x >= 0 && x < 100) { /* -0 prints "0" as well */ unsigned v = (unsigned)x; diff --git a/tests/corpus/6950-string-field-fast-paths.ts b/tests/corpus/6950-string-field-fast-paths.ts new file mode 100644 index 000000000..4e9d52b38 --- /dev/null +++ b/tests/corpus/6950-string-field-fast-paths.ts @@ -0,0 +1,48 @@ +// Field parsing on ASCII text: Number() on digit strings (signs, zeros, +// 15 and 16 digits, whitespace and other grammar), indexOf from the start +// and from other positions, slice bounds, and split results of every +// size, including more pieces than one batch and results that grow. +const numbers = [ + "0", "-0", "+0", "7", "-7", "+42", "007", "-007", "123456789012345", "-123456789012345", + "1234567890123456", "9007199254740993", "-", "+", "", " 12", "12 ", "\t3\n", "1e3", + "1.5", "0x1f", "-0x1f", "12px", "1_000", "Infinity", "-Infinity", "+-1", "--1", +]; +for (const text of numbers) { + const value = Number(text); + console.log(JSON.stringify(text), value, Object.is(value, -0)); +} + +const line = "/route/17?request=123 200 45 3200"; +console.log(line.indexOf("?"), line.indexOf(" "), line.indexOf("x"), line.indexOf("")); +console.log(line.indexOf("?", -5), line.indexOf("?", NaN), line.indexOf("?", 10), line.indexOf(" ", 30)); +console.log(line.indexOf("", 100), line.indexOf("", -1), "".indexOf(""), "".indexOf("a")); +console.log(line.indexOf("é"), "aé?".indexOf("?"), "aé?".indexOf("é")); +console.log(line.slice(0, line.indexOf("?")), line.slice(-4), line.slice(5, 2), line.slice(-100, 3)); +console.log(line.slice(NaN, Infinity) === line, line.slice(2, -2), "héllo".slice(1, 3)); + +const fields = line.split(" "); +console.log(fields.length, fields.join("|")); +fields.push("extra"); +fields[0] = fields[0]!.slice(0, 6); +console.log(fields.length, fields.join("|")); + +const many = Array.from({ length: 150 }, (_, i) => String(i * 7)).join(","); +const pieces = many.split(","); +console.log(pieces.length, pieces[0], pieces[63], pieces[64], pieces[149]); +let sum = 0; +for (const piece of pieces) sum += Number(piece); +console.log(sum); +console.log("a,b,,c,".split(","), ",".split(","), "".split(","), "abc".split(",", 0)); +console.log("a b c d".split(" ", 2), "x--y--z".split("--"), "héllo wörld".split(" ")); + +const rows = "/a?x=1 200 5 10\n/b 404 7 20\n/a?y=2 500 9 30\n"; +const totals = new Map(); +for (const row of rows.split("\n")) { + const parts = row.split(" "); + if (parts.length !== 4) continue; + const raw = parts[0]!; + const query = raw.indexOf("?"); + const route = query < 0 ? raw : raw.slice(0, query); + totals.set(route, (totals.get(route) ?? 0) + Number(parts[1]) + Number(parts[3])); +} +console.log([...totals.entries()].map(([route, total]) => route + "=" + total).join(";")); diff --git a/tests/harness/corpus-costs/6950-string-field-fast-paths.ts.json b/tests/harness/corpus-costs/6950-string-field-fast-paths.ts.json new file mode 100644 index 000000000..62a6540b9 --- /dev/null +++ b/tests/harness/corpus-costs/6950-string-field-fast-paths.ts.json @@ -0,0 +1 @@ +{ "plain": 3899, "san": 5479 } From bbb37ae03ba82335a66da0b848ec2ff4682f3473 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 16:34:37 -0500 Subject: [PATCH 28/67] Read a spread's elements before an earlier argument converts When the Math functions evaluate their arguments into temporaries before converting (an earlier argument whose ToNumber can run valueOf), a spread argument's array is now copied where it is evaluated. Before, the temporary held the array itself and its elements were read after the conversions, so a valueOf that changed the array changed the values passed, while JavaScript reads a spread's elements during argument evaluation. --- .../src/frontend/lowering/lower-exprs.ts | 30 +++++++++++++++---- tests/corpus/6906-tonumber-arguments.mjs | 20 +++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/packages/compiler/src/frontend/lowering/lower-exprs.ts b/packages/compiler/src/frontend/lowering/lower-exprs.ts index 23892d43e..e7a1b79a8 100644 --- a/packages/compiler/src/frontend/lowering/lower-exprs.ts +++ b/packages/compiler/src/frontend/lowering/lower-exprs.ts @@ -1429,9 +1429,12 @@ export function lowerToNumberArgument(lowerer: Lowerer, node: ts.Expression): Ir * any. When an argument's conversion can run program code (valueOf or * toString on a dynamic value) and a later argument follows, the arguments * evaluate into temporaries first and convert in order after. `lowerOther` - * lowers an argument that takes no conversion (a spread), or returns null - * for a ToNumber argument. Returns the temporaries' statements (empty when - * none are needed) and the converted values. */ + * lowers an argument that takes no conversion (a spread's array), or returns + * null for a ToNumber argument; with temporaries, such an array is copied + * where it is evaluated, since JavaScript reads a spread's elements then, + * before a later conversion's valueOf could change them. Returns the + * temporaries' statements (empty when none are needed) and the converted + * values. */ export function lowerToNumberArguments( lowerer: Lowerer, nodes: readonly ts.Expression[], @@ -1439,7 +1442,9 @@ export function lowerToNumberArguments( ): { stmts: IrStmt[]; values: IrExpr[] } { const operands = nodes.map((node): NumberOperand => { const other = lowerOther?.(node); - return other ? { value: other, convert: null, runsCode: false } : numberOperand(lowerer, node); + return other + ? { value: other, convert: null, runsCode: false, spread: true } + : numberOperand(lowerer, node); }); const late = operands.slice(0, -1).some((operand) => operand.runsCode); if (!late) { @@ -1451,7 +1456,18 @@ export function lowerToNumberArguments( if (operand.value.kind === "numLit") return operand.value; const temp = lowerer.declareHiddenLocal("%numberArgument", operand.value.type); const loc = operand.value.loc; - stmts.push({ kind: "varDecl", localId: temp.id, init: operand.value, loc }); + const init: IrExpr = + operand.spread && operand.value.type.kind === "array" + ? { + kind: "arrIntrinsic", + method: "slice", + receiver: operand.value, + args: [numLit(0, loc), numLit(Infinity, loc)], + type: operand.value.type, + loc, + } + : operand.value; + stmts.push({ kind: "varDecl", localId: temp.id, init, loc }); const read = varRef(temp.id, operand.value.type, loc); return operand.convert ? operand.convert(read) : read; }); @@ -1460,11 +1476,13 @@ export function lowerToNumberArguments( /** An argument a ToNumber site lowers: its evaluated value and the * conversion that makes it a number (null when the value already is one). - * `runsCode`: the conversion can call program code. */ + * `runsCode`: the conversion can call program code. `spread`: the value is + * a spread's array (lowerToNumberArguments' `lowerOther`). */ interface NumberOperand { value: IrExpr; convert: ((value: IrExpr) => IrExpr) | null; runsCode: boolean; + spread?: boolean; } function numberOperand(lowerer: Lowerer, node: ts.Expression): NumberOperand { diff --git a/tests/corpus/6906-tonumber-arguments.mjs b/tests/corpus/6906-tonumber-arguments.mjs index 55da6bb1f..35589d07f 100644 --- a/tests/corpus/6906-tonumber-arguments.mjs +++ b/tests/corpus/6906-tonumber-arguments.mjs @@ -75,3 +75,23 @@ try { } catch (e) { console.log(e.message, order); } + +// A spread reads its elements where it is evaluated, before an earlier +// argument's valueOf runs. +const values = [1, 2]; +const mutator = { + valueOf() { + values[0] = 100; + values.push(50); + return 3; + }, +}; +console.log(Math.max(mutator, ...values), values.join(",")); +const more = [4]; +const resetter = { + valueOf() { + more[0] = -1; + return 0; + }, +}; +console.log(Math.hypot(resetter, ...more, 3), more.join(",")); From 228c64a282a71b13aded2b6f805a9242efead2ee Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 16:46:53 -0500 Subject: [PATCH 29/67] Record TypeScript 7 baselines for the string field corpus program The TypeScript 7 parity lane checks every corpus program against a recorded preflight and order baseline. 6950-string-field-fast-paths.ts arrived without one; this records it from the current native lane. --- .../tests/corpus/6950-string-field-fast-paths.ts.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6950-string-field-fast-paths.ts.json diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6950-string-field-fast-paths.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6950-string-field-fast-paths.ts.json new file mode 100644 index 000000000..db05994a9 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6950-string-field-fast-paths.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6950-string-field-fast-paths.ts" + ], + "diags": [] +} From fa7aa2507889437b1e24466be1af9724530d0e1e Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 16:58:37 -0500 Subject: [PATCH 30/67] Call an observed prototype method through a bag that does not hold it A dynamic method call on a class instance whose method name the program also reads through a prototype (`X.prototype.map` anywhere) uses the observed prototype slot: the callback descriptor read the method from the instance's property bag, on the assumption that the bag answers every read through the class prototype. An instance whose bag was built before the class had prototype data reads as a fresh empty object, so the read answered undefined and the call threw "... is not a function" (fast-check's `integer({ min, max }).map(...)` once its result reaches the call through a dynamic value). The descriptor now reads the bag when the bag holds the name, own or through its prototype, and otherwise the class's prototype data. --- .../lowering/class-dynamic-dispatch.ts | 47 +++++++++++++------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.ts b/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.ts index 7d00eb89e..c891c14cc 100644 --- a/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.ts +++ b/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.ts @@ -2568,6 +2568,27 @@ export class ClassDynamicDispatch { receiver, ); const bag = this.readPropertyBagOrEmpty(lowerer, value, loc); + const methodKey: IrExpr = { + kind: "strLit", + value: dispatch.source.method, + type: STRING, + loc, + }; + const bagHas: IrExpr = { + kind: "libCall", + fn: "dyn.hasKey", + args: [bag, methodKey], + type: BOOL, + loc, + }; + // An observed prototype slot answers through the bag when the bag + // holds the name (own or through its prototype). A bag read as a + // fresh empty object (an instance with no own dynamic properties + // whose bag initializer predates the class's prototype data) does + // not, so the method then comes from the class's prototype data. + const prototype = prototypeMethod + ? classPrototypeData(lowerer, info, loc, receiver) + : null; dispatch.callback.body.unshift({ kind: "if", cond: condition, @@ -2576,18 +2597,7 @@ export class ClassDynamicDispatch { kind: "return", value: { kind: "ternary", - cond: prototypeMethod - ? { kind: "boolLit", value: true, type: BOOL, loc } - : { - kind: "libCall", - fn: "dyn.hasKey", - args: [ - bag, - { kind: "strLit", value: dispatch.source.method, type: STRING, loc }, - ], - type: BOOL, - loc, - }, + cond: prototype ? { kind: "boolLit", value: true, type: BOOL, loc } : bagHas, then: { kind: "dynObjLit", fields: [ @@ -2595,8 +2605,17 @@ export class ClassDynamicDispatch { key: { kind: "strLit", value: "value", type: STRING, loc }, value: { kind: "dynKeyGet", - value: bag, - key: { kind: "strLit", value: dispatch.source.method, type: STRING, loc }, + value: prototype + ? { + kind: "ternary", + cond: bagHas, + then: bag, + else_: prototype, + type: DYN, + loc, + } + : bag, + key: methodKey, type: DYN, loc, }, From d6f857bb1d168118a08974f5114a58146cec6232 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 16:59:02 -0500 Subject: [PATCH 31/67] Keep class methods on structural views asserted from unknown --- .../src/frontend/lowering/class-protocols.ts | 61 ++++++++++++++++++- .../6951-unknown-cast-class-methods.ts.json | 6 ++ .../corpus/6951-unknown-cast-class-methods.ts | 40 ++++++++++++ .../6951-unknown-cast-class-methods.ts.json | 1 + 4 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6951-unknown-cast-class-methods.ts.json create mode 100644 tests/corpus/6951-unknown-cast-class-methods.ts create mode 100644 tests/harness/corpus-costs/6951-unknown-cast-class-methods.ts.json diff --git a/packages/compiler/src/frontend/lowering/class-protocols.ts b/packages/compiler/src/frontend/lowering/class-protocols.ts index 172224053..81aa90a1f 100644 --- a/packages/compiler/src/frontend/lowering/class-protocols.ts +++ b/packages/compiler/src/frontend/lowering/class-protocols.ts @@ -98,7 +98,11 @@ export class ClassProtocols { * could read a stale value. A view of readonly data that nothing * observes stays a native record. */ private markIdentityFlows(protocols: Set): void { - const sites: { source: ts.Expression; target: () => ts.Type | undefined }[] = []; + const sites: { + source: ts.Expression; + target: () => ts.Type | undefined; + assertion?: true; + }[] = []; /** Expressions whose values are observed as whole objects. */ const observed: ts.Expression[] = []; /** Receivers whose type arguments or elements are observed (Set and Map @@ -233,6 +237,7 @@ export class ClassProtocols { sites.push({ source: node.expression, target: () => this.checker.getTypeFromTypeNode(typeNode), + assertion: true, }); } if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) @@ -325,11 +330,29 @@ export class ClassProtocols { } this.facts = facts; const pending: { sourceType: ts.Type; target: () => ts.Type | undefined }[] = []; + /** Views a value of unknown origin is asserted to and that expose a + * method of a class the view accepts (see methodViewSources). */ + const methodViews = new Set(); for (let i = 0; i < sites.length; i++) { const site = sites[i]!; const source = sourceNodes[i]!; const sourceType = attempt(() => this.checker.getTypeAtLocation(source)); - if (sourceType !== undefined) pending.push({ sourceType, target: site.target }); + if (sourceType === undefined) continue; + if ( + site.assertion && + (sourceType.flags & (ts.TypeFlags.Unknown | ts.TypeFlags.Any)) !== 0 && + this.methods.size > 0 + ) { + const target = attempt(site.target); + if (target !== undefined) + for (const { classType, view } of attempt(() => this.methodViewSources(target)) ?? []) { + pending.push({ sourceType: classType, target: () => view }); + const symbol = view.getSymbol(); + if (symbol !== undefined) methodViews.add(symbol); + } + continue; + } + pending.push({ sourceType, target: site.target }); } for (const { fn, index, name } of callbackParams) { attempt(() => { @@ -372,7 +395,12 @@ export class ClassProtocols { // Keep the marks a copy would be told apart from, and the marks whose // values flow into a kept view or another live protocol. const added = [...marked].filter((symbol) => !before.has(symbol)); - const kept = new Set(added.filter((symbol) => this.needsView(symbol, marked, facts))); + // A copy of an instance drops the methods its class defines, so a view + // that exposes one of them stays live wherever such an instance may + // arrive. + const kept = new Set( + added.filter((symbol) => methodViews.has(symbol) || this.needsView(symbol, marked, facts)), + ); let grew = true; while (grew) { grew = false; @@ -391,6 +419,33 @@ export class ClassProtocols { this.facts = null; } + /** The program classes a value asserted from `unknown` or `any` to + * `target` may be an instance of while `target` exposes one of their + * methods: for each structural part of `target` with a callable member, + * the instance type of every class that declares a method of that name + * and is assignable to the part. A record copy of such an instance would + * drop the method, which Node reads from the instance's prototype. */ + private methodViewSources(target: ts.Type): { classType: ts.Type; view: ts.Type }[] { + const parts = target.isUnionType() ? ts.constituentTypes(target) : [target]; + const out: { classType: ts.Type; view: ts.Type }[] = []; + for (const part of parts) { + if (!this.isStructuralTarget(part)) continue; + for (const property of this.checker.getPropertiesOfType(part)) { + const memberType = this.checker.getNonNullableType(this.checker.getTypeOfSymbol(property)); + if (this.checker.getCallSignatures(memberType).length === 0) continue; + for (const declaration of this.methods.get(ts.symbolName(property)) ?? []) { + const classSymbol = declaration.name + ? this.checker.getSymbolAtLocation(declaration.name) + : undefined; + if (classSymbol === undefined) continue; + const classType = this.checker.getDeclaredTypeOfSymbol(classSymbol); + if (this.checker.isTypeAssignableTo(classType, part)) out.push({ classType, view: part }); + } + } + } + return out; + } + /** The symbols of `type`'s object parts: union and intersection members, * and to `depth` levels the elements and type arguments they hold. */ private collectSymbols(type: ts.Type, out: Set, depth: number): void { diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6951-unknown-cast-class-methods.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6951-unknown-cast-class-methods.ts.json new file mode 100644 index 000000000..281dcba85 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6951-unknown-cast-class-methods.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6951-unknown-cast-class-methods.ts" + ], + "diags": [] +} diff --git a/tests/corpus/6951-unknown-cast-class-methods.ts b/tests/corpus/6951-unknown-cast-class-methods.ts new file mode 100644 index 000000000..7585a8752 --- /dev/null +++ b/tests/corpus/6951-unknown-cast-class-methods.ts @@ -0,0 +1,40 @@ +// Methods of a class instance read through `unknown` cast to a structural +// type: the read finds the prototype method, as Node's property lookup does. + +class Greeter { + label = "greeter"; + readonly name: string; + constructor(name: string) { + this.name = name; + } + describe(): string { + return `${this.label}:${this.name}`; + } + shout(): string { + return this.describe().toUpperCase(); + } +} + +class LoudGreeter extends Greeter { + extra(): number { + return 42; + } +} + +type Describable = { describe?: () => string; shout?: () => string; label?: string }; + +function inspect(value: unknown): void { + const shaped = value as Describable; + console.log(typeof shaped.describe, typeof shaped.shout, shaped.label); + console.log(shaped.describe?.() ?? "no describe"); + console.log(shaped.shout?.() ?? "no shout"); +} + +inspect(new Greeter("ada")); +inspect(new LoudGreeter("grace")); +inspect({ label: "plain", describe: () => "own function" }); +inspect({ label: "bare" }); + +const loud: unknown = new LoudGreeter("lin"); +const withExtra = loud as { extra?: () => number; missing?: () => number }; +console.log(withExtra.extra?.(), withExtra.missing?.() ?? "no missing"); diff --git a/tests/harness/corpus-costs/6951-unknown-cast-class-methods.ts.json b/tests/harness/corpus-costs/6951-unknown-cast-class-methods.ts.json new file mode 100644 index 000000000..49300a99a --- /dev/null +++ b/tests/harness/corpus-costs/6951-unknown-cast-class-methods.ts.json @@ -0,0 +1 @@ +{ "plain": 2618, "san": 37588 } From 238b08352b3b1f77c071116bc5dc6c1ff864bd4e Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 17:00:19 -0500 Subject: [PATCH 32/67] Keep named properties written to arrays through checked views --- .../src/backend/llvm/expr-stream-bridges.ts | 3 + .../compiler/src/backend/llvm/lib-dispatch.ts | 1 + .../compiler/src/backend/llvm/lib-shared.ts | 1 + .../src/backend/llvm/reference-writes.ts | 1 + .../src/frontend/lowering/lower-stmts.ts | 82 ++++++++++++++++++- .../compiler/src/ir/builtin-signatures.ts | 3 + packages/compiler/src/ir/validate.ts | 6 ++ .../6987-array-view-named-properties.ts.json | 6 ++ packages/runtime/src/scr_array.c | 64 ++++++++++++++- packages/runtime/src/scr_array.h | 9 ++ packages/runtime/src/scr_json.c | 17 ++++ .../6987-array-view-named-properties.ts | 79 ++++++++++++++++++ .../6987-array-view-named-properties.ts.json | 1 + 13 files changed, 266 insertions(+), 7 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6987-array-view-named-properties.ts.json create mode 100644 tests/corpus/6987-array-view-named-properties.ts create mode 100644 tests/harness/corpus-costs/6987-array-view-named-properties.ts.json diff --git a/packages/compiler/src/backend/llvm/expr-stream-bridges.ts b/packages/compiler/src/backend/llvm/expr-stream-bridges.ts index ce33aa2cd..b72875aaa 100644 --- a/packages/compiler/src/backend/llvm/expr-stream-bridges.ts +++ b/packages/compiler/src/backend/llvm/expr-stream-bridges.ts @@ -176,6 +176,7 @@ export function streamTypedRefCommitAdapter( const check = host.dyn.dynCheckHelper(t); host.declare(`declare void @scr_arr_release(ptr)`); host.declare(`declare void @scr_arr_outline(ptr)`); + host.declare(`declare void @scr_arr_adopt_view_properties(ptr, ptr, ptr)`); const lines = [ `define internal void @${commit}(ptr %target, ptr %d) ${FN_ATTRS} { ; commit live stream element ${typeKey(t)}`, `entry:`, @@ -183,6 +184,8 @@ export function streamTypedRefCommitAdapter( ` %missing = icmp eq ptr %next, null`, ` br i1 %missing, label %done, label %swap`, `swap:`, + // Properties move with the storage (in its out-of-line part). + ` call void @scr_arr_adopt_view_properties(ptr %next, ptr %d, ptr %target)`, // Inline slots live in each header's block; move them out first. ` call void @scr_arr_outline(ptr %target)`, ` call void @scr_arr_outline(ptr %next)`, diff --git a/packages/compiler/src/backend/llvm/lib-dispatch.ts b/packages/compiler/src/backend/llvm/lib-dispatch.ts index 924027ee2..1868ca402 100644 --- a/packages/compiler/src/backend/llvm/lib-dispatch.ts +++ b/packages/compiler/src/backend/llvm/lib-dispatch.ts @@ -864,6 +864,7 @@ export function emitLibCall(host: LlvmEmitterContext, e: LibCallExpr): LlValue { case "events": case "blob": case "wasm": + case "array": case "record": case "disposable": case "punycode": diff --git a/packages/compiler/src/backend/llvm/lib-shared.ts b/packages/compiler/src/backend/llvm/lib-shared.ts index feb499203..be7a4973b 100644 --- a/packages/compiler/src/backend/llvm/lib-shared.ts +++ b/packages/compiler/src/backend/llvm/lib-shared.ts @@ -1519,6 +1519,7 @@ export const LIB_FN_SYMS: Record = { "regex.groupNumber": "scr_regex_group_number", "regex.groupParseInt": "scr_regex_group_parse_int", "regex.resultProp": "scr_regex_result_prop", + "array.namedKeys": "scr_arr_named_keys", // queueMicrotask's checked-dynamic form (borrowed dyn; a non-function // throws synchronously), the minted setImmediate value, and the // timers/promises immediate — all mark the loop live. diff --git a/packages/compiler/src/backend/llvm/reference-writes.ts b/packages/compiler/src/backend/llvm/reference-writes.ts index a0a153da1..c77a5a191 100644 --- a/packages/compiler/src/backend/llvm/reference-writes.ts +++ b/packages/compiler/src/backend/llvm/reference-writes.ts @@ -105,6 +105,7 @@ const INERT_LIB_CALLS = new Set([ "regex.groupNumber", "regex.groupParseInt", "regex.resultProp", + "array.namedKeys", "process.cwd", "process.argv", "process.execArgv", diff --git a/packages/compiler/src/frontend/lowering/lower-stmts.ts b/packages/compiler/src/frontend/lowering/lower-stmts.ts index b04ba0b09..0960b9d6a 100644 --- a/packages/compiler/src/frontend/lowering/lower-stmts.ts +++ b/packages/compiler/src/frontend/lowering/lower-stmts.ts @@ -11594,10 +11594,23 @@ function lowerForInArray( try { const arr = lowerer.declareHiddenLocal("%inarr", arrExpr.type); const len = lowerer.declareHiddenLocal("%inlen", F64); + const keysT: IrType = { kind: "array", elem: STRING }; + const keys = lowerer.declareHiddenLocal("%inkeys", keysT); + const total = lowerer.declareHiddenLocal("%intotal", F64); const i = lowerer.declareHiddenLocal("%ini", F64); i.mutable = true; const arrRef = (): IrExpr => ({ kind: "varRef", localId: arr.id, type: arrExpr.type, loc }); + const keysRef = (): IrExpr => ({ kind: "varRef", localId: keys.id, type: keysT, loc }); + const lenRef = (): IrExpr => ({ kind: "varRef", localId: len.id, type: F64, loc }); const iRef = (): IrExpr => ({ kind: "varRef", localId: i.id, type: F64, loc }); + const isIndex = (): IrExpr => ({ + kind: "bin", + op: "<", + left: iRef(), + right: lenRef(), + type: BOOL, + loc, + }); const liveLen = (): IrExpr => ({ kind: "arrIntrinsic", method: "length", @@ -11606,7 +11619,44 @@ function lowerForInArray( type: F64, loc, }); - const keyInit: IrExpr = { kind: "toString", operand: iRef(), type: STRING, loc }; + // Indices first, then the named keys the array had when the loop began. + const keyInit: IrExpr = { + kind: "ternary", + cond: isIndex(), + then: { kind: "toString", operand: iRef(), type: STRING, loc }, + else_: { + kind: "arrayGet", + arr: keysRef(), + index: { kind: "bin", op: "-", left: iRef(), right: lenRef(), type: F64, loc }, + type: STRING, + loc, + }, + type: STRING, + loc, + }; + // An index is visited while it is below the live length and not a hole. + const visits: IrExpr = { + kind: "ternary", + cond: isIndex(), + then: { + kind: "logical", + op: "&&", + left: { kind: "bin", op: "<", left: iRef(), right: liveLen(), type: BOOL, loc }, + right: { + kind: "bin", + op: "!==", + left: { kind: "arrayState", arr: arrRef(), index: iRef(), type: F64, loc }, + right: { kind: "numLit", value: 0, type: F64, loc }, + type: BOOL, + loc, + }, + type: BOOL, + loc, + }, + else_: { kind: "boolLit", value: true, type: BOOL, loc }, + type: BOOL, + loc, + }; // The three binding forms, sharing the per-visit key declaration. let keyDecl: IrStmt; @@ -11670,6 +11720,32 @@ function lowerForInArray( body: [ { kind: "varDecl", localId: arr.id, init: arrExpr, loc }, { kind: "varDecl", localId: len.id, init: liveLen(), loc }, + { + kind: "varDecl", + localId: keys.id, + init: { kind: "libCall", fn: "array.namedKeys", args: [arrRef()], type: keysT, loc }, + loc, + }, + { + kind: "varDecl", + localId: total.id, + init: { + kind: "bin", + op: "+", + left: lenRef(), + right: { + kind: "arrIntrinsic", + method: "length", + receiver: keysRef(), + args: [], + type: F64, + loc, + }, + type: F64, + loc, + }, + loc, + }, { kind: "for", init: { @@ -11682,7 +11758,7 @@ function lowerForInArray( kind: "bin", op: "<", left: iRef(), - right: { kind: "varRef", localId: len.id, type: F64, loc }, + right: { kind: "varRef", localId: total.id, type: F64, loc }, type: BOOL, loc, }, @@ -11702,7 +11778,7 @@ function lowerForInArray( body: [ { kind: "if", - cond: { kind: "bin", op: "<", left: iRef(), right: liveLen(), type: BOOL, loc }, + cond: visits, then: [keyDecl, ...writes, ...body], else_: null, loc, diff --git a/packages/compiler/src/ir/builtin-signatures.ts b/packages/compiler/src/ir/builtin-signatures.ts index 9f383c695..1e6270366 100644 --- a/packages/compiler/src/ir/builtin-signatures.ts +++ b/packages/compiler/src/ir/builtin-signatures.ts @@ -3724,6 +3724,9 @@ export const LIB_FN_SIGS = defineLibFnSignatures({ "regex.groupParseInt": { argTypes: [arrayOf(STRING), F64, F64], result: F64 }, // `.index` / `.input` (args[1]) of a match result. Borrowed; never throws. "regex.resultProp": { argTypes: [arrayOf(STRING), STRING], result: DYN }, + // The string keys `for...in` visits on an array (args[0], any element + // type) after its indices. Borrowed; never throws. + "array.namedKeys": { argTypes: [null], result: arrayOf(STRING) }, // node:events EventEmitter: receivers are emitter-hierarchy objects and // the chaining forms (on/off/removeAll/setMax) return the receiver's // own class — program-dependent object types, checked in the libCall diff --git a/packages/compiler/src/ir/validate.ts b/packages/compiler/src/ir/validate.ts index f562d20e0..0004be761 100644 --- a/packages/compiler/src/ir/validate.ts +++ b/packages/compiler/src/ir/validate.ts @@ -4262,6 +4262,12 @@ function validateFunction( if (!ok) err(`libCall dyn.objEntryPairs must return a [string, any] tuple array`, e.loc); return true; } + if (e.fn === "array.namedKeys") { + if (e.args[0]?.type.kind !== "array") { + err(`libCall array.namedKeys arg 0: expected an array, got ${e.args[0]?.type.kind}`, e.loc); + } + return true; + } if (e.fn === "fetch.streamFrom") { const t = e.args[0]?.type; const ok = diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6987-array-view-named-properties.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6987-array-view-named-properties.ts.json new file mode 100644 index 000000000..c12126453 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6987-array-view-named-properties.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6987-array-view-named-properties.ts" + ], + "diags": [] +} diff --git a/packages/runtime/src/scr_array.c b/packages/runtime/src/scr_array.c index f8b5813a2..fa98dd38a 100644 --- a/packages/runtime/src/scr_array.c +++ b/packages/runtime/src/scr_array.c @@ -4795,11 +4795,67 @@ void scr_arr_copy_metadata(ScrArr *a, ScrDyn *target) { if (metadata && metadata->kind == SCR_DYN_HANDLE && metadata->v.handle.tag == SCR_DYNH_MATCH_SOURCE && scr_arr_match_copy(a, target)) return; - if (!SCR_AX(a)->metadata) return; - for (size_t i = 0; i < SCR_AX(a)->metadata->v.obj.len; i++) { - ScrDynEntry *entry = &SCR_AX(a)->metadata->v.obj.entries[i]; + metadata = SCR_AX(a)->metadata; + if (!metadata) return; + for (size_t i = 0; i < metadata->v.obj.len; i++) { + const ScrDynEntry *entry = &metadata->v.obj.entries[i]; ScrStr *key = scr_str_new(entry->key, entry->key_len); - scr_dyn_key_set(target, key, entry->value); + if (!entry->accessor && entry->writable && entry->enumerable && entry->configurable) { + scr_dyn_key_set(target, key, entry->value); + } else { + /* Properties defined through a view keep their attributes. */ + ScrDyn *name = scr_dyn_new_str(key); + ScrDyn *descriptor = scr_dyn_own_descriptor(metadata, key); + if (descriptor) scr_dyn_release(scr_dyn_define_property(target, name, descriptor)); + scr_dyn_release(descriptor); + scr_dyn_release(name); + } scr_str_release(key); } } + +ScrArr *scr_arr_named_keys(ScrArr *a) { + /* Most arrays have no out-of-line storage: they share one immortal empty + * result, which `for...in` only reads. */ + static ScrArr none = {.rc = SIZE_MAX, .elem = SCR_ELEM_STR}; + const ScrArrExt *x = scr_arr_ext_of(a); + if (!x) return &none; + ScrArr *keys = scr_arr_new(SCR_ELEM_STR, 0); + for (size_t i = 0; i < x->prop_len; i++) + scr_arr_push_ref(keys, scr_str_new(x->props[i].key, x->props[i].key_len)); + const ScrDyn *metadata = x->metadata; + if (metadata && metadata->kind == SCR_DYN_HANDLE && metadata->v.handle.tag == SCR_DYNH_MATCH_SOURCE) { + static const char *const names[] = {"index", "input", "groups"}; + for (size_t i = 0; i < 3; i++) scr_arr_push_ref(keys, scr_str_new(names[i], strlen(names[i]))); + return keys; + } + if (!metadata || metadata->kind != SCR_DYN_OBJ) return keys; + for (size_t i = 0; i < metadata->v.obj.len; i++) { + const ScrDynEntry *entry = &metadata->v.obj.entries[i]; + if (!entry->enumerable || scr_arr_prop_index(a, entry->key, entry->key_len) != SIZE_MAX) continue; + scr_arr_push_ref(keys, scr_str_new(entry->key, entry->key_len)); + } + return keys; +} + +void scr_arr_adopt_view_properties(ScrArr *a, ScrDyn *view, ScrArr *target) { + ScrArrExt *from = scr_arr_ext_of(target); + if (from && from->prop_len) { + /* Both arrays have the same element type, so the slots keep their owner. */ + ScrArrExt *x = scr_arr_ext(a); + ScrArrProp *props = x->props; + size_t len = x->prop_len, cap = x->prop_cap; + x->props = from->props; + x->prop_len = from->prop_len; + x->prop_cap = from->prop_cap; + from->props = props; + from->prop_len = len; + from->prop_cap = cap; + } + ScrDyn *named = view && view->kind == SCR_DYN_ARR ? view->v.arr.properties : NULL; + if (!named || named->v.obj.len == 0) return; + ScrArrExt *x = scr_arr_ext(a); + ScrDyn *old = x->metadata; + x->metadata = scr_dyn_retain(named); + scr_dyn_release(old); +} diff --git a/packages/runtime/src/scr_array.h b/packages/runtime/src/scr_array.h index 2068a324d..d9f5f49bc 100644 --- a/packages/runtime/src/scr_array.h +++ b/packages/runtime/src/scr_array.h @@ -317,6 +317,15 @@ static inline ScrArr *scr_arr_retain(ScrArr *a) { * the candidate-root buffer like every headered type. */ void scr_arr_release(ScrArr *a); void scr_arr_copy_metadata(ScrArr *a, struct ScrDyn *target); +/* The commit of a live array view calls this on `a`, the array converted + * from `view`, before `target` takes its storage: `a` takes the view's named + * (non-index) properties as its metadata and the noncanonical numeric + * properties of `target`, so neither is lost when the storage is swapped. */ +void scr_arr_adopt_view_properties(ScrArr *a, struct ScrDyn *view, ScrArr *target); +/* The enumerable string keys `for...in` visits after the indices: the + * noncanonical numeric properties, then the named properties in insertion + * order. +1. */ +ScrArr *scr_arr_named_keys(ScrArr *a); /* Installed by scr_regex.c when it records a pending match source; this * unit links without the regex runtime. Writes the pending metadata of * `a` into its dynamic copy or materializes it, answering whether it diff --git a/packages/runtime/src/scr_json.c b/packages/runtime/src/scr_json.c index adcc96560..8577a96fb 100644 --- a/packages/runtime/src/scr_json.c +++ b/packages/runtime/src/scr_json.c @@ -10269,6 +10269,23 @@ void scr_dyn_key_delete(ScrDyn *recv, const ScrStr *key, bool strict) { } return; } + /* A live native array keeps its named properties in its metadata, so + * deleting one goes through the view and its commit. Elements and + * `length` keep the boundary below. */ + size_t element; + if (recv->kind == SCR_DYN_TYPED_REF && recv->v.typed_ref.commit && scr_dyn_typed_ref_array_ops(recv) && + !scr_typed_ref_is_length(key) && !scr_typed_ref_canonical_index(key->data, key->len, &element)) { + ScrDyn *view = scr_dyn_typed_ref_materialize(recv); + if (!scr_exc_pending() && view->kind == SCR_DYN_ARR) { + bool own = view->v.arr.properties && scr_dyn_obj_get(view->v.arr.properties, key->data, key->len); + if (own) scr_dyn_key_delete(view, key, strict); + if (own && !scr_exc_pending()) scr_dyn_typed_ref_commit(recv); + scr_dyn_release(view); + return; + } + scr_dyn_release(view); + if (scr_exc_pending()) return; + } if (recv->kind == SCR_DYN_FUNC) { if (scr_dyn_fn_property_fence(key)) return; ScrDyn *table = scr_dyn_fn_properties(recv); diff --git a/tests/corpus/6987-array-view-named-properties.ts b/tests/corpus/6987-array-view-named-properties.ts new file mode 100644 index 000000000..5cbea5a0a --- /dev/null +++ b/tests/corpus/6987-array-view-named-properties.ts @@ -0,0 +1,79 @@ +// Named properties written to a typed array through an `unknown` view stay +// on the array: later views read them, key walks list them after the +// indices, and `for...in` over the typed array visits them. Holes are +// skipped by `for...in`. + +type Bag = Record; + +const numbers: number[] = [1, 2, 3]; +const numbersView = numbers as unknown as Bag; +numbersView.extra = "named"; +console.log(numbersView.extra, (numbers as unknown as Bag).extra); +console.log(Object.keys(numbersView), JSON.stringify(numbers), numbers.length); +console.log("extra" in numbersView, Object.hasOwn(numbersView, "extra")); + +numbers.push(4); +numbers[0] = 10; +console.log((numbers as unknown as Bag).extra, numbers.join(",")); +console.log((numbers.slice() as unknown as Bag).extra); + +(numbers as unknown as Bag).extra = "again"; +(numbers as unknown as Bag).count = 2; +console.log(Object.entries(numbers as unknown as Bag)); +for (const key in numbers) console.log("numbers key", key); + +delete (numbers as unknown as Bag).extra; +console.log((numbers as unknown as Bag).extra, Object.keys(numbers as unknown as Bag)); + +const words: string[] = ["a", "b"]; +(words as unknown as Bag).label = { nested: [1, 2] }; +const label = (words as unknown as Bag).label as { nested: number[] }; +console.log(label.nested.length, words.length); +for (const key in words) console.log("words key", key); + +interface Point { + x: number; + y: number; +} +const points: Point[] = [{ x: 1, y: 2 }]; +(points as unknown as Bag).origin = "zero"; +console.log((points as unknown as Bag).origin, points[0]!.x); +for (const key in points) console.log("points key", key); + +class Item { + name: string; + constructor(name: string) { + this.name = name; + } +} +const items: Item[] = [new Item("first")]; +(items as unknown as Bag).kind = "items"; +console.log((items as unknown as Bag).kind, items[0]!.name); + +const flags: boolean[] = [true, false]; +Object.defineProperty(flags as unknown as Bag, "hidden", { value: 1, enumerable: false }); +(flags as unknown as Bag).shown = 2; +console.log((flags as unknown as Bag).hidden, (flags as unknown as Bag).shown); +for (const key in flags) console.log("flags key", key); + +const holes: (number | undefined)[] = [1, , 3, undefined]; +for (const key in holes) console.log("holes key", key); +(holes as unknown as Bag).tail = true; +for (const key in holes) console.log("holes key after", key); + +const offsets: number[] = [1, 2]; +offsets[-1] = 5; +offsets[1.5] = 6; +(offsets as unknown as Bag).name = "offsets"; +console.log(offsets[-1], offsets[1.5], (offsets as unknown as Bag).name); +for (const key in offsets) console.log("offsets key", key); + +const shrinking: number[] = [1, 2, 3, 4]; +(shrinking as unknown as Bag).after = "kept"; +for (const key in shrinking) { + console.log("shrinking key", key); + if (key === "1") shrinking.length = 2; +} + +const match = /b(?c)?/.exec("abc"); +if (match) for (const key in match) console.log("match key", key); diff --git a/tests/harness/corpus-costs/6987-array-view-named-properties.ts.json b/tests/harness/corpus-costs/6987-array-view-named-properties.ts.json new file mode 100644 index 000000000..1e9e64ec5 --- /dev/null +++ b/tests/harness/corpus-costs/6987-array-view-named-properties.ts.json @@ -0,0 +1 @@ +{ "plain": 3300, "san": 4400 } From d15e822d263203f3bc29cb43071b47d6f21be839 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 17:16:12 -0500 Subject: [PATCH 33/67] Hold any non-nullish value in an empty object type inferred from a literal The type mapper lowered the type tsc infers from an empty object literal (`const o = {}`) as the empty record, while a declared `{}` already lowered as a checked-dynamic value. tsc's `{}` admits every non-nullish value in both cases: union subtype reduction folds primitives into a literal's `{}` (`["12", {}]` is `{}[]`, `flag ? "x" : {}` is `{}`), and `let o = {}` accepts `o = "x"`. Such a program built and then threw a TypeError at run time ("expected object at $[0], got string" in a JavaScript file, "a 'string' value is not representable in the target union" in TypeScript), where Node prints the values. An empty object type with no members, index signatures or signatures now lowers as a checked-dynamic value, the same rule as `object` and `Object`. As an arm of a union that keeps another non-nullish arm, which subtype reduction would have removed, it holds only the literal's objects and stays the empty record. An assertion's scalar check (`as string`, `as number`, `as boolean`) on a dynamic value whose result goes straight back into a dynamic slot keeps the original value, since JavaScript erases assertions: passing `{} as unknown as string` to process.loadEnvFile reports Node's ERR_INVALID_ARG_TYPE instead of a TypeError from the check. Object.assign's two-argument path for a dynamic target now applies the same refusal as the general path when a class instance is copied into a fresh object literal whose result the checker types as the class, so `Object.assign({}, instance)` keeps its compile-time refusal now that the literal lowers as a dynamic value. --- .../src/frontend/lowering/lower-calls.ts | 45 ++++++----- .../compiler/src/frontend/lowering/lowerer.ts | 14 ++++ packages/compiler/src/frontend/type-mapper.ts | 77 +++++++++++++++---- .../6909-empty-object-type-values.ts.json | 6 ++ .../6910-empty-object-type-values-js.mjs.json | 6 ++ tests/corpus/6909-empty-object-type-values.ts | 32 ++++++++ .../6910-empty-object-type-values-js.mjs | 14 ++++ .../index-signature-values.ts.txt | 20 +---- ...ine-2104-computed-key-destructuring.ts.txt | 11 +-- .../__snapshots__/utility-types.ts.txt | 20 +---- 10 files changed, 164 insertions(+), 81 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6909-empty-object-type-values.ts.json create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6910-empty-object-type-values-js.mjs.json create mode 100644 tests/corpus/6909-empty-object-type-values.ts create mode 100644 tests/corpus/6910-empty-object-type-values-js.mjs diff --git a/packages/compiler/src/frontend/lowering/lower-calls.ts b/packages/compiler/src/frontend/lowering/lower-calls.ts index ac7728838..fa90990e5 100644 --- a/packages/compiler/src/frontend/lowering/lower-calls.ts +++ b/packages/compiler/src/frontend/lowering/lower-calls.ts @@ -7668,6 +7668,10 @@ function lowerObjectStaticCall( const target = lowerer.lowerExpr(call.arguments.nodes[0]!); const rawSource = lowerer.lowerExpr(call.arguments.nodes[1]!); fenceSymbolFieldCopy(lowerer, call.arguments.nodes[1]!, rawSource.type); + let targetNode: ts.Expression = call.arguments.nodes[0]!; + while (ts.isParenthesizedExpression(targetNode)) targetNode = targetNode.expression; + if (ts.isObjectLiteralExpression(targetNode)) + fenceClassCopyIntoFreshObject(lowerer, call, call.arguments.nodes[1]!, rawSource); const source = lowerer.coerceToExpected(rawSource, DYN); if (target.type.kind === "dyn" && source.type.kind === "dyn") { return { kind: "libCall", fn: "dyn.assign", args: [target, source], type: DYN, loc }; @@ -7821,25 +7825,8 @@ function lowerObjectStaticCall( const srcNode = spread ? argNode.expression : argNode; const rawSource = lowerer.lowerExpr(srcNode); fenceSymbolFieldCopy(lowerer, srcNode, rawSource.type, spread); - // A class instance copied into a fresh object - // (`Object.assign({}, instance)`): the result is a plain - // object holding the instance's own fields, never an - // instance, so a result the checker types as the class has - // no representation (the checked cast would throw). - if ( - rawSource.type.kind === "object" && - freshLiteralTarget && - !ts.isExpressionStatement(call.parent) - ) { - const resultT = lowerer.mapTypeOf(lowerer.typeOf(call)); - if (resultT !== null && resultT.kind === "object") { - lowerer.unsupported( - "SC1090", - srcNode, - `Object.assign copying a '${lowerer.fmt(rawSource.type)}' instance into a fresh object typed as the class (the copy is a plain object holding the instance's own fields, not an instance — build the object literal from the fields you need)`, - ); - } - } + if (freshLiteralTarget) + fenceClassCopyIntoFreshObject(lowerer, call, srcNode, rawSource); const src = lowerer.coerceToExpected(rawSource, DYN); if (src.type.kind !== "dyn") { ok = false; @@ -10685,3 +10672,23 @@ function functionIntegrity( loc, }; } + +/** A class instance copied into a fresh object (`Object.assign({}, + * instance)`): the result is a plain object holding the instance's own + * fields, never an instance, so a result the checker types as the class has + * no representation (the checked cast would throw). */ +function fenceClassCopyIntoFreshObject( + lowerer: Lowerer, + call: ts.CallExpression, + srcNode: ts.Expression, + rawSource: IrExpr, +): void { + if (rawSource.type.kind !== "object" || ts.isExpressionStatement(call.parent)) return; + const resultT = lowerer.mapTypeOf(lowerer.typeOf(call)); + if (resultT === null || resultT.kind !== "object") return; + lowerer.unsupported( + "SC1090", + srcNode, + `Object.assign copying a '${lowerer.fmt(rawSource.type)}' instance into a fresh object typed as the class (the copy is a plain object holding the instance's own fields, not an instance — build the object literal from the fields you need)`, + ); +} diff --git a/packages/compiler/src/frontend/lowering/lowerer.ts b/packages/compiler/src/frontend/lowering/lowerer.ts index c4d24cef1..e287bac3f 100644 --- a/packages/compiler/src/frontend/lowering/lowerer.ts +++ b/packages/compiler/src/frontend/lowering/lowerer.ts @@ -9786,6 +9786,20 @@ export class Lowerer { * directly when the expression was already lowered. */ coerceInto(node: ts.Node, expr: IrExpr, expected: IrType): IrExpr { refuseInferredCallbackDrops(this, node, expr.type, expected); + // An assertion's scalar check whose value goes straight back into a + // checked-dynamic slot (`process.loadEnvFile({} as unknown as string)`) + // keeps the original value: JavaScript erases assertions, so the check + // could only add a TypeError Node does not throw, and the slot holds + // the value either way. + if (expected.kind === "dyn" && expr.kind === "dynCheck" && expr.value.type.kind === "dyn") { + let source = node; + while (ts.isParenthesizedExpression(source)) source = source.expression; + if ( + (ts.isAsExpression(source) || ts.isTypeAssertion(source)) && + (expr.type.kind === "string" || expr.type.kind === "f64" || expr.type.kind === "bool") + ) + return expr.value; + } // A union destination can accept the binding's tagged storage directly. // The checker's single-arm flow type can be stale after a callback writes // the binding. Extracting that arm and wrapping it again would discard the diff --git a/packages/compiler/src/frontend/type-mapper.ts b/packages/compiler/src/frontend/type-mapper.ts index 3448545f8..6305a6b63 100644 --- a/packages/compiler/src/frontend/type-mapper.ts +++ b/packages/compiler/src/frontend/type-mapper.ts @@ -1108,6 +1108,11 @@ export type TypeParamTsResolver = (t: ts.Type) => ts.Type | null; * once per Lowerer and threaded through the recursion — adding a hook means * one new field here, not a new parameter at every call site. */ export interface TypeMapperCtx { + /** Set only while a union maps an arm that is the type inferred from an + * empty object literal, beside another non-nullish arm: that arm holds + * only the literal's objects, so it maps to the empty record (see the + * empty object type rule in the object mapping). */ + emptyLiteralArm?: boolean; checker: ts.TypeChecker; /** JavaScript declarations whose instance or object-literal types only * the checked-dynamic representation holds (js-dynamic-objects.ts). @@ -4648,6 +4653,18 @@ function mapTypeInner(type: ts.Type, ctx: TypeMapperCtx): IrType | null { ); }; const hasArrayPart = parts.some((part) => checker.isArrayType(part) || matchArray(part)); + // Subtype reduction removes every arm assignable to `{}`, so a union + // that keeps another non-nullish arm beside an empty literal's `{}` + // was not reduced: that `{}` arm holds only the literal's objects. + const nullish = ts.TypeFlags.Null | ts.TypeFlags.Undefined | ts.TypeFlags.Void; + const literalEmptyArms = + parts.some((part) => isEmptyObjectLiteralType(part, ctx)) && + parts.some( + (part) => + (part.flags & nullish) === 0 && + !checker.isNeverType(part) && + !isEmptyObjectLiteralType(part, ctx), + ); for (const part of parts) { if (hasArrayPart && emptyTuple(part)) continue; // TypeScript's client can retain impossible intersections in a @@ -4666,7 +4683,17 @@ function mapTypeInner(type: ts.Type, ctx: TypeMapperCtx): IrType | null { byKey.set(typeKey(NULL_T), NULL_T); continue; } - const mapped = mapType(part, ctx); + let mapped: IrType | null; + if (literalEmptyArms && isEmptyObjectLiteralType(part, ctx)) { + ctx.emptyLiteralArm = true; + try { + mapped = mapType(part, ctx); + } finally { + ctx.emptyLiteralArm = false; + } + } else { + mapped = mapType(part, ctx); + } if (!mapped) { return null; @@ -7496,25 +7523,29 @@ function mapRecordTypeInner( // An INDEX-SIGNATURE shape is exempt: `Record` legitimately // has zero declared members — the signature is the shape. if (computed && props.length === 0 && !indexValue) return null; - // A DECLARED empty object type — `{}` (spelled or the checker's shared - // intrinsic), `interface Empty {}` — is tsc's TOP type over non-nullish - // values: every number, string, record, array, function, or class - // instance is assignable into the slot, so the exact-record stance - // cannot hold it. It lowers like `unknown` (the dyn), the same rule - // as `object` and the lib's `Object`: assignments convert at the site - // (sources outside the checked-dynamic tree fence there, exactly as unknown does), reads - // narrow back out through the same checked casts. The type INFERRED - // from an empty object literal (`const o = {}`) stays the empty record - // — it describes a value the program built, not an annotation that - // admits everything — and computed empties (`Partial` in a generic - // body) returned null above. Empty shapes WITH an index signature - // (`Record`) are not empty: the signature is the shape. + // An empty object type — `{}` (spelled, the checker's shared + // intrinsic, or inferred from an empty object literal), `interface + // Empty {}` — is tsc's TOP type over non-nullish values: every number, + // string, record, array, function, or class instance is assignable + // into the slot, so the exact-record stance cannot hold it. It lowers + // like `unknown` (the dyn), the same rule as `object` and the lib's + // `Object`: assignments convert at the site (sources outside the + // checked-dynamic tree fence there, exactly as unknown does), reads + // narrow back out through the same checked casts. A literal's inferred + // `{}` is no exception: union subtype reduction folds primitives into + // it (`["12", {}]` is `{}[]`, `flag ? "x" : {}` is `{}`), and `let o = + // {}` admits `o = "x"`. As an arm beside another non-nullish arm (the + // union was not reduced, `string | {} | DataView`) it holds only the + // literal's objects and stays the empty record (emptyLiteralArm). + // Computed empties (`Partial` in a generic body) returned null + // above. Empty shapes WITH an index signature (`Record`) are + // not empty: the signature is the shape. if ( props.length === 0 && indexValue === undefined && checker.getCallSignatures(widened).length === 0 && checker.getConstructSignatures(widened).length === 0 && - !(anonSym !== undefined && anonSym.declarations.some((d) => ts.isObjectLiteralExpression(d))) + !(ctx.emptyLiteralArm && isEmptyObjectLiteralType(widened, ctx)) ) { return DYN; } @@ -8154,3 +8185,19 @@ function innerBlockedMember( } return here; } + +/** The type tsc infers from an empty object literal (`{}` written as a + * value): no members, index signatures or signatures, declared by an object + * literal expression. */ +function isEmptyObjectLiteralType(type: ts.Type, ctx: TypeMapperCtx): boolean { + const { checker } = ctx; + const symbol = type.getSymbol(); + return ( + symbol !== undefined && + symbol.declarations.some((d) => ts.isObjectLiteralExpression(d)) && + checker.getPropertiesOfType(type).length === 0 && + checker.getIndexInfosOfType(type).length === 0 && + checker.getCallSignatures(type).length === 0 && + checker.getConstructSignatures(type).length === 0 + ); +} diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6909-empty-object-type-values.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6909-empty-object-type-values.ts.json new file mode 100644 index 000000000..e94a525ad --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6909-empty-object-type-values.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6909-empty-object-type-values.ts" + ], + "diags": [] +} diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6910-empty-object-type-values-js.mjs.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6910-empty-object-type-values-js.mjs.json new file mode 100644 index 000000000..1e07899f1 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6910-empty-object-type-values-js.mjs.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6910-empty-object-type-values-js.mjs" + ], + "diags": [] +} diff --git a/tests/corpus/6909-empty-object-type-values.ts b/tests/corpus/6909-empty-object-type-values.ts new file mode 100644 index 000000000..b539415fd --- /dev/null +++ b/tests/corpus/6909-empty-object-type-values.ts @@ -0,0 +1,32 @@ +// The empty object type `{}` admits every non-nullish value, including when +// tsc infers it from an empty object literal: union subtype reduction folds +// primitives into it (`["12", {}]` is `{}[]`, `flag ? "x" : {}` is `{}`), and +// a `let` initialized with `{}` takes any later non-nullish value. +const flag = Math.random() < 2; + +const mixed = ["12", {}]; +console.log(mixed.length, typeof mixed[0], typeof mixed[1]); + +const marker = {}; +const list = [marker, "x", 3, true, [1]]; +console.log(list.length, list[0] === marker, list.map((x) => typeof x).join(",")); + +const holder = { value: flag ? "x" : {} }; +const picked = flag ? "y" : {}; +console.log(typeof holder.value, typeof picked, holder.value, picked); + +let slot = {}; +console.log(JSON.stringify(slot)); +slot = "now a string"; +console.log(typeof slot, slot); +slot = 42; +console.log(typeof slot, slot); + +function choose(n: number) { + if (n > 0) return "positive"; + return {}; +} +console.log(typeof choose(1), typeof choose(-1)); + +const empty = {}; +console.log(JSON.stringify(empty), Object.keys(empty).length, empty === empty, String(empty)); diff --git a/tests/corpus/6910-empty-object-type-values-js.mjs b/tests/corpus/6910-empty-object-type-values-js.mjs new file mode 100644 index 000000000..3c6803556 --- /dev/null +++ b/tests/corpus/6910-empty-object-type-values-js.mjs @@ -0,0 +1,14 @@ +// In a JavaScript file, an array literal mixing strings, other primitives and +// an empty object holds each value as written. +const a = ["12", {}]; +console.log(a.length, typeof a[0], typeof a[1]); + +const b = ["12", "", true, null, undefined, [7], {}]; +console.log(b.length, b.map((x) => (x === null ? "null" : typeof x)).join(",")); + +const options = [{}, "fallback"]; +for (const option of options) console.log(typeof option === "string" ? option : JSON.stringify(option)); + +let current = {}; +current = "replaced"; +console.log(current); diff --git a/tests/harness/__snapshots__/index-signature-values.ts.txt b/tests/harness/__snapshots__/index-signature-values.ts.txt index d1e9395ed..bbbed7fe2 100644 --- a/tests/harness/__snapshots__/index-signature-values.ts.txt +++ b/tests/harness/__snapshots__/index-signature-values.ts.txt @@ -7,15 +7,6 @@ index-signature-values.ts:8:7 - error SC2006: values of type '{ [s: symbol]: num hint: string- and number-keyed index signatures over the supported value types compile directly; symbol keys and dual signatures with unequal value types have no lowering -index-signature-values.ts:9:13 - error SC2004: uses of 'bySymbol' inherit the blocker on its declaration - - 8 | const bySymbol: { [s: symbol]: number } = {}; - 9 | console.log(bySymbol); - | ^~~~~~~~ - 10 | - - hint: the declaration of 'bySymbol' did not compile — fix the diagnostic reported there and these sites clear with it - index-signature-values.ts:13:13 - error SC1090: console.log of '{ [key: string]: Uint8Array }' values (Uint8Array and Buffer values inside composites have no inspect lowering yet (Buffer's form vs Uint8Array's is not recorded in the static type here)) are not supported yet 12 | const buffers: Record = {}; @@ -30,13 +21,4 @@ index-signature-values.ts:18:7 - error SC2006: values of type '{ [k: string]: st | ^~~~ 19 | console.log(dual); - hint: string- and number-keyed index signatures over the supported value types compile directly; symbol keys and dual signatures with unequal value types have no lowering - -index-signature-values.ts:19:13 - error SC2004: uses of 'dual' inherit the blocker on its declaration - - 18 | const dual: { [k: string]: string | number; [n: number]: number } = {}; - 19 | console.log(dual); - | ^~~~ - 20 | - - hint: the declaration of 'dual' did not compile — fix the diagnostic reported there and these sites clear with it \ No newline at end of file + hint: string- and number-keyed index signatures over the supported value types compile directly; symbol keys and dual signatures with unequal value types have no lowering \ No newline at end of file diff --git a/tests/harness/__snapshots__/retired-engine-2104-computed-key-destructuring.ts.txt b/tests/harness/__snapshots__/retired-engine-2104-computed-key-destructuring.ts.txt index bb30cf581..b5417ae72 100644 --- a/tests/harness/__snapshots__/retired-engine-2104-computed-key-destructuring.ts.txt +++ b/tests/harness/__snapshots__/retired-engine-2104-computed-key-destructuring.ts.txt @@ -7,18 +7,11 @@ retired-engine-2104-computed-key-destructuring.ts:30:38 - error SC2009: values o hint: the outer shape is supported — the named component is the blocker; restate it inside the compilable set (number, string, boolean, arrays, Maps, Sets, RegExp, functions, classes, records, unions of those, and 'unknown') -retired-engine-2104-computed-key-destructuring.ts:33:8 - error SC1031: destructuring with computed keys that do not fold to one property name is not supported yet - - 32 | traceS = ""; - 33 | let [{ [order(1)]: y } = order(0)] = [{}]; - | ^~~~~~~~~~~~~ - 34 | console.log(traceS); - -retired-engine-2104-computed-key-destructuring.ts:36:7 - error SC1031: destructuring with computed keys that do not fold to one property name is not supported yet +retired-engine-2104-computed-key-destructuring.ts:36:58 - error SC1031: destructuring declaration from an `any` source whose expression spelling is unsupported (use a variable, ordinary property chain, or ordinary call) is not supported yet 35 | traceS = ""; 36 | let { [order(0)]: { [order(2)]: z } = order(1), ...w } = {} as any; - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + | ^~~~~~~~~ 37 | console.log(traceS); retired-engine-2104-computed-key-destructuring.ts:39:8 - error SC1031: rest bindings whose packed type has no static mapping (only plain record types pack) is not supported yet diff --git a/tests/harness/__snapshots__/utility-types.ts.txt b/tests/harness/__snapshots__/utility-types.ts.txt index 71f4d3083..02595967b 100644 --- a/tests/harness/__snapshots__/utility-types.ts.txt +++ b/tests/harness/__snapshots__/utility-types.ts.txt @@ -7,15 +7,6 @@ utility-types.ts:15:7 - error SC2006: values of type '{ [s: symbol]: string; }' hint: string- and number-keyed index signatures over the supported value types compile directly; symbol keys and dual signatures with unequal value types have no lowering -utility-types.ts:16:13 - error SC2004: uses of 'bySymbol' inherit the blocker on its declaration - - 15 | const bySymbol: { [s: symbol]: string } = {}; - 16 | console.log(bySymbol); - | ^~~~~~~~ - 17 | - - hint: the declaration of 'bySymbol' did not compile — fix the diagnostic reported there and these sites clear with it - utility-types.ts:18:7 - error SC2006: values of type '{ [k: string]: Date; }' cannot be compiled: this index signature is outside the supported shape (string or number keys; values limited to numbers, strings, booleans, records, classes, arrays, unions, functions, Maps, Sets, RegExps, Promises, or 'unknown') 17 | @@ -23,13 +14,4 @@ utility-types.ts:18:7 - error SC2006: values of type '{ [k: string]: Date; }' ca | ^~~~~~~ 19 | const boot = dateBag["boot"]; - hint: string- and number-keyed index signatures over the supported value types compile directly; symbol keys and dual signatures with unequal value types have no lowering - -utility-types.ts:19:14 - error SC2004: uses of 'dateBag' inherit the blocker on its declaration - - 18 | const dateBag: { [k: string]: Date } = {}; - 19 | const boot = dateBag["boot"]; - | ^~~~~~~ - 20 | console.log(boot); - - hint: the declaration of 'dateBag' did not compile — fix the diagnostic reported there and these sites clear with it \ No newline at end of file + hint: string- and number-keyed index signatures over the supported value types compile directly; symbol keys and dual signatures with unequal value types have no lowering \ No newline at end of file From 70aed0f1339e455140c436fcfc158fe3d25a72ef Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 17:17:02 -0500 Subject: [PATCH 34/67] Walk a file once for the references of its function declarations --- .../src/frontend/lowering/var-hoisting.ts | 47 +++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/packages/compiler/src/frontend/lowering/var-hoisting.ts b/packages/compiler/src/frontend/lowering/var-hoisting.ts index 6276ab671..3f950f3ca 100644 --- a/packages/compiler/src/frontend/lowering/var-hoisting.ts +++ b/packages/compiler/src/frontend/lowering/var-hoisting.ts @@ -41,7 +41,10 @@ export function earlyReadVarSymbols( if (sf.isDeclarationFile) continue; const bindings = new Map(); const names = new Set(); + const functionNames = new Set(); ts.walkPreorder(sf, (node) => { + if (ts.isFunctionDeclaration(node) && node.name !== undefined) + functionNames.add(node.name.text); if (!ts.isVariableDeclarationList(node)) return undefined; if ((node.flags & (ts.NodeFlags.Let | ts.NodeFlags.Const | ts.NodeFlags.Using)) !== 0) return undefined; @@ -66,7 +69,7 @@ export function earlyReadVarSymbols( }); if (bindings.size === 0) continue; const refs = referencesByName(lowerer, sf, names); - const analysis = new ScopeAnalysis(lowerer, sf); + const analysis = new ScopeAnalysis(lowerer, sf, functionNames); for (const [symbol, binding] of bindings) { const settle = analysis.settleIndex(binding.scope, symbol); const early = (refs.get(symbol) ?? []).some( @@ -151,6 +154,31 @@ function referencesByName( if (ts.isIdentifier(node) && names.has(node.text)) idents.push(node); return undefined; }); + return referencesBySymbol(lowerer, idents); +} + +/** The identifiers of `sf` named in `names`, by name, each list in source + * order. */ +function identifiersByName( + sf: ts.SourceFile, + names: ReadonlySet, +): Map { + const out = new Map(); + ts.walkPreorder(sf, (node) => { + if (!ts.isIdentifier(node) || !names.has(node.text)) return undefined; + const list = out.get(node.text); + if (list) list.push(node); + else out.set(node.text, [node]); + return undefined; + }); + return out; +} + +/** `idents` by resolved symbol, each list in the order of `idents`. */ +function referencesBySymbol( + lowerer: Lowerer, + idents: readonly ts.Identifier[], +): Map { lowerer.checker.prefetchSymbolNodesExact(idents); const out = new Map(); for (const id of idents) { @@ -173,10 +201,14 @@ class ScopeAnalysis { * its own body names is never called through that name). */ private readonly functionMemo = new Map(); private readonly functionRefs = new Map(); + /** The file's identifiers named like one of its function declarations, + * by name, collected in one walk on first use. */ + private functionNameIdents: Map | null = null; constructor( private readonly lowerer: Lowerer, private readonly sf: ts.SourceFile, + private readonly functionNames: ReadonlySet, ) { this.js = isJsSourceFile(sf); } @@ -263,12 +295,19 @@ class ScopeAnalysis { const refs = symbol === undefined ? [] - : (referencesByName(this.lowerer, this.sf, new Set([name.text])).get(symbol) ?? []).filter( - (ref) => ref !== name, - ); + : ( + referencesBySymbol(this.lowerer, this.identifiersNamed(name.text)).get(symbol) ?? [] + ).filter((ref) => ref !== name); this.functionRefs.set(fn, refs); return refs; } + + /** The identifiers named `text`, the name of a function declaration of + * the file. */ + private identifiersNamed(text: string): readonly ts.Identifier[] { + this.functionNameIdents ??= identifiersByName(this.sf, this.functionNames); + return this.functionNameIdents.get(text) ?? []; + } } /** A loop statement that settles the binding settles the references in From a7a42640dcaf6a9eb17fb1d5d4abe4bd4ce791ea Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 17:17:15 -0500 Subject: [PATCH 35/67] Stop the type-parameter walk at recursive aliases in signatures mentionsTypeParameter walked union constituents and type arguments without remembering the types on its path. A parameter typed with an alias that reaches itself through its own type arguments, such as `type Tree = string | Tree[]` in `function f(x: T, ...trees: Tree[])`, recursed until the compiler ran out of stack. The walk now skips a type it has already entered; a type parameter reached through any other path is still found. --- .../src/frontend/lowering/call-signatures.ts | 12 ++++++-- ...-recursive-alias-generic-signature.ts.json | 6 ++++ .../6823-recursive-alias-generic-signature.ts | 29 +++++++++++++++++++ ...-recursive-alias-generic-signature.ts.json | 1 + 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6823-recursive-alias-generic-signature.ts.json create mode 100644 tests/corpus/6823-recursive-alias-generic-signature.ts create mode 100644 tests/harness/corpus-costs/6823-recursive-alias-generic-signature.ts.json diff --git a/packages/compiler/src/frontend/lowering/call-signatures.ts b/packages/compiler/src/frontend/lowering/call-signatures.ts index 4e1ece0e9..34343ad27 100644 --- a/packages/compiler/src/frontend/lowering/call-signatures.ts +++ b/packages/compiler/src/frontend/lowering/call-signatures.ts @@ -546,9 +546,17 @@ export function paramShapes( /** A declared type that is (or is a union over) a bare type parameter * or an instantiation of a generic alias/interface over type arguments. */ -function mentionsTypeParameter(lowerer: Lowerer, t: ts.Type): boolean { +function mentionsTypeParameter( + lowerer: Lowerer, + t: ts.Type, + seen: Set = new Set(), +): boolean { if (t.flags & ts.TypeFlags.TypeParameter) return true; - const mentions = (part: ts.Type): boolean => mentionsTypeParameter(lowerer, part); + // A recursive alias (`type Child = string | Child[]`) reaches itself + // through its own type arguments; a type already on the walk adds nothing. + if (seen.has(t)) return false; + seen.add(t); + const mentions = (part: ts.Type): boolean => mentionsTypeParameter(lowerer, part, seen); if (t.isUnionType()) return ts.constituentTypes(t).some(mentions); if (t.getAliasTypeArguments().some(mentions)) return true; return ( diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6823-recursive-alias-generic-signature.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6823-recursive-alias-generic-signature.ts.json new file mode 100644 index 000000000..3185f3606 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6823-recursive-alias-generic-signature.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6823-recursive-alias-generic-signature.ts" + ], + "diags": [] +} diff --git a/tests/corpus/6823-recursive-alias-generic-signature.ts b/tests/corpus/6823-recursive-alias-generic-signature.ts new file mode 100644 index 000000000..1019371d7 --- /dev/null +++ b/tests/corpus/6823-recursive-alias-generic-signature.ts @@ -0,0 +1,29 @@ +// Generic functions whose parameters use a recursive type alias: the alias +// reaches itself through its own type arguments (`Tree[]` inside `Tree`). +type Tree = string | number | Tree[]; +type Json = null | boolean | number | string | Json[]; + +function flatten(label: T, ...trees: Tree[]): (T | string | number)[] { + const out: (T | string | number)[] = [label]; + const visit = (tree: Tree): void => { + if (Array.isArray(tree)) tree.forEach(visit); + else out.push(tree); + }; + trees.forEach(visit); + return out; +} + +function tagged(key: K, value: Json): { key: K; text: string } { + return { key, text: JSON.stringify(value) }; +} + +function depth(value: T, tree: Tree): [T, number] { + const measure = (node: Tree): number => + Array.isArray(node) ? 1 + Math.max(0, ...node.map(measure)) : 0; + return [value, measure(tree)]; +} + +console.log(flatten("root", "a", [1, ["b", [2]]], []).join(",")); +console.log(flatten(7, [[["deep"]]]).join(",")); +console.log(tagged("config", [1, "two", null, [true, [false]]])); +console.log(depth("x", [[1], [[2, [3]]]]), depth(0, "leaf")); diff --git a/tests/harness/corpus-costs/6823-recursive-alias-generic-signature.ts.json b/tests/harness/corpus-costs/6823-recursive-alias-generic-signature.ts.json new file mode 100644 index 000000000..cf7a32433 --- /dev/null +++ b/tests/harness/corpus-costs/6823-recursive-alias-generic-signature.ts.json @@ -0,0 +1 @@ +{ "plain": 2300, "san": 30000 } From 8061060aff85fb8835be6060d36737a9a58e98ab Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 17:20:50 -0500 Subject: [PATCH 36/67] Lower a Buffer view of a dynamic typed-array value --- .../src/frontend/lowering/containers/bytes.ts | 3 +- ...2-js-buffer-view-of-declared-field.js.json | 6 +++ .../6942-js-buffer-view-of-declared-field.js | 39 +++++++++++++++++++ ...2-js-buffer-view-of-declared-field.js.json | 1 + 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6942-js-buffer-view-of-declared-field.js.json create mode 100644 tests/corpus/6942-js-buffer-view-of-declared-field.js create mode 100644 tests/harness/corpus-costs/6942-js-buffer-view-of-declared-field.js.json diff --git a/packages/compiler/src/frontend/lowering/containers/bytes.ts b/packages/compiler/src/frontend/lowering/containers/bytes.ts index 438c5e6c6..bf9821d31 100644 --- a/packages/compiler/src/frontend/lowering/containers/bytes.ts +++ b/packages/compiler/src/frontend/lowering/containers/bytes.ts @@ -1972,7 +1972,8 @@ function lowerBufferStaticValue( const srcNode = args[0].expression; const srcIr = lowerer.mapTypeOf(lowerer.typeOf(srcNode)); if (srcIr?.kind === "bytes") { - const receiver = lowerer.lowerExpr(srcNode); + // A JavaScript field can hold the typed array as a dynamic value. + const receiver = lowerer.lowerExprExpecting(srcNode, srcIr); const idxArgs = args.slice(1).map((a) => lowerer.lowerExprExpecting(a, F64)); return { kind: "bytesIntrinsic", diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6942-js-buffer-view-of-declared-field.js.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6942-js-buffer-view-of-declared-field.js.json new file mode 100644 index 000000000..f23e96cb8 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6942-js-buffer-view-of-declared-field.js.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6942-js-buffer-view-of-declared-field.js" + ], + "diags": [] +} diff --git a/tests/corpus/6942-js-buffer-view-of-declared-field.js b/tests/corpus/6942-js-buffer-view-of-declared-field.js new file mode 100644 index 000000000..521e39b76 --- /dev/null +++ b/tests/corpus/6942-js-buffer-view-of-declared-field.js @@ -0,0 +1,39 @@ +// A Buffer view over a typed array that a JavaScript class keeps in a +// declared field without an initializer: the field holds a dynamic value, +// and the view shares the array's storage. + +class Units { + text; + chars; + constructor(text, onDemand) { + this.text = text; + if (onDemand) this.chars = new Uint16Array(text.length + 4); + else this.chars = toUnits(text); + } + load(from, to) { + Buffer.from(this.chars.buffer, from * 2, (to - from) * 2).write( + this.text.substring(from, to), + "utf16le", + ); + return this.chars[from]; + } +} + +function toUnits(text) { + const units = new Uint16Array(text.length + 4); + for (let i = 0; i < text.length; i++) units[i] = text.charCodeAt(i); + return units; +} + +const lazy = new Units("hello", true); +console.log(lazy.chars[1], lazy.load(1, 3), lazy.chars[2], lazy.chars[3]); +const view = Buffer.from(lazy.chars.buffer, 2, 4); +view[0] = 0x41; +console.log(lazy.chars[1], view.length, view.toString("utf16le")); +const eager = new Units("yo", false); +console.log(eager.chars[0], eager.load(0, 2)); +try { + Buffer.from(lazy.chars.buffer, 64, 2); +} catch (error) { + console.log(error.name); +} diff --git a/tests/harness/corpus-costs/6942-js-buffer-view-of-declared-field.js.json b/tests/harness/corpus-costs/6942-js-buffer-view-of-declared-field.js.json new file mode 100644 index 000000000..be69de5f7 --- /dev/null +++ b/tests/harness/corpus-costs/6942-js-buffer-view-of-declared-field.js.json @@ -0,0 +1 @@ +{ "plain": 2200, "san": 2900 } From 095072594971defdb9c82d78c8fcd993395758d1 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 17:24:17 -0500 Subject: [PATCH 37/67] Refuse elements on Array.prototype --- packages/runtime/src/scr_dyn.h | 5 +++ packages/runtime/src/scr_dyn_invoke.c | 4 +++ packages/runtime/src/scr_json.c | 12 +++++++ tests/harness/errors.test.ts | 50 +++++++++++++++++++++++++++ 4 files changed, 71 insertions(+) diff --git a/packages/runtime/src/scr_dyn.h b/packages/runtime/src/scr_dyn.h index 0783ff705..d36c0d263 100644 --- a/packages/runtime/src/scr_dyn.h +++ b/packages/runtime/src/scr_dyn.h @@ -997,6 +997,11 @@ ScrDyn *scr_dyn_get_own_property_descriptor(ScrDyn *target, ScrDyn *key); ScrDyn *scr_dyn_array_proto_call(ScrDyn *target, ScrStr *method, ScrDyn *args); ScrDyn *scr_dyn_array_prototype(void); /* +1, installs native method adapters */ ScrDyn *scr_dyn_array_prototype_base(void); /* +1, shared native array identity */ +/* Native arrays read their holes as undefined without consulting + * Array.prototype, so storing an element on Array.prototype raises SC2020. + * True (with the error pending) when `recv` is Array.prototype. */ +bool scr_dyn_array_prototype_element_fence(const ScrDyn *recv); +bool scr_dyn_is_array_prototype(const ScrDyn *d); /* The checked-dynamic keyed WRITE (`h.k = v` on a dyn receiver): OBJ sets * the member (JS: later writes win, insertion order); undefined/null and * non-object kinds throw Node's catchable TypeErrors (strict-mode diff --git a/packages/runtime/src/scr_dyn_invoke.c b/packages/runtime/src/scr_dyn_invoke.c index ffe1d0330..2a010f213 100644 --- a/packages/runtime/src/scr_dyn_invoke.c +++ b/packages/runtime/src/scr_dyn_invoke.c @@ -811,6 +811,10 @@ static ScrDyn *scr_dyn_invoke_impl( if (recv->kind == SCR_DYN_HANDLE) { return scr_dynh_dispatch(recv, method, args, argc, what); } + if (scr_dyn_is_array_prototype(recv) && dyn_arr_proto_mutates(method)) { + scr_dyn_array_prototype_element_fence(recv); + return NULL; + } if (recv->kind == SCR_DYN_PROXY) { diff --git a/packages/runtime/src/scr_json.c b/packages/runtime/src/scr_json.c index adcc96560..9fae63ba7 100644 --- a/packages/runtime/src/scr_json.c +++ b/packages/runtime/src/scr_json.c @@ -674,6 +674,17 @@ void scr_dyn_from_leave(void) { */ static SCR_TL ScrDyn *scr_builtin_array_prototype; +bool scr_dyn_is_array_prototype(const ScrDyn *d) { + return d && d == scr_builtin_array_prototype; +} + +bool scr_dyn_array_prototype_element_fence(const ScrDyn *recv) { + if (!scr_dyn_is_array_prototype(recv)) return false; + static const char message[] = "Elements on Array.prototype are not supported yet"; + scr_throw_error_msg_code(SCR_ERR_ERROR, message, sizeof message - 1, "SC2020"); + return true; +} + /* Property names are immutable and often repeated across simultaneously live * objects. Entries own references to their bytes; this fixed weak table owns * none. Collisions only reduce sharing, and the final release removes a weak @@ -8527,6 +8538,7 @@ void scr_dyn_key_set(ScrDyn *recv, ScrStr *key, ScrDyn *value) { else idx = idx * 10 + (size_t)(key->data[i] - '0'); } if (is_index && idx < 4294967295ULL) { + if (scr_dyn_array_prototype_element_fence(recv)) return; if (recv->v.arr.frozen && idx < recv->v.arr.len) { static const char message[] = "Cannot assign to read only property"; scr_throw_error_msg(SCR_ERR_TYPE, message, sizeof message - 1); diff --git a/tests/harness/errors.test.ts b/tests/harness/errors.test.ts index e1e2bb96c..8af6998ca 100644 --- a/tests/harness/errors.test.ts +++ b/tests/harness/errors.test.ts @@ -1727,3 +1727,53 @@ console.log(util.inspect(extra)); ); }); }); + +describe("elements on Array.prototype", () => { + // Holes of native arrays read undefined without consulting + // Array.prototype, so storing an element there refuses instead of + // letting later hole reads diverge from Node. Named members stay + // writable. + test("an index write is a named fence (TS lane)", async () => { + const r = await compileAndRun( + "array-prototype-element-ts", + `const proto = Array.prototype as unknown as Record; +proto.label = "named"; +console.log(proto.label); +(Array.prototype as unknown as Record)[1] = "proto"; +console.log("unreachable"); +`, + ); + expect(r.exitCode).toBe(1); + expect(r.stdout).toBe("named\n"); + expect(r.stderr).toMatch( + /^Uncaught Error: Elements on Array\.prototype are not supported yet \[SC2020[^\]]*\]\n$/, + ); + }); + + test("an index write and a mutating method are named fences (JS lane)", async () => { + const write = await compileAndRun( + "array-prototype-element-js", + `Array.prototype[0] = "proto"; +console.log("unreachable"); +`, + "cjs", + ); + expect(write.exitCode).toBe(1); + expect(write.stdout).toBe(""); + expect(write.stderr).toMatch( + /^Uncaught Error: Elements on Array\.prototype are not supported yet \[SC2020[^\]]*\]\n$/, + ); + const push = await compileAndRun( + "array-prototype-push-js", + `Array.prototype.push("proto"); +console.log("unreachable"); +`, + "cjs", + ); + expect(push.exitCode).toBe(1); + expect(push.stdout).toBe(""); + expect(push.stderr).toMatch( + /^Uncaught Error: Elements on Array\.prototype are not supported yet \[SC2020[^\]]*\]\n$/, + ); + }); +}); From 79a7120e5fcf38505150488289fa36cb2765842a Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 17:31:02 -0500 Subject: [PATCH 38/67] Speed up JSON.parse and JSON.stringify scanning - The number and whitespace scanners keep the cursor in locals and write p->pos once: the runtime builds without strict aliasing, so a loop on p->pos stored it after every byte. - Typed arrays gather parsed elements in a 32-slot run and append them with scr_arr_push_many instead of one push per element. - The string scan shared by parse and stringify takes the index of the first quote, backslash or control byte from the marked word on little-endian hosts, and checks the last 1-7 bytes of a string as one word, so a short plain string needs no byte loop. - Typed record parsing computes once per record schema and parse which field names hold no byte JSON would escape, instead of testing the name on every direct key match. - The mantissa converts to double through int64, and the positioned error report stays out of line. --- packages/runtime/src/scr_json.c | 196 ++++++++++++++++++++++---------- 1 file changed, 139 insertions(+), 57 deletions(-) diff --git a/packages/runtime/src/scr_json.c b/packages/runtime/src/scr_json.c index 9fae63ba7..89c098fa6 100644 --- a/packages/runtime/src/scr_json.c +++ b/packages/runtime/src/scr_json.c @@ -311,9 +311,10 @@ void scr_jb_put_f64(ScrJsonBuf *b, double v) { /* Find the next quote, backslash or control byte. memcpy keeps the word * loads unaligned-safe, and the length guard never reads past the input. - * The masks only decide whether to inspect a word byte by byte: borrow - * propagation may mark extra lanes, so it must not determine a byte index. - * High UTF-8 bytes are ordinary data, independent of host byte order. */ + * Borrow propagation can mark extra lanes, but only above a lane that + * holds a special byte, so on little-endian hosts the lowest marked lane + * is the answer; other hosts inspect the marked word byte by byte. High + * UTF-8 bytes are ordinary data. */ static size_t scr_json_plain_bytes(const char *data, size_t len) { const uint64_t ones = UINT64_C(0x0101010101010101); const uint64_t high = UINT64_C(0x8080808080808080); @@ -326,9 +327,41 @@ static size_t scr_json_plain_bytes(const char *data, size_t len) { uint64_t special = ((quotes - ones) & ~quotes) | ((slashes - ones) & ~slashes) | ((word - ones * 0x20) & ~word); - if (special & high) break; + special &= high; + if (special) { +#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + /* A borrow only marks lanes above a lane that really matched, so + * the lowest marked lane is the first special byte. */ + return i + (size_t)__builtin_ctzll(special) / 8; +#else + break; +#endif + } i += sizeof word; } + /* The last 1..7 bytes as one word: two overlapping 4-byte loads, or the + * first, middle and last byte of a shorter rest with the remaining lanes + * filled with a plain byte. A plain rest (the common case: most strings + * are short) ends the scan; otherwise the bytes are inspected one by one. */ + size_t rest = len - i; + if (rest) { + uint64_t word; + if (rest >= 4) { + uint32_t lo, hi; + memcpy(&lo, data + i, sizeof lo); + memcpy(&hi, data + len - 4, sizeof hi); + word = (uint64_t)lo | (uint64_t)hi << 32; + } else { + word = (uint64_t)(unsigned char)data[i] | (uint64_t)(unsigned char)data[i + rest / 2] << 8 | + (uint64_t)(unsigned char)data[len - 1] << 16 | UINT64_C(0x4141414141000000); + } + uint64_t quotes = word ^ (ones * '"'); + uint64_t slashes = word ^ (ones * '\\'); + uint64_t special = ((quotes - ones) & ~quotes) | + ((slashes - ones) & ~slashes) | + ((word - ones * 0x20) & ~word); + if (!(special & high)) return len; + } while (i < len) { unsigned char c = (unsigned char)data[i]; if (c < 0x20 || c == '"' || c == '\\') break; @@ -9008,6 +9041,11 @@ typedef struct { ScrDynRegion *region; /* tags completed containers (ScrDynRegion); may be NULL */ struct ScrJsonShape *shapes; /* key-sequence transitions (scr_json_object) */ uint32_t nshapes, shape_cap; + /* Schema records whose plain field names are known (scr_jschema_plain): + * bit i of the mask is set when field i's name holds no byte JSON text + * would escape. */ + const struct ScrJsonSchema *plain_schema[4]; + uint64_t plain_mask[4]; } ScrJsonP; static void scr_json_throw(const ScrJsonP *p, const char *msg) { @@ -9015,7 +9053,10 @@ static void scr_json_throw(const ScrJsonP *p, const char *msg) { scr_throw_error_msg(SCR_ERR_SYNTAX, msg, strlen(msg)); } -static void scr_json_throw_pos(const ScrJsonP *p, const char *what, size_t pos) { +/* Errors stay out of line so the scanners that report them keep their + * registers for the common path. */ +static __attribute__((noinline, cold)) void scr_json_throw_pos(const ScrJsonP *p, const char *what, + size_t pos) { if (p->quiet) return; char buf[128]; int n = snprintf(buf, sizeof buf, "%s in JSON at position %zu", what, pos); @@ -9036,11 +9077,15 @@ static void scr_json_throw_token(const ScrJsonP *p) { } static void scr_json_ws(ScrJsonP *p) { - while (p->pos < p->len) { - char c = p->s[p->pos]; - if (c == ' ' || c == '\t' || c == '\n' || c == '\r') p->pos++; + /* A local cursor, as in scr_json_number_value. */ + const char *s = p->s; + size_t pos = p->pos; + while (pos < p->len) { + char c = s[pos]; + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') pos++; else break; } + p->pos = pos; } /* Append the WTF-8 encoding of a code point or lone surrogate unit; a low @@ -9191,7 +9236,14 @@ static const double scr_json_pow10[23] = { * (thrown unless quiet). Shared by the dyn tree and the schema parser so * both produce bit-identical values. */ static bool scr_json_number_value(ScrJsonP *p, double *out) { - size_t start = p->pos; + /* The cursor and text stay in locals: the runtime builds without strict + * aliasing, so a byte read through p->s could alias p->pos, and a loop + * on p->pos would store it on every digit. p->pos is written once, when + * the token ends. */ + const char *s = p->s; + const size_t len = p->len; + const size_t start = p->pos; + size_t pos = start; /* Grammar validation and value accumulation in one pass. Clinger's fast * path: with at most 15 significant digits the mantissa is exact in a * double, and scaling by an exact power of ten (|exp| <= 22) rounds @@ -9200,35 +9252,37 @@ static bool scr_json_number_value(ScrJsonP *p, double *out) { int ndig = 0; /* significant digits folded into mant */ int exp10 = 0; /* decimal exponent (fraction shift + explicit exponent) */ bool neg = false, precise = true; - if (p->s[p->pos] == '-') { + if (s[pos] == '-') { neg = true; - p->pos++; - if (p->pos >= p->len || p->s[p->pos] < '0' || p->s[p->pos] > '9') { - scr_json_throw_pos(p, "No number after minus sign", p->pos); + pos++; + if (pos >= len || s[pos] < '0' || s[pos] > '9') { + p->pos = pos; + scr_json_throw_pos(p, "No number after minus sign", pos); return false; } } - if (p->s[p->pos] == '0') { - p->pos++; + if (s[pos] == '0') { + pos++; } else { - while (p->pos < p->len && p->s[p->pos] >= '0' && p->s[p->pos] <= '9') { + while (pos < len && s[pos] >= '0' && s[pos] <= '9') { if (ndig < 15) { - mant = mant * 10 + (uint64_t)(p->s[p->pos] - '0'); + mant = mant * 10 + (uint64_t)(s[pos] - '0'); ndig++; } else { precise = false; } - p->pos++; + pos++; } } - if (p->pos < p->len && p->s[p->pos] == '.') { - p->pos++; - if (p->pos >= p->len || p->s[p->pos] < '0' || p->s[p->pos] > '9') { - scr_json_throw_pos(p, "Unterminated fractional number", p->pos); + if (pos < len && s[pos] == '.') { + pos++; + if (pos >= len || s[pos] < '0' || s[pos] > '9') { + p->pos = pos; + scr_json_throw_pos(p, "Unterminated fractional number", pos); return false; } - while (p->pos < p->len && p->s[p->pos] >= '0' && p->s[p->pos] <= '9') { - unsigned digit = (unsigned)(p->s[p->pos] - '0'); + while (pos < len && s[pos] >= '0' && s[pos] <= '9') { + unsigned digit = (unsigned)(s[pos] - '0'); if (mant == 0 && digit == 0) { exp10--; /* leading fractional zeros scale without a digit */ } else if (ndig < 15) { @@ -9238,29 +9292,33 @@ static bool scr_json_number_value(ScrJsonP *p, double *out) { } else { precise = false; } - p->pos++; + pos++; } } - if (p->pos < p->len && (p->s[p->pos] == 'e' || p->s[p->pos] == 'E')) { - p->pos++; + if (pos < len && (s[pos] == 'e' || s[pos] == 'E')) { + pos++; bool eneg = false; - if (p->pos < p->len && (p->s[p->pos] == '+' || p->s[p->pos] == '-')) { - eneg = p->s[p->pos] == '-'; - p->pos++; + if (pos < len && (s[pos] == '+' || s[pos] == '-')) { + eneg = s[pos] == '-'; + pos++; } - if (p->pos >= p->len || p->s[p->pos] < '0' || p->s[p->pos] > '9') { - scr_json_throw_pos(p, "Exponent part is missing a number", p->pos); + if (pos >= len || s[pos] < '0' || s[pos] > '9') { + p->pos = pos; + scr_json_throw_pos(p, "Exponent part is missing a number", pos); return false; } int ev = 0; - while (p->pos < p->len && p->s[p->pos] >= '0' && p->s[p->pos] <= '9') { - if (ev < 100000) ev = ev * 10 + (p->s[p->pos] - '0'); - p->pos++; + while (pos < len && s[pos] >= '0' && s[pos] <= '9') { + if (ev < 100000) ev = ev * 10 + (s[pos] - '0'); + pos++; } exp10 += eneg ? -ev : ev; } + p->pos = pos; if (precise && exp10 >= -22 && exp10 <= 22) { - double v = (double)mant; /* exact: mant < 10^15 < 2^53 */ + /* exact: mant < 10^15 < 2^53; the signed conversion is one + * instruction on x86-64, the unsigned one a sequence */ + double v = (double)(int64_t)mant; if (exp10 > 0) v *= scr_json_pow10[exp10]; else if (exp10 < 0) v /= scr_json_pow10[-exp10]; *out = neg ? -v : v; @@ -9270,7 +9328,7 @@ static bool scr_json_number_value(ScrJsonP *p, double *out) { * grammar above is a strict subset of what strtod accepts). The ScrStr * data is NUL-terminated, and strtod stops at the first non-number char, * so parsing from `start` reads exactly the validated token. */ - *out = strtod(p->s + start, NULL); + *out = strtod(s + start, NULL); return true; } @@ -9867,26 +9925,38 @@ static __attribute__((noinline)) bool scr_jschema_absent(const ScrJsonSchema *s, return true; } -/* The quoted key at p->pos when it is exactly `f`'s name, written without - * escapes: the bytes consumed (name length + 2), else 0. Names of more - * than eight bytes, and names holding a byte JSON text would escape, - * take the general key scan. */ +/* Bit i set when field i's name (at most eight bytes) holds no quote, + * backslash or control byte, so text that spells it unescaped is exactly + * that key. Names are schema constants: each record schema computes its + * mask once per parse, in a four-entry table. */ +static uint64_t scr_jschema_plain(ScrJsonP *p, const ScrJsonSchema *s) { + size_t slot = ((uintptr_t)s >> 4) & 3; + if (p->plain_schema[slot] == s) return p->plain_mask[slot]; + uint64_t mask = 0; + for (size_t i = 0; i < s->nfields && i < 64; i++) { + const ScrJsonSchemaField *f = &s->fields[i]; + bool plain = f->name_len > 0 && f->name_len <= 8; + for (size_t k = 0; plain && k < f->name_len; k++) { + unsigned char c = (unsigned char)f->name[k]; + plain = c >= 0x20 && c != '"' && c != '\\'; + } + if (plain) mask |= (uint64_t)1 << i; + } + p->plain_schema[slot] = s; + p->plain_mask[slot] = mask; + return mask; +} + +/* The quoted key at p->pos when it is exactly `f`'s name, a plain name of + * at most eight bytes (scr_jschema_plain): the bytes consumed (name + * length + 2), else 0. Other names take the general key scan. */ static inline size_t scr_jschema_key_direct(const ScrJsonP *p, const ScrJsonSchemaField *f) { size_t len = f->name_len; size_t at = p->pos + 1; - if (len == 0 || len > 8 || len >= p->len - at) return 0; + if (len >= p->len - at) return 0; const char *text = p->s + at; - uint64_t word = scr_key_short_word(f->name, len); - if (text[len] != '"' || scr_key_short_word(text, len) != word) return 0; - /* The packed word holds every name byte (lengths one to three use its - * low three bytes). A quote, backslash or control byte sends the key to - * the general scan, as in scr_json_plain_bytes. */ - const uint64_t ones = UINT64_C(0x0101010101010101), high = UINT64_C(0x8080808080808080); - uint64_t quotes = word ^ (ones * '"'), slashes = word ^ (ones * '\\'); - uint64_t special = ((quotes - ones) & ~quotes) | ((slashes - ones) & ~slashes) | - ((word - ones * 0x20) & ~word); - uint64_t bytes = len >= 4 ? ~UINT64_C(0) : UINT64_C(0xffffff); - return (special & high & bytes) ? 0 : len + 2; + if (text[len] != '"' || scr_key_short_word(text, len) != scr_key_short_word(f->name, len)) return 0; + return len + 2; } /* An undeclared member of a record with an index signature, after its @@ -10014,6 +10084,7 @@ static bool scr_jschema_record(ScrJsonP *p, const ScrJsonSchema *s, ScrJsonSlot const uint64_t all = n == 64 ? ~(uint64_t)0 : (((uint64_t)1 << n) - 1); uint64_t seen = 0; size_t guess = 0; + const uint64_t plain = scr_jschema_plain(p, s); scr_json_ws(p); if (p->pos < p->len && p->s[p->pos] == '}') { p->pos++; @@ -10025,7 +10096,8 @@ static bool scr_jschema_record(ScrJsonP *p, const ScrJsonSchema *s, ScrJsonSlot /* Members usually arrive in declaration order: try the successor of * the previous match, directly against the text, before scanning. */ size_t idx = n; - size_t direct = guess < n ? scr_jschema_key_direct(p, &s->fields[guess]) : 0; + size_t direct = + guess < n && (plain >> guess & 1) ? scr_jschema_key_direct(p, &s->fields[guess]) : 0; if (direct) { idx = guess; p->pos += direct; @@ -10104,13 +10176,21 @@ static bool scr_jschema_array(ScrJsonP *p, const ScrJsonSchema *s, ScrJsonSlot * out->ptr = arr; return true; } + /* Elements gather in a local run and append in bulk (scr_arr_push_many, + * which moves references in as scr_arr_push_ref does). */ + uint64_t run[32]; + size_t n = 0; for (;;) { ScrJsonSlot v; if (!scr_jschema_member(p, elem, &v)) goto fail; switch (elem->kind) { - case SCR_JSCHEMA_F64: scr_arr_push_f64(arr, v.f); break; - case SCR_JSCHEMA_BOOL: scr_arr_push_bool(arr, v.b); break; - default: scr_arr_push_ref(arr, v.ptr); break; /* moves in */ + case SCR_JSCHEMA_F64: memcpy(&run[n++], &v.f, sizeof v.f); break; + case SCR_JSCHEMA_BOOL: run[n++] = v.b ? 1 : 0; break; + default: run[n++] = (uint64_t)(uintptr_t)v.ptr; break; + } + if (n == sizeof run / sizeof run[0]) { + scr_arr_push_many(arr, n, run); + n = 0; } scr_json_ws(p); if (p->pos >= p->len) goto fail; @@ -10120,10 +10200,12 @@ static bool scr_jschema_array(ScrJsonP *p, const ScrJsonSchema *s, ScrJsonSlot * } if (p->s[p->pos] != ']') goto fail; p->pos++; + scr_arr_push_many(arr, n, run); out->ptr = arr; return true; } fail: + scr_arr_push_many(arr, n, run); /* the array releases what it holds */ s->release(arr); return false; } From dfdc610c59edeb89375e3a02789d51f7d7b7269a Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 17:36:58 -0500 Subject: [PATCH 39/67] Replace every match of a block in one-character replace chains Chains of global one-character replacements (the HTML-escape idiom) run as one scr_str_replace_chars call. It searched for the next match eight bytes at a time and started the search over after each replacement. It now reads 16-byte blocks with SSE2 or NEON (8-byte words elsewhere on little-endian hosts) and replaces every match of a block before reading the next one. The table of characters and replacements is kept for the next call with the same immortal operands, which are the literals the compiler passes, instead of being rebuilt from the replacement text on every call. --- .../corpus/6960-replace-char-blocks.ts.json | 6 + packages/runtime/src/scr_string.c | 250 +++++++++++++----- tests/corpus/6960-replace-char-blocks.ts | 63 +++++ .../6960-replace-char-blocks.ts.json | 1 + 4 files changed, 249 insertions(+), 71 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6960-replace-char-blocks.ts.json create mode 100644 tests/corpus/6960-replace-char-blocks.ts create mode 100644 tests/harness/corpus-costs/6960-replace-char-blocks.ts.json diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6960-replace-char-blocks.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6960-replace-char-blocks.ts.json new file mode 100644 index 000000000..ccc217b7a --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6960-replace-char-blocks.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6960-replace-char-blocks.ts" + ], + "diags": [] +} diff --git a/packages/runtime/src/scr_string.c b/packages/runtime/src/scr_string.c index 9b21dd722..58272cf67 100644 --- a/packages/runtime/src/scr_string.c +++ b/packages/runtime/src/scr_string.c @@ -2691,90 +2691,198 @@ ScrStr *scr_str_replace_bytes(ScrStr *s, const char *pat, size_t plen, ScrStr *r return out; } -/* The first byte at or after `i` that is one of the replaced characters - * (`which` maps them to k + 1), or len. Up to eight characters are tested - * eight bytes at a time. */ -static size_t scr_replace_chars_next(const char *p, size_t i, size_t len, const uint8_t *which, - const char *chars, size_t n) { - if (n <= 8) { - const uint64_t ones = UINT64_C(0x0101010101010101); - const uint64_t highs = UINT64_C(0x8080808080808080); - for (; len - i >= 8; i += 8) { - uint64_t w; - memcpy(&w, p + i, 8); - uint64_t hit = 0; - for (size_t k = 0; k < n; k++) { - uint64_t x = w ^ (ones * (unsigned char)chars[k]); - hit |= (x - ones) & ~x & highs; - } - if (hit) break; - } +/* replaceAll of single characters (scr_str_replace_chars): a mask of the + * bytes in one block of SCR_RC_LANES that equal a replaced character, with + * SCR_RC_BITS bits per byte, lowest byte first. Every flagged byte is + * confirmed against the character table, so the SWAR form may flag extra + * bytes above a true match (its zero-byte test has no false negatives). + * Without a vector unit or a little-endian word, the byte loop alone. */ +#if defined(__SSE2__) +#define SCR_RC_LANES 16 +#define SCR_RC_BITS 1 +typedef __m128i ScrRcWant; +static inline ScrRcWant scr_rc_want(unsigned char c) { return _mm_set1_epi8((char)c); } +static inline uint64_t scr_rc_mask(const char *p, const ScrRcWant *want, size_t n) { + __m128i v = _mm_loadu_si128((const __m128i *)p); + __m128i eq = _mm_cmpeq_epi8(v, want[0]); + for (size_t k = 1; k < n; k++) eq = _mm_or_si128(eq, _mm_cmpeq_epi8(v, want[k])); + return (uint64_t)(uint32_t)_mm_movemask_epi8(eq); +} +#elif defined(__ARM_NEON) && defined(__aarch64__) +#define SCR_RC_LANES 16 +#define SCR_RC_BITS 4 +typedef uint8x16_t ScrRcWant; +static inline ScrRcWant scr_rc_want(unsigned char c) { return vdupq_n_u8(c); } +static inline uint64_t scr_rc_mask(const char *p, const ScrRcWant *want, size_t n) { + uint8x16_t v = vld1q_u8((const uint8_t *)p); + uint8x16_t eq = vceqq_u8(v, want[0]); + for (size_t k = 1; k < n; k++) eq = vorrq_u8(eq, vceqq_u8(v, want[k])); + /* Narrowing each 16-bit pair by 4 leaves one nibble per byte. */ + return vget_lane_u64(vreinterpret_u64_u8(vshrn_n_u16(vreinterpretq_u16_u8(eq), 4)), 0); +} +#elif defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define SCR_RC_LANES 8 +#define SCR_RC_BITS 8 +typedef uint64_t ScrRcWant; +static inline ScrRcWant scr_rc_want(unsigned char c) { return UINT64_C(0x0101010101010101) * c; } +static inline uint64_t scr_rc_mask(const char *p, const ScrRcWant *want, size_t n) { + const uint64_t ones = UINT64_C(0x0101010101010101); + const uint64_t highs = UINT64_C(0x8080808080808080); + uint64_t w, hit = 0; + memcpy(&w, p, 8); + for (size_t k = 0; k < n; k++) { + uint64_t x = w ^ want[k]; + hit |= (x - ones) & ~x & highs; } - for (; i < len; i++) { - unsigned char c = (unsigned char)p[i]; - if (c < 0x80 && which[c]) return i; + return hit; +} +#else +#define SCR_RC_LANES 0 +#endif + +/* The result being built: `from` is where the copied subject resumes. */ +typedef struct { + ScrStr *out; + size_t cap, used, from; + bool joins; +} ScrRcOut; + +/* Copy the subject up to `i`, then `text` in place of the character at + * `i` (or nothing at the end, when i == len). */ +static inline __attribute__((always_inline)) void scr_rc_put(ScrRcOut *o, const char *p, + size_t len, size_t i, + const char *text, size_t text_len) { + size_t gap = i - o->from; + size_t need = gap + text_len; + if (need > o->cap - o->used) { + if (need > SCR_STR_MAX_CAP - o->used) scr_oom(); + size_t rest = o->used + need + (len - o->from); + size_t want = o->cap * 2 < rest ? rest : o->cap * 2; + if (want > SCR_STR_MAX_CAP) want = SCR_STR_MAX_CAP; + o->out->len = o->used; + o->out = scr_str_regrow(o->out, want); + o->cap = want; } - return len; + scr_copy_bytes(o->out->data + o->used, p + o->from, gap); + o->used += gap; + if (i == len) return; + /* As in scr_str_replace_bytes: a seam can complete a surrogate pair. */ + if (text_len) o->joins |= scr_wtf8_joins(o->out->data, o->used, text, text_len); + scr_copy_bytes(o->out->data + o->used, text, text_len); + o->used += text_len; + o->from = i + 1; + o->joins |= (unsigned char)p[o->from] == 0xED; +} + +/* The characters (at most SCR_RC_MAX), their replacements and the tables + * that find them. */ +#define SCR_RC_MAX 16 +typedef struct { + const ScrStr *chars, *texts; /* the immortal operands it was built for, or NULL */ + size_t n; + size_t grow; /* the longest replacement's growth, less one */ + bool ascii; /* every replacement is ASCII */ + uint8_t which[128]; + const char *text[SCR_RC_MAX]; + size_t text_len[SCR_RC_MAX]; +#if SCR_RC_LANES + ScrRcWant want[SCR_RC_MAX]; +#endif +} ScrRcTable; + +/* The compiler passes a chain's characters and replacements as immortal + * literals, so the last chain's table is kept for the next call with the + * same operands. */ +static SCR_TL ScrRcTable scr_rc_last; + +static const ScrRcTable *scr_rc_table(const ScrStr *chars, const ScrStr *texts, + ScrRcTable *local) { + bool keep = chars->rc == SIZE_MAX && texts->rc == SIZE_MAX; + if (keep && scr_rc_last.chars == chars && scr_rc_last.texts == texts) return &scr_rc_last; + ScrRcTable *table = keep ? &scr_rc_last : local; + table->chars = table->texts = NULL; + size_t n = chars->len < SCR_RC_MAX ? chars->len : SCR_RC_MAX; + size_t grow = 0; + bool ascii = true; + memset(table->which, 0, sizeof table->which); + const char *t = texts->data, *t_end = texts->data + texts->len; + for (size_t k = 0; k < n; k++) { + /* The replacements are short: find each terminator, and whether the + * replacement is ASCII, in one pass. */ + const char *stop = t; + unsigned high = 0; + while (stop < t_end && *stop) high |= (unsigned char)*stop++; + table->text[k] = t; + table->text_len[k] = (size_t)(stop - t); + if (table->text_len[k] > grow) grow = table->text_len[k]; + if (high & 0x80) ascii = false; + table->which[(unsigned char)chars->data[k] & 0x7F] = (uint8_t)(k + 1); +#if SCR_RC_LANES + table->want[k] = scr_rc_want((unsigned char)chars->data[k]); +#endif + t = stop < t_end ? stop + 1 : t_end; + } + table->n = n; + table->grow = grow > 1 ? grow - 1 : 0; + table->ascii = ascii; + if (keep) { + table->chars = chars; + table->texts = texts; + } + return table; } ScrStr *scr_str_replace_chars(ScrStr *s, ScrStr *chars, ScrStr *texts) { - enum { MAX = 16 }; - size_t n = chars->len < MAX ? chars->len : MAX; - uint8_t which[128] = { 0 }; - const char *text[MAX]; - size_t text_len[MAX]; - size_t grow = 0; - bool ascii = s->ascii; - const char *t = texts->data, *t_end = texts->data + texts->len; - for (size_t k = 0; k < n; k++) { - const char *stop = memchr(t, '\0', (size_t)(t_end - t)); - if (!stop) stop = t_end; - text[k] = t; - text_len[k] = (size_t)(stop - t); - if (text_len[k] > grow) grow = text_len[k]; - if (ascii && !scr_bytes_all_ascii(t, text_len[k])) ascii = false; - which[(unsigned char)chars->data[k] & 0x7F] = (uint8_t)(k + 1); - t = stop < t_end ? stop + 1 : t_end; - } + ScrRcTable local; + const ScrRcTable *table = scr_rc_table(chars, texts, &local); + size_t n = table->n, grow = table->grow; + const uint8_t *which = table->which; + const char *const *text = table->text; + const size_t *text_len = table->text_len; +#if SCR_RC_LANES + const ScrRcWant *want = table->want; +#endif + bool ascii = s->ascii && table->ascii; const char *p = s->data; size_t len = s->len; - size_t i = scr_replace_chars_next(p, 0, len, which, chars->data, n); - if (i == len) return scr_str_retain(s); - grow = grow > 1 ? grow - 1 : 0; - size_t cap = len + (grow < 64 ? 4 * grow : grow) + 16; - if (cap > SCR_STR_MAX_CAP) cap = SCR_STR_MAX_CAP; - ScrStr *out = scr_str_alloc_raw(0, cap); - cap = out->cap; - size_t used = 0, from = 0; - /* As in scr_str_replace_bytes: a seam can complete a surrogate pair. */ - bool joins = false; - for (;;) { - size_t gap = i - from; - size_t k = i < len ? (size_t)which[(unsigned char)p[i]] - 1 : 0; - size_t need = gap + (i < len ? text_len[k] : 0); - if (need > cap - used) { - if (need > SCR_STR_MAX_CAP - used) scr_oom(); - size_t want = cap * 2 < used + need + (len - from) ? used + need + (len - from) : cap * 2; - if (want > SCR_STR_MAX_CAP) want = SCR_STR_MAX_CAP; - out->len = used; - out = scr_str_regrow(out, want); - cap = want; + ScrRcOut o = { NULL, 0, 0, 0, false }; + size_t i = 0; +#define SCR_RC_HIT(at) \ + do { \ + unsigned char c_ = (unsigned char)p[at]; \ + if (c_ < 0x80 && which[c_]) { \ + if (!o.out) { \ + size_t cap_ = len + (grow < 64 ? 4 * grow : grow) + 16; \ + if (cap_ > SCR_STR_MAX_CAP) cap_ = SCR_STR_MAX_CAP; \ + o.out = scr_str_alloc_raw(0, cap_); \ + o.cap = o.out->cap; \ + } \ + size_t k_ = (size_t)which[c_] - 1; \ + scr_rc_put(&o, p, len, (at), text[k_], text_len[k_]); \ + } \ + } while (0) +#if SCR_RC_LANES + /* Every match of a block is replaced before the next block is read. */ + for (; len - i >= SCR_RC_LANES; i += SCR_RC_LANES) { + uint64_t mask = scr_rc_mask(p + i, want, n); + while (mask) { + size_t lane = (size_t)__builtin_ctzll(mask) / SCR_RC_BITS; + mask &= ~((((uint64_t)1 << SCR_RC_BITS) - 1) << (lane * SCR_RC_BITS)); + SCR_RC_HIT(i + lane); } - scr_copy_bytes(out->data + used, p + from, gap); - used += gap; - if (i == len) break; - if (text_len[k]) joins |= scr_wtf8_joins(out->data, used, text[k], text_len[k]); - scr_copy_bytes(out->data + used, text[k], text_len[k]); - used += text_len[k]; - from = i + 1; - joins |= (unsigned char)p[from] == 0xED; - i = scr_replace_chars_next(p, from, len, which, chars->data, n); } +#endif + for (; i < len; i++) SCR_RC_HIT(i); +#undef SCR_RC_HIT + if (!o.out) return scr_str_retain(s); + scr_rc_put(&o, p, len, len, NULL, 0); + ScrStr *out = o.out; + size_t used = o.used, cap = o.cap; out->len = used; if (cap - used > used / 4 + 64) out = scr_str_regrow(out, used); out->data[used] = '\0'; scr_str_hash_forget(out); - if (joins && scr_wtf8_any()) scr_str_fuse_surrogates(out); + if (o.joins && scr_wtf8_any()) scr_str_fuse_surrogates(out); else if (ascii) scr_str_note_ascii(out); return out; } diff --git a/tests/corpus/6960-replace-char-blocks.ts b/tests/corpus/6960-replace-char-blocks.ts new file mode 100644 index 000000000..af95a8a67 --- /dev/null +++ b/tests/corpus/6960-replace-char-blocks.ts @@ -0,0 +1,63 @@ +// Chains of global one-character replacements over subjects of every +// length up to 70: matches at each position (block edges included), runs +// of matches, non-ASCII neighbors, empty and long replacements, chains of +// up to ten characters, and lone surrogates meeting at a seam. +function escapeHtml(text: string): string { + return text.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); +} +function strip(text: string): string { + return text.replace(/a/g, "").replace(/e/g, "").replace(/i/g, ""); +} +function widen(text: string): string { + return text.replace(/x/g, "[a long replacement text that grows the result]").replace(/y/g, "é"); +} +function many(text: string): string { + return text + .replace(/0/g, "zero") + .replace(/1/g, "one") + .replace(/2/g, "two") + .replace(/3/g, "three") + .replace(/4/g, "four") + .replace(/5/g, "five") + .replace(/6/g, "six") + .replace(/7/g, "seven") + .replace(/8/g, "eight") + .replace(/9/g, "nine"); +} + +let total = 0; +let digest = 0; +function note(text: string): void { + total += text.length; + for (let i = 0; i < text.length; i++) digest = (digest * 31 + text.charCodeAt(i)) % 1000000007; +} +for (let length = 0; length <= 70; length++) { + const base = "abcdefghij".repeat(8).slice(0, length); + note(escapeHtml(base)); + note(strip(base)); + for (let at = 0; at < length; at++) { + const marked = base.slice(0, at) + "&" + base.slice(at + 1); + note(escapeHtml(marked)); + const pair = base.slice(0, at) + '<"' + base.slice(at + 2); + note(escapeHtml(pair)); + note(widen(base.slice(0, at) + "x" + base.slice(at + 1))); + } + note(escapeHtml("&".repeat(length))); + note(escapeHtml('<>"&'.repeat(length).slice(0, length))); + note(many("0123456789".repeat(8).slice(0, length))); + note(strip("aei".repeat(length))); +} +console.log(total, digest); + +console.log(escapeHtml("héllo & wörld <ü> \"ç\" & 中文 ")); +console.log(escapeHtml("ünïcödé ".repeat(5) + "&<>\"" + " ñ".repeat(9))); +console.log(widen("xyxyxy"), widen("é x é y é"), strip("aeiaeiaei"), many("90210")); +console.log(escapeHtml("x".repeat(15) + "&" + "y".repeat(16) + "<" + "z".repeat(17) + ">")); + +// A lone high surrogate before a replaced character and a lone low one in +// its replacement form a pair at the seam. +const high = "\uD83D"; +const joined = (high + "&").replace(/&/g, "\uDE00"); +console.log(joined.length, joined.codePointAt(0), joined === "😀"); +const longJoined = ("abcdefghijklmnop" + high + "&qrstuvwxyz").replace(/&/g, "\uDE00"); +console.log(longJoined.length, longJoined.codePointAt(16), longJoined.slice(16, 18) === "😀"); diff --git a/tests/harness/corpus-costs/6960-replace-char-blocks.ts.json b/tests/harness/corpus-costs/6960-replace-char-blocks.ts.json new file mode 100644 index 000000000..2db0253c4 --- /dev/null +++ b/tests/harness/corpus-costs/6960-replace-char-blocks.ts.json @@ -0,0 +1 @@ +{ "plain": 2744, "san": 5875 } From 4fee347ca0baf7cdcc4c0ac299865ea514e39e71 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 17:57:00 -0500 Subject: [PATCH 40/67] Address review feedback on array named properties --- .../compiler/src/backend/llvm/lib-shared.ts | 1 + .../src/backend/llvm/reference-writes.ts | 1 + .../src/frontend/lowering/lower-stmts.ts | 26 ++++++++++------ .../compiler/src/ir/builtin-signatures.ts | 3 ++ packages/compiler/src/ir/validate.ts | 4 +-- packages/runtime/src/scr_array.c | 31 +++++++++++++++++++ packages/runtime/src/scr_array.h | 7 +++++ packages/runtime/src/scr_json.c | 12 +++++-- .../6987-array-view-named-properties.ts | 17 ++++++++++ 9 files changed, 89 insertions(+), 13 deletions(-) diff --git a/packages/compiler/src/backend/llvm/lib-shared.ts b/packages/compiler/src/backend/llvm/lib-shared.ts index be7a4973b..b7c6b8a21 100644 --- a/packages/compiler/src/backend/llvm/lib-shared.ts +++ b/packages/compiler/src/backend/llvm/lib-shared.ts @@ -1520,6 +1520,7 @@ export const LIB_FN_SYMS: Record = { "regex.groupParseInt": "scr_regex_group_parse_int", "regex.resultProp": "scr_regex_result_prop", "array.namedKeys": "scr_arr_named_keys", + "array.hasNamedKey": "scr_arr_has_named_key", // queueMicrotask's checked-dynamic form (borrowed dyn; a non-function // throws synchronously), the minted setImmediate value, and the // timers/promises immediate — all mark the loop live. diff --git a/packages/compiler/src/backend/llvm/reference-writes.ts b/packages/compiler/src/backend/llvm/reference-writes.ts index c77a5a191..d31f14d12 100644 --- a/packages/compiler/src/backend/llvm/reference-writes.ts +++ b/packages/compiler/src/backend/llvm/reference-writes.ts @@ -106,6 +106,7 @@ const INERT_LIB_CALLS = new Set([ "regex.groupParseInt", "regex.resultProp", "array.namedKeys", + "array.hasNamedKey", "process.cwd", "process.argv", "process.execArgv", diff --git a/packages/compiler/src/frontend/lowering/lower-stmts.ts b/packages/compiler/src/frontend/lowering/lower-stmts.ts index 0960b9d6a..78f2f4189 100644 --- a/packages/compiler/src/frontend/lowering/lower-stmts.ts +++ b/packages/compiler/src/frontend/lowering/lower-stmts.ts @@ -11620,21 +11620,23 @@ function lowerForInArray( loc, }); // Indices first, then the named keys the array had when the loop began. + const namedKey = (): IrExpr => ({ + kind: "arrayGet", + arr: keysRef(), + index: { kind: "bin", op: "-", left: iRef(), right: lenRef(), type: F64, loc }, + type: STRING, + loc, + }); const keyInit: IrExpr = { kind: "ternary", cond: isIndex(), then: { kind: "toString", operand: iRef(), type: STRING, loc }, - else_: { - kind: "arrayGet", - arr: keysRef(), - index: { kind: "bin", op: "-", left: iRef(), right: lenRef(), type: F64, loc }, - type: STRING, - loc, - }, + else_: namedKey(), type: STRING, loc, }; - // An index is visited while it is below the live length and not a hole. + // An index is visited while it is below the live length and not a hole, + // a named key while the array still has it. const visits: IrExpr = { kind: "ternary", cond: isIndex(), @@ -11653,7 +11655,13 @@ function lowerForInArray( type: BOOL, loc, }, - else_: { kind: "boolLit", value: true, type: BOOL, loc }, + else_: { + kind: "libCall", + fn: "array.hasNamedKey", + args: [arrRef(), namedKey()], + type: BOOL, + loc, + }, type: BOOL, loc, }; diff --git a/packages/compiler/src/ir/builtin-signatures.ts b/packages/compiler/src/ir/builtin-signatures.ts index 1e6270366..e4bd83db7 100644 --- a/packages/compiler/src/ir/builtin-signatures.ts +++ b/packages/compiler/src/ir/builtin-signatures.ts @@ -3727,6 +3727,9 @@ export const LIB_FN_SIGS = defineLibFnSignatures({ // The string keys `for...in` visits on an array (args[0], any element // type) after its indices. Borrowed; never throws. "array.namedKeys": { argTypes: [null], result: arrayOf(STRING) }, + // Whether the array (args[0]) still has the key (args[1]) from its + // namedKeys list. Borrowed; never throws. + "array.hasNamedKey": { argTypes: [null, STRING], result: BOOL }, // node:events EventEmitter: receivers are emitter-hierarchy objects and // the chaining forms (on/off/removeAll/setMax) return the receiver's // own class — program-dependent object types, checked in the libCall diff --git a/packages/compiler/src/ir/validate.ts b/packages/compiler/src/ir/validate.ts index 0004be761..88ccbbc33 100644 --- a/packages/compiler/src/ir/validate.ts +++ b/packages/compiler/src/ir/validate.ts @@ -4262,9 +4262,9 @@ function validateFunction( if (!ok) err(`libCall dyn.objEntryPairs must return a [string, any] tuple array`, e.loc); return true; } - if (e.fn === "array.namedKeys") { + if (e.fn === "array.namedKeys" || e.fn === "array.hasNamedKey") { if (e.args[0]?.type.kind !== "array") { - err(`libCall array.namedKeys arg 0: expected an array, got ${e.args[0]?.type.kind}`, e.loc); + err(`libCall ${e.fn} arg 0: expected an array, got ${e.args[0]?.type.kind}`, e.loc); } return true; } diff --git a/packages/runtime/src/scr_array.c b/packages/runtime/src/scr_array.c index fa98dd38a..c64b85947 100644 --- a/packages/runtime/src/scr_array.c +++ b/packages/runtime/src/scr_array.c @@ -4790,6 +4790,22 @@ ScrStr *scr_str_raw(ScrArr *raw, ScrArr *subs) { return out; } +bool scr_arr_numeric_key(const char *key, size_t len, double *out) { + char text[64]; + if (len == 0 || len >= sizeof text) return false; + memcpy(text, key, len); + text[len] = '\0'; + char *end; + double number = strtod(text, &end); + if (end != text + len) return false; + char spelled[64]; + if (scr_f64_to_str(number, spelled) != len || memcmp(spelled, key, len) != 0) return false; + size_t index; + if (scr_arr_valid_index(number, &index)) return false; + *out = number; + return true; +} + void scr_arr_copy_metadata(ScrArr *a, ScrDyn *target) { const ScrDyn *metadata = SCR_AX(a)->metadata; if (metadata && metadata->kind == SCR_DYN_HANDLE && metadata->v.handle.tag == SCR_DYNH_MATCH_SOURCE && @@ -4838,6 +4854,21 @@ ScrArr *scr_arr_named_keys(ScrArr *a) { return keys; } +bool scr_arr_has_named_key(ScrArr *a, ScrStr *key) { + const ScrArrExt *x = scr_arr_ext_of(a); + if (!x) return false; + if (scr_arr_prop_index(a, key->data, key->len) != SIZE_MAX) return true; + const ScrDyn *metadata = x->metadata; + if (metadata && metadata->kind == SCR_DYN_HANDLE && metadata->v.handle.tag == SCR_DYNH_MATCH_SOURCE) + return true; /* index, input and groups, the only keys a pending result lists */ + if (!metadata || metadata->kind != SCR_DYN_OBJ) return false; + for (size_t i = 0; i < metadata->v.obj.len; i++) { + const ScrDynEntry *entry = &metadata->v.obj.entries[i]; + if (entry->key_len == key->len && memcmp(entry->key, key->data, key->len) == 0) return true; + } + return false; +} + void scr_arr_adopt_view_properties(ScrArr *a, ScrDyn *view, ScrArr *target) { ScrArrExt *from = scr_arr_ext_of(target); if (from && from->prop_len) { diff --git a/packages/runtime/src/scr_array.h b/packages/runtime/src/scr_array.h index d9f5f49bc..6c41b3dbd 100644 --- a/packages/runtime/src/scr_array.h +++ b/packages/runtime/src/scr_array.h @@ -322,6 +322,13 @@ void scr_arr_copy_metadata(ScrArr *a, struct ScrDyn *target); * (non-index) properties as its metadata and the noncanonical numeric * properties of `target`, so neither is lost when the storage is swapped. */ void scr_arr_adopt_view_properties(ScrArr *a, struct ScrDyn *view, ScrArr *target); +/* True when `key` is the string spelling of a number that is not an array + * index ("-1", "1.5", "NaN", "Infinity"), with the number in *out. Arrays + * keep such properties in their noncanonical property table. */ +bool scr_arr_numeric_key(const char *key, size_t len, double *out); +/* Whether the array still has the named or noncanonical numeric property + * `key`: `for...in` skips a key deleted before its turn. Borrows both. */ +bool scr_arr_has_named_key(ScrArr *a, ScrStr *key); /* The enumerable string keys `for...in` visits after the indices: the * noncanonical numeric properties, then the named properties in insertion * order. +1. */ diff --git a/packages/runtime/src/scr_json.c b/packages/runtime/src/scr_json.c index 8577a96fb..5d00f8b47 100644 --- a/packages/runtime/src/scr_json.c +++ b/packages/runtime/src/scr_json.c @@ -10270,9 +10270,17 @@ void scr_dyn_key_delete(ScrDyn *recv, const ScrStr *key, bool strict) { return; } /* A live native array keeps its named properties in its metadata, so - * deleting one goes through the view and its commit. Elements and - * `length` keep the boundary below. */ + * deleting one goes through the view and its commit. Numeric properties + * are deleted natively. Elements and `length` keep the boundary below. */ size_t element; + double number; + if (recv->kind == SCR_DYN_TYPED_REF && scr_dyn_typed_ref_array_ops(recv) && + scr_arr_numeric_key(key->data, key->len, &number)) { + /* Noncanonical numeric properties ("-1", "1.5") live in the native + * array's property table. */ + scr_arr_delete(recv->v.typed_ref.ptr, number); + return; + } if (recv->kind == SCR_DYN_TYPED_REF && recv->v.typed_ref.commit && scr_dyn_typed_ref_array_ops(recv) && !scr_typed_ref_is_length(key) && !scr_typed_ref_canonical_index(key->data, key->len, &element)) { ScrDyn *view = scr_dyn_typed_ref_materialize(recv); diff --git a/tests/corpus/6987-array-view-named-properties.ts b/tests/corpus/6987-array-view-named-properties.ts index 5cbea5a0a..bd100b8b1 100644 --- a/tests/corpus/6987-array-view-named-properties.ts +++ b/tests/corpus/6987-array-view-named-properties.ts @@ -77,3 +77,20 @@ for (const key in shrinking) { const match = /b(?c)?/.exec("abc"); if (match) for (const key in match) console.log("match key", key); + +// A numeric property deleted through a view is gone from the array. +const numeric: number[] = [1, 2]; +numeric[-1] = 5; +delete (numeric as unknown as Bag)["-1"]; +console.log(numeric[-1], "-1" in (numeric as unknown as Bag)); +for (const key in numeric) console.log("numeric key", key); + +// A named key deleted before its turn is not visited. +const visited: number[] = [1]; +(visited as unknown as Bag).first = 1; +(visited as unknown as Bag).second = 2; +(visited as unknown as Bag).third = 3; +for (const key in visited) { + console.log("visited key", key); + if (key === "first") delete (visited as unknown as Bag).second; +} From 982ef6dbefe5beb5c98ae64065a0b96dd94c4e01 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 18:11:33 -0500 Subject: [PATCH 41/67] Allow zlib callbacks to assign to their result The error-path copy of a zlib callback reads its result from a hidden local that was immutable, so a body that assigned a fallback Buffer to the result (if (!out) out = Buffer.from("fallback")) failed to compile with an internal compiler error. The local is now mutable, and an assigned value is read back as a checked-dynamic value, as in Node. --- .../src/frontend/lowering/lower-functions.ts | 4 +++- tests/corpus/6920-zlib-callback-error-result.ts | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/compiler/src/frontend/lowering/lower-functions.ts b/packages/compiler/src/frontend/lowering/lower-functions.ts index 6fc083468..8f2c575a4 100644 --- a/packages/compiler/src/frontend/lowering/lower-functions.ts +++ b/packages/compiler/src/frontend/lowering/lower-functions.ts @@ -2,6 +2,7 @@ import { declareTypedArguments } from "./typed-arguments.js"; import { dynUndefinedExpr, varRef } from "../../ir/build.js"; import { everyStmtList, transformStmtList } from "../../ir/traverse.js"; import { bindingNeverReassigned } from "./binding-analysis.js"; +import { declareContextLocal } from "./function-context.js"; import { isErrorFirstErrorType } from "./builtins/arguments.js"; import { InternalCompilerError } from "../../errors.js"; import * as ts from "../ts7/adapter.js"; @@ -786,7 +787,8 @@ function lowerUndefinedResultBody( lowerer.suppressStats = stats; } }; - const slot = lowerer.declareHiddenLocal("%result", DYN); + // Mutable: the body may assign to its result (`if (!out) out = ...`). + const slot = declareContextLocal(lowerer.ctx, "%result", DYN, true, undefined, undefined); const undefinedResult: IrStmt = { kind: "varDecl", localId: slot.id, diff --git a/tests/corpus/6920-zlib-callback-error-result.ts b/tests/corpus/6920-zlib-callback-error-result.ts index cc9128221..5016fa841 100644 --- a/tests/corpus/6920-zlib-callback-error-result.ts +++ b/tests/corpus/6920-zlib-callback-error-result.ts @@ -176,6 +176,19 @@ function namedRetry(): void { }); } +function fallbackResult(): void { + // The body assigns a fallback Buffer to its result. + zlib.inflate(bad, (err, out) => { + if (!out) out = Buffer.from("fallback"); + console.log("fallback", err?.code, typeof out, out.toString()); + zlib.inflate(good, (err2, out2) => { + if (err2) out2 = Buffer.alloc(0); + console.log("fallback nested", err2, out2.length); + step(); + }); + }); +} + function functionValues(next: () => void): void { steps.push( () => zlib.inflate(good, named), @@ -203,6 +216,7 @@ function functionValues(next: () => void): void { () => zlib.inflate(good, captures), nestedForward, namedRetry, + fallbackResult, () => { named(new Error("direct"), Buffer.from("both")); }, From 2054ea51bb6b52e3f149f92219b0e967d46a8fda Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 18:31:16 -0500 Subject: [PATCH 42/67] Give the sanitized Effect pilot tests a longer timeout --- tests/harness/npm-static.test.ts | 65 +++++++++++++++++++------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/tests/harness/npm-static.test.ts b/tests/harness/npm-static.test.ts index 54845ed05..df82efbcf 100644 --- a/tests/harness/npm-static.test.ts +++ b/tests/harness/npm-static.test.ts @@ -22,6 +22,9 @@ const fixturesRoot = join(repoRoot, "tests/fixtures"); const pilotRoot = join(fixturesRoot, "npm-static"); const cacheDir = join(repoRoot, "node_modules/.cache/scriptc-tests"); const sanitize = process.env["SCRIPTC_SAN"] === "1"; +/* Sanitized builds of the published Effect pilots alone take 290 to 330 s on a 16-vCPU host, most of it in + * the sanitized native link: near or past the suite's 300 s default. */ +const effectBuildTimeout = sanitize ? 900_000 : undefined; // Measured milliseconds per test on a CI runner (scripts/ci-test-costs.mjs). const testCosts = ( JSON.parse(readFileSync(new URL("./npm-static-costs.json", import.meta.url), "utf8")) as { @@ -1135,34 +1138,42 @@ describe(`npm-static pilots${sanitize ? " (sanitized)" : ""}`, () => { expect(nativeRes.exitCode).toBe(nodeRes.exitCode); }, 180_000); - test("the published Effect generator logs and completes statically", async () => { - const entry = join(pilotRoot, "effect-gen-cli.ts"); - const binary = await buildStatic(entry, ["effect"]); - const [reference, native] = await Promise.all([ - runBinary(process.execPath, [entry]), - runBinary(binary, []), - ]); - const log = - /^timestamp=\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z level=INFO fiber=#0 message="Hello, world!"\n$/; - expect(reference.stdout.toString()).toMatch(log); - expect(native.stdout.toString()).toMatch(log); - expect(comparableStderr(native.stderr)).toEqual(reference.stderr); - expect(native.exitCode).toBe(reference.exitCode); - expect(native.exitCode).toBe(0); - }); + test( + "the published Effect generator logs and completes statically", + async () => { + const entry = join(pilotRoot, "effect-gen-cli.ts"); + const binary = await buildStatic(entry, ["effect"]); + const [reference, native] = await Promise.all([ + runBinary(process.execPath, [entry]), + runBinary(binary, []), + ]); + const log = + /^timestamp=\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z level=INFO fiber=#0 message="Hello, world!"\n$/; + expect(reference.stdout.toString()).toMatch(log); + expect(native.stdout.toString()).toMatch(log); + expect(comparableStderr(native.stderr)).toEqual(reference.stderr); + expect(native.exitCode).toBe(reference.exitCode); + expect(native.exitCode).toBe(0); + }, + effectBuildTimeout, + ); - test("the published Effect generator has deterministic native results", async () => { - const entry = join(pilotRoot, "effect-gen-result-cli.ts"); - const binary = await buildStatic(entry, ["effect"]); - const [reference, native] = await Promise.all([ - runBinary(process.execPath, [entry]), - runBinary(binary, []), - ]); - expect(reference.stdout.toString()).toBe("Hello, world!\n42\n"); - expect(native.stdout).toEqual(reference.stdout); - expect(comparableStderr(native.stderr)).toEqual(reference.stderr); - expect(native.exitCode).toBe(reference.exitCode); - }); + test( + "the published Effect generator has deterministic native results", + async () => { + const entry = join(pilotRoot, "effect-gen-result-cli.ts"); + const binary = await buildStatic(entry, ["effect"]); + const [reference, native] = await Promise.all([ + runBinary(process.execPath, [entry]), + runBinary(binary, []), + ]); + expect(reference.stdout.toString()).toBe("Hello, world!\n42\n"); + expect(native.stdout).toEqual(reference.stdout); + expect(comparableStderr(native.stderr)).toEqual(reference.stderr); + expect(native.exitCode).toBe(reference.exitCode); + }, + effectBuildTimeout, + ); test("inferred variadic factories preserve checked callable results", async () => { const entry = join(pilotRoot, "variadic-factory-cli.ts"); From 34f371f8295d1b5ffd664bc21355aeab4b886b6c Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 18:43:03 -0500 Subject: [PATCH 43/67] Address the second review round on array named properties --- packages/runtime/src/scr_json.c | 38 +++++++++---------- .../6987-array-view-named-properties.ts | 8 ++++ 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/packages/runtime/src/scr_json.c b/packages/runtime/src/scr_json.c index 5d00f8b47..f62ef0165 100644 --- a/packages/runtime/src/scr_json.c +++ b/packages/runtime/src/scr_json.c @@ -10269,30 +10269,30 @@ void scr_dyn_key_delete(ScrDyn *recv, const ScrStr *key, bool strict) { } return; } - /* A live native array keeps its named properties in its metadata, so - * deleting one goes through the view and its commit. Numeric properties - * are deleted natively. Elements and `length` keep the boundary below. */ + /* A live native array keeps the noncanonical numeric properties written + * natively ("-1", "1.5") in its property table, and named properties, + * including numeric-looking keys written through a view, in its metadata, + * which the view and its commit hold. Deleting such a key removes it from + * both. Elements and `length` keep the boundary below. */ size_t element; - double number; if (recv->kind == SCR_DYN_TYPED_REF && scr_dyn_typed_ref_array_ops(recv) && - scr_arr_numeric_key(key->data, key->len, &number)) { - /* Noncanonical numeric properties ("-1", "1.5") live in the native - * array's property table. */ - scr_arr_delete(recv->v.typed_ref.ptr, number); - return; - } - if (recv->kind == SCR_DYN_TYPED_REF && recv->v.typed_ref.commit && scr_dyn_typed_ref_array_ops(recv) && !scr_typed_ref_is_length(key) && !scr_typed_ref_canonical_index(key->data, key->len, &element)) { - ScrDyn *view = scr_dyn_typed_ref_materialize(recv); - if (!scr_exc_pending() && view->kind == SCR_DYN_ARR) { - bool own = view->v.arr.properties && scr_dyn_obj_get(view->v.arr.properties, key->data, key->len); - if (own) scr_dyn_key_delete(view, key, strict); - if (own && !scr_exc_pending()) scr_dyn_typed_ref_commit(recv); + double number; + bool numeric = scr_arr_numeric_key(key->data, key->len, &number); + if (numeric) scr_arr_delete(recv->v.typed_ref.ptr, number); + if (recv->v.typed_ref.commit) { + ScrDyn *view = scr_dyn_typed_ref_materialize(recv); + if (!scr_exc_pending() && view->kind == SCR_DYN_ARR) { + bool own = view->v.arr.properties && scr_dyn_obj_get(view->v.arr.properties, key->data, key->len); + if (own) scr_dyn_key_delete(view, key, strict); + if (own && !scr_exc_pending()) scr_dyn_typed_ref_commit(recv); + scr_dyn_release(view); + return; + } scr_dyn_release(view); - return; + if (scr_exc_pending()) return; } - scr_dyn_release(view); - if (scr_exc_pending()) return; + if (numeric) return; } if (recv->kind == SCR_DYN_FUNC) { if (scr_dyn_fn_property_fence(key)) return; diff --git a/tests/corpus/6987-array-view-named-properties.ts b/tests/corpus/6987-array-view-named-properties.ts index bd100b8b1..faba7dc90 100644 --- a/tests/corpus/6987-array-view-named-properties.ts +++ b/tests/corpus/6987-array-view-named-properties.ts @@ -85,6 +85,14 @@ delete (numeric as unknown as Bag)["-1"]; console.log(numeric[-1], "-1" in (numeric as unknown as Bag)); for (const key in numeric) console.log("numeric key", key); +// A numeric-looking key written through a view is deleted through a view too. +const viewNumeric: string[] = ["a"]; +(viewNumeric as unknown as Bag)["-2"] = "view"; +console.log((viewNumeric as unknown as Bag)["-2"], "-2" in (viewNumeric as unknown as Bag)); +delete (viewNumeric as unknown as Bag)["-2"]; +console.log((viewNumeric as unknown as Bag)["-2"], "-2" in (viewNumeric as unknown as Bag)); +for (const key in viewNumeric) console.log("view numeric key", key); + // A named key deleted before its turn is not visited. const visited: number[] = [1]; (visited as unknown as Bag).first = 1; From fa7bc7c7a0d73e55de132ea929b03257d7e51fd0 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 18:53:43 -0500 Subject: [PATCH 44/67] Warn about likely-hot functions that use untyped values A build now names the functions of the program's own files that compile to the dynamic tier and likely run often, so a slow program with a little untyped code says where the time goes: warning SC6101: 3 functions that likely run often use untyped values, which runs slower than typed code: advance (nbody.js:22): untyped JavaScript file, in a loop ... - The functions come from the tier assignment lowering already makes (Lowerer.dynamicFunctions). Without a profile, a function counts as likely hot when a dynamic operation runs inside one of its loops, when a loop calls it, or when it calls itself (lowering/dynamic-tier.ts). - A function is named only when its source says why its values are untyped: an `any` (for a for...of variable, the value it iterates), an untyped JSON.parse result, or an untyped JavaScript file. Generated %dyn.* helpers, module top levels and functions that are dynamic for an operation without a static lowering are left out. - At most five functions are named, most likely hot first, with the total; dynamic-tier code in npm packages is counted per package on one line. All of the warning's text is in diagnostics/dynamic-tier.ts. - SC6101 opens the SC61xx band, performance notes, with a new "performance" category in the diagnostics envelope; SC60xx stay the divergences. - scriptc build prints it after the divergence warnings, and the executable cache stores it with the entry, so a cached build (including the CLI's routed fast path) repeats it. scriptc coverage reports it, and a comment-only edit no longer replays a verdict that carries it, since its text holds line numbers. - --no-dynamic-tier-warning leaves it out of build and coverage; coverage --fail-on=dynamic fails on it. - Docs: coverage.mdx (Dynamic tier, Gating builds and CI, the envelope categories) and cli.mdx. --- .gitignore | 1 + docs/content/docs/cli.mdx | 7 +- docs/content/docs/coverage.mdx | 23 +- packages/cli/src/bootstrap.ts | 5 + .../cli/test/dynamic-tier-warning.test.ts | 120 ++++++++ packages/compiler/src/cli/command.ts | 40 ++- packages/compiler/src/cli/usage.ts | 9 +- packages/compiler/src/coverage/report.ts | 24 +- .../compiler/src/coverage/verdict-cache.ts | 3 + .../compiler/src/coverage/verdict-semantic.ts | 3 + .../compiler/src/diagnostics/diagnostic.ts | 5 +- .../compiler/src/diagnostics/dynamic-tier.ts | 99 ++++++ packages/compiler/src/diagnostics/envelope.ts | 8 +- .../src/executable/executable-cache.ts | 11 + packages/compiler/src/executable/prepare.ts | 2 +- packages/compiler/src/frontend/analysis.ts | 1 + .../src/frontend/lowering/dynamic-tier.ts | 284 ++++++++++++++++++ .../compiler/src/frontend/lowering/lowerer.ts | 13 +- packages/compiler/src/index.ts | 18 ++ packages/compiler/src/startup-cache.ts | 1 + tests/coverage-fixtures/dynamic-tier/hot.js | 36 +++ .../dynamic-tier/package/main.ts | 13 + .../node_modules/untyped-lib/index.d.ts | 1 + .../package/node_modules/untyped-lib/index.js | 6 + .../node_modules/untyped-lib/package.json | 1 + tests/coverage-fixtures/dynamic-tier/quiet.ts | 13 + .../dynamic-tier/typed-hot.ts | 21 ++ .../__snapshots__/coverage-dynamic-tier.txt | 13 + tests/harness/coverage.test.ts | 42 +++ 29 files changed, 802 insertions(+), 21 deletions(-) create mode 100644 packages/cli/test/dynamic-tier-warning.test.ts create mode 100644 packages/compiler/src/diagnostics/dynamic-tier.ts create mode 100644 packages/compiler/src/frontend/lowering/dynamic-tier.ts create mode 100644 tests/coverage-fixtures/dynamic-tier/hot.js create mode 100644 tests/coverage-fixtures/dynamic-tier/package/main.ts create mode 100644 tests/coverage-fixtures/dynamic-tier/package/node_modules/untyped-lib/index.d.ts create mode 100644 tests/coverage-fixtures/dynamic-tier/package/node_modules/untyped-lib/index.js create mode 100644 tests/coverage-fixtures/dynamic-tier/package/node_modules/untyped-lib/package.json create mode 100644 tests/coverage-fixtures/dynamic-tier/quiet.ts create mode 100644 tests/coverage-fixtures/dynamic-tier/typed-hot.ts create mode 100644 tests/harness/__snapshots__/coverage-dynamic-tier.txt diff --git a/.gitignore b/.gitignore index fda9414aa..cd44fe11d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ node_modules/ !tests/corpus/*/node_modules/ !tests/fixtures/npm-static/node_modules/ !tests/coverage-fixtures/wasm/node_modules/ +!tests/coverage-fixtures/dynamic-tier/package/node_modules/ !tests/fixtures/npm-static/nested/inner/node_modules/ !tests/fixtures/npm-static/node_modules/*/node_modules/ !tests/fixtures/npm/store/*/node_modules/ diff --git a/docs/content/docs/cli.mdx b/docs/content/docs/cli.mdx index efdb03d7d..8c57d2e2a 100644 --- a/docs/content/docs/cli.mdx +++ b/docs/content/docs/cli.mdx @@ -114,8 +114,8 @@ With `--sparse`, the profile leaves out the functions the runs never reached. Th
--print <native-link-info|diagnostics>
-
--fail-on <blockers|divergences>
-
Coverage only. Exit with status 1 when the entry has blockers that would fail a build, or with divergences, also when it has Node divergence warnings. See Gating builds and CI.
+
--fail-on <blockers|divergences|dynamic>
+
Coverage only. Exit with status 1 when the entry has blockers that would fail a build, with divergences, also when it has Node divergence warnings, or with dynamic, also when it has the SC6101 warning for untyped code that likely runs often. See Gating builds and CI.
--ffi <file>
Bind signature-only TypeScript declarations to native C ABI symbols and link the manifest's archive, object, and system-library inputs. See Native FFI.
@@ -156,6 +156,9 @@ With `--sparse`, the profile leaves out the functions the runs never reached. Th
--explain-dynamic[=<name>]
Coverage only. After the report, list the functions that already operate on values typed only at runtime and the bindings, fields, functions, classes and modules that unsupported constructs would move to the dynamic tier, each with the diagnostic behind it. With a name such as x, Point, or Point.x, show only the matching units. See Dynamic tier.
+
--no-dynamic-tier-warning
+
Build and coverage. Leave out SC6101, the warning that names functions that likely run often and use untyped values. Not allowed with --fail-on=dynamic. See Untyped code that likely runs often.
+
--wasm <file.wasm>
Coverage only. Report a WebAssembly module the program loads from a path its sources do not spell out. The report already lists modules whose paths the compiler resolves, modules inlined as base64 literals, and .wasm files shipped by packages that use WebAssembly; a scriptc.wasm array in package.json adds files the same way as this flag. Each module is listed with its size, whether it validates, and the WebAssembly proposals it uses. Builds translate the modules they find to native code; a build reads the scriptc.wasm array but not this flag. Repeatable.
diff --git a/docs/content/docs/coverage.mdx b/docs/content/docs/coverage.mdx index 1bb645bd9..09f87bacd 100644 --- a/docs/content/docs/coverage.mdx +++ b/docs/content/docs/coverage.mdx @@ -62,6 +62,25 @@ Code that operates on values whose types are known only at runtime, such as `any `--tier=static-only` keeps every unsupported construct a blocker instead of moving it to the dynamic tier; code that already operates on runtime-typed values compiles as before. Today `auto`, the default, behaves the same way. +### Untyped code that likely runs often + +When functions of the program's own files use untyped values and likely run often, `scriptc build` and coverage report them as an `SC6101` warning. For the Benchmarks Game n-body program in plain JavaScript: + +```console +$ scriptc build nbody.js -o nbody +warning SC6101: 3 functions that likely run often use untyped values, which runs slower than typed code: + advance (nbody.js:22): untyped JavaScript file, in a loop + energy (nbody.js:40): untyped JavaScript file, in a loop + offsetMomentum (nbody.js:12): untyped JavaScript file, in a loop + hint: add types to compile these statically; see scriptc coverage --explain-dynamic + +The program compiled. Adding types to these functions lets scriptc compile them to faster code. +``` + +Without a profile, a dynamic-tier function counts as likely to run often when a dynamic operation runs inside one of its loops, when a loop calls it, or when it calls itself. A function is named only when its source says why its values are untyped: a value typed `any` (for a `for...of` variable, the value it iterates), an untyped `JSON.parse` result, or an untyped JavaScript file. Dynamic code that runs once, such as setup code that reads an `any` configuration, is not reported, and neither are functions that are dynamic for an operation with no static lowering, which more types would not change. + +The warning names at most five functions, most likely to run often first, and gives the total. Dynamic-tier code in npm packages is summarized on one line with each package's function count. A build that comes from the cache repeats the warning. `--no-dynamic-tier-warning` leaves it out, and `--fail-on=dynamic` fails a coverage run on it. + ## Diagnostic codes Coverage and `scriptc build` report the same diagnostic codes. Common ones include: @@ -88,7 +107,7 @@ By default, `scriptc coverage` exits with status 0 whenever the program type-che $ scriptc coverage src/main.ts --fail-on=blockers ``` -`--fail-on=blockers` exits with status 1 when the program has blockers that would fail `scriptc build`. Blockers in unreached code and deferred operations don't count. `--fail-on=divergences` also fails on Node divergences. A program that doesn't type-check always exits with status 1. +`--fail-on=blockers` exits with status 1 when the program has blockers that would fail `scriptc build`. Blockers in unreached code and deferred operations don't count. `--fail-on=divergences` also fails on Node divergences, and `--fail-on=dynamic` also fails on the `SC6101` warning for [untyped code that likely runs often](#untyped-code-that-likely-runs-often). A program that doesn't type-check always exits with status 1. Coverage caches its result. Running it again on an unchanged program, or after edits that only touch comments, reuses the previous verdict. Set `SCRIPTC_NO_CACHE=1` to turn the cache off. @@ -174,7 +193,7 @@ For editors, CI annotations, and other tools, `scriptc coverage --print=diagnost category - invalid-source (the program has a TypeScript or JSON error), unsupported (valid code scriptc cannot compile yet), divergence (compiles, but can behave differently from Node.js), environment (project configuration, scriptc's type world, toolchain, or target), or internal (a compiler bug). + invalid-source (the program has a TypeScript or JSON error), unsupported (valid code scriptc cannot compile yet), divergence (compiles, but can behave differently from Node.js), performance (compiles and behaves as under Node.js, but runs slower than typed code would), environment (project configuration, scriptc's type world, toolchain, or target), or internal (a compiler bug). severity diff --git a/packages/cli/src/bootstrap.ts b/packages/cli/src/bootstrap.ts index 1a319f98d..242a7c6f7 100644 --- a/packages/cli/src/bootstrap.ts +++ b/packages/cli/src/bootstrap.ts @@ -160,6 +160,10 @@ async function tryFastPath(): Promise { if (hit === null) return null; if (!values["keep-llvm"]) await rm(hit.llvmPath, { force: true }); if (command === "build") { + // A cached build repeats its performance warning (SC6101). + const performance = hit.performance ?? []; + if (performance.length > 0 && values["dynamic-tier-warning"] !== false) + process.stderr.write(startup.renderPerformanceWarnings(performance) + "\n"); process.stdout.write(`${outPath}\n`); return 0; } @@ -217,6 +221,7 @@ async function coverageFastPath( const hit = await startup.readCoverageVerdict(resolve(inputArg), {}).catch(() => null); if (hit === null) return null; const { coverage, sourceTexts } = hit; + if (values["dynamic-tier-warning"] === false) delete coverage.performance; if (print === "diagnostics") { const envelope = startup.coverageEnvelope(coverage, { compilerVersion: packageVersion(), diff --git a/packages/cli/test/dynamic-tier-warning.test.ts b/packages/cli/test/dynamic-tier-warning.test.ts new file mode 100644 index 000000000..67de774d4 --- /dev/null +++ b/packages/cli/test/dynamic-tier-warning.test.ts @@ -0,0 +1,120 @@ +import { execFile } from "node:child_process"; +import { createRequire } from "node:module"; +import { mkdir, mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { dirname, join } from "node:path"; +import { promisify } from "node:util"; +import { expect, test } from "vitest"; + +const execFileAsync = promisify(execFile); +const require = createRequire(import.meta.url); +const repoRoot = join(import.meta.dirname, "../../.."); +const cliEntry = join(repoRoot, "packages/cli/src/main.ts"); +const tsxLoader = join(dirname(require.resolve("tsx/package.json")), "dist/loader.mjs"); +const fixtures = join(repoRoot, "tests/coverage-fixtures/dynamic-tier"); + +const HEADER = + "warning SC6101: 3 functions that likely run often use untyped values, which runs slower than typed code:"; +const CLOSING = + "The program compiled. Adding types to these functions lets scriptc compile them to faster code."; + +async function cli( + args: string[], + cacheRoot: string, +): Promise<{ code: number; stdout: string; stderr: string }> { + try { + const { stdout, stderr } = await execFileAsync( + process.execPath, + ["--import", tsxLoader, cliEntry, ...args], + { + env: { ...process.env, SCRIPTC_CACHE_DIR: cacheRoot, SCRIPTC_TIMING: "1" }, + maxBuffer: 4 * 1024 * 1024, + }, + ); + return { code: 0, stdout, stderr }; + } catch (err) { + const e = err as { code?: number; stdout?: string; stderr?: string }; + return { code: e.code ?? 1, stdout: e.stdout ?? "", stderr: e.stderr ?? "" }; + } +} + +test("a build names its likely-hot untyped functions, also when it comes from the cache", async () => { + const dir = await mkdtemp(join(tmpdir(), "scriptc-dynamic-tier-warning-")); + const cacheRoot = join(dir, "cache"); + const outPath = join(dir, process.platform === "win32" ? "program.exe" : "program"); + try { + await mkdir(cacheRoot, { mode: 0o700 }); + const build = (extra: string[] = []) => + cli(["build", join(fixtures, "hot.js"), "-o", outPath, ...extra], cacheRoot); + + const first = await build(); + expect(first.code).toBe(0); + expect(first.stderr).toContain("scriptc lowering"); + expect(first.stderr).toContain( + [ + HEADER, + " centroid (hot.js:7): untyped JavaScript file, in a loop", + " spread (hot.js:23): untyped JavaScript file, in a loop", + " distance (hot.js:17): untyped JavaScript file, called in a loop", + " hint: add types to compile these statically; see scriptc coverage --explain-dynamic", + "", + CLOSING, + ].join("\n"), + ); + + // The cache hit skips lowering and repeats the warning. + const cached = await build(); + expect(cached.code).toBe(0); + expect(cached.stderr).not.toContain("scriptc lowering"); + expect(cached.stderr).toContain(HEADER); + expect(cached.stderr).toContain(CLOSING); + + const silenced = await build(["--no-dynamic-tier-warning"]); + expect(silenced.code).toBe(0); + expect(silenced.stderr).not.toContain("SC6101"); + } finally { + await rm(dir, { recursive: true, force: true }); + } +}, 300_000); + +test("untyped setup code builds without the warning", async () => { + const dir = await mkdtemp(join(tmpdir(), "scriptc-dynamic-tier-quiet-")); + try { + await mkdir(join(dir, "cache"), { mode: 0o700 }); + const result = await cli( + ["build", join(fixtures, "quiet.ts"), "-o", join(dir, "program")], + join(dir, "cache"), + ); + expect(result.code).toBe(0); + expect(result.stderr).not.toContain("SC6101"); + } finally { + await rm(dir, { recursive: true, force: true }); + } +}, 300_000); + +test("coverage --fail-on=dynamic fails on the warning, and --no-dynamic-tier-warning cannot hide it", async () => { + const dir = await mkdtemp(join(tmpdir(), "scriptc-dynamic-tier-fail-on-")); + try { + await mkdir(join(dir, "cache"), { mode: 0o700 }); + const coverage = (file: string, extra: string[]) => + cli(["coverage", join(fixtures, file), ...extra], join(dir, "cache")); + + const hot = await coverage("hot.js", ["--fail-on=dynamic"]); + expect(hot.code).toBe(1); + expect(hot.stdout).toContain("untyped and likely hot"); + expect((await coverage("hot.js", ["--fail-on=divergences"])).code).toBe(0); + expect((await coverage("quiet.ts", ["--fail-on=dynamic"])).code).toBe(0); + + const silenced = await coverage("hot.js", ["--no-dynamic-tier-warning"]); + expect(silenced.code).toBe(0); + expect(silenced.stdout).not.toContain("untyped and likely hot"); + + const conflict = await coverage("hot.js", ["--fail-on=dynamic", "--no-dynamic-tier-warning"]); + expect(conflict.code).toBe(1); + expect(conflict.stderr).toContain( + "--fail-on=dynamic checks the warning --no-dynamic-tier-warning leaves out", + ); + } finally { + await rm(dir, { recursive: true, force: true }); + } +}, 300_000); diff --git a/packages/compiler/src/cli/command.ts b/packages/compiler/src/cli/command.ts index 03160c6fa..3285aa7fa 100644 --- a/packages/compiler/src/cli/command.ts +++ b/packages/compiler/src/cli/command.ts @@ -13,6 +13,7 @@ import { import { TIER_MODES, type TierMode } from "../frontend/tier-analysis.js"; import { buildEnvelope } from "../diagnostics/envelope.js"; import { renderWarnings } from "../diagnostics/render.js"; +import { isPerformanceCode, renderPerformanceWarnings } from "../diagnostics/dynamic-tier.js"; import { isNativeOptimization } from "../backend/optimization.js"; import { setProvenanceSources } from "../frontend/provenance-registry.js"; import type { CliHost, NativeCacheWarmProfile } from "./host.js"; @@ -284,8 +285,20 @@ async function main(args: string[], host: CliHost): Promise { fail(`--print=diagnostics is a build/coverage option\n\n${USAGE}`); } const failOnRaw = values["fail-on"]; - if (failOnRaw !== undefined && failOnRaw !== "blockers" && failOnRaw !== "divergences") { - fail(`unknown --fail-on value "${failOnRaw}" (supported: blockers, divergences)\n\n${USAGE}`); + if ( + failOnRaw !== undefined && + failOnRaw !== "blockers" && + failOnRaw !== "divergences" && + failOnRaw !== "dynamic" + ) { + fail( + `unknown --fail-on value "${failOnRaw}" (supported: blockers, divergences, dynamic)\n\n${USAGE}`, + ); + } + // --no-dynamic-tier-warning leaves out SC6101 (diagnostics/dynamic-tier.ts). + const dynamicTierWarning = values["dynamic-tier-warning"] !== false; + if (failOnRaw === "dynamic" && !dynamicTierWarning) { + fail(`--fail-on=dynamic checks the warning --no-dynamic-tier-warning leaves out\n\n${USAGE}`); } if (failOnRaw !== undefined && command !== "coverage") { fail(`--fail-on is a coverage option (a build already fails on blockers)\n\n${USAGE}`); @@ -430,6 +443,7 @@ async function main(args: string[], host: CliHost): Promise { ...(explainDynamic !== undefined ? { explainDynamic: true } : {}), ...(wasmFiles.length > 0 ? { wasm: wasmFiles } : {}), }); + if (!dynamicTierWarning) delete coverage.performance; if (printDiagnostics) { // Keep stdout pure JSON for tooling. const envelope = coverageEnvelope(coverage, { @@ -517,7 +531,9 @@ async function main(args: string[], host: CliHost): Promise { process.stderr.write(`\n${n} error${n === 1 ? "" : "s"}.\n`); throw new CliExit(1); } - const warnings = result.warnings ?? []; + const warnings = (result.warnings ?? []).filter( + (d) => dynamicTierWarning || !isPerformanceCode(d.code), + ); if (printDiagnostics) { diagnosticsEnvelope = buildEnvelope({ compilerVersion: host.version(), @@ -530,12 +546,20 @@ async function main(args: string[], host: CliHost): Promise { }); } else if (warnings.length > 0 && command === "build") { // Divergence warnings never fail a build; they explain where the - // native program can behave differently from Node. `run` keeps - // stderr for the program's own output. + // native program can behave differently from Node. The performance + // warning names likely-hot functions that use untyped values. `run` + // keeps stderr for the program's own output. const color = process.stderr.isTTY ?? false; - process.stderr.write( - renderWarnings(warnings, result.sourceTexts ?? new Map(), { color }) + "\n", - ); + const divergences = warnings.filter((d) => !isPerformanceCode(d.code)); + const performance = warnings.filter((d) => isPerformanceCode(d.code)); + if (divergences.length > 0) + process.stderr.write( + renderWarnings(divergences, result.sourceTexts ?? new Map(), { color }) + "\n", + ); + if (performance.length > 0) { + if (divergences.length > 0) process.stderr.write("\n"); + process.stderr.write(renderPerformanceWarnings(performance) + "\n"); + } } if (result.artifact.kind === "exe") { if (!values["keep-llvm"]) rmSync(result.artifact.translationUnitPath, { force: true }); diff --git a/packages/compiler/src/cli/usage.ts b/packages/compiler/src/cli/usage.ts index aa7408d2a..23e57c66f 100644 --- a/packages/compiler/src/cli/usage.ts +++ b/packages/compiler/src/cli/usage.ts @@ -31,10 +31,11 @@ Options: (native-link-info implies --emit=obj and never links; diagnostics prints the versioned JSON diagnostics envelope for build and coverage) - --fail-on + --fail-on coverage only: exit 1 when the entry path has blockers (a build would fail), or also when it has Node - divergences + divergences, or also when it has likely-hot functions + that use untyped values (SC6101) --backend code generator (llvm) --optimization native optimization posture (default: release/-O2). dev @@ -100,6 +101,9 @@ Options: values and the bindings, fields, functions, classes and modules the dynamic tier would take over, with the refusal behind each; a name shows only that unit's chain + --no-dynamic-tier-warning + build and coverage: leave out SC6101, the warning that + names likely-hot functions that use untyped values --wasm coverage only: report a WebAssembly module the program loads whose path its sources do not spell (repeatable; @@ -131,6 +135,7 @@ export const CLI_OPTIONS = { "external-types": { type: "string", multiple: true }, tier: { type: "string" }, "explain-dynamic": { type: "string" }, + "dynamic-tier-warning": { type: "boolean", default: true }, wasm: { type: "string", multiple: true }, lib: { type: "boolean", default: false }, profile: { type: "string" }, diff --git a/packages/compiler/src/coverage/report.ts b/packages/compiler/src/coverage/report.ts index 89733e255..37f77f4c6 100644 --- a/packages/compiler/src/coverage/report.ts +++ b/packages/compiler/src/coverage/report.ts @@ -42,6 +42,10 @@ export interface CoverageInput { * the program compiles, but these sites can behave differently natively. * Never blockers; `--fail-on=divergences` opts into failing on them. */ divergences?: ScrDiagnostic[]; + /** The performance warning (SC6101): likely-hot functions the source + * leaves untyped. Never blockers; `--fail-on=dynamic` opts into failing + * on it. */ + performance?: ScrDiagnostic[]; /** Each dependency's native compilation outcome, with the first refusal * reason for a refused package. */ npmStatic?: NpmStaticStatus[]; @@ -333,6 +337,17 @@ export function renderCoverage(input: CoverageInput, opts: CoverageRenderOptions ); renderRows(groupBlockers(divergences), YELLOW); }; + // The performance warning: its message names the functions. + const performance = input.performance ?? []; + const renderPerformance = () => { + for (const d of performance) { + out.push(""); + const [head, ...rest] = d.message.split("\n"); + out.push(` ${c(YELLOW, "untyped and likely hot")} ${head}`); + for (const line of rest) out.push(` ${line}`); + if (d.hint !== undefined) out.push(` ${c(DIM, `hint: ${d.hint}`)}`); + } + }; const unreachedDiags = [...(un?.diagnostics ?? []), ...(un?.runtimeFences ?? [])]; if (failed === 0 && input.diagnostics.length === 0 && unreachedDiags.length === 0) { @@ -341,6 +356,7 @@ export function renderCoverage(input: CoverageInput, opts: CoverageRenderOptions out.push(""); renderDivergences(); } + renderPerformance(); return out.join("\n"); } @@ -381,6 +397,7 @@ export function renderCoverage(input: CoverageInput, opts: CoverageRenderOptions out.push(""); renderDivergences(); } + renderPerformance(); return out.join("\n"); } @@ -449,8 +466,9 @@ function displayPath(file: string, root: string | undefined): string { } /** What `coverage --fail-on` checks: reached blockers (they fail a build) - * and, optionally, divergences. Unreached blockers never fail. */ -export type CoverageFailOn = "blockers" | "divergences"; + * and, optionally, divergences or the performance warning. Unreached + * blockers never fail. */ +export type CoverageFailOn = "blockers" | "divergences" | "dynamic"; /** Whether the analysis passes the selected gate. Preflight failures * always fail; `failOn` undefined means only preflight fails (the report's @@ -462,6 +480,7 @@ export function coveragePasses(input: CoverageInput, failOn?: CoverageFailOn): b // runtime fences build (the statement throws only if it executes). if (input.diagnostics.length > 0) return false; if (failOn === "divergences" && (input.divergences?.length ?? 0) > 0) return false; + if (failOn === "dynamic" && (input.performance?.length ?? 0) > 0) return false; return true; } @@ -492,6 +511,7 @@ export function coverageEnvelope( add(input.unreached?.diagnostics, "unreached"); add(input.unreached?.runtimeFences, "deferred"); add(input.divergences, "reached"); + add(input.performance, "reached"); } const un = input.unreached; const total = input.stats.statementsTotal + (un?.stats.statementsTotal ?? 0); diff --git a/packages/compiler/src/coverage/verdict-cache.ts b/packages/compiler/src/coverage/verdict-cache.ts index 422bf5e4d..e5fa7242e 100644 --- a/packages/compiler/src/coverage/verdict-cache.ts +++ b/packages/compiler/src/coverage/verdict-cache.ts @@ -38,6 +38,7 @@ export interface CachedCoverage { runtimeFences?: ScrDiagnostic[]; unreached?: { stats: LowerStats; diagnostics: ScrDiagnostic[]; runtimeFences?: ScrDiagnostic[] }; divergences?: ScrDiagnostic[]; + performance?: ScrDiagnostic[]; npmStatic?: NpmStaticStatus[]; wasmModules?: WasmModuleReport[]; preflightFailed: boolean; @@ -149,6 +150,7 @@ function cacheable(coverage: AnalyzeResult["coverage"]): CachedCoverage | null { if (coverage.runtimeFences !== undefined) out.runtimeFences = coverage.runtimeFences; if (coverage.unreached !== undefined) out.unreached = coverage.unreached; if (coverage.divergences !== undefined) out.divergences = coverage.divergences; + if (coverage.performance !== undefined) out.performance = coverage.performance; if (coverage.npmStatic !== undefined) out.npmStatic = coverage.npmStatic; if (coverage.wasmModules !== undefined) out.wasmModules = coverage.wasmModules; return out; @@ -166,6 +168,7 @@ function restore(cached: CachedCoverage, sources: CachedSource[]): AnalyzeResult if (cached.runtimeFences !== undefined) coverage.runtimeFences = cached.runtimeFences; if (cached.unreached !== undefined) coverage.unreached = cached.unreached; if (cached.divergences !== undefined) coverage.divergences = cached.divergences; + if (cached.performance !== undefined) coverage.performance = cached.performance; if (cached.npmStatic !== undefined) coverage.npmStatic = cached.npmStatic; if (cached.wasmModules !== undefined) coverage.wasmModules = cached.wasmModules; return { coverage, sourceTexts }; diff --git a/packages/compiler/src/coverage/verdict-semantic.ts b/packages/compiler/src/coverage/verdict-semantic.ts index cc1c1f414..ad2f4d180 100644 --- a/packages/compiler/src/coverage/verdict-semantic.ts +++ b/packages/compiler/src/coverage/verdict-semantic.ts @@ -7,6 +7,9 @@ import { rebaseSourceLocations, semanticallyEqualSource } from "../library/seman import type { SemanticReplay } from "./verdict-cache.js"; export const commentOnlyReplay: SemanticReplay = (probes, sources, coverage) => { + // The performance warning's text names file:line positions, which moving + // its locations would not update: such a verdict is analyzed again. + if (coverage.performance !== undefined) return null; const previous = new Map(); for (const source of sources) previous.set(source.path, source.text); const match = frontendInputsSemanticallyMatch(probes, previous, semanticallyEqualSource); diff --git a/packages/compiler/src/diagnostics/diagnostic.ts b/packages/compiler/src/diagnostics/diagnostic.ts index e4d4006ca..17cb2efc0 100644 --- a/packages/compiler/src/diagnostics/diagnostic.ts +++ b/packages/compiler/src/diagnostics/diagnostic.ts @@ -61,7 +61,10 @@ * collation does not cover (SC6003), a call feeding an instance * to a cast to an unrelated class (SC6004); SC6005 (Date strings * outside the native parser's grammar) is retired — the runtime - * parses date strings with V8's grammar + * parses date strings with V8's grammar. SC61xx are performance + * notes, also warnings (coverage --fail-on=dynamic opts in): + * likely-hot functions that use untyped values (SC6101, + * diagnostics/dynamic-tier.ts) * SC9xxx internal compiler errors (still source-anchored) */ import type { SrcLoc } from "../ir/ir.js"; diff --git a/packages/compiler/src/diagnostics/dynamic-tier.ts b/packages/compiler/src/diagnostics/dynamic-tier.ts new file mode 100644 index 000000000..7970d3f42 --- /dev/null +++ b/packages/compiler/src/diagnostics/dynamic-tier.ts @@ -0,0 +1,99 @@ +/* SC6101, the dynamic-tier performance warning: its text and how it prints. + * All of the warning's wording is here. The functions it names come from + * frontend/lowering/dynamic-tier.ts; this module only formats them, and it + * imports nothing heavy so the CLI's routed cache hit can print a stored + * warning without loading the compiler. */ +import type { SrcLoc } from "../ir/ir.js"; +import type { ScrDiagnostic } from "./diagnostic.js"; + +/** The code of the warning; SC61xx are performance notes, SC60xx divergences. */ +export const DYNAMIC_TIER_CODE = "SC6101"; + +/** At most this many functions are named; the count covers all of them. */ +export const DYNAMIC_TIER_SHOWN = 5; + +/** Why a function counts as likely to run often. */ +export type HotReason = "loop" | "called-in-loop" | "recursive"; + +const HOT_PHRASE: Record = { + loop: "in a loop", + "called-in-loop": "called in a loop", + recursive: "recursive", +}; + +/** Why a function's values are untyped, as the warning words it. */ +export type UntypedCause = + | { kind: "any"; name: string } + | { kind: "json-binding"; name: string } + | { kind: "json" } + | { kind: "javascript" }; + +export function causePhrase(cause: UntypedCause): string { + switch (cause.kind) { + case "any": + return `\`${cause.name}\` is \`any\``; + case "json-binding": + return `\`${cause.name}\` holds an untyped \`JSON.parse\` result`; + case "json": + return "untyped `JSON.parse` result"; + case "javascript": + return "untyped JavaScript file"; + } +} + +export interface DynamicTierEntry { + /** Display name (`advance`, `Parser.next`). */ + name: string; + /** `file:line`, relative to the entry's directory. */ + where: string; + cause: UntypedCause; + hot: HotReason; +} + +export interface DynamicTierPackageCount { + name: string; + functions: number; +} + +/** The SC6101 diagnostic for likely-hot functions with untyped values, or + * null when there are none. `loc` is the first function's declaration. */ +export function dynamicTierDiag( + entries: readonly DynamicTierEntry[], + packages: readonly DynamicTierPackageCount[], + loc: SrcLoc, +): ScrDiagnostic | null { + const n = entries.length; + if (n === 0) return null; + const shown = entries.slice(0, DYNAMIC_TIER_SHOWN); + const lines = [ + `${n} function${n === 1 ? "" : "s"} that likely run${n === 1 ? "s" : ""} often use${n === 1 ? "s" : ""} untyped values, which runs slower than typed code:`, + ...shown.map((e) => ` ${e.name} (${e.where}): ${causePhrase(e.cause)}, ${HOT_PHRASE[e.hot]}`), + ...(n > shown.length ? [` and ${n - shown.length} more`] : []), + ...(packages.length === 0 + ? [] + : [ + ` untyped code in npm packages: ${packages + .map((p) => `${p.name} (${p.functions} function${p.functions === 1 ? "" : "s"})`) + .join(", ")}`, + ]), + ]; + return { + code: DYNAMIC_TIER_CODE, + message: lines.join("\n"), + loc, + hint: "add types to compile these statically; see scriptc coverage --explain-dynamic", + }; +} + +export function isPerformanceCode(code: string): boolean { + return /^SC61\d{2}$/.test(code); +} + +/** The warning as a build prints it: no source excerpt (it names several + * functions), then its closing line. */ +export function renderPerformanceWarnings(diags: readonly ScrDiagnostic[]): string { + const blocks = diags.map( + (d) => `warning ${d.code}: ${d.message}${d.hint === undefined ? "" : `\n hint: ${d.hint}`}`, + ); + return `${blocks.join("\n\n")}\n\nThe program compiled. Adding types to these functions lets scriptc compile them to faster code.`; +} diff --git a/packages/compiler/src/diagnostics/envelope.ts b/packages/compiler/src/diagnostics/envelope.ts index c986fc5b1..59c285ead 100644 --- a/packages/compiler/src/diagnostics/envelope.ts +++ b/packages/compiler/src/diagnostics/envelope.ts @@ -16,6 +16,7 @@ * bumps it. */ import { readFileSync } from "node:fs"; import type { ScrDiagnostic } from "./diagnostic.js"; +import { isPerformanceCode } from "./dynamic-tier.js"; import type { WasmModuleReport } from "../wasm/discover.js"; export const DIAGNOSTICS_SCHEMA = "scriptc-diagnostics"; @@ -25,12 +26,14 @@ export const DIAGNOSTICS_SCHEMA_VERSION = 1; * - invalid-source: the program itself is wrong (TypeScript errors, bad JSON modules) * - unsupported: valid TypeScript/JavaScript scriptc cannot compile yet * - divergence: compiles, but the native program behaves differently from Node + * - performance: compiles and behaves as under Node, but runs slower than typed code would * - environment: project configuration, scriptc's type world, toolchain or target * - internal: a compiler bug */ export type DiagnosticCategory = | "invalid-source" | "unsupported" | "divergence" + | "performance" | "environment" | "internal"; @@ -149,12 +152,13 @@ export interface DiagnosticsEnvelope { /** The divergence band: compiles, but the program can behave differently * from Node. Warnings, never build failures. */ export function isDivergenceCode(code: string): boolean { - return /^SC6\d{3}$/.test(code); + return /^SC60\d{2}$/.test(code); } export function categoryOf(diag: ScrDiagnostic): DiagnosticCategory { const code = diag.code; if (isDivergenceCode(code)) return "divergence"; + if (isPerformanceCode(code)) return "performance"; if (code === "SC0001") return diag.typeWorld === true ? "environment" : "invalid-source"; if (code === "SC0003") return "invalid-source"; if (code === "SC0002" || code === "SC0004") return "environment"; @@ -274,7 +278,7 @@ export function locateDiagnostic( return { code: diag.code, category: categoryOf(diag), - severity: isDivergenceCode(diag.code) ? "warning" : "error", + severity: isDivergenceCode(diag.code) || isPerformanceCode(diag.code) ? "warning" : "error", scope, file: diag.loc.file, line: start.line, diff --git a/packages/compiler/src/executable/executable-cache.ts b/packages/compiler/src/executable/executable-cache.ts index c1e3d8725..2312f5e85 100644 --- a/packages/compiler/src/executable/executable-cache.ts +++ b/packages/compiler/src/executable/executable-cache.ts @@ -11,6 +11,7 @@ import { writeFile, } from "node:fs/promises"; import { basename, dirname, join, resolve } from "node:path"; +import type { ScrDiagnostic } from "../diagnostics/diagnostic.js"; import type { FrontendInputSnapshot } from "../frontend/input-tracker.js"; import { frontendInputsStillMatch, validFrontendInputSnapshot } from "../frontend/input-tracker.js"; import { compilerReleaseVersion } from "../library/sidecar.js"; @@ -112,6 +113,8 @@ interface EarlyExecutableCacheStamp { }; nativeDependencies: NativeArtifactDependency[] | null; native: EarlyExecutableNativeFeatures; + /** The build's performance warnings (SC61xx), which a cache hit repeats. */ + performance?: ScrDiagnostic[]; integrity: string; } @@ -181,6 +184,8 @@ export interface EarlyExecutableCacheHit { executableRestored: boolean; native: EarlyExecutableNativeFeatures; frontend: FrontendInputSnapshot; + /** The performance warnings the build reported (SC61xx), repeated on a hit. */ + performance?: ScrDiagnostic[]; } export interface EarlyExecutableCachePublish extends EarlyExecutableCacheHit { @@ -610,6 +615,9 @@ async function readExecutableCache( native: stamp.native, executableRestored, frontend: stamp.frontend, + ...(Array.isArray(stamp.performance) && stamp.performance.length > 0 + ? { performance: stamp.performance } + : {}), ...(ir === null ? {} : { irPath: paths.irPath }), }; } catch { @@ -793,6 +801,9 @@ export async function publishEarlyExecutableCache( }, nativeDependencies: executable === null ? null : result.nativeDependencies!, native: result.native, + ...(result.performance === undefined || result.performance.length === 0 + ? {} + : { performance: result.performance }), }; const stamp: EarlyExecutableCacheStamp = { ...unsigned, integrity: stampIntegrity(unsigned) }; await writeFile(join(stage, "stamp.json"), `${JSON.stringify(stamp)}\n`, { mode: 0o600 }); diff --git a/packages/compiler/src/executable/prepare.ts b/packages/compiler/src/executable/prepare.ts index 4afae7c7d..1771f98f5 100644 --- a/packages/compiler/src/executable/prepare.ts +++ b/packages/compiler/src/executable/prepare.ts @@ -122,6 +122,6 @@ export function prepareExecutableModule( mod: lowered.module!, sourceTexts, stats: lowered.stats, - warnings: lowered.divergences ?? [], + warnings: [...(lowered.divergences ?? []), ...(lowered.performance ?? [])], }; } diff --git a/packages/compiler/src/frontend/analysis.ts b/packages/compiler/src/frontend/analysis.ts index 43d0aa2bb..776492eb1 100644 --- a/packages/compiler/src/frontend/analysis.ts +++ b/packages/compiler/src/frontend/analysis.ts @@ -106,6 +106,7 @@ export function analyzeWithFrontend( diagnostics: [...preflight, ...lowered.diagnostics], ...(lowered.runtimeFences.length > 0 ? { runtimeFences: lowered.runtimeFences } : {}), ...(lowered.divergences !== undefined ? { divergences: lowered.divergences } : {}), + ...(lowered.performance !== undefined ? { performance: lowered.performance } : {}), ...(lowered.unreached ? { unreached: lowered.unreached } : {}), ...(fe.npmStatic.length > 0 ? { npmStatic: fe.npmStatic } : {}), // --provenance-sources: the per-package attribution inputs (the diff --git a/packages/compiler/src/frontend/lowering/dynamic-tier.ts b/packages/compiler/src/frontend/lowering/dynamic-tier.ts new file mode 100644 index 000000000..873b22343 --- /dev/null +++ b/packages/compiler/src/frontend/lowering/dynamic-tier.ts @@ -0,0 +1,284 @@ +/* Hot dynamic-tier functions (SC6101, diagnostics/dynamic-tier.ts): the + * functions of a program that compile to the dynamic tier (ir/tiers.ts) and + * likely run often, so a build can name them. Without a profile, a function + * counts as likely hot when a dynamic operation runs inside one of its + * loops, when a loop calls it, or when it calls itself. Dynamic code that + * runs once (setup code that reads an `any` configuration, for example) + * stays quiet. + * + * The tier assignment is the one lowering made (Lowerer.dynamicFunctions); + * this module ranks its functions and says why each one is dynamic, from + * the source at its dynamic operations. A function is named only when the + * source says why (an `any`, an untyped `JSON.parse` result, an untyped + * JavaScript file): functions dynamic for operations without a static + * lowering would stay dynamic with more types. */ +import { relative } from "node:path"; +import type { ScrDiagnostic } from "../../diagnostics/diagnostic.js"; +import { + dynamicTierDiag, + type DynamicTierPackageCount, + type HotReason, + type UntypedCause, +} from "../../diagnostics/dynamic-tier.js"; +import type { IrExpr, IrFunction, IrModule, IrStmt, SrcLoc } from "../../ir/ir.js"; +import { dynamicOperationSites } from "../../ir/tiers.js"; +import { everyStmtList } from "../../ir/traverse.js"; +import * as ts from "../ts7/adapter.js"; +import { isCheckedJsSourceFile, isJsSourceFile } from "../program.js"; +import { isNodeModulesPath } from "../resolve.js"; +import type { Lowerer } from "./lowerer.js"; + +export interface HotDynamicFunction { + /** The IR function name (`%Point.norm`, `parse`, ...). */ + name: string; + loc: SrcLoc; + hot: HotReason; + /** Dynamic operations inside the function's loops. */ + loopOperations: number; + cause: UntypedCause; +} + +export interface DynamicTierReport { + /** Likely-hot dynamic functions in the program's own files, most likely + * hot first. */ + hot: HotDynamicFunction[]; + /** Dynamic-tier functions in npm packages, by package. */ + packages: DynamicTierPackageCount[]; +} + +const LOOP_KINDS = new Set(["while", "doWhile", "for", "forOf"]); + +function within(loc: SrcLoc, spans: readonly SrcLoc[]): boolean { + return spans.some((s) => s.file === loc.file && s.start <= loc.start && loc.end <= s.end); +} + +interface FunctionFacts { + loops: SrcLoc[]; + /** Callee names of direct calls, with each call's location. */ + calls: { callee: string; loc: SrcLoc }[]; +} + +function factsOf(fn: IrFunction): FunctionFacts { + const facts: FunctionFacts = { loops: [], calls: [] }; + everyStmtList(fn.body, { + stmt: (s: IrStmt) => { + if (LOOP_KINDS.has(s.kind)) facts.loops.push(s.loc); + return true; + }, + expr: (e: IrExpr) => { + if (e.kind === "call") facts.calls.push({ callee: e.callee, loc: e.loc }); + return true; + }, + }); + return facts; +} + +/** The package directory name of a node_modules path (`@scope/name` or `name`). */ +function packageOf(file: string): string { + const parts = file.split("/"); + const at = parts.lastIndexOf("node_modules"); + const first = parts[at + 1] ?? ""; + return first.startsWith("@") ? `${first}/${parts[at + 2] ?? ""}` : first; +} + +/** The innermost node spanning [start, end). */ +function nodeAt(sf: ts.SourceFile, start: number, end: number): ts.Node { + let node: ts.Node = sf; + for (;;) { + let next: ts.Node | undefined; + ts.forEachChild(node, (child) => { + if (ts.tokenStartOfNode(child) <= start && end <= child.end) { + next = child; + return true; + } + return undefined; + }); + if (next === undefined) return node; + node = next; + } +} + +/** The identifier an operand reads through (`items` in `items[i].x`). */ +function rootIdentifier(node: ts.Node): ts.Identifier | null { + let n: ts.Node = node; + for (;;) { + if (ts.isIdentifier(n)) return n; + if ( + ts.isPropertyAccessExpression(n) || + ts.isElementAccessExpression(n) || + ts.isCallExpression(n) + ) + n = n.expression; + else if (ts.isParenthesizedExpression(n) || ts.isNonNullExpression(n)) n = n.expression; + else return null; + } +} + +function isJsonParse(node: ts.Node | undefined): boolean { + if (node === undefined || !ts.isCallExpression(node)) return false; + const callee = node.expression; + return ( + ts.isPropertyAccessExpression(callee) && + ts.isIdentifier(callee.expression) && + callee.expression.text === "JSON" && + callee.name.text === "parse" + ); +} + +/** Why an identifier holds a value without a static type, or null. */ +function identifierCause(lowerer: Lowerer, id: ts.Identifier, depth = 0): UntypedCause | null { + const symbol = lowerer.checker.getSymbolAtLocation(id); + const decl = symbol?.declarations?.[0]; + // An unannotated `for (const item of items)` variable: name `items`. + if ( + depth < 4 && + decl !== undefined && + ts.isVariableDeclaration(decl) && + decl.type === undefined && + ts.isVariableDeclarationList(decl.parent) && + ts.isForOfStatement(decl.parent.parent) + ) { + const iterated = rootIdentifier(decl.parent.parent.expression); + if (iterated !== null) { + const cause = identifierCause(lowerer, iterated, depth + 1); + if (cause !== null) return cause; + } + } + if (decl !== undefined && ts.isVariableDeclaration(decl) && isJsonParse(decl.initializer)) + return { kind: "json-binding", name: id.text }; + const type = lowerer.checker.getTypeAtLocation(id); + if ((type.flags & ts.TypeFlags.Any) !== 0) return { kind: "any", name: id.text }; + return null; +} + +/** Why a node's value has no static type, or null. */ +function nodeCause(lowerer: Lowerer, n: ts.Node): UntypedCause | null { + if (isJsonParse(n)) return { kind: "json" }; + const id = rootIdentifier(n); + return id === null ? null : identifierCause(lowerer, id); +} + +/** Why the dynamic operation at `loc` has no static type, or null when + * the source does not say. The site's own subexpressions are asked first + * (the operand of a dynamic `for...of`), then its ancestors. */ +function causeAt(lowerer: Lowerer, loc: SrcLoc): UntypedCause | null { + const sf = lowerer.program.getSourceFile(loc.file); + if (sf === undefined) return null; + if (isJsSourceFile(sf) && !isCheckedJsSourceFile(sf, lowerer.projectCheckJs)) + return { kind: "javascript" }; + const node = nodeAt(sf, loc.start, loc.end); + let found: UntypedCause | null = null; + const descend = (n: ts.Node, depth: number): void => { + if (found !== null || depth > 3) return; + found = nodeCause(lowerer, n); + if (found === null) + ts.forEachChild(n, (child) => (descend(child, depth + 1), found !== null || undefined)); + }; + descend(node, 0); + for ( + let n: ts.Node | undefined = node.parent; + found === null && n !== undefined && n !== sf; + n = n.parent + ) + found = nodeCause(lowerer, n); + return found; +} + +/** The first cause the function's dynamic operations name, loop sites + * first, or null when none names one. */ +function causeOf(lowerer: Lowerer, sites: readonly { loc: SrcLoc }[]): UntypedCause | null { + for (const site of sites) { + const cause = causeAt(lowerer, site.loc); + if (cause !== null) return cause; + } + return null; +} + +/** The likely-hot dynamic-tier functions of `module` (see the header). */ +export function scanDynamicTier(lowerer: Lowerer, module: IrModule): DynamicTierReport { + const facts = new Map(); + for (const fn of module.functions) facts.set(fn.name, factsOf(fn)); + // Functions some loop calls directly. + const calledInLoop = new Set(); + for (const fn of module.functions) { + const f = facts.get(fn.name)!; + for (const call of f.calls) if (within(call.loc, f.loops)) calledInLoop.add(call.callee); + } + const hot: HotDynamicFunction[] = []; + const packages = new Map(); + for (const fn of module.functions) { + // Generated `%dyn.*` helpers are dynamic operations lowered out of line, + // and `%init.*` is a module's top level: neither is a function to name. + if (fn.tier !== "dynamic" || fn.name.startsWith("%dyn.") || fn.name.startsWith("%init.")) + continue; + if (isNodeModulesPath(fn.loc.file)) { + const name = packageOf(fn.loc.file); + packages.set(name, (packages.get(name) ?? 0) + 1); + continue; + } + const f = facts.get(fn.name)!; + const sites = dynamicOperationSites(fn); + const inLoops = sites.filter((s) => within(s.loc, f.loops)); + const recursive = f.calls.some((c) => c.callee === fn.name); + const reason: HotReason | null = + inLoops.length > 0 + ? "loop" + : calledInLoop.has(fn.name) + ? "called-in-loop" + : recursive + ? "recursive" + : null; + if (reason === null) continue; + // Only functions the source makes dynamic are named: ones dynamic for + // operations without a static lowering would stay dynamic with more types. + const cause = causeOf(lowerer, [...inLoops, ...sites.filter((s) => !inLoops.includes(s))]); + if (cause === null) continue; + hot.push({ + name: fn.name, + loc: fn.loc, + hot: reason, + loopOperations: inLoops.length, + cause, + }); + } + const rank = { loop: 0, "called-in-loop": 1, recursive: 2 } as const; + hot.sort((a, b) => rank[a.hot] - rank[b.hot] || b.loopOperations - a.loopOperations); + return { + hot, + packages: [...packages] + .map(([name, functions]) => ({ name, functions })) + .sort((a, b) => b.functions - a.functions || (a.name < b.name ? -1 : 1)), + }; +} + +/** `%%m144.Session.finish` → `Session.finish`, `m163.find` → `find`. */ +function displayName(name: string): string { + return name.replace(/^%+/, "").replace(/^m\d+\./, ""); +} + +/** SC6101 for the program lowering produced, or null (see the header). + * Paths are relative to `root`, the entry's directory. */ +export function dynamicTierWarning( + lowerer: Lowerer, + module: IrModule, + root: string, +): ScrDiagnostic | null { + const report = scanDynamicTier(lowerer, module); + const first = report.hot[0]; + if (first === undefined) return null; + const where = (loc: SrcLoc): string => { + const sf = lowerer.program.getSourceFile(loc.file); + const line = sf === undefined ? 0 : ts.getLineAndCharacterOfPosition(sf, loc.start).line + 1; + return `${relative(root, loc.file) || loc.file}:${line}`; + }; + return dynamicTierDiag( + report.hot.map((f) => ({ + name: displayName(f.name), + where: where(f.loc), + cause: f.cause, + hot: f.hot, + })), + report.packages, + first.loc, + ); +} diff --git a/packages/compiler/src/frontend/lowering/lowerer.ts b/packages/compiler/src/frontend/lowering/lowerer.ts index c4d24cef1..2bd527285 100644 --- a/packages/compiler/src/frontend/lowering/lowerer.ts +++ b/packages/compiler/src/frontend/lowering/lowerer.ts @@ -148,6 +148,7 @@ import { ClassProtocols } from "./class-protocols.js"; import { earlyReadVarSymbols } from "./var-hoisting.js"; import { recordTextCodecClass } from "../../ir/ir.js"; import { assignLegacyTiers, type DynamicFunction } from "../../ir/tiers.js"; +import { dynamicTierWarning } from "./dynamic-tier.js"; import { promoteJsvals } from "../../ir/jsval.js"; import { analyzeTiers, @@ -176,7 +177,7 @@ export { newFnCtx, type FnCtx } from "./function-context.js"; * - Lexical scoping is resolved here: locals get function-unique ids * ("x.0", "x.1" for shadowing); the IR is scope-flat. */ -import { resolve } from "node:path"; +import { dirname, resolve } from "node:path"; import { bindingSource } from "../binding-source.js"; import { tsgoPath } from "../dts-paths.js"; import * as ts from "../ts7/adapter.js"; @@ -786,6 +787,9 @@ export interface LowerResult { /** Compile-time-detectable behavior differences from Node (SC6xxx * divergence warnings) in the program's own modules. Never failures. */ divergences?: ScrDiagnostic[]; + /** Performance warnings (SC61xx): the likely-hot functions the source + * leaves untyped (lowering/dynamic-tier.ts). Never failures. */ + performance?: ScrDiagnostic[]; /** Functions lowering placed in the dynamic tier (ir/tiers.ts), present * when there are any. */ dynamicFunctions?: DynamicFunction[]; @@ -1162,6 +1166,13 @@ export function lowerToIr( const divergences = scanDivergences(resultLowerer, moduleOrder); timing("divergence-scan", { found: divergences.length }); if (divergences.length > 0) result = { ...result, divergences }; + // The performance warning (SC6101): likely-hot functions of the program + // that compile to the dynamic tier because the source leaves them untyped. + if (result.module !== null && resultLowerer.dynamicFunctions.length > 0) { + const hotDynamic = dynamicTierWarning(resultLowerer, result.module, dirname(entry.fileName)); + timing("dynamic-tier-scan", { found: hotDynamic === null ? 0 : 1 }); + if (hotDynamic !== null) result = { ...result, performance: [hotDynamic] }; + } // Contract types (@scriptc/types): written annotations, checked against // the IR by the compile pipeline (contracts/check.ts). // Acyclic object types name the IR unit the program lowered them to; a diff --git a/packages/compiler/src/index.ts b/packages/compiler/src/index.ts index a1f8601cc..92ee6b75e 100644 --- a/packages/compiler/src/index.ts +++ b/packages/compiler/src/index.ts @@ -157,6 +157,7 @@ import { type EarlyExecutableNativeFeatures, } from "./executable/executable-cache.js"; import { compilerImplementationIdentity } from "./library/compiler-self-identity.js"; +import { isPerformanceCode } from "./diagnostics/dynamic-tier.js"; export const VERSION = "0.0.1"; @@ -454,6 +455,15 @@ interface CompileWarningSink { sourceTexts: Map | null; } +/** The build's performance warnings (SC61xx), stored with its cache entry + * so a cache hit repeats them. */ +function performanceWarnings(sink: CompileWarningSink | undefined): { + performance?: ScrDiagnostic[]; +} { + const performance = (sink?.warnings ?? []).filter((d) => isPerformanceCode(d.code)); + return performance.length === 0 ? {} : { performance }; +} + function withCompileWarnings( result: T, sink: CompileWarningSink, @@ -1406,6 +1416,12 @@ async function compileTracked( if (earlyCacheOptions === null) { throw new InternalCompilerError("executable cache hit without executable cache options"); } + // A cached build repeats its performance warning (SC6101): the code it + // names is just as untyped as when it was built. + if (warningSink !== undefined && earlyHit.performance !== undefined) { + warningSink.warnings = earlyHit.performance; + warningSink.sourceTexts = new Map(); + } const executableCacheOptions = earlyCacheOptions; // Route/proof metadata is independently evictable. A full-compiler // fallback that still finds the validated payload repairs that lightweight @@ -1595,6 +1611,7 @@ async function compileTracked( nativeDependencies: dependencies, frontend: frontendInputs.snapshot(), ...(irPath === undefined ? {} : { irPath }), + ...performanceWarnings(warningSink), }); publishedExecutable = true; }, @@ -1636,6 +1653,7 @@ async function compileTracked( executableRestored: false, frontend: frontendInputs.snapshot(), ...(irPath === undefined ? {} : { irPath }), + ...performanceWarnings(warningSink), }).catch(() => undefined); } await pruneBuildCache(cacheRoot); diff --git a/packages/compiler/src/startup-cache.ts b/packages/compiler/src/startup-cache.ts index c2f82fdad..1bc74bef0 100644 --- a/packages/compiler/src/startup-cache.ts +++ b/packages/compiler/src/startup-cache.ts @@ -25,3 +25,4 @@ export function precompiledRuntimePackTarget( export { checkerCacheIdentity } from "./frontend/ts7/checker-backend.js"; export { readCoverageVerdict } from "./coverage/verdict-startup.js"; export { coverageEnvelope, coveragePasses, renderCoverage } from "./coverage/report.js"; +export { renderPerformanceWarnings } from "./diagnostics/dynamic-tier.js"; diff --git a/tests/coverage-fixtures/dynamic-tier/hot.js b/tests/coverage-fixtures/dynamic-tier/hot.js new file mode 100644 index 000000000..af2afac07 --- /dev/null +++ b/tests/coverage-fixtures/dynamic-tier/hot.js @@ -0,0 +1,36 @@ +// Untyped JavaScript whose functions loop over their arguments: the build +// names them (SC6101). `scale` runs once and stays quiet. +function scale(points, factor) { + return { points, factor }; +} + +function centroid(points) { + let x = 0; + let y = 0; + for (const p of points) { + x += p.x; + y += p.y; + } + return { x: x / points.length, y: y / points.length }; +} + +function distance(a, b) { + const dx = a.x - b.x; + const dy = a.y - b.y; + return Math.sqrt(dx * dx + dy * dy); +} + +function spread(points) { + const c = centroid(points); + let total = 0; + for (let i = 0; i < points.length; i++) total += distance(points[i], c); + return total; +} + +const points = [ + { x: 0, y: 0 }, + { x: 4, y: 0 }, + { x: 0, y: 3 }, +]; +const scaled = scale(points, 2); +console.log(scaled.factor, spread(points).toFixed(3)); diff --git a/tests/coverage-fixtures/dynamic-tier/package/main.ts b/tests/coverage-fixtures/dynamic-tier/package/main.ts new file mode 100644 index 000000000..3acd390da --- /dev/null +++ b/tests/coverage-fixtures/dynamic-tier/package/main.ts @@ -0,0 +1,13 @@ +// A program whose own hot function uses an `any` value, and which calls an +// untyped npm package: the warning names the function and summarizes the +// package's dynamic-tier code. +import { tally } from "untyped-lib"; + +function sumAmounts(rows: any): number { + let total = 0; + for (const row of rows) total += row.amount; + return total; +} + +const rows = [{ amount: 2 }, { amount: 5 }]; +console.log(sumAmounts(rows), tally(["a", "b", "a"]).a); diff --git a/tests/coverage-fixtures/dynamic-tier/package/node_modules/untyped-lib/index.d.ts b/tests/coverage-fixtures/dynamic-tier/package/node_modules/untyped-lib/index.d.ts new file mode 100644 index 000000000..c8871efd0 --- /dev/null +++ b/tests/coverage-fixtures/dynamic-tier/package/node_modules/untyped-lib/index.d.ts @@ -0,0 +1 @@ +export function tally(values: any): any; diff --git a/tests/coverage-fixtures/dynamic-tier/package/node_modules/untyped-lib/index.js b/tests/coverage-fixtures/dynamic-tier/package/node_modules/untyped-lib/index.js new file mode 100644 index 000000000..5695b6df2 --- /dev/null +++ b/tests/coverage-fixtures/dynamic-tier/package/node_modules/untyped-lib/index.js @@ -0,0 +1,6 @@ +// Counts each value: untyped JavaScript in a package. +exports.tally = function tally(values) { + const counts = {}; + for (const v of values) counts[v] = (counts[v] || 0) + 1; + return counts; +}; diff --git a/tests/coverage-fixtures/dynamic-tier/package/node_modules/untyped-lib/package.json b/tests/coverage-fixtures/dynamic-tier/package/node_modules/untyped-lib/package.json new file mode 100644 index 000000000..a81ea84d4 --- /dev/null +++ b/tests/coverage-fixtures/dynamic-tier/package/node_modules/untyped-lib/package.json @@ -0,0 +1 @@ +{"name": "untyped-lib", "version": "1.0.0", "main": "index.js", "types": "index.d.ts"} diff --git a/tests/coverage-fixtures/dynamic-tier/quiet.ts b/tests/coverage-fixtures/dynamic-tier/quiet.ts new file mode 100644 index 000000000..d045a9392 --- /dev/null +++ b/tests/coverage-fixtures/dynamic-tier/quiet.ts @@ -0,0 +1,13 @@ +// An untyped configuration read once at startup: dynamic, but not hot, so +// the build names nothing. The hot loop is typed. +const config: any = JSON.parse('{"scale": 3, "label": "sum"}'); +const scale: number = config.scale; +const label: string = config.label; + +function sum(values: number[]): number { + let total = 0; + for (const v of values) total += v * scale; + return total; +} + +console.log(label, sum([1, 2, 3])); diff --git a/tests/coverage-fixtures/dynamic-tier/typed-hot.ts b/tests/coverage-fixtures/dynamic-tier/typed-hot.ts new file mode 100644 index 000000000..e72a7ca7a --- /dev/null +++ b/tests/coverage-fixtures/dynamic-tier/typed-hot.ts @@ -0,0 +1,21 @@ +// TypeScript functions that loop over untyped values: an `any` parameter +// and an untyped JSON.parse result (SC6101 names both). +function regionTotals(items: any): Map { + const out = new Map(); + for (const item of items) out.set(item.region, (out.get(item.region) ?? 0) + item.amount); + return out; +} + +function countRegions(text: string): number { + const parsed = JSON.parse(text); + let n = 0; + for (let i = 0; i < parsed.length; i++) if (parsed[i].region !== "") n++; + return n; +} + +const rows = [ + { amount: 3, region: "eu" }, + { amount: 4, region: "us" }, +]; +for (const [region, total] of regionTotals(rows)) console.log(region, total); +console.log(countRegions(JSON.stringify(rows))); diff --git a/tests/harness/__snapshots__/coverage-dynamic-tier.txt b/tests/harness/__snapshots__/coverage-dynamic-tier.txt new file mode 100644 index 000000000..8072021e3 --- /dev/null +++ b/tests/harness/__snapshots__/coverage-dynamic-tier.txt @@ -0,0 +1,13 @@ +scriptc coverage tests/coverage-fixtures/dynamic-tier/hot.js + + statements analyzed 18 + compile statically 18 (100%) + in dynamic tier 14 (operate on values typed only at runtime; --explain-dynamic lists them) + + fully static — all analyzed statements compile to native code. + + untyped and likely hot 3 functions that likely run often use untyped values, which runs slower than typed code: + centroid (hot.js:7): untyped JavaScript file, in a loop + spread (hot.js:23): untyped JavaScript file, in a loop + distance (hot.js:17): untyped JavaScript file, called in a loop + hint: add types to compile these statically; see scriptc coverage --explain-dynamic \ No newline at end of file diff --git a/tests/harness/coverage.test.ts b/tests/harness/coverage.test.ts index cc91c0922..ca62352b1 100644 --- a/tests/harness/coverage.test.ts +++ b/tests/harness/coverage.test.ts @@ -113,6 +113,48 @@ test("ordinary code reports no divergence", () => { expect(coverage.divergences ?? []).toEqual([]); }); +test("likely-hot functions with untyped values report as a performance warning", async () => { + const { coverage } = analyze(fixture("dynamic-tier/hot.js")); + expect(coverage.diagnostics).toEqual([]); + expect(coverage.divergences ?? []).toEqual([]); + expect((coverage.performance ?? []).map((d) => d.code)).toEqual(["SC6101"]); + // Not a blocker or a divergence: only --fail-on=dynamic fails on it. + expect(coveragePasses(coverage, "divergences")).toBe(true); + expect(coveragePasses(coverage, "dynamic")).toBe(false); + const envelope = coverageEnvelope(coverage, { compilerVersion: "test" }); + expect(envelope.diagnostics.map((d) => [d.code, d.category, d.severity])).toEqual([ + ["SC6101", "performance", "warning"], + ]); + await expect(report(fixture("dynamic-tier/hot.js"))).toMatchFileSnapshot( + "__snapshots__/coverage-dynamic-tier.txt", + ); +}); + +test("the performance warning names the untyped value of each function", () => { + const { coverage } = analyze(fixture("dynamic-tier/typed-hot.ts")); + expect(coverage.performance?.[0]?.message.split("\n")).toEqual([ + "2 functions that likely run often use untyped values, which runs slower than typed code:", + " regionTotals (typed-hot.ts:3): `items` is `any`, in a loop", + " countRegions (typed-hot.ts:9): `parsed` holds an untyped `JSON.parse` result, in a loop", + ]); +}); + +test("untyped setup code that runs once reports no performance warning", () => { + const { coverage } = analyze(fixture("dynamic-tier/quiet.ts")); + expect(coverage.diagnostics).toEqual([]); + expect(coverage.performance).toBeUndefined(); + expect(coveragePasses(coverage, "dynamic")).toBe(true); +}); + +test("dynamic-tier code in npm packages is summarized by package", () => { + const { coverage } = analyze(fixture("dynamic-tier/package/main.ts")); + expect(coverage.performance?.[0]?.message.split("\n")).toEqual([ + "1 function that likely runs often uses untyped values, which runs slower than typed code:", + " sumAmounts (main.ts:6): `rows` is `any`, in a loop", + " untyped code in npm packages: untyped-lib (1 function)", + ]); +}); + test("statements of a signature-blocked function count as not static", () => { const { coverage } = analyze(fixture("blocked-signature.ts")); const un = coverage.unreached?.stats; From 5a3fbcc1ef74eebdb4118e638f6df0d72c6c9fa6 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 18:57:17 -0500 Subject: [PATCH 45/67] Hold class values in structural constructor types declared in the program A constructor type whose instances are not one program class's, such as `new () => unknown`, a type that also names static members (`{ readonly schema: unknown; new (): unknown }`), an abstract constructor type over a record, or construct overloads, did not map and refused with SC2001. Such a type declared in the program now lowers as a checked-dynamic value, as an `unknown` slot already holds a class value: the value keeps its class identity, `new` through it constructs that class, static reads see that class's statics, and the constructed value checks into the signature's instance type. Library and package constructor types keep their fences. Refs #1372 Co-authored-by: blurname <50226652+blurname@users.noreply.github.com> --- packages/compiler/src/frontend/type-mapper.ts | 16 +++++ .../6911-structural-constructor-types.ts.json | 6 ++ .../6911-structural-constructor-types.ts | 59 +++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6911-structural-constructor-types.ts.json create mode 100644 tests/corpus/6911-structural-constructor-types.ts diff --git a/packages/compiler/src/frontend/type-mapper.ts b/packages/compiler/src/frontend/type-mapper.ts index 3448545f8..b0e3a6dc9 100644 --- a/packages/compiler/src/frontend/type-mapper.ts +++ b/packages/compiler/src/frontend/type-mapper.ts @@ -2459,6 +2459,22 @@ function mapTypeInner(type: ts.Type, ctx: TypeMapperCtx): IrType | null { return { kind: "classval", className: inst.className }; } } + // A constructable declared in the program whose instances are not one + // program class's (`new () => unknown`, `abstract new () => S` over a + // record, a type that also names static members such as `{ readonly + // schema: unknown; new (): unknown }`, construct overloads): the class + // value rides the checked-dynamic tree, as an `unknown` slot already + // holds one. `new` through it and static reads dispatch at run time, + // and the constructed value checks into the signature's instance type. + // Lib and package constructables keep their fences. + if ( + ctorSigs.length > 0 && + checker.getCallSignatures(widened).length === 0 && + (widened.getSymbol()?.declarations.length ?? 0) > 0 && + widened.getSymbol()!.declarations.every((d) => ctx.isProgramFile(ts.getSourceFileOfNode(d))) + ) { + return DYN; + } } // Map: a reference to the standard library's Map interface — // provenance, not the name (a user's own `interface Map` maps as a record diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6911-structural-constructor-types.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6911-structural-constructor-types.ts.json new file mode 100644 index 000000000..3d1438687 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6911-structural-constructor-types.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6911-structural-constructor-types.ts" + ], + "diags": [] +} diff --git a/tests/corpus/6911-structural-constructor-types.ts b/tests/corpus/6911-structural-constructor-types.ts new file mode 100644 index 000000000..e8df74dfa --- /dev/null +++ b/tests/corpus/6911-structural-constructor-types.ts @@ -0,0 +1,59 @@ +// Values typed by a structural constructor type: `new () => unknown`, a type +// that also names static members, abstract constructor types and arrays of +// constructors. The class value keeps its identity; `new` through it builds +// an instance of the class it holds, and static reads see that class's +// statics. +type DescribedClass = { readonly schema: unknown; new (): unknown }; +class Item { + static readonly schema = { name: true }; + value = 42; +} +class Other { + static readonly schema = { name: false, extra: 1 }; + value = 7; +} +function classOf(flag: boolean): DescribedClass { + return flag ? Item : Other; +} +console.log(JSON.stringify(classOf(true).schema), JSON.stringify(classOf(false).schema)); +const C = classOf(true); +const made = new C(); +console.log(made instanceof Item, (made as Item).value, C === Item); + +type Ctor = new () => unknown; +const ctors: Ctor[] = [Item, Other]; +console.log(ctors.length, ctors.map((c) => (new c() as { value: number }).value).join(",")); + +class Point { + readonly x: number; + readonly y: number; + constructor(x: number, y: number) { + this.x = x; + this.y = y; + } + static origin = "0,0"; +} +type PointLike = { readonly origin: string; new (x: number, y: number): { x: number; y: number } }; +const P: PointLike = Point; +const p = new P(3, 4); +console.log(p.x + p.y, P.origin); + +abstract class Shape { + abstract area(): number; + describe(): string { + return `area ${this.area()}`; + } +} +class Square extends Shape { + area(): number { + return 4; + } +} +type ShapeCtor = abstract new () => Shape; +const sc: ShapeCtor = Square; +console.log(sc === Square, new (sc as new () => Shape)().describe()); + +function make(c: new () => T): T { + return new c(); +} +console.log((make(Item) as Item).value, (make(Other) as Other).value); From be23f71266e2482b5ce75d47be896c36cf54c2b0 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 19:02:52 -0500 Subject: [PATCH 46/67] Compile TypeScript's UMD module wrapper as the module body --- .../src/frontend/npm-static-umd.test.ts | 109 +++++++++++ .../compiler/src/frontend/npm-static-umd.ts | 178 ++++++++++++++++++ packages/compiler/src/frontend/npm-static.ts | 5 + packages/compiler/src/frontend/services.ts | 8 + .../7000-umd-package-entry/main.ts.json | 6 + tests/corpus/7000-umd-package-entry/main.ts | 10 + .../umd-shapes/lib/impl/measure.js | 22 +++ .../node_modules/umd-shapes/lib/main.d.ts | 12 ++ .../node_modules/umd-shapes/lib/main.js | 29 +++ .../node_modules/umd-shapes/package.json | 1 + .../7000-umd-package-entry/main.ts.json | 1 + 11 files changed, 381 insertions(+) create mode 100644 packages/compiler/src/frontend/npm-static-umd.test.ts create mode 100644 packages/compiler/src/frontend/npm-static-umd.ts create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/7000-umd-package-entry/main.ts.json create mode 100644 tests/corpus/7000-umd-package-entry/main.ts create mode 100644 tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/lib/impl/measure.js create mode 100644 tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/lib/main.d.ts create mode 100644 tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/lib/main.js create mode 100644 tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/package.json create mode 100644 tests/harness/corpus-costs/7000-umd-package-entry/main.ts.json diff --git a/packages/compiler/src/frontend/npm-static-umd.test.ts b/packages/compiler/src/frontend/npm-static-umd.test.ts new file mode 100644 index 000000000..5280ecb17 --- /dev/null +++ b/packages/compiler/src/frontend/npm-static-umd.test.ts @@ -0,0 +1,109 @@ +import { spawnSync } from "node:child_process"; +import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { afterAll, expect, test } from "vitest"; +import { nodeFrontendServices } from "./services-node.js"; + +const dirs: string[] = []; +afterAll(() => { + for (const dir of dirs) rmSync(dir, { recursive: true, force: true }); +}); + +function unwrap(source: string): string | null { + return nodeFrontendServices().umdFactory(source, "/pkg/index.js"); +} + +/** TypeScript's UMD wrapper around `body`. */ +function umd(body: string, params = "require, exports"): string { + return `(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports"], factory); + } +})(function (${params}) { +${body} +}); +`; +} + +const probe = ` +console.log(JSON.stringify(module.exports), Object.keys(module.exports).join(",")); +`; + +function run(file: string): string { + const result = spawnSync(process.execPath, [file], { encoding: "utf8" }); + expect(result.status).toBe(0); + return result.stdout; +} + +/** The unwrapped module exports what the original exports. */ +function expectSameModule(source: string): string { + const result = unwrap(source); + expect(typeof result).toBe("string"); + const dir = mkdtempSync(join(tmpdir(), "scriptc-umd-")); + dirs.push(dir); + const original = join(dir, "original.cjs"); + const unwrapped = join(dir, "unwrapped.cjs"); + writeFileSync(original, source + probe); + writeFileSync(unwrapped, result! + probe); + const answer = run(original); + expect(run(unwrapped)).toBe(answer); + return result!; +} + +test("the factory body runs at the top level with its positions kept", () => { + const source = umd(` "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.twice = twice; + const path = require("path"); + exports.sep = path.sep; + function twice(n) { + return n * 2; + }`); + const result = expectSameModule(source); + expect(result.length).toBe(source.length); + expect(result.split("\n").length).toBe(source.split("\n").length); + expect(result.indexOf("exports.twice = twice;")).toBe(source.indexOf("exports.twice = twice;")); + expect(result).not.toContain("define.amd"); + expect(result).not.toContain("factory"); +}); + +test("TypeScript's helper probes of this keep their fallback", () => { + expectSameModule( + umd(` "use strict"; + var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + const os_1 = __importDefault(require("os")); + exports.eol = os_1.default.EOL;`), + ); +}); + +test("nested functions keep their own return, arguments and this", () => { + expectSameModule( + umd(` "use strict"; + exports.first = function () { return arguments[0]; }; + exports.self = { get() { return this; } }; + exports.arrow = () => { return 1; };`), + ); +}); + +test("other shapes keep the original text", () => { + // `export =` returns the module value from the factory. + expect(unwrap(umd(` "use strict";\n return { a: 1 };`))).toBeNull(); + // The body's own `this` and `arguments` differ from the module's. + expect(unwrap(umd(` exports.self = this;`))).toBeNull(); + expect(unwrap(umd(` exports.count = arguments.length;`))).toBeNull(); + // Other factory parameters. + expect(unwrap(umd(` exports.a = 1;`, "require, exports, module"))).toBeNull(); + expect(unwrap(umd(` exports.a = 1;`, "req, exp"))).toBeNull(); + // Code after the wrapper. + expect(unwrap(umd(` exports.a = 1;`) + "exports.b = 2;\n")).toBeNull(); + // Not a UMD wrapper. + expect(unwrap(`exports.a = 1;\n`)).toBeNull(); +}); diff --git a/packages/compiler/src/frontend/npm-static-umd.ts b/packages/compiler/src/frontend/npm-static-umd.ts new file mode 100644 index 000000000..88400e046 --- /dev/null +++ b/packages/compiler/src/frontend/npm-static-umd.ts @@ -0,0 +1,178 @@ +/* TypeScript's UMD module emit in a compiled package: the module body is a + * factory function that the wrapper calls with the CommonJS module's own + * `require` and `exports`. + * + * (function (factory) { + * if (typeof module === "object" && typeof module.exports === "object") { + * var v = factory(require, exports); + * if (v !== undefined) module.exports = v; + * } + * else if (typeof define === "function" && define.amd) { + * define(["require", "exports", "./dep"], factory); + * } + * })(function (require, exports) { + * "use strict"; + * const dep = require("./dep"); + * exports.f = f; + * }); + * + * Under Node the CommonJS branch runs: the factory body runs once with the + * module's `require` and `exports`, and a body without a `return` leaves + * `module.exports` as it was. That is the module's own body, so the wrapper + * is blanked out (line breaks kept, so positions stay) and the body runs at + * the module's top level, where its requires and export assignments are the + * module's own. + * + * Accepted: the wrapper is the file's only statement, its CommonJS branch + * calls the factory as `factory(require, exports)`, the factory's + * parameters are exactly `require` and `exports`, and the body uses no + * `return` or `arguments` of its own. `this` in the body is the factory's + * receiver, not the module's: it may appear only in TypeScript's helper + * probes (`this && this.__importDefault`), which find no helper on either + * receiver. Any other shape keeps the original text. */ +import * as ts from "./ts7/syntax.js"; +import { tokenStartOfNode } from "./ts7/node-functions.js"; +import { applyEdits } from "./npm-static-bundled-chunks.js"; + +/** True when the text may hold a UMD wrapper (a cheap probe). */ +export function mayHoldUmdWrapper(source: string): boolean { + return source.includes("define.amd") && source.includes("(require, exports)"); +} + +/** The module text with a UMD wrapper's factory body at the top level, or + * null when the file is not one. */ +export function unwrapUmdFactory(sf: ts.SourceFile): string | null { + const stmts = sf.statements.nodes; + if (stmts.length !== 1) return null; + const stmt = stmts[0]!; + if (!ts.isExpressionStatement(stmt) || !ts.isCallExpression(stmt.expression)) return null; + const call = stmt.expression; + if (call.arguments.nodes.length !== 1) return null; + const wrapper = unparenthesized(call.expression); + const factory = call.arguments.nodes[0]!; + if (!ts.isFunctionExpression(wrapper) || !ts.isFunctionExpression(factory)) return null; + const wrapperParams = wrapper.parameters.nodes; + if (wrapperParams.length !== 1 || !isPlainParameter(wrapperParams[0]!)) return null; + const factoryName = (wrapperParams[0]!.name as ts.Identifier).text; + if (!callsFactoryForCommonJs(wrapper, factoryName)) return null; + const params = factory.parameters.nodes; + if ( + params.length !== 2 || + !params.every(isPlainParameter) || + (params[0]!.name as ts.Identifier).text !== "require" || + (params[1]!.name as ts.Identifier).text !== "exports" + ) + return null; + const body = factory.body; + if (body === undefined || !ownBodyKeepsModuleSemantics(body)) return null; + const open = tokenStartOfNode(body) + 1; + const close = body.end - 1; + return applyEdits(sf.text, 0, sf.text.length, [ + { start: tokenStartOfNode(stmt), end: open, text: "" }, + { start: close, end: stmt.end, text: "" }, + ]); +} + +function unparenthesized(e: ts.Expression): ts.Expression { + while (ts.isParenthesizedExpression(e)) e = e.expression; + return e; +} + +/** A parameter that is a bare identifier: no default, rest or pattern. */ +function isPlainParameter(p: ts.ParameterDeclaration): boolean { + return ts.isIdentifier(p.name) && p.initializer === undefined && p.dotDotDotToken === undefined; +} + +/** True when the wrapper's first statement is TypeScript's CommonJS test, + * `if (typeof module === "object" && typeof module.exports === "object")`, + * whose branch starts by calling the factory as `factory(require, exports)`. */ +function callsFactoryForCommonJs(wrapper: ts.FunctionExpression, factoryName: string): boolean { + const first = wrapper.body?.statements.nodes[0]; + if (first === undefined || !ts.isIfStatement(first)) return false; + const sf = ts.getSourceFileOfNode(wrapper); + const condition = sf.text.slice(tokenStartOfNode(first.expression), first.expression.end); + if ( + condition.replace(/\s+/g, " ") !== + 'typeof module === "object" && typeof module.exports === "object"' + ) + return false; + const branch = first.thenStatement; + const call = ts.isBlock(branch) ? branch.statements.nodes[0] : undefined; + if (call === undefined || !ts.isVariableStatement(call)) return false; + const declarations = call.declarationList.declarations.nodes; + const init = declarations.length === 1 ? declarations[0]!.initializer : undefined; + if (init === undefined || !ts.isCallExpression(init)) return false; + const args = init.arguments.nodes; + return ( + ts.isIdentifier(init.expression) && + init.expression.text === factoryName && + args.length === 2 && + ts.isIdentifier(args[0]!) && + args[0].text === "require" && + ts.isIdentifier(args[1]!) && + args[1].text === "exports" + ); +} + +/** True when the factory body behaves the same as the module's top level: + * no `return` or `arguments` of its own, and `this` only in TypeScript's + * helper probes. */ +function ownBodyKeepsModuleSemantics(body: ts.Block): boolean { + let keeps = true; + ts.walkPreorder(body, (n) => { + if (!keeps) return "stop"; + // Nested functions have their own `return`, `arguments` and `this`; + // arrow functions only their own `return`. + if ( + ts.isFunctionDeclaration(n) || + ts.isFunctionExpression(n) || + ts.isMethodDeclaration(n) || + ts.isGetAccessorDeclaration(n) || + ts.isSetAccessorDeclaration(n) || + ts.isConstructorDeclaration(n) + ) + return "skip"; + if (ts.isClassDeclaration(n) || ts.isClassExpression(n)) return "skip"; + if (ts.isReturnStatement(n) && !insideArrow(n, body)) keeps = false; + else if (ts.isIdentifier(n) && n.text === "arguments") keeps = false; + else if (n.kind === ts.SyntaxKind.ThisKeyword && !isHelperProbe(n)) keeps = false; + return undefined; + }); + return keeps; +} + +/** True when `node` sits inside an arrow function nested in `body`. */ +function insideArrow(node: ts.Node, body: ts.Block): boolean { + for (let p = node.parent; p !== undefined && p !== body; p = p.parent) + if (ts.isArrowFunction(p)) return true; + return false; +} + +/** `this` in TypeScript's helper probe `this && this.__name`: the left + * operand, or the receiver of the right operand's `__` member. */ +function isHelperProbe(node: ts.Node): boolean { + const parent = node.parent; + if (parent === undefined) return false; + const probe = + ts.isBinaryExpression(parent) && parent.left === node + ? parent + : ts.isPropertyAccessExpression(parent) && + parent.expression === node && + ts.isIdentifier(parent.name) && + parent.name.text.startsWith("__") && + parent.parent !== undefined && + ts.isBinaryExpression(parent.parent) && + parent.parent.right === parent + ? parent.parent + : undefined; + if (probe === undefined || probe.operatorToken.kind !== ts.SyntaxKind.AmpersandAmpersandToken) + return false; + const right = probe.right; + return ( + probe.left.kind === ts.SyntaxKind.ThisKeyword && + ts.isPropertyAccessExpression(right) && + right.expression.kind === ts.SyntaxKind.ThisKeyword && + ts.isIdentifier(right.name) && + right.name.text.startsWith("__") + ); +} diff --git a/packages/compiler/src/frontend/npm-static.ts b/packages/compiler/src/frontend/npm-static.ts index bc9fc2abd..56edafc48 100644 --- a/packages/compiler/src/frontend/npm-static.ts +++ b/packages/compiler/src/frontend/npm-static.ts @@ -452,6 +452,10 @@ export function npmStaticFsShadow(services: FrontendServices): NpmStaticFsShadow } else if (esm !== null) { original = esm; } + // TypeScript's UMD wrapper calls its factory with the module's own + // require and exports: the factory body is the module body. + const umd = original === null ? null : services.umdFactory(original, path); + if (umd !== null) original = umd; // Polyfill packages that ARE a Node builtin compile as the builtin. const aliased = original === null ? null : services.builtinAliasRequires(original, path); if (aliased !== null) original = aliased; @@ -472,6 +476,7 @@ export function npmStaticFsShadow(services: FrontendServices): NpmStaticFsShadow if (exportsVar !== null) original = exportsVar; const respelled = split !== null || + umd !== null || tscHelpers !== null || esm !== null || aliased !== null || diff --git a/packages/compiler/src/frontend/services.ts b/packages/compiler/src/frontend/services.ts index 10931ab29..19728d6ce 100644 --- a/packages/compiler/src/frontend/services.ts +++ b/packages/compiler/src/frontend/services.ts @@ -12,6 +12,7 @@ import { mayRequireBuiltinAlias, rewriteBuiltinAliasRequires, } from "./npm-static-builtin-aliases.js"; +import { mayHoldUmdWrapper, unwrapUmdFactory } from "./npm-static-umd.js"; import { mayHoldEnumIife, rewriteEnumIifes } from "./npm-static-enum-iife.js"; import { mayHoldTscBuiltinImport, unwrapTscBuiltinImports } from "./npm-static-tsc-helpers.js"; import { builtinPackageAliasFor } from "./package-shims.js"; @@ -114,6 +115,13 @@ export class FrontendServices { if (!mayHoldTscBuiltinImport(source)) return null; return unwrapTscBuiltinImports(this.parse(path, source, "js")); } + /** A package module written as TypeScript's UMD wrapper with its + * factory body at the top level (null: not one). */ + umdFactory(source: string, path: string): string | null { + this.ensureOpen(); + if (!mayHoldUmdWrapper(source)) return null; + return unwrapUmdFactory(this.parse(path, source, "js")); + } /** A package module with its literal-valued TypeScript enum IIFEs * respelled as object literals (null: none). */ enumIifes(source: string, path: string): string | null { diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/7000-umd-package-entry/main.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/7000-umd-package-entry/main.ts.json new file mode 100644 index 000000000..0c6cbd9d1 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/7000-umd-package-entry/main.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/7000-umd-package-entry/main.ts" + ], + "diags": [] +} diff --git a/tests/corpus/7000-umd-package-entry/main.ts b/tests/corpus/7000-umd-package-entry/main.ts new file mode 100644 index 000000000..4b8b3e246 --- /dev/null +++ b/tests/corpus/7000-umd-package-entry/main.ts @@ -0,0 +1,10 @@ +// A package whose main entry is TypeScript's UMD emit: each module's body is +// a factory the wrapper calls with the module's own require and exports, so +// its requires and export assignments sit inside a function. Node runs the +// CommonJS branch, and the named imports read the factory's exports. +import { Shape, area, describe, label, unitCount } from "umd-shapes"; + +console.log(label, unitCount); +console.log(area({ kind: Shape.Square, size: 3 }), area({ kind: Shape.Circle, size: 1 }).toFixed(4)); +console.log(describe({ kind: Shape.Square, size: 2 })); +console.log(Shape.Circle, Shape[Shape.Square]); diff --git a/tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/lib/impl/measure.js b/tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/lib/impl/measure.js new file mode 100644 index 000000000..0ea89b34e --- /dev/null +++ b/tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/lib/impl/measure.js @@ -0,0 +1,22 @@ +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports"], factory); + } +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.units = void 0; + exports.square = square; + exports.circle = circle; + exports.units = ["cm", "m"]; + function square(size) { + return size * size; + } + function circle(radius) { + return Math.PI * radius * radius; + } +}); diff --git a/tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/lib/main.d.ts b/tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/lib/main.d.ts new file mode 100644 index 000000000..0982da9ef --- /dev/null +++ b/tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/lib/main.d.ts @@ -0,0 +1,12 @@ +export declare enum Shape { + Square = 0, + Circle = 1 +} +export interface Figure { + kind: Shape; + size: number; +} +export declare const label: string; +export declare const unitCount: number; +export declare function area(figure: Figure): number; +export declare function describe(figure: Figure): string; diff --git a/tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/lib/main.js b/tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/lib/main.js new file mode 100644 index 000000000..26162fbd9 --- /dev/null +++ b/tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/lib/main.js @@ -0,0 +1,29 @@ +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports", "./impl/measure"], factory); + } +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.unitCount = exports.label = exports.Shape = void 0; + exports.area = area; + exports.describe = describe; + const measure = require("./impl/measure"); + var Shape; + (function (Shape) { + Shape[Shape["Square"] = 0] = "Square"; + Shape[Shape["Circle"] = 1] = "Circle"; + })(Shape || (exports.Shape = Shape = {})); + exports.label = "shapes"; + exports.unitCount = measure.units.length; + function area(figure) { + return figure.kind === Shape.Square ? measure.square(figure.size) : measure.circle(figure.size); + } + function describe(figure) { + return `${Shape[figure.kind]} of ${figure.size} ${measure.units[0]}: ${area(figure)}`; + } +}); diff --git a/tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/package.json b/tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/package.json new file mode 100644 index 000000000..e827ecc41 --- /dev/null +++ b/tests/corpus/7000-umd-package-entry/node_modules/umd-shapes/package.json @@ -0,0 +1 @@ +{ "name": "umd-shapes", "version": "1.0.0", "main": "./lib/main.js", "types": "./lib/main.d.ts" } diff --git a/tests/harness/corpus-costs/7000-umd-package-entry/main.ts.json b/tests/harness/corpus-costs/7000-umd-package-entry/main.ts.json new file mode 100644 index 000000000..782707a3a --- /dev/null +++ b/tests/harness/corpus-costs/7000-umd-package-entry/main.ts.json @@ -0,0 +1 @@ +{ "plain": 3911, "san": 3835 } From 220199dfec1483bd7122c29de032f2f37aa59bd4 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 19:17:07 -0500 Subject: [PATCH 47/67] Evaluate an fs argument inside satisfies once after a URL path The arguments after a URL path that are evaluated ahead of the conversion were keyed by the expression without its parentheses. When the fs lowering read through a satisfies wrapper, it lowered the inner expression again, so fs.chmodSync(url, mode() satisfies number) called mode() twice. The saved arguments are now keyed and looked up without their type-only wrappers (satisfies, as, type assertions, !), so each runs once. --- .../src/frontend/lowering/builtins/fs-paths.ts | 6 ++++-- packages/compiler/src/frontend/lowering/lowerer.ts | 8 ++++---- tests/corpus/6931-fs-url-paths.ts | 10 ++++++++++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/compiler/src/frontend/lowering/builtins/fs-paths.ts b/packages/compiler/src/frontend/lowering/builtins/fs-paths.ts index 181e27e34..38583025d 100644 --- a/packages/compiler/src/frontend/lowering/builtins/fs-paths.ts +++ b/packages/compiler/src/frontend/lowering/builtins/fs-paths.ts @@ -15,6 +15,7 @@ import * as ts from "../../ts7/adapter.js"; import { type Lowerer } from "../lowerer.js"; import { locOf } from "../../program.js"; import { sideEffectFreeOptionValue } from "../surfaces.js"; +import { stripTypeWrappers } from "../typed-arguments.js"; import { type IrExpr, type IrStmt, STRING, URL_T } from "../../../ir/ir.js"; /** The fs functions whose path parameters accept a URL: the path @@ -142,8 +143,9 @@ function checkUrlPaths( for (let i = first + 1; i < args.length; i++) if (!sideEffectFreeOptionValue(args[i]!)) last = i; const staged: ts.Expression[] = []; for (let i = first + 1; i <= last; i++) { - let e = args[i]!; - while (ts.isParenthesizedExpression(e)) e = e.expression; + // Keyed without type-only wrappers (`satisfies`, `as`, `!`), so a + // lowering that reads through them finds the saved value. + const e = stripTypeWrappers(args[i]!); // Literals are read by their members, so a whole-value slot cannot // hold them. if (ts.isObjectLiteralExpression(e) || ts.isArrayLiteralExpression(e)) { diff --git a/packages/compiler/src/frontend/lowering/lowerer.ts b/packages/compiler/src/frontend/lowering/lowerer.ts index 80b2a5938..38d3ca8d3 100644 --- a/packages/compiler/src/frontend/lowering/lowerer.ts +++ b/packages/compiler/src/frontend/lowering/lowerer.ts @@ -1,4 +1,4 @@ -import { onlyForwarded } from "./typed-arguments.js"; +import { onlyForwarded, stripTypeWrappers } from "./typed-arguments.js"; import { needsGeneralNodeStreams, noteUntypedStreamFlow, @@ -12046,11 +12046,11 @@ export class Lowerer { return this.stagedArgument(expr) ?? lowerExpr(this, expr); } - /** The saved value of a staged fs argument (stagedArguments), or null for - * every other expression. */ + /** The saved value of a staged fs argument (stagedArguments, keyed + * without type-only wrappers), or null for every other expression. */ private stagedArgument(node: ts.Expression): IrExpr | null { if (this.stagedArguments.size === 0) return null; - while (ts.isParenthesizedExpression(node)) node = node.expression; + node = stripTypeWrappers(node); if (!this.stagedArguments.has(node)) return null; const slot = this.stagedArguments.get(node); if (!slot) diff --git a/tests/corpus/6931-fs-url-paths.ts b/tests/corpus/6931-fs-url-paths.ts index cf6889066..effe64207 100644 --- a/tests/corpus/6931-fs-url-paths.ts +++ b/tests/corpus/6931-fs-url-paths.ts @@ -103,6 +103,16 @@ console.log("uid", uid); uid = -1; attempt("chown order scheme", () => fs.chownSync(new URL("http://a/"), uid, bumpUid())); console.log("uid", uid); +// A later argument with effects inside a type-only wrapper runs once. +let modeCalls = 0; +function countedMode(): number { + modeCalls++; + return 0o600; +} +attempt("satisfies", () => fs.chmodSync(file, countedMode() satisfies number)); +attempt("as", () => fs.chmodSync(file, countedMode() as number)); +attempt("non-null", () => fs.chmodSync(file, countedMode()!)); +console.log("mode calls", modeCalls); fs.rmSync(dir, { recursive: true, force: true }); console.log("done", fs.existsSync(dir)); From 3447e9a1c13e6801ac6c3b9a455f70ed2f43d503 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 19:20:54 -0500 Subject: [PATCH 48/67] Unwrap a UMD wrapper only when its body is exactly TypeScript's emit The wrapper is dropped when its factory body moves to the top level, so any other statement in the wrapper, in its CommonJS branch or in its AMD branch would be lost. The check now matches the whole wrapper body and keeps the original text for any other shape. --- .../src/frontend/npm-static-umd.test.ts | 12 ++++ .../compiler/src/frontend/npm-static-umd.ts | 72 +++++++++++-------- 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/packages/compiler/src/frontend/npm-static-umd.test.ts b/packages/compiler/src/frontend/npm-static-umd.test.ts index 5280ecb17..14e0d5ea9 100644 --- a/packages/compiler/src/frontend/npm-static-umd.test.ts +++ b/packages/compiler/src/frontend/npm-static-umd.test.ts @@ -104,6 +104,18 @@ test("other shapes keep the original text", () => { expect(unwrap(umd(` exports.a = 1;`, "req, exp"))).toBeNull(); // Code after the wrapper. expect(unwrap(umd(` exports.a = 1;`) + "exports.b = 2;\n")).toBeNull(); + // Other statements in the wrapper, which unwrapping would drop. + const wrapped = umd(` exports.a = 1;`); + const call = " var v = factory(require, exports);\n"; + expect(unwrap(wrapped.replace(call, call + " exports.b = 2;\n"))).toBeNull(); + expect(unwrap(wrapped.replace(call, " exports.b = 2;\n" + call))).toBeNull(); + expect(unwrap(wrapped.replace(" }\n})(", " }\n exports.b = 2;\n})("))).toBeNull(); + expect( + unwrap(wrapped.replace("define.amd) {", "define.amd) {\n exports.b = 2;")), + ).toBeNull(); + expect( + unwrap(wrapped.replace("define(", "exports.b = 2;\n }\n else {\n define(")), + ).toBeNull(); // Not a UMD wrapper. expect(unwrap(`exports.a = 1;\n`)).toBeNull(); }); diff --git a/packages/compiler/src/frontend/npm-static-umd.ts b/packages/compiler/src/frontend/npm-static-umd.ts index 88400e046..4a5db5065 100644 --- a/packages/compiler/src/frontend/npm-static-umd.ts +++ b/packages/compiler/src/frontend/npm-static-umd.ts @@ -23,8 +23,8 @@ * the module's top level, where its requires and export assignments are the * module's own. * - * Accepted: the wrapper is the file's only statement, its CommonJS branch - * calls the factory as `factory(require, exports)`, the factory's + * Accepted: the wrapper is the file's only statement, the wrapper's body is + * exactly the emit above (so dropping it drops nothing else), the factory's * parameters are exactly `require` and `exports`, and the body uses no * `return` or `arguments` of its own. `this` in the body is the factory's * receiver, not the module's: it may appear only in TypeScript's helper @@ -54,7 +54,7 @@ export function unwrapUmdFactory(sf: ts.SourceFile): string | null { const wrapperParams = wrapper.parameters.nodes; if (wrapperParams.length !== 1 || !isPlainParameter(wrapperParams[0]!)) return null; const factoryName = (wrapperParams[0]!.name as ts.Identifier).text; - if (!callsFactoryForCommonJs(wrapper, factoryName)) return null; + if (!isTypeScriptUmdWrapper(wrapper, factoryName)) return null; const params = factory.parameters.nodes; if ( params.length !== 2 || @@ -83,35 +83,49 @@ function isPlainParameter(p: ts.ParameterDeclaration): boolean { return ts.isIdentifier(p.name) && p.initializer === undefined && p.dotDotDotToken === undefined; } -/** True when the wrapper's first statement is TypeScript's CommonJS test, - * `if (typeof module === "object" && typeof module.exports === "object")`, - * whose branch starts by calling the factory as `factory(require, exports)`. */ -function callsFactoryForCommonJs(wrapper: ts.FunctionExpression, factoryName: string): boolean { - const first = wrapper.body?.statements.nodes[0]; - if (first === undefined || !ts.isIfStatement(first)) return false; +/** True when the wrapper body is exactly TypeScript's emit and nothing else: + * one `if` statement whose CommonJS branch holds only the factory call and + * the `module.exports` assignment, and whose `else`, when present, is only + * the AMD branch: + * + * if (typeof module === "object" && typeof module.exports === "object") { + * var v = factory(require, exports); + * if (v !== undefined) module.exports = v; + * } + * else if (typeof define === "function" && define.amd) { + * define([...], factory); + * } + * + * Unwrapping drops the wrapper, so any other statement in it would be lost. */ +function isTypeScriptUmdWrapper(wrapper: ts.FunctionExpression, factoryName: string): boolean { + const stmts = wrapper.body?.statements.nodes ?? []; + if (stmts.length !== 1 || !ts.isIfStatement(stmts[0]!)) return false; + const test = stmts[0]; const sf = ts.getSourceFileOfNode(wrapper); - const condition = sf.text.slice(tokenStartOfNode(first.expression), first.expression.end); - if ( - condition.replace(/\s+/g, " ") !== - 'typeof module === "object" && typeof module.exports === "object"' - ) + const text = (n: ts.Node): string => + sf.text.slice(tokenStartOfNode(n), n.end).replace(/\s+/g, " "); + if (text(test.expression) !== 'typeof module === "object" && typeof module.exports === "object"') return false; - const branch = first.thenStatement; - const call = ts.isBlock(branch) ? branch.statements.nodes[0] : undefined; - if (call === undefined || !ts.isVariableStatement(call)) return false; + const branch = test.thenStatement; + if (!ts.isBlock(branch) || branch.statements.nodes.length !== 2) return false; + const [call, assign] = branch.statements.nodes as [ts.Statement, ts.Statement]; + if (!ts.isVariableStatement(call)) return false; const declarations = call.declarationList.declarations.nodes; - const init = declarations.length === 1 ? declarations[0]!.initializer : undefined; - if (init === undefined || !ts.isCallExpression(init)) return false; - const args = init.arguments.nodes; - return ( - ts.isIdentifier(init.expression) && - init.expression.text === factoryName && - args.length === 2 && - ts.isIdentifier(args[0]!) && - args[0].text === "require" && - ts.isIdentifier(args[1]!) && - args[1].text === "exports" - ); + const name = declarations.length === 1 ? declarations[0]!.name : undefined; + if (name === undefined || !ts.isIdentifier(name)) return false; + const result = name.text; + if (text(call) !== `var ${result} = ${factoryName}(require, exports);`) return false; + if (text(assign) !== `if (${result} !== undefined) module.exports = ${result};`) return false; + const amd = test.elseStatement; + if (amd === undefined) return true; + if (!ts.isIfStatement(amd) || amd.elseStatement !== undefined) return false; + if (text(amd.expression) !== 'typeof define === "function" && define.amd') return false; + const define = ts.isBlock(amd.thenStatement) ? amd.thenStatement.statements.nodes : []; + if (define.length !== 1 || !ts.isExpressionStatement(define[0]!)) return false; + const defineCall = define[0].expression; + if (!ts.isCallExpression(defineCall) || text(defineCall.expression) !== "define") return false; + const last = defineCall.arguments.nodes.at(-1); + return last !== undefined && ts.isIdentifier(last) && last.text === factoryName; } /** True when the factory body behaves the same as the module's top level: From c29ce641b2d2aba99ae56129450956e128454c08 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 19:26:00 -0500 Subject: [PATCH 49/67] Count only the repeated parts of loops as likely-hot work A `for` loop's initializer and a `for...of` loop's iterable run once, but SC6101 counted any dynamic operation inside a loop statement's span, so untyped setup there produced the warning and failed --fail-on=dynamic. Loop work is now found by walking the IR: a loop's condition, update and body repeat, its initializer and iterable do not. Locations could not tell them apart, because lowering gives the index loop of a `for...of` the whole statement's span. --- docs/content/docs/coverage.mdx | 2 +- .../src/frontend/lowering/dynamic-tier.ts | 103 +++++++++++++----- tests/coverage-fixtures/dynamic-tier/quiet.ts | 16 ++- 3 files changed, 90 insertions(+), 31 deletions(-) diff --git a/docs/content/docs/coverage.mdx b/docs/content/docs/coverage.mdx index 09f87bacd..d2fc345ad 100644 --- a/docs/content/docs/coverage.mdx +++ b/docs/content/docs/coverage.mdx @@ -77,7 +77,7 @@ warning SC6101: 3 functions that likely run often use untyped values, which runs The program compiled. Adding types to these functions lets scriptc compile them to faster code. ``` -Without a profile, a dynamic-tier function counts as likely to run often when a dynamic operation runs inside one of its loops, when a loop calls it, or when it calls itself. A function is named only when its source says why its values are untyped: a value typed `any` (for a `for...of` variable, the value it iterates), an untyped `JSON.parse` result, or an untyped JavaScript file. Dynamic code that runs once, such as setup code that reads an `any` configuration, is not reported, and neither are functions that are dynamic for an operation with no static lowering, which more types would not change. +Without a profile, a dynamic-tier function counts as likely to run often when a dynamic operation runs on every iteration of one of its loops (a `for` loop's initializer and a `for...of` loop's iterable run once), when a loop calls it, or when it calls itself. A function is named only when its source says why its values are untyped: a value typed `any` (for a `for...of` variable, the value it iterates), an untyped `JSON.parse` result, or an untyped JavaScript file. Dynamic code that runs once, such as setup code that reads an `any` configuration, is not reported, and neither are functions that are dynamic for an operation with no static lowering, which more types would not change. The warning names at most five functions, most likely to run often first, and gives the total. Dynamic-tier code in npm packages is summarized on one line with each package's function count. A build that comes from the cache repeats the warning. `--no-dynamic-tier-warning` leaves it out, and `--fail-on=dynamic` fails a coverage run on it. diff --git a/packages/compiler/src/frontend/lowering/dynamic-tier.ts b/packages/compiler/src/frontend/lowering/dynamic-tier.ts index 873b22343..72cba9942 100644 --- a/packages/compiler/src/frontend/lowering/dynamic-tier.ts +++ b/packages/compiler/src/frontend/lowering/dynamic-tier.ts @@ -1,8 +1,8 @@ /* Hot dynamic-tier functions (SC6101, diagnostics/dynamic-tier.ts): the * functions of a program that compile to the dynamic tier (ir/tiers.ts) and * likely run often, so a build can name them. Without a profile, a function - * counts as likely hot when a dynamic operation runs inside one of its - * loops, when a loop calls it, or when it calls itself. Dynamic code that + * counts as likely hot when a dynamic operation runs on every iteration of + * one of its loops, when a loop calls it, or when it calls itself. Dynamic code that * runs once (setup code that reads an `any` configuration, for example) * stays quiet. * @@ -21,8 +21,12 @@ import { type UntypedCause, } from "../../diagnostics/dynamic-tier.js"; import type { IrExpr, IrFunction, IrModule, IrStmt, SrcLoc } from "../../ir/ir.js"; -import { dynamicOperationSites } from "../../ir/tiers.js"; -import { everyStmtList } from "../../ir/traverse.js"; +import { + dynamicOperationOf, + dynamicOperationSites, + type DynamicOperationSite, +} from "../../ir/tiers.js"; +import { everyExprChild, everyStmtChild } from "../../ir/traverse.js"; import * as ts from "../ts7/adapter.js"; import { isCheckedJsSourceFile, isJsSourceFile } from "../program.js"; import { isNodeModulesPath } from "../resolve.js"; @@ -46,30 +50,73 @@ export interface DynamicTierReport { packages: DynamicTierPackageCount[]; } -const LOOP_KINDS = new Set(["while", "doWhile", "for", "forOf"]); - -function within(loc: SrcLoc, spans: readonly SrcLoc[]): boolean { - return spans.some((s) => s.file === loc.file && s.start <= loc.start && loc.end <= s.end); -} - interface FunctionFacts { - loops: SrcLoc[]; - /** Callee names of direct calls, with each call's location. */ - calls: { callee: string; loc: SrcLoc }[]; + /** Dynamic operations in the parts of the function's loops that run on + * every iteration. */ + loopSites: DynamicOperationSite[]; + /** Callee names of direct calls, and whether each runs on every + * iteration of a loop. */ + calls: { callee: string; inLoop: boolean }[]; } +/** Walks a function body by structure: a loop's condition, update and body + * repeat, while a `for` loop's initializer and a `for...of` loop's iterable + * run once. (Locations cannot tell them apart: lowering may give a loop's + * repeated parts the whole statement's span.) */ function factsOf(fn: IrFunction): FunctionFacts { - const facts: FunctionFacts = { loops: [], calls: [] }; - everyStmtList(fn.body, { - stmt: (s: IrStmt) => { - if (LOOP_KINDS.has(s.kind)) facts.loops.push(s.loc); - return true; - }, - expr: (e: IrExpr) => { - if (e.kind === "call") facts.calls.push({ callee: e.callee, loc: e.loc }); - return true; - }, - }); + const facts: FunctionFacts = { loopSites: [], calls: [] }; + const expr = (e: IrExpr, inLoop: boolean): void => { + if (inLoop) { + const operation = dynamicOperationOf(e); + if (operation !== null) facts.loopSites.push({ operation, loc: e.loc }); + } + if (e.kind === "call") facts.calls.push({ callee: e.callee, inLoop }); + everyExprChild( + e, + (child) => { + expr(child, inLoop); + return true; + }, + (child) => { + stmt(child, inLoop); + return true; + }, + ); + }; + const children = (s: IrStmt, inLoop: boolean): void => { + everyStmtChild( + s, + (child) => { + expr(child, inLoop); + return true; + }, + (child) => { + stmt(child, inLoop); + return true; + }, + ); + }; + const stmt = (s: IrStmt, inLoop: boolean): void => { + switch (s.kind) { + case "for": + if (s.init !== null) stmt(s.init, inLoop); + if (s.cond !== null) expr(s.cond, true); + if (s.update !== null) stmt(s.update, true); + for (const b of s.body) stmt(b, true); + return; + case "forOf": + expr(s.iterable, inLoop); + for (const b of s.body) stmt(b, true); + return; + case "while": + case "doWhile": + children(s, true); + return; + default: + children(s, inLoop); + } + }; + for (const s of fn.body) stmt(s, false); return facts; } @@ -202,7 +249,7 @@ export function scanDynamicTier(lowerer: Lowerer, module: IrModule): DynamicTier const calledInLoop = new Set(); for (const fn of module.functions) { const f = facts.get(fn.name)!; - for (const call of f.calls) if (within(call.loc, f.loops)) calledInLoop.add(call.callee); + for (const call of f.calls) if (call.inLoop) calledInLoop.add(call.callee); } const hot: HotDynamicFunction[] = []; const packages = new Map(); @@ -218,7 +265,7 @@ export function scanDynamicTier(lowerer: Lowerer, module: IrModule): DynamicTier } const f = facts.get(fn.name)!; const sites = dynamicOperationSites(fn); - const inLoops = sites.filter((s) => within(s.loc, f.loops)); + const inLoops = f.loopSites; const recursive = f.calls.some((c) => c.callee === fn.name); const reason: HotReason | null = inLoops.length > 0 @@ -231,7 +278,9 @@ export function scanDynamicTier(lowerer: Lowerer, module: IrModule): DynamicTier if (reason === null) continue; // Only functions the source makes dynamic are named: ones dynamic for // operations without a static lowering would stay dynamic with more types. - const cause = causeOf(lowerer, [...inLoops, ...sites.filter((s) => !inLoops.includes(s))]); + const looped = new Set(inLoops.map((s) => `${s.loc.file}:${s.loc.start}:${s.loc.end}`)); + const rest = sites.filter((s) => !looped.has(`${s.loc.file}:${s.loc.start}:${s.loc.end}`)); + const cause = causeOf(lowerer, [...inLoops, ...rest]); if (cause === null) continue; hot.push({ name: fn.name, diff --git a/tests/coverage-fixtures/dynamic-tier/quiet.ts b/tests/coverage-fixtures/dynamic-tier/quiet.ts index d045a9392..1b0a212ea 100644 --- a/tests/coverage-fixtures/dynamic-tier/quiet.ts +++ b/tests/coverage-fixtures/dynamic-tier/quiet.ts @@ -1,5 +1,6 @@ -// An untyped configuration read once at startup: dynamic, but not hot, so -// the build names nothing. The hot loop is typed. +// Untyped values read once (a configuration at startup, a loop's +// initializer, a for...of iterable): dynamic, but not hot, so the build +// names nothing. The loops repeat only typed work. const config: any = JSON.parse('{"scale": 3, "label": "sum"}'); const scale: number = config.scale; const label: string = config.label; @@ -10,4 +11,13 @@ function sum(values: number[]): number { return total; } -console.log(label, sum([1, 2, 3])); +// Untyped values read once, in a loop's initializer and in a for...of +// iterable: the loops repeat only typed work. +function offsets(raw: any): number { + let total = 0; + for (let i: number = raw.start; i < 3; i++) total += i; + for (const n of raw.extra as number[]) total += n; + return total; +} + +console.log(label, sum([1, 2, 3]), offsets({ start: 1, extra: [4, 5] })); From 5bcd68f1aec0783a468d2053e146a86b70f52eb8 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 19:31:44 -0500 Subject: [PATCH 50/67] Address the third review round on array named properties --- packages/runtime/src/scr_json.c | 19 ++++++++++++++----- .../6987-array-view-named-properties.ts | 10 ++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/packages/runtime/src/scr_json.c b/packages/runtime/src/scr_json.c index f62ef0165..89007a6ac 100644 --- a/packages/runtime/src/scr_json.c +++ b/packages/runtime/src/scr_json.c @@ -10279,20 +10279,29 @@ void scr_dyn_key_delete(ScrDyn *recv, const ScrStr *key, bool strict) { !scr_typed_ref_is_length(key) && !scr_typed_ref_canonical_index(key->data, key->len, &element)) { double number; bool numeric = scr_arr_numeric_key(key->data, key->len, &number); - if (numeric) scr_arr_delete(recv->v.typed_ref.ptr, number); if (recv->v.typed_ref.commit) { ScrDyn *view = scr_dyn_typed_ref_materialize(recv); if (!scr_exc_pending() && view->kind == SCR_DYN_ARR) { - bool own = view->v.arr.properties && scr_dyn_obj_get(view->v.arr.properties, key->data, key->len); - if (own) scr_dyn_key_delete(view, key, strict); - if (own && !scr_exc_pending()) scr_dyn_typed_ref_commit(recv); + ScrDynEntry *own = view->v.arr.properties ? scr_dyn_entry(view->v.arr.properties, key) : NULL; + /* A non-configurable property refuses the delete before either + * store changes. */ + if (own && !own->configurable) { + scr_dyn_key_delete(view, key, strict); + } else { + if (numeric) scr_arr_delete(recv->v.typed_ref.ptr, number); + if (own) scr_dyn_key_delete(view, key, strict); + if (own && !scr_exc_pending()) scr_dyn_typed_ref_commit(recv); + } scr_dyn_release(view); return; } scr_dyn_release(view); if (scr_exc_pending()) return; } - if (numeric) return; + if (numeric) { + scr_arr_delete(recv->v.typed_ref.ptr, number); + return; + } } if (recv->kind == SCR_DYN_FUNC) { if (scr_dyn_fn_property_fence(key)) return; diff --git a/tests/corpus/6987-array-view-named-properties.ts b/tests/corpus/6987-array-view-named-properties.ts index faba7dc90..ee357d072 100644 --- a/tests/corpus/6987-array-view-named-properties.ts +++ b/tests/corpus/6987-array-view-named-properties.ts @@ -102,3 +102,13 @@ for (const key in visited) { console.log("visited key", key); if (key === "first") delete (visited as unknown as Bag).second; } + +// A non-configurable numeric-looking property refuses the delete and stays. +const fixed: string[] = ["a"]; +Object.defineProperty(fixed as unknown as Bag, "-3", { value: "kept", enumerable: true }); +try { + delete (fixed as unknown as Bag)["-3"]; +} catch (e) { + console.log((e as Error).name); +} +console.log((fixed as unknown as Bag)["-3"], "-3" in (fixed as unknown as Bag)); From 62ddc2fd352c6f0dadb9cb80b531201cbc7ec3b2 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 19:31:56 -0500 Subject: [PATCH 51/67] Read a class branch's own-property bag from its receiver --- .../lowering/class-dynamic-dispatch.test.ts | 82 +++++++++ .../lowering/class-dynamic-dispatch.ts | 169 +++++++++++++++--- .../corpus/6943-js-class-branch-bags.js.json | 6 + tests/corpus/6943-js-class-branch-bags.js | 67 +++++++ .../6943-js-class-branch-bags.js.json | 1 + 5 files changed, 296 insertions(+), 29 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6943-js-class-branch-bags.js.json create mode 100644 tests/corpus/6943-js-class-branch-bags.js create mode 100644 tests/harness/corpus-costs/6943-js-class-branch-bags.js.json diff --git a/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.test.ts b/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.test.ts index dfb8bd7a5..6923841bd 100644 --- a/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.test.ts +++ b/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.test.ts @@ -475,3 +475,85 @@ test("normalizes base capsules before dispatching each derived member once", () ], }); }); + +test("class branches read their exact class's bag, also for classes with subclasses", () => { + const { lowerer, liftedFns } = context(); + const base = { + def: { name: "Base", fields: [{ name: "value", type: F64 }], tracksOwnFields: true }, + fields: new Map([["value", F64]]), + methods: new Map(), + base: null, + subclasses: [], + } as unknown as ClassInfo; + const child = { + def: { + name: "Child", + base: "Base", + fields: [{ name: "value", type: F64 }], + tracksOwnFields: true, + }, + fields: new Map([["value", F64]]), + methods: new Map(), + base, + subclasses: [], + } as unknown as ClassInfo; + base.subclasses.push(child); + lowerer.classes.set("Base", base); + lowerer.classes.set("Child", child); + lowerer.classCanBeConstructed = () => true; + lowerer.isSubclassOf = (name, parent) => name === "Child" && parent === "Base"; + lowerer.coerceToExpected = (value, type) => + type.kind === "dyn" ? { kind: "dynFrom", value, type, loc } : value; + const boxes = fn( + "boxes", + [base, child].map((info) => + statement({ + kind: "dynFrom", + value: { + kind: "varRef", + localId: info.def.name, + type: { kind: "object", className: info.def.name }, + loc, + }, + type: DYN, + loc, + }), + ), + ); + const read = fn("read", [ + statement({ + kind: "dynKeyGet", + value: variable("value"), + key: literal("value"), + type: DYN, + loc, + }), + ]); + const dispatch = new ClassDynamicDispatch(); + for (let pass = 0; pass < 4 && dispatch.process(lowerer, [boxes, read, ...liftedFns]); pass++); + dispatch.finalize(lowerer); + const property = liftedFns.find((helper) => helper.name.startsWith("%dyn.class.property."))!; + // The class branches; the fallback for other receivers keeps the + // dispatch over every class. + const branches = property.body.filter( + (statement) => + statement.kind === "if" && + statement.cond.kind === "libCall" && + statement.cond.fn === "dyn.typedRefIs", + ); + expect(branches).toHaveLength(2); + const text = JSON.stringify(branches); + expect(text).toContain('"callee":"%class.branchPropertiesOrEmpty:Base"'); + expect(text).toContain('"callee":"%class.branchPropertiesOrEmpty:Child"'); + expect(text).not.toContain('"callee":"%dyn.class.readPropertiesOrEmpty"'); + const bag = liftedFns.find((helper) => helper.name === "%class.branchPropertiesOrEmpty:Base")!; + // The bag is the receiver's own field; an absent bag reads as a fresh, + // unstored empty object. + expect(bag.params[0]!.type).toEqual({ kind: "object", className: "Base" }); + expect(JSON.stringify(bag.body)).toContain('"className":"Base","field":"%dynProperties"'); + expect(JSON.stringify(bag.body)).not.toContain('"kind":"fieldSet"'); + expect(bag.body[0]).toMatchObject({ + kind: "if", + then: [{ kind: "return", value: { kind: "dynObjLit", fields: [] } }], + }); +}); diff --git a/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.ts b/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.ts index c891c14cc..9dd7681a6 100644 --- a/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.ts +++ b/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.ts @@ -386,6 +386,26 @@ function readOnlyBagBody(body: IrStmt[], orEmpty = false): IrStmt[] { return body; } +/** `value` with the class branch's checked receiver (`p.0` as a dynamic + * value, possibly cast to the branch's class) replaced by `receiver`, the + * typed receiver of a per-class helper. */ +function withTypedReceiver(value: IrExpr, receiver: IrExpr): IrExpr { + const checked = (e: IrExpr): boolean => + e.kind === "dynCheck" && e.value.kind === "varRef" && e.value.localId === "p.0"; + return transformExpr(value, { + stmt: (stmt) => stmt, + expr: (expr) => + (expr.kind === "downcast" && + checked(expr.value) && + expr.type.kind === "object" && + receiver.type.kind === "object" && + expr.type.className === receiver.type.className) || + checked(expr) + ? receiver + : expr, + }); +} + export function classPropertiesHelper(lowerer: Lowerer, loc: SrcLoc, readOnly = false): IrFunction { const name = readOnly ? READ_PROPERTIES : "%dyn.class.properties"; const existing = lowerer.liftedFnNamed(name); @@ -728,7 +748,11 @@ export class ClassDynamicDispatch { private readonly readPropertyBags: { helper: IrFunction; initialize: Extract; + orEmpty?: boolean; }[] = []; + /** Read-only bags of exactly one class (exactPropertyBag), by class and + * whether an absent bag reads as a fresh empty object. */ + private readonly exactPropertyBags = new Map(); private readonly generated = new Set(); /** Protocol dispatch helpers and callee reads whose receivers normalize. */ private readonly protocols: IrFunction[] = []; @@ -2557,7 +2581,6 @@ export class ClassDynamicDispatch { if (dispatch.classes.has(plan.key) || !matching!.has(info)) continue; dispatch.classes.add(plan.key); const loc = dispatch.source.loc; - const value = varRef("p.0", DYN, loc); const { receiver, condition } = this.propertyReceiver(plan, loc); if (isClassCallback(lowerer, info, dispatch.source.method)) { const prototypeMethod = observedPrototypeMethod( @@ -2567,7 +2590,7 @@ export class ClassDynamicDispatch { loc, receiver, ); - const bag = this.readPropertyBagOrEmpty(lowerer, value, loc); + const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc); const methodKey: IrExpr = { kind: "strLit", value: dispatch.source.method, @@ -2825,10 +2848,19 @@ export class ClassDynamicDispatch { dispatch.classes.add(plan.key); const loc = dispatch.fn.loc; const { receiver, condition } = this.propertyReceiver(plan, loc); + // The branch checks its receiver once: each use of the checked + // receiver would repeat the check. + const local = `receiver.${dispatch.fn.locals.length}`; + dispatch.fn.locals.push({ + id: local, + name: "receiver", + type: receiver.type, + mutable: false, + }); const before = lowerer.diags.length; let branch: IrStmt[]; try { - branch = this.propertyBody(lowerer, dispatch, info, receiver); + branch = this.propertyBody(lowerer, dispatch, info, varRef(local, receiver.type, loc)); } catch (error) { if (!(error instanceof PoisonError) || !info.decl) throw error; const fence = lowerer.deferToRuntimeFence(before, info.decl, { kind: "statement" }); @@ -2838,7 +2870,7 @@ export class ClassDynamicDispatch { dispatch.fn.body.unshift({ kind: "if", cond: condition, - then: branch, + then: [{ kind: "varDecl", localId: local, init: receiver, loc }, ...branch], else_: null, loc, }); @@ -2938,11 +2970,7 @@ export class ClassDynamicDispatch { !info.fields.has(name) && observedPrototypeMethod(lowerer, info, name, loc, receiver); if (info.fields.has(name) || (dispatch.probe === "in" && !prototypeMethod)) { if (info.fields.has(name) && info.def.tracksOwnFields) { - const bag = this.readPropertyBagOrEmpty( - lowerer, - lowerer.coerceToExpected(receiver, DYN), - loc, - ); + const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc); const symbol = symbolMemberKey(lowerer, info, name, loc); const fn = dispatch.probe === "in" @@ -2968,11 +2996,7 @@ export class ClassDynamicDispatch { { kind: "return", value: { kind: "boolLit", value: true, type: BOOL, loc }, loc }, ]; } - const bag = this.readPropertyBagOrEmpty( - lowerer, - lowerer.coerceToExpected(receiver, DYN), - loc, - ); + const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc); const symbol = name.startsWith("sym:") || name.startsWith("%symbol:"); const fn = dispatch.probe === "in" @@ -3042,9 +3066,8 @@ export class ClassDynamicDispatch { } const branches: IrStmt[] = []; if (!dispatch.write && !dispatch.reflect && !info.def.tracksOwnFields) { - const value = varRef("p.0", DYN, loc); const key = varRef("p.key", DYN, loc); - const bag = this.readPropertyBagOrEmpty(lowerer, value, loc); + const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc); branches.push({ kind: "if", cond: { @@ -4070,6 +4093,98 @@ export class ClassDynamicDispatch { return helper; } + /** The read-only bag a class branch reads for its receiver: the + * receiver's own field when the branch selected the receiver's exact + * class, otherwise the dispatch over every class (readPropertyBag, or + * readPropertyBagOrEmpty with `orEmpty`). */ + private branchPropertyBag( + lowerer: Lowerer, + info: ClassInfo, + receiver: IrExpr, + orEmpty: boolean, + loc: SrcLoc, + ): IrExpr { + const helper = this.exactPropertyBag(lowerer, info, receiver, orEmpty, loc); + if (helper) return { kind: "call", callee: helper.name, args: [receiver], type: DYN, loc }; + return orEmpty + ? this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc) + : this.readPropertyBag(lowerer, receiver, loc); + } + + /** `%class.branchProperties[OrEmpty]:(receiver)`: the read-only bag of + * an instance of exactly `info`. A class branch of the dispatch helpers + * selects a canonical receiver (normalizeDispatches gives an instance its + * actual class's capsule), so its branch for `info` sees only instances + * of `info`; instances of its subclasses take their own branches. Such a + * receiver needs neither the dispatch over every class nor a boxed copy of + * itself. Null + * when `receiver` is not typed as `info`, when a runtime or builtin class + * in the family keeps its own property contract, or before the class has + * a bag. */ + private exactPropertyBag( + lowerer: Lowerer, + info: ClassInfo, + receiver: IrExpr, + orEmpty: boolean, + loc: SrcLoc, + ): IrFunction | null { + const type = receiver.type; + if (type.kind !== "object" || type.className !== info.def.name) return null; + for (let current: ClassInfo | null = info; current; current = current.base) + if ( + current.def.runtime || + current.builtinEmitter || + current.builtinStream || + current.builtinError + ) + return null; + const key = `${type.className}:${orEmpty}`; + const existing = this.exactPropertyBags.get(key); + if (existing) return existing; + const initializers = this.bagInitializers.get(type.className); + if (!initializers) return null; + const self = varRef("p.0", type, loc); + const bag: IrExpr = { + kind: "fieldGet", + obj: self, + className: type.className, + field: PROPERTY_BAG, + type: DYN, + loc, + }; + const initialize: Extract = { + ...initializers[0]!, + obj: self, + value: withTypedReceiver(initializers[0]!.value, self), + loc, + }; + const helper: IrFunction = { + name: `%class.branchProperties${orEmpty ? "OrEmpty" : ""}:${type.className}`, + params: [{ localId: "p.0", name: "value", type }], + returnType: DYN, + locals: [{ id: "p.0", name: "value", type, mutable: false }], + loc, + body: [ + { + kind: "if", + cond: { kind: "dynTest", test: "undefined", value: bag, type: BOOL, loc }, + then: [initialize], + else_: null, + loc, + }, + { kind: "return", value: bag, loc }, + ], + }; + // Initializers gain their prototype as subclasses become constructible; + // finalize then turns the lazy store into the read's result. + initializers.push(initialize); + this.exactPropertyBags.set(key, helper); + this.readPropertyBags.push({ helper, initialize, orEmpty }); + this.generated.add(helper); + lowerer.liftedFns.push(helper); + return helper; + } + /** The prototype a new property bag of `current` (or of the subclass the * receiver is) starts from, or null when `current` has no prototype data. * A class with constructible subclasses that have prototype data selects @@ -4149,9 +4264,9 @@ export class ClassDynamicDispatch { * prototype-backed bag is produced for this read only. A published object * cannot take the store, and Node's reads never write. */ finalize(lowerer?: Lowerer): void { - for (const { helper, initialize } of this.readPropertyBags) { + for (const { helper, initialize, orEmpty } of this.readPropertyBags) { const absent = helper.body[0]; - if (isEmptyBag(initialize.value)) helper.body.shift(); + if (isEmptyBag(initialize.value) && !orEmpty) helper.body.shift(); else if (absent?.kind === "if") absent.then = [{ kind: "return", value: initialize.value, loc: initialize.loc }]; } @@ -4733,7 +4848,7 @@ export class ClassDynamicDispatch { cond: this.readBagHas( lowerer, "dyn.hasKey", - this.readPropertyBag(lowerer, receiver, loc), + this.branchPropertyBag(lowerer, info, receiver, false, loc), key, loc, ), @@ -4748,7 +4863,7 @@ export class ClassDynamicDispatch { { kind: "return", value: null, loc }, ]; } - const bag = this.readPropertyBag(lowerer, receiver, loc); + const bag = this.branchPropertyBag(lowerer, info, receiver, false, loc); return [ { kind: "return", @@ -4816,7 +4931,7 @@ export class ClassDynamicDispatch { ) { this.constructors.set(info.def.name, info); const cls = lowerer.coerceToExpected(classValueRef(lowerer, info, info.decl), DYN); - const bag = this.readPropertyBag(lowerer, receiver, loc); + const bag = this.branchPropertyBag(lowerer, info, receiver, false, loc); const key: IrExpr = { kind: "strLit", value: name, type: STRING, loc }; return [ { @@ -4894,7 +5009,7 @@ export class ClassDynamicDispatch { if (symbol || (isClassOwnEnumerableFieldName(name) && !name.startsWith("sym:"))) { const prototypeMethod = observedPrototypeMethod(lowerer, info, name, loc, receiver); // Selecting the method must not give the object own storage. - const bag = this.readPropertyBag(lowerer, receiver, loc); + const bag = this.branchPropertyBag(lowerer, info, receiver, false, loc); const key: IrExpr = symbol ?? { kind: "strLit", value: name, type: STRING, loc }; body.push({ kind: "if", @@ -4962,7 +5077,7 @@ export class ClassDynamicDispatch { } if (!field && !accessor) { const instance = lowerer.coerceToExpected(receiver, DYN); - const bag = this.readPropertyBagOrEmpty(lowerer, instance, loc); + const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc); const key: IrExpr = { kind: "strLit", value: name, type: STRING, loc }; const own: IrExpr = { kind: "libCall", @@ -5009,11 +5124,7 @@ export class ClassDynamicDispatch { (t.kind === "union" && (getUnion(t.unionId)?.arms.some(mutable) ?? false)); if (boxed.kind === "dynFrom" && mutable(boxed.value.type)) boxed.liveRef = true; if (accessor) { - const bag = this.readPropertyBagOrEmpty( - lowerer, - lowerer.coerceToExpected(receiver, DYN), - loc, - ); + const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc); const key: IrExpr = { kind: "strLit", value: name, type: STRING, loc }; return [ { @@ -5040,7 +5151,7 @@ export class ClassDynamicDispatch { } if (field && info.def.tracksOwnFields) { const instance = lowerer.coerceToExpected(receiver, DYN); - const bag = this.readPropertyBagOrEmpty(lowerer, instance, loc); + const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc); const symbol = symbolMemberKey(lowerer, info, name, loc); const key: IrExpr = symbol ?? { kind: "strLit", value: name, type: STRING, loc }; return [ diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6943-js-class-branch-bags.js.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6943-js-class-branch-bags.js.json new file mode 100644 index 000000000..31675c66e --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6943-js-class-branch-bags.js.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6943-js-class-branch-bags.js" + ], + "diags": [] +} diff --git a/tests/corpus/6943-js-class-branch-bags.js b/tests/corpus/6943-js-class-branch-bags.js new file mode 100644 index 000000000..b3f91f8d8 --- /dev/null +++ b/tests/corpus/6943-js-class-branch-bags.js @@ -0,0 +1,67 @@ +// Untyped reads of class instances in a hierarchy: own properties added at +// runtime shadow methods and accessors, prototype data answers while an +// instance has no own properties, and computed keys and key probes see the +// same members, for the base class and for each subclass. + +class Shape { + constructor(name) { + this.name = name; + this.sides = 0; + } + area() { + return 0; + } + get label() { + return `${this.name}/${this.sides}`; + } +} +class Square extends Shape { + constructor(size) { + super("square"); + this.sides = 4; + this.size = size; + } + area() { + return this.size * this.size; + } +} +class Tile extends Square { + constructor(size, color) { + super(size); + this.color = color; + } +} +Shape.prototype.kind = "shape"; +Square.prototype.corner = "right"; + +function read(value, key) { + return value[key]; +} +function describe(value) { + const parts = []; + for (const key of ["name", "sides", "size", "color", "kind", "corner", "label", "missing"]) + parts.push(`${key}=${String(read(value, key))}`); + parts.push(`in:${"area" in value},${"kind" in value},${"extra" in value}`); + parts.push(`own:${Object.hasOwn(value, "kind")},${Object.hasOwn(value, "size")}`); + return parts.join(" "); +} + +const shapes = [new Shape("dot"), new Square(3), new Tile(2, "red")]; +for (const shape of shapes) console.log(describe(shape), shape.area(), shape.label); + +const untyped = shapes.map((shape) => /** @type {any} */ (shape)); +untyped[1].area = () => -1; +untyped[2].kind = "tile"; +untyped[2].extra = 7; +try { + untyped[0].label = "plain"; +} catch (error) { + console.log(error.name); +} +Object.defineProperty(untyped[0], "label", { value: "plain", enumerable: true }); +for (const shape of untyped) { + console.log(describe(shape), typeof shape.area, shape.area(), shape.kind, shape.extra); + console.log(read(shape, "area") === Shape.prototype.area, read(shape, "label")); +} +const area = untyped[2].area; +console.log(area.call(new Tile(5, "blue")), Object.keys(untyped[2]).join(",")); diff --git a/tests/harness/corpus-costs/6943-js-class-branch-bags.js.json b/tests/harness/corpus-costs/6943-js-class-branch-bags.js.json new file mode 100644 index 000000000..9a69600b1 --- /dev/null +++ b/tests/harness/corpus-costs/6943-js-class-branch-bags.js.json @@ -0,0 +1 @@ +{ "plain": 4400, "san": 4900 } From ed5f54c93684b4dbfa87f6e3b6903b4ffd9d1a7b Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 19:51:21 -0500 Subject: [PATCH 52/67] Keep constructor types of fetched provenance sources unmapped Constructor types declared in the program hold class values as checked-dynamic values since #1725. A fetched provenance source counts as a program file, so the unused `@__PURE__` const typed `{ new (): any }` in the provenance fixture now had a mapping, no longer elided, and its initializer refused (SC1090). Fetched sources keep their constructor types unmapped, as before #1725. --- packages/compiler/src/frontend/type-mapper.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/compiler/src/frontend/type-mapper.ts b/packages/compiler/src/frontend/type-mapper.ts index b0e3a6dc9..37d6a5807 100644 --- a/packages/compiler/src/frontend/type-mapper.ts +++ b/packages/compiler/src/frontend/type-mapper.ts @@ -46,6 +46,7 @@ import { literalValues } from "./literal-values.js"; import { remapUnionDiscriminant } from "./union-discriminants.js"; import { isJsSourceFile, isNodeTypesPath } from "./program.js"; +import { isProvenanceSourceFile } from "./provenance-registry.js"; import { functionCanReturnUndefined } from "./function-completion.js"; import { accessorSlotProp, recordTextCodecClass } from "../ir/ir.js"; // typeKey moved to ir/ir.ts (the backend needs it too, for per-type @@ -2466,12 +2467,17 @@ function mapTypeInner(type: ts.Type, ctx: TypeMapperCtx): IrType | null { // value rides the checked-dynamic tree, as an `unknown` slot already // holds one. `new` through it and static reads dispatch at run time, // and the constructed value checks into the signature's instance type. - // Lib and package constructables keep their fences. + // Lib and package constructables keep their fences, and so do those of + // fetched provenance sources (third-party code under its own policies: + // an unused `@__PURE__` const typed `{ new (): any }` elides there). if ( ctorSigs.length > 0 && checker.getCallSignatures(widened).length === 0 && (widened.getSymbol()?.declarations.length ?? 0) > 0 && - widened.getSymbol()!.declarations.every((d) => ctx.isProgramFile(ts.getSourceFileOfNode(d))) + widened.getSymbol()!.declarations.every((d) => { + const sf = ts.getSourceFileOfNode(d); + return ctx.isProgramFile(sf) && !isProvenanceSourceFile(sf.fileName); + }) ) { return DYN; } From e7f3b205c3d3fda06412fedf9a12bd0ed2096998 Mon Sep 17 00:00:00 2001 From: Malte Ubl Date: Wed, 21 Oct 2026 17:53:28 -0700 Subject: [PATCH 53/67] Fetch the CI dev libnode from scriptc's mirror first The prerelease libnode-dev-24.22.1 mirrors the dockfries v24.22.1 libnode, Node's v24.22.1 headers and Node's license byte for byte, as CI-only inputs (not a scriptc release). dev-pack.json lists the mirror first and the original locations after it; fetch-dev-pack.mjs takes the first source whose bytes match the pinned sha256 and logs which one it used. Co-Authored-By: Claude Opus 5.5 --- packages/libnode-common/dev-pack.json | 12 ++++++-- packages/libnode-common/fetch-dev-pack.mjs | 35 ++++++++++++++++------ 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/packages/libnode-common/dev-pack.json b/packages/libnode-common/dev-pack.json index 7544d44c4..6c521cbb6 100644 --- a/packages/libnode-common/dev-pack.json +++ b/packages/libnode-common/dev-pack.json @@ -1,14 +1,20 @@ { - "comment": "Temporary libnode source for CI until the NI-13 packs (@scriptc/libnode-) exist: the community dockfries/libnode build of the newest patch of the pinned Node line (its v24.22.0 asset was withdrawn when v24.22.1 shipped), plus Node's official headers for the bridge. fetch-dev-pack.mjs verifies both hashes.", + "comment": "Temporary libnode source for CI until the NI-13 packs (@scriptc/libnode-) exist: the community dockfries/libnode build of Node 24.22.1 and Node's official headers for the bridge. The first URL is scriptc's CI-only mirror (prerelease libnode-dev-24.22.1), the others the original locations; fetch-dev-pack.mjs tries them in order and verifies the sha256.", "nodeVersion": "24.22.1", "linux-x64": { "libnode": { - "url": "https://github.com/dockfries/libnode/releases/download/v24.22.1/libnode-linux-x64.tar.gz", + "urls": [ + "https://github.com/vercel-labs/scriptc/releases/download/libnode-dev-24.22.1/libnode-linux-x64.tar.gz", + "https://github.com/dockfries/libnode/releases/download/v24.22.1/libnode-linux-x64.tar.gz" + ], "sha256": "b02809c5d332516cc72890fec0cbbca404bac526bd0f841e00a8a6056ec1ff54", "file": "libnode.so.137" }, "headers": { - "url": "https://nodejs.org/dist/v24.22.1/node-v24.22.1-headers.tar.gz", + "urls": [ + "https://github.com/vercel-labs/scriptc/releases/download/libnode-dev-24.22.1/node-v24.22.1-headers.tar.gz", + "https://nodejs.org/dist/v24.22.1/node-v24.22.1-headers.tar.gz" + ], "sha256": "322e0a27db9088093ab8347bdc8c7e0aaa21dc9ed548390bf06b394494c09267", "dir": "node-v24.22.1/include/node" } diff --git a/packages/libnode-common/fetch-dev-pack.mjs b/packages/libnode-common/fetch-dev-pack.mjs index 78b7b13fe..5c4bafc90 100644 --- a/packages/libnode-common/fetch-dev-pack.mjs +++ b/packages/libnode-common/fetch-dev-pack.mjs @@ -29,15 +29,32 @@ if (pins === undefined) { const work = mkdtempSync(join(tmpdir(), "scriptc-libnode-dev-")); -async function fetchVerified({ url, sha256 }, name) { - const response = await fetch(url); - if (!response.ok) throw new Error(`${url}: HTTP ${response.status}`); - const bytes = Buffer.from(await response.arrayBuffer()); - const actual = createHash("sha256").update(bytes).digest("hex"); - if (actual !== sha256) throw new Error(`${url}: sha256 ${actual}, expected ${sha256}`); - const path = join(work, name); - writeFileSync(path, bytes); - execFileSync("tar", ["-xzf", path, "-C", work]); +/** Downloads from the first URL that answers with the pinned bytes: the + * mirror, then the original locations. */ +async function fetchVerified({ urls, sha256 }, name) { + const failures = []; + for (const url of urls) { + let bytes; + try { + const response = await fetch(url); + if (!response.ok) throw new Error(`HTTP ${response.status}`); + bytes = Buffer.from(await response.arrayBuffer()); + } catch (error) { + failures.push(`${url}: ${error.message}`); + continue; + } + const actual = createHash("sha256").update(bytes).digest("hex"); + if (actual !== sha256) { + failures.push(`${url}: sha256 ${actual}, expected ${sha256}`); + continue; + } + console.log(`fetched ${name} from ${url} (sha256 ${sha256})`); + const path = join(work, name); + writeFileSync(path, bytes); + execFileSync("tar", ["-xzf", path, "-C", work]); + return; + } + throw new Error(`no source for ${name} matched its pin:\n${failures.join("\n")}`); } await fetchVerified(pins.libnode, "libnode.tar.gz"); From 1c03c0c17f5ea2c190d12075662345b440e991cf Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 20:07:00 -0500 Subject: [PATCH 54/67] Skip the pending test after callbacks that cannot throw An array helper specialized for its callback calls the callback's function directly once the closure's entry matches it, and falls back to the entry otherwise. Both paths were followed by the pending-exception test. When the direct target is outside the may-throw set, only the fallback can leave an exception pending, so the test now runs behind a guard that is true on that path alone; a known closure called directly skips it. Worker programs keep the test on every path, where it also observes termination. --- packages/compiler/src/backend/llvm/emitter.ts | 25 +++++++- .../compiler/src/backend/llvm/expr-calls.ts | 17 +++++- .../test/callback-pending-emission.test.ts | 57 +++++++++++++++++++ 3 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 packages/compiler/test/callback-pending-emission.test.ts diff --git a/packages/compiler/src/backend/llvm/emitter.ts b/packages/compiler/src/backend/llvm/emitter.ts index 1dcd1f6c8..4504ae58e 100644 --- a/packages/compiler/src/backend/llvm/emitter.ts +++ b/packages/compiler/src/backend/llvm/emitter.ts @@ -2496,8 +2496,14 @@ export class LlEmitter { * releases the dummy (NULL for refcounted kinds) harmlessly. A scalar * call result of the function's return type may be passed as the unwind's * dummy value (see emitUnwind). `poll` marks a worker termination poll - * (function entry or loop budget), whose test must stay ordered. */ - emitPendingCheck(passThrough?: { name: string; type: IrType }, poll = false): void { + * (function entry or loop budget), whose test must stay ordered. A + * `guard` (an i1) limits the test to the paths where it is true: false + * where the joined call could not have left anything pending. */ + emitPendingCheck( + passThrough?: { name: string; type: IrType }, + poll = false, + guard?: string, + ): void { const through = passThrough !== undefined && this.llType(passThrough.type) === this.llType(this.currentReturnType) && @@ -2506,6 +2512,13 @@ export class LlEmitter { : undefined; const B = this.B; if (B.isTerminated()) return; + let skip: string | undefined; + if (guard !== undefined) { + const test = B.newLabel("exc.t"); + skip = B.newLabel("exc.n"); + B.condBr(guard, test, skip); + B.startBlock(test); + } if (this.mod.lib !== undefined) { this.declare(`declare zeroext i1 @scr_exc_pending()`); const p = B.tmp(); @@ -2516,6 +2529,10 @@ export class LlEmitter { B.startBlock(lu); this.emitUnwind(through); B.startBlock(lk); + if (skip !== undefined) { + B.br(skip); + B.startBlock(skip); + } return; } // Executables test the active exception cell's kind inline (its first @@ -2588,6 +2605,10 @@ export class LlEmitter { B.startBlock(lu); this.emitUnwind(through); B.startBlock(lk); + if (skip !== undefined) { + B.br(skip); + B.startBlock(skip); + } } /** After a runtime call that ALWAYS leaves an exception pending (the diff --git a/packages/compiler/src/backend/llvm/expr-calls.ts b/packages/compiler/src/backend/llvm/expr-calls.ts index d02c43c32..81c44d5a6 100644 --- a/packages/compiler/src/backend/llvm/expr-calls.ts +++ b/packages/compiler/src/backend/llvm/expr-calls.ts @@ -921,9 +921,18 @@ export function emitCallExpr( ? `@${mangleBorrowedFunction(known!.name)}` : `@${mangleBorrowingWrapper(known!.name)}` : undefined; + // A known target outside the may-throw set leaves nothing pending, so + // only the entry through the closure's own pointer needs the test. + // Worker programs keep it on every path: there it also observes + // termination, which loops count on (callTestsPending). + const quiet = + known !== undefined && !host.mayThrow.has(known.name) && host.mod.workers !== true; + let pending = host.indirectMayThrow; + let pendingGuard: string | undefined; let t: string; if (direct && e.callee.kind === "closure") { t = invoke(lending ?? direct, !host.receiverReaders.ignores(known!)); + if (quiet) pending = false; } else { const fnp = B.tmp(), fn = B.tmp(); @@ -983,17 +992,21 @@ export function emitCallExpr( B.line( `${t} = phi ${host.llType(e.type)} [ ${specialized}, %${fastEnd} ], [ ${indirect}, %${fallbackEnd} ]`, ); + if (quiet && pending) { + pendingGuard = B.tmp(); + B.line(`${pendingGuard} = phi i1 [ false, %${fastEnd} ], [ true, %${fallbackEnd} ]`); + } } } if (e.type.kind === "void") { - if (host.indirectMayThrow) host.emitPendingCheck(); + if (pending) host.emitPendingCheck(undefined, false, pendingGuard); if (lent) host.releaseTemps(host.frames.pop()!); return { name: "", type: e.type }; } // The check runs AFTER the result temp joins the frame: an unwind // releases it (the dummy is NULL for refcounted returns). const out = host.own({ name: t, type: e.type }); - if (host.indirectMayThrow) host.emitPendingCheck(); + if (pending) host.emitPendingCheck(undefined, false, pendingGuard); if (lent) { host.toFrame(out); host.releaseTemps(host.frames.pop()!); diff --git a/packages/compiler/test/callback-pending-emission.test.ts b/packages/compiler/test/callback-pending-emission.test.ts new file mode 100644 index 000000000..9dcbbf0a1 --- /dev/null +++ b/packages/compiler/test/callback-pending-emission.test.ts @@ -0,0 +1,57 @@ +import { execFileSync } from "node:child_process"; +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { expect, test } from "vitest"; +import { compile, deserializeModule, validateModule } from "../src/index.js"; +import { emitLlvmModule } from "../src/backend/llvm/emitter.js"; + +// A specialized array helper calls its known callback directly after +// checking the closure's entry. A callback that cannot throw skips the +// pending test on that path, and the fallback through the closure's own +// entry keeps it; a callback that can throw keeps it on both paths. +test("known callbacks outside the may-throw set test the pending flag only on the fallback", async () => { + const dir = mkdtempSync(join(tmpdir(), "scriptc-callback-pending-")); + try { + const entry = join(dir, "main.ts"); + const output = join(dir, "main.ir.json"); + writeFileSync( + entry, + `const values = [1, 2, 3, 4]; +console.log(values.every((v) => v > 0)); +console.log(values.map((v) => v * 2).join(",")); +try { + console.log(values.every((v) => { + if (v > 2) throw new Error("stop at " + v); + return true; + })); +} catch (error) { + console.log("caught", (error as Error).message); +} +`, + ); + const lowered = await compile(entry, { outputKind: "ir", outDir: dir, outPath: output }); + if (!lowered.ok) throw new Error(JSON.stringify(lowered.diagnostics)); + const module = deserializeModule(readFileSync(output, "utf8")); + expect(validateModule(module)).toEqual([]); + const llvm = emitLlvmModule(module, {}); + const guards = [ + ...llvm.matchAll( + /(%t\d+) = phi i1 \[ false, %callback\.direct\d+ \], \[ true, %callback\.indirect\d+ \]/g, + ), + ]; + // The quiet every and map callbacks; not the throwing one. + expect(guards.length).toBe(2); + for (const [, guard] of guards) + expect(llvm).toMatch(new RegExp(`br i1 ${guard}, label %exc\\.t\\d+`)); + const helpers = llvm.split(/\n(?=define )/).filter((fn) => fn.includes("callback.direct")); + expect(helpers.filter((fn) => !/phi i1 \[ false, %callback\.direct/.test(fn))).toHaveLength(1); + + const exe = join(dir, "main"); + const built = await compile(entry, { outputKind: "exe", outDir: dir, outPath: exe }); + if (!built.ok) throw new Error(JSON.stringify(built.diagnostics)); + expect(execFileSync(exe, { encoding: "utf8" })).toBe("true\n2,4,6,8\ncaught stop at 3\n"); + } finally { + rmSync(dir, { recursive: true, force: true }); + } +}); From 143c80eb1c360c192ef2c914a9304d3350ce1495 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 20:10:43 -0500 Subject: [PATCH 55/67] Print class instances with their class name when instanceof sees unknown values --- .../compiler/src/backend/llvm/lib-shared.ts | 1 + .../src/frontend/lowering/class-prototypes.ts | 13 +++++++ .../compiler/src/ir/builtin-signatures.ts | 3 ++ ...6991-inspect-class-name-instanceof.ts.json | 6 +++ packages/runtime/src/scr_dyn.h | 3 ++ packages/runtime/src/scr_json.c | 38 ++++++++++++------- .../6991-inspect-class-name-instanceof.ts | 31 +++++++++++++++ ...6991-inspect-class-name-instanceof.ts.json | 1 + 8 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6991-inspect-class-name-instanceof.ts.json create mode 100644 tests/corpus/6991-inspect-class-name-instanceof.ts create mode 100644 tests/harness/corpus-costs/6991-inspect-class-name-instanceof.ts.json diff --git a/packages/compiler/src/backend/llvm/lib-shared.ts b/packages/compiler/src/backend/llvm/lib-shared.ts index b7c6b8a21..8bb8bc3aa 100644 --- a/packages/compiler/src/backend/llvm/lib-shared.ts +++ b/packages/compiler/src/backend/llvm/lib-shared.ts @@ -1493,6 +1493,7 @@ export const LIB_FN_SYMS: Record = { "dyn.bagGet": "scr_dyn_bag_get", "dyn.bagSet": "scr_dyn_bag_set", "dyn.objCreate": "scr_dyn_obj_create", + "dyn.nameClassPrototype": "scr_dyn_name_class_prototype", "dyn.objCreateWithProperties": "scr_dyn_obj_create_with_properties", "dyn.getPrototype": "scr_dyn_get_prototype", "dyn.setPrototype": "scr_dyn_set_prototype", diff --git a/packages/compiler/src/frontend/lowering/class-prototypes.ts b/packages/compiler/src/frontend/lowering/class-prototypes.ts index d2919e202..e65c679c6 100644 --- a/packages/compiler/src/frontend/lowering/class-prototypes.ts +++ b/packages/compiler/src/frontend/lowering/class-prototypes.ts @@ -6,6 +6,7 @@ import { DYN, STRING, SYMBOL_T, + VOID, isUnitType, type IrExpr, type IrFunction, @@ -155,6 +156,18 @@ export function classPrototypeData( : { kind: "dynObjLit", fields: [], type: DYN, loc }, loc, }, + // util.inspect prints an instance with its class's name. + { + kind: "exprStmt", + expr: { + kind: "libCall", + fn: "dyn.nameClassPrototype", + args: [value, { kind: "strLit", value: className, type: STRING, loc }], + type: VOID, + loc, + }, + loc, + }, { kind: "assign", localId: readyId, diff --git a/packages/compiler/src/ir/builtin-signatures.ts b/packages/compiler/src/ir/builtin-signatures.ts index e4bd83db7..b79b5ebe9 100644 --- a/packages/compiler/src/ir/builtin-signatures.ts +++ b/packages/compiler/src/ir/builtin-signatures.ts @@ -3666,6 +3666,9 @@ export const LIB_FN_SIGS = defineLibFnSignatures({ "dyn.bagGet": { argTypes: [DYN, STRING, DYN], result: DYN }, "dyn.bagSet": { argTypes: [DYN, STRING, DYN, DYN], result: VOID }, "dyn.objCreate": { argTypes: [DYN], result: DYN }, + // Names a compiled class's prototype object (args[0]) after the class + // (args[1]) for util.inspect. + "dyn.nameClassPrototype": { argTypes: [DYN, STRING], result: VOID }, "dyn.objCreateWithProperties": { argTypes: [DYN, DYN], result: DYN }, "dyn.getPrototype": { argTypes: [DYN], result: DYN }, "dyn.setPrototype": { argTypes: [DYN, DYN], result: DYN }, diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6991-inspect-class-name-instanceof.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6991-inspect-class-name-instanceof.ts.json new file mode 100644 index 000000000..a6629e2a9 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6991-inspect-class-name-instanceof.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6991-inspect-class-name-instanceof.ts" + ], + "diags": [] +} diff --git a/packages/runtime/src/scr_dyn.h b/packages/runtime/src/scr_dyn.h index d36c0d263..37e9eacce 100644 --- a/packages/runtime/src/scr_dyn.h +++ b/packages/runtime/src/scr_dyn.h @@ -997,6 +997,9 @@ ScrDyn *scr_dyn_get_own_property_descriptor(ScrDyn *target, ScrDyn *key); ScrDyn *scr_dyn_array_proto_call(ScrDyn *target, ScrStr *method, ScrDyn *args); ScrDyn *scr_dyn_array_prototype(void); /* +1, installs native method adapters */ ScrDyn *scr_dyn_array_prototype_base(void); /* +1, shared native array identity */ +/* Names the prototype object of a compiled class `name` for util.inspect + * (Node prints the constructor's name), unless it already has a name. */ +void scr_dyn_name_class_prototype(ScrDyn *prototype, const ScrStr *name); /* Native arrays read their holes as undefined without consulting * Array.prototype, so storing an element on Array.prototype raises SC2020. * True (with the error pending) when `recv` is Array.prototype. */ diff --git a/packages/runtime/src/scr_json.c b/packages/runtime/src/scr_json.c index 21ccfaa16..2787fe728 100644 --- a/packages/runtime/src/scr_json.c +++ b/packages/runtime/src/scr_json.c @@ -4669,6 +4669,24 @@ static void scr_dyn_named_prototypes_cleanup(void) { scr_dyn_named_count = scr_dyn_named_cap = 0; } +/* Stamps prototype `p` with a copy of `name` (len bytes) and keeps it alive. */ +static void scr_dyn_stamp_prototype_name(ScrDyn *p, const char *name, size_t len) { + if (scr_dyn_named_count == scr_dyn_named_cap) { + if (scr_dyn_named_cap == 0) scr_atexit(scr_dyn_named_prototypes_cleanup); + size_t cap = scr_dyn_named_cap ? scr_dyn_named_cap * 2 : 8; + ScrDynNamedPrototype *grown = realloc(scr_dyn_named_prototypes, cap * sizeof *grown); + if (!grown) scr_json_oom(); + scr_dyn_named_prototypes = grown; + scr_dyn_named_cap = cap; + } + char *copy = malloc(len + 1); + if (!copy) scr_json_oom(); + memcpy(copy, name, len); + copy[len] = '\0'; + p->v.obj.class_name = copy; + scr_dyn_named_prototypes[scr_dyn_named_count++] = (ScrDynNamedPrototype){ scr_dyn_retain(p), copy }; +} + static void scr_dyn_name_prototype_chain(const ScrDyn *object) { for (ScrDyn *p = object->prototype; p; p = p->prototype) { if (p->kind != SCR_DYN_OBJ || p->v.obj.class_name) return; @@ -4676,24 +4694,16 @@ static void scr_dyn_name_prototype_chain(const ScrDyn *object) { if (!entry || entry->accessor || !entry->value || entry->value->kind != SCR_DYN_FUNC) continue; const char *name = entry->value->v.fn.name; if (!name || !name[0]) continue; - if (scr_dyn_named_count == scr_dyn_named_cap) { - if (scr_dyn_named_cap == 0) scr_atexit(scr_dyn_named_prototypes_cleanup); - size_t cap = scr_dyn_named_cap ? scr_dyn_named_cap * 2 : 8; - ScrDynNamedPrototype *grown = realloc(scr_dyn_named_prototypes, cap * sizeof *grown); - if (!grown) scr_json_oom(); - scr_dyn_named_prototypes = grown; - scr_dyn_named_cap = cap; - } - size_t len = strlen(name); - char *copy = malloc(len + 1); - if (!copy) scr_json_oom(); - memcpy(copy, name, len + 1); - p->v.obj.class_name = copy; - scr_dyn_named_prototypes[scr_dyn_named_count++] = (ScrDynNamedPrototype){ scr_dyn_retain(p), copy }; + scr_dyn_stamp_prototype_name(p, name, strlen(name)); return; } } +void scr_dyn_name_class_prototype(ScrDyn *prototype, const ScrStr *name) { + if (prototype->kind != SCR_DYN_OBJ || prototype->v.obj.class_name || name->len == 0) return; + scr_dyn_stamp_prototype_name(prototype, name->data, name->len); +} + /* Ordinary native function constructors retain their live prototype table. * A constructor may replace the fresh receiver with another object. */ ScrDyn *scr_dyn_construct(const ScrDyn *callee, const ScrDyn *args, const ScrStr *what) { diff --git a/tests/corpus/6991-inspect-class-name-instanceof.ts b/tests/corpus/6991-inspect-class-name-instanceof.ts new file mode 100644 index 000000000..5354048c9 --- /dev/null +++ b/tests/corpus/6991-inspect-class-name-instanceof.ts @@ -0,0 +1,31 @@ +// util.inspect prints a class instance with its class's name, also when +// the program tests `instanceof` on unknown values (which gives the class +// a runtime prototype object). + +class Leaf { + x = 1; + twin: Leaf | undefined = undefined; +} +class Branch extends Leaf { + label = "b"; + describe(): string { + return `branch ${this.label}`; + } +} +class Plain { + y = 2; +} + +const solo = new Leaf(); +const branch = new Branch(); +console.log(solo); +console.log(branch, branch.describe()); +console.log([solo, branch], { solo }); +console.log(new Plain()); + +const boxed: unknown[] = [solo, branch, new Plain(), 3]; +console.log(boxed.map((v) => (v instanceof Leaf ? "L" : String(v instanceof Plain))).join(",")); +console.log(boxed.map((v) => (v instanceof Branch ? "B" : "-")).join(",")); + +solo.twin = branch; +console.log(solo); diff --git a/tests/harness/corpus-costs/6991-inspect-class-name-instanceof.ts.json b/tests/harness/corpus-costs/6991-inspect-class-name-instanceof.ts.json new file mode 100644 index 000000000..b39c9d973 --- /dev/null +++ b/tests/harness/corpus-costs/6991-inspect-class-name-instanceof.ts.json @@ -0,0 +1 @@ +{ "plain": 4000, "san": 5400 } From 9b165aa0449778fa57fa5715c04cb8e4ca026148 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 20:12:26 -0500 Subject: [PATCH 56/67] Lower a super() call that leads an if condition's comma chain --- .../src/frontend/lowering/lower-classes.ts | 27 ++++++++++++ .../src/frontend/lowering/lower-stmts.ts | 29 +++++++------ ...6944-js-super-call-in-if-condition.js.json | 6 +++ .../6944-js-super-call-in-if-condition.js | 41 +++++++++++++++++++ ...6944-js-super-call-in-if-condition.js.json | 1 + 5 files changed, 92 insertions(+), 12 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6944-js-super-call-in-if-condition.js.json create mode 100644 tests/corpus/6944-js-super-call-in-if-condition.js create mode 100644 tests/harness/corpus-costs/6944-js-super-call-in-if-condition.js.json diff --git a/packages/compiler/src/frontend/lowering/lower-classes.ts b/packages/compiler/src/frontend/lowering/lower-classes.ts index 17b22f0d4..790efe988 100644 --- a/packages/compiler/src/frontend/lowering/lower-classes.ts +++ b/packages/compiler/src/frontend/lowering/lower-classes.ts @@ -8538,6 +8538,10 @@ function superCallInStatementPosition(call: ts.CallExpression): boolean { for (;;) { const parent = node.parent; if (ts.isExpressionStatement(parent)) return true; + if (ts.isIfStatement(parent)) { + const lead = superConditionLead(parent.expression); + return lead !== null && call.pos >= lead.left.pos && call.end <= lead.left.end; + } const comma = ts.isBinaryExpression(parent) && parent.operatorToken.kind === ts.SyntaxKind.CommaToken; if (!comma && !ts.isParenthesizedExpression(parent)) return false; @@ -8545,6 +8549,29 @@ function superCallInStatementPosition(call: ts.CallExpression): boolean { } } +/** The comma chain of an `if` condition whose leading operands hold a + * super() call (`if (super(), r === 0) throw ...`, as minifiers join a + * super statement with the next test), or null. The if statement runs the + * chain's left operand as a statement first and tests its right operand, + * which is what the comma evaluates. */ +export function superConditionLead(cond: ts.Expression): ts.BinaryExpression | null { + let expr = cond; + while (ts.isParenthesizedExpression(expr)) expr = expr.expression; + if (!ts.isBinaryExpression(expr) || expr.operatorToken.kind !== ts.SyntaxKind.CommaToken) + return null; + const holdsSuperCall = (operand: ts.Expression): boolean => { + let e = operand; + while (ts.isParenthesizedExpression(e)) e = e.expression; + if (ts.isCallExpression(e)) return e.expression.kind === ts.SyntaxKind.SuperKeyword; + return ( + ts.isBinaryExpression(e) && + e.operatorToken.kind === ts.SyntaxKind.CommaToken && + (holdsSuperCall(e.left) || holdsSuperCall(e.right)) + ); + }; + return holdsSuperCall(expr.left) ? expr : null; +} + /** Super statements initialize the base and then the derived fields on * whichever control-flow path executes. Repeated calls are explicitly * refused until native layouts can allocate a second receiver. */ diff --git a/packages/compiler/src/frontend/lowering/lower-stmts.ts b/packages/compiler/src/frontend/lowering/lower-stmts.ts index 78f2f4189..e3480cf9c 100644 --- a/packages/compiler/src/frontend/lowering/lower-stmts.ts +++ b/packages/compiler/src/frontend/lowering/lower-stmts.ts @@ -159,7 +159,7 @@ import { classStaticDataFor } from "./class-static-data.js"; import { objectFactorySignature } from "./object-factory-new.js"; import { isClassCallback, lowerClassCallbackAssign } from "./class-callbacks.js"; import { classForInHasKey, classPropertiesHelper } from "./class-dynamic-dispatch.js"; -import { genericIfaceBindingKeepsClass } from "./lower-classes.js"; +import { genericIfaceBindingKeepsClass, superConditionLead } from "./lower-classes.js"; import { lowerStreamUnderscoreAssign, streamClassAliasDecl } from "./lower-stream.js"; import { staticAssertInstanceDecl } from "./assert-instances.js"; import { @@ -1537,43 +1537,48 @@ export function lowerStmt(lowerer: Lowerer, stmt: ts.Statement): IrStmt | IrStmt return lowerer.lowerDefaultExport(stmt); } if (ts.isIfStatement(stmt)) { - const cond = lowerer.lowerCondition(stmt.expression); + // `if (super(), test)`: the super call runs as a statement, then the + // test decides. + const lead = superConditionLead(stmt.expression); + const leading = lead ? lowerer.lowerExprStatement(lead.left) : null; + const test = lead ? lead.right : stmt.expression; + const cond = lowerer.lowerCondition(test); // A global-detection condition (static-typeof.ts) folds; its untaken // arm is code Node never runs and does not lower, unless it declares a // hoisted binding. - const decided = staticCondition(lowerer, stmt.expression); + const decided = staticCondition(lowerer, test); if (decided !== null) { const taken = decided ? stmt.thenStatement : stmt.elseStatement; const untaken = decided ? stmt.elseStatement : stmt.thenStatement; if (untaken === undefined || !declaresHoistedBinding(untaken)) { const arm = taken === undefined ? [] : lowerer.lowerScopedBlock(taken); - return decided + const folded: IrStmt = decided ? { kind: "if", cond, then: arm, else_: null, loc: locOf(stmt) } : { kind: "if", cond, then: [], else_: arm, loc: locOf(stmt) }; + return leading ? { kind: "block", body: [leading, folded], loc: locOf(stmt) } : folded; } } // Aliased-typeof narrows (ms's `var type = typeof val` guard): the // then-branch lowers under what a TRUE condition proves, the // else-branch under a FALSE one — the var/let alias narrowing the // checker only performs for consts (aliasTypeofNarrows). - const then = lowerer.narrowingAliases(aliasTypeofNarrows(lowerer, stmt.expression, true), () => - withRuntimeOptionalNarrowed(lowerer, runtimeOptionalTrueIds(lowerer, stmt.expression), () => + const then = lowerer.narrowingAliases(aliasTypeofNarrows(lowerer, test, true), () => + withRuntimeOptionalNarrowed(lowerer, runtimeOptionalTrueIds(lowerer, test), () => lowerer.lowerScopedBlock(stmt.thenStatement), ), ); const else_ = stmt.elseStatement - ? lowerer.narrowingAliases(aliasTypeofNarrows(lowerer, stmt.expression, false), () => - withRuntimeOptionalNarrowed( - lowerer, - runtimeOptionalGuardIds(lowerer, stmt.expression, false), - () => lowerer.lowerScopedBlock(stmt.elseStatement!), + ? lowerer.narrowingAliases(aliasTypeofNarrows(lowerer, test, false), () => + withRuntimeOptionalNarrowed(lowerer, runtimeOptionalGuardIds(lowerer, test, false), () => + lowerer.lowerScopedBlock(stmt.elseStatement!), ), ) : null; for (const local of falsyExitRuntimeOptionalLocals(lowerer, stmt)) { lowerer.runtimeOptionalLocals.delete(lowerer.runtimeOptionalRootOf(local)); } - return { kind: "if", cond, then, else_, loc: locOf(stmt) }; + const lowered: IrStmt = { kind: "if", cond, then, else_, loc: locOf(stmt) }; + return leading ? { kind: "block", body: [leading, lowered], loc: locOf(stmt) } : lowered; } if (ts.isWhileStatement(stmt)) { const labels = lowerer.takeLabels(); diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6944-js-super-call-in-if-condition.js.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6944-js-super-call-in-if-condition.js.json new file mode 100644 index 000000000..ba20299f2 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6944-js-super-call-in-if-condition.js.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6944-js-super-call-in-if-condition.js" + ], + "diags": [] +} diff --git a/tests/corpus/6944-js-super-call-in-if-condition.js b/tests/corpus/6944-js-super-call-in-if-condition.js new file mode 100644 index 000000000..8fdc8022b --- /dev/null +++ b/tests/corpus/6944-js-super-call-in-if-condition.js @@ -0,0 +1,41 @@ +// A derived constructor whose super() call leads an if condition's comma +// chain, as minifiers join `super(...); if (test) ...`: the base and the +// derived fields initialize first, then the test decides. + +let count = 0; +class Base { + constructor(name) { + this.name = name; + this.created = count++; + } +} + +class Checked extends Base { + limit = 3; + constructor(name, size) { + if ((super(name), size > this.limit)) throw new RangeError(`${name}: ${size} > ${this.limit}`); + else this.size = size; + } +} + +class Tagged extends Base { + constructor(name, tag) { + if ((super(name), (this.tag = tag), tag === undefined)) this.tag = "none"; + } +} + +class Plain extends Base { + constructor(name, flag) { + if ((super(name), flag)) this.flag = "set"; + this.done = true; + } +} + +const made = [new Checked("a", 2), new Tagged("b", "x"), new Tagged("c"), new Plain("d", 1)]; +for (const value of made) console.log(JSON.stringify(value)); +try { + new Checked("e", 9); +} catch (error) { + console.log(error.name, error.message, count); +} +console.log(new Plain("f", 0).flag, count); diff --git a/tests/harness/corpus-costs/6944-js-super-call-in-if-condition.js.json b/tests/harness/corpus-costs/6944-js-super-call-in-if-condition.js.json new file mode 100644 index 000000000..5904670c9 --- /dev/null +++ b/tests/harness/corpus-costs/6944-js-super-call-in-if-condition.js.json @@ -0,0 +1 @@ +{ "plain": 1700, "san": 2600 } From 6f0d047e8ea39b8cf9e89715917145e82ee90517 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 20:21:31 -0500 Subject: [PATCH 57/67] Pass a reassigned zlib callback result on to typed functions On the error path, a callback's result reads from a checked-dynamic slot. Passing it on into a Buffer parameter still handed over the adapter's original value, so after `if (!out) out = Buffer.from(...)` a typed callee received the absent Buffer instead of the fallback and crashed. The forward now tests the slot: while it holds undefined the callee gets the absent Buffer, and otherwise the Buffer the slot holds. --- .../src/frontend/lowering/lower-functions.ts | 65 ++++++++++++------- .../corpus/6920-zlib-callback-error-result.ts | 13 +++- 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/packages/compiler/src/frontend/lowering/lower-functions.ts b/packages/compiler/src/frontend/lowering/lower-functions.ts index 8f2c575a4..cd8dc31d1 100644 --- a/packages/compiler/src/frontend/lowering/lower-functions.ts +++ b/packages/compiler/src/frontend/lowering/lower-functions.ts @@ -751,31 +751,35 @@ function lowerUndefinedResultBody( lowerer.suppressStats = true; lowerer.errorPathCopies++; try { - // Passed on into a Buffer slot, the result stays what the adapter - // passed: the Buffer, or the absent Buffer, which a callee with this - // entry test reads as undefined. (The copy that serves both paths - // reaches this with a Buffer.) - const body = transformStmtList(withKnownError(knownError, lowerBody), { - expr: (e) => - e.kind === "dynCheck" && - e.value.kind === "varRef" && - e.value.localId === slot.id && - e.type.kind === "bytes" && - e.type.elem === "u8" - ? { - kind: "ternary", - cond: absent(), - then: { kind: "libCall", fn: "bytes.absent", args: [], type: e.type, loc: e.loc }, - else_: varRef(param.id, param.type, e.loc), - type: e.type, - loc: e.loc, - } - : e, + const lowered = withKnownError(knownError, lowerBody); + if (lowerer.diags.length > diags || !readsSlotDynamically(lowered, slot.id)) + throw new PoisonError(); + // Passed on into a Buffer slot, the result is the Buffer it holds + // (the adapter's, or one the body assigned), or, while it holds + // undefined, the absent Buffer, which a callee with this entry test + // reads as undefined. + const guarded = new Set(); + return transformStmtList(lowered, { + expr: (e) => { + if (!isBufferCheckOf(e, slot.id) || guarded.has(e)) return e; + guarded.add(e); + return { + kind: "ternary", + cond: { + kind: "dynTest", + test: "undefined", + value: varRef(slot.id, DYN, e.loc), + type: BOOL, + loc: e.loc, + }, + then: { kind: "libCall", fn: "bytes.absent", args: [], type: e.type, loc: e.loc }, + else_: e, + type: e.type, + loc: e.loc, + }; + }, stmt: (stmt) => stmt, }); - if (lowerer.diags.length > diags || !readsSlotDynamically(body, slot.id)) - throw new PoisonError(); - return body; } catch (error) { if (error instanceof InternalCompilerError) throw error; lowerer.diags.length = diags; @@ -831,15 +835,26 @@ function lowerUndefinedResultBody( /** Whether the error-path copy reads the checked-dynamic result slot only as * a checked-dynamic value, never converted into a static slot (where Node - * would hold undefined). */ + * would hold undefined) other than a Buffer one. */ function readsSlotDynamically(body: IrStmt[], slotId: string): boolean { const isSlot = (e: IrExpr): boolean => e.kind === "varRef" && e.localId === slotId; return everyStmtList(body, { expr: (e) => { if (isSlot(e)) return e.type.kind === "dyn"; - if (e.kind === "dynCheck" && isSlot(e.value)) return false; + if (e.kind === "dynCheck" && isSlot(e.value)) return isBufferCheckOf(e, slotId); return true; }, stmt: () => true, }); } + +/** Whether `e` converts the result slot into a Buffer slot. */ +function isBufferCheckOf(e: IrExpr, slotId: string): boolean { + return ( + e.kind === "dynCheck" && + e.value.kind === "varRef" && + e.value.localId === slotId && + e.type.kind === "bytes" && + e.type.elem === "u8" + ); +} diff --git a/tests/corpus/6920-zlib-callback-error-result.ts b/tests/corpus/6920-zlib-callback-error-result.ts index 5016fa841..44803333b 100644 --- a/tests/corpus/6920-zlib-callback-error-result.ts +++ b/tests/corpus/6920-zlib-callback-error-result.ts @@ -176,15 +176,24 @@ function namedRetry(): void { }); } +function shown(label: string, out: Buffer): void { + console.log(label, typeof out, out.toString()); +} function fallbackResult(): void { - // The body assigns a fallback Buffer to its result. + // The body assigns a fallback Buffer to its result, then passes the + // result on to typed functions. zlib.inflate(bad, (err, out) => { if (!out) out = Buffer.from("fallback"); console.log("fallback", err?.code, typeof out, out.toString()); + shown("fallback passed", out); zlib.inflate(good, (err2, out2) => { if (err2) out2 = Buffer.alloc(0); console.log("fallback nested", err2, out2.length); - step(); + shown("fallback nested passed", out2); + zlib.inflate(bad, (err3, out3) => { + if (err3) out3 = Buffer.from("inner fallback"); + sink(null, out3); + }); }); }); } From 37cdd927557a56750581c74561bcc86f34aa55f9 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 20:23:53 -0500 Subject: [PATCH 58/67] Keep properties untyped code adds to typed object literals --- .../src/backend/llvm/expr-stream-bridges.ts | 7 ++ .../6990-record-writes-from-js/main.ts.json | 7 ++ packages/runtime/src/scr_dyn.h | 5 ++ packages/runtime/src/scr_json.c | 77 ++++++++++++++++--- .../6990-record-writes-from-js/helpers.js | 13 ++++ .../corpus/6990-record-writes-from-js/main.ts | 23 ++++++ .../6990-record-writes-from-js/main.ts.json | 1 + 7 files changed, 123 insertions(+), 10 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6990-record-writes-from-js/main.ts.json create mode 100644 tests/corpus/6990-record-writes-from-js/helpers.js create mode 100644 tests/corpus/6990-record-writes-from-js/main.ts create mode 100644 tests/harness/corpus-costs/6990-record-writes-from-js/main.ts.json diff --git a/packages/compiler/src/backend/llvm/expr-stream-bridges.ts b/packages/compiler/src/backend/llvm/expr-stream-bridges.ts index b72875aaa..a4f2ed749 100644 --- a/packages/compiler/src/backend/llvm/expr-stream-bridges.ts +++ b/packages/compiler/src/backend/llvm/expr-stream-bridges.ts @@ -36,6 +36,7 @@ import type { LlvmEmitterContext, LlStreamTypedRefAdapter } from "./expr-context import type { NullableRefField } from "./nullable-fields.js"; import { emitUnionPeek, emitUnionTag } from "./union-repr.js"; import { inlineUnionCopyLines } from "./inline-unions.js"; +import { recordMayKeepSource } from "./record-sources.js"; /** An owned (+1) union value for a nullable-pointer class field slot `p` * (the unit arm's immortal instance, or a fresh box around a retained @@ -539,6 +540,12 @@ export function streamTypedRefCommitAdapter( ` store ${member.type} %old${index}, ptr %np${index}`, ); }); + // The conversion kept the view's undeclared properties for %next. Shapes + // with accessor slots keep their accessors in the view instead. + if (recordMayKeepSource(shape) && !shapeHasAccessorSlots(shape)) { + host.declare(`declare void @scr_record_source_move(ptr, ptr)`); + lines.push(` call void @scr_record_source_move(ptr %next, ptr %target)`); + } lines.push( ` call void ${releaseSym(host.shapeHost, t)}(ptr %next)`, ` br label %done`, diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6990-record-writes-from-js/main.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6990-record-writes-from-js/main.ts.json new file mode 100644 index 000000000..8eeecc9dd --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6990-record-writes-from-js/main.ts.json @@ -0,0 +1,7 @@ +{ + "order": [ + "/tests/corpus/6990-record-writes-from-js/helpers.js", + "/tests/corpus/6990-record-writes-from-js/main.ts" + ], + "diags": [] +} diff --git a/packages/runtime/src/scr_dyn.h b/packages/runtime/src/scr_dyn.h index 37e9eacce..02c4d828f 100644 --- a/packages/runtime/src/scr_dyn.h +++ b/packages/runtime/src/scr_dyn.h @@ -892,6 +892,11 @@ void scr_dyn_typed_ref_bind_record(ScrDyn *d, const ScrDynTypedRecordOps *ops); void scr_record_source_note(void *rec, const ScrDyn *src, const char *const *names, const size_t *lens, size_t count); bool scr_record_source_has(const void *rec); +/* The commit of a live record view converts the view into a new record + * `from`, whose conversion keeps the view's undeclared properties, then + * moves its fields into `to`: this moves the kept properties to `to` too, + * replacing any `to` had. */ +void scr_record_source_move(void *from, void *to); ScrDyn *scr_record_source_view(const void *rec); ScrDyn *scr_record_source_apply(ScrDyn *snapshot, const void *rec); /* Attach the prototype member names of a class instance capsule diff --git a/packages/runtime/src/scr_json.c b/packages/runtime/src/scr_json.c index 2787fe728..bd9bc2cc2 100644 --- a/packages/runtime/src/scr_json.c +++ b/packages/runtime/src/scr_json.c @@ -2724,20 +2724,24 @@ bool scr_record_source_has(const void *rec) { return scr_record_source_count && scr_record_source_find(rec) != NULL; } -static void scr_record_source_disposed(void *rec) { - size_t bit = scr_record_source_filter_bit(rec); - if (!(scr_record_source_filter[bit >> 6] & (UINT64_C(1) << (bit & 63)))) return; - ScrRecordSource *found = scr_record_source_find(rec); - if (!found) return; +/* Drops the entry at `found` from the table, releasing its view. The table + * no longer refers to the view first, so a nested disposal that re-enters + * the dispose hook sees a consistent table. */ +static void scr_record_source_drop(ScrRecordSource *found) { ScrDyn *view = found->view; *found = (ScrRecordSource){ .rec = SCR_RECORD_SOURCE_DELETED }; scr_record_source_count--; scr_record_source_deleted++; - /* The table no longer refers to the view, so a nested disposal that - * re-enters this hook sees a consistent table. */ scr_dyn_release(view); } +static void scr_record_source_disposed(void *rec) { + size_t bit = scr_record_source_filter_bit(rec); + if (!(scr_record_source_filter[bit >> 6] & (UINT64_C(1) << (bit & 63)))) return; + ScrRecordSource *found = scr_record_source_find(rec); + if (found) scr_record_source_drop(found); +} + /* The single native dispose hook serves weak collections and the table * above; each observer runs only while it has entries to forget. */ static void scr_dispose_observers(void *object) { @@ -2878,6 +2882,20 @@ void scr_record_source_note(void *rec, const ScrDyn *src, const char *const *nam scr_record_source_put(&probe); } +void scr_record_source_move(void *from, void *to) { + if (!scr_record_source_count) return; + ScrRecordSource *old = scr_record_source_find(to); + if (old) scr_record_source_drop(old); + ScrRecordSource *found = scr_record_source_find(from); + if (!found) return; + ScrRecordSource moved = *found; + *found = (ScrRecordSource){ .rec = SCR_RECORD_SOURCE_DELETED }; + scr_record_source_count--; + scr_record_source_deleted++; + moved.rec = to; + scr_record_source_put(&moved); +} + /* Refreshes a retained record view: the view's own-key order, declared * values from the native snapshot (a declared key the record no longer has * drops), every other property as the view holds it, then declared fields @@ -2961,6 +2979,34 @@ static bool scr_jb_put_source_field(ScrJsonBuf *b, void *rec, const ScrRecordSou /* The same in one lookup: writes the record and answers true when it kept * a source, otherwise writes nothing and answers false. */ +static bool scr_dyn_key_is_index(const char *key, size_t len, double *out); + +/* The entry indexes of `view` in JavaScript's own-key order: integer keys + * ascending, then the other keys in insertion order. `out` holds len. */ +static void scr_record_source_key_order(const ScrDyn *view, size_t *out) { + size_t integers = 0; + for (size_t i = 0; i < view->v.obj.len; i++) { + double index; + const ScrDynEntry *entry = &view->v.obj.entries[i]; + if (!scr_dyn_key_is_index(entry->key, entry->key_len, &index)) continue; + size_t at = integers++; + for (; at > 0; at--) { + double before; + const ScrDynEntry *previous = &view->v.obj.entries[out[at - 1]]; + scr_dyn_key_is_index(previous->key, previous->key_len, &before); + if (before < index) break; + out[at] = out[at - 1]; + } + out[at] = i; + } + size_t next = integers; + for (size_t i = 0; i < view->v.obj.len; i++) { + double index; + const ScrDynEntry *entry = &view->v.obj.entries[i]; + if (!scr_dyn_key_is_index(entry->key, entry->key_len, &index)) out[next++] = i; + } +} + bool scr_jb_try_record_source(ScrJsonBuf *b, void *rec, bool (*field)(ScrJsonBuf *, void *, size_t, bool)) { ScrRecordSource *found = scr_record_source_find(rec); @@ -2981,13 +3027,24 @@ bool scr_jb_try_record_source(ScrJsonBuf *b, void *rec, bool small[64] = { false }; bool *seen = count <= 64 ? small : calloc(count, sizeof *seen); if (!seen) scr_json_oom(); + /* Integer keys come first in JavaScript's own-key order; a view without + * any walks in insertion order. */ + size_t order_small[64]; + size_t *order = NULL; + for (size_t k = 0; k < view->v.obj.len && !order; k++) { + double index; + if (!scr_dyn_key_is_index(view->v.obj.entries[k].key, view->v.obj.entries[k].key_len, &index)) continue; + order = view->v.obj.len <= 64 ? order_small : malloc(view->v.obj.len * sizeof *order); + if (!order) scr_json_oom(); + scr_record_source_key_order(view, order); + } /* Members whose writing cannot run program code are written in place. * The first member that can (an accessor, a toJSON method, a getter below * it) ends that loop: the remaining keys are taken first, as * SerializeJSONObject takes them before reading any value. */ size_t i = 0; for (; i < view->v.obj.len && !scr_exc_pending(); i++) { - const ScrDynEntry *entry = &view->v.obj.entries[i]; + const ScrDynEntry *entry = &view->v.obj.entries[order ? order[i] : i]; size_t index = scr_record_source_index(&source, entry->key, entry->key_len); if (index < count) { if (!seen[index] && scr_jb_put_source_field(b, rec, &source, index, first, on_stack, field)) @@ -3007,7 +3064,7 @@ bool scr_jb_try_record_source(ScrJsonBuf *b, void *rec, if (i < view->v.obj.len && !scr_exc_pending()) { ScrDyn *rest = scr_dyn_new_arr(); for (size_t j = i; j < view->v.obj.len; j++) { - const ScrDynEntry *entry = &view->v.obj.entries[j]; + const ScrDynEntry *entry = &view->v.obj.entries[order ? order[j] : j]; if (!entry->enumerable && !scr_record_source_declared(&source, entry->key, entry->key_len)) continue; ScrStr *name = scr_str_new(entry->key, entry->key_len); scr_dyn_arr_push(rest, scr_dyn_new_str(name)); @@ -3032,6 +3089,7 @@ bool scr_jb_try_record_source(ScrJsonBuf *b, void *rec, first = false; } if (seen != small) free(seen); + if (order && order != order_small) free(order); scr_dyn_release(view); scr_jb_putc(b, '}'); if (entered) scr_jb_leave(b); @@ -4552,7 +4610,6 @@ bool scr_dyn_same_value(const ScrDyn *left, const ScrDyn *right) { static void scr_dyn_descriptor_fields_drop(ScrDyn **fields) { for (size_t i = 0; i < 6; i++) scr_dyn_release(fields[i]); } -static bool scr_dyn_key_is_index(const char *key, size_t len, double *out); static void scr_error_sync_cause(ScrDyn *view, const ScrStr *key); static void scr_error_sync_slots(const ScrDyn *view, ScrDyn *obj, const ScrStr *key); diff --git a/tests/corpus/6990-record-writes-from-js/helpers.js b/tests/corpus/6990-record-writes-from-js/helpers.js new file mode 100644 index 000000000..6f43a90ce --- /dev/null +++ b/tests/corpus/6990-record-writes-from-js/helpers.js @@ -0,0 +1,13 @@ +// Untyped helpers that add, replace and remove properties of the objects +// they receive. +export function write(target, key, value) { + target[key] = value; +} + +export function remove(target, key) { + delete target[key]; +} + +export function keysOf(target) { + return Object.keys(target).join(","); +} diff --git a/tests/corpus/6990-record-writes-from-js/main.ts b/tests/corpus/6990-record-writes-from-js/main.ts new file mode 100644 index 000000000..2b343efc5 --- /dev/null +++ b/tests/corpus/6990-record-writes-from-js/main.ts @@ -0,0 +1,23 @@ +// A typed object literal passed to untyped JavaScript keeps the properties +// that code adds: JSON.stringify, Object.keys, later untyped reads and +// console.log see them, in JavaScript's own-key order (integer keys first). +import { keysOf, remove, write } from "./helpers.js"; + +const numbered = { 0: "zero", 1.5: "x" }; +write(numbered, 2, "two"); +console.log(JSON.stringify(numbered), keysOf(numbered), Object.keys(numbered)); + +const point = { x: 1, y: 2 }; +write(point, "label", "origin"); +write(point, "x", 10); +console.log(JSON.stringify(point), point.x, keysOf(point)); +write(point, "label", "moved"); +console.log(JSON.stringify(point)); +remove(point, "label"); +console.log(JSON.stringify(point), keysOf(point)); + +const config = { name: "app", retries: 3 }; +write(config, "debug", true); +write(config, "tags", ["a", "b"]); +console.log(JSON.stringify(config), keysOf(config)); +console.log(config); diff --git a/tests/harness/corpus-costs/6990-record-writes-from-js/main.ts.json b/tests/harness/corpus-costs/6990-record-writes-from-js/main.ts.json new file mode 100644 index 000000000..b8b8cc39d --- /dev/null +++ b/tests/harness/corpus-costs/6990-record-writes-from-js/main.ts.json @@ -0,0 +1 @@ +{ "plain": 4300, "san": 3700 } From 3b5e23361805adb155264c016f091b9799d3dd72 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 20:28:16 -0500 Subject: [PATCH 59/67] Lower to the same IR whatever order reachable bodies lower in --- package.json | 1 + .../lowering/caught-value-dispatch.ts | 47 +- .../lowering/class-dynamic-dispatch.test.ts | 1 + .../lowering/class-dynamic-dispatch.ts | 19 + .../src/frontend/lowering/class-prototypes.ts | 1 + .../src/frontend/lowering/error-methods.ts | 4 + .../lowering/generator-dynamic-dispatch.ts | 3 + .../frontend/lowering/lower-event-emitter.ts | 8 +- .../src/frontend/lowering/lower-modules.ts | 3 +- .../compiler/src/frontend/lowering/lowerer.ts | 166 +++++- .../test/format-float-arguments.test.ts | 5 +- scripts/lowering-order.mjs | 564 ++++++++++++++++++ 12 files changed, 792 insertions(+), 30 deletions(-) create mode 100644 scripts/lowering-order.mjs diff --git a/package.json b/package.json index ff4c84dc2..5cc30d9f8 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "test:test262": "tsx tests/test262/run.ts", "test:test262:fetch": "node tests/test262/fetch.mjs", "test:cache-identity": "node tests/harness/cache-identity.mjs", + "test:lowering-order": "node scripts/lowering-order.mjs --fail-on content", "test:sandbox": "node scripts/sandbox-test.mjs", "test:sandbox:image": "node scripts/sandbox-image.mjs", "test:watch": "vitest", diff --git a/packages/compiler/src/frontend/lowering/caught-value-dispatch.ts b/packages/compiler/src/frontend/lowering/caught-value-dispatch.ts index 645ff8d2c..606d10d56 100644 --- a/packages/compiler/src/frontend/lowering/caught-value-dispatch.ts +++ b/packages/compiler/src/frontend/lowering/caught-value-dispatch.ts @@ -5,6 +5,7 @@ import { DYN, type IrExpr, type IrFunction, + type IrStmt, type IrType, type SrcLoc, } from "../../ir/ir.js"; @@ -59,28 +60,48 @@ export class CaughtValueDispatch { loc, }; lowerer.liftedFns.push(this.helper); + lowerer.shareHelper(this.helper); changed = true; } const helper = this.helper; + let added = false; for (const className of this.thrownClasses) { if (this.convertedClasses.has(className)) continue; this.convertedClasses.add(className); + added = true; + } + if (added) { + // A subclass is tested before its ancestors, and classes of one depth + // by name, so the tests do not depend on the order the census met them. + const depth = (className: string): number => { + let count = 0; + for (let info = lowerer.classes.get(className)?.base; info; info = info.base) count++; + return count; + }; + const ordered = [...this.convertedClasses].sort( + (left, right) => depth(right) - depth(left) || (left < right ? -1 : left > right ? 1 : 0), + ); const loc = helper.loc; const value = varRef("caught", CAUGHT, loc); - const type: IrType = { kind: "object", className }; - helper.body.unshift({ - kind: "if", - cond: { kind: "caughtTest", value, test: "instanceof", className, type: BOOL, loc }, - then: [ - { - kind: "return", - value: lowerer.coerceToExpected({ kind: "caughtNarrow", value, type, loc }, DYN), + helper.body = [ + ...ordered.map((className): IrStmt => { + const type: IrType = { kind: "object", className }; + return { + kind: "if", + cond: { kind: "caughtTest", value, test: "instanceof", className, type: BOOL, loc }, + then: [ + { + kind: "return", + value: lowerer.coerceToExpected({ kind: "caughtNarrow", value, type, loc }, DYN), + loc, + }, + ], + else_: null, loc, - }, - ], - else_: null, - loc, - }); + }; + }), + helper.body[helper.body.length - 1]!, + ]; changed = true; } for (const fn of consumers) { diff --git a/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.test.ts b/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.test.ts index 6923841bd..b717452c2 100644 --- a/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.test.ts +++ b/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.test.ts @@ -33,6 +33,7 @@ function context() { classes: new Map(), liftedFns, liftedFnNamed: (name: string | undefined) => liftedFns.find((fn) => fn.name === name), + shareHelper: () => {}, subclassLinks: 0, constructedClassCount: () => -1, diags: [], diff --git a/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.ts b/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.ts index 9dd7681a6..a41751f01 100644 --- a/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.ts +++ b/packages/compiler/src/frontend/lowering/class-dynamic-dispatch.ts @@ -281,6 +281,7 @@ export function classInstanceOf( classValue?: IrExpr, ): IrExpr { const name = `%dyn.class.${classValue ? "valueInstanceof" : "instanceof"}:${info.def.name}`; + lowerer.shareHelper(name); const params = [ { localId: "value", name: "value", type: DYN }, ...(classValue ? [{ localId: "class", name: "class", type: classValue.type }] : []), @@ -406,8 +407,16 @@ function withTypedReceiver(value: IrExpr, receiver: IrExpr): IrExpr { }); } +/** Re-adds the entries of `set` after the first `from` sorted. */ +function sortAdded(set: Set, from: number): void { + const added = [...set].slice(from).sort(); + for (const name of added) set.delete(name); + for (const name of added) set.add(name); +} + export function classPropertiesHelper(lowerer: Lowerer, loc: SrcLoc, readOnly = false): IrFunction { const name = readOnly ? READ_PROPERTIES : "%dyn.class.properties"; + lowerer.shareHelper(name); const existing = lowerer.liftedFnNamed(name); if (existing) return existing; const helper: IrFunction = { @@ -447,6 +456,8 @@ export function classForInHasKey( loc: SrcLoc, ): IrExpr { const name = "%dyn.class.forInHasKey"; + lowerer.shareHelper(name); + lowerer.shareHelper("%dyn.class.forInBagHas"); if (!lowerer.liftedFns.some((fn) => fn.name === name)) { // The read-only table: a recheck never creates an instance's table, which // is undefined while the instance has no own dynamic properties. @@ -825,6 +836,8 @@ export class ClassDynamicDispatch { else if (type.kind === "func") discover(type.ret); else if (type.kind === "promise") discover(type.inner); }; + const boxedBefore = this.boxed.size; + const boxedConstructorsBefore = this.boxedConstructors.size; for (const fn of functions) everyStmtList(fn.body, { stmt: (statement) => { @@ -919,6 +932,10 @@ export class ClassDynamicDispatch { return true; }, }); + // The classes this pass found join the tables by name, not in the order + // the scan met them. + sortAdded(this.boxed, boxedBefore); + sortAdded(this.boxedConstructors, boxedConstructorsBefore); changed = this.caughtDispatch.dynamicPayloads(lowerer, caughtSites, this.boxed) || changed; if (this.boxed.size === 0 && rewrite.size === 0) return changed; const converting = this.convertingHints(lowerer); @@ -4264,6 +4281,8 @@ export class ClassDynamicDispatch { * prototype-backed bag is produced for this read only. A published object * cannot take the store, and Node's reads never write. */ finalize(lowerer?: Lowerer): void { + // Each table serves every site that reaches it. + if (lowerer) for (const fn of this.generated) lowerer.shareHelper(fn); for (const { helper, initialize, orEmpty } of this.readPropertyBags) { const absent = helper.body[0]; if (isEmptyBag(initialize.value) && !orEmpty) helper.body.shift(); diff --git a/packages/compiler/src/frontend/lowering/class-prototypes.ts b/packages/compiler/src/frontend/lowering/class-prototypes.ts index e65c679c6..4cbd8e5cf 100644 --- a/packages/compiler/src/frontend/lowering/class-prototypes.ts +++ b/packages/compiler/src/frontend/lowering/class-prototypes.ts @@ -122,6 +122,7 @@ export function classPrototypeData( const globalId = `%g.${name}`; const readyId = `${globalId}.ready`; info.def.prototypeDataHelper = name; + lowerer.shareHelper(name); const className = info.def.jsName ?? info.def.name; lowerer.globalsList.push({ id: globalId, diff --git a/packages/compiler/src/frontend/lowering/error-methods.ts b/packages/compiler/src/frontend/lowering/error-methods.ts index 979cf4814..b545f4147 100644 --- a/packages/compiler/src/frontend/lowering/error-methods.ts +++ b/packages/compiler/src/frontend/lowering/error-methods.ts @@ -24,6 +24,7 @@ export function errorPropertyRead( ): IrExpr { const name = `%error.${property}.read`, loc = receiver.loc; + lowerer.shareHelper(name); if (!lowerer.liftedFns.some((fn) => fn.name === name)) lowerer.liftedFns.push({ name, @@ -50,6 +51,7 @@ export function errorPropertyWrite( ): IrStmt { const name = `%error.${property}.write`, loc = receiver.loc; + lowerer.shareHelper(name); if (!lowerer.liftedFns.some((fn) => fn.name === name)) lowerer.liftedFns.push({ name, @@ -392,6 +394,7 @@ export function errorToStringMethod( receiver: IrExpr, ): Extract { const loc = receiver.loc; + lowerer.shareHelper(helperName); if (!lowerer.liftedFns.some((fn) => fn.name === helperName)) { lowerer.liftedFns.push({ name: helperName, @@ -415,6 +418,7 @@ export function errorToStringCall(lowerer: Lowerer, receiver: IrExpr): IrExpr { const loc = receiver.loc; const method = errorToStringMethod(lowerer, receiver); const name = "%error.toString.virtual"; + lowerer.shareHelper(name); if (!lowerer.liftedFns.some((fn) => fn.name === name)) { const value = varRef("error.0", errorType, loc); lowerer.liftedFns.push({ diff --git a/packages/compiler/src/frontend/lowering/generator-dynamic-dispatch.ts b/packages/compiler/src/frontend/lowering/generator-dynamic-dispatch.ts index ca6a5ecdc..3f43e5e05 100644 --- a/packages/compiler/src/frontend/lowering/generator-dynamic-dispatch.ts +++ b/packages/compiler/src/frontend/lowering/generator-dynamic-dispatch.ts @@ -68,8 +68,10 @@ export class GeneratorDynamicDispatch { this.properties.set(method, { fn, types: new Set() }); this.generated.add(fn); lowerer.liftedFns.push(fn); + lowerer.shareHelper(fn); // The runtime's own helper functions answer the helper methods. if (HELPER_METHODS.has(method)) return fn; + lowerer.shareHelper(`%dyn.generator.method.${method}`); lowerer.liftedFns.push({ name: `%dyn.generator.method.${method}`, params: [{ localId: "arg", name: "arg", type: DYN }], @@ -209,6 +211,7 @@ export class GeneratorDynamicDispatch { this.dispatches.set(key, dispatch); this.generated.add(helper); lowerer.liftedFns.push(helper); + lowerer.shareHelper(helper); changed = true; } return { diff --git a/packages/compiler/src/frontend/lowering/lower-event-emitter.ts b/packages/compiler/src/frontend/lowering/lower-event-emitter.ts index d84f84f4e..f472672b2 100644 --- a/packages/compiler/src/frontend/lowering/lower-event-emitter.ts +++ b/packages/compiler/src/frontend/lowering/lower-event-emitter.ts @@ -2128,8 +2128,12 @@ function ensureEmitSpec(lowerer: Lowerer, info: ClassInfo, event: string, tuple: params: tuple.map((t) => ({ type: t, mode: "required" as const })), ret: BOOL, }); - if (info.def.methods) info.def.methods.push(mName); - else info.def.methods = [mName]; + // Specializations sit in the method list sorted by event name, so the + // class table does not depend on which body asked for one first. + const methods = (info.def.methods ??= []); + const after = methods.findIndex((m) => m.startsWith("emit:") && m > mName); + if (after < 0) methods.push(mName); + else methods.splice(after, 0, mName); } const ordinal = lowerer.emitSpecQueue.filter((q) => q.info === info).length; lowerer.emitSpecQueue.push({ info, event, tuple, ordinal }); diff --git a/packages/compiler/src/frontend/lowering/lower-modules.ts b/packages/compiler/src/frontend/lowering/lower-modules.ts index 6ca21ddaa..d1f276d44 100644 --- a/packages/compiler/src/frontend/lowering/lower-modules.ts +++ b/packages/compiler/src/frontend/lowering/lower-modules.ts @@ -1048,7 +1048,8 @@ export function moduleArtifacts( } const reachable = lowerer.reachableForArtifacts ?? lowerer.reachable; return { - classes: [...lowerer.classes.values()] + classes: lowerer + .classesInTableOrder() .map((c) => c.def) .filter((def) => classNames.has(def.name)) .map((def): IrClassDef => { diff --git a/packages/compiler/src/frontend/lowering/lowerer.ts b/packages/compiler/src/frontend/lowering/lowerer.ts index 383143c97..29f807336 100644 --- a/packages/compiler/src/frontend/lowering/lowerer.ts +++ b/packages/compiler/src/frontend/lowering/lowerer.ts @@ -959,6 +959,33 @@ function directExternalTypeSpecifiersByFile( return out; } +/** Debugging aid: SCRIPTC_LOWER_SHUFFLE_SEED= lowers each wave of + * reachable bodies in an order drawn from that seed instead of discovery + * order. Output assembly is ordered independently of it, so any IR + * difference between seeds is state one body's lowering leaves for another + * (scripts/lowering-order.mjs). */ +function lowerShuffle(): ((wave: string[]) => void) | null { + const raw = process.env["SCRIPTC_LOWER_SHUFFLE_SEED"]; + if (raw === undefined || raw === "") return null; + // mulberry32 + let state = Number.parseInt(raw, 10) >>> 0; + const next = (): number => { + state = (state + 0x6d2b79f5) >>> 0; + let t = state; + t = Math.imul(t ^ (t >>> 15), t | 1); + t ^= t + Math.imul(t ^ (t >>> 7), t | 61); + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; + return (wave) => { + for (let index = wave.length - 1; index > 0; index--) { + const other = Math.floor(next() * (index + 1)); + const swap = wave[index]!; + wave[index] = wave[other]!; + wave[other] = swap; + } + }; +} + /** Build lowering runs as a reachability worklist over the ts.Program: * * 1. REACHABLE EMIT — a worklist computes the set of reachable bodies. @@ -1841,6 +1868,13 @@ function monomorphizedImplicit( return true; } +/** `fns` sorted by name; functions of one name keep their order. */ +function byName(fns: readonly IrFunction[]): IrFunction[] { + return [...fns].sort((left, right) => + left.name < right.name ? -1 : left.name > right.name ? 1 : 0, + ); +} + export class Lowerer { readonly frontendServices: FrontendServices | undefined; readonly checker: ts.TypeChecker; @@ -2027,6 +2061,40 @@ export class Lowerer { this.genericClassInstances.splice(from, tail.length, ...tail); } + /** The classes in table order. Generic instances are added as bodies + * demand them, so they keep the slots they hold and fill them in the + * order of their settled demand ranks. */ + classesInTableOrder(): ClassInfo[] { + const all = [...this.classes.values()]; + const slots = all.flatMap((info, index) => + this.genericClassDemandPriority.has(info) ? [index] : [], + ); + const ranked = slots + .map((index) => all[index]!) + .sort((left, right) => { + const a = this.genericClassDemandPriority.get(left)!.rank; + const b = this.genericClassDemandPriority.get(right)!.rank; + return a[0]! - b[0]! || a[1]! - b[1]!; + }); + slots.forEach((slot, index) => (all[slot] = ranked[index]!)); + return all; + } + + /** The globals in table order. A class's prototype data globals are + * added when a body first reads that prototype, so they keep the slots + * they hold and fill them in id order. */ + private globalsInTableOrder(): IrGlobal[] { + const all = [...this.globalsList]; + const prototypeData = (global: IrGlobal): boolean => + global.id.startsWith("%g.%prototype.data."); + const slots = all.flatMap((global, index) => (prototypeData(global) ? [index] : [])); + const sorted = slots + .map((index) => all[index]!) + .sort((left, right) => (left.id < right.id ? -1 : left.id > right.id ? 1 : 0)); + slots.forEach((slot, index) => (all[slot] = sorted[index]!)); + return all; + } + private settleGenericDemandPriorities(): void { const functionQueue: GenericInstance[] = []; const classQueue: ClassInfo[] = []; @@ -3187,6 +3255,60 @@ export class Lowerer { constructedClassCount(): number { return this.constructedClasses?.size ?? -1; } + /** Helpers that every site asking for them shares (shareHelper). */ + private readonly sharedHelpers = new Set(); + private readonly sharedHelperNames = new Set(); + /** Marks a helper, or the lifted helpers of a name, as shared by every + * site that asks for it. A shared helper is built for whichever site asks + * first, so once lowering finishes its locations are replaced by one that + * names no site. */ + shareHelper(helper: IrFunction | string): void { + if (typeof helper === "string") this.sharedHelperNames.add(helper); + else this.sharedHelpers.add(helper); + } + /** Gives each shared helper the location of the entry file's start: the + * helpers marked by shareHelper, and those interned by key in the helper + * tables. */ + private settleSharedHelperLocations(): void { + const loc: SrcLoc = { file: this.entry.fileName, start: 0, end: 0 }; + const interned = new Set([...this.sharedHelperNames, ...this.classMethodValueHelpers]); + for (const table of [ + this.equalityHelpers, + this.arrHofHelpers, + this.unionCallHelpers, + this.valueHelpers, + this.assertHelpers, + this.inspectHelpers, + this.iterDrainHelpers, + this.mapHofHelpers, + this.setHofHelpers, + this.spHofHelpers, + this.primitiveCtorFns, + this.builtinCallableValueFns, + this.regionRunHelpers, + this.internTableHelpers, + this.coercions.retags, + this.coercions.narrows, + ]) + for (const name of table.values()) interned.add(name); + for (const fn of [...this.liftedFns, ...this.implicitFns]) + if (interned.has(fn.name)) this.sharedHelpers.add(fn); + const seen = new Set(); + const visit = (node: unknown): void => { + if (typeof node !== "object" || node === null || seen.has(node)) return; + seen.add(node); + if (Array.isArray(node)) { + for (const item of node) visit(item); + return; + } + const record = node as Record; + for (const key of Object.keys(record)) { + if (key === "loc") record[key] = loc; + else if (key !== "type") visit(record[key]); + } + }; + for (const fn of this.sharedHelpers) visit(fn); + } /** The first lifted function named `name`, the one * `liftedFns.find((fn) => fn.name === name)` returns. */ liftedFnNamed(name: string | undefined): IrFunction | undefined { @@ -7279,6 +7401,7 @@ export class Lowerer { // Lambdas lifted while lowering any of the above (plus synthetic // array-HOF loop functions, which ride the same list), and the // implicit-any instances lowered eagerly at their first call sites. + this.settleSharedHelperLocations(); functions.push(...this.liftedFns); functions.push(...this.implicitFns); functions.push(...runtimeClassConstructs(this, functions)); @@ -7412,7 +7535,7 @@ export class Lowerer { classes: artifacts.classes, records: artifacts.records, unions: artifacts.unions, - globals: this.globalsList, + globals: this.globalsInTableOrder(), entry: ENTRY_NAME, ...(this.usesWorkers ? { workers: true } : {}), ...(this.usesLifetimeRegions ? { lifetimeRegions: true as const } : {}), @@ -7859,6 +7982,15 @@ export class Lowerer { // exactly like generic instances. while (specLowered < this.emitSpecQueue.length) { const waveEnd = this.emitSpecQueue.length; + // A wave's specializations lower by class and event, not in the + // order bodies asked for them. + const wave = this.emitSpecQueue.slice(specLowered, waveEnd); + const specKey = ({ info, event }: EmitSpecRequest): string => + `${info.def.name}\0${event}`; + wave.sort((left, right) => + specKey(left) < specKey(right) ? -1 : specKey(left) > specKey(right) ? 1 : 0, + ); + this.emitSpecQueue.splice(specLowered, wave.length, ...wave); this.checker.prefetchRoots( this.emitSpecQueue .slice(specLowered, waveEnd) @@ -7908,9 +8040,11 @@ export class Lowerer { // seed the worklist beside the init bodies. Unknown names are inert // (the export-map resolution reports them as SC4002 later). for (const root of extraRoots ?? []) this.onEdge?.(root); + const shuffle = lowerShuffle(); const drainUnits = (): void => { while (queue.length > 0) { const wave = queue.splice(0); + shuffle?.(wave); this.checker.prefetchRoots(wave.flatMap((name) => units.get(name)!.roots)); for (const name of wave) { // A body-level poison outside the per-statement catches (a fenced @@ -7940,21 +8074,28 @@ export class Lowerer { // queue above is the only portion whose discovery order differed from // historical emit order. const classDispatch = new ClassDynamicDispatch(extraRoots !== undefined); + // Units in declaration order, so the passes below meet functions, and the + // classes they collect, in an order that does not depend on lowering order. + const unitsInOrder = (): IrFunction[] => + [...loweredUnits] + .sort(([left], [right]) => units.get(left)!.order - units.get(right)!.order) + .map(([, fn]) => fn); for (;;) { drainInstances(); + const declared = unitsInOrder(); const initializerChanged = this.deferredModuleInitializers.process(this, [ - ...loweredUnits.values(), + ...declared, ...initFunctions, ...instanceFunctions, - ...this.liftedFns, - ...this.implicitFns, + ...byName(this.liftedFns), + ...byName(this.implicitFns), ]); const dispatchChanged = classDispatch.process(this, [ - ...loweredUnits.values(), + ...declared, ...initFunctions, ...instanceFunctions, - ...this.liftedFns, - ...this.implicitFns, + ...byName(this.liftedFns), + ...byName(this.implicitFns), ]); if (queue.length === 0 && !dispatchChanged && !initializerChanged) break; drainUnits(); @@ -7962,9 +8103,7 @@ export class Lowerer { this.restoreGenericClassInstanceOrder(clsInstLowered); } classDispatch.finalize(this); - const orderedUnits = [...loweredUnits] - .sort(([left], [right]) => units.get(left)!.order - units.get(right)!.order) - .map(([, fn]) => fn); + const orderedUnits = unitsInOrder(); this.settleGenericDemandPriorities(); this.shapes.settleDeclaredOrderPriorities(); for (const finalize of this.shapeOrderMetadataFinalizers) finalize(); @@ -7977,13 +8116,16 @@ export class Lowerer { ]); observeRecordLiteralRebuilds(null); for (const finalize of this.shapeOrderHelperFinalizers) finalize(); + this.settleSharedHelperLocations(); + // Lifted and implicit functions are created in lowering order; they + // are assembled by name. const functions = [ ...orderedUnits, ...initFunctions, this.buildMain(), ...instanceFunctions, - ...this.liftedFns, - ...this.implicitFns, + ...byName(this.liftedFns), + ...byName(this.implicitFns), ]; functions.push(...runtimeClassConstructs(this, functions)); if (this.regexGroupResults) for (const fn of functions) foldRegexSpanReads(this, fn); diff --git a/packages/compiler/test/format-float-arguments.test.ts b/packages/compiler/test/format-float-arguments.test.ts index 8aa08469d..e59e023ca 100644 --- a/packages/compiler/test/format-float-arguments.test.ts +++ b/packages/compiler/test/format-float-arguments.test.ts @@ -27,8 +27,9 @@ test("util.format %f lowers a boolean argument once", async () => { const helpers = mod.functions .map((f) => f.name) .filter((name) => name.startsWith("%arr.")) - .map((name) => name.replace(/\.\d+$/, "")); - expect(helpers).toEqual(["%arr.some", "%arr.every"]); + .map((name) => name.replace(/\.\d+$/, "")) + .sort(); + expect(helpers).toEqual(["%arr.every", "%arr.some"]); } finally { await rm(dir, { recursive: true, force: true }); } diff --git a/scripts/lowering-order.mjs b/scripts/lowering-order.mjs new file mode 100644 index 000000000..ecfc20955 --- /dev/null +++ b/scripts/lowering-order.mjs @@ -0,0 +1,564 @@ +#!/usr/bin/env node +/* Finds lowering state whose result depends on the order reachable bodies + * lower in. + * + * Each program is lowered to IR in discovery order and with every seed of + * SCRIPTC_LOWER_SHUFFLE_SEED (lowerer.ts), and the IR is compared function + * by function. Output assembly does not depend on the order, so every + * difference is state one body's lowering leaves for another. The + * discovery-order run also audits the lowerer's Map and Set fields: a key + * that two bodies touch, at least one of them writing it, makes the field + * order-sensitive for both bodies. A function whose IR differs between + * orders is attributed to the order-sensitive fields of the body that + * produced it. + * + * node scripts/lowering-order.mjs [--stride 7] [--offset 0] [--limit N] + * [--seeds 1,2,3] [--jobs 8] [--entry ]... [--out ] + * [--fail-on names|content] + * + * Needs a built compiler (pnpm build). Writes /results.json and prints + * a ranking of fields by the programs whose IR they change. With --fail-on, + * it exits with status 1 when some program's IR differs between orders: + * in any way (names), or beyond names and ids (content). */ +import { spawn } from "node:child_process"; +import { createHash } from "node:crypto"; +import { mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs"; +import { cpus, tmpdir } from "node:os"; +import { basename, join, resolve } from "node:path"; +import { fileURLToPath, pathToFileURL } from "node:url"; +import { parseArgs } from "node:util"; + +const root = fileURLToPath(new URL("..", import.meta.url)); +const dist = join(root, "packages/compiler/dist"); + +if (process.argv[2] === "--child") { + const [, , , entry, irPath, seed, auditPath, snapshotPath] = process.argv; + if (seed !== "-") process.env["SCRIPTC_LOWER_SHUFFLE_SEED"] = seed; + const module = (path) => import(pathToFileURL(join(dist, path)).href); + const audit = + auditPath === "-" + ? null + : installAudit( + await module("frontend/lowering/lowerer.js"), + await module("frontend/lowering/class-dynamic-dispatch.js"), + await module("frontend/lowering/deferred-module-initializers.js"), + ); + const snapshots = installSnapshot(await module("frontend/lowering/lowerer.js")); + const { compile } = await import(pathToFileURL(join(dist, "index.js")).href); + const outDir = join(tmpdir(), `scriptc-lowering-order-${process.pid}`); + const result = await compile(entry, { + outDir, + outPath: irPath, + backend: "llvm", + outputKind: "ir", + }); + if (audit !== null) writeFileSync(auditPath, JSON.stringify(audit.report())); + writeFileSync(snapshotPath, JSON.stringify(snapshots.at(-1) ?? {})); + process.exit(result.ok ? 0 : 3); +} + +/** Records the contents of the lowerer's Map and Set fields once reachable + * emit finishes, under keys that do not depend on the process: syntax + * nodes by file and span, symbols by name and declaration, IR values by id + * or name. Values are digested to a bounded depth. */ +function installSnapshot({ Lowerer }) { + const snapshots = []; + const nodeKey = (node) => { + try { + return `node:${node.getSourceFile().fileName}:${node.kind}:${node.pos}:${node.end}`; + } catch { + return `node:?:${node.kind}:${node.pos}:${node.end}`; + } + }; + const isNode = (value) => + typeof value.kind === "number" && + typeof value.pos === "number" && + typeof value.end === "number" && + typeof value.getSourceFile === "function"; + const isSymbol = (value) => + typeof value.escapedName === "string" && Array.isArray(value.declarationHandles); + const symbolKey = (symbol) => { + let declaration = ""; + try { + const first = symbol.declarations[0]; + if (first !== undefined) declaration = nodeKey(first); + } catch {} + return `symbol:${symbol.escapedName}:${declaration}`; + }; + const key = (value) => { + if (value === null || (typeof value !== "object" && typeof value !== "function")) + return `${typeof value}:${String(value)}`; + if (isNode(value)) return nodeKey(value); + if (isSymbol(value)) return symbolKey(value); + for (const field of ["name", "id", "localId"]) + if (typeof value[field] === "string" || typeof value[field] === "number") + return `${value.constructor?.name}:${field}:${value[field]}`; + if (value.def && typeof value.def.name === "string") + return `${value.constructor?.name}:def:${value.def.name}`; + return null; + }; + const digest = (value, depth) => { + if (value === null || value === undefined || typeof value !== "object") + return typeof value === "function" ? "fn" : (JSON.stringify(value) ?? "undefined"); + const stable = key(value); + if (depth === 0) return stable ?? `<${value.constructor?.name}>`; + if (isNode(value) || isSymbol(value)) return stable; + if (Array.isArray(value)) return `[${value.map((item) => digest(item, depth - 1)).join(",")}]`; + if (value instanceof Map) + return `Map{${[...value] + .map(([k, v]) => `${key(k) ?? "?"}=>${digest(v, depth - 1)}`) + .sort() + .join(",")}}`; + if (value instanceof Set) + return `Set{${[...value] + .map((item) => key(item) ?? digest(item, depth - 1)) + .sort() + .join(",")}}`; + const fields = Object.keys(value).sort(); + return `${value.constructor?.name ?? "Object"}{${fields.map((field) => `${field}:${digest(value[field], depth - 1)}`).join(",")}}`; + }; + const emitReachable = Lowerer.prototype.emitReachable; + Lowerer.prototype.emitReachable = function (...args) { + const result = emitReachable.apply(this, args); + const snapshot = {}; + for (const [field, value] of Object.entries(this)) { + if (!(value instanceof Map) && !(value instanceof Set)) continue; + const entries = {}; + const unkeyed = []; + for (const item of value instanceof Map ? value : [...value].map((v) => [v, true])) { + const [k, v] = item; + const stable = key(k); + const text = digest(v, 3); + if (stable === null) unkeyed.push(text); + else entries[stable] = text; + } + snapshot[field] = { entries, unkeyed: unkeyed.sort() }; + } + snapshots.push(snapshot); + return result; + }; + return snapshots; +} + +/** Wraps the lowering methods that produce bodies and the lowerer's Map and + * Set fields; records which bodies touch which keys. */ +function installAudit({ Lowerer }, { ClassDynamicDispatch }, { DeferredModuleInitializers }) { + const proto = Lowerer.prototype; + const tokens = []; + const stack = []; + const fields = new Map(); + const objectIds = new Map(); + const keyId = (key) => { + if (key === null || (typeof key !== "object" && typeof key !== "function")) + return `${typeof key}:${String(key)}`; + let id = objectIds.get(key); + if (id === undefined) objectIds.set(key, (id = objectIds.size)); + return `object:${id}`; + }; + const current = () => (stack.length === 0 ? null : stack[stack.length - 1]); + const touch = (field, key, write) => { + const token = current(); + if (token === null) return; + let keys = fields.get(field); + if (keys === undefined) fields.set(field, (keys = new Map())); + const id = key === ITERATE ? "*" : keyId(key); + let entry = keys.get(id); + if (entry === undefined) keys.set(id, (entry = { readers: new Set(), writers: new Set() })); + (write ? entry.writers : entry.readers).add(token.id); + }; + const ITERATE = Symbol("iterate"); + const instrument = (field, value) => { + const read = (key) => touch(field, key, false); + const write = (key) => { + touch(field, key, true); + // A write changes what every iteration of the field observes. + touch(field, ITERATE, true); + }; + const iterate = () => touch(field, ITERATE, false); + const base = value instanceof Map ? Map.prototype : Set.prototype; + for (const name of ["get", "has"]) { + if (!(name in base)) continue; + const original = base[name]; + value[name] = function (key) { + read(key); + return original.call(this, key); + }; + } + for (const name of ["set", "add", "delete"]) { + if (!(name in base)) continue; + const original = base[name]; + value[name] = function (key, ...rest) { + write(key); + return original.call(this, key, ...rest); + }; + } + for (const name of ["forEach", "keys", "values", "entries", Symbol.iterator]) { + const original = base[name]; + value[name] = function (...args) { + iterate(); + return original.apply(this, args); + }; + } + const size = Object.getOwnPropertyDescriptor(base, "size").get; + Object.defineProperty(value, "size", { + get() { + iterate(); + return size.call(this); + }, + }); + }; + const emitReachable = proto.emitReachable; + proto.emitReachable = function (...args) { + for (const [field, value] of Object.entries(this)) + if (value instanceof Map || value instanceof Set) instrument(field, value); + return emitReachable.apply(this, args); + }; + const produced = (result, into) => { + if (result === null || result === undefined) return; + if (Array.isArray(result)) for (const fn of result) produced(fn, into); + else if (typeof result === "object" && typeof result.name === "string") into.add(result.name); + }; + // Passes over the lowered bodies after the worklist: the functions they + // create belong to the pass. + const passes = new Map(); + const wrapPass = (owner, label, method) => { + const original = owner.prototype[method]; + owner.prototype[method] = function (lowerer, ...rest) { + const implicit = lowerer.implicitFns?.length ?? 0; + const lifted = lowerer.liftedFns?.length ?? 0; + try { + return original.call(this, lowerer, ...rest); + } finally { + let names = passes.get(label); + if (names === undefined) passes.set(label, (names = new Set())); + for (const fn of (lowerer.implicitFns ?? []).slice(implicit)) names.add(fn.name); + for (const fn of (lowerer.liftedFns ?? []).slice(lifted)) names.add(fn.name); + } + }; + }; + wrapPass(ClassDynamicDispatch, "ClassDynamicDispatch.process", "process"); + wrapPass(ClassDynamicDispatch, "ClassDynamicDispatch.finalize", "finalize"); + wrapPass(DeferredModuleInitializers, "DeferredModuleInitializers.process", "process"); + for (const name of [ + "lowerFunction", + "lowerClassCtor", + "lowerClassMethodMember", + "lowerClassMembers", + "lowerFileInit", + "lowerGenericInstance", + "throwingSetterFn", + ]) { + const original = proto[name]; + if (typeof original !== "function") continue; + proto[name] = function (...args) { + const token = { id: tokens.length, names: new Set() }; + tokens.push(token); + const implicit = this.implicitFns?.length ?? 0; + const lifted = this.liftedFns?.length ?? 0; + stack.push(token); + try { + const result = original.apply(this, args); + produced(result, token.names); + return result; + } finally { + stack.pop(); + for (const fn of (this.implicitFns ?? []).slice(implicit)) token.names.add(fn.name); + for (const fn of (this.liftedFns ?? []).slice(lifted)) token.names.add(fn.name); + } + }; + } + return { + report() { + const out = {}; + for (const [field, keys] of fields) { + const involved = new Set(); + let sensitive = 0; + for (const { readers, writers } of keys.values()) { + const all = new Set([...readers, ...writers]); + if (writers.size === 0 || all.size < 2) continue; + sensitive++; + for (const id of all) for (const fn of tokens[id].names) involved.add(fn); + } + if (sensitive > 0) out[field] = { sensitiveKeys: sensitive, functions: [...involved] }; + } + for (const [label, names] of passes) + if (names.size > 0) out[`pass ${label}`] = { sensitiveKeys: 0, functions: [...names] }; + return out; + }, + }; +} + +const { values } = parseArgs({ + options: { + stride: { type: "string", default: "7" }, + offset: { type: "string", default: "0" }, + limit: { type: "string", default: "100000" }, + seeds: { type: "string", default: "1,2,3" }, + jobs: { type: "string", default: String(Math.max(1, Math.floor(cpus().length / 2))) }, + entry: { type: "string", multiple: true, default: [] }, + out: { type: "string", default: join(tmpdir(), "scriptc-lowering-order") }, + "no-audit": { type: "boolean", default: false }, + "fail-on": { type: "string" }, + }, +}); +if (values["fail-on"] !== undefined && !["names", "content"].includes(values["fail-on"])) + throw new Error(`--fail-on takes names or content, not ${values["fail-on"]}`); +const out = resolve(values.out); +mkdirSync(out, { recursive: true }); +const seeds = values.seeds.split(",").filter(Boolean); +const corpus = join(root, "tests/corpus"); +const programs = [ + ...readdirSync(corpus) + .filter((name) => /^\d+-.*\.ts$/.test(name)) + .filter((name) => Number.parseInt(name, 10) % Number(values.stride) === Number(values.offset)) + .sort((a, b) => Number.parseInt(a, 10) - Number.parseInt(b, 10)) + .slice(0, Number(values.limit)) + .map((name) => join(corpus, name)), + ...values.entry.map((entry) => resolve(entry)), +]; + +const child = (entry, irPath, seed, auditPath, snapshotPath) => + new Promise((done) => { + const proc = spawn( + process.execPath, + [ + "--max-old-space-size=8192", + fileURLToPath(import.meta.url), + "--child", + entry, + irPath, + seed, + auditPath, + snapshotPath, + ], + { stdio: ["ignore", "ignore", "pipe"], env: { ...process.env, SCRIPTC_NO_CACHE: "1" } }, + ); + let stderr = ""; + proc.stderr.on("data", (chunk) => (stderr += chunk)); + proc.on("close", (code) => done({ ok: code === 0, stderr: stderr.slice(-2000) })); + }); + +const loadIr = (path) => JSON.parse(readFileSync(path, "utf8")); +const firstDiff = (x, y, path = "") => { + if (JSON.stringify(x) === JSON.stringify(y)) return null; + if (typeof x !== "object" || typeof y !== "object" || x === null || y === null) return path; + for (const key of new Set([...Object.keys(x), ...Object.keys(y)])) { + const found = firstDiff(x[key], y[key], `${path}/${key}`); + if (found !== null) return found; + } + return path; +}; +const differingFunctions = (a, b) => { + const left = new Map(a.functions.map((fn) => [fn.name, fn])); + const right = new Map(b.functions.map((fn) => [fn.name, fn])); + const names = new Set(); + const paths = {}; + for (const [name, fn] of left) { + const other = right.get(name); + if (other === undefined) names.add(name); + else if (JSON.stringify(other) !== JSON.stringify(fn)) { + names.add(name); + paths[name] = firstDiff(fn, other).replace(/\/\d+/g, "/#"); + } + } + for (const name of right.keys()) if (!left.has(name)) names.add(name); + const topLevel = []; + for (const key of new Set([...Object.keys(a), ...Object.keys(b)])) + if (key !== "functions" && JSON.stringify(a[key]) !== JSON.stringify(b[key])) + topLevel.push(key); + if (a.functions.map((fn) => fn.name).join("\n") !== b.functions.map((fn) => fn.name).join("\n")) + topLevel.push("function order"); + return { functions: [...names], topLevel, paths }; +}; + +/** The module with every numbered function, record and union renamed by a + * hash of its own definition (digits stripped), other numbered strings by + * first use within their function or table entry, source locations + * dropped, and tables sorted. Orders whose canonical modules match differ + * only in names and ids numbered in creation order. */ +const canonicalModule = (mod) => { + const strip = (v) => JSON.stringify(v).replace(/\d+/g, "#"); + const hash = (text) => createHash("sha256").update(text).digest("hex").slice(0, 12); + const m = JSON.parse( + JSON.stringify(mod, (k, v) => (k === "loc" || k === "source" ? undefined : v)), + ); + const rename = new Map(); + for (const fn of m.functions ?? []) { + if (!/\d/.test(fn.name)) continue; + const { name, ...rest } = fn; + rename.set(name, `${name.replace(/\d+/g, "#")}~${hash(strip(rest))}`); + } + for (const key of ["records", "unions"]) + for (const item of m[key] ?? []) { + const { id, ...rest } = item; + if (typeof id === "string" && /\d/.test(id)) + rename.set(id, `${id.replace(/\d+/g, "#")}~${hash(strip(rest))}`); + } + const walk = (v, scope) => { + if (typeof v === "string") { + const renamed = rename.get(v); + if (renamed !== undefined) return renamed; + if (!/\d/.test(v)) return v; + let id = scope.get(v); + if (id === undefined) scope.set(v, (id = scope.size)); + return `${v.replace(/\d+/g, "#")}@${id}`; + } + if (Array.isArray(v)) return v.map((x) => walk(x, scope)); + if (v && typeof v === "object") + return Object.fromEntries(Object.keys(v).map((k) => [k, walk(v[k], scope)])); + return v; + }; + const out = {}; + for (const key of Object.keys(m)) + out[key] = Array.isArray(m[key]) + ? m[key].map((item) => JSON.stringify(walk(item, new Map()))).sort() + : JSON.stringify(walk(m[key], new Map())); + return out; +}; +/** Canonical entries present in one order only, by table. */ +const contentDifferences = (a, b) => { + const found = {}; + for (const key of new Set([...Object.keys(a), ...Object.keys(b)])) { + if (JSON.stringify(a[key]) === JSON.stringify(b[key])) continue; + if (!Array.isArray(a[key]) || !Array.isArray(b[key])) { + found[key] = ["(differs)"]; + continue; + } + const other = new Set(b[key]); + found[key] = a[key] + .filter((item) => !other.has(item)) + .map((item) => JSON.parse(item).name ?? JSON.parse(item).id ?? "?"); + } + return found; +}; + +/** Fields whose contents after reachable emit differ between two orders. */ +const differingState = (a, b) => { + const fields = []; + for (const field of new Set([...Object.keys(a), ...Object.keys(b)])) { + const x = a[field] ?? { entries: {}, unkeyed: [] }; + const y = b[field] ?? { entries: {}, unkeyed: [] }; + const keys = new Set([...Object.keys(x.entries), ...Object.keys(y.entries)]); + let differs = [...keys].some((k) => x.entries[k] !== y.entries[k]); + if (!differs) differs = JSON.stringify(x.unkeyed) !== JSON.stringify(y.unkeyed); + if (differs) fields.push(field); + } + return fields; +}; + +const results = []; +let next = 0; +await Promise.all( + Array.from({ length: Number(values.jobs) }, async () => { + while (next < programs.length) { + const entry = programs[next++]; + const name = basename(entry).replace(/\.ts$/, ""); + const dir = join(out, name); + mkdirSync(dir, { recursive: true }); + const audit = values["no-audit"] ? "-" : join(dir, "audit.json"); + const base = await child( + entry, + join(dir, "base.ir.json"), + "-", + audit, + join(dir, "base.state.json"), + ); + if (!base.ok) { + results.push({ program: name, status: "does not compile" }); + continue; + } + const diffs = {}; + const stateDiffs = {}; + let baseCanonical = null; + for (const seed of seeds) { + const run = await child( + entry, + join(dir, `seed${seed}.ir.json`), + seed, + "-", + join(dir, `seed${seed}.state.json`), + ); + if (!run.ok) { + diffs[seed] = { failed: run.stderr }; + continue; + } + const diff = differingFunctions( + loadIr(join(dir, "base.ir.json")), + loadIr(join(dir, `seed${seed}.ir.json`)), + ); + const state = differingState( + loadIr(join(dir, "base.state.json")), + loadIr(join(dir, `seed${seed}.state.json`)), + ); + if (state.length > 0) stateDiffs[seed] = state; + if (diff.functions.length > 0 || diff.topLevel.length > 0) { + baseCanonical ??= canonicalModule(loadIr(join(dir, "base.ir.json"))); + diff.content = contentDifferences( + baseCanonical, + canonicalModule(loadIr(join(dir, `seed${seed}.ir.json`))), + ); + diffs[seed] = diff; + } + } + const auditReport = audit === "-" ? {} : JSON.parse(readFileSync(audit, "utf8")); + const changed = new Set(Object.values(diffs).flatMap((diff) => diff.functions ?? [])); + const attribution = {}; + for (const fn of changed) { + const fields = Object.entries(auditReport) + .filter(([, entry]) => entry.functions.includes(fn)) + .map(([field]) => field); + attribution[fn] = fields; + } + results.push({ + program: name, + status: + Object.keys(diffs).length === 0 + ? "order-independent" + : Object.values(diffs).some((diff) => Object.keys(diff.content ?? {}).length > 0) + ? "order-dependent content" + : "order-dependent names", + diffs, + attribution, + sensitiveFields: Object.keys(auditReport), + stateFields: [...new Set(Object.values(stateDiffs).flat())], + }); + process.stderr.write( + `${results.length}/${programs.length} ${name}: ${results.at(-1).status}\n`, + ); + } + }), +); +writeFileSync(join(out, "results.json"), JSON.stringify(results, null, 2)); + +const dependent = results.filter((r) => r.status.startsWith("order-dependent")); +const content = results.filter((r) => r.status === "order-dependent content"); +const byField = new Map(); +let unattributed = 0; +for (const r of dependent) { + const fields = new Set(Object.values(r.attribution).flat()); + if (fields.size === 0) unattributed++; + for (const field of fields) byField.set(field, (byField.get(field) ?? 0) + 1); +} +console.log( + `programs ${results.length}: ${dependent.length} order-dependent (${content.length} beyond names and ids), ${results.filter((r) => r.status === "does not compile").length} do not compile`, +); +for (const r of content) + console.log( + ` ${r.program}: ${Object.values(r.diffs) + .flatMap((diff) => + Object.entries(diff.content ?? {}).map( + ([table, items]) => `${table}: ${items.slice(0, 4).join(", ")}`, + ), + ) + .slice(0, 3) + .join("; ")}`, + ); +for (const [field, count] of [...byField].sort((a, b) => b[1] - a[1])) + console.log(`${String(count).padStart(5)} ${field}`); +console.log(`${String(unattributed).padStart(5)} (no audited field)`); +const failing = + values["fail-on"] === "names" ? dependent : values["fail-on"] === "content" ? content : []; +if (failing.length > 0) { + console.log(`${failing.length} programs lower to different IR in another order`); + process.exitCode = 1; +} From 3b7f33c22393afe56700a48feebc4a091a975840 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 20:35:09 -0500 Subject: [PATCH 60/67] Leave SC6101 out of the native compiler's self-builds The compiler's own source has 24 likely-hot functions that use untyped values, so its self-builds now print SC6101. The native bootstrap contracts compare stderr exactly; the rebuilds of the compiler entry pass --no-dynamic-tier-warning, which changes no IR or LLVM output. --- .../self-hosting-native-driver.test.ts | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/tests/harness/self-hosting-native-driver.test.ts b/tests/harness/self-hosting-native-driver.test.ts index 722c3fede..1cc920bd2 100644 --- a/tests/harness/self-hosting-native-driver.test.ts +++ b/tests/harness/self-hosting-native-driver.test.ts @@ -185,6 +185,10 @@ test( return result.stdout; }; const entry = join(root, "packages/compiler/src/native/cli.ts"); + // The compiler's own source has untyped functions that SC6101 reports + // (diagnostics/dynamic-tier.ts). The contracts compare stderr exactly, + // so its self-builds leave that performance note out. + const quiet = "--no-dynamic-tier-warning"; const ffi = join(directory, ".scriptc/distribution-seed/compiler.ffi.json"); const rebuilt = executable("scriptc-rebuilt"); const checkProgram = async (compiler: string, source: string, extra: string[] = []) => { @@ -541,7 +545,18 @@ test( const self = await bootstrapStep("production CLI rebuilds itself", () => invoke( seed, - ["build", entry, "-o", rebuilt, "--strip", "--keep-llvm", "--emit-ir", "--ffi", ffi], + [ + "build", + entry, + "-o", + rebuilt, + "--strip", + "--keep-llvm", + "--emit-ir", + "--ffi", + ffi, + quiet, + ], "scriptc: warning: --emit-ir is deprecated; use --emit=ir for IR as the primary output\n", ), ); @@ -554,7 +569,16 @@ test( const seedLlvm = join(directory, "cli.ll"); const rebuiltLlvm = join(directory, "rebuilt.ll"); await bootstrapStep("rebuilt compiler emits itself", () => - invoke(rebuilt, ["build", entry, "--emit=llvm", "-o", rebuiltLlvm, "--ffi", ffi]), + invoke(rebuilt, [ + "build", + entry, + "--emit=llvm", + "-o", + rebuiltLlvm, + "--ffi", + ffi, + quiet, + ]), ); // Executable output adds a runtime ABI check; textual LLVM emission // omits it. Compare all other output without changing either mode. @@ -585,7 +609,7 @@ test( const rebuildFrontend = async () => { const lowered = join(directory, "cli.ir.json"); const output = await bootstrapStep("sanitized native frontend lowers the compiler", () => - invoke(seed, ["build", entry, "--emit=ir", "-o", lowered, "--ffi", ffi]), + invoke(seed, ["build", entry, "--emit=ir", "-o", lowered, "--ffi", ffi, quiet]), ); expect(output.trim()).toBe(lowered); await compareArtifacts({ ir: true, llvm: false }); @@ -605,6 +629,7 @@ test( ffi, "--sanitize", "--optimization=dev", + quiet, ], "", { SCRIPTC_BOOTSTRAP_IR_INPUT: seedIr }, From 388523cee4936f1c1c1243d87c5174ccd14dce43 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 21:09:39 -0500 Subject: [PATCH 61/67] Address review feedback on the lowering-order check --- scripts/lowering-order.mjs | 83 +++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 23 deletions(-) diff --git a/scripts/lowering-order.mjs b/scripts/lowering-order.mjs index ecfc20955..81611e6a4 100644 --- a/scripts/lowering-order.mjs +++ b/scripts/lowering-order.mjs @@ -371,17 +371,55 @@ const differingFunctions = (a, b) => { return { functions: [...names], topLevel, paths }; }; +/** Keys whose strings name functions, locals, globals, shapes, unions, + * classes and labels. Lowering numbers these in creation order; every other + * string (literal values, field names, library functions) is compared as + * is. A `name` names a function, record or union when it is one of the + * module's numbered definitions or starts with `%`. */ +const ID_KEYS = new Set([ + "base", + "callee", + "captures", + "catchLocalId", + "className", + "fnName", + "fromId", + "globalId", + "id", + "int32Locals", + "int32Params", + "label", + "labels", + "localId", + "retag", + "shapeId", + "targets", + "unionId", +]); + /** The module with every numbered function, record and union renamed by a - * hash of its own definition (digits stripped), other numbered strings by - * first use within their function or table entry, source locations - * dropped, and tables sorted. Orders whose canonical modules match differ - * only in names and ids numbered in creation order. */ + * hash of its own definition (ids with their digits stripped), other + * numbered ids by first use within their function or table entry, source + * locations dropped, and tables sorted. Orders whose canonical modules + * match differ only in names and ids numbered in creation order. */ const canonicalModule = (mod) => { - const strip = (v) => JSON.stringify(v).replace(/\d+/g, "#"); const hash = (text) => createHash("sha256").update(text).digest("hex").slice(0, 12); - const m = JSON.parse( - JSON.stringify(mod, (k, v) => (k === "loc" || k === "source" ? undefined : v)), - ); + const m = JSON.parse(JSON.stringify(mod, (k, v) => (k === "loc" ? undefined : v))); + const definitions = new Set([ + ...(m.functions ?? []).map((fn) => fn.name), + ...["records", "unions"].flatMap((key) => (m[key] ?? []).map((item) => item.id)), + ]); + const isId = (key, value) => + ID_KEYS.has(key) || (key === "name" && (definitions.has(value) || value.startsWith("%"))); + /** `v` with the strings under id keys passed through `id`. */ + const mapIds = (v, id, key) => { + if (typeof v === "string") return isId(key, v) ? id(v) : v; + if (Array.isArray(v)) return v.map((x) => mapIds(x, id, key)); + if (v && typeof v === "object") + return Object.fromEntries(Object.keys(v).map((k) => [k, mapIds(v[k], id, k)])); + return v; + }; + const strip = (v) => JSON.stringify(mapIds(v, (id) => id.replace(/\d+/g, "#"))); const rename = new Map(); for (const fn of m.functions ?? []) { if (!/\d/.test(fn.name)) continue; @@ -394,25 +432,22 @@ const canonicalModule = (mod) => { if (typeof id === "string" && /\d/.test(id)) rename.set(id, `${id.replace(/\d+/g, "#")}~${hash(strip(rest))}`); } - const walk = (v, scope) => { - if (typeof v === "string") { - const renamed = rename.get(v); + const canonical = (item) => { + const scope = new Map(); + return mapIds(item, (value) => { + const renamed = rename.get(value); if (renamed !== undefined) return renamed; - if (!/\d/.test(v)) return v; - let id = scope.get(v); - if (id === undefined) scope.set(v, (id = scope.size)); - return `${v.replace(/\d+/g, "#")}@${id}`; - } - if (Array.isArray(v)) return v.map((x) => walk(x, scope)); - if (v && typeof v === "object") - return Object.fromEntries(Object.keys(v).map((k) => [k, walk(v[k], scope)])); - return v; + if (!/\d/.test(value)) return value; + let id = scope.get(value); + if (id === undefined) scope.set(value, (id = scope.size)); + return `${value.replace(/\d+/g, "#")}@${id}`; + }); }; const out = {}; for (const key of Object.keys(m)) out[key] = Array.isArray(m[key]) - ? m[key].map((item) => JSON.stringify(walk(item, new Map()))).sort() - : JSON.stringify(walk(m[key], new Map())); + ? m[key].map((item) => JSON.stringify(canonical(item))).sort() + : JSON.stringify(canonical(m[key])); return out; }; /** Canonical entries present in one order only, by table. */ @@ -479,7 +514,9 @@ await Promise.all( join(dir, `seed${seed}.state.json`), ); if (!run.ok) { - diffs[seed] = { failed: run.stderr }; + // A program that lowers in discovery order but not in this one + // differs in content. + diffs[seed] = { failed: run.stderr, content: { lowering: ["fails in this order"] } }; continue; } const diff = differingFunctions( From 4a5ddadd3dd1418da78047d42cbca38df2eb4e9a Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 21:28:27 -0500 Subject: [PATCH 62/67] Memoize an empty literal's type separately as a union arm The type mapper maps the type inferred from an empty object literal to the empty record as an arm of an unreduced union and to a checked-dynamic value elsewhere, but both answers shared one memo entry. Once the type had been mapped on its own, a union such as `typeof empty | DataView` reused the dynamic answer for its arm and refused (SC2009). The memo key now includes whether the mapping is for such an arm. --- packages/compiler/src/frontend/type-mapper.ts | 5 ++++- tests/corpus/6909-empty-object-type-values.ts | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/compiler/src/frontend/type-mapper.ts b/packages/compiler/src/frontend/type-mapper.ts index 6305a6b63..c171c5c4b 100644 --- a/packages/compiler/src/frontend/type-mapper.ts +++ b/packages/compiler/src/frontend/type-mapper.ts @@ -1655,7 +1655,10 @@ export function mapType(type: ts.Type, ctx: TypeMapperCtx): IrType | null { const topLevel = mapTypeDepth === 0; const typeId = (type as { id?: number }).id; const memoizable = typeId !== undefined && (ctx.canMemoizeType?.() ?? true); - const memoKey = memoizable ? `${0}:${typeId}` : null; + // An empty literal's type maps to the empty record as an unreduced union's + // arm (emptyLiteralArm) and to the checked-dynamic value elsewhere: the two + // answers keep separate memo entries. + const memoKey = memoizable ? `${ctx.emptyLiteralArm ? 1 : 0}:${typeId}` : null; if (memoKey !== null) { const memo = ctx.typeMemo?.get(memoKey); if (memo !== undefined) return memo; diff --git a/tests/corpus/6909-empty-object-type-values.ts b/tests/corpus/6909-empty-object-type-values.ts index b539415fd..f845e19a6 100644 --- a/tests/corpus/6909-empty-object-type-values.ts +++ b/tests/corpus/6909-empty-object-type-values.ts @@ -30,3 +30,11 @@ console.log(typeof choose(1), typeof choose(-1)); const empty = {}; console.log(JSON.stringify(empty), Object.keys(empty).length, empty === empty, String(empty)); + +// An empty literal's type beside a typed arm of an unreduced union, after +// the type was already used on its own. +const viewed = {}; +console.log(JSON.stringify(viewed)); +const views: (typeof viewed | DataView)[] = [viewed, new DataView(new ArrayBuffer(2))]; +for (const view of views) + console.log(view instanceof DataView ? `view ${view.byteLength}` : JSON.stringify(view)); From 487f536a2908ae4bb4c755bd1b57768f502c674c Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 21:28:46 -0500 Subject: [PATCH 63/67] Keep int32 fields of classes whose prototypes are named for inspection dyn.nameClassPrototype sets the class name on a class's runtime prototype object and stores no property. The int32 field analysis did not list it as read-only, so every program that gave a class a runtime prototype counted a dynamic store that can name any property, and the number fields of every class reaching dynamic code were stored as doubles. --- packages/compiler/src/ir/int32-slots.test.ts | 4 +- packages/compiler/src/ir/int32-slots.ts | 1 + .../test/int32-dynamic-exposure.test.ts | 84 +++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 packages/compiler/test/int32-dynamic-exposure.test.ts diff --git a/packages/compiler/src/ir/int32-slots.test.ts b/packages/compiler/src/ir/int32-slots.test.ts index 446b3512d..be933ab38 100644 --- a/packages/compiler/src/ir/int32-slots.test.ts +++ b/packages/compiler/src/ir/int32-slots.test.ts @@ -262,7 +262,8 @@ test("dynamic stores disqualify the field names they can reach", () => { expect([readOnly.isField("C", "a"), readOnly.isField("C", "b")]).toEqual([true, true]); // Reflection that only reads the view (Object.keys/values/entries, for-in, // own-key lists, typeof, toString and inspection) stores nothing, nor does - // creating an object from a prototype or reading a prototype. + // creating an object from a prototype, reading a prototype or naming a + // class prototype for inspection. for (const reader of [ "dyn.objKeys", "dyn.objKeyStrings", @@ -282,6 +283,7 @@ test("dynamic stores disqualify the field names they can reach", () => { "insp.dynS", "dyn.objCreate", "dyn.getPrototype", + "dyn.nameClassPrototype", // Registering or removing a process event listener stores nothing either. "process.onSignal", "process.offSignal", diff --git a/packages/compiler/src/ir/int32-slots.ts b/packages/compiler/src/ir/int32-slots.ts index 781fa86bd..6ff148c55 100644 --- a/packages/compiler/src/ir/int32-slots.ts +++ b/packages/compiler/src/ir/int32-slots.ts @@ -376,6 +376,7 @@ const DYN_READ_ONLY = new Set([ "dyn.collectionIteratorIndex", "dyn.mapSeedEntries", "dyn.mapSeedEntry", + "dyn.nameClassPrototype", "dyn.numberConstructor", "dyn.objCreate", "dyn.objEntries", diff --git a/packages/compiler/test/int32-dynamic-exposure.test.ts b/packages/compiler/test/int32-dynamic-exposure.test.ts new file mode 100644 index 000000000..09330e057 --- /dev/null +++ b/packages/compiler/test/int32-dynamic-exposure.test.ts @@ -0,0 +1,84 @@ +import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { expect, test } from "vitest"; +import { compile, deserializeModule } from "../src/index.js"; +import { analyzeInt32Slots, dynamicFieldStores } from "../src/ir/int32-slots.js"; +import type { IrModule } from "../src/ir/ir.js"; + +// Instances of these classes reach checked-dynamic code (an unknown[] array, +// instanceof, inspection, JSON and string conversion), but the program never +// stores a property through a dynamic value. The helpers the compiler emits +// for those reads (prototype objects, inspection names) store nothing, so the +// classes keep their int32 fields. +const source = ` +import { inspect } from "node:util"; + +class Node { + kind: number; + flags = 0; + constructor(kind: number) { + this.kind = kind; + } +} +class Identifier extends Node { + text = "id"; +} +class Type { + constructor( + public flags: number, + public id: number, + ) {} +} + +const values: unknown[] = [new Node(1), new Identifier(2), new Type(4, 7), "s", 3]; +let total = 0; +for (const value of values) { + if (value instanceof Identifier) total += value.kind | value.flags; + else if (value instanceof Node) total += value.kind; + else if (value instanceof Type) total += value.flags & 6; +} +console.log(total, values, inspect(new Type(1, 2))); +console.log(JSON.stringify(values), String(values[0]), typeof values[2]); +`; + +async function lowered(): Promise { + const dir = await mkdtemp(join(tmpdir(), "scriptc-int32-dynamic-")); + try { + const entry = join(dir, "main.ts"); + await writeFile(entry, source); + const outPath = join(dir, "main.ir.json"); + const result = await compile(entry, { outDir: dir, outPath, outputKind: "ir" }); + if (!result.ok) + throw new Error(result.diagnostics.map((d) => `${d.code}: ${d.message}`).join("\n")); + return deserializeModule(await readFile(outPath, "utf8")); + } finally { + await rm(dir, { recursive: true, force: true }); + } +} + +test("classes that only reach dynamic reads keep their int32 fields", async () => { + const mod = await lowered(); + // Name the functions whose dynamic helpers count as stores that can name + // any property: such a helper either stores into the value or is missing + // from the analysis's read-only list (DYN_READ_ONLY in int32-slots.ts). + const storing = mod.functions + .filter((fn) => dynamicFieldStores({ ...mod, functions: [fn] }).all) + .map((fn) => fn.name); + expect(storing).toEqual([]); + expect(dynamicFieldStores(mod).names.size).toBe(0); + + const slots = analyzeInt32Slots(mod); + const className = (jsName: string): string => + mod.classes!.find((c) => (c.jsName ?? c.name) === jsName || c.name.endsWith(`.${jsName}`))! + .name; + expect([ + slots.isField(className("Node"), "kind"), + slots.isField(className("Node"), "flags"), + slots.isField(className("Identifier"), "kind"), + slots.isField(className("Type"), "flags"), + slots.isField(className("Type"), "id"), + ]).toEqual([true, true, true, true, true]); + // The program reaches the helper that names class prototypes for inspection. + expect(mod.functions.some((fn) => fn.name.startsWith("%prototype.data."))).toBe(true); +}); From c0014f683d15672058569def9a5c5195a6fad58a Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 21:29:59 -0500 Subject: [PATCH 64/67] Convert unions of primitives with unary + --- .../frontend/lowering/expressions/updates.ts | 9 +++- .../src/frontend/lowering/lower-calls.ts | 14 ++++++ .../6860-unary-plus-primitive-unions.ts.json | 6 +++ .../6861-unary-plus-optional-values.js.json | 6 +++ .../6860-unary-plus-primitive-unions.ts | 48 ++++++++++++++++++ .../corpus/6861-unary-plus-optional-values.js | 49 +++++++++++++++++++ .../6860-unary-plus-primitive-unions.ts.json | 1 + .../6861-unary-plus-optional-values.js.json | 1 + 8 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6860-unary-plus-primitive-unions.ts.json create mode 100644 packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6861-unary-plus-optional-values.js.json create mode 100644 tests/corpus/6860-unary-plus-primitive-unions.ts create mode 100644 tests/corpus/6861-unary-plus-optional-values.js create mode 100644 tests/harness/corpus-costs/6860-unary-plus-primitive-unions.ts.json create mode 100644 tests/harness/corpus-costs/6861-unary-plus-optional-values.js.json diff --git a/packages/compiler/src/frontend/lowering/expressions/updates.ts b/packages/compiler/src/frontend/lowering/expressions/updates.ts index 7269f6b52..13baca7d2 100644 --- a/packages/compiler/src/frontend/lowering/expressions/updates.ts +++ b/packages/compiler/src/frontend/lowering/expressions/updates.ts @@ -30,6 +30,7 @@ import { } from "../../../ir/ir.js"; import { isJsSourceFile, locOf } from "../../program.js"; import { classToNumberConversion } from "../class-to-primitive.js"; +import { lowerPrimitiveUnionNumber } from "../lower-calls.js"; import { dynUndefinedExpr, nodeThrowExpr, numLit, varRef } from "../../../ir/build.js"; import { fenceNodeModuleMutation } from "../lower-node-module.js"; import { staticFieldWriteTarget } from "../lower-classes.js"; @@ -132,8 +133,12 @@ export function lowerPrefixUnary(lowerer: Lowerer, expr: ts.PrefixUnaryExpressio const classNumber = classToNumberConversion(lowerer, raw, expr.operand, "unary plus"); if (classNumber) return classNumber; const operand = lowerOptionalNumber(lowerer, raw, loc, expr.operand); - if (operand.type.kind !== "f64") operatorUnsupported(lowerer, expr, "+", [raw.type]); - return operand; + if (operand.type.kind === "f64") return operand; + // `+process.argv[2]`: a `string | undefined` (or other primitive + // union) converts as Number(value) does. + const unionNumber = lowerPrimitiveUnionNumber(lowerer, raw, expr.operand, loc); + if (unionNumber) return unionNumber; + operatorUnsupported(lowerer, expr, "+", [raw.type]); } case ts.SyntaxKind.ExclamationToken: { // `!x` is ToBoolean-then-negate: f64/string operands go through toBool. diff --git a/packages/compiler/src/frontend/lowering/lower-calls.ts b/packages/compiler/src/frontend/lowering/lower-calls.ts index ac7728838..a5c09796c 100644 --- a/packages/compiler/src/frontend/lowering/lower-calls.ts +++ b/packages/compiler/src/frontend/lowering/lower-calls.ts @@ -3201,6 +3201,20 @@ function lowerStringPrototypeCall( ); } +/** ToNumber of a union of strings, numbers, booleans, null and undefined, as + * `Number(value)` converts it; null for other types. Unary `+` takes it too: + * the two conversions differ only for BigInt, which such unions don't hold. */ +export function lowerPrimitiveUnionNumber( + lowerer: Lowerer, + arg: IrExpr, + node: ts.Expression, + loc: SrcLoc, +): IrExpr | null { + return ( + lowerOptionalStringNumber(lowerer, arg, loc) ?? lowerScalarUnionNumber(lowerer, arg, node, loc) + ); +} + function lowerScalarUnionNumber( lowerer: Lowerer, arg: IrExpr, diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6860-unary-plus-primitive-unions.ts.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6860-unary-plus-primitive-unions.ts.json new file mode 100644 index 000000000..9847a1330 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6860-unary-plus-primitive-unions.ts.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6860-unary-plus-primitive-unions.ts" + ], + "diags": [] +} diff --git a/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6861-unary-plus-optional-values.js.json b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6861-unary-plus-optional-values.js.json new file mode 100644 index 000000000..7bf8c20a2 --- /dev/null +++ b/packages/compiler/test/ts7/baselines/order-parity/tests/corpus/6861-unary-plus-optional-values.js.json @@ -0,0 +1,6 @@ +{ + "order": [ + "/tests/corpus/6861-unary-plus-optional-values.js" + ], + "diags": [] +} diff --git a/tests/corpus/6860-unary-plus-primitive-unions.ts b/tests/corpus/6860-unary-plus-primitive-unions.ts new file mode 100644 index 000000000..e112013d9 --- /dev/null +++ b/tests/corpus/6860-unary-plus-primitive-unions.ts @@ -0,0 +1,48 @@ +// Unary + on unions of strings, numbers and booleans converts as Number(value) +// does: strings parse with StringToNumber (whitespace, hex, octal and binary +// prefixes, Infinity), booleans become 1 and 0, and numbers keep their value. +function show(label: string, value: number): void { + console.log(label, Object.is(value, -0) ? "-0" : String(value)); +} + +function plusTextOrNumber(value: string | number): number { + return +value; +} + +function plusTextOrFlag(value: string | boolean): number { + return +value; +} + +function plusNumberOrFlag(value: number | boolean): number { + return +value; +} + +type Scalar = string | number | boolean; + +const texts = ["42", " 0x1F ", "", " ", "1e3", "-0", "abc", "Infinity", "0b101", "0o17", "1_000", "\n7\t"]; +for (const text of texts) show(`text ${JSON.stringify(text)}`, plusTextOrNumber(text)); +for (const n of [9, -0, 0.5, Number.NaN, -Infinity]) show(`number ${String(n)}`, plusTextOrNumber(n)); +for (const value of [true, false, "3", "x"]) show(`text or flag ${String(value)}`, plusTextOrFlag(value)); +for (const value of [true, false, 2.5]) show(`number or flag ${String(value)}`, plusNumberOrFlag(value)); + +const scalars: Scalar[] = ["7", 3.5, true, false, "", -0, " 12 "]; +let total = 0; +for (const value of scalars) { + const n = +value; + total += n; + show(`scalar ${typeof value} ${JSON.stringify(value)}`, n); +} +show("total", total); + +// In expressions: sums, negation and comparisons. +const width: string | number = texts.length > 3 ? "640" : 0; +const ratio: string | number = texts.length > 3 ? 1.5 : "2"; +show("sum", +width + +ratio); +show("negated", -+width); +console.log("compare", +width > 600, +ratio === 1.5); + +type Level = "1" | "2" | 3; +function plusLevel(level: Level): number { + return +level; +} +show("level", plusLevel("2") + plusLevel(3)); diff --git a/tests/corpus/6861-unary-plus-optional-values.js b/tests/corpus/6861-unary-plus-optional-values.js new file mode 100644 index 000000000..6acf48e10 --- /dev/null +++ b/tests/corpus/6861-unary-plus-optional-values.js @@ -0,0 +1,49 @@ +// Unary + in JavaScript on values that may be undefined or null: command-line +// argument slots, Map lookups, optional parameters and nullable values convert +// as Number(value) does (undefined to NaN, null to 0). +function show(label, value) { + console.log(label, Object.is(value, -0) ? "-0" : String(value)); +} + +// No arguments: the first argument slot is undefined. +const n = +process.argv[2]; +show("argv[2]", n); +show("argv[2] doubled", +process.argv[2] * 2); +show("argv[2] or default", +process.argv[2] || 100); +show("argv[0] is a path", +process.argv[0]); + +const settings = new Map([ + ["width", "640"], + ["ratio", "1.5"], + ["blank", " "], +]); +show("map width", +settings.get("width")); +show("map ratio", +settings.get("ratio")); +show("map blank", +settings.get("blank")); +show("map missing", +settings.get("height")); +show("map sum", +settings.get("width") + +settings.get("ratio")); +show("negated", -+settings.get("width")); + +function plusOptional(value) { + return +value; +} +for (const text of ["42", " 0x1F ", "", "1e3", "-0", "abc", undefined]) { + show(`optional ${String(text)}`, plusOptional(text)); +} + +function plusParameter(value = undefined) { + return +value; +} +show("parameter missing", plusParameter()); +show("parameter given", plusParameter("12.5")); + +const words = ["3", "x"]; +show("past the end", +words[5]); +show("in range", +words[0]); + +const lookup = { a: "8" }; +show("missing key", +lookup.b); +show("present key", +lookup.a); + +const maybeNull = words.length > 1 ? null : "1"; +show("null", +maybeNull); diff --git a/tests/harness/corpus-costs/6860-unary-plus-primitive-unions.ts.json b/tests/harness/corpus-costs/6860-unary-plus-primitive-unions.ts.json new file mode 100644 index 000000000..8211f0716 --- /dev/null +++ b/tests/harness/corpus-costs/6860-unary-plus-primitive-unions.ts.json @@ -0,0 +1 @@ +{ "plain": 2430, "san": 6860 } diff --git a/tests/harness/corpus-costs/6861-unary-plus-optional-values.js.json b/tests/harness/corpus-costs/6861-unary-plus-optional-values.js.json new file mode 100644 index 000000000..376953c70 --- /dev/null +++ b/tests/harness/corpus-costs/6861-unary-plus-optional-values.js.json @@ -0,0 +1 @@ +{ "plain": 2000, "san": 5370 } From 71e118be7be32bd09c7d3a935155b3b8765e1086 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 21:42:23 -0500 Subject: [PATCH 65/67] Count loops bounded by a string's length in integers A counted for loop needs a stable limit to run its counter in integer storage. Array lengths qualified when the loop provably keeps them, but a string's length did not, so `for (let i = 0; i < s.length; i++)` kept a double counter and evaluated the length, through the UTF-16 mapping of a non-ASCII string, on every iteration. A string's length cannot change, so it is now stable whenever the string's binding is not rebound in the loop or boxed. --- .../compiler/src/ir/integer-loops.test.ts | 39 +++++++++++++++++++ packages/compiler/src/ir/integer-loops.ts | 7 ++++ 2 files changed, 46 insertions(+) diff --git a/packages/compiler/src/ir/integer-loops.test.ts b/packages/compiler/src/ir/integer-loops.test.ts index 75968b262..aada3b053 100644 --- a/packages/compiler/src/ir/integer-loops.test.ts +++ b/packages/compiler/src/ir/integer-loops.test.ts @@ -209,6 +209,45 @@ test("a string read at the counter is an integer consumer", () => { expect(matchIntegerCountedForLoop(s, withText)).toBeNull(); }); +test("a string length bounds a counted loop while its binding is unchanged", () => { + const withText = new Map(locals); + withText.set("s", { id: "s", name: "s", type: STRING, mutable: true }); + const text = (): IrExpr => ({ kind: "varRef", localId: "s", type: STRING, loc }); + const length: IrExpr = { + kind: "strIntrinsic", + method: "length", + receiver: text(), + args: [], + type: F64, + loc, + }; + const s = counted(length); + s.body = [ + { + kind: "exprStmt", + expr: { + kind: "strIntrinsic", + method: "charCodeAt", + receiver: text(), + args: [ref("i")], + type: F64, + loc, + }, + loc, + }, + ]; + expect(matchIntegerCountedForLoop(s, withText)?.localId).toBe("i"); + // Rebinding the string in the body changes the length the condition reads. + const rebinding = { + ...s, + body: [...s.body, { kind: "assign", localId: "s", value: text(), loc } as IrStmt], + }; + expect(matchIntegerCountedForLoop(rebinding, withText)).toBeNull(); + const boxed = new Map(withText); + boxed.set("s", { ...withText.get("s")!, boxed: true }); + expect(matchIntegerCountedForLoop(s, boxed)).toBeNull(); +}); + test("a stable array length bounds a counted loop; a resizing body keeps it a condition", () => { const ARR = arrayOf(F64); const array = (localId: string): IrExpr => ({ kind: "varRef", localId, type: ARR, loc }); diff --git a/packages/compiler/src/ir/integer-loops.ts b/packages/compiler/src/ir/integer-loops.ts index 3ba186376..9b4675685 100644 --- a/packages/compiler/src/ir/integer-loops.ts +++ b/packages/compiler/src/ir/integer-loops.ts @@ -83,6 +83,13 @@ function stableLoopValue( stableLoopValue(value.left, locals, body, invariant, counter, stableLength) && stableLoopValue(value.right, locals, body, invariant, counter, stableLength) ); + case "strIntrinsic": + // A string's length is fixed: stable while its binding is. + return ( + value.method === "length" && + value.receiver.kind === "varRef" && + stableLoopValue(value.receiver, locals, body, invariant, counter) + ); case "bytesIntrinsic": case "arrIntrinsic": return ( From ca446b2c30b3ecf5347d64e241a766af9989d52c Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 21:56:08 -0500 Subject: [PATCH 66/67] Read the tls.createServer SNICallback in source order The runtime call reads the cert and key options before the SNICallback, so a cert or key initializer after the callback that reassigned the callback's binding changed the callback the server used, and the server could serve the wrong certificate. When SNICallback comes before a cert or key entry, the callback is now saved just before the next of them is evaluated. With the callback read in order, a callback expression with side effects lowers instead of being refused. --- .../src/frontend/lowering/lower-server.ts | 27 +++++++++------ tests/corpus/6933-tls-sni-callback.ts | 34 ++++++++++++++++++- tests/diagnostics/tls-sni-callback-fences.ts | 2 -- .../tls-sni-callback-fences.ts.txt | 17 +++------- 4 files changed, 54 insertions(+), 26 deletions(-) diff --git a/packages/compiler/src/frontend/lowering/lower-server.ts b/packages/compiler/src/frontend/lowering/lower-server.ts index c27b2513e..058d7874a 100644 --- a/packages/compiler/src/frontend/lowering/lower-server.ts +++ b/packages/compiler/src/frontend/lowering/lower-server.ts @@ -4762,6 +4762,7 @@ function lowerTlsServerOptions( let cert: IrExpr | null = null; let key: IrExpr | null = null; let sni: IrExpr | undefined; + let pendingSni: IrStmt | null = null; for (const prop of node.properties.nodes) { let initializer: ts.Expression | null; if ( @@ -4780,20 +4781,22 @@ function lowerTlsServerOptions( } const k = (prop.name as ts.Identifier | ts.StringLiteral).text; if (k === "SNICallback" && allowSni) { - // The callback is a value read (a function or a binding), so it may - // be read after cert and key without changing what the program sees. - if (initializer !== null && !sideEffectFreeOptionValue(initializer)) { - lowerer.noLowering( - `a ${what} SNICallback expression with side effects`, - prop, - "pass a function or a variable that holds one", - ); - } const value = initializer !== null ? lowerer.lowerExpr(initializer) : lowerer.lowerShorthandValue(prop as ts.ShorthandPropertyAssignment); - sni = checkSniCallbackValue(lowerer, value, prop, what); + const checked = checkSniCallbackValue(lowerer, value, prop, what); + if (cert !== null && key !== null) { + sni = checked; + } else { + // The runtime call reads cert and key first. A cert or key entry + // after the callback can change the binding the callback reads, + // so the callback is saved ahead of the next of them, in source + // order. + const saved = lowerer.declareHiddenLocal("%sniCallback", checked.type); + pendingSni = { kind: "varDecl", localId: saved.id, init: checked, loc: locOf(prop) }; + sni = varRef(saved.id, checked.type, locOf(prop)); + } continue; } if (k !== "cert" && k !== "key") { @@ -4857,6 +4860,10 @@ function lowerTlsServerOptions( "cert/key are PEM strings or Buffers here", ); } + if (pendingSni !== null) { + v = { kind: "seqExpr", stmts: [pendingSni], result: v, type: v.type, loc }; + pendingSni = null; + } if (k === "cert") cert = v; else key = v; } diff --git a/tests/corpus/6933-tls-sni-callback.ts b/tests/corpus/6933-tls-sni-callback.ts index 7958882d5..8c9442806 100644 --- a/tests/corpus/6933-tls-sni-callback.ts +++ b/tests/corpus/6933-tls-sni-callback.ts @@ -33,6 +33,30 @@ const server = tls.createServer( }, ); +// The callback is read where it appears, effects included: a later cert +// initializer that reassigns its binding does not change the callback the +// server uses. +type Sni = (servername: string, cb: (err: Error | null, ctx?: tls.SecureContext) => void) => void; +let chosen: Sni = (servername, cb) => { + console.log("first callback", servername); + cb(null, altContext); +}; +const ordered = tls.createServer( + { + SNICallback: (console.log("read callback"), chosen), + cert: (console.log("read cert"), + (chosen = (servername, cb) => { + console.log("second callback", servername); + cb(null, undefined); + }), + cert), + key, + }, + (socket) => { + socket.end("ordered"); + }, +); + function attempt(port: number, servername: string, next: () => void): void { let done = false; const finish = (line: string): void => { @@ -58,7 +82,15 @@ server.listen(0, "127.0.0.1", () => { attempt(port, "localhost", () => attempt(port, "alt.localhost", () => attempt(port, "other.localhost", () => - attempt(port, "fail.localhost", () => server.close(() => console.log("closed"))), + attempt(port, "fail.localhost", () => + server.close(() => { + console.log("closed"); + ordered.listen(0, "127.0.0.1", () => { + const orderedPort = (ordered.address() as net.AddressInfo).port; + attempt(orderedPort, "alt.localhost", () => ordered.close(() => console.log("ordered closed"))); + }); + }), + ), ), ), ); diff --git a/tests/diagnostics/tls-sni-callback-fences.ts b/tests/diagnostics/tls-sni-callback-fences.ts index 0c745365c..20b6ce271 100644 --- a/tests/diagnostics/tls-sni-callback-fences.ts +++ b/tests/diagnostics/tls-sni-callback-fences.ts @@ -9,7 +9,5 @@ function makeSni(): (servername: string, cb: Answer) => void { return (_servername, cb) => cb(null, undefined); } -// The callback expression has side effects. -tls.createServer({ cert, key, SNICallback: makeSni() }, (socket) => socket.end()); // SNICallback with options the runtime options walk reads. tls.createServer({ cert, key, ALPNProtocols: ["h2"], SNICallback: makeSni }); diff --git a/tests/harness/__snapshots__/tls-sni-callback-fences.ts.txt b/tests/harness/__snapshots__/tls-sni-callback-fences.ts.txt index 920e65532..c45608bb9 100644 --- a/tests/harness/__snapshots__/tls-sni-callback-fences.ts.txt +++ b/tests/harness/__snapshots__/tls-sni-callback-fences.ts.txt @@ -1,17 +1,8 @@ -tls-sni-callback-fences.ts:13:31 - error SC2020: 'a tls.createServer SNICallback expression with side effects' is part of the standard library types but has no scriptc lowering yet +tls-sni-callback-fences.ts:13:54 - error SC2020: 'tls.createServer with SNICallback and options the runtime walk reads' is part of the standard library types but has no scriptc lowering yet - 12 | // The callback expression has side effects. - 13 | tls.createServer({ cert, key, SNICallback: makeSni() }, (socket) => socket.end()); - | ^~~~~~~~~~~~~~~~~~~~~~ - 14 | // SNICallback with options the runtime options walk reads. - - hint: pass a function or a variable that holds one - -tls-sni-callback-fences.ts:15:54 - error SC2020: 'tls.createServer with SNICallback and options the runtime walk reads' is part of the standard library types but has no scriptc lowering yet - - 14 | // SNICallback with options the runtime options walk reads. - 15 | tls.createServer({ cert, key, ALPNProtocols: ["h2"], SNICallback: makeSni }); + 12 | // SNICallback with options the runtime options walk reads. + 13 | tls.createServer({ cert, key, ALPNProtocols: ["h2"], SNICallback: makeSni }); | ^~~~~~~~~~~~~~~~~~~~ - 16 | + 14 | hint: SNICallback lowers with cert and key; ALPNProtocols, minVersion, maxVersion and the validated options are not combined with it yet \ No newline at end of file From 71d5e92dc044b4d719d8ae0f76d11751619fb499 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 21 Oct 2026 22:02:22 -0500 Subject: [PATCH 67/67] Address review feedback on properties untyped code adds to typed objects --- packages/runtime/src/scr_json.c | 42 ++++++++++++------- .../corpus/6990-record-writes-from-js/main.ts | 6 +++ 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/packages/runtime/src/scr_json.c b/packages/runtime/src/scr_json.c index bd9bc2cc2..54411bd54 100644 --- a/packages/runtime/src/scr_json.c +++ b/packages/runtime/src/scr_json.c @@ -2981,30 +2981,40 @@ static bool scr_jb_put_source_field(ScrJsonBuf *b, void *rec, const ScrRecordSou * a source, otherwise writes nothing and answers false. */ static bool scr_dyn_key_is_index(const char *key, size_t len, double *out); +typedef struct { + double index; + size_t entry; +} ScrRecordSourceIntegerKey; + +static int scr_record_source_integer_cmp(const void *a, const void *b) { + double x = ((const ScrRecordSourceIntegerKey *)a)->index; + double y = ((const ScrRecordSourceIntegerKey *)b)->index; + return (x > y) - (x < y); +} + /* The entry indexes of `view` in JavaScript's own-key order: integer keys * ascending, then the other keys in insertion order. `out` holds len. */ static void scr_record_source_key_order(const ScrDyn *view, size_t *out) { - size_t integers = 0; - for (size_t i = 0; i < view->v.obj.len; i++) { - double index; + size_t len = view->v.obj.len; + ScrRecordSourceIntegerKey small[64]; + ScrRecordSourceIntegerKey *keys = len <= 64 ? small : malloc(len * sizeof *keys); + if (!keys) scr_json_oom(); + size_t integers = 0, next = 0; + for (size_t i = 0; i < len; i++) { const ScrDynEntry *entry = &view->v.obj.entries[i]; - if (!scr_dyn_key_is_index(entry->key, entry->key_len, &index)) continue; - size_t at = integers++; - for (; at > 0; at--) { - double before; - const ScrDynEntry *previous = &view->v.obj.entries[out[at - 1]]; - scr_dyn_key_is_index(previous->key, previous->key_len, &before); - if (before < index) break; - out[at] = out[at - 1]; - } - out[at] = i; + double index; + if (scr_dyn_key_is_index(entry->key, entry->key_len, &index)) + keys[integers++] = (ScrRecordSourceIntegerKey){ index, i }; } - size_t next = integers; - for (size_t i = 0; i < view->v.obj.len; i++) { - double index; + /* Integer keys are distinct, so the order is total. */ + qsort(keys, integers, sizeof *keys, scr_record_source_integer_cmp); + for (size_t i = 0; i < integers; i++) out[next++] = keys[i].entry; + for (size_t i = 0; i < len; i++) { const ScrDynEntry *entry = &view->v.obj.entries[i]; + double index; if (!scr_dyn_key_is_index(entry->key, entry->key_len, &index)) out[next++] = i; } + if (keys != small) free(keys); } bool scr_jb_try_record_source(ScrJsonBuf *b, void *rec, diff --git a/tests/corpus/6990-record-writes-from-js/main.ts b/tests/corpus/6990-record-writes-from-js/main.ts index 2b343efc5..2ca26b3e2 100644 --- a/tests/corpus/6990-record-writes-from-js/main.ts +++ b/tests/corpus/6990-record-writes-from-js/main.ts @@ -21,3 +21,9 @@ write(config, "debug", true); write(config, "tags", ["a", "b"]); console.log(JSON.stringify(config), keysOf(config)); console.log(config); + +// Many integer keys added in descending order serialize in ascending order. +const many = { name: "many" }; +for (let i = 3000; i > 0; i--) write(many, i, i); +const text = JSON.stringify(many); +console.log(text.length, text.slice(0, 40), text.slice(-30));
native-link-info: build an object (equivalent to --emit=obj) and print its machine-readable external link recipe as JSON instead of printing the artifact path. The document names the exact installed precompiled runtime pack and all link inputs, but does not invoke a linker. diagnostics: for build and coverage, print the versioned JSON diagnostics document described in Coverage Reports instead of the human output.

m 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

QLz2q60 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 z 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�MMESdjH6rYx6I#=U>i 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°i+DXAq1J-9 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 z zk*D*SUAM?U*?6$Sy7wuQ4Mrroy+`jPy-@F!+}7U(CIb2QEv_fE}Nf1ij`v=;tE zsy(X2SjU0vU{&6Q{G+^J0SdqfEjFb=d*Zw1m7?Aba6c}?lcDKW$aGPxev{$x7*D05 zf@32~HnFi_JMm5dlTOXlVFa!lVNT6;&c0UrnasWA;OJt9L?kl!Ju1IgKCyJc_f&M` zcHWqzJpj6>|HP!b?wLMv(<|RdyU`a{HCOPXk5qeqj|Qr7gIp z^U{C+Eq#93oP3`v)*x@J5P2Rb!2j<8NmsCWGp6#Nj?MpXRmY$8zMcC)zSY`TAvG9* zdydDunr!CHqt>`4wfR>GM5RgnyfJ_riLo@+Nv82yj^~fwIko&u{;_{00jZ9nh-7-< ztPvZ7qD*o$4;f^TK?WJh0H}-k9tN;vhloh|O7G>e*bv1R_!+OL-Nrxf{#;CuQH1&Q*aFO5_^4s|8YX`k+IM?MN3di#6XKuF8@1+@becQ@OO?aBs=Ga81QpS zT~%Zs1MhQG2svG)sOz|}&U|=tOe5%(x0Nidv)c4FLrOxnDaB?mn|kUqIkz)~3%j4+ zewnMAfAeSgL{Ck?MNc&dD@4*_`N|4_{;unont1Uy{UNXqDC9=WlAe-g;W(XzAejpF zdS5!Su3;z`QP_=HPVY7;(_s{=g*|M{fH3@l zO2t!-rmvrVA&LW+JPKJ~*(~~$e3M3u*7eFBVKi7X`sp{58d z^pW0nl?@y}gr3upGmyp}1f^~CO}`hft*M-E>;YT`gi9PrrJ{u+yx+QWGV zy3w*IYt7u&!X>K|Egd75ws`GYIWV)U2_E8Om(V4>qrx2HjH_h&fbgT&nQh&`_*vEz!G54{L$9nITCjXAry zN+FTecX=de;(mm&?cGl|`J?Xme7C6+LZo4ZLO3mUWvN{LJI3+ivDP2-xYkHu8TY<~ z!4kSIW~(j1qR-?|i@FL)AZ;A8XDr&W`2Y|X<_i;u)tt%c2$s|^<3_F=`PuA9(9&@b zRv<+9aRKI6NR}PjIi|*a+HLjMevNtwhSZ+3j!!Af1|RMk9{;?6BTg$%e=V~aikQ|XShrG9gPzzy<3 z#@-lB4I$dUQ&{Hyw!5b#4BGJb|B^?}6=ZgQk_8NkQuZnbrumX`TsH(4HSnm5%o<3f|m#q~J zv`4c(#>G1kE@Ofe{T-(pZXWm2Q9o|Dv;?W4NJ67w84U9Y0(Odzt63FMMSn-9XBSSj zCh@m06mf!XN^$ok7qca`i{6@;W9q^gvp7rRg(D;Xn(=`uu9yNuQSF*S5V*AJ3zSv% zcg+9nxV`>&{w&Q|0>fcqP$J9gt^5vdO`}w_D zMQB)fx-9~dhh|BVnN!sCY__f@Vt@W1Ic)(ZaM15oYiaeA(b?)aD|Rz+z=!q*q#3h(NieeMVFzz$s^vsQD=_ zghFasxE*`|&-^pf2~dW40oGSTA#LR=Dobi0ktIIrdr752?`T%#6mD-R+}8RXHB1**(=&tvdnk!PBO5A z_Xnf1SCKtsLV|u+-vM#YUHP zg%_F)A%TwYSVv9j?3II0qlbecX_CQ7Ekoc8MiB6D)aNCe6l4|S9HW2BTr$2sFooYB zyj1}{Q{3|Me|b@tPfva;1blxpk*Nv4N9Bi~j}qypQ4%-(YQ=cR(?=INdfUNFxhUlS z11GiGij6MMyE(K*Ilv5uMf+z{@cVb5s2s3ELTgv=1$lKB@ANq+F!%eA!e=FvJ^`)o zUqR_DPHN>72(lc01Ol