@scriptc/compiler 0.3.3 → 0.3.5

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 (352) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +844 -36
  2. package/dist/backend/cycle-mutability.d.ts +5 -0
  3. package/dist/backend/cycle-mutability.js +62 -3
  4. package/dist/backend/cycle-mutability.js.map +1 -1
  5. package/dist/backend/executable-features.js +1 -0
  6. package/dist/backend/executable-features.js.map +1 -1
  7. package/dist/backend/library-pack.js +1 -0
  8. package/dist/backend/library-pack.js.map +1 -1
  9. package/dist/backend/llvm/array-search.js +1 -1
  10. package/dist/backend/llvm/array-search.js.map +1 -1
  11. package/dist/backend/llvm/call-lifetimes.d.ts +11 -1
  12. package/dist/backend/llvm/call-lifetimes.js +30 -3
  13. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  14. package/dist/backend/llvm/call-lifetimes.test.js +31 -1
  15. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  16. package/dist/backend/llvm/common.d.ts +5 -0
  17. package/dist/backend/llvm/common.js +7 -0
  18. package/dist/backend/llvm/common.js.map +1 -1
  19. package/dist/backend/llvm/constant-callbacks.d.ts +2 -21
  20. package/dist/backend/llvm/constant-callbacks.js +36 -219
  21. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  22. package/dist/backend/llvm/constant-callbacks.test.js +22 -0
  23. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  24. package/dist/backend/llvm/dense-array-access.d.ts +9 -0
  25. package/dist/backend/llvm/dense-array-access.js +29 -3
  26. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  27. package/dist/backend/llvm/dyn.d.ts +46 -1
  28. package/dist/backend/llvm/dyn.js +218 -33
  29. package/dist/backend/llvm/dyn.js.map +1 -1
  30. package/dist/backend/llvm/emitter.d.ts +87 -1
  31. package/dist/backend/llvm/emitter.js +568 -61
  32. package/dist/backend/llvm/emitter.js.map +1 -1
  33. package/dist/backend/llvm/expr-async.js +17 -7
  34. package/dist/backend/llvm/expr-async.js.map +1 -1
  35. package/dist/backend/llvm/expr-bytes.d.ts +9 -0
  36. package/dist/backend/llvm/expr-bytes.js +159 -64
  37. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  38. package/dist/backend/llvm/expr-callbacks.d.ts +11 -0
  39. package/dist/backend/llvm/expr-callbacks.js +53 -0
  40. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  41. package/dist/backend/llvm/expr-calls.d.ts +3 -1
  42. package/dist/backend/llvm/expr-calls.js +137 -3
  43. package/dist/backend/llvm/expr-calls.js.map +1 -1
  44. package/dist/backend/llvm/expr-containers.js +63 -29
  45. package/dist/backend/llvm/expr-containers.js.map +1 -1
  46. package/dist/backend/llvm/expr-primitives.js +9 -1
  47. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  48. package/dist/backend/llvm/expr-stream-bridges.js +4 -0
  49. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  50. package/dist/backend/llvm/integer-clones.d.ts +103 -0
  51. package/dist/backend/llvm/integer-clones.js +1336 -0
  52. package/dist/backend/llvm/integer-clones.js.map +1 -0
  53. package/dist/backend/llvm/integer-clones.test.d.ts +1 -0
  54. package/dist/backend/llvm/integer-clones.test.js +219 -0
  55. package/dist/backend/llvm/integer-clones.test.js.map +1 -0
  56. package/dist/backend/llvm/intern-tables.test.d.ts +1 -0
  57. package/dist/backend/llvm/intern-tables.test.js +77 -0
  58. package/dist/backend/llvm/intern-tables.test.js.map +1 -0
  59. package/dist/backend/llvm/lib-datagram.js +24 -0
  60. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  61. package/dist/backend/llvm/lib-dispatch.js +96 -1
  62. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  63. package/dist/backend/llvm/lib-filesystem.js +51 -0
  64. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  65. package/dist/backend/llvm/lib-network.js +16 -0
  66. package/dist/backend/llvm/lib-network.js.map +1 -1
  67. package/dist/backend/llvm/lib-process.js +24 -0
  68. package/dist/backend/llvm/lib-process.js.map +1 -1
  69. package/dist/backend/llvm/lib-shared.d.ts +5 -0
  70. package/dist/backend/llvm/lib-shared.js +114 -3
  71. package/dist/backend/llvm/lib-shared.js.map +1 -1
  72. package/dist/backend/llvm/lib-stream.js +87 -0
  73. package/dist/backend/llvm/lib-stream.js.map +1 -1
  74. package/dist/backend/llvm/lib-test.js +9 -0
  75. package/dist/backend/llvm/lib-test.js.map +1 -1
  76. package/dist/backend/llvm/lib-tls.js +6 -0
  77. package/dist/backend/llvm/lib-tls.js.map +1 -1
  78. package/dist/backend/llvm/local-array-reads.js +1 -1
  79. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  80. package/dist/backend/llvm/map-entry-fusion.d.ts +28 -0
  81. package/dist/backend/llvm/map-entry-fusion.js +233 -0
  82. package/dist/backend/llvm/map-entry-fusion.js.map +1 -0
  83. package/dist/backend/llvm/map-entry-fusion.test.d.ts +1 -0
  84. package/dist/backend/llvm/map-entry-fusion.test.js +183 -0
  85. package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -0
  86. package/dist/backend/llvm/map-number-lookup.d.ts +6 -0
  87. package/dist/backend/llvm/map-number-lookup.js +23 -1
  88. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  89. package/dist/backend/llvm/map-number-lookup.test.js +60 -5
  90. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  91. package/dist/backend/llvm/map-read-lifetimes.d.ts +11 -0
  92. package/dist/backend/llvm/map-read-lifetimes.js +92 -1
  93. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  94. package/dist/backend/llvm/map-read-lifetimes.test.js +131 -3
  95. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  96. package/dist/backend/llvm/publish.d.ts +21 -0
  97. package/dist/backend/llvm/publish.js +101 -11
  98. package/dist/backend/llvm/publish.js.map +1 -1
  99. package/dist/backend/llvm/publish.test.d.ts +1 -0
  100. package/dist/backend/llvm/publish.test.js +94 -0
  101. package/dist/backend/llvm/publish.test.js.map +1 -0
  102. package/dist/backend/llvm/record-results.js +76 -2
  103. package/dist/backend/llvm/record-results.js.map +1 -1
  104. package/dist/backend/llvm/record-sources.d.ts +7 -0
  105. package/dist/backend/llvm/record-sources.js +14 -0
  106. package/dist/backend/llvm/record-sources.js.map +1 -0
  107. package/dist/backend/llvm/reference-writes.js +5 -2
  108. package/dist/backend/llvm/reference-writes.js.map +1 -1
  109. package/dist/backend/llvm/regions.d.ts +4 -1
  110. package/dist/backend/llvm/regions.js +12 -3
  111. package/dist/backend/llvm/regions.js.map +1 -1
  112. package/dist/backend/llvm/shapes.d.ts +9 -3
  113. package/dist/backend/llvm/shapes.js +18 -14
  114. package/dist/backend/llvm/shapes.js.map +1 -1
  115. package/dist/backend/llvm/shapes.test.js +5 -3
  116. package/dist/backend/llvm/shapes.test.js.map +1 -1
  117. package/dist/backend/llvm/string-lifetimes.test.js +75 -1
  118. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  119. package/dist/backend/llvm/string-reads.js +2 -2
  120. package/dist/backend/llvm/string-reads.js.map +1 -1
  121. package/dist/backend/llvm/string-slices.js +2 -2
  122. package/dist/backend/llvm/string-slices.js.map +1 -1
  123. package/dist/backend/llvm/walkers.d.ts +17 -0
  124. package/dist/backend/llvm/walkers.js +123 -0
  125. package/dist/backend/llvm/walkers.js.map +1 -1
  126. package/dist/backend/may-throw.js +4 -0
  127. package/dist/backend/may-throw.js.map +1 -1
  128. package/dist/backend/native/contracts.d.ts +5 -1
  129. package/dist/backend/native/executable.js +16 -6
  130. package/dist/backend/native/executable.js.map +1 -1
  131. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  132. package/dist/backend/native/runtime-inputs.js +1 -0
  133. package/dist/backend/native/runtime-inputs.js.map +1 -1
  134. package/dist/backend/native-codegen-core.d.ts +4 -4
  135. package/dist/backend/native-codegen-core.js +4 -6
  136. package/dist/backend/native-codegen-core.js.map +1 -1
  137. package/dist/backend/native-codegen.test.js +7 -8
  138. package/dist/backend/native-codegen.test.js.map +1 -1
  139. package/dist/backend/native-link-info-core.d.ts +3 -0
  140. package/dist/backend/native-link-info-core.js.map +1 -1
  141. package/dist/backend/publication.js +3 -1
  142. package/dist/backend/publication.js.map +1 -1
  143. package/dist/backend/runtime-abi.d.ts +2 -2
  144. package/dist/backend/runtime-abi.js +2 -2
  145. package/dist/backend/runtime-pack-targets.test.js +2 -1
  146. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  147. package/dist/backend/runtime-pack.test.js +2 -1
  148. package/dist/backend/runtime-pack.test.js.map +1 -1
  149. package/dist/backend/target-diagnostics.js +7 -0
  150. package/dist/backend/target-diagnostics.js.map +1 -1
  151. package/dist/backend/warm-cache.js +1 -0
  152. package/dist/backend/warm-cache.js.map +1 -1
  153. package/dist/executable/executable-cache.d.ts +1 -0
  154. package/dist/executable/executable-cache.js +1 -0
  155. package/dist/executable/executable-cache.js.map +1 -1
  156. package/dist/executable/executable-cache.test.js +1 -0
  157. package/dist/executable/executable-cache.test.js.map +1 -1
  158. package/dist/frontend/experimental-import.d.ts +5 -1
  159. package/dist/frontend/experimental-import.js +28 -3
  160. package/dist/frontend/experimental-import.js.map +1 -1
  161. package/dist/frontend/lowering/assert-instances.d.ts +38 -0
  162. package/dist/frontend/lowering/assert-instances.js +269 -0
  163. package/dist/frontend/lowering/assert-instances.js.map +1 -0
  164. package/dist/frontend/lowering/builtin-calls.js +3 -0
  165. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  166. package/dist/frontend/lowering/builtins/callable-aliases.js +54 -8
  167. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  168. package/dist/frontend/lowering/builtins/child-process-async.d.ts +8 -6
  169. package/dist/frontend/lowering/builtins/child-process-async.js +45 -29
  170. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  171. package/dist/frontend/lowering/builtins/compression.d.ts +18 -0
  172. package/dist/frontend/lowering/builtins/compression.js +175 -2
  173. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  174. package/dist/frontend/lowering/builtins/constants.js +7 -2
  175. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  176. package/dist/frontend/lowering/builtins/crypto.d.ts +6 -0
  177. package/dist/frontend/lowering/builtins/crypto.js +111 -1
  178. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  179. package/dist/frontend/lowering/builtins/errors.js +23 -0
  180. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  181. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +2 -0
  182. package/dist/frontend/lowering/builtins/filesystem-calls.js +5 -0
  183. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  184. package/dist/frontend/lowering/builtins/filesystem.js +60 -0
  185. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  186. package/dist/frontend/lowering/builtins/fs-streams.d.ts +26 -0
  187. package/dist/frontend/lowering/builtins/fs-streams.js +131 -0
  188. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -0
  189. package/dist/frontend/lowering/builtins/module-calls.js +5 -1
  190. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  191. package/dist/frontend/lowering/builtins/timers.d.ts +3 -0
  192. package/dist/frontend/lowering/builtins/timers.js +109 -23
  193. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  194. package/dist/frontend/lowering/call-signatures.js +6 -0
  195. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  196. package/dist/frontend/lowering/class-dynamic-dispatch.js +216 -20
  197. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  198. package/dist/frontend/lowering/containers/bytes.js +33 -12
  199. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  200. package/dist/frontend/lowering/devirtualize.js +20 -7
  201. package/dist/frontend/lowering/devirtualize.js.map +1 -1
  202. package/dist/frontend/lowering/intern-tables.d.ts +13 -0
  203. package/dist/frontend/lowering/intern-tables.js +536 -0
  204. package/dist/frontend/lowering/intern-tables.js.map +1 -0
  205. package/dist/frontend/lowering/lower-assert.js +700 -61
  206. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  207. package/dist/frontend/lowering/lower-async-iteration.js +11 -2
  208. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  209. package/dist/frontend/lowering/lower-calls.js +75 -6
  210. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  211. package/dist/frontend/lowering/lower-classes.d.ts +3 -0
  212. package/dist/frontend/lowering/lower-classes.js +43 -0
  213. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  214. package/dist/frontend/lowering/lower-dgram.js +132 -67
  215. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  216. package/dist/frontend/lowering/lower-event-emitter.d.ts +9 -1
  217. package/dist/frontend/lowering/lower-event-emitter.js +78 -0
  218. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  219. package/dist/frontend/lowering/lower-exprs.d.ts +4 -0
  220. package/dist/frontend/lowering/lower-exprs.js +144 -58
  221. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  222. package/dist/frontend/lowering/lower-inspect.d.ts +6 -0
  223. package/dist/frontend/lowering/lower-inspect.js +138 -39
  224. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  225. package/dist/frontend/lowering/lower-mock.d.ts +11 -0
  226. package/dist/frontend/lowering/lower-mock.js +504 -0
  227. package/dist/frontend/lowering/lower-mock.js.map +1 -0
  228. package/dist/frontend/lowering/lower-modules.js +7 -0
  229. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  230. package/dist/frontend/lowering/lower-server.d.ts +4 -0
  231. package/dist/frontend/lowering/lower-server.js +448 -30
  232. package/dist/frontend/lowering/lower-server.js.map +1 -1
  233. package/dist/frontend/lowering/lower-stmts.js +35 -8
  234. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  235. package/dist/frontend/lowering/lower-stream.d.ts +10 -6
  236. package/dist/frontend/lowering/lower-stream.js +794 -27
  237. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  238. package/dist/frontend/lowering/lower-test.js +86 -8
  239. package/dist/frontend/lowering/lower-test.js.map +1 -1
  240. package/dist/frontend/lowering/lowerer.d.ts +25 -1
  241. package/dist/frontend/lowering/lowerer.js +74 -9
  242. package/dist/frontend/lowering/lowerer.js.map +1 -1
  243. package/dist/frontend/lowering/pairs-snapshot.d.ts +6 -0
  244. package/dist/frontend/lowering/pairs-snapshot.js +49 -0
  245. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  246. package/dist/frontend/lowering/record-sources.d.ts +15 -0
  247. package/dist/frontend/lowering/record-sources.js +46 -0
  248. package/dist/frontend/lowering/record-sources.js.map +1 -0
  249. package/dist/frontend/lowering/surfaces.d.ts +4 -0
  250. package/dist/frontend/lowering/surfaces.js +94 -16
  251. package/dist/frontend/lowering/surfaces.js.map +1 -1
  252. package/dist/frontend/lowering/zlib-constants.d.ts +1 -0
  253. package/dist/frontend/lowering/zlib-constants.js +181 -0
  254. package/dist/frontend/lowering/zlib-constants.js.map +1 -0
  255. package/dist/frontend/mock-shapes.d.ts +10 -0
  256. package/dist/frontend/mock-shapes.js +76 -0
  257. package/dist/frontend/mock-shapes.js.map +1 -0
  258. package/dist/frontend/pipeline.js +5 -3
  259. package/dist/frontend/pipeline.js.map +1 -1
  260. package/dist/frontend/program.js +6 -1
  261. package/dist/frontend/program.js.map +1 -1
  262. package/dist/frontend/resolve.d.ts +4 -0
  263. package/dist/frontend/resolve.js +14 -0
  264. package/dist/frontend/resolve.js.map +1 -1
  265. package/dist/frontend/tsc-codes.js +1 -0
  266. package/dist/frontend/tsc-codes.js.map +1 -1
  267. package/dist/frontend/type-mapper.d.ts +8 -0
  268. package/dist/frontend/type-mapper.js +155 -9
  269. package/dist/frontend/type-mapper.js.map +1 -1
  270. package/dist/index.js +2 -1
  271. package/dist/index.js.map +1 -1
  272. package/dist/ir/analysis.d.ts +10 -0
  273. package/dist/ir/analysis.js +35 -0
  274. package/dist/ir/analysis.js.map +1 -1
  275. package/dist/ir/analysis.test.js +69 -1
  276. package/dist/ir/analysis.test.js.map +1 -1
  277. package/dist/ir/builtin-effects.js +72 -0
  278. package/dist/ir/builtin-effects.js.map +1 -1
  279. package/dist/ir/builtin-signatures.d.ts +1 -1
  280. package/dist/ir/builtin-signatures.js +238 -15
  281. package/dist/ir/builtin-signatures.js.map +1 -1
  282. package/dist/ir/capture-values.d.ts +107 -0
  283. package/dist/ir/capture-values.js +850 -0
  284. package/dist/ir/capture-values.js.map +1 -0
  285. package/dist/ir/capture-values.test.d.ts +1 -0
  286. package/dist/ir/capture-values.test.js +268 -0
  287. package/dist/ir/capture-values.test.js.map +1 -0
  288. package/dist/ir/field-values.d.ts +16 -0
  289. package/dist/ir/field-values.js +128 -0
  290. package/dist/ir/field-values.js.map +1 -0
  291. package/dist/ir/field-values.test.d.ts +1 -0
  292. package/dist/ir/field-values.test.js +160 -0
  293. package/dist/ir/field-values.test.js.map +1 -0
  294. package/dist/ir/final-fields.d.ts +4 -1
  295. package/dist/ir/final-fields.js +11 -3
  296. package/dist/ir/final-fields.js.map +1 -1
  297. package/dist/ir/function-references.test.js +1 -1
  298. package/dist/ir/function-references.test.js.map +1 -1
  299. package/dist/ir/init-only-globals.d.ts +16 -0
  300. package/dist/ir/init-only-globals.js +121 -0
  301. package/dist/ir/init-only-globals.js.map +1 -0
  302. package/dist/ir/init-only-globals.test.d.ts +1 -0
  303. package/dist/ir/init-only-globals.test.js +115 -0
  304. package/dist/ir/init-only-globals.test.js.map +1 -0
  305. package/dist/ir/initializer-bindings.d.ts +18 -1
  306. package/dist/ir/initializer-bindings.js +91 -1
  307. package/dist/ir/initializer-bindings.js.map +1 -1
  308. package/dist/ir/initializer-bindings.test.js +57 -2
  309. package/dist/ir/initializer-bindings.test.js.map +1 -1
  310. package/dist/ir/int32-slots.d.ts +22 -0
  311. package/dist/ir/int32-slots.js +376 -13
  312. package/dist/ir/int32-slots.js.map +1 -1
  313. package/dist/ir/int32-slots.test.js +91 -8
  314. package/dist/ir/int32-slots.test.js.map +1 -1
  315. package/dist/ir/integer-loop-facts.d.ts +19 -1
  316. package/dist/ir/integer-loop-facts.js +155 -7
  317. package/dist/ir/integer-loop-facts.js.map +1 -1
  318. package/dist/ir/integer-ranges.d.ts +8 -5
  319. package/dist/ir/integer-ranges.js +147 -55
  320. package/dist/ir/integer-ranges.js.map +1 -1
  321. package/dist/ir/integer-ranges.test.js +225 -7
  322. package/dist/ir/integer-ranges.test.js.map +1 -1
  323. package/dist/ir/ir.d.ts +29 -2
  324. package/dist/ir/ir.js +17 -0
  325. package/dist/ir/ir.js.map +1 -1
  326. package/dist/ir/property-bags.d.ts +14 -0
  327. package/dist/ir/property-bags.js +121 -0
  328. package/dist/ir/property-bags.js.map +1 -0
  329. package/dist/ir/receiver-readers.d.ts +21 -0
  330. package/dist/ir/receiver-readers.js +217 -0
  331. package/dist/ir/receiver-readers.js.map +1 -0
  332. package/dist/ir/runtime-features.d.ts +1 -0
  333. package/dist/ir/runtime-features.js +34 -2
  334. package/dist/ir/runtime-features.js.map +1 -1
  335. package/dist/ir/validate.js +221 -5
  336. package/dist/ir/validate.js.map +1 -1
  337. package/dist/ir/validate.test.js +21 -0
  338. package/dist/ir/validate.test.js.map +1 -1
  339. package/dist/library/int-infer.js +3 -0
  340. package/dist/library/int-infer.js.map +1 -1
  341. package/dist/library/ir-policy.js +1 -0
  342. package/dist/library/ir-policy.js.map +1 -1
  343. package/dist/native/cli.js +1 -0
  344. package/dist/native/cli.js.map +1 -1
  345. package/dist/native/compiler.js +1 -3
  346. package/dist/native/compiler.js.map +1 -1
  347. package/dist/native/prepare.js +1 -0
  348. package/dist/native/prepare.js.map +1 -1
  349. package/dist/native/sanitizer.test.js +1 -0
  350. package/dist/native/sanitizer.test.js.map +1 -1
  351. package/package.json +20 -20
  352. package/surface-manifest.json +896 -49
@@ -21,6 +21,7 @@ import { refreshDescriptorGuards } from "./class-descriptors.js";
21
21
  import { ClassConstructionDispatch } from "./class-construction.js";
22
22
  import { emitterRooted } from "./lower-event-emitter.js";
23
23
  import { protocolArm, protocolFieldArm } from "./class-protocol-dispatch.js";
24
+ import { STREAM_OPERATORS } from "./lower-stream.js";
24
25
  const STREAM_METHODS = new Set([
25
26
  "on",
26
27
  "addListener",
@@ -231,6 +232,45 @@ export function classPropertiesHelper(lowerer, loc, readOnly = false) {
231
232
  export function classForInHasKey(lowerer, value, key, loc) {
232
233
  const name = "%dyn.class.forInHasKey";
233
234
  if (!lowerer.liftedFns.some((fn) => fn.name === name)) {
235
+ // The read-only table: a recheck never creates an instance's table, which
236
+ // is undefined while the instance has no own dynamic properties.
237
+ const bagHas = "%dyn.class.forInBagHas";
238
+ const bag = varRef("bag", DYN, loc);
239
+ lowerer.liftedFns.push({
240
+ name: bagHas,
241
+ params: [
242
+ { localId: "bag", name: "bag", type: DYN },
243
+ { localId: "key", name: "key", type: STRING },
244
+ ],
245
+ returnType: BOOL,
246
+ locals: [
247
+ { id: "bag", name: "bag", type: DYN, mutable: false },
248
+ { id: "key", name: "key", type: STRING, mutable: false },
249
+ ],
250
+ body: [
251
+ {
252
+ kind: "if",
253
+ cond: { kind: "dynTest", test: "undefined", value: bag, type: BOOL, loc },
254
+ then: [
255
+ { kind: "return", value: { kind: "boolLit", value: false, type: BOOL, loc }, loc },
256
+ ],
257
+ else_: null,
258
+ loc,
259
+ },
260
+ {
261
+ kind: "return",
262
+ value: {
263
+ kind: "libCall",
264
+ fn: "dyn.hasKey",
265
+ args: [bag, varRef("key", STRING, loc)],
266
+ type: BOOL,
267
+ loc,
268
+ },
269
+ loc,
270
+ },
271
+ ],
272
+ loc,
273
+ });
234
274
  lowerer.liftedFns.push({
235
275
  name,
236
276
  params: [
@@ -249,12 +289,12 @@ export function classForInHasKey(lowerer, value, key, loc) {
249
289
  kind: "logical",
250
290
  op: "||",
251
291
  left: {
252
- kind: "libCall",
253
- fn: "dyn.hasKey",
292
+ kind: "call",
293
+ callee: bagHas,
254
294
  args: [
255
295
  {
256
296
  kind: "call",
257
- callee: classPropertiesHelper(lowerer, loc).name,
297
+ callee: classPropertiesHelper(lowerer, loc, true).name,
258
298
  args: [varRef("value", DYN, loc)],
259
299
  type: DYN,
260
300
  loc,
@@ -960,8 +1000,12 @@ export class ClassDynamicDispatch {
960
1000
  return [];
961
1001
  if (emitterRooted(lowerer, info) && EMITTER_METHODS.has(method))
962
1002
  return [info];
963
- if (info.builtinStream)
964
- return STREAM_METHODS.has(method) ? [info] : [];
1003
+ if (info.builtinStream) {
1004
+ return STREAM_METHODS.has(method) ||
1005
+ (STREAM_OPERATORS.has(method) && info.builtinStream !== "w")
1006
+ ? [info]
1007
+ : [];
1008
+ }
965
1009
  return findMethodOn(lowerer, info, method) || findGenericMethodOn(lowerer, info, method)
966
1010
  ? [info]
967
1011
  : [];
@@ -1365,6 +1409,17 @@ export class ClassDynamicDispatch {
1365
1409
  const numericKey = sourceKey.type.kind === "f64" ||
1366
1410
  (sourceKey.kind === "dynFrom" && sourceKey.value.type.kind === "f64") ||
1367
1411
  (sourceKey.kind === "toString" && sourceKey.operand.type.kind === "f64");
1412
+ // `value[i]` with a number `i`: the helper takes the number and
1413
+ // reads a dense checked array element directly, formatting the
1414
+ // property name only when that does not apply.
1415
+ const indexKey = computedRead &&
1416
+ !reflect &&
1417
+ !dynamicKey &&
1418
+ !computedRead.optional &&
1419
+ computedRead.key.kind === "toString" &&
1420
+ computedRead.key.operand.type.kind === "f64"
1421
+ ? computedRead.key
1422
+ : null;
1368
1423
  const key = JSON.stringify([
1369
1424
  !!computedWrite,
1370
1425
  computedRead?.optional ?? false,
@@ -1372,13 +1427,16 @@ export class ClassDynamicDispatch {
1372
1427
  probe,
1373
1428
  numericKey,
1374
1429
  reflect,
1430
+ !!indexKey,
1375
1431
  ]);
1376
1432
  let dispatch = this.computed.get(key);
1377
1433
  if (!dispatch) {
1378
1434
  const loc = expr.loc;
1379
1435
  const params = [
1380
1436
  { localId: "p.0", name: "value", type: DYN },
1381
- { localId: "p.key", name: "key", type: dynamicKey ? DYN : STRING },
1437
+ indexKey
1438
+ ? { localId: "p.index", name: "index", type: F64 }
1439
+ : { localId: "p.key", name: "key", type: dynamicKey ? DYN : STRING },
1382
1440
  ...(computedWrite ? [{ localId: "p.1", name: "stored", type: DYN }] : []),
1383
1441
  ...(reflect ? [{ localId: "p.reflectReceiver", name: "receiver", type: DYN }] : []),
1384
1442
  ];
@@ -1434,7 +1492,7 @@ export class ClassDynamicDispatch {
1434
1492
  type: p.type,
1435
1493
  mutable: false,
1436
1494
  })),
1437
- ...(dynamicKey
1495
+ ...(dynamicKey || indexKey
1438
1496
  ? [{ id: keyLocal, name: "key", type: STRING, mutable: false }]
1439
1497
  : []),
1440
1498
  ],
@@ -1447,6 +1505,9 @@ export class ClassDynamicDispatch {
1447
1505
  ]
1448
1506
  : [{ kind: "return", value: fallback, loc }],
1449
1507
  loc,
1508
+ ...(numericKey && computedRead && !reflect && !dynamicKey
1509
+ ? { fastRead: "index" }
1510
+ : {}),
1450
1511
  };
1451
1512
  if (dynamicKey)
1452
1513
  helper.body.unshift({
@@ -1570,13 +1631,81 @@ export class ClassDynamicDispatch {
1570
1631
  },
1571
1632
  loc,
1572
1633
  });
1634
+ if (indexKey) {
1635
+ // An integer index below a checked array's length names an
1636
+ // element (-0 included: its property name is "0"); dyn.arrLen
1637
+ // answers 0 for every other kind. Holes keep dyn.arrAt's
1638
+ // ordinary named lookup.
1639
+ const index = varRef("p.index", F64, loc);
1640
+ const elementRead = {
1641
+ kind: "if",
1642
+ cond: { kind: "libCall", fn: "number.isInteger", args: [index], type: BOOL, loc },
1643
+ then: [
1644
+ {
1645
+ kind: "if",
1646
+ cond: {
1647
+ kind: "bin",
1648
+ op: ">=",
1649
+ left: index,
1650
+ right: { kind: "numLit", value: 0, type: F64, loc },
1651
+ type: BOOL,
1652
+ loc,
1653
+ },
1654
+ then: [
1655
+ {
1656
+ kind: "if",
1657
+ cond: {
1658
+ kind: "bin",
1659
+ op: "<",
1660
+ left: index,
1661
+ right: {
1662
+ kind: "libCall",
1663
+ fn: "dyn.arrLen",
1664
+ args: [varRef("p.0", DYN, loc)],
1665
+ type: F64,
1666
+ loc,
1667
+ },
1668
+ type: BOOL,
1669
+ loc,
1670
+ },
1671
+ then: [
1672
+ {
1673
+ kind: "return",
1674
+ value: {
1675
+ kind: "libCall",
1676
+ fn: "dyn.arrAt",
1677
+ args: [varRef("p.0", DYN, loc), index],
1678
+ type: DYN,
1679
+ loc,
1680
+ },
1681
+ loc,
1682
+ },
1683
+ ],
1684
+ else_: null,
1685
+ loc,
1686
+ },
1687
+ ],
1688
+ else_: null,
1689
+ loc,
1690
+ },
1691
+ ],
1692
+ else_: null,
1693
+ loc,
1694
+ };
1695
+ helper.body.unshift(elementRead, {
1696
+ kind: "varDecl",
1697
+ localId: keyLocal,
1698
+ init: { ...indexKey, operand: index },
1699
+ loc,
1700
+ });
1701
+ }
1573
1702
  dispatch = {
1574
1703
  write: !!computedWrite,
1575
1704
  reflect,
1576
1705
  fn: helper,
1577
1706
  classes: new Set(),
1578
1707
  keyLocal,
1579
- branchIndex: dynamicKey ? 3 : 0,
1708
+ branchIndex: dynamicKey ? 3 : indexKey ? 2 : 0,
1580
1709
  dynamicKey,
1581
1710
  numericKey,
1582
1711
  probe,
@@ -1592,7 +1721,7 @@ export class ClassDynamicDispatch {
1592
1721
  args: reflect
1593
1722
  ? (reflectRead ?? reflectWrite).args
1594
1723
  : computedRead
1595
- ? [computedRead.value, computedRead.key]
1724
+ ? [computedRead.value, indexKey ? indexKey.operand : computedRead.key]
1596
1725
  : (computedWrite ?? computedProbe).args,
1597
1726
  type: dispatch.fn.returnType,
1598
1727
  loc: expr.loc,
@@ -1635,21 +1764,24 @@ export class ClassDynamicDispatch {
1635
1764
  loc,
1636
1765
  }
1637
1766
  : instanceBag;
1767
+ // A read compares the bag with the receiver and then reads it:
1768
+ // evaluate it once, so each read retains the receiver once.
1769
+ const bagRead = varRef("bag.0", DYN, loc);
1638
1770
  const fallback = read
1639
1771
  ? {
1640
1772
  kind: "ternary",
1641
1773
  cond: {
1642
1774
  kind: "dynScalarEq",
1643
- left: bag,
1775
+ left: bagRead,
1644
1776
  right: varRef("p.0", DYN, loc),
1645
1777
  type: BOOL,
1646
1778
  loc,
1647
1779
  },
1648
- then: { ...read, value: bag },
1780
+ then: { ...read, value: bagRead },
1649
1781
  else_: {
1650
1782
  kind: "libCall",
1651
1783
  fn: "dyn.bagGet",
1652
- args: [bag, read.key, varRef("p.0", DYN, loc)],
1784
+ args: [bagRead, read.key, varRef("p.0", DYN, loc)],
1653
1785
  type: DYN,
1654
1786
  loc,
1655
1787
  },
@@ -1661,18 +1793,24 @@ export class ClassDynamicDispatch {
1661
1793
  name: `%dyn.class.property.${this.properties.size}`,
1662
1794
  params,
1663
1795
  returnType: write ? VOID : DYN,
1664
- locals: params.map((p) => ({
1665
- id: p.localId,
1666
- name: p.name,
1667
- type: DYN,
1668
- mutable: false,
1669
- })),
1796
+ locals: [
1797
+ ...params.map((p) => ({
1798
+ id: p.localId,
1799
+ name: p.name,
1800
+ type: DYN,
1801
+ mutable: false,
1802
+ })),
1803
+ ...(read ? [{ id: "bag.0", name: "bag", type: DYN, mutable: false }] : []),
1804
+ ],
1670
1805
  body: write
1671
1806
  ? [
1672
1807
  { kind: "exprStmt", expr: fallback, loc },
1673
1808
  { kind: "return", value: null, loc },
1674
1809
  ]
1675
- : [{ kind: "return", value: fallback, loc }],
1810
+ : [
1811
+ { kind: "varDecl", localId: "bag.0", init: bag, loc },
1812
+ { kind: "return", value: fallback, loc },
1813
+ ],
1676
1814
  loc,
1677
1815
  };
1678
1816
  if (!write && name === "toString" && lowerer.classes.has("%Error")) {
@@ -2545,7 +2683,9 @@ export class ClassDynamicDispatch {
2545
2683
  ...dispatch.fn.params,
2546
2684
  { localId: "p.receiver", name: "receiver", type: receiverType },
2547
2685
  ];
2548
- if (dispatch.keyLocal !== "p.key")
2686
+ // A derived key (a dynamic key's string, or an index's name) is a
2687
+ // local of the dispatch helper; pass it along.
2688
+ if (!dispatch.fn.params.some((param) => param.localId === dispatch.keyLocal))
2549
2689
  params.push({ localId: dispatch.keyLocal, name: "key", type: STRING });
2550
2690
  const helper = {
2551
2691
  name: `%dyn.class.keys.${lowerer.liftedFns.length}`,
@@ -3261,6 +3401,25 @@ export class ClassDynamicDispatch {
3261
3401
  { kind: "return", value: null, loc },
3262
3402
  ];
3263
3403
  }
3404
+ // fs.ReadStream / fs.WriteStream's members (undefined on other
3405
+ // streams, as in Node).
3406
+ if (info.builtinStream !== undefined &&
3407
+ !write &&
3408
+ (name === "bytesRead" || name === "bytesWritten" || name === "pending" || name === "path")) {
3409
+ return [
3410
+ {
3411
+ kind: "return",
3412
+ value: {
3413
+ kind: "libCall",
3414
+ fn: "fs.fsStreamPropDyn",
3415
+ args: [receiver, { kind: "strLit", value: name, type: STRING, loc }],
3416
+ type: DYN,
3417
+ loc,
3418
+ },
3419
+ loc,
3420
+ },
3421
+ ];
3422
+ }
3264
3423
  if (info.builtinStream !== undefined && streamProperty(name)) {
3265
3424
  if (write)
3266
3425
  return [
@@ -3715,6 +3874,43 @@ export class ClassDynamicDispatch {
3715
3874
  type: method === "isPaused" ? BOOL : receiver.type,
3716
3875
  loc,
3717
3876
  });
3877
+ if (STREAM_OPERATORS.has(method) && info.builtinStream && info.builtinStream !== "w") {
3878
+ // The Readable operators over a checked-dynamic receiver: every
3879
+ // argument is already a checked value.
3880
+ const arg = (i) => incoming[i] ?? dynUndefinedExpr(loc);
3881
+ const readableT = { kind: "object", className: "%Readable" };
3882
+ const op = (fn, args, type) => ret({ kind: "libCall", fn: fn, args: [receiver, ...args], type, loc });
3883
+ switch (method) {
3884
+ case "map":
3885
+ return op("readable.opMap", [arg(0), arg(1)], readableT);
3886
+ case "filter":
3887
+ return op("readable.opFilter", [arg(0), arg(1)], readableT);
3888
+ case "flatMap":
3889
+ return op("readable.opFlatMap", [arg(0), arg(1)], readableT);
3890
+ case "drop":
3891
+ return op("readable.opDrop", [arg(0), arg(1)], readableT);
3892
+ case "take":
3893
+ return op("readable.opTake", [arg(0), arg(1)], readableT);
3894
+ case "toArray":
3895
+ return op("readable.opToArray", [arg(0)], { kind: "promise", inner: DYN });
3896
+ case "forEach":
3897
+ return op("readable.opForEach", [arg(0), arg(1)], { kind: "promise", inner: VOID });
3898
+ case "some":
3899
+ return op("readable.opSome", [arg(0), arg(1)], { kind: "promise", inner: BOOL });
3900
+ case "every":
3901
+ return op("readable.opEvery", [arg(0), arg(1)], { kind: "promise", inner: BOOL });
3902
+ case "find":
3903
+ return op("readable.opFind", [arg(0), arg(1)], { kind: "promise", inner: DYN });
3904
+ case "reduce":
3905
+ return op("readable.opReduce", [
3906
+ arg(0),
3907
+ arg(1),
3908
+ { kind: "boolLit", value: dispatch.source.args.length >= 2, type: BOOL, loc },
3909
+ arg(2),
3910
+ { kind: "numLit", value: 0, type: F64, loc },
3911
+ ], { kind: "promise", inner: DYN });
3912
+ }
3913
+ }
3718
3914
  if (method === "destroy" && (!incoming.length || incoming[0]?.kind === "unitLit"))
3719
3915
  return ret({
3720
3916
  kind: "libCall",