@scriptc/compiler 0.4.3 → 0.4.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 (852) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +270 -72
  2. package/ambient/scriptc-overrides.d.ts +21 -0
  3. package/dist/backend/executable-features.js +3 -0
  4. package/dist/backend/executable-features.js.map +1 -1
  5. package/dist/backend/library-pack.js +2 -1
  6. package/dist/backend/library-pack.js.map +1 -1
  7. package/dist/backend/linker.js +11 -1
  8. package/dist/backend/linker.js.map +1 -1
  9. package/dist/backend/lld.d.ts +9 -0
  10. package/dist/backend/lld.js +48 -0
  11. package/dist/backend/lld.js.map +1 -0
  12. package/dist/backend/lld.test.d.ts +1 -0
  13. package/dist/backend/lld.test.js +53 -0
  14. package/dist/backend/lld.test.js.map +1 -0
  15. package/dist/backend/llvm/appended-array-literals.d.ts +11 -1
  16. package/dist/backend/llvm/appended-array-literals.js +29 -0
  17. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  18. package/dist/backend/llvm/blocks.js +10 -1
  19. package/dist/backend/llvm/blocks.js.map +1 -1
  20. package/dist/backend/llvm/bytes-alias.d.ts +13 -4
  21. package/dist/backend/llvm/bytes-alias.js +16 -5
  22. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  23. package/dist/backend/llvm/bytes-bounds.d.ts +5 -1
  24. package/dist/backend/llvm/bytes-bounds.js +199 -2
  25. package/dist/backend/llvm/bytes-bounds.js.map +1 -1
  26. package/dist/backend/llvm/bytes-loop-versions.d.ts +45 -3
  27. package/dist/backend/llvm/bytes-loop-versions.js +244 -20
  28. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  29. package/dist/backend/llvm/bytes-loop-versions.test.js +18 -6
  30. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  31. package/dist/backend/llvm/call-lifetimes.d.ts +8 -2
  32. package/dist/backend/llvm/call-lifetimes.js +87 -18
  33. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  34. package/dist/backend/llvm/call-lifetimes.test.js +132 -0
  35. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  36. package/dist/backend/llvm/classes.d.ts +3 -2
  37. package/dist/backend/llvm/classes.js +4 -4
  38. package/dist/backend/llvm/classes.js.map +1 -1
  39. package/dist/backend/llvm/counted-loops.d.ts +14 -2
  40. package/dist/backend/llvm/counted-loops.js +54 -5
  41. package/dist/backend/llvm/counted-loops.js.map +1 -1
  42. package/dist/backend/llvm/debug-info.d.ts +42 -1
  43. package/dist/backend/llvm/debug-info.js +72 -6
  44. package/dist/backend/llvm/debug-info.js.map +1 -1
  45. package/dist/backend/llvm/dense-array-loops.js +2 -2
  46. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  47. package/dist/backend/llvm/dense-array-loops.test.js +1 -0
  48. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  49. package/dist/backend/llvm/dyn.d.ts +69 -8
  50. package/dist/backend/llvm/dyn.js +396 -49
  51. package/dist/backend/llvm/dyn.js.map +1 -1
  52. package/dist/backend/llvm/emit-function.js +30 -16
  53. package/dist/backend/llvm/emit-function.js.map +1 -1
  54. package/dist/backend/llvm/emit-journal.d.ts +8 -4
  55. package/dist/backend/llvm/emit-journal.js +75 -5
  56. package/dist/backend/llvm/emit-journal.js.map +1 -1
  57. package/dist/backend/llvm/emit-module.d.ts +4 -0
  58. package/dist/backend/llvm/emit-module.js +74 -29
  59. package/dist/backend/llvm/emit-module.js.map +1 -1
  60. package/dist/backend/llvm/emit-statements.js +297 -28
  61. package/dist/backend/llvm/emit-statements.js.map +1 -1
  62. package/dist/backend/llvm/emitter.d.ts +144 -13
  63. package/dist/backend/llvm/emitter.js +523 -92
  64. package/dist/backend/llvm/emitter.js.map +1 -1
  65. package/dist/backend/llvm/emitter.test.js +11 -2
  66. package/dist/backend/llvm/emitter.test.js.map +1 -1
  67. package/dist/backend/llvm/expr-async.js +11 -13
  68. package/dist/backend/llvm/expr-async.js.map +1 -1
  69. package/dist/backend/llvm/expr-bytes.d.ts +6 -4
  70. package/dist/backend/llvm/expr-bytes.js +45 -16
  71. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  72. package/dist/backend/llvm/expr-calls.js +13 -11
  73. package/dist/backend/llvm/expr-calls.js.map +1 -1
  74. package/dist/backend/llvm/expr-containers.d.ts +11 -0
  75. package/dist/backend/llvm/expr-containers.js +101 -9
  76. package/dist/backend/llvm/expr-containers.js.map +1 -1
  77. package/dist/backend/llvm/expr-context.d.ts +3 -0
  78. package/dist/backend/llvm/expr-control.js +83 -0
  79. package/dist/backend/llvm/expr-control.js.map +1 -1
  80. package/dist/backend/llvm/expr-dynamic.d.ts +1 -1
  81. package/dist/backend/llvm/expr-dynamic.js +22 -4
  82. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  83. package/dist/backend/llvm/expr-primitives.js +121 -14
  84. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  85. package/dist/backend/llvm/expr-stream-bridges.js +111 -26
  86. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  87. package/dist/backend/llvm/forked-analysis.d.ts +8 -0
  88. package/dist/backend/llvm/forked-analysis.js +43 -0
  89. package/dist/backend/llvm/forked-analysis.js.map +1 -0
  90. package/dist/backend/llvm/integer-values.d.ts +12 -0
  91. package/dist/backend/llvm/integer-values.js +69 -5
  92. package/dist/backend/llvm/integer-values.js.map +1 -1
  93. package/dist/backend/llvm/integer-views.d.ts +2 -1
  94. package/dist/backend/llvm/integer-views.js +12 -1
  95. package/dist/backend/llvm/integer-views.js.map +1 -1
  96. package/dist/backend/llvm/js-ic.d.ts +4 -0
  97. package/dist/backend/llvm/js-ic.js +133 -15
  98. package/dist/backend/llvm/js-ic.js.map +1 -1
  99. package/dist/backend/llvm/layouts.d.ts +1 -0
  100. package/dist/backend/llvm/layouts.js.map +1 -1
  101. package/dist/backend/llvm/lazy-captures.d.ts +6 -1
  102. package/dist/backend/llvm/lazy-captures.js +10 -5
  103. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  104. package/dist/backend/llvm/lib-abi.d.ts +5 -0
  105. package/dist/backend/llvm/lib-abi.js +19 -0
  106. package/dist/backend/llvm/lib-abi.js.map +1 -1
  107. package/dist/backend/llvm/lib-dispatch.js +249 -33
  108. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  109. package/dist/backend/llvm/lib-filesystem.d.ts +10 -0
  110. package/dist/backend/llvm/lib-filesystem.js +32 -0
  111. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  112. package/dist/backend/llvm/lib-http2.js +2 -2
  113. package/dist/backend/llvm/lib-http2.js.map +1 -1
  114. package/dist/backend/llvm/lib-network.js +2 -0
  115. package/dist/backend/llvm/lib-network.js.map +1 -1
  116. package/dist/backend/llvm/lib-process.js +48 -1
  117. package/dist/backend/llvm/lib-process.js.map +1 -1
  118. package/dist/backend/llvm/lib-shared.js +64 -0
  119. package/dist/backend/llvm/lib-shared.js.map +1 -1
  120. package/dist/backend/llvm/lib-tls.js +28 -3
  121. package/dist/backend/llvm/lib-tls.js.map +1 -1
  122. package/dist/backend/llvm/local-union-storage.test.js +2 -1
  123. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  124. package/dist/backend/llvm/loop-array-borrows.d.ts +4 -1
  125. package/dist/backend/llvm/loop-array-borrows.js +11 -5
  126. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  127. package/dist/backend/llvm/map-entry-fusion.d.ts +5 -3
  128. package/dist/backend/llvm/map-entry-fusion.js +20 -11
  129. package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
  130. package/dist/backend/llvm/map-entry-fusion.test.js +14 -6
  131. package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -1
  132. package/dist/backend/llvm/map-number-lookup.d.ts +16 -6
  133. package/dist/backend/llvm/map-number-lookup.js +41 -9
  134. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  135. package/dist/backend/llvm/map-number-lookup.test.js +70 -2
  136. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  137. package/dist/backend/llvm/map-read-lifetimes.d.ts +25 -2
  138. package/dist/backend/llvm/map-read-lifetimes.js +136 -6
  139. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  140. package/dist/backend/llvm/map-read-lifetimes.test.js +8 -3
  141. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  142. package/dist/backend/llvm/nullable-unions.d.ts +5 -0
  143. package/dist/backend/llvm/nullable-unions.js +29 -2
  144. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  145. package/dist/backend/llvm/nullable-unions.test.js +25 -1
  146. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  147. package/dist/backend/llvm/publish.js +3 -3
  148. package/dist/backend/llvm/publish.js.map +1 -1
  149. package/dist/backend/llvm/record-union-keys.test.d.ts +1 -0
  150. package/dist/backend/llvm/record-union-keys.test.js +161 -0
  151. package/dist/backend/llvm/record-union-keys.test.js.map +1 -0
  152. package/dist/backend/llvm/reference-effects.js +3 -0
  153. package/dist/backend/llvm/reference-effects.js.map +1 -1
  154. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  155. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  156. package/dist/backend/llvm/shapes.d.ts +4 -5
  157. package/dist/backend/llvm/shapes.js +106 -58
  158. package/dist/backend/llvm/shapes.js.map +1 -1
  159. package/dist/backend/llvm/shapes.test.js +14 -2
  160. package/dist/backend/llvm/shapes.test.js.map +1 -1
  161. package/dist/backend/llvm/speculative-integers.d.ts +50 -3
  162. package/dist/backend/llvm/speculative-integers.js +411 -24
  163. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  164. package/dist/backend/llvm/speculative-integers.test.js +103 -1
  165. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  166. package/dist/backend/llvm/split.d.ts +10 -1
  167. package/dist/backend/llvm/split.js +243 -59
  168. package/dist/backend/llvm/split.js.map +1 -1
  169. package/dist/backend/llvm/split.test.js +92 -13
  170. package/dist/backend/llvm/split.test.js.map +1 -1
  171. package/dist/backend/llvm/stack-captures.js +1 -5
  172. package/dist/backend/llvm/stack-captures.js.map +1 -1
  173. package/dist/backend/llvm/stack-objects.test.js +3 -2
  174. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  175. package/dist/backend/llvm/string-lifetimes.test.js +1 -1
  176. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  177. package/dist/backend/llvm/string-reads.d.ts +13 -0
  178. package/dist/backend/llvm/string-reads.js +22 -0
  179. package/dist/backend/llvm/string-reads.js.map +1 -1
  180. package/dist/backend/llvm/string-slices.d.ts +36 -2
  181. package/dist/backend/llvm/string-slices.js +308 -12
  182. package/dist/backend/llvm/string-slices.js.map +1 -1
  183. package/dist/backend/llvm/string-slices.test.js +182 -3
  184. package/dist/backend/llvm/string-slices.test.js.map +1 -1
  185. package/dist/backend/llvm/string-unit-versions.d.ts +11 -0
  186. package/dist/backend/llvm/string-unit-versions.js +191 -0
  187. package/dist/backend/llvm/string-unit-versions.js.map +1 -0
  188. package/dist/backend/llvm/string-unit-versions.test.d.ts +1 -0
  189. package/dist/backend/llvm/string-unit-versions.test.js +117 -0
  190. package/dist/backend/llvm/string-unit-versions.test.js.map +1 -0
  191. package/dist/backend/llvm/test-boxed-unions.d.ts +5 -2
  192. package/dist/backend/llvm/test-boxed-unions.js +24 -8
  193. package/dist/backend/llvm/test-boxed-unions.js.map +1 -1
  194. package/dist/backend/llvm/union-repr.d.ts +4 -3
  195. package/dist/backend/llvm/union-repr.js +6 -5
  196. package/dist/backend/llvm/union-repr.js.map +1 -1
  197. package/dist/backend/llvm/unwind-abi.d.ts +52 -0
  198. package/dist/backend/llvm/unwind-abi.js +498 -0
  199. package/dist/backend/llvm/unwind-abi.js.map +1 -0
  200. package/dist/backend/llvm/unwind-abi.test.d.ts +1 -0
  201. package/dist/backend/llvm/unwind-abi.test.js +255 -0
  202. package/dist/backend/llvm/unwind-abi.test.js.map +1 -0
  203. package/dist/backend/llvm/walkers.js +13 -0
  204. package/dist/backend/llvm/walkers.js.map +1 -1
  205. package/dist/backend/llvm/wrapping-sums.d.ts +14 -10
  206. package/dist/backend/llvm/wrapping-sums.js +31 -14
  207. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  208. package/dist/backend/loop-polls.d.ts +6 -0
  209. package/dist/backend/loop-polls.js +24 -0
  210. package/dist/backend/loop-polls.js.map +1 -1
  211. package/dist/backend/may-throw.js +8 -8
  212. package/dist/backend/may-throw.js.map +1 -1
  213. package/dist/backend/native/contracts.d.ts +12 -2
  214. package/dist/backend/native/executable.js +48 -6
  215. package/dist/backend/native/executable.js.map +1 -1
  216. package/dist/backend/native/library.js +4 -3
  217. package/dist/backend/native/library.js.map +1 -1
  218. package/dist/backend/native/program-shards.d.ts +2 -2
  219. package/dist/backend/native/program-shards.js +2 -2
  220. package/dist/backend/native/program-shards.js.map +1 -1
  221. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  222. package/dist/backend/native/runtime-inputs.js +4 -1
  223. package/dist/backend/native/runtime-inputs.js.map +1 -1
  224. package/dist/backend/native/vendor.d.ts +1 -1
  225. package/dist/backend/native/vendor.js +1 -1
  226. package/dist/backend/native/vendor.js.map +1 -1
  227. package/dist/backend/native-codegen-core.d.ts +5 -3
  228. package/dist/backend/native-codegen-core.js +13 -6
  229. package/dist/backend/native-codegen-core.js.map +1 -1
  230. package/dist/backend/native-codegen.d.ts +3 -1
  231. package/dist/backend/native-codegen.js +4 -3
  232. package/dist/backend/native-codegen.js.map +1 -1
  233. package/dist/backend/native-codegen.test.js +6 -4
  234. package/dist/backend/native-codegen.test.js.map +1 -1
  235. package/dist/backend/native-link-info-core.d.ts +8 -0
  236. package/dist/backend/native-link-info-core.js.map +1 -1
  237. package/dist/backend/native-profile.d.ts +14 -0
  238. package/dist/backend/native-profile.js +28 -0
  239. package/dist/backend/native-profile.js.map +1 -1
  240. package/dist/backend/native-profile.test.js +8 -1
  241. package/dist/backend/native-profile.test.js.map +1 -1
  242. package/dist/backend/native-toolchain.test.js +11 -11
  243. package/dist/backend/native-toolchain.test.js.map +1 -1
  244. package/dist/backend/runtime-abi.d.ts +2 -2
  245. package/dist/backend/runtime-abi.js +2 -2
  246. package/dist/backend/runtime-pack-core.d.ts +3 -1
  247. package/dist/backend/runtime-pack-core.js +2 -0
  248. package/dist/backend/runtime-pack-core.js.map +1 -1
  249. package/dist/backend/runtime-pack-native.d.ts +17 -5
  250. package/dist/backend/runtime-pack-native.js +186 -14
  251. package/dist/backend/runtime-pack-native.js.map +1 -1
  252. package/dist/backend/runtime-pack-native.test.js +160 -3
  253. package/dist/backend/runtime-pack-native.test.js.map +1 -1
  254. package/dist/backend/runtime-pack-targets.test.js +2 -1
  255. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  256. package/dist/backend/runtime-pack.test.js +2 -1
  257. package/dist/backend/runtime-pack.test.js.map +1 -1
  258. package/dist/backend/target-cpu.d.ts +26 -0
  259. package/dist/backend/target-cpu.js +98 -0
  260. package/dist/backend/target-cpu.js.map +1 -0
  261. package/dist/backend/target-cpu.test.d.ts +1 -0
  262. package/dist/backend/target-cpu.test.js +38 -0
  263. package/dist/backend/target-cpu.test.js.map +1 -0
  264. package/dist/backend/vendor-archives.d.ts +4 -1
  265. package/dist/backend/vendor-archives.js +78 -4
  266. package/dist/backend/vendor-archives.js.map +1 -1
  267. package/dist/backend/vendor-inputs.d.ts +3 -1
  268. package/dist/backend/vendor-inputs.js +3 -1
  269. package/dist/backend/vendor-inputs.js.map +1 -1
  270. package/dist/backend/warm-cache.js +1 -0
  271. package/dist/backend/warm-cache.js.map +1 -1
  272. package/dist/cli/command.js +98 -12
  273. package/dist/cli/command.js.map +1 -1
  274. package/dist/cli/usage.d.ts +25 -1
  275. package/dist/cli/usage.js +40 -3
  276. package/dist/cli/usage.js.map +1 -1
  277. package/dist/compat/fetch-profile.d.ts +15 -6
  278. package/dist/compat/fetch-profile.js +519 -498
  279. package/dist/compat/fetch-profile.js.map +1 -1
  280. package/dist/compile-types.d.ts +14 -0
  281. package/dist/contracts/int32-elements.js +2 -1
  282. package/dist/contracts/int32-elements.js.map +1 -1
  283. package/dist/coverage/report.d.ts +14 -3
  284. package/dist/coverage/report.js +216 -0
  285. package/dist/coverage/report.js.map +1 -1
  286. package/dist/coverage/surface-manifest.js +25 -25
  287. package/dist/coverage/surface-manifest.js.map +1 -1
  288. package/dist/coverage/verdict-cache.d.ts +2 -0
  289. package/dist/coverage/verdict-cache.js +10 -1
  290. package/dist/coverage/verdict-cache.js.map +1 -1
  291. package/dist/diagnostics/diagnostic.d.ts +19 -0
  292. package/dist/diagnostics/diagnostic.js +53 -2
  293. package/dist/diagnostics/diagnostic.js.map +1 -1
  294. package/dist/diagnostics/envelope.d.ts +54 -0
  295. package/dist/diagnostics/envelope.js +7 -1
  296. package/dist/diagnostics/envelope.js.map +1 -1
  297. package/dist/diagnostics/render.d.ts +7 -0
  298. package/dist/diagnostics/render.js +15 -4
  299. package/dist/diagnostics/render.js.map +1 -1
  300. package/dist/executable/executable-cache.d.ts +6 -0
  301. package/dist/executable/executable-cache.js +5 -0
  302. package/dist/executable/executable-cache.js.map +1 -1
  303. package/dist/executable/executable-cache.test.js +3 -0
  304. package/dist/executable/executable-cache.test.js.map +1 -1
  305. package/dist/executable/prepare.js +5 -1
  306. package/dist/executable/prepare.js.map +1 -1
  307. package/dist/frontend/analysis.js +26 -2
  308. package/dist/frontend/analysis.js.map +1 -1
  309. package/dist/frontend/decl-projection.js +105 -10
  310. package/dist/frontend/decl-projection.js.map +1 -1
  311. package/dist/frontend/fork-target.js +67 -1
  312. package/dist/frontend/fork-target.js.map +1 -1
  313. package/dist/frontend/fork-target.test.js +43 -0
  314. package/dist/frontend/fork-target.test.js.map +1 -1
  315. package/dist/frontend/input-tracker.d.ts +4 -1
  316. package/dist/frontend/input-tracker.js +42 -4
  317. package/dist/frontend/input-tracker.js.map +1 -1
  318. package/dist/frontend/input-tracker.test.js +45 -0
  319. package/dist/frontend/input-tracker.test.js.map +1 -1
  320. package/dist/frontend/lowering/abstract-equality.js +38 -1
  321. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  322. package/dist/frontend/lowering/argument-counts.d.ts +36 -0
  323. package/dist/frontend/lowering/argument-counts.js +201 -0
  324. package/dist/frontend/lowering/argument-counts.js.map +1 -0
  325. package/dist/frontend/lowering/array-values.d.ts +27 -0
  326. package/dist/frontend/lowering/array-values.js +112 -0
  327. package/dist/frontend/lowering/array-values.js.map +1 -1
  328. package/dist/frontend/lowering/binding-analysis.d.ts +3 -0
  329. package/dist/frontend/lowering/binding-analysis.js +9 -3
  330. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  331. package/dist/frontend/lowering/builtin-namespaces.d.ts +13 -0
  332. package/dist/frontend/lowering/builtin-namespaces.js +238 -0
  333. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -0
  334. package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
  335. package/dist/frontend/lowering/builtins/async-context.js +62 -3
  336. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  337. package/dist/frontend/lowering/builtins/compression.d.ts +4 -3
  338. package/dist/frontend/lowering/builtins/compression.js +86 -5
  339. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  340. package/dist/frontend/lowering/builtins/crypto.js +3 -1
  341. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  342. package/dist/frontend/lowering/builtins/date-classes.js +17 -1
  343. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -1
  344. package/dist/frontend/lowering/builtins/dates.d.ts +19 -5
  345. package/dist/frontend/lowering/builtins/dates.js +163 -9
  346. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  347. package/dist/frontend/lowering/builtins/filesystem-calls.js +29 -4
  348. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  349. package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
  350. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  351. package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
  352. package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
  353. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
  354. package/dist/frontend/lowering/builtins/fs-streams.d.ts +4 -0
  355. package/dist/frontend/lowering/builtins/fs-streams.js +24 -1
  356. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
  357. package/dist/frontend/lowering/builtins/json.d.ts +4 -1
  358. package/dist/frontend/lowering/builtins/json.js +9 -3
  359. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  360. package/dist/frontend/lowering/builtins/module-bindings.d.ts +6 -0
  361. package/dist/frontend/lowering/builtins/module-bindings.js +23 -1
  362. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  363. package/dist/frontend/lowering/builtins/module-calls.js +6 -3
  364. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  365. package/dist/frontend/lowering/builtins/module-resolution.d.ts +5 -0
  366. package/dist/frontend/lowering/builtins/module-resolution.js +95 -4
  367. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  368. package/dist/frontend/lowering/builtins/promises.d.ts +1 -1
  369. package/dist/frontend/lowering/builtins/promises.js +293 -139
  370. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  371. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  372. package/dist/frontend/lowering/builtins/readline.js +22 -11
  373. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  374. package/dist/frontend/lowering/builtins/reflection.d.ts +4 -1
  375. package/dist/frontend/lowering/builtins/reflection.js +41 -1
  376. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  377. package/dist/frontend/lowering/builtins/text-codecs.js +31 -2
  378. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  379. package/dist/frontend/lowering/builtins/webassembly.js +4 -1
  380. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  381. package/dist/frontend/lowering/builtins/x509.d.ts +33 -0
  382. package/dist/frontend/lowering/builtins/x509.js +431 -0
  383. package/dist/frontend/lowering/builtins/x509.js.map +1 -0
  384. package/dist/frontend/lowering/call-arguments.js +44 -0
  385. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  386. package/dist/frontend/lowering/call-signatures.js +1 -2
  387. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  388. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  389. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  390. package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
  391. package/dist/frontend/lowering/cjs-inline-require.js +308 -5
  392. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  393. package/dist/frontend/lowering/class-attributes.d.ts +7 -0
  394. package/dist/frontend/lowering/class-attributes.js +52 -10
  395. package/dist/frontend/lowering/class-attributes.js.map +1 -1
  396. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +23 -0
  397. package/dist/frontend/lowering/class-dynamic-dispatch.js +288 -9
  398. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  399. package/dist/frontend/lowering/class-method-mutations.js +97 -26
  400. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  401. package/dist/frontend/lowering/class-method-values.js +71 -1
  402. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  403. package/dist/frontend/lowering/class-protocols.d.ts +25 -0
  404. package/dist/frontend/lowering/class-protocols.js +183 -1
  405. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  406. package/dist/frontend/lowering/class-prototypes.d.ts +8 -0
  407. package/dist/frontend/lowering/class-prototypes.js +83 -2
  408. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  409. package/dist/frontend/lowering/class-to-primitive.d.ts +5 -0
  410. package/dist/frontend/lowering/class-to-primitive.js +79 -7
  411. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  412. package/dist/frontend/lowering/coercions/state.d.ts +1 -0
  413. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  414. package/dist/frontend/lowering/coercions/structural.js +89 -10
  415. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  416. package/dist/frontend/lowering/coercions/unions.d.ts +4 -2
  417. package/dist/frontend/lowering/coercions/unions.js +13 -6
  418. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  419. package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
  420. package/dist/frontend/lowering/completion-callbacks.js +146 -0
  421. package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
  422. package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
  423. package/dist/frontend/lowering/containers/array-callbacks.js +58 -21
  424. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  425. package/dist/frontend/lowering/containers/array-construction.d.ts +4 -1
  426. package/dist/frontend/lowering/containers/array-construction.js +107 -9
  427. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  428. package/dist/frontend/lowering/containers/array-methods.js +96 -8
  429. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  430. package/dist/frontend/lowering/containers/array-pipelines.js +346 -77
  431. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  432. package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
  433. package/dist/frontend/lowering/containers/bytes.js +453 -45
  434. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  435. package/dist/frontend/lowering/containers/callback-arguments.js +11 -1
  436. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  437. package/dist/frontend/lowering/containers/collection-methods.js +12 -0
  438. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  439. package/dist/frontend/lowering/containers/indexed-objects.js +73 -25
  440. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  441. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +4 -4
  442. package/dist/frontend/lowering/containers/iterator-helpers.js +8 -2
  443. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  444. package/dist/frontend/lowering/containers/replacer-params.d.ts +37 -0
  445. package/dist/frontend/lowering/containers/replacer-params.js +294 -0
  446. package/dist/frontend/lowering/containers/replacer-params.js.map +1 -0
  447. package/dist/frontend/lowering/containers/replacer-params.test.d.ts +1 -0
  448. package/dist/frontend/lowering/containers/replacer-params.test.js +61 -0
  449. package/dist/frontend/lowering/containers/replacer-params.test.js.map +1 -0
  450. package/dist/frontend/lowering/containers/string-and-regexp.js +2 -1
  451. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  452. package/dist/frontend/lowering/containers/string-replacement.js +7 -3
  453. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  454. package/dist/frontend/lowering/cycle-initialization.d.ts +4 -2
  455. package/dist/frontend/lowering/cycle-initialization.js +4 -1
  456. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  457. package/dist/frontend/lowering/date-values.d.ts +14 -0
  458. package/dist/frontend/lowering/date-values.js +254 -0
  459. package/dist/frontend/lowering/date-values.js.map +1 -0
  460. package/dist/frontend/lowering/deferred-module-initializers.js +16 -8
  461. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  462. package/dist/frontend/lowering/deferred-module-initializers.test.js +22 -6
  463. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  464. package/dist/frontend/lowering/dispatch-sites.js +1 -0
  465. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  466. package/dist/frontend/lowering/expressions/array-literals.d.ts +0 -8
  467. package/dist/frontend/lowering/expressions/array-literals.js +125 -26
  468. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  469. package/dist/frontend/lowering/expressions/binary.js +102 -26
  470. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  471. package/dist/frontend/lowering/expressions/element-access.js +129 -6
  472. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  473. package/dist/frontend/lowering/expressions/identifiers.js +66 -4
  474. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  475. package/dist/frontend/lowering/expressions/narrowing.d.ts +2 -1
  476. package/dist/frontend/lowering/expressions/narrowing.js +8 -1
  477. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  478. package/dist/frontend/lowering/expressions/object-literals.js +8 -2
  479. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  480. package/dist/frontend/lowering/expressions/property-access.js +121 -34
  481. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  482. package/dist/frontend/lowering/expressions/relational.js +76 -11
  483. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  484. package/dist/frontend/lowering/expressions/typeof.js +12 -1
  485. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  486. package/dist/frontend/lowering/expressions/updates.js +37 -11
  487. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  488. package/dist/frontend/lowering/f64-handles.d.ts +8 -0
  489. package/dist/frontend/lowering/f64-handles.js +16 -0
  490. package/dist/frontend/lowering/f64-handles.js.map +1 -0
  491. package/dist/frontend/lowering/frozen-records.d.ts +5 -0
  492. package/dist/frontend/lowering/frozen-records.js +12 -4
  493. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  494. package/dist/frontend/lowering/function-context.d.ts +3 -0
  495. package/dist/frontend/lowering/function-context.js.map +1 -1
  496. package/dist/frontend/lowering/function-returns.js +30 -0
  497. package/dist/frontend/lowering/function-returns.js.map +1 -1
  498. package/dist/frontend/lowering/generic-functions.js +17 -6
  499. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  500. package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
  501. package/dist/frontend/lowering/indexed-unions.js +401 -0
  502. package/dist/frontend/lowering/indexed-unions.js.map +1 -0
  503. package/dist/frontend/lowering/instantiation-path.d.ts +3 -2
  504. package/dist/frontend/lowering/instantiation-path.js.map +1 -1
  505. package/dist/frontend/lowering/instantiation-path.test.js +6 -4
  506. package/dist/frontend/lowering/instantiation-path.test.js.map +1 -1
  507. package/dist/frontend/lowering/iterator-adapters.d.ts +4 -2
  508. package/dist/frontend/lowering/iterator-adapters.js +26 -33
  509. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  510. package/dist/frontend/lowering/js-collection-types.d.ts +11 -0
  511. package/dist/frontend/lowering/js-collection-types.js +490 -0
  512. package/dist/frontend/lowering/js-collection-types.js.map +1 -0
  513. package/dist/frontend/lowering/key-order-witness.js +210 -32
  514. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  515. package/dist/frontend/lowering/key-order-witness.test.js +104 -4
  516. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  517. package/dist/frontend/lowering/lib-boundary.js +2 -2
  518. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  519. package/dist/frontend/lowering/lower-assert.d.ts +14 -0
  520. package/dist/frontend/lowering/lower-assert.js +298 -29
  521. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  522. package/dist/frontend/lowering/lower-builtin-values.js +3 -3
  523. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  524. package/dist/frontend/lowering/lower-calls.js +116 -10
  525. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  526. package/dist/frontend/lowering/lower-classes.d.ts +59 -7
  527. package/dist/frontend/lowering/lower-classes.js +668 -222
  528. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  529. package/dist/frontend/lowering/lower-console.js +2 -1
  530. package/dist/frontend/lowering/lower-console.js.map +1 -1
  531. package/dist/frontend/lowering/lower-exprs.d.ts +5 -0
  532. package/dist/frontend/lowering/lower-exprs.js +254 -3
  533. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  534. package/dist/frontend/lowering/lower-functions.js +7 -0
  535. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  536. package/dist/frontend/lowering/lower-generators.js +5 -4
  537. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  538. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  539. package/dist/frontend/lowering/lower-inspect.js +299 -57
  540. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  541. package/dist/frontend/lowering/lower-modules.js +49 -22
  542. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  543. package/dist/frontend/lowering/lower-namespaces.d.ts +3 -0
  544. package/dist/frontend/lowering/lower-namespaces.js +44 -1
  545. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  546. package/dist/frontend/lowering/lower-node-module.js +1 -1
  547. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  548. package/dist/frontend/lowering/lower-server.js +126 -32
  549. package/dist/frontend/lowering/lower-server.js.map +1 -1
  550. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -1
  551. package/dist/frontend/lowering/lower-stdlib.js +51 -37
  552. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  553. package/dist/frontend/lowering/lower-stmts.js +393 -79
  554. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  555. package/dist/frontend/lowering/lower-stream.js +515 -121
  556. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  557. package/dist/frontend/lowering/lowerer.d.ts +82 -12
  558. package/dist/frontend/lowering/lowerer.js +317 -44
  559. package/dist/frontend/lowering/lowerer.js.map +1 -1
  560. package/dist/frontend/lowering/lowerer.test.js +1 -1
  561. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  562. package/dist/frontend/lowering/module-namespace-elements.d.ts +13 -0
  563. package/dist/frontend/lowering/module-namespace-elements.js +118 -1
  564. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  565. package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
  566. package/dist/frontend/lowering/object-factory-new.js +20 -6
  567. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  568. package/dist/frontend/lowering/overload-choice.d.ts +33 -0
  569. package/dist/frontend/lowering/overload-choice.js +190 -0
  570. package/dist/frontend/lowering/overload-choice.js.map +1 -0
  571. package/dist/frontend/lowering/private-brands.d.ts +5 -0
  572. package/dist/frontend/lowering/private-brands.js +39 -0
  573. package/dist/frontend/lowering/private-brands.js.map +1 -1
  574. package/dist/frontend/lowering/runtime-optional-elements.d.ts +6 -0
  575. package/dist/frontend/lowering/runtime-optional-elements.js +14 -3
  576. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  577. package/dist/frontend/lowering/sanitize-class-types.js +2 -0
  578. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
  579. package/dist/frontend/lowering/site-dependencies.d.ts +7 -2
  580. package/dist/frontend/lowering/site-dependencies.js +0 -15
  581. package/dist/frontend/lowering/site-dependencies.js.map +1 -1
  582. package/dist/frontend/lowering/site-dependencies.test.js +7 -5
  583. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -1
  584. package/dist/frontend/lowering/string-index-bounds.d.ts +7 -4
  585. package/dist/frontend/lowering/string-index-bounds.js +21 -7
  586. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  587. package/dist/frontend/lowering/surfaces.d.ts +12 -3
  588. package/dist/frontend/lowering/surfaces.js +1630 -1540
  589. package/dist/frontend/lowering/surfaces.js.map +1 -1
  590. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  591. package/dist/frontend/lowering/symbol-fields.js +45 -2
  592. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  593. package/dist/frontend/lowering/union-narrow.d.ts +5 -2
  594. package/dist/frontend/lowering/union-narrow.js +6 -3
  595. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  596. package/dist/frontend/lowering/union-narrow.test.js +10 -0
  597. package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
  598. package/dist/frontend/npm-static-namespace-defaults.d.ts +6 -0
  599. package/dist/frontend/npm-static-namespace-defaults.js +163 -0
  600. package/dist/frontend/npm-static-namespace-defaults.js.map +1 -0
  601. package/dist/frontend/npm-static-namespace-defaults.test.d.ts +1 -0
  602. package/dist/frontend/npm-static-namespace-defaults.test.js +72 -0
  603. package/dist/frontend/npm-static-namespace-defaults.test.js.map +1 -0
  604. package/dist/frontend/npm-static-prune.js +152 -111
  605. package/dist/frontend/npm-static-prune.js.map +1 -1
  606. package/dist/frontend/npm-static.js +35 -32
  607. package/dist/frontend/npm-static.js.map +1 -1
  608. package/dist/frontend/package-shims.d.ts +7 -4
  609. package/dist/frontend/package-shims.js +39 -40
  610. package/dist/frontend/package-shims.js.map +1 -1
  611. package/dist/frontend/pipeline-native.d.ts +2 -2
  612. package/dist/frontend/pipeline-native.js +2 -2
  613. package/dist/frontend/pipeline-native.js.map +1 -1
  614. package/dist/frontend/pipeline.d.ts +19 -2
  615. package/dist/frontend/pipeline.js +103 -12
  616. package/dist/frontend/pipeline.js.map +1 -1
  617. package/dist/frontend/program-analysis.d.ts +7 -1
  618. package/dist/frontend/program-analysis.js +8 -0
  619. package/dist/frontend/program-analysis.js.map +1 -1
  620. package/dist/frontend/program.d.ts +28 -5
  621. package/dist/frontend/program.js +422 -76
  622. package/dist/frontend/program.js.map +1 -1
  623. package/dist/frontend/resolve.d.ts +2 -0
  624. package/dist/frontend/resolve.js +5 -0
  625. package/dist/frontend/resolve.js.map +1 -1
  626. package/dist/frontend/services.d.ts +3 -0
  627. package/dist/frontend/services.js +31 -4
  628. package/dist/frontend/services.js.map +1 -1
  629. package/dist/frontend/shape-inference/analyze.d.ts +93 -0
  630. package/dist/frontend/shape-inference/analyze.js +3138 -0
  631. package/dist/frontend/shape-inference/analyze.js.map +1 -0
  632. package/dist/frontend/shape-inference/constant-graphs.d.ts +54 -0
  633. package/dist/frontend/shape-inference/constant-graphs.js +357 -0
  634. package/dist/frontend/shape-inference/constant-graphs.js.map +1 -0
  635. package/dist/frontend/shape-inference/domain.d.ts +32 -0
  636. package/dist/frontend/shape-inference/domain.js +104 -0
  637. package/dist/frontend/shape-inference/domain.js.map +1 -0
  638. package/dist/frontend/shape-inference/index.d.ts +7 -0
  639. package/dist/frontend/shape-inference/index.js +19 -0
  640. package/dist/frontend/shape-inference/index.js.map +1 -0
  641. package/dist/frontend/shape-inference/report.d.ts +21 -0
  642. package/dist/frontend/shape-inference/report.js +348 -0
  643. package/dist/frontend/shape-inference/report.js.map +1 -0
  644. package/dist/frontend/token-equivalence.d.ts +6 -0
  645. package/dist/frontend/token-equivalence.js +66 -9
  646. package/dist/frontend/token-equivalence.js.map +1 -1
  647. package/dist/frontend/token-equivalence.test.js +33 -1
  648. package/dist/frontend/token-equivalence.test.js.map +1 -1
  649. package/dist/frontend/ts7/checker-features.d.ts +15 -0
  650. package/dist/frontend/ts7/checker-features.js +45 -0
  651. package/dist/frontend/ts7/checker-features.js.map +1 -0
  652. package/dist/frontend/ts7/checker-features.test.d.ts +1 -0
  653. package/dist/frontend/ts7/checker-features.test.js +40 -0
  654. package/dist/frontend/ts7/checker-features.test.js.map +1 -0
  655. package/dist/frontend/ts7/checker-server.d.ts +19 -0
  656. package/dist/frontend/ts7/checker-server.js +46 -0
  657. package/dist/frontend/ts7/checker-server.js.map +1 -0
  658. package/dist/frontend/ts7/checker-server.test.d.ts +1 -0
  659. package/dist/frontend/ts7/checker-server.test.js +38 -0
  660. package/dist/frontend/ts7/checker-server.test.js.map +1 -0
  661. package/dist/frontend/ts7/lib-diagnostics.js +39 -13
  662. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -1
  663. package/dist/frontend/ts7/lib-diagnostics.test.js +40 -0
  664. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -1
  665. package/dist/frontend/ts7/native-api.d.ts +1 -0
  666. package/dist/frontend/ts7/native-api.js +25 -2
  667. package/dist/frontend/ts7/native-api.js.map +1 -1
  668. package/dist/frontend/ts7/native-process.d.ts +9 -2
  669. package/dist/frontend/ts7/native-process.js +22 -4
  670. package/dist/frontend/ts7/native-process.js.map +1 -1
  671. package/dist/frontend/ts7/program-host.d.ts +11 -0
  672. package/dist/frontend/ts7/program-host.js +36 -22
  673. package/dist/frontend/ts7/program-host.js.map +1 -1
  674. package/dist/frontend/ts7/semantic-json.d.ts +9 -0
  675. package/dist/frontend/ts7/semantic-json.js +25 -5
  676. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  677. package/dist/frontend/ts7/semantic-model.d.ts +3 -0
  678. package/dist/frontend/ts7/semantic-model.js +8 -1
  679. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  680. package/dist/frontend/ts7/semantic-model.test.js +6 -1
  681. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  682. package/dist/frontend/ts7/semantic-types.d.ts +1 -1
  683. package/dist/frontend/ts7/semantic-types.js +1 -1
  684. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  685. package/dist/frontend/ts7/source-parser.js +3 -1
  686. package/dist/frontend/ts7/source-parser.js.map +1 -1
  687. package/dist/frontend/tsc-codes.js +10 -0
  688. package/dist/frontend/tsc-codes.js.map +1 -1
  689. package/dist/frontend/type-mapper.d.ts +18 -6
  690. package/dist/frontend/type-mapper.js +205 -44
  691. package/dist/frontend/type-mapper.js.map +1 -1
  692. package/dist/index.d.ts +44 -3
  693. package/dist/index.js +39 -8
  694. package/dist/index.js.map +1 -1
  695. package/dist/ir/builtin-effects.js +37 -0
  696. package/dist/ir/builtin-effects.js.map +1 -1
  697. package/dist/ir/builtin-signatures.d.ts +7 -2
  698. package/dist/ir/builtin-signatures.js +5104 -4894
  699. package/dist/ir/builtin-signatures.js.map +1 -1
  700. package/dist/ir/callback-specialization.d.ts +4 -2
  701. package/dist/ir/callback-specialization.js +24 -9
  702. package/dist/ir/callback-specialization.js.map +1 -1
  703. package/dist/ir/capture-values.js +4 -2
  704. package/dist/ir/capture-values.js.map +1 -1
  705. package/dist/ir/char-unit-locals.d.ts +12 -2
  706. package/dist/ir/char-unit-locals.js +400 -58
  707. package/dist/ir/char-unit-locals.js.map +1 -1
  708. package/dist/ir/char-unit-locals.test.js +111 -0
  709. package/dist/ir/char-unit-locals.test.js.map +1 -1
  710. package/dist/ir/constant-globals.js +18 -4
  711. package/dist/ir/constant-globals.js.map +1 -1
  712. package/dist/ir/expression-inlining.d.ts +15 -0
  713. package/dist/ir/expression-inlining.js +166 -0
  714. package/dist/ir/expression-inlining.js.map +1 -0
  715. package/dist/ir/expression-inlining.test.d.ts +1 -0
  716. package/dist/ir/expression-inlining.test.js +123 -0
  717. package/dist/ir/expression-inlining.test.js.map +1 -0
  718. package/dist/ir/function-references.js +2 -0
  719. package/dist/ir/function-references.js.map +1 -1
  720. package/dist/ir/function-references.test.js +6 -0
  721. package/dist/ir/function-references.test.js.map +1 -1
  722. package/dist/ir/int32-arrays.d.ts +27 -6
  723. package/dist/ir/int32-arrays.js +106 -18
  724. package/dist/ir/int32-arrays.js.map +1 -1
  725. package/dist/ir/int32-slots.d.ts +26 -1
  726. package/dist/ir/int32-slots.js +291 -5
  727. package/dist/ir/int32-slots.js.map +1 -1
  728. package/dist/ir/int32-slots.test.js +38 -0
  729. package/dist/ir/int32-slots.test.js.map +1 -1
  730. package/dist/ir/integer-loop-facts.d.ts +5 -0
  731. package/dist/ir/integer-loop-facts.js +90 -1
  732. package/dist/ir/integer-loop-facts.js.map +1 -1
  733. package/dist/ir/integer-loops.d.ts +14 -1
  734. package/dist/ir/integer-loops.js +107 -11
  735. package/dist/ir/integer-loops.js.map +1 -1
  736. package/dist/ir/integer-loops.test.js +70 -0
  737. package/dist/ir/integer-loops.test.js.map +1 -1
  738. package/dist/ir/integer-ranges.js +18 -2
  739. package/dist/ir/integer-ranges.js.map +1 -1
  740. package/dist/ir/integer-ranges.test.js +64 -4
  741. package/dist/ir/integer-ranges.test.js.map +1 -1
  742. package/dist/ir/ir.d.ts +63 -11
  743. package/dist/ir/ir.js +47 -7
  744. package/dist/ir/ir.js.map +1 -1
  745. package/dist/ir/ir.test.js +2 -1
  746. package/dist/ir/ir.test.js.map +1 -1
  747. package/dist/ir/js-ic.d.ts +10 -3
  748. package/dist/ir/js-ic.js +14 -2
  749. package/dist/ir/js-ic.js.map +1 -1
  750. package/dist/ir/js-ic.test.js +11 -0
  751. package/dist/ir/js-ic.test.js.map +1 -1
  752. package/dist/ir/node-index.d.ts +7 -0
  753. package/dist/ir/node-index.js +32 -0
  754. package/dist/ir/node-index.js.map +1 -1
  755. package/dist/ir/receiver-readers.d.ts +6 -1
  756. package/dist/ir/receiver-readers.js +53 -28
  757. package/dist/ir/receiver-readers.js.map +1 -1
  758. package/dist/ir/row-pairs.d.ts +15 -0
  759. package/dist/ir/row-pairs.js +373 -0
  760. package/dist/ir/row-pairs.js.map +1 -0
  761. package/dist/ir/row-pairs.test.d.ts +1 -0
  762. package/dist/ir/row-pairs.test.js +129 -0
  763. package/dist/ir/row-pairs.test.js.map +1 -0
  764. package/dist/ir/runtime-features.d.ts +17 -4
  765. package/dist/ir/runtime-features.js +94 -13
  766. package/dist/ir/runtime-features.js.map +1 -1
  767. package/dist/ir/scalar-records.d.ts +15 -0
  768. package/dist/ir/scalar-records.js +301 -1
  769. package/dist/ir/scalar-records.js.map +1 -1
  770. package/dist/ir/scalar-records.test.js +181 -1
  771. package/dist/ir/scalar-records.test.js.map +1 -1
  772. package/dist/ir/self-captures.js +8 -0
  773. package/dist/ir/self-captures.js.map +1 -1
  774. package/dist/ir/validate.js +78 -28
  775. package/dist/ir/validate.js.map +1 -1
  776. package/dist/library/fence-eval.js +4 -4
  777. package/dist/library/fence-eval.js.map +1 -1
  778. package/dist/library/ir-policy.js +5 -0
  779. package/dist/library/ir-policy.js.map +1 -1
  780. package/dist/library/library-cache.d.ts +1 -0
  781. package/dist/library/library-cache.js +1 -0
  782. package/dist/library/library-cache.js.map +1 -1
  783. package/dist/library/library-cache.test.js +13 -0
  784. package/dist/library/library-cache.test.js.map +1 -1
  785. package/dist/native/cache.d.ts +5 -1
  786. package/dist/native/cache.js +15 -3
  787. package/dist/native/cache.js.map +1 -1
  788. package/dist/native/cli.js +6 -0
  789. package/dist/native/cli.js.map +1 -1
  790. package/dist/native/compiler.d.ts +3 -0
  791. package/dist/native/compiler.js +72 -26
  792. package/dist/native/compiler.js.map +1 -1
  793. package/dist/native/compiler.test.js +87 -2
  794. package/dist/native/compiler.test.js.map +1 -1
  795. package/dist/native/executable-cache-open.test.d.ts +1 -0
  796. package/dist/native/executable-cache-open.test.js +80 -0
  797. package/dist/native/executable-cache-open.test.js.map +1 -0
  798. package/dist/native/executable-cache.d.ts +43 -3
  799. package/dist/native/executable-cache.js +177 -36
  800. package/dist/native/executable-cache.js.map +1 -1
  801. package/dist/native/executable-cache.test.js +103 -0
  802. package/dist/native/executable-cache.test.js.map +1 -1
  803. package/dist/native/prepare.d.ts +1 -1
  804. package/dist/native/prepare.js +49 -17
  805. package/dist/native/prepare.js.map +1 -1
  806. package/dist/native/prepare.test.js +69 -3
  807. package/dist/native/prepare.test.js.map +1 -1
  808. package/dist/native/sanitizer.d.ts +1 -1
  809. package/dist/native/sanitizer.js +17 -3
  810. package/dist/native/sanitizer.js.map +1 -1
  811. package/dist/native/sanitizer.test.js +4 -0
  812. package/dist/native/sanitizer.test.js.map +1 -1
  813. package/dist/node-islands/classify.d.ts +14 -0
  814. package/dist/node-islands/classify.js +114 -0
  815. package/dist/node-islands/classify.js.map +1 -0
  816. package/dist/node-islands/detect.d.ts +13 -0
  817. package/dist/node-islands/detect.js +805 -0
  818. package/dist/node-islands/detect.js.map +1 -0
  819. package/dist/node-islands/detect.test.d.ts +1 -0
  820. package/dist/node-islands/detect.test.js +136 -0
  821. package/dist/node-islands/detect.test.js.map +1 -0
  822. package/dist/node-islands/origin.d.ts +21 -0
  823. package/dist/node-islands/origin.js +60 -0
  824. package/dist/node-islands/origin.js.map +1 -0
  825. package/dist/node-islands/policy.d.ts +49 -0
  826. package/dist/node-islands/policy.js +130 -0
  827. package/dist/node-islands/policy.js.map +1 -0
  828. package/dist/node-islands/report.d.ts +22 -0
  829. package/dist/node-islands/report.js +326 -0
  830. package/dist/node-islands/report.js.map +1 -0
  831. package/dist/node-islands/report.test.d.ts +1 -0
  832. package/dist/node-islands/report.test.js +228 -0
  833. package/dist/node-islands/report.test.js.map +1 -0
  834. package/dist/node-islands/rules.d.ts +20 -0
  835. package/dist/node-islands/rules.js +91 -0
  836. package/dist/node-islands/rules.js.map +1 -0
  837. package/dist/node-islands/scan.d.ts +53 -0
  838. package/dist/node-islands/scan.js +104 -0
  839. package/dist/node-islands/scan.js.map +1 -0
  840. package/dist/node-islands/summary.d.ts +78 -0
  841. package/dist/node-islands/summary.js +26 -0
  842. package/dist/node-islands/summary.js.map +1 -0
  843. package/dist/project-config.d.ts +50 -0
  844. package/dist/project-config.js +372 -0
  845. package/dist/project-config.js.map +1 -0
  846. package/dist/project-config.test.d.ts +1 -0
  847. package/dist/project-config.test.js +154 -0
  848. package/dist/project-config.test.js.map +1 -0
  849. package/dist/wasm/discover.js +6 -31
  850. package/dist/wasm/discover.js.map +1 -1
  851. package/package.json +20 -20
  852. package/surface-manifest.json +21 -38
@@ -5,7 +5,7 @@ import { BYTES_ELEM_NUM, SCR_ARR_FIELD, SCR_ARR_STATES, f64Lit, sizeToDouble } f
5
5
  import { emitUnionPeek, emitUnionTag } from "./union-repr.js";
6
6
  import { INLINE_UNION_FIELD, loadInlineUnion, stackUnionBox, storeInlineUnion, unionBoxBits, } from "./inline-unions.js";
7
7
  import { InternalCompilerError } from "../../errors.js";
8
- import { accessorSlotProp, DYN_HANDLE_KINDS, isDirentShape, KEY_ORDER_FIELD, shapeKeyOrders, isDynTypedRefType, isRefCounted, isUnitType, recordTextCodecClass, textCodecRecordClass, typeKey, } from "../../ir/ir.js";
8
+ import { accessorSlotProp, DYN_HANDLE_KINDS, isDirentShape, KEY_ORDER_FIELD, shapeKeyOrders, isDynTypedRefType, isRefCounted, isUnitType, recordHandleCodecClass, textCodecRecordClass, typeKey, } from "../../ir/ir.js";
9
9
  import { dynDesc, streamTypedRefEligible } from "../../ir/analysis.js";
10
10
  import { mangleRecordNew, mangleRecordStruct } from "../mangle.js";
11
11
  import { BlockBuilder } from "./blocks.js";
@@ -13,6 +13,24 @@ import { llvmCommentText } from "./common.js";
13
13
  import { arrNewCall, elemAccess, llFieldType, mapFlagsOffset, releaseSym, traceAdapter, traceArg, vAdapters, } from "./shapes.js";
14
14
  import { LlvmUnsupportedError } from "./unsupported.js";
15
15
  import { recordMayKeepSource, recordSourceFieldOrder } from "./record-sources.js";
16
+ /** typeKey with `?` after every `(T | undefined)[]` (optionalElements),
17
+ * at any depth of arrays, Maps, Sets and promises: checked conversions to
18
+ * `number[][]` and `(number | undefined)[][]` need separate helpers, though
19
+ * the two types share a typeKey. */
20
+ function checkedConversionKey(t) {
21
+ switch (t.kind) {
22
+ case "array":
23
+ return `array<${checkedConversionKey(t.elem)}>${t.optionalElements ? "?" : ""}`;
24
+ case "map":
25
+ return `map<${checkedConversionKey(t.key)},${checkedConversionKey(t.value)}>`;
26
+ case "set":
27
+ return `set<${checkedConversionKey(t.elem)}>`;
28
+ case "promise":
29
+ return `promise<${checkedConversionKey(t.inner)}>`;
30
+ default:
31
+ return typeKey(t);
32
+ }
33
+ }
16
34
  /** Whether to-dyn of a record shape keeps the record itself: an empty shape
17
35
  * and an event-listener record (a `handleEvent` function field) box their
18
36
  * identity. Every other shape, tuples included, copies its fields into a
@@ -45,10 +63,12 @@ export const DYN_HANDLE_TAG_NUM = {
45
63
  export const TEXT_CODEC_TAG_NUM = {
46
64
  TextDecoder: 76,
47
65
  TextEncoder: 77,
66
+ StringDecoder: 78,
48
67
  };
49
68
  /** The decoder record fields scr_text_decoder_to_dyn reads, in its
50
69
  * parameter order. */
51
70
  const TEXT_DECODER_FIELDS = ["%TextDecoder", "%fatal", "%ignoreBOM", "%state"];
71
+ const STRING_DECODER_FIELDS = ["%enc", "%pending"];
52
72
  /** Handle kinds whose runtime unit boxes them through its own function,
53
73
  * which installs the tag's ops on first use (scr_crypto.h). Programs that
54
74
  * never box one of these values do not link its dynamic members. */
@@ -89,6 +109,17 @@ export const DYN_KIND = {
89
109
  BIGINT: 14,
90
110
  SYMBOL: 15,
91
111
  };
112
+ /** Union arm kinds whose matchers reject every plain dyn object
113
+ * (trustedArmByLiteral). */
114
+ const NON_OBJECT_ARM_KINDS = new Set([
115
+ "f64",
116
+ "string",
117
+ "bool",
118
+ "nullT",
119
+ "undefinedT",
120
+ "bigint",
121
+ "symbol",
122
+ ]);
92
123
  const FN_ATTRS = "#0";
93
124
  /** scr_dyn_builtin_stream_check's kind for a runtime stream class (the
94
125
  * numbering of scr_dyn_builtin_class.c), or null. */
@@ -102,6 +133,10 @@ function builtinStreamKind(className) {
102
133
  };
103
134
  return kinds[className] ?? null;
104
135
  }
136
+ /** Unions whose discriminant has fewer string literals keep one literal test
137
+ * per arm (dispatchValues): one runtime lookup costs about what a few
138
+ * literal tests do. */
139
+ const DISCRIMINANT_DISPATCH_VALUES = 4;
105
140
  export class LlDyn {
106
141
  host;
107
142
  dynMatchers = new Map();
@@ -276,6 +311,48 @@ export class LlDyn {
276
311
  this.host.declare(`declare void @scr_dyn_build_add(ptr, ptr, ptr)`);
277
312
  B.line(`call void @scr_dyn_build_add(ptr %d, ptr @${name}, ptr ${value})`);
278
313
  }
314
+ /** Whether a builder of `def` may pick a plain object's arm by its literal
315
+ * discriminator alone inside a trusted build (scr_dyn_trust_enter): the
316
+ * arms' literals are disjoint, and every arm without a literal has a kind
317
+ * no plain object matches. The value then matched exactly one arm with a
318
+ * literal, the arm whose literal it carries. */
319
+ trustedArmByLiteral(def) {
320
+ const discriminant = def.discriminant;
321
+ if (!discriminant)
322
+ return false;
323
+ const seen = new Set();
324
+ for (const { values } of discriminant.cases) {
325
+ for (const value of values) {
326
+ const key = `${typeof value}:${String(value)}`;
327
+ if (seen.has(key))
328
+ return false;
329
+ seen.add(key);
330
+ }
331
+ }
332
+ return def.arms.every((arm, tag) => discriminant.cases.some((candidate) => candidate.tag === tag) ||
333
+ NON_OBJECT_ARM_KINDS.has(arm.kind));
334
+ }
335
+ /** Per arm of `def`, the dyn kind of the values a builder may convert into
336
+ * that arm without matching its structure inside a trusted build, or null.
337
+ * A value there already matched one of the union's arms, so the arm is
338
+ * known when it is the only arm that takes values of its kind: the arm
339
+ * whose literal a plain object carries (trustedArmByLiteral), or the one
340
+ * arm a plain object or an array can match at all. */
341
+ trustedArmKinds(def) {
342
+ const byLiteral = this.trustedArmByLiteral(def);
343
+ const objectArms = def.arms.flatMap((arm, tag) => NON_OBJECT_ARM_KINDS.has(arm.kind) ? [] : [tag]);
344
+ return def.arms.map((arm, tag) => {
345
+ if (def.discriminant?.cases.some((candidate) => candidate.tag === tag))
346
+ return byLiteral ? DYN_KIND.OBJ : null;
347
+ if (objectArms.length !== 1 || objectArms[0] !== tag)
348
+ return null;
349
+ if (arm.kind === "array")
350
+ return DYN_KIND.ARR;
351
+ if (arm.kind === "record" && this.host.recordsById.get(arm.shapeId)?.tuple !== true)
352
+ return DYN_KIND.OBJ;
353
+ return null;
354
+ });
355
+ }
279
356
  /** The order a dyn value tries a union's arms in: the canonical order,
280
357
  * except that among the record arms, those with more required fields go
281
358
  * first, then those with more fields. Records are width-tolerant, so an
@@ -304,9 +381,99 @@ export class LlDyn {
304
381
  records.forEach((slot, k) => (order[slot] = widest[k]));
305
382
  return order;
306
383
  }
384
+ /** The string literals of `def`'s discriminant when its arms are chosen
385
+ * by reading the discriminant once (unionArmsByDiscriminant), or null
386
+ * when the union keeps one literal test per arm: some literal is not a
387
+ * string, or there are fewer than DISCRIMINANT_DISPATCH_VALUES. */
388
+ dispatchValues(def) {
389
+ const values = [];
390
+ for (const guard of def.discriminant?.cases ?? []) {
391
+ if (guard.values.length === 0)
392
+ return null;
393
+ for (const value of guard.values) {
394
+ if (typeof value !== "string")
395
+ return null;
396
+ if (!values.includes(value))
397
+ values.push(value);
398
+ }
399
+ }
400
+ return values.length < DISCRIMINANT_DISPATCH_VALUES ? null : values;
401
+ }
402
+ /** Branches to `hits[tag]` for the first arm in `order` that `%d` matches
403
+ * (unionArmMatch), or to `none` when no arm does, for
404
+ * a union whose discriminant literals are `values` (dispatchValues). The
405
+ * discriminant is read once (scr_dyn_discriminant_case, against the
406
+ * constant `table`), and only the arms whose literal it holds and the arms
407
+ * without a literal are tested, in `order`: every other arm's literal test
408
+ * fails. An arm's failed check can run a getter that changes the
409
+ * discriminant, so it is read again after each one; when its case
410
+ * changed, the tests continue arm by arm after the failed arm, as they
411
+ * would have run from the first arm. A value the runtime cannot classify
412
+ * that way (a typed capsule, an accessor, an inherited discriminant) takes
413
+ * the tests arm by arm. */
414
+ unionArmsByDiscriminant(B, def, values, order, hits, none, preserveRefs, table, trustedKinds = def.arms.map(() => null)) {
415
+ const discriminant = def.discriminant;
416
+ const literalsOf = (tag) => discriminant.cases.find((candidate) => candidate.tag === tag)?.values ?? null;
417
+ const host = this.host;
418
+ this.defs.push(`${table} = private unnamed_addr constant [${values.length} x ptr] [${values.map((value) => `ptr ${host.internLiteral(value)}`).join(", ")}]`, ``);
419
+ host.declare(`declare i32 @scr_dyn_discriminant_case(ptr, ptr, ptr, ${host.sizeType})`);
420
+ const classify = () => {
421
+ const index = B.tmp();
422
+ B.line(`${index} = call i32 @scr_dyn_discriminant_case(ptr %d, ptr ${host.internLiteral(discriminant.field)}, ptr ${table}, ${host.sizeType} ${values.length})`);
423
+ return index;
424
+ };
425
+ // The arm-by-arm tests, entered at any arm (`from[i]` tests order[i]
426
+ // and the arms after it).
427
+ const tests = B.newLabel("du.tests");
428
+ const from = order.map((_, i) => (i === 0 ? tests : B.newLabel("du.t")));
429
+ const after = (position) => position + 1 < order.length ? from[position + 1] : none;
430
+ // Tests the arms a value in case `k` (-1: no literal) can match.
431
+ const tryCase = (k) => {
432
+ const value = k < 0 ? null : values[k];
433
+ const positions = order
434
+ .map((_, position) => position)
435
+ .filter((position) => {
436
+ const literals = literalsOf(order[position]);
437
+ return literals === null || (value !== null && literals.includes(value));
438
+ });
439
+ if (positions.length === 0) {
440
+ B.br(none);
441
+ return;
442
+ }
443
+ positions.forEach((position, index) => {
444
+ const tag = order[position];
445
+ const failed = B.newLabel("du.c.f");
446
+ this.unionArmStructure(B, def, tag, hits[tag], failed, preserveRefs, trustedKinds[tag]);
447
+ B.startBlock(failed);
448
+ const next = index === positions.length - 1 ? none : B.newLabel("du.c.n");
449
+ const same = B.tmp();
450
+ B.line(`${same} = icmp eq i32 ${classify()}, ${k}`);
451
+ B.condBr(same, next, after(position));
452
+ if (next !== none)
453
+ B.startBlock(next);
454
+ });
455
+ };
456
+ const index = classify();
457
+ const unmatched = B.newLabel("du.none");
458
+ const cases = values.map(() => B.newLabel("du.case"));
459
+ B.terminate(`switch i32 ${index}, label %${tests} [ i32 -1, label %${unmatched} ${cases.map((label, k) => `i32 ${k}, label %${label}`).join(" ")} ]`);
460
+ values.forEach((_, k) => {
461
+ B.startBlock(cases[k]);
462
+ tryCase(k);
463
+ });
464
+ B.startBlock(unmatched);
465
+ tryCase(-1);
466
+ order.forEach((tag, position) => {
467
+ B.startBlock(from[position]);
468
+ this.unionArmMatch(B, def, tag, hits[tag], after(position), preserveRefs, trustedKinds[tag]);
469
+ });
470
+ }
307
471
  /** Branch to a variant only after its literal discriminator and complete
308
- * structure match. Use the same path for predicates and builders. */
309
- unionArmMatch(B, def, tag, yes, no, preserveRefs = false) {
472
+ * structure match. Use the same path for predicates and builders. With a
473
+ * `trustedKind` (builders, trustedArmKinds), a value of that dyn kind
474
+ * inside a trusted build skips the structure match once its literal
475
+ * matched. */
476
+ unionArmMatch(B, def, tag, yes, no, preserveRefs = false, trustedKind = null) {
310
477
  const guard = def.discriminant?.cases.find((candidate) => candidate.tag === tag);
311
478
  if (guard && def.discriminant) {
312
479
  const structure = B.newLabel("du.shape");
@@ -329,6 +496,25 @@ export class LlDyn {
329
496
  });
330
497
  B.startBlock(structure);
331
498
  }
499
+ this.unionArmStructure(B, def, tag, yes, no, preserveRefs, trustedKind);
500
+ }
501
+ /** The part of unionArmMatch past the arm's literal test. With a
502
+ * `trustedKind`, a value of that dyn kind inside a trusted build skips the
503
+ * structure match. */
504
+ unionArmStructure(B, def, tag, yes, no, preserveRefs, trustedKind = null) {
505
+ if (trustedKind !== null) {
506
+ this.host.declare(`declare zeroext i1 @scr_dyn_trusted_build()`);
507
+ const kind = this.kindOf(B, "%d");
508
+ const sameKind = B.tmp();
509
+ const trusted = B.tmp();
510
+ const skip = B.tmp();
511
+ B.line(`${sameKind} = icmp eq i32 ${kind}, ${trustedKind}`);
512
+ B.line(`${trusted} = call zeroext i1 @scr_dyn_trusted_build()`);
513
+ B.line(`${skip} = and i1 ${sameKind}, ${trusted}`);
514
+ const full = B.newLabel("du.full");
515
+ B.condBr(skip, yes, full);
516
+ B.startBlock(full);
517
+ }
332
518
  const matches = B.tmp();
333
519
  B.line(`${matches} = call zeroext i1 @${this.dynMatchHelper(def.arms[tag], preserveRefs)}(ptr %d)`);
334
520
  B.condBr(matches, yes, no);
@@ -344,7 +530,7 @@ export class LlDyn {
344
530
  }
345
531
  /** The value LLVM type of a dynCheck result / toDyn operand for `t`. */
346
532
  valTy(t) {
347
- return t.kind === "f64" || t.kind === "date" || t.kind === "procStream"
533
+ return t.kind === "f64" || t.kind === "procStream"
348
534
  ? "double"
349
535
  : t.kind === "bool"
350
536
  ? "i1"
@@ -403,6 +589,12 @@ export class LlDyn {
403
589
  }
404
590
  /* ── dyn node plumbing ─────────────────────────────────────────────── */
405
591
  /** Loads a dyn node's kind tag (after the size_t rc word). */
592
+ /** i1: the checked-dynamic value `d` is undefined. */
593
+ isUndefined(B, d) {
594
+ const is = B.tmp();
595
+ B.line(`${is} = icmp eq i32 ${this.kindOf(B, d)}, ${DYN_KIND.UNDEF}`);
596
+ return is;
597
+ }
406
598
  kindOf(B, d) {
407
599
  const p = B.tmp();
408
600
  const k = B.tmp();
@@ -732,7 +924,7 @@ export class LlDyn {
732
924
  }
733
925
  /** `sc_dm_<n>(ptr d) -> i1` — does this dyn fit T? Never throws. */
734
926
  dynMatchHelper(t, preserveRefs = false) {
735
- const key = typeKey(t);
927
+ const key = checkedConversionKey(t);
736
928
  const matcherKey = preserveRefs ? `identity:${key}` : key;
737
929
  const existing = this.dynMatchers.get(matcherKey);
738
930
  if (existing)
@@ -774,7 +966,10 @@ export class LlDyn {
774
966
  const lPlain = B.newLabel("dm.tr.plain");
775
967
  B.condBr(capsule, lCapsule, lPlain);
776
968
  B.startBlock(lCapsule);
777
- if (preserveRefs) {
969
+ // A class target matches only capsules of that class (tested above):
970
+ // a materialized view is a plain object, which never carries a class
971
+ // brand, so materializing one cannot change the answer.
972
+ if (preserveRefs || (t.kind === "object" && t.className !== "%Error")) {
778
973
  B.terminate(`ret i1 false`);
779
974
  }
780
975
  else {
@@ -1022,7 +1217,7 @@ export class LlDyn {
1022
1217
  B.startBlock(l0);
1023
1218
  const n = this.lenOf(B, "%d");
1024
1219
  const items = this.itemsOf(B, "%d");
1025
- this.i64Loop(B, "dm.el", n, (i, brNext) => {
1220
+ this.i64Loop(B, "dm.el", n, (i, brNext, next) => {
1026
1221
  this.host.declare(`declare zeroext i1 @scr_dyn_arr_has_index(ptr, ${this.S})`);
1027
1222
  const present = B.tmp();
1028
1223
  B.line(`${present} = call zeroext i1 @scr_dyn_arr_has_index(ptr %d, ${this.S} ${i})`);
@@ -1033,6 +1228,15 @@ export class LlDyn {
1033
1228
  brNext();
1034
1229
  B.startBlock(valueLabel);
1035
1230
  const e = this.itemAt(B, items, i);
1231
+ if (t.optionalElements) {
1232
+ // A `(T | undefined)[]` stored as T elements takes undefined
1233
+ // elements as well.
1234
+ const undef = B.tmp();
1235
+ const checkLabel = B.newLabel("dm.check");
1236
+ B.line(`${undef} = icmp eq i32 ${this.kindOf(B, e)}, ${DYN_KIND.UNDEF}`);
1237
+ B.condBr(undef, next, checkLabel);
1238
+ B.startBlock(checkLabel);
1239
+ }
1036
1240
  const ok = B.tmp();
1037
1241
  B.line(`${ok} = call zeroext i1 @${m}(ptr ${e})`);
1038
1242
  const lOk = B.newLabel("dm.eo");
@@ -1050,11 +1254,18 @@ export class LlDyn {
1050
1254
  throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
1051
1255
  // Arms in canonical order; any full match answers true.
1052
1256
  const yes = B.newLabel("dm.y");
1053
- for (let tag = 0; tag < def.arms.length; tag++) {
1054
- const ln = B.newLabel("dm.n");
1055
- this.unionArmMatch(B, def, tag, yes, ln, preserveRefs);
1056
- B.startBlock(ln);
1257
+ const values = this.dispatchValues(def);
1258
+ if (values !== null) {
1259
+ const no = B.newLabel("dm.n");
1260
+ this.unionArmsByDiscriminant(B, def, values, def.arms.map((_, tag) => tag), def.arms.map(() => yes), no, preserveRefs, `@${name}.cases`);
1261
+ B.startBlock(no);
1057
1262
  }
1263
+ else
1264
+ for (let tag = 0; tag < def.arms.length; tag++) {
1265
+ const ln = B.newLabel("dm.n");
1266
+ this.unionArmMatch(B, def, tag, yes, ln, preserveRefs);
1267
+ B.startBlock(ln);
1268
+ }
1058
1269
  B.terminate(`ret i1 false`);
1059
1270
  B.startBlock(yes);
1060
1271
  B.terminate(`ret i1 true`);
@@ -1103,8 +1314,9 @@ export class LlDyn {
1103
1314
  * fields, and at least one unless an index signature collects the
1104
1315
  * members), record members typed as unions of those leaves, records and
1105
1316
  * arrays, null and undefined (optional and nullable members; see
1106
- * jsonUnionSupported), and index signatures whose value type is not a
1107
- * union. Everything else keeps the checked-dynamic route alone. */
1317
+ * jsonUnionSupported), discriminated unions of records anywhere (see
1318
+ * jsonDiscriminatedSupported), and index signatures whose value type is
1319
+ * not a union. Everything else keeps the checked-dynamic route alone. */
1108
1320
  jsonSchemaSupported(t, visiting, member = false) {
1109
1321
  switch (t.kind) {
1110
1322
  case "f64":
@@ -1129,12 +1341,45 @@ export class LlDyn {
1129
1341
  this.jsonSchemaSupported(f.type, visiting, true))) &&
1130
1342
  (!index || this.jsonSchemaSupported(index, visiting)));
1131
1343
  }
1132
- case "union":
1344
+ case "union": {
1345
+ const def = this.host.unionsById.get(t.unionId);
1346
+ if (def?.discriminant)
1347
+ return this.jsonDiscriminatedSupported(def, visiting);
1133
1348
  return member && this.jsonUnionSupported(t, visiting);
1349
+ }
1134
1350
  default:
1135
1351
  return false;
1136
1352
  }
1137
1353
  }
1354
+ /** A discriminated union the one-pass parser writes directly, as a record
1355
+ * member, an array element or the whole document: record arms that each
1356
+ * name the string literals their discriminant member holds, every
1357
+ * literal naming one arm, plus null and undefined arms. An object then
1358
+ * selects the one arm whose literal its discriminant member holds, the
1359
+ * only arm the checked route's literal tests leave to match
1360
+ * (unionArmsByDiscriminant); an object holding no such literal declines. */
1361
+ jsonDiscriminatedSupported(def, visiting) {
1362
+ const discriminant = def.discriminant;
1363
+ const literals = new Set();
1364
+ let records = 0;
1365
+ const supported = def.arms.every((arm, tag) => {
1366
+ if (arm.kind === "nullT" || arm.kind === "undefinedT")
1367
+ return true;
1368
+ if (arm.kind !== "record")
1369
+ return false;
1370
+ records++;
1371
+ const guard = discriminant.cases.find((candidate) => candidate.tag === tag);
1372
+ if (!guard || guard.values.length === 0)
1373
+ return false;
1374
+ for (const value of guard.values) {
1375
+ if (typeof value !== "string" || literals.has(value))
1376
+ return false;
1377
+ literals.add(value);
1378
+ }
1379
+ return this.jsonSchemaSupported(arm, visiting);
1380
+ });
1381
+ return supported && records >= 2;
1382
+ }
1138
1383
  /** A union record member the one-pass parser writes directly: every arm
1139
1384
  * a number, boolean, string, null, undefined, or a supported record or
1140
1385
  * array, with at most one record and one array arm and no discriminant.
@@ -1228,9 +1473,15 @@ export class LlDyn {
1228
1473
  body = `${S} 3, ${S} ${entries.length}, ptr ${fields}, ptr ${overflow.elem}, ptr @${mangleRecordNew(t.shapeId)}, ptr null, ptr ${vAdapters(host, t).release}, ptr null, ${S} ${overflow.offset}`;
1229
1474
  break;
1230
1475
  }
1231
- case "union":
1232
- body = `${S} 5, ${S} 0, ptr null, ptr null, ptr null, ptr null, ptr null, ptr @${this.jsonUnionSchema(t, name)}, ${S} 0`;
1476
+ case "union": {
1477
+ // A discriminated union can be a whole document, whose value the
1478
+ // parser releases when text follows it.
1479
+ const release = host.unionsById.get(t.unionId)?.discriminant
1480
+ ? vAdapters(host, t).release
1481
+ : "null";
1482
+ body = `${S} 5, ${S} 0, ptr null, ptr null, ptr null, ptr null, ptr ${release}, ptr @${this.jsonUnionSchema(t, name)}, ${S} 0`;
1233
1483
  break;
1484
+ }
1234
1485
  default:
1235
1486
  throw new InternalCompilerError(`llvm emitter bug: JSON schema of ${t.kind}`);
1236
1487
  }
@@ -1241,7 +1492,11 @@ export class LlDyn {
1241
1492
  /** The ScrJsonUnion descriptor of a union member (scr_json.h layout):
1242
1493
  * its slot representation, the arm each JSON value kind selects, and the
1243
1494
  * values the runtime stores for null and for a missing member. Boxed
1244
- * unions build their boxes through `<name>_box`. */
1495
+ * unions build their boxes through `<name>_box`. A discriminated union
1496
+ * also lists its object arms by discriminant literal (`<name>_cases`),
1497
+ * and, because it can be an array element or a whole document, whose
1498
+ * values are boxes unless the union is a pointer union, it keeps its null
1499
+ * value and box whatever its field representation. */
1245
1500
  jsonUnionSchema(t, name) {
1246
1501
  const host = this.host;
1247
1502
  const S = host.sizeType;
@@ -1259,10 +1514,11 @@ export class LlDyn {
1259
1514
  : "ptr null");
1260
1515
  const nullTag = tags[0];
1261
1516
  const absentTag = tags[6];
1262
- const nullValue = !inline && nullTag >= 0 ? host.unitInstanceRef(t.unionId, nullTag) : "null";
1263
- const absentValue = !inline && absentTag >= 0 ? host.absentInstanceRef(t.unionId) : "null";
1517
+ const values = !inline || def.discriminant !== undefined;
1518
+ const nullValue = values && nullTag >= 0 ? host.unitInstanceRef(t.unionId, nullTag) : "null";
1519
+ const absentValue = values && absentTag >= 0 ? host.absentInstanceRef(t.unionId) : "null";
1264
1520
  let box = "null";
1265
- if (repr === 2) {
1521
+ if (repr === 2 || (def.discriminant && !nullable)) {
1266
1522
  box = `@${name}_box`;
1267
1523
  const lines = [`define internal ptr ${box}(i32 %tag, i64 %bits) ${FN_ATTRS} {`, `entry:`];
1268
1524
  const cases = [];
@@ -1289,10 +1545,29 @@ export class LlDyn {
1289
1545
  });
1290
1546
  this.defs.push(...lines, ` switch i32 %tag, label %none [ ${cases.join(" ")} ]`, `none:`, ` unreachable`, ...blocks, `}`, ``);
1291
1547
  }
1548
+ let cases = "null";
1549
+ if (def.discriminant) {
1550
+ const discriminant = def.discriminant;
1551
+ const caseTy = `{ ptr, ${S}, ${S}, ptr }`;
1552
+ const entries = discriminant.cases.flatMap((guard) => guard.values.map((value) => `${caseTy} { ptr ${host.cstr(String(value))}, ${S} ${Buffer.byteLength(String(value), "utf8")}, ${S} ${guard.tag}, ptr @${this.jsonSchema(def.arms[guard.tag])} }`));
1553
+ const table = `@${name}_case_table`;
1554
+ cases = `@${name}_cases`;
1555
+ this.defs.push(`${table} = internal constant [${entries.length} x ${caseTy}] [${entries.join(", ")}]`, `${cases} = internal constant { ptr, ${S}, ${S}, ptr } { ptr ${host.cstr(discriminant.field)}, ${S} ${Buffer.byteLength(discriminant.field, "utf8")}, ${S} ${entries.length}, ptr ${table} }`, ``);
1556
+ }
1292
1557
  const descriptor = `${name}_union`;
1293
- this.defs.push(`@${descriptor} = internal constant { ${S}, [7 x ${S}], [7 x ptr], ptr, ptr, ptr } { ${S} ${repr}, [7 x ${S}] [${tags.map((tag) => `${S} ${tag}`).join(", ")}], [7 x ptr] [${arms.join(", ")}], ptr ${nullValue}, ptr ${absentValue}, ptr ${box} }`, ``);
1558
+ this.defs.push(`@${descriptor} = internal constant { ${S}, [7 x ${S}], [7 x ptr], ptr, ptr, ptr, ptr } { ${S} ${repr}, [7 x ${S}] [${tags.map((tag) => `${S} ${tag}`).join(", ")}], [7 x ptr] [${arms.join(", ")}], ptr ${nullValue}, ptr ${absentValue}, ptr ${box}, ptr ${cases} }`, ``);
1294
1559
  return descriptor;
1295
1560
  }
1561
+ /** `record.sourceSpread(built, value)`: the built record keeps value's
1562
+ * kept-source order over its own declared names. */
1563
+ emitRecordSourceSpread(B, built, value, shapeId) {
1564
+ const host = this.host;
1565
+ const shape = host.recordsById.get(shapeId);
1566
+ this.keepsRecordSources = true;
1567
+ const names = this.recordNameTable(shapeId, shape);
1568
+ host.declare(`declare void @scr_record_source_spread(ptr, ptr, ptr, ptr, ${host.sizeType})`);
1569
+ B.line(`call void @scr_record_source_spread(ptr ${built}, ptr ${value}, ptr ${names.names}, ptr ${names.lens}, ${host.sizeType} ${shape.fields.length})`);
1570
+ }
1296
1571
  /** The declared-name tables scr_record_source_note scans: parallel
1297
1572
  * constant arrays of field-name bytes and byte lengths in declaration
1298
1573
  * order (the order the record serializes), interned per shape. Internal
@@ -1320,7 +1595,9 @@ export class LlDyn {
1320
1595
  * dynCheck builder — which reports the exact error. Returns +1, or null
1321
1596
  * with the pending flag set. */
1322
1597
  jsonParseHelper(t) {
1323
- if (t.kind !== "record" && t.kind !== "array")
1598
+ if (t.kind !== "record" &&
1599
+ t.kind !== "array" &&
1600
+ !(t.kind === "union" && this.host.unionsById.get(t.unionId)?.discriminant))
1324
1601
  return null;
1325
1602
  const key = typeKey(t);
1326
1603
  const existing = this.jsonParsers.get(key);
@@ -1346,7 +1623,8 @@ export class LlDyn {
1346
1623
  * BUILD the typed value (+1), or throw the catchable path-annotated
1347
1624
  * TypeError and return a dummy with the pending flag set. */
1348
1625
  dynCheckHelper(t, preserveRefs = false) {
1349
- const key = typeKey(t);
1626
+ // A `(T | undefined)[]` stored as T elements also takes undefined ones.
1627
+ const key = checkedConversionKey(t);
1350
1628
  const builderKey = preserveRefs ? `identity:${key}` : key;
1351
1629
  const existing = this.dynBuilders.get(builderKey);
1352
1630
  if (existing)
@@ -1364,6 +1642,26 @@ export class LlDyn {
1364
1642
  const B = new BlockBuilder();
1365
1643
  if (t.kind === "classval") {
1366
1644
  host.declare(`declare ptr @scr_dyn_class_check(ptr, ptr, ptr)`);
1645
+ // A subclass's class value checks into the base class's slot when
1646
+ // construction through the slot can call its thunk with the base
1647
+ // constructor's arguments; any other subclass fails the check.
1648
+ const subclasses = host.classValueSubtypes(t.className);
1649
+ if (subclasses.length > 0) {
1650
+ host.declare(`declare zeroext i1 @scr_dyn_class_is(ptr, ptr)`);
1651
+ for (const className of subclasses) {
1652
+ const subKey = host.cstr(typeKey({ kind: "classval", className }));
1653
+ const matched = B.tmp();
1654
+ B.line(`${matched} = call zeroext i1 @scr_dyn_class_is(ptr %d, ptr ${subKey})`);
1655
+ const yes = B.newLabel("sub.yes");
1656
+ const no = B.newLabel("sub.no");
1657
+ B.condBr(matched, yes, no);
1658
+ B.startBlock(yes);
1659
+ const sub = B.tmp();
1660
+ B.line(`${sub} = call ptr @scr_dyn_class_check(ptr %d, ptr ${subKey}, ptr %path)`);
1661
+ B.terminate(`ret ptr ${sub}`);
1662
+ B.startBlock(no);
1663
+ }
1664
+ }
1367
1665
  const checked = B.tmp();
1368
1666
  B.line(`${checked} = call ptr @scr_dyn_class_check(ptr %d, ptr ${host.cstr(key)}, ptr %path)`);
1369
1667
  B.terminate(`ret ptr ${checked}`);
@@ -1374,9 +1672,15 @@ export class LlDyn {
1374
1672
  const codec = textCodecRecordClass(t, (id) => host.recordsById.get(id));
1375
1673
  if (codec !== null) {
1376
1674
  // The record the codec's handle box holds (+1), or the path TypeError.
1377
- host.declare(`declare ptr @scr_text_codec_from_dyn(ptr, i1 zeroext, ptr, ptr)`);
1378
1675
  const checked = B.tmp();
1379
- B.line(`${checked} = call ptr @scr_text_codec_from_dyn(ptr %d, i1 ${codec === "TextDecoder"}, ptr %path, ptr ${want})`);
1676
+ if (codec === "StringDecoder") {
1677
+ host.declare(`declare ptr @scr_string_decoder_from_dyn(ptr, ptr, ptr)`);
1678
+ B.line(`${checked} = call ptr @scr_string_decoder_from_dyn(ptr %d, ptr %path, ptr ${want})`);
1679
+ }
1680
+ else {
1681
+ host.declare(`declare ptr @scr_text_codec_from_dyn(ptr, i1 zeroext, ptr, ptr)`);
1682
+ B.line(`${checked} = call ptr @scr_text_codec_from_dyn(ptr %d, i1 ${codec === "TextDecoder"}, ptr %path, ptr ${want})`);
1683
+ }
1380
1684
  B.terminate(`ret ptr ${checked}`);
1381
1685
  this.defs.push(`define internal ptr @${name}(ptr %d, ptr %path) ${FN_ATTRS} {`, B.render(), `}`, ``);
1382
1686
  this.host.journalBuilt?.();
@@ -1604,10 +1908,10 @@ export class LlDyn {
1604
1908
  };
1605
1909
  switch (t.kind) {
1606
1910
  case "date": {
1607
- host.declare(`declare double @scr_dyn_native_date_value(ptr)`);
1911
+ host.declare(`declare ptr @scr_dyn_native_date_check(ptr, ptr)`);
1608
1912
  const r = B.tmp();
1609
- B.line(`${r} = call double @scr_dyn_native_date_value(ptr %d)`);
1610
- B.terminate(`ret double ${r}`);
1913
+ B.line(`${r} = call ptr @scr_dyn_native_date_check(ptr %d, ptr %path)`);
1914
+ B.terminate(`ret ptr ${r}`);
1611
1915
  break;
1612
1916
  }
1613
1917
  case "url":
@@ -2043,6 +2347,21 @@ export class LlDyn {
2043
2347
  B.line(`${ip} = getelementptr inbounds %ScrDynPath, ptr ${pathSlot}, i64 0, i32 2`);
2044
2348
  B.line(`store ${host.sizeType} ${i}, ptr ${ip}`);
2045
2349
  const e = this.itemAt(B, items, i);
2350
+ if (t.optionalElements) {
2351
+ // An undefined element is a present undefined element.
2352
+ const undef = B.tmp();
2353
+ const storeUndefined = B.newLabel("dca.undef");
2354
+ const checkLabel = B.newLabel("dca.check");
2355
+ B.line(`${undef} = icmp eq i32 ${this.kindOf(B, e)}, ${DYN_KIND.UNDEF}`);
2356
+ B.condBr(undef, storeUndefined, checkLabel);
2357
+ B.startBlock(storeUndefined);
2358
+ host.declare(`declare void @scr_arr_set_undefined(ptr, double)`);
2359
+ const at = B.tmp();
2360
+ B.line(`${at} = ${sizeToDouble(this.S)} ${this.S} ${i} to double`);
2361
+ B.line(`call void @scr_arr_set_undefined(ptr ${a}, double ${at})`);
2362
+ B.br(doneLabel);
2363
+ B.startBlock(checkLabel);
2364
+ }
2046
2365
  const v = B.tmp();
2047
2366
  B.line(`${v} = call ${this.valTy(elem)} @${c}(ptr ${e}, ptr ${pathSlot})`);
2048
2367
  this.pendingBail(B, "dca", () => {
@@ -2062,13 +2381,20 @@ export class LlDyn {
2062
2381
  if (!def)
2063
2382
  throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
2064
2383
  // Arms in unionArmOrder, first FULL match wins. The matched arm's
2065
- // builder can no longer fail.
2066
- for (const i of this.unionArmOrder(def)) {
2384
+ // builder can no longer fail, and it runs as a trusted build: a
2385
+ // nested union inside it picks the arm trustedArmKinds names without
2386
+ // matching the structure that this match already checked.
2387
+ const trustedKinds = preserveRefs ? def.arms.map(() => null) : this.trustedArmKinds(def);
2388
+ const trustedCall = (call) => {
2389
+ host.declare(`declare zeroext i1 @scr_dyn_trust_enter()`);
2390
+ host.declare(`declare void @scr_dyn_trust_exit(i1 zeroext)`);
2391
+ const previous = B.tmp();
2392
+ B.line(`${previous} = call zeroext i1 @scr_dyn_trust_enter()`);
2393
+ call();
2394
+ B.line(`call void @scr_dyn_trust_exit(i1 zeroext ${previous})`);
2395
+ };
2396
+ const build = (i) => {
2067
2397
  const arm = def.arms[i];
2068
- const lHit = B.newLabel("dcu.h");
2069
- const lNext = B.newLabel("dcu.n");
2070
- this.unionArmMatch(B, def, i, lHit, lNext, preserveRefs);
2071
- B.startBlock(lHit);
2072
2398
  if (arm.kind === "undefinedT" || arm.kind === "nullT") {
2073
2399
  // A matched unit arm builds nothing: THE interned immortal
2074
2400
  // instance (rc == SIZE_MAX — no retain owed).
@@ -2093,7 +2419,7 @@ export class LlDyn {
2093
2419
  else if (host.nullableUnions.has(t.unionId)) {
2094
2420
  // A nullable union is its (+1) reference payload.
2095
2421
  const x = B.tmp();
2096
- B.line(`${x} = call ptr @${this.dynCheckHelper(arm, preserveRefs)}(ptr %d, ptr %path)`);
2422
+ trustedCall(() => B.line(`${x} = call ptr @${this.dynCheckHelper(arm, preserveRefs)}(ptr %d, ptr %path)`));
2097
2423
  B.terminate(`ret ptr ${x}`);
2098
2424
  }
2099
2425
  else {
@@ -2101,12 +2427,32 @@ export class LlDyn {
2101
2427
  host.declare(`declare ptr @scr_union_new_ref(i32, ptr, ptr, ptr, ptr)`);
2102
2428
  const x = B.tmp();
2103
2429
  const u = B.tmp();
2104
- B.line(`${x} = call ptr @${this.dynCheckHelper(arm, preserveRefs)}(ptr %d, ptr %path)`);
2430
+ trustedCall(() => B.line(`${x} = call ptr @${this.dynCheckHelper(arm, preserveRefs)}(ptr %d, ptr %path)`));
2105
2431
  B.line(`${u} = call ptr @scr_union_new_ref(i32 ${i}, ptr ${x}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${traceArg(host, arm)})`);
2106
2432
  B.terminate(`ret ptr ${u}`);
2107
2433
  }
2108
- B.startBlock(lNext);
2434
+ };
2435
+ const order = this.unionArmOrder(def);
2436
+ const values = this.dispatchValues(def);
2437
+ if (values !== null) {
2438
+ const hits = def.arms.map(() => B.newLabel("dcu.h"));
2439
+ const unmatched = B.newLabel("dcu.n");
2440
+ this.unionArmsByDiscriminant(B, def, values, order, hits, unmatched, preserveRefs, `@${name}.cases`, trustedKinds);
2441
+ for (const i of order) {
2442
+ B.startBlock(hits[i]);
2443
+ build(i);
2444
+ }
2445
+ B.startBlock(unmatched);
2109
2446
  }
2447
+ else
2448
+ for (const i of order) {
2449
+ const lHit = B.newLabel("dcu.h");
2450
+ const lNext = B.newLabel("dcu.n");
2451
+ this.unionArmMatch(B, def, i, lHit, lNext, preserveRefs, trustedKinds[i]);
2452
+ B.startBlock(lHit);
2453
+ build(i);
2454
+ B.startBlock(lNext);
2455
+ }
2110
2456
  if (preserveRefs) {
2111
2457
  B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${host.cstr("reference with its original layout")}, ptr %d)`);
2112
2458
  B.terminate(`ret ptr null`);
@@ -2330,9 +2676,9 @@ export class LlDyn {
2330
2676
  B.line(`${matched} = phi i1 [ false, %${entry} ], [ ${same}, %${lHandle} ]`);
2331
2677
  return matched;
2332
2678
  }
2333
- /** A TextEncoder or TextDecoder record boxes as its handle (+1), which
2334
- * holds the record by reference. A decoder passes the byte offsets of the
2335
- * fields its boxed decode reads. */
2679
+ /** A TextEncoder, TextDecoder or StringDecoder record boxes as its
2680
+ * handle (+1), which holds the record by reference. The decoders pass
2681
+ * the byte offsets of the fields their boxed methods read. */
2336
2682
  textCodecToDyn(B, t, shape, codec) {
2337
2683
  const host = this.host;
2338
2684
  const rc = vAdapters(host, t);
@@ -2346,10 +2692,11 @@ export class LlDyn {
2346
2692
  const base = host.nullableUnions.fieldBase(t.shapeId);
2347
2693
  const start = B.tmp();
2348
2694
  B.line(`${start} = ptrtoint ptr %v to ${this.S}`);
2349
- const offsets = TEXT_DECODER_FIELDS.map((field) => {
2695
+ const fields = codec === "StringDecoder" ? STRING_DECODER_FIELDS : TEXT_DECODER_FIELDS;
2696
+ const offsets = fields.map((field) => {
2350
2697
  const index = shape.fields.findIndex((f) => f.name === field);
2351
2698
  if (index < 0)
2352
- throw new InternalCompilerError(`llvm emitter bug: TextDecoder record lacks ${field}`);
2699
+ throw new InternalCompilerError(`llvm emitter bug: ${codec} record lacks ${field}`);
2353
2700
  const p = B.tmp();
2354
2701
  const at = B.tmp();
2355
2702
  const offset = B.tmp();
@@ -2358,8 +2705,9 @@ export class LlDyn {
2358
2705
  B.line(`${offset} = sub ${this.S} ${at}, ${start}`);
2359
2706
  return `${this.S} ${offset}`;
2360
2707
  });
2361
- host.declare(`declare ptr @scr_text_decoder_to_dyn(ptr, ptr, ptr, ${this.S}, ${this.S}, ${this.S}, ${this.S})`);
2362
- B.line(`${r} = call ptr @scr_text_decoder_to_dyn(ptr %v, ptr ${rc.retain}, ptr ${rc.release}, ${offsets.join(", ")})`);
2708
+ const fn = codec === "StringDecoder" ? "scr_string_decoder_to_dyn" : "scr_text_decoder_to_dyn";
2709
+ host.declare(`declare ptr @${fn}(ptr, ptr, ptr, ${fields.map(() => this.S).join(", ")})`);
2710
+ B.line(`${r} = call ptr @${fn}(ptr %v, ptr ${rc.retain}, ptr ${rc.release}, ${offsets.join(", ")})`);
2363
2711
  }
2364
2712
  B.terminate(`ret ptr ${r}`);
2365
2713
  }
@@ -2380,11 +2728,10 @@ export class LlDyn {
2380
2728
  let sourceAccessor = null;
2381
2729
  switch (t.kind) {
2382
2730
  case "date": {
2383
- // A Date handle holding the same time value; native Dates are
2384
- // immutable values, and so is the handle.
2385
- host.declare(`declare ptr @scr_dyn_native_date_from_ms(double)`);
2731
+ // A Date handle holding the same Date object.
2732
+ host.declare(`declare ptr @scr_dyn_native_date(ptr)`);
2386
2733
  const r = B.tmp();
2387
- B.line(`${r} = call ptr @scr_dyn_native_date_from_ms(double %v)`);
2734
+ B.line(`${r} = call ptr @scr_dyn_native_date(ptr %v)`);
2388
2735
  B.terminate(`ret ptr ${r}`);
2389
2736
  break;
2390
2737
  }
@@ -2524,7 +2871,7 @@ export class LlDyn {
2524
2871
  const shape = host.recordsById.get(t.shapeId);
2525
2872
  if (!shape)
2526
2873
  throw new InternalCompilerError(`llvm emitter bug: to-dyn of unknown shape ${t.shapeId}`);
2527
- const codec = recordTextCodecClass(shape);
2874
+ const codec = recordHandleCodecClass(shape);
2528
2875
  if (codec !== null) {
2529
2876
  this.textCodecToDyn(B, t, shape, codec);
2530
2877
  break;