@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.
- package/ambient/scriptc-node-fallback.d.ts +104 -31
- package/ambient/scriptc.d.ts +2 -1
- package/dist/backend/build-cache.js.map +1 -1
- package/dist/backend/c/async.d.ts +5 -0
- package/dist/backend/c/async.js +81 -2
- package/dist/backend/c/async.js.map +1 -1
- package/dist/backend/c/c-emitter.d.ts +25 -10
- package/dist/backend/c/c-emitter.js +74 -22
- package/dist/backend/c/c-emitter.js.map +1 -1
- package/dist/backend/c/exprs.d.ts +8 -1
- package/dist/backend/c/exprs.js +371 -18
- package/dist/backend/c/exprs.js.map +1 -1
- package/dist/backend/c/island.js.map +1 -1
- package/dist/backend/c/may-throw.js.map +1 -1
- package/dist/backend/c/shapes.js +15 -13
- package/dist/backend/c/shapes.js.map +1 -1
- package/dist/backend/c/stmts.d.ts +3 -5
- package/dist/backend/c/stmts.js +58 -17
- package/dist/backend/c/stmts.js.map +1 -1
- package/dist/backend/c/types.d.ts +4 -0
- package/dist/backend/c/types.js +18 -1
- package/dist/backend/c/types.js.map +1 -1
- package/dist/backend/c/types.test.js +8 -1
- package/dist/backend/c/types.test.js.map +1 -1
- package/dist/backend/c/walkers.js +63 -16
- package/dist/backend/c/walkers.js.map +1 -1
- package/dist/backend/external-c.js.map +1 -1
- package/dist/backend/json-literal.d.ts +7 -0
- package/dist/backend/json-literal.js +17 -0
- package/dist/backend/json-literal.js.map +1 -0
- package/dist/backend/json-literal.test.d.ts +1 -0
- package/dist/backend/json-literal.test.js +17 -0
- package/dist/backend/json-literal.test.js.map +1 -0
- package/dist/backend/link-plan.d.ts +1 -1
- package/dist/backend/link-plan.js +5 -1
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/classes.js +8 -7
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +4 -0
- package/dist/backend/llvm/common.js +6 -0
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/common.test.d.ts +1 -0
- package/dist/backend/llvm/common.test.js +9 -0
- package/dist/backend/llvm/common.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +4 -0
- package/dist/backend/llvm/dyn.js +80 -16
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.js +132 -25
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +85 -3
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +5 -0
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +15 -3
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-island.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +8 -0
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +3 -3
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +222 -10
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +3 -0
- package/dist/backend/llvm/expr-stream-callbacks.js +53 -0
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +24 -0
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +50 -5
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +64 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +6 -3
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/shapes.js +10 -8
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/split.js.map +1 -1
- package/dist/backend/llvm/unsupported.js.map +1 -1
- package/dist/backend/llvm/walkers.js +7 -5
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +2 -0
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info.d.ts +2 -1
- package/dist/backend/native-link-info.js +4 -0
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-link-info.test.js +24 -1
- package/dist/backend/native-link-info.test.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +8 -6
- package/dist/backend/native-toolchain.js +28 -13
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +36 -1
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +1 -0
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/targets.d.ts +5 -0
- package/dist/backend/targets.js +9 -0
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +6 -1
- package/dist/backend/targets.test.js.map +1 -1
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/compat/fetch-profile.js +4 -2
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +13 -0
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +6 -5
- package/dist/diagnostics/diagnostic.js +10 -9
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/render.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +1 -0
- package/dist/executable/executable-cache.js +1 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +1 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/ffi/ffi-manifest.js.map +1 -1
- package/dist/frontend/cjs-lexer.js.map +1 -1
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +10 -0
- package/dist/frontend/input-tracker.js +26 -3
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +8 -1
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lib-contract.js.map +1 -1
- package/dist/frontend/lowering/array-values.d.ts +4 -0
- package/dist/frontend/lowering/array-values.js +18 -2
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/callback-arg.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +31 -0
- package/dist/frontend/lowering/containers/bytes.js +1105 -0
- package/dist/frontend/lowering/containers/bytes.js.map +1 -0
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +17 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js +345 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.d.ts +13 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js +76 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -0
- package/dist/frontend/lowering/expressions/object-literals.d.ts +44 -0
- package/dist/frontend/lowering/expressions/object-literals.js +1815 -0
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -0
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +31 -0
- package/dist/frontend/lowering/expressions/optional-chains.js +382 -0
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -0
- package/dist/frontend/lowering/expressions/try-lower-expression.d.ts +7 -0
- package/dist/frontend/lowering/expressions/try-lower-expression.js +26 -0
- package/dist/frontend/lowering/expressions/try-lower-expression.js.map +1 -0
- package/dist/frontend/lowering/lib-boundary.js +7 -2
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +16 -10
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.d.ts +7 -0
- package/dist/frontend/lowering/lower-async-iteration.js +657 -0
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.d.ts +40 -21
- package/dist/frontend/lowering/lower-builtins.js +611 -115
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +21 -10
- package/dist/frontend/lowering/lower-calls.js +516 -75
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +7 -13
- package/dist/frontend/lowering/lower-classes.js +128 -35
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.d.ts +1 -47
- package/dist/frontend/lowering/lower-containers.js +147 -1475
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js +51 -5
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +0 -78
- package/dist/frontend/lowering/lower-exprs.js +503 -2353
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +18 -3
- package/dist/frontend/lowering/lower-generators.js +145 -9
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +10 -3
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +6 -0
- package/dist/frontend/lowering/lower-island.js +37 -5
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +60 -15
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-node-module.d.ts +18 -0
- package/dist/frontend/lowering/lower-node-module.js +302 -0
- package/dist/frontend/lowering/lower-node-module.js.map +1 -0
- package/dist/frontend/lowering/lower-server.js +1 -1
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +10 -28
- package/dist/frontend/lowering/lower-stmts.js +542 -259
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +4 -4
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +41 -38
- package/dist/frontend/lowering/lowerer.js +148 -62
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/optional-arguments.d.ts +9 -0
- package/dist/frontend/lowering/optional-arguments.js +57 -0
- package/dist/frontend/lowering/optional-arguments.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +5 -3
- package/dist/frontend/lowering/surfaces.js +33 -13
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/npm-static-declarations.d.ts +35 -0
- package/dist/frontend/npm-static-declarations.js +519 -0
- package/dist/frontend/npm-static-declarations.js.map +1 -0
- package/dist/frontend/npm-static-declarations.test.d.ts +1 -0
- package/dist/frontend/npm-static-declarations.test.js +132 -0
- package/dist/frontend/npm-static-declarations.test.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +2 -0
- package/dist/frontend/npm-static.js +26 -10
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.d.ts +60 -0
- package/dist/frontend/npm.js +38 -4
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/npm.test.d.ts +1 -0
- package/dist/frontend/npm.test.js +50 -0
- package/dist/frontend/npm.test.js.map +1 -0
- package/dist/frontend/program.d.ts +3 -2
- package/dist/frontend/program.js +513 -70
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/resolve.d.ts +26 -3
- package/dist/frontend/resolve.js +166 -29
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/resolve.test.js +24 -1
- package/dist/frontend/resolve.test.js.map +1 -1
- package/dist/frontend/runtime-resolve.d.ts +22 -0
- package/dist/frontend/runtime-resolve.js +101 -0
- package/dist/frontend/runtime-resolve.js.map +1 -0
- package/dist/frontend/runtime-resolve.test.d.ts +1 -0
- package/dist/frontend/runtime-resolve.test.js +18 -0
- package/dist/frontend/runtime-resolve.test.js.map +1 -0
- package/dist/frontend/ts7/adapter.js +12 -13
- package/dist/frontend/ts7/adapter.js.map +1 -1
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/census-check.js +3 -3
- package/dist/frontend/ts7/census-check.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +3 -0
- package/dist/frontend/ts7/checker.js +12 -3
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/enums.js.map +1 -1
- package/dist/frontend/ts7/program-adapter.js +42 -3
- package/dist/frontend/ts7/program-adapter.js.map +1 -1
- package/dist/frontend/type-mapper.js +171 -16
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.js +11 -5
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +1 -0
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/ir.d.ts +125 -52
- package/dist/ir/ir.js +136 -7
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +1 -1
- package/dist/ir/validate.js +120 -63
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/cache-primitives.js.map +1 -1
- package/dist/library/cache-reset.test.js.map +1 -1
- package/dist/library/compiler-self-identity.js.map +1 -1
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/int-infer.test.js.map +1 -1
- package/dist/library/library-cache.d.ts +1 -0
- package/dist/library/library-cache.js +1 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +18 -5
- package/dist/library/library-cache.test.js.map +1 -1
- package/dist/library/library-profile.js.map +1 -1
- package/dist/library/sidecar-validate.js.map +1 -1
- package/dist/library/sidecar.js.map +1 -1
- package/dist/startup-cache.js.map +1 -1
- package/dist/wasi-paths.js.map +1 -1
- package/package.json +18 -18
- package/surface-manifest.json +91 -20
package/dist/ir/validate.js
CHANGED
|
@@ -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 ===
|
|
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" ||
|
|
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
|
-
//
|
|
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
|
-
|
|
4894
|
-
|
|
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(
|
|
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 ${
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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");
|