@scriptc/compiler 0.3.4 → 0.3.6

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 (316) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +409 -42
  2. package/dist/backend/llvm/array-search.js +1 -1
  3. package/dist/backend/llvm/array-search.js.map +1 -1
  4. package/dist/backend/llvm/call-lifetimes.d.ts +6 -0
  5. package/dist/backend/llvm/call-lifetimes.js +19 -0
  6. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  7. package/dist/backend/llvm/constant-callbacks.d.ts +2 -21
  8. package/dist/backend/llvm/constant-callbacks.js +36 -219
  9. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  10. package/dist/backend/llvm/constant-callbacks.test.js +22 -0
  11. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  12. package/dist/backend/llvm/dense-array-access.d.ts +9 -0
  13. package/dist/backend/llvm/dense-array-access.js +27 -1
  14. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  15. package/dist/backend/llvm/dyn.d.ts +6 -0
  16. package/dist/backend/llvm/dyn.js +71 -7
  17. package/dist/backend/llvm/dyn.js.map +1 -1
  18. package/dist/backend/llvm/emitter.d.ts +120 -2
  19. package/dist/backend/llvm/emitter.js +820 -142
  20. package/dist/backend/llvm/emitter.js.map +1 -1
  21. package/dist/backend/llvm/expr-async.js +17 -7
  22. package/dist/backend/llvm/expr-async.js.map +1 -1
  23. package/dist/backend/llvm/expr-bytes.js +1 -1
  24. package/dist/backend/llvm/expr-callbacks.d.ts +11 -0
  25. package/dist/backend/llvm/expr-callbacks.js +53 -0
  26. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  27. package/dist/backend/llvm/expr-calls.js +88 -2
  28. package/dist/backend/llvm/expr-calls.js.map +1 -1
  29. package/dist/backend/llvm/expr-containers.js +50 -27
  30. package/dist/backend/llvm/expr-containers.js.map +1 -1
  31. package/dist/backend/llvm/expr-dispatch.js +1 -0
  32. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  33. package/dist/backend/llvm/expr-dynamic.js +25 -1
  34. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  35. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  36. package/dist/backend/llvm/expr-primitives.js +20 -1
  37. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  38. package/dist/backend/llvm/expr-stream-bridges.js +4 -0
  39. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  40. package/dist/backend/llvm/integer-clones.d.ts +103 -0
  41. package/dist/backend/llvm/integer-clones.js +1336 -0
  42. package/dist/backend/llvm/integer-clones.js.map +1 -0
  43. package/dist/backend/llvm/integer-clones.test.d.ts +1 -0
  44. package/dist/backend/llvm/integer-clones.test.js +219 -0
  45. package/dist/backend/llvm/integer-clones.test.js.map +1 -0
  46. package/dist/backend/llvm/lib-datagram.js +14 -0
  47. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  48. package/dist/backend/llvm/lib-dispatch.js +32 -1
  49. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  50. package/dist/backend/llvm/lib-filesystem.js +61 -1
  51. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  52. package/dist/backend/llvm/lib-network.js +21 -3
  53. package/dist/backend/llvm/lib-network.js.map +1 -1
  54. package/dist/backend/llvm/lib-process.js +34 -0
  55. package/dist/backend/llvm/lib-process.js.map +1 -1
  56. package/dist/backend/llvm/lib-shared.js +77 -2
  57. package/dist/backend/llvm/lib-shared.js.map +1 -1
  58. package/dist/backend/llvm/lib-test.js +16 -3
  59. package/dist/backend/llvm/lib-test.js.map +1 -1
  60. package/dist/backend/llvm/lib-tls.js +6 -0
  61. package/dist/backend/llvm/lib-tls.js.map +1 -1
  62. package/dist/backend/llvm/local-array-reads.js +1 -1
  63. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  64. package/dist/backend/llvm/map-entry-fusion.d.ts +28 -0
  65. package/dist/backend/llvm/map-entry-fusion.js +233 -0
  66. package/dist/backend/llvm/map-entry-fusion.js.map +1 -0
  67. package/dist/backend/llvm/map-entry-fusion.test.d.ts +1 -0
  68. package/dist/backend/llvm/map-entry-fusion.test.js +183 -0
  69. package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -0
  70. package/dist/backend/llvm/map-number-lookup.d.ts +2 -0
  71. package/dist/backend/llvm/map-number-lookup.js +1 -1
  72. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  73. package/dist/backend/llvm/map-number-lookup.test.js +10 -11
  74. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  75. package/dist/backend/llvm/map-read-lifetimes.d.ts +2 -0
  76. package/dist/backend/llvm/map-read-lifetimes.js +3 -0
  77. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  78. package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
  79. package/dist/backend/llvm/nullable-unions.d.ts +6 -3
  80. package/dist/backend/llvm/nullable-unions.js +2 -0
  81. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  82. package/dist/backend/llvm/publish.d.ts +16 -0
  83. package/dist/backend/llvm/publish.js +81 -10
  84. package/dist/backend/llvm/publish.js.map +1 -1
  85. package/dist/backend/llvm/publish.test.d.ts +1 -0
  86. package/dist/backend/llvm/publish.test.js +94 -0
  87. package/dist/backend/llvm/publish.test.js.map +1 -0
  88. package/dist/backend/llvm/record-results.d.ts +1 -1
  89. package/dist/backend/llvm/record-results.js +78 -4
  90. package/dist/backend/llvm/record-results.js.map +1 -1
  91. package/dist/backend/llvm/record-sources.d.ts +7 -0
  92. package/dist/backend/llvm/record-sources.js +14 -0
  93. package/dist/backend/llvm/record-sources.js.map +1 -0
  94. package/dist/backend/llvm/reference-writes.js +1 -0
  95. package/dist/backend/llvm/reference-writes.js.map +1 -1
  96. package/dist/backend/llvm/shapes.d.ts +12 -3
  97. package/dist/backend/llvm/shapes.js +23 -14
  98. package/dist/backend/llvm/shapes.js.map +1 -1
  99. package/dist/backend/llvm/shapes.test.js +5 -3
  100. package/dist/backend/llvm/shapes.test.js.map +1 -1
  101. package/dist/backend/llvm/speculative-integers.d.ts +74 -0
  102. package/dist/backend/llvm/speculative-integers.js +571 -0
  103. package/dist/backend/llvm/speculative-integers.js.map +1 -0
  104. package/dist/backend/llvm/speculative-integers.test.d.ts +1 -0
  105. package/dist/backend/llvm/speculative-integers.test.js +148 -0
  106. package/dist/backend/llvm/speculative-integers.test.js.map +1 -0
  107. package/dist/backend/llvm/string-lifetimes.test.js +75 -1
  108. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  109. package/dist/backend/llvm/walkers.d.ts +17 -0
  110. package/dist/backend/llvm/walkers.js +123 -0
  111. package/dist/backend/llvm/walkers.js.map +1 -1
  112. package/dist/backend/may-throw.js +2 -0
  113. package/dist/backend/may-throw.js.map +1 -1
  114. package/dist/backend/native/contracts.d.ts +2 -1
  115. package/dist/backend/native/executable.js +6 -1
  116. package/dist/backend/native/executable.js.map +1 -1
  117. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  118. package/dist/backend/native/runtime-inputs.js +1 -0
  119. package/dist/backend/native/runtime-inputs.js.map +1 -1
  120. package/dist/backend/runtime-abi.d.ts +2 -2
  121. package/dist/backend/runtime-abi.js +2 -2
  122. package/dist/backend/runtime-pack-targets.test.js +1 -1
  123. package/dist/backend/runtime-pack.d.ts +7 -3
  124. package/dist/backend/runtime-pack.js +12 -6
  125. package/dist/backend/runtime-pack.js.map +1 -1
  126. package/dist/backend/runtime-pack.test.js +16 -7
  127. package/dist/backend/runtime-pack.test.js.map +1 -1
  128. package/dist/contracts/check.js +1 -0
  129. package/dist/contracts/check.js.map +1 -1
  130. package/dist/coverage/surface-manifest.js +3 -3
  131. package/dist/coverage/surface-manifest.js.map +1 -1
  132. package/dist/diagnostics/diagnostic.d.ts +1 -1
  133. package/dist/diagnostics/diagnostic.js +6 -2
  134. package/dist/diagnostics/diagnostic.js.map +1 -1
  135. package/dist/frontend/lowering/builtin-calls.js +13 -0
  136. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  137. package/dist/frontend/lowering/builtins/callable-aliases.js +82 -8
  138. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  139. package/dist/frontend/lowering/builtins/child-process-async.d.ts +8 -6
  140. package/dist/frontend/lowering/builtins/child-process-async.js +45 -29
  141. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  142. package/dist/frontend/lowering/builtins/compression.d.ts +9 -0
  143. package/dist/frontend/lowering/builtins/compression.js +145 -30
  144. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  145. package/dist/frontend/lowering/builtins/crypto.js +12 -1
  146. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  147. package/dist/frontend/lowering/builtins/errors.js +5 -3
  148. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  149. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +6 -0
  150. package/dist/frontend/lowering/builtins/filesystem-calls.js +16 -0
  151. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  152. package/dist/frontend/lowering/builtins/filesystem.d.ts +8 -0
  153. package/dist/frontend/lowering/builtins/filesystem.js +199 -2
  154. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  155. package/dist/frontend/lowering/builtins/fs-streams.d.ts +26 -0
  156. package/dist/frontend/lowering/builtins/fs-streams.js +131 -0
  157. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -0
  158. package/dist/frontend/lowering/builtins/hash-stream.d.ts +12 -0
  159. package/dist/frontend/lowering/builtins/hash-stream.js +80 -0
  160. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -0
  161. package/dist/frontend/lowering/builtins/module-calls.js +17 -3
  162. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  163. package/dist/frontend/lowering/builtins/process.js +9 -2
  164. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  165. package/dist/frontend/lowering/builtins/readline.d.ts +45 -13
  166. package/dist/frontend/lowering/builtins/readline.js +812 -47
  167. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  168. package/dist/frontend/lowering/builtins/workers.d.ts +4 -0
  169. package/dist/frontend/lowering/builtins/workers.js +58 -0
  170. package/dist/frontend/lowering/builtins/workers.js.map +1 -1
  171. package/dist/frontend/lowering/class-dynamic-dispatch.js +150 -8
  172. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  173. package/dist/frontend/lowering/class-protocols.d.ts +55 -0
  174. package/dist/frontend/lowering/class-protocols.js +735 -0
  175. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  176. package/dist/frontend/lowering/containers/array-from-async.d.ts +18 -0
  177. package/dist/frontend/lowering/containers/array-from-async.js +282 -0
  178. package/dist/frontend/lowering/containers/array-from-async.js.map +1 -0
  179. package/dist/frontend/lowering/containers/bytes.js +33 -12
  180. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  181. package/dist/frontend/lowering/containers/collection-grouping.js +2 -1
  182. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  183. package/dist/frontend/lowering/containers/collection-methods.js +27 -23
  184. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  185. package/dist/frontend/lowering/devirtualize.js +20 -7
  186. package/dist/frontend/lowering/devirtualize.js.map +1 -1
  187. package/dist/frontend/lowering/divergences.js +188 -15
  188. package/dist/frontend/lowering/divergences.js.map +1 -1
  189. package/dist/frontend/lowering/lower-calls.js +129 -25
  190. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  191. package/dist/frontend/lowering/lower-classes.js +46 -1
  192. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  193. package/dist/frontend/lowering/lower-dgram.js +55 -15
  194. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  195. package/dist/frontend/lowering/lower-event-emitter.d.ts +9 -1
  196. package/dist/frontend/lowering/lower-event-emitter.js +88 -1
  197. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  198. package/dist/frontend/lowering/lower-exprs.d.ts +4 -0
  199. package/dist/frontend/lowering/lower-exprs.js +239 -71
  200. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  201. package/dist/frontend/lowering/lower-inspect.js +49 -3
  202. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  203. package/dist/frontend/lowering/lower-mock.d.ts +11 -1
  204. package/dist/frontend/lowering/lower-mock.js +377 -61
  205. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  206. package/dist/frontend/lowering/lower-modules.js +1 -0
  207. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  208. package/dist/frontend/lowering/lower-server.d.ts +2 -1
  209. package/dist/frontend/lowering/lower-server.js +234 -21
  210. package/dist/frontend/lowering/lower-server.js.map +1 -1
  211. package/dist/frontend/lowering/lower-stmts.js +60 -13
  212. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  213. package/dist/frontend/lowering/lower-stream.d.ts +1 -3
  214. package/dist/frontend/lowering/lower-stream.js +325 -20
  215. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  216. package/dist/frontend/lowering/lower-test.js +147 -48
  217. package/dist/frontend/lowering/lower-test.js.map +1 -1
  218. package/dist/frontend/lowering/lowerer.d.ts +13 -1
  219. package/dist/frontend/lowering/lowerer.js +10 -2
  220. package/dist/frontend/lowering/lowerer.js.map +1 -1
  221. package/dist/frontend/lowering/null-prototype.d.ts +13 -0
  222. package/dist/frontend/lowering/null-prototype.js +33 -0
  223. package/dist/frontend/lowering/null-prototype.js.map +1 -0
  224. package/dist/frontend/lowering/record-sources.d.ts +15 -0
  225. package/dist/frontend/lowering/record-sources.js +46 -0
  226. package/dist/frontend/lowering/record-sources.js.map +1 -0
  227. package/dist/frontend/lowering/surfaces.d.ts +3 -3
  228. package/dist/frontend/lowering/surfaces.js +59 -5
  229. package/dist/frontend/lowering/surfaces.js.map +1 -1
  230. package/dist/frontend/mock-shapes.d.ts +5 -0
  231. package/dist/frontend/mock-shapes.js +27 -2
  232. package/dist/frontend/mock-shapes.js.map +1 -1
  233. package/dist/frontend/program.js +5 -4
  234. package/dist/frontend/program.js.map +1 -1
  235. package/dist/frontend/type-mapper.d.ts +3 -0
  236. package/dist/frontend/type-mapper.js +148 -4
  237. package/dist/frontend/type-mapper.js.map +1 -1
  238. package/dist/index.js +18 -8
  239. package/dist/index.js.map +1 -1
  240. package/dist/ir/analysis.d.ts +10 -0
  241. package/dist/ir/analysis.js +35 -0
  242. package/dist/ir/analysis.js.map +1 -1
  243. package/dist/ir/analysis.test.js +69 -1
  244. package/dist/ir/analysis.test.js.map +1 -1
  245. package/dist/ir/builtin-effects.js +72 -0
  246. package/dist/ir/builtin-effects.js.map +1 -1
  247. package/dist/ir/builtin-signatures.d.ts +1 -1
  248. package/dist/ir/builtin-signatures.js +258 -13
  249. package/dist/ir/builtin-signatures.js.map +1 -1
  250. package/dist/ir/capture-values.d.ts +107 -0
  251. package/dist/ir/capture-values.js +850 -0
  252. package/dist/ir/capture-values.js.map +1 -0
  253. package/dist/ir/capture-values.test.d.ts +1 -0
  254. package/dist/ir/capture-values.test.js +268 -0
  255. package/dist/ir/capture-values.test.js.map +1 -0
  256. package/dist/ir/field-values.d.ts +16 -0
  257. package/dist/ir/field-values.js +128 -0
  258. package/dist/ir/field-values.js.map +1 -0
  259. package/dist/ir/field-values.test.d.ts +1 -0
  260. package/dist/ir/field-values.test.js +160 -0
  261. package/dist/ir/field-values.test.js.map +1 -0
  262. package/dist/ir/final-fields.d.ts +4 -1
  263. package/dist/ir/final-fields.js +11 -3
  264. package/dist/ir/final-fields.js.map +1 -1
  265. package/dist/ir/function-references.test.js +2 -1
  266. package/dist/ir/function-references.test.js.map +1 -1
  267. package/dist/ir/init-only-globals.d.ts +16 -0
  268. package/dist/ir/init-only-globals.js +121 -0
  269. package/dist/ir/init-only-globals.js.map +1 -0
  270. package/dist/ir/init-only-globals.test.d.ts +1 -0
  271. package/dist/ir/init-only-globals.test.js +115 -0
  272. package/dist/ir/init-only-globals.test.js.map +1 -0
  273. package/dist/ir/initializer-bindings.d.ts +18 -1
  274. package/dist/ir/initializer-bindings.js +91 -1
  275. package/dist/ir/initializer-bindings.js.map +1 -1
  276. package/dist/ir/initializer-bindings.test.js +57 -2
  277. package/dist/ir/initializer-bindings.test.js.map +1 -1
  278. package/dist/ir/int32-slots.d.ts +22 -0
  279. package/dist/ir/int32-slots.js +398 -13
  280. package/dist/ir/int32-slots.js.map +1 -1
  281. package/dist/ir/int32-slots.test.js +119 -8
  282. package/dist/ir/int32-slots.test.js.map +1 -1
  283. package/dist/ir/integer-loop-facts.d.ts +27 -1
  284. package/dist/ir/integer-loop-facts.js +239 -7
  285. package/dist/ir/integer-loop-facts.js.map +1 -1
  286. package/dist/ir/integer-ranges.d.ts +8 -5
  287. package/dist/ir/integer-ranges.js +147 -59
  288. package/dist/ir/integer-ranges.js.map +1 -1
  289. package/dist/ir/integer-ranges.test.js +285 -7
  290. package/dist/ir/integer-ranges.test.js.map +1 -1
  291. package/dist/ir/ir.d.ts +22 -1
  292. package/dist/ir/ir.js +4 -0
  293. package/dist/ir/ir.js.map +1 -1
  294. package/dist/ir/property-bags.d.ts +14 -0
  295. package/dist/ir/property-bags.js +121 -0
  296. package/dist/ir/property-bags.js.map +1 -0
  297. package/dist/ir/receiver-readers.d.ts +21 -0
  298. package/dist/ir/receiver-readers.js +217 -0
  299. package/dist/ir/receiver-readers.js.map +1 -0
  300. package/dist/ir/runtime-features.d.ts +3 -1
  301. package/dist/ir/runtime-features.js +102 -7
  302. package/dist/ir/runtime-features.js.map +1 -1
  303. package/dist/ir/runtime-features.test.js +62 -0
  304. package/dist/ir/runtime-features.test.js.map +1 -1
  305. package/dist/ir/traverse.js +4 -0
  306. package/dist/ir/traverse.js.map +1 -1
  307. package/dist/ir/validate.js +71 -3
  308. package/dist/ir/validate.js.map +1 -1
  309. package/dist/ir/validate.test.js +59 -0
  310. package/dist/ir/validate.test.js.map +1 -1
  311. package/dist/library/int-infer.js +3 -0
  312. package/dist/library/int-infer.js.map +1 -1
  313. package/dist/library/ir-policy.js +5 -0
  314. package/dist/library/ir-policy.js.map +1 -1
  315. package/package.json +20 -20
  316. package/surface-manifest.json +57 -19
@@ -1,6 +1,6 @@
1
1
  import * as ts from "../ts7/adapter.js";
2
2
  import type { Lowerer } from "./lowerer.js";
3
- import type { ClassInfo } from "./lower-classes.js";
3
+ import { type ClassInfo } from "./lower-classes.js";
4
4
  import { type IrExpr, type IrStmt, type IrType, type SrcLoc } from "../../ir/ir.js";
5
5
  /** The stream sides of a receiver class: the nearest stream-class
6
6
  * ancestor's, or null off the stream hierarchy. */
@@ -86,8 +86,6 @@ export declare function lowerStreamModuleCall(lowerer: Lowerer, call: ts.CallExp
86
86
  }, loc: SrcLoc): IrExpr | null;
87
87
  /** The Readable operators (scr_stream_ops.c — Node's operators.js). */
88
88
  export declare const STREAM_OPERATORS: ReadonlySet<string>;
89
- /** `recv.<member>(...)` over a stream-rooted receiver. Returns null only
90
- * for members this spoke does not own. */
91
89
  export declare function lowerStreamMethodCall(lowerer: Lowerer, call: ts.CallExpression, access: ts.PropertyAccessExpression, info: ClassInfo): IrExpr | null;
92
90
  export declare function lowerStreamStateProperty(lowerer: Lowerer, expr: ts.PropertyAccessExpression): IrExpr | null;
93
91
  /** Property reads on stream-rooted receivers (`r.readableEnded`,
@@ -1,4 +1,5 @@
1
1
  import { nodeThrowExpr, boolLit, numLit, strLit } from "../../ir/build.js";
2
+ import { hashStreamOf, isHashValueType } from "./builtins/hash-stream.js";
2
3
  import { InternalCompilerError } from "../../errors.js";
3
4
  /* The node:stream lowering (the spoke-module pattern, like
4
5
  * lower-event-emitter.ts): construction of the five runtime stream classes
@@ -30,6 +31,7 @@ import { InternalCompilerError } from "../../errors.js";
30
31
  * its Node signature (the emitter listener rule). */
31
32
  import * as ts from "../ts7/adapter.js";
32
33
  import { dynFallbackType } from "./lowerer.js";
34
+ import { accessorCall, classIteratorNextCall, classIteratorOf, classIteratorOpenCall, } from "./lower-classes.js";
33
35
  import { isJsSourceFile, locOf } from "../program.js";
34
36
  import { newFnCtx, own } from "./lowerer.js";
35
37
  import { appendImplicitUndefinedReturn } from "./function-returns.js";
@@ -159,6 +161,9 @@ export const STREAM_FORCED_EVENT_NAMES = new Set([
159
161
  "finish",
160
162
  "pipe",
161
163
  "unpipe",
164
+ "open",
165
+ "ready",
166
+ "keypress",
162
167
  ]);
163
168
  /** The per-base FORCED event tuples (runtime-emitted payloads): consulted
164
169
  * by the emitter spoke BEFORE the program-global table, so a stream's
@@ -168,6 +173,8 @@ export function streamForcedTuple(lowerer, info, name) {
168
173
  const sides = streamSidesOf(lowerer, info);
169
174
  if (!sides)
170
175
  return null;
176
+ // 'open' (the fd) and 'ready' are fs.ReadStream / fs.WriteStream's
177
+ // (scr_fs_stream.c).
171
178
  const readable = {
172
179
  data: [BYTES],
173
180
  end: [],
@@ -175,8 +182,14 @@ export function streamForcedTuple(lowerer, info, name) {
175
182
  readable: [],
176
183
  pause: [],
177
184
  resume: [],
185
+ open: [F64],
186
+ ready: [],
187
+ // readline.emitKeypressEvents' (str, key), as checked-dynamic values
188
+ keypress: [DYN, DYN],
178
189
  };
179
190
  const writable = {
191
+ open: [F64],
192
+ ready: [],
180
193
  drain: [],
181
194
  prefinish: [],
182
195
  finish: [],
@@ -1183,21 +1196,66 @@ export function lowerStreamStaticCall(lowerer, call, access) {
1183
1196
  const single = typedElem(srcT);
1184
1197
  const elem = srcT?.kind === "array" ? typedElem(srcT.elem) : null;
1185
1198
  const opts = optsNode ? fromOptions(lowerer, optsNode) : { flags: 0, hwm: null };
1186
- if (srcNode && srcT?.kind === "generator" && opts && fromGenChunk(lowerer, srcT.yieldT)) {
1199
+ // A class whose [Symbol.iterator]() or [Symbol.asyncIterator]() is a
1200
+ // generator method: from.js calls the method when the stream is built,
1201
+ // then reads the generator like any other.
1202
+ const genMethod = srcT?.kind === "object" ? classGeneratorMethodOf(lowerer, srcT) : null;
1203
+ const genT = srcT?.kind === "generator" ? srcT : (genMethod?.gen ?? null);
1204
+ if (srcNode && genT && opts && fromGenChunk(lowerer, genT.yieldT)) {
1187
1205
  // A compiled generator: the runtime pulls it through interned helpers.
1188
- const gen = lowerer.lowerExpr(srcNode);
1189
- const helpers = fromGenHelpers(lowerer, srcT, loc);
1206
+ const recv = lowerer.lowerExpr(srcNode);
1207
+ const gen = genMethod && srcT?.kind === "object"
1208
+ ? accessorCall(lowerer, srcT.className, genMethod.method, recv, [], genT, loc)
1209
+ : recv;
1210
+ const helpers = fromGenHelpers(lowerer, genT, loc);
1190
1211
  if (helpers) {
1191
1212
  const hwm = opts.hwm ? lowerer.lowerExprExpecting(opts.hwm, F64) : numLit(0, loc);
1192
1213
  return {
1193
1214
  kind: "libCall",
1194
- fn: srcT.async ? "readable.fromAsyncGen" : "readable.fromGen",
1215
+ fn: genT.async ? "readable.fromAsyncGen" : "readable.fromGen",
1195
1216
  args: [gen, ...helpers, numLit(opts.flags, loc), hwm],
1196
1217
  type,
1197
1218
  loc,
1198
1219
  };
1199
1220
  }
1200
1221
  }
1222
+ // from.js prefers Symbol.asyncIterator: a class declaring one takes the
1223
+ // async route.
1224
+ const asyncOpen = srcT?.kind === "object" &&
1225
+ lowerer.classes.has(srcT.className) &&
1226
+ lowerer.findMethodOn(lowerer.classes.get(srcT.className), "sym:asyncIterator") !== null;
1227
+ const cit = srcT?.kind === "object" && !asyncOpen ? classIteratorOf(lowerer, srcT) : null;
1228
+ if (srcNode && cit && opts && fromGenChunk(lowerer, cit.valueT)) {
1229
+ // A class iterable: from.js takes the iterator when the stream is
1230
+ // built (the typed [Symbol.iterator]() call here), and the runtime
1231
+ // pulls it through a checked-dynamic { next } object. Class iterators
1232
+ // declare no return() or throw(), so destroy calls neither.
1233
+ const recv = lowerer.lowerExpr(srcNode);
1234
+ const hwm = opts.hwm ? lowerer.lowerExprExpecting(opts.hwm, F64) : numLit(0, loc);
1235
+ return {
1236
+ kind: "libCall",
1237
+ fn: "readable.fromIter",
1238
+ args: [
1239
+ classIteratorObject(lowerer, cit, classIteratorOpenCall(lowerer, cit, recv, loc), loc),
1240
+ numLit(opts.flags, loc),
1241
+ hwm,
1242
+ ],
1243
+ type,
1244
+ loc,
1245
+ };
1246
+ }
1247
+ const acit = srcT?.kind === "object" && asyncOpen ? classAsyncIteratorOf(lowerer, srcT) : null;
1248
+ if (srcNode && acit && opts && fromGenChunk(lowerer, acit.valueT)) {
1249
+ const recv = lowerer.lowerExpr(srcNode);
1250
+ const hwm = opts.hwm ? lowerer.lowerExprExpecting(opts.hwm, F64) : numLit(0, loc);
1251
+ return {
1252
+ kind: "libCall",
1253
+ fn: "readable.fromAsyncIter",
1254
+ args: [classAsyncIteratorObject(lowerer, acit, recv, loc), numLit(opts.flags, loc), hwm],
1255
+ type,
1256
+ loc,
1257
+ };
1258
+ }
1201
1259
  if (srcNode && (single || elem) && opts) {
1202
1260
  const v = lowerer.lowerExpr(srcNode);
1203
1261
  const hwm = opts.hwm ? lowerer.lowerExprExpecting(opts.hwm, F64) : numLit(0, loc);
@@ -1214,6 +1272,7 @@ export function lowerStreamStaticCall(lowerer, call, access) {
1214
1272
  };
1215
1273
  }
1216
1274
  const anySrc = srcT?.kind === "dyn" ||
1275
+ (srcT?.kind === "set" && typedElem(srcT.elem) !== null) ||
1217
1276
  (srcNode !== undefined &&
1218
1277
  srcT === null &&
1219
1278
  (lowerer.typeOf(srcNode).flags & ts.TypeFlags.Any) !== 0);
@@ -1227,7 +1286,7 @@ export function lowerStreamStaticCall(lowerer, call, access) {
1227
1286
  if (srcNode && (single || elem)) {
1228
1287
  lowerer.noLowering("Readable.from with these options", optsNode, "an object literal with 'objectMode' (true or false) and a number 'highWaterMark' is supported");
1229
1288
  }
1230
- lowerer.noLowering(`Readable.from over a '${srcT ? lowerer.fmt(srcT) : "?"}' source`, srcNode ?? call, "string[] / Buffer[] arrays (and a single string or Buffer) are the supported sources — generators and async iterables have no lowering yet");
1289
+ lowerer.noLowering(`Readable.from over a '${srcT ? lowerer.fmt(srcT) : "?"}' source`, srcNode ?? call, "the supported sources are a string or Buffer, and arrays, Sets, generators and class iterables of strings or Buffers");
1231
1290
  }
1232
1291
  /** Whether a generator's yields are stream chunks: strings, Buffers, a
1233
1292
  * union of them (null included: the runtime destroys the stream with
@@ -1355,6 +1414,210 @@ function fromGenHelpers(lowerer, gen, loc) {
1355
1414
  define("throw", [g, e], DYN, viaRecord("throw"), [r]),
1356
1415
  ];
1357
1416
  }
1417
+ /** `{ next() { const r = it.next(); return { value: r.value, done: r.done }; } }`
1418
+ * over a class iterator `it`, as a checked-dynamic object: an interned
1419
+ * lifted function per iterator class takes the iterator and answers the
1420
+ * object, whose `next` closure captures it. */
1421
+ function classIteratorObject(lowerer, cit, iter, loc) {
1422
+ const key = `streamFromIter:${cit.iterT.className}`;
1423
+ let name = lowerer.valueHelpers.get(key);
1424
+ if (!name) {
1425
+ name = `%stream.fromIter.${lowerer.valueHelpers.size}`;
1426
+ lowerer.valueHelpers.set(key, name);
1427
+ const nextName = `${name}.next`;
1428
+ const nextT = funcOf([], DYN);
1429
+ const it = { id: "it.0", name: "it", type: cit.iterT, mutable: false, boxed: true };
1430
+ const r = { id: "res.0", name: "res", type: cit.resultT, mutable: false };
1431
+ const field = (f, t) => ({
1432
+ kind: "recordGet",
1433
+ obj: varRef(r.id, cit.resultT, loc),
1434
+ shapeId: cit.resultT.shapeId,
1435
+ field: f,
1436
+ type: t,
1437
+ loc,
1438
+ });
1439
+ const str = (value) => ({ kind: "strLit", value, type: STRING, loc });
1440
+ lowerer.liftedFns.push({
1441
+ name: nextName,
1442
+ params: [],
1443
+ returnType: DYN,
1444
+ captures: [{ localId: it.id, name: it.name, type: it.type }],
1445
+ locals: [it, r],
1446
+ body: [
1447
+ {
1448
+ kind: "varDecl",
1449
+ localId: r.id,
1450
+ init: classIteratorNextCall(lowerer, cit, varRef(it.id, cit.iterT, loc), loc),
1451
+ loc,
1452
+ },
1453
+ {
1454
+ kind: "return",
1455
+ value: {
1456
+ kind: "dynObjLit",
1457
+ fields: [
1458
+ {
1459
+ key: str("value"),
1460
+ value: lowerer.coerceToExpected(field("value", cit.valueT), DYN),
1461
+ },
1462
+ {
1463
+ key: str("done"),
1464
+ value: {
1465
+ kind: "dynFrom",
1466
+ value: cit.hasDone ? field("done", BOOL) : boolLit(false, loc),
1467
+ type: DYN,
1468
+ loc,
1469
+ },
1470
+ },
1471
+ ],
1472
+ type: DYN,
1473
+ loc,
1474
+ },
1475
+ loc,
1476
+ },
1477
+ ],
1478
+ loc,
1479
+ });
1480
+ lowerer.liftedFns.push({
1481
+ name,
1482
+ params: [{ localId: it.id, name: it.name, type: it.type }],
1483
+ returnType: DYN,
1484
+ locals: [it],
1485
+ body: [
1486
+ {
1487
+ kind: "return",
1488
+ value: {
1489
+ kind: "dynObjLit",
1490
+ fields: [
1491
+ {
1492
+ key: str("next"),
1493
+ value: {
1494
+ kind: "dynFrom",
1495
+ value: { kind: "closure", fnName: nextName, captures: [it.id], type: nextT, loc },
1496
+ type: DYN,
1497
+ loc,
1498
+ },
1499
+ },
1500
+ ],
1501
+ type: DYN,
1502
+ loc,
1503
+ },
1504
+ loc,
1505
+ },
1506
+ ],
1507
+ loc,
1508
+ });
1509
+ }
1510
+ return { kind: "call", callee: name, args: [iter], type: DYN, loc };
1511
+ }
1512
+ /** A class's zero-parameter `[Symbol.asyncIterator]()` (checked first, as
1513
+ * from.js does) or `[Symbol.iterator]()` method that returns a generator,
1514
+ * with its method slot. */
1515
+ function classGeneratorMethodOf(lowerer, t) {
1516
+ const info = lowerer.classes.get(t.className);
1517
+ if (!info)
1518
+ return null;
1519
+ for (const method of ["sym:asyncIterator", "sym:iterator"]) {
1520
+ const m = lowerer.findMethodOn(info, method);
1521
+ if (!m)
1522
+ continue;
1523
+ const ret = m.sig.ret;
1524
+ if (m.sig.abstract === true || m.sig.params.length !== 0 || ret.kind !== "generator")
1525
+ return null;
1526
+ return { method, gen: ret };
1527
+ }
1528
+ return null;
1529
+ }
1530
+ function classAsyncIteratorOf(lowerer, t) {
1531
+ const info = lowerer.classes.get(t.className);
1532
+ const open = info ? lowerer.findMethodOn(info, "sym:asyncIterator") : null;
1533
+ if (!open || open.sig.abstract === true || open.sig.params.length !== 0)
1534
+ return null;
1535
+ const iterT = open.sig.ret;
1536
+ if (iterT.kind !== "object")
1537
+ return null;
1538
+ const itInfo = lowerer.classes.get(iterT.className);
1539
+ if (!itInfo || lowerer.findMethodOn(itInfo, "throw"))
1540
+ return null;
1541
+ const record = (name) => {
1542
+ const m = lowerer.findMethodOn(itInfo, name);
1543
+ if (!m || m.sig.abstract === true || m.sig.params.length !== 0)
1544
+ return null;
1545
+ const ret = m.sig.ret;
1546
+ return ret.kind === "promise" && ret.inner.kind === "record" ? ret.inner : null;
1547
+ };
1548
+ const resultT = record("next");
1549
+ if (!resultT)
1550
+ return null;
1551
+ const shape = lowerer.shapes.get(resultT.shapeId);
1552
+ const value = shape?.fields.find((f) => f.name === "value");
1553
+ const done = shape?.fields.find((f) => f.name === "done");
1554
+ if (!value || (done && done.type.kind !== "bool"))
1555
+ return null;
1556
+ const hasReturn = lowerer.findMethodOn(itInfo, "return") !== null;
1557
+ if (hasReturn && !record("return"))
1558
+ return null;
1559
+ return { className: t.className, iterT, resultT, valueT: value.type, hasReturn };
1560
+ }
1561
+ /** The checked-dynamic iterator object over an async class iterable:
1562
+ * `recv[Symbol.asyncIterator]()` runs when the stream is built, and the
1563
+ * object's `next` (and `return`, when the class declares one) answer the
1564
+ * iterator's own promises boxed. */
1565
+ function classAsyncIteratorObject(lowerer, cit, recv, loc) {
1566
+ const key = `streamFromAsyncIter:${cit.className}`;
1567
+ let name = lowerer.valueHelpers.get(key);
1568
+ if (!name) {
1569
+ name = `%stream.fromAsyncIter.${lowerer.valueHelpers.size}`;
1570
+ lowerer.valueHelpers.set(key, name);
1571
+ const it = { id: "it.0", name: "it", type: cit.iterT, mutable: false, boxed: true };
1572
+ const src = {
1573
+ id: "src.0",
1574
+ name: "src",
1575
+ type: { kind: "object", className: cit.className },
1576
+ mutable: false,
1577
+ };
1578
+ const str = (value) => ({ kind: "strLit", value, type: STRING, loc });
1579
+ const method = (m) => {
1580
+ const fnName = `${name}.${m}`;
1581
+ const call = accessorCall(lowerer, cit.iterT.className, m, varRef(it.id, cit.iterT, loc), [], { kind: "promise", inner: cit.resultT }, loc);
1582
+ lowerer.liftedFns.push({
1583
+ name: fnName,
1584
+ params: [],
1585
+ returnType: DYN,
1586
+ captures: [{ localId: it.id, name: it.name, type: it.type }],
1587
+ locals: [it],
1588
+ body: [{ kind: "return", value: { kind: "dynFrom", value: call, type: DYN, loc }, loc }],
1589
+ loc,
1590
+ });
1591
+ return {
1592
+ key: str(m),
1593
+ value: {
1594
+ kind: "dynFrom",
1595
+ value: { kind: "closure", fnName, captures: [it.id], type: funcOf([], DYN), loc },
1596
+ type: DYN,
1597
+ loc,
1598
+ },
1599
+ };
1600
+ };
1601
+ const fields = [method("next"), ...(cit.hasReturn ? [method("return")] : [])];
1602
+ lowerer.liftedFns.push({
1603
+ name,
1604
+ params: [{ localId: src.id, name: src.name, type: src.type }],
1605
+ returnType: DYN,
1606
+ locals: [src, it],
1607
+ body: [
1608
+ {
1609
+ kind: "varDecl",
1610
+ localId: it.id,
1611
+ init: accessorCall(lowerer, cit.className, "sym:asyncIterator", varRef(src.id, src.type, loc), [], cit.iterT, loc),
1612
+ loc,
1613
+ },
1614
+ { kind: "return", value: { kind: "dynObjLit", fields, type: DYN, loc }, loc },
1615
+ ],
1616
+ loc,
1617
+ });
1618
+ }
1619
+ return { kind: "call", callee: name, args: [recv], type: DYN, loc };
1620
+ }
1358
1621
  /** Readable.from's typed options: an object literal of `objectMode`
1359
1622
  * (a boolean literal) and `highWaterMark` (a number), as SCR_FROM_* flag
1360
1623
  * bits and the hwm expression; null for any other shape. */
@@ -1421,7 +1684,12 @@ const PIPELINE_STAGE_EXPECTED = "of type function or an instance of Blob, Readab
1421
1684
  * { readable, writable } pairs — those shapes fence instead of throwing
1422
1685
  * a ladder Node never throws. */
1423
1686
  function lowerStreamArg(lowerer, node, what) {
1424
- const v = lowerer.lowerExpr(node);
1687
+ const lowered = lowerer.lowerExpr(node);
1688
+ // A Hash or Hmac stage is its Transform; pipeline and compose stages
1689
+ // keep the value alive until the stream settles.
1690
+ const v = isHashValueType(lowered.type)
1691
+ ? hashStreamOf(lowered, what === "pipeline" || what === "compose")
1692
+ : lowered;
1425
1693
  const info = v.type.kind === "object" ? lowerer.classes.get(v.type.className) : undefined;
1426
1694
  if (!streamSidesOf(lowerer, info)) {
1427
1695
  // A provably-non-stream value in a JS source (the invalid-input
@@ -2412,6 +2680,22 @@ function checkUtf8Encoding(lowerer, member, arg) {
2412
2680
  }
2413
2681
  /** `recv.<member>(...)` over a stream-rooted receiver. Returns null only
2414
2682
  * for members this spoke does not own. */
2683
+ /** pipe()'s `{ end }` option: true when absent. */
2684
+ function pipeEndOption(lowerer, options, loc) {
2685
+ let end = boolLit(true, loc);
2686
+ if (options === undefined)
2687
+ return end;
2688
+ if (!ts.isObjectLiteralExpression(options)) {
2689
+ lowerer.noLowering("pipe with a non-literal options argument", options, "{ end: <bool> } inline is the supported form");
2690
+ }
2691
+ for (const prop of options.properties) {
2692
+ if (!ts.isPropertyAssignment(prop) || !ts.isIdentifier(prop.name) || prop.name.text !== "end") {
2693
+ lowerer.noLowering("a pipe option other than 'end'", prop);
2694
+ }
2695
+ end = lowerer.lowerExprExpecting(prop.initializer, BOOL);
2696
+ }
2697
+ return end;
2698
+ }
2415
2699
  export function lowerStreamMethodCall(lowerer, call, access, info) {
2416
2700
  const member = access.name.text;
2417
2701
  if (STREAM_OPERATORS.has(member)) {
@@ -2596,26 +2880,47 @@ export function lowerStreamMethodCall(lowerer, call, access, info) {
2596
2880
  if (args.length === 0 || args.length > 2) {
2597
2881
  lowerer.noLowering(`pipe with ${args.length} arguments`, call, "the supported forms are (destination) and (destination, { end })");
2598
2882
  }
2883
+ // A Hash or Hmac destination pipes into its Transform, and pipe()
2884
+ // answers the Hash itself (the receiver evaluates first, as in JS).
2885
+ if (isHashValueType(lowerer.mapTypeOf(lowerer.typeOf(args[0])))) {
2886
+ const receiverValue = lowerer.lowerExpr(access.expression);
2887
+ const source = lowerer.declareHiddenLocal("%pipeSource", receiverValue.type);
2888
+ const hashValue = lowerer.lowerExpr(args[0]);
2889
+ const hash = lowerer.declareHiddenLocal("%pipeHash", hashValue.type);
2890
+ const end = pipeEndOption(lowerer, args[1], loc);
2891
+ return {
2892
+ kind: "seqExpr",
2893
+ stmts: [
2894
+ { kind: "varDecl", localId: source.id, init: receiverValue, loc },
2895
+ { kind: "varDecl", localId: hash.id, init: hashValue, loc },
2896
+ {
2897
+ kind: "exprStmt",
2898
+ expr: {
2899
+ kind: "libCall",
2900
+ fn: "readable.pipe",
2901
+ args: [
2902
+ { kind: "varRef", localId: source.id, type: receiverValue.type, loc },
2903
+ hashStreamOf({ kind: "varRef", localId: hash.id, type: hashValue.type, loc }, true),
2904
+ end,
2905
+ ],
2906
+ type: { kind: "object", className: "%Transform" },
2907
+ loc,
2908
+ },
2909
+ loc,
2910
+ },
2911
+ ],
2912
+ result: { kind: "varRef", localId: hash.id, type: hashValue.type, loc },
2913
+ type: hashValue.type,
2914
+ loc,
2915
+ };
2916
+ }
2599
2917
  const dst = lowerer.lowerExpr(args[0]);
2600
2918
  const dstInfo = dst.type.kind === "object" ? lowerer.classes.get(dst.type.className) : undefined;
2601
2919
  const dstSides = streamSidesOf(lowerer, dstInfo);
2602
2920
  if (dstSides !== "w" && dstSides !== "rw") {
2603
2921
  lowerer.noLowering(`pipe into a '${lowerer.fmt(dst.type)}'`, args[0], "the destination must be a stream Writable/Duplex (process streams and sockets are not pipe destinations yet)");
2604
2922
  }
2605
- let end = boolLit(true, loc);
2606
- if (args[1] !== undefined) {
2607
- if (!ts.isObjectLiteralExpression(args[1])) {
2608
- lowerer.noLowering("pipe with a non-literal options argument", args[1], "{ end: <bool> } inline is the supported form");
2609
- }
2610
- for (const prop of args[1].properties) {
2611
- if (!ts.isPropertyAssignment(prop) ||
2612
- !ts.isIdentifier(prop.name) ||
2613
- prop.name.text !== "end") {
2614
- lowerer.noLowering("a pipe option other than 'end'", prop);
2615
- }
2616
- end = lowerer.lowerExprExpecting(prop.initializer, BOOL);
2617
- }
2618
- }
2923
+ const end = pipeEndOption(lowerer, args[1], loc);
2619
2924
  const receiver = lowerer.lowerExpr(access.expression);
2620
2925
  return {
2621
2926
  kind: "libCall",