@scriptc/compiler 0.1.7 → 0.2.0
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 +73 -24
- 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 +107 -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 +70 -28
- 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 +16 -2
- package/dist/backend/llvm/dyn.js +494 -165
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +596 -1
- package/dist/backend/llvm/emitter.js +695 -410
- 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 +1 -1
- package/dist/backend/llvm/expr-bytes.js +32 -14
- 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 +9 -5
- 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 +62 -74
- 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 +51 -30
- 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 +43 -4
- 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 +102 -121
- 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 +21 -16
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +117 -1
- 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 +35 -130
- 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 +10 -25
- package/dist/backend/native-toolchain.js +31 -211
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +5 -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 +70 -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 +95 -30
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +65 -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 +3 -3
- 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 +3 -3
- 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 +63 -0
- package/dist/frontend/lowering/class-callbacks.js.map +1 -0
- package/dist/frontend/lowering/class-descriptors.d.ts +9 -0
- package/dist/frontend/lowering/class-descriptors.js +73 -0
- package/dist/frontend/lowering/class-descriptors.js.map +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +41 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +803 -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 +92 -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 +64 -0
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -0
- package/dist/frontend/lowering/class-method-values.d.ts +10 -0
- package/dist/frontend/lowering/class-method-values.js +170 -0
- package/dist/frontend/lowering/class-method-values.js.map +1 -0
- package/dist/frontend/lowering/class-prototypes.d.ts +16 -0
- package/dist/frontend/lowering/class-prototypes.js +134 -0
- package/dist/frontend/lowering/class-prototypes.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 +164 -155
- 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 +39 -16
- 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 +11 -0
- package/dist/frontend/lowering/error-methods.js +78 -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 +49 -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 +124 -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 +473 -178
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +20 -8
- 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 +93 -0
- package/dist/frontend/lowering/function-context.js +103 -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 +10 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +105 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -0
- package/dist/frontend/lowering/lib-boundary.d.ts +2 -1
- package/dist/frontend/lowering/lib-boundary.js +59 -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 +12 -0
- package/dist/frontend/lowering/lower-builtin-values.js +139 -0
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.d.ts +27 -41
- package/dist/frontend/lowering/lower-builtins.js +539 -343
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +20 -17
- package/dist/frontend/lowering/lower-calls.js +1236 -353
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +83 -45
- package/dist/frontend/lowering/lower-classes.js +952 -339
- 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 +27 -32
- package/dist/frontend/lowering/lower-containers.js +796 -151
- 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.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 +35 -11
- package/dist/frontend/lowering/lower-exprs.js +1674 -779
- 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 +77 -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 +5 -8
- package/dist/frontend/lowering/lower-island.js +34 -23
- 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 +233 -30
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- 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 +10 -14
- package/dist/frontend/lowering/lower-stmts.js +728 -496
- 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 +19 -10
- 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 +113 -189
- package/dist/frontend/lowering/lowerer.js +1031 -672
- 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 +26 -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 +8 -3
- package/dist/frontend/lowering/surfaces.js +61 -29
- 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 +10 -0
- package/dist/frontend/lowering/text-decoder-encoding.js +77 -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 +5 -4
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-prune.test.js +1 -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 +38 -19
- package/dist/frontend/program.js +344 -169
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +87 -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 +21 -15
- 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 +52 -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 +25 -17
- package/dist/frontend/type-mapper.js +465 -121
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +123 -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 +21 -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 +291 -152
- package/dist/ir/ir.js +588 -881
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +127 -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 +19 -12
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.d.ts +1 -0
- package/dist/ir/serialize.test.js +53 -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 +1942 -1491
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +476 -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 +135 -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 +74 -0
- package/dist/native/toolchain.js.map +1 -0
- package/dist/native/toolchain.test.d.ts +1 -0
- package/dist/native/toolchain.test.js +33 -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 +52 -18
- 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/async.js
DELETED
|
@@ -1,1317 +0,0 @@
|
|
|
1
|
-
import { InternalCompilerError } from "../../errors.js";
|
|
2
|
-
import { mangleArgPack, mangleAsyncSpawn, mangleChildDataThunk, mangleChildExitThunk, mangleCloseBindThunk, mangleCloseOverrideWrap, mangleConnectResThunk, mangleConnectSockThunk, mangleDgramMsgThunk, mangleDnsLookupThunk, mangleField, mangleFsRenameThunk, mangleFunction, mangleGenDrop, mangleGenResThunk, mangleGenSpawn, mangleGlobal, mangleLocal, mangleRaceThunk, mangleRawParam, mangleNetLookupAnswerThunk, mangleEmitterInvokeThunk, mangleStreamCbThunk, mangleStreamDoneFn, mangleRecordNew, mangleRecordRelease, mangleRecordStruct, mangleResolveThunk, mangleSniAnswerThunk, mangleTrampoline } from "../mangle.js";
|
|
3
|
-
import { cDecl, cType, releaseCallC, retainCallC, vAdapters } from "./types.js";
|
|
4
|
-
import { isRefCounted, isUnitType, typeEquals, typeKey } from "../../ir/ir.js";
|
|
5
|
-
/** The argument-pack ABI and trampoline prefix shared by async functions
|
|
6
|
-
* and generators. Their promise/generator completion and spawn tails stay
|
|
7
|
-
* with the callers below. */
|
|
8
|
-
function emitArgPackAndTrampolinePrologue(fn) {
|
|
9
|
-
const pack = mangleArgPack(fn.name);
|
|
10
|
-
const lifted = fn.captures !== undefined;
|
|
11
|
-
const fields = [];
|
|
12
|
-
if (lifted)
|
|
13
|
-
fields.push("ScrClosure *sc_env;");
|
|
14
|
-
const boxedIds = new Set(fn.locals.filter((l) => l.boxed).map((l) => l.id));
|
|
15
|
-
const pname = (p) => boxedIds.has(p.localId) ? mangleRawParam(p.localId) : mangleLocal(p.localId);
|
|
16
|
-
for (const p of fn.params)
|
|
17
|
-
fields.push(`${cDecl(p.type, pname(p))};`);
|
|
18
|
-
const definitions = [``, `typedef struct { ${fields.join(" ") || "char sc_unused;"} } ${pack};`];
|
|
19
|
-
const callArgs = [
|
|
20
|
-
...(lifted ? ["sc_a.sc_env"] : []),
|
|
21
|
-
...fn.params.map((p) => `sc_a.${pname(p)}`),
|
|
22
|
-
].join(", ");
|
|
23
|
-
const ret = fn.returnType;
|
|
24
|
-
const bodyCall = `${mangleFunction(fn.name)}(${callArgs})`;
|
|
25
|
-
const lines = [
|
|
26
|
-
`static void ${mangleTrampoline(fn.name)}(ScrFiber *sc_self, void *sc_ap0) {`,
|
|
27
|
-
` ${pack} sc_a = *(${pack} *)sc_ap0;`,
|
|
28
|
-
` free(sc_ap0);`,
|
|
29
|
-
];
|
|
30
|
-
if (ret.kind === "void") {
|
|
31
|
-
lines.push(` ${bodyCall};`);
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
lines.push(` ${cDecl(ret, "sc_r")} = ${bodyCall};`);
|
|
35
|
-
}
|
|
36
|
-
if (lifted)
|
|
37
|
-
lines.push(` scr_closure_release(sc_a.sc_env);`);
|
|
38
|
-
const spawnParams = [
|
|
39
|
-
...(lifted ? ["ScrClosure *sc_env"] : []),
|
|
40
|
-
...fn.params.map((p) => cDecl(p.type, pname(p))),
|
|
41
|
-
];
|
|
42
|
-
const argPackLines = [
|
|
43
|
-
` ${pack} *sc_ap = malloc(sizeof *sc_ap);`,
|
|
44
|
-
` if (!sc_ap) { scr_trap("scriptc: out of memory\\n"); }`,
|
|
45
|
-
...(lifted ? [` sc_ap->sc_env = scr_closure_retain(sc_env);`] : []),
|
|
46
|
-
...fn.params.map((p) => ` sc_ap->${pname(p)} = ${pname(p)};`),
|
|
47
|
-
];
|
|
48
|
-
return { definitions, pack, lifted, pname, ret, lines, spawnParams, argPackLines };
|
|
49
|
-
}
|
|
50
|
-
/** Per-async-function machinery: an argument pack, a fiber trampoline
|
|
51
|
-
* (unpacks, runs the ordinary compiled body, settles the promise), and a
|
|
52
|
-
* spawn wrapper call sites use. Lifted async lambdas additionally thread
|
|
53
|
-
* their closure env through the pack (+1, released after the body). */
|
|
54
|
-
export function emitAsyncScaffolding(emitter, out) {
|
|
55
|
-
for (const fn of emitter.mod.functions) {
|
|
56
|
-
if (!fn.async || fn.generator !== undefined)
|
|
57
|
-
continue;
|
|
58
|
-
const { definitions, ret, lines, spawnParams, argPackLines } = emitArgPackAndTrampolinePrologue(fn);
|
|
59
|
-
out.push(...definitions);
|
|
60
|
-
lines.push(` if (!scr_exc_pending()) {`);
|
|
61
|
-
switch (ret.kind) {
|
|
62
|
-
case "void":
|
|
63
|
-
lines.push(` scr_promise_fulfill_void(scr_fiber_promise(sc_self));`);
|
|
64
|
-
break;
|
|
65
|
-
case "f64":
|
|
66
|
-
case "date":
|
|
67
|
-
lines.push(` scr_promise_fulfill_f64(scr_fiber_promise(sc_self), sc_r);`);
|
|
68
|
-
break;
|
|
69
|
-
case "bool":
|
|
70
|
-
lines.push(` scr_promise_fulfill_bool(scr_fiber_promise(sc_self), sc_r);`);
|
|
71
|
-
break;
|
|
72
|
-
case "string":
|
|
73
|
-
lines.push(` scr_promise_fulfill_str(scr_fiber_promise(sc_self), sc_r);`);
|
|
74
|
-
break;
|
|
75
|
-
default: {
|
|
76
|
-
const v = vAdapters(ret);
|
|
77
|
-
lines.push(` scr_promise_fulfill_ref(scr_fiber_promise(sc_self), sc_r, ${v.retain}, ${v.release}, ${emitter.traceArgC(ret)});`);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
lines.push(` }`);
|
|
81
|
-
if (ret.kind !== "void" && isRefCounted(ret)) {
|
|
82
|
-
// An escaping throw means sc_r is the never-read dummy (NULL).
|
|
83
|
-
lines.push(` else { ${releaseCallC(ret, "sc_r")}; }`);
|
|
84
|
-
}
|
|
85
|
-
lines.push(`}`);
|
|
86
|
-
out.push(...lines);
|
|
87
|
-
const cache = fn.asyncCacheGlobal !== undefined ? mangleGlobal(fn.asyncCacheGlobal) : null;
|
|
88
|
-
const cycleCache = fn.asyncCycleCacheGlobal !== undefined ? mangleGlobal(fn.asyncCycleCacheGlobal) : null;
|
|
89
|
-
out.push(`static ScrPromise *${mangleAsyncSpawn(fn.name)}(${spawnParams.join(", ") || "void"}) {`, ...(cache !== null
|
|
90
|
-
? [` if (${cache}) return scr_promise_retain(${cache});`]
|
|
91
|
-
: []), ...argPackLines, ` ScrPromise *sc_p = scr_async_spawn(&${mangleTrampoline(fn.name)}, sc_ap);`, ...(cache !== null
|
|
92
|
-
? [
|
|
93
|
-
// Module evaluation promises are loader-owned from the
|
|
94
|
-
// moment evaluation starts. Mark even a pending promise
|
|
95
|
-
// handled before a later sibling initializer can throw and
|
|
96
|
-
// unwind past the dependency wait.
|
|
97
|
-
` scr_promise_mark_handled(sc_p);`,
|
|
98
|
-
]
|
|
99
|
-
: []), ...(cache !== null
|
|
100
|
-
? [
|
|
101
|
-
// scr_async_spawn runs eagerly. An admitted async import
|
|
102
|
-
// cycle can therefore re-enter this initializer after its
|
|
103
|
-
// guard sets but before this outer spawn returns; that
|
|
104
|
-
// guarded inner spawn temporarily fills the cache. Replace
|
|
105
|
-
// it ownership-safely when the real evaluation promise
|
|
106
|
-
// arrives.
|
|
107
|
-
` ScrPromise *sc_cache_owned = scr_promise_retain(sc_p);`,
|
|
108
|
-
` scr_promise_release(${cache});`,
|
|
109
|
-
` ${cache} = sc_cache_owned;`,
|
|
110
|
-
]
|
|
111
|
-
: []), ...(cycleCache !== null
|
|
112
|
-
? [
|
|
113
|
-
// Every member of an async SCC publishes while eager spawn
|
|
114
|
-
// recursion unwinds. The outermost wrapper writes last, so
|
|
115
|
-
// this records the member that actually rooted evaluation.
|
|
116
|
-
` ScrPromise *sc_cycle_cache_owned = scr_promise_retain(sc_p);`,
|
|
117
|
-
` scr_promise_release(${cycleCache});`,
|
|
118
|
-
` ${cycleCache} = sc_cycle_cache_owned;`,
|
|
119
|
-
]
|
|
120
|
-
: []), ` return sc_p;`, `}`);
|
|
121
|
-
}
|
|
122
|
-
emitGenScaffolding(emitter, out);
|
|
123
|
-
}
|
|
124
|
-
/** Per-generator-function machinery — the async scaffolding's lazy
|
|
125
|
-
* sibling: the same argument pack, a fiber trampoline whose epilogue
|
|
126
|
-
* stores the COMPLETION value (or consumes the GENRET sentinel,
|
|
127
|
-
* promoting the parked .return value), a spawn wrapper that only
|
|
128
|
-
* ALLOCATES the suspended fiber (nothing runs until the first .next()),
|
|
129
|
-
* and the never-started teardown that drops the packed (+1) arguments. */
|
|
130
|
-
function emitGenScaffolding(emitter, out) {
|
|
131
|
-
for (const fn of emitter.mod.functions) {
|
|
132
|
-
if (!fn.generator)
|
|
133
|
-
continue;
|
|
134
|
-
const { definitions, pack, lifted, pname, ret, lines, spawnParams, argPackLines } = emitArgPackAndTrampolinePrologue(fn);
|
|
135
|
-
out.push(...definitions);
|
|
136
|
-
lines.push(` ScrGen *sc_g = scr_gen_of_fiber(sc_self);`);
|
|
137
|
-
// Normal completion stores the (typed) return value; void completes
|
|
138
|
-
// with the NONE slot — JS's undefined done-value. A GENRET unwind
|
|
139
|
-
// consumes the sentinel and promotes the parked .return value; a
|
|
140
|
-
// real exception stays pending (the consumer-side resume moves it).
|
|
141
|
-
const store = (() => {
|
|
142
|
-
switch (ret.kind) {
|
|
143
|
-
case "void":
|
|
144
|
-
return null;
|
|
145
|
-
case "f64":
|
|
146
|
-
case "date":
|
|
147
|
-
return `scr_gen_out_f64(sc_g, sc_r);`;
|
|
148
|
-
case "bool":
|
|
149
|
-
return `scr_gen_out_bool(sc_g, sc_r);`;
|
|
150
|
-
default: {
|
|
151
|
-
const v = vAdapters(ret);
|
|
152
|
-
return `scr_gen_out_ref(sc_g, sc_r, ${v.release});`;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
})();
|
|
156
|
-
lines.push(` if (!scr_exc_pending()) {`, ...(store ? [` ${store}`] : [` /* void body: the done value is undefined (NONE) */`]), ` } else {`, ` if (scr_exc_genret_pending()) { scr_exc_clear(); scr_gen_ret_to_out(sc_g); }`, ...(ret.kind !== "void" && isRefCounted(ret)
|
|
157
|
-
? [` ${releaseCallC(ret, "sc_r")}; /* unwound: the never-read dummy */`]
|
|
158
|
-
: []), ` }`, `}`);
|
|
159
|
-
out.push(...lines);
|
|
160
|
-
let settleAsync = null;
|
|
161
|
-
if (fn.async) {
|
|
162
|
-
const genT = {
|
|
163
|
-
kind: "generator",
|
|
164
|
-
async: true,
|
|
165
|
-
yieldT: fn.generator.yieldT,
|
|
166
|
-
retT: ret,
|
|
167
|
-
nextT: fn.generator.nextT,
|
|
168
|
-
};
|
|
169
|
-
const resultT = fn.generator.resultType;
|
|
170
|
-
const build = genResultThunkFor(emitter, genT, resultT);
|
|
171
|
-
settleAsync = `${build}_async`;
|
|
172
|
-
const settleKey = `async:${typeKey(genT)}`;
|
|
173
|
-
if (!emitter.genResThunks.has(settleKey)) {
|
|
174
|
-
emitter.genResThunks.set(settleKey, settleAsync);
|
|
175
|
-
const adapters = vAdapters(resultT);
|
|
176
|
-
out.push(`static void ${settleAsync}(ScrGen *sc_g, ScrPromise *sc_p);`);
|
|
177
|
-
emitter.walkerDefs.push(`static void ${settleAsync}(ScrGen *sc_g, ScrPromise *sc_p) {`, ` ${mangleRecordStruct(resultT.shapeId)} *sc_r = ${build}(sc_g);`, ` scr_promise_fulfill_ref(sc_p, sc_r, ${adapters.retain}, ${adapters.release}, ${emitter.traceArgC(resultT)});`, `}`, ``);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
out.push(`static void ${mangleGenDrop(fn.name)}(void *sc_ap0) {`, ` ${pack} sc_a = *(${pack} *)sc_ap0;`, ` free(sc_ap0);`, ...(lifted ? [` scr_closure_release(sc_a.sc_env);`] : []), ...fn.params
|
|
181
|
-
.filter((p) => isRefCounted(p.type))
|
|
182
|
-
.map((p) => ` ${releaseCallC(p.type, `sc_a.${pname(p)}`)};`), ...(!lifted && !fn.params.some((p) => isRefCounted(p.type)) ? [` (void)sc_a;`] : []), `}`, `static ScrGen *${mangleGenSpawn(fn.name)}(${spawnParams.join(", ") || "void"}) {`, ...argPackLines, settleAsync === null
|
|
183
|
-
? ` return scr_gen_new(&${mangleTrampoline(fn.name)}, sc_ap, &${mangleGenDrop(fn.name)});`
|
|
184
|
-
: ` return scr_async_gen_new(&${mangleTrampoline(fn.name)}, sc_ap, &${mangleGenDrop(fn.name)}, &${settleAsync});`, `}`);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
/** Interned per-union child exit adapter: the runtime invokes
|
|
188
|
-
* adapter(cb, has_code, code, signal_name); the adapter builds the
|
|
189
|
-
* `number | null` union value (tags are program data — the frontend
|
|
190
|
-
* guaranteed the param IS that union) and calls the listener, which
|
|
191
|
-
* owns the union param per the universal convention (unit-arm
|
|
192
|
-
* instances are immortal; their release is a no-op). The one-param
|
|
193
|
-
* shape ignores the signal. */
|
|
194
|
-
export function childExitThunkFor(emitter, param) {
|
|
195
|
-
if (param.kind !== "union")
|
|
196
|
-
throw new InternalCompilerError("emitter bug: exit listener param not a union");
|
|
197
|
-
const key = param.unionId;
|
|
198
|
-
let sym = emitter.childExitThunks.get(key);
|
|
199
|
-
if (!sym) {
|
|
200
|
-
sym = mangleChildExitThunk(emitter.childExitThunks.size);
|
|
201
|
-
emitter.childExitThunks.set(key, sym);
|
|
202
|
-
const def = emitter.unionsById.get(param.unionId);
|
|
203
|
-
const f64Tag = def ? def.arms.findIndex((a) => a.kind === "f64") : -1;
|
|
204
|
-
const nullTag = def ? def.arms.findIndex((a) => a.kind === "nullT") : -1;
|
|
205
|
-
if (f64Tag < 0 || nullTag < 0) {
|
|
206
|
-
throw new InternalCompilerError("emitter bug: exit listener union lacks its arms");
|
|
207
|
-
}
|
|
208
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, bool sc_has, double sc_code, const char *sc_sig);`);
|
|
209
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, bool sc_has, double sc_code, const char *sc_sig) {`, ` (void)sc_sig;`, ` ScrUnion *sc_u = sc_has ? scr_union_new_f64(${f64Tag}, sc_code)`, ` : ${emitter.unitInstanceRef(param.unionId, nullTag)};`, ` ((void (*)(ScrClosure *, ScrUnion *))sc_cb->fn)(sc_cb, sc_u);`, `}`);
|
|
210
|
-
}
|
|
211
|
-
return sym;
|
|
212
|
-
}
|
|
213
|
-
/** The TWO-parameter exit adapter — Node's `(code, signal)` listener:
|
|
214
|
-
* the code union as above plus the signal as its own `string | null`
|
|
215
|
-
* union (a fresh string from the runtime's static signal name when a
|
|
216
|
-
* signal killed the child, the null arm otherwise). */
|
|
217
|
-
export function childExitSignalThunkFor(emitter, codeParam, sigParam) {
|
|
218
|
-
if (codeParam.kind !== "union" || sigParam.kind !== "union") {
|
|
219
|
-
throw new InternalCompilerError("emitter bug: exit listener params not unions");
|
|
220
|
-
}
|
|
221
|
-
const key = `${codeParam.unionId}+${sigParam.unionId}`;
|
|
222
|
-
let sym = emitter.childExitThunks.get(key);
|
|
223
|
-
if (!sym) {
|
|
224
|
-
sym = mangleChildExitThunk(emitter.childExitThunks.size);
|
|
225
|
-
emitter.childExitThunks.set(key, sym);
|
|
226
|
-
const codeDef = emitter.unionsById.get(codeParam.unionId);
|
|
227
|
-
const f64Tag = codeDef ? codeDef.arms.findIndex((a) => a.kind === "f64") : -1;
|
|
228
|
-
const codeNullTag = codeDef ? codeDef.arms.findIndex((a) => a.kind === "nullT") : -1;
|
|
229
|
-
const sigDef = emitter.unionsById.get(sigParam.unionId);
|
|
230
|
-
const strTag = sigDef ? sigDef.arms.findIndex((a) => a.kind === "string") : -1;
|
|
231
|
-
const sigNullTag = sigDef ? sigDef.arms.findIndex((a) => a.kind === "nullT") : -1;
|
|
232
|
-
if (f64Tag < 0 || codeNullTag < 0 || strTag < 0 || sigNullTag < 0) {
|
|
233
|
-
throw new InternalCompilerError("emitter bug: exit listener unions lack their arms");
|
|
234
|
-
}
|
|
235
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, bool sc_has, double sc_code, const char *sc_sig);`);
|
|
236
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, bool sc_has, double sc_code, const char *sc_sig) {`, ` ScrUnion *sc_u = sc_has ? scr_union_new_f64(${f64Tag}, sc_code)`, ` : ${emitter.unitInstanceRef(codeParam.unionId, codeNullTag)};`, ` ScrUnion *sc_s = sc_sig`, ` ? scr_union_new_ref(${strTag}, scr_str_new(sc_sig, strlen(sc_sig)), &scr_str_retain_v, &scr_str_release_v, NULL)`, ` : ${emitter.unitInstanceRef(sigParam.unionId, sigNullTag)};`, ` ((void (*)(ScrClosure *, ScrUnion *, ScrUnion *))sc_cb->fn)(sc_cb, sc_u, sc_s);`, `}`);
|
|
237
|
-
}
|
|
238
|
-
return sym;
|
|
239
|
-
}
|
|
240
|
-
/** Interned per-union child-stream data adapter: the runtime invokes
|
|
241
|
-
* adapter(cb, chunk) with the chunk BORROWED; the adapter wraps a
|
|
242
|
-
* retained chunk at the union's Buffer arm (the frontend guaranteed
|
|
243
|
-
* the arm exists — the ngrok `Buffer | string` listener; strings never
|
|
244
|
-
* fire from a pipe) and calls the listener, which owns the union param
|
|
245
|
-
* per the universal convention. */
|
|
246
|
-
export function childDataThunkFor(emitter, param) {
|
|
247
|
-
if (param.kind !== "union")
|
|
248
|
-
throw new InternalCompilerError("emitter bug: stream data listener param not a union");
|
|
249
|
-
const key = param.unionId;
|
|
250
|
-
let sym = emitter.childDataThunks.get(key);
|
|
251
|
-
if (!sym) {
|
|
252
|
-
sym = mangleChildDataThunk(emitter.childDataThunks.size);
|
|
253
|
-
emitter.childDataThunks.set(key, sym);
|
|
254
|
-
const def = emitter.unionsById.get(param.unionId);
|
|
255
|
-
const bytesTag = def ? def.arms.findIndex((a) => a.kind === "bytes" && a.elem === "u8") : -1;
|
|
256
|
-
if (bytesTag < 0) {
|
|
257
|
-
throw new InternalCompilerError("emitter bug: stream data listener union lacks its Buffer arm");
|
|
258
|
-
}
|
|
259
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrBytes *sc_chunk);`);
|
|
260
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrBytes *sc_chunk) {`, ` ScrUnion *sc_u = scr_union_new_ref(${bytesTag}, scr_bytes_retain(sc_chunk), &scr_bytes_retain_v, &scr_bytes_release_v, NULL);`, ` ((void (*)(ScrClosure *, ScrUnion *))sc_cb->fn)(sc_cb, sc_u);`, `}`);
|
|
261
|
-
}
|
|
262
|
-
return sym;
|
|
263
|
-
}
|
|
264
|
-
/** Interned per-union bound-close adapter (`server.close.bind(server)`
|
|
265
|
-
* as a value): invoked through the closure ABI with the callback-union
|
|
266
|
-
* argument, it closes the server DIRECTLY (never through the override —
|
|
267
|
-
* the proxy-through idiom cannot recurse), registering a present
|
|
268
|
-
* callback as a once-'close' listener — a ONE-param callback (Node's
|
|
269
|
-
* `(err?: Error) => void`) behind an emitted zero-arg trampoline that
|
|
270
|
-
* fires it with the undefined arm (a clean close carries no error) —
|
|
271
|
-
* and answers the +1 server (Node's chaining return). */
|
|
272
|
-
export function closeBindThunkFor(emitter, cbUnion, retServer) {
|
|
273
|
-
if (cbUnion.kind !== "union")
|
|
274
|
-
throw new InternalCompilerError("emitter bug: bound-close callback param not a union");
|
|
275
|
-
const key = `${cbUnion.unionId}:${retServer ? "srv" : "void"}`;
|
|
276
|
-
let sym = emitter.closeBindThunks.get(key);
|
|
277
|
-
if (sym)
|
|
278
|
-
return sym;
|
|
279
|
-
sym = mangleCloseBindThunk(emitter.closeBindThunks.size);
|
|
280
|
-
emitter.closeBindThunks.set(key, sym);
|
|
281
|
-
const def = emitter.unionsById.get(cbUnion.unionId);
|
|
282
|
-
const funcTag = def ? def.arms.findIndex((a) => a.kind === "func") : -1;
|
|
283
|
-
const funcArm = funcTag >= 0 ? def.arms[funcTag] : null;
|
|
284
|
-
if (!funcArm)
|
|
285
|
-
throw new InternalCompilerError("emitter bug: bound-close callback union lacks its func arm");
|
|
286
|
-
const oneParam = funcArm.params.length === 1;
|
|
287
|
-
let trampoline = null;
|
|
288
|
-
if (oneParam) {
|
|
289
|
-
const errParam = funcArm.params[0];
|
|
290
|
-
if (errParam.kind !== "union") {
|
|
291
|
-
throw new InternalCompilerError("emitter bug: bound-close callback's err param is not a union");
|
|
292
|
-
}
|
|
293
|
-
const errDef = emitter.unionsById.get(errParam.unionId);
|
|
294
|
-
const undefTag = errDef ? errDef.arms.findIndex((a) => a.kind === "undefinedT") : -1;
|
|
295
|
-
if (undefTag < 0)
|
|
296
|
-
throw new InternalCompilerError("emitter bug: bound-close err union lacks its undefined arm");
|
|
297
|
-
trampoline = `${sym}_cb`;
|
|
298
|
-
emitter.walkerProtos.push(`static void ${trampoline}(ScrClosure *sc_self);`);
|
|
299
|
-
emitter.walkerDefs.push(`static void ${trampoline}(ScrClosure *sc_self) { /* close cb: fire with no error */`, ` ScrClosure *sc_inner = (ScrClosure *)scr_box_get_ref(sc_self->caps[0]); /* +1 */`, ` ((void (*)(ScrClosure *, ScrUnion *))sc_inner->fn)(sc_inner, ${emitter.unitInstanceRef(errParam.unionId, undefTag)});`, ` scr_closure_release(sc_inner);`, `}`);
|
|
300
|
-
}
|
|
301
|
-
const retC = retServer ? "ScrNetServer *" : "void";
|
|
302
|
-
emitter.walkerProtos.push(`static ${retC}${retServer ? "" : " "}${sym}(ScrClosure *sc_self, ScrUnion *sc_cb);`);
|
|
303
|
-
emitter.walkerDefs.push(`static ${retC}${retServer ? "" : " "}${sym}(ScrClosure *sc_self, ScrUnion *sc_cb) { /* bound server.close */`, ` ScrNetServer *sc_srv = (ScrNetServer *)scr_box_get_ref(sc_self->caps[0]); /* +1 */`, ` ScrClosure *sc_reg = NULL;`, ` if (sc_cb->tag == ${funcTag}) {`, ...(oneParam
|
|
304
|
-
? [
|
|
305
|
-
` sc_reg = scr_closure_new((void *)&${trampoline}, 1);`,
|
|
306
|
-
` sc_reg->caps[0] = scr_box_new(SCR_BOX_FUNC);`,
|
|
307
|
-
` scr_box_set_ref(sc_reg->caps[0], scr_closure_retain((ScrClosure *)scr_union_peek(sc_cb)));`,
|
|
308
|
-
]
|
|
309
|
-
: [` sc_reg = scr_closure_retain((ScrClosure *)scr_union_peek(sc_cb));`]), ` }`, ` scr_union_release(sc_cb); /* the callee owns its +1 param */`, ` scr_net_server_close_direct(sc_srv, sc_reg); /* sc_reg moves */`, ...(retServer
|
|
310
|
-
? [` return sc_srv; /* +1 from the env read */`]
|
|
311
|
-
: [` scr_net_server_release(sc_srv);`]), `}`);
|
|
312
|
-
return sym;
|
|
313
|
-
}
|
|
314
|
-
/** Interned close-override zero-arg wrapper (`server.close = fn`): the
|
|
315
|
-
* stored override must be invocable by the runtime WITHOUT program
|
|
316
|
-
* types, so this wrapper carries the user function and fires it with
|
|
317
|
-
* the undefined-arm callback argument (tags are program data),
|
|
318
|
-
* releasing the chaining-return server when the signature answers one. */
|
|
319
|
-
export function closeOverrideWrapFor(emitter, cbUnion, retServer) {
|
|
320
|
-
if (cbUnion.kind !== "union")
|
|
321
|
-
throw new InternalCompilerError("emitter bug: close-override callback param not a union");
|
|
322
|
-
const key = `${cbUnion.unionId}:${retServer ? "srv" : "void"}`;
|
|
323
|
-
let sym = emitter.closeOverrideWraps.get(key);
|
|
324
|
-
if (sym)
|
|
325
|
-
return sym;
|
|
326
|
-
sym = mangleCloseOverrideWrap(emitter.closeOverrideWraps.size);
|
|
327
|
-
emitter.closeOverrideWraps.set(key, sym);
|
|
328
|
-
const def = emitter.unionsById.get(cbUnion.unionId);
|
|
329
|
-
const undefTag = def ? def.arms.findIndex((a) => a.kind === "undefinedT") : -1;
|
|
330
|
-
if (undefTag < 0)
|
|
331
|
-
throw new InternalCompilerError("emitter bug: close-override callback union lacks its undefined arm");
|
|
332
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_self);`);
|
|
333
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_self) { /* close override wrapper */`, ` ScrClosure *sc_inner = (ScrClosure *)scr_box_get_ref(sc_self->caps[0]); /* +1 */`, ...(retServer
|
|
334
|
-
? [
|
|
335
|
-
` ScrNetServer *sc_r = ((ScrNetServer *(*)(ScrClosure *, ScrUnion *))sc_inner->fn)(sc_inner, ${emitter.unitInstanceRef(cbUnion.unionId, undefTag)});`,
|
|
336
|
-
` scr_net_server_release(sc_r); /* the chaining return is unobserved here */`,
|
|
337
|
-
]
|
|
338
|
-
: [
|
|
339
|
-
` ((void (*)(ScrClosure *, ScrUnion *))sc_inner->fn)(sc_inner, ${emitter.unitInstanceRef(cbUnion.unionId, undefTag)});`,
|
|
340
|
-
]), ` scr_closure_release(sc_inner);`, `}`);
|
|
341
|
-
return sym;
|
|
342
|
-
}
|
|
343
|
-
/** Interned per-shape dgram message adapter for the TWO-parameter
|
|
344
|
-
* (msg: Buffer, rinfo) listener: the rinfo RECORD is program data, so
|
|
345
|
-
* the adapter builds it from the runtime's parts (address/family
|
|
346
|
-
* borrowed and retained in; port/size by value) and calls the listener,
|
|
347
|
-
* which owns both params per the universal convention (msg retains like
|
|
348
|
-
* the net data thunk). Zero/one-param listeners take the runtime's own
|
|
349
|
-
* scr_dgram_msg_thunk0/1. */
|
|
350
|
-
export function dgramMsgThunkFor(emitter, param) {
|
|
351
|
-
if (param.kind !== "record")
|
|
352
|
-
throw new InternalCompilerError("emitter bug: message listener rinfo not a record");
|
|
353
|
-
const key = param.shapeId;
|
|
354
|
-
let sym = emitter.dgramMsgThunks.get(key);
|
|
355
|
-
if (!sym) {
|
|
356
|
-
sym = mangleDgramMsgThunk(emitter.dgramMsgThunks.size);
|
|
357
|
-
emitter.dgramMsgThunks.set(key, sym);
|
|
358
|
-
const struct = mangleRecordStruct(param.shapeId);
|
|
359
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrBytes *sc_msg, ScrStr *sc_addr, ScrStr *sc_family, double sc_port, double sc_size);`);
|
|
360
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrBytes *sc_msg, ScrStr *sc_addr, ScrStr *sc_family, double sc_port, double sc_size) {`, ` ${struct} *sc_ri = ${mangleRecordNew(param.shapeId)}();`, ` sc_ri->${mangleField("address")} = scr_str_retain(sc_addr);`, ` sc_ri->${mangleField("family")} = scr_str_retain(sc_family);`, ` sc_ri->${mangleField("port")} = sc_port;`, ` sc_ri->${mangleField("size")} = sc_size;`, ` ((void (*)(ScrClosure *, ScrBytes *, ${struct} *))sc_cb->fn)(sc_cb, scr_bytes_retain(sc_msg), sc_ri);`, `}`);
|
|
361
|
-
}
|
|
362
|
-
return sym;
|
|
363
|
-
}
|
|
364
|
-
/** Interned dns.lookup callback adapter, per (union id, param count):
|
|
365
|
-
* the runtime invokes adapter(cb, errmsg-or-NULL, address, family) with
|
|
366
|
-
* everything borrowed; the adapter builds the `Error | null` first
|
|
367
|
-
* argument (tags are program data — the frontend pinned the union) and
|
|
368
|
-
* calls the listener with as many arguments as it declared, each owned
|
|
369
|
-
* per the universal convention. */
|
|
370
|
-
export function dnsLookupThunkFor(emitter, cbT) {
|
|
371
|
-
if (cbT.kind !== "func")
|
|
372
|
-
throw new InternalCompilerError("emitter bug: dns.lookup callback not a func");
|
|
373
|
-
const nparams = cbT.params.length;
|
|
374
|
-
if (nparams === 0)
|
|
375
|
-
return "scr_dns_thunk0";
|
|
376
|
-
const errT = cbT.params[0];
|
|
377
|
-
if (errT.kind !== "union")
|
|
378
|
-
throw new InternalCompilerError("emitter bug: dns.lookup err param not a union");
|
|
379
|
-
const key = `${errT.unionId}/${nparams}`;
|
|
380
|
-
let sym = emitter.dnsLookupThunks.get(key);
|
|
381
|
-
if (!sym) {
|
|
382
|
-
sym = mangleDnsLookupThunk(emitter.dnsLookupThunks.size);
|
|
383
|
-
emitter.dnsLookupThunks.set(key, sym);
|
|
384
|
-
const def = emitter.unionsById.get(errT.unionId);
|
|
385
|
-
const errTag = def ? def.arms.findIndex((a) => a.kind === "object") : -1;
|
|
386
|
-
const nullTag = def ? def.arms.findIndex((a) => a.kind === "nullT") : -1;
|
|
387
|
-
if (errTag < 0 || nullTag < 0) {
|
|
388
|
-
throw new InternalCompilerError("emitter bug: dns.lookup err union lacks its arms");
|
|
389
|
-
}
|
|
390
|
-
const callSig = ["ScrClosure *", "ScrUnion *", ...(nparams >= 2 ? ["ScrStr *"] : []), ...(nparams >= 3 ? ["double"] : [])].join(", ");
|
|
391
|
-
const callArgs = ["sc_cb", "sc_u", ...(nparams >= 2 ? ["scr_str_retain(sc_addr)"] : []), ...(nparams >= 3 ? ["sc_family"] : [])].join(", ");
|
|
392
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrStr *sc_err, ScrStr *sc_addr, double sc_family);`);
|
|
393
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrStr *sc_err, ScrStr *sc_addr, double sc_family) {`, ` (void)sc_addr; (void)sc_family;`, ` ScrUnion *sc_u = sc_err`, ` ? scr_union_new_ref(${errTag}, scr_error_new(0, sc_err), &scr_error_retain_v, &scr_error_release_v, NULL)`, ` : ${emitter.unitInstanceRef(errT.unionId, nullTag)};`, ` ((void (*)(${callSig}))sc_cb->fn)(${callArgs});`, `}`);
|
|
394
|
-
}
|
|
395
|
-
return sym;
|
|
396
|
-
}
|
|
397
|
-
/** Interned fs.rename callback adapter. The runtime supplies a borrowed
|
|
398
|
-
* ScrError (or NULL); the adapter builds the callback's program-specific
|
|
399
|
-
* Error | null union, or a dyn error/null for checkJs callbacks. */
|
|
400
|
-
export function fsRenameThunkFor(emitter, cbT) {
|
|
401
|
-
if (cbT.kind !== "func")
|
|
402
|
-
throw new InternalCompilerError("emitter bug: fs.rename callback not a func");
|
|
403
|
-
if (cbT.params.length === 0)
|
|
404
|
-
return "scr_fs_rename_thunk0";
|
|
405
|
-
const param = cbT.params[0];
|
|
406
|
-
const key = typeKey(cbT);
|
|
407
|
-
let sym = emitter.fsRenameThunks.get(key);
|
|
408
|
-
if (sym)
|
|
409
|
-
return sym;
|
|
410
|
-
sym = mangleFsRenameThunk(emitter.fsRenameThunks.size);
|
|
411
|
-
emitter.fsRenameThunks.set(key, sym);
|
|
412
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err);`);
|
|
413
|
-
if (param.kind === "dyn") {
|
|
414
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err) {`, ` ScrDyn *sc_arg = sc_err ? scr_dyn_from_error(sc_err) : scr_dyn_new_null();`, ` ((void (*)(ScrClosure *, ScrDyn *))sc_cb->fn)(sc_cb, sc_arg);`, `}`);
|
|
415
|
-
return sym;
|
|
416
|
-
}
|
|
417
|
-
if (param.kind !== "union")
|
|
418
|
-
throw new InternalCompilerError("emitter bug: fs.rename error param not a union");
|
|
419
|
-
const def = emitter.unionsById.get(param.unionId);
|
|
420
|
-
const errTag = def ? def.arms.findIndex((a) => a.kind === "object" && a.className === "%Error") : -1;
|
|
421
|
-
const nullTag = def ? def.arms.findIndex((a) => a.kind === "nullT") : -1;
|
|
422
|
-
if (errTag < 0 || nullTag < 0)
|
|
423
|
-
throw new InternalCompilerError("emitter bug: fs.rename error union lacks its arms");
|
|
424
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err) {`, ` ScrUnion *sc_u = sc_err`, ` ? scr_union_new_ref(${errTag}, scr_error_retain(sc_err), &scr_error_retain_v, &scr_error_release_v, NULL)`, ` : ${emitter.unitInstanceRef(param.unionId, nullTag)};`, ` ((void (*)(ScrClosure *, ScrUnion *))sc_cb->fn)(sc_cb, sc_u);`, `}`);
|
|
425
|
-
return sym;
|
|
426
|
-
}
|
|
427
|
-
/** Callback adapter for randomBytes/pbkdf2. The runtime transfers one
|
|
428
|
-
* owned Buffer; the adapter materializes the callback's Error | null (or
|
|
429
|
-
* checked-dynamic null) first argument and either transfers or boxes the
|
|
430
|
-
* Buffer according to the program-specific callback signature. */
|
|
431
|
-
export function cryptoBytesThunkFor(emitter, cbT) {
|
|
432
|
-
if (cbT.kind !== "func" || cbT.params.length > 2) {
|
|
433
|
-
throw new InternalCompilerError("emitter bug: crypto bytes callback shape");
|
|
434
|
-
}
|
|
435
|
-
const key = `crypto:${typeKey(cbT)}`;
|
|
436
|
-
let sym = emitter.fsRenameThunks.get(key);
|
|
437
|
-
if (sym)
|
|
438
|
-
return sym;
|
|
439
|
-
sym = `sc_cryptobytes_${emitter.fsRenameThunks.size}`;
|
|
440
|
-
emitter.fsRenameThunks.set(key, sym);
|
|
441
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrBytes *sc_value);`);
|
|
442
|
-
const lines = [`static void ${sym}(ScrClosure *sc_cb, ScrBytes *sc_value) {`];
|
|
443
|
-
const callTypes = ["ScrClosure *"];
|
|
444
|
-
const callArgs = ["sc_cb"];
|
|
445
|
-
const error = cbT.params[0];
|
|
446
|
-
if (error !== undefined) {
|
|
447
|
-
if (error.kind === "dyn") {
|
|
448
|
-
lines.push(` ScrDyn *sc_error = scr_dyn_new_null();`);
|
|
449
|
-
callTypes.push("ScrDyn *");
|
|
450
|
-
}
|
|
451
|
-
else if (error.kind === "union") {
|
|
452
|
-
const def = emitter.unionsById.get(error.unionId);
|
|
453
|
-
const nullTag = def ? def.arms.findIndex((arm) => arm.kind === "nullT") : -1;
|
|
454
|
-
if (nullTag < 0)
|
|
455
|
-
throw new InternalCompilerError("emitter bug: crypto callback error union lacks null");
|
|
456
|
-
lines.push(` ScrUnion *sc_error = ${emitter.unitInstanceRef(error.unionId, nullTag)};`);
|
|
457
|
-
callTypes.push("ScrUnion *");
|
|
458
|
-
}
|
|
459
|
-
else {
|
|
460
|
-
throw new InternalCompilerError("emitter bug: crypto callback error param");
|
|
461
|
-
}
|
|
462
|
-
callArgs.push("sc_error");
|
|
463
|
-
}
|
|
464
|
-
const value = cbT.params[1];
|
|
465
|
-
if (value === undefined) {
|
|
466
|
-
lines.push(` scr_bytes_release(sc_value);`);
|
|
467
|
-
}
|
|
468
|
-
else if (value.kind === "dyn") {
|
|
469
|
-
lines.push(` ScrDyn *sc_result = scr_dyn_new_bytes_copy(sc_value);`, ` scr_bytes_release(sc_value);`);
|
|
470
|
-
callTypes.push("ScrDyn *");
|
|
471
|
-
callArgs.push("sc_result");
|
|
472
|
-
}
|
|
473
|
-
else if (value.kind === "bytes" && value.elem === "u8") {
|
|
474
|
-
callTypes.push("ScrBytes *");
|
|
475
|
-
callArgs.push("sc_value");
|
|
476
|
-
}
|
|
477
|
-
else {
|
|
478
|
-
throw new InternalCompilerError("emitter bug: crypto callback value param");
|
|
479
|
-
}
|
|
480
|
-
lines.push(` ((void (*)(${callTypes.join(", ")}))sc_cb->fn)(${callArgs.join(", ")});`, `}`);
|
|
481
|
-
emitter.walkerDefs.push(...lines);
|
|
482
|
-
return sym;
|
|
483
|
-
}
|
|
484
|
-
/** Error-first Buffer callback adapter for worker-backed zlib operations.
|
|
485
|
-
* The runtime transfers the success Buffer and borrows the failure Error;
|
|
486
|
-
* exactly one is non-NULL. */
|
|
487
|
-
export function zlibBytesThunkFor(emitter, cbT) {
|
|
488
|
-
if (cbT.kind !== "func" || cbT.params.length > 2) {
|
|
489
|
-
throw new InternalCompilerError("emitter bug: zlib bytes callback shape");
|
|
490
|
-
}
|
|
491
|
-
const key = `zlib:${typeKey(cbT)}`;
|
|
492
|
-
let sym = emitter.fsRenameThunks.get(key);
|
|
493
|
-
if (sym)
|
|
494
|
-
return sym;
|
|
495
|
-
sym = `sc_zlibbytes_${emitter.fsRenameThunks.size}`;
|
|
496
|
-
emitter.fsRenameThunks.set(key, sym);
|
|
497
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err, ScrBytes *sc_value);`);
|
|
498
|
-
const lines = [`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err, ScrBytes *sc_value) {`];
|
|
499
|
-
const callTypes = ["ScrClosure *"];
|
|
500
|
-
const callArgs = ["sc_cb"];
|
|
501
|
-
const error = cbT.params[0];
|
|
502
|
-
if (error !== undefined) {
|
|
503
|
-
if (error.kind === "dyn") {
|
|
504
|
-
lines.push(` ScrDyn *sc_error = sc_err ? scr_dyn_from_error(sc_err) : scr_dyn_new_null();`);
|
|
505
|
-
callTypes.push("ScrDyn *");
|
|
506
|
-
}
|
|
507
|
-
else if (error.kind === "union") {
|
|
508
|
-
const def = emitter.unionsById.get(error.unionId);
|
|
509
|
-
const errTag = def ? def.arms.findIndex((arm) => arm.kind === "object" && arm.className === "%Error") : -1;
|
|
510
|
-
const nullTag = def ? def.arms.findIndex((arm) => arm.kind === "nullT") : -1;
|
|
511
|
-
if (errTag < 0 || nullTag < 0)
|
|
512
|
-
throw new InternalCompilerError("emitter bug: zlib callback error union lacks arms");
|
|
513
|
-
lines.push(` ScrUnion *sc_error = sc_err`, ` ? scr_union_new_ref(${errTag}, scr_error_retain(sc_err), &scr_error_retain_v, &scr_error_release_v, NULL)`, ` : ${emitter.unitInstanceRef(error.unionId, nullTag)};`);
|
|
514
|
-
callTypes.push("ScrUnion *");
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
throw new InternalCompilerError("emitter bug: zlib callback error param");
|
|
518
|
-
}
|
|
519
|
-
callArgs.push("sc_error");
|
|
520
|
-
}
|
|
521
|
-
const value = cbT.params[1];
|
|
522
|
-
if (value === undefined) {
|
|
523
|
-
lines.push(` scr_bytes_release(sc_value);`);
|
|
524
|
-
}
|
|
525
|
-
else if (value.kind === "dyn") {
|
|
526
|
-
lines.push(` ScrDyn *sc_result = sc_value ? scr_dyn_new_bytes_copy(sc_value) : scr_dyn_undefined();`, ` scr_bytes_release(sc_value);`);
|
|
527
|
-
callTypes.push("ScrDyn *");
|
|
528
|
-
callArgs.push("sc_result");
|
|
529
|
-
}
|
|
530
|
-
else if (value.kind === "bytes" && value.elem === "u8") {
|
|
531
|
-
callTypes.push("ScrBytes *");
|
|
532
|
-
callArgs.push("sc_value");
|
|
533
|
-
}
|
|
534
|
-
else {
|
|
535
|
-
throw new InternalCompilerError("emitter bug: zlib callback value param");
|
|
536
|
-
}
|
|
537
|
-
lines.push(` ((void (*)(${callTypes.join(", ")}))sc_cb->fn)(${callArgs.join(", ")});`, `}`);
|
|
538
|
-
emitter.walkerDefs.push(...lines);
|
|
539
|
-
return sym;
|
|
540
|
-
}
|
|
541
|
-
/** Interned CONNECT-listener adapter for a UNION socket slot — the h2
|
|
542
|
-
* compat listener (`(req, resOrSocket: Http2ServerResponse | net.Socket)
|
|
543
|
-
* => void`): the runtime fires (cb, req, sock, head) like an upgrade;
|
|
544
|
-
* the adapter wraps the socket at the union's netSocket arm (its tag is
|
|
545
|
-
* program data) and drops `head` when the listener declares two params.
|
|
546
|
-
* All three runtime args arrive +1; the union takes the socket's. */
|
|
547
|
-
export function connectSockThunkFor(emitter, cbT) {
|
|
548
|
-
if (cbT.kind !== "func" || cbT.params[1]?.kind !== "union") {
|
|
549
|
-
throw new InternalCompilerError("emitter bug: connect listener union shape (frontend must fence)");
|
|
550
|
-
}
|
|
551
|
-
const key = typeKey(cbT);
|
|
552
|
-
let sym = emitter.connectSockThunks.get(key);
|
|
553
|
-
if (sym)
|
|
554
|
-
return sym;
|
|
555
|
-
sym = mangleConnectSockThunk(emitter.connectSockThunks.size);
|
|
556
|
-
emitter.connectSockThunks.set(key, sym);
|
|
557
|
-
const sockT = cbT.params[1];
|
|
558
|
-
const def = emitter.unionsById.get(sockT.unionId);
|
|
559
|
-
const tag = def ? def.arms.findIndex((a) => a.kind === "netSocket") : -1;
|
|
560
|
-
if (tag < 0)
|
|
561
|
-
throw new InternalCompilerError("emitter bug: connect listener union lacks its socket arm");
|
|
562
|
-
const three = cbT.params.length === 3;
|
|
563
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrHttpReq *sc_req, ScrNetSocket *sc_sock, ScrBytes *sc_head);`);
|
|
564
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrHttpReq *sc_req, ScrNetSocket *sc_sock, ScrBytes *sc_head) {`, ...(three ? [] : [` scr_bytes_release(sc_head);`]), ` ScrUnion *sc_u = scr_union_new_ref(${tag}, sc_sock, &scr_net_sock_retain_v, &scr_net_sock_release_v, NULL);`, three
|
|
565
|
-
? ` ((void (*)(ScrClosure *, ScrHttpReq *, ScrUnion *, ScrBytes *))sc_cb->fn)(sc_cb, sc_req, sc_u, sc_head);`
|
|
566
|
-
: ` ((void (*)(ScrClosure *, ScrHttpReq *, ScrUnion *))sc_cb->fn)(sc_cb, sc_req, sc_u);`, `}`);
|
|
567
|
-
return sym;
|
|
568
|
-
}
|
|
569
|
-
export function connectResThunkFor(emitter, cbT) {
|
|
570
|
-
if (cbT.kind !== "func")
|
|
571
|
-
throw new InternalCompilerError("emitter bug: connect listener shape");
|
|
572
|
-
const key = `res:${typeKey(cbT)}`;
|
|
573
|
-
let sym = emitter.connectSockThunks.get(key);
|
|
574
|
-
if (sym)
|
|
575
|
-
return sym;
|
|
576
|
-
sym = mangleConnectResThunk(emitter.connectSockThunks.size);
|
|
577
|
-
emitter.connectSockThunks.set(key, sym);
|
|
578
|
-
const p1 = cbT.params[1];
|
|
579
|
-
const def = p1?.kind === "union" ? emitter.unionsById.get(p1.unionId) : undefined;
|
|
580
|
-
const tag = def ? def.arms.findIndex((a) => a.kind === "httpRes") : -1;
|
|
581
|
-
if (p1?.kind === "union" && tag < 0)
|
|
582
|
-
throw new InternalCompilerError("emitter bug: connect listener union lacks its response arm");
|
|
583
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrHttpReq *sc_req, ScrHttpRes *sc_res);`);
|
|
584
|
-
const second = p1?.kind === "union"
|
|
585
|
-
? `ScrUnion *sc_u = scr_union_new_ref(${tag}, sc_res, &scr_http_res_retain_v, &scr_http_res_release_v, NULL);`
|
|
586
|
-
: "";
|
|
587
|
-
const arg = p1?.kind === "union" ? "sc_u" : "sc_res";
|
|
588
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrHttpReq *sc_req, ScrHttpRes *sc_res) {`, ...(second ? [` ${second}`] : []), ...(cbT.params.length === 0
|
|
589
|
-
? [" scr_http_req_release(sc_req);", " scr_http_res_release(sc_res);", " ((void (*)(ScrClosure *))sc_cb->fn)(sc_cb);"]
|
|
590
|
-
: cbT.params.length === 1
|
|
591
|
-
? [" scr_http_res_release(sc_res);", " ((void (*)(ScrClosure *, ScrHttpReq *))sc_cb->fn)(sc_cb, sc_req);"]
|
|
592
|
-
: [` ((void (*)(ScrClosure *, ScrHttpReq *, ${p1?.kind === "union" ? "ScrUnion" : "ScrHttpRes"} *))sc_cb->fn)(sc_cb, sc_req, ${arg});`]), `}`);
|
|
593
|
-
return sym;
|
|
594
|
-
}
|
|
595
|
-
/** Interned net.connect-lookup answer thunk: the fn of the runtime-minted
|
|
596
|
-
* callback the caller's `lookup` option receives (the SNI-answer
|
|
597
|
-
* pattern). COMPILED code calls it per its static type — `(err:
|
|
598
|
-
* ErrnoException | null, addresses: { address: string, ... }[]) =>
|
|
599
|
-
* void` — so the thunk decodes the program-interned err union (null
|
|
600
|
-
* tag) and the addresses record's field layout down to the runtime's
|
|
601
|
-
* (has_err, message, ip-list) answer. Params arrive +1 and release
|
|
602
|
-
* here; the extracted message/ips hand over +1. */
|
|
603
|
-
export function netLookupAnswerThunkFor(emitter, cbT) {
|
|
604
|
-
if (cbT.kind !== "func" || cbT.params.length !== 2) {
|
|
605
|
-
throw new InternalCompilerError("emitter bug: lookup answer cb shape (frontend must fence)");
|
|
606
|
-
}
|
|
607
|
-
const key = typeKey(cbT);
|
|
608
|
-
let sym = emitter.netLookupAnswerThunks.get(key);
|
|
609
|
-
if (sym)
|
|
610
|
-
return sym;
|
|
611
|
-
sym = mangleNetLookupAnswerThunk(emitter.netLookupAnswerThunks.size);
|
|
612
|
-
emitter.netLookupAnswerThunks.set(key, sym);
|
|
613
|
-
const errT = cbT.params[0];
|
|
614
|
-
if (errT.kind !== "union")
|
|
615
|
-
throw new InternalCompilerError("emitter bug: lookup answer err param not a union");
|
|
616
|
-
const errDef = emitter.unionsById.get(errT.unionId);
|
|
617
|
-
const nullTag = errDef ? errDef.arms.findIndex((a) => a.kind === "nullT") : -1;
|
|
618
|
-
if (nullTag < 0)
|
|
619
|
-
throw new InternalCompilerError("emitter bug: lookup answer err union lacks its null arm");
|
|
620
|
-
const addrsT = cbT.params[1];
|
|
621
|
-
if (addrsT.kind !== "array" || addrsT.elem.kind !== "record") {
|
|
622
|
-
throw new InternalCompilerError("emitter bug: lookup answer addresses param not a record array");
|
|
623
|
-
}
|
|
624
|
-
const recStruct = mangleRecordStruct(addrsT.elem.shapeId);
|
|
625
|
-
const recRelease = mangleRecordRelease(addrsT.elem.shapeId);
|
|
626
|
-
const addrField = mangleField("address");
|
|
627
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_self, ScrUnion *sc_err, ScrArr *sc_addrs);`);
|
|
628
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_self, ScrUnion *sc_err, ScrArr *sc_addrs) {`, ` bool sc_has_err = sc_err->tag != ${nullTag};`, ` ScrStr *sc_msg = NULL;`, ` if (sc_has_err) sc_msg = scr_str_retain(((ScrError *)scr_union_peek(sc_err))->message);`, ` ScrArr *sc_ips = NULL;`, ` if (!sc_has_err) {`, ` double sc_n = scr_arr_len(sc_addrs);`, ` sc_ips = scr_arr_new(SCR_ELEM_STR, (size_t)sc_n);`, ` for (double sc_i = 0; sc_i < sc_n; sc_i++) {`, ` ${recStruct} *sc_r = (${recStruct} *)scr_arr_get_ref(sc_addrs, sc_i);`, ` scr_arr_push_ref(sc_ips, scr_str_retain(sc_r->${addrField}));`, ` ${recRelease}(sc_r);`, ` }`, ` }`, ` scr_net_lookup_answer(sc_self, sc_has_err, sc_msg, sc_ips);`, ` scr_str_release(sc_msg);`, ` scr_arr_release(sc_ips);`, ` scr_union_release(sc_err);`, ` scr_arr_release(sc_addrs);`, `}`);
|
|
629
|
-
return sym;
|
|
630
|
-
}
|
|
631
|
-
/** Interned SNI answer-closure thunk: the fn of the runtime-minted `cb`
|
|
632
|
-
* a TLS server's SNICallback receives. COMPILED code calls cb per its
|
|
633
|
-
* static type — `(err: Error | null, ctx?: SecureContext) => void`, or
|
|
634
|
-
* a shorter declared shape — so the thunk's signature is that ABI, and
|
|
635
|
-
* it decodes the program-interned unions (tags are program data) down
|
|
636
|
-
* to the runtime's (has_err, ctx-or-NULL) answer. The thunk owns its
|
|
637
|
-
* union params per the universal convention (the ctx payload retains
|
|
638
|
-
* +1 before its union releases; ownership moves to the runtime). */
|
|
639
|
-
export function sniAnswerThunkFor(emitter, cbT) {
|
|
640
|
-
if (cbT.kind !== "func")
|
|
641
|
-
throw new InternalCompilerError("emitter bug: SNI answer cb not a func");
|
|
642
|
-
const key = typeKey(cbT);
|
|
643
|
-
let sym = emitter.sniAnswerThunks.get(key);
|
|
644
|
-
if (sym)
|
|
645
|
-
return sym;
|
|
646
|
-
sym = mangleSniAnswerThunk(emitter.sniAnswerThunks.size);
|
|
647
|
-
emitter.sniAnswerThunks.set(key, sym);
|
|
648
|
-
const nparams = cbT.params.length;
|
|
649
|
-
const params = ["ScrClosure *sc_self"];
|
|
650
|
-
const body = [];
|
|
651
|
-
let hasErr = "false";
|
|
652
|
-
if (nparams >= 1) {
|
|
653
|
-
const errT = cbT.params[0];
|
|
654
|
-
if (errT.kind !== "union")
|
|
655
|
-
throw new InternalCompilerError("emitter bug: SNI answer err param not a union");
|
|
656
|
-
const def = emitter.unionsById.get(errT.unionId);
|
|
657
|
-
const nullTag = def ? def.arms.findIndex((a) => a.kind === "nullT") : -1;
|
|
658
|
-
if (nullTag < 0)
|
|
659
|
-
throw new InternalCompilerError("emitter bug: SNI answer err union lacks its null arm");
|
|
660
|
-
params.push("ScrUnion *sc_err");
|
|
661
|
-
hasErr = `sc_err->tag != ${nullTag}`;
|
|
662
|
-
}
|
|
663
|
-
let ctx = "NULL";
|
|
664
|
-
if (nparams >= 2) {
|
|
665
|
-
const ctxT = cbT.params[1];
|
|
666
|
-
if (ctxT.kind !== "union")
|
|
667
|
-
throw new InternalCompilerError("emitter bug: SNI answer ctx param not a union");
|
|
668
|
-
const def = emitter.unionsById.get(ctxT.unionId);
|
|
669
|
-
const ctxTag = def ? def.arms.findIndex((a) => a.kind === "secureCtx") : -1;
|
|
670
|
-
if (ctxTag < 0)
|
|
671
|
-
throw new InternalCompilerError("emitter bug: SNI answer ctx union lacks its SecureContext arm");
|
|
672
|
-
params.push("ScrUnion *sc_ctx");
|
|
673
|
-
body.push(` ScrSecureCtx *sc_c = sc_ctx->tag == ${ctxTag} ? scr_secure_ctx_retain((ScrSecureCtx *)scr_union_peek(sc_ctx)) : NULL;`, ` scr_union_release(sc_ctx);`);
|
|
674
|
-
ctx = "sc_c";
|
|
675
|
-
}
|
|
676
|
-
body.push(` bool sc_has_err = ${hasErr};`);
|
|
677
|
-
if (nparams >= 1)
|
|
678
|
-
body.push(` scr_union_release(sc_err);`);
|
|
679
|
-
body.push(` scr_tls_sni_answer(sc_self, sc_has_err, ${ctx});`);
|
|
680
|
-
emitter.walkerProtos.push(`static void ${sym}(${params.join(", ")});`);
|
|
681
|
-
emitter.walkerDefs.push(`static void ${sym}(${params.join(", ")}) {`, ...body, `}`);
|
|
682
|
-
return sym;
|
|
683
|
-
}
|
|
684
|
-
/** Interned Promise.race fulfillment adapter: converts a settled entry's
|
|
685
|
-
* payload (inner type `from`) into the result promise's inner type `to`
|
|
686
|
-
* and fulfills the destination. Three shapes, mirroring the frontend's
|
|
687
|
-
* compatibility fence: identical types share the runtime's raw copy;
|
|
688
|
-
* a plain entry under a union result wraps into its arm; a sub-union
|
|
689
|
-
* entry re-tags arm-wise (canonical arm order makes the mapping a
|
|
690
|
-
* typeKey lookup). Rejections never reach adapters — the runtime copies
|
|
691
|
-
* them raw. */
|
|
692
|
-
export function raceAdapterFor(emitter, from, to) {
|
|
693
|
-
if (typeEquals(from, to))
|
|
694
|
-
return "scr_promise_adapt_copy";
|
|
695
|
-
const key = `${typeKey(from)}=>${typeKey(to)}`;
|
|
696
|
-
let sym = emitter.raceThunks.get(key);
|
|
697
|
-
if (sym)
|
|
698
|
-
return sym;
|
|
699
|
-
sym = mangleRaceThunk(emitter.raceThunks.size);
|
|
700
|
-
emitter.raceThunks.set(key, sym);
|
|
701
|
-
if (to.kind !== "union")
|
|
702
|
-
throw new InternalCompilerError("emitter bug: race adapter to a non-union");
|
|
703
|
-
const toDef = emitter.unionsById.get(to.unionId);
|
|
704
|
-
if (!toDef)
|
|
705
|
-
throw new InternalCompilerError("emitter bug: race adapter to an unknown union");
|
|
706
|
-
const tagOf = (t) => {
|
|
707
|
-
const tag = toDef.arms.findIndex((a) => typeEquals(a, t));
|
|
708
|
-
if (tag < 0)
|
|
709
|
-
throw new InternalCompilerError("emitter bug: race adapter arm missing (frontend must fence)");
|
|
710
|
-
return tag;
|
|
711
|
-
};
|
|
712
|
-
const rv = vAdapters(to);
|
|
713
|
-
const fulfill = (value) => `scr_promise_fulfill_ref(sc_dst, ${value}, ${rv.retain}, ${rv.release}, ${emitter.traceArgC(to)});`;
|
|
714
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrPromise *sc_dst, ScrPromise *sc_src);`);
|
|
715
|
-
if (from.kind !== "union") {
|
|
716
|
-
// One arm wrap, straight off the payload accessors.
|
|
717
|
-
const tag = tagOf(from);
|
|
718
|
-
let value;
|
|
719
|
-
switch (from.kind) {
|
|
720
|
-
case "f64":
|
|
721
|
-
value = `scr_union_new_f64(${tag}, scr_promise_payload_f64(sc_src))`;
|
|
722
|
-
break;
|
|
723
|
-
case "bool":
|
|
724
|
-
value = `scr_union_new_bool(${tag}, scr_promise_payload_bool(sc_src))`;
|
|
725
|
-
break;
|
|
726
|
-
case "string":
|
|
727
|
-
value = `scr_union_new_ref(${tag}, scr_promise_payload_str(sc_src), scr_str_retain_v, scr_str_release_v, NULL)`;
|
|
728
|
-
break;
|
|
729
|
-
default: {
|
|
730
|
-
const fv = vAdapters(from);
|
|
731
|
-
value = `scr_union_new_ref(${tag}, scr_promise_payload_ref(sc_src), ${fv.retain}, ${fv.release}, ${emitter.traceArgC(from)})`;
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrPromise *sc_dst, ScrPromise *sc_src) {`, ` ${fulfill(value)}`, `}`);
|
|
735
|
-
return sym;
|
|
736
|
-
}
|
|
737
|
-
// Sub-union re-tag: switch over the entry's arms, rebuild under the
|
|
738
|
-
// result's tags (payloads retained through each arm's own adapters).
|
|
739
|
-
const fromDef = emitter.unionsById.get(from.unionId);
|
|
740
|
-
if (!fromDef)
|
|
741
|
-
throw new InternalCompilerError("emitter bug: race adapter from an unknown union");
|
|
742
|
-
const cases = fromDef.arms.map((arm, i) => {
|
|
743
|
-
const tag = tagOf(arm);
|
|
744
|
-
let build;
|
|
745
|
-
if (isUnitType(arm)) {
|
|
746
|
-
build = emitter.unitInstanceRef(to.unionId, tag);
|
|
747
|
-
}
|
|
748
|
-
else if (arm.kind === "f64") {
|
|
749
|
-
build = `scr_union_new_f64(${tag}, scr_union_get_f64(sc_u))`;
|
|
750
|
-
}
|
|
751
|
-
else if (arm.kind === "bool") {
|
|
752
|
-
build = `scr_union_new_bool(${tag}, scr_union_get_bool(sc_u))`;
|
|
753
|
-
}
|
|
754
|
-
else {
|
|
755
|
-
const av = vAdapters(arm);
|
|
756
|
-
build = `scr_union_new_ref(${tag}, ${av.retain}(scr_union_peek(sc_u)), ${av.retain}, ${av.release}, ${emitter.traceArgC(arm)})`;
|
|
757
|
-
}
|
|
758
|
-
return ` case ${i}: sc_v = ${build}; break;`;
|
|
759
|
-
});
|
|
760
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrPromise *sc_dst, ScrPromise *sc_src) {`, ` ScrUnion *sc_u = (ScrUnion *)scr_promise_payload_ref(sc_src);`, ` ScrUnion *sc_v = NULL;`, ` switch (sc_u->tag) {`, ...cases, ` default: break;`, ` }`, ` scr_union_release(sc_u);`, ` ${fulfill("sc_v")}`, `}`);
|
|
761
|
-
return sym;
|
|
762
|
-
}
|
|
763
|
-
/** Interned generator-resume result builder: reads the post-resume state
|
|
764
|
-
* of a generator into a fresh IteratorResult record `{ done, value }`.
|
|
765
|
-
* One helper per generator type (every next/return/throw on it shares
|
|
766
|
-
* the record shape). The value slot: while suspended, the yielded value
|
|
767
|
-
* moves out of the OUT slot into its arm of V (the yield type retags
|
|
768
|
-
* arm-wise into a superset V, the raceAdapterFor technique); once done,
|
|
769
|
-
* a present completion value wraps the same way and an empty OUT is
|
|
770
|
-
* JS's undefined (the interned undefined arm — or the dyn undefined
|
|
771
|
-
* when V is dyn, the any/unknown channel). */
|
|
772
|
-
export function genResultThunkFor(emitter, genT, recT) {
|
|
773
|
-
const key = typeKey(genT);
|
|
774
|
-
let sym = emitter.genResThunks.get(key);
|
|
775
|
-
if (sym)
|
|
776
|
-
return sym;
|
|
777
|
-
sym = mangleGenResThunk(emitter.genResThunks.size);
|
|
778
|
-
emitter.genResThunks.set(key, sym);
|
|
779
|
-
const struct = mangleRecordStruct(recT.shapeId);
|
|
780
|
-
const shape = emitter.mod.records?.find((r) => r.id === recT.shapeId);
|
|
781
|
-
const valueT = shape?.fields.find((f) => f.name === "value")?.type;
|
|
782
|
-
if (!valueT)
|
|
783
|
-
throw new InternalCompilerError("emitter bug: genResume record lacks its value field");
|
|
784
|
-
const lines = [
|
|
785
|
-
`static ${struct} *${sym}(ScrGen *sc_g) {`,
|
|
786
|
-
` ${struct} *sc_r = ${mangleRecordNew(recT.shapeId)}();`,
|
|
787
|
-
` bool sc_d = scr_gen_done(sc_g);`,
|
|
788
|
-
` sc_r->${mangleField("done")} = sc_d;`,
|
|
789
|
-
];
|
|
790
|
-
if (valueT.kind === "dyn") {
|
|
791
|
-
// The any/unknown channel: OUT holds a dyn (or nothing — undefined).
|
|
792
|
-
lines.push(` sc_r->${mangleField("value")} = scr_gen_out_has(sc_g)`, ` ? (ScrDyn *)scr_gen_take_out_ref(sc_g)`, ` : scr_dyn_retain(scr_dyn_undefined());`);
|
|
793
|
-
}
|
|
794
|
-
else {
|
|
795
|
-
if (valueT.kind !== "union") {
|
|
796
|
-
throw new InternalCompilerError("emitter bug: genResume value slot is neither dyn nor a union");
|
|
797
|
-
}
|
|
798
|
-
const def = emitter.unionsById.get(valueT.unionId);
|
|
799
|
-
if (!def)
|
|
800
|
-
throw new InternalCompilerError("emitter bug: genResume value union unknown");
|
|
801
|
-
const tagOf = (t) => {
|
|
802
|
-
const tag = def.arms.findIndex((a) => typeEquals(a, t));
|
|
803
|
-
if (tag < 0)
|
|
804
|
-
throw new InternalCompilerError("emitter bug: genResume value union lacks an arm");
|
|
805
|
-
return tag;
|
|
806
|
-
};
|
|
807
|
-
const undefTag = def.arms.findIndex((a) => a.kind === "undefinedT");
|
|
808
|
-
if (undefTag < 0)
|
|
809
|
-
throw new InternalCompilerError("emitter bug: genResume value union lacks undefined");
|
|
810
|
-
// Lines that leave the wrapped value in `sc_v`, taking OUT's payload.
|
|
811
|
-
const wrapFrom = (srcT) => {
|
|
812
|
-
if (srcT.kind === "f64") {
|
|
813
|
-
return [` sc_v = scr_union_new_f64(${tagOf(srcT)}, scr_gen_take_out_f64(sc_g));`];
|
|
814
|
-
}
|
|
815
|
-
if (srcT.kind === "bool") {
|
|
816
|
-
return [` sc_v = scr_union_new_bool(${tagOf(srcT)}, scr_gen_take_out_bool(sc_g));`];
|
|
817
|
-
}
|
|
818
|
-
if (srcT.kind !== "union") {
|
|
819
|
-
const v = vAdapters(srcT);
|
|
820
|
-
return [
|
|
821
|
-
` sc_v = scr_union_new_ref(${tagOf(srcT)}, scr_gen_take_out_ref(sc_g), ${v.retain}, ${v.release}, ${emitter.traceArgC(srcT)});`,
|
|
822
|
-
];
|
|
823
|
-
}
|
|
824
|
-
// A union channel: OUT holds the union box itself. Identical V
|
|
825
|
-
// passes through; a superset V retags arm-wise (payloads retained
|
|
826
|
-
// through each arm's own adapters, then the source box drops).
|
|
827
|
-
if (typeEquals(srcT, valueT)) {
|
|
828
|
-
return [` sc_v = (ScrUnion *)scr_gen_take_out_ref(sc_g);`];
|
|
829
|
-
}
|
|
830
|
-
const srcDef = emitter.unionsById.get(srcT.unionId);
|
|
831
|
-
if (!srcDef)
|
|
832
|
-
throw new InternalCompilerError("emitter bug: genResume channel union unknown");
|
|
833
|
-
const cases = srcDef.arms.map((arm, i) => {
|
|
834
|
-
const tag = tagOf(arm);
|
|
835
|
-
let build;
|
|
836
|
-
if (isUnitType(arm)) {
|
|
837
|
-
build = emitter.unitInstanceRef(valueT.unionId, tag);
|
|
838
|
-
}
|
|
839
|
-
else if (arm.kind === "f64") {
|
|
840
|
-
build = `scr_union_new_f64(${tag}, scr_union_get_f64(sc_u))`;
|
|
841
|
-
}
|
|
842
|
-
else if (arm.kind === "bool") {
|
|
843
|
-
build = `scr_union_new_bool(${tag}, scr_union_get_bool(sc_u))`;
|
|
844
|
-
}
|
|
845
|
-
else {
|
|
846
|
-
const av = vAdapters(arm);
|
|
847
|
-
build = `scr_union_new_ref(${tag}, ${av.retain}(scr_union_peek(sc_u)), ${av.retain}, ${av.release}, ${emitter.traceArgC(arm)})`;
|
|
848
|
-
}
|
|
849
|
-
return ` case ${i}: sc_v = ${build}; break;`;
|
|
850
|
-
});
|
|
851
|
-
return [
|
|
852
|
-
` { ScrUnion *sc_u = (ScrUnion *)scr_gen_take_out_ref(sc_g);`,
|
|
853
|
-
` switch (sc_u->tag) {`,
|
|
854
|
-
...cases,
|
|
855
|
-
` default: sc_v = ${emitter.unitInstanceRef(valueT.unionId, undefTag)}; break;`,
|
|
856
|
-
` }`,
|
|
857
|
-
` scr_union_release(sc_u); }`,
|
|
858
|
-
];
|
|
859
|
-
};
|
|
860
|
-
const undefLine = ` sc_v = ${emitter.unitInstanceRef(valueT.unionId, undefTag)};`;
|
|
861
|
-
lines.push(` ScrUnion *sc_v;`);
|
|
862
|
-
lines.push(` if (!sc_d) {`);
|
|
863
|
-
// yieldT VOID marks a generator that can never yield (TS's `never`):
|
|
864
|
-
// the suspended branch is unreachable — the undefined arm keeps the
|
|
865
|
-
// C total.
|
|
866
|
-
lines.push(...(genT.yieldT.kind === "void" ? [undefLine] : wrapFrom(genT.yieldT)));
|
|
867
|
-
lines.push(` } else if (scr_gen_out_has(sc_g)) {`);
|
|
868
|
-
lines.push(...(genT.retT.kind === "void" ? [undefLine] : wrapFrom(genT.retT)));
|
|
869
|
-
lines.push(` } else {`, undefLine, ` }`);
|
|
870
|
-
lines.push(` sc_r->${mangleField("value")} = sc_v;`);
|
|
871
|
-
}
|
|
872
|
-
lines.push(` return sc_r;`, `}`);
|
|
873
|
-
emitter.walkerProtos.push(`static ${struct} *${sym}(ScrGen *sc_g);`);
|
|
874
|
-
emitter.walkerDefs.push(...lines, ``);
|
|
875
|
-
return sym;
|
|
876
|
-
}
|
|
877
|
-
/** Interned per inner-type resolve thunk for ref-kind new Promise. */
|
|
878
|
-
export function resolveThunkFor(emitter, inner) {
|
|
879
|
-
const key = typeKey(inner);
|
|
880
|
-
let sym = emitter.resolveThunks.get(key);
|
|
881
|
-
if (!sym) {
|
|
882
|
-
sym = mangleResolveThunk(emitter.resolveThunks.size);
|
|
883
|
-
emitter.resolveThunks.set(key, sym);
|
|
884
|
-
const v = vAdapters(inner);
|
|
885
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_self, ${cDecl(inner, "sc_v")});`);
|
|
886
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_self, ${cDecl(inner, "sc_v")}) {`, ` scr_resolve_ref_impl(sc_self, sc_v, ${v.retain}, ${v.release}, ${emitter.traceArgC(inner)});`, `}`);
|
|
887
|
-
}
|
|
888
|
-
return sym;
|
|
889
|
-
}
|
|
890
|
-
/** The EventEmitter listener invoke adapter for one listener signature:
|
|
891
|
-
* `void (ScrClosure *, va_list)` — va_args exactly the listener's own
|
|
892
|
-
* parameter prefix of the emit site's typed tail (the frontend unified
|
|
893
|
-
* the tuple, so reads agree with writes), retains each refcounted value
|
|
894
|
-
* (the callee owns +1 per the universal convention; f64/bool copy), and
|
|
895
|
-
* calls cb->fn behind its exact C signature. Interned per func-type key. */
|
|
896
|
-
export function emitterInvokeThunkFor(emitter, cbT) {
|
|
897
|
-
if (cbT.kind !== "func") {
|
|
898
|
-
throw new InternalCompilerError("emitter bug: emitter.on listener not a func (frontend must fence)");
|
|
899
|
-
}
|
|
900
|
-
const key = typeKey(cbT);
|
|
901
|
-
let sym = emitter.emitterInvokeThunks.get(key);
|
|
902
|
-
if (sym)
|
|
903
|
-
return sym;
|
|
904
|
-
sym = mangleEmitterInvokeThunk(emitter.emitterInvokeThunks.size);
|
|
905
|
-
emitter.emitterInvokeThunks.set(key, sym);
|
|
906
|
-
const reads = [];
|
|
907
|
-
const passed = [];
|
|
908
|
-
cbT.params.forEach((p, i) => {
|
|
909
|
-
const name = `sc_a${i}`;
|
|
910
|
-
if (p.kind === "f64" || p.kind === "date") {
|
|
911
|
-
reads.push(` double ${name} = va_arg(sc_ap, double);`);
|
|
912
|
-
passed.push(name);
|
|
913
|
-
}
|
|
914
|
-
else if (p.kind === "bool") {
|
|
915
|
-
// bool promotes to int through a variadic call.
|
|
916
|
-
reads.push(` bool ${name} = (bool)va_arg(sc_ap, int);`);
|
|
917
|
-
passed.push(name);
|
|
918
|
-
}
|
|
919
|
-
else {
|
|
920
|
-
reads.push(` ${cDecl(p, name)} = va_arg(sc_ap, ${cType(p).trim()});`);
|
|
921
|
-
passed.push(retainCallC(p, name));
|
|
922
|
-
}
|
|
923
|
-
});
|
|
924
|
-
const sigParams = ["ScrClosure *", ...cbT.params.map((p) => cType(p).trim())].join(", ");
|
|
925
|
-
// The call goes through the listener's TRUE signature; a non-void
|
|
926
|
-
// result is discarded (refcounted ones released) — Node ignores
|
|
927
|
-
// listener return values.
|
|
928
|
-
const retC = cbT.ret.kind === "void" ? "void" : cType(cbT.ret).trim();
|
|
929
|
-
const invoke = `((${retC} (*)(${sigParams}))sc_cb->fn)(${["sc_cb", ...passed].join(", ")})`;
|
|
930
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, va_list sc_ap);`);
|
|
931
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, va_list sc_ap) {`, ...(cbT.params.length === 0 ? [` (void)sc_ap;`] : reads), ...(cbT.ret.kind === "void"
|
|
932
|
-
? [` ${invoke};`]
|
|
933
|
-
: isRefCounted(cbT.ret)
|
|
934
|
-
? [` ${retC} sc_r = ${invoke};`, ` if (sc_r) ${releaseCallC(cbT.ret, "sc_r")};`]
|
|
935
|
-
: [` (void)${invoke};`]), `}`, ``);
|
|
936
|
-
return sym;
|
|
937
|
-
}
|
|
938
|
-
/** child_process.execFile's error-first callback adapter. The runtime owns
|
|
939
|
-
* one +1 callback plus +1 error/output values at settlement; the adapter
|
|
940
|
-
* wraps the nullable error with this program's union tags, transfers every
|
|
941
|
-
* declared argument into the compiled closure, and releases ignored suffix
|
|
942
|
-
* values for callbacks that declare fewer than three parameters. */
|
|
943
|
-
export function execFileThunkFor(emitter, cbT) {
|
|
944
|
-
const key = `exec:${typeKey(cbT)}`;
|
|
945
|
-
let sym = emitter.childExitThunks.get(key);
|
|
946
|
-
if (sym)
|
|
947
|
-
return sym;
|
|
948
|
-
sym = mangleChildExitThunk(emitter.childExitThunks.size);
|
|
949
|
-
emitter.childExitThunks.set(key, sym);
|
|
950
|
-
const errorParam = cbT.params[0];
|
|
951
|
-
let errorExpr = null;
|
|
952
|
-
if (errorParam !== undefined) {
|
|
953
|
-
if (errorParam.kind !== "union")
|
|
954
|
-
throw new InternalCompilerError("emitter bug: execFile error param not a union");
|
|
955
|
-
const def = emitter.unionsById.get(errorParam.unionId);
|
|
956
|
-
const errorTag = def ? def.arms.findIndex((arm) => arm.kind === "object" && arm.className === "%Error") : -1;
|
|
957
|
-
const nullTag = def ? def.arms.findIndex((arm) => arm.kind === "nullT") : -1;
|
|
958
|
-
const errorArm = errorTag >= 0 ? def?.arms[errorTag] : undefined;
|
|
959
|
-
if (nullTag < 0 || !errorArm)
|
|
960
|
-
throw new InternalCompilerError("emitter bug: execFile error union lacks its arms");
|
|
961
|
-
errorExpr = `sc_err ? scr_union_new_ref(${errorTag}, sc_err, &scr_error_retain_v, &scr_error_release_v, ${emitter.traceArgC(errorArm)}) : ${emitter.unitInstanceRef(errorParam.unionId, nullTag)}`;
|
|
962
|
-
}
|
|
963
|
-
const callbackArgs = [
|
|
964
|
-
"sc_cb",
|
|
965
|
-
...(errorExpr === null ? [] : ["sc_e"]),
|
|
966
|
-
...(cbT.params.length >= 2 ? ["sc_out"] : []),
|
|
967
|
-
...(cbT.params.length >= 3 ? ["sc_stderr"] : []),
|
|
968
|
-
];
|
|
969
|
-
const callbackTypes = [
|
|
970
|
-
"ScrClosure *",
|
|
971
|
-
...(errorExpr === null ? [] : ["ScrUnion *"]),
|
|
972
|
-
...(cbT.params.length >= 2 ? ["ScrStr *"] : []),
|
|
973
|
-
...(cbT.params.length >= 3 ? ["ScrStr *"] : []),
|
|
974
|
-
];
|
|
975
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err, ScrStr *sc_out, ScrStr *sc_stderr);`);
|
|
976
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err, ScrStr *sc_out, ScrStr *sc_stderr) {`, ...(errorExpr === null ? [` scr_error_release(sc_err);`] : [` ScrUnion *sc_e = ${errorExpr};`]), ...(cbT.params.length < 2 ? [` scr_str_release(sc_out);`] : []), ...(cbT.params.length < 3 ? [` scr_str_release(sc_stderr);`] : []), ` ((void (*)(${callbackTypes.join(", ")}))sc_cb->fn)(${callbackArgs.join(", ")});`, `}`);
|
|
977
|
-
return sym;
|
|
978
|
-
}
|
|
979
|
-
/** Fork IPC message adapter: parse results arrive as a borrowed dyn tree,
|
|
980
|
-
* then validate into the listener's static JSON shape. Async listener
|
|
981
|
-
* promises are deliberately released without attaching a handler, matching
|
|
982
|
-
* EventEmitter's ignored return value. */
|
|
983
|
-
export function ipcMessageThunkFor(emitter, cbT) {
|
|
984
|
-
const key = `ipcmsg:${typeKey(cbT)}`;
|
|
985
|
-
let sym = emitter.childExitThunks.get(key);
|
|
986
|
-
if (sym)
|
|
987
|
-
return sym;
|
|
988
|
-
sym = mangleChildExitThunk(emitter.childExitThunks.size);
|
|
989
|
-
emitter.childExitThunks.set(key, sym);
|
|
990
|
-
const param = cbT.params[0];
|
|
991
|
-
const body = [];
|
|
992
|
-
const callbackTypes = ["ScrClosure *"];
|
|
993
|
-
const callbackArgs = ["sc_cb"];
|
|
994
|
-
if (param !== undefined) {
|
|
995
|
-
const value = param.kind === "dyn"
|
|
996
|
-
? "scr_dyn_retain(sc_message)"
|
|
997
|
-
: `${emitter.dynCheckHelper(param)}(sc_message, NULL)`;
|
|
998
|
-
body.push(` ${cDecl(param, "sc_value")} = ${value};`);
|
|
999
|
-
if (param.kind !== "dyn") {
|
|
1000
|
-
body.push(` if (scr_exc_pending()) {`, ...(isRefCounted(param) ? [` ${releaseCallC(param, "sc_value")};`] : []), ` return;`, ` }`);
|
|
1001
|
-
}
|
|
1002
|
-
callbackTypes.push(cType(param).trim());
|
|
1003
|
-
callbackArgs.push("sc_value");
|
|
1004
|
-
}
|
|
1005
|
-
else {
|
|
1006
|
-
body.push(` (void)sc_message;`);
|
|
1007
|
-
}
|
|
1008
|
-
const invoke = `((` + cType(cbT.ret).trim() + ` (*)(${callbackTypes.join(", ")}))sc_cb->fn)(${callbackArgs.join(", ")})`;
|
|
1009
|
-
if (cbT.ret.kind === "void")
|
|
1010
|
-
body.push(` ${invoke};`);
|
|
1011
|
-
else
|
|
1012
|
-
body.push(` ${cDecl(cbT.ret, "sc_result")} = ${invoke};`, ` ${releaseCallC(cbT.ret, "sc_result")};`);
|
|
1013
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrDyn *sc_message);`);
|
|
1014
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrDyn *sc_message) {`, ...body, `}`);
|
|
1015
|
-
return sym;
|
|
1016
|
-
}
|
|
1017
|
-
/** Fork IPC send completion adapter. The nullable +1 runtime Error moves
|
|
1018
|
-
* into the callback's Error|null union, or is released for a zero-argument
|
|
1019
|
-
* callback. */
|
|
1020
|
-
export function ipcSendThunkFor(emitter, cbT) {
|
|
1021
|
-
const key = `ipcsend:${typeKey(cbT)}`;
|
|
1022
|
-
let sym = emitter.childExitThunks.get(key);
|
|
1023
|
-
if (sym)
|
|
1024
|
-
return sym;
|
|
1025
|
-
sym = mangleChildExitThunk(emitter.childExitThunks.size);
|
|
1026
|
-
emitter.childExitThunks.set(key, sym);
|
|
1027
|
-
const param = cbT.params[0];
|
|
1028
|
-
const body = [];
|
|
1029
|
-
if (param === undefined) {
|
|
1030
|
-
body.push(` scr_error_release(sc_error);`, ` ((void (*)(ScrClosure *))sc_cb->fn)(sc_cb);`);
|
|
1031
|
-
}
|
|
1032
|
-
else {
|
|
1033
|
-
if (param.kind !== "union")
|
|
1034
|
-
throw new InternalCompilerError("emitter bug: IPC send callback param not a union");
|
|
1035
|
-
const def = emitter.unionsById.get(param.unionId);
|
|
1036
|
-
const errorTag = def ? def.arms.findIndex((arm) => arm.kind === "object" && arm.className === "%Error") : -1;
|
|
1037
|
-
const nullTag = def ? def.arms.findIndex((arm) => arm.kind === "nullT") : -1;
|
|
1038
|
-
const errorArm = errorTag >= 0 ? def?.arms[errorTag] : undefined;
|
|
1039
|
-
if (errorTag < 0 || nullTag < 0 || !errorArm) {
|
|
1040
|
-
throw new InternalCompilerError("emitter bug: IPC send callback union lacks Error|null");
|
|
1041
|
-
}
|
|
1042
|
-
body.push(` ScrUnion *sc_value = sc_error`, ` ? scr_union_new_ref(${errorTag}, sc_error, &scr_error_retain_v, &scr_error_release_v, ${emitter.traceArgC(errorArm)})`, ` : ${emitter.unitInstanceRef(param.unionId, nullTag)};`, ` ((void (*)(ScrClosure *, ScrUnion *))sc_cb->fn)(sc_cb, sc_value);`);
|
|
1043
|
-
}
|
|
1044
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_error);`);
|
|
1045
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_error) {`, ...body, `}`);
|
|
1046
|
-
return sym;
|
|
1047
|
-
}
|
|
1048
|
-
/** The stream completion-callback closure fn for one done func type: the
|
|
1049
|
-
* `callback` a user's write/final/destroy/transform/flush receives. The
|
|
1050
|
-
* closure's one capture box holds the stream (+1); calling it unwraps the
|
|
1051
|
-
* (optional) error/data union arguments and reports completion to the
|
|
1052
|
-
* runtime. Kind names the runtime entry: "w" scr_stream_write_done, "f"
|
|
1053
|
-
* scr_stream_final_done, "d" scr_stream_destroy_done, "t"
|
|
1054
|
-
* scr_stream_transform_done, "l" scr_stream_flush_done. Args arrive
|
|
1055
|
-
* callee-owned (+1) per the universal convention and are released here. */
|
|
1056
|
-
function streamDoneFnFor(emitter, kind, doneT) {
|
|
1057
|
-
if (doneT.kind !== "func") {
|
|
1058
|
-
throw new InternalCompilerError("emitter bug: stream done callback not a func (frontend must fence)");
|
|
1059
|
-
}
|
|
1060
|
-
const key = `${kind}:${typeKey(doneT)}`;
|
|
1061
|
-
let sym = emitter.streamDoneFns.get(key);
|
|
1062
|
-
if (sym)
|
|
1063
|
-
return sym;
|
|
1064
|
-
sym = mangleStreamDoneFn(emitter.streamDoneFns.size);
|
|
1065
|
-
emitter.streamDoneFns.set(key, sym);
|
|
1066
|
-
const params = ["ScrClosure *sc_self"];
|
|
1067
|
-
const body = [
|
|
1068
|
-
` ScrStream *sc_s = (ScrStream *)scr_box_get_ref(sc_self->caps[0]); /* +1 */`,
|
|
1069
|
-
` ScrError *sc_err = NULL;`,
|
|
1070
|
-
];
|
|
1071
|
-
const errT = doneT.params[0];
|
|
1072
|
-
if (errT !== undefined) {
|
|
1073
|
-
if (errT.kind !== "union")
|
|
1074
|
-
throw new InternalCompilerError("emitter bug: stream done err param not a union");
|
|
1075
|
-
const def = emitter.unionsById.get(errT.unionId);
|
|
1076
|
-
const errTag = def ? def.arms.findIndex((a) => a.kind === "object") : -1;
|
|
1077
|
-
if (errTag < 0)
|
|
1078
|
-
throw new InternalCompilerError("emitter bug: stream done err union lacks its Error arm");
|
|
1079
|
-
params.push("ScrUnion *sc_e");
|
|
1080
|
-
body.push(` if (sc_e && sc_e->tag == ${errTag}) sc_err = scr_error_retain((ScrError *)scr_union_peek(sc_e));`);
|
|
1081
|
-
}
|
|
1082
|
-
const dataLines = [` ScrBytes *sc_data = NULL;`, ` ScrStr *sc_dataStr = NULL;`];
|
|
1083
|
-
const dataT = doneT.params[1];
|
|
1084
|
-
if (kind === "t" || kind === "l") {
|
|
1085
|
-
body.push(...dataLines);
|
|
1086
|
-
if (dataT !== undefined) {
|
|
1087
|
-
if (dataT.kind !== "union")
|
|
1088
|
-
throw new InternalCompilerError("emitter bug: stream done data param not a union");
|
|
1089
|
-
const def = emitter.unionsById.get(dataT.unionId);
|
|
1090
|
-
const bytesTag = def ? def.arms.findIndex((a) => a.kind === "bytes") : -1;
|
|
1091
|
-
const strTag = def ? def.arms.findIndex((a) => a.kind === "string") : -1;
|
|
1092
|
-
params.push("ScrUnion *sc_d");
|
|
1093
|
-
body.push(...(bytesTag >= 0
|
|
1094
|
-
? [` if (sc_d && sc_d->tag == ${bytesTag}) sc_data = scr_bytes_retain((ScrBytes *)scr_union_peek(sc_d));`]
|
|
1095
|
-
: []), ...(strTag >= 0
|
|
1096
|
-
? [` if (sc_d && sc_d->tag == ${strTag}) sc_dataStr = scr_str_retain((ScrStr *)scr_union_peek(sc_d));`]
|
|
1097
|
-
: []));
|
|
1098
|
-
}
|
|
1099
|
-
}
|
|
1100
|
-
const entry = kind === "w" ? "scr_stream_write_done" :
|
|
1101
|
-
kind === "f" ? "scr_stream_final_done" :
|
|
1102
|
-
kind === "d" ? "scr_stream_destroy_done" :
|
|
1103
|
-
kind === "t" ? "scr_stream_transform_done" : "scr_stream_flush_done";
|
|
1104
|
-
const tail = kind === "t" || kind === "l"
|
|
1105
|
-
? `${entry}(sc_s, sc_err, sc_data, sc_dataStr);`
|
|
1106
|
-
: `${entry}(sc_s, sc_err);`;
|
|
1107
|
-
emitter.walkerProtos.push(`static void ${sym}(${params.join(", ")});`);
|
|
1108
|
-
emitter.walkerDefs.push(`static void ${sym}(${params.join(", ")}) {`, ...body, ` ${tail} /* moves sc_err/sc_data; borrows sc_s */`, ` scr_stream_release(sc_s);`, ...(errT !== undefined ? [` if (sc_e) scr_union_release(sc_e);`] : []), ...((kind === "t" || kind === "l") && dataT !== undefined ? [` if (sc_d) scr_union_release(sc_d);`] : []), `}`, ``);
|
|
1109
|
-
return sym;
|
|
1110
|
-
}
|
|
1111
|
-
/** The stream-'data' listener invoke adapter for one listener func type:
|
|
1112
|
-
* the runtime's 'data' emission carries BOTH payload slots (ScrBytes *b,
|
|
1113
|
-
* ScrStr *s — exactly one non-NULL; encoded streams deliver strings),
|
|
1114
|
-
* and this thunk unwraps the listener's declared side. A listener
|
|
1115
|
-
* declaring the WRONG side for the stream's runtime mode gets a clear
|
|
1116
|
-
* TypeError instead of a type-confused payload (Node, untyped, would
|
|
1117
|
-
* just hand the value over — SEMANTICS.md). Zero-parameter listeners
|
|
1118
|
-
* ignore both slots; DYN-parameter listeners (the JS lane's adapter,
|
|
1119
|
-
* emitter.onDataDyn) box by tag, which is always right. */
|
|
1120
|
-
export function streamDataThunkFor(emitter, cbT) {
|
|
1121
|
-
if (cbT.kind !== "func") {
|
|
1122
|
-
throw new InternalCompilerError("emitter bug: stream data listener not a func (frontend must fence)");
|
|
1123
|
-
}
|
|
1124
|
-
const key = `data:${typeKey(cbT)}`;
|
|
1125
|
-
let sym = emitter.emitterInvokeThunks.get(key);
|
|
1126
|
-
if (sym)
|
|
1127
|
-
return sym;
|
|
1128
|
-
sym = mangleEmitterInvokeThunk(emitter.emitterInvokeThunks.size);
|
|
1129
|
-
emitter.emitterInvokeThunks.set(key, sym);
|
|
1130
|
-
const p = cbT.params[0];
|
|
1131
|
-
if (cbT.params.length > 1 || (p && p.kind !== "bytes" && p.kind !== "string" && p.kind !== "dyn")) {
|
|
1132
|
-
throw new InternalCompilerError("emitter bug: stream data listener param shape (frontend must fence)");
|
|
1133
|
-
}
|
|
1134
|
-
const body = [
|
|
1135
|
-
` ScrBytes *sc_b = va_arg(sc_ap, ScrBytes *);`,
|
|
1136
|
-
` ScrStr *sc_s = va_arg(sc_ap, ScrStr *);`,
|
|
1137
|
-
];
|
|
1138
|
-
const passed = ["sc_cb"];
|
|
1139
|
-
if (p === undefined) {
|
|
1140
|
-
body.push(` (void)sc_b;`, ` (void)sc_s;`);
|
|
1141
|
-
}
|
|
1142
|
-
else if (p.kind === "bytes") {
|
|
1143
|
-
body.push(` if (!sc_b) {`, ` static const char sc_m[] = "a 'data' listener declaring a Buffer chunk received a string (the stream has an encoding set)";`, ` scr_throw_error_msg(SCR_ERR_TYPE, sc_m, sizeof sc_m - 1);`, ` return;`, ` }`);
|
|
1144
|
-
passed.push("scr_bytes_retain(sc_b)");
|
|
1145
|
-
}
|
|
1146
|
-
else if (p.kind === "string") {
|
|
1147
|
-
body.push(` if (!sc_s) {`, ` static const char sc_m[] = "a 'data' listener declaring a string chunk received a Buffer (call setEncoding, or declare the chunk as a Buffer)";`, ` scr_throw_error_msg(SCR_ERR_TYPE, sc_m, sizeof sc_m - 1);`, ` return;`, ` }`);
|
|
1148
|
-
passed.push("scr_str_retain(sc_s)");
|
|
1149
|
-
}
|
|
1150
|
-
else {
|
|
1151
|
-
// dyn: box by runtime tag — the JS lane's adapter parameter.
|
|
1152
|
-
body.push(` ScrDyn *sc_d = sc_b ? scr_dyn_new_buffer_copy(sc_b) : scr_dyn_new_str(sc_s);`);
|
|
1153
|
-
passed.push("sc_d");
|
|
1154
|
-
}
|
|
1155
|
-
const sigParams = ["ScrClosure *", ...cbT.params.map((q) => cType(q).trim())].join(", ");
|
|
1156
|
-
const retC = cbT.ret.kind === "void" ? "void" : cType(cbT.ret).trim();
|
|
1157
|
-
const invoke = `((${retC} (*)(${sigParams}))sc_cb->fn)(${passed.join(", ")})`;
|
|
1158
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, va_list sc_ap);`);
|
|
1159
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, va_list sc_ap) {`, ...body, ...(cbT.ret.kind === "void"
|
|
1160
|
-
? [` ${invoke};`]
|
|
1161
|
-
: isRefCounted(cbT.ret)
|
|
1162
|
-
? [` ${retC} sc_r = ${invoke};`, ` if (sc_r) ${releaseCallC(cbT.ret, "sc_r")};`]
|
|
1163
|
-
: [` (void)${invoke};`]), `}`, ``);
|
|
1164
|
-
return sym;
|
|
1165
|
-
}
|
|
1166
|
-
/** The stream option-callback invoke adapter for one (kind, callback
|
|
1167
|
-
* type): the runtime calls the user's read/write/final/destroy/transform/
|
|
1168
|
-
* flush closure through it. The stream rides first (the leading `this`
|
|
1169
|
-
* param every option callback's lifted fn takes); the user may have
|
|
1170
|
-
* declared any PREFIX of the Node signature, so the adapter passes
|
|
1171
|
-
* exactly the declared prefix (retaining each ref per the callee-owns
|
|
1172
|
-
* convention) and materializes the completion-callback closure only when
|
|
1173
|
-
* declared — an undeclared completion callback means the operation can
|
|
1174
|
-
* never complete, exactly Node. Kinds: "r" read(size), "w" write(chunk,
|
|
1175
|
-
* enc, cb), "f" final(cb), "d" destroy(err, cb), "t" transform(chunk,
|
|
1176
|
-
* enc, cb), "l" flush(cb). */
|
|
1177
|
-
export function streamCbThunkFor(emitter, kind, cbT) {
|
|
1178
|
-
if (cbT.kind !== "func") {
|
|
1179
|
-
throw new InternalCompilerError("emitter bug: stream option callback not a func (frontend must fence)");
|
|
1180
|
-
}
|
|
1181
|
-
const key = `${kind}:${typeKey(cbT)}`;
|
|
1182
|
-
let sym = emitter.streamCbThunks.get(key);
|
|
1183
|
-
if (sym)
|
|
1184
|
-
return sym;
|
|
1185
|
-
sym = mangleStreamCbThunk(emitter.streamCbThunks.size);
|
|
1186
|
-
emitter.streamCbThunks.set(key, sym);
|
|
1187
|
-
// The runtime-facing C signatures, per kind.
|
|
1188
|
-
const runtimeParams = kind === "r" ? ["ScrStream *sc_s", "double sc_size"] :
|
|
1189
|
-
kind === "w" || kind === "t" ? ["ScrStream *sc_s", "ScrBytes *sc_chunk"] :
|
|
1190
|
-
kind === "d" || kind === "e" ? ["ScrStream *sc_s", "ScrError *sc_err"] :
|
|
1191
|
-
["ScrStream *sc_s"];
|
|
1192
|
-
// The user callback's declared prefix: params[0] is the stream (`this`)
|
|
1193
|
-
// for the inline forms; a THISLESS callback (the checked-dynamic VALUE
|
|
1194
|
-
// adapter — its first param is dyn, never an object) takes the Node
|
|
1195
|
-
// positions from param 0 and never receives the stream (the dyn call
|
|
1196
|
-
// ABI carries no receiver; SEMANTICS.md).
|
|
1197
|
-
const declared = cbT.params;
|
|
1198
|
-
const hasThis = declared[0] !== undefined && declared[0].kind === "object";
|
|
1199
|
-
if (declared.length === 0) {
|
|
1200
|
-
throw new InternalCompilerError("emitter bug: stream option callback with no params (frontend must fence)");
|
|
1201
|
-
}
|
|
1202
|
-
const passed = hasThis
|
|
1203
|
-
? ["sc_cb", `(${cType(declared[0]).trim()})scr_stream_retain(sc_s)`]
|
|
1204
|
-
: ["sc_cb"];
|
|
1205
|
-
const body = [];
|
|
1206
|
-
const off = hasThis ? 1 : 0;
|
|
1207
|
-
const full = (kind === "r" ? 1 : kind === "w" || kind === "t" ? 3 : kind === "d" ? 2 : 1) + off;
|
|
1208
|
-
// "e" (the finished/pipeline callback): ONE Node position — the error.
|
|
1209
|
-
if (declared.length > full) {
|
|
1210
|
-
throw new InternalCompilerError(`emitter bug: stream '${kind}' callback declares ${declared.length} params (frontend must fence)`);
|
|
1211
|
-
}
|
|
1212
|
-
for (let i = off; i < declared.length; i++) {
|
|
1213
|
-
const p = declared[i];
|
|
1214
|
-
const pos = i - off; // 0-based Node signature position
|
|
1215
|
-
if (kind === "r") {
|
|
1216
|
-
// read(size) — a dyn-declared size (the JS lane) boxes the number.
|
|
1217
|
-
passed.push(p.kind === "dyn" ? "scr_dyn_new_num(sc_size)" : "sc_size");
|
|
1218
|
-
continue;
|
|
1219
|
-
}
|
|
1220
|
-
const isChunkPos = (kind === "w" || kind === "t") && pos === 0;
|
|
1221
|
-
const isEncPos = (kind === "w" || kind === "t") && pos === 1;
|
|
1222
|
-
const isErrPos = (kind === "d" || kind === "e") && pos === 0;
|
|
1223
|
-
const isDonePos = kind === "e" ? false
|
|
1224
|
-
: (kind === "w" || kind === "t") ? pos === 2 : (kind === "f" || kind === "l") ? pos === 0 : pos === 1;
|
|
1225
|
-
// The JS lane's implicitly-any parameters: each position boxes into
|
|
1226
|
-
// dyn by kind — the chunk as dyn bytes, the encoding as a string,
|
|
1227
|
-
// the error as the boundary's {name, message} shape (null when
|
|
1228
|
-
// none), and the completion callback as a CALLABLE dyn whose glue
|
|
1229
|
-
// dispatches to the runtime's *_done entry (the closure's one cap
|
|
1230
|
-
// boxes the retained stream).
|
|
1231
|
-
if (p.kind === "dyn") {
|
|
1232
|
-
if (isChunkPos) {
|
|
1233
|
-
passed.push(`scr_dyn_new_buffer_copy(sc_chunk)`);
|
|
1234
|
-
}
|
|
1235
|
-
else if (isEncPos) {
|
|
1236
|
-
body.push(` ScrStr *sc_encs = scr_str_new("buffer", 6);`, ` ScrDyn *sc_encd = scr_dyn_new_str(sc_encs);`, ` scr_str_release(sc_encs);`);
|
|
1237
|
-
passed.push(`sc_encd`);
|
|
1238
|
-
}
|
|
1239
|
-
else if (isErrPos) {
|
|
1240
|
-
// finished/pipeline succeed with UNDEFINED (Node calls the eos
|
|
1241
|
-
// callback with no arguments); destroy passes null.
|
|
1242
|
-
passed.push(kind === "e"
|
|
1243
|
-
? `sc_err ? scr_dyn_from_error(sc_err) : scr_dyn_retain(scr_dyn_undefined())`
|
|
1244
|
-
: `sc_err ? scr_dyn_from_error(sc_err) : scr_dyn_new_null()`);
|
|
1245
|
-
}
|
|
1246
|
-
else if (isDonePos) {
|
|
1247
|
-
const glue = `scr_stream_done_dyn_${kind}`;
|
|
1248
|
-
body.push(` ScrClosure *sc_dclo = scr_closure_new((void *)&${glue}, 1);`, ` sc_dclo->caps[0] = scr_box_new_obj(&scr_stream_retain_v, &scr_stream_release_v, &scr_stream_trace);`, ` scr_box_set_ref(sc_dclo->caps[0], scr_stream_retain(sc_s));`, ` ScrDyn *sc_done = scr_dyn_new_func(sc_dclo, &${glue}, ${kind === "t" || kind === "l" ? 2 : 1}, ${JSON.stringify(kind === "t" || kind === "l" ? "(error,data)" : "(error)")}, "callback");`);
|
|
1249
|
-
passed.push(`sc_done`);
|
|
1250
|
-
}
|
|
1251
|
-
else {
|
|
1252
|
-
throw new InternalCompilerError(`emitter bug: stream '${kind}' dyn callback param ${i} has no adapter`);
|
|
1253
|
-
}
|
|
1254
|
-
continue;
|
|
1255
|
-
}
|
|
1256
|
-
if (isChunkPos) {
|
|
1257
|
-
passed.push(`scr_bytes_retain(sc_chunk)`);
|
|
1258
|
-
}
|
|
1259
|
-
else if (isEncPos) {
|
|
1260
|
-
// Node's encoding for decoded (Buffer) chunks is 'buffer'.
|
|
1261
|
-
body.push(` ScrStr *sc_enc = scr_str_new("buffer", 6);`);
|
|
1262
|
-
passed.push(`sc_enc`);
|
|
1263
|
-
}
|
|
1264
|
-
else if (isErrPos) {
|
|
1265
|
-
// destroy's error argument: `Error | null` — wrap type-directedly.
|
|
1266
|
-
// The finished/pipeline callback ("e") may declare `Error | null |
|
|
1267
|
-
// undefined` (the @types signature); success prefers the undefined
|
|
1268
|
-
// arm there (Node calls the eos callback with NO arguments).
|
|
1269
|
-
if (p.kind !== "union")
|
|
1270
|
-
throw new InternalCompilerError("emitter bug: stream destroy err param not a union");
|
|
1271
|
-
const def = emitter.unionsById.get(p.unionId);
|
|
1272
|
-
const errTag = def ? def.arms.findIndex((a) => a.kind === "object") : -1;
|
|
1273
|
-
const undefTag = kind === "e" && def ? def.arms.findIndex((a) => a.kind === "undefinedT") : -1;
|
|
1274
|
-
const nullTag = def
|
|
1275
|
-
? (undefTag >= 0 ? undefTag : def.arms.findIndex((a) => a.kind === "nullT"))
|
|
1276
|
-
: -1;
|
|
1277
|
-
if (errTag < 0 || nullTag < 0)
|
|
1278
|
-
throw new InternalCompilerError("emitter bug: stream destroy err union lacks its arms");
|
|
1279
|
-
body.push(` ScrUnion *sc_eu = sc_err ? scr_union_new_ref(${errTag}, scr_error_retain(sc_err), &scr_error_retain_v, &scr_error_release_v, scr_error_trace_arg()) : scr_union_retain(${emitter.unitInstanceRef(p.unionId, nullTag)});`);
|
|
1280
|
-
passed.push(`sc_eu`);
|
|
1281
|
-
}
|
|
1282
|
-
else if (isDonePos) {
|
|
1283
|
-
const doneKind = kind; // "e" has no done position
|
|
1284
|
-
const doneFn = streamDoneFnFor(emitter, doneKind, p);
|
|
1285
|
-
body.push(` ScrClosure *sc_done = scr_closure_new((void *)&${doneFn}, 1);`, ` sc_done->caps[0] = scr_box_new_obj(&scr_stream_retain_v, &scr_stream_release_v, &scr_stream_trace);`, ` scr_box_set_ref(sc_done->caps[0], scr_stream_retain(sc_s));`);
|
|
1286
|
-
passed.push(`sc_done`);
|
|
1287
|
-
}
|
|
1288
|
-
else {
|
|
1289
|
-
throw new InternalCompilerError(`emitter bug: stream '${kind}' callback param ${i} has no adapter`);
|
|
1290
|
-
}
|
|
1291
|
-
}
|
|
1292
|
-
const sigParams = ["ScrClosure *", ...declared.map((p) => cType(p).trim())].join(", ");
|
|
1293
|
-
const unused = [];
|
|
1294
|
-
if (declared.length < off + 1) {
|
|
1295
|
-
if (kind === "r")
|
|
1296
|
-
unused.push(` (void)sc_size;`);
|
|
1297
|
-
if (kind === "w" || kind === "t")
|
|
1298
|
-
unused.push(` (void)sc_chunk;`);
|
|
1299
|
-
if (kind === "d" || kind === "e")
|
|
1300
|
-
unused.push(` (void)sc_err;`);
|
|
1301
|
-
}
|
|
1302
|
-
if (!hasThis)
|
|
1303
|
-
unused.push(` (void)sc_s;`); /* the done/err adapters may still read it */
|
|
1304
|
-
// The call goes through the callback's TRUE signature; a non-void
|
|
1305
|
-
// result is discarded (refcounted ones released) — Node ignores option
|
|
1306
|
-
// callback results (`read: () => this.push(null)`).
|
|
1307
|
-
const retC = cbT.ret.kind === "void" ? "void" : cType(cbT.ret).trim();
|
|
1308
|
-
const invoke = `((${retC} (*)(${sigParams}))sc_cb->fn)(${passed.join(", ")})`;
|
|
1309
|
-
emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ${runtimeParams.join(", ")});`);
|
|
1310
|
-
emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ${runtimeParams.join(", ")}) {`, ...unused, ...body, ...(cbT.ret.kind === "void"
|
|
1311
|
-
? [` ${invoke};`]
|
|
1312
|
-
: isRefCounted(cbT.ret)
|
|
1313
|
-
? [` ${retC} sc_r = ${invoke};`, ` if (sc_r) ${releaseCallC(cbT.ret, "sc_r")};`]
|
|
1314
|
-
: [` (void)${invoke};`]), `}`, ``);
|
|
1315
|
-
return sym;
|
|
1316
|
-
}
|
|
1317
|
-
//# sourceMappingURL=async.js.map
|