@scriptc/compiler 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (680) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +582 -78
  2. package/dist/backend/cycle-analysis.d.ts +2 -1
  3. package/dist/backend/cycle-analysis.js +4 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-mutability.d.ts +2 -1
  6. package/dist/backend/cycle-mutability.js +2 -2
  7. package/dist/backend/cycle-mutability.js.map +1 -1
  8. package/dist/backend/executable-features.js +4 -1
  9. package/dist/backend/executable-features.js.map +1 -1
  10. package/dist/backend/immutability.d.ts +2 -1
  11. package/dist/backend/immutability.js +2 -2
  12. package/dist/backend/immutability.js.map +1 -1
  13. package/dist/backend/library-pack.js +4 -0
  14. package/dist/backend/library-pack.js.map +1 -1
  15. package/dist/backend/llvm/alloc.d.ts +7 -3
  16. package/dist/backend/llvm/alloc.js +7 -4
  17. package/dist/backend/llvm/alloc.js.map +1 -1
  18. package/dist/backend/llvm/array-search.js +2 -1
  19. package/dist/backend/llvm/array-search.js.map +1 -1
  20. package/dist/backend/llvm/bytes-loop-versions.d.ts +23 -2
  21. package/dist/backend/llvm/bytes-loop-versions.js +115 -19
  22. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  23. package/dist/backend/llvm/bytes-loop-versions.test.js +131 -0
  24. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  25. package/dist/backend/llvm/classes.d.ts +72 -1
  26. package/dist/backend/llvm/classes.js +331 -45
  27. package/dist/backend/llvm/classes.js.map +1 -1
  28. package/dist/backend/llvm/classes.test.js +223 -16
  29. package/dist/backend/llvm/classes.test.js.map +1 -1
  30. package/dist/backend/llvm/common.d.ts +1 -3
  31. package/dist/backend/llvm/common.js +1 -3
  32. package/dist/backend/llvm/common.js.map +1 -1
  33. package/dist/backend/llvm/constant-callbacks.js +8 -4
  34. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  35. package/dist/backend/llvm/constant-callbacks.test.js +4 -4
  36. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  37. package/dist/backend/llvm/counted-loops.d.ts +4 -1
  38. package/dist/backend/llvm/counted-loops.js +62 -23
  39. package/dist/backend/llvm/counted-loops.js.map +1 -1
  40. package/dist/backend/llvm/dense-array-loops.d.ts +19 -16
  41. package/dist/backend/llvm/dense-array-loops.js +46 -10
  42. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  43. package/dist/backend/llvm/dense-array-loops.test.js +50 -14
  44. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  45. package/dist/backend/llvm/dyn.d.ts +25 -1
  46. package/dist/backend/llvm/dyn.js +331 -8
  47. package/dist/backend/llvm/dyn.js.map +1 -1
  48. package/dist/backend/llvm/emit-function.js +22 -6
  49. package/dist/backend/llvm/emit-function.js.map +1 -1
  50. package/dist/backend/llvm/emit-module.js +17 -11
  51. package/dist/backend/llvm/emit-module.js.map +1 -1
  52. package/dist/backend/llvm/emit-statements.d.ts +0 -23
  53. package/dist/backend/llvm/emit-statements.js +325 -25
  54. package/dist/backend/llvm/emit-statements.js.map +1 -1
  55. package/dist/backend/llvm/emitter.d.ts +141 -15
  56. package/dist/backend/llvm/emitter.js +537 -64
  57. package/dist/backend/llvm/emitter.js.map +1 -1
  58. package/dist/backend/llvm/expr-async.js +19 -0
  59. package/dist/backend/llvm/expr-async.js.map +1 -1
  60. package/dist/backend/llvm/expr-bytes.d.ts +5 -2
  61. package/dist/backend/llvm/expr-bytes.js +110 -40
  62. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  63. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  64. package/dist/backend/llvm/expr-calls.js +34 -22
  65. package/dist/backend/llvm/expr-calls.js.map +1 -1
  66. package/dist/backend/llvm/expr-containers.js +21 -5
  67. package/dist/backend/llvm/expr-containers.js.map +1 -1
  68. package/dist/backend/llvm/expr-control.js +2 -3
  69. package/dist/backend/llvm/expr-control.js.map +1 -1
  70. package/dist/backend/llvm/expr-dynamic.js +54 -6
  71. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  72. package/dist/backend/llvm/expr-primitives.js +26 -8
  73. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  74. package/dist/backend/llvm/expr-stream-bridges.js +38 -6
  75. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  76. package/dist/backend/llvm/expr-stream-callbacks.js +131 -35
  77. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  78. package/dist/backend/llvm/lib-dispatch.js +10 -0
  79. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  80. package/dist/backend/llvm/lib-filesystem.js +61 -0
  81. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  82. package/dist/backend/llvm/lib-http2.d.ts +4 -0
  83. package/dist/backend/llvm/lib-http2.js +20 -17
  84. package/dist/backend/llvm/lib-http2.js.map +1 -1
  85. package/dist/backend/llvm/lib-process.js +65 -14
  86. package/dist/backend/llvm/lib-process.js.map +1 -1
  87. package/dist/backend/llvm/lib-shared.js +53 -1
  88. package/dist/backend/llvm/lib-shared.js.map +1 -1
  89. package/dist/backend/llvm/lib-stream.js +65 -28
  90. package/dist/backend/llvm/lib-stream.js.map +1 -1
  91. package/dist/backend/llvm/lib-tls.js +23 -0
  92. package/dist/backend/llvm/lib-tls.js.map +1 -1
  93. package/dist/backend/llvm/local-array-reads.js +66 -45
  94. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  95. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  96. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  97. package/dist/backend/llvm/publish.d.ts +8 -1
  98. package/dist/backend/llvm/publish.js +64 -25
  99. package/dist/backend/llvm/publish.js.map +1 -1
  100. package/dist/backend/llvm/publish.test.js +3 -0
  101. package/dist/backend/llvm/publish.test.js.map +1 -1
  102. package/dist/backend/llvm/receivers.js +1 -1
  103. package/dist/backend/llvm/receivers.js.map +1 -1
  104. package/dist/backend/llvm/reference-writes.js +2 -0
  105. package/dist/backend/llvm/reference-writes.js.map +1 -1
  106. package/dist/backend/llvm/regex-matchers.js +161 -14
  107. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  108. package/dist/backend/llvm/regex-matchers.test.js +18 -0
  109. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  110. package/dist/backend/llvm/shapes.d.ts +9 -7
  111. package/dist/backend/llvm/shapes.js +12 -10
  112. package/dist/backend/llvm/shapes.js.map +1 -1
  113. package/dist/backend/llvm/string-lifetimes.test.js +2 -1
  114. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  115. package/dist/backend/llvm/string-reads.d.ts +3 -0
  116. package/dist/backend/llvm/string-reads.js +84 -0
  117. package/dist/backend/llvm/string-reads.js.map +1 -1
  118. package/dist/backend/llvm/wasm-modules.d.ts +6 -5
  119. package/dist/backend/llvm/wasm-modules.js +32 -9
  120. package/dist/backend/llvm/wasm-modules.js.map +1 -1
  121. package/dist/backend/mangle.d.ts +3 -0
  122. package/dist/backend/mangle.js +5 -0
  123. package/dist/backend/mangle.js.map +1 -1
  124. package/dist/backend/native/contracts.d.ts +22 -4
  125. package/dist/backend/native/executable.js +24 -8
  126. package/dist/backend/native/executable.js.map +1 -1
  127. package/dist/backend/native/library.js +1 -0
  128. package/dist/backend/native/library.js.map +1 -1
  129. package/dist/backend/native-codegen.d.ts +11 -6
  130. package/dist/backend/native-codegen.js +36 -9
  131. package/dist/backend/native-codegen.js.map +1 -1
  132. package/dist/backend/native-codegen.test.js +0 -23
  133. package/dist/backend/native-codegen.test.js.map +1 -1
  134. package/dist/backend/native-link-info-core.d.ts +14 -4
  135. package/dist/backend/native-link-info-core.js.map +1 -1
  136. package/dist/backend/optimization.d.ts +2 -2
  137. package/dist/backend/runtime-abi.d.ts +2 -2
  138. package/dist/backend/runtime-abi.js +2 -2
  139. package/dist/backend/runtime-pack-core.d.ts +1 -1
  140. package/dist/backend/runtime-pack-core.js +1 -1
  141. package/dist/backend/runtime-pack-core.js.map +1 -1
  142. package/dist/backend/runtime-pack-targets.test.js +4 -1
  143. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  144. package/dist/backend/runtime-pack.d.ts +0 -21
  145. package/dist/backend/runtime-pack.js +0 -29
  146. package/dist/backend/runtime-pack.js.map +1 -1
  147. package/dist/backend/runtime-pack.test.js +9 -69
  148. package/dist/backend/runtime-pack.test.js.map +1 -1
  149. package/dist/backend/target-diagnostics.js +31 -1
  150. package/dist/backend/target-diagnostics.js.map +1 -1
  151. package/dist/backend/warm-cache.js +3 -0
  152. package/dist/backend/warm-cache.js.map +1 -1
  153. package/dist/cli/command.js +26 -6
  154. package/dist/cli/command.js.map +1 -1
  155. package/dist/cli/usage.d.ts +5 -1
  156. package/dist/cli/usage.js +7 -2
  157. package/dist/cli/usage.js.map +1 -1
  158. package/dist/contracts/check.js +1 -1
  159. package/dist/contracts/check.js.map +1 -1
  160. package/dist/coverage/report.d.ts +7 -2
  161. package/dist/coverage/report.js +18 -0
  162. package/dist/coverage/report.js.map +1 -1
  163. package/dist/coverage/verdict-cache.d.ts +1 -0
  164. package/dist/coverage/verdict-cache.js +4 -0
  165. package/dist/coverage/verdict-cache.js.map +1 -1
  166. package/dist/coverage/verdict-semantic.js +4 -0
  167. package/dist/coverage/verdict-semantic.js.map +1 -1
  168. package/dist/diagnostics/diagnostic.js.map +1 -1
  169. package/dist/diagnostics/dynamic-tier.d.ts +40 -0
  170. package/dist/diagnostics/dynamic-tier.js +57 -0
  171. package/dist/diagnostics/dynamic-tier.js.map +1 -0
  172. package/dist/diagnostics/envelope.d.ts +2 -1
  173. package/dist/diagnostics/envelope.js +5 -2
  174. package/dist/diagnostics/envelope.js.map +1 -1
  175. package/dist/executable/executable-cache.d.ts +23 -1
  176. package/dist/executable/executable-cache.js +59 -7
  177. package/dist/executable/executable-cache.js.map +1 -1
  178. package/dist/executable/executable-cache.test.js +45 -3
  179. package/dist/executable/executable-cache.test.js.map +1 -1
  180. package/dist/executable/prepare.js +3 -1
  181. package/dist/executable/prepare.js.map +1 -1
  182. package/dist/frontend/analysis.js +1 -0
  183. package/dist/frontend/analysis.js.map +1 -1
  184. package/dist/frontend/dispose-hook.d.ts +2 -0
  185. package/dist/frontend/dispose-hook.js +14 -0
  186. package/dist/frontend/dispose-hook.js.map +1 -0
  187. package/dist/frontend/jsx-entities.d.ts +4 -0
  188. package/dist/frontend/jsx-entities.js +259 -0
  189. package/dist/frontend/jsx-entities.js.map +1 -0
  190. package/dist/frontend/jsx-source.d.ts +71 -0
  191. package/dist/frontend/jsx-source.js +781 -0
  192. package/dist/frontend/jsx-source.js.map +1 -0
  193. package/dist/frontend/jsx-source.test.d.ts +1 -0
  194. package/dist/frontend/jsx-source.test.js +200 -0
  195. package/dist/frontend/jsx-source.test.js.map +1 -0
  196. package/dist/frontend/literal-values.test.js +8 -9
  197. package/dist/frontend/literal-values.test.js.map +1 -1
  198. package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
  199. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  200. package/dist/frontend/lowering/array-values.js +3 -2
  201. package/dist/frontend/lowering/array-values.js.map +1 -1
  202. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  203. package/dist/frontend/lowering/binding-analysis.js +2 -2
  204. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  205. package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
  206. package/dist/frontend/lowering/builtins/arguments.js +30 -15
  207. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  208. package/dist/frontend/lowering/builtins/atomics.js +10 -6
  209. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  210. package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
  211. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  212. package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
  213. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  214. package/dist/frontend/lowering/builtins/crypto.d.ts +4 -2
  215. package/dist/frontend/lowering/builtins/crypto.js +59 -3
  216. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  217. package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
  218. package/dist/frontend/lowering/builtins/date-classes.js +477 -0
  219. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
  220. package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
  221. package/dist/frontend/lowering/builtins/dates.js +55 -26
  222. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  223. package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
  224. package/dist/frontend/lowering/builtins/dh.js +151 -0
  225. package/dist/frontend/lowering/builtins/dh.js.map +1 -0
  226. package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
  227. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  228. package/dist/frontend/lowering/builtins/ecdh.d.ts +12 -1
  229. package/dist/frontend/lowering/builtins/ecdh.js +7 -7
  230. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -1
  231. package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
  232. package/dist/frontend/lowering/builtins/errors.js +110 -0
  233. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  234. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
  235. package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
  236. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  237. package/dist/frontend/lowering/builtins/filesystem.js +6 -4
  238. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  239. package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
  240. package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
  241. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
  242. package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
  243. package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
  244. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
  245. package/dist/frontend/lowering/builtins/json.js +2 -1
  246. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  247. package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
  248. package/dist/frontend/lowering/builtins/key-object.js +20 -7
  249. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  250. package/dist/frontend/lowering/builtins/module-calls.js +11 -4
  251. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  252. package/dist/frontend/lowering/builtins/numbers.js +9 -5
  253. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  254. package/dist/frontend/lowering/builtins/operating-system.js +4 -3
  255. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  256. package/dist/frontend/lowering/builtins/performance.js +3 -2
  257. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  258. package/dist/frontend/lowering/builtins/process.js +3 -2
  259. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  260. package/dist/frontend/lowering/builtins/promises.js +3 -2
  261. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  262. package/dist/frontend/lowering/builtins/promisify-callback.js +2 -1
  263. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  264. package/dist/frontend/lowering/builtins/readline.d.ts +2 -1
  265. package/dist/frontend/lowering/builtins/readline.js +23 -6
  266. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  267. package/dist/frontend/lowering/builtins/strings.js +13 -5
  268. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  269. package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
  270. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  271. package/dist/frontend/lowering/builtins/timers.js +1 -1
  272. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  273. package/dist/frontend/lowering/builtins/url.js +4 -3
  274. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  275. package/dist/frontend/lowering/builtins/v8.js +2 -1
  276. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  277. package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
  278. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
  279. package/dist/frontend/lowering/call-arguments.js +2 -1
  280. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  281. package/dist/frontend/lowering/call-signatures.js +13 -6
  282. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  283. package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
  284. package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
  285. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
  286. package/dist/frontend/lowering/class-assertions.js +3 -2
  287. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  288. package/dist/frontend/lowering/class-construction.d.ts +2 -1
  289. package/dist/frontend/lowering/class-construction.js +8 -13
  290. package/dist/frontend/lowering/class-construction.js.map +1 -1
  291. package/dist/frontend/lowering/class-descriptors.js +1 -1
  292. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  293. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +34 -0
  294. package/dist/frontend/lowering/class-dynamic-dispatch.js +568 -151
  295. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  296. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +77 -0
  297. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  298. package/dist/frontend/lowering/class-method-mutations.js +3 -0
  299. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  300. package/dist/frontend/lowering/class-method-values.js +1 -1
  301. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  302. package/dist/frontend/lowering/class-protocols.d.ts +7 -0
  303. package/dist/frontend/lowering/class-protocols.js +64 -4
  304. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  305. package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
  306. package/dist/frontend/lowering/class-prototypes.js +36 -3
  307. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  308. package/dist/frontend/lowering/class-to-primitive.js +25 -5
  309. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  310. package/dist/frontend/lowering/class-unions.js +2 -1
  311. package/dist/frontend/lowering/class-unions.js.map +1 -1
  312. package/dist/frontend/lowering/coercions/function-adapters.js +6 -5
  313. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  314. package/dist/frontend/lowering/coercions/structural.js +8 -7
  315. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  316. package/dist/frontend/lowering/coercions/unions.js +8 -7
  317. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  318. package/dist/frontend/lowering/collection-ingestion.js +2 -1
  319. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  320. package/dist/frontend/lowering/containers/array-callbacks.d.ts +7 -0
  321. package/dist/frontend/lowering/containers/array-callbacks.js +14 -13
  322. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  323. package/dist/frontend/lowering/containers/array-concat.js +2 -1
  324. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  325. package/dist/frontend/lowering/containers/array-construction.js +25 -4
  326. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  327. package/dist/frontend/lowering/containers/array-methods.js +6 -5
  328. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  329. package/dist/frontend/lowering/containers/array-pipelines.js +2 -1
  330. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  331. package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
  332. package/dist/frontend/lowering/containers/bytes.js +129 -28
  333. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  334. package/dist/frontend/lowering/containers/callback-arguments.js +52 -2
  335. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  336. package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
  337. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  338. package/dist/frontend/lowering/containers/collection-methods.js +8 -7
  339. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  340. package/dist/frontend/lowering/containers/indexed-objects.js +8 -7
  341. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  342. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
  343. package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
  344. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  345. package/dist/frontend/lowering/containers/string-and-regexp.js +36 -9
  346. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  347. package/dist/frontend/lowering/containers/string-replacement.js +2 -1
  348. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  349. package/dist/frontend/lowering/cycle-initialization.js +25 -4
  350. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  351. package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
  352. package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
  353. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  354. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  355. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  356. package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
  357. package/dist/frontend/lowering/dispatch-sites.js +204 -0
  358. package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
  359. package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
  360. package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
  361. package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
  362. package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
  363. package/dist/frontend/lowering/dyn-streams.js +1 -1
  364. package/dist/frontend/lowering/dyn-streams.js.map +1 -1
  365. package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
  366. package/dist/frontend/lowering/dynamic-tier.js +327 -0
  367. package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
  368. package/dist/frontend/lowering/error-methods.js +4 -0
  369. package/dist/frontend/lowering/error-methods.js.map +1 -1
  370. package/dist/frontend/lowering/expressions/array-literals.js +15 -0
  371. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  372. package/dist/frontend/lowering/expressions/binary.js +45 -3
  373. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  374. package/dist/frontend/lowering/expressions/element-access.js +17 -1
  375. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  376. package/dist/frontend/lowering/expressions/identifiers.js +46 -7
  377. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  378. package/dist/frontend/lowering/expressions/narrowing.js +35 -5
  379. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  380. package/dist/frontend/lowering/expressions/object-literals.d.ts +0 -3
  381. package/dist/frontend/lowering/expressions/object-literals.js +27 -6
  382. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  383. package/dist/frontend/lowering/expressions/optional-chains.js +5 -5
  384. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  385. package/dist/frontend/lowering/expressions/property-access.d.ts +0 -4
  386. package/dist/frontend/lowering/expressions/property-access.js +99 -7
  387. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  388. package/dist/frontend/lowering/expressions/relational.js +63 -5
  389. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  390. package/dist/frontend/lowering/expressions/updates.js +63 -9
  391. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  392. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
  393. package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
  394. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  395. package/dist/frontend/lowering/generic-functions.d.ts +42 -1
  396. package/dist/frontend/lowering/generic-functions.js +448 -18
  397. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  398. package/dist/frontend/lowering/intern-tables.js +2 -1
  399. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  400. package/dist/frontend/lowering/iterator-adapters.js +9 -8
  401. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  402. package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
  403. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
  404. package/dist/frontend/lowering/json-require.js +2 -1
  405. package/dist/frontend/lowering/json-require.js.map +1 -1
  406. package/dist/frontend/lowering/key-order-witness.d.ts +7 -2
  407. package/dist/frontend/lowering/key-order-witness.js +21 -4
  408. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  409. package/dist/frontend/lowering/key-order-witness.test.js +38 -2
  410. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  411. package/dist/frontend/lowering/lifetime-regions.js +2 -1
  412. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  413. package/dist/frontend/lowering/lower-assert.js +6 -5
  414. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  415. package/dist/frontend/lowering/lower-async-iteration.js +3 -1
  416. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  417. package/dist/frontend/lowering/lower-calls.d.ts +4 -0
  418. package/dist/frontend/lowering/lower-calls.js +339 -91
  419. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  420. package/dist/frontend/lowering/lower-classes.d.ts +18 -0
  421. package/dist/frontend/lowering/lower-classes.js +280 -25
  422. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  423. package/dist/frontend/lowering/lower-dgram.js +3 -2
  424. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  425. package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
  426. package/dist/frontend/lowering/lower-event-emitter.js +267 -20
  427. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  428. package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
  429. package/dist/frontend/lowering/lower-exprs.js +116 -11
  430. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  431. package/dist/frontend/lowering/lower-functions.js +304 -72
  432. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  433. package/dist/frontend/lowering/lower-inspect.js +10 -6
  434. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  435. package/dist/frontend/lowering/lower-mixins.js +2 -1
  436. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  437. package/dist/frontend/lowering/lower-mock.js +2 -1
  438. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  439. package/dist/frontend/lowering/lower-modules.js +15 -5
  440. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  441. package/dist/frontend/lowering/lower-modules.test.js +2 -2
  442. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  443. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
  444. package/dist/frontend/lowering/lower-namespaces.js +4 -3
  445. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  446. package/dist/frontend/lowering/lower-server.d.ts +10 -0
  447. package/dist/frontend/lowering/lower-server.js +237 -59
  448. package/dist/frontend/lowering/lower-server.js.map +1 -1
  449. package/dist/frontend/lowering/lower-stdlib.js +12 -10
  450. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  451. package/dist/frontend/lowering/lower-stmts.js +168 -20
  452. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  453. package/dist/frontend/lowering/lower-stmts.test.js +1 -1
  454. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  455. package/dist/frontend/lowering/lower-stream.js +575 -165
  456. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  457. package/dist/frontend/lowering/lower-timers.js +4 -3
  458. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  459. package/dist/frontend/lowering/lowerer.d.ts +125 -28
  460. package/dist/frontend/lowering/lowerer.js +557 -63
  461. package/dist/frontend/lowering/lowerer.js.map +1 -1
  462. package/dist/frontend/lowering/lowerer.test.js +21 -9
  463. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  464. package/dist/frontend/lowering/narrowing-stability.js +5 -0
  465. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  466. package/dist/frontend/lowering/native-ffi.js +1 -1
  467. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  468. package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
  469. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
  470. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  471. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  472. package/dist/frontend/lowering/private-brands.d.ts +9 -0
  473. package/dist/frontend/lowering/private-brands.js +66 -15
  474. package/dist/frontend/lowering/private-brands.js.map +1 -1
  475. package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
  476. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  477. package/dist/frontend/lowering/require-initialization.js +2 -1
  478. package/dist/frontend/lowering/require-initialization.js.map +1 -1
  479. package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
  480. package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
  481. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  482. package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
  483. package/dist/frontend/lowering/runtime-optional-records.js +18 -5
  484. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  485. package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
  486. package/dist/frontend/lowering/site-dependencies.js +84 -0
  487. package/dist/frontend/lowering/site-dependencies.js.map +1 -0
  488. package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
  489. package/dist/frontend/lowering/site-dependencies.test.js +53 -0
  490. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
  491. package/dist/frontend/lowering/stable-names.d.ts +11 -0
  492. package/dist/frontend/lowering/stable-names.js +35 -0
  493. package/dist/frontend/lowering/stable-names.js.map +1 -0
  494. package/dist/frontend/lowering/static-typeof.d.ts +2 -2
  495. package/dist/frontend/lowering/static-typeof.js +42 -3
  496. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  497. package/dist/frontend/lowering/strict-equality.js +2 -1
  498. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  499. package/dist/frontend/lowering/structural-positions.d.ts +32 -0
  500. package/dist/frontend/lowering/structural-positions.js +108 -0
  501. package/dist/frontend/lowering/structural-positions.js.map +1 -0
  502. package/dist/frontend/lowering/surfaces.js +42 -26
  503. package/dist/frontend/lowering/surfaces.js.map +1 -1
  504. package/dist/frontend/lowering/var-hoisting.js +37 -3
  505. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  506. package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
  507. package/dist/frontend/npm-static-tsc-helpers.js +106 -0
  508. package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
  509. package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
  510. package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
  511. package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
  512. package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
  513. package/dist/frontend/npm-static-type-exports-host.js +214 -0
  514. package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
  515. package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
  516. package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
  517. package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
  518. package/dist/frontend/npm-static-type-exports.d.ts +52 -0
  519. package/dist/frontend/npm-static-type-exports.js +261 -0
  520. package/dist/frontend/npm-static-type-exports.js.map +1 -0
  521. package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
  522. package/dist/frontend/npm-static-type-exports.test.js +103 -0
  523. package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
  524. package/dist/frontend/npm-static-umd.d.ts +6 -0
  525. package/dist/frontend/npm-static-umd.js +203 -0
  526. package/dist/frontend/npm-static-umd.js.map +1 -0
  527. package/dist/frontend/npm-static-umd.test.d.ts +1 -0
  528. package/dist/frontend/npm-static-umd.test.js +105 -0
  529. package/dist/frontend/npm-static-umd.test.js.map +1 -0
  530. package/dist/frontend/npm-static.d.ts +8 -0
  531. package/dist/frontend/npm-static.js +47 -2
  532. package/dist/frontend/npm-static.js.map +1 -1
  533. package/dist/frontend/program.d.ts +13 -0
  534. package/dist/frontend/program.js +103 -6
  535. package/dist/frontend/program.js.map +1 -1
  536. package/dist/frontend/program.test.js +1 -1
  537. package/dist/frontend/program.test.js.map +1 -1
  538. package/dist/frontend/services.d.ts +6 -0
  539. package/dist/frontend/services.js +18 -0
  540. package/dist/frontend/services.js.map +1 -1
  541. package/dist/frontend/ts7/ast-node.d.ts +21 -7
  542. package/dist/frontend/ts7/ast-node.js +131 -29
  543. package/dist/frontend/ts7/ast-node.js.map +1 -1
  544. package/dist/frontend/ts7/ast-node.test.js +60 -0
  545. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  546. package/dist/frontend/ts7/ast-wire.d.ts +27 -2
  547. package/dist/frontend/ts7/ast-wire.js +124 -21
  548. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  549. package/dist/frontend/ts7/ast.d.ts +23 -2
  550. package/dist/frontend/ts7/ast.js +143 -2
  551. package/dist/frontend/ts7/ast.js.map +1 -1
  552. package/dist/frontend/ts7/checker.d.ts +13 -1
  553. package/dist/frontend/ts7/checker.js +75 -1
  554. package/dist/frontend/ts7/checker.js.map +1 -1
  555. package/dist/frontend/ts7/checker.test.js +9 -6
  556. package/dist/frontend/ts7/checker.test.js.map +1 -1
  557. package/dist/frontend/ts7/enums.d.ts +3 -3
  558. package/dist/frontend/ts7/enums.generated.d.ts +10 -0
  559. package/dist/frontend/ts7/enums.generated.js +21 -0
  560. package/dist/frontend/ts7/enums.generated.js.map +1 -1
  561. package/dist/frontend/ts7/enums.js +19 -0
  562. package/dist/frontend/ts7/enums.js.map +1 -1
  563. package/dist/frontend/ts7/program-host.js +5 -2
  564. package/dist/frontend/ts7/program-host.js.map +1 -1
  565. package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
  566. package/dist/frontend/ts7/semantic-checker.js +25 -20
  567. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  568. package/dist/frontend/ts7/semantic-json.d.ts +13 -0
  569. package/dist/frontend/ts7/semantic-json.js +146 -0
  570. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  571. package/dist/frontend/ts7/semantic-json.test.js +57 -1
  572. package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
  573. package/dist/frontend/ts7/semantic-model.d.ts +15 -0
  574. package/dist/frontend/ts7/semantic-model.js +67 -19
  575. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  576. package/dist/frontend/ts7/semantic-model.test.js +3 -2
  577. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  578. package/dist/frontend/ts7/session.js +1 -1
  579. package/dist/frontend/ts7/session.js.map +1 -1
  580. package/dist/frontend/tsc-codes.d.ts +1 -1
  581. package/dist/frontend/tsc-codes.js +7 -0
  582. package/dist/frontend/tsc-codes.js.map +1 -1
  583. package/dist/frontend/type-mapper.d.ts +38 -6
  584. package/dist/frontend/type-mapper.js +265 -32
  585. package/dist/frontend/type-mapper.js.map +1 -1
  586. package/dist/frontend/type-mapper.test.js +1 -1
  587. package/dist/frontend/type-mapper.test.js.map +1 -1
  588. package/dist/frontend-process-args.d.ts +4 -0
  589. package/dist/frontend-process-args.js +52 -0
  590. package/dist/frontend-process-args.js.map +1 -0
  591. package/dist/frontend-process-args.test.d.ts +1 -0
  592. package/dist/frontend-process-args.test.js +47 -0
  593. package/dist/frontend-process-args.test.js.map +1 -0
  594. package/dist/frontend-process.d.ts +1 -0
  595. package/dist/frontend-process.js +23 -0
  596. package/dist/frontend-process.js.map +1 -0
  597. package/dist/heap-collection.d.ts +16 -0
  598. package/dist/heap-collection.js +42 -0
  599. package/dist/heap-collection.js.map +1 -0
  600. package/dist/heap-collection.test.d.ts +1 -0
  601. package/dist/heap-collection.test.js +59 -0
  602. package/dist/heap-collection.test.js.map +1 -0
  603. package/dist/heap-pressure.d.ts +2 -0
  604. package/dist/heap-pressure.js +12 -0
  605. package/dist/heap-pressure.js.map +1 -0
  606. package/dist/index.d.ts +7 -0
  607. package/dist/index.js +402 -86
  608. package/dist/index.js.map +1 -1
  609. package/dist/ir/array-length-stability.js +7 -0
  610. package/dist/ir/array-length-stability.js.map +1 -1
  611. package/dist/ir/array-length-stability.test.js +25 -0
  612. package/dist/ir/array-length-stability.test.js.map +1 -1
  613. package/dist/ir/builtin-effects.js +28 -0
  614. package/dist/ir/builtin-effects.js.map +1 -1
  615. package/dist/ir/builtin-signatures.d.ts +5 -1
  616. package/dist/ir/builtin-signatures.js +141 -12
  617. package/dist/ir/builtin-signatures.js.map +1 -1
  618. package/dist/ir/final-fields.d.ts +2 -1
  619. package/dist/ir/final-fields.js +2 -2
  620. package/dist/ir/final-fields.js.map +1 -1
  621. package/dist/ir/function-references.test.js +2 -0
  622. package/dist/ir/function-references.test.js.map +1 -1
  623. package/dist/ir/int32-slots.d.ts +13 -5
  624. package/dist/ir/int32-slots.js +112 -115
  625. package/dist/ir/int32-slots.js.map +1 -1
  626. package/dist/ir/int32-slots.test.js +3 -1
  627. package/dist/ir/int32-slots.test.js.map +1 -1
  628. package/dist/ir/integer-loop-facts.d.ts +9 -4
  629. package/dist/ir/integer-loop-facts.js +93 -18
  630. package/dist/ir/integer-loop-facts.js.map +1 -1
  631. package/dist/ir/integer-loops.d.ts +49 -0
  632. package/dist/ir/integer-loops.js +193 -39
  633. package/dist/ir/integer-loops.js.map +1 -1
  634. package/dist/ir/integer-loops.test.js +201 -1
  635. package/dist/ir/integer-loops.test.js.map +1 -1
  636. package/dist/ir/integer-ranges.test.js +64 -0
  637. package/dist/ir/integer-ranges.test.js.map +1 -1
  638. package/dist/ir/ir.d.ts +17 -2
  639. package/dist/ir/ir.js +3 -1
  640. package/dist/ir/ir.js.map +1 -1
  641. package/dist/ir/runtime-features.d.ts +31 -7
  642. package/dist/ir/runtime-features.js +138 -11
  643. package/dist/ir/runtime-features.js.map +1 -1
  644. package/dist/ir/tiers.js +1 -0
  645. package/dist/ir/tiers.js.map +1 -1
  646. package/dist/ir/traverse.d.ts +2 -0
  647. package/dist/ir/traverse.js +14 -2
  648. package/dist/ir/traverse.js.map +1 -1
  649. package/dist/ir/validate.js +56 -16
  650. package/dist/ir/validate.js.map +1 -1
  651. package/dist/library/ir-policy.js +10 -0
  652. package/dist/library/ir-policy.js.map +1 -1
  653. package/dist/library/library-cache.d.ts +2 -0
  654. package/dist/library/library-cache.js.map +1 -1
  655. package/dist/library/prepare.js +2 -0
  656. package/dist/library/prepare.js.map +1 -1
  657. package/dist/native/cli.js +5 -0
  658. package/dist/native/cli.js.map +1 -1
  659. package/dist/native/prepare.js +5 -1
  660. package/dist/native/prepare.js.map +1 -1
  661. package/dist/native/sanitizer.test.js +4 -1
  662. package/dist/native/sanitizer.test.js.map +1 -1
  663. package/dist/startup-cache.d.ts +1 -0
  664. package/dist/startup-cache.js +1 -0
  665. package/dist/startup-cache.js.map +1 -1
  666. package/dist/text-parts.d.ts +7 -0
  667. package/dist/text-parts.js +44 -0
  668. package/dist/text-parts.js.map +1 -1
  669. package/dist/text-parts.test.d.ts +1 -0
  670. package/dist/text-parts.test.js +46 -0
  671. package/dist/text-parts.test.js.map +1 -0
  672. package/dist/timing.d.ts +9 -2
  673. package/dist/timing.js +7 -4
  674. package/dist/timing.js.map +1 -1
  675. package/dist/wasm/translate.d.ts +4 -0
  676. package/dist/wasm/translate.js +2 -2
  677. package/dist/wasm/translate.js.map +1 -1
  678. package/package.json +21 -21
  679. package/shims/undici/core/client.ts +4 -4
  680. package/surface-manifest.json +19 -49
@@ -93,15 +93,17 @@ test("loops that may resize, rebind or move storage keep the ordinary copy only"
93
93
  ]);
94
94
  expect([...rebound.arrays.keys()]).toEqual(["a"]);
95
95
  });
96
+ const counted = (fields) => ({
97
+ localId: "i",
98
+ guarded: false,
99
+ limitGuarded: false,
100
+ startGuarded: false,
101
+ guardLimit: 0,
102
+ followers: [],
103
+ ...fields,
104
+ });
96
105
  test("counted shapes need a non-negative counter strictly below the length", () => {
97
- const ascending = (limit, inclusive, min = 0) => countedDenseShape(loop([]), {
98
- localId: "i",
99
- start: num(min),
100
- limit,
101
- step: 1,
102
- inclusive,
103
- range: { min, max: 100 },
104
- });
106
+ const ascending = (limit, inclusive, min = 0) => countedDenseShape(loop([]), counted({ start: num(min), limit, step: 1, inclusive, range: { min, max: 100 } }));
105
107
  const minus = (offset) => ({
106
108
  kind: "bin",
107
109
  op: "-",
@@ -110,19 +112,53 @@ test("counted shapes need a non-negative counter strictly below the length", ()
110
112
  type: F64,
111
113
  loc,
112
114
  });
113
- expect(ascending(method("a", "length"), false)?.length.localId).toBe("a");
114
- expect(ascending(minus(1), true)?.length.localId).toBe("a");
115
+ expect(ascending(method("a", "length"), false)?.length?.localId).toBe("a");
116
+ expect(ascending(minus(1), true)?.length?.localId).toBe("a");
115
117
  expect(ascending(method("a", "length"), true)).toBeNull();
116
118
  expect(ascending(minus(1), false, -1)).toBeNull();
117
- const descending = (offset) => countedDenseShape(loop([]), {
118
- localId: "i",
119
+ // Another invariant limit bounds the counter itself; the entry test
120
+ // compares it with every indexed array's hole-free prefix.
121
+ const limited = ascending(ref("n"), false);
122
+ expect(limited?.length).toBeNull();
123
+ expect(limited?.limit?.limit).toEqual(ref("n"));
124
+ expect(ascending(ref("n"), false, -1)).toBeNull();
125
+ const descending = (offset) => countedDenseShape(loop([]), counted({
119
126
  start: minus(offset),
120
127
  limit: num(0),
121
128
  step: -1,
122
129
  inclusive: true,
123
130
  range: { min: 0, max: 100 },
124
- });
125
- expect(descending(1)?.length.localId).toBe("a");
131
+ }));
132
+ expect(descending(1)?.length?.localId).toBe("a");
126
133
  expect(descending(0)).toBeNull();
127
134
  });
135
+ test("a loop to another invariant limit covers each array whose length it keeps", () => {
136
+ const limited = {
137
+ counter: "i",
138
+ length: null,
139
+ limit: counted({
140
+ start: num(0),
141
+ limit: ref("n"),
142
+ step: 1,
143
+ inclusive: false,
144
+ range: { min: 0, max: 100 },
145
+ }),
146
+ range: { min: 0, max: 100 },
147
+ };
148
+ const matchLimited = (body, unaliased = new Set()) => matchDenseArrayLoop(loop(body), limited, locals, unaliased, new Set(["a", "b"]));
149
+ const copy = write("b", read("a"));
150
+ const dense = matchLimited([copy]);
151
+ expect([...dense.arrays.keys()].sort()).toEqual(["a", "b"]);
152
+ expect(dense.length).toBeNull();
153
+ expect(dense.limit?.limit).toEqual(ref("n"));
154
+ // An array the loop may resize is not covered; neither is one it may
155
+ // share storage with.
156
+ const resizing = [
157
+ { kind: "exprStmt", expr: read("a"), loc },
158
+ { kind: "exprStmt", expr: method("b", "getNumber", [ref("i")]), loc },
159
+ { kind: "exprStmt", expr: method("b", "push", [num(1)]), loc },
160
+ ];
161
+ expect([...matchLimited(resizing, new Set(["b"])).arrays.keys()]).toEqual(["a"]);
162
+ expect(matchLimited(resizing)).toBeNull();
163
+ });
128
164
  //# sourceMappingURL=dense-array-loops.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dense-array-loops.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/dense-array-loops.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dense-array-loops.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/dense-array-loops.test.ts"],"names":[],"mappings":"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"}
@@ -60,6 +60,8 @@ export declare class LlDyn {
60
60
  private readonly dynFuncThunks;
61
61
  private readonly dynFuncBoxes;
62
62
  private readonly dynFuncAdapters;
63
+ private readonly messageListeners;
64
+ private readonly messageReaders;
63
65
  private readonly promiseDynAdapters;
64
66
  private readonly mapDynOps;
65
67
  private dynToStrFn;
@@ -241,7 +243,8 @@ export declare class LlDyn {
241
243
  * inner typeKey. */
242
244
  private promiseDynAdapterHelper;
243
245
  /** Node's String() over a dyn value — sc_ds (+1 result) over the
244
- * recursive sc_ds_buf walker. Borrowed operand; never throws. */
246
+ * recursive sc_ds_buf walker. Borrowed operand; an exception that an
247
+ * object's toString or valueOf throws stays pending. */
245
248
  dynToStrHelper(): string;
246
249
  /** A catch binding flowing into an `unknown` slot: the typed→unknown
247
250
  * deep-copy stance over the exception snapshot's runtime kind. */
@@ -266,6 +269,27 @@ export declare class LlDyn {
266
269
  dynFuncBoxHelper(t: IrType & {
267
270
  kind: "func";
268
271
  }): string;
272
+ /** `sc_dml_<n>(ptr c, ptr message) -> i1`, the typed message entry of a
273
+ * closure registered as a 'message' listener (ScrDynMessageListener):
274
+ * builds the closure's parameter from the message's nodes and calls the
275
+ * closure. It answers false, without calling it, when the message does
276
+ * not have the parameter's exact layout, and the listener then runs
277
+ * through its thunk on the decoded message, as before. Null when the
278
+ * signature's parameter has no message reader (messageReadable). */
279
+ messageListenerHelper(t: IrType & {
280
+ kind: "func";
281
+ }): string | null;
282
+ /** Whether a message reader can build T: numbers, booleans and strings;
283
+ * records of them with only declared fields, none of union type; and
284
+ * boxed unions of those arms and null or undefined without a literal
285
+ * discriminator, with at most one number, boolean and string arm. */
286
+ private messageReadable;
287
+ /** `sc_dmr_<n>(ptr message, size node, ptr fail) -> T`: T (+1) built
288
+ * from a message node, for a type messageReadable accepts. Sets *fail
289
+ * and returns a dummy when the node does not have T's layout: the arm
290
+ * the checked conversion would choose, a record's declared keys in
291
+ * declaration order and no others. */
292
+ private messageReaderHelper;
269
293
  /** The adapter closure body for one TARGET signature: caps[0] is an
270
294
  * untraced obj-box owning the dyn function value. */
271
295
  dynFuncAdapterHelper(t: IrType & {
@@ -54,6 +54,14 @@ const DYN_HANDLE_BOX_FN = {
54
54
  const DYN_HANDLE_UNBOX_FN = {
55
55
  dgramSocket: "scr_dgram_from_dyn",
56
56
  };
57
+ /** ScrMessageKind (scr_message.h): the node kinds message readers test. */
58
+ const MESSAGE_KIND = {
59
+ UNDEFINED: 0,
60
+ NULL: 1,
61
+ BOOL: 2,
62
+ NUMBER: 3,
63
+ STRING: 4,
64
+ };
57
65
  export const DYN_KIND = {
58
66
  NULL: 0,
59
67
  BOOL: 1,
@@ -92,6 +100,8 @@ export class LlDyn {
92
100
  dynFuncThunks = new Map();
93
101
  dynFuncBoxes = new Map();
94
102
  dynFuncAdapters = new Map();
103
+ messageListeners = new Map();
104
+ messageReaders = new Map();
95
105
  promiseDynAdapters = new Map();
96
106
  mapDynOps = new Map();
97
107
  dynToStrFn = null;
@@ -2805,7 +2815,8 @@ export class LlDyn {
2805
2815
  }
2806
2816
  /* ── the dyn ToString pair (dynToStrHelper, ported) ────────────────── */
2807
2817
  /** Node's String() over a dyn value — sc_ds (+1 result) over the
2808
- * recursive sc_ds_buf walker. Borrowed operand; never throws. */
2818
+ * recursive sc_ds_buf walker. Borrowed operand; an exception that an
2819
+ * object's toString or valueOf throws stays pending. */
2809
2820
  dynToStrHelper() {
2810
2821
  if (this.dynToStrFn)
2811
2822
  return this.dynToStrFn;
@@ -2909,9 +2920,9 @@ export class LlDyn {
2909
2920
  B.startBlock(labels.get(DYN_KIND.ARR));
2910
2921
  {
2911
2922
  // Array.prototype.toString: join(",") — null/undefined ELEMENTS
2912
- // print empty (unlike top level), nested arrays flatten.
2923
+ // print empty (unlike top level), nested arrays flatten. The length
2924
+ // is read once, as join reads it.
2913
2925
  const n = this.lenOf(B, "%d");
2914
- const items = this.itemsOf(B, "%d");
2915
2926
  this.i64Loop(B, "ds.ar", n, (i, brNext) => {
2916
2927
  const nz = B.tmp();
2917
2928
  B.line(`${nz} = icmp ugt ${this.S} ${i}, 0`);
@@ -2922,7 +2933,22 @@ export class LlDyn {
2922
2933
  B.line(`call void @scr_jb_putc(ptr %b, i8 44)`);
2923
2934
  B.br(lel);
2924
2935
  B.startBlock(lel);
2925
- const e = this.itemAt(B, items, i);
2936
+ // Each index reads the element as join does (scr_dyn_arr_at, +1):
2937
+ // from the current storage, undefined past the current length,
2938
+ // and through the prototype for a hole. An element's toString
2939
+ // can append to, shrink or reallocate the array; a getter that
2940
+ // throws answers NULL with the exception pending.
2941
+ host.declare(`declare ptr @scr_dyn_arr_at(ptr, double)`);
2942
+ host.declare(`declare void @scr_dyn_release_v(ptr)`);
2943
+ const index = B.tmp();
2944
+ B.line(`${index} = uitofp ${this.S} ${i} to double`);
2945
+ const e = B.tmp();
2946
+ B.line(`${e} = call ptr @scr_dyn_arr_at(ptr %d, double ${index})`);
2947
+ const missing = B.tmp();
2948
+ B.line(`${missing} = icmp eq ptr ${e}, null`);
2949
+ const lGot = B.newLabel("ds.gt");
2950
+ B.condBr(missing, done, lGot);
2951
+ B.startBlock(lGot);
2926
2952
  const ek = this.kindOf(B, e);
2927
2953
  const isU = B.tmp();
2928
2954
  const isN = B.tmp();
@@ -2930,20 +2956,31 @@ export class LlDyn {
2930
2956
  B.line(`${isU} = icmp eq i32 ${ek}, ${DYN_KIND.UNDEF}`);
2931
2957
  B.line(`${isN} = icmp eq i32 ${ek}, ${DYN_KIND.NULL}`);
2932
2958
  B.line(`${unit} = or i1 ${isU}, ${isN}`);
2933
- const lSkip = B.newLabel("ds.sk");
2934
2959
  const lRec = B.newLabel("ds.rc");
2960
+ const lSkip = B.newLabel("ds.sk");
2935
2961
  B.condBr(unit, lSkip, lRec);
2936
2962
  B.startBlock(lSkip);
2963
+ B.line(`call void @scr_dyn_release_v(ptr ${e})`);
2937
2964
  brNext();
2938
2965
  B.startBlock(lRec);
2939
2966
  B.line(`call void @sc_ds_buf(ptr %b, ptr ${e})`);
2967
+ B.line(`call void @scr_dyn_release_v(ptr ${e})`);
2968
+ // The first exception an element's conversion throws ends the
2969
+ // conversion; later elements are not read.
2970
+ const thrown = B.tmp();
2971
+ for (const line of host.pendingTestLines(thrown))
2972
+ B.line(line.trimStart());
2973
+ const lMore = B.newLabel("ds.mo");
2974
+ B.condBr(thrown, done, lMore);
2975
+ B.startBlock(lMore);
2940
2976
  });
2941
2977
  B.br(done);
2942
2978
  }
2943
2979
  B.startBlock(labels.get(DYN_KIND.OBJ));
2944
2980
  {
2945
2981
  // The checked-dynamic tree's error encoding renders Error.prototype.toString;
2946
- // plain objects are "[object Object]".
2982
+ // other objects convert with ToPrimitive's string hint: a toString or
2983
+ // valueOf of their own or of their prototypes, else "[object Object]".
2947
2984
  const marker = this.objGetLit(B, "%d", "%error");
2948
2985
  const isErr = B.tmp();
2949
2986
  B.line(`${isErr} = icmp ne ptr ${marker}, null`);
@@ -2951,8 +2988,21 @@ export class LlDyn {
2951
2988
  const lPlain = B.newLabel("ds.pl");
2952
2989
  B.condBr(isErr, lErr, lPlain);
2953
2990
  B.startBlock(lPlain);
2954
- this.puts(B, "%b", "[object Object]");
2955
- B.br(done);
2991
+ {
2992
+ // Null leaves the exception the conversion threw pending.
2993
+ host.declare(`declare ptr @scr_dyn_string_coerce_js(ptr)`);
2994
+ host.declare(`declare void @scr_str_release(ptr)`);
2995
+ const text = B.tmp();
2996
+ B.line(`${text} = call ptr @scr_dyn_string_coerce_js(ptr %d)`);
2997
+ const converted = B.tmp();
2998
+ B.line(`${converted} = icmp ne ptr ${text}, null`);
2999
+ const lPut = B.newLabel("ds.pp");
3000
+ B.condBr(converted, lPut, done);
3001
+ B.startBlock(lPut);
3002
+ this.putScrStr(B, "%b", text);
3003
+ B.line(`call void @scr_str_release(ptr ${text})`);
3004
+ B.br(done);
3005
+ }
2956
3006
  B.startBlock(lErr);
2957
3007
  // Error.prototype.toString, reading name and message through the
2958
3008
  // prototype. Null leaves the exception its conversion threw pending.
@@ -4049,6 +4099,279 @@ export class LlDyn {
4049
4099
  this.defs.push(`define internal ptr @${name}(ptr %v, ptr %fname) ${FN_ATTRS} { ; box ${key} into dyn`, `entry:`, ` %c = call ptr @scr_closure_retain_v(ptr %v)`, ` %r = call ptr @scr_dyn_new_func(ptr %c, ptr @${thunk}, i32 ${t.params.length - (t.restAbi === "typed" ? 1 : 0)}, ptr ${sigLit}, ptr %fname)`, ` ret ptr %r`, `}`, ``);
4050
4100
  return name;
4051
4101
  }
4102
+ /** `sc_dml_<n>(ptr c, ptr message) -> i1`, the typed message entry of a
4103
+ * closure registered as a 'message' listener (ScrDynMessageListener):
4104
+ * builds the closure's parameter from the message's nodes and calls the
4105
+ * closure. It answers false, without calling it, when the message does
4106
+ * not have the parameter's exact layout, and the listener then runs
4107
+ * through its thunk on the decoded message, as before. Null when the
4108
+ * signature's parameter has no message reader (messageReadable). */
4109
+ messageListenerHelper(t) {
4110
+ const key = typeKey(t);
4111
+ const existing = this.messageListeners.get(key);
4112
+ if (existing !== undefined)
4113
+ return existing;
4114
+ const param = t.params[0];
4115
+ const supported = t.params.length === 1 &&
4116
+ t.rest !== true &&
4117
+ param !== undefined &&
4118
+ (t.ret.kind === "void" || t.ret.kind === "f64" || t.ret.kind === "bool") &&
4119
+ this.messageReadable(param, new Set());
4120
+ if (!supported) {
4121
+ this.messageListeners.set(key, null);
4122
+ return null;
4123
+ }
4124
+ const name = `sc_dml_${this.messageListeners.size}`;
4125
+ this.messageListeners.set(key, name);
4126
+ const B = new BlockBuilder();
4127
+ B.entryAllocas.push(`%fail = alloca i1`);
4128
+ B.line(`store i1 false, ptr %fail`);
4129
+ const value = B.tmp();
4130
+ B.line(`${value} = call ${this.valTy(param)} @${this.messageReaderHelper(param)}(ptr %m, ${this.host.sizeType} 0, ptr %fail)`);
4131
+ const failed = B.tmp();
4132
+ B.line(`${failed} = load i1, ptr %fail`);
4133
+ const lMiss = B.newLabel("dml.miss");
4134
+ const lCall = B.newLabel("dml.call");
4135
+ B.condBr(failed, lMiss, lCall);
4136
+ B.startBlock(lMiss);
4137
+ B.terminate(`ret i1 false`);
4138
+ B.startBlock(lCall);
4139
+ // The closure consumes its parameter; a pending exception stays for
4140
+ // the emitter, as after the thunk.
4141
+ const fnp = B.tmp();
4142
+ const fn = B.tmp();
4143
+ B.line(`${fnp} = getelementptr inbounds %ScrClosure, ptr %c, i64 0, i32 1`);
4144
+ B.line(`${fn} = load ptr, ptr ${fnp}`);
4145
+ const args = `ptr %c, ${this.valTy(param)} ${value}`;
4146
+ if (t.ret.kind === "void")
4147
+ B.line(`call void ${fn}(${args})`);
4148
+ else
4149
+ B.line(`${B.tmp()} = call ${this.valTy(t.ret)} ${fn}(${args})`);
4150
+ B.terminate(`ret i1 true`);
4151
+ this.defs.push(`define internal zeroext i1 @${name}(ptr %c, ptr %m) ${FN_ATTRS} { ; message entry for ${llvmCommentText(key)}`, B.render(), `}`, ``);
4152
+ return name;
4153
+ }
4154
+ /** Whether a message reader can build T: numbers, booleans and strings;
4155
+ * records of them with only declared fields, none of union type; and
4156
+ * boxed unions of those arms and null or undefined without a literal
4157
+ * discriminator, with at most one number, boolean and string arm. */
4158
+ messageReadable(t, seen) {
4159
+ switch (t.kind) {
4160
+ case "f64":
4161
+ case "bool":
4162
+ case "string":
4163
+ return true;
4164
+ case "record": {
4165
+ const shape = this.host.recordsById.get(t.shapeId);
4166
+ if (!shape || shape.tuple || shape.indexValue || shape.fields.length === 0)
4167
+ return false;
4168
+ if (seen.has(t.shapeId) || this.isRecursiveShape(t))
4169
+ return false;
4170
+ seen.add(t.shapeId);
4171
+ const readable = shape.fields.every((f) => !f.name.startsWith("%") &&
4172
+ f.type.kind !== "union" &&
4173
+ llFieldType(f.type, this.host.inlineUnions.record(f.type)) !== INLINE_UNION_FIELD &&
4174
+ this.messageReadable(f.type, seen));
4175
+ seen.delete(t.shapeId);
4176
+ return readable;
4177
+ }
4178
+ case "union": {
4179
+ const def = this.host.unionsById.get(t.unionId);
4180
+ // A discriminated union's checked conversion also tests the arm's
4181
+ // literal discriminator, which the readers do not.
4182
+ if (!def || def.discriminant || this.host.nullableUnions.has(t.unionId))
4183
+ return false;
4184
+ const scalars = new Set();
4185
+ for (const arm of def.arms) {
4186
+ if (arm.kind === "nullT" || arm.kind === "undefinedT")
4187
+ continue;
4188
+ if (arm.kind === "f64" || arm.kind === "bool" || arm.kind === "string") {
4189
+ if (scalars.has(arm.kind))
4190
+ return false;
4191
+ scalars.add(arm.kind);
4192
+ continue;
4193
+ }
4194
+ if (arm.kind !== "record" || !this.messageReadable(arm, seen))
4195
+ return false;
4196
+ }
4197
+ return true;
4198
+ }
4199
+ default:
4200
+ return false;
4201
+ }
4202
+ }
4203
+ /** `sc_dmr_<n>(ptr message, size node, ptr fail) -> T`: T (+1) built
4204
+ * from a message node, for a type messageReadable accepts. Sets *fail
4205
+ * and returns a dummy when the node does not have T's layout: the arm
4206
+ * the checked conversion would choose, a record's declared keys in
4207
+ * declaration order and no others. */
4208
+ messageReaderHelper(t) {
4209
+ const key = typeKey(t);
4210
+ const existing = this.messageReaders.get(key);
4211
+ if (existing)
4212
+ return existing;
4213
+ const name = `sc_dmr_${this.messageReaders.size}`;
4214
+ this.messageReaders.set(key, name);
4215
+ const host = this.host;
4216
+ const S = host.sizeType;
4217
+ if (t.kind !== "record")
4218
+ host.declare(`declare i32 @scr_message_kind(ptr, ${S})`);
4219
+ const retTy = this.valTy(t);
4220
+ const dummy = retTy === "double" ? f64Lit(0) : retTy === "i1" ? "false" : "null";
4221
+ const B = new BlockBuilder();
4222
+ const lFail = B.newLabel("dmr.fail");
4223
+ // scr_message_fields tests a record's kind itself.
4224
+ const kind = B.tmp();
4225
+ if (t.kind !== "record")
4226
+ B.line(`${kind} = call i32 @scr_message_kind(ptr %m, ${S} %n)`);
4227
+ const requireKind = (want) => {
4228
+ const ok = B.tmp();
4229
+ B.line(`${ok} = icmp eq i32 ${kind}, ${want}`);
4230
+ const lOk = B.newLabel("dmr.kind");
4231
+ B.condBr(ok, lOk, lFail);
4232
+ B.startBlock(lOk);
4233
+ };
4234
+ switch (t.kind) {
4235
+ case "f64":
4236
+ case "bool": {
4237
+ host.declare(`declare double @scr_message_number(ptr, ${S})`);
4238
+ requireKind(t.kind === "f64" ? MESSAGE_KIND.NUMBER : MESSAGE_KIND.BOOL);
4239
+ const n = B.tmp();
4240
+ B.line(`${n} = call double @scr_message_number(ptr %m, ${S} %n)`);
4241
+ if (t.kind === "f64")
4242
+ B.terminate(`ret double ${n}`);
4243
+ else {
4244
+ const b = B.tmp();
4245
+ B.line(`${b} = fcmp une double ${n}, ${f64Lit(0)}`);
4246
+ B.terminate(`ret i1 ${b}`);
4247
+ }
4248
+ break;
4249
+ }
4250
+ case "string": {
4251
+ host.declare(`declare ptr @scr_message_string(ptr, ${S})`);
4252
+ requireKind(MESSAGE_KIND.STRING);
4253
+ const str = B.tmp();
4254
+ B.line(`${str} = call ptr @scr_message_string(ptr %m, ${S} %n)`);
4255
+ B.terminate(`ret ptr ${str}`);
4256
+ break;
4257
+ }
4258
+ case "record": {
4259
+ const shape = host.recordsById.get(t.shapeId);
4260
+ const order = recordSourceFieldOrder(shape);
4261
+ const fields = new Map(shape.fields.map((f, i) => [f.name, { field: f, index: i }]));
4262
+ const base = host.nullableUnions.fieldBase(t.shapeId);
4263
+ const struct = mangleRecordStruct(t.shapeId);
4264
+ const names = this.recordNameTable(t.shapeId, shape);
4265
+ host.declare(`declare zeroext i1 @scr_message_fields(ptr, ${S}, ptr, ptr, ${S}, ptr)`);
4266
+ B.entryAllocas.push(`%kids = alloca [${order.length} x ${S}]`);
4267
+ const matched = B.tmp();
4268
+ B.line(`${matched} = call zeroext i1 @scr_message_fields(ptr %m, ${S} %n, ptr ${names.names}, ptr ${names.lens}, ${S} ${order.length}, ptr %kids)`);
4269
+ const lBuild = B.newLabel("dmr.build");
4270
+ B.condBr(matched, lBuild, lFail);
4271
+ B.startBlock(lBuild);
4272
+ B.line(`%r0 = call ptr @${mangleRecordNew(t.shapeId)}()`);
4273
+ order.forEach((fieldName, i) => {
4274
+ const { field, index } = fields.get(fieldName);
4275
+ const kidp = B.tmp();
4276
+ const kid = B.tmp();
4277
+ B.line(`${kidp} = getelementptr inbounds [${order.length} x ${S}], ptr %kids, i64 0, i64 ${i}`);
4278
+ B.line(`${kid} = load ${S}, ptr ${kidp}`);
4279
+ const v = B.tmp();
4280
+ B.line(`${v} = call ${this.valTy(field.type)} @${this.messageReaderHelper(field.type)}(ptr %m, ${S} ${kid}, ptr %fail)`);
4281
+ const failed = B.tmp();
4282
+ B.line(`${failed} = load i1, ptr %fail`);
4283
+ const lDrop = B.newLabel("dmr.drop");
4284
+ const lStore = B.newLabel("dmr.store");
4285
+ B.condBr(failed, lDrop, lStore);
4286
+ B.startBlock(lDrop);
4287
+ B.line(`call void ${releaseSym(host, t)}(ptr %r0)`);
4288
+ B.terminate(`ret ptr null`);
4289
+ B.startBlock(lStore);
4290
+ const p = B.tmp();
4291
+ B.line(`${p} = getelementptr inbounds %${struct}, ptr %r0, i64 0, i32 ${index + base} ; .${llvmCommentText(fieldName)}`);
4292
+ const fieldTy = llFieldType(field.type, host.inlineUnions.record(field.type));
4293
+ if (fieldTy === "i8") {
4294
+ const z = B.tmp();
4295
+ B.line(`${z} = zext i1 ${v} to i8`);
4296
+ B.line(`store i8 ${z}, ptr ${p}`);
4297
+ }
4298
+ else {
4299
+ B.line(`store ${fieldTy} ${v}, ptr ${p}`);
4300
+ }
4301
+ });
4302
+ B.terminate(`ret ptr %r0`);
4303
+ break;
4304
+ }
4305
+ case "union": {
4306
+ const def = host.unionsById.get(t.unionId);
4307
+ def.arms.forEach((arm, i) => {
4308
+ const lNext = B.newLabel("dmr.next");
4309
+ if (arm.kind === "nullT" || arm.kind === "undefinedT") {
4310
+ const hit = B.tmp();
4311
+ B.line(`${hit} = icmp eq i32 ${kind}, ${arm.kind === "nullT" ? MESSAGE_KIND.NULL : MESSAGE_KIND.UNDEFINED}`);
4312
+ const lHit = B.newLabel("dmr.unit");
4313
+ B.condBr(hit, lHit, lNext);
4314
+ B.startBlock(lHit);
4315
+ B.terminate(`ret ptr ${host.unitInstanceRef(t.unionId, i)}`);
4316
+ B.startBlock(lNext);
4317
+ return;
4318
+ }
4319
+ if (arm.kind !== "record") {
4320
+ const want = arm.kind === "f64"
4321
+ ? MESSAGE_KIND.NUMBER
4322
+ : arm.kind === "bool"
4323
+ ? MESSAGE_KIND.BOOL
4324
+ : MESSAGE_KIND.STRING;
4325
+ const hit = B.tmp();
4326
+ B.line(`${hit} = icmp eq i32 ${kind}, ${want}`);
4327
+ const lHit = B.newLabel("dmr.arm");
4328
+ B.condBr(hit, lHit, lNext);
4329
+ B.startBlock(lHit);
4330
+ }
4331
+ // A record arm that does not match leaves *fail clear for the
4332
+ // next arm, like the checked conversion's next-arm match.
4333
+ const v = B.tmp();
4334
+ B.line(`${v} = call ${this.valTy(arm)} @${this.messageReaderHelper(arm)}(ptr %m, ${S} %n, ptr %fail)`);
4335
+ if (arm.kind === "record") {
4336
+ const failed = B.tmp();
4337
+ B.line(`${failed} = load i1, ptr %fail`);
4338
+ const lHit = B.newLabel("dmr.arm");
4339
+ const lMiss = B.newLabel("dmr.miss");
4340
+ B.condBr(failed, lMiss, lHit);
4341
+ B.startBlock(lMiss);
4342
+ B.line(`store i1 false, ptr %fail`);
4343
+ B.br(lNext);
4344
+ B.startBlock(lHit);
4345
+ }
4346
+ const u = B.tmp();
4347
+ if (arm.kind === "f64") {
4348
+ host.declare(`declare ptr @scr_union_new_f64(i32, double)`);
4349
+ B.line(`${u} = call ptr @scr_union_new_f64(i32 ${i}, double ${v})`);
4350
+ }
4351
+ else if (arm.kind === "bool") {
4352
+ host.declare(`declare ptr @scr_union_new_bool(i32, i1 zeroext)`);
4353
+ B.line(`${u} = call ptr @scr_union_new_bool(i32 ${i}, i1 ${v})`);
4354
+ }
4355
+ else {
4356
+ const rc = vAdapters(host, arm);
4357
+ host.declare(`declare ptr @scr_union_new_ref(i32, ptr, ptr, ptr, ptr)`);
4358
+ B.line(`${u} = call ptr @scr_union_new_ref(i32 ${i}, ptr ${v}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${traceArg(host, arm)})`);
4359
+ }
4360
+ B.terminate(`ret ptr ${u}`);
4361
+ B.startBlock(lNext);
4362
+ });
4363
+ B.br(lFail);
4364
+ break;
4365
+ }
4366
+ default:
4367
+ throw new InternalCompilerError(`llvm emitter bug: message reader of ${key}`);
4368
+ }
4369
+ B.startBlock(lFail);
4370
+ B.line(`store i1 true, ptr %fail`);
4371
+ B.terminate(`ret ${retTy} ${dummy}`);
4372
+ this.defs.push(`define internal ${retTy === "i1" ? "zeroext i1" : retTy} @${name}(ptr %m, ${S} %n, ptr %fail) ${FN_ATTRS} { ; message reader for ${llvmCommentText(key)}`, B.render(), `}`, ``);
4373
+ return name;
4374
+ }
4052
4375
  /** The adapter closure body for one TARGET signature: caps[0] is an
4053
4376
  * untraced obj-box owning the dyn function value. */
4054
4377
  dynFuncAdapterHelper(t) {