@scriptc/compiler 0.3.2 → 0.3.4

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 (454) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +1202 -64
  2. package/dist/backend/cycle-analysis.js +6 -1
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/cycle-mutability.d.ts +5 -0
  5. package/dist/backend/cycle-mutability.js +62 -3
  6. package/dist/backend/cycle-mutability.js.map +1 -1
  7. package/dist/backend/executable-features.js +1 -0
  8. package/dist/backend/executable-features.js.map +1 -1
  9. package/dist/backend/library-pack.js +1 -0
  10. package/dist/backend/library-pack.js.map +1 -1
  11. package/dist/backend/llvm/alloc.js +24 -10
  12. package/dist/backend/llvm/alloc.js.map +1 -1
  13. package/dist/backend/llvm/alloc.test.js +47 -1
  14. package/dist/backend/llvm/alloc.test.js.map +1 -1
  15. package/dist/backend/llvm/array-search.d.ts +8 -0
  16. package/dist/backend/llvm/array-search.js +52 -0
  17. package/dist/backend/llvm/array-search.js.map +1 -0
  18. package/dist/backend/llvm/array-search.test.d.ts +1 -0
  19. package/dist/backend/llvm/array-search.test.js +72 -0
  20. package/dist/backend/llvm/array-search.test.js.map +1 -0
  21. package/dist/backend/llvm/call-lifetimes.d.ts +12 -1
  22. package/dist/backend/llvm/call-lifetimes.js +41 -11
  23. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  24. package/dist/backend/llvm/call-lifetimes.test.js +85 -1
  25. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  26. package/dist/backend/llvm/classes.js +87 -36
  27. package/dist/backend/llvm/classes.js.map +1 -1
  28. package/dist/backend/llvm/common.d.ts +6 -1
  29. package/dist/backend/llvm/common.js +8 -1
  30. package/dist/backend/llvm/common.js.map +1 -1
  31. package/dist/backend/llvm/dense-array-access.d.ts +5 -0
  32. package/dist/backend/llvm/dense-array-access.js +3 -3
  33. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  34. package/dist/backend/llvm/dyn.d.ts +44 -1
  35. package/dist/backend/llvm/dyn.js +251 -36
  36. package/dist/backend/llvm/dyn.js.map +1 -1
  37. package/dist/backend/llvm/emitter.d.ts +77 -14
  38. package/dist/backend/llvm/emitter.js +461 -108
  39. package/dist/backend/llvm/emitter.js.map +1 -1
  40. package/dist/backend/llvm/emitter.test.js +26 -3
  41. package/dist/backend/llvm/emitter.test.js.map +1 -1
  42. package/dist/backend/llvm/expr-async.js +52 -1
  43. package/dist/backend/llvm/expr-async.js.map +1 -1
  44. package/dist/backend/llvm/expr-bytes.d.ts +9 -0
  45. package/dist/backend/llvm/expr-bytes.js +169 -63
  46. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  47. package/dist/backend/llvm/expr-callbacks.js +16 -2
  48. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  49. package/dist/backend/llvm/expr-calls.d.ts +3 -1
  50. package/dist/backend/llvm/expr-calls.js +57 -2
  51. package/dist/backend/llvm/expr-calls.js.map +1 -1
  52. package/dist/backend/llvm/expr-containers.js +57 -19
  53. package/dist/backend/llvm/expr-containers.js.map +1 -1
  54. package/dist/backend/llvm/expr-dynamic.js +19 -8
  55. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  56. package/dist/backend/llvm/expr-primitives.js +28 -30
  57. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  58. package/dist/backend/llvm/expr-records.js +8 -4
  59. package/dist/backend/llvm/expr-records.js.map +1 -1
  60. package/dist/backend/llvm/expr-stream-bridges.js +35 -32
  61. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  62. package/dist/backend/llvm/expr-stream-callbacks.d.ts +13 -2
  63. package/dist/backend/llvm/expr-stream-callbacks.js +80 -5
  64. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  65. package/dist/backend/llvm/inline-unions.d.ts +48 -0
  66. package/dist/backend/llvm/inline-unions.js +134 -0
  67. package/dist/backend/llvm/inline-unions.js.map +1 -0
  68. package/dist/backend/llvm/inline-unions.test.d.ts +1 -0
  69. package/dist/backend/llvm/inline-unions.test.js +124 -0
  70. package/dist/backend/llvm/inline-unions.test.js.map +1 -0
  71. package/dist/backend/llvm/integer-remainder.d.ts +28 -5
  72. package/dist/backend/llvm/integer-remainder.js +80 -9
  73. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  74. package/dist/backend/llvm/intern-tables.test.d.ts +1 -0
  75. package/dist/backend/llvm/intern-tables.test.js +77 -0
  76. package/dist/backend/llvm/intern-tables.test.js.map +1 -0
  77. package/dist/backend/llvm/lib-datagram.js +10 -0
  78. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  79. package/dist/backend/llvm/lib-dispatch.js +255 -29
  80. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  81. package/dist/backend/llvm/lib-filesystem.js +176 -7
  82. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  83. package/dist/backend/llvm/lib-network.js +25 -6
  84. package/dist/backend/llvm/lib-network.js.map +1 -1
  85. package/dist/backend/llvm/lib-process.js +2 -2
  86. package/dist/backend/llvm/lib-process.js.map +1 -1
  87. package/dist/backend/llvm/lib-shared.d.ts +5 -0
  88. package/dist/backend/llvm/lib-shared.js +212 -1
  89. package/dist/backend/llvm/lib-shared.js.map +1 -1
  90. package/dist/backend/llvm/lib-stream.js +184 -0
  91. package/dist/backend/llvm/lib-stream.js.map +1 -1
  92. package/dist/backend/llvm/lib-test.js +9 -0
  93. package/dist/backend/llvm/lib-test.js.map +1 -1
  94. package/dist/backend/llvm/local-array-reads.js +7 -3
  95. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  96. package/dist/backend/llvm/local-array-reads.test.js +6 -3
  97. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  98. package/dist/backend/llvm/local-union-storage.d.ts +2 -0
  99. package/dist/backend/llvm/local-union-storage.js +5 -0
  100. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  101. package/dist/backend/llvm/local-union-storage.test.js +1 -0
  102. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  103. package/dist/backend/llvm/loop-array-borrows.d.ts +8 -2
  104. package/dist/backend/llvm/loop-array-borrows.js +93 -13
  105. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  106. package/dist/backend/llvm/map-number-lookup.d.ts +24 -0
  107. package/dist/backend/llvm/map-number-lookup.js +88 -0
  108. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  109. package/dist/backend/llvm/map-number-lookup.test.d.ts +1 -0
  110. package/dist/backend/llvm/map-number-lookup.test.js +158 -0
  111. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -0
  112. package/dist/backend/llvm/map-read-lifetimes.d.ts +9 -0
  113. package/dist/backend/llvm/map-read-lifetimes.js +90 -1
  114. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  115. package/dist/backend/llvm/map-read-lifetimes.test.js +129 -1
  116. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  117. package/dist/backend/llvm/publish.d.ts +9 -0
  118. package/dist/backend/llvm/publish.js +25 -4
  119. package/dist/backend/llvm/publish.js.map +1 -1
  120. package/dist/backend/llvm/record-results.d.ts +8 -5
  121. package/dist/backend/llvm/record-results.js +20 -12
  122. package/dist/backend/llvm/record-results.js.map +1 -1
  123. package/dist/backend/llvm/reference-effects.js +13 -0
  124. package/dist/backend/llvm/reference-effects.js.map +1 -1
  125. package/dist/backend/llvm/reference-writes.js +19 -2
  126. package/dist/backend/llvm/reference-writes.js.map +1 -1
  127. package/dist/backend/llvm/regions.d.ts +5 -1
  128. package/dist/backend/llvm/regions.js +24 -10
  129. package/dist/backend/llvm/regions.js.map +1 -1
  130. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  131. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  132. package/dist/backend/llvm/shapes.d.ts +56 -10
  133. package/dist/backend/llvm/shapes.js +178 -39
  134. package/dist/backend/llvm/shapes.js.map +1 -1
  135. package/dist/backend/llvm/shapes.test.js +61 -3
  136. package/dist/backend/llvm/shapes.test.js.map +1 -1
  137. package/dist/backend/llvm/stack-objects.js +16 -4
  138. package/dist/backend/llvm/stack-objects.js.map +1 -1
  139. package/dist/backend/llvm/stack-objects.test.js +3 -0
  140. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  141. package/dist/backend/llvm/string-reads.js +2 -2
  142. package/dist/backend/llvm/string-reads.js.map +1 -1
  143. package/dist/backend/llvm/string-slices.js +2 -2
  144. package/dist/backend/llvm/string-slices.js.map +1 -1
  145. package/dist/backend/llvm/walkers.d.ts +11 -0
  146. package/dist/backend/llvm/walkers.js +106 -10
  147. package/dist/backend/llvm/walkers.js.map +1 -1
  148. package/dist/backend/may-throw.js +13 -4
  149. package/dist/backend/may-throw.js.map +1 -1
  150. package/dist/backend/native/contracts.d.ts +5 -2
  151. package/dist/backend/native/executable.js +27 -8
  152. package/dist/backend/native/executable.js.map +1 -1
  153. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  154. package/dist/backend/native/runtime-inputs.js +2 -0
  155. package/dist/backend/native/runtime-inputs.js.map +1 -1
  156. package/dist/backend/native-codegen-core.d.ts +4 -4
  157. package/dist/backend/native-codegen-core.js +4 -6
  158. package/dist/backend/native-codegen-core.js.map +1 -1
  159. package/dist/backend/native-codegen.test.js +7 -8
  160. package/dist/backend/native-codegen.test.js.map +1 -1
  161. package/dist/backend/native-link-info-core.d.ts +3 -0
  162. package/dist/backend/native-link-info-core.js.map +1 -1
  163. package/dist/backend/native-toolchain.test.js +1 -1
  164. package/dist/backend/native-toolchain.test.js.map +1 -1
  165. package/dist/backend/publication.js +3 -1
  166. package/dist/backend/publication.js.map +1 -1
  167. package/dist/backend/runtime-abi.d.ts +2 -2
  168. package/dist/backend/runtime-abi.js +2 -2
  169. package/dist/backend/runtime-pack-targets.test.js +2 -1
  170. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  171. package/dist/backend/runtime-pack.test.js +2 -1
  172. package/dist/backend/runtime-pack.test.js.map +1 -1
  173. package/dist/backend/target-diagnostics.js +11 -1
  174. package/dist/backend/target-diagnostics.js.map +1 -1
  175. package/dist/backend/target-diagnostics.test.js +4 -1
  176. package/dist/backend/target-diagnostics.test.js.map +1 -1
  177. package/dist/backend/warm-cache.js +1 -0
  178. package/dist/backend/warm-cache.js.map +1 -1
  179. package/dist/compat/fetch-profile.js +4 -4
  180. package/dist/compat/fetch-profile.js.map +1 -1
  181. package/dist/contracts/check.js +2 -0
  182. package/dist/contracts/check.js.map +1 -1
  183. package/dist/coverage/report.js +1 -1
  184. package/dist/coverage/report.js.map +1 -1
  185. package/dist/diagnostics/diagnostic.d.ts +6 -5
  186. package/dist/diagnostics/diagnostic.js +7 -6
  187. package/dist/diagnostics/diagnostic.js.map +1 -1
  188. package/dist/executable/executable-cache.d.ts +1 -0
  189. package/dist/executable/executable-cache.js +1 -0
  190. package/dist/executable/executable-cache.js.map +1 -1
  191. package/dist/executable/executable-cache.test.js +1 -0
  192. package/dist/executable/executable-cache.test.js.map +1 -1
  193. package/dist/frontend/builtin-modules.d.ts +1 -1
  194. package/dist/frontend/builtin-modules.js +1 -0
  195. package/dist/frontend/builtin-modules.js.map +1 -1
  196. package/dist/frontend/comptime-node.js +2 -2
  197. package/dist/frontend/comptime-node.js.map +1 -1
  198. package/dist/frontend/experimental-import.d.ts +5 -1
  199. package/dist/frontend/experimental-import.js +28 -3
  200. package/dist/frontend/experimental-import.js.map +1 -1
  201. package/dist/frontend/lowering/assert-instances.d.ts +38 -0
  202. package/dist/frontend/lowering/assert-instances.js +269 -0
  203. package/dist/frontend/lowering/assert-instances.js.map +1 -0
  204. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  205. package/dist/frontend/lowering/binding-analysis.js +1 -1
  206. package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
  207. package/dist/frontend/lowering/builtins/arguments.js +8 -4
  208. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  209. package/dist/frontend/lowering/builtins/blob.d.ts +20 -0
  210. package/dist/frontend/lowering/builtins/blob.js +167 -0
  211. package/dist/frontend/lowering/builtins/blob.js.map +1 -0
  212. package/dist/frontend/lowering/builtins/child-process-async.d.ts +2 -2
  213. package/dist/frontend/lowering/builtins/child-process-async.js +2 -2
  214. package/dist/frontend/lowering/builtins/child-process-methods.js +1 -1
  215. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  216. package/dist/frontend/lowering/builtins/child-process-sync.js +1 -1
  217. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  218. package/dist/frontend/lowering/builtins/compression.d.ts +18 -0
  219. package/dist/frontend/lowering/builtins/compression.js +178 -4
  220. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  221. package/dist/frontend/lowering/builtins/constants.js +7 -2
  222. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  223. package/dist/frontend/lowering/builtins/crypto.d.ts +6 -0
  224. package/dist/frontend/lowering/builtins/crypto.js +526 -121
  225. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  226. package/dist/frontend/lowering/builtins/errors.js +23 -0
  227. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  228. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +10 -0
  229. package/dist/frontend/lowering/builtins/filesystem-calls.js +89 -1
  230. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  231. package/dist/frontend/lowering/builtins/filesystem.d.ts +16 -7
  232. package/dist/frontend/lowering/builtins/filesystem.js +97 -15
  233. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  234. package/dist/frontend/lowering/builtins/fs-glob.d.ts +23 -0
  235. package/dist/frontend/lowering/builtins/fs-glob.js +224 -0
  236. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -0
  237. package/dist/frontend/lowering/builtins/key-object.d.ts +13 -0
  238. package/dist/frontend/lowering/builtins/key-object.js +56 -0
  239. package/dist/frontend/lowering/builtins/key-object.js.map +1 -0
  240. package/dist/frontend/lowering/builtins/module-calls.js +44 -11
  241. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  242. package/dist/frontend/lowering/builtins/performance.d.ts +25 -3
  243. package/dist/frontend/lowering/builtins/performance.js +340 -5
  244. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  245. package/dist/frontend/lowering/builtins/process.d.ts +2 -2
  246. package/dist/frontend/lowering/builtins/process.js +107 -14
  247. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  248. package/dist/frontend/lowering/builtins/properties.d.ts +0 -7
  249. package/dist/frontend/lowering/builtins/properties.js +39 -11
  250. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  251. package/dist/frontend/lowering/builtins/readline.d.ts +23 -8
  252. package/dist/frontend/lowering/builtins/readline.js +266 -90
  253. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  254. package/dist/frontend/lowering/builtins/timers.d.ts +3 -0
  255. package/dist/frontend/lowering/builtins/timers.js +109 -23
  256. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  257. package/dist/frontend/lowering/builtins/url.d.ts +8 -0
  258. package/dist/frontend/lowering/builtins/url.js +36 -0
  259. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  260. package/dist/frontend/lowering/call-arguments.js +1 -1
  261. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  262. package/dist/frontend/lowering/call-signatures.js +26 -2
  263. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  264. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +2 -0
  265. package/dist/frontend/lowering/class-dynamic-dispatch.js +171 -13
  266. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  267. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +1 -0
  268. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  269. package/dist/frontend/lowering/class-protocol-dispatch.d.ts +45 -0
  270. package/dist/frontend/lowering/class-protocol-dispatch.js +516 -0
  271. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -0
  272. package/dist/frontend/lowering/coercions/structural-plans.js +2 -1
  273. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  274. package/dist/frontend/lowering/coercions/structural.js +3 -3
  275. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  276. package/dist/frontend/lowering/collation-repertoire.js +6 -5
  277. package/dist/frontend/lowering/collation-repertoire.js.map +1 -1
  278. package/dist/frontend/lowering/containers/array-callbacks.js +4 -7
  279. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  280. package/dist/frontend/lowering/containers/array-methods.d.ts +0 -7
  281. package/dist/frontend/lowering/containers/array-methods.js +43 -2
  282. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  283. package/dist/frontend/lowering/containers/bytes.js +38 -26
  284. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  285. package/dist/frontend/lowering/containers/for-of.d.ts +1 -1
  286. package/dist/frontend/lowering/containers/for-of.js +5 -1
  287. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  288. package/dist/frontend/lowering/containers/indexed-objects.js +1 -1
  289. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  290. package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
  291. package/dist/frontend/lowering/crypto-tables.js +77 -12
  292. package/dist/frontend/lowering/crypto-tables.js.map +1 -1
  293. package/dist/frontend/lowering/expressions/nullish-assignment.js +10 -0
  294. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  295. package/dist/frontend/lowering/expressions/object-literals.js +16 -12
  296. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  297. package/dist/frontend/lowering/generic-functions.d.ts +2 -2
  298. package/dist/frontend/lowering/generic-functions.js +2 -2
  299. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  300. package/dist/frontend/lowering/http2-constants.js +1 -1
  301. package/dist/frontend/lowering/intern-tables.d.ts +13 -0
  302. package/dist/frontend/lowering/intern-tables.js +536 -0
  303. package/dist/frontend/lowering/intern-tables.js.map +1 -0
  304. package/dist/frontend/lowering/lower-array-sort.d.ts +12 -1
  305. package/dist/frontend/lowering/lower-array-sort.js +561 -191
  306. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  307. package/dist/frontend/lowering/lower-array-sort.test.js +4 -2
  308. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  309. package/dist/frontend/lowering/lower-assert.js +702 -63
  310. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  311. package/dist/frontend/lowering/lower-async-iteration.d.ts +6 -3
  312. package/dist/frontend/lowering/lower-async-iteration.js +259 -4
  313. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  314. package/dist/frontend/lowering/lower-calls.js +118 -12
  315. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  316. package/dist/frontend/lowering/lower-classes.d.ts +11 -2
  317. package/dist/frontend/lowering/lower-classes.js +76 -9
  318. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  319. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  320. package/dist/frontend/lowering/lower-comptime.js +4 -4
  321. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  322. package/dist/frontend/lowering/lower-dgram.js +77 -52
  323. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  324. package/dist/frontend/lowering/lower-event-target.d.ts +63 -0
  325. package/dist/frontend/lowering/lower-event-target.js +362 -0
  326. package/dist/frontend/lowering/lower-event-target.js.map +1 -0
  327. package/dist/frontend/lowering/lower-expando.js +2 -2
  328. package/dist/frontend/lowering/lower-exprs.js +124 -22
  329. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  330. package/dist/frontend/lowering/lower-inspect.d.ts +6 -0
  331. package/dist/frontend/lowering/lower-inspect.js +240 -49
  332. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  333. package/dist/frontend/lowering/lower-mixins.js +1 -1
  334. package/dist/frontend/lowering/lower-mock.d.ts +11 -0
  335. package/dist/frontend/lowering/lower-mock.js +504 -0
  336. package/dist/frontend/lowering/lower-mock.js.map +1 -0
  337. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  338. package/dist/frontend/lowering/lower-modules.js +14 -3
  339. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  340. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -2
  341. package/dist/frontend/lowering/lower-namespaces.js +2 -2
  342. package/dist/frontend/lowering/lower-server.d.ts +3 -0
  343. package/dist/frontend/lowering/lower-server.js +419 -44
  344. package/dist/frontend/lowering/lower-server.js.map +1 -1
  345. package/dist/frontend/lowering/lower-stdlib.d.ts +7 -1
  346. package/dist/frontend/lowering/lower-stdlib.js +10 -3
  347. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  348. package/dist/frontend/lowering/lower-stmts.d.ts +2 -2
  349. package/dist/frontend/lowering/lower-stmts.js +69 -14
  350. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  351. package/dist/frontend/lowering/lower-stream.d.ts +10 -6
  352. package/dist/frontend/lowering/lower-stream.js +1020 -49
  353. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  354. package/dist/frontend/lowering/lower-test.js +86 -8
  355. package/dist/frontend/lowering/lower-test.js.map +1 -1
  356. package/dist/frontend/lowering/lower-timers.js +1 -1
  357. package/dist/frontend/lowering/lowerer.d.ts +45 -5
  358. package/dist/frontend/lowering/lowerer.js +317 -48
  359. package/dist/frontend/lowering/lowerer.js.map +1 -1
  360. package/dist/frontend/lowering/native-ffi.js +2 -2
  361. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  362. package/dist/frontend/lowering/pairs-snapshot.d.ts +6 -0
  363. package/dist/frontend/lowering/pairs-snapshot.js +49 -0
  364. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  365. package/dist/frontend/lowering/runtime-optional-records.d.ts +115 -0
  366. package/dist/frontend/lowering/runtime-optional-records.js +715 -0
  367. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -0
  368. package/dist/frontend/lowering/runtime-optional-records.test.d.ts +1 -0
  369. package/dist/frontend/lowering/runtime-optional-records.test.js +175 -0
  370. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -0
  371. package/dist/frontend/lowering/surfaces.d.ts +11 -3
  372. package/dist/frontend/lowering/surfaces.js +334 -37
  373. package/dist/frontend/lowering/surfaces.js.map +1 -1
  374. package/dist/frontend/lowering/zlib-constants.d.ts +1 -0
  375. package/dist/frontend/lowering/zlib-constants.js +181 -0
  376. package/dist/frontend/lowering/zlib-constants.js.map +1 -0
  377. package/dist/frontend/mock-shapes.d.ts +10 -0
  378. package/dist/frontend/mock-shapes.js +76 -0
  379. package/dist/frontend/mock-shapes.js.map +1 -0
  380. package/dist/frontend/module-syntax.d.ts +1 -1
  381. package/dist/frontend/module-syntax.js +1 -1
  382. package/dist/frontend/npm-static-prune.js +1 -1
  383. package/dist/frontend/npm-static-prune.js.map +1 -1
  384. package/dist/frontend/npm-static-rewrite-syntax.js +4 -3
  385. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  386. package/dist/frontend/pipeline.js +6 -4
  387. package/dist/frontend/pipeline.js.map +1 -1
  388. package/dist/frontend/program.d.ts +3 -3
  389. package/dist/frontend/program.js +25 -18
  390. package/dist/frontend/program.js.map +1 -1
  391. package/dist/frontend/resolve.d.ts +4 -0
  392. package/dist/frontend/resolve.js +15 -1
  393. package/dist/frontend/resolve.js.map +1 -1
  394. package/dist/frontend/ts7/adapter.js +1 -1
  395. package/dist/frontend/ts7/ast-bytes.d.ts +1 -1
  396. package/dist/frontend/ts7/ast-bytes.js +1 -1
  397. package/dist/frontend/ts7/semantic-json.d.ts +1 -1
  398. package/dist/frontend/ts7/semantic-json.js +1 -1
  399. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  400. package/dist/frontend/ts7/world-check.js +1 -1
  401. package/dist/frontend/tsc-codes.js +3 -2
  402. package/dist/frontend/tsc-codes.js.map +1 -1
  403. package/dist/frontend/type-mapper.d.ts +21 -1
  404. package/dist/frontend/type-mapper.js +245 -27
  405. package/dist/frontend/type-mapper.js.map +1 -1
  406. package/dist/index.js +7 -5
  407. package/dist/index.js.map +1 -1
  408. package/dist/ir/analysis.d.ts +12 -6
  409. package/dist/ir/analysis.js +26 -10
  410. package/dist/ir/analysis.js.map +1 -1
  411. package/dist/ir/analysis.test.js +15 -3
  412. package/dist/ir/analysis.test.js.map +1 -1
  413. package/dist/ir/builtin-effects.js +115 -0
  414. package/dist/ir/builtin-effects.js.map +1 -1
  415. package/dist/ir/builtin-signatures.d.ts +1 -1
  416. package/dist/ir/builtin-signatures.js +438 -46
  417. package/dist/ir/builtin-signatures.js.map +1 -1
  418. package/dist/ir/int32-slots.js +1 -0
  419. package/dist/ir/int32-slots.js.map +1 -1
  420. package/dist/ir/ir.d.ts +84 -17
  421. package/dist/ir/ir.js +54 -1
  422. package/dist/ir/ir.js.map +1 -1
  423. package/dist/ir/runtime-features.d.ts +1 -0
  424. package/dist/ir/runtime-features.js +111 -7
  425. package/dist/ir/runtime-features.js.map +1 -1
  426. package/dist/ir/serialize.js +1 -1
  427. package/dist/ir/serialize.js.map +1 -1
  428. package/dist/ir/traverse.js +1 -0
  429. package/dist/ir/traverse.js.map +1 -1
  430. package/dist/ir/validate.js +295 -14
  431. package/dist/ir/validate.js.map +1 -1
  432. package/dist/ir/validate.test.js +60 -0
  433. package/dist/ir/validate.test.js.map +1 -1
  434. package/dist/library/fence-eval.d.ts +1 -1
  435. package/dist/library/fence-eval.js +5 -4
  436. package/dist/library/fence-eval.js.map +1 -1
  437. package/dist/library/ir-policy.js +11 -4
  438. package/dist/library/ir-policy.js.map +1 -1
  439. package/dist/library/library-profile.js +13 -13
  440. package/dist/library/library-profile.js.map +1 -1
  441. package/dist/library/prepare.js +1 -1
  442. package/dist/library/prepare.js.map +1 -1
  443. package/dist/library/sidecar.js +3 -3
  444. package/dist/library/sidecar.js.map +1 -1
  445. package/dist/native/cli.js +1 -0
  446. package/dist/native/cli.js.map +1 -1
  447. package/dist/native/compiler.js +1 -3
  448. package/dist/native/compiler.js.map +1 -1
  449. package/dist/native/prepare.js +4 -2
  450. package/dist/native/prepare.js.map +1 -1
  451. package/dist/native/sanitizer.test.js +1 -0
  452. package/dist/native/sanitizer.test.js.map +1 -1
  453. package/package.json +20 -20
  454. package/surface-manifest.json +1279 -221
@@ -1,4 +1,4 @@
1
- import { BOOL, BYTES_U8, F64, VOID, arrayOf, funcOf, } from "../../ir/ir.js";
1
+ import { BOOL, F64, VOID, UNDEFINED_T, arrayOf, funcOf, } from "../../ir/ir.js";
2
2
  import { numLit } from "../../ir/build.js";
3
3
  import { transformStmtList } from "../../ir/traverse.js";
4
4
  /** Small IR vocabulary shared by the array and byte sort helpers. */
@@ -118,140 +118,492 @@ function distinctNodes(body) {
118
118
  stmt: (node) => (node.kind === "break" ? { ...node } : node),
119
119
  });
120
120
  }
121
- /** Stable natural merge sort over an owned snapshot. Strict descending runs
122
- * can be reversed without reversing ties. Short runs use bounded binary
123
- * insertion; merge passes then consume pairs of complete runs. The boundary
124
- * table compacts in place, and a single run needs no scratch buffer at all.
125
- * Comparator scheduling is intentionally unspecified, as for the previous
126
- * bottom-up sorter. Every callback still uses ordinary IR exception/ownership
127
- * handling; the caller's array is only written after sorting succeeds. */
128
- function stableSort(b, src, n, greater) {
121
+ /** V8's TimSort (third_party/v8/builtins/array-sort.tq) over the first `n`
122
+ * slots of an owned snapshot, step for step like the runtime's
123
+ * (scr_array.c): the same minimum run length, run detection, binary
124
+ * insertion, run-stack invariants, galloping merges and adaptive gallop
125
+ * threshold. Every comparison is `less(x, y)`, the comparator's
126
+ * `f(x, y) < 0`, so the comparator sees Node's calls in Node's order. Every
127
+ * callback still uses ordinary IR exception/ownership handling; the
128
+ * caller's array is only written after sorting succeeds. */
129
+ function timSort(b, src, n, less) {
130
+ return [b.branch(b.lt(b.num(1), n), timSortBody(b, src, n, less))];
131
+ }
132
+ function timSortBody(b, src, n, less) {
129
133
  const elem = src.type.kind === "array" ? src.type.elem : F64;
130
- const dst = b.local("dst", src.type);
131
- const tmp = b.local("tmp", src.type);
132
- const runs = b.local("runs", arrayOf(F64));
133
- const runCount = b.local("runCount");
134
- const start = b.local("start");
135
- const end = b.local("end");
136
- const descending = b.local("descending", BOOL);
137
- const left = b.local("left");
138
- const right = b.local("right");
139
- const pivot = b.local("pivot", elem);
140
- const low = b.local("low");
141
- const high = b.local("high");
142
- const center = b.local("center");
143
- const limit = b.local("limit");
144
- const i = b.local("i");
145
- const j = b.local("j");
146
- const k = b.local("k");
147
- const mid = b.local("mid");
148
- const run = b.local("run");
149
- const nextRun = b.local("nextRun");
150
- const vLeft = b.local("vLeft", elem);
151
- const vRight = b.local("vRight", elem);
152
- const boundaryLeft = b.local("boundaryLeft", elem);
153
- const boundaryRight = b.local("boundaryRight", elem);
134
+ const loc = b.loc;
135
+ let labels = 0;
136
+ const local = (name, type = F64) => b.local(name, type);
154
137
  const zero = b.num(0), one = b.num(1), two = b.num(2);
155
- const at = (index) => b.at(src, index);
156
- const copy = (index, stop) => b.while(b.lt(index, stop), [b.set(dst, k, at(index)), b.step(index), b.step(k)]);
157
- const merge = [
158
- b.bind(vLeft, at(i)),
159
- b.bind(vRight, at(j)),
160
- b.while({
161
- kind: "logical",
162
- op: "&&",
163
- left: b.lt(i, mid),
164
- right: b.lt(j, right),
165
- type: BOOL,
166
- loc: b.loc,
167
- }, [
168
- b.branch(greater(vLeft, vRight), [b.set(dst, k, vRight), b.step(j), b.branch(b.lt(j, right), [b.assign(vRight, at(j))])], [b.set(dst, k, vLeft), b.step(i), b.branch(b.lt(i, mid), [b.assign(vLeft, at(i))])]),
169
- b.step(k),
138
+ const at = (arr, index) => b.at(arr, index);
139
+ const ge = (left, right) => b.not(b.lt(left, right));
140
+ const le = (left, right) => b.not(b.lt(right, left));
141
+ const and = (left, right) => ({
142
+ kind: "logical",
143
+ op: "&&",
144
+ left,
145
+ right,
146
+ type: BOOL,
147
+ loc,
148
+ });
149
+ const or = (left, right) => ({
150
+ kind: "logical",
151
+ op: "||",
152
+ left,
153
+ right,
154
+ type: BOOL,
155
+ loc,
156
+ });
157
+ const truth = { kind: "boolLit", value: true, type: BOOL, loc };
158
+ const forever = (body) => b.while(truth, body);
159
+ const brk = (label) => ({ kind: "break", ...(label ? { label } : {}), loc });
160
+ const block = (label, body) => ({
161
+ kind: "block",
162
+ body,
163
+ labels: [label],
164
+ loc,
165
+ });
166
+ const half = (low, high) => b.add(low, {
167
+ kind: "libCall",
168
+ fn: "math.floor",
169
+ args: [{ kind: "bin", op: "/", left: b.sub(high, low), right: two, type: F64, loc }],
170
+ type: F64,
171
+ loc,
172
+ });
173
+ const min = (x, y) => b.choose(b.lt(x, y), x, y);
174
+ /** Copies `count` slots between arrays (or within one, front to back). */
175
+ const copyForward = (from, fromAt, to, toAt, count) => [
176
+ b.assign(cp, zero),
177
+ b.while(b.lt(cp, count), [b.set(to, b.add(toAt, cp), at(from, b.add(fromAt, cp))), b.step(cp)]),
178
+ ];
179
+ /** Copies `count` slots within `src` back to front (overlap to the right). */
180
+ const copyBackward = (fromAt, toAt, count) => [
181
+ b.assign(cp, count),
182
+ b.while(b.lt(zero, cp), [
183
+ b.step(cp, -1),
184
+ b.set(src, b.add(toAt, cp), at(src, b.add(fromAt, cp))),
170
185
  ]),
171
- copy(i, mid),
172
- copy(j, right),
173
186
  ];
174
- return [
175
- b.bind(runs, { kind: "arrayLit", elems: [zero], type: runs.type, loc: b.loc }),
176
- b.bind(runCount, one),
177
- b.bind(start, zero),
178
- b.while(b.lt(start, n), [
179
- b.bind(end, b.add(start, one)),
180
- b.branch(b.lt(end, n), [
181
- b.bind(descending, greater(at(start), at(end))),
182
- b.step(end),
183
- b.while(b.lt(end, n), [
184
- b.branch(b.choose(descending, greater(at(b.sub(end, one)), at(end)), b.not(greater(at(b.sub(end, one)), at(end)))), [b.step(end)], [{ kind: "break", loc: b.loc }]),
187
+ const minGallop = local("minGallop");
188
+ const runBase = local("runBase", arrayOf(F64));
189
+ const runLen = local("runLen", arrayOf(F64));
190
+ const runs = local("runs");
191
+ const cp = local("copyIndex");
192
+ // Gallop search state; searches never nest.
193
+ const gLast = local("gallopLast");
194
+ const gOfs = local("gallopOffset");
195
+ const gMax = local("gallopMax");
196
+ const gMid = local("gallopMid");
197
+ const gTmp = local("gallopTmp");
198
+ const gBase = local("gallopBase");
199
+ const gLength = local("gallopLength");
200
+ const gHint = local("gallopHint");
201
+ const gKey = local("gallopKey", elem);
202
+ /** gallopLeft/gallopRight: assigns `out` the offset k in [0, length] of
203
+ * `key` in arr[base .. base + length), starting the search at `hint`. */
204
+ const gallop = (right, out, arr, key, base, lengthExpr, hintExpr) => {
205
+ // gallopLeft tests arr[i] < key; gallopRight tests key < arr[i].
206
+ const probe = (index) => right ? less(gKey, at(arr, b.add(gBase, index))) : less(at(arr, b.add(gBase, index)), gKey);
207
+ // Whether the search moves right (toward higher indices) from the hint.
208
+ const towardHigh = right ? b.not(probe(gHint)) : probe(gHint);
209
+ const advance = () => [b.assign(gLast, gOfs), b.assign(gOfs, b.add(b.add(gOfs, gOfs), one))];
210
+ const length = gLength, hint = gHint;
211
+ const body = [
212
+ b.bind(gKey, key),
213
+ b.assign(gBase, base),
214
+ b.assign(gLength, lengthExpr),
215
+ b.assign(gHint, hintExpr),
216
+ b.assign(gLast, zero),
217
+ b.assign(gOfs, one),
218
+ b.branch(towardHigh, [
219
+ b.assign(gMax, b.sub(length, hint)),
220
+ b.while(b.lt(gOfs, gMax), [
221
+ // Stop at the first element the key does not pass.
222
+ b.branch(right ? probe(b.add(hint, gOfs)) : b.not(probe(b.add(hint, gOfs))), [brk()]),
223
+ ...advance(),
224
+ ]),
225
+ b.branch(b.lt(gMax, gOfs), [b.assign(gOfs, gMax)]),
226
+ b.assign(gLast, b.add(gLast, hint)),
227
+ b.assign(gOfs, b.add(gOfs, hint)),
228
+ ], [
229
+ b.assign(gMax, b.add(hint, one)),
230
+ b.while(b.lt(gOfs, gMax), [
231
+ b.branch(right ? b.not(probe(b.sub(hint, gOfs))) : probe(b.sub(hint, gOfs)), [brk()]),
232
+ ...advance(),
185
233
  ]),
186
- b.branch(descending, [
187
- b.bind(left, start),
188
- b.bind(right, b.sub(end, one)),
189
- b.while(b.lt(left, right), [
190
- b.bind(vLeft, at(left)),
191
- b.bind(vRight, at(right)),
192
- b.set(src, left, vRight),
193
- b.set(src, right, vLeft),
194
- b.step(left),
195
- b.step(right, -1),
234
+ b.branch(b.lt(gMax, gOfs), [b.assign(gOfs, gMax)]),
235
+ b.assign(gTmp, gLast),
236
+ b.assign(gLast, b.sub(hint, gOfs)),
237
+ b.assign(gOfs, b.sub(hint, gTmp)),
238
+ ]),
239
+ b.step(gLast),
240
+ b.while(b.lt(gLast, gOfs), [
241
+ b.assign(gMid, half(gLast, gOfs)),
242
+ b.branch(probe(gMid), right ? [b.assign(gOfs, gMid)] : [b.assign(gLast, b.add(gMid, one))], right ? [b.assign(gLast, b.add(gMid, one))] : [b.assign(gOfs, gMid)]),
243
+ ]),
244
+ b.assign(out, gOfs),
245
+ ];
246
+ return [{ kind: "block", body, loc }];
247
+ };
248
+ // Merge state (merges never nest).
249
+ const tmp = local("mergeTmp", src.type);
250
+ const baseA = local("baseA");
251
+ const lenA = local("lenA");
252
+ const baseB = local("baseB");
253
+ const lenB = local("lenB");
254
+ const dest = local("dest");
255
+ const cursorT = local("cursorT");
256
+ const cursorX = local("cursorX");
257
+ const winsA = local("winsA");
258
+ const winsB = local("winsB");
259
+ const firstPass = local("firstPass", BOOL);
260
+ const k = local("mergeK");
261
+ const takeTmp = (count, from) => [
262
+ b.bind(tmp, b.allocate(src.type, count)),
263
+ ...copyForward(src, from, tmp, zero, count),
264
+ ];
265
+ const lowerGallop = (value) => b.assign(minGallop, b.choose(b.lt(one, value), b.sub(value, one), one));
266
+ const enoughWins = () => or(or(ge(winsA, b.num(7)), ge(winsB, b.num(7))), firstPass);
267
+ const mergeLow = () => {
268
+ const id = labels++;
269
+ const succeed = `ts.low${id}.succeed`, copyB = `ts.low${id}.copyB`, exit = `ts.low${id}.exit`;
270
+ const moveB = [b.set(src, dest, at(src, cursorX)), b.step(dest), b.step(cursorX)];
271
+ const moveT = [b.set(src, dest, at(tmp, cursorT)), b.step(dest), b.step(cursorT)];
272
+ return [
273
+ ...takeTmp(lenA, baseA),
274
+ b.assign(dest, baseA),
275
+ b.assign(cursorT, zero),
276
+ b.assign(cursorX, baseB),
277
+ ...moveB,
278
+ block(exit, [
279
+ block(copyB, [
280
+ block(succeed, [
281
+ b.step(lenB, -1),
282
+ b.branch(b.eq(lenB, zero), [brk(succeed)]),
283
+ b.branch(b.eq(lenA, one), [brk(copyB)]),
284
+ forever([
285
+ b.assign(winsA, zero),
286
+ b.assign(winsB, zero),
287
+ forever([
288
+ b.branch(less(at(src, cursorX), at(tmp, cursorT)), [
289
+ ...moveB,
290
+ b.step(winsB),
291
+ b.step(lenB, -1),
292
+ b.assign(winsA, zero),
293
+ b.branch(b.eq(lenB, zero), [brk(succeed)]),
294
+ b.branch(ge(winsB, minGallop), [brk()]),
295
+ ], [
296
+ ...moveT,
297
+ b.step(winsA),
298
+ b.step(lenA, -1),
299
+ b.assign(winsB, zero),
300
+ b.branch(b.eq(lenA, one), [brk(copyB)]),
301
+ b.branch(ge(winsA, minGallop), [brk()]),
302
+ ]),
303
+ ]),
304
+ b.step(minGallop),
305
+ b.assign(firstPass, truth),
306
+ b.while(enoughWins(), [
307
+ b.assign(firstPass, { kind: "boolLit", value: false, type: BOOL, loc }),
308
+ lowerGallop(minGallop),
309
+ ...gallop(true, winsA, tmp, at(src, cursorX), cursorT, lenA, zero),
310
+ b.branch(b.lt(zero, winsA), [
311
+ ...copyForward(tmp, cursorT, src, dest, winsA),
312
+ b.assign(dest, b.add(dest, winsA)),
313
+ b.assign(cursorT, b.add(cursorT, winsA)),
314
+ b.assign(lenA, b.sub(lenA, winsA)),
315
+ b.branch(b.eq(lenA, one), [brk(copyB)]),
316
+ b.branch(b.eq(lenA, zero), [brk(succeed)]),
317
+ ]),
318
+ ...moveB,
319
+ b.step(lenB, -1),
320
+ b.branch(b.eq(lenB, zero), [brk(succeed)]),
321
+ ...gallop(false, winsB, src, at(tmp, cursorT), cursorX, lenB, zero),
322
+ b.branch(b.lt(zero, winsB), [
323
+ ...copyForward(src, cursorX, src, dest, winsB),
324
+ b.assign(dest, b.add(dest, winsB)),
325
+ b.assign(cursorX, b.add(cursorX, winsB)),
326
+ b.assign(lenB, b.sub(lenB, winsB)),
327
+ b.branch(b.eq(lenB, zero), [brk(succeed)]),
328
+ ]),
329
+ ...moveT,
330
+ b.step(lenA, -1),
331
+ b.branch(b.eq(lenA, one), [brk(copyB)]),
332
+ ]),
333
+ b.step(minGallop),
334
+ ]),
196
335
  ]),
336
+ // succeed
337
+ ...copyForward(tmp, cursorT, src, dest, lenA),
338
+ brk(exit),
197
339
  ]),
340
+ // copyB: the last element of run A belongs at the end of the merge.
341
+ ...copyForward(src, cursorX, src, dest, lenB),
342
+ b.set(src, b.add(dest, lenB), at(tmp, cursorT)),
198
343
  ]),
199
- // Bound insertion movement while avoiding tiny merge runs.
200
- b.bind(limit, b.choose(b.lt(b.add(start, b.num(16)), n), b.add(start, b.num(16)), n)),
201
- b.while(b.lt(end, limit), [
202
- b.bind(pivot, at(end)),
203
- b.bind(low, start),
204
- b.bind(high, end),
205
- b.while(b.lt(low, high), [
206
- b.bind(center, {
207
- kind: "libCall",
208
- fn: "math.floor",
209
- args: [
210
- { kind: "bin", op: "/", left: b.add(low, high), right: two, type: F64, loc: b.loc },
211
- ],
212
- type: F64,
213
- loc: b.loc,
214
- }),
215
- // Insert after equal values to preserve their original order.
216
- b.branch(greater(at(center), pivot), [b.assign(high, center)], [b.assign(low, b.add(center, one))]),
344
+ ];
345
+ };
346
+ const mergeHigh = () => {
347
+ const id = labels++;
348
+ const succeed = `ts.high${id}.succeed`, copyA = `ts.high${id}.copyA`, exit = `ts.high${id}.exit`;
349
+ // dest, cursorX (run A) and cursorT index their next slot.
350
+ const moveA = [b.set(src, dest, at(src, cursorX)), b.step(dest, -1), b.step(cursorX, -1)];
351
+ const moveT = [b.set(src, dest, at(tmp, cursorT)), b.step(dest, -1), b.step(cursorT, -1)];
352
+ return [
353
+ ...takeTmp(lenB, baseB),
354
+ b.assign(dest, b.sub(b.add(baseB, lenB), one)),
355
+ b.assign(cursorT, b.sub(lenB, one)),
356
+ b.assign(cursorX, b.sub(b.add(baseA, lenA), one)),
357
+ ...moveA,
358
+ block(exit, [
359
+ block(copyA, [
360
+ block(succeed, [
361
+ b.step(lenA, -1),
362
+ b.branch(b.eq(lenA, zero), [brk(succeed)]),
363
+ b.branch(b.eq(lenB, one), [brk(copyA)]),
364
+ forever([
365
+ b.assign(winsA, zero),
366
+ b.assign(winsB, zero),
367
+ forever([
368
+ b.branch(less(at(tmp, cursorT), at(src, cursorX)), [
369
+ ...moveA,
370
+ b.step(winsA),
371
+ b.step(lenA, -1),
372
+ b.assign(winsB, zero),
373
+ b.branch(b.eq(lenA, zero), [brk(succeed)]),
374
+ b.branch(ge(winsA, minGallop), [brk()]),
375
+ ], [
376
+ ...moveT,
377
+ b.step(winsB),
378
+ b.step(lenB, -1),
379
+ b.assign(winsA, zero),
380
+ b.branch(b.eq(lenB, one), [brk(copyA)]),
381
+ b.branch(ge(winsB, minGallop), [brk()]),
382
+ ]),
383
+ ]),
384
+ b.step(minGallop),
385
+ b.assign(firstPass, truth),
386
+ b.while(enoughWins(), [
387
+ b.assign(firstPass, { kind: "boolLit", value: false, type: BOOL, loc }),
388
+ lowerGallop(minGallop),
389
+ ...gallop(true, k, src, at(tmp, cursorT), baseA, lenA, b.sub(lenA, one)),
390
+ b.assign(winsA, b.sub(lenA, k)),
391
+ b.branch(b.lt(zero, winsA), [
392
+ b.assign(dest, b.sub(dest, winsA)),
393
+ b.assign(cursorX, b.sub(cursorX, winsA)),
394
+ ...copyBackward(b.add(cursorX, one), b.add(dest, one), winsA),
395
+ b.assign(lenA, b.sub(lenA, winsA)),
396
+ b.branch(b.eq(lenA, zero), [brk(succeed)]),
397
+ ]),
398
+ ...moveT,
399
+ b.step(lenB, -1),
400
+ b.branch(b.eq(lenB, one), [brk(copyA)]),
401
+ ...gallop(false, k, tmp, at(src, cursorX), zero, lenB, b.sub(lenB, one)),
402
+ b.assign(winsB, b.sub(lenB, k)),
403
+ b.branch(b.lt(zero, winsB), [
404
+ b.assign(dest, b.sub(dest, winsB)),
405
+ b.assign(cursorT, b.sub(cursorT, winsB)),
406
+ ...copyForward(tmp, b.add(cursorT, one), src, b.add(dest, one), winsB),
407
+ b.assign(lenB, b.sub(lenB, winsB)),
408
+ b.branch(b.eq(lenB, one), [brk(copyA)]),
409
+ b.branch(b.eq(lenB, zero), [brk(succeed)]),
410
+ ]),
411
+ ...moveA,
412
+ b.step(lenA, -1),
413
+ b.branch(b.eq(lenA, zero), [brk(succeed)]),
414
+ ]),
415
+ b.step(minGallop),
416
+ ]),
417
+ ]),
418
+ // succeed
419
+ ...copyForward(tmp, zero, src, b.sub(dest, b.sub(lenB, one)), lenB),
420
+ brk(exit),
217
421
  ]),
218
- b.bind(i, end),
219
- b.while(b.lt(low, i), [b.set(src, i, at(b.sub(i, one))), b.step(i, -1)]),
220
- b.set(src, low, pivot),
221
- b.step(end),
422
+ // copyA: the first element of run B belongs at the front of the merge.
423
+ b.assign(dest, b.sub(dest, lenA)),
424
+ b.assign(cursorX, b.sub(cursorX, lenA)),
425
+ ...copyBackward(b.add(cursorX, one), b.add(dest, one), lenA),
426
+ b.set(src, dest, at(tmp, cursorT)),
222
427
  ]),
223
- b.set(runs, runCount, end),
224
- b.step(runCount),
225
- b.assign(start, end),
226
- ]),
227
- b.branch(b.lt(two, runCount), [
228
- b.bind(dst, b.allocate(src.type, n)),
229
- b.while(b.lt(two, runCount), [
230
- b.bind(run, zero),
231
- b.bind(nextRun, one),
232
- b.while(b.lt(b.add(run, one), runCount), [
233
- b.bind(start, b.at(runs, run)),
234
- b.bind(mid, b.at(runs, b.add(run, one))),
235
- b.bind(right, b.choose(b.lt(b.add(run, two), runCount), b.at(runs, b.add(run, two)), n)),
236
- b.bind(i, start),
237
- b.bind(j, mid),
238
- b.bind(k, start),
239
- b.branch(b.lt(mid, right), [
240
- b.bind(boundaryLeft, at(b.sub(mid, one))),
241
- b.bind(boundaryRight, at(mid)),
242
- b.branch(greater(boundaryLeft, boundaryRight), merge, [copy(i, right)]),
243
- ], [copy(i, right)]),
244
- b.set(runs, nextRun, right),
245
- b.step(nextRun),
246
- b.step(run, 2),
428
+ ];
429
+ };
430
+ const mergeAt = (i) => {
431
+ const merged = local(`mergeAt${labels++}`);
432
+ const id = `ts.at${labels++}`;
433
+ return [
434
+ b.bind(merged, i),
435
+ b.assign(baseA, at(runBase, merged)),
436
+ b.assign(lenA, at(runLen, merged)),
437
+ b.assign(baseB, at(runBase, b.add(merged, one))),
438
+ b.assign(lenB, at(runLen, b.add(merged, one))),
439
+ b.set(runLen, merged, b.add(lenA, lenB)),
440
+ b.branch(b.eq(b.add(merged, b.num(3)), runs), [
441
+ b.set(runBase, b.add(merged, one), at(runBase, b.add(merged, two))),
442
+ b.set(runLen, b.add(merged, one), at(runLen, b.add(merged, two))),
443
+ ]),
444
+ b.step(runs, -1),
445
+ block(id, [
446
+ ...gallop(true, k, src, at(src, baseB), baseA, lenA, zero),
447
+ b.assign(baseA, b.add(baseA, k)),
448
+ b.assign(lenA, b.sub(lenA, k)),
449
+ b.branch(b.eq(lenA, zero), [brk(id)]),
450
+ ...gallop(false, lenB, src, at(src, b.sub(b.add(baseA, lenA), one)), baseB, lenB, b.sub(lenB, one)),
451
+ b.branch(b.eq(lenB, zero), [brk(id)]),
452
+ b.branch(le(lenA, lenB), mergeLow(), mergeHigh()),
453
+ ]),
454
+ ];
455
+ };
456
+ const invariant = (m) => or(b.lt(m, two), b.lt(b.add(at(runLen, b.sub(m, one)), at(runLen, m)), at(runLen, b.sub(m, two))));
457
+ const top = local("top");
458
+ const low = local("low");
459
+ const remaining = local("remaining");
460
+ const minRun = local("minRun");
461
+ const minRunOdd = local("minRunOdd");
462
+ const runEnd = local("runEnd");
463
+ const descending = local("descending", BOOL);
464
+ const previous = local("previous", elem);
465
+ const pivot = local("pivot", elem);
466
+ const left = local("left");
467
+ const right = local("right");
468
+ const mid = local("mid");
469
+ const pos = local("insert");
470
+ const forced = local("forced");
471
+ const vl = local("swapLeft", elem);
472
+ const vr = local("swapRight", elem);
473
+ const length = local("runLength");
474
+ const scan = local("scan");
475
+ const half2 = (value) => ({
476
+ kind: "libCall",
477
+ fn: "math.floor",
478
+ args: [{ kind: "bin", op: "/", left: value, right: two, type: F64, loc }],
479
+ type: F64,
480
+ loc,
481
+ });
482
+ const countRun = [
483
+ b.assign(scan, b.add(low, one)),
484
+ b.assign(runEnd, b.add(low, remaining)),
485
+ b.branch(b.eq(scan, runEnd), [b.assign(length, one)], [
486
+ b.assign(length, two),
487
+ b.assign(descending, less(at(src, scan), at(src, low))),
488
+ b.bind(previous, at(src, scan)),
489
+ b.step(scan),
490
+ b.while(b.lt(scan, runEnd), [
491
+ b.branch(b.choose(descending, b.not(less(at(src, scan), previous)), less(at(src, scan), previous)), [brk()]),
492
+ b.assign(previous, at(src, scan)),
493
+ b.step(length),
494
+ b.step(scan),
495
+ ]),
496
+ b.branch(descending, [
497
+ b.assign(left, low),
498
+ b.assign(right, b.sub(b.add(low, length), one)),
499
+ b.while(b.lt(left, right), [
500
+ b.bind(vl, at(src, left)),
501
+ b.bind(vr, at(src, right)),
502
+ b.set(src, left, vr),
503
+ b.set(src, right, vl),
504
+ b.step(left),
505
+ b.step(right, -1),
247
506
  ]),
248
- b.assign(runCount, nextRun),
249
- b.bind(tmp, src),
250
- b.assign(src, dst),
251
- b.assign(dst, tmp),
252
507
  ]),
253
508
  ]),
254
509
  ];
510
+ const insertion = [
511
+ b.assign(forced, min(minRun, remaining)),
512
+ // [low, low + length) is sorted; insert each later element.
513
+ b.assign(pos, b.add(low, length)),
514
+ b.while(b.lt(pos, b.add(low, forced)), [
515
+ b.assign(left, low),
516
+ b.assign(right, pos),
517
+ b.bind(pivot, at(src, pos)),
518
+ b.while(b.lt(left, right), [
519
+ b.assign(mid, half(left, right)),
520
+ b.branch(less(pivot, at(src, mid)), [b.assign(right, mid)], [b.assign(left, b.add(mid, one))]),
521
+ ]),
522
+ ...copyBackward(left, b.add(left, one), b.sub(pos, left)),
523
+ b.set(src, left, pivot),
524
+ b.step(pos),
525
+ ]),
526
+ b.assign(length, forced),
527
+ ];
528
+ const collapse = b.while(b.lt(one, runs), [
529
+ b.assign(top, b.sub(runs, two)),
530
+ b.branch(or(b.not(invariant(b.add(top, one))), b.not(invariant(top))), [
531
+ b.branch(b.lt(at(runLen, b.sub(top, one)), at(runLen, b.add(top, one))), [b.step(top, -1)]),
532
+ ...mergeAt(top),
533
+ ], [b.branch(le(at(runLen, top), at(runLen, b.add(top, one))), [...mergeAt(top)], [brk()])]),
534
+ ]);
535
+ const forceCollapse = b.while(b.lt(one, runs), [
536
+ b.assign(top, b.sub(runs, two)),
537
+ b.branch(and(b.lt(zero, top), b.lt(at(runLen, b.sub(top, one)), at(runLen, b.add(top, one)))), [
538
+ b.step(top, -1),
539
+ ]),
540
+ ...mergeAt(top),
541
+ ]);
542
+ const scalars = [
543
+ cp,
544
+ gLast,
545
+ gOfs,
546
+ gMax,
547
+ gMid,
548
+ gTmp,
549
+ gBase,
550
+ gLength,
551
+ gHint,
552
+ baseA,
553
+ lenA,
554
+ baseB,
555
+ lenB,
556
+ dest,
557
+ cursorT,
558
+ cursorX,
559
+ winsA,
560
+ winsB,
561
+ k,
562
+ top,
563
+ low,
564
+ remaining,
565
+ minRun,
566
+ minRunOdd,
567
+ runEnd,
568
+ left,
569
+ right,
570
+ mid,
571
+ pos,
572
+ forced,
573
+ length,
574
+ scan,
575
+ ];
576
+ return [
577
+ ...scalars.map((local) => b.bind(local, zero)),
578
+ b.bind(firstPass, { kind: "boolLit", value: false, type: BOOL, loc }),
579
+ b.bind(descending, { kind: "boolLit", value: false, type: BOOL, loc }),
580
+ b.bind(minGallop, b.num(7)),
581
+ b.bind(runBase, { kind: "arrayLit", elems: [], type: runBase.type, loc }),
582
+ b.bind(runLen, { kind: "arrayLit", elems: [], type: runLen.type, loc }),
583
+ b.bind(runs, zero),
584
+ b.bind(minRun, n),
585
+ b.bind(minRunOdd, zero),
586
+ b.while(ge(minRun, b.num(64)), [
587
+ b.branch(b.not(b.eq(b.sub(minRun, b.add(half2(minRun), half2(minRun))), zero)), [
588
+ b.assign(minRunOdd, one),
589
+ ]),
590
+ b.assign(minRun, half2(minRun)),
591
+ ]),
592
+ b.assign(minRun, b.add(minRun, minRunOdd)),
593
+ b.bind(low, zero),
594
+ b.bind(remaining, n),
595
+ b.while(b.lt(zero, remaining), [
596
+ ...countRun,
597
+ b.branch(b.lt(length, minRun), insertion),
598
+ b.set(runBase, runs, low),
599
+ b.set(runLen, runs, length),
600
+ b.step(runs),
601
+ collapse,
602
+ b.assign(low, b.add(low, length)),
603
+ b.assign(remaining, b.sub(remaining, length)),
604
+ ]),
605
+ forceCollapse,
606
+ ];
255
607
  }
256
608
  /** Recognizes the lifted body of a capture-free numeric comparator:
257
609
  * `(a, b) => a - b`, `b - a`, `a < b ? -1 : a > b ? 1 : 0` (either test
@@ -321,6 +673,14 @@ export function recognizeKeyComparator(fn) {
321
673
  }
322
674
  return null;
323
675
  }
676
+ /** The key order of a comparator closure: a zero-capture closure (not a
677
+ * signature adapter) over a lifted function recognizeKeyComparator accepts. */
678
+ export function closureKeyOrder(liftedFns, closure) {
679
+ if (closure.kind !== "closure" || closure.captures.length > 0 || closure.adapts)
680
+ return null;
681
+ const fn = liftedFns.find((lifted) => lifted.name === closure.fnName);
682
+ return fn ? recognizeKeyComparator(fn) : null;
683
+ }
324
684
  function sameKeyRead(left, right) {
325
685
  if (left === null || right === null)
326
686
  return left === right;
@@ -354,7 +714,7 @@ export function buildArraySortFn(name, elem, arity, copyFirst, undefinedTag, loc
354
714
  // receives the comparator for inputs whose keys it does not order.
355
715
  const keyArgs = keyed ? [b.num(keyed.order), ...(key ? [key] : [])] : [];
356
716
  const src = b.local("src", arrT);
357
- const n = b.local("n"), valueCount = b.local("valueCount"), undefinedCount = b.local("undefinedCount");
717
+ const n = b.local("n"), valueCount = b.local("valueCount"), undefinedCount = b.local("undefinedCount"), undefinedValues = b.local("undefinedValues");
358
718
  const index = b.local("index"), state = b.local("state");
359
719
  const isUndefined = (value) => {
360
720
  if (elem.kind === "union" && undefinedTag !== null) {
@@ -370,20 +730,47 @@ export function buildArraySortFn(name, elem, arity, copyFirst, undefinedTag, loc
370
730
  }
371
731
  return null;
372
732
  };
373
- const greater = (left, right) => {
374
- const compare = {
375
- kind: "bin",
376
- op: ">",
377
- left: { kind: "callValue", callee: f, args: [left, right].slice(0, arity), type: F64, loc },
378
- right: b.num(0),
379
- type: BOOL,
733
+ // A NaN result compares as 0, which `< 0` gives.
734
+ const less = (left, right) => ({
735
+ kind: "bin",
736
+ op: "<",
737
+ left: { kind: "callValue", callee: f, args: [left, right].slice(0, arity), type: F64, loc },
738
+ right: b.num(0),
739
+ type: BOOL,
740
+ loc,
741
+ });
742
+ const keepValue = () => [
743
+ b.branch(b.lt(valueCount, index), [b.set(src, valueCount, b.at(src, index))]),
744
+ b.step(valueCount),
745
+ ];
746
+ const compactValue = () => {
747
+ const undefinedValue = isUndefined(b.at(src, index));
748
+ return undefinedValue === null
749
+ ? { kind: "block", body: keepValue(), loc }
750
+ : b.branch(undefinedValue, [b.step(undefinedValues)], keepValue());
751
+ };
752
+ // The union's undefined value, for the elements that held one.
753
+ const undefinedValue = () => elem.kind === "union" && undefinedTag !== null
754
+ ? {
755
+ kind: "unionWrap",
756
+ unionId: elem.unionId,
757
+ tag: undefinedTag,
758
+ value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
759
+ type: elem,
380
760
  loc,
381
- };
382
- const leftUndefined = isUndefined(left), rightUndefined = isUndefined(right);
383
- return leftUndefined !== null && rightUndefined !== null
384
- ? b.choose(leftUndefined, b.not(rightUndefined), b.choose(rightUndefined, { kind: "boolLit", value: false, type: BOOL, loc }, compare))
385
- : compare;
761
+ }
762
+ : null;
763
+ const unionTail = () => {
764
+ const value = undefinedValue();
765
+ return value === null
766
+ ? []
767
+ : [
768
+ b.loop(index, valueCount, b.add(valueCount, undefinedValues), [
769
+ b.set(result, index, value),
770
+ ]),
771
+ ];
386
772
  };
773
+ const tailStart = () => b.add(valueCount, undefinedValues);
387
774
  const result = copyFirst ? src : a;
388
775
  // Dense arrays sort in the runtime without the compacting snapshot below:
389
776
  // `sort` orders the receiver's values outside it and writes them back
@@ -403,14 +790,14 @@ export function buildArraySortFn(name, elem, arity, copyFirst, undefinedTag, loc
403
790
  ...(native && copyFirst ? [dense(src)] : []),
404
791
  b.bind(valueCount, b.num(0)),
405
792
  b.bind(undefinedCount, b.num(0)),
406
- // Compact the owned snapshot before callbacks. Dense values stay in
407
- // place; only values following holes or storage-level undefined move.
793
+ b.bind(undefinedValues, b.num(0)),
794
+ // Compact the owned snapshot before callbacks, as V8 does: holes are
795
+ // dropped, undefined values (storage-level, or a union's undefined arm)
796
+ // are counted, and the comparator only sees the other values. Dense
797
+ // values stay in place; only values following the others move.
408
798
  b.loop(index, b.num(0), n, [
409
799
  b.bind(state, { kind: "arrayState", arr: src, index, type: F64, loc }),
410
- b.branch(b.eq(state, b.num(1)), [
411
- b.branch(b.lt(valueCount, index), [b.set(src, valueCount, b.at(src, index))]),
412
- b.step(valueCount),
413
- ], [b.branch(b.eq(state, b.num(2)), [b.step(undefinedCount)])]),
800
+ b.branch(b.eq(state, b.num(1)), [compactValue()], [b.branch(b.eq(state, b.num(2)), [b.step(undefinedCount)])]),
414
801
  ]),
415
802
  // Sort only the compacted prefix. The tail is overwritten with undefined
416
803
  // for toSorted, or released with this private snapshot for sort.
@@ -431,17 +818,18 @@ export function buildArraySortFn(name, elem, arity, copyFirst, undefinedTag, loc
431
818
  loc,
432
819
  },
433
820
  ]
434
- : stableSort(b, src, valueCount, greater)),
821
+ : timSort(b, src, valueCount, less)),
435
822
  ...(copyFirst
436
823
  ? []
437
824
  : [b.loop(index, b.num(0), valueCount, [b.set(a, index, b.at(src, index))])]),
438
- b.loop(index, valueCount, copyFirst ? n : b.add(valueCount, undefinedCount), [
825
+ ...unionTail(),
826
+ b.loop(index, tailStart(), copyFirst ? n : b.add(tailStart(), undefinedCount), [
439
827
  { kind: "arraySetUndefined", arr: result, index, loc },
440
828
  ]),
441
829
  ...(copyFirst
442
830
  ? []
443
831
  : [
444
- b.loop(index, b.add(valueCount, undefinedCount), n, [
832
+ b.loop(index, b.add(tailStart(), undefinedCount), n, [
445
833
  { kind: "arrayDelete", arr: a, index, loc },
446
834
  ]),
447
835
  ]),
@@ -460,62 +848,44 @@ export function buildArraySortFn(name, elem, arity, copyFirst, undefinedTag, loc
460
848
  loc,
461
849
  };
462
850
  }
463
- /** A byte's complete value domain is small enough for stable default ordering
464
- * without comparisons. Counts use numbers so large inputs cannot wrap. */
465
- function countBytes(b, a, src, n) {
466
- const counts = b.local("counts", arrayOf(F64));
467
- const value = b.local("value"), index = b.local("index"), end = b.local("end");
468
- const zero = b.num(0), one = b.num(1);
469
- return [
470
- b.bind(src, b.allocate(BYTES_U8, n)),
471
- b.bind(counts, b.allocate(counts.type, b.num(256))),
472
- b.loop(value, zero, b.num(256), [b.set(counts, value, zero)]),
473
- b.loop(index, zero, n, [
474
- b.bind(value, b.at(a, index)),
475
- b.set(counts, value, b.add(b.at(counts, value), one)),
476
- ]),
477
- b.bind(index, zero),
478
- b.loop(value, zero, b.num(256), [
479
- b.bind(end, b.add(index, b.at(counts, value))),
480
- b.while(b.lt(index, end), [b.set(src, index, value), b.step(index)]),
481
- ]),
482
- ];
483
- }
484
- export function buildBytesSortFn(name, arity, hasComparator, loc) {
851
+ /** Typed-array `sort` and `toSorted`. `toSorted` orders a private copy;
852
+ * `sort` orders the receiver and returns it. Without a comparator, and for a
853
+ * recognized numeric comparator's `order`, the runtime sorts the elements by
854
+ * value (sortNumeric). Other comparators, and a recognized one the runtime
855
+ * refuses (a NaN or -0 element), take the runtime comparator sort
856
+ * (sortCompare). */
857
+ export function buildBytesSortFn(name, type, arity, hasComparator, copyFirst, order, loc) {
485
858
  const b = new SortIr(loc);
486
- const a = b.local("a", BYTES_U8), src = b.local("src", BYTES_U8), n = b.local("n");
859
+ const a = b.local("a", type), src = b.local("src", type);
487
860
  const fnT = funcOf([F64, F64].slice(0, arity), F64);
488
861
  const f = hasComparator ? b.local("f", fnT) : null;
489
- const body = [b.bind(n, b.length(a))];
490
- if (f !== null) {
491
- body.push(b.bind(src, {
492
- kind: "bytesIntrinsic",
493
- method: "slice",
494
- receiver: a,
495
- args: [],
496
- type: BYTES_U8,
497
- loc,
498
- }));
499
- body.push(...stableSort(b, src, n, (left, right) => ({
500
- kind: "bin",
501
- op: ">",
502
- left: { kind: "callValue", callee: f, args: [left, right].slice(0, arity), type: F64, loc },
503
- right: b.num(0),
504
- type: BOOL,
505
- loc,
506
- })));
507
- }
508
- else {
509
- body.push(...countBytes(b, a, src, n));
510
- }
511
- body.push({ kind: "return", value: src, loc });
862
+ const target = copyFirst ? src : a;
863
+ const intrinsic = (method, arg) => ({
864
+ kind: "bytesIntrinsic",
865
+ method,
866
+ receiver: target,
867
+ args: [arg],
868
+ type: method === "sortNumeric" ? BOOL : VOID,
869
+ loc,
870
+ });
871
+ const body = copyFirst
872
+ ? [b.bind(src, { kind: "bytesIntrinsic", method: "slice", receiver: a, args: [], type, loc })]
873
+ : [];
874
+ const compare = f === null ? [] : [{ kind: "exprStmt", expr: intrinsic("sortCompare", f), loc }];
875
+ if (f === null)
876
+ body.push({ kind: "exprStmt", expr: intrinsic("sortNumeric", b.num(0)), loc });
877
+ else if (order === null)
878
+ body.push(...compare);
879
+ else
880
+ body.push(b.branch(b.not(intrinsic("sortNumeric", b.num(order))), compare));
881
+ body.push({ kind: "return", value: target, loc });
512
882
  return {
513
883
  name,
514
884
  params: [
515
- { localId: a.localId, name: "a", type: BYTES_U8 },
885
+ { localId: a.localId, name: "a", type },
516
886
  ...(f === null ? [] : [{ localId: f.localId, name: "f", type: fnT }]),
517
887
  ],
518
- returnType: BYTES_U8,
888
+ returnType: type,
519
889
  locals: b.locals,
520
890
  body: distinctNodes(body),
521
891
  loc,