@scriptc/compiler 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +104 -31
  2. package/ambient/scriptc.d.ts +2 -1
  3. package/dist/backend/build-cache.js.map +1 -1
  4. package/dist/backend/c/async.d.ts +5 -0
  5. package/dist/backend/c/async.js +81 -2
  6. package/dist/backend/c/async.js.map +1 -1
  7. package/dist/backend/c/c-emitter.d.ts +25 -10
  8. package/dist/backend/c/c-emitter.js +74 -22
  9. package/dist/backend/c/c-emitter.js.map +1 -1
  10. package/dist/backend/c/exprs.d.ts +8 -1
  11. package/dist/backend/c/exprs.js +371 -18
  12. package/dist/backend/c/exprs.js.map +1 -1
  13. package/dist/backend/c/island.js.map +1 -1
  14. package/dist/backend/c/may-throw.js.map +1 -1
  15. package/dist/backend/c/shapes.js +15 -13
  16. package/dist/backend/c/shapes.js.map +1 -1
  17. package/dist/backend/c/stmts.d.ts +3 -5
  18. package/dist/backend/c/stmts.js +58 -17
  19. package/dist/backend/c/stmts.js.map +1 -1
  20. package/dist/backend/c/types.d.ts +4 -0
  21. package/dist/backend/c/types.js +18 -1
  22. package/dist/backend/c/types.js.map +1 -1
  23. package/dist/backend/c/types.test.js +8 -1
  24. package/dist/backend/c/types.test.js.map +1 -1
  25. package/dist/backend/c/walkers.js +63 -16
  26. package/dist/backend/c/walkers.js.map +1 -1
  27. package/dist/backend/external-c.js.map +1 -1
  28. package/dist/backend/json-literal.d.ts +7 -0
  29. package/dist/backend/json-literal.js +17 -0
  30. package/dist/backend/json-literal.js.map +1 -0
  31. package/dist/backend/json-literal.test.d.ts +1 -0
  32. package/dist/backend/json-literal.test.js +17 -0
  33. package/dist/backend/json-literal.test.js.map +1 -0
  34. package/dist/backend/link-plan.d.ts +1 -1
  35. package/dist/backend/link-plan.js +5 -1
  36. package/dist/backend/link-plan.js.map +1 -1
  37. package/dist/backend/linker.js.map +1 -1
  38. package/dist/backend/llvm/blocks.js.map +1 -1
  39. package/dist/backend/llvm/classes.js +8 -7
  40. package/dist/backend/llvm/classes.js.map +1 -1
  41. package/dist/backend/llvm/common.d.ts +4 -0
  42. package/dist/backend/llvm/common.js +6 -0
  43. package/dist/backend/llvm/common.js.map +1 -1
  44. package/dist/backend/llvm/common.test.d.ts +1 -0
  45. package/dist/backend/llvm/common.test.js +9 -0
  46. package/dist/backend/llvm/common.test.js.map +1 -0
  47. package/dist/backend/llvm/dyn.d.ts +4 -0
  48. package/dist/backend/llvm/dyn.js +80 -16
  49. package/dist/backend/llvm/dyn.js.map +1 -1
  50. package/dist/backend/llvm/emitter.js +132 -25
  51. package/dist/backend/llvm/emitter.js.map +1 -1
  52. package/dist/backend/llvm/expr-async.js +85 -3
  53. package/dist/backend/llvm/expr-async.js.map +1 -1
  54. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  55. package/dist/backend/llvm/expr-calls.js.map +1 -1
  56. package/dist/backend/llvm/expr-containers.js.map +1 -1
  57. package/dist/backend/llvm/expr-context.d.ts +5 -0
  58. package/dist/backend/llvm/expr-control.js.map +1 -1
  59. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  60. package/dist/backend/llvm/expr-dynamic.js +15 -3
  61. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  62. package/dist/backend/llvm/expr-island.js.map +1 -1
  63. package/dist/backend/llvm/expr-primitives.js +8 -0
  64. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  65. package/dist/backend/llvm/expr-records.js +3 -3
  66. package/dist/backend/llvm/expr-records.js.map +1 -1
  67. package/dist/backend/llvm/expr-stream-bridges.js +222 -10
  68. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  69. package/dist/backend/llvm/expr-stream-callbacks.d.ts +3 -0
  70. package/dist/backend/llvm/expr-stream-callbacks.js +53 -0
  71. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  72. package/dist/backend/llvm/lib-dispatch.js +24 -0
  73. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  74. package/dist/backend/llvm/lib-process.js +50 -5
  75. package/dist/backend/llvm/lib-process.js.map +1 -1
  76. package/dist/backend/llvm/lib-shared.js +64 -0
  77. package/dist/backend/llvm/lib-shared.js.map +1 -1
  78. package/dist/backend/llvm/lib-stream.js +6 -3
  79. package/dist/backend/llvm/lib-stream.js.map +1 -1
  80. package/dist/backend/llvm/shapes.js +10 -8
  81. package/dist/backend/llvm/shapes.js.map +1 -1
  82. package/dist/backend/llvm/split.js.map +1 -1
  83. package/dist/backend/llvm/unsupported.js.map +1 -1
  84. package/dist/backend/llvm/walkers.js +7 -5
  85. package/dist/backend/llvm/walkers.js.map +1 -1
  86. package/dist/backend/native-codegen.js.map +1 -1
  87. package/dist/backend/native-codegen.test.js +2 -0
  88. package/dist/backend/native-codegen.test.js.map +1 -1
  89. package/dist/backend/native-link-info.d.ts +2 -1
  90. package/dist/backend/native-link-info.js +4 -0
  91. package/dist/backend/native-link-info.js.map +1 -1
  92. package/dist/backend/native-link-info.test.js +24 -1
  93. package/dist/backend/native-link-info.test.js.map +1 -1
  94. package/dist/backend/native-toolchain.d.ts +8 -6
  95. package/dist/backend/native-toolchain.js +28 -13
  96. package/dist/backend/native-toolchain.js.map +1 -1
  97. package/dist/backend/native-toolchain.test.js +36 -1
  98. package/dist/backend/native-toolchain.test.js.map +1 -1
  99. package/dist/backend/runtime-pack-targets.test.js +1 -1
  100. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  101. package/dist/backend/runtime-pack.js.map +1 -1
  102. package/dist/backend/runtime-pack.test.js +1 -0
  103. package/dist/backend/runtime-pack.test.js.map +1 -1
  104. package/dist/backend/targets.d.ts +5 -0
  105. package/dist/backend/targets.js +9 -0
  106. package/dist/backend/targets.js.map +1 -1
  107. package/dist/backend/targets.test.js +6 -1
  108. package/dist/backend/targets.test.js.map +1 -1
  109. package/dist/backend/vendor-archives.js.map +1 -1
  110. package/dist/compat/fetch-profile.js +4 -2
  111. package/dist/compat/fetch-profile.js.map +1 -1
  112. package/dist/coverage/report.js.map +1 -1
  113. package/dist/coverage/surface-manifest.js +13 -0
  114. package/dist/coverage/surface-manifest.js.map +1 -1
  115. package/dist/diagnostics/diagnostic.d.ts +6 -5
  116. package/dist/diagnostics/diagnostic.js +10 -9
  117. package/dist/diagnostics/diagnostic.js.map +1 -1
  118. package/dist/diagnostics/render.js.map +1 -1
  119. package/dist/executable/executable-cache.d.ts +1 -0
  120. package/dist/executable/executable-cache.js +1 -0
  121. package/dist/executable/executable-cache.js.map +1 -1
  122. package/dist/executable/executable-cache.test.js +1 -0
  123. package/dist/executable/executable-cache.test.js.map +1 -1
  124. package/dist/ffi/ffi-manifest.js.map +1 -1
  125. package/dist/frontend/cjs-lexer.js.map +1 -1
  126. package/dist/frontend/dts-paths.js.map +1 -1
  127. package/dist/frontend/input-tracker.d.ts +10 -0
  128. package/dist/frontend/input-tracker.js +26 -3
  129. package/dist/frontend/input-tracker.js.map +1 -1
  130. package/dist/frontend/input-tracker.test.js +8 -1
  131. package/dist/frontend/input-tracker.test.js.map +1 -1
  132. package/dist/frontend/lib-contract.js.map +1 -1
  133. package/dist/frontend/lowering/array-values.d.ts +4 -0
  134. package/dist/frontend/lowering/array-values.js +18 -2
  135. package/dist/frontend/lowering/array-values.js.map +1 -1
  136. package/dist/frontend/lowering/callback-arg.js.map +1 -1
  137. package/dist/frontend/lowering/containers/bytes.d.ts +31 -0
  138. package/dist/frontend/lowering/containers/bytes.js +1105 -0
  139. package/dist/frontend/lowering/containers/bytes.js.map +1 -0
  140. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +17 -0
  141. package/dist/frontend/lowering/containers/string-and-regexp.js +345 -0
  142. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -0
  143. package/dist/frontend/lowering/expressions/evaluation-safety.d.ts +13 -0
  144. package/dist/frontend/lowering/expressions/evaluation-safety.js +76 -0
  145. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -0
  146. package/dist/frontend/lowering/expressions/object-literals.d.ts +44 -0
  147. package/dist/frontend/lowering/expressions/object-literals.js +1815 -0
  148. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -0
  149. package/dist/frontend/lowering/expressions/optional-chains.d.ts +31 -0
  150. package/dist/frontend/lowering/expressions/optional-chains.js +382 -0
  151. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -0
  152. package/dist/frontend/lowering/expressions/try-lower-expression.d.ts +7 -0
  153. package/dist/frontend/lowering/expressions/try-lower-expression.js +26 -0
  154. package/dist/frontend/lowering/expressions/try-lower-expression.js.map +1 -0
  155. package/dist/frontend/lowering/lib-boundary.js +7 -2
  156. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  157. package/dist/frontend/lowering/lower-assert.js +16 -10
  158. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  159. package/dist/frontend/lowering/lower-async-iteration.d.ts +7 -0
  160. package/dist/frontend/lowering/lower-async-iteration.js +657 -0
  161. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -0
  162. package/dist/frontend/lowering/lower-builtins.d.ts +40 -21
  163. package/dist/frontend/lowering/lower-builtins.js +611 -115
  164. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  165. package/dist/frontend/lowering/lower-calls.d.ts +21 -10
  166. package/dist/frontend/lowering/lower-calls.js +516 -75
  167. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  168. package/dist/frontend/lowering/lower-classes.d.ts +7 -13
  169. package/dist/frontend/lowering/lower-classes.js +128 -35
  170. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  171. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  172. package/dist/frontend/lowering/lower-containers.d.ts +1 -47
  173. package/dist/frontend/lowering/lower-containers.js +147 -1475
  174. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  175. package/dist/frontend/lowering/lower-event-emitter.js +51 -5
  176. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  177. package/dist/frontend/lowering/lower-exprs.d.ts +0 -78
  178. package/dist/frontend/lowering/lower-exprs.js +503 -2353
  179. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  180. package/dist/frontend/lowering/lower-generators.d.ts +18 -3
  181. package/dist/frontend/lowering/lower-generators.js +145 -9
  182. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  183. package/dist/frontend/lowering/lower-inspect.js +10 -3
  184. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  185. package/dist/frontend/lowering/lower-island.d.ts +6 -0
  186. package/dist/frontend/lowering/lower-island.js +37 -5
  187. package/dist/frontend/lowering/lower-island.js.map +1 -1
  188. package/dist/frontend/lowering/lower-modules.js +60 -15
  189. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  190. package/dist/frontend/lowering/lower-node-module.d.ts +18 -0
  191. package/dist/frontend/lowering/lower-node-module.js +302 -0
  192. package/dist/frontend/lowering/lower-node-module.js.map +1 -0
  193. package/dist/frontend/lowering/lower-server.js +1 -1
  194. package/dist/frontend/lowering/lower-server.js.map +1 -1
  195. package/dist/frontend/lowering/lower-stmts.d.ts +10 -28
  196. package/dist/frontend/lowering/lower-stmts.js +542 -259
  197. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  198. package/dist/frontend/lowering/lower-stream.js +4 -4
  199. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  200. package/dist/frontend/lowering/lowerer.d.ts +41 -38
  201. package/dist/frontend/lowering/lowerer.js +148 -62
  202. package/dist/frontend/lowering/lowerer.js.map +1 -1
  203. package/dist/frontend/lowering/optional-arguments.d.ts +9 -0
  204. package/dist/frontend/lowering/optional-arguments.js +57 -0
  205. package/dist/frontend/lowering/optional-arguments.js.map +1 -0
  206. package/dist/frontend/lowering/surfaces.d.ts +5 -3
  207. package/dist/frontend/lowering/surfaces.js +33 -13
  208. package/dist/frontend/lowering/surfaces.js.map +1 -1
  209. package/dist/frontend/npm-static-declarations.d.ts +35 -0
  210. package/dist/frontend/npm-static-declarations.js +519 -0
  211. package/dist/frontend/npm-static-declarations.js.map +1 -0
  212. package/dist/frontend/npm-static-declarations.test.d.ts +1 -0
  213. package/dist/frontend/npm-static-declarations.test.js +132 -0
  214. package/dist/frontend/npm-static-declarations.test.js.map +1 -0
  215. package/dist/frontend/npm-static.d.ts +2 -0
  216. package/dist/frontend/npm-static.js +26 -10
  217. package/dist/frontend/npm-static.js.map +1 -1
  218. package/dist/frontend/npm.d.ts +60 -0
  219. package/dist/frontend/npm.js +38 -4
  220. package/dist/frontend/npm.js.map +1 -1
  221. package/dist/frontend/npm.test.d.ts +1 -0
  222. package/dist/frontend/npm.test.js +50 -0
  223. package/dist/frontend/npm.test.js.map +1 -0
  224. package/dist/frontend/program.d.ts +3 -2
  225. package/dist/frontend/program.js +513 -70
  226. package/dist/frontend/program.js.map +1 -1
  227. package/dist/frontend/resolve.d.ts +26 -3
  228. package/dist/frontend/resolve.js +166 -29
  229. package/dist/frontend/resolve.js.map +1 -1
  230. package/dist/frontend/resolve.test.js +24 -1
  231. package/dist/frontend/resolve.test.js.map +1 -1
  232. package/dist/frontend/runtime-resolve.d.ts +22 -0
  233. package/dist/frontend/runtime-resolve.js +101 -0
  234. package/dist/frontend/runtime-resolve.js.map +1 -0
  235. package/dist/frontend/runtime-resolve.test.d.ts +1 -0
  236. package/dist/frontend/runtime-resolve.test.js +18 -0
  237. package/dist/frontend/runtime-resolve.test.js.map +1 -0
  238. package/dist/frontend/ts7/adapter.js +12 -13
  239. package/dist/frontend/ts7/adapter.js.map +1 -1
  240. package/dist/frontend/ts7/ast.js.map +1 -1
  241. package/dist/frontend/ts7/census-check.js +3 -3
  242. package/dist/frontend/ts7/census-check.js.map +1 -1
  243. package/dist/frontend/ts7/checker.d.ts +3 -0
  244. package/dist/frontend/ts7/checker.js +12 -3
  245. package/dist/frontend/ts7/checker.js.map +1 -1
  246. package/dist/frontend/ts7/enums.js.map +1 -1
  247. package/dist/frontend/ts7/program-adapter.js +42 -3
  248. package/dist/frontend/ts7/program-adapter.js.map +1 -1
  249. package/dist/frontend/type-mapper.js +171 -16
  250. package/dist/frontend/type-mapper.js.map +1 -1
  251. package/dist/index.js +11 -5
  252. package/dist/index.js.map +1 -1
  253. package/dist/ir/analysis.js +1 -0
  254. package/dist/ir/analysis.js.map +1 -1
  255. package/dist/ir/ir.d.ts +125 -52
  256. package/dist/ir/ir.js +136 -7
  257. package/dist/ir/ir.js.map +1 -1
  258. package/dist/ir/serialize.d.ts +1 -1
  259. package/dist/ir/serialize.js +1 -1
  260. package/dist/ir/validate.js +120 -63
  261. package/dist/ir/validate.js.map +1 -1
  262. package/dist/library/cache-primitives.js.map +1 -1
  263. package/dist/library/cache-reset.test.js.map +1 -1
  264. package/dist/library/compiler-self-identity.js.map +1 -1
  265. package/dist/library/int-infer.js.map +1 -1
  266. package/dist/library/int-infer.test.js +4 -4
  267. package/dist/library/int-infer.test.js.map +1 -1
  268. package/dist/library/library-cache.d.ts +1 -0
  269. package/dist/library/library-cache.js +1 -0
  270. package/dist/library/library-cache.js.map +1 -1
  271. package/dist/library/library-cache.test.js +18 -5
  272. package/dist/library/library-cache.test.js.map +1 -1
  273. package/dist/library/library-profile.js.map +1 -1
  274. package/dist/library/sidecar-validate.js.map +1 -1
  275. package/dist/library/sidecar.js.map +1 -1
  276. package/dist/startup-cache.js.map +1 -1
  277. package/dist/wasi-paths.js.map +1 -1
  278. package/package.json +18 -18
  279. package/surface-manifest.json +91 -20
@@ -1,4 +1,5 @@
1
- import { arrayOf, BOOL, BYTES_U8, bytesOf, canAdaptDynFuncTo, canConvertToDyn, canExitIslandToType, canMarshalIntoIsland, canMarshalTypedFuncIntoIsland, CHILD_T, CHILDSTREAM_T, DATE_T, DGRAMSOCK_T, DYN, DYN_HANDLE_KINDS, F64, ffiClassType, ffiSourceParamTypes, FILEHANDLE_T, FSWATCHER_T, HTTP2SESSION_T, HTTP2STREAM_T, HTTPCLIENTREQ_T, HTTPREQ_T, HTTPRES_T, islandPromisePayloadTag, isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam, isJsonSafeType, isJsonStringifySafeType, isRefCounted, isSupportedArrayElem, isSupportedIndexValue, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, jsOpResultKind, JSVAL, NETSERVER_T, NETSOCKET_T, PROCSTREAM_T, REF_TRUTHY_KINDS, REGEX, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, SEARCH_PARAMS_T, SECURECTX_T, shapeHasAccessorSlots, SPAWNRES_T, STATS_T, STRING, SYMBOL_T, TESTCTX_T, typeEquals, typeKey, unionFuncSetArmsOk, URL_T, VOID } from "./ir.js";
1
+ import { arrayOf, BOOL, BYTES_U8, bytesOf, canAdaptDynFuncTo, canConvertToDyn, canExitIslandToType, canMarshalIntoIsland, canMarshalTypedFuncIntoIsland, CHILD_T, CHILDSTREAM_T, CHILDWRITER_T, CRYPTOHASH_T, CRYPTOHMAC_T, DATE_T, DGRAMSOCK_T, DYN, DYN_HANDLE_KINDS, F64, ffiClassType, ffiSourceParamTypes, FILEHANDLE_T, FSWATCHER_T, HTTP2SESSION_T, HTTP2STREAM_T, HTTPCLIENTREQ_T, HTTPREQ_T, HTTPRES_T, islandPromisePayloadTag, isDynTypedRefType, isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam, isJsonSafeType, isJsonStringifySafeType, isRefCounted, isSupportedArrayElem, isSupportedIndexValue, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, jsOpResultKind, JSVAL, NETSERVER_T, NETSOCKET_T, PROCSTREAM_T, REF_TRUTHY_KINDS, REGEX, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, SEARCH_PARAMS_T, SECURECTX_T, shapeHasAccessorSlots, SPAWNRES_T, STATS_T, STRING, SYMBOL_T, TESTCTX_T, typeEquals, typeKey, unionFuncSetArmsOk, URL_T, VOID } from "./ir.js";
2
+ import { BIGINT_T } from "./ir.js";
2
3
  /** Per-method signature for strIntrinsic: `argTypes` lists every argument
3
4
  * position (optional ones included); `minArgs` is how many may be omitted
4
5
  * from the end (backends fill the documented defaults). Exported for the
@@ -85,6 +86,22 @@ export const LIB_FN_SIGS = {
85
86
  "dyn.toString": { argTypes: [DYN, STRING, STRING], result: STRING },
86
87
  "dyn.defineProps": { argTypes: [DYN, DYN], result: DYN },
87
88
  "dyn.typeof": { argTypes: [DYN], result: STRING },
89
+ "module.registryInit": { argTypes: [F64], result: VOID },
90
+ "module.define": { argTypes: [F64, STRING, STRING, STRING, arrayOf(STRING), BOOL], result: VOID },
91
+ "module.enter": { argTypes: [F64], result: VOID },
92
+ "module.link": { argTypes: [F64, F64], result: VOID },
93
+ "module.finish": { argTypes: [F64], result: VOID },
94
+ "module.fail": { argTypes: [F64], result: VOID },
95
+ "module.filename": { argTypes: [F64], result: STRING },
96
+ "module.id": { argTypes: [F64], result: STRING },
97
+ "module.path": { argTypes: [F64], result: STRING },
98
+ "module.paths": { argTypes: [F64], result: arrayOf(STRING) },
99
+ "module.children": { argTypes: [F64], result: arrayOf(F64) },
100
+ "module.parent": { argTypes: [F64], result: F64 },
101
+ "module.loaded": { argTypes: [F64], result: BOOL },
102
+ "module.cacheGet": { argTypes: [STRING], result: F64 },
103
+ "module.cacheHas": { argTypes: [STRING], result: BOOL },
104
+ "module.cacheKeys": { argTypes: [], result: arrayOf(STRING) },
88
105
  "timers.setTimeout": { argTypes: [{ kind: "func", params: [], ret: VOID }, F64], result: VOID },
89
106
  "timers.setInterval": { argTypes: [{ kind: "func", params: [], ret: VOID }, F64], result: F64 },
90
107
  "timers.clearInterval": { argTypes: [F64], result: VOID },
@@ -213,6 +230,34 @@ export const LIB_FN_SIGS = {
213
230
  "sym.keyFor": { argTypes: [SYMBOL_T], result: VOID },
214
231
  "sym.desc": { argTypes: [SYMBOL_T], result: VOID },
215
232
  "sym.toString": { argTypes: [SYMBOL_T], result: STRING },
233
+ "bigint.parse": { argTypes: [STRING], result: BIGINT_T },
234
+ "bigint.fromF64": { argTypes: [F64], result: BIGINT_T },
235
+ "bigint.neg": { argTypes: [BIGINT_T], result: BIGINT_T },
236
+ "bigint.not": { argTypes: [BIGINT_T], result: BIGINT_T },
237
+ "bigint.add": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
238
+ "bigint.sub": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
239
+ "bigint.mul": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
240
+ "bigint.div": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
241
+ "bigint.mod": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
242
+ "bigint.pow": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
243
+ "bigint.and": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
244
+ "bigint.or": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
245
+ "bigint.xor": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
246
+ "bigint.shl": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
247
+ "bigint.shr": { argTypes: [BIGINT_T, BIGINT_T], result: BIGINT_T },
248
+ "bigint.eq": { argTypes: [BIGINT_T, BIGINT_T], result: BOOL },
249
+ "bigint.cmp": { argTypes: [BIGINT_T, BIGINT_T], result: F64 },
250
+ "bigint.cmpNumber": { argTypes: [BIGINT_T, F64], result: F64 },
251
+ "bigint.truthy": { argTypes: [BIGINT_T], result: BOOL },
252
+ "bigint.toString": { argTypes: [BIGINT_T, F64], result: STRING },
253
+ "bigint.inspect": { argTypes: [BIGINT_T], result: STRING },
254
+ "bigint.toF64": { argTypes: [BIGINT_T], result: F64 },
255
+ "bigint.asUintN": { argTypes: [F64, BIGINT_T], result: BIGINT_T },
256
+ "bigint.asIntN": { argTypes: [F64, BIGINT_T], result: BIGINT_T },
257
+ "bigint.bufferRead": { argTypes: [BYTES_U8, F64, BOOL, BOOL], result: BIGINT_T },
258
+ "bigint.bufferWrite": { argTypes: [BYTES_U8, BIGINT_T, F64, BOOL, BOOL], result: F64 },
259
+ "bigint.dataViewGet": { argTypes: [BYTES_U8, F64, BOOL, BOOL], result: BIGINT_T },
260
+ "bigint.dataViewSet": { argTypes: [BYTES_U8, F64, BIGINT_T, BOOL], result: VOID },
216
261
  "url.new": { argTypes: [STRING], result: URL_T },
217
262
  "url.protocol": { argTypes: [URL_T], result: STRING },
218
263
  "url.host": { argTypes: [URL_T], result: STRING },
@@ -684,11 +729,20 @@ export const LIB_FN_SIGS = {
684
729
  // case checks the arms — the child.pid pattern with a ref arm).
685
730
  "child.stdout": { argTypes: [CHILD_T], result: VOID },
686
731
  "child.stderr": { argTypes: [CHILD_T], result: VOID },
732
+ "child.stdin": { argTypes: [CHILD_T], result: VOID },
687
733
  // Listener registrations: callback func shapes are program-dependent
688
734
  // (zero-param / Buffer / Buffer-armed union) — the slots pin arity,
689
735
  // the stream receiver, and the once-flag.
690
736
  "stream.onData": { argTypes: [CHILDSTREAM_T, null, BOOL], result: VOID },
691
737
  "stream.onEnd": { argTypes: [CHILDSTREAM_T, null, BOOL], result: VOID },
738
+ "writer.writeString": { argTypes: [CHILDWRITER_T, STRING], result: BOOL },
739
+ "writer.writeBytes": { argTypes: [CHILDWRITER_T, BYTES_U8], result: BOOL },
740
+ "writer.end": { argTypes: [CHILDWRITER_T], result: VOID },
741
+ "writer.destroy": { argTypes: [CHILDWRITER_T], result: VOID },
742
+ "writer.writable": { argTypes: [CHILDWRITER_T], result: BOOL },
743
+ "writer.onDrain": { argTypes: [CHILDWRITER_T, null, BOOL], result: VOID },
744
+ "writer.onFinish": { argTypes: [CHILDWRITER_T, null, BOOL], result: VOID },
745
+ "writer.onError": { argTypes: [CHILDWRITER_T, null, BOOL], result: VOID },
692
746
  "procStream.write": { argTypes: [PROCSTREAM_T, STRING], result: BOOL },
693
747
  "child.killed": { argTypes: [CHILD_T], result: BOOL },
694
748
  "child.kill": { argTypes: [CHILD_T, STRING], result: BOOL },
@@ -701,6 +755,25 @@ export const LIB_FN_SIGS = {
701
755
  "crypto.randomBytes": { argTypes: [F64], result: BYTES_U8 },
702
756
  "crypto.hashDigestStr": { argTypes: [STRING, STRING, STRING], result: STRING },
703
757
  "crypto.hashDigestBytes": { argTypes: [STRING, BYTES_U8, STRING], result: STRING },
758
+ "crypto.hashNew": { argTypes: [STRING], result: CRYPTOHASH_T },
759
+ "crypto.hmacNewStr": { argTypes: [STRING, STRING], result: CRYPTOHMAC_T },
760
+ "crypto.hmacNewBytes": { argTypes: [STRING, BYTES_U8], result: CRYPTOHMAC_T },
761
+ "crypto.hashUpdateStr": { argTypes: [CRYPTOHASH_T, STRING], result: CRYPTOHASH_T },
762
+ "crypto.hashUpdateBytes": { argTypes: [CRYPTOHASH_T, BYTES_U8], result: CRYPTOHASH_T },
763
+ "crypto.hmacUpdateStr": { argTypes: [CRYPTOHMAC_T, STRING], result: CRYPTOHMAC_T },
764
+ "crypto.hmacUpdateBytes": { argTypes: [CRYPTOHMAC_T, BYTES_U8], result: CRYPTOHMAC_T },
765
+ "crypto.hashCopy": { argTypes: [CRYPTOHASH_T], result: CRYPTOHASH_T },
766
+ "crypto.hashDigestString": { argTypes: [CRYPTOHASH_T, STRING], result: STRING },
767
+ "crypto.hashDigestBuffer": { argTypes: [CRYPTOHASH_T], result: BYTES_U8 },
768
+ "crypto.hmacDigestString": { argTypes: [CRYPTOHMAC_T, STRING], result: STRING },
769
+ "crypto.hmacDigestBuffer": { argTypes: [CRYPTOHMAC_T], result: BYTES_U8 },
770
+ "crypto.timingSafeEqual": { argTypes: [BYTES_U8, BYTES_U8], result: BOOL },
771
+ "crypto.randomFill": { argTypes: [BYTES_U8, F64, F64], result: BYTES_U8 },
772
+ "crypto.randomFillRest": { argTypes: [BYTES_U8, F64], result: BYTES_U8 },
773
+ "crypto.randomInt": { argTypes: [F64, F64], result: F64 },
774
+ "crypto.pbkdf2": { argTypes: [BYTES_U8, BYTES_U8, F64, F64, STRING], result: BYTES_U8 },
775
+ "crypto.randomBytesCb": { argTypes: [F64, null], result: VOID },
776
+ "crypto.pbkdf2Cb": { argTypes: [BYTES_U8, BYTES_U8, F64, F64, STRING, null], result: VOID },
704
777
  // The Buffer statics and the fs/zlib Buffer forms: fixed always-u8
705
778
  // signatures (Buffer IS a Uint8Array — one bytes kind).
706
779
  "buffer.fromStr": { argTypes: [STRING, STRING], result: BYTES_U8 },
@@ -937,12 +1010,14 @@ export const LIB_FN_SIGS = {
937
1010
  "writable.uncork": { argTypes: [null], result: VOID },
938
1011
  "stream.destroy": { argTypes: [null], result: VOID },
939
1012
  "stream.destroyErr": { argTypes: [null, null], result: VOID },
1013
+ "stream.iteratorClose": { argTypes: [null], result: VOID },
940
1014
  "stream.prop": { argTypes: [null, STRING], result: VOID },
941
1015
  "stream.errored": { argTypes: [null], result: VOID },
942
1016
  // node:assert: pass/negated/deep/hasMsg are frontend-computed bools; the
943
1017
  // message slot always carries a string ("" when hasMsg is false).
944
1018
  "assert.ok": { argTypes: [BOOL, STRING], result: VOID },
945
1019
  "assert.eqF64": { argTypes: [F64, F64, BOOL, BOOL, STRING, BOOL], result: VOID },
1020
+ "assert.eqBigInt": { argTypes: [BIGINT_T, BIGINT_T, BOOL, BOOL, STRING, BOOL], result: VOID },
946
1021
  "assert.eqStr": { argTypes: [STRING, STRING, BOOL, BOOL, STRING, BOOL], result: VOID },
947
1022
  "assert.eqBool": { argTypes: [BOOL, BOOL, BOOL, BOOL, STRING, BOOL], result: VOID },
948
1023
  "assert.deepResult": { argTypes: [BOOL, BOOL, STRING, BOOL], result: VOID },
@@ -1118,6 +1193,9 @@ function isBuiltinErrorObject(t) {
1118
1193
  * TReturn channel, so call sites see the generator type. The one place
1119
1194
  * the body/call-site split is spelled out in the validator. */
1120
1195
  function callSiteReturnType(fn) {
1196
+ if (fn.async && fn.generator !== undefined) {
1197
+ return { kind: "generator", async: true, yieldT: fn.generator.yieldT, retT: fn.returnType, nextT: fn.generator.nextT };
1198
+ }
1121
1199
  if (fn.async)
1122
1200
  return { kind: "promise", inner: fn.returnType };
1123
1201
  if (fn.generator !== undefined) {
@@ -1132,9 +1210,6 @@ export function validateModule(mod) {
1132
1210
  if (functionsByName.has(fn.name)) {
1133
1211
  errors.push({ message: `duplicate function "${fn.name}"`, loc: fn.loc });
1134
1212
  }
1135
- if (fn.async && fn.generator !== undefined) {
1136
- errors.push({ message: `function "${fn.name}" is both async and a generator (async generators are fenced)`, loc: fn.loc });
1137
- }
1138
1213
  functionsByName.set(fn.name, fn);
1139
1214
  }
1140
1215
  const ffiByName = new Map();
@@ -1716,7 +1791,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
1716
1791
  const liveDynRefEligible = (type, seen = new Set()) => {
1717
1792
  if (type.kind === "record" ||
1718
1793
  type.kind === "array" ||
1719
- type.kind === "bytes") {
1794
+ type.kind === "bytes" ||
1795
+ isDynTypedRefType(type)) {
1720
1796
  return true;
1721
1797
  }
1722
1798
  if (type.kind !== "union" || seen.has(type.unionId))
@@ -1936,9 +2012,10 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
1936
2012
  checkExpr(e.operand);
1937
2013
  if (e.operand.type.kind !== "f64" &&
1938
2014
  e.operand.type.kind !== "string" &&
2015
+ e.operand.type.kind !== "dyn" &&
1939
2016
  e.operand.type.kind !== "union" &&
1940
2017
  !REF_TRUTHY_KINDS.has(e.operand.type.kind)) {
1941
- err(`toBool operand must be f64|string|union|ref, got ${e.operand.type.kind}`, e.loc);
2018
+ err(`toBool operand must be f64|string|dyn|union|ref, got ${e.operand.type.kind}`, e.loc);
1942
2019
  }
1943
2020
  if (e.operand.type.kind === "union")
1944
2021
  checkTruthyUnion(e.operand.type.unionId, e.loc);
@@ -4301,6 +4378,18 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4301
4378
  }
4302
4379
  break;
4303
4380
  }
4381
+ if (e.fn === "writer.onDrain" || e.fn === "writer.onFinish" || e.fn === "writer.onError") {
4382
+ const cbT = e.args[1]?.type;
4383
+ const maxParams = e.fn === "writer.onError" ? 1 : 0;
4384
+ let ok = cbT?.kind === "func" && cbT.ret.kind === "void" && cbT.params.length <= maxParams;
4385
+ if (ok && cbT?.kind === "func" && cbT.params.length === 1) {
4386
+ const p = cbT.params[0];
4387
+ ok = p.kind === "object" && p.className === "%Error";
4388
+ }
4389
+ if (!ok)
4390
+ err(`libCall ${e.fn} callback shape (frontend must fence)`, e.loc);
4391
+ break;
4392
+ }
4304
4393
  if (e.fn === "process.onExit" || e.fn === "process.offExit" ||
4305
4394
  e.fn === "stdin.onData" || e.fn === "stdin.onError") {
4306
4395
  // The listener: a void closure with no params, or exactly the
@@ -4420,14 +4509,15 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4420
4509
  }
4421
4510
  break;
4422
4511
  }
4423
- if (e.fn === "child.stdout" || e.fn === "child.stderr") {
4512
+ if (e.fn === "child.stdin" || e.fn === "child.stdout" || e.fn === "child.stderr") {
4424
4513
  const def = e.type.kind === "union" ? unions.get(e.type.unionId) : undefined;
4514
+ const handleKind = e.fn === "child.stdin" ? "childWriter" : "childStream";
4425
4515
  const ok = def &&
4426
4516
  def.arms.length === 2 &&
4427
- def.arms.some((a) => a.kind === "childStream") &&
4517
+ def.arms.some((a) => a.kind === handleKind) &&
4428
4518
  def.arms.some((a) => a.kind === "nullT");
4429
4519
  if (!ok) {
4430
- err(`libCall ${e.fn} must return the 'Readable | null' union`, e.loc);
4520
+ err(`libCall ${e.fn} must return the '${e.fn === "child.stdin" ? "Writable" : "Readable"} | null' union`, e.loc);
4431
4521
  }
4432
4522
  break;
4433
4523
  }
@@ -4527,7 +4617,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4527
4617
  if (e.fn.startsWith("readable.") || e.fn.startsWith("writable.") ||
4528
4618
  e.fn.startsWith("duplex.") || e.fn.startsWith("transform.") ||
4529
4619
  e.fn.startsWith("passthrough.") || e.fn === "stream.destroy" ||
4530
- e.fn === "stream.destroyErr" || e.fn === "stream.prop" ||
4620
+ e.fn === "stream.destroyErr" || e.fn === "stream.iteratorClose" || e.fn === "stream.prop" ||
4531
4621
  e.fn === "stream.errored" || e.fn === "stream.finished" ||
4532
4622
  e.fn === "stream.finishedDyn" || e.fn === "stream.pipeline" ||
4533
4623
  e.fn === "stream.pipelineDyn") {
@@ -4635,7 +4725,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4635
4725
  if (e.fn === "readable.pause" || e.fn === "readable.resume" ||
4636
4726
  e.fn === "readable.unpipe" || e.fn === "writable.end" ||
4637
4727
  e.fn === "readable.setEncoding" || e.fn === "readable.pushEncoding" ||
4638
- e.fn === "stream.destroy" || e.fn === "stream.destroyErr") {
4728
+ e.fn === "stream.destroy" || e.fn === "stream.destroyErr" ||
4729
+ e.fn === "stream.iteratorClose") {
4639
4730
  if (!typeEquals(e.type, e.args[0].type)) {
4640
4731
  err(`libCall ${e.fn} must return its receiver's type (the chaining 'this')`, e.loc);
4641
4732
  }
@@ -4795,13 +4886,17 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4795
4886
  // reads), which matches exactly the undefined arm.
4796
4887
  const jsonOk = (t) => isJsonSafeType(t, (id) => records.get(id), (id) => unions.get(id));
4797
4888
  const undefArmedOk = e.type.kind === "union" &&
4798
- (unions.get(e.type.unionId)?.arms.every((a) => a.kind === "undefinedT" || jsonOk(a)) ??
4889
+ (unions.get(e.type.unionId)?.arms.every((a) => a.kind === "undefinedT" ||
4890
+ jsonOk(a) ||
4891
+ isDynTypedRefType(a) ||
4892
+ DYN_HANDLE_KINDS.has(a.kind)) ??
4799
4893
  false);
4800
4894
  // bytes<u8> targets extract the checked-dynamic tree's bytes kind (a copy).
4801
4895
  const bytesOk = e.type.kind === "bytes" && e.type.elem === "u8";
4802
4896
  // The %Error root extracts the checked-dynamic tree's error encoding (the "%error"
4803
4897
  // marker object caughtToDyn builds) as a fresh runtime error.
4804
4898
  const errorOk = e.type.kind === "object" && e.type.className === "%Error";
4899
+ const classOk = isDynTypedRefType(e.type);
4805
4900
  // ADAPTABLE function targets unwrap or wrap the checked-dynamic tree's function
4806
4901
  // kind (the checked-dynamic function boundary, ir.ts).
4807
4902
  const funcOk = e.type.kind === "func" &&
@@ -4809,7 +4904,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4809
4904
  // Runtime HANDLE targets unwrap the checked-dynamic tree's handle kind by tag (a
4810
4905
  // retained reference, no copy — DYN_HANDLE_KINDS).
4811
4906
  const handleOk = DYN_HANDLE_KINDS.has(e.type.kind);
4812
- if (!jsonOk(e.type) && !undefArmedOk && !bytesOk && !errorOk && !funcOk && !handleOk) {
4907
+ if (!jsonOk(e.type) && !undefArmedOk && !bytesOk && !errorOk && !classOk && !funcOk && !handleOk) {
4813
4908
  err(`dynCheck against non-JSON-representable type ${e.type.kind}`, e.loc);
4814
4909
  }
4815
4910
  break;
@@ -4888,17 +4983,19 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
4888
4983
  err(`genResume throw of a ${e.arg.type.kind} value`, e.loc);
4889
4984
  }
4890
4985
  }
4891
- // The result is the IteratorResult record { done: bool, value: V }
4986
+ // Sync resumes return IteratorResult directly; async resumes return
4987
+ // Promise<IteratorResult>. The record is { done: bool, value: V }
4892
4988
  // with V dyn (the any/unknown channel) or an undefined-armed union.
4893
- if (e.type.kind !== "record") {
4894
- err(`genResume result is ${e.type.kind}, not a record`, e.loc);
4989
+ const resultT = genT.async ? (e.type.kind === "promise" ? e.type.inner : null) : e.type;
4990
+ if (resultT?.kind !== "record") {
4991
+ err(`genResume result is ${typeKey(e.type)}, not ${genT.async ? "a promise of " : ""}a record`, e.loc);
4895
4992
  break;
4896
4993
  }
4897
- const rec = records.get(e.type.shapeId);
4994
+ const rec = records.get(resultT.shapeId);
4898
4995
  const doneF = rec?.fields.find((f) => f.name === "done");
4899
4996
  const valueF = rec?.fields.find((f) => f.name === "value");
4900
4997
  if (!rec || rec.fields.length !== 2 || doneF?.type.kind !== "bool" || valueF === undefined) {
4901
- err(`genResume result record ${e.type.shapeId} is not { done: bool, value: V }`, e.loc);
4998
+ err(`genResume result record ${resultT.shapeId} is not { done: bool, value: V }`, e.loc);
4902
4999
  break;
4903
5000
  }
4904
5001
  if (valueF.type.kind === "dyn")
@@ -5122,19 +5219,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
5122
5219
  let breakableDepth = 0;
5123
5220
  // Labeled jump targets, innermost last: every loop/switch/labeled-block
5124
5221
  // enters with its labels (possibly none) so `break lbl`/`continue lbl`
5125
- // can resolve to an enclosing entry — and so the finally backstop can
5126
- // compare the TARGET's position, not just the innermost depth.
5222
+ // can resolve to an enclosing entry.
5127
5223
  const labelTargets = [];
5128
- // Active try-with-finally regions: break/continue may not cross one, and
5129
- // NO jump may leave a finally BODY (the frontend fences both; this is the
5130
- // backstop). `return` crossing a region is modeled now (the backend's
5131
- // pending-return path), so returns are legal in tryBody/catchBody but
5132
- // still rejected inside finallyBody (they would replace a pending
5133
- // completion). Each entry records the loop/switch depths (and the label
5134
- // stack length) at region entry: a break whose target is at or below
5135
- // them would cross the finally.
5136
- const finallyRegions = [];
5137
- let finallyBlockDepth = 0;
5138
5224
  function checkStmts(stmts) {
5139
5225
  for (const s of stmts)
5140
5226
  checkStmt(s);
@@ -5148,12 +5234,11 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
5148
5234
  breakableDepth--;
5149
5235
  loopDepth--;
5150
5236
  }
5151
- /** The innermost enclosing target carrying `label`, or null — plus its
5152
- * index for the finally-region crossing check. */
5237
+ /** The innermost enclosing target carrying `label`, or null. */
5153
5238
  function labelTargetOf(label) {
5154
5239
  for (let i = labelTargets.length - 1; i >= 0; i--) {
5155
5240
  if (labelTargets[i].labels.includes(label))
5156
- return { entry: labelTargets[i], index: i };
5241
+ return labelTargets[i];
5157
5242
  }
5158
5243
  return null;
5159
5244
  }
@@ -5450,67 +5535,39 @@ function validateFunction(fn, functions, ffiByName, classes, records, unions, gl
5450
5535
  err(`tryCatch catch binding without a catch body`, s.loc);
5451
5536
  }
5452
5537
  }
5453
- const guarded = s.finallyBody !== null;
5454
- if (guarded)
5455
- finallyRegions.push({ loopDepth, breakableDepth, labelLen: labelTargets.length });
5456
5538
  checkStmts(s.tryBody);
5457
5539
  if (s.catchBody)
5458
5540
  checkStmts(s.catchBody);
5459
- if (s.finallyBody) {
5460
- finallyBlockDepth++;
5541
+ if (s.finallyBody)
5461
5542
  checkStmts(s.finallyBody);
5462
- finallyBlockDepth--;
5463
- }
5464
- if (guarded)
5465
- finallyRegions.pop();
5466
5543
  break;
5467
5544
  }
5468
5545
  case "break": {
5469
- const region = finallyRegions[finallyRegions.length - 1];
5470
5546
  if (s.label !== undefined) {
5471
5547
  const target = labelTargetOf(s.label);
5472
5548
  if (!target)
5473
5549
  err(`break to unknown label "${s.label}"`, s.loc);
5474
- else if (region && target.index < region.labelLen) {
5475
- err(`labeled break crossing a finally block (frontend must reject)`, s.loc);
5476
- }
5477
5550
  break;
5478
5551
  }
5479
5552
  if (breakableDepth === 0)
5480
5553
  err(`break outside a loop or switch`, s.loc);
5481
- if (region && breakableDepth <= region.breakableDepth) {
5482
- err(`break crossing a finally block (frontend must reject)`, s.loc);
5483
- }
5484
5554
  break;
5485
5555
  }
5486
5556
  case "continue": {
5487
- const region = finallyRegions[finallyRegions.length - 1];
5488
5557
  if (s.label !== undefined) {
5489
5558
  const target = labelTargetOf(s.label);
5490
5559
  if (!target)
5491
5560
  err(`continue to unknown label "${s.label}"`, s.loc);
5492
- else if (target.entry.kind !== "loop") {
5561
+ else if (target.kind !== "loop") {
5493
5562
  err(`continue to non-loop label "${s.label}"`, s.loc);
5494
5563
  }
5495
- else if (region && target.index < region.labelLen) {
5496
- err(`labeled continue crossing a finally block (frontend must reject)`, s.loc);
5497
- }
5498
5564
  break;
5499
5565
  }
5500
5566
  if (loopDepth === 0)
5501
5567
  err(`continue outside a loop`, s.loc);
5502
- if (region && loopDepth <= region.loopDepth) {
5503
- err(`continue crossing a finally block (frontend must reject)`, s.loc);
5504
- }
5505
5568
  break;
5506
5569
  }
5507
5570
  case "return":
5508
- // Crossing OUT of a try/catch body guarded by a finally is modeled
5509
- // (the backend's pending-return path); a return inside the finally
5510
- // BODY itself is not (it would replace a pending completion).
5511
- if (finallyBlockDepth > 0) {
5512
- err(`return inside a finally body (frontend must reject)`, s.loc);
5513
- }
5514
5571
  if (s.value) {
5515
5572
  checkExpr(s.value);
5516
5573
  expectType(s.value, fn.returnType, "return value");