@scriptc/compiler 0.1.7 → 0.2.1
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 +98 -39
- package/ambient/scriptc-overrides.d.ts +10 -6
- package/ambient/scriptc.d.ts +15 -0
- package/dist/backend/build-cache.d.ts +1 -3
- package/dist/backend/build-cache.js +3 -22
- package/dist/backend/build-cache.js.map +1 -1
- package/dist/backend/cache-root.d.ts +3 -0
- package/dist/backend/cache-root.js +23 -0
- package/dist/backend/cache-root.js.map +1 -0
- package/dist/backend/cycle-analysis.d.ts +15 -0
- package/dist/backend/cycle-analysis.js +108 -0
- package/dist/backend/cycle-analysis.js.map +1 -0
- package/dist/backend/cycle-analysis.test.js +124 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -0
- package/dist/backend/executable-features.d.ts +4 -0
- package/dist/backend/executable-features.js +42 -0
- package/dist/backend/executable-features.js.map +1 -0
- package/dist/backend/external-c.d.ts +5 -27
- package/dist/backend/external-c.js +5 -40
- package/dist/backend/external-c.js.map +1 -1
- package/dist/backend/ffi-callbacks.d.ts +2 -3
- package/dist/backend/ffi-callbacks.js +2 -3
- package/dist/backend/ffi-callbacks.js.map +1 -1
- package/dist/backend/library-identity-markers.d.ts +4 -9
- package/dist/backend/library-identity-markers.js +11 -49
- package/dist/backend/library-identity-markers.js.map +1 -1
- package/dist/backend/library-pack.d.ts +5 -0
- package/dist/backend/library-pack.js +123 -0
- package/dist/backend/library-pack.js.map +1 -0
- package/dist/backend/link-plan-core.d.ts +20 -0
- package/dist/backend/link-plan-core.js +18 -0
- package/dist/backend/link-plan-core.js.map +1 -0
- package/dist/backend/link-plan.d.ts +1 -1
- package/dist/backend/link-plan.js +16 -17
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/link-trace.d.ts +2 -0
- package/dist/backend/link-trace.js +24 -0
- package/dist/backend/link-trace.js.map +1 -0
- package/dist/backend/linker.js +1 -1
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/literals.d.ts +9 -0
- package/dist/backend/literals.js +35 -0
- package/dist/backend/literals.js.map +1 -0
- package/dist/backend/literals.test.d.ts +1 -0
- package/dist/backend/literals.test.js +53 -0
- package/dist/backend/literals.test.js.map +1 -0
- package/dist/backend/llvm/blocks.d.ts +2 -0
- package/dist/backend/llvm/blocks.js +9 -4
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/blocks.test.d.ts +1 -0
- package/dist/backend/llvm/blocks.test.js +91 -0
- package/dist/backend/llvm/blocks.test.js.map +1 -0
- package/dist/backend/llvm/classes.d.ts +14 -8
- package/dist/backend/llvm/classes.js +88 -30
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +5 -1
- package/dist/backend/llvm/common.js +45 -4
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/debug-info.js +2 -7
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/debug-info.test.d.ts +1 -0
- package/dist/backend/llvm/debug-info.test.js +110 -0
- package/dist/backend/llvm/debug-info.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +21 -2
- package/dist/backend/llvm/dyn.js +647 -251
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +596 -1
- package/dist/backend/llvm/emitter.js +769 -425
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.d.ts +1 -0
- package/dist/backend/llvm/emitter.test.js +179 -0
- package/dist/backend/llvm/emitter.test.js.map +1 -0
- package/dist/backend/llvm/expr-async.js +23 -14
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +2 -2
- package/dist/backend/llvm/expr-bytes.js +60 -31
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +1 -1
- package/dist/backend/llvm/expr-callbacks.js +25 -22
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +136 -35
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +1 -1
- package/dist/backend/llvm/expr-containers.js +43 -14
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +5 -260
- package/dist/backend/llvm/expr-control.js +10 -6
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.d.ts +1 -1
- package/dist/backend/llvm/expr-dispatch.js +2 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +78 -81
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-island.d.ts +1 -1
- package/dist/backend/llvm/expr-island.js +11 -7
- package/dist/backend/llvm/expr-island.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +62 -31
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +1 -1
- package/dist/backend/llvm/expr-records.d.ts +5 -1
- package/dist/backend/llvm/expr-records.js +54 -7
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +4 -4
- package/dist/backend/llvm/expr-stream-bridges.js +220 -131
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.d.ts +1 -0
- package/dist/backend/llvm/expr-stream-bridges.test.js +55 -0
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -0
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.js +12 -12
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/layouts.d.ts +19 -0
- package/dist/backend/llvm/layouts.js +12 -0
- package/dist/backend/llvm/layouts.js.map +1 -0
- package/dist/backend/llvm/lib-abi.d.ts +19 -0
- package/dist/backend/llvm/lib-abi.js +82 -0
- package/dist/backend/llvm/lib-abi.js.map +1 -0
- package/dist/backend/llvm/lib-connect.d.ts +2 -0
- package/dist/backend/llvm/lib-connect.js +51 -0
- package/dist/backend/llvm/lib-connect.js.map +1 -0
- package/dist/backend/llvm/lib-datagram.d.ts +2 -0
- package/dist/backend/llvm/lib-datagram.js +135 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -0
- package/dist/backend/llvm/lib-dispatch.js +50 -6
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +30 -18
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.d.ts +2 -0
- package/dist/backend/llvm/lib-http2.js +215 -0
- package/dist/backend/llvm/lib-http2.js.map +1 -0
- package/dist/backend/llvm/lib-lookup.d.ts +2 -0
- package/dist/backend/llvm/lib-lookup.js +39 -0
- package/dist/backend/llvm/lib-lookup.js.map +1 -0
- package/dist/backend/llvm/lib-network.js +25 -2
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +44 -19
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +162 -3
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +3 -2
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-test.d.ts +2 -0
- package/dist/backend/llvm/lib-test.js +34 -0
- package/dist/backend/llvm/lib-test.js.map +1 -0
- package/dist/backend/llvm/lib-tls.d.ts +2 -0
- package/dist/backend/llvm/lib-tls.js +82 -0
- package/dist/backend/llvm/lib-tls.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +10 -9
- package/dist/backend/llvm/shapes.js +42 -131
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/unsupported.d.ts +1 -0
- package/dist/backend/llvm/unsupported.js +1 -2
- package/dist/backend/llvm/unsupported.js.map +1 -1
- package/dist/backend/llvm/walkers.js +1 -7
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/mangle.d.ts +2 -2
- package/dist/backend/mangle.js +16 -5
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/{c/may-throw.d.ts → may-throw.d.ts} +1 -1
- package/dist/backend/{c/may-throw.js → may-throw.js} +51 -46
- package/dist/backend/may-throw.js.map +1 -0
- package/dist/backend/may-throw.test.d.ts +1 -0
- package/dist/backend/may-throw.test.js +58 -0
- package/dist/backend/may-throw.test.js.map +1 -0
- package/dist/backend/native-codegen-core.d.ts +22 -0
- package/dist/backend/native-codegen-core.js +44 -0
- package/dist/backend/native-codegen-core.js.map +1 -0
- package/dist/backend/native-codegen.d.ts +3 -19
- package/dist/backend/native-codegen.js +5 -44
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +2 -2
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +94 -0
- package/dist/backend/native-link-info-core.js +62 -0
- package/dist/backend/native-link-info-core.js.map +1 -0
- package/dist/backend/native-link-info.d.ts +3 -88
- package/dist/backend/native-link-info.js +12 -243
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-link-info.test.js +41 -146
- package/dist/backend/native-link-info.test.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +12 -30
- package/dist/backend/native-toolchain.js +83 -233
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +77 -5
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/native-tools.d.ts +24 -0
- package/dist/backend/native-tools.js +33 -0
- package/dist/backend/native-tools.js.map +1 -0
- package/dist/backend/object-localize.js +19 -8
- package/dist/backend/object-localize.js.map +1 -1
- package/dist/backend/object-localize.test.js +22 -0
- package/dist/backend/object-localize.test.js.map +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +101 -0
- package/dist/backend/runtime-pack-core.js +172 -0
- package/dist/backend/runtime-pack-core.js.map +1 -0
- package/dist/backend/runtime-pack-native.d.ts +21 -0
- package/dist/backend/runtime-pack-native.js +73 -0
- package/dist/backend/runtime-pack-native.js.map +1 -0
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack.d.ts +3 -83
- package/dist/backend/runtime-pack.js +8 -151
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +24 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.d.ts +22 -0
- package/dist/backend/target-diagnostics.js +108 -0
- package/dist/backend/target-diagnostics.js.map +1 -0
- package/dist/backend/target-platform.d.ts +15 -0
- package/dist/backend/target-platform.js +72 -0
- package/dist/backend/target-platform.js.map +1 -0
- package/dist/backend/targets.d.ts +13 -4
- package/dist/backend/targets.js +103 -34
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +72 -4
- package/dist/backend/targets.test.js.map +1 -1
- package/dist/backend/toolchain-environment.d.ts +6 -0
- package/dist/backend/toolchain-environment.js +99 -0
- package/dist/backend/toolchain-environment.js.map +1 -0
- package/dist/backend/vendor-archives.d.ts +1 -9
- package/dist/backend/vendor-archives.js +2 -9
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +9 -0
- package/dist/backend/vendor-inputs.js +10 -0
- package/dist/backend/vendor-inputs.js.map +1 -0
- package/dist/backend/warm-cache.d.ts +3 -0
- package/dist/backend/warm-cache.js +41 -0
- package/dist/backend/warm-cache.js.map +1 -0
- package/dist/cli/command.d.ts +3 -0
- package/dist/cli/command.js +328 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/host.d.ts +24 -0
- package/dist/cli/host.js +2 -0
- package/dist/cli/host.js.map +1 -0
- package/dist/cli/output-options.d.ts +26 -0
- package/dist/cli/output-options.js +60 -0
- package/dist/cli/output-options.js.map +1 -0
- package/dist/cli/paths.d.ts +12 -0
- package/dist/cli/paths.js +42 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/usage.d.ts +74 -0
- package/dist/cli/usage.js +86 -0
- package/dist/cli/usage.js.map +1 -0
- package/dist/cli/wasi-paths.d.ts +8 -0
- package/dist/cli/wasi-paths.js +41 -0
- package/dist/cli/wasi-paths.js.map +1 -0
- package/dist/cli/wasi-runner.d.ts +2 -0
- package/dist/cli/wasi-runner.js +28 -0
- package/dist/cli/wasi-runner.js.map +1 -0
- package/dist/compat/fetch-profile.js +37 -7
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +162 -0
- package/dist/compile-types.js +2 -0
- package/dist/compile-types.js.map +1 -0
- package/dist/coverage/report.js +11 -5
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +5 -2
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.js +5 -10
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +3 -4
- package/dist/executable/executable-cache.js +5 -6
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +16 -17
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.d.ts +14 -0
- package/dist/executable/prepare.js +66 -0
- package/dist/executable/prepare.js.map +1 -0
- package/dist/ffi/ffi-manifest.d.ts +11 -4
- package/dist/ffi/ffi-manifest.js +170 -58
- package/dist/ffi/ffi-manifest.js.map +1 -1
- package/dist/ffi/ffi-manifest.test.d.ts +1 -0
- package/dist/ffi/ffi-manifest.test.js +111 -0
- package/dist/ffi/ffi-manifest.test.js.map +1 -0
- package/dist/format-integer.d.ts +3 -0
- package/dist/format-integer.js +14 -0
- package/dist/format-integer.js.map +1 -0
- package/dist/frontend/analysis.d.ts +5 -0
- package/dist/frontend/analysis.js +88 -0
- package/dist/frontend/analysis.js.map +1 -0
- package/dist/frontend/arguments-usage.d.ts +1 -3
- package/dist/frontend/arguments-usage.js.map +1 -1
- package/dist/frontend/builtin-modules.d.ts +1 -1
- package/dist/frontend/builtin-modules.js +1 -1
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/cjs-lexer.d.ts +4 -25
- package/dist/frontend/cjs-lexer.js +6 -806
- package/dist/frontend/cjs-lexer.js.map +1 -1
- package/dist/frontend/cjs-resolve.d.ts +5 -0
- package/dist/frontend/cjs-resolve.js +429 -0
- package/dist/frontend/cjs-resolve.js.map +1 -0
- package/dist/frontend/cjs-syntax.d.ts +26 -0
- package/dist/frontend/cjs-syntax.js +806 -0
- package/dist/frontend/cjs-syntax.js.map +1 -0
- package/dist/frontend/comptime-node.d.ts +4 -0
- package/dist/frontend/comptime-node.js +16 -0
- package/dist/frontend/comptime-node.js.map +1 -0
- package/dist/frontend/comptime-node.test.d.ts +1 -0
- package/dist/frontend/comptime-node.test.js +37 -0
- package/dist/frontend/comptime-node.test.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +3 -4
- package/dist/frontend/dts-paths.js +15 -8
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/fork-target.js +2 -2
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/helper-tokens.d.ts +1 -0
- package/dist/frontend/helper-tokens.js +147 -0
- package/dist/frontend/helper-tokens.js.map +1 -0
- package/dist/frontend/helper-tokens.test.d.ts +1 -0
- package/dist/frontend/helper-tokens.test.js +35 -0
- package/dist/frontend/helper-tokens.test.js.map +1 -0
- package/dist/frontend/inferred-js-diagnostics.d.ts +5 -0
- package/dist/frontend/inferred-js-diagnostics.js +69 -0
- package/dist/frontend/inferred-js-diagnostics.js.map +1 -0
- package/dist/frontend/inferred-js-diagnostics.test.d.ts +1 -0
- package/dist/frontend/inferred-js-diagnostics.test.js +58 -0
- package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -0
- package/dist/frontend/input-tracker.d.ts +5 -2
- package/dist/frontend/input-tracker.js +24 -3
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +23 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lib-contract.js +32 -24
- package/dist/frontend/lib-contract.js.map +1 -1
- package/dist/frontend/literal-values.d.ts +4 -0
- package/dist/frontend/literal-values.js +21 -0
- package/dist/frontend/literal-values.js.map +1 -0
- package/dist/frontend/literal-values.test.d.ts +1 -0
- package/dist/frontend/literal-values.test.js +91 -0
- package/dist/frontend/literal-values.test.js.map +1 -0
- package/dist/frontend/lowering/abstract-equality.d.ts +1 -1
- package/dist/frontend/lowering/abstract-equality.js +3 -0
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.js +11 -6
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
- package/dist/frontend/lowering/array-values.d.ts +4 -1
- package/dist/frontend/lowering/array-values.js +43 -1
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/callback-arg.js +1 -0
- package/dist/frontend/lowering/callback-arg.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +12 -0
- package/dist/frontend/lowering/class-callbacks.js +74 -0
- package/dist/frontend/lowering/class-callbacks.js.map +1 -0
- package/dist/frontend/lowering/class-construction.d.ts +12 -0
- package/dist/frontend/lowering/class-construction.js +156 -0
- package/dist/frontend/lowering/class-construction.js.map +1 -0
- package/dist/frontend/lowering/class-descriptors.d.ts +10 -0
- package/dist/frontend/lowering/class-descriptors.js +114 -0
- package/dist/frontend/lowering/class-descriptors.js.map +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +51 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +1158 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.d.ts +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +93 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -0
- package/dist/frontend/lowering/class-instance-constructor.d.ts +7 -0
- package/dist/frontend/lowering/class-instance-constructor.js +67 -0
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -0
- package/dist/frontend/lowering/class-method-values.d.ts +13 -0
- package/dist/frontend/lowering/class-method-values.js +235 -0
- package/dist/frontend/lowering/class-method-values.js.map +1 -0
- package/dist/frontend/lowering/class-prototypes.d.ts +19 -0
- package/dist/frontend/lowering/class-prototypes.js +242 -0
- package/dist/frontend/lowering/class-prototypes.js.map +1 -0
- package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
- package/dist/frontend/lowering/class-runtime-statics.js +66 -0
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -0
- package/dist/frontend/lowering/class-static-data.d.ts +6 -0
- package/dist/frontend/lowering/class-static-data.js +56 -0
- package/dist/frontend/lowering/class-static-data.js.map +1 -0
- package/dist/frontend/lowering/containers/buffer-numeric-methods.d.ts +4 -0
- package/dist/frontend/lowering/containers/buffer-numeric-methods.js +26 -0
- package/dist/frontend/lowering/containers/buffer-numeric-methods.js.map +1 -0
- package/dist/frontend/lowering/containers/bytes.d.ts +11 -7
- package/dist/frontend/lowering/containers/bytes.js +208 -163
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +2 -2
- package/dist/frontend/lowering/containers/string-and-regexp.js +58 -63
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.d.ts +7 -0
- package/dist/frontend/lowering/containers/string-replacement.js +217 -0
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -0
- package/dist/frontend/lowering/error-methods.d.ts +14 -0
- package/dist/frontend/lowering/error-methods.js +177 -0
- package/dist/frontend/lowering/error-methods.js.map +1 -0
- package/dist/frontend/lowering/expressions/global-symbols.d.ts +6 -0
- package/dist/frontend/lowering/expressions/global-symbols.js +11 -0
- package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -0
- package/dist/frontend/lowering/expressions/native-proxy.d.ts +7 -0
- package/dist/frontend/lowering/expressions/native-proxy.js +51 -0
- package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.d.ts +6 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.js +132 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -0
- package/dist/frontend/lowering/expressions/object-literals.d.ts +8 -8
- package/dist/frontend/lowering/expressions/object-literals.js +509 -183
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -4
- package/dist/frontend/lowering/expressions/optional-chains.js +88 -24
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/try-lower-expression.js +1 -0
- package/dist/frontend/lowering/expressions/try-lower-expression.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-field-write.d.ts +8 -0
- package/dist/frontend/lowering/expressions/union-field-write.js +71 -0
- package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -0
- package/dist/frontend/lowering/function-context.d.ts +101 -0
- package/dist/frontend/lowering/function-context.js +109 -0
- package/dist/frontend/lowering/function-context.js.map +1 -0
- package/dist/frontend/lowering/generator-delegation.d.ts +7 -0
- package/dist/frontend/lowering/generator-delegation.js +85 -0
- package/dist/frontend/lowering/generator-delegation.js.map +1 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +11 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +143 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -0
- package/dist/frontend/lowering/lib-boundary.d.ts +4 -1
- package/dist/frontend/lowering/lib-boundary.js +112 -20
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.test.d.ts +1 -0
- package/dist/frontend/lowering/lib-boundary.test.js +45 -0
- package/dist/frontend/lowering/lib-boundary.test.js.map +1 -0
- package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
- package/dist/frontend/lowering/lower-assert.d.ts +1 -1
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.d.ts +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.d.ts +18 -0
- package/dist/frontend/lowering/lower-builtin-values.js +249 -0
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.d.ts +33 -46
- package/dist/frontend/lowering/lower-builtins.js +676 -365
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +28 -22
- package/dist/frontend/lowering/lower-calls.js +1660 -412
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +95 -57
- package/dist/frontend/lowering/lower-classes.js +1491 -404
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
- package/dist/frontend/lowering/lower-comptime.js +23 -32
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.d.ts +36 -32
- package/dist/frontend/lowering/lower-containers.js +925 -181
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.d.ts +1 -1
- package/dist/frontend/lowering/lower-dgram.js +3 -2
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-enums.d.ts +1 -1
- package/dist/frontend/lowering/lower-enums.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +30 -1
- package/dist/frontend/lowering/lower-event-emitter.js +58 -26
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-expando.d.ts +7 -1
- package/dist/frontend/lowering/lower-expando.js +14 -6
- package/dist/frontend/lowering/lower-expando.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +37 -13
- package/dist/frontend/lowering/lower-exprs.js +2163 -863
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +2 -5
- package/dist/frontend/lowering/lower-generators.js +88 -46
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.d.ts +7 -0
- package/dist/frontend/lowering/lower-global-value.js +17 -0
- package/dist/frontend/lowering/lower-global-value.js.map +1 -0
- package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
- package/dist/frontend/lowering/lower-inspect.js +17 -8
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +7 -8
- package/dist/frontend/lowering/lower-island.js +66 -33
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.d.ts +2 -2
- package/dist/frontend/lowering/lower-mixins.js +5 -3
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +1 -1
- package/dist/frontend/lowering/lower-modules.js +445 -39
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-modules.test.js +39 -0
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -0
- package/dist/frontend/lowering/lower-namespaces.d.ts +1 -1
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-module.d.ts +1 -1
- package/dist/frontend/lowering/lower-node-module.js +13 -10
- package/dist/frontend/lowering/lower-node-module.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +1 -1
- package/dist/frontend/lowering/lower-server.js +6 -10
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +17 -17
- package/dist/frontend/lowering/lower-stmts.js +855 -514
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +1 -1
- package/dist/frontend/lowering/lower-stream.js +20 -11
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-test.d.ts +1 -1
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lower-url.d.ts +6 -0
- package/dist/frontend/lowering/lower-url.js +77 -0
- package/dist/frontend/lowering/lower-url.js.map +1 -0
- package/dist/frontend/lowering/lowerer.d.ts +140 -190
- package/dist/frontend/lowering/lowerer.js +1193 -712
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.d.ts +1 -0
- package/dist/frontend/lowering/lowerer.test.js +172 -0
- package/dist/frontend/lowering/lowerer.test.js.map +1 -0
- package/dist/frontend/lowering/native-ffi.d.ts +5 -0
- package/dist/frontend/lowering/native-ffi.js +40 -0
- package/dist/frontend/lowering/native-ffi.js.map +1 -0
- package/dist/frontend/lowering/object-enumeration-receiver.d.ts +7 -0
- package/dist/frontend/lowering/object-enumeration-receiver.js +33 -0
- package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -0
- package/dist/frontend/lowering/object-factory-new.d.ts +8 -0
- package/dist/frontend/lowering/object-factory-new.js +68 -0
- package/dist/frontend/lowering/object-factory-new.js.map +1 -0
- package/dist/frontend/lowering/optional-arguments.js +6 -1
- package/dist/frontend/lowering/optional-arguments.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.js +2 -1
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-locals.d.ts +14 -0
- package/dist/frontend/lowering/runtime-optional-locals.js +41 -0
- package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-locals.test.d.ts +1 -0
- package/dist/frontend/lowering/runtime-optional-locals.test.js +85 -0
- package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -0
- package/dist/frontend/lowering/sanitize-class-types.d.ts +8 -0
- package/dist/frontend/lowering/sanitize-class-types.js +79 -0
- package/dist/frontend/lowering/sanitize-class-types.js.map +1 -0
- package/dist/frontend/lowering/sanitize-class-types.test.d.ts +1 -0
- package/dist/frontend/lowering/sanitize-class-types.test.js +60 -0
- package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -0
- package/dist/frontend/lowering/static-this.d.ts +5 -1
- package/dist/frontend/lowering/static-this.js +28 -2
- package/dist/frontend/lowering/static-this.js.map +1 -1
- package/dist/frontend/lowering/string-index.d.ts +7 -0
- package/dist/frontend/lowering/string-index.js +39 -0
- package/dist/frontend/lowering/string-index.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +10 -3
- package/dist/frontend/lowering/surfaces.js +86 -37
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/symbol-fields.d.ts +22 -0
- package/dist/frontend/lowering/symbol-fields.js +183 -0
- package/dist/frontend/lowering/symbol-fields.js.map +1 -0
- package/dist/frontend/lowering/symbol-methods.d.ts +7 -0
- package/dist/frontend/lowering/symbol-methods.js +30 -0
- package/dist/frontend/lowering/symbol-methods.js.map +1 -0
- package/dist/frontend/lowering/text-decoder-encoding.d.ts +12 -0
- package/dist/frontend/lowering/text-decoder-encoding.js +82 -0
- package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -0
- package/dist/frontend/lowering/text-decoder-encoding.test.d.ts +1 -0
- package/dist/frontend/lowering/text-decoder-encoding.test.js +38 -0
- package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -0
- package/dist/frontend/lowering/union-narrow.d.ts +9 -0
- package/dist/frontend/lowering/union-narrow.js +59 -0
- package/dist/frontend/lowering/union-narrow.js.map +1 -0
- package/dist/frontend/lowering/union-narrow.test.d.ts +1 -0
- package/dist/frontend/lowering/union-narrow.test.js +72 -0
- package/dist/frontend/lowering/union-narrow.test.js.map +1 -0
- package/dist/frontend/lowering/union-retag.d.ts +43 -0
- package/dist/frontend/lowering/union-retag.js +259 -0
- package/dist/frontend/lowering/union-retag.js.map +1 -0
- package/dist/frontend/lowering/union-retag.test.d.ts +1 -0
- package/dist/frontend/lowering/union-retag.test.js +405 -0
- package/dist/frontend/lowering/union-retag.test.js.map +1 -0
- package/dist/frontend/lowering/unregistered-class-types.d.ts +14 -0
- package/dist/frontend/lowering/unregistered-class-types.js +94 -0
- package/dist/frontend/lowering/unregistered-class-types.js.map +1 -0
- package/dist/frontend/lowering/unregistered-class-types.test.d.ts +1 -0
- package/dist/frontend/lowering/unregistered-class-types.test.js +65 -0
- package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -0
- package/dist/frontend/lowering/width-lift.d.ts +40 -0
- package/dist/frontend/lowering/width-lift.js +2 -0
- package/dist/frontend/lowering/width-lift.js.map +1 -0
- package/dist/frontend/module-syntax.d.ts +58 -0
- package/dist/frontend/module-syntax.js +123 -0
- package/dist/frontend/module-syntax.js.map +1 -0
- package/dist/frontend/module-syntax.test.d.ts +1 -0
- package/dist/frontend/module-syntax.test.js +78 -0
- package/dist/frontend/module-syntax.test.js.map +1 -0
- package/dist/frontend/npm-fetch-analysis.d.ts +17 -0
- package/dist/frontend/npm-fetch-analysis.js +100 -0
- package/dist/frontend/npm-fetch-analysis.js.map +1 -0
- package/dist/frontend/npm-fetch-analysis.test.d.ts +1 -0
- package/dist/frontend/npm-fetch-analysis.test.js +107 -0
- package/dist/frontend/npm-fetch-analysis.test.js.map +1 -0
- package/dist/frontend/npm-fetch-node.d.ts +2 -0
- package/dist/frontend/npm-fetch-node.js +12 -0
- package/dist/frontend/npm-fetch-node.js.map +1 -0
- package/dist/frontend/npm-fetch-syntax.d.ts +6 -0
- package/dist/frontend/npm-fetch-syntax.js +207 -0
- package/dist/frontend/npm-fetch-syntax.js.map +1 -0
- package/dist/frontend/npm-node.d.ts +10 -0
- package/dist/frontend/npm-node.js +14 -0
- package/dist/frontend/npm-node.js.map +1 -0
- package/dist/frontend/npm-static-bundled-cjs.d.ts +8 -0
- package/dist/frontend/npm-static-bundled-cjs.js +236 -0
- package/dist/frontend/npm-static-bundled-cjs.js.map +1 -0
- package/dist/frontend/npm-static-bundled-cjs.test.d.ts +1 -0
- package/dist/frontend/npm-static-bundled-cjs.test.js +69 -0
- package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -0
- package/dist/frontend/npm-static-declaration-syntax.d.ts +57 -0
- package/dist/frontend/npm-static-declaration-syntax.js +944 -0
- package/dist/frontend/npm-static-declaration-syntax.js.map +1 -0
- package/dist/frontend/npm-static-declarations.d.ts +11 -39
- package/dist/frontend/npm-static-declarations.js +22 -561
- package/dist/frontend/npm-static-declarations.js.map +1 -1
- package/dist/frontend/npm-static-declarations.test.js +245 -6
- package/dist/frontend/npm-static-declarations.test.js.map +1 -1
- package/dist/frontend/npm-static-prune.d.ts +1 -1
- package/dist/frontend/npm-static-prune.js +121 -38
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-prune.test.js +9 -1
- package/dist/frontend/npm-static-prune.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-host.d.ts +4 -0
- package/dist/frontend/npm-static-rewrite-host.js +179 -0
- package/dist/frontend/npm-static-rewrite-host.js.map +1 -0
- package/dist/frontend/npm-static-rewrite-syntax.d.ts +16 -0
- package/dist/frontend/npm-static-rewrite-syntax.js +905 -0
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -0
- package/dist/frontend/npm-static-rewrite.d.ts +0 -5
- package/dist/frontend/npm-static-rewrite.js +2 -1079
- package/dist/frontend/npm-static-rewrite.js.map +1 -1
- package/dist/frontend/npm-static-subtyping.d.ts +5 -0
- package/dist/frontend/npm-static-subtyping.js +55 -0
- package/dist/frontend/npm-static-subtyping.js.map +1 -0
- package/dist/frontend/npm-static-subtyping.test.d.ts +1 -0
- package/dist/frontend/npm-static-subtyping.test.js +58 -0
- package/dist/frontend/npm-static-subtyping.test.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +7 -15
- package/dist/frontend/npm-static.js +19 -28
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.d.ts +8 -69
- package/dist/frontend/npm.js +21 -361
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/npm.test.js +2 -2
- package/dist/frontend/npm.test.js.map +1 -1
- package/dist/frontend/pipeline-native.d.ts +6 -0
- package/dist/frontend/pipeline-native.js +32 -0
- package/dist/frontend/pipeline-native.js.map +1 -0
- package/dist/frontend/pipeline.d.ts +54 -0
- package/dist/frontend/pipeline.js +382 -0
- package/dist/frontend/pipeline.js.map +1 -0
- package/dist/frontend/pipeline.test.d.ts +1 -0
- package/dist/frontend/pipeline.test.js +77 -0
- package/dist/frontend/pipeline.test.js.map +1 -0
- package/dist/frontend/program-analysis.d.ts +10 -0
- package/dist/frontend/program-analysis.js +14 -0
- package/dist/frontend/program-analysis.js.map +1 -0
- package/dist/frontend/program-node.d.ts +9 -0
- package/dist/frontend/program-node.js +48 -0
- package/dist/frontend/program-node.js.map +1 -0
- package/dist/frontend/program.d.ts +39 -20
- package/dist/frontend/program.js +393 -189
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +105 -2
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/provenance-core.d.ts +9 -0
- package/dist/frontend/provenance-core.js +435 -0
- package/dist/frontend/provenance-core.js.map +1 -0
- package/dist/frontend/provenance.d.ts +0 -4
- package/dist/frontend/provenance.js +4 -459
- package/dist/frontend/provenance.js.map +1 -1
- package/dist/frontend/resolve.d.ts +3 -1
- package/dist/frontend/resolve.js +6 -3
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/runtime-resolve.d.ts +4 -3
- package/dist/frontend/runtime-resolve.js +22 -18
- package/dist/frontend/runtime-resolve.js.map +1 -1
- package/dist/frontend/runtime-resolve.test.js +53 -0
- package/dist/frontend/runtime-resolve.test.js.map +1 -1
- package/dist/frontend/services-node.d.ts +5 -0
- package/dist/frontend/services-node.js +19 -0
- package/dist/frontend/services-node.js.map +1 -0
- package/dist/frontend/services-node.test.d.ts +1 -0
- package/dist/frontend/services-node.test.js +70 -0
- package/dist/frontend/services-node.test.js.map +1 -0
- package/dist/frontend/services.d.ts +44 -0
- package/dist/frontend/services.js +90 -0
- package/dist/frontend/services.js.map +1 -0
- package/dist/frontend/services.test.d.ts +1 -0
- package/dist/frontend/services.test.js +174 -0
- package/dist/frontend/services.test.js.map +1 -0
- package/dist/frontend/ts7/adapter.d.ts +3 -3
- package/dist/frontend/ts7/adapter.js +14 -31
- package/dist/frontend/ts7/adapter.js.map +1 -1
- package/dist/frontend/ts7/api.d.ts +16 -0
- package/dist/frontend/ts7/api.js +24 -0
- package/dist/frontend/ts7/api.js.map +1 -0
- package/dist/frontend/ts7/ast-bytes.d.ts +31 -0
- package/dist/frontend/ts7/ast-bytes.js +137 -0
- package/dist/frontend/ts7/ast-bytes.js.map +1 -0
- package/dist/frontend/ts7/ast-bytes.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-bytes.test.js +73 -0
- package/dist/frontend/ts7/ast-bytes.test.js.map +1 -0
- package/dist/frontend/ts7/ast-guards.generated.d.ts +353 -0
- package/dist/frontend/ts7/ast-guards.generated.js +1951 -0
- package/dist/frontend/ts7/ast-guards.generated.js.map +1 -0
- package/dist/frontend/ts7/ast-guards.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-guards.test.js +43 -0
- package/dist/frontend/ts7/ast-guards.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +194 -0
- package/dist/frontend/ts7/ast-node.js +448 -0
- package/dist/frontend/ts7/ast-node.js.map +1 -0
- package/dist/frontend/ts7/ast-node.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-node.test.js +266 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -0
- package/dist/frontend/ts7/ast-schema.generated.d.ts +503 -0
- package/dist/frontend/ts7/ast-schema.generated.js +1446 -0
- package/dist/frontend/ts7/ast-schema.generated.js.map +1 -0
- package/dist/frontend/ts7/ast-text.d.ts +6 -0
- package/dist/frontend/ts7/ast-text.js +124 -0
- package/dist/frontend/ts7/ast-text.js.map +1 -0
- package/dist/frontend/ts7/ast-text.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-text.test.js +38 -0
- package/dist/frontend/ts7/ast-text.test.js.map +1 -0
- package/dist/frontend/ts7/ast-tokens.generated.d.ts +2 -0
- package/dist/frontend/ts7/ast-tokens.generated.js +155 -0
- package/dist/frontend/ts7/ast-tokens.generated.js.map +1 -0
- package/dist/frontend/ts7/ast-types.d.ts +42 -0
- package/dist/frontend/ts7/ast-types.generated.d.ts +1615 -0
- package/dist/frontend/ts7/ast-types.generated.js +5 -0
- package/dist/frontend/ts7/ast-types.generated.js.map +1 -0
- package/dist/frontend/ts7/ast-types.js +3 -0
- package/dist/frontend/ts7/ast-types.js.map +1 -0
- package/dist/frontend/ts7/ast-wire.d.ts +58 -0
- package/dist/frontend/ts7/ast-wire.js +267 -0
- package/dist/frontend/ts7/ast-wire.js.map +1 -0
- package/dist/frontend/ts7/ast-wire.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-wire.test.js +151 -0
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -0
- package/dist/frontend/ts7/ast.d.ts +14 -14
- package/dist/frontend/ts7/ast.js +25 -18
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/census-check.js +1 -0
- package/dist/frontend/ts7/census-check.js.map +1 -1
- package/dist/frontend/ts7/checker-cache.d.ts +48 -0
- package/dist/frontend/ts7/checker-cache.js +92 -0
- package/dist/frontend/ts7/checker-cache.js.map +1 -0
- package/dist/frontend/ts7/checker.d.ts +19 -46
- package/dist/frontend/ts7/checker.js +231 -161
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.d.ts +1 -0
- package/dist/frontend/ts7/checker.test.js +335 -0
- package/dist/frontend/ts7/checker.test.js.map +1 -0
- package/dist/frontend/ts7/enums.d.ts +4 -27
- package/dist/frontend/ts7/enums.generated.d.ts +878 -0
- package/dist/frontend/ts7/enums.generated.js +1313 -0
- package/dist/frontend/ts7/enums.generated.js.map +1 -0
- package/dist/frontend/ts7/enums.js +4 -45
- package/dist/frontend/ts7/enums.js.map +1 -1
- package/dist/frontend/ts7/enums.test.d.ts +1 -0
- package/dist/frontend/ts7/enums.test.js +48 -0
- package/dist/frontend/ts7/enums.test.js.map +1 -0
- package/dist/frontend/ts7/native-api.d.ts +10 -0
- package/dist/frontend/ts7/native-api.js +10 -0
- package/dist/frontend/ts7/native-api.js.map +1 -0
- package/dist/frontend/ts7/native-host.d.ts +2 -0
- package/dist/frontend/ts7/native-host.js +11 -0
- package/dist/frontend/ts7/native-host.js.map +1 -0
- package/dist/frontend/ts7/native-process.d.ts +14 -0
- package/dist/frontend/ts7/native-process.js +62 -0
- package/dist/frontend/ts7/native-process.js.map +1 -0
- package/dist/frontend/ts7/program-adapter.d.ts +10 -98
- package/dist/frontend/ts7/program-adapter.js +16 -310
- package/dist/frontend/ts7/program-adapter.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +115 -0
- package/dist/frontend/ts7/program-host.js +347 -0
- package/dist/frontend/ts7/program-host.js.map +1 -0
- package/dist/frontend/ts7/program-host.test.d.ts +1 -0
- package/dist/frontend/ts7/program-host.test.js +207 -0
- package/dist/frontend/ts7/program-host.test.js.map +1 -0
- package/dist/frontend/ts7/rpc-api.d.ts +12 -0
- package/dist/frontend/ts7/rpc-api.js +23 -0
- package/dist/frontend/ts7/rpc-api.js.map +1 -0
- package/dist/frontend/ts7/rpc-client.d.ts +27 -0
- package/dist/frontend/ts7/rpc-client.js +102 -0
- package/dist/frontend/ts7/rpc-client.js.map +1 -0
- package/dist/frontend/ts7/rpc-client.test.d.ts +1 -0
- package/dist/frontend/ts7/rpc-client.test.js +133 -0
- package/dist/frontend/ts7/rpc-client.test.js.map +1 -0
- package/dist/frontend/ts7/rpc-filesystem.d.ts +16 -0
- package/dist/frontend/ts7/rpc-filesystem.js +42 -0
- package/dist/frontend/ts7/rpc-filesystem.js.map +1 -0
- package/dist/frontend/ts7/rpc-filesystem.test.d.ts +1 -0
- package/dist/frontend/ts7/rpc-filesystem.test.js +89 -0
- package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -0
- package/dist/frontend/ts7/rpc-process.d.ts +2 -0
- package/dist/frontend/ts7/rpc-process.js +148 -0
- package/dist/frontend/ts7/rpc-process.js.map +1 -0
- package/dist/frontend/ts7/rpc-process.test.d.ts +1 -0
- package/dist/frontend/ts7/rpc-process.test.js +29 -0
- package/dist/frontend/ts7/rpc-process.test.js.map +1 -0
- package/dist/frontend/ts7/rpc-wire.d.ts +46 -0
- package/dist/frontend/ts7/rpc-wire.js +195 -0
- package/dist/frontend/ts7/rpc-wire.js.map +1 -0
- package/dist/frontend/ts7/rpc-wire.test.d.ts +1 -0
- package/dist/frontend/ts7/rpc-wire.test.js +168 -0
- package/dist/frontend/ts7/rpc-wire.test.js.map +1 -0
- package/dist/frontend/ts7/semantic-checker.d.ts +137 -0
- package/dist/frontend/ts7/semantic-checker.js +221 -0
- package/dist/frontend/ts7/semantic-checker.js.map +1 -0
- package/dist/frontend/ts7/semantic-checker.test.d.ts +1 -0
- package/dist/frontend/ts7/semantic-checker.test.js +119 -0
- package/dist/frontend/ts7/semantic-checker.test.js.map +1 -0
- package/dist/frontend/ts7/semantic-json.d.ts +5 -0
- package/dist/frontend/ts7/semantic-json.js +47 -0
- package/dist/frontend/ts7/semantic-json.js.map +1 -0
- package/dist/frontend/ts7/semantic-json.test.d.ts +1 -0
- package/dist/frontend/ts7/semantic-json.test.js +42 -0
- package/dist/frontend/ts7/semantic-json.test.js.map +1 -0
- package/dist/frontend/ts7/semantic-model.d.ts +222 -0
- package/dist/frontend/ts7/semantic-model.js +423 -0
- package/dist/frontend/ts7/semantic-model.js.map +1 -0
- package/dist/frontend/ts7/semantic-model.test.d.ts +1 -0
- package/dist/frontend/ts7/semantic-model.test.js +322 -0
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -0
- package/dist/frontend/ts7/semantic-schema.generated.d.ts +283 -0
- package/dist/frontend/ts7/semantic-schema.generated.js +222 -0
- package/dist/frontend/ts7/semantic-schema.generated.js.map +1 -0
- package/dist/frontend/ts7/semantic-types.d.ts +5 -0
- package/dist/frontend/ts7/semantic-types.js +2 -0
- package/dist/frontend/ts7/semantic-types.js.map +1 -0
- package/dist/frontend/ts7/session-cache.d.ts +17 -0
- package/dist/frontend/ts7/session-cache.js +97 -0
- package/dist/frontend/ts7/session-cache.js.map +1 -0
- package/dist/frontend/ts7/session-cache.test.d.ts +1 -0
- package/dist/frontend/ts7/session-cache.test.js +87 -0
- package/dist/frontend/ts7/session-cache.test.js.map +1 -0
- package/dist/frontend/ts7/session-path.d.ts +18 -0
- package/dist/frontend/ts7/session-path.js +203 -0
- package/dist/frontend/ts7/session-path.js.map +1 -0
- package/dist/frontend/ts7/session-path.test.d.ts +1 -0
- package/dist/frontend/ts7/session-path.test.js +34 -0
- package/dist/frontend/ts7/session-path.test.js.map +1 -0
- package/dist/frontend/ts7/session-schema.generated.d.ts +167 -0
- package/dist/frontend/ts7/session-schema.generated.js +5 -0
- package/dist/frontend/ts7/session-schema.generated.js.map +1 -0
- package/dist/frontend/ts7/session-timing.d.ts +50 -0
- package/dist/frontend/ts7/session-timing.js +61 -0
- package/dist/frontend/ts7/session-timing.js.map +1 -0
- package/dist/frontend/ts7/session-timing.test.d.ts +1 -0
- package/dist/frontend/ts7/session-timing.test.js +52 -0
- package/dist/frontend/ts7/session-timing.test.js.map +1 -0
- package/dist/frontend/ts7/session.d.ts +105 -0
- package/dist/frontend/ts7/session.js +233 -0
- package/dist/frontend/ts7/session.js.map +1 -0
- package/dist/frontend/ts7/session.test.d.ts +1 -0
- package/dist/frontend/ts7/session.test.js +215 -0
- package/dist/frontend/ts7/session.test.js.map +1 -0
- package/dist/frontend/ts7/source-parser-node.d.ts +6 -0
- package/dist/frontend/ts7/source-parser-node.js +15 -0
- package/dist/frontend/ts7/source-parser-node.js.map +1 -0
- package/dist/frontend/ts7/source-parser.d.ts +25 -0
- package/dist/frontend/ts7/source-parser.js +96 -0
- package/dist/frontend/ts7/source-parser.js.map +1 -0
- package/dist/frontend/ts7/source-parser.test.d.ts +1 -0
- package/dist/frontend/ts7/source-parser.test.js +151 -0
- package/dist/frontend/ts7/source-parser.test.js.map +1 -0
- package/dist/frontend/ts7/syntax.d.ts +3 -0
- package/dist/frontend/ts7/syntax.js +4 -0
- package/dist/frontend/ts7/syntax.js.map +1 -0
- package/dist/frontend/tsc-codes.js +3 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +34 -18
- package/dist/frontend/type-mapper.js +552 -131
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +146 -2
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend/union-discriminants.d.ts +16 -0
- package/dist/frontend/union-discriminants.js +98 -0
- package/dist/frontend/union-discriminants.js.map +1 -0
- package/dist/frontend/union-discriminants.test.d.ts +1 -0
- package/dist/frontend/union-discriminants.test.js +182 -0
- package/dist/frontend/union-discriminants.test.js.map +1 -0
- package/dist/index.d.ts +7 -198
- package/dist/index.js +369 -1572
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +16 -4
- package/dist/ir/analysis.js +23 -4
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/analysis.test.js +15 -2
- package/dist/ir/analysis.test.js.map +1 -1
- package/dist/ir/constant-tables.js +67 -49
- package/dist/ir/constant-tables.js.map +1 -1
- package/dist/ir/constant-tables.test.js +1 -1
- package/dist/ir/control-flow.d.ts +6 -0
- package/dist/ir/control-flow.js +142 -0
- package/dist/ir/control-flow.js.map +1 -0
- package/dist/ir/control-flow.test.d.ts +1 -0
- package/dist/ir/control-flow.test.js +113 -0
- package/dist/ir/control-flow.test.js.map +1 -0
- package/dist/ir/integer-loops.js +7 -18
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-ranges.js +53 -27
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/ir.d.ts +334 -176
- package/dist/ir/ir.js +710 -903
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +162 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/scalar-records.js +165 -134
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/scalar-records.test.js +1 -1
- package/dist/ir/serialize.d.ts +4 -2
- package/dist/ir/serialize.js +33 -14
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.d.ts +1 -0
- package/dist/ir/serialize.test.js +57 -0
- package/dist/ir/serialize.test.js.map +1 -0
- package/dist/ir/traverse.d.ts +41 -0
- package/dist/ir/traverse.js +660 -0
- package/dist/ir/traverse.js.map +1 -0
- package/dist/ir/traverse.test.d.ts +1 -0
- package/dist/ir/traverse.test.js +242 -0
- package/dist/ir/traverse.test.js.map +1 -0
- package/dist/ir/validate.js +2018 -1498
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +536 -2
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/cache-primitives.d.ts +2 -3
- package/dist/library/cache-primitives.js +4 -6
- package/dist/library/cache-primitives.js.map +1 -1
- package/dist/library/fence-eval.js +2 -2
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/int-infer.js +7 -6
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/library-cache.d.ts +3 -2
- package/dist/library/library-cache.js +5 -17
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +54 -41
- package/dist/library/library-cache.test.js.map +1 -1
- package/dist/library/library-profile.d.ts +3 -1
- package/dist/library/library-profile.js +15 -6
- package/dist/library/library-profile.js.map +1 -1
- package/dist/library/prepare.d.ts +15 -0
- package/dist/library/prepare.js +584 -0
- package/dist/library/prepare.js.map +1 -0
- package/dist/library/semantic-source.d.ts +1 -1
- package/dist/library/semantic-source.js +8 -6
- package/dist/library/semantic-source.js.map +1 -1
- package/dist/library/sidecar-validate.js +4 -4
- package/dist/library/sidecar-validate.js.map +1 -1
- package/dist/library/sidecar.d.ts +2 -0
- package/dist/library/sidecar.js +10 -3
- package/dist/library/sidecar.js.map +1 -1
- package/dist/native/cache.d.ts +11 -0
- package/dist/native/cache.js +113 -0
- package/dist/native/cache.js.map +1 -0
- package/dist/native/cache.test.d.ts +1 -0
- package/dist/native/cache.test.js +66 -0
- package/dist/native/cache.test.js.map +1 -0
- package/dist/native/cli.d.ts +1 -0
- package/dist/native/cli.js +112 -0
- package/dist/native/cli.js.map +1 -0
- package/dist/native/compiler.d.ts +15 -0
- package/dist/native/compiler.js +336 -0
- package/dist/native/compiler.js.map +1 -0
- package/dist/native/compiler.test.d.ts +1 -0
- package/dist/native/compiler.test.js +174 -0
- package/dist/native/compiler.test.js.map +1 -0
- package/dist/native/comptime.d.ts +5 -0
- package/dist/native/comptime.js +73 -0
- package/dist/native/comptime.js.map +1 -0
- package/dist/native/comptime.test.d.ts +1 -0
- package/dist/native/comptime.test.js +65 -0
- package/dist/native/comptime.test.js.map +1 -0
- package/dist/native/executable-cache.d.ts +26 -0
- package/dist/native/executable-cache.js +228 -0
- package/dist/native/executable-cache.js.map +1 -0
- package/dist/native/executable-cache.test.d.ts +1 -0
- package/dist/native/executable-cache.test.js +151 -0
- package/dist/native/executable-cache.test.js.map +1 -0
- package/dist/native/file-identity.d.ts +4 -0
- package/dist/native/file-identity.js +14 -0
- package/dist/native/file-identity.js.map +1 -0
- package/dist/native/file-identity.test.d.ts +1 -0
- package/dist/native/file-identity.test.js +43 -0
- package/dist/native/file-identity.test.js.map +1 -0
- package/dist/native/library.d.ts +22 -0
- package/dist/native/library.js +83 -0
- package/dist/native/library.js.map +1 -0
- package/dist/native/prepare.d.ts +21 -0
- package/dist/native/prepare.js +174 -0
- package/dist/native/prepare.js.map +1 -0
- package/dist/native/prepare.test.d.ts +1 -0
- package/dist/native/prepare.test.js +70 -0
- package/dist/native/prepare.test.js.map +1 -0
- package/dist/native/sanitizer.d.ts +11 -0
- package/dist/native/sanitizer.js +137 -0
- package/dist/native/sanitizer.js.map +1 -0
- package/dist/native/sanitizer.test.d.ts +1 -0
- package/dist/native/sanitizer.test.js +58 -0
- package/dist/native/sanitizer.test.js.map +1 -0
- package/dist/native/task.d.ts +4 -0
- package/dist/native/task.js +16 -0
- package/dist/native/task.js.map +1 -0
- package/dist/native/task.test.d.ts +1 -0
- package/dist/native/task.test.js +17 -0
- package/dist/native/task.test.js.map +1 -0
- package/dist/native/toolchain.d.ts +45 -0
- package/dist/native/toolchain.js +94 -0
- package/dist/native/toolchain.js.map +1 -0
- package/dist/native/toolchain.test.d.ts +1 -0
- package/dist/native/toolchain.test.js +85 -0
- package/dist/native/toolchain.test.js.map +1 -0
- package/dist/startup-cache.d.ts +1 -1
- package/dist/startup-cache.js +2 -5
- package/dist/startup-cache.js.map +1 -1
- package/dist/timing.d.ts +4 -0
- package/dist/timing.js +19 -0
- package/dist/timing.js.map +1 -0
- package/dist/wasi-paths.js +10 -7
- package/dist/wasi-paths.js.map +1 -1
- package/package.json +28 -19
- package/surface-manifest.json +107 -98
- package/dist/backend/c/async.d.ts +0 -171
- package/dist/backend/c/async.js +0 -1317
- package/dist/backend/c/async.js.map +0 -1
- package/dist/backend/c/c-emitter.d.ts +0 -536
- package/dist/backend/c/c-emitter.js +0 -1932
- package/dist/backend/c/c-emitter.js.map +0 -1
- package/dist/backend/c/exprs.d.ts +0 -15
- package/dist/backend/c/exprs.js +0 -8847
- package/dist/backend/c/exprs.js.map +0 -1
- package/dist/backend/c/island.d.ts +0 -45
- package/dist/backend/c/island.js +0 -281
- package/dist/backend/c/island.js.map +0 -1
- package/dist/backend/c/may-throw.js.map +0 -1
- package/dist/backend/c/shapes.d.ts +0 -142
- package/dist/backend/c/shapes.js +0 -603
- package/dist/backend/c/shapes.js.map +0 -1
- package/dist/backend/c/stmts.d.ts +0 -76
- package/dist/backend/c/stmts.js +0 -1108
- package/dist/backend/c/stmts.js.map +0 -1
- package/dist/backend/c/types.d.ts +0 -71
- package/dist/backend/c/types.js +0 -459
- package/dist/backend/c/types.js.map +0 -1
- package/dist/backend/c/types.test.js +0 -32
- package/dist/backend/c/types.test.js.map +0 -1
- package/dist/backend/c/walkers.d.ts +0 -134
- package/dist/backend/c/walkers.js +0 -1772
- package/dist/backend/c/walkers.js.map +0 -1
- /package/dist/backend/{c/types.test.d.ts → cycle-analysis.test.d.ts} +0 -0
package/dist/backend/c/stmts.js
DELETED
|
@@ -1,1108 +0,0 @@
|
|
|
1
|
-
import { InternalCompilerError } from "../../errors.js";
|
|
2
|
-
import { mangleField, mangleGlobal, mangleLocal, mangleRawParam } from "../mangle.js";
|
|
3
|
-
import { BOOL, CAUGHT, RUNTIME_ERROR_CLASSES, isRefCounted } from "../../ir/ir.js";
|
|
4
|
-
import { boxAccess, cDecl, cStringLiteral, elemAccess, vAdapters } from "./types.js";
|
|
5
|
-
import { OVERFLOW_MEMBER } from "./shapes.js";
|
|
6
|
-
import { emitStableReceiver } from "./exprs.js";
|
|
7
|
-
import { matchIntegerBytesForLoop } from "../../ir/integer-loops.js";
|
|
8
|
-
import { analyzeIntegerRanges } from "../../ir/integer-ranges.js";
|
|
9
|
-
import { endsWithJump, matchStringSelfConcat } from "../../ir/analysis.js";
|
|
10
|
-
export function emitFunction(emitter, fn) {
|
|
11
|
-
emitter.sourceLoc = fn.loc;
|
|
12
|
-
emitter.tempCounter = 0;
|
|
13
|
-
emitter.frames = [];
|
|
14
|
-
emitter.scopes = [];
|
|
15
|
-
emitter.jumpTargets = [];
|
|
16
|
-
emitter.tryStack = [];
|
|
17
|
-
emitter.finallyStack = [];
|
|
18
|
-
emitter.pendingReturnScopeIndex = null;
|
|
19
|
-
emitter.currentReturnType = fn.returnType;
|
|
20
|
-
emitter.currentGenerator = fn.generator ?? null;
|
|
21
|
-
emitter.labelCounter = 0;
|
|
22
|
-
emitter.currentLocals = new Map(fn.locals.map((l) => [l.id, l]));
|
|
23
|
-
emitter.captureIds = new Set((fn.captures ?? []).map((c) => c.localId));
|
|
24
|
-
emitter.integerLoopBindings.clear();
|
|
25
|
-
emitter.integerRanges = analyzeIntegerRanges(fn);
|
|
26
|
-
emitter.line(`${emitter.signature(fn)} {${emitter.srcComment(fn.loc)}`);
|
|
27
|
-
emitter.indent++;
|
|
28
|
-
// The pending-return slot: a `return` crossing a finally computes its
|
|
29
|
-
// value FIRST (before the finally runs — snapshotting it here is what
|
|
30
|
-
// makes finally mutations of returned locals invisible, Node-exact),
|
|
31
|
-
// then jumps through every crossed finally; the last dispatch returns
|
|
32
|
-
// the slot. Declared only when some return actually crosses a finally.
|
|
33
|
-
if (fn.returnType.kind !== "void" && returnCrossesFinally(fn.body)) {
|
|
34
|
-
const init = isRefCounted(fn.returnType) ? "NULL" : "0";
|
|
35
|
-
emitter.line(`${cDecl(fn.returnType, "sc_pret")} = ${init}; /* pending return (through finally) */`);
|
|
36
|
-
}
|
|
37
|
-
// Captured bindings come in through the environment — borrowed for the
|
|
38
|
-
// whole call (the closure owns them): bound here, never released here.
|
|
39
|
-
(fn.captures ?? []).forEach((c, i) => {
|
|
40
|
-
emitter.line(`ScrBox *${mangleLocal(c.localId)} = sc_env->caps[${i}]; /* captured ${c.name} */`);
|
|
41
|
-
});
|
|
42
|
-
const paramIds = new Set(fn.params.map((p) => p.localId));
|
|
43
|
-
for (const local of fn.locals) {
|
|
44
|
-
if (paramIds.has(local.id) || emitter.captureIds.has(local.id))
|
|
45
|
-
continue;
|
|
46
|
-
if (local.boxed) {
|
|
47
|
-
emitter.line(`ScrBox *${mangleLocal(local.id)} = NULL; /* ${local.name} (boxed) */`);
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
const init = isRefCounted(local.type) ? " = NULL" : "";
|
|
51
|
-
emitter.line(`${cDecl(local.type, mangleLocal(local.id))}${init}; /* ${local.name} */`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// Function scope owns refcounted params (callees own their params).
|
|
55
|
-
// Boxed params: allocate the shared binding and move the raw value in.
|
|
56
|
-
const fnScope = [];
|
|
57
|
-
for (const p of fn.params) {
|
|
58
|
-
const local = emitter.currentLocals.get(p.localId);
|
|
59
|
-
if (local.boxed) {
|
|
60
|
-
const box = mangleLocal(p.localId);
|
|
61
|
-
emitter.line(`ScrBox *${box} = ${emitter.boxNewC(p.type)}; /* ${p.name} (boxed param) */`);
|
|
62
|
-
emitter.line(`scr_box_set_${boxAccess(p.type)}(${box}, ${mangleRawParam(p.localId)});`);
|
|
63
|
-
fnScope.push({ name: box, type: p.type, boxed: true });
|
|
64
|
-
}
|
|
65
|
-
else if (isRefCounted(p.type)) {
|
|
66
|
-
fnScope.push({ name: mangleLocal(p.localId), type: p.type });
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
emitter.scopes.push(fnScope);
|
|
70
|
-
emitter.emitStmts(fn.body);
|
|
71
|
-
// Implicit exit of a void function: release function-scope refcounted
|
|
72
|
-
// locals (unless the body already ended in an explicit return or a
|
|
73
|
-
// throw, whose unwind released everything down to depth 0).
|
|
74
|
-
const last = fn.body[fn.body.length - 1]?.kind;
|
|
75
|
-
const endedWithReturn = last === "return" || last === "throw" || last === "rethrow" || last === "runtimeFence";
|
|
76
|
-
if (fn.returnType.kind === "void" && !endedWithReturn) {
|
|
77
|
-
emitter.releaseFrame(emitter.scopes[0]);
|
|
78
|
-
}
|
|
79
|
-
emitter.scopes.pop();
|
|
80
|
-
emitter.indent--;
|
|
81
|
-
emitter.line(`}`);
|
|
82
|
-
// Keep generated runtime scaffolding out of the user's source file.
|
|
83
|
-
emitter.endSourceFunction();
|
|
84
|
-
emitter.line(``);
|
|
85
|
-
}
|
|
86
|
-
/** The statement bodies nested directly under a statement — the shared
|
|
87
|
-
* walk for returnCrossesFinally. */
|
|
88
|
-
function childBodies(s) {
|
|
89
|
-
switch (s.kind) {
|
|
90
|
-
case "if":
|
|
91
|
-
return s.else_ ? [s.then, s.else_] : [s.then];
|
|
92
|
-
case "while":
|
|
93
|
-
case "doWhile":
|
|
94
|
-
case "forOf":
|
|
95
|
-
case "block":
|
|
96
|
-
return [s.body];
|
|
97
|
-
case "for":
|
|
98
|
-
return [s.body];
|
|
99
|
-
case "switch":
|
|
100
|
-
return s.cases.map((c) => c.body);
|
|
101
|
-
case "tryCatch":
|
|
102
|
-
return [
|
|
103
|
-
s.tryBody,
|
|
104
|
-
...(s.catchBody ? [s.catchBody] : []),
|
|
105
|
-
...(s.finallyBody ? [s.finallyBody] : []),
|
|
106
|
-
];
|
|
107
|
-
default:
|
|
108
|
-
return [];
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/** True when some `return` sits inside the tryBody/catchBody of a
|
|
112
|
-
* try-with-finally, at any nesting depth — exactly the returns the
|
|
113
|
-
* pending-return path routes, and so exactly when emitFunction must
|
|
114
|
-
* declare the sc_pret slot. */
|
|
115
|
-
function returnCrossesFinally(stmts) {
|
|
116
|
-
const hasReturn = (body) => body.some((s) => s.kind === "return" || childBodies(s).some(hasReturn));
|
|
117
|
-
const walk = (body) => body.some((s) => {
|
|
118
|
-
if (s.kind === "tryCatch" &&
|
|
119
|
-
s.finallyBody !== null &&
|
|
120
|
-
(hasReturn(s.tryBody) || (s.catchBody !== null && hasReturn(s.catchBody)))) {
|
|
121
|
-
return true;
|
|
122
|
-
}
|
|
123
|
-
return childBodies(s).some(walk);
|
|
124
|
-
});
|
|
125
|
-
return walk(stmts);
|
|
126
|
-
}
|
|
127
|
-
/** Emits a block in its own lexical scope (refcounted locals released at
|
|
128
|
-
* end). `setup` runs after the scope opens, before the statements — the
|
|
129
|
-
* catch-binding hook: it may emit prelude lines and register entries the
|
|
130
|
-
* scope owns (released on every exit, jumps and unwinds included). */
|
|
131
|
-
export function emitBlock(emitter, stmts, setup) {
|
|
132
|
-
emitter.line(`{`);
|
|
133
|
-
emitter.indent++;
|
|
134
|
-
const scope = [];
|
|
135
|
-
emitter.scopes.push(scope);
|
|
136
|
-
setup?.(scope);
|
|
137
|
-
emitter.emitStmts(stmts);
|
|
138
|
-
const endedWithJump = endsWithJump(stmts);
|
|
139
|
-
emitter.scopes.pop();
|
|
140
|
-
if (!endedWithJump)
|
|
141
|
-
emitter.releaseFrame(scope);
|
|
142
|
-
emitter.indent--;
|
|
143
|
-
emitter.line(`}`);
|
|
144
|
-
}
|
|
145
|
-
export function emitStmts(emitter, stmts) {
|
|
146
|
-
for (const s of stmts)
|
|
147
|
-
emitter.emitStmt(s);
|
|
148
|
-
}
|
|
149
|
-
export function emitStmt(emitter, s) {
|
|
150
|
-
const previous = emitter.sourceLoc;
|
|
151
|
-
emitter.sourceLoc = s.loc;
|
|
152
|
-
try {
|
|
153
|
-
emitStmtBody(emitter, s);
|
|
154
|
-
}
|
|
155
|
-
finally {
|
|
156
|
-
emitter.sourceLoc = previous;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
function emitStmtBody(emitter, s) {
|
|
160
|
-
emitter.frames.push([]);
|
|
161
|
-
switch (s.kind) {
|
|
162
|
-
case "varDecl": {
|
|
163
|
-
const local = emitter.currentLocals.get(s.localId);
|
|
164
|
-
const target = mangleLocal(s.localId);
|
|
165
|
-
if (s.init === null) {
|
|
166
|
-
// Declared, uninitialized (`let x: number;`). tsc's TS2454 rejects
|
|
167
|
-
// any read before assignment, so no runtime check is needed — but
|
|
168
|
-
// the declaration must still RESET the C local: inside a loop the
|
|
169
|
-
// previous iteration's scope exit released the old value and left
|
|
170
|
-
// a stale pointer, and the scope-exit release below runs whether
|
|
171
|
-
// or not an `assign` ever did (runtime releases are NULL-tolerant).
|
|
172
|
-
if (local.boxed) {
|
|
173
|
-
// The box must exist immediately: closures created before the
|
|
174
|
-
// first assignment capture it. (tsc's TS2454 can't see through
|
|
175
|
-
// closures — a call before the first assignment reads 0/false
|
|
176
|
-
// for scalars and traps for refcounted kinds, where JS has
|
|
177
|
-
// `undefined`.)
|
|
178
|
-
// A SCALAR TDZ box rides an ARR-kind box: the value lives in a
|
|
179
|
-
// one-element array cell, so the empty (NULL) slot stays the
|
|
180
|
-
// not-yet-initialized sentinel — a raw scalar slot has no spare
|
|
181
|
-
// bit pattern to spend on it.
|
|
182
|
-
const boxNew = local.tdz && boxAccess(local.type) !== "ref"
|
|
183
|
-
? "scr_box_new(SCR_BOX_ARR)"
|
|
184
|
-
: emitter.boxNewC(local.type);
|
|
185
|
-
emitter.line(`${target} = ${boxNew};${emitter.srcComment(s.loc)} /* let ${local.name}; */`);
|
|
186
|
-
emitter.scopes[emitter.scopes.length - 1].push({ name: target, type: local.type, boxed: true });
|
|
187
|
-
}
|
|
188
|
-
else if (isRefCounted(local.type)) {
|
|
189
|
-
emitter.line(`${target} = NULL;${emitter.srcComment(s.loc)} /* let ${local.name}; */`);
|
|
190
|
-
emitter.scopes[emitter.scopes.length - 1].push({ name: target, type: local.type });
|
|
191
|
-
}
|
|
192
|
-
// Scalars need nothing: the C local exists from the prologue and
|
|
193
|
-
// no read happens before an assign writes it.
|
|
194
|
-
break;
|
|
195
|
-
}
|
|
196
|
-
if (local.boxed) {
|
|
197
|
-
// Box FIRST, then evaluate the initializer: a named function
|
|
198
|
-
// expression's closure captures this box during init evaluation.
|
|
199
|
-
emitter.line(`${target} = ${emitter.boxNewC(local.type)};${emitter.srcComment(s.loc)}`);
|
|
200
|
-
emitter.scopes[emitter.scopes.length - 1].push({ name: target, type: local.type, boxed: true });
|
|
201
|
-
const v = emitter.emitExpr(s.init);
|
|
202
|
-
if (isRefCounted(v.type))
|
|
203
|
-
emitter.moveTemp(v); // the box takes ownership
|
|
204
|
-
emitter.line(`scr_box_set_${boxAccess(local.type)}(${target}, ${v.name});`);
|
|
205
|
-
break;
|
|
206
|
-
}
|
|
207
|
-
const v = emitter.emitExpr(s.init);
|
|
208
|
-
emitter.moveTemp(v);
|
|
209
|
-
emitter.line(`${target} = ${v.name};${emitter.srcComment(s.loc)}`);
|
|
210
|
-
if (isRefCounted(v.type)) {
|
|
211
|
-
emitter.scopes[emitter.scopes.length - 1].push({ name: target, type: v.type });
|
|
212
|
-
}
|
|
213
|
-
break;
|
|
214
|
-
}
|
|
215
|
-
case "assign": {
|
|
216
|
-
const local = emitter.currentLocals.get(s.localId);
|
|
217
|
-
const concat = s.value;
|
|
218
|
-
const suffix = matchStringSelfConcat(s.localId, concat);
|
|
219
|
-
if (suffix && concat.kind === "strConcat") {
|
|
220
|
-
// Snapshot the old left value before evaluating the suffix. The
|
|
221
|
-
// snapshot is a normal frame-owned +1: the suffix may reassign the
|
|
222
|
-
// destination or throw, in which case unwinding must still release
|
|
223
|
-
// it while leaving the original binding intact.
|
|
224
|
-
const snapshot = emitter.emitExpr(concat.left);
|
|
225
|
-
const right = emitter.emitExpr(suffix);
|
|
226
|
-
const target = local ? mangleLocal(s.localId) : mangleGlobal(s.localId);
|
|
227
|
-
if (local?.boxed) {
|
|
228
|
-
// set_ref unlinks then releases the binding's CURRENT value. It
|
|
229
|
-
// may differ from snapshot when the suffix itself assigned target.
|
|
230
|
-
emitter.line(`scr_box_set_ref(${target}, NULL);`);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
const old = `sc_t${emitter.tempCounter++}`;
|
|
234
|
-
emitter.line(`ScrStr *${old} = ${target};`);
|
|
235
|
-
emitter.line(`${target} = NULL;`);
|
|
236
|
-
emitter.releaseValue(old, snapshot.type);
|
|
237
|
-
}
|
|
238
|
-
const result = emitter.newTemp(s.value.type, `scr_str_concat(${snapshot.name}, ${right.name})`);
|
|
239
|
-
if (local?.boxed) {
|
|
240
|
-
emitter.moveTemp(result); // the box takes the concat result's +1
|
|
241
|
-
emitter.line(`scr_box_set_ref(${target}, ${result.name});${emitter.srcComment(s.loc)}`);
|
|
242
|
-
}
|
|
243
|
-
else {
|
|
244
|
-
emitter.moveTemp(result); // binding takes the concat result's +1
|
|
245
|
-
emitter.line(`${target} = ${result.name};${emitter.srcComment(s.loc)}`);
|
|
246
|
-
}
|
|
247
|
-
break;
|
|
248
|
-
}
|
|
249
|
-
if (!local) {
|
|
250
|
-
// Module global: plain static storage, never boxed. Old-value
|
|
251
|
-
// release is NULL-tolerant (statics start NULL).
|
|
252
|
-
const g = emitter.globalsById.get(s.localId);
|
|
253
|
-
if (!g)
|
|
254
|
-
throw new InternalCompilerError(`emitter bug: assign to unknown binding ${s.localId}`);
|
|
255
|
-
const target = mangleGlobal(g.id);
|
|
256
|
-
const v = emitter.emitExpr(s.value);
|
|
257
|
-
emitter.moveTemp(v);
|
|
258
|
-
if (isRefCounted(v.type))
|
|
259
|
-
emitter.releaseValue(target, v.type);
|
|
260
|
-
emitter.line(`${target} = ${v.name};${emitter.srcComment(s.loc)}`);
|
|
261
|
-
break;
|
|
262
|
-
}
|
|
263
|
-
const target = mangleLocal(s.localId);
|
|
264
|
-
const v = emitter.emitExpr(s.value);
|
|
265
|
-
if (local.boxed) {
|
|
266
|
-
// A scalar TDZ box (forward-captured const): the initializing
|
|
267
|
-
// write mints the one-element array cell — set_ref moves it in
|
|
268
|
-
// (and the empty-slot sentinel ends here).
|
|
269
|
-
if (local.tdz && boxAccess(local.type) !== "ref") {
|
|
270
|
-
const acc = boxAccess(local.type);
|
|
271
|
-
const cell = `sc_t${emitter.tempCounter++}`;
|
|
272
|
-
emitter.line(`ScrArr *${cell} = ${emitter.arrNewC(local.type, 1)};${emitter.srcComment(s.loc)}`);
|
|
273
|
-
emitter.line(`scr_arr_push_${acc}(${cell}, ${v.name});`);
|
|
274
|
-
emitter.line(`scr_box_set_ref(${target}, ${cell});`);
|
|
275
|
-
break;
|
|
276
|
-
}
|
|
277
|
-
if (isRefCounted(v.type))
|
|
278
|
-
emitter.moveTemp(v); // set_ref releases the old value
|
|
279
|
-
emitter.line(`scr_box_set_${boxAccess(local.type)}(${target}, ${v.name});${emitter.srcComment(s.loc)}`);
|
|
280
|
-
break;
|
|
281
|
-
}
|
|
282
|
-
emitter.moveTemp(v);
|
|
283
|
-
if (isRefCounted(v.type))
|
|
284
|
-
emitter.releaseValue(target, v.type);
|
|
285
|
-
emitter.line(`${target} = ${v.name};${emitter.srcComment(s.loc)}`);
|
|
286
|
-
break;
|
|
287
|
-
}
|
|
288
|
-
case "exprStmt":
|
|
289
|
-
emitter.emitExpr(s.expr);
|
|
290
|
-
break;
|
|
291
|
-
case "if": {
|
|
292
|
-
const cond = emitter.emitCondition(s.cond);
|
|
293
|
-
emitter.line(`if (${cond}) `);
|
|
294
|
-
emitter.mergeBrace(() => emitter.emitBlock(s.then));
|
|
295
|
-
if (s.else_) {
|
|
296
|
-
emitter.line(`else `);
|
|
297
|
-
emitter.mergeBrace(() => emitter.emitBlock(s.else_));
|
|
298
|
-
}
|
|
299
|
-
break;
|
|
300
|
-
}
|
|
301
|
-
case "while": {
|
|
302
|
-
emitter.line(`for (;;) {${emitter.srcComment(s.loc)}`);
|
|
303
|
-
emitter.indent++;
|
|
304
|
-
const cond = emitter.emitCondition(s.cond);
|
|
305
|
-
emitter.line(`if (!(${cond})) break;`);
|
|
306
|
-
// C continue re-evaluates the condition at the top: exactly right
|
|
307
|
-
// for the unlabeled loop. A LABELED while allocates a continue
|
|
308
|
-
// label placed at the END of the body (falling off it re-enters
|
|
309
|
-
// the condition — the same point) so a labeled continue from a
|
|
310
|
-
// NESTED loop can goto it, and a lazy end label for labeled break.
|
|
311
|
-
const loop = emitter.loopTarget(null, s.labels);
|
|
312
|
-
emitter.jumpTargets.push(loop);
|
|
313
|
-
emitter.emitBlock(s.body);
|
|
314
|
-
emitter.jumpTargets.pop();
|
|
315
|
-
if (loop.usedContinue && loop.continueLabel)
|
|
316
|
-
emitter.line(`${loop.continueLabel}:;`);
|
|
317
|
-
emitter.indent--;
|
|
318
|
-
emitter.line(`}`);
|
|
319
|
-
if (loop.usedEnd)
|
|
320
|
-
emitter.line(`${loop.endLabel}:;`);
|
|
321
|
-
break;
|
|
322
|
-
}
|
|
323
|
-
case "doWhile": {
|
|
324
|
-
// `for (;;) { body; cont: cond; if (!cond) break; }` — the body runs
|
|
325
|
-
// before the first condition check (at least once), and `continue`
|
|
326
|
-
// routes through the label so the condition still evaluates.
|
|
327
|
-
emitter.line(`for (;;) {${emitter.srcComment(s.loc)}`);
|
|
328
|
-
emitter.indent++;
|
|
329
|
-
const loop = emitter.loopTarget(`sc_cont_${emitter.labelCounter++}`, s.labels);
|
|
330
|
-
emitter.jumpTargets.push(loop);
|
|
331
|
-
emitter.emitBlock(s.body);
|
|
332
|
-
emitter.jumpTargets.pop();
|
|
333
|
-
if (loop.usedContinue)
|
|
334
|
-
emitter.line(`${loop.continueLabel}:;`);
|
|
335
|
-
const cond = emitter.emitCondition(s.cond);
|
|
336
|
-
emitter.line(`if (!(${cond})) break;`);
|
|
337
|
-
emitter.indent--;
|
|
338
|
-
emitter.line(`}`);
|
|
339
|
-
if (loop.usedEnd)
|
|
340
|
-
emitter.line(`${loop.endLabel}:;`);
|
|
341
|
-
break;
|
|
342
|
-
}
|
|
343
|
-
case "switch":
|
|
344
|
-
emitter.emitSwitch(s);
|
|
345
|
-
break;
|
|
346
|
-
case "for": {
|
|
347
|
-
// Desugared in place; the init's scope wraps the whole loop, so
|
|
348
|
-
// break/continue must NOT release it (scopeDepth captured after).
|
|
349
|
-
const integerLoop = matchIntegerBytesForLoop(s, emitter.currentLocals);
|
|
350
|
-
emitter.line(`{${emitter.srcComment(s.loc)}`);
|
|
351
|
-
emitter.indent++;
|
|
352
|
-
emitter.scopes.push([]);
|
|
353
|
-
let integerShadow = null;
|
|
354
|
-
if (integerLoop) {
|
|
355
|
-
integerShadow = `sc_i${emitter.tempCounter++}`;
|
|
356
|
-
emitter.line(`uint64_t ${integerShadow} = 0; /* integer induction ${emitter.currentLocals.get(integerLoop.localId).name} */`);
|
|
357
|
-
emitter.integerLoopBindings.set(integerLoop.localId, integerShadow);
|
|
358
|
-
}
|
|
359
|
-
else if (s.init) {
|
|
360
|
-
emitter.emitStmt(s.init);
|
|
361
|
-
}
|
|
362
|
-
emitter.line(`for (;;) {`);
|
|
363
|
-
emitter.indent++;
|
|
364
|
-
if (integerLoop && integerShadow) {
|
|
365
|
-
const receiver = emitStableReceiver(emitter, integerLoop.limitReceiver, []);
|
|
366
|
-
emitter.line(`if (!(${integerShadow} < ${receiver.name}->len)) break;`);
|
|
367
|
-
}
|
|
368
|
-
else if (s.cond) {
|
|
369
|
-
const cond = emitter.emitCondition(s.cond);
|
|
370
|
-
emitter.line(`if (!(${cond})) break;`);
|
|
371
|
-
}
|
|
372
|
-
// C continue would skip the update; route it through a label instead.
|
|
373
|
-
const loop = emitter.loopTarget(`sc_cont_${emitter.labelCounter++}`, s.labels);
|
|
374
|
-
emitter.jumpTargets.push(loop);
|
|
375
|
-
emitter.emitBlock(s.body);
|
|
376
|
-
emitter.jumpTargets.pop();
|
|
377
|
-
if (loop.usedContinue)
|
|
378
|
-
emitter.line(`${loop.continueLabel}:;`);
|
|
379
|
-
// JS `for (let i ...)`: each iteration gets a FRESH binding holding a
|
|
380
|
-
// copy of the previous one, and the update mutates the fresh binding
|
|
381
|
-
// — that's why closures made in iteration k keep seeing iteration
|
|
382
|
-
// k's value. Only observable (and only emitted) when captured.
|
|
383
|
-
if (s.init?.kind === "varDecl") {
|
|
384
|
-
const initLocal = emitter.currentLocals.get(s.init.localId);
|
|
385
|
-
if (initLocal?.boxed) {
|
|
386
|
-
const box = mangleLocal(initLocal.id);
|
|
387
|
-
const fresh = `sc_t${emitter.tempCounter++}`;
|
|
388
|
-
const acc = boxAccess(initLocal.type);
|
|
389
|
-
emitter.line(`ScrBox *${fresh} = ${emitter.boxNewC(initLocal.type)}; /* per-iteration ${initLocal.name} */`);
|
|
390
|
-
emitter.line(`scr_box_set_${acc}(${fresh}, scr_box_get_${acc}(${box}));`);
|
|
391
|
-
emitter.line(`scr_box_release(${box});`);
|
|
392
|
-
emitter.line(`${box} = ${fresh};`);
|
|
393
|
-
// The wrapper scope's entry releases whatever `box` points to at
|
|
394
|
-
// loop exit — which is now the freshest binding. Nothing to fix.
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
if (integerLoop && integerShadow)
|
|
398
|
-
emitter.line(`${integerShadow}++;`);
|
|
399
|
-
else if (s.update)
|
|
400
|
-
emitter.emitStmt(s.update);
|
|
401
|
-
emitter.indent--;
|
|
402
|
-
emitter.line(`}`);
|
|
403
|
-
// A labeled break lands exactly where C break does: BEFORE the
|
|
404
|
-
// init scope's release (the goto path must run the same releases
|
|
405
|
-
// as the fall-through path).
|
|
406
|
-
if (loop.usedEnd)
|
|
407
|
-
emitter.line(`${loop.endLabel}:;`);
|
|
408
|
-
emitter.releaseFrame(emitter.scopes.pop());
|
|
409
|
-
if (integerLoop)
|
|
410
|
-
emitter.integerLoopBindings.delete(integerLoop.localId);
|
|
411
|
-
emitter.indent--;
|
|
412
|
-
emitter.line(`}`);
|
|
413
|
-
break;
|
|
414
|
-
}
|
|
415
|
-
case "arraySet": {
|
|
416
|
-
// Evaluation order matches JS: array, index, then value. Ownership
|
|
417
|
-
// of a refcounted value moves into the array (the runtime releases
|
|
418
|
-
// the replaced element itself).
|
|
419
|
-
const arr = emitter.emitExpr(s.arr);
|
|
420
|
-
const idx = emitter.emitExpr(s.index);
|
|
421
|
-
const v = emitter.emitExpr(s.value);
|
|
422
|
-
if (s.arr.type.kind !== "array")
|
|
423
|
-
throw new InternalCompilerError("emitter bug: arraySet on non-array");
|
|
424
|
-
const acc = elemAccess(s.arr.type.elem);
|
|
425
|
-
if (acc === "ref")
|
|
426
|
-
emitter.moveTemp(v);
|
|
427
|
-
emitter.line(`scr_arr_set_${acc}(${arr.name}, ${idx.name}, ${v.name});${emitter.srcComment(s.loc)}`);
|
|
428
|
-
break;
|
|
429
|
-
}
|
|
430
|
-
case "arraySetLength": {
|
|
431
|
-
const arr = emitter.emitExpr(s.arr);
|
|
432
|
-
const length = emitter.emitExpr(s.length);
|
|
433
|
-
if (s.arr.type.kind !== "array")
|
|
434
|
-
throw new InternalCompilerError("emitter bug: arraySetLength on non-array");
|
|
435
|
-
emitter.line(`scr_arr_set_len(${arr.name}, ${length.name});${emitter.srcComment(s.loc)}`);
|
|
436
|
-
emitter.emitPendingCheck();
|
|
437
|
-
break;
|
|
438
|
-
}
|
|
439
|
-
case "arraySetUndefined":
|
|
440
|
-
case "arrayDelete": {
|
|
441
|
-
const arr = emitter.emitExpr(s.arr);
|
|
442
|
-
const idx = emitter.emitExpr(s.index);
|
|
443
|
-
if (s.arr.type.kind !== "array")
|
|
444
|
-
throw new InternalCompilerError(`emitter bug: ${s.kind} on non-array`);
|
|
445
|
-
emitter.line(`${s.kind === "arraySetUndefined" ? "scr_arr_set_undefined" : "scr_arr_delete"}(${arr.name}, ${idx.name});${emitter.srcComment(s.loc)}`);
|
|
446
|
-
break;
|
|
447
|
-
}
|
|
448
|
-
case "bytesSet": {
|
|
449
|
-
// Typed-array element write: same evaluation order as arraySet;
|
|
450
|
-
// the value is a scalar (the inline kind-specific accessor coerces
|
|
451
|
-
// JS-exactly), so no ownership moves. Any invalid index traps — no
|
|
452
|
-
// append. The IR carries the element kind; do not rediscover it in
|
|
453
|
-
// the generic runtime accessor on every loop iteration.
|
|
454
|
-
const arr = emitStableReceiver(emitter, s.arr, [s.index, s.value]);
|
|
455
|
-
const integerIndex = emitter.integerLoopIndex(s.index);
|
|
456
|
-
const idx = integerIndex === null ? emitter.emitExpr(s.index).name : integerIndex;
|
|
457
|
-
const v = emitter.emitExpr(s.value);
|
|
458
|
-
if (s.arr.type.kind !== "bytes")
|
|
459
|
-
throw new InternalCompilerError("emitter bug: bytesSet on non-bytes");
|
|
460
|
-
emitter.line(`${emitter.bytesElementHelper("set", s.arr.type.elem, integerIndex !== null)}(${arr.name}, ${idx}, ${v.name});${emitter.srcComment(s.loc)}`);
|
|
461
|
-
break;
|
|
462
|
-
}
|
|
463
|
-
case "fieldSet":
|
|
464
|
-
case "recordSet": {
|
|
465
|
-
// Evaluation order: obj, then value. New value moved in; the old
|
|
466
|
-
// value is released AFTER the field is overwritten (releases are
|
|
467
|
-
// NULL-tolerant — fields start NULL from the zeroed allocation).
|
|
468
|
-
// Unlink-then-release is load-bearing: a release can trigger a
|
|
469
|
-
// cycle collection, which must never see a heap edge whose count
|
|
470
|
-
// was already given up (scr_cycle.c). Classes and records share
|
|
471
|
-
// the struct layout, so one emission.
|
|
472
|
-
const obj = emitter.emitExpr(s.obj);
|
|
473
|
-
const v = emitter.emitExpr(s.value);
|
|
474
|
-
// Runtime error classes use ScrError's own member names.
|
|
475
|
-
const member = s.kind === "fieldSet" && RUNTIME_ERROR_CLASSES.has(s.className)
|
|
476
|
-
? s.field
|
|
477
|
-
: mangleField(s.field);
|
|
478
|
-
const field = `${obj.name}->${member}`;
|
|
479
|
-
if (isRefCounted(v.type)) {
|
|
480
|
-
emitter.moveTemp(v);
|
|
481
|
-
const old = `sc_t${emitter.tempCounter++}`;
|
|
482
|
-
emitter.line(`${cDecl(v.type, old)} = ${field};`);
|
|
483
|
-
emitter.line(`${field} = ${v.name};${emitter.srcComment(s.loc)}`);
|
|
484
|
-
emitter.releaseValue(old, v.type);
|
|
485
|
-
}
|
|
486
|
-
else {
|
|
487
|
-
emitter.line(`${field} = ${v.name};${emitter.srcComment(s.loc)}`);
|
|
488
|
-
}
|
|
489
|
-
break;
|
|
490
|
-
}
|
|
491
|
-
case "recordKeyDelete": {
|
|
492
|
-
// `delete obj[k]` on a pure index-signature shape: a Map delete on
|
|
493
|
-
// the overflow (key and value released; absent keys no-op).
|
|
494
|
-
const obj = emitter.emitExpr(s.obj);
|
|
495
|
-
const key = emitter.emitExpr(s.key);
|
|
496
|
-
emitter.line(`scr_map_delete_str(${obj.name}->${OVERFLOW_MEMBER}, ${key.name});${emitter.srcComment(s.loc)}`);
|
|
497
|
-
break;
|
|
498
|
-
}
|
|
499
|
-
case "recordKeySet": {
|
|
500
|
-
// Dynamic-keyed record write through the per-shape helper (declared
|
|
501
|
-
// keys write through with validation, undeclared keys land in the
|
|
502
|
-
// overflow map). Evaluation order: obj, key, value. The helper OWNS
|
|
503
|
-
// the value (+1 moves in). MAY THROW when a dyn value must validate
|
|
504
|
-
// against a declared field's type — the pending check runs then.
|
|
505
|
-
const obj = emitter.emitExpr(s.obj);
|
|
506
|
-
const key = emitter.emitExpr(s.key);
|
|
507
|
-
const v = emitter.emitExpr(s.value);
|
|
508
|
-
if (isRefCounted(v.type))
|
|
509
|
-
emitter.moveTemp(v);
|
|
510
|
-
// A LITERAL key naming no declared field is a plain overflow map
|
|
511
|
-
// insert — no helper, no validation, no throw.
|
|
512
|
-
if (s.overflowOnly) {
|
|
513
|
-
const acc = v.type.kind === "f64" ? "f64" : v.type.kind === "bool" ? "bool" : "ref";
|
|
514
|
-
emitter.line(`scr_map_set_str_${acc}(${obj.name}->${OVERFLOW_MEMBER}, ${key.name}, ${v.name});${emitter.srcComment(s.loc)}`);
|
|
515
|
-
break;
|
|
516
|
-
}
|
|
517
|
-
const helper = emitter.recordKeySetHelper(s.shapeId);
|
|
518
|
-
emitter.line(`${helper}(${obj.name}, ${key.name}, ${v.name});${emitter.srcComment(s.loc)}`);
|
|
519
|
-
const shape = emitter.recordsById.get(s.shapeId);
|
|
520
|
-
// MAY THROW: a dyn value validating against a declared field, or a
|
|
521
|
-
// signature-free shape's key MISS (scr_record_key_miss).
|
|
522
|
-
if (shape && (!shape.indexValue || (shape.indexValue.kind === "dyn" && shape.fields.length > 0))) {
|
|
523
|
-
emitter.emitPendingCheck();
|
|
524
|
-
}
|
|
525
|
-
break;
|
|
526
|
-
}
|
|
527
|
-
case "forOf": {
|
|
528
|
-
// Ascending index loop; the length is re-read every iteration
|
|
529
|
-
// (JS-exact — pushes inside the body extend the iteration). The
|
|
530
|
-
// iterable temp lives in this statement's frame, so it is released
|
|
531
|
-
// when the whole loop ends (and by `return`'s frame sweep). A real
|
|
532
|
-
// C for-loop makes plain `continue` correct: the update still runs.
|
|
533
|
-
if (s.iterable.type.kind !== "array")
|
|
534
|
-
throw new InternalCompilerError("emitter bug: forOf over non-array");
|
|
535
|
-
const elem = s.iterable.type.elem;
|
|
536
|
-
const arr = emitter.emitExpr(s.iterable);
|
|
537
|
-
const idx = `sc_t${emitter.tempCounter++}`;
|
|
538
|
-
emitter.line(`for (double ${idx} = 0; ${idx} < scr_arr_len(${arr.name}); ${idx} += 1) {${emitter.srcComment(s.loc)}`);
|
|
539
|
-
emitter.indent++;
|
|
540
|
-
// A real C for-loop makes plain `continue` correct (the update
|
|
541
|
-
// still runs); a LABELED forOf allocates a continue label placed at
|
|
542
|
-
// the END of the iteration (after the per-iteration scope release —
|
|
543
|
-
// the goto path released it itself) so nested loops can goto it.
|
|
544
|
-
const loop = emitter.loopTarget(null, s.labels);
|
|
545
|
-
emitter.jumpTargets.push(loop);
|
|
546
|
-
// The loop variable is a fresh const per iteration: its scope opens
|
|
547
|
-
// here, holds the (for ref elements: owned +1) current element, and
|
|
548
|
-
// releases it at the end of each iteration.
|
|
549
|
-
emitter.scopes.push([]);
|
|
550
|
-
const local = mangleLocal(s.localId);
|
|
551
|
-
const localInfo = emitter.currentLocals.get(s.localId);
|
|
552
|
-
if (localInfo?.boxed) {
|
|
553
|
-
// Captured loop variable: a fresh box per iteration, matching the
|
|
554
|
-
// fresh const binding (closures made in iteration k keep seeing
|
|
555
|
-
// iteration k's element). The box takes ownership of a ref
|
|
556
|
-
// element's +1 and is released with the iteration's scope.
|
|
557
|
-
emitter.line(`${local} = ${emitter.boxNewC(elem)}; /* per-iteration ${localInfo.name} */`);
|
|
558
|
-
emitter.line(`scr_box_set_${boxAccess(elem)}(${local}, scr_arr_get_${elemAccess(elem)}(${arr.name}, ${idx}));`);
|
|
559
|
-
emitter.scopes[emitter.scopes.length - 1].push({ name: local, type: elem, boxed: true });
|
|
560
|
-
}
|
|
561
|
-
else {
|
|
562
|
-
emitter.line(`${local} = scr_arr_get_${elemAccess(elem)}(${arr.name}, ${idx});`);
|
|
563
|
-
if (isRefCounted(elem))
|
|
564
|
-
emitter.scopes[emitter.scopes.length - 1].push({ name: local, type: elem });
|
|
565
|
-
}
|
|
566
|
-
emitter.emitStmts(s.body);
|
|
567
|
-
const endedWithJump = endsWithJump(s.body);
|
|
568
|
-
const scope = emitter.scopes.pop();
|
|
569
|
-
if (!endedWithJump)
|
|
570
|
-
emitter.releaseFrame(scope);
|
|
571
|
-
emitter.jumpTargets.pop();
|
|
572
|
-
if (loop.usedContinue && loop.continueLabel)
|
|
573
|
-
emitter.line(`${loop.continueLabel}:;`);
|
|
574
|
-
emitter.indent--;
|
|
575
|
-
emitter.line(`}`);
|
|
576
|
-
if (loop.usedEnd)
|
|
577
|
-
emitter.line(`${loop.endLabel}:;`);
|
|
578
|
-
break;
|
|
579
|
-
}
|
|
580
|
-
case "block": {
|
|
581
|
-
if (s.labels === undefined) {
|
|
582
|
-
emitter.emitBlock(s.body);
|
|
583
|
-
break;
|
|
584
|
-
}
|
|
585
|
-
// A labeled block: `break lbl` inside jumps to the end label
|
|
586
|
-
// (releasing the block's scope itself); nothing else can target it.
|
|
587
|
-
const target = {
|
|
588
|
-
kind: "block",
|
|
589
|
-
endLabel: `sc_end_${emitter.labelCounter++}`,
|
|
590
|
-
usedEnd: false,
|
|
591
|
-
labels: s.labels,
|
|
592
|
-
scopeDepth: emitter.scopes.length,
|
|
593
|
-
frameDepth: emitter.frames.length,
|
|
594
|
-
finallyDepth: emitter.finallyStack.length,
|
|
595
|
-
};
|
|
596
|
-
emitter.jumpTargets.push(target);
|
|
597
|
-
emitter.emitBlock(s.body);
|
|
598
|
-
emitter.jumpTargets.pop();
|
|
599
|
-
if (target.usedEnd)
|
|
600
|
-
emitter.line(`${target.endLabel}:;`);
|
|
601
|
-
break;
|
|
602
|
-
}
|
|
603
|
-
case "break": {
|
|
604
|
-
// Unlabeled: binds to the innermost loop OR switch (labeled block
|
|
605
|
-
// targets are skipped). Labeled: binds to the entry carrying the
|
|
606
|
-
// label. Release every scope entered since that target started
|
|
607
|
-
// (the body scope and anything nested); their natural end-of-block
|
|
608
|
-
// releases are on the fall-through path this jump bypasses. Same
|
|
609
|
-
// for pending frame temps of statements the jump exits (a nested
|
|
610
|
-
// switch's discriminant) — but NOT the target's own frame: a
|
|
611
|
-
// loop's releases after the loop and a switch's after its end
|
|
612
|
-
// label are still on this jump's path.
|
|
613
|
-
let target;
|
|
614
|
-
for (let i = emitter.jumpTargets.length - 1; i >= 0; i--) {
|
|
615
|
-
const t = emitter.jumpTargets[i];
|
|
616
|
-
if (s.label !== undefined ? t.labels?.includes(s.label) : t.kind !== "block") {
|
|
617
|
-
target = t;
|
|
618
|
-
break;
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
if (!target)
|
|
622
|
-
throw new InternalCompilerError("emitter bug: break target not found");
|
|
623
|
-
emitter.emitFinallysForJump(target.finallyDepth, target.frameDepth, target.scopeDepth);
|
|
624
|
-
if (target.kind !== "loop" || s.label !== undefined) {
|
|
625
|
-
// Switches are emitted as goto chains and blocks aren't C loops
|
|
626
|
-
// at all, so a C `break` cannot target either; and a LABELED
|
|
627
|
-
// break may target an outer loop a C break would never reach.
|
|
628
|
-
// All three jump to the target's end label (labeled loops always
|
|
629
|
-
// allocate one — loopTarget).
|
|
630
|
-
target.usedEnd = true;
|
|
631
|
-
emitter.line(`goto ${target.endLabel};${emitter.srcComment(s.loc)}`);
|
|
632
|
-
}
|
|
633
|
-
else {
|
|
634
|
-
emitter.line(`break;${emitter.srcComment(s.loc)}`);
|
|
635
|
-
}
|
|
636
|
-
break;
|
|
637
|
-
}
|
|
638
|
-
case "continue": {
|
|
639
|
-
// Unlabeled: binds to the innermost LOOP, skipping any switches and
|
|
640
|
-
// labeled blocks in between (their scopes are still released — the
|
|
641
|
-
// jump exits them). Labeled: binds to the loop carrying the label.
|
|
642
|
-
let loop;
|
|
643
|
-
for (let i = emitter.jumpTargets.length - 1; i >= 0; i--) {
|
|
644
|
-
const t = emitter.jumpTargets[i];
|
|
645
|
-
if (t.kind === "loop" && (s.label === undefined || t.labels?.includes(s.label))) {
|
|
646
|
-
loop = t;
|
|
647
|
-
break;
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
if (!loop)
|
|
651
|
-
throw new InternalCompilerError("emitter bug: continue target not found");
|
|
652
|
-
emitter.emitFinallysForJump(loop.finallyDepth, loop.frameDepth, loop.scopeDepth);
|
|
653
|
-
if (loop.continueLabel) {
|
|
654
|
-
// Labeled loops always allocate one (a labeled continue may
|
|
655
|
-
// target an outer loop a C continue could never reach); for/
|
|
656
|
-
// do-while allocate one for their update/condition point.
|
|
657
|
-
loop.usedContinue = true;
|
|
658
|
-
emitter.line(`goto ${loop.continueLabel};${emitter.srcComment(s.loc)}`);
|
|
659
|
-
}
|
|
660
|
-
else {
|
|
661
|
-
emitter.line(`continue;${emitter.srcComment(s.loc)}`);
|
|
662
|
-
}
|
|
663
|
-
break;
|
|
664
|
-
}
|
|
665
|
-
case "return": {
|
|
666
|
-
// A return inside the pending-return copy of a finally REPLACES the
|
|
667
|
-
// old return. Keep the old slot protected while the new expression
|
|
668
|
-
// evaluates (a throw there still discards it), then release the old
|
|
669
|
-
// value and remove the slot from this return's own unwind path.
|
|
670
|
-
let pendingEntry = null;
|
|
671
|
-
let value = null;
|
|
672
|
-
if (s.value)
|
|
673
|
-
value = emitter.emitExpr(s.value);
|
|
674
|
-
const pendingIndex = emitter.pendingReturnScopeIndex;
|
|
675
|
-
if (pendingIndex !== null && isRefCounted(emitter.currentReturnType)) {
|
|
676
|
-
const scope = emitter.scopes[pendingIndex];
|
|
677
|
-
const entryIndex = scope.findIndex((entry) => entry.name === "sc_pret");
|
|
678
|
-
if (entryIndex < 0)
|
|
679
|
-
throw new InternalCompilerError("emitter bug: pending return scope has no sc_pret");
|
|
680
|
-
pendingEntry = { index: pendingIndex, entry: scope.splice(entryIndex, 1)[0] };
|
|
681
|
-
emitter.releaseValue("sc_pret", emitter.currentReturnType);
|
|
682
|
-
}
|
|
683
|
-
const fin = emitter.finallyStack[emitter.finallyStack.length - 1];
|
|
684
|
-
if (fin) {
|
|
685
|
-
// Crossing ≥1 finally: the value is computed and snapshotted
|
|
686
|
-
// FIRST (a finally mutating the returned local cannot change
|
|
687
|
-
// it — Node's semantics), then everything down to the innermost
|
|
688
|
-
// region releases and control runs that region's pending-return
|
|
689
|
-
// finally copy; its tail dispatches further out or returns.
|
|
690
|
-
if (value) {
|
|
691
|
-
emitter.moveTemp(value); // ownership parks in the slot until the dispatch returns it
|
|
692
|
-
emitter.line(`sc_pret = ${value.name};${emitter.srcComment(s.loc)}`);
|
|
693
|
-
}
|
|
694
|
-
fin.used = true;
|
|
695
|
-
emitter.releaseForJump(fin.frameDepth, fin.scopeDepth);
|
|
696
|
-
emitter.line(`goto ${fin.label};${s.value ? "" : emitter.srcComment(s.loc)}`);
|
|
697
|
-
}
|
|
698
|
-
else if (value) {
|
|
699
|
-
emitter.moveTemp(value);
|
|
700
|
-
// Everything down to function depth releases; the moved result is
|
|
701
|
-
// exempt (already struck from its frame).
|
|
702
|
-
emitter.releaseForJump(0, 0);
|
|
703
|
-
emitter.line(`return ${value.name};${emitter.srcComment(s.loc)}`);
|
|
704
|
-
}
|
|
705
|
-
else {
|
|
706
|
-
emitter.releaseForJump(0, 0);
|
|
707
|
-
emitter.line(`return;${emitter.srcComment(s.loc)}`);
|
|
708
|
-
}
|
|
709
|
-
if (pendingEntry !== null) {
|
|
710
|
-
emitter.scopes[pendingEntry.index].push(pendingEntry.entry);
|
|
711
|
-
}
|
|
712
|
-
break;
|
|
713
|
-
}
|
|
714
|
-
case "throw": {
|
|
715
|
-
// Evaluate, move ownership into the runtime's exception cell, then
|
|
716
|
-
// unwind unconditionally (the innermost try handler, or out of the
|
|
717
|
-
// function) — the same release path as return/break/continue.
|
|
718
|
-
const v = emitter.emitExpr(s.value);
|
|
719
|
-
const t = s.value.type;
|
|
720
|
-
if (isRefCounted(t))
|
|
721
|
-
emitter.moveTemp(v); // the cell takes ownership
|
|
722
|
-
if (t.kind === "date") {
|
|
723
|
-
throw new InternalCompilerError("emitter bug: Date throw reached backend");
|
|
724
|
-
}
|
|
725
|
-
else if (t.kind === "f64") {
|
|
726
|
-
emitter.line(`scr_throw_f64(${v.name});${emitter.srcComment(s.loc)}`);
|
|
727
|
-
}
|
|
728
|
-
else if (t.kind === "bool") {
|
|
729
|
-
emitter.line(`scr_throw_bool(${v.name});${emitter.srcComment(s.loc)}`);
|
|
730
|
-
}
|
|
731
|
-
else if (t.kind === "string") {
|
|
732
|
-
emitter.line(`scr_throw_str(${v.name});${emitter.srcComment(s.loc)}`);
|
|
733
|
-
}
|
|
734
|
-
else if (t.kind === "object" && emitter.classMeta.get(t.className)?.hierarchy) {
|
|
735
|
-
// Hierarchy instances carry a vtable word: the OBJ kind keeps the
|
|
736
|
-
// dynamic class inspectable (catch-binding instanceof, and the
|
|
737
|
-
// uncaught printer's "name: message" for Error instances).
|
|
738
|
-
const rc = vAdapters(t);
|
|
739
|
-
emitter.line(`scr_throw_obj(${v.name}, &${rc.retain}, &${rc.release}, ${emitter.traceArgC(t)});${emitter.srcComment(s.loc)}`);
|
|
740
|
-
}
|
|
741
|
-
else if (t.kind === "symbol" || t.kind === "bigint" || t.kind === "func" || t.kind === "classval") {
|
|
742
|
-
const rc = vAdapters(t);
|
|
743
|
-
emitter.line(`scr_throw_primitive_ref(${v.name}, &${rc.retain}, &${rc.release}, NULL);${emitter.srcComment(s.loc)}`);
|
|
744
|
-
}
|
|
745
|
-
else if (t.kind === "dyn" || t.kind === "jsval") {
|
|
746
|
-
const rc = vAdapters(t);
|
|
747
|
-
const test = t.kind === "dyn" ? "scr_dyn_is_object" : "scr_jsval_is_object";
|
|
748
|
-
emitter.line(`scr_throw_ref_classified(${v.name}, &${rc.retain}, &${rc.release}, ${emitter.traceArgC(t)}, ${test}(${v.name}));${emitter.srcComment(s.loc)}`);
|
|
749
|
-
}
|
|
750
|
-
else {
|
|
751
|
-
const rc = vAdapters(t);
|
|
752
|
-
emitter.line(`scr_throw_ref(${v.name}, &${rc.retain}, &${rc.release}, ${emitter.traceArgC(t)});${emitter.srcComment(s.loc)}`);
|
|
753
|
-
}
|
|
754
|
-
emitter.emitUnwind();
|
|
755
|
-
break;
|
|
756
|
-
}
|
|
757
|
-
case "runtimeFence": {
|
|
758
|
-
// The deferred JS compile fence: throw a catchable Error naming
|
|
759
|
-
// the construct (message) with the SC code stamped on `code`,
|
|
760
|
-
// then unwind exactly like `throw`.
|
|
761
|
-
const bytes = Buffer.from(s.message, "utf8");
|
|
762
|
-
emitter.line(`scr_throw_error_msg_code(SCR_ERR_ERROR, ${cStringLiteral(bytes)}, ${bytes.length}, "${s.code}");${emitter.srcComment(s.loc)}`);
|
|
763
|
-
emitter.emitUnwind();
|
|
764
|
-
break;
|
|
765
|
-
}
|
|
766
|
-
case "rethrow":
|
|
767
|
-
// Re-raise the saved snapshot (payload retained — the binding local
|
|
768
|
-
// releases with its scope) and unwind like `throw`.
|
|
769
|
-
emitter.line(`scr_rethrow(${mangleLocal(s.localId)});${emitter.srcComment(s.loc)}`);
|
|
770
|
-
emitter.emitUnwind();
|
|
771
|
-
break;
|
|
772
|
-
case "tryCatch":
|
|
773
|
-
emitter.emitTryCatch(s);
|
|
774
|
-
break;
|
|
775
|
-
default: {
|
|
776
|
-
const _exhaustive = s;
|
|
777
|
-
void _exhaustive;
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
const frame = emitter.frames.pop();
|
|
781
|
-
// return/throw already released their frames on the jump path; emitting
|
|
782
|
-
// the fall-through releases after them would be dead double-release code.
|
|
783
|
-
if (s.kind !== "return" && s.kind !== "throw" && s.kind !== "rethrow" && s.kind !== "runtimeFence")
|
|
784
|
-
emitter.releaseFrame(frame);
|
|
785
|
-
}
|
|
786
|
-
/** try/catch/finally via pending-flag unwinding. Entering a try emits NO
|
|
787
|
-
* code: the try context is compile-time state (tryStack) that redirects
|
|
788
|
-
* unwinds inside the region to a label here instead of out of the
|
|
789
|
-
* function. Shape:
|
|
790
|
-
*
|
|
791
|
-
* { try body } unwinds inside release frames/scopes down to
|
|
792
|
-
* this statement's depths, then goto the handler
|
|
793
|
-
* goto after; (normal completion skips the handler)
|
|
794
|
-
* sc_catch_N:; (emitted only when some unwind targets it)
|
|
795
|
-
* scr_exc_clear(); catch TAKES the exception (payload discarded —
|
|
796
|
-
* { catch body } the supported catch form is bindingless)
|
|
797
|
-
* after/sc_fin_N:;
|
|
798
|
-
* { finally body } normal path
|
|
799
|
-
* goto sc_tryend_N;
|
|
800
|
-
* sc_finexc_N:; exception path: pending flag still set
|
|
801
|
-
* { finally body } (emitted twice — fresh temps/labels each time;
|
|
802
|
-
* <unwind> duplication is safe, and the pending flag is
|
|
803
|
-
* sc_tryend_N:; the dispatch)
|
|
804
|
-
*
|
|
805
|
-
* Without a catch, unwinds in the try body target sc_finexc_N directly.
|
|
806
|
-
* A catch body's own exceptions target sc_finexc_N (when a finally
|
|
807
|
-
* exists) or the ENCLOSING context — never its own handler. After the
|
|
808
|
-
* exception-path finally, propagation continues (emitUnwind: enclosing
|
|
809
|
-
* handler or dummy return). A `return` inside the try/catch body rides a
|
|
810
|
-
* THIRD finally copy (sc_finret_N — the pending-return path: value
|
|
811
|
-
* snapshotted into sc_pret at the return site, dispatch outward after
|
|
812
|
-
* the copy runs). Break/continue inline the crossed finally bodies via
|
|
813
|
-
* emitFinallysForJump before branching to their resolved targets; jumps
|
|
814
|
-
* out of plain try/catch need nothing beyond release-on-jump. */
|
|
815
|
-
export function emitTryCatch(emitter, s) {
|
|
816
|
-
const id = emitter.labelCounter++;
|
|
817
|
-
const hasCatch = s.catchBody !== null;
|
|
818
|
-
const hasFinally = s.finallyBody !== null;
|
|
819
|
-
const catchLabel = `sc_catch_${id}`;
|
|
820
|
-
const finExcLabel = `sc_finexc_${id}`;
|
|
821
|
-
const endLabel = `sc_tryend_${id}`;
|
|
822
|
-
// Where the try body's normal completion continues.
|
|
823
|
-
const afterTryLabel = hasFinally ? `sc_fin_${id}` : endLabel;
|
|
824
|
-
let afterTryLabelUsed = false;
|
|
825
|
-
const handler = {
|
|
826
|
-
label: hasCatch ? catchLabel : finExcLabel,
|
|
827
|
-
used: false,
|
|
828
|
-
frameDepth: emitter.frames.length,
|
|
829
|
-
scopeDepth: emitter.scopes.length,
|
|
830
|
-
};
|
|
831
|
-
// The pending-return region: returns inside tryBody/catchBody snapshot
|
|
832
|
-
// their value and jump here-ish (the pending-return finally copy below)
|
|
833
|
-
// instead of returning directly. Same depths as the unwind handler.
|
|
834
|
-
const retEntry = hasFinally
|
|
835
|
-
? {
|
|
836
|
-
label: `sc_finret_${id}`,
|
|
837
|
-
used: false,
|
|
838
|
-
frameDepth: emitter.frames.length,
|
|
839
|
-
scopeDepth: emitter.scopes.length,
|
|
840
|
-
tryDepth: emitter.tryStack.length,
|
|
841
|
-
body: s.finallyBody,
|
|
842
|
-
}
|
|
843
|
-
: null;
|
|
844
|
-
emitter.line(`/* try */${emitter.srcComment(s.loc)}`);
|
|
845
|
-
if (retEntry)
|
|
846
|
-
emitter.finallyStack.push(retEntry);
|
|
847
|
-
emitter.tryStack.push(handler);
|
|
848
|
-
emitter.emitBlock(s.tryBody);
|
|
849
|
-
emitter.tryStack.pop();
|
|
850
|
-
// Exceptions raised in the CATCH body unwind to the exception-path
|
|
851
|
-
// finally (pending stays set through it) when one exists.
|
|
852
|
-
const excHandler = {
|
|
853
|
-
label: finExcLabel,
|
|
854
|
-
used: !hasCatch && handler.used,
|
|
855
|
-
frameDepth: emitter.frames.length,
|
|
856
|
-
scopeDepth: emitter.scopes.length,
|
|
857
|
-
};
|
|
858
|
-
if (hasCatch && handler.used) {
|
|
859
|
-
if (!endsWithJump(s.tryBody)) {
|
|
860
|
-
emitter.line(`goto ${afterTryLabel};`);
|
|
861
|
-
afterTryLabelUsed = true;
|
|
862
|
-
}
|
|
863
|
-
if (hasFinally)
|
|
864
|
-
emitter.tryStack.push(excHandler);
|
|
865
|
-
// Generator bodies: a pending GENRET sentinel (.return(v) injected at
|
|
866
|
-
// a yield) is a RETURN completion, not a throw — catch must not take
|
|
867
|
-
// it. Re-unwind past this handler (finally still runs — the unwind
|
|
868
|
-
// targets the exception-path finally or the enclosing context; the
|
|
869
|
-
// runtime depths here equal the handler's, so no double release).
|
|
870
|
-
const genretPrologue = () => {
|
|
871
|
-
if (emitter.currentGenerator === null)
|
|
872
|
-
return;
|
|
873
|
-
emitter.line(`if (scr_exc_genret_pending()) { /* .return(): not catchable */`);
|
|
874
|
-
emitter.indent++;
|
|
875
|
-
emitter.emitUnwind();
|
|
876
|
-
emitter.indent--;
|
|
877
|
-
emitter.line(`}`);
|
|
878
|
-
};
|
|
879
|
-
if (s.catchLocalId !== null) {
|
|
880
|
-
// catch (e): the exception MOVES into the binding's snapshot box,
|
|
881
|
-
// owned by the catch body's scope (released on every exit — normal
|
|
882
|
-
// fall-through, jumps out, and unwinds from the body).
|
|
883
|
-
const binding = mangleLocal(s.catchLocalId);
|
|
884
|
-
emitter.line(`${catchLabel}:; /* catch (${emitter.currentLocals.get(s.catchLocalId)?.name ?? "e"}) — takes the exception */`);
|
|
885
|
-
genretPrologue();
|
|
886
|
-
emitter.emitBlock(s.catchBody, (scope) => {
|
|
887
|
-
emitter.line(`${binding} = scr_exc_take();`);
|
|
888
|
-
scope.push({ name: binding, type: CAUGHT });
|
|
889
|
-
});
|
|
890
|
-
}
|
|
891
|
-
else {
|
|
892
|
-
emitter.line(`${catchLabel}:; /* catch — takes the exception */`);
|
|
893
|
-
genretPrologue();
|
|
894
|
-
emitter.line(`scr_exc_clear();`);
|
|
895
|
-
emitter.emitBlock(s.catchBody);
|
|
896
|
-
}
|
|
897
|
-
if (hasFinally)
|
|
898
|
-
emitter.tryStack.pop();
|
|
899
|
-
// Normal completion of the catch falls through to afterTryLabel.
|
|
900
|
-
}
|
|
901
|
-
if (retEntry)
|
|
902
|
-
emitter.finallyStack.pop();
|
|
903
|
-
if (hasFinally) {
|
|
904
|
-
if (afterTryLabelUsed)
|
|
905
|
-
emitter.line(`${afterTryLabel}:;`);
|
|
906
|
-
emitter.line(`/* finally (normal path) */`);
|
|
907
|
-
emitter.emitBlock(s.finallyBody);
|
|
908
|
-
const needEnd = excHandler.used || retEntry.used;
|
|
909
|
-
if (needEnd)
|
|
910
|
-
emitter.line(`goto ${endLabel};`);
|
|
911
|
-
if (excHandler.used) {
|
|
912
|
-
// The pending exception is STASHED across the finally body (a
|
|
913
|
-
// ScrCaught snapshot, re-raised after) so the body runs with a
|
|
914
|
-
// CLEAN cell: its own may-throw calls' pending checks answer for
|
|
915
|
-
// themselves — not for the in-flight exception — and a generator
|
|
916
|
-
// suspending here (a yield inside a finally on the .return()/
|
|
917
|
-
// .throw() unwind) resumes into the REST of the finally, exactly
|
|
918
|
-
// Node. A throw inside the body REPLACES the stash (it unwinds
|
|
919
|
-
// past the release through the synthetic scope entry below —
|
|
920
|
-
// JS's replace semantics); normal completion re-raises the stash
|
|
921
|
-
// and keeps propagating.
|
|
922
|
-
const stash = `sc_fexc_${id}`;
|
|
923
|
-
emitter.line(`${finExcLabel}:; /* finally (exception path — stashed) */`);
|
|
924
|
-
emitter.line(`ScrCaught *${stash} = scr_exc_take();`);
|
|
925
|
-
emitter.scopes.push([{ name: stash, type: CAUGHT }]);
|
|
926
|
-
const suppressHandler = s.suppressFinallyErrors
|
|
927
|
-
? {
|
|
928
|
-
label: `sc_fsup_${id}`,
|
|
929
|
-
used: false,
|
|
930
|
-
frameDepth: emitter.frames.length,
|
|
931
|
-
scopeDepth: emitter.scopes.length,
|
|
932
|
-
}
|
|
933
|
-
: null;
|
|
934
|
-
if (suppressHandler)
|
|
935
|
-
emitter.tryStack.push(suppressHandler);
|
|
936
|
-
emitter.emitBlock(s.finallyBody);
|
|
937
|
-
if (suppressHandler)
|
|
938
|
-
emitter.tryStack.pop();
|
|
939
|
-
emitter.scopes.pop(); // normal completion keeps the stash for the re-raise
|
|
940
|
-
emitter.line(`scr_rethrow(${stash});`);
|
|
941
|
-
emitter.line(`scr_caught_release(${stash});`);
|
|
942
|
-
emitter.emitUnwind();
|
|
943
|
-
if (suppressHandler?.used) {
|
|
944
|
-
emitter.line(`${suppressHandler.label}:; /* disposal error suppresses body error */`);
|
|
945
|
-
emitter.line(`scr_exc_suppress(${stash}); /* consumes stash */`);
|
|
946
|
-
emitter.emitUnwind();
|
|
947
|
-
}
|
|
948
|
-
}
|
|
949
|
-
if (retEntry.used) {
|
|
950
|
-
// Pending-return path: a return in the try/catch body parked its
|
|
951
|
-
// value in sc_pret and jumped here after releasing down to this
|
|
952
|
-
// region. The finally body runs (third copy — fresh temps/labels,
|
|
953
|
-
// like the exception copy), then the dispatch continues outward:
|
|
954
|
-
// the next enclosing finally region of this function, or the
|
|
955
|
-
// actual return. A THROW inside this copy replaces the pending
|
|
956
|
-
// return (JS): the slot's owned value rides a synthetic scope
|
|
957
|
-
// entry so the unwind releases it.
|
|
958
|
-
emitter.line(`${retEntry.label}:; /* finally (pending-return path) */`);
|
|
959
|
-
const retT = emitter.currentReturnType;
|
|
960
|
-
const own = isRefCounted(retT);
|
|
961
|
-
const previousPendingScope = emitter.pendingReturnScopeIndex;
|
|
962
|
-
if (own) {
|
|
963
|
-
emitter.scopes.push([{ name: "sc_pret", type: retT }]);
|
|
964
|
-
emitter.pendingReturnScopeIndex = emitter.scopes.length - 1;
|
|
965
|
-
}
|
|
966
|
-
emitter.emitBlock(s.finallyBody);
|
|
967
|
-
if (own)
|
|
968
|
-
emitter.scopes.pop();
|
|
969
|
-
emitter.pendingReturnScopeIndex = previousPendingScope;
|
|
970
|
-
const outer = emitter.finallyStack[emitter.finallyStack.length - 1];
|
|
971
|
-
if (outer) {
|
|
972
|
-
outer.used = true;
|
|
973
|
-
emitter.releaseForJump(outer.frameDepth, outer.scopeDepth);
|
|
974
|
-
emitter.line(`goto ${outer.label};`);
|
|
975
|
-
}
|
|
976
|
-
else {
|
|
977
|
-
emitter.releaseForJump(0, 0);
|
|
978
|
-
emitter.line(retT.kind === "void" ? `return;` : `return sc_pret;`);
|
|
979
|
-
}
|
|
980
|
-
}
|
|
981
|
-
if (needEnd)
|
|
982
|
-
emitter.line(`${endLabel}:;`);
|
|
983
|
-
}
|
|
984
|
-
else if (afterTryLabelUsed) {
|
|
985
|
-
emitter.line(`${endLabel}:;`);
|
|
986
|
-
}
|
|
987
|
-
}
|
|
988
|
-
/** JS-exact switch as a goto chain — C `switch` cannot express lazily
|
|
989
|
-
* evaluated, arbitrary-expression case tests. Shape:
|
|
990
|
-
*
|
|
991
|
-
* disc temp
|
|
992
|
-
* NULL-reset of refcounted case-body locals (see below)
|
|
993
|
-
* per test, in source order: eval test; if (== disc) goto case_i;
|
|
994
|
-
* goto default (or end when there is none)
|
|
995
|
-
* case_0:; body_0 ─┐ bodies in source order fall through
|
|
996
|
-
* case_1:; body_1 ─┘ naturally, JS-exact
|
|
997
|
-
* scope releases (natural fall-off path)
|
|
998
|
-
* end:; (break jumps here, after releasing scopes itself)
|
|
999
|
-
*
|
|
1000
|
-
* All case bodies share ONE scope (JS: one lexical scope per switch body).
|
|
1001
|
-
* Because dispatch can jump PAST a varDecl into a later case, a refcounted
|
|
1002
|
-
* local of a skipped body is never written — and inside an enclosing loop
|
|
1003
|
-
* it still holds the pointer a previous iteration's scope exit already
|
|
1004
|
-
* released. The declarations are therefore NULL-reset up front; the
|
|
1005
|
-
* scope-exit releases rely on the runtime's NULL-tolerant release calls. */
|
|
1006
|
-
export function emitSwitch(emitter, s) {
|
|
1007
|
-
if (s.disc.type.kind !== "f64" && s.disc.type.kind !== "string" && s.disc.type.kind !== "bool") {
|
|
1008
|
-
throw new InternalCompilerError(`emitter bug: switch on ${s.disc.type.kind}`);
|
|
1009
|
-
}
|
|
1010
|
-
const id = emitter.labelCounter++;
|
|
1011
|
-
const endLabel = `sc_swend_${id}`;
|
|
1012
|
-
const caseLabel = (i) => `sc_swcase_${id}_${i}`;
|
|
1013
|
-
// The disc temp lives in the whole statement's frame: for a string
|
|
1014
|
-
// discriminant it stays alive across every test and body, released when
|
|
1015
|
-
// the switch statement ends (break lands before that release; return
|
|
1016
|
-
// sweeps frames itself).
|
|
1017
|
-
const disc = emitter.emitExpr(s.disc);
|
|
1018
|
-
// NULL-reset refcounted/boxed locals declared at the top level of case
|
|
1019
|
-
// bodies (nested blocks manage their own scopes on normal control flow).
|
|
1020
|
-
for (const c of s.cases) {
|
|
1021
|
-
for (const stmt of c.body) {
|
|
1022
|
-
if (stmt.kind !== "varDecl")
|
|
1023
|
-
continue;
|
|
1024
|
-
const local = emitter.currentLocals.get(stmt.localId);
|
|
1025
|
-
if (local.boxed || isRefCounted(local.type)) {
|
|
1026
|
-
emitter.line(`${mangleLocal(local.id)} = NULL; /* case-scoped ${local.name} */`);
|
|
1027
|
-
}
|
|
1028
|
-
}
|
|
1029
|
-
}
|
|
1030
|
-
// Dispatch: lazy source-order test evaluation (a test after the match
|
|
1031
|
-
// never runs). Each test's temps release right after its comparison.
|
|
1032
|
-
let defaultIdx = -1;
|
|
1033
|
-
s.cases.forEach((c, i) => {
|
|
1034
|
-
if (c.test === null) {
|
|
1035
|
-
defaultIdx = i;
|
|
1036
|
-
return;
|
|
1037
|
-
}
|
|
1038
|
-
emitter.frames.push([]);
|
|
1039
|
-
const t = emitter.emitExpr(c.test);
|
|
1040
|
-
const cmp = c.test.type.kind === "string"
|
|
1041
|
-
? `scr_str_eq(${disc.name}, ${t.name})`
|
|
1042
|
-
: `${disc.name} == ${t.name}`;
|
|
1043
|
-
const hit = emitter.newTemp(BOOL, cmp);
|
|
1044
|
-
emitter.releaseFrame(emitter.frames.pop());
|
|
1045
|
-
emitter.line(`if (${hit.name}) goto ${caseLabel(i)};`);
|
|
1046
|
-
});
|
|
1047
|
-
emitter.line(`goto ${defaultIdx >= 0 ? caseLabel(defaultIdx) : endLabel};`);
|
|
1048
|
-
// Bodies in source order: entering one falls through the rest (JS-exact)
|
|
1049
|
-
// until a break jumps to the end label.
|
|
1050
|
-
const target = {
|
|
1051
|
-
kind: "switch",
|
|
1052
|
-
endLabel,
|
|
1053
|
-
usedEnd: defaultIdx < 0,
|
|
1054
|
-
...(s.labels !== undefined && { labels: s.labels }),
|
|
1055
|
-
scopeDepth: emitter.scopes.length,
|
|
1056
|
-
frameDepth: emitter.frames.length,
|
|
1057
|
-
finallyDepth: emitter.finallyStack.length,
|
|
1058
|
-
};
|
|
1059
|
-
emitter.jumpTargets.push(target);
|
|
1060
|
-
emitter.scopes.push([]);
|
|
1061
|
-
s.cases.forEach((c, i) => {
|
|
1062
|
-
emitter.line(`${caseLabel(i)}:;`);
|
|
1063
|
-
emitter.indent++;
|
|
1064
|
-
emitter.emitStmts(c.body);
|
|
1065
|
-
emitter.indent--;
|
|
1066
|
-
});
|
|
1067
|
-
emitter.jumpTargets.pop();
|
|
1068
|
-
const scope = emitter.scopes.pop();
|
|
1069
|
-
// Natural fall-off of the last body releases the shared scope here; a
|
|
1070
|
-
// jump (break/return/continue/throw) already released it before jumping.
|
|
1071
|
-
const lastBody = s.cases[s.cases.length - 1]?.body;
|
|
1072
|
-
if (!lastBody || !endsWithJump(lastBody))
|
|
1073
|
-
emitter.releaseFrame(scope);
|
|
1074
|
-
if (target.usedEnd)
|
|
1075
|
-
emitter.line(`${endLabel}:;`);
|
|
1076
|
-
}
|
|
1077
|
-
/** Emits `if (cond) ` followed by a block on the same line for readability. */
|
|
1078
|
-
export function mergeBrace(emitter, emitBlockFn) {
|
|
1079
|
-
const head = emitter.lines.pop();
|
|
1080
|
-
let before = emitter.lines.length;
|
|
1081
|
-
emitBlockFn();
|
|
1082
|
-
while (emitter.lines[before]?.startsWith("#line "))
|
|
1083
|
-
before++;
|
|
1084
|
-
emitter.lines[before] = head + emitter.lines[before].trimStart();
|
|
1085
|
-
}
|
|
1086
|
-
/** Evaluates `expr` in its own statement frame inside an already-open
|
|
1087
|
-
* branch and moves the result into the C lvalue `target`: the chosen
|
|
1088
|
-
* value's ownership transfers, every other temp the evaluation allocated
|
|
1089
|
-
* releases inside the branch. The shared core of the lazily-branched
|
|
1090
|
-
* expressions (`logical`, `ternary`); the caller owns the surrounding
|
|
1091
|
-
* braces/indentation and registers `target` in ITS frame. */
|
|
1092
|
-
export function emitBranchInto(emitter, target, expr) {
|
|
1093
|
-
emitter.frames.push([]);
|
|
1094
|
-
const v = emitter.emitExpr(expr);
|
|
1095
|
-
emitter.moveTemp(v);
|
|
1096
|
-
emitter.line(`${target} = ${v.name};`);
|
|
1097
|
-
emitter.releaseFrame(emitter.frames.pop());
|
|
1098
|
-
}
|
|
1099
|
-
/** Evaluates a condition; its string temps are released before the branch,
|
|
1100
|
-
* which is safe because the result is a scalar bool. */
|
|
1101
|
-
export function emitCondition(emitter, cond) {
|
|
1102
|
-
const t = emitter.emitExpr(cond);
|
|
1103
|
-
const frame = emitter.currentFrame();
|
|
1104
|
-
emitter.releaseFrame(frame);
|
|
1105
|
-
frame.length = 0;
|
|
1106
|
-
return t.name;
|
|
1107
|
-
}
|
|
1108
|
-
//# sourceMappingURL=stmts.js.map
|