@scriptc/compiler 0.4.4 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (775) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +198 -44
  2. package/ambient/scriptc-overrides.d.ts +21 -0
  3. package/dist/backend/executable-features.js +3 -0
  4. package/dist/backend/executable-features.js.map +1 -1
  5. package/dist/backend/library-pack.js +2 -1
  6. package/dist/backend/library-pack.js.map +1 -1
  7. package/dist/backend/linker.js +11 -1
  8. package/dist/backend/linker.js.map +1 -1
  9. package/dist/backend/lld.d.ts +9 -0
  10. package/dist/backend/lld.js +48 -0
  11. package/dist/backend/lld.js.map +1 -0
  12. package/dist/backend/lld.test.d.ts +1 -0
  13. package/dist/backend/lld.test.js +53 -0
  14. package/dist/backend/lld.test.js.map +1 -0
  15. package/dist/backend/llvm/appended-array-literals.d.ts +11 -1
  16. package/dist/backend/llvm/appended-array-literals.js +29 -0
  17. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  18. package/dist/backend/llvm/blocks.js +10 -1
  19. package/dist/backend/llvm/blocks.js.map +1 -1
  20. package/dist/backend/llvm/bytes-alias.d.ts +13 -4
  21. package/dist/backend/llvm/bytes-alias.js +16 -5
  22. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  23. package/dist/backend/llvm/bytes-bounds.d.ts +5 -1
  24. package/dist/backend/llvm/bytes-bounds.js +199 -2
  25. package/dist/backend/llvm/bytes-bounds.js.map +1 -1
  26. package/dist/backend/llvm/bytes-loop-versions.d.ts +45 -3
  27. package/dist/backend/llvm/bytes-loop-versions.js +238 -20
  28. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  29. package/dist/backend/llvm/bytes-loop-versions.test.js +11 -4
  30. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  31. package/dist/backend/llvm/call-lifetimes.d.ts +8 -2
  32. package/dist/backend/llvm/call-lifetimes.js +87 -18
  33. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  34. package/dist/backend/llvm/call-lifetimes.test.js +132 -0
  35. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  36. package/dist/backend/llvm/classes.d.ts +3 -2
  37. package/dist/backend/llvm/classes.js +4 -4
  38. package/dist/backend/llvm/classes.js.map +1 -1
  39. package/dist/backend/llvm/counted-loops.d.ts +14 -2
  40. package/dist/backend/llvm/counted-loops.js +54 -5
  41. package/dist/backend/llvm/counted-loops.js.map +1 -1
  42. package/dist/backend/llvm/debug-info.d.ts +42 -1
  43. package/dist/backend/llvm/debug-info.js +70 -1
  44. package/dist/backend/llvm/debug-info.js.map +1 -1
  45. package/dist/backend/llvm/dense-array-loops.js +2 -2
  46. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  47. package/dist/backend/llvm/dense-array-loops.test.js +1 -0
  48. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  49. package/dist/backend/llvm/dyn.d.ts +65 -8
  50. package/dist/backend/llvm/dyn.js +375 -40
  51. package/dist/backend/llvm/dyn.js.map +1 -1
  52. package/dist/backend/llvm/emit-function.js +28 -8
  53. package/dist/backend/llvm/emit-function.js.map +1 -1
  54. package/dist/backend/llvm/emit-journal.d.ts +8 -4
  55. package/dist/backend/llvm/emit-journal.js +75 -5
  56. package/dist/backend/llvm/emit-journal.js.map +1 -1
  57. package/dist/backend/llvm/emit-module.d.ts +4 -0
  58. package/dist/backend/llvm/emit-module.js +58 -23
  59. package/dist/backend/llvm/emit-module.js.map +1 -1
  60. package/dist/backend/llvm/emit-statements.js +297 -28
  61. package/dist/backend/llvm/emit-statements.js.map +1 -1
  62. package/dist/backend/llvm/emitter.d.ts +134 -13
  63. package/dist/backend/llvm/emitter.js +514 -87
  64. package/dist/backend/llvm/emitter.js.map +1 -1
  65. package/dist/backend/llvm/expr-bytes.d.ts +6 -4
  66. package/dist/backend/llvm/expr-bytes.js +31 -8
  67. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  68. package/dist/backend/llvm/expr-calls.js +13 -11
  69. package/dist/backend/llvm/expr-calls.js.map +1 -1
  70. package/dist/backend/llvm/expr-containers.d.ts +11 -0
  71. package/dist/backend/llvm/expr-containers.js +87 -9
  72. package/dist/backend/llvm/expr-containers.js.map +1 -1
  73. package/dist/backend/llvm/expr-context.d.ts +3 -0
  74. package/dist/backend/llvm/expr-control.js +83 -0
  75. package/dist/backend/llvm/expr-control.js.map +1 -1
  76. package/dist/backend/llvm/expr-dynamic.d.ts +1 -1
  77. package/dist/backend/llvm/expr-dynamic.js +22 -4
  78. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  79. package/dist/backend/llvm/expr-primitives.js +107 -9
  80. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  81. package/dist/backend/llvm/expr-stream-bridges.js +95 -22
  82. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  83. package/dist/backend/llvm/forked-analysis.d.ts +8 -0
  84. package/dist/backend/llvm/forked-analysis.js +43 -0
  85. package/dist/backend/llvm/forked-analysis.js.map +1 -0
  86. package/dist/backend/llvm/integer-values.d.ts +7 -0
  87. package/dist/backend/llvm/integer-values.js +42 -2
  88. package/dist/backend/llvm/integer-values.js.map +1 -1
  89. package/dist/backend/llvm/integer-views.d.ts +2 -1
  90. package/dist/backend/llvm/integer-views.js +12 -1
  91. package/dist/backend/llvm/integer-views.js.map +1 -1
  92. package/dist/backend/llvm/js-ic.d.ts +4 -0
  93. package/dist/backend/llvm/js-ic.js +133 -15
  94. package/dist/backend/llvm/js-ic.js.map +1 -1
  95. package/dist/backend/llvm/layouts.d.ts +1 -0
  96. package/dist/backend/llvm/layouts.js.map +1 -1
  97. package/dist/backend/llvm/lazy-captures.d.ts +6 -1
  98. package/dist/backend/llvm/lazy-captures.js +10 -5
  99. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  100. package/dist/backend/llvm/lib-abi.d.ts +5 -0
  101. package/dist/backend/llvm/lib-abi.js +19 -0
  102. package/dist/backend/llvm/lib-abi.js.map +1 -1
  103. package/dist/backend/llvm/lib-dispatch.js +128 -42
  104. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  105. package/dist/backend/llvm/lib-filesystem.d.ts +10 -0
  106. package/dist/backend/llvm/lib-filesystem.js +32 -0
  107. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  108. package/dist/backend/llvm/lib-http2.js +2 -2
  109. package/dist/backend/llvm/lib-http2.js.map +1 -1
  110. package/dist/backend/llvm/lib-network.js +2 -0
  111. package/dist/backend/llvm/lib-network.js.map +1 -1
  112. package/dist/backend/llvm/lib-process.js +11 -0
  113. package/dist/backend/llvm/lib-process.js.map +1 -1
  114. package/dist/backend/llvm/lib-shared.js +43 -0
  115. package/dist/backend/llvm/lib-shared.js.map +1 -1
  116. package/dist/backend/llvm/lib-tls.js +28 -3
  117. package/dist/backend/llvm/lib-tls.js.map +1 -1
  118. package/dist/backend/llvm/local-union-storage.test.js +2 -1
  119. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  120. package/dist/backend/llvm/loop-array-borrows.d.ts +4 -1
  121. package/dist/backend/llvm/loop-array-borrows.js +11 -5
  122. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  123. package/dist/backend/llvm/map-entry-fusion.d.ts +5 -3
  124. package/dist/backend/llvm/map-entry-fusion.js +20 -11
  125. package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
  126. package/dist/backend/llvm/map-entry-fusion.test.js +14 -6
  127. package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -1
  128. package/dist/backend/llvm/map-number-lookup.d.ts +16 -6
  129. package/dist/backend/llvm/map-number-lookup.js +41 -9
  130. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  131. package/dist/backend/llvm/map-number-lookup.test.js +70 -2
  132. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  133. package/dist/backend/llvm/map-read-lifetimes.d.ts +25 -2
  134. package/dist/backend/llvm/map-read-lifetimes.js +136 -6
  135. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  136. package/dist/backend/llvm/map-read-lifetimes.test.js +8 -3
  137. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  138. package/dist/backend/llvm/nullable-unions.d.ts +5 -0
  139. package/dist/backend/llvm/nullable-unions.js +29 -2
  140. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  141. package/dist/backend/llvm/nullable-unions.test.js +25 -1
  142. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  143. package/dist/backend/llvm/record-union-keys.test.d.ts +1 -0
  144. package/dist/backend/llvm/record-union-keys.test.js +161 -0
  145. package/dist/backend/llvm/record-union-keys.test.js.map +1 -0
  146. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  147. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  148. package/dist/backend/llvm/shapes.d.ts +4 -5
  149. package/dist/backend/llvm/shapes.js +104 -51
  150. package/dist/backend/llvm/shapes.js.map +1 -1
  151. package/dist/backend/llvm/shapes.test.js +14 -2
  152. package/dist/backend/llvm/shapes.test.js.map +1 -1
  153. package/dist/backend/llvm/speculative-integers.d.ts +50 -3
  154. package/dist/backend/llvm/speculative-integers.js +411 -24
  155. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  156. package/dist/backend/llvm/speculative-integers.test.js +103 -1
  157. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  158. package/dist/backend/llvm/split.d.ts +10 -1
  159. package/dist/backend/llvm/split.js +243 -59
  160. package/dist/backend/llvm/split.js.map +1 -1
  161. package/dist/backend/llvm/split.test.js +92 -13
  162. package/dist/backend/llvm/split.test.js.map +1 -1
  163. package/dist/backend/llvm/stack-objects.test.js +3 -2
  164. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  165. package/dist/backend/llvm/string-lifetimes.test.js +1 -1
  166. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  167. package/dist/backend/llvm/string-reads.d.ts +13 -0
  168. package/dist/backend/llvm/string-reads.js +22 -0
  169. package/dist/backend/llvm/string-reads.js.map +1 -1
  170. package/dist/backend/llvm/string-slices.d.ts +36 -2
  171. package/dist/backend/llvm/string-slices.js +308 -12
  172. package/dist/backend/llvm/string-slices.js.map +1 -1
  173. package/dist/backend/llvm/string-slices.test.js +182 -3
  174. package/dist/backend/llvm/string-slices.test.js.map +1 -1
  175. package/dist/backend/llvm/string-unit-versions.d.ts +11 -0
  176. package/dist/backend/llvm/string-unit-versions.js +191 -0
  177. package/dist/backend/llvm/string-unit-versions.js.map +1 -0
  178. package/dist/backend/llvm/string-unit-versions.test.d.ts +1 -0
  179. package/dist/backend/llvm/string-unit-versions.test.js +117 -0
  180. package/dist/backend/llvm/string-unit-versions.test.js.map +1 -0
  181. package/dist/backend/llvm/test-boxed-unions.d.ts +5 -2
  182. package/dist/backend/llvm/test-boxed-unions.js +24 -8
  183. package/dist/backend/llvm/test-boxed-unions.js.map +1 -1
  184. package/dist/backend/llvm/unwind-abi.d.ts +52 -0
  185. package/dist/backend/llvm/unwind-abi.js +498 -0
  186. package/dist/backend/llvm/unwind-abi.js.map +1 -0
  187. package/dist/backend/llvm/unwind-abi.test.d.ts +1 -0
  188. package/dist/backend/llvm/unwind-abi.test.js +255 -0
  189. package/dist/backend/llvm/unwind-abi.test.js.map +1 -0
  190. package/dist/backend/llvm/wrapping-sums.d.ts +14 -10
  191. package/dist/backend/llvm/wrapping-sums.js +31 -14
  192. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  193. package/dist/backend/loop-polls.d.ts +6 -0
  194. package/dist/backend/loop-polls.js +24 -0
  195. package/dist/backend/loop-polls.js.map +1 -1
  196. package/dist/backend/may-throw.js +8 -8
  197. package/dist/backend/may-throw.js.map +1 -1
  198. package/dist/backend/native/contracts.d.ts +12 -2
  199. package/dist/backend/native/executable.js +48 -6
  200. package/dist/backend/native/executable.js.map +1 -1
  201. package/dist/backend/native/library.js +4 -3
  202. package/dist/backend/native/library.js.map +1 -1
  203. package/dist/backend/native/program-shards.d.ts +2 -2
  204. package/dist/backend/native/program-shards.js +2 -2
  205. package/dist/backend/native/program-shards.js.map +1 -1
  206. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  207. package/dist/backend/native/runtime-inputs.js +4 -1
  208. package/dist/backend/native/runtime-inputs.js.map +1 -1
  209. package/dist/backend/native/vendor.d.ts +1 -1
  210. package/dist/backend/native/vendor.js +1 -1
  211. package/dist/backend/native/vendor.js.map +1 -1
  212. package/dist/backend/native-codegen.d.ts +3 -1
  213. package/dist/backend/native-codegen.js +4 -3
  214. package/dist/backend/native-codegen.js.map +1 -1
  215. package/dist/backend/native-link-info-core.d.ts +8 -0
  216. package/dist/backend/native-link-info-core.js.map +1 -1
  217. package/dist/backend/native-profile.d.ts +14 -0
  218. package/dist/backend/native-profile.js +28 -0
  219. package/dist/backend/native-profile.js.map +1 -1
  220. package/dist/backend/native-profile.test.js +8 -1
  221. package/dist/backend/native-profile.test.js.map +1 -1
  222. package/dist/backend/native-toolchain.test.js +11 -11
  223. package/dist/backend/native-toolchain.test.js.map +1 -1
  224. package/dist/backend/runtime-abi.d.ts +2 -2
  225. package/dist/backend/runtime-abi.js +2 -2
  226. package/dist/backend/runtime-pack-core.d.ts +3 -1
  227. package/dist/backend/runtime-pack-core.js +2 -0
  228. package/dist/backend/runtime-pack-core.js.map +1 -1
  229. package/dist/backend/runtime-pack-native.d.ts +17 -5
  230. package/dist/backend/runtime-pack-native.js +186 -14
  231. package/dist/backend/runtime-pack-native.js.map +1 -1
  232. package/dist/backend/runtime-pack-native.test.js +160 -3
  233. package/dist/backend/runtime-pack-native.test.js.map +1 -1
  234. package/dist/backend/runtime-pack-targets.test.js +2 -1
  235. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  236. package/dist/backend/runtime-pack.test.js +2 -1
  237. package/dist/backend/runtime-pack.test.js.map +1 -1
  238. package/dist/backend/vendor-archives.d.ts +4 -1
  239. package/dist/backend/vendor-archives.js +78 -4
  240. package/dist/backend/vendor-archives.js.map +1 -1
  241. package/dist/backend/vendor-inputs.d.ts +3 -1
  242. package/dist/backend/vendor-inputs.js +3 -1
  243. package/dist/backend/vendor-inputs.js.map +1 -1
  244. package/dist/backend/warm-cache.js +1 -0
  245. package/dist/backend/warm-cache.js.map +1 -1
  246. package/dist/cli/command.js +78 -11
  247. package/dist/cli/command.js.map +1 -1
  248. package/dist/cli/usage.d.ts +22 -1
  249. package/dist/cli/usage.js +33 -3
  250. package/dist/cli/usage.js.map +1 -1
  251. package/dist/compat/fetch-profile.d.ts +15 -6
  252. package/dist/compat/fetch-profile.js +519 -498
  253. package/dist/compat/fetch-profile.js.map +1 -1
  254. package/dist/compile-types.d.ts +7 -0
  255. package/dist/contracts/int32-elements.js +2 -1
  256. package/dist/contracts/int32-elements.js.map +1 -1
  257. package/dist/coverage/report.d.ts +14 -3
  258. package/dist/coverage/report.js +216 -0
  259. package/dist/coverage/report.js.map +1 -1
  260. package/dist/coverage/surface-manifest.js +25 -25
  261. package/dist/coverage/surface-manifest.js.map +1 -1
  262. package/dist/coverage/verdict-cache.d.ts +2 -0
  263. package/dist/coverage/verdict-cache.js +10 -1
  264. package/dist/coverage/verdict-cache.js.map +1 -1
  265. package/dist/diagnostics/diagnostic.d.ts +19 -0
  266. package/dist/diagnostics/diagnostic.js +52 -1
  267. package/dist/diagnostics/diagnostic.js.map +1 -1
  268. package/dist/diagnostics/envelope.d.ts +54 -0
  269. package/dist/diagnostics/envelope.js +7 -1
  270. package/dist/diagnostics/envelope.js.map +1 -1
  271. package/dist/diagnostics/render.d.ts +7 -0
  272. package/dist/diagnostics/render.js +15 -4
  273. package/dist/diagnostics/render.js.map +1 -1
  274. package/dist/executable/executable-cache.d.ts +3 -0
  275. package/dist/executable/executable-cache.js +1 -0
  276. package/dist/executable/executable-cache.js.map +1 -1
  277. package/dist/executable/executable-cache.test.js +1 -0
  278. package/dist/executable/executable-cache.test.js.map +1 -1
  279. package/dist/executable/prepare.js +5 -1
  280. package/dist/executable/prepare.js.map +1 -1
  281. package/dist/frontend/analysis.js +26 -2
  282. package/dist/frontend/analysis.js.map +1 -1
  283. package/dist/frontend/fork-target.js +67 -1
  284. package/dist/frontend/fork-target.js.map +1 -1
  285. package/dist/frontend/fork-target.test.js +43 -0
  286. package/dist/frontend/fork-target.test.js.map +1 -1
  287. package/dist/frontend/input-tracker.d.ts +4 -1
  288. package/dist/frontend/input-tracker.js +42 -4
  289. package/dist/frontend/input-tracker.js.map +1 -1
  290. package/dist/frontend/input-tracker.test.js +45 -0
  291. package/dist/frontend/input-tracker.test.js.map +1 -1
  292. package/dist/frontend/lowering/abstract-equality.js +38 -1
  293. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  294. package/dist/frontend/lowering/argument-counts.d.ts +36 -0
  295. package/dist/frontend/lowering/argument-counts.js +201 -0
  296. package/dist/frontend/lowering/argument-counts.js.map +1 -0
  297. package/dist/frontend/lowering/array-values.d.ts +27 -0
  298. package/dist/frontend/lowering/array-values.js +112 -0
  299. package/dist/frontend/lowering/array-values.js.map +1 -1
  300. package/dist/frontend/lowering/binding-analysis.d.ts +3 -0
  301. package/dist/frontend/lowering/binding-analysis.js +9 -3
  302. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  303. package/dist/frontend/lowering/builtin-namespaces.d.ts +13 -0
  304. package/dist/frontend/lowering/builtin-namespaces.js +238 -0
  305. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -0
  306. package/dist/frontend/lowering/builtins/compression.d.ts +4 -3
  307. package/dist/frontend/lowering/builtins/compression.js +86 -5
  308. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  309. package/dist/frontend/lowering/builtins/date-classes.js +17 -1
  310. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -1
  311. package/dist/frontend/lowering/builtins/dates.d.ts +19 -5
  312. package/dist/frontend/lowering/builtins/dates.js +159 -8
  313. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  314. package/dist/frontend/lowering/builtins/filesystem-calls.js +26 -1
  315. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  316. package/dist/frontend/lowering/builtins/fs-streams.d.ts +4 -0
  317. package/dist/frontend/lowering/builtins/fs-streams.js +24 -1
  318. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
  319. package/dist/frontend/lowering/builtins/json.d.ts +4 -1
  320. package/dist/frontend/lowering/builtins/json.js +9 -3
  321. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  322. package/dist/frontend/lowering/builtins/module-bindings.d.ts +6 -0
  323. package/dist/frontend/lowering/builtins/module-bindings.js +23 -1
  324. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  325. package/dist/frontend/lowering/builtins/module-resolution.d.ts +5 -0
  326. package/dist/frontend/lowering/builtins/module-resolution.js +95 -4
  327. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  328. package/dist/frontend/lowering/builtins/promises.js +144 -1
  329. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  330. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  331. package/dist/frontend/lowering/builtins/readline.js +22 -11
  332. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  333. package/dist/frontend/lowering/builtins/reflection.d.ts +4 -1
  334. package/dist/frontend/lowering/builtins/reflection.js +41 -1
  335. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  336. package/dist/frontend/lowering/builtins/text-codecs.js +31 -2
  337. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  338. package/dist/frontend/lowering/builtins/webassembly.js +4 -1
  339. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  340. package/dist/frontend/lowering/builtins/x509.d.ts +33 -0
  341. package/dist/frontend/lowering/builtins/x509.js +431 -0
  342. package/dist/frontend/lowering/builtins/x509.js.map +1 -0
  343. package/dist/frontend/lowering/call-arguments.js +44 -0
  344. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  345. package/dist/frontend/lowering/call-signatures.js +1 -1
  346. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  347. package/dist/frontend/lowering/cjs-inline-require.js +1 -1
  348. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  349. package/dist/frontend/lowering/class-attributes.d.ts +7 -0
  350. package/dist/frontend/lowering/class-attributes.js +52 -10
  351. package/dist/frontend/lowering/class-attributes.js.map +1 -1
  352. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +13 -0
  353. package/dist/frontend/lowering/class-dynamic-dispatch.js +174 -9
  354. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  355. package/dist/frontend/lowering/class-method-mutations.js +43 -8
  356. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  357. package/dist/frontend/lowering/class-method-values.js +71 -1
  358. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  359. package/dist/frontend/lowering/class-prototypes.d.ts +8 -0
  360. package/dist/frontend/lowering/class-prototypes.js +83 -2
  361. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  362. package/dist/frontend/lowering/class-to-primitive.d.ts +5 -0
  363. package/dist/frontend/lowering/class-to-primitive.js +79 -7
  364. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  365. package/dist/frontend/lowering/coercions/state.d.ts +1 -0
  366. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  367. package/dist/frontend/lowering/coercions/structural.js +89 -10
  368. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  369. package/dist/frontend/lowering/coercions/unions.d.ts +4 -2
  370. package/dist/frontend/lowering/coercions/unions.js +13 -6
  371. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  372. package/dist/frontend/lowering/containers/array-callbacks.js +51 -15
  373. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  374. package/dist/frontend/lowering/containers/array-construction.d.ts +4 -1
  375. package/dist/frontend/lowering/containers/array-construction.js +102 -9
  376. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  377. package/dist/frontend/lowering/containers/array-methods.js +85 -5
  378. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  379. package/dist/frontend/lowering/containers/array-pipelines.js +346 -77
  380. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  381. package/dist/frontend/lowering/containers/callback-arguments.js +11 -1
  382. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  383. package/dist/frontend/lowering/containers/collection-methods.js +12 -0
  384. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  385. package/dist/frontend/lowering/containers/indexed-objects.js +73 -25
  386. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  387. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +4 -4
  388. package/dist/frontend/lowering/containers/iterator-helpers.js +8 -2
  389. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  390. package/dist/frontend/lowering/containers/replacer-params.d.ts +37 -0
  391. package/dist/frontend/lowering/containers/replacer-params.js +294 -0
  392. package/dist/frontend/lowering/containers/replacer-params.js.map +1 -0
  393. package/dist/frontend/lowering/containers/replacer-params.test.d.ts +1 -0
  394. package/dist/frontend/lowering/containers/replacer-params.test.js +61 -0
  395. package/dist/frontend/lowering/containers/replacer-params.test.js.map +1 -0
  396. package/dist/frontend/lowering/containers/string-and-regexp.js +2 -1
  397. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  398. package/dist/frontend/lowering/containers/string-replacement.js +7 -3
  399. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  400. package/dist/frontend/lowering/cycle-initialization.d.ts +4 -2
  401. package/dist/frontend/lowering/cycle-initialization.js +4 -1
  402. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  403. package/dist/frontend/lowering/date-values.d.ts +9 -6
  404. package/dist/frontend/lowering/date-values.js +63 -16
  405. package/dist/frontend/lowering/date-values.js.map +1 -1
  406. package/dist/frontend/lowering/deferred-module-initializers.js +16 -8
  407. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  408. package/dist/frontend/lowering/deferred-module-initializers.test.js +22 -6
  409. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  410. package/dist/frontend/lowering/dispatch-sites.js +1 -0
  411. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  412. package/dist/frontend/lowering/expressions/array-literals.d.ts +0 -8
  413. package/dist/frontend/lowering/expressions/array-literals.js +119 -26
  414. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  415. package/dist/frontend/lowering/expressions/binary.js +38 -0
  416. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  417. package/dist/frontend/lowering/expressions/element-access.js +50 -6
  418. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  419. package/dist/frontend/lowering/expressions/identifiers.js +35 -3
  420. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  421. package/dist/frontend/lowering/expressions/narrowing.d.ts +2 -1
  422. package/dist/frontend/lowering/expressions/narrowing.js +8 -1
  423. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  424. package/dist/frontend/lowering/expressions/object-literals.js +8 -2
  425. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  426. package/dist/frontend/lowering/expressions/property-access.js +65 -34
  427. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  428. package/dist/frontend/lowering/expressions/relational.js +76 -11
  429. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  430. package/dist/frontend/lowering/expressions/typeof.js +6 -1
  431. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  432. package/dist/frontend/lowering/expressions/updates.js +20 -11
  433. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  434. package/dist/frontend/lowering/f64-handles.d.ts +8 -0
  435. package/dist/frontend/lowering/f64-handles.js +16 -0
  436. package/dist/frontend/lowering/f64-handles.js.map +1 -0
  437. package/dist/frontend/lowering/frozen-records.d.ts +5 -0
  438. package/dist/frontend/lowering/frozen-records.js +12 -4
  439. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  440. package/dist/frontend/lowering/function-context.d.ts +3 -0
  441. package/dist/frontend/lowering/function-context.js.map +1 -1
  442. package/dist/frontend/lowering/function-returns.js +15 -0
  443. package/dist/frontend/lowering/function-returns.js.map +1 -1
  444. package/dist/frontend/lowering/generic-functions.js +17 -6
  445. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  446. package/dist/frontend/lowering/instantiation-path.d.ts +3 -2
  447. package/dist/frontend/lowering/instantiation-path.js.map +1 -1
  448. package/dist/frontend/lowering/instantiation-path.test.js +6 -4
  449. package/dist/frontend/lowering/instantiation-path.test.js.map +1 -1
  450. package/dist/frontend/lowering/iterator-adapters.d.ts +4 -2
  451. package/dist/frontend/lowering/iterator-adapters.js +26 -33
  452. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  453. package/dist/frontend/lowering/js-collection-types.d.ts +11 -0
  454. package/dist/frontend/lowering/js-collection-types.js +490 -0
  455. package/dist/frontend/lowering/js-collection-types.js.map +1 -0
  456. package/dist/frontend/lowering/lib-boundary.js +2 -2
  457. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  458. package/dist/frontend/lowering/lower-assert.d.ts +14 -0
  459. package/dist/frontend/lowering/lower-assert.js +283 -26
  460. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  461. package/dist/frontend/lowering/lower-builtin-values.js +3 -3
  462. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  463. package/dist/frontend/lowering/lower-calls.js +97 -7
  464. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  465. package/dist/frontend/lowering/lower-classes.d.ts +59 -7
  466. package/dist/frontend/lowering/lower-classes.js +647 -176
  467. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  468. package/dist/frontend/lowering/lower-console.js +2 -1
  469. package/dist/frontend/lowering/lower-console.js.map +1 -1
  470. package/dist/frontend/lowering/lower-exprs.d.ts +5 -0
  471. package/dist/frontend/lowering/lower-exprs.js +52 -5
  472. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  473. package/dist/frontend/lowering/lower-functions.js +7 -0
  474. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  475. package/dist/frontend/lowering/lower-generators.js +4 -3
  476. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  477. package/dist/frontend/lowering/lower-inspect.js +264 -46
  478. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  479. package/dist/frontend/lowering/lower-modules.js +28 -17
  480. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  481. package/dist/frontend/lowering/lower-namespaces.d.ts +3 -0
  482. package/dist/frontend/lowering/lower-namespaces.js +44 -1
  483. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  484. package/dist/frontend/lowering/lower-node-module.js +1 -1
  485. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  486. package/dist/frontend/lowering/lower-server.js +126 -32
  487. package/dist/frontend/lowering/lower-server.js.map +1 -1
  488. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -1
  489. package/dist/frontend/lowering/lower-stdlib.js +51 -37
  490. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  491. package/dist/frontend/lowering/lower-stmts.js +294 -46
  492. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  493. package/dist/frontend/lowering/lower-stream.js +515 -121
  494. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  495. package/dist/frontend/lowering/lowerer.d.ts +52 -10
  496. package/dist/frontend/lowering/lowerer.js +249 -37
  497. package/dist/frontend/lowering/lowerer.js.map +1 -1
  498. package/dist/frontend/lowering/lowerer.test.js +1 -1
  499. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  500. package/dist/frontend/lowering/module-namespace-elements.d.ts +13 -0
  501. package/dist/frontend/lowering/module-namespace-elements.js +118 -1
  502. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  503. package/dist/frontend/lowering/private-brands.d.ts +5 -0
  504. package/dist/frontend/lowering/private-brands.js +39 -0
  505. package/dist/frontend/lowering/private-brands.js.map +1 -1
  506. package/dist/frontend/lowering/runtime-optional-elements.d.ts +6 -0
  507. package/dist/frontend/lowering/runtime-optional-elements.js +14 -3
  508. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  509. package/dist/frontend/lowering/sanitize-class-types.js +2 -0
  510. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
  511. package/dist/frontend/lowering/site-dependencies.d.ts +7 -2
  512. package/dist/frontend/lowering/site-dependencies.js +0 -15
  513. package/dist/frontend/lowering/site-dependencies.js.map +1 -1
  514. package/dist/frontend/lowering/site-dependencies.test.js +7 -5
  515. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -1
  516. package/dist/frontend/lowering/string-index-bounds.d.ts +7 -4
  517. package/dist/frontend/lowering/string-index-bounds.js +21 -7
  518. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  519. package/dist/frontend/lowering/surfaces.d.ts +12 -3
  520. package/dist/frontend/lowering/surfaces.js +1576 -1539
  521. package/dist/frontend/lowering/surfaces.js.map +1 -1
  522. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  523. package/dist/frontend/lowering/symbol-fields.js +45 -2
  524. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  525. package/dist/frontend/lowering/union-narrow.d.ts +5 -2
  526. package/dist/frontend/lowering/union-narrow.js +6 -3
  527. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  528. package/dist/frontend/lowering/union-narrow.test.js +10 -0
  529. package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
  530. package/dist/frontend/npm-static-namespace-defaults.d.ts +6 -0
  531. package/dist/frontend/npm-static-namespace-defaults.js +163 -0
  532. package/dist/frontend/npm-static-namespace-defaults.js.map +1 -0
  533. package/dist/frontend/npm-static-namespace-defaults.test.d.ts +1 -0
  534. package/dist/frontend/npm-static-namespace-defaults.test.js +72 -0
  535. package/dist/frontend/npm-static-namespace-defaults.test.js.map +1 -0
  536. package/dist/frontend/npm-static-prune.js +152 -111
  537. package/dist/frontend/npm-static-prune.js.map +1 -1
  538. package/dist/frontend/npm-static.js +35 -32
  539. package/dist/frontend/npm-static.js.map +1 -1
  540. package/dist/frontend/package-shims.d.ts +7 -4
  541. package/dist/frontend/package-shims.js +39 -40
  542. package/dist/frontend/package-shims.js.map +1 -1
  543. package/dist/frontend/pipeline-native.d.ts +2 -2
  544. package/dist/frontend/pipeline-native.js +2 -2
  545. package/dist/frontend/pipeline-native.js.map +1 -1
  546. package/dist/frontend/pipeline.d.ts +19 -2
  547. package/dist/frontend/pipeline.js +102 -11
  548. package/dist/frontend/pipeline.js.map +1 -1
  549. package/dist/frontend/program-analysis.d.ts +2 -0
  550. package/dist/frontend/program-analysis.js +3 -0
  551. package/dist/frontend/program-analysis.js.map +1 -1
  552. package/dist/frontend/program.d.ts +15 -0
  553. package/dist/frontend/program.js +227 -64
  554. package/dist/frontend/program.js.map +1 -1
  555. package/dist/frontend/resolve.d.ts +2 -0
  556. package/dist/frontend/resolve.js +5 -0
  557. package/dist/frontend/resolve.js.map +1 -1
  558. package/dist/frontend/services.d.ts +3 -0
  559. package/dist/frontend/services.js +31 -4
  560. package/dist/frontend/services.js.map +1 -1
  561. package/dist/frontend/shape-inference/analyze.d.ts +93 -0
  562. package/dist/frontend/shape-inference/analyze.js +3138 -0
  563. package/dist/frontend/shape-inference/analyze.js.map +1 -0
  564. package/dist/frontend/shape-inference/constant-graphs.d.ts +54 -0
  565. package/dist/frontend/shape-inference/constant-graphs.js +357 -0
  566. package/dist/frontend/shape-inference/constant-graphs.js.map +1 -0
  567. package/dist/frontend/shape-inference/domain.d.ts +32 -0
  568. package/dist/frontend/shape-inference/domain.js +104 -0
  569. package/dist/frontend/shape-inference/domain.js.map +1 -0
  570. package/dist/frontend/shape-inference/index.d.ts +7 -0
  571. package/dist/frontend/shape-inference/index.js +19 -0
  572. package/dist/frontend/shape-inference/index.js.map +1 -0
  573. package/dist/frontend/shape-inference/report.d.ts +21 -0
  574. package/dist/frontend/shape-inference/report.js +348 -0
  575. package/dist/frontend/shape-inference/report.js.map +1 -0
  576. package/dist/frontend/token-equivalence.d.ts +6 -0
  577. package/dist/frontend/token-equivalence.js +66 -9
  578. package/dist/frontend/token-equivalence.js.map +1 -1
  579. package/dist/frontend/token-equivalence.test.js +33 -1
  580. package/dist/frontend/token-equivalence.test.js.map +1 -1
  581. package/dist/frontend/ts7/checker-features.d.ts +15 -0
  582. package/dist/frontend/ts7/checker-features.js +45 -0
  583. package/dist/frontend/ts7/checker-features.js.map +1 -0
  584. package/dist/frontend/ts7/checker-features.test.d.ts +1 -0
  585. package/dist/frontend/ts7/checker-features.test.js +40 -0
  586. package/dist/frontend/ts7/checker-features.test.js.map +1 -0
  587. package/dist/frontend/ts7/checker-server.d.ts +19 -0
  588. package/dist/frontend/ts7/checker-server.js +46 -0
  589. package/dist/frontend/ts7/checker-server.js.map +1 -0
  590. package/dist/frontend/ts7/checker-server.test.d.ts +1 -0
  591. package/dist/frontend/ts7/checker-server.test.js +38 -0
  592. package/dist/frontend/ts7/checker-server.test.js.map +1 -0
  593. package/dist/frontend/ts7/lib-diagnostics.js +39 -13
  594. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -1
  595. package/dist/frontend/ts7/lib-diagnostics.test.js +40 -0
  596. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -1
  597. package/dist/frontend/ts7/native-api.d.ts +1 -0
  598. package/dist/frontend/ts7/native-api.js +25 -2
  599. package/dist/frontend/ts7/native-api.js.map +1 -1
  600. package/dist/frontend/ts7/native-process.d.ts +9 -2
  601. package/dist/frontend/ts7/native-process.js +22 -4
  602. package/dist/frontend/ts7/native-process.js.map +1 -1
  603. package/dist/frontend/ts7/program-host.d.ts +11 -0
  604. package/dist/frontend/ts7/program-host.js +36 -22
  605. package/dist/frontend/ts7/program-host.js.map +1 -1
  606. package/dist/frontend/ts7/semantic-json.d.ts +9 -0
  607. package/dist/frontend/ts7/semantic-json.js +25 -5
  608. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  609. package/dist/frontend/ts7/semantic-model.js +3 -1
  610. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  611. package/dist/frontend/ts7/source-parser.js +3 -1
  612. package/dist/frontend/ts7/source-parser.js.map +1 -1
  613. package/dist/frontend/tsc-codes.js +10 -0
  614. package/dist/frontend/tsc-codes.js.map +1 -1
  615. package/dist/frontend/type-mapper.d.ts +18 -6
  616. package/dist/frontend/type-mapper.js +160 -28
  617. package/dist/frontend/type-mapper.js.map +1 -1
  618. package/dist/index.d.ts +44 -3
  619. package/dist/index.js +27 -8
  620. package/dist/index.js.map +1 -1
  621. package/dist/ir/builtin-effects.js +29 -0
  622. package/dist/ir/builtin-effects.js.map +1 -1
  623. package/dist/ir/builtin-signatures.d.ts +7 -2
  624. package/dist/ir/builtin-signatures.js +5104 -4950
  625. package/dist/ir/builtin-signatures.js.map +1 -1
  626. package/dist/ir/callback-specialization.d.ts +4 -2
  627. package/dist/ir/callback-specialization.js +24 -9
  628. package/dist/ir/callback-specialization.js.map +1 -1
  629. package/dist/ir/capture-values.js +4 -2
  630. package/dist/ir/capture-values.js.map +1 -1
  631. package/dist/ir/char-unit-locals.d.ts +12 -2
  632. package/dist/ir/char-unit-locals.js +400 -58
  633. package/dist/ir/char-unit-locals.js.map +1 -1
  634. package/dist/ir/char-unit-locals.test.js +111 -0
  635. package/dist/ir/char-unit-locals.test.js.map +1 -1
  636. package/dist/ir/constant-globals.js +18 -4
  637. package/dist/ir/constant-globals.js.map +1 -1
  638. package/dist/ir/expression-inlining.d.ts +15 -0
  639. package/dist/ir/expression-inlining.js +166 -0
  640. package/dist/ir/expression-inlining.js.map +1 -0
  641. package/dist/ir/expression-inlining.test.d.ts +1 -0
  642. package/dist/ir/expression-inlining.test.js +123 -0
  643. package/dist/ir/expression-inlining.test.js.map +1 -0
  644. package/dist/ir/function-references.js +2 -0
  645. package/dist/ir/function-references.js.map +1 -1
  646. package/dist/ir/function-references.test.js +6 -0
  647. package/dist/ir/function-references.test.js.map +1 -1
  648. package/dist/ir/int32-arrays.d.ts +27 -6
  649. package/dist/ir/int32-arrays.js +106 -18
  650. package/dist/ir/int32-arrays.js.map +1 -1
  651. package/dist/ir/int32-slots.d.ts +26 -1
  652. package/dist/ir/int32-slots.js +284 -5
  653. package/dist/ir/int32-slots.js.map +1 -1
  654. package/dist/ir/int32-slots.test.js +5 -0
  655. package/dist/ir/int32-slots.test.js.map +1 -1
  656. package/dist/ir/integer-loop-facts.d.ts +5 -0
  657. package/dist/ir/integer-loop-facts.js +90 -1
  658. package/dist/ir/integer-loop-facts.js.map +1 -1
  659. package/dist/ir/integer-loops.d.ts +14 -1
  660. package/dist/ir/integer-loops.js +93 -7
  661. package/dist/ir/integer-loops.js.map +1 -1
  662. package/dist/ir/integer-loops.test.js +70 -0
  663. package/dist/ir/integer-loops.test.js.map +1 -1
  664. package/dist/ir/integer-ranges.js +18 -2
  665. package/dist/ir/integer-ranges.js.map +1 -1
  666. package/dist/ir/integer-ranges.test.js +64 -4
  667. package/dist/ir/integer-ranges.test.js.map +1 -1
  668. package/dist/ir/ir.d.ts +50 -8
  669. package/dist/ir/ir.js +38 -12
  670. package/dist/ir/ir.js.map +1 -1
  671. package/dist/ir/js-ic.d.ts +25 -5
  672. package/dist/ir/js-ic.js +93 -13
  673. package/dist/ir/js-ic.js.map +1 -1
  674. package/dist/ir/js-ic.test.js +153 -0
  675. package/dist/ir/js-ic.test.js.map +1 -1
  676. package/dist/ir/node-index.d.ts +7 -0
  677. package/dist/ir/node-index.js +32 -0
  678. package/dist/ir/node-index.js.map +1 -1
  679. package/dist/ir/receiver-readers.d.ts +6 -1
  680. package/dist/ir/receiver-readers.js +53 -28
  681. package/dist/ir/receiver-readers.js.map +1 -1
  682. package/dist/ir/row-pairs.d.ts +15 -0
  683. package/dist/ir/row-pairs.js +373 -0
  684. package/dist/ir/row-pairs.js.map +1 -0
  685. package/dist/ir/row-pairs.test.d.ts +1 -0
  686. package/dist/ir/row-pairs.test.js +129 -0
  687. package/dist/ir/row-pairs.test.js.map +1 -0
  688. package/dist/ir/runtime-features.d.ts +17 -4
  689. package/dist/ir/runtime-features.js +69 -12
  690. package/dist/ir/runtime-features.js.map +1 -1
  691. package/dist/ir/scalar-records.d.ts +15 -0
  692. package/dist/ir/scalar-records.js +301 -1
  693. package/dist/ir/scalar-records.js.map +1 -1
  694. package/dist/ir/scalar-records.test.js +181 -1
  695. package/dist/ir/scalar-records.test.js.map +1 -1
  696. package/dist/ir/self-captures.js +8 -0
  697. package/dist/ir/self-captures.js.map +1 -1
  698. package/dist/ir/validate.js +37 -28
  699. package/dist/ir/validate.js.map +1 -1
  700. package/dist/library/fence-eval.js +4 -4
  701. package/dist/library/fence-eval.js.map +1 -1
  702. package/dist/library/ir-policy.js +4 -0
  703. package/dist/library/ir-policy.js.map +1 -1
  704. package/dist/library/library-cache.d.ts +1 -0
  705. package/dist/library/library-cache.js +1 -0
  706. package/dist/library/library-cache.js.map +1 -1
  707. package/dist/library/library-cache.test.js +13 -0
  708. package/dist/library/library-cache.test.js.map +1 -1
  709. package/dist/native/cache.d.ts +5 -1
  710. package/dist/native/cache.js +15 -3
  711. package/dist/native/cache.js.map +1 -1
  712. package/dist/native/cli.js +6 -0
  713. package/dist/native/cli.js.map +1 -1
  714. package/dist/native/compiler.d.ts +3 -0
  715. package/dist/native/compiler.js +72 -26
  716. package/dist/native/compiler.js.map +1 -1
  717. package/dist/native/compiler.test.js +87 -2
  718. package/dist/native/compiler.test.js.map +1 -1
  719. package/dist/native/executable-cache-open.test.d.ts +1 -0
  720. package/dist/native/executable-cache-open.test.js +80 -0
  721. package/dist/native/executable-cache-open.test.js.map +1 -0
  722. package/dist/native/executable-cache.d.ts +43 -3
  723. package/dist/native/executable-cache.js +177 -36
  724. package/dist/native/executable-cache.js.map +1 -1
  725. package/dist/native/executable-cache.test.js +103 -0
  726. package/dist/native/executable-cache.test.js.map +1 -1
  727. package/dist/native/prepare.js +38 -16
  728. package/dist/native/prepare.js.map +1 -1
  729. package/dist/native/prepare.test.js +51 -1
  730. package/dist/native/prepare.test.js.map +1 -1
  731. package/dist/native/sanitizer.d.ts +1 -1
  732. package/dist/native/sanitizer.js +17 -3
  733. package/dist/native/sanitizer.js.map +1 -1
  734. package/dist/native/sanitizer.test.js +4 -0
  735. package/dist/native/sanitizer.test.js.map +1 -1
  736. package/dist/node-islands/classify.d.ts +14 -0
  737. package/dist/node-islands/classify.js +114 -0
  738. package/dist/node-islands/classify.js.map +1 -0
  739. package/dist/node-islands/detect.d.ts +13 -0
  740. package/dist/node-islands/detect.js +805 -0
  741. package/dist/node-islands/detect.js.map +1 -0
  742. package/dist/node-islands/detect.test.d.ts +1 -0
  743. package/dist/node-islands/detect.test.js +136 -0
  744. package/dist/node-islands/detect.test.js.map +1 -0
  745. package/dist/node-islands/origin.d.ts +21 -0
  746. package/dist/node-islands/origin.js +60 -0
  747. package/dist/node-islands/origin.js.map +1 -0
  748. package/dist/node-islands/policy.d.ts +49 -0
  749. package/dist/node-islands/policy.js +130 -0
  750. package/dist/node-islands/policy.js.map +1 -0
  751. package/dist/node-islands/report.d.ts +22 -0
  752. package/dist/node-islands/report.js +326 -0
  753. package/dist/node-islands/report.js.map +1 -0
  754. package/dist/node-islands/report.test.d.ts +1 -0
  755. package/dist/node-islands/report.test.js +228 -0
  756. package/dist/node-islands/report.test.js.map +1 -0
  757. package/dist/node-islands/rules.d.ts +20 -0
  758. package/dist/node-islands/rules.js +91 -0
  759. package/dist/node-islands/rules.js.map +1 -0
  760. package/dist/node-islands/scan.d.ts +53 -0
  761. package/dist/node-islands/scan.js +104 -0
  762. package/dist/node-islands/scan.js.map +1 -0
  763. package/dist/node-islands/summary.d.ts +78 -0
  764. package/dist/node-islands/summary.js +26 -0
  765. package/dist/node-islands/summary.js.map +1 -0
  766. package/dist/project-config.d.ts +50 -0
  767. package/dist/project-config.js +372 -0
  768. package/dist/project-config.js.map +1 -0
  769. package/dist/project-config.test.d.ts +1 -0
  770. package/dist/project-config.test.js +154 -0
  771. package/dist/project-config.test.js.map +1 -0
  772. package/dist/wasm/discover.js +6 -31
  773. package/dist/wasm/discover.js.map +1 -1
  774. package/package.json +20 -20
  775. package/surface-manifest.json +20 -35
@@ -1,7 +1,292 @@
1
- import { everyExprChild, everyStmtChild } from "../../ir/traverse.js";
1
+ import { everyExpr, everyExprChild, everyStmtChild } from "../../ir/traverse.js";
2
+ import { InternalCompilerError } from "../../errors.js";
2
3
  import { f64Lit } from "./common.js";
3
4
  import { exactInteger, widenInteger } from "./integer-values.js";
4
5
  import { withinInt32 } from "../../ir/integer-ranges.js";
6
+ /** `s` (a speculated write) writing `value` instead. */
7
+ export function withSpeculativeValue(s, value) {
8
+ switch (s.kind) {
9
+ case "assign":
10
+ return { ...s, value };
11
+ case "varDecl":
12
+ return { ...s, init: value };
13
+ case "exprStmt":
14
+ if (s.expr.kind === "assignExpr")
15
+ return { ...s, expr: { ...s.expr, value } };
16
+ break;
17
+ default:
18
+ break;
19
+ }
20
+ throw new InternalCompilerError(`llvm emitter bug: speculated ${s.kind} with a rewritten value`);
21
+ }
22
+ /** Calls nest at most this deep in one expansion. */
23
+ const MAX_INLINE_DEPTH = 4;
24
+ /** An expansion larger than this stays a call. */
25
+ const MAX_INLINE_NODES = 64;
26
+ /** A function that only returns arithmetic over its number parameters:
27
+ * `function trim(v, n) { return v - Math.floor(v / Math.pow(2, n)) * Math.pow(2, n); }`.
28
+ * Its call evaluates nothing but its arguments, so a speculated write may
29
+ * expand it in place. A call in its body must be of another such function
30
+ * (`resolve`): any other call could change what the expansion reads. */
31
+ export function inlinableNumberFunction(fn, resolve) {
32
+ if (fn.async ||
33
+ fn.generator ||
34
+ (fn.captures?.length ?? 0) > 0 ||
35
+ (fn.classCaptures?.length ?? 0) > 0 ||
36
+ fn.returnType.kind !== "f64" ||
37
+ fn.params.some((p) => p.type.kind !== "f64" && p.type.kind !== "union") ||
38
+ fn.body.length !== 1 ||
39
+ fn.body[0].kind !== "return" ||
40
+ fn.body[0].value === undefined)
41
+ return undefined;
42
+ const params = fn.params.map((p) => p.localId);
43
+ const known = new Set(params);
44
+ let nodes = 0;
45
+ // A parameter of a union type (`number | undefined`) is read only
46
+ // through its tag test and narrowing, which a wrapped argument folds.
47
+ const union = (e) => e.kind === "varRef" && known.has(e.localId);
48
+ const pure = (e) => {
49
+ if (++nodes > MAX_INLINE_NODES)
50
+ return false;
51
+ if (e.kind === "boolLit")
52
+ return true;
53
+ if (e.kind === "unionIsTag")
54
+ return union(e.value);
55
+ if (e.kind === "unionNarrow")
56
+ return e.type.kind === "f64" && union(e.value);
57
+ if (e.type.kind !== "f64")
58
+ return false;
59
+ switch (e.kind) {
60
+ case "numLit":
61
+ return true;
62
+ case "varRef":
63
+ return known.has(e.localId);
64
+ case "ternary":
65
+ return pure(e.cond) && pure(e.then) && pure(e.else_);
66
+ case "bin":
67
+ return (INTEGER_OPS.has(e.op) || e.op === "/") && pure(e.left) && pure(e.right);
68
+ case "unary":
69
+ return e.op === "-" && pure(e.operand);
70
+ case "libCall":
71
+ return (e.fn === "math.floor" || e.fn === "math.pow") && e.args.every(pure);
72
+ case "call":
73
+ return resolve?.(e.callee) !== undefined && e.args.every(pure);
74
+ default:
75
+ return false;
76
+ }
77
+ };
78
+ const body = fn.body[0].value;
79
+ return pure(body) ? { params, body } : undefined;
80
+ }
81
+ /** `e` with each parameter reference replaced by its argument. A tag test
82
+ * or narrowing of a wrapped argument folds, and so does a ternary over a
83
+ * folded test. */
84
+ function substitute(e, args) {
85
+ switch (e.kind) {
86
+ case "varRef":
87
+ return args.get(e.localId) ?? e;
88
+ case "unionIsTag": {
89
+ const value = substitute(e.value, args);
90
+ if (value.kind !== "unionWrap" || value.unionId !== e.unionId)
91
+ return { ...e, value };
92
+ return {
93
+ kind: "boolLit",
94
+ value: (value.tag === e.tag) !== (e.negated === true),
95
+ type: e.type,
96
+ loc: e.loc,
97
+ };
98
+ }
99
+ case "unionNarrow": {
100
+ const value = substitute(e.value, args);
101
+ return value.kind === "unionWrap" && value.unionId === e.unionId && value.tag === e.tag
102
+ ? value.value
103
+ : { ...e, value };
104
+ }
105
+ case "ternary": {
106
+ const cond = substitute(e.cond, args);
107
+ if (cond.kind === "boolLit")
108
+ return substitute(cond.value ? e.then : e.else_, args);
109
+ return { ...e, cond, then: substitute(e.then, args), else_: substitute(e.else_, args) };
110
+ }
111
+ case "bin":
112
+ return { ...e, left: substitute(e.left, args), right: substitute(e.right, args) };
113
+ case "unary":
114
+ return { ...e, operand: substitute(e.operand, args) };
115
+ case "libCall":
116
+ case "call":
117
+ return { ...e, args: e.args.map((a) => substitute(a, args)) };
118
+ default:
119
+ return e;
120
+ }
121
+ }
122
+ /** k when `value` is exactly 2^k with k in [0, 52], else null.
123
+ * Math.log2 rounds: 2^52 + 1 gives 52, so the power is compared back. */
124
+ function exactPowerOfTwo(value) {
125
+ if (!(value >= 1))
126
+ return null;
127
+ const k = Math.round(Math.log2(value));
128
+ return k >= 0 && k <= 52 && 2 ** k === value ? k : null;
129
+ }
130
+ /** The same speculated operand written twice: a local, a literal, or a
131
+ * power of two of the same exponent. */
132
+ function sameOperand(a, b) {
133
+ if (a.kind === "varRef")
134
+ return b.kind === "varRef" && a.localId === b.localId;
135
+ if (a.kind === "numLit")
136
+ return b.kind === "numLit" && Object.is(a.value, b.value);
137
+ return (a.kind === "libCall" &&
138
+ b.kind === "libCall" &&
139
+ a.fn === "math.pow" &&
140
+ b.fn === "math.pow" &&
141
+ powerOfTwo(a) &&
142
+ powerOfTwo(b) &&
143
+ sameOperand(a.args[1], b.args[1]));
144
+ }
145
+ /** `a - Math.floor(a / p) * p` (either factor order) with p a power of two
146
+ * and `a` a local or literal: the floor-mod of `a` by p. */
147
+ function floorModPowerOfTwo(e) {
148
+ if (e.kind !== "bin" || e.op !== "-" || e.right.kind !== "bin" || e.right.op !== "*")
149
+ return null;
150
+ const { left, right } = e.right;
151
+ const [floor, power] = left.kind === "libCall" && left.fn === "math.floor" ? [left, right] : [right, left];
152
+ if (floor.kind !== "libCall" || floor.fn !== "math.floor" || floor.args.length !== 1)
153
+ return null;
154
+ const quotient = floor.args[0];
155
+ if (quotient.kind !== "bin" || quotient.op !== "/")
156
+ return null;
157
+ if (!powerOfTwo(power) || !sameOperand(quotient.right, power))
158
+ return null;
159
+ if (e.left.kind !== "varRef" && e.left.kind !== "numLit")
160
+ return null;
161
+ return sameOperand(quotient.left, e.left) ? { value: e.left, power } : null;
162
+ }
163
+ /** Whether `e` is a power of two speculation can shift by:
164
+ * `Math.pow(2, n)` or a literal 2^k with k in [0, 52]. */
165
+ function powerOfTwo(e) {
166
+ if (e.kind === "numLit")
167
+ return exactPowerOfTwo(e.value) !== null;
168
+ return (e.kind === "libCall" &&
169
+ e.fn === "math.pow" &&
170
+ e.args.length === 2 &&
171
+ e.args[0].kind === "numLit" &&
172
+ e.args[0].value === 2);
173
+ }
174
+ /** Typed-array element kinds whose elements are integers. */
175
+ const INTEGER_ELEMENTS = new Set(["u8", "u8c", "i8", "u16", "i16", "u32", "i32"]);
176
+ /** A typed-array element read of an integer kind with no effect: an
177
+ * out-of-range read gives NaN, which fails its check. Float elements would
178
+ * only bail. */
179
+ function isSpeculativeByteRead(e) {
180
+ return (e.kind === "bytesIntrinsic" &&
181
+ e.method === "get" &&
182
+ e.type.kind === "f64" &&
183
+ e.receiver.type.kind === "bytes" &&
184
+ INTEGER_ELEMENTS.has(e.receiver.type.elem) &&
185
+ e.args.length === 1 &&
186
+ isEffectFree(e.receiver) &&
187
+ isEffectFree(e.args[0]));
188
+ }
189
+ /** Whether evaluating `e` assigns no binding: no `++`/`--`, no assignment
190
+ * expression, and no statement inside it. */
191
+ function writesNoLocal(e) {
192
+ return everyExpr(e, {
193
+ expr: (node) => node.kind !== "incDec" && node.kind !== "assignExpr",
194
+ stmt: () => false,
195
+ });
196
+ }
197
+ /** Rewrite a write's value that isSpeculableValue refuses into one it can
198
+ * speculate (SpeculativeValue), or null. Expansion and the new operations
199
+ * (`Math.pow(2, n)`, `Math.floor(a / 2^n)`, byte reads) evaluate nothing
200
+ * but numbers, so the fast copy may evaluate them in any order. Hoisted
201
+ * leaves run in the write's evaluation order before the arithmetic; that
202
+ * reorders nothing only when the write reads no heap and every local it
203
+ * reads is one no call can write. */
204
+ export function rewriteSpeculable(value, context) {
205
+ const leaves = [];
206
+ let reads = false;
207
+ const locals = [];
208
+ const rewrite = (e, depth) => {
209
+ if (e.type.kind !== "f64")
210
+ return null;
211
+ switch (e.kind) {
212
+ case "numLit":
213
+ return Number.isSafeInteger(e.value) && !Object.is(e.value, -0) ? e : null;
214
+ case "varRef":
215
+ locals.push(e.localId);
216
+ return e;
217
+ case "bin": {
218
+ if (!ARITHMETIC_OPS.has(e.op))
219
+ break;
220
+ const left = rewrite(e.left, depth);
221
+ const right = left && rewrite(e.right, depth);
222
+ return left && right ? { ...e, left, right } : null;
223
+ }
224
+ case "unary": {
225
+ if (e.op !== "-")
226
+ break;
227
+ const operand = rewrite(e.operand, depth);
228
+ return operand ? { ...e, operand } : null;
229
+ }
230
+ case "libCall": {
231
+ if (powerOfTwo(e) && e.kind === "libCall") {
232
+ const exponent = rewrite(e.args[1], depth);
233
+ return exponent ? { ...e, args: [e.args[0], exponent] } : null;
234
+ }
235
+ const quotient = e.args[0];
236
+ if (e.fn === "math.floor" &&
237
+ e.args.length === 1 &&
238
+ quotient?.kind === "bin" &&
239
+ quotient.op === "/" &&
240
+ powerOfTwo(quotient.right)) {
241
+ const left = rewrite(quotient.left, depth);
242
+ const right = left && rewrite(quotient.right, depth);
243
+ return left && right ? { ...e, args: [{ ...quotient, left, right }] } : null;
244
+ }
245
+ break;
246
+ }
247
+ case "call": {
248
+ const fn = depth < MAX_INLINE_DEPTH ? context.inlinable?.(e.callee) : undefined;
249
+ // Arguments are evaluated before the body: an expansion may read
250
+ // them in another order, or twice, only when they are pure.
251
+ const plain = (a) => isSpeculableValue(a, false) ||
252
+ (a.kind === "unionWrap" && isSpeculableValue(a.value, false));
253
+ if (fn !== undefined && fn.params.length === e.args.length && e.args.every(plain)) {
254
+ const args = new Map(fn.params.map((id, i) => [id, e.args[i]]));
255
+ return rewrite(substitute(fn.body, args), depth + 1);
256
+ }
257
+ break;
258
+ }
259
+ default:
260
+ if (isSpeculativeRead(e) || isSpeculativeByteRead(e)) {
261
+ reads = true;
262
+ return e;
263
+ }
264
+ break;
265
+ }
266
+ // Only calls of program functions are hoisted: other leaves (a string's
267
+ // length, a Map read) are cheap where they stand, and would turn every
268
+ // loop that adds one into a second copy.
269
+ if (context.leafId === undefined || e.kind !== "call")
270
+ return null;
271
+ // Hoisting runs the arguments before the rest of the write: one that
272
+ // assigns a local would move that write ahead of the write's earlier
273
+ // reads of it.
274
+ if (!e.args.every(writesNoLocal))
275
+ return null;
276
+ const ref = { kind: "varRef", localId: context.leafId(), type: e.type, loc: e.loc };
277
+ leaves.push({ localId: ref.localId, expr: e, ref });
278
+ return ref;
279
+ };
280
+ const rewritten = rewrite(value, 0);
281
+ if (rewritten === null)
282
+ return null;
283
+ if (leaves.length > 0) {
284
+ const leafIds = new Set(leaves.map((leaf) => leaf.localId));
285
+ if (reads || !locals.every((id) => leafIds.has(id) || context.unaliased?.(id) === true))
286
+ return null;
287
+ }
288
+ return { value: rewritten, leaves };
289
+ }
5
290
  /** The fast copy duplicates the loop; keep the duplicated code small. */
6
291
  export const MAX_LOOP_NODES = 400;
7
292
  /** Statements whose emission is plain control flow or a single write.
@@ -131,15 +416,19 @@ function isEffectFree(e) {
131
416
  return false;
132
417
  }
133
418
  }
134
- /** The speculative reads of a speculable value in evaluation order. */
419
+ /** The speculative reads of a speculable value in evaluation order, those
420
+ * of a rewritten value (rewriteSpeculable) included. */
135
421
  export function speculativeReads(e, out = []) {
136
- if (e.kind === "bin" && ARITHMETIC_OPS.has(e.op)) {
422
+ if (e.kind === "bin" && (ARITHMETIC_OPS.has(e.op) || e.op === "/")) {
137
423
  speculativeReads(e.left, out);
138
424
  speculativeReads(e.right, out);
139
425
  }
140
426
  else if (e.kind === "unary" && e.op === "-")
141
427
  speculativeReads(e.operand, out);
142
- else if (isSpeculativeRead(e))
428
+ else if (e.kind === "libCall" && (e.fn === "math.floor" || e.fn === "math.pow"))
429
+ for (const arg of e.args)
430
+ speculativeReads(arg, out);
431
+ else if (isSpeculativeRead(e) || isSpeculativeByteRead(e))
143
432
  out.push(e);
144
433
  return out;
145
434
  }
@@ -159,6 +448,9 @@ function hasProduct(e) {
159
448
  return e.op === "*" || e.op === "%" || hasProduct(e.left) || hasProduct(e.right);
160
449
  if (e.kind === "unary")
161
450
  return hasProduct(e.operand);
451
+ // Math.floor(a / 2^n) and Math.pow(2, n) replace a division and a call.
452
+ if (e.kind === "libCall")
453
+ return e.fn === "math.floor" || e.fn === "math.pow";
162
454
  return false;
163
455
  }
164
456
  function hasArithmetic(e) {
@@ -166,6 +458,8 @@ function hasArithmetic(e) {
166
458
  return ARITHMETIC_OPS.has(e.op) || hasArithmetic(e.left) || hasArithmetic(e.right);
167
459
  if (e.kind === "unary")
168
460
  return e.op === "-" || hasArithmetic(e.operand);
461
+ if (e.kind === "libCall")
462
+ return e.fn === "math.floor" || e.fn === "math.pow";
169
463
  return false;
170
464
  }
171
465
  /** The written local and value of a statement-level write, or null. A
@@ -191,8 +485,10 @@ export function speculativeWriteTarget(s) {
191
485
  * expressions the static range analysis already proves integral. Static
192
486
  * proofs come first: a local whose reads are all proven is never shadowed
193
487
  * or checked, and a loop with nothing unproven is never duplicated. */
194
- export function planSpeculativeLoop(loop, eligible, integral = () => false, proven = () => false, invariantEligible = eligible) {
488
+ export function planSpeculativeLoop(loop, eligible, integral = () => false, proven = () => false, invariantEligible = eligible, context = {}) {
195
489
  const writes = new Map();
490
+ const values = new Map();
491
+ const leafIds = new Set();
196
492
  const unspeculable = new Set();
197
493
  const reads = new Set();
198
494
  // Locals with at least one read the static analysis does not prove.
@@ -218,12 +514,9 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
218
514
  // A product in the condition alone (`i < Math.floor(n * scale)`) does not
219
515
  // make the body's work integer.
220
516
  let inCondition = false;
221
- const expr = (e) => {
222
- if (rejected)
223
- return false;
224
- nodes++;
225
- if (!OBSERVER_FREE_EXPRESSIONS.has(e.kind) || (e.kind === "bin" && e.left.type.kind !== "f64"))
226
- observerFree = false;
517
+ // What the integer writes read and consume. A rewritten value is noted
518
+ // here alone: its original, which `expr` walks, has its effects.
519
+ const note = (e) => {
227
520
  if (e.kind === "varRef") {
228
521
  reads.add(e.localId);
229
522
  if (!proven(e))
@@ -243,6 +536,21 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
243
536
  consume(e.index);
244
537
  else if (e.kind === "bytesIntrinsic" || e.kind === "strIntrinsic")
245
538
  e.args.forEach(consume);
539
+ };
540
+ // An expanded call is emitted in the fast copy: it counts toward the
541
+ // duplicated code.
542
+ const noteAll = (e) => {
543
+ nodes++;
544
+ note(e);
545
+ return everyExprChild(e, noteAll, () => true);
546
+ };
547
+ const expr = (e) => {
548
+ if (rejected)
549
+ return false;
550
+ nodes++;
551
+ if (!OBSERVER_FREE_EXPRESSIONS.has(e.kind) || (e.kind === "bin" && e.left.type.kind !== "f64"))
552
+ observerFree = false;
553
+ note(e);
246
554
  return everyExprChild(e, expr, nested);
247
555
  };
248
556
  // Statements inside expressions (sequence expressions) run mid-expression,
@@ -271,7 +579,10 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
271
579
  consume(s.index);
272
580
  const target = speculativeWriteTarget(s);
273
581
  if (target) {
274
- if (target.value === null || isSpeculableValue(target.value)) {
582
+ const rewritten = target.value === null || isSpeculableValue(target.value)
583
+ ? null
584
+ : rewriteSpeculable(target.value, context);
585
+ if (target.value === null || isSpeculableValue(target.value) || rewritten !== null) {
275
586
  const list = writes.get(target.localId) ?? [];
276
587
  list.push(s);
277
588
  writes.set(target.localId, list);
@@ -282,6 +593,12 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
282
593
  }
283
594
  else
284
595
  expr(target.value);
596
+ if (rewritten !== null) {
597
+ values.set(s, rewritten);
598
+ for (const leaf of rewritten.leaves)
599
+ leafIds.add(leaf.localId);
600
+ noteAll(rewritten.value);
601
+ }
285
602
  return !rejected;
286
603
  }
287
604
  unspeculable.add(target.localId);
@@ -310,15 +627,17 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
310
627
  // write runs: speculated itself, already an integer, or loop-invariant
311
628
  // (checked on entry). A value computed from doubles the loop writes
312
629
  // would only fail its check on every entry.
630
+ const valueOf = (s) => values.get(s)?.value ?? speculativeWriteTarget(s).value;
313
631
  const grounded = (e) => {
314
632
  if (e.kind === "varRef") {
315
633
  const id = e.localId;
316
- return (proven(e) ||
634
+ return (leafIds.has(id) ||
635
+ proven(e) ||
317
636
  locals.has(id) ||
318
637
  integral(id) ||
319
638
  (!writes.has(id) && !unspeculable.has(id) && invariantEligible(id)));
320
639
  }
321
- if (isSpeculativeRead(e))
640
+ if (isSpeculativeRead(e) || isSpeculativeByteRead(e))
322
641
  return true;
323
642
  return everyExprChild(e, grounded, () => false);
324
643
  };
@@ -326,8 +645,8 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
326
645
  changed = false;
327
646
  for (const id of [...locals.keys()]) {
328
647
  for (const s of writes.get(id)) {
329
- const target = speculativeWriteTarget(s);
330
- if (target.value !== null && !grounded(target.value)) {
648
+ const value = valueOf(s);
649
+ if (value !== null && !grounded(value)) {
331
650
  locals.delete(id);
332
651
  changed = true;
333
652
  break;
@@ -346,7 +665,8 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
346
665
  const invariant = (e) => {
347
666
  if (e.kind === "varRef") {
348
667
  const id = e.localId;
349
- if (!proven(e) &&
668
+ if (!leafIds.has(id) &&
669
+ !proven(e) &&
350
670
  !locals.has(id) &&
351
671
  !writes.has(id) &&
352
672
  !unspeculable.has(id) &&
@@ -357,13 +677,13 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
357
677
  return everyExprChild(e, invariant, () => true);
358
678
  };
359
679
  for (const s of speculated) {
360
- const target = speculativeWriteTarget(s);
361
- if (target.value === null)
680
+ const value = valueOf(s);
681
+ if (value === null)
362
682
  arithmetic = true;
363
683
  else {
364
- if (hasArithmetic(target.value))
684
+ if (hasArithmetic(value))
365
685
  arithmetic = true;
366
- invariant(target.value);
686
+ invariant(value);
367
687
  }
368
688
  }
369
689
  if (!arithmetic)
@@ -373,12 +693,15 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
373
693
  const heavy = [...locals.keys()].some((id) => multiplied.has(id)) ||
374
694
  [...speculated].some((s) => {
375
695
  const target = speculativeWriteTarget(s);
376
- return (target.value !== null &&
377
- (hasProduct(target.value) || isVariableStep(target.localId, target.value)));
696
+ const value = valueOf(s);
697
+ return value !== null && (hasProduct(value) || isVariableStep(target.localId, value));
378
698
  });
379
699
  if (!heavy)
380
700
  return null;
381
- return { locals, writes: speculated, observerFree };
701
+ for (const s of values.keys())
702
+ if (!speculated.has(s))
703
+ values.delete(s);
704
+ return { locals, writes: speculated, observerFree, values };
382
705
  }
383
706
  /** Plan a proven integer loop. `cursors` are the loop's bounded bindings,
384
707
  * `eligible` the locals a shadow may stand for, `integral` those the emitter
@@ -568,6 +891,33 @@ export function emitSpeculativeInteger(host, e, bail, reads = new Map(), integra
568
891
  case "bin": {
569
892
  if (e.op !== "+" && e.op !== "-" && e.op !== "*" && e.op !== "%")
570
893
  break;
894
+ // The floor-mod of a safe integer by 2^n (n in [0, 52]) is its low n
895
+ // bits, also for a negative value: in [0, 2^n), and never -0.
896
+ const mod = floorModPowerOfTwo(e);
897
+ if (mod) {
898
+ const value = emitSpeculativeInteger(host, mod.value, bail, reads, integral);
899
+ const n = exponentOf(host, mod.power, bail, reads, integral);
900
+ const mask = B.tmp(), low = B.tmp();
901
+ B.line(`${mask} = sub i64 ${shiftOne(host, n)}, 1`);
902
+ B.line(`${low} = and i64 ${value}, ${mask}`);
903
+ return low;
904
+ }
905
+ // A product with 2^n shifts: it is safe iff the other factor's
906
+ // magnitude is at most (2^53 - 1) >> n, and a zero product of a safe
907
+ // integer and a positive power is +0.
908
+ if (e.op === "*" && (powerOfTwo(e.right) || powerOfTwo(e.left))) {
909
+ const [factor, power] = powerOfTwo(e.right) ? [e.left, e.right] : [e.right, e.left];
910
+ const value = emitSpeculativeInteger(host, factor, bail, reads, integral);
911
+ const n = exponentOf(host, power, bail, reads, integral);
912
+ const limit = B.tmp(), magnitude = B.tmp(), outside = B.tmp(), product = B.tmp();
913
+ B.line(`${limit} = ashr i64 ${SAFE}, ${n}`);
914
+ host.declare("declare i64 @llvm.abs.i64(i64, i1)");
915
+ B.line(`${magnitude} = call i64 @llvm.abs.i64(i64 ${value}, i1 true)`);
916
+ B.line(`${outside} = icmp ugt i64 ${magnitude}, ${limit}`);
917
+ bail(outside);
918
+ B.line(`${product} = shl nsw i64 ${value}, ${n}`);
919
+ return product;
920
+ }
571
921
  const a = emitSpeculativeInteger(host, e.left, bail, reads, integral);
572
922
  const b = emitSpeculativeInteger(host, e.right, bail, reads, integral);
573
923
  const result = B.tmp();
@@ -619,6 +969,21 @@ export function emitSpeculativeInteger(host, e, bail, reads = new Map(), integra
619
969
  bail(negativeZero);
620
970
  return result;
621
971
  }
972
+ case "libCall": {
973
+ // A rewritten value's Math.pow(2, n) and Math.floor(a / 2^n)
974
+ // (rewriteSpeculable): with n an integer in [0, 52], 2^n is exact and
975
+ // so is a / 2^n for a safe integer a, whose floor the arithmetic shift
976
+ // computes, also for negative a. No result is -0.
977
+ if (e.fn === "math.pow")
978
+ return shiftOne(host, exponentOf(host, e, bail, reads, integral));
979
+ if (e.fn !== "math.floor" || e.args[0]?.kind !== "bin")
980
+ break;
981
+ const a = emitSpeculativeInteger(host, e.args[0].left, bail, reads, integral);
982
+ const n = exponentOf(host, e.args[0].right, bail, reads, integral);
983
+ const result = B.tmp();
984
+ B.line(`${result} = ashr i64 ${a}, ${n}`);
985
+ return result;
986
+ }
622
987
  case "unary": {
623
988
  if (e.op !== "-")
624
989
  break;
@@ -635,6 +1000,28 @@ export function emitSpeculativeInteger(host, e, bail, reads = new Map(), integra
635
1000
  }
636
1001
  return speculativeLeaf(host, reads.get(e) ?? host.emitExpr(e), e, bail);
637
1002
  }
1003
+ /** The exponent of a power of two (Math.pow(2, n) or a literal 2^k) as an
1004
+ * i64 in [0, 52]; other exponents bail. */
1005
+ function exponentOf(host, e, bail, reads, integral) {
1006
+ if (e.kind === "numLit") {
1007
+ const k = exactPowerOfTwo(e.value);
1008
+ if (k === null)
1009
+ throw new InternalCompilerError("llvm emitter bug: speculative power of two");
1010
+ return String(k);
1011
+ }
1012
+ if (e.kind !== "libCall")
1013
+ throw new InternalCompilerError("llvm emitter bug: speculative power of two");
1014
+ const n = emitSpeculativeInteger(host, e.args[1], bail, reads, integral);
1015
+ const outside = host.B.tmp();
1016
+ host.B.line(`${outside} = icmp ugt i64 ${n}, 52`);
1017
+ bail(outside);
1018
+ return n;
1019
+ }
1020
+ function shiftOne(host, n) {
1021
+ const result = host.B.tmp();
1022
+ host.B.line(`${result} = shl i64 1, ${n}`);
1023
+ return result;
1024
+ }
638
1025
  /** The safe i64 of an evaluated number: its proven integer, or a checked
639
1026
  * conversion. */
640
1027
  function speculativeLeaf(host, value, e, bail) {