@scriptc/compiler 0.3.6 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/scriptc-node-fallback.d.ts +717 -55
- package/ambient/scriptc.d.ts +134 -0
- package/dist/backend/cycle-analysis.d.ts +1 -1
- package/dist/backend/cycle-analysis.js +1 -0
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +13 -1
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.js +16 -5
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +20 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.test.js +1 -1
- package/dist/backend/library-pack.js +9 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/link-plan-core.d.ts +2 -0
- package/dist/backend/link-plan-core.js +2 -0
- package/dist/backend/link-plan-core.js.map +1 -1
- package/dist/backend/link-plan.d.ts +1 -0
- package/dist/backend/link-plan.js +1 -0
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +41 -4
- package/dist/backend/llvm/alloc.js +138 -7
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/alloc.test.js +30 -1
- package/dist/backend/llvm/alloc.test.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.test.js +1 -1
- package/dist/backend/llvm/array-search.js +3 -1
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/array-search.test.js +1 -1
- package/dist/backend/llvm/blocks.d.ts +8 -0
- package/dist/backend/llvm/blocks.js +43 -1
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/blocks.test.js +22 -1
- package/dist/backend/llvm/blocks.test.js.map +1 -1
- package/dist/backend/llvm/byte-numbers.js +15 -5
- package/dist/backend/llvm/byte-numbers.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +14 -0
- package/dist/backend/llvm/bytes-alias.js +20 -0
- package/dist/backend/llvm/bytes-alias.js.map +1 -0
- package/dist/backend/llvm/bytes-loop-versions.d.ts +86 -0
- package/dist/backend/llvm/bytes-loop-versions.js +506 -0
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -0
- package/dist/backend/llvm/bytes-loop-versions.test.d.ts +1 -0
- package/dist/backend/llvm/bytes-loop-versions.test.js +244 -0
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.js +50 -1
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +34 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/checked-narrows.test.js +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.js +4 -1
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +38 -1
- package/dist/backend/llvm/classes.js +185 -35
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +79 -17
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +21 -3
- package/dist/backend/llvm/common.js +51 -3
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +5 -1
- package/dist/backend/llvm/constant-callbacks.js +55 -12
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +88 -1
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +4 -0
- package/dist/backend/llvm/counted-loops.js +37 -0
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +15 -4
- package/dist/backend/llvm/dense-array-access.js +125 -44
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +63 -3
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +51 -0
- package/dist/backend/llvm/dense-array-loops.js +162 -0
- package/dist/backend/llvm/dense-array-loops.js.map +1 -0
- package/dist/backend/llvm/dense-array-loops.test.d.ts +1 -0
- package/dist/backend/llvm/dense-array-loops.test.js +128 -0
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -0
- package/dist/backend/llvm/dyn-handle-tags.test.d.ts +1 -0
- package/dist/backend/llvm/dyn-handle-tags.test.js +38 -0
- package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +37 -4
- package/dist/backend/llvm/dyn.js +354 -183
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.d.ts +64 -0
- package/dist/backend/llvm/emit-function.js +1193 -0
- package/dist/backend/llvm/emit-function.js.map +1 -0
- package/dist/backend/llvm/emit-module.d.ts +24 -0
- package/dist/backend/llvm/emit-module.js +1557 -0
- package/dist/backend/llvm/emit-module.js.map +1 -0
- package/dist/backend/llvm/emit-statements.d.ts +59 -0
- package/dist/backend/llvm/emit-statements.js +2041 -0
- package/dist/backend/llvm/emit-statements.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +566 -291
- package/dist/backend/llvm/emitter.js +728 -4671
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +57 -3
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +73 -46
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-async.test.js +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +2 -0
- package/dist/backend/llvm/expr-bytes.js +76 -29
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +6 -2
- package/dist/backend/llvm/expr-callbacks.js +48 -11
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +1 -1
- package/dist/backend/llvm/expr-calls.js +87 -56
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-calls.test.js +1 -1
- package/dist/backend/llvm/expr-containers.js +45 -24
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +16 -16
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.d.ts +3 -0
- package/dist/backend/llvm/expr-dynamic.js +113 -66
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +124 -28
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +57 -2
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.d.ts +1 -1
- package/dist/backend/llvm/expr-records.js +32 -11
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +65 -27
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +22 -1
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/int32-abi.test.js +2 -2
- package/dist/backend/llvm/integer-clones.js +3 -3
- package/dist/backend/llvm/integer-clones.js.map +1 -1
- package/dist/backend/llvm/integer-clones.test.js +3 -3
- package/dist/backend/llvm/integer-remainder.d.ts +34 -13
- package/dist/backend/llvm/integer-remainder.js +156 -22
- package/dist/backend/llvm/integer-remainder.js.map +1 -1
- package/dist/backend/llvm/intern-tables.test.js +1 -1
- package/dist/backend/llvm/js-ic.d.ts +18 -0
- package/dist/backend/llvm/js-ic.js +712 -0
- package/dist/backend/llvm/js-ic.js.map +1 -0
- package/dist/backend/llvm/jsval-encoding.d.ts +21 -0
- package/dist/backend/llvm/jsval-encoding.js +20 -0
- package/dist/backend/llvm/jsval-encoding.js.map +1 -0
- package/dist/backend/llvm/jsval.d.ts +12 -0
- package/dist/backend/llvm/jsval.js +616 -0
- package/dist/backend/llvm/jsval.js.map +1 -0
- package/dist/backend/llvm/lazy-captures.d.ts +12 -2
- package/dist/backend/llvm/lazy-captures.js +39 -17
- package/dist/backend/llvm/lazy-captures.js.map +1 -1
- package/dist/backend/llvm/lib-abi.js +1 -1
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-connect.js +1 -1
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +14 -8
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +189 -23
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +42 -13
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +3 -3
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +2 -2
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +56 -22
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +94 -53
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.d.ts +12 -0
- package/dist/backend/llvm/lib-shared.js +209 -6
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +46 -16
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-test.js +43 -7
- package/dist/backend/llvm/lib-test.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +4 -9
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +42 -33
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +1 -1
- package/dist/backend/llvm/local-extents.d.ts +19 -0
- package/dist/backend/llvm/local-extents.js +169 -0
- package/dist/backend/llvm/local-extents.js.map +1 -0
- package/dist/backend/llvm/local-extents.test.d.ts +1 -0
- package/dist/backend/llvm/local-extents.test.js +92 -0
- package/dist/backend/llvm/local-extents.test.js.map +1 -0
- package/dist/backend/llvm/local-union-storage.js +7 -7
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +2 -2
- package/dist/backend/llvm/map-entry-fusion.test.js +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +20 -4
- package/dist/backend/llvm/map-number-lookup.js +45 -9
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +2 -2
- package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
- package/dist/backend/llvm/narrow-guards.d.ts +38 -0
- package/dist/backend/llvm/narrow-guards.js +215 -0
- package/dist/backend/llvm/narrow-guards.js.map +1 -0
- package/dist/backend/llvm/nullable-unions.d.ts +64 -6
- package/dist/backend/llvm/nullable-unions.js +103 -6
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.test.d.ts +1 -0
- package/dist/backend/llvm/nullable-unions.test.js +65 -0
- package/dist/backend/llvm/nullable-unions.test.js.map +1 -0
- package/dist/backend/llvm/publish.d.ts +7 -0
- package/dist/backend/llvm/publish.js +50 -19
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.js +1 -1
- package/dist/backend/llvm/receivers.d.ts +31 -0
- package/dist/backend/llvm/receivers.js +395 -0
- package/dist/backend/llvm/receivers.js.map +1 -0
- package/dist/backend/llvm/record-results.d.ts +12 -1
- package/dist/backend/llvm/record-results.js +64 -4
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-effects.js +9 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +4 -0
- package/dist/backend/llvm/reference-writes.js +142 -6
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/reference-writes.test.d.ts +1 -0
- package/dist/backend/llvm/reference-writes.test.js +88 -0
- package/dist/backend/llvm/reference-writes.test.js.map +1 -0
- package/dist/backend/llvm/regex-matchers.d.ts +8 -0
- package/dist/backend/llvm/regex-matchers.js +33 -0
- package/dist/backend/llvm/regex-matchers.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.test.js +23 -1
- package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
- package/dist/backend/llvm/regions.d.ts +1 -1
- package/dist/backend/llvm/regions.js +10 -7
- package/dist/backend/llvm/regions.js.map +1 -1
- package/dist/backend/llvm/regions.test.js +8 -2
- package/dist/backend/llvm/regions.test.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +74 -45
- package/dist/backend/llvm/shapes.js +289 -28
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +37 -3
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +20 -1
- package/dist/backend/llvm/speculative-integers.js +94 -6
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.test.js +55 -1
- package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
- package/dist/backend/llvm/split-loops.js +2 -2
- package/dist/backend/llvm/split-loops.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +26 -6
- package/dist/backend/llvm/stack-objects.js +133 -10
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/stack-objects.test.js +55 -1
- package/dist/backend/llvm/stack-objects.test.js.map +1 -1
- package/dist/backend/llvm/stack-unions.test.js +1 -1
- package/dist/backend/llvm/string-construction.test.js +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +15 -14
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +1 -1
- package/dist/backend/llvm/string-reads.js +4 -4
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/string-slices.d.ts +25 -0
- package/dist/backend/llvm/string-slices.js +207 -1
- package/dist/backend/llvm/string-slices.js.map +1 -1
- package/dist/backend/llvm/string-slices.test.js +139 -2
- package/dist/backend/llvm/string-slices.test.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.test.js +2 -2
- package/dist/backend/llvm/thread-slots.d.ts +5 -0
- package/dist/backend/llvm/thread-slots.js +142 -0
- package/dist/backend/llvm/thread-slots.js.map +1 -0
- package/dist/backend/llvm/thread-slots.test.d.ts +1 -0
- package/dist/backend/llvm/thread-slots.test.js +111 -0
- package/dist/backend/llvm/thread-slots.test.js.map +1 -0
- package/dist/backend/llvm/union-repr.d.ts +7 -7
- package/dist/backend/llvm/union-repr.js +18 -2
- package/dist/backend/llvm/union-repr.js.map +1 -1
- package/dist/backend/llvm/union-retype.test.js +17 -3
- package/dist/backend/llvm/union-retype.test.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +2 -2
- package/dist/backend/llvm/walkers.js +51 -26
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wasm-modules.d.ts +16 -0
- package/dist/backend/llvm/wasm-modules.js +66 -0
- package/dist/backend/llvm/wasm-modules.js.map +1 -0
- package/dist/backend/llvm/wrapping-sums.d.ts +7 -0
- package/dist/backend/llvm/wrapping-sums.js +11 -3
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/mangle.d.ts +12 -0
- package/dist/backend/mangle.js +18 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/may-throw.d.ts +3 -0
- package/dist/backend/may-throw.js +4 -2
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +1 -1
- package/dist/backend/native/contracts.d.ts +57 -0
- package/dist/backend/native/executable.js +211 -139
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +2 -0
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +6 -0
- package/dist/backend/native-codegen.js +19 -0
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +27 -0
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +48 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-profile.d.ts +32 -0
- package/dist/backend/native-profile.js +39 -0
- package/dist/backend/native-profile.js.map +1 -0
- package/dist/backend/native-profile.test.d.ts +1 -0
- package/dist/backend/native-profile.test.js +58 -0
- package/dist/backend/native-profile.test.js.map +1 -0
- package/dist/backend/native-tools.d.ts +14 -0
- package/dist/backend/native-tools.js +13 -0
- package/dist/backend/native-tools.js.map +1 -1
- package/dist/backend/publication.test.js +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 +13 -1
- package/dist/backend/runtime-pack-core.js +14 -1
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.js +1 -1
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-native.test.d.ts +1 -0
- package/dist/backend/runtime-pack-native.test.js +31 -0
- package/dist/backend/runtime-pack-native.test.js.map +1 -0
- package/dist/backend/runtime-pack-targets.test.js +9 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +9 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/stack-observations.d.ts +22 -0
- package/dist/backend/stack-observations.js +382 -0
- package/dist/backend/stack-observations.js.map +1 -0
- package/dist/backend/stack-observations.test.d.ts +1 -0
- package/dist/backend/stack-observations.test.js +233 -0
- package/dist/backend/stack-observations.test.js.map +1 -0
- package/dist/backend/target-diagnostics.js +15 -0
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +1 -1
- package/dist/backend/warm-cache.js +8 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/backend/young-nursery.d.ts +7 -0
- package/dist/backend/young-nursery.js +10 -0
- package/dist/backend/young-nursery.js.map +1 -0
- package/dist/cli/command.js +106 -4
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/host.d.ts +3 -0
- package/dist/cli/output-options.d.ts +2 -0
- package/dist/cli/output-options.js +9 -0
- package/dist/cli/output-options.js.map +1 -1
- package/dist/cli/usage.d.ts +21 -1
- package/dist/cli/usage.js +43 -1
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.js +10 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +22 -0
- package/dist/contracts/check.js +25 -8
- package/dist/contracts/check.js.map +1 -1
- package/dist/contracts/int32-elements.d.ts +115 -0
- package/dist/contracts/int32-elements.js +1179 -0
- package/dist/contracts/int32-elements.js.map +1 -0
- package/dist/coverage/report.d.ts +16 -0
- package/dist/coverage/report.js +182 -1
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +16 -3
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +2 -0
- package/dist/coverage/verdict-cache.js +12 -0
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/coverage/verdict-cache.test.js +2 -1
- package/dist/coverage/verdict-cache.test.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +10 -6
- package/dist/diagnostics/diagnostic.js +29 -21
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +39 -2
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/diagnostics/render.d.ts +7 -0
- package/dist/diagnostics/render.js +50 -13
- package/dist/diagnostics/render.js.map +1 -1
- package/dist/diagnostics/render.test.d.ts +1 -0
- package/dist/diagnostics/render.test.js +49 -0
- package/dist/diagnostics/render.test.js.map +1 -0
- package/dist/executable/executable-cache.d.ts +27 -0
- package/dist/executable/executable-cache.js +19 -1
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +12 -1
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +2 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +6 -1
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/arguments-usage.d.ts +8 -0
- package/dist/frontend/arguments-usage.js +98 -0
- package/dist/frontend/arguments-usage.js.map +1 -1
- package/dist/frontend/arguments-usage.test.d.ts +1 -0
- package/dist/frontend/arguments-usage.test.js +32 -0
- package/dist/frontend/arguments-usage.test.js.map +1 -0
- package/dist/frontend/builtin-modules.d.ts +16 -2
- package/dist/frontend/builtin-modules.js +40 -7
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/builtin-package-aliases.d.ts +24 -0
- package/dist/frontend/builtin-package-aliases.js +133 -0
- package/dist/frontend/builtin-package-aliases.js.map +1 -0
- package/dist/frontend/builtin-package-aliases.test.d.ts +1 -0
- package/dist/frontend/builtin-package-aliases.test.js +48 -0
- package/dist/frontend/builtin-package-aliases.test.js.map +1 -0
- package/dist/frontend/cjs-syntax.js +52 -51
- package/dist/frontend/cjs-syntax.js.map +1 -1
- package/dist/frontend/contract-types.d.ts +3 -0
- package/dist/frontend/contract-types.js +36 -7
- package/dist/frontend/contract-types.js.map +1 -1
- package/dist/frontend/dts-paths.d.ts +4 -0
- package/dist/frontend/dts-paths.js +9 -1
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/experimental-import.d.ts +5 -1
- package/dist/frontend/experimental-import.js +26 -7
- package/dist/frontend/experimental-import.js.map +1 -1
- package/dist/frontend/fork-target.js +20 -22
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/fork-target.test.js +2 -1
- package/dist/frontend/fork-target.test.js.map +1 -1
- package/dist/frontend/function-completion.js +6 -6
- package/dist/frontend/function-completion.js.map +1 -1
- package/dist/frontend/helper-tokens.js +15 -3
- package/dist/frontend/helper-tokens.js.map +1 -1
- package/dist/frontend/helper-tokens.test.js +7 -1
- package/dist/frontend/helper-tokens.test.js.map +1 -1
- package/dist/frontend/inferred-js-diagnostics.js +14 -17
- package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +3 -0
- package/dist/frontend/input-tracker.js +32 -3
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/lib-contract.js +36 -32
- package/dist/frontend/lib-contract.js.map +1 -1
- package/dist/frontend/lib-exports.js +3 -3
- package/dist/frontend/lib-exports.js.map +1 -1
- package/dist/frontend/lowering/array-values.d.ts +8 -3
- package/dist/frontend/lowering/array-values.js +60 -11
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/assert-instances.js +4 -4
- package/dist/frontend/lowering/assert-instances.js.map +1 -1
- package/dist/frontend/lowering/assertion-identity.d.ts +12 -0
- package/dist/frontend/lowering/assertion-identity.js +70 -0
- package/dist/frontend/lowering/assertion-identity.js.map +1 -0
- package/dist/frontend/lowering/assertion-members.d.ts +28 -0
- package/dist/frontend/lowering/assertion-members.js +185 -0
- package/dist/frontend/lowering/assertion-members.js.map +1 -0
- package/dist/frontend/lowering/binding-analysis.js +27 -20
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtin-calls.js +63 -5
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtin-function-fences.d.ts +14 -0
- package/dist/frontend/lowering/builtin-function-fences.js +42 -0
- package/dist/frontend/lowering/builtin-function-fences.js.map +1 -0
- package/dist/frontend/lowering/builtins/arguments.js +1 -1
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/async-context.js +53 -52
- package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.js +6 -6
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
- package/dist/frontend/lowering/builtins/blob.js +8 -6
- package/dist/frontend/lowering/builtins/blob.js.map +1 -1
- package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +31 -0
- package/dist/frontend/lowering/builtins/builtin-class-dyn.js +205 -0
- package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -0
- package/dist/frontend/lowering/builtins/callable-aliases.js +17 -5
- package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-async.js +7 -7
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.d.ts +6 -4
- package/dist/frontend/lowering/builtins/child-process-methods.js +310 -57
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js +16 -10
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.d.ts +6 -4
- package/dist/frontend/lowering/builtins/child-process.js +85 -61
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/class-values.d.ts +60 -0
- package/dist/frontend/lowering/builtins/class-values.js +226 -0
- package/dist/frontend/lowering/builtins/class-values.js.map +1 -0
- package/dist/frontend/lowering/builtins/compression.d.ts +9 -0
- package/dist/frontend/lowering/builtins/compression.js +107 -44
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/constants.d.ts +9 -1
- package/dist/frontend/lowering/builtins/constants.js +28 -7
- package/dist/frontend/lowering/builtins/constants.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +22 -0
- package/dist/frontend/lowering/builtins/crypto.js +215 -38
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.d.ts +7 -1
- package/dist/frontend/lowering/builtins/dates.js +92 -16
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/disposable-stack.d.ts +18 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js +137 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -0
- package/dist/frontend/lowering/builtins/ecdh.d.ts +10 -0
- package/dist/frontend/lowering/builtins/ecdh.js +208 -0
- package/dist/frontend/lowering/builtins/ecdh.js.map +1 -0
- package/dist/frontend/lowering/builtins/environment.js +3 -3
- package/dist/frontend/lowering/builtins/environment.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.d.ts +14 -10
- package/dist/frontend/lowering/builtins/errors.js +169 -3
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +128 -116
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.js +77 -77
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-glob.js +3 -3
- package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-streams.js +10 -11
- package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
- package/dist/frontend/lowering/builtins/ipc.js +45 -8
- package/dist/frontend/lowering/builtins/ipc.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +284 -24
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/key-object.js +4 -4
- package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-bindings.d.ts +8 -0
- package/dist/frontend/lowering/builtins/module-bindings.js +71 -22
- package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +55 -44
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-resolution.d.ts +4 -3
- package/dist/frontend/lowering/builtins/module-resolution.js +24 -23
- package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
- package/dist/frontend/lowering/builtins/navigator.d.ts +13 -0
- package/dist/frontend/lowering/builtins/navigator.js +40 -0
- package/dist/frontend/lowering/builtins/navigator.js.map +1 -0
- package/dist/frontend/lowering/builtins/net-address.d.ts +19 -0
- package/dist/frontend/lowering/builtins/net-address.js +156 -0
- package/dist/frontend/lowering/builtins/net-address.js.map +1 -0
- package/dist/frontend/lowering/builtins/numbers.js +25 -9
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.d.ts +4 -0
- package/dist/frontend/lowering/builtins/operating-system.js +25 -12
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/performance.d.ts +12 -0
- package/dist/frontend/lowering/builtins/performance.js +259 -8
- package/dist/frontend/lowering/builtins/performance.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +41 -1
- package/dist/frontend/lowering/builtins/process.js +505 -99
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +5 -1
- package/dist/frontend/lowering/builtins/promises.js +326 -43
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/promisify-callback.d.ts +40 -0
- package/dist/frontend/lowering/builtins/promisify-callback.js +338 -0
- package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -0
- package/dist/frontend/lowering/builtins/properties.js +37 -1
- package/dist/frontend/lowering/builtins/properties.js.map +1 -1
- package/dist/frontend/lowering/builtins/querystring.js +14 -14
- package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +12 -2
- package/dist/frontend/lowering/builtins/readline.js +136 -39
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/receiver-types.js +3 -5
- package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -1
- package/dist/frontend/lowering/builtins/reflection.js +42 -14
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
- package/dist/frontend/lowering/builtins/runtime-constructor.d.ts +26 -0
- package/dist/frontend/lowering/builtins/runtime-constructor.js +165 -0
- package/dist/frontend/lowering/builtins/runtime-constructor.js.map +1 -0
- package/dist/frontend/lowering/builtins/strings.js +101 -12
- package/dist/frontend/lowering/builtins/strings.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +41 -38
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.js +79 -30
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/builtins/typed-array-members.d.ts +7 -0
- package/dist/frontend/lowering/builtins/typed-array-members.js +160 -0
- package/dist/frontend/lowering/builtins/typed-array-members.js.map +1 -0
- package/dist/frontend/lowering/builtins/url.d.ts +3 -0
- package/dist/frontend/lowering/builtins/url.js +120 -17
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/util-types.js +20 -4
- package/dist/frontend/lowering/builtins/util-types.js.map +1 -1
- package/dist/frontend/lowering/builtins/v8.d.ts +11 -0
- package/dist/frontend/lowering/builtins/v8.js +105 -0
- package/dist/frontend/lowering/builtins/v8.js.map +1 -0
- package/dist/frontend/lowering/builtins/webassembly.d.ts +33 -0
- package/dist/frontend/lowering/builtins/webassembly.js +388 -0
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -0
- package/dist/frontend/lowering/builtins/webcrypto.d.ts +20 -0
- package/dist/frontend/lowering/builtins/webcrypto.js +112 -0
- package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -0
- package/dist/frontend/lowering/builtins/workers.d.ts +12 -0
- package/dist/frontend/lowering/builtins/workers.js +193 -8
- package/dist/frontend/lowering/builtins/workers.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.js +69 -14
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.d.ts +23 -1
- package/dist/frontend/lowering/call-signatures.js +379 -55
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/checked-promise-all.d.ts +3 -0
- package/dist/frontend/lowering/checked-promise-all.js +1 -1
- package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.d.ts +53 -0
- package/dist/frontend/lowering/cjs-exports-object.js +561 -0
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -0
- package/dist/frontend/lowering/cjs-inline-require.d.ts +86 -0
- package/dist/frontend/lowering/cjs-inline-require.js +314 -0
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -0
- package/dist/frontend/lowering/cjs-tsc-interop.d.ts +28 -0
- package/dist/frontend/lowering/cjs-tsc-interop.js +208 -0
- package/dist/frontend/lowering/cjs-tsc-interop.js.map +1 -0
- package/dist/frontend/lowering/class-attributes.d.ts +19 -0
- package/dist/frontend/lowering/class-attributes.js +378 -0
- package/dist/frontend/lowering/class-attributes.js.map +1 -0
- package/dist/frontend/lowering/class-callbacks.d.ts +3 -1
- package/dist/frontend/lowering/class-callbacks.js +21 -10
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.js +49 -4
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-descriptors.d.ts +2 -0
- package/dist/frontend/lowering/class-descriptors.js +8 -8
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +64 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +1124 -90
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-instance-constructor.js +1 -1
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
- package/dist/frontend/lowering/class-iterables.d.ts +11 -0
- package/dist/frontend/lowering/class-iterables.js +31 -0
- package/dist/frontend/lowering/class-iterables.js.map +1 -0
- package/dist/frontend/lowering/class-method-mutations.js +73 -35
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +56 -10
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-protocol-dispatch.js +24 -22
- package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +10 -0
- package/dist/frontend/lowering/class-protocols.js +76 -45
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +6 -0
- package/dist/frontend/lowering/class-prototypes.js +86 -19
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.js +1 -1
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-static-data.js +2 -2
- package/dist/frontend/lowering/class-static-data.js.map +1 -1
- package/dist/frontend/lowering/class-to-primitive.d.ts +25 -0
- package/dist/frontend/lowering/class-to-primitive.js +264 -0
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -0
- package/dist/frontend/lowering/class-unions.d.ts +25 -0
- package/dist/frontend/lowering/class-unions.js +102 -1
- package/dist/frontend/lowering/class-unions.js.map +1 -1
- package/dist/frontend/lowering/code-generation.d.ts +14 -0
- package/dist/frontend/lowering/code-generation.js +127 -0
- package/dist/frontend/lowering/code-generation.js.map +1 -0
- package/dist/frontend/lowering/coercions/fresh-spread.d.ts +13 -0
- package/dist/frontend/lowering/coercions/fresh-spread.js +95 -0
- package/dist/frontend/lowering/coercions/fresh-spread.js.map +1 -0
- package/dist/frontend/lowering/coercions/function-adapters.d.ts +16 -2
- package/dist/frontend/lowering/coercions/function-adapters.js +239 -68
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +25 -3
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +35 -3
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.d.ts +15 -0
- package/dist/frontend/lowering/coercions/unions.js +57 -1
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/collection-ingestion.js +2 -2
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
- package/dist/frontend/lowering/collection-narrowing.js +2 -4
- package/dist/frontend/lowering/collection-narrowing.js.map +1 -1
- package/dist/frontend/lowering/construction-escapes.js +8 -8
- package/dist/frontend/lowering/construction-escapes.js.map +1 -1
- package/dist/frontend/lowering/construction-escapes.test.js +4 -4
- package/dist/frontend/lowering/construction-escapes.test.js.map +1 -1
- package/dist/frontend/lowering/constructor-returns.d.ts +61 -0
- package/dist/frontend/lowering/constructor-returns.js +477 -0
- package/dist/frontend/lowering/constructor-returns.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callback-call.js +1 -1
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +17 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +287 -118
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +1 -1
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.d.ts +0 -1
- package/dist/frontend/lowering/containers/array-construction.js +58 -13
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-from-async.d.ts +6 -5
- package/dist/frontend/lowering/containers/array-from-async.js +159 -14
- package/dist/frontend/lowering/containers/array-from-async.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +94 -77
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +1 -0
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +9 -0
- package/dist/frontend/lowering/containers/bytes.js +649 -113
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.d.ts +9 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +55 -5
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-grouping.d.ts +7 -8
- package/dist/frontend/lowering/containers/collection-grouping.js +217 -26
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +126 -28
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/dynamic-receivers.js +1 -1
- package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -1
- package/dist/frontend/lowering/containers/exec-result-uses.js +2 -2
- package/dist/frontend/lowering/containers/exec-result-uses.js.map +1 -1
- package/dist/frontend/lowering/containers/for-of.d.ts +6 -0
- package/dist/frontend/lowering/containers/for-of.js +19 -19
- package/dist/frontend/lowering/containers/for-of.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +142 -57
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +53 -4
- package/dist/frontend/lowering/containers/iterator-helpers.js +1581 -462
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/match-row-uses.d.ts +17 -0
- package/dist/frontend/lowering/containers/match-row-uses.js +264 -0
- package/dist/frontend/lowering/containers/match-row-uses.js.map +1 -0
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +14 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js +455 -30
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +30 -10
- package/dist/frontend/lowering/cycle-initialization.js +191 -35
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +47 -43
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/devirtualize.d.ts +1 -1
- package/dist/frontend/lowering/devirtualize.js +27 -7
- package/dist/frontend/lowering/devirtualize.js.map +1 -1
- package/dist/frontend/lowering/divergences.d.ts +0 -5
- package/dist/frontend/lowering/divergences.js +62 -125
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/dyn-streams.d.ts +25 -0
- package/dist/frontend/lowering/dyn-streams.js +257 -0
- package/dist/frontend/lowering/dyn-streams.js.map +1 -0
- package/dist/frontend/lowering/error-methods.js +4 -1
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/error-name-order.d.ts +19 -0
- package/dist/frontend/lowering/error-name-order.js +93 -0
- package/dist/frontend/lowering/error-name-order.js.map +1 -0
- package/dist/frontend/lowering/expressions/array-literals.d.ts +21 -0
- package/dist/frontend/lowering/expressions/array-literals.js +723 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -0
- package/dist/frontend/lowering/expressions/binary.d.ts +35 -0
- package/dist/frontend/lowering/expressions/binary.js +2557 -0
- package/dist/frontend/lowering/expressions/binary.js.map +1 -0
- package/dist/frontend/lowering/expressions/element-access.d.ts +31 -0
- package/dist/frontend/lowering/expressions/element-access.js +1804 -0
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -3
- package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
- package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +38 -0
- package/dist/frontend/lowering/expressions/hosted-narrowing.js +160 -0
- package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -0
- package/dist/frontend/lowering/expressions/identifiers.d.ts +4 -0
- package/dist/frontend/lowering/expressions/identifiers.js +830 -0
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -0
- package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +52 -0
- package/dist/frontend/lowering/expressions/keyed-field-targets.js +307 -0
- package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -0
- package/dist/frontend/lowering/expressions/narrowing.d.ts +37 -0
- package/dist/frontend/lowering/expressions/narrowing.js +1337 -0
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -0
- package/dist/frontend/lowering/expressions/native-proxy.js +4 -4
- package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +45 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
- package/dist/frontend/lowering/expressions/object-literals.js +301 -86
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -2
- package/dist/frontend/lowering/expressions/optional-chains.js +103 -17
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +115 -0
- package/dist/frontend/lowering/expressions/property-access.js +3787 -0
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -0
- package/dist/frontend/lowering/expressions/relational.d.ts +28 -0
- package/dist/frontend/lowering/expressions/relational.js +1724 -0
- package/dist/frontend/lowering/expressions/relational.js.map +1 -0
- package/dist/frontend/lowering/expressions/typeof.d.ts +22 -0
- package/dist/frontend/lowering/expressions/typeof.js +551 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -0
- package/dist/frontend/lowering/expressions/union-fields.js +1 -1
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.d.ts +21 -0
- package/dist/frontend/lowering/expressions/updates.js +780 -0
- package/dist/frontend/lowering/expressions/updates.js.map +1 -0
- package/dist/frontend/lowering/function-context.d.ts +10 -0
- package/dist/frontend/lowering/function-context.js +11 -1
- package/dist/frontend/lowering/function-context.js.map +1 -1
- package/dist/frontend/lowering/function-returns.js +52 -28
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/general-streams.d.ts +25 -0
- package/dist/frontend/lowering/general-streams.js +108 -0
- package/dist/frontend/lowering/general-streams.js.map +1 -0
- package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
- package/dist/frontend/lowering/generator-delegation.js +191 -1
- package/dist/frontend/lowering/generator-delegation.js.map +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +7 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +172 -69
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +43 -0
- package/dist/frontend/lowering/generic-functions.js +593 -118
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/handle-properties.d.ts +24 -0
- package/dist/frontend/lowering/handle-properties.js +281 -0
- package/dist/frontend/lowering/handle-properties.js.map +1 -0
- package/dist/frontend/lowering/import-meta.js +2 -2
- package/dist/frontend/lowering/import-meta.js.map +1 -1
- package/dist/frontend/lowering/intern-tables.js +10 -9
- package/dist/frontend/lowering/intern-tables.js.map +1 -1
- package/dist/frontend/lowering/iterable-spelling.d.ts +7 -0
- package/dist/frontend/lowering/iterable-spelling.js +38 -0
- package/dist/frontend/lowering/iterable-spelling.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.d.ts +19 -0
- package/dist/frontend/lowering/iterator-adapters.js +331 -3
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-class-fields.d.ts +28 -0
- package/dist/frontend/lowering/js-class-fields.js +170 -0
- package/dist/frontend/lowering/js-class-fields.js.map +1 -0
- package/dist/frontend/lowering/js-dynamic-objects.d.ts +15 -0
- package/dist/frontend/lowering/js-dynamic-objects.js +299 -0
- package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -0
- package/dist/frontend/lowering/js-dynamic-objects.test.d.ts +1 -0
- package/dist/frontend/lowering/js-dynamic-objects.test.js +35 -0
- package/dist/frontend/lowering/js-dynamic-objects.test.js.map +1 -0
- package/dist/frontend/lowering/json-require.d.ts +22 -0
- package/dist/frontend/lowering/json-require.js +131 -0
- package/dist/frontend/lowering/json-require.js.map +1 -0
- package/dist/frontend/lowering/key-order-witness.d.ts +44 -0
- package/dist/frontend/lowering/key-order-witness.js +641 -0
- package/dist/frontend/lowering/key-order-witness.js.map +1 -0
- package/dist/frontend/lowering/key-order-witness.test.d.ts +1 -0
- package/dist/frontend/lowering/key-order-witness.test.js +239 -0
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -0
- package/dist/frontend/lowering/lifetime-regions.js +7 -7
- package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.d.ts +33 -15
- package/dist/frontend/lowering/lower-array-sort.js +117 -21
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.js +93 -14
- package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +61 -60
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.d.ts +10 -1
- package/dist/frontend/lowering/lower-async-iteration.js +34 -6
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.d.ts +5 -0
- package/dist/frontend/lowering/lower-builtin-values.js +33 -3
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +1404 -448
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +54 -3
- package/dist/frontend/lowering/lower-classes.js +1529 -472
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.d.ts +4 -2
- package/dist/frontend/lowering/lower-comptime.js +111 -13
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-console.js +13 -11
- package/dist/frontend/lowering/lower-console.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.d.ts +10 -0
- package/dist/frontend/lowering/lower-dgram.js +241 -21
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-enums.js +113 -14
- package/dist/frontend/lowering/lower-enums.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +16 -7
- package/dist/frontend/lowering/lower-event-emitter.js +258 -70
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-event-target.js +2 -2
- package/dist/frontend/lowering/lower-event-target.js.map +1 -1
- package/dist/frontend/lowering/lower-expando.js +17 -13
- package/dist/frontend/lowering/lower-expando.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +188 -186
- package/dist/frontend/lowering/lower-exprs.js +1509 -12486
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +72 -22
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +6 -0
- package/dist/frontend/lowering/lower-generators.js +39 -20
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +5 -1
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +900 -107
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +23 -20
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.d.ts +8 -1
- package/dist/frontend/lowering/lower-mock.js +185 -18
- package/dist/frontend/lowering/lower-mock.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +11 -3
- package/dist/frontend/lowering/lower-modules.js +445 -94
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +6 -0
- package/dist/frontend/lowering/lower-namespaces.js +65 -33
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-module.d.ts +16 -0
- package/dist/frontend/lowering/lower-node-module.js +147 -14
- package/dist/frontend/lowering/lower-node-module.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +6 -6
- package/dist/frontend/lowering/lower-server.js +514 -101
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
- package/dist/frontend/lowering/lower-stdlib.js +179 -118
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +30 -7
- package/dist/frontend/lowering/lower-stmts.js +1950 -433
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +3 -0
- package/dist/frontend/lowering/lower-stream.js +398 -56
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-test.d.ts +3 -0
- package/dist/frontend/lowering/lower-test.js +437 -62
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +96 -32
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lower-url.js +1 -1
- package/dist/frontend/lowering/lower-url.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +424 -27
- package/dist/frontend/lowering/lowerer.js +2062 -310
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +10 -4
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/maybe-promise.d.ts +46 -0
- package/dist/frontend/lowering/maybe-promise.js +249 -0
- package/dist/frontend/lowering/maybe-promise.js.map +1 -0
- package/dist/frontend/lowering/module-member-this.d.ts +3 -0
- package/dist/frontend/lowering/module-member-this.js +262 -0
- package/dist/frontend/lowering/module-member-this.js.map +1 -0
- package/dist/frontend/lowering/module-namespace-elements.js +1 -1
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/nan-coded-reads.d.ts +3 -0
- package/dist/frontend/lowering/nan-coded-reads.js +45 -32
- package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
- package/dist/frontend/lowering/narrowing-stability.d.ts +18 -3
- package/dist/frontend/lowering/narrowing-stability.js +104 -32
- package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +11 -11
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/object-factory-new.js +6 -8
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/private-brands.d.ts +46 -0
- package/dist/frontend/lowering/private-brands.js +265 -0
- package/dist/frontend/lowering/private-brands.js.map +1 -0
- package/dist/frontend/lowering/promise-executor-adapter.d.ts +11 -0
- package/dist/frontend/lowering/promise-executor-adapter.js +87 -0
- package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -0
- package/dist/frontend/lowering/rebindable-functions.d.ts +8 -0
- package/dist/frontend/lowering/rebindable-functions.js +54 -0
- package/dist/frontend/lowering/rebindable-functions.js.map +1 -0
- package/dist/frontend/lowering/require-initialization.d.ts +32 -0
- package/dist/frontend/lowering/require-initialization.js +246 -0
- package/dist/frontend/lowering/require-initialization.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-bounds.js +7 -7
- package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.js +12 -12
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-guards.js +10 -10
- package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-guards.test.js +1 -1
- package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-ownership.js +10 -9
- package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-provenance.js +2 -2
- package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.d.ts +35 -0
- package/dist/frontend/lowering/runtime-optional-records.js +205 -32
- package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.test.js +19 -1
- package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -1
- package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
- package/dist/frontend/lowering/split-consumers.js +4 -4
- package/dist/frontend/lowering/split-consumers.js.map +1 -1
- package/dist/frontend/lowering/static-function-names.d.ts +28 -0
- package/dist/frontend/lowering/static-function-names.js +212 -0
- package/dist/frontend/lowering/static-function-names.js.map +1 -0
- package/dist/frontend/lowering/static-this.js +6 -6
- package/dist/frontend/lowering/static-this.js.map +1 -1
- package/dist/frontend/lowering/static-typeof.d.ts +26 -0
- package/dist/frontend/lowering/static-typeof.js +133 -0
- package/dist/frontend/lowering/static-typeof.js.map +1 -0
- package/dist/frontend/lowering/strict-mode.d.ts +5 -0
- package/dist/frontend/lowering/strict-mode.js +31 -0
- package/dist/frontend/lowering/strict-mode.js.map +1 -0
- package/dist/frontend/lowering/string-index-bounds.js +13 -12
- package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
- package/dist/frontend/lowering/string-index.d.ts +12 -0
- package/dist/frontend/lowering/string-index.js +72 -1
- package/dist/frontend/lowering/string-index.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +12 -3
- package/dist/frontend/lowering/surfaces.js +282 -45
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
- package/dist/frontend/lowering/symbol-fields.js +204 -36
- package/dist/frontend/lowering/symbol-fields.js.map +1 -1
- package/dist/frontend/lowering/symbol-methods.d.ts +2 -1
- package/dist/frontend/lowering/symbol-methods.js +24 -6
- package/dist/frontend/lowering/symbol-methods.js.map +1 -1
- package/dist/frontend/lowering/thenables.d.ts +16 -0
- package/dist/frontend/lowering/thenables.js +124 -0
- package/dist/frontend/lowering/thenables.js.map +1 -0
- package/dist/frontend/lowering/thread-slots.d.ts +13 -0
- package/dist/frontend/lowering/thread-slots.js +208 -0
- package/dist/frontend/lowering/thread-slots.js.map +1 -0
- package/dist/frontend/lowering/typed-arguments.d.ts +74 -0
- package/dist/frontend/lowering/typed-arguments.js +472 -0
- package/dist/frontend/lowering/typed-arguments.js.map +1 -0
- package/dist/frontend/lowering/union-retag.d.ts +8 -0
- package/dist/frontend/lowering/union-retag.js +27 -0
- package/dist/frontend/lowering/union-retag.js.map +1 -1
- package/dist/frontend/lowering/union-retag.test.js +24 -1
- package/dist/frontend/lowering/union-retag.test.js.map +1 -1
- package/dist/frontend/lowering/var-hoisting.js +6 -6
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/lowering/width-lift.d.ts +4 -0
- package/dist/frontend/mock-shapes.js +13 -6
- package/dist/frontend/mock-shapes.js.map +1 -1
- package/dist/frontend/module-source-candidates.js +1 -1
- package/dist/frontend/module-source-candidates.js.map +1 -1
- package/dist/frontend/module-source-candidates.test.js +2 -1
- package/dist/frontend/module-source-candidates.test.js.map +1 -1
- package/dist/frontend/module-syntax.js +8 -8
- package/dist/frontend/module-syntax.js.map +1 -1
- package/dist/frontend/npm-static-builtin-aliases.d.ts +8 -0
- package/dist/frontend/npm-static-builtin-aliases.js +65 -0
- package/dist/frontend/npm-static-builtin-aliases.js.map +1 -0
- package/dist/frontend/npm-static-bundled-chunks.d.ts +58 -0
- package/dist/frontend/npm-static-bundled-chunks.js +981 -0
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -0
- package/dist/frontend/npm-static-bundled-chunks.test.d.ts +1 -0
- package/dist/frontend/npm-static-bundled-chunks.test.js +399 -0
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -0
- package/dist/frontend/npm-static-bundled-cjs.js +24 -23
- package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
- package/dist/frontend/npm-static-bundled-esm.d.ts +9 -0
- package/dist/frontend/npm-static-bundled-esm.js +988 -0
- package/dist/frontend/npm-static-bundled-esm.js.map +1 -0
- package/dist/frontend/npm-static-bundled-esm.test.d.ts +1 -0
- package/dist/frontend/npm-static-bundled-esm.test.js +336 -0
- package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -0
- package/dist/frontend/npm-static-cjs-exports-alias.d.ts +2 -0
- package/dist/frontend/npm-static-cjs-exports-alias.js +186 -0
- package/dist/frontend/npm-static-cjs-exports-alias.js.map +1 -0
- package/dist/frontend/npm-static-cjs-exports-alias.test.d.ts +1 -0
- package/dist/frontend/npm-static-cjs-exports-alias.test.js +73 -0
- package/dist/frontend/npm-static-cjs-exports-alias.test.js.map +1 -0
- package/dist/frontend/npm-static-cjs-exports-var.d.ts +2 -0
- package/dist/frontend/npm-static-cjs-exports-var.js +236 -0
- package/dist/frontend/npm-static-cjs-exports-var.js.map +1 -0
- package/dist/frontend/npm-static-declaration-syntax.js +102 -101
- package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
- package/dist/frontend/npm-static-enum-iife.d.ts +6 -0
- package/dist/frontend/npm-static-enum-iife.js +280 -0
- package/dist/frontend/npm-static-enum-iife.js.map +1 -0
- package/dist/frontend/npm-static-enum-iife.test.d.ts +1 -0
- package/dist/frontend/npm-static-enum-iife.test.js +116 -0
- package/dist/frontend/npm-static-enum-iife.test.js.map +1 -0
- package/dist/frontend/npm-static-prune.js +36 -24
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-host.d.ts +4 -1
- package/dist/frontend/npm-static-rewrite-host.js +14 -3
- package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.d.ts +19 -0
- package/dist/frontend/npm-static-rewrite-syntax.js +274 -101
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static-subtyping.js +7 -9
- package/dist/frontend/npm-static-subtyping.js.map +1 -1
- package/dist/frontend/npm-static.d.ts +25 -1
- package/dist/frontend/npm-static.js +212 -16
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm-static.test.js +22 -1
- package/dist/frontend/npm-static.test.js.map +1 -1
- package/dist/frontend/npm.js +13 -0
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +47 -0
- package/dist/frontend/package-shims.js +300 -0
- package/dist/frontend/package-shims.js.map +1 -0
- package/dist/frontend/pipeline.js +230 -26
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/pipeline.test.js +22 -1
- package/dist/frontend/pipeline.test.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +6 -1
- package/dist/frontend/program-analysis.js +7 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +100 -2
- package/dist/frontend/program.js +1627 -262
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +76 -6
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/resolve.js +49 -2
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/resolve.test.js +49 -0
- package/dist/frontend/resolve.test.js.map +1 -1
- package/dist/frontend/services.d.ts +26 -1
- package/dist/frontend/services.js +59 -3
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/services.test.js +2 -1
- package/dist/frontend/services.test.js.map +1 -1
- package/dist/frontend/threads-import.js +1 -1
- package/dist/frontend/threads-import.js.map +1 -1
- package/dist/frontend/tier-analysis.d.ts +71 -0
- package/dist/frontend/tier-analysis.js +522 -0
- package/dist/frontend/tier-analysis.js.map +1 -0
- package/dist/frontend/ts7/api-conformance.d.ts +234 -0
- package/dist/frontend/ts7/api-conformance.js +7 -0
- package/dist/frontend/ts7/api-conformance.js.map +1 -0
- package/dist/frontend/ts7/ast-guards.generated.js +2 -1
- package/dist/frontend/ts7/ast-guards.generated.js.map +1 -1
- package/dist/frontend/ts7/ast-node.d.ts +47 -25
- package/dist/frontend/ts7/ast-node.js +64 -18
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +36 -12
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-types.d.ts +10 -3
- package/dist/frontend/ts7/ast-types.generated.d.ts +39 -39
- package/dist/frontend/ts7/ast.d.ts +1 -0
- package/dist/frontend/ts7/ast.js +3 -2
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +23 -0
- package/dist/frontend/ts7/checker-backend.js +88 -0
- package/dist/frontend/ts7/checker-backend.js.map +1 -0
- package/dist/frontend/ts7/checker-backend.test.d.ts +1 -0
- package/dist/frontend/ts7/checker-backend.test.js +63 -0
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -0
- package/dist/frontend/ts7/checker-cache.d.ts +0 -3
- package/dist/frontend/ts7/checker-cache.js +0 -6
- package/dist/frontend/ts7/checker-cache.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +18 -11
- package/dist/frontend/ts7/checker.js +42 -55
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +10 -7
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/diagnostic.d.ts +19 -0
- package/dist/frontend/ts7/diagnostic.js +22 -0
- package/dist/frontend/ts7/diagnostic.js.map +1 -0
- package/dist/frontend/ts7/node-functions.d.ts +8 -0
- package/dist/frontend/ts7/node-functions.js +18 -0
- package/dist/frontend/ts7/node-functions.js.map +1 -0
- package/dist/frontend/ts7/program-host.d.ts +10 -5
- package/dist/frontend/ts7/program-host.js +19 -0
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/rpc-api.d.ts +5 -1
- package/dist/frontend/ts7/rpc-api.js +8 -1
- package/dist/frontend/ts7/rpc-api.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.d.ts +13 -6
- package/dist/frontend/ts7/semantic-checker.js +26 -8
- package/dist/frontend/ts7/semantic-checker.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.test.js +12 -9
- package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +57 -24
- package/dist/frontend/ts7/semantic-model.js +114 -16
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +4 -4
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-types.d.ts +7 -3
- package/dist/frontend/ts7/semantic-types.js +1 -1
- package/dist/frontend/ts7/semantic-types.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +30 -15
- package/dist/frontend/ts7/session.js +8 -5
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/ts7/session.test.js +9 -5
- package/dist/frontend/ts7/session.test.js.map +1 -1
- package/dist/frontend/ts7/source-parser.d.ts +6 -2
- package/dist/frontend/ts7/source-parser.js +24 -3
- package/dist/frontend/ts7/source-parser.js.map +1 -1
- package/dist/frontend/ts7/source-parser.test.js +38 -17
- package/dist/frontend/ts7/source-parser.test.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +122 -2
- package/dist/frontend/type-mapper.js +2735 -723
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-only-imports.d.ts +28 -0
- package/dist/frontend/type-only-imports.js +122 -0
- package/dist/frontend/type-only-imports.js.map +1 -0
- package/dist/frontend/worker-target.js +8 -8
- package/dist/frontend/worker-target.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +87 -8
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +4 -2
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/api.d.ts +1 -1
- package/dist/ir/api.js +1 -1
- package/dist/ir/api.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +31 -0
- package/dist/ir/array-length-stability.js +249 -0
- package/dist/ir/array-length-stability.js.map +1 -0
- package/dist/ir/array-length-stability.test.d.ts +1 -0
- package/dist/ir/array-length-stability.test.js +134 -0
- package/dist/ir/array-length-stability.test.js.map +1 -0
- package/dist/ir/build.d.ts +2 -2
- package/dist/ir/build.js +1 -1
- package/dist/ir/build.js.map +1 -1
- package/dist/ir/builtin-effects.js +116 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +540 -29
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/byte-numbers.js +3 -0
- package/dist/ir/byte-numbers.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +37 -0
- package/dist/ir/callback-specialization.js +459 -0
- package/dist/ir/callback-specialization.js.map +1 -0
- package/dist/ir/callback-specialization.test.d.ts +1 -0
- package/dist/ir/callback-specialization.test.js +208 -0
- package/dist/ir/callback-specialization.test.js.map +1 -0
- package/dist/ir/capture-values.d.ts +0 -1
- package/dist/ir/capture-values.js +51 -40
- package/dist/ir/capture-values.js.map +1 -1
- package/dist/ir/constant-globals.test.js +1 -1
- package/dist/ir/constant-tables.test.js +1 -1
- package/dist/ir/field-values.test.js +1 -1
- package/dist/ir/final-fields.test.js +1 -1
- package/dist/ir/function-references.test.js +9 -1
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/init-only-globals.test.js +1 -1
- package/dist/ir/initializer-bindings.test.js +1 -1
- package/dist/ir/int32-slots.d.ts +14 -0
- package/dist/ir/int32-slots.js +97 -14
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +1 -1
- package/dist/ir/integer-loop-facts.d.ts +7 -0
- package/dist/ir/integer-loop-facts.js +103 -17
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +1 -1
- package/dist/ir/integer-loops.js +39 -9
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +104 -0
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +13 -1
- package/dist/ir/integer-ranges.js +125 -26
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +273 -2
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/intrinsic-signatures.js +6 -0
- package/dist/ir/intrinsic-signatures.js.map +1 -1
- package/dist/ir/ir.d.ts +221 -58
- package/dist/ir/ir.js +127 -12
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +10 -0
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +52 -0
- package/dist/ir/js-ic.js +199 -0
- package/dist/ir/js-ic.js.map +1 -0
- package/dist/ir/js-ic.test.d.ts +1 -0
- package/dist/ir/js-ic.test.js +148 -0
- package/dist/ir/js-ic.test.js.map +1 -0
- package/dist/ir/jsval.d.ts +8 -0
- package/dist/ir/jsval.js +399 -0
- package/dist/ir/jsval.js.map +1 -0
- package/dist/ir/jsval.test.d.ts +1 -0
- package/dist/ir/jsval.test.js +239 -0
- package/dist/ir/jsval.test.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +183 -33
- package/dist/ir/runtime-features.js +795 -422
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/scalar-records.test.js +1 -1
- package/dist/ir/self-captures.d.ts +33 -0
- package/dist/ir/self-captures.js +245 -0
- package/dist/ir/self-captures.js.map +1 -0
- package/dist/ir/self-captures.test.d.ts +1 -0
- package/dist/ir/self-captures.test.js +135 -0
- package/dist/ir/self-captures.test.js.map +1 -0
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +7 -4
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/tiers.d.ts +26 -0
- package/dist/ir/tiers.js +101 -0
- package/dist/ir/tiers.js.map +1 -0
- package/dist/ir/tiers.test.d.ts +1 -0
- package/dist/ir/tiers.test.js +140 -0
- package/dist/ir/tiers.test.js.map +1 -0
- package/dist/ir/traverse.js +201 -150
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/traverse.test.js +33 -30
- package/dist/ir/traverse.test.js.map +1 -1
- package/dist/ir/unshare.js +65 -3
- package/dist/ir/unshare.js.map +1 -1
- package/dist/ir/unshare.test.js +1 -1
- package/dist/ir/validate.js +196 -76
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +41 -11
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/fence-eval.test.js +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/ir-policy.js +14 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +1 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +5 -5
- package/dist/library/library-profile.d.ts +4 -4
- package/dist/library/library-profile.js +35 -7
- package/dist/library/library-profile.js.map +1 -1
- package/dist/library/prepare.js +13 -1
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/cli.js +22 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +35 -6
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +2 -2
- package/dist/native/executable-cache.js +3 -0
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.js +10 -0
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.test.js +19 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/toolchain.d.ts +2 -0
- package/dist/native/toolchain.js +10 -1
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +39 -1
- package/dist/native/toolchain.test.js.map +1 -1
- package/dist/startup-cache.d.ts +1 -0
- package/dist/startup-cache.js +1 -0
- package/dist/startup-cache.js.map +1 -1
- package/dist/wasm/base64.d.ts +5 -0
- package/dist/wasm/base64.js +62 -0
- package/dist/wasm/base64.js.map +1 -0
- package/dist/wasm/binary.d.ts +36 -0
- package/dist/wasm/binary.js +1976 -0
- package/dist/wasm/binary.js.map +1 -0
- package/dist/wasm/binary.test.d.ts +1 -0
- package/dist/wasm/binary.test.js +190 -0
- package/dist/wasm/binary.test.js.map +1 -0
- package/dist/wasm/discover.d.ts +38 -0
- package/dist/wasm/discover.js +377 -0
- package/dist/wasm/discover.js.map +1 -0
- package/dist/wasm/discover.test.d.ts +1 -0
- package/dist/wasm/discover.test.js +24 -0
- package/dist/wasm/discover.test.js.map +1 -0
- package/dist/wasm/module.d.ts +151 -0
- package/dist/wasm/module.js +575 -0
- package/dist/wasm/module.js.map +1 -0
- package/dist/wasm/translate.d.ts +48 -0
- package/dist/wasm/translate.js +2129 -0
- package/dist/wasm/translate.js.map +1 -0
- package/dist/wasm/translate.test.d.ts +1 -0
- package/dist/wasm/translate.test.js +207 -0
- package/dist/wasm/translate.test.js.map +1 -0
- package/package.json +22 -20
- package/shims/fs-extra/core/api.ts +1192 -0
- package/shims/fs-extra/index.ts +9 -0
- package/shims/undici/core/agent.ts +163 -0
- package/shims/undici/core/api.ts +93 -0
- package/shims/undici/core/client.ts +1304 -0
- package/shims/undici/core/connector.ts +157 -0
- package/shims/undici/core/diagnostics-types.ts +68 -0
- package/shims/undici/core/diagnostics.ts +16 -0
- package/shims/undici/core/dispatcher.ts +574 -0
- package/shims/undici/core/errors-v5.ts +22 -0
- package/shims/undici/core/errors-v7.ts +25 -0
- package/shims/undici/core/errors.ts +255 -0
- package/shims/undici/core/fetch.ts +635 -0
- package/shims/undici/core/pool.ts +280 -0
- package/shims/undici/core/readable.ts +268 -0
- package/shims/undici/core/request.ts +313 -0
- package/shims/undici/core/timers.ts +80 -0
- package/shims/undici/core/types.ts +167 -0
- package/shims/undici/core/util.ts +67 -0
- package/shims/undici/v5.ts +119 -0
- package/shims/undici/v7.ts +119 -0
- package/surface-manifest.json +304 -22
|
@@ -0,0 +1,1193 @@
|
|
|
1
|
+
/* LlEmitter's function emission: function bodies, generator and async scaffolding, async awaits, WASI fulfillment and trampolines. */
|
|
2
|
+
import { SUSPENDS, UNOPTIMIZED_BOX_SLOTS, boxSlotCount, } from "./emitter.js";
|
|
3
|
+
import { isRefCounted, typeKey } from "../../ir/ir.js";
|
|
4
|
+
import { BlockBuilder } from "./blocks.js";
|
|
5
|
+
import { findPrivateSplitLocals } from "./split-loops.js";
|
|
6
|
+
import { conditionalLoopWrites, initializerLocalCandidates, withInitializerBindings, withInitializerLocals, } from "../../ir/initializer-bindings.js";
|
|
7
|
+
import { findUnaliasedLocalArrays } from "../../ir/array-length-stability.js";
|
|
8
|
+
import { constructorClass } from "../../ir/final-fields.js";
|
|
9
|
+
import { findInitializedByteLoopBindings } from "./byte-windows.js";
|
|
10
|
+
import { findLoopArrayBorrows } from "./loop-array-borrows.js";
|
|
11
|
+
import { findCallArrayReads, findLocalArrayReads } from "./local-array-reads.js";
|
|
12
|
+
import { findScalarStringSlices, findScratchStringSlices } from "./string-slices.js";
|
|
13
|
+
import { findMapReadLifetimes, findReadNumberMapWrites } from "./map-read-lifetimes.js";
|
|
14
|
+
import { findMapEntryFusions } from "./map-entry-fusion.js";
|
|
15
|
+
import { findLocalStackUnions } from "./stack-unions.js";
|
|
16
|
+
import { findLocalStackObjects, findReassignedStackObjects } from "./stack-objects.js";
|
|
17
|
+
import { findLocalUnionStorage } from "./local-union-storage.js";
|
|
18
|
+
import { INT32_RANGE, analyzeIntegerRangeFacts } from "../../ir/integer-ranges.js";
|
|
19
|
+
import { findBytesBounds } from "./bytes-bounds.js";
|
|
20
|
+
import { findInt32Locals } from "./int32-locals.js";
|
|
21
|
+
import { findIntegerViews } from "./integer-views.js";
|
|
22
|
+
import { mangleArgPack, mangleAsyncAdoptCall, mangleAsyncAwaitCall, mangleAsyncSpawn, mangleBorrowedFunction, mangleClassStruct, mangleFunction, mangleGenDrop, mangleGenSourceClose, mangleGenSpawn, mangleGlobal, mangleLocal, mangleTrampoline, } from "../mangle.js";
|
|
23
|
+
import { InternalCompilerError } from "../../errors.js";
|
|
24
|
+
import { classEnvironmentIndex } from "./classes.js";
|
|
25
|
+
import { FN_ATTRS, boxNewCall, releaseSym, traceArg, vAdapters } from "./shapes.js";
|
|
26
|
+
import { INT32_ABI_SUFFIX, SCALAR_UNION_RESULT } from "./int32-abi.js";
|
|
27
|
+
import { f64Lit } from "./common.js";
|
|
28
|
+
import { RESULT_ENTRY_PREFIX } from "./record-results.js";
|
|
29
|
+
import { emitIntegerClone, emitIntegerDispatcher } from "./integer-clones.js";
|
|
30
|
+
export function emitFunction(emitter, fn) {
|
|
31
|
+
const B = new BlockBuilder();
|
|
32
|
+
emitter.B = B;
|
|
33
|
+
emitter.currentFunctionName = fn.name;
|
|
34
|
+
emitter.currentTier = fn.tier;
|
|
35
|
+
// Fiber switches restore the active exception cell before control
|
|
36
|
+
// returns to a synchronous frame (emitPendingCheck).
|
|
37
|
+
B.excCellInvariant = fn.async !== true && fn.generator === undefined;
|
|
38
|
+
emitter.debugScope = emitter.debug?.function(fn) ?? null;
|
|
39
|
+
B.debugLocation = emitter.debug?.location(fn.loc, emitter.debugScope) ?? null;
|
|
40
|
+
emitter.frames = [];
|
|
41
|
+
emitter.scopes = [];
|
|
42
|
+
emitter.unwindCleanups.clear();
|
|
43
|
+
emitter.jumpTargets = [];
|
|
44
|
+
emitter.currentLocals = new Map(fn.locals.map((l) => [l.id, l]));
|
|
45
|
+
emitter.lazyCaptureBoxes.clear();
|
|
46
|
+
emitter.lazyStackBoxes.clear();
|
|
47
|
+
// An unchanged captured parameter keeps its value in a plain slot; the
|
|
48
|
+
// binding is boxed only for closures (captureBox).
|
|
49
|
+
const lazyParameters = emitter.lazyCaptures.parameters(fn);
|
|
50
|
+
for (const id of lazyParameters) {
|
|
51
|
+
const { boxed: _boxed, ...plain } = emitter.currentLocals.get(id);
|
|
52
|
+
emitter.currentLocals.set(id, plain);
|
|
53
|
+
emitter.lazyCaptureBoxes.set(id, "");
|
|
54
|
+
}
|
|
55
|
+
emitter.currentConstantCallbacks =
|
|
56
|
+
emitter.debug === null ? (emitter.constantCallbacks.get(fn.name) ?? new Map()) : new Map();
|
|
57
|
+
// Preserve concrete source bindings for debugger inspection. Suspended
|
|
58
|
+
// functions keep the established array lifetime across continuations.
|
|
59
|
+
emitter.streamingSplitsEnabled = emitter.debug === null && !fn.async && !fn.generator;
|
|
60
|
+
emitter.stackCallbacks.reset(emitter.streamingSplitsEnabled);
|
|
61
|
+
emitter.stackCaptures.reset(fn, emitter.streamingSplitsEnabled, lazyParameters);
|
|
62
|
+
emitter.privateSplitLocals = emitter.streamingSplitsEnabled
|
|
63
|
+
? findPrivateSplitLocals(fn)
|
|
64
|
+
: new Map();
|
|
65
|
+
emitter.storedSplits.clear();
|
|
66
|
+
emitter.splitSpans.clear();
|
|
67
|
+
emitter.stringSlices.clear();
|
|
68
|
+
const initializerBindings = emitter.initializerBindings.get(fn.name) ?? [];
|
|
69
|
+
const numericFn = withInitializerBindings(fn, initializerBindings);
|
|
70
|
+
emitter.numericLocals = new Map(numericFn.locals.map((l) => [l.id, l]));
|
|
71
|
+
emitter.unaliasedArrays = findUnaliasedLocalArrays(fn);
|
|
72
|
+
emitter.borrowedParameters.clear();
|
|
73
|
+
emitter.referenceWrites?.enter(fn);
|
|
74
|
+
emitter.reboundOwnerSlots.clear();
|
|
75
|
+
emitter.projectedParameters.clear();
|
|
76
|
+
const projectedParameterIndexes = emitter.callLifetimes.parameters.get(fn.name);
|
|
77
|
+
if (projectedParameterIndexes)
|
|
78
|
+
for (const index of projectedParameterIndexes)
|
|
79
|
+
emitter.projectedParameters.add(fn.params[index].localId);
|
|
80
|
+
emitter.stableCallBindings = emitter.callLifetimes.bindings.get(fn.name) ?? new Set();
|
|
81
|
+
const borrowedParameterIndexes = emitter.callLifetimes.borrowed.get(fn.name);
|
|
82
|
+
if (borrowedParameterIndexes) {
|
|
83
|
+
// Rebound walk parameters borrow too, but only unchanged ones may
|
|
84
|
+
// serve as stable owners for call arguments and aliases.
|
|
85
|
+
for (const index of borrowedParameterIndexes)
|
|
86
|
+
if (!emitter.walkBorrowsByFunction.get(fn.name)?.has(fn.params[index].localId) &&
|
|
87
|
+
!emitter.reboundByFunction.get(fn.name)?.has(fn.params[index].localId))
|
|
88
|
+
emitter.borrowedParameters.add(fn.params[index].localId);
|
|
89
|
+
}
|
|
90
|
+
// A generator frame owns its unchanged parameters across suspensions.
|
|
91
|
+
const generatorParameters = emitter.callLifetimes.generatorParameters.get(fn.name);
|
|
92
|
+
if (generatorParameters !== undefined)
|
|
93
|
+
for (const id of generatorParameters)
|
|
94
|
+
emitter.borrowedParameters.add(id);
|
|
95
|
+
emitter.captureIds = new Set([...(fn.captures ?? []), ...(fn.classCaptures ?? [])].map((c) => c.localId));
|
|
96
|
+
emitter.stableCaptureIds =
|
|
97
|
+
fn.captures !== undefined ? emitter.lazyCaptures.stableCaptures(fn.name) : new Set();
|
|
98
|
+
emitter.integerLoopBindings.clear();
|
|
99
|
+
emitter.countedLoopsEnabled = emitter.debug === null && !fn.async && !fn.generator;
|
|
100
|
+
emitter.speculativeLoopsEnabled = emitter.countedLoopsEnabled;
|
|
101
|
+
emitter.speculativeFunction = fn.name;
|
|
102
|
+
emitter.speculation = null;
|
|
103
|
+
emitter.speculationResume = null;
|
|
104
|
+
emitter.finalFieldBorrows =
|
|
105
|
+
!fn.async &&
|
|
106
|
+
!fn.generator &&
|
|
107
|
+
constructorClass(fn.name) === null &&
|
|
108
|
+
emitter.finalFields.size > 0;
|
|
109
|
+
emitter.byteWindowsEnabled = emitter.countedLoopsEnabled;
|
|
110
|
+
emitter.bytesLoopVersionsEnabled = emitter.countedLoopsEnabled;
|
|
111
|
+
emitter.bytesLoopEntries = null;
|
|
112
|
+
emitter.bytesLoopFunction = fn;
|
|
113
|
+
emitter.denseLoopsEnabled = emitter.countedLoopsEnabled;
|
|
114
|
+
emitter.denseLoop = null;
|
|
115
|
+
emitter.denseLoopEntries =
|
|
116
|
+
emitter.denseLoopsEnabled && numericFn.locals.some((l) => l.type.kind === "array")
|
|
117
|
+
? findInitializedByteLoopBindings(fn)
|
|
118
|
+
: new Map();
|
|
119
|
+
emitter.byteWindowEntries =
|
|
120
|
+
emitter.byteWindowsEnabled && numericFn.locals.some((l) => l.type.kind === "bytes")
|
|
121
|
+
? findInitializedByteLoopBindings(fn)
|
|
122
|
+
: new Map();
|
|
123
|
+
emitter.integerViews.clear();
|
|
124
|
+
emitter.fieldPointerTags.clear();
|
|
125
|
+
emitter.integerArrayBindings.clear();
|
|
126
|
+
emitter.loopArrayBorrows =
|
|
127
|
+
emitter.debug === null
|
|
128
|
+
? findLoopArrayBorrows(fn, emitter.callLifetimes, emitter.referenceEffects, emitter.optionalArrayReads, emitter.referenceWrites, emitter.fnByName)
|
|
129
|
+
: new Set();
|
|
130
|
+
emitter.localArrayReads = findLocalArrayReads(fn, emitter.fnByName, emitter.unionsById, emitter.referenceEffects.functions, emitter.callLifetimes, emitter.optionalArrayReads, emitter.loopArrayBorrows, emitter.debug === null ? emitter.referenceEffects : undefined);
|
|
131
|
+
emitter.callArrayReads = findCallArrayReads(fn, emitter.optionalArrayReads, emitter.referenceEffects.functions, emitter.callLifetimes, emitter.debug === null ? emitter.referenceEffects : undefined);
|
|
132
|
+
emitter.scalarStringSlices =
|
|
133
|
+
emitter.debug === null ? findScalarStringSlices(fn, emitter.callLifetimes) : new Map();
|
|
134
|
+
emitter.scratchStringSlices =
|
|
135
|
+
emitter.debug === null
|
|
136
|
+
? findScratchStringSlices(fn, emitter.callLifetimes, emitter.scalarStringSlices, emitter.lentStringParameters)
|
|
137
|
+
: new Set();
|
|
138
|
+
emitter.mapReadLifetimes = findMapReadLifetimes(fn, emitter.boxedUnionsById, emitter.callLifetimes);
|
|
139
|
+
emitter.readNumberMapWrites = findReadNumberMapWrites(fn);
|
|
140
|
+
emitter.mapEntryFusion = emitter.debug === null ? findMapEntryFusions(fn) : null;
|
|
141
|
+
emitter.localStackUnions = findLocalStackUnions(fn, emitter.callLifetimes, emitter.boxedUnionsById);
|
|
142
|
+
emitter.localStackObjects = emitter.stackObjects
|
|
143
|
+
? findLocalStackObjects(emitter, fn, emitter.callLifetimes)
|
|
144
|
+
: new Map();
|
|
145
|
+
emitter.reassignedStackObjects = emitter.stackObjects
|
|
146
|
+
? findReassignedStackObjects(emitter, fn, emitter.callLifetimes)
|
|
147
|
+
: new Set();
|
|
148
|
+
emitter.stackObjectSlots = new Map();
|
|
149
|
+
emitter.stackObjectFieldPtrs = new Map();
|
|
150
|
+
emitter.localUnionStorageProofs = findLocalUnionStorage(fn, emitter.callLifetimes, emitter.unionSources);
|
|
151
|
+
emitter.localUnionStorage = new Map();
|
|
152
|
+
emitter.walkBorrows = emitter.walkBorrowsByFunction.get(fn.name) ?? new Set();
|
|
153
|
+
const slotFacts = emitter.int32Slots.facts(fn.name);
|
|
154
|
+
const rangeFacts = analyzeIntegerRangeFacts(numericFn, slotFacts);
|
|
155
|
+
emitter.integerRanges = rangeFacts.ranges;
|
|
156
|
+
emitter.integerLoopRanges = rangeFacts.loopRanges;
|
|
157
|
+
emitter.int32Elements = slotFacts.elements ?? null;
|
|
158
|
+
emitter.bytesBounds = findBytesBounds(numericFn, emitter.integerRanges);
|
|
159
|
+
// Debug builds keep every number local a double for the debugger's
|
|
160
|
+
// variable view. Lazily boxed captured parameters keep their double,
|
|
161
|
+
// which the box is created from, and so do plain copies of a capture or
|
|
162
|
+
// such a parameter (copyStableCaptures): the source already holds the
|
|
163
|
+
// double, which an i32 copy would convert and widen again on every call.
|
|
164
|
+
// Initializer bindings proven int32 move into an i32 local of their
|
|
165
|
+
// initializer: no other code observes the global, so the loop-carried
|
|
166
|
+
// value never round-trips through the double slot.
|
|
167
|
+
const initializerLocals = initializerLocalCandidates(initializerBindings);
|
|
168
|
+
const int32Locals = emitter.debug === null
|
|
169
|
+
? findInt32Locals(withInitializerLocals(fn, initializerLocals), emitter.integerRanges, emitter.int32Slots.facts(fn.name), new Set([...emitter.lazyCaptureBoxes.keys(), ...emitter.doubleCopies(fn)]))
|
|
170
|
+
: null;
|
|
171
|
+
emitter.int32Locals = int32Locals?.locals ?? new Map();
|
|
172
|
+
emitter.int32LocalWrites = int32Locals?.values ?? new Set();
|
|
173
|
+
const localizedGlobals = new Set();
|
|
174
|
+
for (const global of initializerLocals) {
|
|
175
|
+
if (!emitter.int32Locals.has(global.id))
|
|
176
|
+
continue;
|
|
177
|
+
localizedGlobals.add(global.id);
|
|
178
|
+
emitter.currentLocals.set(global.id, {
|
|
179
|
+
id: global.id,
|
|
180
|
+
name: global.name,
|
|
181
|
+
type: global.type,
|
|
182
|
+
mutable: global.mutable,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
emitter.chainSlots.clear();
|
|
186
|
+
emitter.finallyStack = [];
|
|
187
|
+
emitter.tryStack = [];
|
|
188
|
+
emitter.loopDepth = 0;
|
|
189
|
+
emitter.currentReturnType = fn.returnType;
|
|
190
|
+
const int32Abi = emitter.int32Abis.get(fn.name);
|
|
191
|
+
emitter.currentInt32Result = int32Abi?.result === true;
|
|
192
|
+
emitter.currentUnionResult = int32Abi?.union === true;
|
|
193
|
+
emitter.currentGenerator = fn.generator ?? null;
|
|
194
|
+
emitter.currentAsyncGenerator = fn.async === true && fn.generator !== undefined;
|
|
195
|
+
emitter.currentBorrowedReturn = emitter.borrowedReturns.has(fn.name);
|
|
196
|
+
emitter.lastUseMoves.clear();
|
|
197
|
+
emitter.varRefCounts = null;
|
|
198
|
+
emitter.currentFunctionBody = fn.body;
|
|
199
|
+
emitter.inConstructor = emitter.constructorFunctions.has(fn.name);
|
|
200
|
+
emitter.currentCoro = null;
|
|
201
|
+
emitter.logArgSlots = 0;
|
|
202
|
+
if (emitter.coroLowered(fn)) {
|
|
203
|
+
emitter.usesCoroutines = true;
|
|
204
|
+
emitter.declare(`declare token @llvm.coro.id(i32, ptr, ptr, ptr)`);
|
|
205
|
+
emitter.declare(`declare ${emitter.sizeType} @llvm.coro.size.${emitter.sizeType}()`);
|
|
206
|
+
emitter.declare(`declare ptr @llvm.coro.begin(token, ptr)`);
|
|
207
|
+
emitter.declare(`declare token @llvm.coro.save(ptr)`);
|
|
208
|
+
emitter.declare(`declare i8 @llvm.coro.suspend(token, i1)`);
|
|
209
|
+
emitter.declare(`declare ptr @llvm.coro.free(token, ptr)`);
|
|
210
|
+
emitter.declare(`declare void @llvm.coro.end(ptr, i1, token)`);
|
|
211
|
+
// Native frames come from the runtime's small-block allocator.
|
|
212
|
+
const frameAlloc = emitter.wasi ? "malloc" : "scr_rt_calloc";
|
|
213
|
+
emitter.declare(`declare ptr @${frameAlloc}(${emitter.sizeType})`);
|
|
214
|
+
emitter.declare(`declare void @${emitter.wasi ? "free" : "scr_rt_free"}(ptr)`);
|
|
215
|
+
const started = emitter.wasi ? "scr_wasi_coro_started" : "scr_coro_started";
|
|
216
|
+
emitter.declare(`declare void @${started}(ptr)`);
|
|
217
|
+
emitter.declare(`declare ptr @scr_fiber_self()`);
|
|
218
|
+
const id = B.tmp();
|
|
219
|
+
const size = B.tmp();
|
|
220
|
+
const mem = B.tmp();
|
|
221
|
+
const handle = B.tmp();
|
|
222
|
+
const self = B.tmp();
|
|
223
|
+
B.line(`${id} = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)`);
|
|
224
|
+
B.line(`${size} = call ${emitter.sizeType} @llvm.coro.size.${emitter.sizeType}()`);
|
|
225
|
+
B.line(`${mem} = call ptr @${frameAlloc}(${emitter.sizeType} ${size})`);
|
|
226
|
+
B.line(`${handle} = call ptr @llvm.coro.begin(token ${id}, ptr ${mem})`);
|
|
227
|
+
B.line(`call void @${started}(ptr ${handle})`);
|
|
228
|
+
B.line(`${self} = call ptr @scr_fiber_self()`);
|
|
229
|
+
// A native synchronous body owns its generator for the whole run (the
|
|
230
|
+
// ScrGen owns the frame), so its OUT slot address is fixed.
|
|
231
|
+
let out = null;
|
|
232
|
+
const yieldKind = fn.generator?.yieldT.kind;
|
|
233
|
+
if (!emitter.wasi &&
|
|
234
|
+
fn.async !== true &&
|
|
235
|
+
(yieldKind === "f64" || yieldKind === "date" || yieldKind === "bool")) {
|
|
236
|
+
emitter.declare(`declare ptr @scr_gen_of_fiber(ptr)`);
|
|
237
|
+
const gen = B.tmp();
|
|
238
|
+
B.line(`${gen} = call ptr @scr_gen_of_fiber(ptr ${self})`);
|
|
239
|
+
out = emitter.genOutSlot(gen);
|
|
240
|
+
}
|
|
241
|
+
emitter.currentCoro = {
|
|
242
|
+
kind: fn.generator !== undefined ? "generator" : "async",
|
|
243
|
+
id,
|
|
244
|
+
handle,
|
|
245
|
+
self,
|
|
246
|
+
finalLabel: B.newLabel("coro.final"),
|
|
247
|
+
cleanupLabel: B.newLabel("coro.cleanup"),
|
|
248
|
+
suspendLabel: B.newLabel("coro.suspend"),
|
|
249
|
+
out,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
const paramIds = new Set(fn.params.map((p) => p.localId));
|
|
253
|
+
if (emitter.debug === null) {
|
|
254
|
+
for (const id of findIntegerViews(numericFn)) {
|
|
255
|
+
// An i32 slot is its own view.
|
|
256
|
+
if (emitter.int32Locals.has(id))
|
|
257
|
+
continue;
|
|
258
|
+
const slot = B.slot();
|
|
259
|
+
B.entryAllocas.push(`${slot} = alloca i32 ; integer view ${emitter.numericLocals.get(id).name}`);
|
|
260
|
+
emitter.integerViews.set(id, slot);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
for (const global of initializerBindings) {
|
|
264
|
+
if (!emitter.integerViews.has(global.id))
|
|
265
|
+
continue;
|
|
266
|
+
const value = B.tmp();
|
|
267
|
+
B.line(`${value} = load double, ptr @${mangleGlobal(global.id)}`);
|
|
268
|
+
emitter.storeIntegerView(global.id, { name: value, type: global.type });
|
|
269
|
+
}
|
|
270
|
+
// A number global only its guarded, synchronous initializer reads or
|
|
271
|
+
// writes (findInitializerBindings) is invisible to every other function,
|
|
272
|
+
// and reentry returns before reaching it, so a local slot can stand in
|
|
273
|
+
// for it: LLVM keeps it in a register across calls and loops that would
|
|
274
|
+
// otherwise force a store and reload per iteration. The global's
|
|
275
|
+
// storage is never read again, so nothing writes the slot back. Bindings
|
|
276
|
+
// proven int32 already live in an i32 local (localizedGlobals above);
|
|
277
|
+
// this covers the remaining doubles.
|
|
278
|
+
emitter.privateGlobalSlots.clear();
|
|
279
|
+
if (emitter.debug === null && emitter.currentCoro === null && !fn.async && !fn.generator) {
|
|
280
|
+
const conditional = initializerLocals.length ? conditionalLoopWrites(fn.body) : null;
|
|
281
|
+
for (const global of initializerLocals) {
|
|
282
|
+
if (localizedGlobals.has(global.id))
|
|
283
|
+
continue;
|
|
284
|
+
// A conditional update in a loop stays a memory update (see
|
|
285
|
+
// conditionalLoopWrites).
|
|
286
|
+
if (conditional?.has(global.id))
|
|
287
|
+
continue;
|
|
288
|
+
const slot = B.slot();
|
|
289
|
+
const value = B.tmp();
|
|
290
|
+
B.entryAllocas.push(`${slot} = alloca double ; module binding ${global.name}`);
|
|
291
|
+
B.line(`${value} = load double, ptr @${mangleGlobal(global.id)}`);
|
|
292
|
+
B.line(`store double ${value}, ptr ${slot}`);
|
|
293
|
+
emitter.privateGlobalSlots.set(global.id, slot);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
for (const local of emitter.currentLocals.values()) {
|
|
297
|
+
// Boxed locals' slots hold their capture BOX (a ptr); captured
|
|
298
|
+
// (env-borrowed) locals bind the incoming box below. A caught-typed
|
|
299
|
+
// local is a catch binding: its slot holds the ScrCaught snapshot
|
|
300
|
+
// box the catch prologue takes (scr_exc_take).
|
|
301
|
+
const slotTy = local.boxed || emitter.captureIds.has(local.id) || local.type.kind === "caught"
|
|
302
|
+
? "ptr"
|
|
303
|
+
: emitter.int32Locals.has(local.id)
|
|
304
|
+
? "i32"
|
|
305
|
+
: emitter.llType(local.type);
|
|
306
|
+
B.entryAllocas.push(`%${mangleLocal(local.id)} = alloca ${slotTy} ; ${local.name}`);
|
|
307
|
+
emitter.emitDebugLocal(local, `%${mangleLocal(local.id)}`, fn.params.findIndex((p) => p.localId === local.id) + 1, emitter.captureIds.has(local.id));
|
|
308
|
+
// A localized initializer binding starts at its global's zero value.
|
|
309
|
+
if (localizedGlobals.has(local.id))
|
|
310
|
+
B.line(`store i32 0, ptr %${mangleLocal(local.id)}`);
|
|
311
|
+
// Refcounted/boxed locals start NULL (the C prologue's `= NULL`):
|
|
312
|
+
// scope-exit releases run whether or not an assign ever did.
|
|
313
|
+
if (paramIds.has(local.id) || emitter.captureIds.has(local.id))
|
|
314
|
+
continue;
|
|
315
|
+
if (local.boxed || isRefCounted(local.type)) {
|
|
316
|
+
B.line(`store ptr null, ptr %${mangleLocal(local.id)}`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// A body holding thousands of capture boxes compiles unoptimized, its
|
|
320
|
+
// box pointers kept in their slots (see boxSlotCount).
|
|
321
|
+
const unoptimized = emitter.currentCoro === null && boxSlotCount(fn) >= UNOPTIMIZED_BOX_SLOTS;
|
|
322
|
+
if (unoptimized) {
|
|
323
|
+
const slots = new Set();
|
|
324
|
+
for (const local of emitter.currentLocals.values())
|
|
325
|
+
if (local.boxed || emitter.captureIds.has(local.id))
|
|
326
|
+
slots.add(`%${mangleLocal(local.id)}`);
|
|
327
|
+
B.volatileSlots = slots;
|
|
328
|
+
// Without optimization a versioned copy only adds code.
|
|
329
|
+
emitter.bytesLoopVersionsEnabled = false;
|
|
330
|
+
}
|
|
331
|
+
// Captured bindings come in through the environment — borrowed for the
|
|
332
|
+
// whole call (the closure owns them): bound here, never released here.
|
|
333
|
+
(fn.captures ?? []).forEach((c, i) => {
|
|
334
|
+
const caps = B.tmp();
|
|
335
|
+
const p = B.tmp();
|
|
336
|
+
const box = B.tmp();
|
|
337
|
+
B.line(`${caps} = getelementptr inbounds %ScrClosure, ptr %sc_env, i64 1 ; caps`);
|
|
338
|
+
B.line(`${p} = getelementptr inbounds ptr, ptr ${caps}, ${emitter.sizeType} ${i} ; caps[${i}]`);
|
|
339
|
+
B.line(`${box} = load ptr, ptr ${p}`);
|
|
340
|
+
B.line(`store ptr ${box}, ptr %${mangleLocal(c.localId)} ; captured ${c.name}`);
|
|
341
|
+
});
|
|
342
|
+
(fn.classCaptures ?? []).forEach((c) => {
|
|
343
|
+
const self = fn.params[0];
|
|
344
|
+
if (self.type.kind !== "object")
|
|
345
|
+
throw new InternalCompilerError("class captures require an instance receiver");
|
|
346
|
+
const classSlot = B.tmp();
|
|
347
|
+
const classValue = B.tmp();
|
|
348
|
+
const caps = B.tmp();
|
|
349
|
+
const slot = B.tmp();
|
|
350
|
+
const box = B.tmp();
|
|
351
|
+
B.line(`${classSlot} = getelementptr inbounds %${mangleClassStruct(self.type.className)}, ptr %p_${mangleLocal(self.localId)}, i64 0, i32 ${classEnvironmentIndex(emitter.classMeta.get(self.type.className))}`);
|
|
352
|
+
B.line(`${classValue} = load ptr, ptr ${classSlot}`);
|
|
353
|
+
B.line(`${caps} = getelementptr inbounds %ScrClassObj, ptr ${classValue}, i64 1`);
|
|
354
|
+
B.line(`${slot} = getelementptr inbounds ptr, ptr ${caps}, ${emitter.sizeType} ${c.slot}`);
|
|
355
|
+
B.line(`${box} = load ptr, ptr ${slot}`);
|
|
356
|
+
B.line(`store ptr ${box}, ptr %${mangleLocal(c.localId)} ; class capture ${c.name}`);
|
|
357
|
+
});
|
|
358
|
+
// Params spill into their slots; the function scope owns refcounted
|
|
359
|
+
// params (callees own their params — callers passed +1). Boxed params
|
|
360
|
+
// allocate the shared binding and move the raw value in.
|
|
361
|
+
const fnScope = [];
|
|
362
|
+
for (const id of emitter.lazyCaptureBoxes.keys()) {
|
|
363
|
+
const cache = B.slot();
|
|
364
|
+
B.entryAllocas.push(`${cache} = alloca ptr ; lazy box ${emitter.currentLocals.get(id).name}`);
|
|
365
|
+
B.line(`store ptr null, ptr ${cache}`);
|
|
366
|
+
fnScope.push({
|
|
367
|
+
slot: cache,
|
|
368
|
+
type: emitter.currentLocals.get(id).type,
|
|
369
|
+
boxed: true,
|
|
370
|
+
lazy: true,
|
|
371
|
+
});
|
|
372
|
+
emitter.lazyCaptureBoxes.set(id, cache);
|
|
373
|
+
// Environments that finish during the call can share an immortal
|
|
374
|
+
// frame box. Its payload owner is released with the function scope.
|
|
375
|
+
const stack = emitter.stackCaptures.emit(emitter, id, emitter.currentLocals.get(id).type);
|
|
376
|
+
if (stack) {
|
|
377
|
+
emitter.lazyStackBoxes.set(id, stack.box);
|
|
378
|
+
if (stack.owner)
|
|
379
|
+
fnScope.push(stack.owner);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
const borrowed = emitter.callLifetimes.borrowed.get(fn.name);
|
|
383
|
+
for (const [index, p] of fn.params.entries()) {
|
|
384
|
+
const local = emitter.currentLocals.get(p.localId);
|
|
385
|
+
const slot = `%${mangleLocal(p.localId)}`;
|
|
386
|
+
if (local.boxed) {
|
|
387
|
+
const box = B.tmp();
|
|
388
|
+
B.line(`${box} = ${boxNewCall(emitter.shapeHost, p.type)} ; ${p.name} (boxed param)`);
|
|
389
|
+
emitter.boxSet(box, p.type, `%p_${mangleLocal(p.localId)}`);
|
|
390
|
+
B.line(`store ptr ${box}, ptr ${slot}`);
|
|
391
|
+
fnScope.push({ slot, type: p.type, boxed: true });
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
const incoming = { name: `%p_${mangleLocal(p.localId)}`, type: p.type };
|
|
395
|
+
if (int32Abi?.params[index]) {
|
|
396
|
+
const bits = `%p_${mangleLocal(p.localId)}${INT32_ABI_SUFFIX}`;
|
|
397
|
+
incoming.uint32 = bits;
|
|
398
|
+
incoming.integer = { name: bits, type: "i32", signed: true, range: INT32_RANGE };
|
|
399
|
+
}
|
|
400
|
+
if (emitter.storeInt32Local(p.localId, incoming))
|
|
401
|
+
continue;
|
|
402
|
+
B.line(`store ${emitter.llType(p.type)} %p_${mangleLocal(p.localId)}, ptr ${slot}`);
|
|
403
|
+
emitter.storeIntegerView(p.localId, incoming);
|
|
404
|
+
if (isRefCounted(p.type) && !borrowed?.has(index)) {
|
|
405
|
+
fnScope.push({ slot, type: p.type });
|
|
406
|
+
emitter.noteParameterMove(fn, p.localId, slot);
|
|
407
|
+
}
|
|
408
|
+
if (emitter.reboundByFunction.get(fn.name)?.has(p.localId) && borrowed?.has(index)) {
|
|
409
|
+
// The caller's borrow stays in the parameter slot; values the body
|
|
410
|
+
// assigns are owned here until rebinding or exit releases them.
|
|
411
|
+
const owner = `${slot}.owner`;
|
|
412
|
+
B.entryAllocas.push(`${owner} = alloca ptr`);
|
|
413
|
+
B.line(`store ptr null, ptr ${owner}`);
|
|
414
|
+
fnScope.push({ slot: owner, type: p.type });
|
|
415
|
+
emitter.reboundOwnerSlots.set(p.localId, owner);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
emitter.scopes.push(fnScope);
|
|
419
|
+
// Stackful native fibers and native coroutine frames retain these frames
|
|
420
|
+
// while suspended. The active exception context owns the chain, so
|
|
421
|
+
// concurrent fibers isolate it.
|
|
422
|
+
if (emitter.stackTraces &&
|
|
423
|
+
!emitter.wasi &&
|
|
424
|
+
fn.sourceName !== undefined &&
|
|
425
|
+
!emitter.unframedFunctions.has(fn.name)) {
|
|
426
|
+
B.entryAllocas.push(`%source_frame = alloca { ptr, ptr }`);
|
|
427
|
+
const frame = emitter.cstr(` at ${fn.sourceName} (${fn.loc.file})`);
|
|
428
|
+
if (B.excCellInvariant &&
|
|
429
|
+
emitter.mod.lib === undefined &&
|
|
430
|
+
emitter.mod.workers !== true &&
|
|
431
|
+
emitter.sizeType === "i64") {
|
|
432
|
+
// Executables link the active-cell pointer as a plain global, and a
|
|
433
|
+
// synchronous body sees one cell from entry to every return: push
|
|
434
|
+
// and pop the frame inline (ScrExcCell.stack is at byte 56 on
|
|
435
|
+
// 64-bit targets) instead of calling the runtime twice per call.
|
|
436
|
+
emitter.declare(`@scr_exc_active = external global ptr`);
|
|
437
|
+
B.line(`%source_frame.cell = load ptr, ptr @scr_exc_active`);
|
|
438
|
+
B.line(`%source_frame.chain = getelementptr inbounds i8, ptr %source_frame.cell, i64 56`);
|
|
439
|
+
B.line(`%source_frame.previous = load ptr, ptr %source_frame.chain`);
|
|
440
|
+
B.line(`store ptr %source_frame.previous, ptr %source_frame`);
|
|
441
|
+
B.line(`%source_frame.text = getelementptr inbounds i8, ptr %source_frame, i64 8`);
|
|
442
|
+
B.line(`store ptr ${frame}, ptr %source_frame.text`);
|
|
443
|
+
B.line(`store ptr %source_frame, ptr %source_frame.chain`);
|
|
444
|
+
B.returnEpilogue = `store ptr %source_frame.previous, ptr %source_frame.chain`;
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
emitter.declare(`declare void @scr_stack_enter(ptr, ptr)`);
|
|
448
|
+
emitter.declare(`declare void @scr_stack_leave(ptr)`);
|
|
449
|
+
B.line(`call void @scr_stack_enter(ptr %source_frame, ptr ${frame})`);
|
|
450
|
+
B.returnEpilogue = `call void @scr_stack_leave(ptr %source_frame)`;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
if (emitter.stackChecks?.has(fn.name))
|
|
454
|
+
emitter.emitStackCheck();
|
|
455
|
+
if (emitter.workerEntryPolls?.has(fn.name))
|
|
456
|
+
emitter.emitPendingCheck(undefined, true);
|
|
457
|
+
emitter.emitStmts(fn.body, true);
|
|
458
|
+
// Implicit exit of a void function: release the function scope unless
|
|
459
|
+
// the body already terminated its final block (return, or a throw
|
|
460
|
+
// whose unwind released everything down to depth 0).
|
|
461
|
+
if (fn.returnType.kind === "void" && !B.isTerminated()) {
|
|
462
|
+
emitter.releaseScope(emitter.scopes[0]);
|
|
463
|
+
// Completing by falling off the end has nothing to await.
|
|
464
|
+
if (emitter.currentAsyncGenerator)
|
|
465
|
+
emitter.emitAsyncGenSettled();
|
|
466
|
+
if (emitter.currentCoro !== null) {
|
|
467
|
+
emitter.emitWasiFulfill(null);
|
|
468
|
+
B.terminate(`br label %${emitter.currentCoro.finalLabel}`);
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
B.terminate("ret void");
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
emitter.scopes.pop();
|
|
475
|
+
const coro = emitter.currentCoro;
|
|
476
|
+
if (coro !== null) {
|
|
477
|
+
B.startBlock(coro.finalLabel);
|
|
478
|
+
// Every exit of a coroutine body joins here: its source frame (part
|
|
479
|
+
// of the coroutine frame) leaves the generator's own chain.
|
|
480
|
+
const epilogue = B.returnEpilogue;
|
|
481
|
+
B.returnEpilogue = null;
|
|
482
|
+
if (epilogue !== null)
|
|
483
|
+
B.line(epilogue);
|
|
484
|
+
if (fn.captures !== undefined) {
|
|
485
|
+
emitter.declare(`declare void @scr_closure_release(ptr)`);
|
|
486
|
+
B.line(`call void @scr_closure_release(ptr %sc_env)`);
|
|
487
|
+
}
|
|
488
|
+
if (coro.kind === "generator") {
|
|
489
|
+
const finish = emitter.wasi ? "scr_wasi_gen_finish" : "scr_gen_coro_finish";
|
|
490
|
+
emitter.declare(`declare void @${finish}(ptr)`);
|
|
491
|
+
B.line(`call void @${finish}(ptr ${coro.self})`);
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
const finish = emitter.wasi ? "scr_wasi_async_finish" : "scr_coro_async_finish";
|
|
495
|
+
emitter.declare(`declare void @${finish}(ptr)`);
|
|
496
|
+
B.line(`call void @${finish}(ptr ${coro.self})`);
|
|
497
|
+
}
|
|
498
|
+
const finalState = B.tmp();
|
|
499
|
+
B.line(`${finalState} = call i8 @llvm.coro.suspend(token none, i1 true)`);
|
|
500
|
+
B.terminate(`switch i8 ${finalState}, label %${coro.suspendLabel} [ i8 1, label %${coro.cleanupLabel} ]`);
|
|
501
|
+
B.startBlock(coro.cleanupLabel);
|
|
502
|
+
const frame = B.tmp();
|
|
503
|
+
B.line(`${frame} = call ptr @llvm.coro.free(token ${coro.id}, ptr ${coro.handle})`);
|
|
504
|
+
B.line(`call void @${emitter.wasi ? "free" : "scr_rt_free"}(ptr ${frame})`);
|
|
505
|
+
B.br(coro.suspendLabel);
|
|
506
|
+
B.startBlock(coro.suspendLabel);
|
|
507
|
+
B.line(`call void @llvm.coro.end(ptr ${coro.handle}, i1 false, token none)`);
|
|
508
|
+
const ret = emitter.llType(fn.returnType);
|
|
509
|
+
if (ret === "void")
|
|
510
|
+
B.terminate(`ret void`);
|
|
511
|
+
else if (ret === "double")
|
|
512
|
+
B.terminate(`ret double ${f64Lit(0)}`);
|
|
513
|
+
else if (ret === "i1")
|
|
514
|
+
B.terminate(`ret i1 false`);
|
|
515
|
+
else
|
|
516
|
+
B.terminate(`ret ptr null`);
|
|
517
|
+
}
|
|
518
|
+
// Shared blocks have multiple source locations. Keep the location on
|
|
519
|
+
// each incoming exception check instead of assigning one to the cleanup.
|
|
520
|
+
B.debugLocation = null;
|
|
521
|
+
for (const cleanup of emitter.unwindCleanups.values()) {
|
|
522
|
+
B.startBlock(cleanup.label);
|
|
523
|
+
emitter.releaseScope(cleanup.entries);
|
|
524
|
+
B.terminate(cleanup.terminator);
|
|
525
|
+
}
|
|
526
|
+
if (emitter.logArgSlots > 0) {
|
|
527
|
+
B.entryAllocas.push(`%logargs = alloca [${emitter.logArgSlots} x %ScrLogArg]`);
|
|
528
|
+
}
|
|
529
|
+
const params = fn.params.map((p, index) => int32Abi?.params[index]
|
|
530
|
+
? `i32 %p_${mangleLocal(p.localId)}${INT32_ABI_SUFFIX}`
|
|
531
|
+
: `${emitter.llType(p.type)} %p_${mangleLocal(p.localId)}`);
|
|
532
|
+
// The i32 entry widens its i32 parameters once; the proof makes the
|
|
533
|
+
// double exact, so readers of the incoming number see the same value.
|
|
534
|
+
if (int32Abi)
|
|
535
|
+
fn.params.forEach((p, index) => {
|
|
536
|
+
if (!int32Abi.params[index])
|
|
537
|
+
return;
|
|
538
|
+
const name = `%p_${mangleLocal(p.localId)}`;
|
|
539
|
+
B.entryAllocas.push(`${name} = sitofp i32 ${name}${INT32_ABI_SUFFIX} to double`);
|
|
540
|
+
});
|
|
541
|
+
// Lifted functions receive their closure first (the callValue ABI).
|
|
542
|
+
if (fn.captures !== undefined)
|
|
543
|
+
params.unshift("ptr %sc_env");
|
|
544
|
+
const ret = int32Abi?.result
|
|
545
|
+
? "i32"
|
|
546
|
+
: int32Abi?.union
|
|
547
|
+
? SCALAR_UNION_RESULT
|
|
548
|
+
: emitter.llType(fn.returnType);
|
|
549
|
+
let attrs = coro !== null ? "#1" : FN_ATTRS;
|
|
550
|
+
// The shared indexed-read helper (lowerSafeIndexRead) is a dense bounds
|
|
551
|
+
// test, a state test and a load behind cold runtime fallbacks, called
|
|
552
|
+
// from every `a[i]` of one element type. Without the hint LLVM keeps the
|
|
553
|
+
// hot instances out of line once they have many callers: every read pays
|
|
554
|
+
// a call, and an integer index converts to a double and back across it.
|
|
555
|
+
if (fn.name.startsWith("%arr.idxOr."))
|
|
556
|
+
attrs = `inlinehint ${attrs}`;
|
|
557
|
+
// Interface dispatch is a few key tests and direct calls ahead of the
|
|
558
|
+
// checked dynamic call. Keeping that fallback out of line leaves the
|
|
559
|
+
// tests small enough to inline at each call site.
|
|
560
|
+
if (fn.name.startsWith("%dyn.class.protocol.fallback."))
|
|
561
|
+
attrs = `noinline ${attrs}`;
|
|
562
|
+
else if (fn.name.startsWith("%dyn.class.protocol."))
|
|
563
|
+
attrs = `inlinehint ${attrs}`;
|
|
564
|
+
if (fn.name.startsWith(RESULT_ENTRY_PREFIX))
|
|
565
|
+
attrs = `inlinehint ${attrs}`;
|
|
566
|
+
if (unoptimized && attrs === FN_ATTRS)
|
|
567
|
+
attrs = `noinline optnone ${attrs}`;
|
|
568
|
+
const debug = emitter.debugScope === null ? "" : ` !dbg ${emitter.debugScope}`;
|
|
569
|
+
const symbol = borrowed ? mangleBorrowedFunction(fn.name) : mangleFunction(fn.name);
|
|
570
|
+
emitter.privateGlobalSlots.clear();
|
|
571
|
+
let body = `define internal ${ret} @${symbol}${int32Abi ? INT32_ABI_SUFFIX : ""}(${params.join(", ")}) ${attrs}${debug} { ; ${fn.name}\n${B.render()}\n}`;
|
|
572
|
+
if (int32Abi)
|
|
573
|
+
body += "\n" + emitter.emitInt32AbiWrapper(fn, symbol, int32Abi);
|
|
574
|
+
if (emitter.integerClones.members.has(fn.name)) {
|
|
575
|
+
body += "\n" + emitIntegerClone(fn, emitter, emitter.stackChecks?.has(fn.name) === true);
|
|
576
|
+
if (emitter.integerClones.dispatched.has(fn.name))
|
|
577
|
+
body +=
|
|
578
|
+
"\n" +
|
|
579
|
+
emitIntegerDispatcher(fn, emitter, `${symbol}${int32Abi ? INT32_ABI_SUFFIX : ""}`, int32Abi?.params ?? [], int32Abi?.result === true);
|
|
580
|
+
}
|
|
581
|
+
if (!borrowed)
|
|
582
|
+
return body;
|
|
583
|
+
const slot = emitter.implSlotBorrowed(fn.name);
|
|
584
|
+
const virtual = slot.size > 0 && slot.size !== borrowed.size
|
|
585
|
+
? "\n" + emitter.emitOwnedCallAdapter(fn, borrowed, slot)
|
|
586
|
+
: "";
|
|
587
|
+
return body + "\n" + emitter.emitOwnedCallAdapter(fn, borrowed) + virtual;
|
|
588
|
+
}
|
|
589
|
+
/** Per-generator-function machinery — the async scaffolding's lazy
|
|
590
|
+
* sibling (async.ts's emitGenScaffolding): the same argument pack,
|
|
591
|
+
* a fiber trampoline whose epilogue stores the COMPLETION value (or
|
|
592
|
+
* consumes the GENRET sentinel, promoting the parked .return value), a
|
|
593
|
+
* spawn wrapper that only ALLOCATES the suspended fiber, and the
|
|
594
|
+
* never-started teardown that drops the packed (+1) arguments. */
|
|
595
|
+
export function emitGenScaffolding(emitter) {
|
|
596
|
+
const out = [];
|
|
597
|
+
for (const fn of emitter.mod.functions) {
|
|
598
|
+
if (fn.generator === undefined)
|
|
599
|
+
continue;
|
|
600
|
+
const { definitions, pack, lifted, fieldTys, ret, tr, spawnParams, argPackLines } = emitter.emitArgPackAndTrampolinePrologue(fn);
|
|
601
|
+
for (const line of definitions)
|
|
602
|
+
out.push(line);
|
|
603
|
+
emitter.declare(`declare zeroext i1 @scr_exc_genret_pending()`);
|
|
604
|
+
emitter.declare(`declare void @scr_exc_clear()`);
|
|
605
|
+
emitter.declare(`declare ptr @scr_gen_of_fiber(ptr)`);
|
|
606
|
+
emitter.declare(`declare void @scr_gen_ret_to_out(ptr)`);
|
|
607
|
+
emitter.declare(`declare ptr @scr_gen_new(ptr, ptr, ptr)`);
|
|
608
|
+
emitter.needOom();
|
|
609
|
+
const coroBody = emitter.coroLowered(fn);
|
|
610
|
+
if (lifted && !coroBody) {
|
|
611
|
+
emitter.declare(`declare void @scr_closure_release(ptr)`);
|
|
612
|
+
}
|
|
613
|
+
// Normal completion stores the (typed) return value; void completes
|
|
614
|
+
// with the NONE slot — JS's undefined done-value. A GENRET unwind
|
|
615
|
+
// consumes the sentinel and promotes the parked .return value; a
|
|
616
|
+
// real exception stays pending (the consumer-side resume moves it).
|
|
617
|
+
if (coroBody) {
|
|
618
|
+
tr.push(` ret void`, `}`, ``);
|
|
619
|
+
}
|
|
620
|
+
else {
|
|
621
|
+
tr.push(` %g = call ptr @scr_gen_of_fiber(ptr %self)`, ...emitter.pendingTestLines("%pend"), ` br i1 %pend, label %thrown, label %clean`, `clean:`);
|
|
622
|
+
switch (ret.kind) {
|
|
623
|
+
case "void":
|
|
624
|
+
tr.push(` br label %done ; void body: the done value is undefined (NONE)`);
|
|
625
|
+
break;
|
|
626
|
+
case "f64":
|
|
627
|
+
case "date":
|
|
628
|
+
emitter.declare(`declare void @scr_gen_out_f64(ptr, double)`);
|
|
629
|
+
tr.push(` call void @scr_gen_out_f64(ptr %g, double %r)`, ` br label %done`);
|
|
630
|
+
break;
|
|
631
|
+
case "bool":
|
|
632
|
+
emitter.declare(`declare void @scr_gen_out_bool(ptr, i1 zeroext)`);
|
|
633
|
+
tr.push(` call void @scr_gen_out_bool(ptr %g, i1 %r)`, ` br label %done`);
|
|
634
|
+
break;
|
|
635
|
+
default: {
|
|
636
|
+
const v = vAdapters(emitter.shapeHost, ret);
|
|
637
|
+
emitter.declare(`declare void @scr_gen_out_ref(ptr, ptr, ptr)`);
|
|
638
|
+
tr.push(` call void @scr_gen_out_ref(ptr %g, ptr %r, ptr ${v.release})`, ` br label %done`);
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
tr.push(`thrown:`, ` %genret = call zeroext i1 @scr_exc_genret_pending()`, ` br i1 %genret, label %promote, label %dropdummy`, `promote:`, ` call void @scr_exc_clear()`, ` call void @scr_gen_ret_to_out(ptr %g)`, ` br label %dropdummy`, `dropdummy:`);
|
|
642
|
+
if (ret.kind !== "void" && isRefCounted(ret)) {
|
|
643
|
+
tr.push(` call void ${releaseSym(emitter.shapeHost, ret)}(ptr %r) ; unwound: the never-read dummy`);
|
|
644
|
+
}
|
|
645
|
+
tr.push(` br label %done`, `done:`, ` ret void`, `}`, ``);
|
|
646
|
+
}
|
|
647
|
+
for (const line of tr)
|
|
648
|
+
out.push(line);
|
|
649
|
+
let settleAsync = null;
|
|
650
|
+
if (fn.async) {
|
|
651
|
+
emitter.declare(`declare ptr @scr_async_gen_new(ptr, ptr, ptr, ptr)`);
|
|
652
|
+
const genT = {
|
|
653
|
+
kind: "generator",
|
|
654
|
+
async: true,
|
|
655
|
+
yieldT: fn.generator.yieldT,
|
|
656
|
+
retT: ret,
|
|
657
|
+
nextT: fn.generator.nextT,
|
|
658
|
+
};
|
|
659
|
+
const resultT = fn.generator.resultType;
|
|
660
|
+
const build = emitter.genResultThunkFor(genT, resultT);
|
|
661
|
+
settleAsync = `${build}_async`;
|
|
662
|
+
const settleKey = `ags:${typeKey(genT)}`;
|
|
663
|
+
if (!emitter.resolveThunks.has(settleKey)) {
|
|
664
|
+
emitter.resolveThunks.set(settleKey, settleAsync);
|
|
665
|
+
const adapters = vAdapters(emitter.shapeHost, resultT);
|
|
666
|
+
emitter.resolveThunkDefs.push(`define internal void @${settleAsync}(ptr %g, ptr %p) ${FN_ATTRS} {`, `entry:`, ` %r = call ptr @${build}(ptr %g)`, ` call void @scr_promise_fulfill_ref(ptr %p, ptr %r, ptr ${adapters.retain}, ptr ${adapters.release}, ptr ${traceArg(emitter.shapeHost, resultT)})`, ` ret void`, `}`, ``);
|
|
667
|
+
}
|
|
668
|
+
emitter.declare(`declare void @scr_promise_fulfill_ref(ptr, ptr, ptr, ptr, ptr)`);
|
|
669
|
+
}
|
|
670
|
+
// The never-started teardown: drop the packed (+1) arguments.
|
|
671
|
+
const dr = [
|
|
672
|
+
`define internal void @${mangleGenDrop(fn.name)}(ptr %ap) ${FN_ATTRS} {`,
|
|
673
|
+
`entry:`,
|
|
674
|
+
];
|
|
675
|
+
fieldTys.forEach((ty, i) => {
|
|
676
|
+
const pType = lifted && i === 0 ? null : fn.params[lifted ? i - 1 : i].type;
|
|
677
|
+
const refcounted = pType === null || isRefCounted(pType);
|
|
678
|
+
if (!refcounted)
|
|
679
|
+
return;
|
|
680
|
+
dr.push(` %dp${i} = getelementptr inbounds %${pack}, ptr %ap, i64 0, i32 ${i}`, ` %dv${i} = load ptr, ptr %dp${i}`);
|
|
681
|
+
if (pType === null) {
|
|
682
|
+
emitter.declare(`declare void @scr_closure_release(ptr)`);
|
|
683
|
+
dr.push(` call void @scr_closure_release(ptr %dv${i})`);
|
|
684
|
+
}
|
|
685
|
+
else {
|
|
686
|
+
dr.push(` call void ${releaseSym(emitter.shapeHost, pType)}(ptr %dv${i})`);
|
|
687
|
+
}
|
|
688
|
+
});
|
|
689
|
+
dr.push(` call void @free(ptr %ap)`, ` ret void`, `}`, ``);
|
|
690
|
+
for (const line of dr)
|
|
691
|
+
out.push(line);
|
|
692
|
+
// An iterator helper's return() before its first next() closes the
|
|
693
|
+
// source generator in its first argument slot.
|
|
694
|
+
const closesSource = fn.generator.closesSource === true;
|
|
695
|
+
if (fn.generator.tag !== undefined)
|
|
696
|
+
emitter.declare(`declare void @scr_gen_set_tag(ptr, ptr)`);
|
|
697
|
+
if (fn.generator.inheritsTag === true)
|
|
698
|
+
emitter.declare(`declare void @scr_gen_copy_tag(ptr, ptr)`);
|
|
699
|
+
if (closesSource) {
|
|
700
|
+
const field = lifted ? 1 : 0;
|
|
701
|
+
emitter.declare(`declare void @scr_gen_close(ptr)`);
|
|
702
|
+
emitter.declare(`declare void @scr_gen_set_unstarted_return(ptr, ptr)`);
|
|
703
|
+
out.push(`define internal void @${mangleGenSourceClose(fn.name)}(ptr %ap) ${FN_ATTRS} {`, `entry:`, ` %sp = getelementptr inbounds %${pack}, ptr %ap, i64 0, i32 ${field}`, ` %sv = load ptr, ptr %sp`, ` call void @scr_gen_close(ptr %sv)`, ` ret void`, `}`, ``);
|
|
704
|
+
}
|
|
705
|
+
// Spawn wrapper: pack the args (+1 moves in), allocate the
|
|
706
|
+
// SUSPENDED fiber — nothing runs until the first .next().
|
|
707
|
+
if (lifted) {
|
|
708
|
+
emitter.declare(`declare ptr @scr_closure_retain_v(ptr)`);
|
|
709
|
+
}
|
|
710
|
+
const sp = [
|
|
711
|
+
`define internal ptr @${mangleGenSpawn(fn.name)}(${spawnParams.join(", ")}) ${FN_ATTRS} { ; gen spawn ${fn.name}`,
|
|
712
|
+
`entry:`,
|
|
713
|
+
...argPackLines,
|
|
714
|
+
];
|
|
715
|
+
const genNew = coroBody && !emitter.wasi ? "scr_gen_new_stackless" : "scr_gen_new";
|
|
716
|
+
if (genNew !== "scr_gen_new")
|
|
717
|
+
emitter.declare(`declare ptr @${genNew}(ptr, ptr, ptr)`);
|
|
718
|
+
sp.push(settleAsync === null
|
|
719
|
+
? ` %gg = call ptr @${genNew}(ptr @${mangleTrampoline(fn.name)}, ptr %ap, ptr @${mangleGenDrop(fn.name)})`
|
|
720
|
+
: ` %gg = call ptr @scr_async_gen_new(ptr @${mangleTrampoline(fn.name)}, ptr %ap, ptr @${mangleGenDrop(fn.name)}, ptr @${settleAsync})`, ...(fn.generator.tag !== undefined
|
|
721
|
+
? [` call void @scr_gen_set_tag(ptr %gg, ptr ${emitter.cstr(fn.generator.tag)})`]
|
|
722
|
+
: []), ...(fn.generator.inheritsTag === true
|
|
723
|
+
? [` call void @scr_gen_copy_tag(ptr %gg, ptr %a${lifted ? 1 : 0})`]
|
|
724
|
+
: []), ...(closesSource
|
|
725
|
+
? [
|
|
726
|
+
` call void @scr_gen_set_unstarted_return(ptr %gg, ptr @${mangleGenSourceClose(fn.name)})`,
|
|
727
|
+
]
|
|
728
|
+
: []), ` ret ptr %gg`, `}`, ``);
|
|
729
|
+
for (const line of sp)
|
|
730
|
+
out.push(line);
|
|
731
|
+
}
|
|
732
|
+
return out;
|
|
733
|
+
}
|
|
734
|
+
/** Per-async-function machinery — async.ts's scaffolding, .ll
|
|
735
|
+
* flavored: an argument-pack struct type, a fiber trampoline (unpacks,
|
|
736
|
+
* frees the pack, runs the ordinary compiled body, settles the
|
|
737
|
+
* promise — fulfilling on clean return, leaving a pending exception
|
|
738
|
+
* for the runtime to reject with), and a spawn wrapper call sites and
|
|
739
|
+
* closures enter through (packs the args +1, scr_async_spawn runs the
|
|
740
|
+
* fiber eagerly to its first suspension and returns the promise). */
|
|
741
|
+
export function emitAsyncScaffolding(emitter) {
|
|
742
|
+
const out = [];
|
|
743
|
+
if (emitter.wasi) {
|
|
744
|
+
emitter.declare(`declare void @llvm.coro.resume(ptr)`);
|
|
745
|
+
emitter.declare(`declare void @llvm.coro.destroy(ptr)`);
|
|
746
|
+
out.push(`define void @scr_wasi_coro_resume(ptr %handle) ${FN_ATTRS} {`, `entry:`, ` call void @llvm.coro.resume(ptr %handle)`, ` ret void`, `}`, `define void @scr_wasi_coro_destroy(ptr %handle) ${FN_ATTRS} {`, `entry:`, ` call void @llvm.coro.destroy(ptr %handle)`, ` ret void`, `}`, ``);
|
|
747
|
+
}
|
|
748
|
+
const fiberless = emitter.fiberlessAsyncFunctions();
|
|
749
|
+
for (const fn of emitter.mod.functions) {
|
|
750
|
+
if (fn.async !== true || fn.generator !== undefined)
|
|
751
|
+
continue;
|
|
752
|
+
if (fiberless.has(fn.name) && emitter.awaitCallees.has(fn.name)) {
|
|
753
|
+
for (const line of emitter.emitAsyncAwaitCall(fn, null))
|
|
754
|
+
out.push(line);
|
|
755
|
+
}
|
|
756
|
+
if (fiberless.has(fn.name) && emitter.adoptCallees.has(fn.name)) {
|
|
757
|
+
for (const line of emitter.emitAsyncAwaitCall(fn, null, true))
|
|
758
|
+
out.push(line);
|
|
759
|
+
}
|
|
760
|
+
if (emitter.inlineAwaitCallees.has(fn.name)) {
|
|
761
|
+
for (const line of emitter.emitAsyncInlineAwaitCall(fn))
|
|
762
|
+
out.push(line);
|
|
763
|
+
}
|
|
764
|
+
if (fiberless.has(fn.name)) {
|
|
765
|
+
const fieldTys = [
|
|
766
|
+
...(fn.captures !== undefined ? ["ptr"] : []),
|
|
767
|
+
...fn.params.map((p) => emitter.llType(p.type)),
|
|
768
|
+
];
|
|
769
|
+
const params = fieldTys.map((ty, i) => `${ty} %a${i}`);
|
|
770
|
+
for (const line of emitter.emitFiberlessAsyncSpawn(fn, params))
|
|
771
|
+
out.push(line);
|
|
772
|
+
continue;
|
|
773
|
+
}
|
|
774
|
+
const { definitions, ret, tr, spawnParams, argPackLines } = emitter.emitArgPackAndTrampolinePrologue(fn);
|
|
775
|
+
for (const line of definitions)
|
|
776
|
+
out.push(line);
|
|
777
|
+
if (emitter.awaitCallees.has(fn.name)) {
|
|
778
|
+
for (const line of emitter.emitAsyncAwaitCall(fn, argPackLines))
|
|
779
|
+
out.push(line);
|
|
780
|
+
}
|
|
781
|
+
if (emitter.adoptCallees.has(fn.name)) {
|
|
782
|
+
for (const line of emitter.emitAsyncAwaitCall(fn, argPackLines, true))
|
|
783
|
+
out.push(line);
|
|
784
|
+
}
|
|
785
|
+
const stackless = emitter.stacklessAsync.has(fn.name);
|
|
786
|
+
const spawn = stackless ? "scr_async_spawn_stackless" : "scr_async_spawn";
|
|
787
|
+
emitter.declare(`declare ptr @scr_fiber_promise(ptr)`);
|
|
788
|
+
emitter.declare(`declare ptr @${spawn}(ptr, ptr)`);
|
|
789
|
+
emitter.needOom();
|
|
790
|
+
if (emitter.wasi || stackless) {
|
|
791
|
+
// The coroutine body settles its own promise and owns the retained
|
|
792
|
+
// lifted environment until final suspension. Its initial call
|
|
793
|
+
// returns here at the first suspend (or final suspend).
|
|
794
|
+
tr.push(` ret void`, `}`, ``);
|
|
795
|
+
}
|
|
796
|
+
else {
|
|
797
|
+
if (fn.captures !== undefined) {
|
|
798
|
+
emitter.declare(`declare void @scr_closure_release(ptr)`);
|
|
799
|
+
}
|
|
800
|
+
tr.push(...emitter.pendingTestLines("%pend"), ` br i1 %pend, label %thrown, label %clean`, `clean:`, ` %pr = call ptr @scr_fiber_promise(ptr %self)`);
|
|
801
|
+
for (const line of emitter.asyncFulfillLines(ret, "%pr"))
|
|
802
|
+
tr.push(line);
|
|
803
|
+
tr.push(` ret void`, `thrown:`);
|
|
804
|
+
if (ret.kind !== "void" && isRefCounted(ret)) {
|
|
805
|
+
// An escaping throw means %r is the never-read dummy (NULL).
|
|
806
|
+
tr.push(` call void ${releaseSym(emitter.shapeHost, ret)}(ptr %r)`);
|
|
807
|
+
}
|
|
808
|
+
tr.push(` ret void`, `}`, ``);
|
|
809
|
+
}
|
|
810
|
+
for (const line of tr)
|
|
811
|
+
out.push(line);
|
|
812
|
+
// Spawn wrapper: pack the args (+1 moves in), spawn the fiber.
|
|
813
|
+
const cache = fn.asyncCacheGlobal !== undefined ? mangleGlobal(fn.asyncCacheGlobal) : null;
|
|
814
|
+
const cycleCache = fn.asyncCycleCacheGlobal !== undefined ? mangleGlobal(fn.asyncCycleCacheGlobal) : null;
|
|
815
|
+
if (cache !== null || cycleCache !== null) {
|
|
816
|
+
emitter.declare(`declare ptr @scr_promise_retain_v(ptr)`);
|
|
817
|
+
emitter.declare(`declare void @scr_promise_release(ptr)`);
|
|
818
|
+
}
|
|
819
|
+
if (cache !== null) {
|
|
820
|
+
emitter.declare(`declare void @scr_promise_mark_handled(ptr)`);
|
|
821
|
+
}
|
|
822
|
+
if (fn.captures !== undefined) {
|
|
823
|
+
emitter.declare(`declare ptr @scr_closure_retain_v(ptr)`);
|
|
824
|
+
}
|
|
825
|
+
const sp = [
|
|
826
|
+
`define internal ptr @${mangleAsyncSpawn(fn.name)}(${spawnParams.join(", ")}) ${FN_ATTRS} { ; spawn ${fn.name}`,
|
|
827
|
+
`entry:`,
|
|
828
|
+
...(cache !== null
|
|
829
|
+
? [
|
|
830
|
+
` %cached = load ptr, ptr @${cache}`,
|
|
831
|
+
` %cache_hit = icmp ne ptr %cached, null`,
|
|
832
|
+
` br i1 %cache_hit, label %cached_return, label %cache_miss`,
|
|
833
|
+
`cached_return:`,
|
|
834
|
+
` %cached_owned = call ptr @scr_promise_retain_v(ptr %cached)`,
|
|
835
|
+
` ret ptr %cached_owned`,
|
|
836
|
+
`cache_miss:`,
|
|
837
|
+
]
|
|
838
|
+
: []),
|
|
839
|
+
...argPackLines,
|
|
840
|
+
];
|
|
841
|
+
sp.push(` %p = call ptr @${spawn}(ptr @${mangleTrampoline(fn.name)}, ptr %ap)`, ...(cache !== null
|
|
842
|
+
? [
|
|
843
|
+
// The module loader owns this evaluation promise
|
|
844
|
+
// immediately. A later sibling can throw before the
|
|
845
|
+
// aggregate dependency wait is built, but this rejection
|
|
846
|
+
// must never become an unrelated unhandled rejection.
|
|
847
|
+
` call void @scr_promise_mark_handled(ptr %p)`,
|
|
848
|
+
]
|
|
849
|
+
: []), ...(cache !== null
|
|
850
|
+
? [
|
|
851
|
+
` %cache_owned = call ptr @scr_promise_retain_v(ptr %p)`,
|
|
852
|
+
// The eager spawn may have re-entered this guarded module
|
|
853
|
+
// through an admitted async cycle and installed a temporary
|
|
854
|
+
// cache entry. Drop that owned slot before replacing it
|
|
855
|
+
// with the outer evaluation promise.
|
|
856
|
+
` %replaced_cache = load ptr, ptr @${cache}`,
|
|
857
|
+
` call void @scr_promise_release(ptr %replaced_cache)`,
|
|
858
|
+
` store ptr %cache_owned, ptr @${cache}`,
|
|
859
|
+
]
|
|
860
|
+
: []), ...(cycleCache !== null
|
|
861
|
+
? [
|
|
862
|
+
// Eager recursive spawns publish from the inside out. The
|
|
863
|
+
// runtime-requested outermost member writes last and is the
|
|
864
|
+
// SCC's actual evaluation root.
|
|
865
|
+
` %cycle_cache_owned = call ptr @scr_promise_retain_v(ptr %p)`,
|
|
866
|
+
` %replaced_cycle_cache = load ptr, ptr @${cycleCache}`,
|
|
867
|
+
` call void @scr_promise_release(ptr %replaced_cycle_cache)`,
|
|
868
|
+
` store ptr %cycle_cache_owned, ptr @${cycleCache}`,
|
|
869
|
+
]
|
|
870
|
+
: []), ` ret ptr %p`, `}`, ``);
|
|
871
|
+
for (const line of sp)
|
|
872
|
+
out.push(line);
|
|
873
|
+
}
|
|
874
|
+
for (const line of emitter.emitGenScaffolding())
|
|
875
|
+
out.push(line);
|
|
876
|
+
return out;
|
|
877
|
+
}
|
|
878
|
+
/** The await-call entry of an async function (`sc_aw_*`): one direct
|
|
879
|
+
* `await f(...)` as a call returning the awaited value, so the call site
|
|
880
|
+
* needs no promise of its own. A fiberless body runs on the caller's
|
|
881
|
+
* stack as in its spawn wrapper; a clean result then takes the await's
|
|
882
|
+
* one microtask turn (scr_await_hop) and is returned without ever
|
|
883
|
+
* materializing the promise, which nothing else could observe. A throw
|
|
884
|
+
* builds the rejected promise exactly as the spawn wrapper would and
|
|
885
|
+
* awaits it, so the rejection reaches the awaiter on the same turn. Other
|
|
886
|
+
* bodies pack their arguments as the spawn wrapper does and enter
|
|
887
|
+
* scr_async_spawn_await_*, which parks the caller on the promise as soon
|
|
888
|
+
* as the body first suspends. The adopting entry (`sc_ad_*`, for
|
|
889
|
+
* `return f(...)` in an async function) adds the turn of the then job
|
|
890
|
+
* that adopts the returned promise, before the await proper. */
|
|
891
|
+
export function emitAsyncAwaitCall(emitter, fn, argPackLines, adopt) {
|
|
892
|
+
const ret = fn.returnType;
|
|
893
|
+
const retTy = emitter.llType(ret);
|
|
894
|
+
const params = fn.params.map((p, i) => `${emitter.llType(p.type)} %a${i}`);
|
|
895
|
+
const awaitLine = (dest, promise) => {
|
|
896
|
+
switch (ret.kind) {
|
|
897
|
+
case "void":
|
|
898
|
+
emitter.declare(`declare void @scr_await_void(ptr)`);
|
|
899
|
+
return ` call void @scr_await_void(ptr ${promise})`;
|
|
900
|
+
case "f64":
|
|
901
|
+
case "date":
|
|
902
|
+
emitter.declare(`declare double @scr_await_f64(ptr)`);
|
|
903
|
+
return ` ${dest} = call double @scr_await_f64(ptr ${promise})`;
|
|
904
|
+
case "bool":
|
|
905
|
+
emitter.declare(`declare zeroext i1 @scr_await_bool(ptr)`);
|
|
906
|
+
return ` ${dest} = call zeroext i1 @scr_await_bool(ptr ${promise})`;
|
|
907
|
+
case "string":
|
|
908
|
+
emitter.declare(`declare ptr @scr_await_str(ptr)`);
|
|
909
|
+
return ` ${dest} = call ptr @scr_await_str(ptr ${promise})`;
|
|
910
|
+
default:
|
|
911
|
+
emitter.declare(`declare ptr @scr_await_ref(ptr)`);
|
|
912
|
+
return ` ${dest} = call ptr @scr_await_ref(ptr ${promise})`;
|
|
913
|
+
}
|
|
914
|
+
};
|
|
915
|
+
const retLine = (v) => (retTy === "void" ? ` ret void` : ` ret ${retTy} ${v}`);
|
|
916
|
+
const head = adopt
|
|
917
|
+
? `define internal ${retTy} @${mangleAsyncAdoptCall(fn.name)}(${params.join(", ")}) ${FN_ATTRS} { ; adopt ${fn.name}`
|
|
918
|
+
: `define internal ${retTy} @${mangleAsyncAwaitCall(fn.name)}(${params.join(", ")}) ${FN_ATTRS} { ; await ${fn.name}`;
|
|
919
|
+
const args = params.join(", ");
|
|
920
|
+
if (adopt && argPackLines !== null) {
|
|
921
|
+
// A body that may suspend settles later than the adoption's then job
|
|
922
|
+
// runs: materialize its promise, take that turn, then await it.
|
|
923
|
+
emitter.declare(`declare void @scr_await_hop()`);
|
|
924
|
+
emitter.declare(`declare void @scr_promise_release(ptr)`);
|
|
925
|
+
return [
|
|
926
|
+
head,
|
|
927
|
+
`entry:`,
|
|
928
|
+
` %p = call ptr @${mangleAsyncSpawn(fn.name)}(${args})`,
|
|
929
|
+
` call void @scr_await_hop()`,
|
|
930
|
+
awaitLine("%v", "%p"),
|
|
931
|
+
` call void @scr_promise_release(ptr %p)`,
|
|
932
|
+
retLine("%v"),
|
|
933
|
+
`}`,
|
|
934
|
+
``,
|
|
935
|
+
];
|
|
936
|
+
}
|
|
937
|
+
if (argPackLines !== null && emitter.stacklessAsync.has(fn.name)) {
|
|
938
|
+
// A stackless body's eager prefix already runs on the awaiter's
|
|
939
|
+
// stack, which then awaits the promise like the two separate steps.
|
|
940
|
+
emitter.declare(`declare void @scr_promise_release(ptr)`);
|
|
941
|
+
return [
|
|
942
|
+
head,
|
|
943
|
+
`entry:`,
|
|
944
|
+
` %p = call ptr @${mangleAsyncSpawn(fn.name)}(${args})`,
|
|
945
|
+
awaitLine("%v", "%p"),
|
|
946
|
+
` call void @scr_promise_release(ptr %p)`,
|
|
947
|
+
retLine("%v"),
|
|
948
|
+
`}`,
|
|
949
|
+
``,
|
|
950
|
+
];
|
|
951
|
+
}
|
|
952
|
+
if (argPackLines !== null) {
|
|
953
|
+
const kind = ret.kind === "void"
|
|
954
|
+
? "void"
|
|
955
|
+
: ret.kind === "f64" || ret.kind === "date"
|
|
956
|
+
? "f64"
|
|
957
|
+
: ret.kind === "bool"
|
|
958
|
+
? "bool"
|
|
959
|
+
: ret.kind === "string"
|
|
960
|
+
? "str"
|
|
961
|
+
: "ref";
|
|
962
|
+
const cret = kind === "bool" ? "zeroext i1" : retTy;
|
|
963
|
+
emitter.declare(`declare ${cret} @scr_async_spawn_await_${kind}(ptr, ptr)`);
|
|
964
|
+
emitter.needOom();
|
|
965
|
+
const call = `call ${cret} @scr_async_spawn_await_${kind}(ptr @${mangleTrampoline(fn.name)}, ptr %ap)`;
|
|
966
|
+
return [
|
|
967
|
+
head,
|
|
968
|
+
`entry:`,
|
|
969
|
+
...argPackLines,
|
|
970
|
+
kind === "void" ? ` ${call}` : ` %v = ${call}`,
|
|
971
|
+
retLine("%v"),
|
|
972
|
+
`}`,
|
|
973
|
+
``,
|
|
974
|
+
];
|
|
975
|
+
}
|
|
976
|
+
emitter.declare(`declare void @scr_async_inline_enter(ptr)`);
|
|
977
|
+
emitter.declare(`declare void @scr_async_inline_exit(ptr)`);
|
|
978
|
+
emitter.declare(`declare void @scr_await_hop()`);
|
|
979
|
+
emitter.declare(`declare ptr @scr_promise_new()`);
|
|
980
|
+
emitter.declare(`declare void @scr_promise_reject_pending(ptr)`);
|
|
981
|
+
emitter.declare(`declare void @scr_promise_release(ptr)`);
|
|
982
|
+
const bodyCall = `call ${retTy} @${mangleFunction(fn.name)}(${args})`;
|
|
983
|
+
const out = [
|
|
984
|
+
head,
|
|
985
|
+
`entry:`,
|
|
986
|
+
` %frame = alloca { ptr, ptr }`,
|
|
987
|
+
` call void @scr_async_inline_enter(ptr %frame)`,
|
|
988
|
+
retTy === "void" ? ` ${bodyCall}` : ` %r = ${bodyCall}`,
|
|
989
|
+
...emitter.pendingTestLines("%pend"),
|
|
990
|
+
` call void @scr_async_inline_exit(ptr %frame)`,
|
|
991
|
+
// Adopting: the then job's turn comes before the settled promise's
|
|
992
|
+
// own reaction, whichever way the body completed.
|
|
993
|
+
...(adopt ? [` call void @scr_await_hop()`] : []),
|
|
994
|
+
` br i1 %pend, label %thrown, label %clean`,
|
|
995
|
+
`clean:`,
|
|
996
|
+
` call void @scr_await_hop()`,
|
|
997
|
+
retLine("%r"),
|
|
998
|
+
`thrown:`,
|
|
999
|
+
];
|
|
1000
|
+
if (ret.kind !== "void" && isRefCounted(ret)) {
|
|
1001
|
+
// An escaping throw means %r is the never-read dummy (NULL).
|
|
1002
|
+
out.push(` call void ${releaseSym(emitter.shapeHost, ret)}(ptr %r)`);
|
|
1003
|
+
}
|
|
1004
|
+
out.push(` %p = call ptr @scr_promise_new()`, ` call void @scr_promise_reject_pending(ptr %p)`, awaitLine("%v", "%p"), ` call void @scr_promise_release(ptr %p)`, retLine("%v"), `}`, ``);
|
|
1005
|
+
return out;
|
|
1006
|
+
}
|
|
1007
|
+
/** Move a clean async return value into the current fiber's promise. */
|
|
1008
|
+
export function emitWasiFulfill(emitter, v) {
|
|
1009
|
+
const coro = emitter.currentCoro;
|
|
1010
|
+
if (coro === null)
|
|
1011
|
+
throw new InternalCompilerError("llvm emitter bug: wasm fulfillment outside async body");
|
|
1012
|
+
const ret = emitter.currentReturnType;
|
|
1013
|
+
if (coro.kind === "generator") {
|
|
1014
|
+
emitter.declare(`declare ptr @scr_gen_of_fiber(ptr)`);
|
|
1015
|
+
const gen = emitter.B.tmp();
|
|
1016
|
+
emitter.B.line(`${gen} = call ptr @scr_gen_of_fiber(ptr ${coro.self})`);
|
|
1017
|
+
switch (ret.kind) {
|
|
1018
|
+
case "void":
|
|
1019
|
+
return;
|
|
1020
|
+
case "f64":
|
|
1021
|
+
case "date":
|
|
1022
|
+
emitter.declare(`declare void @scr_gen_out_f64(ptr, double)`);
|
|
1023
|
+
emitter.B.line(`call void @scr_gen_out_f64(ptr ${gen}, double ${v.name})`);
|
|
1024
|
+
return;
|
|
1025
|
+
case "bool":
|
|
1026
|
+
emitter.declare(`declare void @scr_gen_out_bool(ptr, i1 zeroext)`);
|
|
1027
|
+
emitter.B.line(`call void @scr_gen_out_bool(ptr ${gen}, i1 ${v.name})`);
|
|
1028
|
+
return;
|
|
1029
|
+
default:
|
|
1030
|
+
emitter.declare(`declare void @scr_gen_out_ref(ptr, ptr, ptr)`);
|
|
1031
|
+
emitter.B.line(`call void @scr_gen_out_ref(ptr ${gen}, ptr ${v.name}, ptr ${vAdapters(emitter.shapeHost, ret).release})`);
|
|
1032
|
+
return;
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
emitter.declare(`declare ptr @scr_fiber_promise(ptr)`);
|
|
1036
|
+
const pr = emitter.B.tmp();
|
|
1037
|
+
emitter.B.line(`${pr} = call ptr @scr_fiber_promise(ptr ${coro.self})`);
|
|
1038
|
+
switch (ret.kind) {
|
|
1039
|
+
case "void":
|
|
1040
|
+
emitter.declare(`declare void @scr_promise_fulfill_void(ptr)`);
|
|
1041
|
+
emitter.B.line(`call void @scr_promise_fulfill_void(ptr ${pr})`);
|
|
1042
|
+
break;
|
|
1043
|
+
case "f64":
|
|
1044
|
+
case "date":
|
|
1045
|
+
emitter.declare(`declare void @scr_promise_fulfill_f64(ptr, double)`);
|
|
1046
|
+
emitter.B.line(`call void @scr_promise_fulfill_f64(ptr ${pr}, double ${v.name})`);
|
|
1047
|
+
break;
|
|
1048
|
+
case "bool":
|
|
1049
|
+
emitter.declare(`declare void @scr_promise_fulfill_bool(ptr, i1 zeroext)`);
|
|
1050
|
+
emitter.B.line(`call void @scr_promise_fulfill_bool(ptr ${pr}, i1 ${v.name})`);
|
|
1051
|
+
break;
|
|
1052
|
+
case "string":
|
|
1053
|
+
emitter.declare(`declare void @scr_promise_fulfill_str(ptr, ptr)`);
|
|
1054
|
+
emitter.B.line(`call void @scr_promise_fulfill_str(ptr ${pr}, ptr ${v.name}) ; moves in`);
|
|
1055
|
+
break;
|
|
1056
|
+
case "dyn":
|
|
1057
|
+
emitter.declare(`declare void @scr_promise_resolve_dyn(ptr, ptr)`);
|
|
1058
|
+
emitter.B.line(`call void @scr_promise_resolve_dyn(ptr ${pr}, ptr ${v.name}) ; moves in`);
|
|
1059
|
+
break;
|
|
1060
|
+
default: {
|
|
1061
|
+
const rc = vAdapters(emitter.shapeHost, ret);
|
|
1062
|
+
emitter.declare(`declare void @scr_promise_fulfill_ref(ptr, ptr, ptr, ptr, ptr)`);
|
|
1063
|
+
emitter.B.line(`call void @scr_promise_fulfill_ref(ptr ${pr}, ptr ${v.name}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${traceArg(emitter.shapeHost, ret)})`);
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
/** The argument-pack ABI and trampoline prefix shared by async functions
|
|
1068
|
+
* and generators. Their promise/generator completion and spawn tails stay
|
|
1069
|
+
* with the callers below. */
|
|
1070
|
+
export function emitArgPackAndTrampolinePrologue(emitter, fn) {
|
|
1071
|
+
const pack = mangleArgPack(fn.name);
|
|
1072
|
+
const lifted = fn.captures !== undefined;
|
|
1073
|
+
const fieldTys = [...(lifted ? ["ptr"] : []), ...fn.params.map((p) => emitter.llType(p.type))];
|
|
1074
|
+
const definitions = [`%${pack} = type { ${fieldTys.join(", ") || "i8"} } ; ${fn.name} args`];
|
|
1075
|
+
const sizeOf = `ptrtoint (ptr getelementptr (%${pack}, ptr null, i32 1) to ${emitter.sizeType})`;
|
|
1076
|
+
// Async argument packs live from the spawn to the trampoline's first
|
|
1077
|
+
// instructions, so they take the runtime's small-block allocator.
|
|
1078
|
+
// Generator packs keep malloc: the runtime frees never-started ones.
|
|
1079
|
+
const smallPack = fn.generator === undefined;
|
|
1080
|
+
const packAlloc = smallPack ? "scr_rt_calloc" : "malloc";
|
|
1081
|
+
const packFree = smallPack ? "scr_rt_free" : "free";
|
|
1082
|
+
emitter.declare(`declare void @${packFree}(ptr)`);
|
|
1083
|
+
emitter.declare(`declare ptr @${packAlloc}(${emitter.sizeType})`);
|
|
1084
|
+
const tr = [
|
|
1085
|
+
`define internal void @${mangleTrampoline(fn.name)}(ptr %self, ptr %ap) ${FN_ATTRS} {`,
|
|
1086
|
+
`entry:`,
|
|
1087
|
+
];
|
|
1088
|
+
const loads = [];
|
|
1089
|
+
fieldTys.forEach((ty, i) => {
|
|
1090
|
+
tr.push(` %fp${i} = getelementptr inbounds %${pack}, ptr %ap, i64 0, i32 ${i}`, ` %a${i} = load ${ty}, ptr %fp${i}`);
|
|
1091
|
+
loads.push(`${ty} %a${i}`);
|
|
1092
|
+
});
|
|
1093
|
+
tr.push(` call void @${packFree}(ptr %ap)`);
|
|
1094
|
+
const ret = fn.returnType;
|
|
1095
|
+
const retTy = emitter.llType(ret);
|
|
1096
|
+
const bodyCall = `call ${retTy} @${mangleFunction(fn.name)}(${loads.join(", ")})`;
|
|
1097
|
+
tr.push(retTy === "void" ? ` ${bodyCall}` : ` %r = ${bodyCall}`);
|
|
1098
|
+
if (lifted && !emitter.coroLowered(fn)) {
|
|
1099
|
+
tr.push(` call void @scr_closure_release(ptr %a0)`);
|
|
1100
|
+
}
|
|
1101
|
+
const spawnParams = fieldTys.map((ty, i) => `${ty} %a${i}`);
|
|
1102
|
+
const argPackLines = [
|
|
1103
|
+
` %ap = call ptr @${packAlloc}(${emitter.sizeType} ${sizeOf})`,
|
|
1104
|
+
` %isnull = icmp eq ptr %ap, null`,
|
|
1105
|
+
` br i1 %isnull, label %oom, label %ok`,
|
|
1106
|
+
`oom:`,
|
|
1107
|
+
` call void @sc_oom()`,
|
|
1108
|
+
` unreachable`,
|
|
1109
|
+
`ok:`,
|
|
1110
|
+
];
|
|
1111
|
+
if (lifted) {
|
|
1112
|
+
// scr_closure_retain is a header static inline — the `_v` twin is
|
|
1113
|
+
// the exported symbol.
|
|
1114
|
+
argPackLines.push(` %env = call ptr @scr_closure_retain_v(ptr %a0)`);
|
|
1115
|
+
}
|
|
1116
|
+
fieldTys.forEach((ty, i) => {
|
|
1117
|
+
const src = lifted && i === 0 ? "%env" : `%a${i}`;
|
|
1118
|
+
argPackLines.push(` %sp${i} = getelementptr inbounds %${pack}, ptr %ap, i64 0, i32 ${i}`, ` store ${ty} ${src}, ptr %sp${i}`);
|
|
1119
|
+
});
|
|
1120
|
+
return { definitions, pack, lifted, fieldTys, ret, tr, spawnParams, argPackLines };
|
|
1121
|
+
}
|
|
1122
|
+
/** The module functions whose bodies may park their execution context:
|
|
1123
|
+
* their emitted text mentions a suspension entry point (SUSPENDS), or
|
|
1124
|
+
* they mention such a function (transitively). Null where async bodies
|
|
1125
|
+
* must keep fibers regardless: wasm32 (its coroutine lowering owns async
|
|
1126
|
+
* bodies), worker programs, and programs that use node:test subtests,
|
|
1127
|
+
* whose `t.test()` awaits on the CURRENT fiber even from synchronous
|
|
1128
|
+
* code. */
|
|
1129
|
+
export function parkingFunctions(emitter) {
|
|
1130
|
+
if (emitter.wasi || emitter.mod.workers === true)
|
|
1131
|
+
return null;
|
|
1132
|
+
for (const decl of emitter.decls)
|
|
1133
|
+
if (/@scr_test_sub\b/.test(decl))
|
|
1134
|
+
return null;
|
|
1135
|
+
for (const text of emitter.fnDefText.values())
|
|
1136
|
+
if (/@scr_test_sub\b/.test(text))
|
|
1137
|
+
return null;
|
|
1138
|
+
// Reverse mention edges, then propagate "may park" to every mentioner.
|
|
1139
|
+
const mentionedBy = new Map();
|
|
1140
|
+
const parks = new Set();
|
|
1141
|
+
const work = [];
|
|
1142
|
+
for (const [name, text] of emitter.fnDefText) {
|
|
1143
|
+
if (SUSPENDS.test(text)) {
|
|
1144
|
+
parks.add(name);
|
|
1145
|
+
work.push(name);
|
|
1146
|
+
}
|
|
1147
|
+
for (const callee of emitter.mentionedFunctions(text)) {
|
|
1148
|
+
if (callee === name)
|
|
1149
|
+
continue;
|
|
1150
|
+
let callers = mentionedBy.get(callee);
|
|
1151
|
+
if (callers === undefined)
|
|
1152
|
+
mentionedBy.set(callee, (callers = new Set()));
|
|
1153
|
+
callers.add(name);
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
while (work.length > 0) {
|
|
1157
|
+
const callers = mentionedBy.get(work.pop());
|
|
1158
|
+
if (callers === undefined)
|
|
1159
|
+
continue;
|
|
1160
|
+
for (const caller of callers) {
|
|
1161
|
+
if (parks.has(caller))
|
|
1162
|
+
continue;
|
|
1163
|
+
parks.add(caller);
|
|
1164
|
+
work.push(caller);
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
return parks;
|
|
1168
|
+
}
|
|
1169
|
+
/** Async functions whose calls can skip the fiber (scr_async_inline_*).
|
|
1170
|
+
* A body qualifies only when nothing it runs can park its execution
|
|
1171
|
+
* context: its emitted text, and the text of every module function it
|
|
1172
|
+
* mentions (transitively), contains no suspension entry point. Such a
|
|
1173
|
+
* body always completes before the call returns, which is exactly the
|
|
1174
|
+
* behavior of a fiber that never suspends. Excluded conservatively:
|
|
1175
|
+
* wasm32 (its coroutine lowering owns async bodies), module-evaluation
|
|
1176
|
+
* bodies (their promise caches),
|
|
1177
|
+
* `dyn` results (resolution may adopt a thenable), and every program
|
|
1178
|
+
* that uses node:test subtests — `t.test()` runs a subtest inline and
|
|
1179
|
+
* awaits it on the CURRENT fiber even from synchronous code. Worker
|
|
1180
|
+
* programs keep fibers too: their fiber epilogue owns context
|
|
1181
|
+
* termination (a stopping worker rejects and observes the promise), which
|
|
1182
|
+
* the fiberless wrapper does not reproduce. A missed suspension still
|
|
1183
|
+
* cannot reorder execution undetected: the runtime traps when a context parks while a
|
|
1184
|
+
* fiberless body is on its stack. */
|
|
1185
|
+
export function fiberlessAsyncFunctions(emitter) {
|
|
1186
|
+
const parks = emitter.parkingFunctions();
|
|
1187
|
+
const eligible = parks === null ? new Set() : emitter.neverParkingAsync(parks);
|
|
1188
|
+
for (const name of emitter.inlineAwaitCallees)
|
|
1189
|
+
if (!eligible.has(name))
|
|
1190
|
+
throw new InternalCompilerError(`llvm emitter bug: inline await of suspending ${name}`);
|
|
1191
|
+
return eligible;
|
|
1192
|
+
}
|
|
1193
|
+
//# sourceMappingURL=emit-function.js.map
|