@scriptc/compiler 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +342 -16
  2. package/dist/backend/executable-features.js +1 -0
  3. package/dist/backend/executable-features.js.map +1 -1
  4. package/dist/backend/literals.d.ts +7 -0
  5. package/dist/backend/literals.js +32 -0
  6. package/dist/backend/literals.js.map +1 -1
  7. package/dist/backend/literals.test.js +17 -1
  8. package/dist/backend/literals.test.js.map +1 -1
  9. package/dist/backend/llvm/alloc.d.ts +15 -4
  10. package/dist/backend/llvm/alloc.js +39 -15
  11. package/dist/backend/llvm/alloc.js.map +1 -1
  12. package/dist/backend/llvm/alloc.test.js +15 -1
  13. package/dist/backend/llvm/alloc.test.js.map +1 -1
  14. package/dist/backend/llvm/appended-array-literals.d.ts +2 -0
  15. package/dist/backend/llvm/appended-array-literals.js +109 -0
  16. package/dist/backend/llvm/appended-array-literals.js.map +1 -0
  17. package/dist/backend/llvm/appended-array-literals.test.d.ts +1 -0
  18. package/dist/backend/llvm/appended-array-literals.test.js +90 -0
  19. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -0
  20. package/dist/backend/llvm/call-lifetimes.d.ts +4 -1
  21. package/dist/backend/llvm/call-lifetimes.js +51 -3
  22. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  23. package/dist/backend/llvm/classes.js +10 -2
  24. package/dist/backend/llvm/classes.js.map +1 -1
  25. package/dist/backend/llvm/classes.test.js +2 -2
  26. package/dist/backend/llvm/dense-array-access.js +17 -12
  27. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  28. package/dist/backend/llvm/dense-array-access.test.js +15 -2
  29. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  30. package/dist/backend/llvm/dyn.d.ts +2 -0
  31. package/dist/backend/llvm/dyn.js +11 -2
  32. package/dist/backend/llvm/dyn.js.map +1 -1
  33. package/dist/backend/llvm/emitter.d.ts +43 -2
  34. package/dist/backend/llvm/emitter.js +306 -32
  35. package/dist/backend/llvm/emitter.js.map +1 -1
  36. package/dist/backend/llvm/expr-async.js +122 -6
  37. package/dist/backend/llvm/expr-async.js.map +1 -1
  38. package/dist/backend/llvm/expr-callbacks.d.ts +8 -0
  39. package/dist/backend/llvm/expr-callbacks.js +81 -1
  40. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  41. package/dist/backend/llvm/expr-calls.d.ts +12 -1
  42. package/dist/backend/llvm/expr-calls.js +126 -54
  43. package/dist/backend/llvm/expr-calls.js.map +1 -1
  44. package/dist/backend/llvm/expr-containers.d.ts +7 -0
  45. package/dist/backend/llvm/expr-containers.js +38 -7
  46. package/dist/backend/llvm/expr-containers.js.map +1 -1
  47. package/dist/backend/llvm/expr-context.d.ts +2 -0
  48. package/dist/backend/llvm/expr-control.d.ts +8 -0
  49. package/dist/backend/llvm/expr-control.js +103 -69
  50. package/dist/backend/llvm/expr-control.js.map +1 -1
  51. package/dist/backend/llvm/expr-dynamic.js +2 -2
  52. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  53. package/dist/backend/llvm/expr-primitives.d.ts +7 -0
  54. package/dist/backend/llvm/expr-primitives.js +30 -26
  55. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  56. package/dist/backend/llvm/expr-records.js +11 -1
  57. package/dist/backend/llvm/expr-records.js.map +1 -1
  58. package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
  59. package/dist/backend/llvm/expr-stream-bridges.js +77 -8
  60. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  61. package/dist/backend/llvm/expr-stream-bridges.test.js +49 -1
  62. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  63. package/dist/backend/llvm/int32-abi.d.ts +18 -2
  64. package/dist/backend/llvm/int32-abi.js +23 -2
  65. package/dist/backend/llvm/int32-abi.js.map +1 -1
  66. package/dist/backend/llvm/int32-abi.test.js +75 -1
  67. package/dist/backend/llvm/int32-abi.test.js.map +1 -1
  68. package/dist/backend/llvm/lib-dispatch.js +7 -0
  69. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  70. package/dist/backend/llvm/lib-filesystem.js +58 -0
  71. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  72. package/dist/backend/llvm/lib-shared.js +76 -9
  73. package/dist/backend/llvm/lib-shared.js.map +1 -1
  74. package/dist/backend/llvm/local-array-reads.js +5 -3
  75. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  76. package/dist/backend/llvm/local-union-storage.d.ts +24 -2
  77. package/dist/backend/llvm/local-union-storage.js +127 -12
  78. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  79. package/dist/backend/llvm/local-union-storage.test.js +106 -1
  80. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  81. package/dist/backend/llvm/record-results.d.ts +26 -0
  82. package/dist/backend/llvm/record-results.js +252 -0
  83. package/dist/backend/llvm/record-results.js.map +1 -0
  84. package/dist/backend/llvm/reference-effects.js +2 -0
  85. package/dist/backend/llvm/reference-effects.js.map +1 -1
  86. package/dist/backend/llvm/reference-writes.js +15 -9
  87. package/dist/backend/llvm/reference-writes.js.map +1 -1
  88. package/dist/backend/llvm/regions.d.ts +67 -0
  89. package/dist/backend/llvm/regions.js +309 -0
  90. package/dist/backend/llvm/regions.js.map +1 -0
  91. package/dist/backend/llvm/regions.test.d.ts +1 -0
  92. package/dist/backend/llvm/regions.test.js +173 -0
  93. package/dist/backend/llvm/regions.test.js.map +1 -0
  94. package/dist/backend/llvm/shapes.d.ts +34 -7
  95. package/dist/backend/llvm/shapes.js +31 -16
  96. package/dist/backend/llvm/shapes.js.map +1 -1
  97. package/dist/backend/llvm/shapes.test.js +7 -6
  98. package/dist/backend/llvm/shapes.test.js.map +1 -1
  99. package/dist/backend/llvm/split-loops.js +1 -1
  100. package/dist/backend/llvm/split-loops.js.map +1 -1
  101. package/dist/backend/llvm/stack-objects.d.ts +29 -0
  102. package/dist/backend/llvm/stack-objects.js +130 -0
  103. package/dist/backend/llvm/stack-objects.js.map +1 -0
  104. package/dist/backend/llvm/stack-objects.test.d.ts +1 -0
  105. package/dist/backend/llvm/stack-objects.test.js +252 -0
  106. package/dist/backend/llvm/stack-objects.test.js.map +1 -0
  107. package/dist/backend/llvm/string-reads.d.ts +4 -1
  108. package/dist/backend/llvm/string-reads.js +89 -9
  109. package/dist/backend/llvm/string-reads.js.map +1 -1
  110. package/dist/backend/llvm/switch-dispatch.js +5 -4
  111. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  112. package/dist/backend/llvm/walkers.d.ts +2 -0
  113. package/dist/backend/llvm/walkers.js +4 -2
  114. package/dist/backend/llvm/walkers.js.map +1 -1
  115. package/dist/backend/may-throw.js +1 -0
  116. package/dist/backend/may-throw.js.map +1 -1
  117. package/dist/backend/native/contracts.d.ts +5 -0
  118. package/dist/backend/native/executable.js +16 -1
  119. package/dist/backend/native/executable.js.map +1 -1
  120. package/dist/backend/native/library.js +1 -1
  121. package/dist/backend/native/library.js.map +1 -1
  122. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  123. package/dist/backend/native/runtime-inputs.js +2 -0
  124. package/dist/backend/native/runtime-inputs.js.map +1 -1
  125. package/dist/backend/native-link-info-core.d.ts +1 -0
  126. package/dist/backend/native-link-info-core.js.map +1 -1
  127. package/dist/backend/runtime-abi.d.ts +2 -2
  128. package/dist/backend/runtime-abi.js +2 -2
  129. package/dist/backend/runtime-pack-core.d.ts +1 -0
  130. package/dist/backend/runtime-pack-core.js +1 -0
  131. package/dist/backend/runtime-pack-core.js.map +1 -1
  132. package/dist/backend/runtime-pack-targets.test.js +1 -1
  133. package/dist/backend/runtime-pack.test.js +1 -1
  134. package/dist/backend/target-diagnostics.js +14 -0
  135. package/dist/backend/target-diagnostics.js.map +1 -1
  136. package/dist/backend/target-diagnostics.test.js +13 -0
  137. package/dist/backend/target-diagnostics.test.js.map +1 -1
  138. package/dist/executable/executable-cache.d.ts +1 -0
  139. package/dist/executable/executable-cache.js.map +1 -1
  140. package/dist/frontend/experimental-import.d.ts +12 -0
  141. package/dist/frontend/experimental-import.js +63 -0
  142. package/dist/frontend/experimental-import.js.map +1 -0
  143. package/dist/frontend/lowering/builtin-calls.d.ts +6 -1
  144. package/dist/frontend/lowering/builtin-calls.js +36 -0
  145. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  146. package/dist/frontend/lowering/builtins/console.d.ts +16 -6
  147. package/dist/frontend/lowering/builtins/console.js +33 -9
  148. package/dist/frontend/lowering/builtins/console.js.map +1 -1
  149. package/dist/frontend/lowering/builtins/errors.js +20 -0
  150. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  151. package/dist/frontend/lowering/builtins/json.d.ts +2 -2
  152. package/dist/frontend/lowering/builtins/json.js +13 -4
  153. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  154. package/dist/frontend/lowering/builtins/module-calls.js +16 -1
  155. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  156. package/dist/frontend/lowering/builtins/numbers.d.ts +1 -0
  157. package/dist/frontend/lowering/builtins/numbers.js +17 -0
  158. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  159. package/dist/frontend/lowering/builtins/operating-system.d.ts +18 -0
  160. package/dist/frontend/lowering/builtins/operating-system.js +361 -1
  161. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  162. package/dist/frontend/lowering/builtins/process.js +15 -3
  163. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  164. package/dist/frontend/lowering/builtins/promises.js +109 -2
  165. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  166. package/dist/frontend/lowering/builtins/text-codecs.d.ts +3 -4
  167. package/dist/frontend/lowering/builtins/text-codecs.js +3 -4
  168. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  169. package/dist/frontend/lowering/checked-promise-all.d.ts +10 -3
  170. package/dist/frontend/lowering/checked-promise-all.js +52 -6
  171. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  172. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +6 -3
  173. package/dist/frontend/lowering/class-dynamic-dispatch.js +54 -31
  174. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  175. package/dist/frontend/lowering/containers/array-callbacks.js +34 -4
  176. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  177. package/dist/frontend/lowering/containers/array-construction.js +8 -4
  178. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  179. package/dist/frontend/lowering/containers/array-pipelines.js +1 -1
  180. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  181. package/dist/frontend/lowering/containers/string-and-regexp.js +91 -0
  182. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  183. package/dist/frontend/lowering/cycle-initialization.d.ts +18 -2
  184. package/dist/frontend/lowering/cycle-initialization.js +166 -12
  185. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  186. package/dist/frontend/lowering/deferred-module-initializers.js +7 -2
  187. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  188. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  189. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  190. package/dist/frontend/lowering/expressions/object-literals.js +5 -56
  191. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  192. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  193. package/dist/frontend/lowering/generator-delegation.js +231 -10
  194. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  195. package/dist/frontend/lowering/lifetime-regions.d.ts +11 -0
  196. package/dist/frontend/lowering/lifetime-regions.js +216 -0
  197. package/dist/frontend/lowering/lifetime-regions.js.map +1 -0
  198. package/dist/frontend/lowering/lower-array-sort.d.ts +28 -2
  199. package/dist/frontend/lowering/lower-array-sort.js +100 -3
  200. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  201. package/dist/frontend/lowering/lower-array-sort.test.js +99 -2
  202. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  203. package/dist/frontend/lowering/lower-calls.js +72 -102
  204. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  205. package/dist/frontend/lowering/lower-classes.d.ts +4 -3
  206. package/dist/frontend/lowering/lower-classes.js +116 -2
  207. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  208. package/dist/frontend/lowering/lower-console.d.ts +13 -0
  209. package/dist/frontend/lowering/lower-console.js +460 -4
  210. package/dist/frontend/lowering/lower-console.js.map +1 -1
  211. package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -0
  212. package/dist/frontend/lowering/lower-event-emitter.js +124 -38
  213. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  214. package/dist/frontend/lowering/lower-exprs.js +137 -22
  215. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  216. package/dist/frontend/lowering/lower-generators.d.ts +15 -7
  217. package/dist/frontend/lowering/lower-generators.js +183 -99
  218. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  219. package/dist/frontend/lowering/lower-inspect.d.ts +8 -1
  220. package/dist/frontend/lowering/lower-inspect.js +119 -18
  221. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  222. package/dist/frontend/lowering/lower-modules.js +20 -14
  223. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  224. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
  225. package/dist/frontend/lowering/lower-stdlib.js +35 -1
  226. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  227. package/dist/frontend/lowering/lower-stmts.js +66 -11
  228. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  229. package/dist/frontend/lowering/lowerer.d.ts +22 -1
  230. package/dist/frontend/lowering/lowerer.js +116 -8
  231. package/dist/frontend/lowering/lowerer.js.map +1 -1
  232. package/dist/frontend/lowering/regex-span-reads.d.ts +12 -0
  233. package/dist/frontend/lowering/regex-span-reads.js +164 -0
  234. package/dist/frontend/lowering/regex-span-reads.js.map +1 -0
  235. package/dist/frontend/lowering/surfaces.js +112 -10
  236. package/dist/frontend/lowering/surfaces.js.map +1 -1
  237. package/dist/frontend/lowering/var-hoisting.d.ts +3 -0
  238. package/dist/frontend/lowering/var-hoisting.js +261 -0
  239. package/dist/frontend/lowering/var-hoisting.js.map +1 -0
  240. package/dist/frontend/pipeline.js +5 -3
  241. package/dist/frontend/pipeline.js.map +1 -1
  242. package/dist/frontend/program.d.ts +3 -2
  243. package/dist/frontend/program.js +23 -5
  244. package/dist/frontend/program.js.map +1 -1
  245. package/dist/frontend/program.test.js +13 -0
  246. package/dist/frontend/program.test.js.map +1 -1
  247. package/dist/frontend/type-mapper.d.ts +13 -1
  248. package/dist/frontend/type-mapper.js +146 -13
  249. package/dist/frontend/type-mapper.js.map +1 -1
  250. package/dist/index.js +1 -0
  251. package/dist/index.js.map +1 -1
  252. package/dist/ir/builtin-effects.js +29 -2
  253. package/dist/ir/builtin-effects.js.map +1 -1
  254. package/dist/ir/builtin-signatures.d.ts +1 -1
  255. package/dist/ir/builtin-signatures.js +145 -15
  256. package/dist/ir/builtin-signatures.js.map +1 -1
  257. package/dist/ir/function-references.test.js +1 -0
  258. package/dist/ir/function-references.test.js.map +1 -1
  259. package/dist/ir/int32-slots.js +1 -0
  260. package/dist/ir/int32-slots.js.map +1 -1
  261. package/dist/ir/intrinsic-signatures.js +2 -0
  262. package/dist/ir/intrinsic-signatures.js.map +1 -1
  263. package/dist/ir/ir.d.ts +65 -20
  264. package/dist/ir/ir.js +5 -0
  265. package/dist/ir/ir.js.map +1 -1
  266. package/dist/ir/runtime-features.d.ts +1 -0
  267. package/dist/ir/runtime-features.js +35 -1
  268. package/dist/ir/runtime-features.js.map +1 -1
  269. package/dist/ir/scalar-records.js +1 -2
  270. package/dist/ir/scalar-records.js.map +1 -1
  271. package/dist/ir/validate.js +150 -25
  272. package/dist/ir/validate.js.map +1 -1
  273. package/dist/ir/validate.test.js +65 -0
  274. package/dist/ir/validate.test.js.map +1 -1
  275. package/dist/library/ir-policy.js +1 -0
  276. package/dist/library/ir-policy.js.map +1 -1
  277. package/dist/native/sanitizer.test.js +1 -0
  278. package/dist/native/sanitizer.test.js.map +1 -1
  279. package/package.json +20 -20
  280. package/surface-manifest.json +159 -1
@@ -0,0 +1,12 @@
1
+ import { type IrFunction } from "../../ir/ir.js";
2
+ import type { Lowerer } from "./lowerer.js";
3
+ /** Captures that need no string. An execGroups or matchGroups result
4
+ * (execResultCaptureMask's const binding) whose capture k is read only by
5
+ * strict comparisons with a string literal, Number() and parseInt() lets
6
+ * the runtime keep capture k as a span of the subject: those reads become
7
+ * regex.groupEquals/groupNumber/groupParseInt and the match becomes
8
+ * execSpans (or matchGroups) with the lazy mask. The pass reads the
9
+ * lowered IR, so it sees every read: any other read of capture k keeps k a
10
+ * string, and any use of the binding it cannot attribute to a capture
11
+ * leaves the whole result unchanged. */
12
+ export declare function foldRegexSpanReads(lowerer: Lowerer, fn: IrFunction): void;
@@ -0,0 +1,164 @@
1
+ import { numLit } from "../../ir/build.js";
2
+ import { BOOL, F64, STRING, typeKey, } from "../../ir/ir.js";
3
+ import { everyExprChild, everyStmtChild, transformStmtList } from "../../ir/traverse.js";
4
+ /** Captures that need no string. An execGroups or matchGroups result
5
+ * (execResultCaptureMask's const binding) whose capture k is read only by
6
+ * strict comparisons with a string literal, Number() and parseInt() lets
7
+ * the runtime keep capture k as a span of the subject: those reads become
8
+ * regex.groupEquals/groupNumber/groupParseInt and the match becomes
9
+ * execSpans (or matchGroups) with the lazy mask. The pass reads the
10
+ * lowered IR, so it sees every read: any other read of capture k keeps k a
11
+ * string, and any use of the binding it cannot attribute to a capture
12
+ * leaves the whole result unchanged. */
13
+ export function foldRegexSpanReads(lowerer, fn) {
14
+ const candidates = new Map();
15
+ const assigned = new Set();
16
+ const findStmt = (stmt) => {
17
+ // A non-literal receiver is saved first: the call is a sequence result.
18
+ const init = stmt.kind !== "varDecl" ? null : stmt.init?.kind === "seqExpr" ? stmt.init.result : stmt.init;
19
+ if (stmt.kind === "varDecl" &&
20
+ init?.kind === "regexIntrinsic" &&
21
+ (init.method === "execGroups" || init.method === "matchGroups")) {
22
+ candidates.set(stmt.localId, {
23
+ match: init,
24
+ folds: new Map(),
25
+ strings: new Set(),
26
+ rejected: candidates.has(stmt.localId),
27
+ });
28
+ }
29
+ if (stmt.kind === "assign")
30
+ assigned.add(stmt.localId);
31
+ return everyStmtChild(stmt, findExpr, findStmt);
32
+ };
33
+ const findExpr = (expr) => everyExprChild(expr, findExpr, findStmt);
34
+ fn.body.every(findStmt);
35
+ if (candidates.size === 0)
36
+ return;
37
+ for (const id of assigned)
38
+ candidates.delete(id);
39
+ const stringIndexHelper = lowerer.arrHofHelpers.get(`idxOr:${typeKey(STRING)}`);
40
+ /** `m[k]` as lowered: the optional element read of the narrowed result
41
+ * (or, for `m[k]!`, the dense read). */
42
+ const captureRead = (expr) => {
43
+ let result;
44
+ let index;
45
+ if (expr.kind === "call" && expr.callee === stringIndexHelper && expr.args.length === 2)
46
+ [result, index] = expr.args;
47
+ else if (expr.kind === "arrayGet")
48
+ ({ arr: result, index } = expr);
49
+ else
50
+ return null;
51
+ if (result?.kind !== "unionNarrow" ||
52
+ result.value.kind !== "varRef" ||
53
+ index?.kind !== "numLit" ||
54
+ !Number.isInteger(index.value) ||
55
+ index.value < 0 ||
56
+ index.value >= 53)
57
+ return null;
58
+ return { local: result.value.localId, use: { index: index.value, result } };
59
+ };
60
+ /** The capture read a foldable consumer takes, and its other operands. */
61
+ const foldable = (expr) => {
62
+ if (expr.kind === "unionEq" && !expr.sameValue) {
63
+ if (isLiteral(expr.right))
64
+ return { read: expr.left, rest: [] };
65
+ if (isLiteral(expr.left))
66
+ return { read: expr.right, rest: [] };
67
+ return null;
68
+ }
69
+ if (expr.kind === "libCall" &&
70
+ expr.fn === "dyn.numberConstructor" &&
71
+ expr.args[0]?.kind === "dynFrom")
72
+ return { read: expr.args[0].value, rest: [] };
73
+ if (expr.kind === "call" &&
74
+ expr.args.length === 2 &&
75
+ expr.args[0].type.kind === "union" &&
76
+ expr.callee === lowerer.valueHelpers.get(`parseInt.optional:${expr.args[0].type.unionId}`))
77
+ return { read: expr.args[0], rest: [expr.args[1]] };
78
+ return null;
79
+ };
80
+ const visitExpr = (expr, parent) => {
81
+ const fold = foldable(expr);
82
+ const folded = fold && fold.read.kind === "call" ? captureRead(fold.read) : null;
83
+ const candidate = folded && candidates.get(folded.local);
84
+ if (fold && folded && candidate) {
85
+ candidate.folds.set(expr, folded.use);
86
+ for (const operand of fold.rest)
87
+ visitExpr(operand, expr);
88
+ return true;
89
+ }
90
+ const read = captureRead(expr);
91
+ const reader = read && candidates.get(read.local);
92
+ if (read && reader) {
93
+ reader.strings.add(read.use.index);
94
+ return true;
95
+ }
96
+ if (expr.kind === "varRef") {
97
+ const use = candidates.get(expr.localId);
98
+ // Null tests are the only other use the binding may have.
99
+ if (use && parent?.kind !== "unionIsTag")
100
+ use.rejected = true;
101
+ return true;
102
+ }
103
+ return everyExprChild(expr, (child) => visitExpr(child, expr), (stmt) => visitStmt(stmt));
104
+ };
105
+ const visitStmt = (stmt) => everyStmtChild(stmt, (child) => visitExpr(child, null), visitStmt);
106
+ fn.body.every(visitStmt);
107
+ const rewrites = new Map();
108
+ for (const candidate of candidates.values()) {
109
+ if (candidate.rejected)
110
+ continue;
111
+ let lazy = 0;
112
+ const lazyIndices = new Set();
113
+ for (const use of candidate.folds.values()) {
114
+ if (!candidate.strings.has(use.index) && !lazyIndices.has(use.index)) {
115
+ lazyIndices.add(use.index);
116
+ lazy += 2 ** use.index;
117
+ }
118
+ }
119
+ if (lazy === 0)
120
+ continue;
121
+ for (const [consumer, use] of candidate.folds) {
122
+ if (lazyIndices.has(use.index))
123
+ rewrites.set(consumer, spanRead(consumer, use));
124
+ }
125
+ const { match } = candidate;
126
+ const mask = match.args[1];
127
+ rewrites.set(match, {
128
+ ...match,
129
+ method: match.method === "matchGroups" ? "matchGroups" : "execSpans",
130
+ args: [match.args[0], mask, numLit(lazy, match.loc)],
131
+ });
132
+ }
133
+ if (rewrites.size === 0)
134
+ return;
135
+ fn.body = transformStmtList(fn.body, {
136
+ stmt: (stmt) => stmt,
137
+ expr: (expr) => rewrites.get(expr) ?? expr,
138
+ });
139
+ }
140
+ function isLiteral(expr) {
141
+ return expr.kind === "unionWrap" && expr.value.kind === "strLit";
142
+ }
143
+ /** The span form of a foldable consumer of `use`. */
144
+ function spanRead(consumer, use) {
145
+ const loc = consumer.loc;
146
+ const capture = [use.result, numLit(use.index, loc)];
147
+ if (consumer.kind === "unionEq") {
148
+ const literal = isLiteral(consumer.right) ? consumer.right : consumer.left;
149
+ const value = literal.value;
150
+ const test = {
151
+ kind: "libCall",
152
+ fn: "regex.groupEquals",
153
+ args: [...capture, value],
154
+ type: BOOL,
155
+ loc,
156
+ };
157
+ return consumer.negated ? { kind: "unary", op: "!", operand: test, type: BOOL, loc } : test;
158
+ }
159
+ if (consumer.kind === "libCall")
160
+ return { kind: "libCall", fn: "regex.groupNumber", args: capture, type: F64, loc };
161
+ const radix = consumer.args[1];
162
+ return { kind: "libCall", fn: "regex.groupParseInt", args: [...capture, radix], type: F64, loc };
163
+ }
164
+ //# sourceMappingURL=regex-span-reads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex-span-reads.js","sourceRoot":"","sources":["../../../src/frontend/lowering/regex-span-reads.ts"],"names":[],"mappings":"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"}
@@ -492,7 +492,7 @@ export const STR_METHODS = {
492
492
  // regexIntrinsic). The optional limit is completed to 2^32-1 by the
493
493
  // lowering so the IR/runtime always see the spec's effective value.
494
494
  // Empty separator splits per UTF-16 code unit —
495
- // astral halves become U+FFFD (SEMANTICS.md divergence 2, the same
495
+ // astral halves become lone surrogates.
496
496
  split: { method: "split", result: arrayOf(STRING), minArgs: 0, maxArgs: 2 },
497
497
  // Padding completes omitted lengths and fill strings in its lowering.
498
498
  padStart: { method: "padStart", result: STRING, minArgs: 0, maxArgs: 2 },
@@ -501,10 +501,8 @@ export const STR_METHODS = {
501
501
  toLowerCase: { method: "toLowerCase", result: STRING, minArgs: 0, maxArgs: 0 },
502
502
  toUpperCase: { method: "toUpperCase", result: STRING, minArgs: 0, maxArgs: 0 },
503
503
  normalize: { method: "normalize", result: STRING, minArgs: 0, maxArgs: 1 },
504
- // The ES2024 well-formedness pair — no-ops over the runtime's
505
- // well-formed storage (constant true / the identity, per spec on
506
- // well-formed input; where Node would answer false the program already
507
- // diverged at the string's creation, SEMANTICS.md 2).
504
+ // The ES2024 well-formedness pair: whether the string holds a lone
505
+ // surrogate, and the copy with each one replaced by U+FFFD.
508
506
  isWellFormed: { method: "isWellFormed", result: BOOL, minArgs: 0, maxArgs: 0 },
509
507
  toWellFormed: { method: "toWellFormed", result: STRING, minArgs: 0, maxArgs: 0 },
510
508
  };
@@ -789,6 +787,17 @@ const PATH_MODULE_FNS = {
789
787
  result: STRING,
790
788
  valueParams: [{ mode: "required", type: STRING }],
791
789
  },
790
+ matchesGlob: {
791
+ fn: "path.matchesGlob",
792
+ params: [STRING, STRING],
793
+ result: BOOL,
794
+ valueParams: exactValueParams(STRING, STRING),
795
+ },
796
+ // Special-cased (lowerPathParseCall / lowerPathFormatCall): the
797
+ // ParsedPath record and the pathObject argument follow the call site's
798
+ // mapped shapes.
799
+ parse: { fn: "path.parse", params: [STRING], result: VOID },
800
+ format: { fn: "path.format", params: [], result: STRING },
792
801
  };
793
802
  /** The win32 twins (scr_path.c's Node-v24 path.win32 port, byte-for-byte):
794
803
  * "path/win32" everywhere, and the bare-module table when the build
@@ -857,6 +866,17 @@ const PATH_WIN32_MODULE_FNS = {
857
866
  result: STRING,
858
867
  valueParams: [{ mode: "required", type: STRING }],
859
868
  },
869
+ matchesGlob: {
870
+ fn: "path.win32MatchesGlob",
871
+ params: [STRING, STRING],
872
+ result: BOOL,
873
+ valueParams: exactValueParams(STRING, STRING),
874
+ },
875
+ // Special-cased (lowerPathParseCall / lowerPathFormatCall): the
876
+ // ParsedPath record and the pathObject argument follow the call site's
877
+ // mapped shapes.
878
+ parse: { fn: "path.win32Parse", params: [STRING], result: VOID },
879
+ format: { fn: "path.win32Format", params: [], result: STRING },
860
880
  };
861
881
  export const BUILTIN_MODULE_FNS = {
862
882
  fs: {
@@ -1136,6 +1156,28 @@ export const BUILTIN_MODULE_FNS = {
1136
1156
  result: F64,
1137
1157
  valueParams: [],
1138
1158
  },
1159
+ // os.arch() IS process.arch, like platform().
1160
+ arch: { fn: "process.arch", params: [], result: STRING, valueParams: [] },
1161
+ hostname: { fn: "os.hostname", params: [], result: STRING, valueParams: [] },
1162
+ // uv_os_uname's machine and version fields, read once at module load
1163
+ // in Node (they never change while a process runs).
1164
+ machine: { fn: "os.machine", params: [], result: STRING, valueParams: [] },
1165
+ version: { fn: "os.version", params: [], result: STRING, valueParams: [] },
1166
+ endianness: { fn: "os.endianness", params: [], result: STRING, valueParams: [] },
1167
+ freemem: { fn: "os.freemem", params: [], result: F64, valueParams: [] },
1168
+ uptime: { fn: "os.uptime", params: [], result: F64, valueParams: [] },
1169
+ loadavg: { fn: "os.loadavg", params: [], result: arrayOf(F64), valueParams: [] },
1170
+ // An omitted (or undefined) pid is 0, the current process
1171
+ // (lowerOsGetPriorityCall completes it).
1172
+ getPriority: {
1173
+ fn: "os.getPriority",
1174
+ params: [F64],
1175
+ result: F64,
1176
+ valueParams: [{ mode: "optional", type: F64, defaultValue: 0 }],
1177
+ },
1178
+ // Special-cased (lowerOsCpusCall): the call site's CpuInfo[] assembles
1179
+ // from one uv_cpu_info snapshot.
1180
+ cpus: { fn: "os.cpusTake", params: [], result: VOID },
1139
1181
  // Entirely special-cased (lowerOsNetworkInterfacesCall): the result is
1140
1182
  // the call site's mapped Dict<NetworkInterfaceInfo[]> shape, verified
1141
1183
  // structurally there — this entry only routes the dispatch.
@@ -1305,6 +1347,53 @@ export const BUILTIN_MODULE_FNS = {
1305
1347
  result: STRING,
1306
1348
  valueParams: exactValueParams(DYN),
1307
1349
  },
1350
+ // The function helpers take checked-dynamic arguments and answer native
1351
+ // dyn functions, which a static function slot checks when it receives
1352
+ // one (lowerUtilCallableCall in the util spoke).
1353
+ inherits: {
1354
+ fn: "util.inherits",
1355
+ params: [DYN, DYN],
1356
+ result: VOID,
1357
+ valueParams: [
1358
+ { mode: "required", type: DYN },
1359
+ { mode: "required", type: DYN },
1360
+ ],
1361
+ },
1362
+ deprecate: {
1363
+ fn: "util.deprecate",
1364
+ params: [DYN, DYN, DYN, DYN],
1365
+ result: DYN,
1366
+ valueParams: [
1367
+ { mode: "required", type: DYN },
1368
+ { mode: "required", type: DYN },
1369
+ { mode: "optional", type: DYN, defaultValue: undefined },
1370
+ { mode: "optional", type: DYN, defaultValue: undefined },
1371
+ ],
1372
+ },
1373
+ callbackify: {
1374
+ fn: "util.callbackify",
1375
+ params: [DYN],
1376
+ result: DYN,
1377
+ valueParams: [{ mode: "required", type: DYN }],
1378
+ },
1379
+ debuglog: {
1380
+ fn: "util.debuglog",
1381
+ params: [DYN, DYN],
1382
+ result: DYN,
1383
+ valueParams: [
1384
+ { mode: "required", type: DYN },
1385
+ { mode: "optional", type: DYN, defaultValue: undefined },
1386
+ ],
1387
+ },
1388
+ debug: {
1389
+ fn: "util.debuglog",
1390
+ params: [DYN, DYN],
1391
+ result: DYN,
1392
+ valueParams: [
1393
+ { mode: "required", type: DYN },
1394
+ { mode: "optional", type: DYN, defaultValue: undefined },
1395
+ ],
1396
+ },
1308
1397
  },
1309
1398
  // The util/types spoke supplies the probe name to the shared brand check.
1310
1399
  "util/types": {
@@ -1475,7 +1564,7 @@ export const BUILTIN_MODULE_CONSTS = {
1475
1564
  path: { sep: "/", delimiter: ":" },
1476
1565
  "path/posix": { sep: "/", delimiter: ":" },
1477
1566
  "path/win32": { sep: "\\", delimiter: ";" },
1478
- os: { EOL: "\n" },
1567
+ os: { EOL: "\n", devNull: "/dev/null" },
1479
1568
  worker_threads: { isMainThread: true, threadId: 0 },
1480
1569
  cluster: { isPrimary: true, isMaster: true, isWorker: false },
1481
1570
  };
@@ -1550,6 +1639,8 @@ export const BUILTIN_MODULE_FN_ALIASES = {
1550
1639
  os: {
1551
1640
  // lowerOsUserInfoCall assembles the record from scalar libCalls.
1552
1641
  userInfo: ["os.userHomedir", "os.userShell"],
1642
+ // lowerOsCpusCall reads the cpusTake snapshot through its accessors.
1643
+ cpus: ["os.cpusModel", "os.cpusField"],
1553
1644
  },
1554
1645
  };
1555
1646
  export const AMBIENT_SURFACE_FNS = [
@@ -1944,13 +2035,22 @@ export const AMBIENT_SURFACE_FNS = [
1944
2035
  fns: ["tlsca.set"],
1945
2036
  note: "replaces the default set and the client trust anchors for the rest of the process",
1946
2037
  },
2038
+ // os.constants is a VALUE read (lowerNamespaceBuiltinProperty and the
2039
+ // named-import path): the platform's null-prototype constants object.
2040
+ {
2041
+ id: "node-builtin.os.constants",
2042
+ kind: "node-builtin",
2043
+ name: "os.constants",
2044
+ fns: ["os.constants"],
2045
+ note: "the platform's dlopen, errno, signals and priority groups; members a platform lacks read as undefined",
2046
+ },
1947
2047
  ];
1948
2048
  /** The win32-target overrides of the bare modules' constants: path's
1949
2049
  * constants ARE the path/win32 namespace's, and os.EOL is CRLF (Node's
1950
2050
  * `isWindows ? '\r\n' : '\n'`). */
1951
2051
  const WIN32_TARGET_CONSTS = {
1952
2052
  path: BUILTIN_MODULE_CONSTS["path/win32"],
1953
- os: { EOL: "\r\n" },
2053
+ os: { EOL: "\r\n", devNull: "\\\\.\\nul" },
1954
2054
  };
1955
2055
  /** BUILTIN_MODULE_FNS with the platform-conditional modules bound per
1956
2056
  * TARGET: a win32 triple compiles Node-on-Windows semantics — `path` is
@@ -2346,9 +2446,11 @@ export function stdlibMemberFence(lowerer, access) {
2346
2446
  }
2347
2447
  else if (container === "console") {
2348
2448
  hint =
2349
- "console.log/info/debug (stdout) and console.error/warn (stderr) are the supported " +
2350
- "console surface (arguments render with Node's console semantics: strings verbatim, " +
2351
- "everything else through the static util.inspect)";
2449
+ "console.log/info/debug (stdout), console.error/warn (stderr), assert, count, " +
2450
+ "countReset, dir, dirxml, group, groupCollapsed, groupEnd, table, time, timeEnd, " +
2451
+ "timeLog, clear, profile, profileEnd, and timeStamp are the supported console surface " +
2452
+ "(arguments render with Node's console semantics: strings verbatim, everything else " +
2453
+ "through the static util.inspect)";
2352
2454
  }
2353
2455
  else if (container === "TextEncoder") {
2354
2456
  hint =