From d9df51594ce43f80bb22f5f2d124793ccd59e699 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Tue, 20 Oct 2026 18:06:49 -0500 Subject: [PATCH] Sort the runtime feature lists The lib-fn sets and prefix lists in runtime-features.ts grew by appending, so changes that added different entries to one list touched the same last lines and conflicted. Each list's entries are now sorted within its commented groups, and the all-off feature literal follows the rules table's name order. Entry order is unobservable: the lists feed membership maps and prefix tests that each set their own flag. --- packages/compiler/src/ir/runtime-features.ts | 198 ++++++++++--------- 1 file changed, 100 insertions(+), 98 deletions(-) diff --git a/packages/compiler/src/ir/runtime-features.ts b/packages/compiler/src/ir/runtime-features.ts index bb165af26..fbe85b671 100644 --- a/packages/compiler/src/ir/runtime-features.ts +++ b/packages/compiler/src/ir/runtime-features.ts @@ -32,95 +32,95 @@ export const DYN_BUFFER_NUM_METHODS: ReadonlySet = new Set( const DYN_ASYNC_LIB_FNS: ReadonlySet = new Set([ // DEP0040 rides the dyn-async unit's warning machinery. - "punycode.warn", - "fs.callbackValue", - "fs.callbackCall", - "fs.callbackGlob", "async.awaitDyn", - "timers.immediatePromise", "crypto.native", "dyn.promiseAll", "dyn.promiseAllSettled", "dyn.promiseAny", "dyn.promiseResolve", - "process.onUncaughtException", - "process.offUncaughtException", - "process.onUnhandledRejection", - "process.offUnhandledRejection", - "process.onRejectionHandled", - "process.offRejectionHandled", - "process.onWarning", - "process.offWarning", + "fs.callbackCall", + "fs.callbackGlob", + "fs.callbackValue", + "process.deprecationFlag", "process.emitWarning", "process.emitWarningText", - "process.deprecationFlag", + "process.offRejectionHandled", + "process.offUncaughtException", + "process.offUnhandledRejection", + "process.offWarning", + "process.onRejectionHandled", + "process.onUncaughtException", + "process.onUnhandledRejection", + "process.onWarning", "process.setDeprecationFlag", "process.setEmitWarning", + "punycode.warn", + "timers.immediatePromise", // The performance timeline (scr_perf.c, linked with this unit for its // MaxPerformanceEntryBufferExceededWarning). - "perf.mark", - "perf.measure", - "perf.entries", "perf.clearMarks", "perf.clearMeasures", - "perf.entryName", - "perf.entryType", - "perf.entryStart", - "perf.entryDuration", + "perf.entries", "perf.entryDetail", + "perf.entryDuration", "perf.entryKeep", + "perf.entryName", "perf.entryRef", + "perf.entryStart", + "perf.entryType", + "perf.mark", + "perf.measure", // Blob and File (scr_blob.c, linked with this unit, which boxes their // reads as dyn promises). - "blob.new", + "als.disable", + "als.enterWith", + "als.exitRun", + "als.get", + "als.new", + "als.run", + "blob.arrayBuffer", + "blob.bytes", "blob.fileNew", + "blob.is", + "blob.new", "blob.slice", "blob.text", - "blob.bytes", - "blob.arrayBuffer", - "blob.is", - "util.styleText", - "util.inherits", - "util.deprecate", + "dc.chanBindStore", + "dc.chanRunStores", + "dc.chanUnbindStore", "util.callbackify", "util.debuglog", - "als.new", - "als.get", - "als.run", - "als.exitRun", - "als.enterWith", - "als.disable", - "dc.chanBindStore", - "dc.chanUnbindStore", - "dc.chanRunStores", + "util.deprecate", + "util.inherits", + "util.styleText", ]); /** The libCalls that enter AsyncLocalStorage stores (RuntimeFeatures * asyncContext). */ const ASYNC_CONTEXT_LIB_FNS: ReadonlySet = new Set([ - "als.run", - "als.exitRun", "als.enterWith", + "als.exitRun", + "als.run", "dc.chanBindStore", "dc.chanRunStores", // getTestContext() reads the test runner's entry in the same snapshot. - "test.hasContext", "test.context", + "test.hasContext", ]); const LEGACY_URL_LIB_FNS: ReadonlySet = new Set([ - "url.legacyParse", - "url.legacyFormat", - "url.legacyResolve", "url.domainToASCII", "url.domainToUnicode", + "url.legacyFormat", + "url.legacyParse", + "url.legacyResolve", ]); const UTIL_CALLABLE_LIB_FNS: ReadonlySet = new Set([ - "util.inherits", - "util.deprecate", "util.callbackify", "util.debuglog", + "util.deprecate", + "util.inherits", ]); /** Entry points that link the regex unit: the regex and glob matchers (fs.glob's walk compiles its patterns with the glob matcher), and readline's terminal unit (scr_readline_tty.c), which measures with the regex unit's stripVTControlCharacters. */ @@ -188,14 +188,14 @@ const STREAM_LIB_FNS: ReadonlySet = new Set([ "stream.addAbortSignalFn", "stream.destroy", "stream.destroyErr", - "stream.errored", - "stream.prop", "stream.dynNative", "stream.dynNativePipe", + "stream.errored", "stream.pipeDyn", - "stream.unpipeDyn", + "stream.prop", "stream.stdioWritable", "stream.unboxDyn", + "stream.unpipeDyn", "stream.workerStdio", ]); @@ -230,10 +230,6 @@ const READABLE_DYN_ASYNC_PREFIXES: readonly string[] = ["readable.fromGen", "rea /** Entry points that link the dyn-invoke unit. */ const DYN_INVOKE_LIB_FNS: ReadonlySet = new Set([ - "stream.dynNative", - "stream.dynNativePipe", - "stream.pipeDyn", - "stream.unpipeDyn", "dyn.arrayProtoCall", "dyn.arrayPrototype", "dyn.builtinFunction", @@ -245,6 +241,10 @@ const DYN_INVOKE_LIB_FNS: ReadonlySet = new Set([ "dyn.globalConstructor", "dyn.objCreateWithProperties", "dyn.objectTag", + "stream.dynNative", + "stream.dynNativePipe", + "stream.pipeDyn", + "stream.unpipeDyn", ]); /** Member names whose constant-key dynamic reads answer the inherited Object.prototype member through the dyn-invoke unit. Mirrors expr-dynamic.ts INHERITED_OBJECT_MEMBERS (the IR layer does not import the backend). */ @@ -279,8 +279,8 @@ const CHILD_PROCESS_LIB_PREFIXES: readonly string[] = ["child.", "cp.", "spawnRe const BUILTIN_CLASS_LIB_FNS: readonly IrLibFn[] = [ "dyn.builtinClass", // the stream classes, through scr_dyn_builtin_stream.c - "dyn.builtinStreamClass", "dyn.builtinInstanceOf", + "dyn.builtinStreamClass", "dyn.functionInstanceOf", ]; @@ -408,64 +408,64 @@ function boxesPromise(t: IrType, tables: TypeTables, seen: Set): boolean /** The libCall fns served by the OPTIONAL events unit (scr_events.c): * process signal/exit listeners and the piped-stdin surface. */ const PROCESS_EVENT_LIB_FNS: ReadonlySet = new Set([ - "process.stdio", - "process.onSignal", + "process.offExit", "process.offSignal", "process.onExit", - "process.offExit", + "process.onSignal", + "process.stdio", + "stdin.nextChunk", "stdin.onData", "stdin.onEnd", "stdin.onError", - "stdin.nextChunk", // node:readline rides the stdin unit (scr_readline.c links beside // scr_events.c under the same gate). + "rl.checkCompleter", + "rl.checkOptions", + "rl.close", "rl.create", "rl.createSignal", - "rl.question", - "rl.questionAsync", - "rl.questionAsyncSignal", - "rl.questionDyn", - "rl.questionAsyncDyn", - "rl.questionAsyncSignalDyn", - "rl.close", - "rl.pause", - "rl.resume", - "rl.prompt", - "rl.promptWith", - "rl.setPrompt", - "rl.setPromptDyn", - "rl.getPrompt", - "rl.write", - "rl.writeKey", - "rl.on", - "rl.iterOpen", - "rl.iterNext", - "rl.iterReturn", - "rl.checkOptions", - "rl.checkCompleter", - "rl.setOptions", - "rl.setHistory", - "rl.history", - "rl.numProp", - "rl.terminal", - "rl.line", - "rl.isTerminal", - "rl.isPromises", "rl.cursor", - "rl.seq", - "rl.moves", "rl.cursorPos", + "rl.getPrompt", + "rl.history", + "rl.isPromises", + "rl.isTerminal", + "rl.iterNext", + "rl.iterOpen", + "rl.iterReturn", "rl.keypressStdin", "rl.keypressStream", - "stdin.onKeypress", - "rl.uiOpen", - "rl.uiOpenStream", - "rl.uiCursorTo", - "rl.uiMoveCursor", + "rl.line", + "rl.moves", + "rl.numProp", + "rl.on", + "rl.pause", + "rl.prompt", + "rl.promptWith", + "rl.question", + "rl.questionAsync", + "rl.questionAsyncDyn", + "rl.questionAsyncSignal", + "rl.questionAsyncSignalDyn", + "rl.questionDyn", + "rl.resume", + "rl.seq", + "rl.setHistory", + "rl.setOptions", + "rl.setPrompt", + "rl.setPromptDyn", + "rl.terminal", "rl.uiClearLine", "rl.uiClearScreenDown", - "rl.uiRollback", "rl.uiCommit", + "rl.uiCursorTo", + "rl.uiMoveCursor", + "rl.uiOpen", + "rl.uiOpenStream", + "rl.uiRollback", + "rl.write", + "rl.writeKey", + "stdin.onKeypress", ]); /** The legacy http2.* libCalls implemented by scr_http.c/scr_tls.c (the @@ -506,7 +506,9 @@ const NET_PREFIXES: readonly string[] = ["net.", "http.", "tls.", "https.", "htt /** One rule per runtime feature, sorted by name. A new feature is an * entry here and its line in noRuntimeFeatures; RuntimeFeatures, the scan - * and its early exit derive from this table. */ + * and its early exit derive from this table. The lists above keep one + * entry per line, sorted within each commented group, so changes that add + * different entries touch different lines. */ const RUNTIME_FEATURE_RULES = { assert: rule({ prefixes: ["assert."] }), /** The program enters AsyncLocalStorage stores (store.run, enterWith, @@ -765,13 +767,13 @@ function noRuntimeFeatures(): RuntimeFeatures { fetch: false, fileHandle: false, fsWatch: false, - netLookup: false, - http: false, http2: false, + http: false, inspect: false, legacyTextDecoder: false, mockTimers: false, net: false, + netLookup: false, nodeTest: false, parseArgs: false, perfLoop: false,