@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
@@ -10,6 +10,7 @@ import { lowerKeyObjectInstanceof } from "./builtins/key-object.js";
10
10
  import { STATS_TYPE_TESTS } from "./builtins/filesystem.js";
11
11
  import { threadsImportOf } from "../threads-import.js";
12
12
  import { experimentalImportOf, lifetimeRegionMemberOf } from "../experimental-import.js";
13
+ import { lowerInternTableProperty } from "./intern-tables.js";
13
14
  import { dynUndefinedExpr, nodeThrowExpr, numLit, strLit, varRef } from "../../ir/build.js";
14
15
  import { InternalCompilerError } from "../../errors.js";
15
16
  import { SYMBOL_T } from "../../ir/ir.js";
@@ -21,7 +22,9 @@ import { literalUnionArm } from "../union-discriminants.js";
21
22
  * comparisons, nullish coalescing and optional chains, conditions and
22
23
  * ToBoolean/ToString coercion helpers, and field/element reads and writes
23
24
  * (FieldTarget). */
25
+ import { isFsStreamMember, lowerFsStreamProperty } from "./builtins/fs-streams.js";
24
26
  import * as ts from "../ts7/adapter.js";
27
+ import { isZlibStreamMember, lowerZlibStreamBytesWritten } from "./builtins/compression.js";
25
28
  import { constituentTypes } from "../ts7/checker.js";
26
29
  import { dirname } from "node:path";
27
30
  import * as posix from "node:path/posix";
@@ -597,6 +600,7 @@ function lowerExprInner(lowerer, expr) {
597
600
  const sym = lowerer.resolveValueSymbol(expr);
598
601
  const projection = sym ? lowerer.staticCallables.get(sym) : undefined;
599
602
  if (projection?.kind === "promisified-exec-file" ||
603
+ projection?.kind === "promisified-exec" ||
600
604
  projection?.kind === "promisified-builtin") {
601
605
  lowerer.unsupported("SC1090", expr, `a promisified builtin as a value (call '${expr.text}' directly)`);
602
606
  }
@@ -861,6 +865,8 @@ function lowerExprInner(lowerer, expr) {
861
865
  lowerer.noLowering("publish (@scriptc/threads) as a value", expr, "call publish(value) directly");
862
866
  if (experimentalImportOf(lowerer.program, expr) === "LifetimeRegion")
863
867
  lowerer.noLowering("LifetimeRegion (@scriptc/experimental) as a value", expr, "construct regions with new LifetimeRegion()");
868
+ if (experimentalImportOf(lowerer.program, expr) === "InternTable")
869
+ lowerer.noLowering("InternTable (@scriptc/experimental) as a value", expr, 'open tables with new InternTable("name")');
864
870
  }
865
871
  {
866
872
  const bi = lowerer.builtinImportOf(expr);
@@ -1433,6 +1439,11 @@ function lowerExprInner(lowerer, expr) {
1433
1439
  if (member !== null)
1434
1440
  lowerer.noLowering(`LifetimeRegion.${member} (@scriptc/experimental) as a value`, expr, `call region.${member}(${member === "run" ? "fn" : ""}) directly`);
1435
1441
  }
1442
+ {
1443
+ const table = lowerInternTableProperty(lowerer, expr);
1444
+ if (table)
1445
+ return table;
1446
+ }
1436
1447
  // Expando statics may still be absent even when JS inference sees
1437
1448
  // the eventual assignment's scalar type. Preserve the checked value.
1438
1449
  const staticField = lowerStaticFieldRead(lowerer, expr);
@@ -4157,6 +4168,8 @@ export function lowerIntrinsicProperty(lowerer, expr) {
4157
4168
  const numberMember = lowerer.stdlibGlobalMember(expr, "Number");
4158
4169
  if (numberMember === "parseInt" || numberMember === "parseFloat")
4159
4170
  return lowerNumberParserValue(lowerer, numberMember, locOf(expr));
4171
+ if (lowerer.stdlibGlobalMember(expr, "Buffer") === "poolSize")
4172
+ return { kind: "libCall", fn: "buffer.poolSize", args: [], type: F64, loc: locOf(expr) };
4160
4173
  if (lowerer.stdlibGlobalMember(expr, "Buffer") === "isBuffer")
4161
4174
  return lowerCheckedPredicateValue(lowerer, "Buffer.isBuffer", "buffer", locOf(expr));
4162
4175
  if (lowerer.stdlibGlobalMember(expr, "Date") === "now")
@@ -6334,6 +6347,21 @@ function tupleLiteralIndex(node) {
6334
6347
  * change the target or the value used by the operator. The expression yields
6335
6348
  * the computed value before a typed array or Buffer coerces it for storage. */
6336
6349
  export function lowerElementCompound(lowerer, expr, op) {
6350
+ const lowered = lowerElementCompoundParts(lowerer, expr, op, false);
6351
+ if (!lowered.expr)
6352
+ throw new InternalCompilerError("a compound element value lowered to statements");
6353
+ return lowered.expr;
6354
+ }
6355
+ /** `a[i] op= rhs` in statement position: a string array append becomes the
6356
+ * canonical `a[i] = a[i] + rhs` store (receiver and index saved first),
6357
+ * which the backend appends in place; other forms keep the value path. */
6358
+ export function lowerElementCompoundStatement(lowerer, expr, op) {
6359
+ const lowered = lowerElementCompoundParts(lowerer, expr, op, true);
6360
+ if (lowered.stmts)
6361
+ return { kind: "block", body: lowered.stmts, loc: locOf(expr) };
6362
+ return { kind: "exprStmt", expr: lowered.expr, loc: locOf(expr) };
6363
+ }
6364
+ function lowerElementCompoundParts(lowerer, expr, op, statement) {
6337
6365
  const target = expr.left;
6338
6366
  fenceNodeModuleMutation(lowerer, target, "assignment");
6339
6367
  const loc = locOf(expr);
@@ -6368,7 +6396,7 @@ export function lowerElementCompound(lowerer, expr, op) {
6368
6396
  },
6369
6397
  loc,
6370
6398
  });
6371
- return { kind: "seqExpr", stmts, result: value, type: DYN, loc };
6399
+ return { expr: { kind: "seqExpr", stmts, result: value, type: DYN, loc }, stmts: null };
6372
6400
  }
6373
6401
  const receiverType = checked.type.kind === "array" || checked.type.kind === "bytes"
6374
6402
  ? checked.type
@@ -6426,6 +6454,27 @@ export function lowerElementCompound(lowerer, expr, op) {
6426
6454
  const valueType = elementType.kind === "union" && lowerer.armTag(elementType.unionId, UNDEFINED_T) >= 0
6427
6455
  ? lowerer.stripUndefinedArm(elementType)
6428
6456
  : elementType;
6457
+ if (statement &&
6458
+ op === "+" &&
6459
+ receiver.type.kind === "array" &&
6460
+ receiver.type.elem.kind === "string") {
6461
+ // Receiver, index, old element (read inside the concat), rhs, write.
6462
+ const appended = {
6463
+ kind: "strConcat",
6464
+ left: oldValue,
6465
+ right: lowerer.ensureString(rhs, expr.right),
6466
+ type: STRING,
6467
+ loc,
6468
+ };
6469
+ return {
6470
+ expr: null,
6471
+ stmts: [
6472
+ { kind: "varDecl", localId: receiverLocal.id, init: receiver, loc },
6473
+ { kind: "varDecl", localId: indexLocal.id, init: index, loc },
6474
+ { kind: "arraySet", arr: receiverRef(), index: indexRef(), value: appended, loc },
6475
+ ],
6476
+ };
6477
+ }
6429
6478
  let computed;
6430
6479
  if (op === "+" && valueType.kind === "string") {
6431
6480
  computed = {
@@ -6448,17 +6497,18 @@ export function lowerElementCompound(lowerer, expr, op) {
6448
6497
  }
6449
6498
  else if (valueType.kind === "dyn" && isJsSourceFile(expr.getSourceFile())) {
6450
6499
  const left = lowerer.coerceToExpected(oldRef(), DYN), right = lowerer.coerceToExpected(rhs, DYN);
6451
- const numeric = ["-", "*", "/", "%", "**"].includes(op);
6452
- computed = {
6453
- kind: "libCall",
6454
- fn: op === "+" ? "dyn.add" : numeric ? "dyn.arithmetic" : "dyn.bitwise",
6455
- args: op === "+" ? [left, right] : [left, right, strLit(op, loc)],
6456
- type: DYN,
6457
- loc,
6458
- };
6500
+ computed = dynCompoundValue(op, left, right, loc);
6501
+ }
6502
+ else if (rhs.type.kind === "dyn" &&
6503
+ receiver.type.kind === "array" &&
6504
+ lowerer.dynConvertible(oldValue.type) &&
6505
+ lowerer.dynConvertible(valueType)) {
6506
+ // An untyped right operand: the expanded `a[i] = a[i] op rhs`, checked
6507
+ // back into the element type.
6508
+ computed = lowerer.coerceInto(expr, dynCompoundValue(op, lowerer.coerceToExpected(oldRef(), DYN), lowerer.coerceToExpected(rhs, DYN), loc), valueType);
6459
6509
  }
6460
6510
  else {
6461
- lowerer.unsupported("SC1043", expr);
6511
+ compoundUnsupported(lowerer, expr, op, oldValue.type, rhs.type);
6462
6512
  }
6463
6513
  const resultLocal = lowerer.declareHiddenLocal("%compoundResult", computed.type);
6464
6514
  const resultRef = () => varRef(resultLocal.id, computed.type, loc);
@@ -6466,17 +6516,20 @@ export function lowerElementCompound(lowerer, expr, op) {
6466
6516
  ? arrayValueStore(lowerer, receiverRef(), indexRef(), resultRef(), receiver.type.elem, loc)
6467
6517
  : { kind: "bytesSet", arr: receiverRef(), index: indexRef(), value: resultRef(), loc };
6468
6518
  return {
6469
- kind: "seqExpr",
6470
- stmts: [
6471
- { kind: "varDecl", localId: receiverLocal.id, init: receiver, loc },
6472
- { kind: "varDecl", localId: indexLocal.id, init: index, loc },
6473
- { kind: "varDecl", localId: oldLocal.id, init: oldValue, loc },
6474
- { kind: "varDecl", localId: resultLocal.id, init: computed, loc },
6475
- write,
6476
- ],
6477
- result: resultRef(),
6478
- type: computed.type,
6479
- loc,
6519
+ expr: {
6520
+ kind: "seqExpr",
6521
+ stmts: [
6522
+ { kind: "varDecl", localId: receiverLocal.id, init: receiver, loc },
6523
+ { kind: "varDecl", localId: indexLocal.id, init: index, loc },
6524
+ { kind: "varDecl", localId: oldLocal.id, init: oldValue, loc },
6525
+ { kind: "varDecl", localId: resultLocal.id, init: computed, loc },
6526
+ write,
6527
+ ],
6528
+ result: resultRef(),
6529
+ type: computed.type,
6530
+ loc,
6531
+ },
6532
+ stmts: null,
6480
6533
  };
6481
6534
  }
6482
6535
  /** ToString of one stabilized `string[]` element read for `+=`: a missing
@@ -7468,7 +7521,7 @@ export function lowerPrefixUnary(lowerer, expr) {
7468
7521
  ? { kind: "dynCheck", value: raw, type: F64, loc }
7469
7522
  : lowerOptionalNumber(lowerer, raw, loc, expr.operand);
7470
7523
  if (operand.type.kind !== "f64")
7471
- lowerer.unsupported("SC1043", expr);
7524
+ operatorUnsupported(lowerer, expr, "-", [raw.type]);
7472
7525
  if (operand.kind === "numLit")
7473
7526
  return { ...operand, value: -operand.value, loc };
7474
7527
  return { kind: "unary", op: "-", operand, type: F64, loc };
@@ -7486,7 +7539,7 @@ export function lowerPrefixUnary(lowerer, expr) {
7486
7539
  }
7487
7540
  const operand = lowerOptionalNumber(lowerer, raw, loc, expr.operand);
7488
7541
  if (operand.type.kind !== "f64")
7489
- lowerer.unsupported("SC1043", expr);
7542
+ operatorUnsupported(lowerer, expr, "+", [raw.type]);
7490
7543
  return operand;
7491
7544
  }
7492
7545
  case ts.SyntaxKind.ExclamationToken: {
@@ -7515,7 +7568,7 @@ export function lowerPrefixUnary(lowerer, expr) {
7515
7568
  // otherwise numeric slot to the checked-dynamic tree.
7516
7569
  const operand = lowerOptionalNumber(lowerer, raw, loc, expr.operand);
7517
7570
  if (operand.type.kind !== "f64")
7518
- lowerer.unsupported("SC1043", expr);
7571
+ operatorUnsupported(lowerer, expr, "~", [raw.type]);
7519
7572
  return { kind: "unary", op: "~", operand, type: F64, loc };
7520
7573
  }
7521
7574
  case ts.SyntaxKind.PlusPlusToken:
@@ -7772,7 +7825,7 @@ export function lowerIncDecTarget(lowerer, expr, target, prefix) {
7772
7825
  };
7773
7826
  }
7774
7827
  if (target.type.kind !== "f64")
7775
- lowerer.unsupported("SC1043", expr);
7828
+ operatorUnsupported(lowerer, expr, op === "+" ? "++" : "--", [target.type]);
7776
7829
  return { kind: "incDec", op, prefix, localId: target.id, type: F64, loc };
7777
7830
  }
7778
7831
  /** Whether a lowered statement can live inside a seqExpr. These statements
@@ -7865,26 +7918,51 @@ export function lowerCompoundValueToTarget(lowerer, expr, compound, target) {
7865
7918
  if (numericRead.type.kind === "f64" && numericRhs.type.kind === "f64") {
7866
7919
  return lowerer.coerceInto(expr, { kind: "bin", op: compound, left: numericRead, right: numericRhs, type: F64, loc }, target.type);
7867
7920
  }
7921
+ // An untyped operand: exactly the expanded `x = x op rhs` — the runtime
7922
+ // operator on both values, then the checked conversion into the
7923
+ // target's declared type (a string result for a number target throws the
7924
+ // catchable TypeError, as the expanded assignment does).
7868
7925
  if ((target.type.kind === "dyn" || rhs.type.kind === "dyn") &&
7869
- isJsSourceFile(expr.getSourceFile())) {
7926
+ (isJsSourceFile(expr.getSourceFile()) ||
7927
+ (lowerer.dynConvertible(read.type) && lowerer.dynConvertible(rhs.type)))) {
7870
7928
  const left = lowerer.coerceInto(expr.left, read, DYN);
7871
7929
  const right = lowerer.coerceInto(expr.right, rhs, DYN);
7872
- const numeric = ["-", "*", "/", "%", "**"].includes(compound);
7873
- const computed = {
7874
- kind: "libCall",
7875
- fn: compound === "+" ? "dyn.add" : numeric ? "dyn.arithmetic" : "dyn.bitwise",
7876
- args: compound === "+"
7877
- ? [left, right]
7878
- : [left, right, { kind: "strLit", value: compound, type: STRING, loc }],
7879
- type: DYN,
7880
- loc,
7881
- };
7882
- return lowerer.coerceInto(expr, computed, target.type);
7930
+ return lowerer.coerceInto(expr, dynCompoundValue(compound, left, right, loc), target.type);
7883
7931
  }
7884
7932
  const bigint = bigintCompoundValue(compound, read, rhs, loc);
7885
7933
  if (bigint)
7886
7934
  return bigint;
7887
- lowerer.unsupported("SC1043", expr);
7935
+ compoundUnsupported(lowerer, expr, compound, read.type, rhs.type);
7936
+ }
7937
+ /** The runtime operator of a compound assignment over two checked-dynamic
7938
+ * operands (Node's ToPrimitive/ToNumeric order lives in the runtime). */
7939
+ function dynCompoundValue(op, left, right, loc) {
7940
+ const numeric = ["-", "*", "/", "%", "**"].includes(op);
7941
+ return {
7942
+ kind: "libCall",
7943
+ fn: op === "+" ? "dyn.add" : numeric ? "dyn.arithmetic" : "dyn.bitwise",
7944
+ args: op === "+" ? [left, right] : [left, right, strLit(op, loc)],
7945
+ type: DYN,
7946
+ loc,
7947
+ };
7948
+ }
7949
+ /** An operand type in an SC1043 message: checked-dynamic values (`any`,
7950
+ * `unknown`) are "untyped", everything else its quoted type. */
7951
+ function operandText(lowerer, t) {
7952
+ return t.kind === "dyn" ? "untyped" : `'${lowerer.fmt(t)}'`;
7953
+ }
7954
+ /** SC1043 for a compound assignment whose operand types have no lowering,
7955
+ * naming the operator and both types rather than the comparison wording. */
7956
+ function compoundUnsupported(lowerer, node, op, target, value) {
7957
+ lowerer.unsupported("SC1043", node, `compound '${op}=' assignments of ${operandText(lowerer, value)} values to ${operandText(lowerer, target)} targets`);
7958
+ }
7959
+ /** SC1043 for an arithmetic, unary or update operator whose operand types
7960
+ * have no lowering (comparisons keep the registry wording). */
7961
+ function operatorUnsupported(lowerer, node, op, operands) {
7962
+ const [first, second] = operands;
7963
+ lowerer.unsupported("SC1043", node, second === undefined
7964
+ ? `'${op}' operations on ${operandText(lowerer, first)} values`
7965
+ : `'${op}' operations on ${operandText(lowerer, first)} and ${operandText(lowerer, second)} values`);
7888
7966
  }
7889
7967
  /** Equality of two NaN-coded values (nan-coded-reads.ts), each of which may
7890
7968
  * stand for undefined and never holds a genuine NaN: Node's undefined equals
@@ -8773,7 +8851,7 @@ export function lowerBinary(lowerer, expr) {
8773
8851
  };
8774
8852
  }
8775
8853
  }
8776
- lowerer.unsupported("SC1043", expr);
8854
+ operatorUnsupported(lowerer, expr, "+", [left.type, right.type]);
8777
8855
  break;
8778
8856
  case ts.SyntaxKind.MinusToken:
8779
8857
  case ts.SyntaxKind.AsteriskToken:
@@ -8781,7 +8859,7 @@ export function lowerBinary(lowerer, expr) {
8781
8859
  case ts.SyntaxKind.PercentToken:
8782
8860
  case ts.SyntaxKind.AsteriskAsteriskToken: {
8783
8861
  if (!bothNum)
8784
- lowerer.unsupported("SC1043", expr);
8862
+ operatorUnsupported(lowerer, expr, ts.tokenToString(op) ?? "?", [left.type, right.type]);
8785
8863
  const binOp = op === ts.SyntaxKind.MinusToken
8786
8864
  ? "-"
8787
8865
  : op === ts.SyntaxKind.AsteriskToken
@@ -8811,7 +8889,7 @@ export function lowerBinary(lowerer, expr) {
8811
8889
  case ts.SyntaxKind.GreaterThanGreaterThanToken:
8812
8890
  case ts.SyntaxKind.GreaterThanGreaterThanGreaterThanToken: {
8813
8891
  if (!bothNum)
8814
- lowerer.unsupported("SC1043", expr);
8892
+ operatorUnsupported(lowerer, expr, ts.tokenToString(op) ?? "?", [left.type, right.type]);
8815
8893
  const bitOp = op === ts.SyntaxKind.AmpersandToken
8816
8894
  ? "&"
8817
8895
  : op === ts.SyntaxKind.BarToken
@@ -10524,10 +10602,12 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10524
10602
  if (left.type.kind === "union") {
10525
10603
  const unionId = left.type.unionId;
10526
10604
  const arms = lowerer.unions.get(unionId)?.arms;
10527
- // Ordinary records and scalar values do not carry a class prototype.
10528
- // Dynamic/opaque runtime objects keep their existing instanceof fences.
10605
+ // Ordinary records, arrays and scalar values do not carry a class
10606
+ // prototype (no program class extends Array). Dynamic/opaque runtime
10607
+ // objects keep their existing instanceof fences.
10529
10608
  if (arms?.every((arm) => arm.kind === "object" ||
10530
10609
  arm.kind === "record" ||
10610
+ arm.kind === "array" ||
10531
10611
  arm.kind === "f64" ||
10532
10612
  arm.kind === "string" ||
10533
10613
  arm.kind === "bool" ||
@@ -10586,6 +10666,10 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10586
10666
  }
10587
10667
  return { kind: "call", callee: helper, args: [left], type: BOOL, loc };
10588
10668
  }
10669
+ // A class arm could hold an instance: the test cannot be decided
10670
+ // statically.
10671
+ if (arms?.some((arm) => arm.kind === "object"))
10672
+ lowerer.unsupported("SC1090", expr, "'instanceof' on a union of class instances and values without a class prototype test");
10589
10673
  }
10590
10674
  if (left.type.kind !== "object") {
10591
10675
  return readsClassAfter(lowerer, target, expr.right, [{ kind: "exprStmt", expr: left, loc }], {
@@ -13134,7 +13218,7 @@ function lowerFieldCompoundValue(lowerer, access, op, rhsNode, loc) {
13134
13218
  ? { kind: "dynCheck", value: rhs, type: F64, loc: rhs.loc }
13135
13219
  : lowerOptionalNumber(lowerer, rhs, loc);
13136
13220
  if (numericRhs.type.kind !== "f64")
13137
- lowerer.unsupported("SC1043", access);
13221
+ compoundUnsupported(lowerer, access, op, F64, numericRhs.type);
13138
13222
  const value = save({ kind: "bin", op, left: cur, right: numericRhs, type: F64, loc }, "%compoundResult");
13139
13223
  const boxed = { kind: "dynFrom", value, type: DYN, loc };
13140
13224
  body.push({
@@ -13195,22 +13279,16 @@ function lowerFieldCompoundValue(lowerer, access, op, rhsNode, loc) {
13195
13279
  else if (bigintValue) {
13196
13280
  value = bigintValue;
13197
13281
  }
13198
- else if (target.fieldType.kind === "dyn" && isJsSourceFile(access.getSourceFile())) {
13199
- const numeric = ["-", "*", "/", "%", "**"].includes(op);
13200
- const left = lowerer.coerceToExpected(read, DYN);
13201
- const right = lowerer.coerceToExpected(rhs, DYN);
13202
- value = {
13203
- kind: "libCall",
13204
- fn: op === "+" ? "dyn.add" : numeric ? "dyn.arithmetic" : "dyn.bitwise",
13205
- args: op === "+"
13206
- ? [left, right]
13207
- : [left, right, { kind: "strLit", value: op, type: STRING, loc }],
13208
- type: DYN,
13209
- loc,
13210
- };
13282
+ else if ((target.fieldType.kind === "dyn" && isJsSourceFile(access.getSourceFile())) ||
13283
+ // An untyped right operand: the expanded `o.f = o.f op rhs`; the field
13284
+ // write below checks the result into the declared field type.
13285
+ (rhs.type.kind === "dyn" &&
13286
+ lowerer.dynConvertible(read.type) &&
13287
+ lowerer.dynConvertible(target.fieldType))) {
13288
+ value = dynCompoundValue(op, lowerer.coerceToExpected(read, DYN), lowerer.coerceToExpected(rhs, DYN), loc);
13211
13289
  }
13212
13290
  else {
13213
- lowerer.unsupported("SC1043", access);
13291
+ compoundUnsupported(lowerer, access, op, read.type, rhs.type);
13214
13292
  }
13215
13293
  if (storedString && rhs.type.kind === "string" && read.kind === "varRef" && appended !== null) {
13216
13294
  // The field gives up its value before the concat (no code runs in
@@ -13248,6 +13326,14 @@ function lowerStreamObjectProperty(lowerer, expr) {
13248
13326
  const info = lowerer.classes.get(recvT.className);
13249
13327
  if (!info || streamSidesOf(lowerer, info) === null)
13250
13328
  return null;
13329
+ if (expr.name.text === "bytesWritten" && isZlibStreamMember(lowerer, expr)) {
13330
+ return lowerZlibStreamBytesWritten(lowerer, expr);
13331
+ }
13332
+ if (isFsStreamMember(lowerer, expr)) {
13333
+ const member = lowerFsStreamProperty(lowerer, expr);
13334
+ if (member)
13335
+ return member;
13336
+ }
13251
13337
  return lowerStreamProperty(lowerer, expr, info);
13252
13338
  }
13253
13339
  /** The primitive-constructor closure (`String`/`Number`/`Boolean` as a