@scriptc/compiler 0.4.4 → 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 (775) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +198 -44
  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 +238 -20
  28. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  29. package/dist/backend/llvm/bytes-loop-versions.test.js +11 -4
  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 +70 -1
  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 +65 -8
  50. package/dist/backend/llvm/dyn.js +375 -40
  51. package/dist/backend/llvm/dyn.js.map +1 -1
  52. package/dist/backend/llvm/emit-function.js +28 -8
  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 +58 -23
  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 +134 -13
  63. package/dist/backend/llvm/emitter.js +514 -87
  64. package/dist/backend/llvm/emitter.js.map +1 -1
  65. package/dist/backend/llvm/expr-bytes.d.ts +6 -4
  66. package/dist/backend/llvm/expr-bytes.js +31 -8
  67. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  68. package/dist/backend/llvm/expr-calls.js +13 -11
  69. package/dist/backend/llvm/expr-calls.js.map +1 -1
  70. package/dist/backend/llvm/expr-containers.d.ts +11 -0
  71. package/dist/backend/llvm/expr-containers.js +87 -9
  72. package/dist/backend/llvm/expr-containers.js.map +1 -1
  73. package/dist/backend/llvm/expr-context.d.ts +3 -0
  74. package/dist/backend/llvm/expr-control.js +83 -0
  75. package/dist/backend/llvm/expr-control.js.map +1 -1
  76. package/dist/backend/llvm/expr-dynamic.d.ts +1 -1
  77. package/dist/backend/llvm/expr-dynamic.js +22 -4
  78. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  79. package/dist/backend/llvm/expr-primitives.js +107 -9
  80. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  81. package/dist/backend/llvm/expr-stream-bridges.js +95 -22
  82. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  83. package/dist/backend/llvm/forked-analysis.d.ts +8 -0
  84. package/dist/backend/llvm/forked-analysis.js +43 -0
  85. package/dist/backend/llvm/forked-analysis.js.map +1 -0
  86. package/dist/backend/llvm/integer-values.d.ts +7 -0
  87. package/dist/backend/llvm/integer-values.js +42 -2
  88. package/dist/backend/llvm/integer-values.js.map +1 -1
  89. package/dist/backend/llvm/integer-views.d.ts +2 -1
  90. package/dist/backend/llvm/integer-views.js +12 -1
  91. package/dist/backend/llvm/integer-views.js.map +1 -1
  92. package/dist/backend/llvm/js-ic.d.ts +4 -0
  93. package/dist/backend/llvm/js-ic.js +133 -15
  94. package/dist/backend/llvm/js-ic.js.map +1 -1
  95. package/dist/backend/llvm/layouts.d.ts +1 -0
  96. package/dist/backend/llvm/layouts.js.map +1 -1
  97. package/dist/backend/llvm/lazy-captures.d.ts +6 -1
  98. package/dist/backend/llvm/lazy-captures.js +10 -5
  99. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  100. package/dist/backend/llvm/lib-abi.d.ts +5 -0
  101. package/dist/backend/llvm/lib-abi.js +19 -0
  102. package/dist/backend/llvm/lib-abi.js.map +1 -1
  103. package/dist/backend/llvm/lib-dispatch.js +128 -42
  104. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  105. package/dist/backend/llvm/lib-filesystem.d.ts +10 -0
  106. package/dist/backend/llvm/lib-filesystem.js +32 -0
  107. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  108. package/dist/backend/llvm/lib-http2.js +2 -2
  109. package/dist/backend/llvm/lib-http2.js.map +1 -1
  110. package/dist/backend/llvm/lib-network.js +2 -0
  111. package/dist/backend/llvm/lib-network.js.map +1 -1
  112. package/dist/backend/llvm/lib-process.js +11 -0
  113. package/dist/backend/llvm/lib-process.js.map +1 -1
  114. package/dist/backend/llvm/lib-shared.js +43 -0
  115. package/dist/backend/llvm/lib-shared.js.map +1 -1
  116. package/dist/backend/llvm/lib-tls.js +28 -3
  117. package/dist/backend/llvm/lib-tls.js.map +1 -1
  118. package/dist/backend/llvm/local-union-storage.test.js +2 -1
  119. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  120. package/dist/backend/llvm/loop-array-borrows.d.ts +4 -1
  121. package/dist/backend/llvm/loop-array-borrows.js +11 -5
  122. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  123. package/dist/backend/llvm/map-entry-fusion.d.ts +5 -3
  124. package/dist/backend/llvm/map-entry-fusion.js +20 -11
  125. package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
  126. package/dist/backend/llvm/map-entry-fusion.test.js +14 -6
  127. package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -1
  128. package/dist/backend/llvm/map-number-lookup.d.ts +16 -6
  129. package/dist/backend/llvm/map-number-lookup.js +41 -9
  130. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  131. package/dist/backend/llvm/map-number-lookup.test.js +70 -2
  132. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  133. package/dist/backend/llvm/map-read-lifetimes.d.ts +25 -2
  134. package/dist/backend/llvm/map-read-lifetimes.js +136 -6
  135. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  136. package/dist/backend/llvm/map-read-lifetimes.test.js +8 -3
  137. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  138. package/dist/backend/llvm/nullable-unions.d.ts +5 -0
  139. package/dist/backend/llvm/nullable-unions.js +29 -2
  140. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  141. package/dist/backend/llvm/nullable-unions.test.js +25 -1
  142. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  143. package/dist/backend/llvm/record-union-keys.test.d.ts +1 -0
  144. package/dist/backend/llvm/record-union-keys.test.js +161 -0
  145. package/dist/backend/llvm/record-union-keys.test.js.map +1 -0
  146. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  147. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  148. package/dist/backend/llvm/shapes.d.ts +4 -5
  149. package/dist/backend/llvm/shapes.js +104 -51
  150. package/dist/backend/llvm/shapes.js.map +1 -1
  151. package/dist/backend/llvm/shapes.test.js +14 -2
  152. package/dist/backend/llvm/shapes.test.js.map +1 -1
  153. package/dist/backend/llvm/speculative-integers.d.ts +50 -3
  154. package/dist/backend/llvm/speculative-integers.js +411 -24
  155. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  156. package/dist/backend/llvm/speculative-integers.test.js +103 -1
  157. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  158. package/dist/backend/llvm/split.d.ts +10 -1
  159. package/dist/backend/llvm/split.js +243 -59
  160. package/dist/backend/llvm/split.js.map +1 -1
  161. package/dist/backend/llvm/split.test.js +92 -13
  162. package/dist/backend/llvm/split.test.js.map +1 -1
  163. package/dist/backend/llvm/stack-objects.test.js +3 -2
  164. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  165. package/dist/backend/llvm/string-lifetimes.test.js +1 -1
  166. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  167. package/dist/backend/llvm/string-reads.d.ts +13 -0
  168. package/dist/backend/llvm/string-reads.js +22 -0
  169. package/dist/backend/llvm/string-reads.js.map +1 -1
  170. package/dist/backend/llvm/string-slices.d.ts +36 -2
  171. package/dist/backend/llvm/string-slices.js +308 -12
  172. package/dist/backend/llvm/string-slices.js.map +1 -1
  173. package/dist/backend/llvm/string-slices.test.js +182 -3
  174. package/dist/backend/llvm/string-slices.test.js.map +1 -1
  175. package/dist/backend/llvm/string-unit-versions.d.ts +11 -0
  176. package/dist/backend/llvm/string-unit-versions.js +191 -0
  177. package/dist/backend/llvm/string-unit-versions.js.map +1 -0
  178. package/dist/backend/llvm/string-unit-versions.test.d.ts +1 -0
  179. package/dist/backend/llvm/string-unit-versions.test.js +117 -0
  180. package/dist/backend/llvm/string-unit-versions.test.js.map +1 -0
  181. package/dist/backend/llvm/test-boxed-unions.d.ts +5 -2
  182. package/dist/backend/llvm/test-boxed-unions.js +24 -8
  183. package/dist/backend/llvm/test-boxed-unions.js.map +1 -1
  184. package/dist/backend/llvm/unwind-abi.d.ts +52 -0
  185. package/dist/backend/llvm/unwind-abi.js +498 -0
  186. package/dist/backend/llvm/unwind-abi.js.map +1 -0
  187. package/dist/backend/llvm/unwind-abi.test.d.ts +1 -0
  188. package/dist/backend/llvm/unwind-abi.test.js +255 -0
  189. package/dist/backend/llvm/unwind-abi.test.js.map +1 -0
  190. package/dist/backend/llvm/wrapping-sums.d.ts +14 -10
  191. package/dist/backend/llvm/wrapping-sums.js +31 -14
  192. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  193. package/dist/backend/loop-polls.d.ts +6 -0
  194. package/dist/backend/loop-polls.js +24 -0
  195. package/dist/backend/loop-polls.js.map +1 -1
  196. package/dist/backend/may-throw.js +8 -8
  197. package/dist/backend/may-throw.js.map +1 -1
  198. package/dist/backend/native/contracts.d.ts +12 -2
  199. package/dist/backend/native/executable.js +48 -6
  200. package/dist/backend/native/executable.js.map +1 -1
  201. package/dist/backend/native/library.js +4 -3
  202. package/dist/backend/native/library.js.map +1 -1
  203. package/dist/backend/native/program-shards.d.ts +2 -2
  204. package/dist/backend/native/program-shards.js +2 -2
  205. package/dist/backend/native/program-shards.js.map +1 -1
  206. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  207. package/dist/backend/native/runtime-inputs.js +4 -1
  208. package/dist/backend/native/runtime-inputs.js.map +1 -1
  209. package/dist/backend/native/vendor.d.ts +1 -1
  210. package/dist/backend/native/vendor.js +1 -1
  211. package/dist/backend/native/vendor.js.map +1 -1
  212. package/dist/backend/native-codegen.d.ts +3 -1
  213. package/dist/backend/native-codegen.js +4 -3
  214. package/dist/backend/native-codegen.js.map +1 -1
  215. package/dist/backend/native-link-info-core.d.ts +8 -0
  216. package/dist/backend/native-link-info-core.js.map +1 -1
  217. package/dist/backend/native-profile.d.ts +14 -0
  218. package/dist/backend/native-profile.js +28 -0
  219. package/dist/backend/native-profile.js.map +1 -1
  220. package/dist/backend/native-profile.test.js +8 -1
  221. package/dist/backend/native-profile.test.js.map +1 -1
  222. package/dist/backend/native-toolchain.test.js +11 -11
  223. package/dist/backend/native-toolchain.test.js.map +1 -1
  224. package/dist/backend/runtime-abi.d.ts +2 -2
  225. package/dist/backend/runtime-abi.js +2 -2
  226. package/dist/backend/runtime-pack-core.d.ts +3 -1
  227. package/dist/backend/runtime-pack-core.js +2 -0
  228. package/dist/backend/runtime-pack-core.js.map +1 -1
  229. package/dist/backend/runtime-pack-native.d.ts +17 -5
  230. package/dist/backend/runtime-pack-native.js +186 -14
  231. package/dist/backend/runtime-pack-native.js.map +1 -1
  232. package/dist/backend/runtime-pack-native.test.js +160 -3
  233. package/dist/backend/runtime-pack-native.test.js.map +1 -1
  234. package/dist/backend/runtime-pack-targets.test.js +2 -1
  235. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  236. package/dist/backend/runtime-pack.test.js +2 -1
  237. package/dist/backend/runtime-pack.test.js.map +1 -1
  238. package/dist/backend/vendor-archives.d.ts +4 -1
  239. package/dist/backend/vendor-archives.js +78 -4
  240. package/dist/backend/vendor-archives.js.map +1 -1
  241. package/dist/backend/vendor-inputs.d.ts +3 -1
  242. package/dist/backend/vendor-inputs.js +3 -1
  243. package/dist/backend/vendor-inputs.js.map +1 -1
  244. package/dist/backend/warm-cache.js +1 -0
  245. package/dist/backend/warm-cache.js.map +1 -1
  246. package/dist/cli/command.js +78 -11
  247. package/dist/cli/command.js.map +1 -1
  248. package/dist/cli/usage.d.ts +22 -1
  249. package/dist/cli/usage.js +33 -3
  250. package/dist/cli/usage.js.map +1 -1
  251. package/dist/compat/fetch-profile.d.ts +15 -6
  252. package/dist/compat/fetch-profile.js +519 -498
  253. package/dist/compat/fetch-profile.js.map +1 -1
  254. package/dist/compile-types.d.ts +7 -0
  255. package/dist/contracts/int32-elements.js +2 -1
  256. package/dist/contracts/int32-elements.js.map +1 -1
  257. package/dist/coverage/report.d.ts +14 -3
  258. package/dist/coverage/report.js +216 -0
  259. package/dist/coverage/report.js.map +1 -1
  260. package/dist/coverage/surface-manifest.js +25 -25
  261. package/dist/coverage/surface-manifest.js.map +1 -1
  262. package/dist/coverage/verdict-cache.d.ts +2 -0
  263. package/dist/coverage/verdict-cache.js +10 -1
  264. package/dist/coverage/verdict-cache.js.map +1 -1
  265. package/dist/diagnostics/diagnostic.d.ts +19 -0
  266. package/dist/diagnostics/diagnostic.js +52 -1
  267. package/dist/diagnostics/diagnostic.js.map +1 -1
  268. package/dist/diagnostics/envelope.d.ts +54 -0
  269. package/dist/diagnostics/envelope.js +7 -1
  270. package/dist/diagnostics/envelope.js.map +1 -1
  271. package/dist/diagnostics/render.d.ts +7 -0
  272. package/dist/diagnostics/render.js +15 -4
  273. package/dist/diagnostics/render.js.map +1 -1
  274. package/dist/executable/executable-cache.d.ts +3 -0
  275. package/dist/executable/executable-cache.js +1 -0
  276. package/dist/executable/executable-cache.js.map +1 -1
  277. package/dist/executable/executable-cache.test.js +1 -0
  278. package/dist/executable/executable-cache.test.js.map +1 -1
  279. package/dist/executable/prepare.js +5 -1
  280. package/dist/executable/prepare.js.map +1 -1
  281. package/dist/frontend/analysis.js +26 -2
  282. package/dist/frontend/analysis.js.map +1 -1
  283. package/dist/frontend/fork-target.js +67 -1
  284. package/dist/frontend/fork-target.js.map +1 -1
  285. package/dist/frontend/fork-target.test.js +43 -0
  286. package/dist/frontend/fork-target.test.js.map +1 -1
  287. package/dist/frontend/input-tracker.d.ts +4 -1
  288. package/dist/frontend/input-tracker.js +42 -4
  289. package/dist/frontend/input-tracker.js.map +1 -1
  290. package/dist/frontend/input-tracker.test.js +45 -0
  291. package/dist/frontend/input-tracker.test.js.map +1 -1
  292. package/dist/frontend/lowering/abstract-equality.js +38 -1
  293. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  294. package/dist/frontend/lowering/argument-counts.d.ts +36 -0
  295. package/dist/frontend/lowering/argument-counts.js +201 -0
  296. package/dist/frontend/lowering/argument-counts.js.map +1 -0
  297. package/dist/frontend/lowering/array-values.d.ts +27 -0
  298. package/dist/frontend/lowering/array-values.js +112 -0
  299. package/dist/frontend/lowering/array-values.js.map +1 -1
  300. package/dist/frontend/lowering/binding-analysis.d.ts +3 -0
  301. package/dist/frontend/lowering/binding-analysis.js +9 -3
  302. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  303. package/dist/frontend/lowering/builtin-namespaces.d.ts +13 -0
  304. package/dist/frontend/lowering/builtin-namespaces.js +238 -0
  305. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -0
  306. package/dist/frontend/lowering/builtins/compression.d.ts +4 -3
  307. package/dist/frontend/lowering/builtins/compression.js +86 -5
  308. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  309. package/dist/frontend/lowering/builtins/date-classes.js +17 -1
  310. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -1
  311. package/dist/frontend/lowering/builtins/dates.d.ts +19 -5
  312. package/dist/frontend/lowering/builtins/dates.js +159 -8
  313. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  314. package/dist/frontend/lowering/builtins/filesystem-calls.js +26 -1
  315. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  316. package/dist/frontend/lowering/builtins/fs-streams.d.ts +4 -0
  317. package/dist/frontend/lowering/builtins/fs-streams.js +24 -1
  318. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
  319. package/dist/frontend/lowering/builtins/json.d.ts +4 -1
  320. package/dist/frontend/lowering/builtins/json.js +9 -3
  321. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  322. package/dist/frontend/lowering/builtins/module-bindings.d.ts +6 -0
  323. package/dist/frontend/lowering/builtins/module-bindings.js +23 -1
  324. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  325. package/dist/frontend/lowering/builtins/module-resolution.d.ts +5 -0
  326. package/dist/frontend/lowering/builtins/module-resolution.js +95 -4
  327. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  328. package/dist/frontend/lowering/builtins/promises.js +144 -1
  329. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  330. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  331. package/dist/frontend/lowering/builtins/readline.js +22 -11
  332. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  333. package/dist/frontend/lowering/builtins/reflection.d.ts +4 -1
  334. package/dist/frontend/lowering/builtins/reflection.js +41 -1
  335. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  336. package/dist/frontend/lowering/builtins/text-codecs.js +31 -2
  337. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  338. package/dist/frontend/lowering/builtins/webassembly.js +4 -1
  339. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  340. package/dist/frontend/lowering/builtins/x509.d.ts +33 -0
  341. package/dist/frontend/lowering/builtins/x509.js +431 -0
  342. package/dist/frontend/lowering/builtins/x509.js.map +1 -0
  343. package/dist/frontend/lowering/call-arguments.js +44 -0
  344. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  345. package/dist/frontend/lowering/call-signatures.js +1 -1
  346. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  347. package/dist/frontend/lowering/cjs-inline-require.js +1 -1
  348. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  349. package/dist/frontend/lowering/class-attributes.d.ts +7 -0
  350. package/dist/frontend/lowering/class-attributes.js +52 -10
  351. package/dist/frontend/lowering/class-attributes.js.map +1 -1
  352. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +13 -0
  353. package/dist/frontend/lowering/class-dynamic-dispatch.js +174 -9
  354. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  355. package/dist/frontend/lowering/class-method-mutations.js +43 -8
  356. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  357. package/dist/frontend/lowering/class-method-values.js +71 -1
  358. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  359. package/dist/frontend/lowering/class-prototypes.d.ts +8 -0
  360. package/dist/frontend/lowering/class-prototypes.js +83 -2
  361. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  362. package/dist/frontend/lowering/class-to-primitive.d.ts +5 -0
  363. package/dist/frontend/lowering/class-to-primitive.js +79 -7
  364. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  365. package/dist/frontend/lowering/coercions/state.d.ts +1 -0
  366. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  367. package/dist/frontend/lowering/coercions/structural.js +89 -10
  368. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  369. package/dist/frontend/lowering/coercions/unions.d.ts +4 -2
  370. package/dist/frontend/lowering/coercions/unions.js +13 -6
  371. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  372. package/dist/frontend/lowering/containers/array-callbacks.js +51 -15
  373. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  374. package/dist/frontend/lowering/containers/array-construction.d.ts +4 -1
  375. package/dist/frontend/lowering/containers/array-construction.js +102 -9
  376. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  377. package/dist/frontend/lowering/containers/array-methods.js +85 -5
  378. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  379. package/dist/frontend/lowering/containers/array-pipelines.js +346 -77
  380. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  381. package/dist/frontend/lowering/containers/callback-arguments.js +11 -1
  382. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  383. package/dist/frontend/lowering/containers/collection-methods.js +12 -0
  384. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  385. package/dist/frontend/lowering/containers/indexed-objects.js +73 -25
  386. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  387. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +4 -4
  388. package/dist/frontend/lowering/containers/iterator-helpers.js +8 -2
  389. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  390. package/dist/frontend/lowering/containers/replacer-params.d.ts +37 -0
  391. package/dist/frontend/lowering/containers/replacer-params.js +294 -0
  392. package/dist/frontend/lowering/containers/replacer-params.js.map +1 -0
  393. package/dist/frontend/lowering/containers/replacer-params.test.d.ts +1 -0
  394. package/dist/frontend/lowering/containers/replacer-params.test.js +61 -0
  395. package/dist/frontend/lowering/containers/replacer-params.test.js.map +1 -0
  396. package/dist/frontend/lowering/containers/string-and-regexp.js +2 -1
  397. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  398. package/dist/frontend/lowering/containers/string-replacement.js +7 -3
  399. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  400. package/dist/frontend/lowering/cycle-initialization.d.ts +4 -2
  401. package/dist/frontend/lowering/cycle-initialization.js +4 -1
  402. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  403. package/dist/frontend/lowering/date-values.d.ts +9 -6
  404. package/dist/frontend/lowering/date-values.js +63 -16
  405. package/dist/frontend/lowering/date-values.js.map +1 -1
  406. package/dist/frontend/lowering/deferred-module-initializers.js +16 -8
  407. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  408. package/dist/frontend/lowering/deferred-module-initializers.test.js +22 -6
  409. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  410. package/dist/frontend/lowering/dispatch-sites.js +1 -0
  411. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  412. package/dist/frontend/lowering/expressions/array-literals.d.ts +0 -8
  413. package/dist/frontend/lowering/expressions/array-literals.js +119 -26
  414. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  415. package/dist/frontend/lowering/expressions/binary.js +38 -0
  416. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  417. package/dist/frontend/lowering/expressions/element-access.js +50 -6
  418. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  419. package/dist/frontend/lowering/expressions/identifiers.js +35 -3
  420. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  421. package/dist/frontend/lowering/expressions/narrowing.d.ts +2 -1
  422. package/dist/frontend/lowering/expressions/narrowing.js +8 -1
  423. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  424. package/dist/frontend/lowering/expressions/object-literals.js +8 -2
  425. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  426. package/dist/frontend/lowering/expressions/property-access.js +65 -34
  427. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  428. package/dist/frontend/lowering/expressions/relational.js +76 -11
  429. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  430. package/dist/frontend/lowering/expressions/typeof.js +6 -1
  431. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  432. package/dist/frontend/lowering/expressions/updates.js +20 -11
  433. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  434. package/dist/frontend/lowering/f64-handles.d.ts +8 -0
  435. package/dist/frontend/lowering/f64-handles.js +16 -0
  436. package/dist/frontend/lowering/f64-handles.js.map +1 -0
  437. package/dist/frontend/lowering/frozen-records.d.ts +5 -0
  438. package/dist/frontend/lowering/frozen-records.js +12 -4
  439. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  440. package/dist/frontend/lowering/function-context.d.ts +3 -0
  441. package/dist/frontend/lowering/function-context.js.map +1 -1
  442. package/dist/frontend/lowering/function-returns.js +15 -0
  443. package/dist/frontend/lowering/function-returns.js.map +1 -1
  444. package/dist/frontend/lowering/generic-functions.js +17 -6
  445. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  446. package/dist/frontend/lowering/instantiation-path.d.ts +3 -2
  447. package/dist/frontend/lowering/instantiation-path.js.map +1 -1
  448. package/dist/frontend/lowering/instantiation-path.test.js +6 -4
  449. package/dist/frontend/lowering/instantiation-path.test.js.map +1 -1
  450. package/dist/frontend/lowering/iterator-adapters.d.ts +4 -2
  451. package/dist/frontend/lowering/iterator-adapters.js +26 -33
  452. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  453. package/dist/frontend/lowering/js-collection-types.d.ts +11 -0
  454. package/dist/frontend/lowering/js-collection-types.js +490 -0
  455. package/dist/frontend/lowering/js-collection-types.js.map +1 -0
  456. package/dist/frontend/lowering/lib-boundary.js +2 -2
  457. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  458. package/dist/frontend/lowering/lower-assert.d.ts +14 -0
  459. package/dist/frontend/lowering/lower-assert.js +283 -26
  460. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  461. package/dist/frontend/lowering/lower-builtin-values.js +3 -3
  462. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  463. package/dist/frontend/lowering/lower-calls.js +97 -7
  464. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  465. package/dist/frontend/lowering/lower-classes.d.ts +59 -7
  466. package/dist/frontend/lowering/lower-classes.js +647 -176
  467. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  468. package/dist/frontend/lowering/lower-console.js +2 -1
  469. package/dist/frontend/lowering/lower-console.js.map +1 -1
  470. package/dist/frontend/lowering/lower-exprs.d.ts +5 -0
  471. package/dist/frontend/lowering/lower-exprs.js +52 -5
  472. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  473. package/dist/frontend/lowering/lower-functions.js +7 -0
  474. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  475. package/dist/frontend/lowering/lower-generators.js +4 -3
  476. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  477. package/dist/frontend/lowering/lower-inspect.js +264 -46
  478. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  479. package/dist/frontend/lowering/lower-modules.js +28 -17
  480. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  481. package/dist/frontend/lowering/lower-namespaces.d.ts +3 -0
  482. package/dist/frontend/lowering/lower-namespaces.js +44 -1
  483. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  484. package/dist/frontend/lowering/lower-node-module.js +1 -1
  485. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  486. package/dist/frontend/lowering/lower-server.js +126 -32
  487. package/dist/frontend/lowering/lower-server.js.map +1 -1
  488. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -1
  489. package/dist/frontend/lowering/lower-stdlib.js +51 -37
  490. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  491. package/dist/frontend/lowering/lower-stmts.js +294 -46
  492. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  493. package/dist/frontend/lowering/lower-stream.js +515 -121
  494. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  495. package/dist/frontend/lowering/lowerer.d.ts +52 -10
  496. package/dist/frontend/lowering/lowerer.js +249 -37
  497. package/dist/frontend/lowering/lowerer.js.map +1 -1
  498. package/dist/frontend/lowering/lowerer.test.js +1 -1
  499. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  500. package/dist/frontend/lowering/module-namespace-elements.d.ts +13 -0
  501. package/dist/frontend/lowering/module-namespace-elements.js +118 -1
  502. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  503. package/dist/frontend/lowering/private-brands.d.ts +5 -0
  504. package/dist/frontend/lowering/private-brands.js +39 -0
  505. package/dist/frontend/lowering/private-brands.js.map +1 -1
  506. package/dist/frontend/lowering/runtime-optional-elements.d.ts +6 -0
  507. package/dist/frontend/lowering/runtime-optional-elements.js +14 -3
  508. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  509. package/dist/frontend/lowering/sanitize-class-types.js +2 -0
  510. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
  511. package/dist/frontend/lowering/site-dependencies.d.ts +7 -2
  512. package/dist/frontend/lowering/site-dependencies.js +0 -15
  513. package/dist/frontend/lowering/site-dependencies.js.map +1 -1
  514. package/dist/frontend/lowering/site-dependencies.test.js +7 -5
  515. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -1
  516. package/dist/frontend/lowering/string-index-bounds.d.ts +7 -4
  517. package/dist/frontend/lowering/string-index-bounds.js +21 -7
  518. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  519. package/dist/frontend/lowering/surfaces.d.ts +12 -3
  520. package/dist/frontend/lowering/surfaces.js +1576 -1539
  521. package/dist/frontend/lowering/surfaces.js.map +1 -1
  522. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  523. package/dist/frontend/lowering/symbol-fields.js +45 -2
  524. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  525. package/dist/frontend/lowering/union-narrow.d.ts +5 -2
  526. package/dist/frontend/lowering/union-narrow.js +6 -3
  527. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  528. package/dist/frontend/lowering/union-narrow.test.js +10 -0
  529. package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
  530. package/dist/frontend/npm-static-namespace-defaults.d.ts +6 -0
  531. package/dist/frontend/npm-static-namespace-defaults.js +163 -0
  532. package/dist/frontend/npm-static-namespace-defaults.js.map +1 -0
  533. package/dist/frontend/npm-static-namespace-defaults.test.d.ts +1 -0
  534. package/dist/frontend/npm-static-namespace-defaults.test.js +72 -0
  535. package/dist/frontend/npm-static-namespace-defaults.test.js.map +1 -0
  536. package/dist/frontend/npm-static-prune.js +152 -111
  537. package/dist/frontend/npm-static-prune.js.map +1 -1
  538. package/dist/frontend/npm-static.js +35 -32
  539. package/dist/frontend/npm-static.js.map +1 -1
  540. package/dist/frontend/package-shims.d.ts +7 -4
  541. package/dist/frontend/package-shims.js +39 -40
  542. package/dist/frontend/package-shims.js.map +1 -1
  543. package/dist/frontend/pipeline-native.d.ts +2 -2
  544. package/dist/frontend/pipeline-native.js +2 -2
  545. package/dist/frontend/pipeline-native.js.map +1 -1
  546. package/dist/frontend/pipeline.d.ts +19 -2
  547. package/dist/frontend/pipeline.js +102 -11
  548. package/dist/frontend/pipeline.js.map +1 -1
  549. package/dist/frontend/program-analysis.d.ts +2 -0
  550. package/dist/frontend/program-analysis.js +3 -0
  551. package/dist/frontend/program-analysis.js.map +1 -1
  552. package/dist/frontend/program.d.ts +15 -0
  553. package/dist/frontend/program.js +227 -64
  554. package/dist/frontend/program.js.map +1 -1
  555. package/dist/frontend/resolve.d.ts +2 -0
  556. package/dist/frontend/resolve.js +5 -0
  557. package/dist/frontend/resolve.js.map +1 -1
  558. package/dist/frontend/services.d.ts +3 -0
  559. package/dist/frontend/services.js +31 -4
  560. package/dist/frontend/services.js.map +1 -1
  561. package/dist/frontend/shape-inference/analyze.d.ts +93 -0
  562. package/dist/frontend/shape-inference/analyze.js +3138 -0
  563. package/dist/frontend/shape-inference/analyze.js.map +1 -0
  564. package/dist/frontend/shape-inference/constant-graphs.d.ts +54 -0
  565. package/dist/frontend/shape-inference/constant-graphs.js +357 -0
  566. package/dist/frontend/shape-inference/constant-graphs.js.map +1 -0
  567. package/dist/frontend/shape-inference/domain.d.ts +32 -0
  568. package/dist/frontend/shape-inference/domain.js +104 -0
  569. package/dist/frontend/shape-inference/domain.js.map +1 -0
  570. package/dist/frontend/shape-inference/index.d.ts +7 -0
  571. package/dist/frontend/shape-inference/index.js +19 -0
  572. package/dist/frontend/shape-inference/index.js.map +1 -0
  573. package/dist/frontend/shape-inference/report.d.ts +21 -0
  574. package/dist/frontend/shape-inference/report.js +348 -0
  575. package/dist/frontend/shape-inference/report.js.map +1 -0
  576. package/dist/frontend/token-equivalence.d.ts +6 -0
  577. package/dist/frontend/token-equivalence.js +66 -9
  578. package/dist/frontend/token-equivalence.js.map +1 -1
  579. package/dist/frontend/token-equivalence.test.js +33 -1
  580. package/dist/frontend/token-equivalence.test.js.map +1 -1
  581. package/dist/frontend/ts7/checker-features.d.ts +15 -0
  582. package/dist/frontend/ts7/checker-features.js +45 -0
  583. package/dist/frontend/ts7/checker-features.js.map +1 -0
  584. package/dist/frontend/ts7/checker-features.test.d.ts +1 -0
  585. package/dist/frontend/ts7/checker-features.test.js +40 -0
  586. package/dist/frontend/ts7/checker-features.test.js.map +1 -0
  587. package/dist/frontend/ts7/checker-server.d.ts +19 -0
  588. package/dist/frontend/ts7/checker-server.js +46 -0
  589. package/dist/frontend/ts7/checker-server.js.map +1 -0
  590. package/dist/frontend/ts7/checker-server.test.d.ts +1 -0
  591. package/dist/frontend/ts7/checker-server.test.js +38 -0
  592. package/dist/frontend/ts7/checker-server.test.js.map +1 -0
  593. package/dist/frontend/ts7/lib-diagnostics.js +39 -13
  594. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -1
  595. package/dist/frontend/ts7/lib-diagnostics.test.js +40 -0
  596. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -1
  597. package/dist/frontend/ts7/native-api.d.ts +1 -0
  598. package/dist/frontend/ts7/native-api.js +25 -2
  599. package/dist/frontend/ts7/native-api.js.map +1 -1
  600. package/dist/frontend/ts7/native-process.d.ts +9 -2
  601. package/dist/frontend/ts7/native-process.js +22 -4
  602. package/dist/frontend/ts7/native-process.js.map +1 -1
  603. package/dist/frontend/ts7/program-host.d.ts +11 -0
  604. package/dist/frontend/ts7/program-host.js +36 -22
  605. package/dist/frontend/ts7/program-host.js.map +1 -1
  606. package/dist/frontend/ts7/semantic-json.d.ts +9 -0
  607. package/dist/frontend/ts7/semantic-json.js +25 -5
  608. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  609. package/dist/frontend/ts7/semantic-model.js +3 -1
  610. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  611. package/dist/frontend/ts7/source-parser.js +3 -1
  612. package/dist/frontend/ts7/source-parser.js.map +1 -1
  613. package/dist/frontend/tsc-codes.js +10 -0
  614. package/dist/frontend/tsc-codes.js.map +1 -1
  615. package/dist/frontend/type-mapper.d.ts +18 -6
  616. package/dist/frontend/type-mapper.js +160 -28
  617. package/dist/frontend/type-mapper.js.map +1 -1
  618. package/dist/index.d.ts +44 -3
  619. package/dist/index.js +27 -8
  620. package/dist/index.js.map +1 -1
  621. package/dist/ir/builtin-effects.js +29 -0
  622. package/dist/ir/builtin-effects.js.map +1 -1
  623. package/dist/ir/builtin-signatures.d.ts +7 -2
  624. package/dist/ir/builtin-signatures.js +5104 -4950
  625. package/dist/ir/builtin-signatures.js.map +1 -1
  626. package/dist/ir/callback-specialization.d.ts +4 -2
  627. package/dist/ir/callback-specialization.js +24 -9
  628. package/dist/ir/callback-specialization.js.map +1 -1
  629. package/dist/ir/capture-values.js +4 -2
  630. package/dist/ir/capture-values.js.map +1 -1
  631. package/dist/ir/char-unit-locals.d.ts +12 -2
  632. package/dist/ir/char-unit-locals.js +400 -58
  633. package/dist/ir/char-unit-locals.js.map +1 -1
  634. package/dist/ir/char-unit-locals.test.js +111 -0
  635. package/dist/ir/char-unit-locals.test.js.map +1 -1
  636. package/dist/ir/constant-globals.js +18 -4
  637. package/dist/ir/constant-globals.js.map +1 -1
  638. package/dist/ir/expression-inlining.d.ts +15 -0
  639. package/dist/ir/expression-inlining.js +166 -0
  640. package/dist/ir/expression-inlining.js.map +1 -0
  641. package/dist/ir/expression-inlining.test.d.ts +1 -0
  642. package/dist/ir/expression-inlining.test.js +123 -0
  643. package/dist/ir/expression-inlining.test.js.map +1 -0
  644. package/dist/ir/function-references.js +2 -0
  645. package/dist/ir/function-references.js.map +1 -1
  646. package/dist/ir/function-references.test.js +6 -0
  647. package/dist/ir/function-references.test.js.map +1 -1
  648. package/dist/ir/int32-arrays.d.ts +27 -6
  649. package/dist/ir/int32-arrays.js +106 -18
  650. package/dist/ir/int32-arrays.js.map +1 -1
  651. package/dist/ir/int32-slots.d.ts +26 -1
  652. package/dist/ir/int32-slots.js +284 -5
  653. package/dist/ir/int32-slots.js.map +1 -1
  654. package/dist/ir/int32-slots.test.js +5 -0
  655. package/dist/ir/int32-slots.test.js.map +1 -1
  656. package/dist/ir/integer-loop-facts.d.ts +5 -0
  657. package/dist/ir/integer-loop-facts.js +90 -1
  658. package/dist/ir/integer-loop-facts.js.map +1 -1
  659. package/dist/ir/integer-loops.d.ts +14 -1
  660. package/dist/ir/integer-loops.js +93 -7
  661. package/dist/ir/integer-loops.js.map +1 -1
  662. package/dist/ir/integer-loops.test.js +70 -0
  663. package/dist/ir/integer-loops.test.js.map +1 -1
  664. package/dist/ir/integer-ranges.js +18 -2
  665. package/dist/ir/integer-ranges.js.map +1 -1
  666. package/dist/ir/integer-ranges.test.js +64 -4
  667. package/dist/ir/integer-ranges.test.js.map +1 -1
  668. package/dist/ir/ir.d.ts +50 -8
  669. package/dist/ir/ir.js +38 -12
  670. package/dist/ir/ir.js.map +1 -1
  671. package/dist/ir/js-ic.d.ts +25 -5
  672. package/dist/ir/js-ic.js +93 -13
  673. package/dist/ir/js-ic.js.map +1 -1
  674. package/dist/ir/js-ic.test.js +153 -0
  675. package/dist/ir/js-ic.test.js.map +1 -1
  676. package/dist/ir/node-index.d.ts +7 -0
  677. package/dist/ir/node-index.js +32 -0
  678. package/dist/ir/node-index.js.map +1 -1
  679. package/dist/ir/receiver-readers.d.ts +6 -1
  680. package/dist/ir/receiver-readers.js +53 -28
  681. package/dist/ir/receiver-readers.js.map +1 -1
  682. package/dist/ir/row-pairs.d.ts +15 -0
  683. package/dist/ir/row-pairs.js +373 -0
  684. package/dist/ir/row-pairs.js.map +1 -0
  685. package/dist/ir/row-pairs.test.d.ts +1 -0
  686. package/dist/ir/row-pairs.test.js +129 -0
  687. package/dist/ir/row-pairs.test.js.map +1 -0
  688. package/dist/ir/runtime-features.d.ts +17 -4
  689. package/dist/ir/runtime-features.js +69 -12
  690. package/dist/ir/runtime-features.js.map +1 -1
  691. package/dist/ir/scalar-records.d.ts +15 -0
  692. package/dist/ir/scalar-records.js +301 -1
  693. package/dist/ir/scalar-records.js.map +1 -1
  694. package/dist/ir/scalar-records.test.js +181 -1
  695. package/dist/ir/scalar-records.test.js.map +1 -1
  696. package/dist/ir/self-captures.js +8 -0
  697. package/dist/ir/self-captures.js.map +1 -1
  698. package/dist/ir/validate.js +37 -28
  699. package/dist/ir/validate.js.map +1 -1
  700. package/dist/library/fence-eval.js +4 -4
  701. package/dist/library/fence-eval.js.map +1 -1
  702. package/dist/library/ir-policy.js +4 -0
  703. package/dist/library/ir-policy.js.map +1 -1
  704. package/dist/library/library-cache.d.ts +1 -0
  705. package/dist/library/library-cache.js +1 -0
  706. package/dist/library/library-cache.js.map +1 -1
  707. package/dist/library/library-cache.test.js +13 -0
  708. package/dist/library/library-cache.test.js.map +1 -1
  709. package/dist/native/cache.d.ts +5 -1
  710. package/dist/native/cache.js +15 -3
  711. package/dist/native/cache.js.map +1 -1
  712. package/dist/native/cli.js +6 -0
  713. package/dist/native/cli.js.map +1 -1
  714. package/dist/native/compiler.d.ts +3 -0
  715. package/dist/native/compiler.js +72 -26
  716. package/dist/native/compiler.js.map +1 -1
  717. package/dist/native/compiler.test.js +87 -2
  718. package/dist/native/compiler.test.js.map +1 -1
  719. package/dist/native/executable-cache-open.test.d.ts +1 -0
  720. package/dist/native/executable-cache-open.test.js +80 -0
  721. package/dist/native/executable-cache-open.test.js.map +1 -0
  722. package/dist/native/executable-cache.d.ts +43 -3
  723. package/dist/native/executable-cache.js +177 -36
  724. package/dist/native/executable-cache.js.map +1 -1
  725. package/dist/native/executable-cache.test.js +103 -0
  726. package/dist/native/executable-cache.test.js.map +1 -1
  727. package/dist/native/prepare.js +38 -16
  728. package/dist/native/prepare.js.map +1 -1
  729. package/dist/native/prepare.test.js +51 -1
  730. package/dist/native/prepare.test.js.map +1 -1
  731. package/dist/native/sanitizer.d.ts +1 -1
  732. package/dist/native/sanitizer.js +17 -3
  733. package/dist/native/sanitizer.js.map +1 -1
  734. package/dist/native/sanitizer.test.js +4 -0
  735. package/dist/native/sanitizer.test.js.map +1 -1
  736. package/dist/node-islands/classify.d.ts +14 -0
  737. package/dist/node-islands/classify.js +114 -0
  738. package/dist/node-islands/classify.js.map +1 -0
  739. package/dist/node-islands/detect.d.ts +13 -0
  740. package/dist/node-islands/detect.js +805 -0
  741. package/dist/node-islands/detect.js.map +1 -0
  742. package/dist/node-islands/detect.test.d.ts +1 -0
  743. package/dist/node-islands/detect.test.js +136 -0
  744. package/dist/node-islands/detect.test.js.map +1 -0
  745. package/dist/node-islands/origin.d.ts +21 -0
  746. package/dist/node-islands/origin.js +60 -0
  747. package/dist/node-islands/origin.js.map +1 -0
  748. package/dist/node-islands/policy.d.ts +49 -0
  749. package/dist/node-islands/policy.js +130 -0
  750. package/dist/node-islands/policy.js.map +1 -0
  751. package/dist/node-islands/report.d.ts +22 -0
  752. package/dist/node-islands/report.js +326 -0
  753. package/dist/node-islands/report.js.map +1 -0
  754. package/dist/node-islands/report.test.d.ts +1 -0
  755. package/dist/node-islands/report.test.js +228 -0
  756. package/dist/node-islands/report.test.js.map +1 -0
  757. package/dist/node-islands/rules.d.ts +20 -0
  758. package/dist/node-islands/rules.js +91 -0
  759. package/dist/node-islands/rules.js.map +1 -0
  760. package/dist/node-islands/scan.d.ts +53 -0
  761. package/dist/node-islands/scan.js +104 -0
  762. package/dist/node-islands/scan.js.map +1 -0
  763. package/dist/node-islands/summary.d.ts +78 -0
  764. package/dist/node-islands/summary.js +26 -0
  765. package/dist/node-islands/summary.js.map +1 -0
  766. package/dist/project-config.d.ts +50 -0
  767. package/dist/project-config.js +372 -0
  768. package/dist/project-config.js.map +1 -0
  769. package/dist/project-config.test.d.ts +1 -0
  770. package/dist/project-config.test.js +154 -0
  771. package/dist/project-config.test.js.map +1 -0
  772. package/dist/wasm/discover.js +6 -31
  773. package/dist/wasm/discover.js.map +1 -1
  774. package/package.json +20 -20
  775. package/surface-manifest.json +20 -35
@@ -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);
@@ -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)
@@ -1025,7 +1217,7 @@ export class LlDyn {
1025
1217
  B.startBlock(l0);
1026
1218
  const n = this.lenOf(B, "%d");
1027
1219
  const items = this.itemsOf(B, "%d");
1028
- this.i64Loop(B, "dm.el", n, (i, brNext) => {
1220
+ this.i64Loop(B, "dm.el", n, (i, brNext, next) => {
1029
1221
  this.host.declare(`declare zeroext i1 @scr_dyn_arr_has_index(ptr, ${this.S})`);
1030
1222
  const present = B.tmp();
1031
1223
  B.line(`${present} = call zeroext i1 @scr_dyn_arr_has_index(ptr %d, ${this.S} ${i})`);
@@ -1036,6 +1228,15 @@ export class LlDyn {
1036
1228
  brNext();
1037
1229
  B.startBlock(valueLabel);
1038
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
+ }
1039
1240
  const ok = B.tmp();
1040
1241
  B.line(`${ok} = call zeroext i1 @${m}(ptr ${e})`);
1041
1242
  const lOk = B.newLabel("dm.eo");
@@ -1053,11 +1254,18 @@ export class LlDyn {
1053
1254
  throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
1054
1255
  // Arms in canonical order; any full match answers true.
1055
1256
  const yes = B.newLabel("dm.y");
1056
- for (let tag = 0; tag < def.arms.length; tag++) {
1057
- const ln = B.newLabel("dm.n");
1058
- this.unionArmMatch(B, def, tag, yes, ln, preserveRefs);
1059
- 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);
1060
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
+ }
1061
1269
  B.terminate(`ret i1 false`);
1062
1270
  B.startBlock(yes);
1063
1271
  B.terminate(`ret i1 true`);
@@ -1106,8 +1314,9 @@ export class LlDyn {
1106
1314
  * fields, and at least one unless an index signature collects the
1107
1315
  * members), record members typed as unions of those leaves, records and
1108
1316
  * arrays, null and undefined (optional and nullable members; see
1109
- * jsonUnionSupported), and index signatures whose value type is not a
1110
- * 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. */
1111
1320
  jsonSchemaSupported(t, visiting, member = false) {
1112
1321
  switch (t.kind) {
1113
1322
  case "f64":
@@ -1132,12 +1341,45 @@ export class LlDyn {
1132
1341
  this.jsonSchemaSupported(f.type, visiting, true))) &&
1133
1342
  (!index || this.jsonSchemaSupported(index, visiting)));
1134
1343
  }
1135
- case "union":
1344
+ case "union": {
1345
+ const def = this.host.unionsById.get(t.unionId);
1346
+ if (def?.discriminant)
1347
+ return this.jsonDiscriminatedSupported(def, visiting);
1136
1348
  return member && this.jsonUnionSupported(t, visiting);
1349
+ }
1137
1350
  default:
1138
1351
  return false;
1139
1352
  }
1140
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
+ }
1141
1383
  /** A union record member the one-pass parser writes directly: every arm
1142
1384
  * a number, boolean, string, null, undefined, or a supported record or
1143
1385
  * array, with at most one record and one array arm and no discriminant.
@@ -1231,9 +1473,15 @@ export class LlDyn {
1231
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}`;
1232
1474
  break;
1233
1475
  }
1234
- case "union":
1235
- 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`;
1236
1483
  break;
1484
+ }
1237
1485
  default:
1238
1486
  throw new InternalCompilerError(`llvm emitter bug: JSON schema of ${t.kind}`);
1239
1487
  }
@@ -1244,7 +1492,11 @@ export class LlDyn {
1244
1492
  /** The ScrJsonUnion descriptor of a union member (scr_json.h layout):
1245
1493
  * its slot representation, the arm each JSON value kind selects, and the
1246
1494
  * values the runtime stores for null and for a missing member. Boxed
1247
- * 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. */
1248
1500
  jsonUnionSchema(t, name) {
1249
1501
  const host = this.host;
1250
1502
  const S = host.sizeType;
@@ -1262,10 +1514,11 @@ export class LlDyn {
1262
1514
  : "ptr null");
1263
1515
  const nullTag = tags[0];
1264
1516
  const absentTag = tags[6];
1265
- const nullValue = !inline && nullTag >= 0 ? host.unitInstanceRef(t.unionId, nullTag) : "null";
1266
- 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";
1267
1520
  let box = "null";
1268
- if (repr === 2) {
1521
+ if (repr === 2 || (def.discriminant && !nullable)) {
1269
1522
  box = `@${name}_box`;
1270
1523
  const lines = [`define internal ptr ${box}(i32 %tag, i64 %bits) ${FN_ATTRS} {`, `entry:`];
1271
1524
  const cases = [];
@@ -1292,8 +1545,17 @@ export class LlDyn {
1292
1545
  });
1293
1546
  this.defs.push(...lines, ` switch i32 %tag, label %none [ ${cases.join(" ")} ]`, `none:`, ` unreachable`, ...blocks, `}`, ``);
1294
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
+ }
1295
1557
  const descriptor = `${name}_union`;
1296
- 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} }`, ``);
1297
1559
  return descriptor;
1298
1560
  }
1299
1561
  /** `record.sourceSpread(built, value)`: the built record keeps value's
@@ -1333,7 +1595,9 @@ export class LlDyn {
1333
1595
  * dynCheck builder — which reports the exact error. Returns +1, or null
1334
1596
  * with the pending flag set. */
1335
1597
  jsonParseHelper(t) {
1336
- 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))
1337
1601
  return null;
1338
1602
  const key = typeKey(t);
1339
1603
  const existing = this.jsonParsers.get(key);
@@ -1359,7 +1623,8 @@ export class LlDyn {
1359
1623
  * BUILD the typed value (+1), or throw the catchable path-annotated
1360
1624
  * TypeError and return a dummy with the pending flag set. */
1361
1625
  dynCheckHelper(t, preserveRefs = false) {
1362
- const key = typeKey(t);
1626
+ // A `(T | undefined)[]` stored as T elements also takes undefined ones.
1627
+ const key = checkedConversionKey(t);
1363
1628
  const builderKey = preserveRefs ? `identity:${key}` : key;
1364
1629
  const existing = this.dynBuilders.get(builderKey);
1365
1630
  if (existing)
@@ -1377,6 +1642,26 @@ export class LlDyn {
1377
1642
  const B = new BlockBuilder();
1378
1643
  if (t.kind === "classval") {
1379
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
+ }
1380
1665
  const checked = B.tmp();
1381
1666
  B.line(`${checked} = call ptr @scr_dyn_class_check(ptr %d, ptr ${host.cstr(key)}, ptr %path)`);
1382
1667
  B.terminate(`ret ptr ${checked}`);
@@ -1387,9 +1672,15 @@ export class LlDyn {
1387
1672
  const codec = textCodecRecordClass(t, (id) => host.recordsById.get(id));
1388
1673
  if (codec !== null) {
1389
1674
  // The record the codec's handle box holds (+1), or the path TypeError.
1390
- host.declare(`declare ptr @scr_text_codec_from_dyn(ptr, i1 zeroext, ptr, ptr)`);
1391
1675
  const checked = B.tmp();
1392
- 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
+ }
1393
1684
  B.terminate(`ret ptr ${checked}`);
1394
1685
  this.defs.push(`define internal ptr @${name}(ptr %d, ptr %path) ${FN_ATTRS} {`, B.render(), `}`, ``);
1395
1686
  this.host.journalBuilt?.();
@@ -2056,6 +2347,21 @@ export class LlDyn {
2056
2347
  B.line(`${ip} = getelementptr inbounds %ScrDynPath, ptr ${pathSlot}, i64 0, i32 2`);
2057
2348
  B.line(`store ${host.sizeType} ${i}, ptr ${ip}`);
2058
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
+ }
2059
2365
  const v = B.tmp();
2060
2366
  B.line(`${v} = call ${this.valTy(elem)} @${c}(ptr ${e}, ptr ${pathSlot})`);
2061
2367
  this.pendingBail(B, "dca", () => {
@@ -2075,13 +2381,20 @@ export class LlDyn {
2075
2381
  if (!def)
2076
2382
  throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
2077
2383
  // Arms in unionArmOrder, first FULL match wins. The matched arm's
2078
- // builder can no longer fail.
2079
- 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) => {
2080
2397
  const arm = def.arms[i];
2081
- const lHit = B.newLabel("dcu.h");
2082
- const lNext = B.newLabel("dcu.n");
2083
- this.unionArmMatch(B, def, i, lHit, lNext, preserveRefs);
2084
- B.startBlock(lHit);
2085
2398
  if (arm.kind === "undefinedT" || arm.kind === "nullT") {
2086
2399
  // A matched unit arm builds nothing: THE interned immortal
2087
2400
  // instance (rc == SIZE_MAX — no retain owed).
@@ -2106,7 +2419,7 @@ export class LlDyn {
2106
2419
  else if (host.nullableUnions.has(t.unionId)) {
2107
2420
  // A nullable union is its (+1) reference payload.
2108
2421
  const x = B.tmp();
2109
- 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)`));
2110
2423
  B.terminate(`ret ptr ${x}`);
2111
2424
  }
2112
2425
  else {
@@ -2114,12 +2427,32 @@ export class LlDyn {
2114
2427
  host.declare(`declare ptr @scr_union_new_ref(i32, ptr, ptr, ptr, ptr)`);
2115
2428
  const x = B.tmp();
2116
2429
  const u = B.tmp();
2117
- 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)`));
2118
2431
  B.line(`${u} = call ptr @scr_union_new_ref(i32 ${i}, ptr ${x}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${traceArg(host, arm)})`);
2119
2432
  B.terminate(`ret ptr ${u}`);
2120
2433
  }
2121
- 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);
2122
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
+ }
2123
2456
  if (preserveRefs) {
2124
2457
  B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${host.cstr("reference with its original layout")}, ptr %d)`);
2125
2458
  B.terminate(`ret ptr null`);
@@ -2343,9 +2676,9 @@ export class LlDyn {
2343
2676
  B.line(`${matched} = phi i1 [ false, %${entry} ], [ ${same}, %${lHandle} ]`);
2344
2677
  return matched;
2345
2678
  }
2346
- /** A TextEncoder or TextDecoder record boxes as its handle (+1), which
2347
- * holds the record by reference. A decoder passes the byte offsets of the
2348
- * 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. */
2349
2682
  textCodecToDyn(B, t, shape, codec) {
2350
2683
  const host = this.host;
2351
2684
  const rc = vAdapters(host, t);
@@ -2359,10 +2692,11 @@ export class LlDyn {
2359
2692
  const base = host.nullableUnions.fieldBase(t.shapeId);
2360
2693
  const start = B.tmp();
2361
2694
  B.line(`${start} = ptrtoint ptr %v to ${this.S}`);
2362
- const offsets = TEXT_DECODER_FIELDS.map((field) => {
2695
+ const fields = codec === "StringDecoder" ? STRING_DECODER_FIELDS : TEXT_DECODER_FIELDS;
2696
+ const offsets = fields.map((field) => {
2363
2697
  const index = shape.fields.findIndex((f) => f.name === field);
2364
2698
  if (index < 0)
2365
- throw new InternalCompilerError(`llvm emitter bug: TextDecoder record lacks ${field}`);
2699
+ throw new InternalCompilerError(`llvm emitter bug: ${codec} record lacks ${field}`);
2366
2700
  const p = B.tmp();
2367
2701
  const at = B.tmp();
2368
2702
  const offset = B.tmp();
@@ -2371,8 +2705,9 @@ export class LlDyn {
2371
2705
  B.line(`${offset} = sub ${this.S} ${at}, ${start}`);
2372
2706
  return `${this.S} ${offset}`;
2373
2707
  });
2374
- host.declare(`declare ptr @scr_text_decoder_to_dyn(ptr, ptr, ptr, ${this.S}, ${this.S}, ${this.S}, ${this.S})`);
2375
- 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(", ")})`);
2376
2711
  }
2377
2712
  B.terminate(`ret ptr ${r}`);
2378
2713
  }
@@ -2536,7 +2871,7 @@ export class LlDyn {
2536
2871
  const shape = host.recordsById.get(t.shapeId);
2537
2872
  if (!shape)
2538
2873
  throw new InternalCompilerError(`llvm emitter bug: to-dyn of unknown shape ${t.shapeId}`);
2539
- const codec = recordTextCodecClass(shape);
2874
+ const codec = recordHandleCodecClass(shape);
2540
2875
  if (codec !== null) {
2541
2876
  this.textCodecToDyn(B, t, shape, codec);
2542
2877
  break;