@scriptc/compiler 0.4.1 → 0.4.3

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 (999) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +977 -113
  2. package/dist/backend/cycle-analysis.d.ts +5 -1
  3. package/dist/backend/cycle-analysis.js +6 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +55 -0
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +9 -1
  8. package/dist/backend/cycle-mutability.js +21 -3
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +6 -1
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.d.ts +7 -3
  13. package/dist/backend/immutability.js +33 -29
  14. package/dist/backend/immutability.js.map +1 -1
  15. package/dist/backend/library-pack.js +5 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/llvm/alloc.d.ts +23 -4
  18. package/dist/backend/llvm/alloc.js +61 -8
  19. package/dist/backend/llvm/alloc.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
  21. package/dist/backend/llvm/appended-array-literals.js +44 -36
  22. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  23. package/dist/backend/llvm/appended-array-literals.test.js +4 -3
  24. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
  25. package/dist/backend/llvm/array-search.d.ts +4 -3
  26. package/dist/backend/llvm/array-search.js +23 -10
  27. package/dist/backend/llvm/array-search.js.map +1 -1
  28. package/dist/backend/llvm/blocks.d.ts +1 -1
  29. package/dist/backend/llvm/blocks.js +2 -2
  30. package/dist/backend/llvm/blocks.js.map +1 -1
  31. package/dist/backend/llvm/byte-windows.js +2 -0
  32. package/dist/backend/llvm/byte-windows.js.map +1 -1
  33. package/dist/backend/llvm/bytes-alias.d.ts +6 -1
  34. package/dist/backend/llvm/bytes-alias.js +8 -2
  35. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  36. package/dist/backend/llvm/bytes-loop-versions.d.ts +70 -7
  37. package/dist/backend/llvm/bytes-loop-versions.js +567 -30
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +389 -2
  40. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  41. package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
  42. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  43. package/dist/backend/llvm/classes.d.ts +74 -1
  44. package/dist/backend/llvm/classes.js +364 -54
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/classes.test.js +384 -17
  47. package/dist/backend/llvm/classes.test.js.map +1 -1
  48. package/dist/backend/llvm/common.d.ts +10 -6
  49. package/dist/backend/llvm/common.js +10 -6
  50. package/dist/backend/llvm/common.js.map +1 -1
  51. package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
  52. package/dist/backend/llvm/constant-callbacks.js +91 -56
  53. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/constant-callbacks.test.js +4 -4
  55. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  56. package/dist/backend/llvm/counted-loops.d.ts +11 -1
  57. package/dist/backend/llvm/counted-loops.js +80 -23
  58. package/dist/backend/llvm/counted-loops.js.map +1 -1
  59. package/dist/backend/llvm/dense-array-access.d.ts +39 -8
  60. package/dist/backend/llvm/dense-array-access.js +222 -52
  61. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  62. package/dist/backend/llvm/dense-array-access.test.js +36 -0
  63. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  64. package/dist/backend/llvm/dense-array-loops.d.ts +35 -16
  65. package/dist/backend/llvm/dense-array-loops.js +237 -12
  66. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  67. package/dist/backend/llvm/dense-array-loops.test.js +140 -15
  68. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  69. package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
  70. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  71. package/dist/backend/llvm/dyn.d.ts +51 -1
  72. package/dist/backend/llvm/dyn.js +683 -69
  73. package/dist/backend/llvm/dyn.js.map +1 -1
  74. package/dist/backend/llvm/emit-function.js +33 -26
  75. package/dist/backend/llvm/emit-function.js.map +1 -1
  76. package/dist/backend/llvm/emit-journal.d.ts +93 -0
  77. package/dist/backend/llvm/emit-journal.js +170 -0
  78. package/dist/backend/llvm/emit-journal.js.map +1 -0
  79. package/dist/backend/llvm/emit-module.js +208 -34
  80. package/dist/backend/llvm/emit-module.js.map +1 -1
  81. package/dist/backend/llvm/emit-statements.d.ts +0 -27
  82. package/dist/backend/llvm/emit-statements.js +577 -93
  83. package/dist/backend/llvm/emit-statements.js.map +1 -1
  84. package/dist/backend/llvm/emitter-state.d.ts +7 -0
  85. package/dist/backend/llvm/emitter-state.js +14 -0
  86. package/dist/backend/llvm/emitter-state.js.map +1 -0
  87. package/dist/backend/llvm/emitter.d.ts +314 -49
  88. package/dist/backend/llvm/emitter.js +1241 -129
  89. package/dist/backend/llvm/emitter.js.map +1 -1
  90. package/dist/backend/llvm/emitter.test.js +54 -5
  91. package/dist/backend/llvm/emitter.test.js.map +1 -1
  92. package/dist/backend/llvm/expr-async.js +19 -0
  93. package/dist/backend/llvm/expr-async.js.map +1 -1
  94. package/dist/backend/llvm/expr-bytes.d.ts +5 -2
  95. package/dist/backend/llvm/expr-bytes.js +144 -52
  96. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  97. package/dist/backend/llvm/expr-callbacks.js +47 -0
  98. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  99. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  100. package/dist/backend/llvm/expr-calls.js +62 -36
  101. package/dist/backend/llvm/expr-calls.js.map +1 -1
  102. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  103. package/dist/backend/llvm/expr-containers.js +148 -40
  104. package/dist/backend/llvm/expr-containers.js.map +1 -1
  105. package/dist/backend/llvm/expr-context.d.ts +14 -0
  106. package/dist/backend/llvm/expr-control.js +2 -3
  107. package/dist/backend/llvm/expr-control.js.map +1 -1
  108. package/dist/backend/llvm/expr-dynamic.js +71 -16
  109. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  110. package/dist/backend/llvm/expr-primitives.js +126 -36
  111. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  112. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  113. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  114. package/dist/backend/llvm/expr-records.d.ts +12 -0
  115. package/dist/backend/llvm/expr-records.js +106 -0
  116. package/dist/backend/llvm/expr-records.js.map +1 -1
  117. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  118. package/dist/backend/llvm/expr-stream-bridges.js +225 -64
  119. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  120. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  121. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  122. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  123. package/dist/backend/llvm/expr-stream-callbacks.js +200 -50
  124. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  125. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  126. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  127. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  128. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  129. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  130. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  131. package/dist/backend/llvm/integer-values.d.ts +20 -1
  132. package/dist/backend/llvm/integer-values.js +71 -0
  133. package/dist/backend/llvm/integer-values.js.map +1 -1
  134. package/dist/backend/llvm/js-ic.d.ts +1 -1
  135. package/dist/backend/llvm/js-ic.js +1 -1
  136. package/dist/backend/llvm/js-ic.js.map +1 -1
  137. package/dist/backend/llvm/key-orders.d.ts +7 -0
  138. package/dist/backend/llvm/key-orders.js +33 -0
  139. package/dist/backend/llvm/key-orders.js.map +1 -0
  140. package/dist/backend/llvm/lib-connect.js +4 -0
  141. package/dist/backend/llvm/lib-connect.js.map +1 -1
  142. package/dist/backend/llvm/lib-datagram.js +11 -0
  143. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  144. package/dist/backend/llvm/lib-dispatch.js +90 -2
  145. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  146. package/dist/backend/llvm/lib-filesystem.js +65 -4
  147. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  148. package/dist/backend/llvm/lib-http2.d.ts +4 -0
  149. package/dist/backend/llvm/lib-http2.js +24 -17
  150. package/dist/backend/llvm/lib-http2.js.map +1 -1
  151. package/dist/backend/llvm/lib-lookup.js +16 -6
  152. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  153. package/dist/backend/llvm/lib-process.js +65 -14
  154. package/dist/backend/llvm/lib-process.js.map +1 -1
  155. package/dist/backend/llvm/lib-shared.js +126 -3
  156. package/dist/backend/llvm/lib-shared.js.map +1 -1
  157. package/dist/backend/llvm/lib-stream.js +97 -30
  158. package/dist/backend/llvm/lib-stream.js.map +1 -1
  159. package/dist/backend/llvm/lib-tls.js +23 -0
  160. package/dist/backend/llvm/lib-tls.js.map +1 -1
  161. package/dist/backend/llvm/local-array-reads.js +181 -64
  162. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  163. package/dist/backend/llvm/local-array-reads.test.js +28 -0
  164. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  165. package/dist/backend/llvm/loop-state.d.ts +33 -0
  166. package/dist/backend/llvm/loop-state.js +42 -0
  167. package/dist/backend/llvm/loop-state.js.map +1 -0
  168. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  169. package/dist/backend/llvm/map-number-lookup.js +91 -31
  170. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  171. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  172. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  173. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  174. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  175. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  176. package/dist/backend/llvm/nullable-unions.js +15 -3
  177. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  178. package/dist/backend/llvm/publish.d.ts +18 -1
  179. package/dist/backend/llvm/publish.js +76 -25
  180. package/dist/backend/llvm/publish.js.map +1 -1
  181. package/dist/backend/llvm/publish.test.js +3 -0
  182. package/dist/backend/llvm/publish.test.js.map +1 -1
  183. package/dist/backend/llvm/receivers.js +7 -2
  184. package/dist/backend/llvm/receivers.js.map +1 -1
  185. package/dist/backend/llvm/record-results.d.ts +1 -9
  186. package/dist/backend/llvm/record-results.js +2 -11
  187. package/dist/backend/llvm/record-results.js.map +1 -1
  188. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  189. package/dist/backend/llvm/reference-writes.js +91 -72
  190. package/dist/backend/llvm/reference-writes.js.map +1 -1
  191. package/dist/backend/llvm/regex-matchers.js +161 -14
  192. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  193. package/dist/backend/llvm/regex-matchers.test.js +18 -0
  194. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  195. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  196. package/dist/backend/llvm/running-extrema.js +115 -0
  197. package/dist/backend/llvm/running-extrema.js.map +1 -0
  198. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  199. package/dist/backend/llvm/running-extrema.test.js +89 -0
  200. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  201. package/dist/backend/llvm/shapes.d.ts +79 -21
  202. package/dist/backend/llvm/shapes.js +233 -42
  203. package/dist/backend/llvm/shapes.js.map +1 -1
  204. package/dist/backend/llvm/shapes.test.js +53 -7
  205. package/dist/backend/llvm/shapes.test.js.map +1 -1
  206. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  207. package/dist/backend/llvm/speculative-integers.js +2 -2
  208. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  209. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  210. package/dist/backend/llvm/stack-objects.js +5 -2
  211. package/dist/backend/llvm/stack-objects.js.map +1 -1
  212. package/dist/backend/llvm/string-lifetimes.test.js +2 -1
  213. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  214. package/dist/backend/llvm/string-reads.d.ts +15 -0
  215. package/dist/backend/llvm/string-reads.js +128 -0
  216. package/dist/backend/llvm/string-reads.js.map +1 -1
  217. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  218. package/dist/backend/llvm/walk-borrows.js +46 -41
  219. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  220. package/dist/backend/llvm/walkers.d.ts +3 -0
  221. package/dist/backend/llvm/walkers.js +88 -65
  222. package/dist/backend/llvm/walkers.js.map +1 -1
  223. package/dist/backend/llvm/wasm-modules.d.ts +6 -5
  224. package/dist/backend/llvm/wasm-modules.js +32 -9
  225. package/dist/backend/llvm/wasm-modules.js.map +1 -1
  226. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  227. package/dist/backend/llvm/wrapping-sums.js +126 -0
  228. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  229. package/dist/backend/mangle.d.ts +3 -0
  230. package/dist/backend/mangle.js +5 -0
  231. package/dist/backend/mangle.js.map +1 -1
  232. package/dist/backend/may-throw.d.ts +8 -10
  233. package/dist/backend/may-throw.js +14 -10
  234. package/dist/backend/may-throw.js.map +1 -1
  235. package/dist/backend/native/contracts.d.ts +27 -4
  236. package/dist/backend/native/executable.js +31 -8
  237. package/dist/backend/native/executable.js.map +1 -1
  238. package/dist/backend/native/library.js +1 -0
  239. package/dist/backend/native/library.js.map +1 -1
  240. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  241. package/dist/backend/native/runtime-inputs.js +1 -0
  242. package/dist/backend/native/runtime-inputs.js.map +1 -1
  243. package/dist/backend/native-codegen.d.ts +11 -6
  244. package/dist/backend/native-codegen.js +36 -9
  245. package/dist/backend/native-codegen.js.map +1 -1
  246. package/dist/backend/native-codegen.test.js +0 -23
  247. package/dist/backend/native-codegen.test.js.map +1 -1
  248. package/dist/backend/native-link-info-core.d.ts +18 -4
  249. package/dist/backend/native-link-info-core.js.map +1 -1
  250. package/dist/backend/optimization.d.ts +2 -2
  251. package/dist/backend/publication.d.ts +12 -1
  252. package/dist/backend/publication.js +37 -14
  253. package/dist/backend/publication.js.map +1 -1
  254. package/dist/backend/publication.test.js +30 -0
  255. package/dist/backend/publication.test.js.map +1 -1
  256. package/dist/backend/result-slots.d.ts +16 -0
  257. package/dist/backend/result-slots.js +23 -0
  258. package/dist/backend/result-slots.js.map +1 -0
  259. package/dist/backend/runtime-abi.d.ts +2 -2
  260. package/dist/backend/runtime-abi.js +2 -2
  261. package/dist/backend/runtime-pack-core.d.ts +2 -1
  262. package/dist/backend/runtime-pack-core.js +2 -1
  263. package/dist/backend/runtime-pack-core.js.map +1 -1
  264. package/dist/backend/runtime-pack-targets.test.js +5 -1
  265. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  266. package/dist/backend/runtime-pack.d.ts +0 -21
  267. package/dist/backend/runtime-pack.js +0 -29
  268. package/dist/backend/runtime-pack.js.map +1 -1
  269. package/dist/backend/runtime-pack.test.js +10 -69
  270. package/dist/backend/runtime-pack.test.js.map +1 -1
  271. package/dist/backend/stack-observations.d.ts +2 -1
  272. package/dist/backend/stack-observations.js +67 -42
  273. package/dist/backend/stack-observations.js.map +1 -1
  274. package/dist/backend/target-diagnostics.js +33 -1
  275. package/dist/backend/target-diagnostics.js.map +1 -1
  276. package/dist/backend/warm-cache.js +4 -0
  277. package/dist/backend/warm-cache.js.map +1 -1
  278. package/dist/cli/command.js +26 -6
  279. package/dist/cli/command.js.map +1 -1
  280. package/dist/cli/usage.d.ts +5 -1
  281. package/dist/cli/usage.js +10 -5
  282. package/dist/cli/usage.js.map +1 -1
  283. package/dist/compat/fetch-profile.js +1 -1
  284. package/dist/compat/fetch-profile.js.map +1 -1
  285. package/dist/contracts/check.js +5 -4
  286. package/dist/contracts/check.js.map +1 -1
  287. package/dist/contracts/int32-elements.js +10 -2
  288. package/dist/contracts/int32-elements.js.map +1 -1
  289. package/dist/coverage/report.d.ts +7 -2
  290. package/dist/coverage/report.js +30 -3
  291. package/dist/coverage/report.js.map +1 -1
  292. package/dist/coverage/verdict-cache.d.ts +1 -0
  293. package/dist/coverage/verdict-cache.js +4 -0
  294. package/dist/coverage/verdict-cache.js.map +1 -1
  295. package/dist/coverage/verdict-semantic.js +4 -0
  296. package/dist/coverage/verdict-semantic.js.map +1 -1
  297. package/dist/diagnostics/diagnostic.d.ts +4 -0
  298. package/dist/diagnostics/diagnostic.js.map +1 -1
  299. package/dist/diagnostics/dynamic-tier.d.ts +40 -0
  300. package/dist/diagnostics/dynamic-tier.js +57 -0
  301. package/dist/diagnostics/dynamic-tier.js.map +1 -0
  302. package/dist/diagnostics/envelope.d.ts +5 -1
  303. package/dist/diagnostics/envelope.js +6 -2
  304. package/dist/diagnostics/envelope.js.map +1 -1
  305. package/dist/executable/executable-cache.d.ts +25 -1
  306. package/dist/executable/executable-cache.js +60 -7
  307. package/dist/executable/executable-cache.js.map +1 -1
  308. package/dist/executable/executable-cache.test.js +46 -3
  309. package/dist/executable/executable-cache.test.js.map +1 -1
  310. package/dist/executable/prepare.js +3 -1
  311. package/dist/executable/prepare.js.map +1 -1
  312. package/dist/frontend/analysis.js +1 -0
  313. package/dist/frontend/analysis.js.map +1 -1
  314. package/dist/frontend/decl-projection.d.ts +41 -0
  315. package/dist/frontend/decl-projection.js +854 -0
  316. package/dist/frontend/decl-projection.js.map +1 -0
  317. package/dist/frontend/decl-projection.test.d.ts +1 -0
  318. package/dist/frontend/decl-projection.test.js +30 -0
  319. package/dist/frontend/decl-projection.test.js.map +1 -0
  320. package/dist/frontend/dispose-hook.d.ts +2 -0
  321. package/dist/frontend/dispose-hook.js +14 -0
  322. package/dist/frontend/dispose-hook.js.map +1 -0
  323. package/dist/frontend/dts-paths.d.ts +15 -0
  324. package/dist/frontend/dts-paths.js +25 -0
  325. package/dist/frontend/dts-paths.js.map +1 -1
  326. package/dist/frontend/input-tracker.d.ts +6 -0
  327. package/dist/frontend/input-tracker.js +51 -28
  328. package/dist/frontend/input-tracker.js.map +1 -1
  329. package/dist/frontend/input-tracker.test.js +19 -0
  330. package/dist/frontend/input-tracker.test.js.map +1 -1
  331. package/dist/frontend/jsx-entities.d.ts +4 -0
  332. package/dist/frontend/jsx-entities.js +259 -0
  333. package/dist/frontend/jsx-entities.js.map +1 -0
  334. package/dist/frontend/jsx-source.d.ts +71 -0
  335. package/dist/frontend/jsx-source.js +781 -0
  336. package/dist/frontend/jsx-source.js.map +1 -0
  337. package/dist/frontend/jsx-source.test.d.ts +1 -0
  338. package/dist/frontend/jsx-source.test.js +200 -0
  339. package/dist/frontend/jsx-source.test.js.map +1 -0
  340. package/dist/frontend/literal-values.test.js +8 -9
  341. package/dist/frontend/literal-values.test.js.map +1 -1
  342. package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
  343. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  344. package/dist/frontend/lowering/array-values.js +103 -4
  345. package/dist/frontend/lowering/array-values.js.map +1 -1
  346. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  347. package/dist/frontend/lowering/binding-analysis.js +2 -2
  348. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  349. package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
  350. package/dist/frontend/lowering/builtins/arguments.js +30 -15
  351. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  352. package/dist/frontend/lowering/builtins/atomics.js +10 -6
  353. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  354. package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
  355. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  356. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  357. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  358. package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
  359. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  360. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  361. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  362. package/dist/frontend/lowering/builtins/crypto.d.ts +4 -2
  363. package/dist/frontend/lowering/builtins/crypto.js +136 -5
  364. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  365. package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
  366. package/dist/frontend/lowering/builtins/date-classes.js +477 -0
  367. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
  368. package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
  369. package/dist/frontend/lowering/builtins/dates.js +55 -26
  370. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  371. package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
  372. package/dist/frontend/lowering/builtins/dh.js +151 -0
  373. package/dist/frontend/lowering/builtins/dh.js.map +1 -0
  374. package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
  375. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  376. package/dist/frontend/lowering/builtins/ecdh.d.ts +12 -1
  377. package/dist/frontend/lowering/builtins/ecdh.js +7 -7
  378. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -1
  379. package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
  380. package/dist/frontend/lowering/builtins/errors.js +110 -0
  381. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  382. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
  383. package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
  384. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  385. package/dist/frontend/lowering/builtins/filesystem.js +6 -4
  386. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  387. package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
  388. package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
  389. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
  390. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  391. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  392. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  393. package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
  394. package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
  395. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
  396. package/dist/frontend/lowering/builtins/json.js +2 -1
  397. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  398. package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
  399. package/dist/frontend/lowering/builtins/key-object.js +20 -7
  400. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  401. package/dist/frontend/lowering/builtins/module-calls.js +11 -4
  402. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  403. package/dist/frontend/lowering/builtins/numbers.js +18 -6
  404. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  405. package/dist/frontend/lowering/builtins/operating-system.js +4 -3
  406. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  407. package/dist/frontend/lowering/builtins/performance.js +3 -2
  408. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  409. package/dist/frontend/lowering/builtins/process.js +3 -2
  410. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  411. package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
  412. package/dist/frontend/lowering/builtins/promises.js +91 -4
  413. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  414. package/dist/frontend/lowering/builtins/promisify-callback.js +2 -1
  415. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  416. package/dist/frontend/lowering/builtins/readline.d.ts +7 -2
  417. package/dist/frontend/lowering/builtins/readline.js +58 -9
  418. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  419. package/dist/frontend/lowering/builtins/strings.js +13 -5
  420. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  421. package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
  422. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  423. package/dist/frontend/lowering/builtins/timers.js +1 -1
  424. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  425. package/dist/frontend/lowering/builtins/url.js +28 -4
  426. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  427. package/dist/frontend/lowering/builtins/v8.js +2 -1
  428. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  429. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  430. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  431. package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
  432. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
  433. package/dist/frontend/lowering/call-arguments.js +2 -1
  434. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  435. package/dist/frontend/lowering/call-signatures.js +13 -6
  436. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  437. package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
  438. package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
  439. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
  440. package/dist/frontend/lowering/class-assertions.js +3 -2
  441. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  442. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  443. package/dist/frontend/lowering/class-callbacks.js +82 -12
  444. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  445. package/dist/frontend/lowering/class-construction.d.ts +6 -2
  446. package/dist/frontend/lowering/class-construction.js +25 -16
  447. package/dist/frontend/lowering/class-construction.js.map +1 -1
  448. package/dist/frontend/lowering/class-descriptors.js +1 -1
  449. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  450. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +73 -2
  451. package/dist/frontend/lowering/class-dynamic-dispatch.js +1334 -259
  452. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  453. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +124 -0
  454. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  455. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  456. package/dist/frontend/lowering/class-iterables.js +9 -1
  457. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  458. package/dist/frontend/lowering/class-method-mutations.js +35 -9
  459. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  460. package/dist/frontend/lowering/class-method-values.js +1 -1
  461. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  462. package/dist/frontend/lowering/class-protocols.d.ts +7 -0
  463. package/dist/frontend/lowering/class-protocols.js +64 -4
  464. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  465. package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
  466. package/dist/frontend/lowering/class-prototypes.js +67 -5
  467. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  468. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  469. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  470. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  471. package/dist/frontend/lowering/class-to-primitive.js +25 -5
  472. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  473. package/dist/frontend/lowering/class-unions.js +2 -1
  474. package/dist/frontend/lowering/class-unions.js.map +1 -1
  475. package/dist/frontend/lowering/coercions/function-adapters.js +6 -5
  476. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  477. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  478. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  479. package/dist/frontend/lowering/coercions/structural.js +99 -8
  480. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  481. package/dist/frontend/lowering/coercions/unions.js +8 -7
  482. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  483. package/dist/frontend/lowering/collection-ingestion.js +2 -1
  484. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  485. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  486. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  487. package/dist/frontend/lowering/containers/array-callbacks.d.ts +7 -0
  488. package/dist/frontend/lowering/containers/array-callbacks.js +352 -31
  489. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  490. package/dist/frontend/lowering/containers/array-concat.js +12 -1
  491. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  492. package/dist/frontend/lowering/containers/array-construction.js +25 -4
  493. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  494. package/dist/frontend/lowering/containers/array-methods.js +21 -5
  495. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  496. package/dist/frontend/lowering/containers/array-pipelines.js +21 -9
  497. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  498. package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
  499. package/dist/frontend/lowering/containers/bytes.js +131 -29
  500. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  501. package/dist/frontend/lowering/containers/callback-arguments.js +55 -2
  502. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  503. package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
  504. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  505. package/dist/frontend/lowering/containers/collection-methods.js +15 -9
  506. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  507. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  508. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  509. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  510. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  511. package/dist/frontend/lowering/containers/indexed-objects.js +54 -14
  512. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  513. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
  514. package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
  515. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  516. package/dist/frontend/lowering/containers/string-and-regexp.js +87 -14
  517. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  518. package/dist/frontend/lowering/containers/string-replacement.js +45 -20
  519. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  520. package/dist/frontend/lowering/cycle-initialization.js +25 -4
  521. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  522. package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
  523. package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
  524. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  525. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  526. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  527. package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
  528. package/dist/frontend/lowering/dispatch-sites.js +218 -0
  529. package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
  530. package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
  531. package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
  532. package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
  533. package/dist/frontend/lowering/divergences.js +9 -1
  534. package/dist/frontend/lowering/divergences.js.map +1 -1
  535. package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
  536. package/dist/frontend/lowering/dyn-streams.js +1 -1
  537. package/dist/frontend/lowering/dyn-streams.js.map +1 -1
  538. package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
  539. package/dist/frontend/lowering/dynamic-tier.js +327 -0
  540. package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
  541. package/dist/frontend/lowering/error-methods.js +51 -2
  542. package/dist/frontend/lowering/error-methods.js.map +1 -1
  543. package/dist/frontend/lowering/expressions/array-literals.js +62 -0
  544. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  545. package/dist/frontend/lowering/expressions/binary.js +81 -5
  546. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  547. package/dist/frontend/lowering/expressions/element-access.js +107 -14
  548. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  549. package/dist/frontend/lowering/expressions/identifiers.js +79 -11
  550. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  551. package/dist/frontend/lowering/expressions/narrowing.js +130 -6
  552. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  553. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  554. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  555. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -3
  556. package/dist/frontend/lowering/expressions/object-literals.js +164 -56
  557. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  558. package/dist/frontend/lowering/expressions/optional-chains.js +17 -5
  559. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  560. package/dist/frontend/lowering/expressions/property-access.d.ts +0 -4
  561. package/dist/frontend/lowering/expressions/property-access.js +211 -17
  562. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  563. package/dist/frontend/lowering/expressions/relational.js +267 -30
  564. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  565. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  566. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  567. package/dist/frontend/lowering/expressions/updates.js +85 -12
  568. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  569. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  570. package/dist/frontend/lowering/frozen-records.js +322 -0
  571. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  572. package/dist/frontend/lowering/function-returns.js +49 -0
  573. package/dist/frontend/lowering/function-returns.js.map +1 -1
  574. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
  575. package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
  576. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  577. package/dist/frontend/lowering/generic-functions.d.ts +42 -1
  578. package/dist/frontend/lowering/generic-functions.js +455 -20
  579. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  580. package/dist/frontend/lowering/intern-tables.js +2 -1
  581. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  582. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  583. package/dist/frontend/lowering/iterable-values.js +297 -0
  584. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  585. package/dist/frontend/lowering/iterator-adapters.js +195 -9
  586. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  587. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  588. package/dist/frontend/lowering/js-class-fields.js +45 -10
  589. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  590. package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
  591. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
  592. package/dist/frontend/lowering/json-require.js +2 -1
  593. package/dist/frontend/lowering/json-require.js.map +1 -1
  594. package/dist/frontend/lowering/key-order-witness.d.ts +24 -4
  595. package/dist/frontend/lowering/key-order-witness.js +790 -25
  596. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  597. package/dist/frontend/lowering/key-order-witness.test.js +466 -10
  598. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  599. package/dist/frontend/lowering/lifetime-regions.js +2 -1
  600. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  601. package/dist/frontend/lowering/lower-assert.js +6 -5
  602. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  603. package/dist/frontend/lowering/lower-async-iteration.js +7 -2
  604. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  605. package/dist/frontend/lowering/lower-calls.d.ts +11 -0
  606. package/dist/frontend/lowering/lower-calls.js +776 -126
  607. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  608. package/dist/frontend/lowering/lower-classes.d.ts +29 -2
  609. package/dist/frontend/lowering/lower-classes.js +581 -46
  610. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  611. package/dist/frontend/lowering/lower-dgram.js +6 -3
  612. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  613. package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
  614. package/dist/frontend/lowering/lower-event-emitter.js +267 -20
  615. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  616. package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
  617. package/dist/frontend/lowering/lower-exprs.js +126 -13
  618. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  619. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  620. package/dist/frontend/lowering/lower-functions.js +387 -72
  621. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  622. package/dist/frontend/lowering/lower-generators.js +41 -31
  623. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  624. package/dist/frontend/lowering/lower-global-value.js +6 -3
  625. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  626. package/dist/frontend/lowering/lower-inspect.js +28 -12
  627. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  628. package/dist/frontend/lowering/lower-mixins.js +2 -1
  629. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  630. package/dist/frontend/lowering/lower-mock.js +2 -1
  631. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  632. package/dist/frontend/lowering/lower-modules.js +47 -5
  633. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  634. package/dist/frontend/lowering/lower-modules.test.js +2 -2
  635. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  636. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
  637. package/dist/frontend/lowering/lower-namespaces.js +9 -4
  638. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  639. package/dist/frontend/lowering/lower-server.d.ts +10 -0
  640. package/dist/frontend/lowering/lower-server.js +239 -61
  641. package/dist/frontend/lowering/lower-server.js.map +1 -1
  642. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  643. package/dist/frontend/lowering/lower-stdlib.js +42 -10
  644. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  645. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  646. package/dist/frontend/lowering/lower-stmts.js +622 -68
  647. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  648. package/dist/frontend/lowering/lower-stmts.test.js +1 -1
  649. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  650. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  651. package/dist/frontend/lowering/lower-stream.js +2055 -318
  652. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  653. package/dist/frontend/lowering/lower-timers.js +4 -3
  654. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  655. package/dist/frontend/lowering/lowerer.d.ts +197 -29
  656. package/dist/frontend/lowering/lowerer.js +862 -84
  657. package/dist/frontend/lowering/lowerer.js.map +1 -1
  658. package/dist/frontend/lowering/lowerer.test.js +21 -9
  659. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  660. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  661. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  662. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  663. package/dist/frontend/lowering/narrowing-stability.js +5 -0
  664. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  665. package/dist/frontend/lowering/native-ffi.js +1 -1
  666. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  667. package/dist/frontend/lowering/new-target.d.ts +12 -0
  668. package/dist/frontend/lowering/new-target.js +280 -0
  669. package/dist/frontend/lowering/new-target.js.map +1 -0
  670. package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
  671. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
  672. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  673. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  674. package/dist/frontend/lowering/private-brands.d.ts +9 -0
  675. package/dist/frontend/lowering/private-brands.js +66 -15
  676. package/dist/frontend/lowering/private-brands.js.map +1 -1
  677. package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
  678. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  679. package/dist/frontend/lowering/require-initialization.js +2 -1
  680. package/dist/frontend/lowering/require-initialization.js.map +1 -1
  681. package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
  682. package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
  683. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  684. package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
  685. package/dist/frontend/lowering/runtime-optional-records.js +18 -5
  686. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  687. package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
  688. package/dist/frontend/lowering/site-dependencies.js +84 -0
  689. package/dist/frontend/lowering/site-dependencies.js.map +1 -0
  690. package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
  691. package/dist/frontend/lowering/site-dependencies.test.js +53 -0
  692. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
  693. package/dist/frontend/lowering/stable-names.d.ts +11 -0
  694. package/dist/frontend/lowering/stable-names.js +35 -0
  695. package/dist/frontend/lowering/stable-names.js.map +1 -0
  696. package/dist/frontend/lowering/static-typeof.d.ts +2 -2
  697. package/dist/frontend/lowering/static-typeof.js +42 -3
  698. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  699. package/dist/frontend/lowering/strict-equality.js +2 -1
  700. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  701. package/dist/frontend/lowering/structural-positions.d.ts +32 -0
  702. package/dist/frontend/lowering/structural-positions.js +108 -0
  703. package/dist/frontend/lowering/structural-positions.js.map +1 -0
  704. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  705. package/dist/frontend/lowering/surfaces.js +60 -32
  706. package/dist/frontend/lowering/surfaces.js.map +1 -1
  707. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  708. package/dist/frontend/lowering/undefined-index.js +82 -0
  709. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  710. package/dist/frontend/lowering/var-hoisting.js +66 -16
  711. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  712. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  713. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  714. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  715. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  716. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  717. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  718. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  719. package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
  720. package/dist/frontend/npm-static-tsc-helpers.js +106 -0
  721. package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
  722. package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
  723. package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
  724. package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
  725. package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
  726. package/dist/frontend/npm-static-type-exports-host.js +214 -0
  727. package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
  728. package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
  729. package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
  730. package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
  731. package/dist/frontend/npm-static-type-exports.d.ts +52 -0
  732. package/dist/frontend/npm-static-type-exports.js +261 -0
  733. package/dist/frontend/npm-static-type-exports.js.map +1 -0
  734. package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
  735. package/dist/frontend/npm-static-type-exports.test.js +103 -0
  736. package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
  737. package/dist/frontend/npm-static-umd.d.ts +6 -0
  738. package/dist/frontend/npm-static-umd.js +203 -0
  739. package/dist/frontend/npm-static-umd.js.map +1 -0
  740. package/dist/frontend/npm-static-umd.test.d.ts +1 -0
  741. package/dist/frontend/npm-static-umd.test.js +105 -0
  742. package/dist/frontend/npm-static-umd.test.js.map +1 -0
  743. package/dist/frontend/npm-static.d.ts +8 -0
  744. package/dist/frontend/npm-static.js +51 -22
  745. package/dist/frontend/npm-static.js.map +1 -1
  746. package/dist/frontend/package-shims.d.ts +3 -0
  747. package/dist/frontend/package-shims.js +71 -8
  748. package/dist/frontend/package-shims.js.map +1 -1
  749. package/dist/frontend/pipeline.js +18 -10
  750. package/dist/frontend/pipeline.js.map +1 -1
  751. package/dist/frontend/process-fork.d.ts +25 -0
  752. package/dist/frontend/process-fork.js +2 -0
  753. package/dist/frontend/process-fork.js.map +1 -0
  754. package/dist/frontend/program.d.ts +21 -1
  755. package/dist/frontend/program.js +586 -74
  756. package/dist/frontend/program.js.map +1 -1
  757. package/dist/frontend/program.test.js +44 -4
  758. package/dist/frontend/program.test.js.map +1 -1
  759. package/dist/frontend/services.d.ts +6 -0
  760. package/dist/frontend/services.js +18 -0
  761. package/dist/frontend/services.js.map +1 -1
  762. package/dist/frontend/token-equivalence.d.ts +3 -0
  763. package/dist/frontend/token-equivalence.js +409 -0
  764. package/dist/frontend/token-equivalence.js.map +1 -0
  765. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  766. package/dist/frontend/token-equivalence.test.js +67 -0
  767. package/dist/frontend/token-equivalence.test.js.map +1 -0
  768. package/dist/frontend/ts7/ast-node.d.ts +43 -7
  769. package/dist/frontend/ts7/ast-node.js +1176 -129
  770. package/dist/frontend/ts7/ast-node.js.map +1 -1
  771. package/dist/frontend/ts7/ast-node.test.js +84 -0
  772. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  773. package/dist/frontend/ts7/ast-wire.d.ts +29 -3
  774. package/dist/frontend/ts7/ast-wire.js +144 -31
  775. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  776. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  777. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  778. package/dist/frontend/ts7/ast.d.ts +23 -2
  779. package/dist/frontend/ts7/ast.js +143 -2
  780. package/dist/frontend/ts7/ast.js.map +1 -1
  781. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  782. package/dist/frontend/ts7/checker-backend.js +2 -2
  783. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  784. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  785. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  786. package/dist/frontend/ts7/checker.d.ts +17 -1
  787. package/dist/frontend/ts7/checker.js +82 -1
  788. package/dist/frontend/ts7/checker.js.map +1 -1
  789. package/dist/frontend/ts7/checker.test.js +9 -6
  790. package/dist/frontend/ts7/checker.test.js.map +1 -1
  791. package/dist/frontend/ts7/enums.d.ts +3 -3
  792. package/dist/frontend/ts7/enums.generated.d.ts +10 -0
  793. package/dist/frontend/ts7/enums.generated.js +21 -0
  794. package/dist/frontend/ts7/enums.generated.js.map +1 -1
  795. package/dist/frontend/ts7/enums.js +19 -0
  796. package/dist/frontend/ts7/enums.js.map +1 -1
  797. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  798. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  799. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  800. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  801. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  802. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  803. package/dist/frontend/ts7/program-host.d.ts +7 -0
  804. package/dist/frontend/ts7/program-host.js +30 -4
  805. package/dist/frontend/ts7/program-host.js.map +1 -1
  806. package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
  807. package/dist/frontend/ts7/semantic-checker.js +25 -20
  808. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  809. package/dist/frontend/ts7/semantic-json.d.ts +13 -0
  810. package/dist/frontend/ts7/semantic-json.js +146 -0
  811. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  812. package/dist/frontend/ts7/semantic-json.test.js +57 -1
  813. package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
  814. package/dist/frontend/ts7/semantic-model.d.ts +15 -0
  815. package/dist/frontend/ts7/semantic-model.js +67 -19
  816. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  817. package/dist/frontend/ts7/semantic-model.test.js +3 -2
  818. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  819. package/dist/frontend/ts7/session.d.ts +14 -1
  820. package/dist/frontend/ts7/session.js +23 -1
  821. package/dist/frontend/ts7/session.js.map +1 -1
  822. package/dist/frontend/tsc-codes.d.ts +1 -1
  823. package/dist/frontend/tsc-codes.js +7 -0
  824. package/dist/frontend/tsc-codes.js.map +1 -1
  825. package/dist/frontend/type-mapper.d.ts +51 -7
  826. package/dist/frontend/type-mapper.js +456 -43
  827. package/dist/frontend/type-mapper.js.map +1 -1
  828. package/dist/frontend/type-mapper.test.js +1 -1
  829. package/dist/frontend/type-mapper.test.js.map +1 -1
  830. package/dist/frontend-process-args.d.ts +4 -0
  831. package/dist/frontend-process-args.js +52 -0
  832. package/dist/frontend-process-args.js.map +1 -0
  833. package/dist/frontend-process-args.test.d.ts +1 -0
  834. package/dist/frontend-process-args.test.js +47 -0
  835. package/dist/frontend-process-args.test.js.map +1 -0
  836. package/dist/frontend-process.d.ts +1 -0
  837. package/dist/frontend-process.js +23 -0
  838. package/dist/frontend-process.js.map +1 -0
  839. package/dist/heap-collection.d.ts +16 -0
  840. package/dist/heap-collection.js +42 -0
  841. package/dist/heap-collection.js.map +1 -0
  842. package/dist/heap-collection.test.d.ts +1 -0
  843. package/dist/heap-collection.test.js +59 -0
  844. package/dist/heap-collection.test.js.map +1 -0
  845. package/dist/heap-pressure.d.ts +2 -0
  846. package/dist/heap-pressure.js +12 -0
  847. package/dist/heap-pressure.js.map +1 -0
  848. package/dist/index.d.ts +2 -0
  849. package/dist/index.js +435 -89
  850. package/dist/index.js.map +1 -1
  851. package/dist/ir/analysis.js +5 -3
  852. package/dist/ir/analysis.js.map +1 -1
  853. package/dist/ir/array-length-stability.d.ts +4 -0
  854. package/dist/ir/array-length-stability.js +26 -6
  855. package/dist/ir/array-length-stability.js.map +1 -1
  856. package/dist/ir/array-length-stability.test.js +49 -0
  857. package/dist/ir/array-length-stability.test.js.map +1 -1
  858. package/dist/ir/builtin-effects.d.ts +7 -0
  859. package/dist/ir/builtin-effects.js +80 -0
  860. package/dist/ir/builtin-effects.js.map +1 -1
  861. package/dist/ir/builtin-signatures.d.ts +7 -1
  862. package/dist/ir/builtin-signatures.js +303 -21
  863. package/dist/ir/builtin-signatures.js.map +1 -1
  864. package/dist/ir/callback-specialization.d.ts +2 -1
  865. package/dist/ir/callback-specialization.js +23 -18
  866. package/dist/ir/callback-specialization.js.map +1 -1
  867. package/dist/ir/char-unit-locals.d.ts +19 -0
  868. package/dist/ir/char-unit-locals.js +185 -0
  869. package/dist/ir/char-unit-locals.js.map +1 -0
  870. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  871. package/dist/ir/char-unit-locals.test.js +94 -0
  872. package/dist/ir/char-unit-locals.test.js.map +1 -0
  873. package/dist/ir/final-fields.d.ts +3 -1
  874. package/dist/ir/final-fields.js +15 -17
  875. package/dist/ir/final-fields.js.map +1 -1
  876. package/dist/ir/function-references.d.ts +2 -0
  877. package/dist/ir/function-references.js +2 -0
  878. package/dist/ir/function-references.js.map +1 -1
  879. package/dist/ir/function-references.test.js +5 -0
  880. package/dist/ir/function-references.test.js.map +1 -1
  881. package/dist/ir/initializer-bindings.d.ts +2 -1
  882. package/dist/ir/initializer-bindings.js +27 -20
  883. package/dist/ir/initializer-bindings.js.map +1 -1
  884. package/dist/ir/int32-arrays.d.ts +108 -0
  885. package/dist/ir/int32-arrays.js +831 -0
  886. package/dist/ir/int32-arrays.js.map +1 -0
  887. package/dist/ir/int32-slots.d.ts +36 -6
  888. package/dist/ir/int32-slots.js +370 -171
  889. package/dist/ir/int32-slots.js.map +1 -1
  890. package/dist/ir/int32-slots.test.js +3 -1
  891. package/dist/ir/int32-slots.test.js.map +1 -1
  892. package/dist/ir/integer-loop-facts.d.ts +9 -4
  893. package/dist/ir/integer-loop-facts.js +93 -18
  894. package/dist/ir/integer-loop-facts.js.map +1 -1
  895. package/dist/ir/integer-loops.d.ts +49 -0
  896. package/dist/ir/integer-loops.js +202 -40
  897. package/dist/ir/integer-loops.js.map +1 -1
  898. package/dist/ir/integer-loops.test.js +211 -1
  899. package/dist/ir/integer-loops.test.js.map +1 -1
  900. package/dist/ir/integer-ranges.d.ts +5 -0
  901. package/dist/ir/integer-ranges.js +125 -12
  902. package/dist/ir/integer-ranges.js.map +1 -1
  903. package/dist/ir/integer-ranges.test.js +94 -0
  904. package/dist/ir/integer-ranges.test.js.map +1 -1
  905. package/dist/ir/ir.d.ts +87 -9
  906. package/dist/ir/ir.js +61 -2
  907. package/dist/ir/ir.js.map +1 -1
  908. package/dist/ir/ir.test.js +21 -1
  909. package/dist/ir/ir.test.js.map +1 -1
  910. package/dist/ir/js-ic.d.ts +19 -2
  911. package/dist/ir/js-ic.js +95 -11
  912. package/dist/ir/js-ic.js.map +1 -1
  913. package/dist/ir/js-ic.test.js +188 -0
  914. package/dist/ir/js-ic.test.js.map +1 -1
  915. package/dist/ir/node-index.d.ts +57 -0
  916. package/dist/ir/node-index.js +215 -0
  917. package/dist/ir/node-index.js.map +1 -0
  918. package/dist/ir/paired-while-loops.d.ts +25 -0
  919. package/dist/ir/paired-while-loops.js +335 -0
  920. package/dist/ir/paired-while-loops.js.map +1 -0
  921. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  922. package/dist/ir/paired-while-loops.test.js +163 -0
  923. package/dist/ir/paired-while-loops.test.js.map +1 -0
  924. package/dist/ir/parameter-versions.d.ts +25 -0
  925. package/dist/ir/parameter-versions.js +300 -0
  926. package/dist/ir/parameter-versions.js.map +1 -0
  927. package/dist/ir/runtime-features.d.ts +60 -15
  928. package/dist/ir/runtime-features.js +276 -35
  929. package/dist/ir/runtime-features.js.map +1 -1
  930. package/dist/ir/serialize.d.ts +12 -2
  931. package/dist/ir/serialize.js +16 -3
  932. package/dist/ir/serialize.js.map +1 -1
  933. package/dist/ir/serialize.test.js +17 -0
  934. package/dist/ir/serialize.test.js.map +1 -1
  935. package/dist/ir/tiers.js +1 -0
  936. package/dist/ir/tiers.js.map +1 -1
  937. package/dist/ir/traverse.d.ts +2 -0
  938. package/dist/ir/traverse.js +29 -5
  939. package/dist/ir/traverse.js.map +1 -1
  940. package/dist/ir/validate.js +171 -45
  941. package/dist/ir/validate.js.map +1 -1
  942. package/dist/library/ir-policy.js +12 -0
  943. package/dist/library/ir-policy.js.map +1 -1
  944. package/dist/library/library-cache.d.ts +2 -0
  945. package/dist/library/library-cache.js.map +1 -1
  946. package/dist/library/prepare.js +2 -0
  947. package/dist/library/prepare.js.map +1 -1
  948. package/dist/native/cache.d.ts +6 -1
  949. package/dist/native/cache.js +28 -5
  950. package/dist/native/cache.js.map +1 -1
  951. package/dist/native/cache.test.js +16 -2
  952. package/dist/native/cache.test.js.map +1 -1
  953. package/dist/native/cli.js +26 -1
  954. package/dist/native/cli.js.map +1 -1
  955. package/dist/native/compiler.js +8 -6
  956. package/dist/native/compiler.js.map +1 -1
  957. package/dist/native/executable-cache.d.ts +1 -1
  958. package/dist/native/executable-cache.js +2 -2
  959. package/dist/native/executable-cache.js.map +1 -1
  960. package/dist/native/prepare.d.ts +3 -1
  961. package/dist/native/prepare.js +123 -31
  962. package/dist/native/prepare.js.map +1 -1
  963. package/dist/native/prepare.test.js +78 -18
  964. package/dist/native/prepare.test.js.map +1 -1
  965. package/dist/native/sanitizer.test.js +6 -1
  966. package/dist/native/sanitizer.test.js.map +1 -1
  967. package/dist/native/text-file.d.ts +13 -3
  968. package/dist/native/text-file.js +63 -9
  969. package/dist/native/text-file.js.map +1 -1
  970. package/dist/native/text-file.test.d.ts +1 -0
  971. package/dist/native/text-file.test.js +49 -0
  972. package/dist/native/text-file.test.js.map +1 -0
  973. package/dist/native/toolchain.js +4 -4
  974. package/dist/native/toolchain.js.map +1 -1
  975. package/dist/native/toolchain.test.js +3 -3
  976. package/dist/native/toolchain.test.js.map +1 -1
  977. package/dist/startup-cache.d.ts +1 -0
  978. package/dist/startup-cache.js +1 -0
  979. package/dist/startup-cache.js.map +1 -1
  980. package/dist/text-parts.d.ts +7 -0
  981. package/dist/text-parts.js +44 -0
  982. package/dist/text-parts.js.map +1 -1
  983. package/dist/text-parts.test.d.ts +1 -0
  984. package/dist/text-parts.test.js +46 -0
  985. package/dist/text-parts.test.js.map +1 -0
  986. package/dist/timing.d.ts +9 -2
  987. package/dist/timing.js +7 -4
  988. package/dist/timing.js.map +1 -1
  989. package/dist/wasm/translate.d.ts +4 -0
  990. package/dist/wasm/translate.js +2 -2
  991. package/dist/wasm/translate.js.map +1 -1
  992. package/package.json +21 -21
  993. package/shims/chalk/v5.ts +688 -0
  994. package/shims/hono-node-server/v2.ts +645 -0
  995. package/shims/hot-shots/client.ts +1126 -0
  996. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  997. package/shims/hot-shots/v8.ts +8 -0
  998. package/shims/undici/core/client.ts +4 -4
  999. package/surface-manifest.json +44 -52
@@ -1,13 +1,19 @@
1
+ import { F64 } from "../../ir/ir.js";
1
2
  import { byteNumberAccess } from "../../ir/byte-numbers.js";
2
3
  import { everyExprChild, everyStmtChild } from "../../ir/traverse.js";
3
4
  import { exactInteger, widenInteger } from "./integer-values.js";
4
- import { emitCountedLoopLimit, emitCountedLoopSafety } from "./counted-loops.js";
5
- import { emitBytesHeaderLength } from "./expr-bytes.js";
5
+ import { emitCountedLoopLimit, emitCountedLoopSafety, emitExactIntegerTest, } from "./counted-loops.js";
6
+ import { emitBytesHeaderLength, emitBytesSharedStorage } from "./expr-bytes.js";
7
+ import { f64Lit } from "./common.js";
8
+ import { emitStringAsciiFlag, emitStringByteLength } from "./string-reads.js";
6
9
  const MAX_COST = 400;
7
- const MAX_FIXED_END = 2 ** 32;
10
+ const MAX_FIXED_END = 2 ** 31;
8
11
  const MAX_CHECKS = 8;
9
12
  const MAX_OFFSET = 2 ** 31;
10
13
  const SAFE = Number.MAX_SAFE_INTEGER;
14
+ /** The range the guard requires of an invariant index term without a
15
+ * proven one: every index of a typed array of at most 2^32 elements. */
16
+ const GUARDED_TERM = { min: -(2 ** 32), max: 2 ** 32 };
11
17
  const INVARIANT_OPS = new Set(["+", "-", "*", "&", "|", "^", "<<", ">>", ">>>"]);
12
18
  /** Loop versioning for typed-array bounds. A typed array's length and data
13
19
  * pointer are fixed at construction (ScrBytes has no resize, transfer or
@@ -19,13 +25,28 @@ const INVARIANT_OPS = new Set(["+", "-", "*", "&", "|", "^", "<<", ">>", ">>>"])
19
25
  * `hi < length`, such as `table[x & 0xff]` or a constant-trip counter;
20
26
  * - an index `k * counter + invariant + c` of a counted loop needs its first
21
27
  * and last values in bounds, such as `out[base + i]` for `i < n` or
22
- * `view.getUint32(i * 4)`.
28
+ * `view.getUint32(i * 4)`. An invariant without a proven integer range,
29
+ * such as `base` for `const base = r * cols`, must also be an exact
30
+ * integer between -2^32 and 2^32, which the guard tests.
31
+ *
32
+ * `s.charCodeAt(index)` and `s.charAt(index)` (so `s[index]`) of a string
33
+ * binding qualify the same way. A string is immutable: its bytes, its
34
+ * length and the capacity-word bit that proves it ASCII (string-reads.ts)
35
+ * are fixed when it is built. The guard also requires that bit, so each
36
+ * UTF-16 unit is one byte and the length is the byte length. The fast copy
37
+ * reads each unit with one byte load, and each character as the immortal
38
+ * one-character string for its byte.
39
+ *
40
+ * In worker programs, every access of a view that may be shared tests its
41
+ * shared storage. A view's storage is also fixed at construction, so the
42
+ * same guard tests each invariant receiver once, and the fast copy reads
43
+ * and writes thread-owned views directly.
23
44
  *
24
45
  * Only small synchronous loops are versioned (nested loops included), and
25
46
  * the emitter bounds how deeply versions nest. The checked loop runs
26
47
  * whenever the guard fails, and keeps every out-of-bounds read, ignored
27
48
  * write and NaN-index behavior. */
28
- export function matchBytesLoopVersion(loop, counted, facts) {
49
+ export function matchBytesLoopVersion(loop, counted, facts, paired = null) {
29
50
  const written = new Set();
30
51
  const temps = new Map();
31
52
  let cost = 0;
@@ -66,10 +87,10 @@ export function matchBytesLoopVersion(loop, counted, facts) {
66
87
  // The guard runs before the initializer, so a binding the initializer
67
88
  // writes is not invariant either: `for (let i = (a = b, 0); ...)` must
68
89
  // not keep the bounds the guard proved for the old `a`.
69
- if ((loop.init !== null && !scanStmt(loop.init)) ||
90
+ if ((loop.kind === "for" && loop.init !== null && !scanStmt(loop.init)) ||
70
91
  !loop.body.every(scanStmt) ||
71
92
  (loop.cond !== null && !scanExpr(loop.cond)) ||
72
- (loop.update !== null && !scanStmt(loop.update)))
93
+ (loop.kind === "for" && loop.update !== null && !scanStmt(loop.update)))
73
94
  return null;
74
95
  // A body temp stands for its initializer only when it is a constant
75
96
  // binding assigned exactly once, by that declaration.
@@ -106,7 +127,9 @@ export function matchBytesLoopVersion(loop, counted, facts) {
106
127
  };
107
128
  const resolving = new Set();
108
129
  const root = (e) => {
109
- if (e.kind !== "varRef" || e.type.kind !== "bytes")
130
+ if (e.kind !== "varRef" || (e.type.kind !== "bytes" && e.type.kind !== "string"))
131
+ return null;
132
+ if (facts.scalarStrings.has(e.localId))
110
133
  return null;
111
134
  const init = temp(e.localId);
112
135
  if (init) {
@@ -119,10 +142,8 @@ export function matchBytesLoopVersion(loop, counted, facts) {
119
142
  }
120
143
  return invariant(e.localId) ? e : null;
121
144
  };
122
- // A pure integer operand evaluated again before the loop.
123
- const invariantKey = (e) => {
124
- if (!facts.ranges.get(e))
125
- return null;
145
+ // A pure loop-invariant number, evaluated again before the loop.
146
+ const pureKey = (e) => {
126
147
  if (e.kind === "numLit")
127
148
  return Number.isSafeInteger(e.value) ? `n${e.value}` : null;
128
149
  if (e.kind === "varRef")
@@ -131,15 +152,33 @@ export function matchBytesLoopVersion(loop, counted, facts) {
131
152
  INVARIANT_OPS.has(e.op) &&
132
153
  e.left.type.kind === "f64" &&
133
154
  e.right.type.kind === "f64") {
134
- const left = invariantKey(e.left), right = invariantKey(e.right);
155
+ const left = pureKey(e.left), right = pureKey(e.right);
135
156
  return left !== null && right !== null ? `(${e.op} ${left} ${right})` : null;
136
157
  }
137
158
  return null;
138
159
  };
160
+ // Invariant terms without a proven range, such as `base` in
161
+ // `w[base + j]` with `const base = r * cols` for a parameter `cols`. The
162
+ // guard tests each one: an exact integer (not -0) within GUARDED_TERM.
163
+ const guardedRanges = new Map();
164
+ const guardedNodes = new Map();
165
+ // The key of a loop-invariant index term, with a proven range or guarded.
166
+ const invariantKey = (e) => {
167
+ const key = pureKey(e);
168
+ if (key === null || facts.ranges.get(e))
169
+ return key;
170
+ if (e.kind === "numLit")
171
+ return null;
172
+ guardedRanges.set(e, GUARDED_TERM);
173
+ guardedNodes.set(e, key);
174
+ return key;
175
+ };
176
+ const termRange = (e) => facts.ranges.get(e) ?? guardedRanges.get(e);
139
177
  // Every operand of an affine index is `counter * k + Σ terms + offset`.
140
- // Invariant terms need proven ranges. Operands that involve the counter
141
- // need none: the guard bounds the counter so that each of them is a safe
142
- // integer, which makes the index's double arithmetic exact.
178
+ // Invariant terms need proven ranges or the guard's test (guarded terms).
179
+ // Operands that involve the counter need none: the guard bounds the
180
+ // counter so that each of them is a safe integer, which makes the index's
181
+ // double arithmetic exact.
143
182
  const shapes = new Map();
144
183
  const affine = (e) => {
145
184
  if (shapes.has(e))
@@ -224,9 +263,42 @@ export function matchBytesLoopVersion(loop, counted, facts) {
224
263
  }
225
264
  };
226
265
  const termMagnitude = (terms) => terms.reduce((sum, t) => {
227
- const r = facts.ranges.get(t.expr);
266
+ const r = termRange(t.expr);
228
267
  return sum + Math.max(Math.abs(r.min), Math.abs(r.max));
229
268
  }, 0);
269
+ const whileAccesses = loop.kind === "while" ? whileCounterAccesses(loop) : null;
270
+ function whileCounterAccesses(loop) {
271
+ return findWhileCounterAccesses(loop, {
272
+ counterLocal: (id) => {
273
+ const local = facts.locals.get(id);
274
+ return (local?.type.kind === "f64" &&
275
+ !local.boxed &&
276
+ !local.tdz &&
277
+ !facts.captured.has(id) &&
278
+ facts.initialized.has(id));
279
+ },
280
+ boundKey: (e) => {
281
+ if (e.type.kind !== "f64")
282
+ return null;
283
+ // The guard evaluates the bound before the loop: a typed array's
284
+ // length needs the binding itself, not a temp the body declares.
285
+ if (e.kind === "bytesIntrinsic" &&
286
+ e.method === "length" &&
287
+ e.receiver.kind === "varRef" &&
288
+ e.receiver.type.kind === "bytes" &&
289
+ invariant(e.receiver.localId))
290
+ return `bytes-length:${e.receiver.localId}`;
291
+ if (e.kind === "strIntrinsic" &&
292
+ e.method === "length" &&
293
+ e.args.length === 0 &&
294
+ e.receiver.kind === "varRef" &&
295
+ e.receiver.type.kind === "string" &&
296
+ invariant(e.receiver.localId))
297
+ return `string-length:${e.receiver.localId}`;
298
+ return pureKey(e);
299
+ },
300
+ });
301
+ }
230
302
  const receivers = [];
231
303
  const receiverIndex = new Map();
232
304
  const fixed = new Map();
@@ -236,16 +308,49 @@ export function matchBytesLoopVersion(loop, counted, facts) {
236
308
  if (index === undefined) {
237
309
  index = receivers.length;
238
310
  receiverIndex.set(ref.localId, index);
239
- receivers.push({ ref, global: !facts.locals.has(ref.localId) });
311
+ receivers.push({
312
+ ref,
313
+ global: !facts.locals.has(ref.localId),
314
+ string: ref.type.kind === "string",
315
+ });
240
316
  }
241
317
  return index;
242
318
  };
319
+ // Worker programs: accesses through invariant receivers, proven or not,
320
+ // become thread-owned when the guard finds no shared storage.
321
+ const owned = new Map();
322
+ // While loops: accesses at a counter below a bound, by receiver and bound.
323
+ const boundedChecks = new Map();
324
+ const pairedCounters = paired !== null && counted === null ? new Set([paired.low.localId, paired.high.localId]) : null;
325
+ const pairedNodes = new Map();
243
326
  const access = (node, array, index, width) => {
244
- if (facts.proven.has(node))
245
- return;
246
327
  const ref = root(array);
247
328
  if (!ref)
248
329
  return;
330
+ if (facts.workers && ref.type.kind === "bytes" && !facts.owned.has(node)) {
331
+ const receiver = receiverOf(ref);
332
+ const nodes = owned.get(receiver);
333
+ if (nodes)
334
+ nodes.push(node);
335
+ else
336
+ owned.set(receiver, [node]);
337
+ }
338
+ if (facts.proven.has(node))
339
+ return;
340
+ // An element at either counter of a two-counter loop.
341
+ if (pairedCounters !== null &&
342
+ width === 1 &&
343
+ ref.type.kind === "bytes" &&
344
+ index.kind === "varRef" &&
345
+ pairedCounters.has(index.localId)) {
346
+ const receiver = receiverOf(ref);
347
+ const nodes = pairedNodes.get(receiver);
348
+ if (nodes)
349
+ nodes.push(node);
350
+ else
351
+ pairedNodes.set(receiver, [node]);
352
+ return;
353
+ }
249
354
  const shape = counter !== null ? affine(index) : null;
250
355
  if (shape && shape.counter !== 0) {
251
356
  const operands = new Set();
@@ -270,12 +375,32 @@ export function matchBytesLoopVersion(loop, counted, facts) {
270
375
  });
271
376
  return;
272
377
  }
378
+ const bounded = whileAccesses?.accesses.get(node);
379
+ const loopCounter = bounded && whileAccesses.counters.get(bounded.counter);
380
+ if (bounded && loopCounter && (!loopCounter.wraps || loopCounter.bounds !== null)) {
381
+ const receiver = receiverOf(ref);
382
+ const key = `${receiver}|${bounded.key}|${bounded.adj}`;
383
+ const slack = bounded.offset + width - 1 + bounded.adj;
384
+ const group = boundedChecks.get(key);
385
+ if (group) {
386
+ group.check.slack = Math.max(group.check.slack, slack);
387
+ group.nodes.push({ node, access: bounded });
388
+ }
389
+ else
390
+ boundedChecks.set(key, {
391
+ check: { receiver, bound: bounded.bound, slack },
392
+ nodes: [{ node, access: bounded }],
393
+ });
394
+ return;
395
+ }
273
396
  const range = facts.ranges.get(index);
274
397
  if (!range)
275
398
  return;
276
399
  const end = range.max + width - 1;
277
- // Only a length a buffer can have: an outer loop must not pay for a
278
- // guard that bounds an inner loop's unbounded counter.
400
+ // Only an end below 2^31: an outer loop must not pay for a guard that
401
+ // bounds an inner loop's unbounded counter, and the counter of a loop to
402
+ // an array's length reaches 2^32 - 2, a length no typed array in
403
+ // practice has.
279
404
  if (range.min < 0 || end >= MAX_FIXED_END)
280
405
  return;
281
406
  const receiver = receiverOf(ref);
@@ -295,6 +420,10 @@ export function matchBytesLoopVersion(loop, counted, facts) {
295
420
  else if (e.method === "get" && e.args[0])
296
421
  access(e, e.receiver, e.args[0], 1);
297
422
  }
423
+ else if (e.kind === "strIntrinsic" &&
424
+ (e.method === "charCodeAt" || e.method === "charAt") &&
425
+ e.args[0])
426
+ access(e, e.receiver, e.args[0], 1);
298
427
  return everyExprChild(e, visitExpr, visitStmt);
299
428
  };
300
429
  const visitStmt = (s) => {
@@ -303,6 +432,8 @@ export function matchBytesLoopVersion(loop, counted, facts) {
303
432
  return everyStmtChild(s, visitExpr, visitStmt);
304
433
  };
305
434
  loop.body.every(visitStmt);
435
+ if (loop.kind === "while")
436
+ visitExpr(loop.cond);
306
437
  // Bound the counter so every counter operand stays a safe integer.
307
438
  let bound = SAFE;
308
439
  const affineGroups = [...affineChecks.values()].filter((group) => {
@@ -319,10 +450,23 @@ export function matchBytesLoopVersion(loop, counted, facts) {
319
450
  });
320
451
  const fixedKept = [...fixed.values()].slice(0, MAX_CHECKS);
321
452
  const affineKept = affineGroups.slice(0, MAX_CHECKS - fixedKept.length);
322
- if (fixedKept.length === 0 && affineKept.length === 0)
453
+ const boundedKept = [...boundedChecks.values()].slice(0, Math.max(0, MAX_CHECKS - fixedKept.length - affineKept.length));
454
+ const ownedKept = [...owned.entries()].slice(0, MAX_CHECKS);
455
+ const pairedKept = [...pairedNodes.entries()].slice(0, Math.max(0, MAX_CHECKS - fixedKept.length - affineKept.length - boundedKept.length));
456
+ if (fixedKept.length === 0 &&
457
+ affineKept.length === 0 &&
458
+ boundedKept.length === 0 &&
459
+ ownedKept.length === 0 &&
460
+ pairedKept.length === 0)
323
461
  return null;
324
462
  const bounds = new Set();
463
+ const ownedNodes = new Set();
325
464
  const used = new Set();
465
+ for (const [receiver, nodes] of ownedKept) {
466
+ used.add(receiver);
467
+ for (const node of nodes)
468
+ ownedNodes.add(node);
469
+ }
326
470
  const ranges = new Map();
327
471
  const counterLow = Math.max(counted?.range.min ?? 0, -bound), counterHigh = Math.min(counted?.range.max ?? 0, bound);
328
472
  for (const group of fixedKept) {
@@ -335,20 +479,72 @@ export function matchBytesLoopVersion(loop, counted, facts) {
335
479
  for (const node of group.nodes)
336
480
  bounds.add(node);
337
481
  for (const operand of group.operands) {
338
- if (facts.ranges.get(operand))
339
- continue;
340
482
  const shape = shapes.get(operand);
341
483
  const a = shape.counter * counterLow, b = shape.counter * counterHigh;
342
484
  let min = Math.min(a, b) + shape.offset, max = Math.max(a, b) + shape.offset;
343
485
  for (const term of shape.terms) {
344
- const r = facts.ranges.get(term.expr);
486
+ const r = termRange(term.expr);
345
487
  min += term.sign > 0 ? r.min : -r.max;
346
488
  max += term.sign > 0 ? r.max : -r.min;
347
489
  }
348
- if (counterLow <= counterHigh)
490
+ if (counterLow > counterHigh)
491
+ continue;
492
+ // The guard's bound on the counter can narrow a range the operand
493
+ // already has (a loop to a length proves only `i < 2^53`), so that
494
+ // `i * 4` in the fast copy is exact integer arithmetic.
495
+ const known = facts.ranges.get(operand);
496
+ if (!known)
349
497
  ranges.set(operand, { min, max });
498
+ else if (min > known.min || max < known.max)
499
+ ranges.set(operand, { min: Math.max(min, known.min), max: Math.min(max, known.max) });
350
500
  }
351
501
  }
502
+ // Guarded terms of the kept checks, and the range the guard proves for
503
+ // every node of each in the fast copy.
504
+ const guarded = new Set();
505
+ for (const group of affineKept)
506
+ for (const term of group.check.terms)
507
+ if (guardedRanges.has(term.expr))
508
+ guarded.add(term.key);
509
+ for (const [node, key] of guardedNodes)
510
+ if (guarded.has(key))
511
+ ranges.set(node, GUARDED_TERM);
512
+ // While loop counters of the kept checks: each entry value is an exact
513
+ // integer that no access offset takes below 0. In the fast copy each
514
+ // access's index is below its length, and its counter read at least the
515
+ // most negative offset.
516
+ const narrow = (e, range) => {
517
+ const known = ranges.get(e) ?? facts.ranges.get(e);
518
+ ranges.set(e, known ? { min: Math.max(known.min, range.min), max: Math.min(known.max, range.max) } : range);
519
+ };
520
+ const counterMins = new Map();
521
+ for (const group of boundedKept) {
522
+ used.add(group.check.receiver);
523
+ for (const { node, access } of group.nodes) {
524
+ bounds.add(node);
525
+ const min = 0 - access.offset;
526
+ counterMins.set(access.counter, Math.max(counterMins.get(access.counter) ?? -SAFE, min));
527
+ narrow(access.ref, { min: -MAX_OFFSET, max: SAFE });
528
+ if (access.index !== access.ref)
529
+ narrow(access.index, { min: 0, max: SAFE });
530
+ }
531
+ }
532
+ for (const [receiver, nodes] of pairedKept) {
533
+ used.add(receiver);
534
+ for (const node of nodes)
535
+ bounds.add(node);
536
+ }
537
+ const counterChecks = [];
538
+ for (const [id, min] of counterMins) {
539
+ const info = whileAccesses.counters.get(id);
540
+ counterChecks.push({
541
+ ref: { kind: "varRef", localId: id, type: F64, loc: loop.loc },
542
+ min,
543
+ wrapBounds: info.wraps
544
+ ? info.bounds.map((b) => ({ bound: b.bound, limit: 2 ** 31 - info.sum - b.adj }))
545
+ : [],
546
+ });
547
+ }
352
548
  // Renumber the receivers the kept checks use.
353
549
  const order = [...used].sort((a, b) => a - b);
354
550
  const renumber = new Map(order.map((old, index) => [old, index]));
@@ -357,7 +553,9 @@ export function matchBytesLoopVersion(loop, counted, facts) {
357
553
  (counted.range.min < -bound || counted.range.max > bound);
358
554
  return {
359
555
  bounds,
556
+ owned: ownedNodes,
360
557
  receivers: order.map((index) => receivers[index]),
558
+ ownedReceivers: ownedKept.map(([receiver]) => renumber.get(receiver)),
361
559
  fixed: fixedKept.map((g) => ({
362
560
  receiver: renumber.get(g.check.receiver),
363
561
  end: g.check.end,
@@ -369,13 +567,279 @@ export function matchBytesLoopVersion(loop, counted, facts) {
369
567
  minOffset: g.check.minOffset,
370
568
  maxEnd: g.check.maxEnd,
371
569
  })),
570
+ bounded: boundedKept.map((g) => ({
571
+ receiver: renumber.get(g.check.receiver),
572
+ bound: g.check.bound,
573
+ slack: g.check.slack,
574
+ })),
575
+ counters: counterChecks,
576
+ guarded,
372
577
  counted: affineKept.length > 0 ? counted : null,
578
+ paired: paired !== null && pairedKept.length > 0
579
+ ? { loop: paired, receivers: pairedKept.map(([receiver]) => renumber.get(receiver)) }
580
+ : null,
373
581
  counterBound: needsBound ? bound : null,
374
582
  ranges,
375
583
  };
376
584
  }
585
+ /** `counter = counter + k`, `counter = (counter + k) | 0` or `counter++`. */
586
+ function counterStep(s) {
587
+ if (s.kind === "exprStmt" && s.expr.kind === "incDec" && s.expr.op === "+")
588
+ return { id: s.expr.localId, k: 1, wraps: false };
589
+ if (s.kind !== "assign")
590
+ return null;
591
+ let value = s.value, wraps = false;
592
+ if (value.kind === "bin" &&
593
+ value.op === "|" &&
594
+ value.right.kind === "numLit" &&
595
+ value.right.value === 0 &&
596
+ value.left.kind === "bin") {
597
+ value = value.left;
598
+ wraps = true;
599
+ }
600
+ if (value.kind !== "bin" ||
601
+ value.op !== "+" ||
602
+ value.left.kind !== "varRef" ||
603
+ value.left.localId !== s.localId ||
604
+ value.right.kind !== "numLit" ||
605
+ !Number.isSafeInteger(value.right.value) ||
606
+ value.right.value <= 0 ||
607
+ value.right.value > MAX_OFFSET)
608
+ return null;
609
+ return { id: s.localId, k: value.right.value, wraps };
610
+ }
611
+ /** Typed-array and string accesses of a while loop that happen at a
612
+ * counter below a loop-invariant bound. A counter is a number local that
613
+ * the loop changes only by positive integer increments, written as
614
+ * statements of the body, of its blocks and branches, or of nested while
615
+ * loops. The condition of the loop, an `if` or a `&&` chain that compares
616
+ * the counter below a bound (`while (pos < end && bytes[pos] === 32)
617
+ * pos++`, or `s.charCodeAt(pos)` of a string) makes it below that bound
618
+ * until the next increment on the path. The counter starts at its entry
619
+ * value and only grows (a `| 0` increment never wraps when every bound is
620
+ * at most 2^31 minus the increments), so an access at `counter + d` is in
621
+ * bounds for the whole loop when the entry value is at least `-d` and
622
+ * `bound + d < length` (`+ 1` for `<=`). */
623
+ function findWhileCounterAccesses(loop, host) {
624
+ const steps = new Map();
625
+ const refused = new Set();
626
+ // Increments count only as statements of the loop's straight-line
627
+ // structure; any other write refuses the binding.
628
+ const writes = (list, direct) => {
629
+ for (const s of list) {
630
+ const step = counterStep(s);
631
+ if (step && direct) {
632
+ const prior = steps.get(step.id);
633
+ steps.set(step.id, {
634
+ sum: (prior?.sum ?? 0) + step.k,
635
+ wraps: (prior?.wraps ?? false) || step.wraps,
636
+ });
637
+ continue;
638
+ }
639
+ if (step)
640
+ refused.add(step.id);
641
+ const nested = direct &&
642
+ (s.kind === "if" || s.kind === "while" || (s.kind === "block" && !s.labels?.length));
643
+ if (s.kind === "assign" || s.kind === "varDecl" || s.kind === "forOf")
644
+ refused.add(s.localId);
645
+ if (s.kind === "tryCatch" && s.catchLocalId)
646
+ refused.add(s.catchLocalId);
647
+ everyStmtChild(s, (e) => (exprWrites(e), true), (c) => (writes([c], nested), true));
648
+ }
649
+ };
650
+ const exprWrites = (e) => {
651
+ if (e.kind === "assignExpr" || e.kind === "incDec")
652
+ refused.add(e.localId);
653
+ everyExprChild(e, (c) => (exprWrites(c), true), (c) => (writes([c], false), true));
654
+ };
655
+ exprWrites(loop.cond);
656
+ writes(loop.body, true);
657
+ const counter = (id) => steps.has(id) && !refused.has(id) && host.counterLocal(id);
658
+ // The bounds a condition puts on counters while it holds.
659
+ const facts = (cond, into) => {
660
+ if (cond.kind === "toBool")
661
+ return facts(cond.operand, into);
662
+ if (cond.kind === "logical" && cond.op === "&&") {
663
+ facts(cond.left, into);
664
+ facts(cond.right, into);
665
+ return;
666
+ }
667
+ if (cond.kind !== "bin")
668
+ return;
669
+ const below = cond.op === "<" || cond.op === "<=", above = cond.op === ">" || cond.op === ">=";
670
+ const c = below ? cond.left : above ? cond.right : null, bound = below ? cond.right : cond.left;
671
+ if (c?.kind !== "varRef" || !counter(c.localId) || into.has(c.localId))
672
+ return;
673
+ const key = host.boundKey(bound);
674
+ if (key === null)
675
+ return;
676
+ into.set(c.localId, { bound, key, adj: cond.op === "<=" || cond.op === ">=" ? 1 : 0 });
677
+ };
678
+ // The facts that hold after either of two paths.
679
+ const meet = (a, b) => {
680
+ if (a === null)
681
+ return b;
682
+ if (b === null)
683
+ return a;
684
+ const out = new Map();
685
+ for (const [id, fact] of a)
686
+ if (b.get(id) === fact)
687
+ out.set(id, fact);
688
+ return out;
689
+ };
690
+ const withFacts = (clean, cond) => {
691
+ const out = new Map(clean);
692
+ facts(cond, out);
693
+ return out;
694
+ };
695
+ const accesses = new Map();
696
+ const record = (node, index, clean) => {
697
+ let ref = index, offset = 0;
698
+ if (index.kind === "bin" && (index.op === "+" || index.op === "-")) {
699
+ const literal = index.right.kind === "numLit" ? index.right : index.op === "+" ? index.left : null;
700
+ const other = literal === index.right ? index.left : index.right;
701
+ if (literal?.kind !== "numLit" || !Number.isSafeInteger(literal.value))
702
+ return;
703
+ if (Math.abs(literal.value) > MAX_OFFSET || Object.is(literal.value, -0))
704
+ return;
705
+ offset = index.op === "-" ? -literal.value : literal.value;
706
+ ref = other;
707
+ }
708
+ if (ref.kind !== "varRef")
709
+ return;
710
+ const fact = clean.get(ref.localId);
711
+ if (fact)
712
+ accesses.set(node, { counter: ref.localId, index, ref, ...fact, offset });
713
+ };
714
+ const expr = (e, clean) => {
715
+ if (e.kind === "bytesIntrinsic") {
716
+ const numeric = byteNumberAccess(e);
717
+ const index = numeric
718
+ ? e.args[numeric.offsetArg]
719
+ : e.method === "get"
720
+ ? e.args[0]
721
+ : undefined;
722
+ if (index)
723
+ record(e, index, clean);
724
+ }
725
+ if (e.kind === "strIntrinsic" &&
726
+ (e.method === "charCodeAt" || e.method === "charAt") &&
727
+ e.args[0])
728
+ record(e, e.args[0], clean);
729
+ if (e.kind === "logical" && e.op === "&&") {
730
+ expr(e.left, clean);
731
+ expr(e.right, withFacts(clean, e.left));
732
+ return;
733
+ }
734
+ if (e.kind === "ternary") {
735
+ expr(e.cond, clean);
736
+ expr(e.then, withFacts(clean, e.cond));
737
+ expr(e.else_, clean);
738
+ return;
739
+ }
740
+ everyExprChild(e, (c) => (expr(c, clean), true), (c) => (stmts([c], clean), true));
741
+ };
742
+ // Walks statements in order; the result is the clean state where the
743
+ // list falls through, or null when it never does.
744
+ const stmts = (list, clean) => {
745
+ let current = clean;
746
+ for (const s of list) {
747
+ if (current === null)
748
+ return null;
749
+ const step = counterStep(s);
750
+ if (step) {
751
+ const next = new Map(current);
752
+ next.delete(step.id);
753
+ current = next;
754
+ continue;
755
+ }
756
+ switch (s.kind) {
757
+ case "if": {
758
+ expr(s.cond, current);
759
+ const then = stmts(s.then, withFacts(current, s.cond));
760
+ const otherwise = stmts(s.else_ ?? [], current);
761
+ current = meet(then, otherwise);
762
+ break;
763
+ }
764
+ case "while": {
765
+ // A pass of the nested loop may follow its own increments.
766
+ const advanced = new Map(current);
767
+ for (const id of writtenCounters(s.body))
768
+ advanced.delete(id);
769
+ expr(s.cond, advanced);
770
+ stmts(s.body, withFacts(advanced, s.cond));
771
+ current = advanced;
772
+ break;
773
+ }
774
+ case "block":
775
+ if (!s.labels?.length) {
776
+ current = stmts(s.body, current);
777
+ break;
778
+ }
779
+ everyStmtChild(s, (e) => (expr(e, current), true), (c) => (stmts([c], current), true));
780
+ break;
781
+ case "bytesSet":
782
+ record(s, s.index, current);
783
+ everyStmtChild(s, (e) => (expr(e, current), true), (c) => (stmts([c], current), true));
784
+ break;
785
+ case "break":
786
+ case "continue":
787
+ case "return":
788
+ case "throw":
789
+ everyStmtChild(s, (e) => (expr(e, current), true), (c) => (stmts([c], current), true));
790
+ current = null;
791
+ break;
792
+ default:
793
+ everyStmtChild(s, (e) => (expr(e, current), true), (c) => (stmts([c], current), true));
794
+ break;
795
+ }
796
+ }
797
+ return current;
798
+ };
799
+ const writtenCounters = (list) => {
800
+ const out = new Set();
801
+ const visit = (s) => {
802
+ const step = counterStep(s);
803
+ if (step)
804
+ out.add(step.id);
805
+ return everyStmtChild(s, () => true, visit);
806
+ };
807
+ list.every(visit);
808
+ return out;
809
+ };
810
+ expr(loop.cond, new Map());
811
+ stmts(loop.body, withFacts(new Map(), loop.cond));
812
+ // Each counter's bounds: the loop's and those of nested while loops that
813
+ // advance it.
814
+ const counters = new Map();
815
+ const loops = [loop];
816
+ const collectLoops = (s) => {
817
+ if (s.kind === "while")
818
+ loops.push(s);
819
+ return everyStmtChild(s, () => true, collectLoops);
820
+ };
821
+ loop.body.every(collectLoops);
822
+ for (const [id, step] of steps) {
823
+ if (!counter(id))
824
+ continue;
825
+ let bounds = [];
826
+ for (const l of loops) {
827
+ if (l !== loop && !writtenCounters(l.body).has(id))
828
+ continue;
829
+ const fact = withFacts(new Map(), l.cond).get(id);
830
+ if (!fact) {
831
+ bounds = null;
832
+ break;
833
+ }
834
+ bounds.push({ bound: fact.bound, adj: fact.adj });
835
+ }
836
+ counters.set(id, { ...step, bounds });
837
+ }
838
+ return { accesses, counters };
839
+ }
377
840
  /** Branches to `fast` when every access the version proves is in bounds for
378
- * every iteration, and to `slow` otherwise (including a counted loop whose
841
+ * every iteration and every view it proves thread-owned has no shared
842
+ * storage, and to `slow` otherwise (including a counted loop whose
379
843
  * integer form is not established, or a module receiver not yet set). */
380
844
  export function emitBytesLoopVersionGuard(host, version, fast, slow) {
381
845
  const B = host.B;
@@ -398,8 +862,10 @@ export function emitBytesLoopVersionGuard(host, version, fast, slow) {
398
862
  }
399
863
  return value;
400
864
  });
401
- const lengths = receivers.map((receiver) => {
402
- const len = emitBytesHeaderLength(host, receiver);
865
+ const lengths = receivers.map((receiver, index) => {
866
+ const len = version.receivers[index].string
867
+ ? emitStringByteLength(host, receiver)
868
+ : emitBytesHeaderLength(host, receiver);
403
869
  if (host.sizeType === "i64")
404
870
  return len;
405
871
  const wide = B.tmp();
@@ -407,11 +873,55 @@ export function emitBytesLoopVersionGuard(host, version, fast, slow) {
407
873
  return wide;
408
874
  });
409
875
  const conditions = [];
876
+ // A string's byte length is its UTF-16 length when it is ASCII.
877
+ version.receivers.forEach(({ string }, index) => {
878
+ if (string)
879
+ conditions.push(emitStringAsciiFlag(host, receivers[index]));
880
+ });
881
+ for (const index of version.ownedReceivers) {
882
+ const owned = B.tmp();
883
+ B.line(`${owned} = icmp eq ptr ${emitBytesSharedStorage(host, receivers[index])}, null`);
884
+ conditions.push(owned);
885
+ }
410
886
  for (const check of version.fixed) {
411
887
  const ok = B.tmp();
412
888
  B.line(`${ok} = icmp ugt i64 ${lengths[check.receiver]}, ${check.end}`);
413
889
  conditions.push(ok);
414
890
  }
891
+ for (const counter of version.counters) {
892
+ const value = host.emitExpr(counter.ref);
893
+ // A counter held as an integer (an int32 slot) is exact already and
894
+ // needs at most its lower bound tested.
895
+ const integer = exactInteger(host, value, counter.ref);
896
+ if (integer && integer.range.max <= SAFE) {
897
+ if (integer.range.min < counter.min) {
898
+ const ok = B.tmp();
899
+ B.line(`${ok} = icmp sge i64 ${widenInteger(host, integer)}, ${counter.min}`);
900
+ conditions.push(ok);
901
+ }
902
+ }
903
+ else
904
+ conditions.push(emitExactIntegerTest(host, value.name, counter.min, SAFE).ok);
905
+ for (const wrap of counter.wrapBounds) {
906
+ const bound = host.emitExpr(wrap.bound);
907
+ const boundInteger = exactInteger(host, bound, wrap.bound);
908
+ if (boundInteger && boundInteger.range.max <= wrap.limit)
909
+ continue;
910
+ const ok = B.tmp();
911
+ B.line(`${ok} = fcmp ole double ${bound.name}, ${f64Lit(wrap.limit)}`);
912
+ conditions.push(ok);
913
+ }
914
+ }
915
+ for (const check of version.bounded) {
916
+ // `bound <= length - slack` in doubles: both sides are exact (a length
917
+ // is below 2^53 and a slack below 2^32), and NaN fails.
918
+ const bound = host.emitExpr(check.bound).name;
919
+ const length = B.tmp(), room = B.tmp(), ok = B.tmp();
920
+ B.line(`${length} = uitofp i64 ${lengths[check.receiver]} to double`);
921
+ B.line(`${room} = fsub double ${length}, ${f64Lit(check.slack)}`);
922
+ B.line(`${ok} = fcmp ole double ${bound}, ${room}`);
923
+ conditions.push(ok);
924
+ }
415
925
  if (counted && version.affine.length > 0) {
416
926
  // The first and last counter values, in ascending order. The last value
417
927
  // of a non-unit step is exact: `start + ⌊(limit ∓ 1 - start) / step⌋ *
@@ -453,6 +963,14 @@ export function emitBytesLoopVersionGuard(host, version, fast, slow) {
453
963
  let base = "0";
454
964
  for (const term of check.terms) {
455
965
  const value = host.emitExpr(term.expr);
966
+ if (version.guarded.has(term.key)) {
967
+ const tested = emitExactIntegerTest(host, value.name, GUARDED_TERM.min, GUARDED_TERM.max);
968
+ conditions.push(tested.ok);
969
+ const sum = B.tmp();
970
+ B.line(`${sum} = ${term.sign > 0 ? "add" : "sub"} i64 ${base}, ${tested.integer}`);
971
+ base = sum;
972
+ continue;
973
+ }
456
974
  const integer = exactInteger(host, value, term.expr);
457
975
  if (!integer) {
458
976
  // Unreachable: every term has a proven range. Stay checked.
@@ -481,6 +999,25 @@ export function emitBytesLoopVersionGuard(host, version, fast, slow) {
481
999
  conditions.push(both);
482
1000
  }
483
1001
  }
1002
+ if (version.paired !== null) {
1003
+ // Both counters stay within [lo, hi] (exact integers below 2^53): every
1004
+ // access at either one is in bounds when `lo >= 0` and `hi < length`.
1005
+ const { loop } = version.paired;
1006
+ const [low, high] = [loop.low.start, loop.high.start].map((expr) => {
1007
+ const tested = emitExactIntegerTest(host, host.emitExpr(expr).name, -SAFE, SAFE);
1008
+ conditions.push(tested.ok);
1009
+ return tested.integer;
1010
+ });
1011
+ const nonNegative = B.tmp();
1012
+ B.line(`${nonNegative} = icmp sge i64 ${low}, 0`);
1013
+ conditions.push(nonNegative);
1014
+ for (const receiver of version.paired.receivers) {
1015
+ // Lengths are at most 2^53 elements: a signed comparison is exact.
1016
+ const below = B.tmp();
1017
+ B.line(`${below} = icmp slt i64 ${high}, ${lengths[receiver]}`);
1018
+ conditions.push(below);
1019
+ }
1020
+ }
484
1021
  let valid = "true";
485
1022
  for (const cond of conditions) {
486
1023
  if (valid === "true")