@scriptc/compiler 0.3.0 → 0.3.2

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 (413) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +346 -17
  2. package/dist/backend/executable-features.js +1 -0
  3. package/dist/backend/executable-features.js.map +1 -1
  4. package/dist/backend/literals.d.ts +7 -0
  5. package/dist/backend/literals.js +32 -0
  6. package/dist/backend/literals.js.map +1 -1
  7. package/dist/backend/literals.test.js +17 -1
  8. package/dist/backend/literals.test.js.map +1 -1
  9. package/dist/backend/llvm/alloc.d.ts +15 -4
  10. package/dist/backend/llvm/alloc.js +39 -15
  11. package/dist/backend/llvm/alloc.js.map +1 -1
  12. package/dist/backend/llvm/alloc.test.js +15 -1
  13. package/dist/backend/llvm/alloc.test.js.map +1 -1
  14. package/dist/backend/llvm/appended-array-literals.d.ts +2 -0
  15. package/dist/backend/llvm/appended-array-literals.js +109 -0
  16. package/dist/backend/llvm/appended-array-literals.js.map +1 -0
  17. package/dist/backend/llvm/appended-array-literals.test.d.ts +1 -0
  18. package/dist/backend/llvm/appended-array-literals.test.js +90 -0
  19. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -0
  20. package/dist/backend/llvm/bigint-wrap.d.ts +4 -0
  21. package/dist/backend/llvm/bigint-wrap.js +590 -0
  22. package/dist/backend/llvm/bigint-wrap.js.map +1 -0
  23. package/dist/backend/llvm/blocks.d.ts +2 -0
  24. package/dist/backend/llvm/blocks.js +4 -0
  25. package/dist/backend/llvm/blocks.js.map +1 -1
  26. package/dist/backend/llvm/call-lifetimes.d.ts +4 -1
  27. package/dist/backend/llvm/call-lifetimes.js +66 -7
  28. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  29. package/dist/backend/llvm/call-lifetimes.test.js +14 -3
  30. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  31. package/dist/backend/llvm/checked-narrows.test.js +1 -1
  32. package/dist/backend/llvm/checked-narrows.test.js.map +1 -1
  33. package/dist/backend/llvm/classes.js +67 -14
  34. package/dist/backend/llvm/classes.js.map +1 -1
  35. package/dist/backend/llvm/classes.test.js +6 -6
  36. package/dist/backend/llvm/classes.test.js.map +1 -1
  37. package/dist/backend/llvm/common.d.ts +7 -5
  38. package/dist/backend/llvm/common.js +7 -5
  39. package/dist/backend/llvm/common.js.map +1 -1
  40. package/dist/backend/llvm/constant-callbacks.js +10 -28
  41. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  42. package/dist/backend/llvm/dense-array-access.js +146 -53
  43. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  44. package/dist/backend/llvm/dense-array-access.test.js +68 -3
  45. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  46. package/dist/backend/llvm/dyn.d.ts +4 -0
  47. package/dist/backend/llvm/dyn.js +15 -2
  48. package/dist/backend/llvm/dyn.js.map +1 -1
  49. package/dist/backend/llvm/emitter.d.ts +163 -8
  50. package/dist/backend/llvm/emitter.js +973 -100
  51. package/dist/backend/llvm/emitter.js.map +1 -1
  52. package/dist/backend/llvm/emitter.test.js +14 -7
  53. package/dist/backend/llvm/emitter.test.js.map +1 -1
  54. package/dist/backend/llvm/expr-async.js +242 -49
  55. package/dist/backend/llvm/expr-async.js.map +1 -1
  56. package/dist/backend/llvm/expr-async.test.js +1 -1
  57. package/dist/backend/llvm/expr-async.test.js.map +1 -1
  58. package/dist/backend/llvm/expr-bytes.js +51 -36
  59. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  60. package/dist/backend/llvm/expr-callbacks.d.ts +8 -0
  61. package/dist/backend/llvm/expr-callbacks.js +153 -4
  62. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  63. package/dist/backend/llvm/expr-calls.d.ts +12 -1
  64. package/dist/backend/llvm/expr-calls.js +279 -78
  65. package/dist/backend/llvm/expr-calls.js.map +1 -1
  66. package/dist/backend/llvm/expr-calls.test.d.ts +1 -0
  67. package/dist/backend/llvm/expr-calls.test.js +132 -0
  68. package/dist/backend/llvm/expr-calls.test.js.map +1 -0
  69. package/dist/backend/llvm/expr-containers.d.ts +7 -0
  70. package/dist/backend/llvm/expr-containers.js +49 -5
  71. package/dist/backend/llvm/expr-containers.js.map +1 -1
  72. package/dist/backend/llvm/expr-context.d.ts +4 -0
  73. package/dist/backend/llvm/expr-control.d.ts +8 -0
  74. package/dist/backend/llvm/expr-control.js +103 -69
  75. package/dist/backend/llvm/expr-control.js.map +1 -1
  76. package/dist/backend/llvm/expr-dispatch.js +3 -0
  77. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  78. package/dist/backend/llvm/expr-dynamic.js +28 -6
  79. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  80. package/dist/backend/llvm/expr-primitives.d.ts +14 -0
  81. package/dist/backend/llvm/expr-primitives.js +110 -48
  82. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  83. package/dist/backend/llvm/expr-primitives.test.js +95 -5
  84. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  85. package/dist/backend/llvm/expr-records.d.ts +9 -0
  86. package/dist/backend/llvm/expr-records.js +144 -16
  87. package/dist/backend/llvm/expr-records.js.map +1 -1
  88. package/dist/backend/llvm/expr-stream-bridges.d.ts +9 -1
  89. package/dist/backend/llvm/expr-stream-bridges.js +152 -4
  90. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  91. package/dist/backend/llvm/expr-stream-bridges.test.js +98 -1
  92. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  93. package/dist/backend/llvm/int32-abi.d.ts +47 -0
  94. package/dist/backend/llvm/int32-abi.js +83 -0
  95. package/dist/backend/llvm/int32-abi.js.map +1 -0
  96. package/dist/backend/llvm/int32-abi.test.d.ts +1 -0
  97. package/dist/backend/llvm/int32-abi.test.js +181 -0
  98. package/dist/backend/llvm/int32-abi.test.js.map +1 -0
  99. package/dist/backend/llvm/int32-locals.d.ts +30 -0
  100. package/dist/backend/llvm/int32-locals.js +95 -0
  101. package/dist/backend/llvm/int32-locals.js.map +1 -0
  102. package/dist/backend/llvm/integer-values.d.ts +4 -0
  103. package/dist/backend/llvm/integer-values.js +30 -1
  104. package/dist/backend/llvm/integer-values.js.map +1 -1
  105. package/dist/backend/llvm/integer-views.d.ts +8 -1
  106. package/dist/backend/llvm/integer-views.js +47 -2
  107. package/dist/backend/llvm/integer-views.js.map +1 -1
  108. package/dist/backend/llvm/lazy-captures.d.ts +16 -0
  109. package/dist/backend/llvm/lazy-captures.js +88 -2
  110. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  111. package/dist/backend/llvm/lazy-captures.test.js +48 -0
  112. package/dist/backend/llvm/lazy-captures.test.js.map +1 -1
  113. package/dist/backend/llvm/lib-dispatch.js +21 -0
  114. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  115. package/dist/backend/llvm/lib-filesystem.js +61 -0
  116. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  117. package/dist/backend/llvm/lib-shared.js +83 -9
  118. package/dist/backend/llvm/lib-shared.js.map +1 -1
  119. package/dist/backend/llvm/local-array-reads.js +26 -5
  120. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  121. package/dist/backend/llvm/local-array-reads.test.js +3 -2
  122. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  123. package/dist/backend/llvm/local-union-storage.d.ts +24 -2
  124. package/dist/backend/llvm/local-union-storage.js +127 -12
  125. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  126. package/dist/backend/llvm/local-union-storage.test.js +108 -3
  127. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  128. package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
  129. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  130. package/dist/backend/llvm/record-results.d.ts +26 -0
  131. package/dist/backend/llvm/record-results.js +252 -0
  132. package/dist/backend/llvm/record-results.js.map +1 -0
  133. package/dist/backend/llvm/reference-effects.js +4 -0
  134. package/dist/backend/llvm/reference-effects.js.map +1 -1
  135. package/dist/backend/llvm/reference-writes.d.ts +3 -0
  136. package/dist/backend/llvm/reference-writes.js +25 -11
  137. package/dist/backend/llvm/reference-writes.js.map +1 -1
  138. package/dist/backend/llvm/regex-matchers.d.ts +39 -0
  139. package/dist/backend/llvm/regex-matchers.js +1649 -0
  140. package/dist/backend/llvm/regex-matchers.js.map +1 -0
  141. package/dist/backend/llvm/regex-matchers.test.d.ts +1 -0
  142. package/dist/backend/llvm/regex-matchers.test.js +96 -0
  143. package/dist/backend/llvm/regex-matchers.test.js.map +1 -0
  144. package/dist/backend/llvm/regions.d.ts +67 -0
  145. package/dist/backend/llvm/regions.js +309 -0
  146. package/dist/backend/llvm/regions.js.map +1 -0
  147. package/dist/backend/llvm/regions.test.d.ts +1 -0
  148. package/dist/backend/llvm/regions.test.js +173 -0
  149. package/dist/backend/llvm/regions.test.js.map +1 -0
  150. package/dist/backend/llvm/shapes.d.ts +70 -8
  151. package/dist/backend/llvm/shapes.js +157 -29
  152. package/dist/backend/llvm/shapes.js.map +1 -1
  153. package/dist/backend/llvm/shapes.test.js +7 -6
  154. package/dist/backend/llvm/shapes.test.js.map +1 -1
  155. package/dist/backend/llvm/split-loops.js +1 -1
  156. package/dist/backend/llvm/split-loops.js.map +1 -1
  157. package/dist/backend/llvm/stack-objects.d.ts +29 -0
  158. package/dist/backend/llvm/stack-objects.js +130 -0
  159. package/dist/backend/llvm/stack-objects.js.map +1 -0
  160. package/dist/backend/llvm/stack-objects.test.d.ts +1 -0
  161. package/dist/backend/llvm/stack-objects.test.js +252 -0
  162. package/dist/backend/llvm/stack-objects.test.js.map +1 -0
  163. package/dist/backend/llvm/stack-unions.test.js +1 -1
  164. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  165. package/dist/backend/llvm/string-construction.test.js +2 -2
  166. package/dist/backend/llvm/string-construction.test.js.map +1 -1
  167. package/dist/backend/llvm/string-lifetimes.test.js +5 -5
  168. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  169. package/dist/backend/llvm/string-literal-equality.d.ts +22 -0
  170. package/dist/backend/llvm/string-literal-equality.js +78 -0
  171. package/dist/backend/llvm/string-literal-equality.js.map +1 -0
  172. package/dist/backend/llvm/string-reads.d.ts +4 -1
  173. package/dist/backend/llvm/string-reads.js +89 -9
  174. package/dist/backend/llvm/string-reads.js.map +1 -1
  175. package/dist/backend/llvm/switch-dispatch.js +60 -13
  176. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  177. package/dist/backend/llvm/switch-dispatch.test.js +71 -6
  178. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
  179. package/dist/backend/llvm/union-retype.test.d.ts +1 -0
  180. package/dist/backend/llvm/union-retype.test.js +229 -0
  181. package/dist/backend/llvm/union-retype.test.js.map +1 -0
  182. package/dist/backend/llvm/walkers.d.ts +2 -0
  183. package/dist/backend/llvm/walkers.js +4 -2
  184. package/dist/backend/llvm/walkers.js.map +1 -1
  185. package/dist/backend/llvm/wrapping-sums.d.ts +17 -0
  186. package/dist/backend/llvm/wrapping-sums.js +113 -0
  187. package/dist/backend/llvm/wrapping-sums.js.map +1 -0
  188. package/dist/backend/loop-polls.js +1 -0
  189. package/dist/backend/loop-polls.js.map +1 -1
  190. package/dist/backend/mangle.d.ts +9 -0
  191. package/dist/backend/mangle.js +15 -0
  192. package/dist/backend/mangle.js.map +1 -1
  193. package/dist/backend/may-throw.js +7 -3
  194. package/dist/backend/may-throw.js.map +1 -1
  195. package/dist/backend/native/contracts.d.ts +5 -0
  196. package/dist/backend/native/executable.js +16 -1
  197. package/dist/backend/native/executable.js.map +1 -1
  198. package/dist/backend/native/library.js +1 -1
  199. package/dist/backend/native/library.js.map +1 -1
  200. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  201. package/dist/backend/native/runtime-inputs.js +2 -0
  202. package/dist/backend/native/runtime-inputs.js.map +1 -1
  203. package/dist/backend/native-link-info-core.d.ts +1 -0
  204. package/dist/backend/native-link-info-core.js.map +1 -1
  205. package/dist/backend/runtime-abi.d.ts +2 -2
  206. package/dist/backend/runtime-abi.js +2 -2
  207. package/dist/backend/runtime-pack-core.d.ts +1 -0
  208. package/dist/backend/runtime-pack-core.js +1 -0
  209. package/dist/backend/runtime-pack-core.js.map +1 -1
  210. package/dist/backend/runtime-pack-targets.test.js +1 -1
  211. package/dist/backend/runtime-pack.test.js +1 -1
  212. package/dist/backend/target-diagnostics.js +14 -0
  213. package/dist/backend/target-diagnostics.js.map +1 -1
  214. package/dist/backend/target-diagnostics.test.js +13 -0
  215. package/dist/backend/target-diagnostics.test.js.map +1 -1
  216. package/dist/contracts/check.js +4 -0
  217. package/dist/contracts/check.js.map +1 -1
  218. package/dist/executable/executable-cache.d.ts +1 -0
  219. package/dist/executable/executable-cache.js.map +1 -1
  220. package/dist/frontend/experimental-import.d.ts +12 -0
  221. package/dist/frontend/experimental-import.js +63 -0
  222. package/dist/frontend/experimental-import.js.map +1 -0
  223. package/dist/frontend/lowering/array-values.d.ts +14 -0
  224. package/dist/frontend/lowering/array-values.js +29 -0
  225. package/dist/frontend/lowering/array-values.js.map +1 -1
  226. package/dist/frontend/lowering/builtin-calls.d.ts +6 -1
  227. package/dist/frontend/lowering/builtin-calls.js +36 -0
  228. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  229. package/dist/frontend/lowering/builtins/console.d.ts +16 -6
  230. package/dist/frontend/lowering/builtins/console.js +33 -9
  231. package/dist/frontend/lowering/builtins/console.js.map +1 -1
  232. package/dist/frontend/lowering/builtins/errors.js +20 -0
  233. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  234. package/dist/frontend/lowering/builtins/json.d.ts +2 -2
  235. package/dist/frontend/lowering/builtins/json.js +13 -4
  236. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  237. package/dist/frontend/lowering/builtins/module-calls.js +16 -1
  238. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  239. package/dist/frontend/lowering/builtins/numbers.d.ts +1 -0
  240. package/dist/frontend/lowering/builtins/numbers.js +17 -0
  241. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  242. package/dist/frontend/lowering/builtins/operating-system.d.ts +18 -0
  243. package/dist/frontend/lowering/builtins/operating-system.js +361 -1
  244. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  245. package/dist/frontend/lowering/builtins/process.js +15 -3
  246. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  247. package/dist/frontend/lowering/builtins/promises.js +109 -2
  248. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  249. package/dist/frontend/lowering/builtins/text-codecs.d.ts +3 -4
  250. package/dist/frontend/lowering/builtins/text-codecs.js +3 -4
  251. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  252. package/dist/frontend/lowering/checked-promise-all.d.ts +10 -3
  253. package/dist/frontend/lowering/checked-promise-all.js +52 -6
  254. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  255. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +6 -3
  256. package/dist/frontend/lowering/class-dynamic-dispatch.js +54 -31
  257. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  258. package/dist/frontend/lowering/containers/array-callbacks.js +74 -4
  259. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  260. package/dist/frontend/lowering/containers/array-construction.js +8 -4
  261. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  262. package/dist/frontend/lowering/containers/array-pipelines.d.ts +54 -0
  263. package/dist/frontend/lowering/containers/array-pipelines.js +1827 -0
  264. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -0
  265. package/dist/frontend/lowering/containers/exec-result-uses.d.ts +10 -0
  266. package/dist/frontend/lowering/containers/exec-result-uses.js +88 -0
  267. package/dist/frontend/lowering/containers/exec-result-uses.js.map +1 -0
  268. package/dist/frontend/lowering/containers/string-and-regexp.js +106 -7
  269. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  270. package/dist/frontend/lowering/containers/string-replacement.d.ts +2 -1
  271. package/dist/frontend/lowering/containers/string-replacement.js +32 -136
  272. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  273. package/dist/frontend/lowering/cycle-initialization.d.ts +18 -2
  274. package/dist/frontend/lowering/cycle-initialization.js +166 -12
  275. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  276. package/dist/frontend/lowering/deferred-module-initializers.js +7 -2
  277. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  278. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  279. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  280. package/dist/frontend/lowering/devirtualize.d.ts +33 -0
  281. package/dist/frontend/lowering/devirtualize.js +199 -0
  282. package/dist/frontend/lowering/devirtualize.js.map +1 -0
  283. package/dist/frontend/lowering/expressions/nullish-assignment.js +55 -7
  284. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  285. package/dist/frontend/lowering/expressions/object-literals.js +5 -56
  286. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  287. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  288. package/dist/frontend/lowering/generator-delegation.js +231 -10
  289. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  290. package/dist/frontend/lowering/identifier-uses.d.ts +7 -0
  291. package/dist/frontend/lowering/identifier-uses.js +23 -0
  292. package/dist/frontend/lowering/identifier-uses.js.map +1 -0
  293. package/dist/frontend/lowering/iterator-adapters.js +51 -3
  294. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  295. package/dist/frontend/lowering/lifetime-regions.d.ts +11 -0
  296. package/dist/frontend/lowering/lifetime-regions.js +216 -0
  297. package/dist/frontend/lowering/lifetime-regions.js.map +1 -0
  298. package/dist/frontend/lowering/lower-array-sort.d.ts +28 -2
  299. package/dist/frontend/lowering/lower-array-sort.js +112 -2
  300. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  301. package/dist/frontend/lowering/lower-array-sort.test.js +99 -2
  302. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  303. package/dist/frontend/lowering/lower-calls.js +135 -131
  304. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  305. package/dist/frontend/lowering/lower-classes.d.ts +4 -3
  306. package/dist/frontend/lowering/lower-classes.js +117 -13
  307. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  308. package/dist/frontend/lowering/lower-console.d.ts +27 -0
  309. package/dist/frontend/lowering/lower-console.js +651 -0
  310. package/dist/frontend/lowering/lower-console.js.map +1 -0
  311. package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -0
  312. package/dist/frontend/lowering/lower-event-emitter.js +124 -38
  313. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  314. package/dist/frontend/lowering/lower-exprs.js +272 -25
  315. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  316. package/dist/frontend/lowering/lower-functions.js +7 -3
  317. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  318. package/dist/frontend/lowering/lower-generators.d.ts +25 -7
  319. package/dist/frontend/lowering/lower-generators.js +264 -113
  320. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  321. package/dist/frontend/lowering/lower-inspect.d.ts +8 -1
  322. package/dist/frontend/lowering/lower-inspect.js +119 -18
  323. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  324. package/dist/frontend/lowering/lower-modules.js +24 -14
  325. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  326. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
  327. package/dist/frontend/lowering/lower-stdlib.js +35 -1
  328. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  329. package/dist/frontend/lowering/lower-stmts.js +66 -11
  330. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  331. package/dist/frontend/lowering/lower-stream.js +13 -10
  332. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  333. package/dist/frontend/lowering/lowerer.d.ts +47 -5
  334. package/dist/frontend/lowering/lowerer.js +235 -54
  335. package/dist/frontend/lowering/lowerer.js.map +1 -1
  336. package/dist/frontend/lowering/nan-coded-reads.d.ts +16 -0
  337. package/dist/frontend/lowering/nan-coded-reads.js +108 -1
  338. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  339. package/dist/frontend/lowering/regex-span-reads.d.ts +12 -0
  340. package/dist/frontend/lowering/regex-span-reads.js +164 -0
  341. package/dist/frontend/lowering/regex-span-reads.js.map +1 -0
  342. package/dist/frontend/lowering/runtime-optional-bounds.d.ts +4 -0
  343. package/dist/frontend/lowering/runtime-optional-bounds.js +2 -0
  344. package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
  345. package/dist/frontend/lowering/runtime-optional-bounds.test.js +27 -0
  346. package/dist/frontend/lowering/runtime-optional-bounds.test.js.map +1 -1
  347. package/dist/frontend/lowering/split-consumers.js +2 -18
  348. package/dist/frontend/lowering/split-consumers.js.map +1 -1
  349. package/dist/frontend/lowering/surfaces.js +115 -18
  350. package/dist/frontend/lowering/surfaces.js.map +1 -1
  351. package/dist/frontend/lowering/union-retag.d.ts +6 -1
  352. package/dist/frontend/lowering/union-retag.js +64 -1
  353. package/dist/frontend/lowering/union-retag.js.map +1 -1
  354. package/dist/frontend/lowering/union-retag.test.js +46 -0
  355. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  356. package/dist/frontend/lowering/var-hoisting.d.ts +3 -0
  357. package/dist/frontend/lowering/var-hoisting.js +261 -0
  358. package/dist/frontend/lowering/var-hoisting.js.map +1 -0
  359. package/dist/frontend/pipeline.js +5 -3
  360. package/dist/frontend/pipeline.js.map +1 -1
  361. package/dist/frontend/program.d.ts +3 -2
  362. package/dist/frontend/program.js +23 -5
  363. package/dist/frontend/program.js.map +1 -1
  364. package/dist/frontend/program.test.js +13 -0
  365. package/dist/frontend/program.test.js.map +1 -1
  366. package/dist/frontend/type-mapper.d.ts +13 -1
  367. package/dist/frontend/type-mapper.js +160 -14
  368. package/dist/frontend/type-mapper.js.map +1 -1
  369. package/dist/index.js +1 -0
  370. package/dist/index.js.map +1 -1
  371. package/dist/ir/builtin-effects.js +31 -2
  372. package/dist/ir/builtin-effects.js.map +1 -1
  373. package/dist/ir/builtin-signatures.d.ts +1 -1
  374. package/dist/ir/builtin-signatures.js +157 -16
  375. package/dist/ir/builtin-signatures.js.map +1 -1
  376. package/dist/ir/function-references.d.ts +12 -0
  377. package/dist/ir/function-references.js +29 -0
  378. package/dist/ir/function-references.js.map +1 -0
  379. package/dist/ir/function-references.test.d.ts +1 -0
  380. package/dist/ir/function-references.test.js +277 -0
  381. package/dist/ir/function-references.test.js.map +1 -0
  382. package/dist/ir/int32-slots.d.ts +7 -4
  383. package/dist/ir/int32-slots.js +215 -49
  384. package/dist/ir/int32-slots.js.map +1 -1
  385. package/dist/ir/int32-slots.test.js +38 -1
  386. package/dist/ir/int32-slots.test.js.map +1 -1
  387. package/dist/ir/integer-ranges.d.ts +4 -4
  388. package/dist/ir/integer-ranges.js +89 -64
  389. package/dist/ir/integer-ranges.js.map +1 -1
  390. package/dist/ir/integer-ranges.test.js +71 -9
  391. package/dist/ir/integer-ranges.test.js.map +1 -1
  392. package/dist/ir/intrinsic-signatures.js +3 -0
  393. package/dist/ir/intrinsic-signatures.js.map +1 -1
  394. package/dist/ir/ir.d.ts +111 -20
  395. package/dist/ir/ir.js +6 -0
  396. package/dist/ir/ir.js.map +1 -1
  397. package/dist/ir/runtime-features.d.ts +1 -0
  398. package/dist/ir/runtime-features.js +38 -3
  399. package/dist/ir/runtime-features.js.map +1 -1
  400. package/dist/ir/scalar-records.js +1 -2
  401. package/dist/ir/scalar-records.js.map +1 -1
  402. package/dist/ir/traverse.js +4 -0
  403. package/dist/ir/traverse.js.map +1 -1
  404. package/dist/ir/validate.js +201 -25
  405. package/dist/ir/validate.js.map +1 -1
  406. package/dist/ir/validate.test.js +90 -7
  407. package/dist/ir/validate.test.js.map +1 -1
  408. package/dist/library/ir-policy.js +1 -0
  409. package/dist/library/ir-policy.js.map +1 -1
  410. package/dist/native/sanitizer.test.js +1 -0
  411. package/dist/native/sanitizer.test.js.map +1 -1
  412. package/package.json +20 -20
  413. package/surface-manifest.json +159 -17
@@ -55,6 +55,8 @@ export function validateModule(mod) {
55
55
  const moduleLoc = { file: mod.sourceFile, start: 0, end: 0 };
56
56
  if (mod.workers !== undefined && typeof mod.workers !== "boolean")
57
57
  errors.push({ message: "worker execution mode must be a boolean", loc: moduleLoc });
58
+ if (mod.lifetimeRegions !== undefined && mod.lifetimeRegions !== true)
59
+ errors.push({ message: "lifetimeRegions must be true when present", loc: moduleLoc });
58
60
  if (mod.workers && mod.lib !== undefined)
59
61
  errors.push({
60
62
  message: "worker execution requires a native static executable",
@@ -359,6 +361,10 @@ export function validateModule(mod) {
359
361
  if (cls.jsLength !== undefined && (!Number.isSafeInteger(cls.jsLength) || cls.jsLength < 0)) {
360
362
  errors.push({ message: `class ${cls.name}: invalid constructor length`, loc: cls.loc });
361
363
  }
364
+ if (cls.prototypeNames !== undefined &&
365
+ new Set(cls.prototypeNames).size !== cls.prototypeNames.length) {
366
+ errors.push({ message: `class ${cls.name}: duplicate prototype member names`, loc: cls.loc });
367
+ }
362
368
  if (cls.tracksOwnFields &&
363
369
  (cls.runtime ||
364
370
  cls.fields.find((field) => field.name === DYN_CLASS_PROPERTIES)?.type.kind !== "dyn")) {
@@ -854,11 +860,11 @@ export function validateModule(mod) {
854
860
  }
855
861
  }
856
862
  for (const fn of mod.functions) {
857
- validateFunction(fn, functionsByName, ffiByName, classesByName, recordsById, recordValidation, unionsById, globalsById, classValidation, errors, mod.workers === true);
863
+ validateFunction(fn, functionsByName, ffiByName, classesByName, recordsById, recordValidation, unionsById, globalsById, classValidation, errors, mod.workers === true, mod.lifetimeRegions === true);
858
864
  }
859
865
  return errors;
860
866
  }
861
- function validateFunction(fn, functions, ffiByName, classes, records, recordValidation, unions, globals, classValidation, errors, workers) {
867
+ function validateFunction(fn, functions, ffiByName, classes, records, recordValidation, unions, globals, classValidation, errors, workers, lifetimeRegions) {
862
868
  const locals = new Map(fn.locals.map((l) => [l.id, l]));
863
869
  const err = (message, loc) => errors.push({ message: `in ${fn.name}: ${message}`, loc });
864
870
  const asyncCaches = [
@@ -1237,6 +1243,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
1237
1243
  case "unionKeyGet":
1238
1244
  case "unionIsTag":
1239
1245
  return checkUnionExpr(e);
1246
+ case "unionRetype":
1247
+ return checkUnionRetype(e);
1240
1248
  case "intrinsic":
1241
1249
  return checkIntrinsicExpr(e);
1242
1250
  case "libCall":
@@ -1456,6 +1464,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
1456
1464
  allowed.add("return");
1457
1465
  allowed.add("throw");
1458
1466
  allowed.add("runtimeFence");
1467
+ allowed.add("tryCatch");
1459
1468
  }
1460
1469
  if (e.diverges) {
1461
1470
  const last = e.stmts[e.stmts.length - 1];
@@ -1779,7 +1788,15 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
1779
1788
  if (want)
1780
1789
  expectType(a, want, `regexIntrinsic ${e.method} arg ${i}`);
1781
1790
  });
1782
- if (e.method === "match" || e.method === "exec") {
1791
+ if ((e.method === "execGroups" || e.method === "execSpans" || e.method === "matchGroups") &&
1792
+ e.args.slice(1).some((mask) => mask.kind !== "numLit")) {
1793
+ err(`regexIntrinsic ${e.method} masks must be numeric literals`, e.loc);
1794
+ }
1795
+ if (e.method === "match" ||
1796
+ e.method === "exec" ||
1797
+ e.method === "execGroups" ||
1798
+ e.method === "execSpans" ||
1799
+ e.method === "matchGroups") {
1783
1800
  // The `string[] | null` union (program-dependent id) — checked
1784
1801
  // by arms, like the libCall case checks process.envGet.
1785
1802
  const def = e.type.kind === "union" ? unions.get(e.type.unionId) : undefined;
@@ -2114,25 +2131,54 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
2114
2131
  : e.method === "shift"
2115
2132
  ? { argTypes: [], result: e.type } // union-checked below
2116
2133
  : e.method === "sortValues"
2117
- ? { argTypes: [F64, null], result: VOID }
2118
- : { argTypes: [], result: F64 }; // length
2134
+ ? {
2135
+ argTypes: [F64, null, F64, null],
2136
+ result: VOID,
2137
+ }
2138
+ : e.method === "sortDense"
2139
+ ? {
2140
+ argTypes: [null, BOOL, F64, null],
2141
+ result: BOOL,
2142
+ }
2143
+ : { argTypes: [], result: F64 }; // length
2119
2144
  if ((e.method === "sortPrimitive" || e.method === "toSortedPrimitive") &&
2120
2145
  elem.kind !== "string" &&
2121
2146
  elem.kind !== "f64" &&
2122
2147
  elem.kind !== "bool") {
2123
2148
  err(`arrIntrinsic ${e.method} requires primitive elements, got ${elem.kind}`, e.loc);
2124
2149
  }
2125
- if (e.method === "sortValues") {
2150
+ if (e.method === "sortValues" || e.method === "sortDense") {
2126
2151
  const arms = elem.kind === "union" ? unions.get(elem.unionId)?.arms : undefined;
2127
2152
  if (!isSortValuesElement(elem, arms))
2128
- err(`arrIntrinsic sortValues on ${elem.kind} elements`, e.loc);
2129
- const cmp = e.args[1]?.type;
2153
+ err(`arrIntrinsic ${e.method} on ${elem.kind} elements`, e.loc);
2154
+ const cmp = e.args[e.method === "sortValues" ? 1 : 0]?.type;
2130
2155
  if (!cmp ||
2131
2156
  cmp.kind !== "func" ||
2132
2157
  cmp.params.length > 2 ||
2133
2158
  !cmp.params.every((param) => typeEquals(param, elem)) ||
2134
2159
  cmp.ret.kind !== "f64")
2135
- err("arrIntrinsic sortValues comparator must be (elem, elem) => number", e.loc);
2160
+ err(`arrIntrinsic ${e.method} comparator must be (elem, elem) => number`, e.loc);
2161
+ if (e.method === "sortDense" && e.args[1]?.kind !== "boolLit")
2162
+ err("arrIntrinsic sortDense owned flag must be a boolean literal", e.loc);
2163
+ // A recognized comparator's key order: [order] for numbers,
2164
+ // [order, key reader] for record and class elements.
2165
+ const order = e.args[2];
2166
+ if (order) {
2167
+ if (order.kind !== "numLit" || (order.value !== 1 && order.value !== -1))
2168
+ err(`arrIntrinsic ${e.method} key order must be the literal 1 or -1`, e.loc);
2169
+ const key = e.args[3]?.type;
2170
+ if (elem.kind === "f64"
2171
+ ? key !== undefined
2172
+ : elem.kind !== "record" && elem.kind !== "object")
2173
+ err(`arrIntrinsic ${e.method} key order on ${elem.kind} elements`, e.loc);
2174
+ if (elem.kind !== "f64" &&
2175
+ (!key ||
2176
+ key.kind !== "func" ||
2177
+ key.params.length !== 1 ||
2178
+ !typeEquals(key.params[0], elem) ||
2179
+ key.ret.kind !== "f64"))
2180
+ err(`arrIntrinsic ${e.method} key reader must be (elem) => number`, e.loc);
2181
+ }
2136
2182
  }
2137
2183
  if (e.method === "getNumber" && elem.kind !== "f64") {
2138
2184
  err(`arrIntrinsic getNumber requires f64 elements, got ${elem.kind}`, e.loc);
@@ -2179,7 +2225,13 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
2179
2225
  // slice's indices and splice's count are optional (omitted args
2180
2226
  // omitted from the IR — backends fill the defaults); everything
2181
2227
  // else is exact.
2182
- const minArgs = e.method === "slice" ? 0 : e.method === "splice" ? 1 : sig.argTypes.length;
2228
+ const minArgs = e.method === "slice"
2229
+ ? 0
2230
+ : e.method === "splice"
2231
+ ? 1
2232
+ : e.method === "sortValues" || e.method === "sortDense"
2233
+ ? 2
2234
+ : sig.argTypes.length;
2183
2235
  if (e.args.length < minArgs || e.args.length > sig.argTypes.length) {
2184
2236
  err(`arrIntrinsic ${e.method}: ${e.args.length} args, expected ${sig.argTypes.length}`, e.loc);
2185
2237
  }
@@ -2778,25 +2830,13 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
2778
2830
  const want = recordValidation.get(shape.id).initializationFields;
2779
2831
  const seen = new Set();
2780
2832
  for (const f of e.fields) {
2781
- if (f.drop || f.overflow)
2833
+ if (f.overflow)
2782
2834
  checkExpr(f.value);
2783
2835
  else
2784
2836
  checkSlotValue(f.value);
2785
2837
  if (seen.has(f.name))
2786
2838
  err(`recordLit initializes field "${f.name}" twice`, e.loc);
2787
2839
  seen.add(f.name);
2788
- if (f.drop) {
2789
- // A mapping-dropped field (the PromiseSettledResult honest
2790
- // subset): evaluated, never stored — it must NOT name a
2791
- // declared field (that would silently drop a real store),
2792
- // and its value may be any type, void included.
2793
- if (f.overflow)
2794
- err(`recordLit drop entry "${f.name}" flagged overflow too`, e.loc);
2795
- if (want.has(f.name)) {
2796
- err(`recordLit drop entry "${f.name}" shadows a declared field of shape ${shape.id}`, e.loc);
2797
- }
2798
- continue;
2799
- }
2800
2840
  if (f.overflow) {
2801
2841
  // Overflow entries exist only on index-signature shapes, name
2802
2842
  // no declared field, and carry the index-value type exactly
@@ -2818,7 +2858,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
2818
2858
  else
2819
2859
  expectType(f.value, ft, `recordLit field "${f.name}"`);
2820
2860
  }
2821
- if (e.fields.filter((f) => !f.overflow && !f.drop).length !== shape.fields.length) {
2861
+ if (e.fields.filter((f) => !f.overflow).length !== shape.fields.length) {
2822
2862
  err(`recordLit does not initialize every field of shape ${shape.id}`, e.loc);
2823
2863
  }
2824
2864
  break;
@@ -3211,6 +3251,26 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
3211
3251
  }
3212
3252
  }
3213
3253
  }
3254
+ function checkUnionRetype(e) {
3255
+ checkExpr(e.value);
3256
+ const from = unions.get(e.fromId);
3257
+ const to = unions.get(e.unionId);
3258
+ if (!from || !to) {
3259
+ err(`unionRetype between undeclared unions "${e.fromId}" and "${e.unionId}"`, e.loc);
3260
+ return;
3261
+ }
3262
+ expectType(e.value, { kind: "union", unionId: e.fromId }, "unionRetype operand");
3263
+ if (!typeEquals(e.type, { kind: "union", unionId: e.unionId }))
3264
+ err(`unionRetype type ${e.type.kind} != union ${e.unionId}`, e.loc);
3265
+ if (e.tags.length === 0)
3266
+ err(`unionRetype with no tags`, e.loc);
3267
+ for (const tag of e.tags) {
3268
+ const arm = from.arms[tag];
3269
+ const target = to.arms[tag];
3270
+ if (!Number.isInteger(tag) || !arm || !target || !typeEquals(arm, target))
3271
+ err(`unionRetype tag ${tag} is not the same arm in ${e.fromId} and ${e.unionId}`, e.loc);
3272
+ }
3273
+ }
3214
3274
  function checkUnionExpr(e) {
3215
3275
  switch (e.kind) {
3216
3276
  case "unionNarrow": {
@@ -3368,6 +3428,24 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
3368
3428
  err("module.tdzCheck must be void", e.loc);
3369
3429
  return;
3370
3430
  }
3431
+ if (e.name === "region.create" ||
3432
+ e.name === "region.enter" ||
3433
+ e.name === "region.leave" ||
3434
+ e.name === "region.release") {
3435
+ if (!lifetimeRegions)
3436
+ err(`${e.name} outside a lifetimeRegions module`, e.loc);
3437
+ const takesId = e.name === "region.enter" || e.name === "region.release";
3438
+ if (e.args.length !== (takesId ? 1 : 0))
3439
+ err(`${e.name} takes ${takesId ? "one region id" : "no arguments"}`, e.loc);
3440
+ for (const a of e.args) {
3441
+ checkExpr(a);
3442
+ if (a.type.kind !== "f64")
3443
+ err(`${e.name} id must be f64`, e.loc);
3444
+ }
3445
+ if (e.type.kind !== (e.name === "region.create" ? "f64" : "void"))
3446
+ err(`${e.name} has type ${e.name === "region.create" ? "f64" : "void"}`, e.loc);
3447
+ return;
3448
+ }
3371
3449
  if (e.name === "threads.publish") {
3372
3450
  if (e.args.length !== 1)
3373
3451
  err("threads.publish takes exactly one argument", e.loc);
@@ -3411,6 +3489,26 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
3411
3489
  }
3412
3490
  return;
3413
3491
  }
3492
+ if (e.name === "promise.allSettled" || e.name === "promise.any") {
3493
+ if (e.args.length !== 1)
3494
+ err(`${e.name} takes exactly one argument`, e.loc);
3495
+ for (const a of e.args) {
3496
+ checkExpr(a);
3497
+ if (a.type.kind !== "array" || a.type.elem.kind !== "promise") {
3498
+ err(`${a.type.kind} argument to ${e.name} (needs an array of promises)`, a.loc);
3499
+ }
3500
+ else if (e.name === "promise.any" && !typeEquals(a.type.elem, e.type)) {
3501
+ err("promise.any result must be the entries' promise type", e.loc);
3502
+ }
3503
+ }
3504
+ if (e.type.kind !== "promise")
3505
+ err(`${e.name} must be promise-typed`, e.loc);
3506
+ else if (e.name === "promise.allSettled" &&
3507
+ (e.type.inner.kind !== "array" || e.type.inner.elem.kind !== "union")) {
3508
+ err("promise.allSettled result must be a promise of a settled-record union array", e.loc);
3509
+ }
3510
+ return;
3511
+ }
3414
3512
  if (e.name === "promise.reject") {
3415
3513
  // ONE argument: the %Error-rooted reason object (the rejection
3416
3514
  // payload shares the thrown-Error representation — the
@@ -3602,6 +3700,23 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
3602
3700
  }
3603
3701
  return true;
3604
3702
  }
3703
+ if (e.fn === "dyn.objEntryPairs") {
3704
+ // Result: the native [string, any][] the backend assembles from the
3705
+ // runtime's owned pair snapshot.
3706
+ const shape = e.type.kind === "array" && e.type.elem.kind === "record"
3707
+ ? records.get(e.type.elem.shapeId)
3708
+ : undefined;
3709
+ const field = (name) => shape?.fields.find((f) => f.name === name)?.type;
3710
+ const ok = shape !== undefined &&
3711
+ shape.tuple === true &&
3712
+ shape.indexValue === undefined &&
3713
+ shape.fields.length === 2 &&
3714
+ field("0")?.kind === "string" &&
3715
+ field("1")?.kind === "dyn";
3716
+ if (!ok)
3717
+ err(`libCall dyn.objEntryPairs must return a [string, any] tuple array`, e.loc);
3718
+ return true;
3719
+ }
3605
3720
  if (e.fn === "fetch.streamFrom") {
3606
3721
  const t = e.args[0]?.type;
3607
3722
  const ok = t?.kind === "string" ||
@@ -4528,6 +4643,15 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
4528
4643
  }
4529
4644
  return true;
4530
4645
  }
4646
+ if (e.fn === "error.aggregateSetErrors" || e.fn === "error.aggregateErrors") {
4647
+ // Receiver: exactly %AggregateError (subclassing is fenced — the
4648
+ // hidden runtime slot admits no other layout).
4649
+ const recv = e.args[0];
4650
+ if (!recv || recv.type.kind !== "object" || recv.type.className !== "%AggregateError") {
4651
+ err(`libCall ${e.fn} receiver must be %AggregateError`, e.loc);
4652
+ }
4653
+ return true;
4654
+ }
4531
4655
  if (e.fn === "error.newDom") {
4532
4656
  if (e.type.kind !== "object" || e.type.className !== "%DOMException") {
4533
4657
  err(`libCall error.newDom must return %DOMException, got ${e.type.kind}`, e.loc);
@@ -4763,6 +4887,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
4763
4887
  e.fn !== "emitter.setDefaultMax" &&
4764
4888
  e.fn !== "emitter.setDefaultMaxChk" &&
4765
4889
  e.fn !== "emitter.getDefaultMax" &&
4890
+ e.fn !== "emitter.errorMonitor" &&
4766
4891
  e.fn !== "emitter.checkListener") {
4767
4892
  // Receiver: an emitter-hierarchy object (the %EventEmitter class
4768
4893
  // itself, or a class whose base chain reaches it). emitter.new
@@ -4931,6 +5056,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
4931
5056
  }
4932
5057
  }
4933
5058
  }
5059
+ // The yield a `delegate` genResume is checking as its argument.
5060
+ let delegatedYield = null;
4934
5061
  function checkAsyncExpr(e) {
4935
5062
  switch (e.kind) {
4936
5063
  case "awaitExpr": {
@@ -4943,6 +5070,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
4943
5070
  }
4944
5071
  if (!fn.async)
4945
5072
  err("await outside an async function", e.loc);
5073
+ if (e.adopt === true && fn.generator !== undefined)
5074
+ err("returned-promise adoption inside a generator", e.loc);
4946
5075
  break;
4947
5076
  }
4948
5077
  case "yieldExpr": {
@@ -4960,7 +5089,13 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
4960
5089
  }
4961
5090
  // The undefined next-channel has no C value form: such yields are
4962
5091
  // void-typed (statement position only — the frontend fences reads).
4963
- if (e.captureCompletion) {
5092
+ if (e.delegated) {
5093
+ if (delegatedYield !== e)
5094
+ err("delegated yield outside a delegate resume", e.loc);
5095
+ if (e.type.kind !== "void" || e.captureCompletion)
5096
+ err("invalid delegated yield", e.loc);
5097
+ }
5098
+ else if (e.captureCompletion) {
4964
5099
  if (fn.async ||
4965
5100
  e.type.kind !== "dyn" ||
4966
5101
  !typeEquals(e.captureCompletion.returnType, fn.returnType)) {
@@ -4983,8 +5118,49 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
4983
5118
  break;
4984
5119
  }
4985
5120
  const genT = e.gen.type;
5121
+ if (e.mode === "delegate") {
5122
+ if (e.arg !== null) {
5123
+ if (e.arg.kind === "yieldExpr" && e.arg.delegated)
5124
+ delegatedYield = e.arg;
5125
+ else
5126
+ err("genResume delegate argument is not a delegated yield", e.loc);
5127
+ checkExpr(e.arg);
5128
+ delegatedYield = null;
5129
+ }
5130
+ const outer = fn.generator;
5131
+ if (outer === undefined || fn.async || genT.async)
5132
+ err("genResume delegate outside a sync generator body", e.loc);
5133
+ else if (genT.nextT.kind !== "undefinedT" &&
5134
+ genT.nextT.kind !== "dyn" &&
5135
+ !typeEquals(genT.nextT, outer.nextT))
5136
+ err(`genResume delegate into a ${typeKey(genT.nextT)} next-channel from ${typeKey(outer.nextT)}`, e.loc);
5137
+ if (e.type.kind !== "bool" && e.type.kind !== "record")
5138
+ err(`genResume delegate result ${typeKey(e.type)}`, e.loc);
5139
+ break;
5140
+ }
4986
5141
  if (e.arg !== null)
4987
5142
  checkExpr(e.arg);
5143
+ if (e.mode === "step" || e.mode === "value" || e.mode === "close") {
5144
+ if (genT.async)
5145
+ err(`genResume ${e.mode} on an async generator`, e.loc);
5146
+ if (e.arg !== null)
5147
+ err(`genResume ${e.mode} with an argument`, e.loc);
5148
+ if (e.mode === "step") {
5149
+ if (genT.nextT.kind !== "undefinedT" && genT.nextT.kind !== "dyn")
5150
+ err(`genResume step on a ${typeKey(genT.nextT)} next-channel`, e.loc);
5151
+ if (e.type.kind !== "bool")
5152
+ err(`genResume step result ${typeKey(e.type)}`, e.loc);
5153
+ }
5154
+ else if (e.mode === "close") {
5155
+ if (e.type.kind !== "void")
5156
+ err(`genResume close result ${typeKey(e.type)}`, e.loc);
5157
+ }
5158
+ else if ((genT.yieldT.kind === "void" || !typeEquals(e.type, genT.yieldT)) &&
5159
+ (genT.retT.kind === "void" || !typeEquals(e.type, genT.retT))) {
5160
+ err(`genResume value ${typeKey(e.type)} != yield channel ${typeKey(genT.yieldT)}`, e.loc);
5161
+ }
5162
+ break;
5163
+ }
4988
5164
  if (e.mode === "next") {
4989
5165
  if (e.arg === null) {
4990
5166
  if (genT.nextT.kind !== "undefinedT" && genT.nextT.kind !== "dyn") {