@scriptc/compiler 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/scriptc-node-fallback.d.ts +977 -113
- package/dist/backend/cycle-analysis.d.ts +5 -1
- package/dist/backend/cycle-analysis.js +6 -4
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +55 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +9 -1
- package/dist/backend/cycle-mutability.js +21 -3
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +6 -1
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +7 -3
- package/dist/backend/immutability.js +33 -29
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/library-pack.js +5 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +23 -4
- package/dist/backend/llvm/alloc.js +61 -8
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
- package/dist/backend/llvm/appended-array-literals.js +44 -36
- package/dist/backend/llvm/appended-array-literals.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.test.js +4 -3
- package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
- package/dist/backend/llvm/array-search.d.ts +4 -3
- package/dist/backend/llvm/array-search.js +23 -10
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/blocks.d.ts +1 -1
- package/dist/backend/llvm/blocks.js +2 -2
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/byte-windows.js +2 -0
- package/dist/backend/llvm/byte-windows.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +6 -1
- package/dist/backend/llvm/bytes-alias.js +8 -2
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +70 -7
- package/dist/backend/llvm/bytes-loop-versions.js +567 -30
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +389 -2
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +74 -1
- package/dist/backend/llvm/classes.js +364 -54
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +384 -17
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +10 -6
- package/dist/backend/llvm/common.js +10 -6
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
- package/dist/backend/llvm/constant-callbacks.js +91 -56
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +4 -4
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +11 -1
- package/dist/backend/llvm/counted-loops.js +80 -23
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +39 -8
- package/dist/backend/llvm/dense-array-access.js +222 -52
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +36 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +35 -16
- package/dist/backend/llvm/dense-array-loops.js +237 -12
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +140 -15
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +51 -1
- package/dist/backend/llvm/dyn.js +683 -69
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +33 -26
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-journal.d.ts +93 -0
- package/dist/backend/llvm/emit-journal.js +170 -0
- package/dist/backend/llvm/emit-journal.js.map +1 -0
- package/dist/backend/llvm/emit-module.js +208 -34
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +0 -27
- package/dist/backend/llvm/emit-statements.js +577 -93
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter-state.d.ts +7 -0
- package/dist/backend/llvm/emitter-state.js +14 -0
- package/dist/backend/llvm/emitter-state.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +314 -49
- package/dist/backend/llvm/emitter.js +1241 -129
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +54 -5
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +19 -0
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +5 -2
- package/dist/backend/llvm/expr-bytes.js +144 -52
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +47 -0
- 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 +62 -36
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +14 -2
- package/dist/backend/llvm/expr-containers.js +148 -40
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +14 -0
- package/dist/backend/llvm/expr-control.js +2 -3
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +71 -16
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +126 -36
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +11 -6
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.d.ts +12 -0
- package/dist/backend/llvm/expr-records.js +106 -0
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-bridges.js +225 -64
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +200 -50
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
- package/dist/backend/llvm/int32-kind-loops.js +106 -0
- package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +20 -1
- package/dist/backend/llvm/integer-values.js +71 -0
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +1 -1
- package/dist/backend/llvm/js-ic.js +1 -1
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/key-orders.d.ts +7 -0
- package/dist/backend/llvm/key-orders.js +33 -0
- package/dist/backend/llvm/key-orders.js.map +1 -0
- package/dist/backend/llvm/lib-connect.js +4 -0
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +11 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +90 -2
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +65 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.d.ts +4 -0
- package/dist/backend/llvm/lib-http2.js +24 -17
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +16 -6
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +65 -14
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +126 -3
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +97 -30
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +23 -0
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +181 -64
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +28 -0
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/loop-state.d.ts +33 -0
- package/dist/backend/llvm/loop-state.js +42 -0
- package/dist/backend/llvm/loop-state.js.map +1 -0
- package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
- package/dist/backend/llvm/map-number-lookup.js +91 -31
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +55 -0
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.js +4 -2
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +2 -1
- package/dist/backend/llvm/nullable-unions.js +15 -3
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +18 -1
- package/dist/backend/llvm/publish.js +76 -25
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.js +3 -0
- package/dist/backend/llvm/publish.test.js.map +1 -1
- package/dist/backend/llvm/receivers.js +7 -2
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +1 -9
- package/dist/backend/llvm/record-results.js +2 -11
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +7 -2
- package/dist/backend/llvm/reference-writes.js +91 -72
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.js +161 -14
- package/dist/backend/llvm/regex-matchers.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.test.js +18 -0
- package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
- package/dist/backend/llvm/running-extrema.d.ts +11 -0
- package/dist/backend/llvm/running-extrema.js +115 -0
- package/dist/backend/llvm/running-extrema.js.map +1 -0
- package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
- package/dist/backend/llvm/running-extrema.test.js +89 -0
- package/dist/backend/llvm/running-extrema.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +79 -21
- package/dist/backend/llvm/shapes.js +233 -42
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +53 -7
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +6 -0
- package/dist/backend/llvm/speculative-integers.js +2 -2
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +3 -2
- package/dist/backend/llvm/stack-objects.js +5 -2
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +2 -1
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +15 -0
- package/dist/backend/llvm/string-reads.js +128 -0
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/walk-borrows.d.ts +3 -0
- package/dist/backend/llvm/walk-borrows.js +46 -41
- package/dist/backend/llvm/walk-borrows.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +3 -0
- package/dist/backend/llvm/walkers.js +88 -65
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wasm-modules.d.ts +6 -5
- package/dist/backend/llvm/wasm-modules.js +32 -9
- package/dist/backend/llvm/wasm-modules.js.map +1 -1
- package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
- package/dist/backend/llvm/wrapping-sums.js +126 -0
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/mangle.d.ts +3 -0
- package/dist/backend/mangle.js +5 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/may-throw.d.ts +8 -10
- package/dist/backend/may-throw.js +14 -10
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +27 -4
- package/dist/backend/native/executable.js +31 -8
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +1 -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 +11 -6
- package/dist/backend/native-codegen.js +36 -9
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +0 -23
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +18 -4
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/optimization.d.ts +2 -2
- package/dist/backend/publication.d.ts +12 -1
- package/dist/backend/publication.js +37 -14
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/publication.test.js +30 -0
- package/dist/backend/publication.test.js.map +1 -1
- package/dist/backend/result-slots.d.ts +16 -0
- package/dist/backend/result-slots.js +23 -0
- package/dist/backend/result-slots.js.map +1 -0
- 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 +2 -1
- package/dist/backend/runtime-pack-core.js +2 -1
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +5 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +0 -21
- package/dist/backend/runtime-pack.js +0 -29
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +10 -69
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/stack-observations.d.ts +2 -1
- package/dist/backend/stack-observations.js +67 -42
- package/dist/backend/stack-observations.js.map +1 -1
- package/dist/backend/target-diagnostics.js +33 -1
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +4 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +26 -6
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +5 -1
- package/dist/cli/usage.js +10 -5
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.js +1 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/contracts/check.js +5 -4
- package/dist/contracts/check.js.map +1 -1
- package/dist/contracts/int32-elements.js +10 -2
- package/dist/contracts/int32-elements.js.map +1 -1
- package/dist/coverage/report.d.ts +7 -2
- package/dist/coverage/report.js +30 -3
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +1 -0
- package/dist/coverage/verdict-cache.js +4 -0
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/coverage/verdict-semantic.js +4 -0
- package/dist/coverage/verdict-semantic.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +4 -0
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/dynamic-tier.d.ts +40 -0
- package/dist/diagnostics/dynamic-tier.js +57 -0
- package/dist/diagnostics/dynamic-tier.js.map +1 -0
- package/dist/diagnostics/envelope.d.ts +5 -1
- package/dist/diagnostics/envelope.js +6 -2
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +25 -1
- package/dist/executable/executable-cache.js +60 -7
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +46 -3
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +3 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +1 -0
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/decl-projection.d.ts +41 -0
- package/dist/frontend/decl-projection.js +854 -0
- package/dist/frontend/decl-projection.js.map +1 -0
- package/dist/frontend/decl-projection.test.d.ts +1 -0
- package/dist/frontend/decl-projection.test.js +30 -0
- package/dist/frontend/decl-projection.test.js.map +1 -0
- package/dist/frontend/dispose-hook.d.ts +2 -0
- package/dist/frontend/dispose-hook.js +14 -0
- package/dist/frontend/dispose-hook.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +15 -0
- package/dist/frontend/dts-paths.js +25 -0
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +6 -0
- package/dist/frontend/input-tracker.js +51 -28
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +19 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/jsx-entities.d.ts +4 -0
- package/dist/frontend/jsx-entities.js +259 -0
- package/dist/frontend/jsx-entities.js.map +1 -0
- package/dist/frontend/jsx-source.d.ts +71 -0
- package/dist/frontend/jsx-source.js +781 -0
- package/dist/frontend/jsx-source.js.map +1 -0
- package/dist/frontend/jsx-source.test.d.ts +1 -0
- package/dist/frontend/jsx-source.test.js +200 -0
- package/dist/frontend/jsx-source.test.js.map +1 -0
- package/dist/frontend/literal-values.test.js +8 -9
- package/dist/frontend/literal-values.test.js.map +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +103 -4
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
- package/dist/frontend/lowering/binding-analysis.js +2 -2
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
- package/dist/frontend/lowering/builtins/arguments.js +30 -15
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.js +10 -6
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.js +13 -2
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +4 -2
- package/dist/frontend/lowering/builtins/crypto.js +136 -5
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
- package/dist/frontend/lowering/builtins/date-classes.js +477 -0
- package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
- package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
- package/dist/frontend/lowering/builtins/dates.js +55 -26
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
- package/dist/frontend/lowering/builtins/dh.js +151 -0
- package/dist/frontend/lowering/builtins/dh.js.map +1 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
- package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
- package/dist/frontend/lowering/builtins/ecdh.d.ts +12 -1
- package/dist/frontend/lowering/builtins/ecdh.js +7 -7
- package/dist/frontend/lowering/builtins/ecdh.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
- package/dist/frontend/lowering/builtins/errors.js +110 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.js +6 -4
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
- package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
- package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
- package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
- package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
- package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +2 -1
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
- package/dist/frontend/lowering/builtins/key-object.js +20 -7
- package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +11 -4
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.js +18 -6
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.js +4 -3
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/performance.js +3 -2
- package/dist/frontend/lowering/builtins/performance.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.js +3 -2
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
- package/dist/frontend/lowering/builtins/promises.js +91 -4
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/promisify-callback.js +2 -1
- package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +7 -2
- package/dist/frontend/lowering/builtins/readline.js +58 -9
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/strings.js +13 -5
- package/dist/frontend/lowering/builtins/strings.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.js +1 -1
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +28 -4
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/v8.js +2 -1
- package/dist/frontend/lowering/builtins/v8.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +6 -3
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
- package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.js +2 -1
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +13 -6
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
- package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
- package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-assertions.js +3 -2
- package/dist/frontend/lowering/class-assertions.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
- package/dist/frontend/lowering/class-callbacks.js +82 -12
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +6 -2
- package/dist/frontend/lowering/class-construction.js +25 -16
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-descriptors.js +1 -1
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +73 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.js +1334 -259
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +124 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-iterables.d.ts +2 -1
- package/dist/frontend/lowering/class-iterables.js +9 -1
- package/dist/frontend/lowering/class-iterables.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +35 -9
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +1 -1
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +7 -0
- package/dist/frontend/lowering/class-protocols.js +64 -4
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
- package/dist/frontend/lowering/class-prototypes.js +67 -5
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
- package/dist/frontend/lowering/class-runtime-statics.js +29 -4
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-to-primitive.js +25 -5
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
- package/dist/frontend/lowering/class-unions.js +2 -1
- package/dist/frontend/lowering/class-unions.js.map +1 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +6 -5
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +99 -8
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.js +8 -7
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/collection-ingestion.js +2 -1
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +7 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +352 -31
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +12 -1
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +25 -4
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +21 -5
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +21 -9
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
- package/dist/frontend/lowering/containers/bytes.js +131 -29
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +55 -2
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +15 -9
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
- package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
- package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
- package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
- package/dist/frontend/lowering/containers/indexed-objects.js +54 -14
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
- package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +87 -14
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +45 -20
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.js +25 -4
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
- package/dist/frontend/lowering/dispatch-sites.js +218 -0
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
- package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
- package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
- package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
- package/dist/frontend/lowering/divergences.js +9 -1
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
- package/dist/frontend/lowering/dyn-streams.js +1 -1
- package/dist/frontend/lowering/dyn-streams.js.map +1 -1
- package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
- package/dist/frontend/lowering/dynamic-tier.js +327 -0
- package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
- package/dist/frontend/lowering/error-methods.js +51 -2
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +62 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +81 -5
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +107 -14
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +79 -11
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +130 -6
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -3
- package/dist/frontend/lowering/expressions/object-literals.js +164 -56
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +17 -5
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +0 -4
- package/dist/frontend/lowering/expressions/property-access.js +211 -17
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +267 -30
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-fields.js +4 -0
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +85 -12
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.d.ts +28 -0
- package/dist/frontend/lowering/frozen-records.js +322 -0
- package/dist/frontend/lowering/frozen-records.js.map +1 -0
- package/dist/frontend/lowering/function-returns.js +49 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +42 -1
- package/dist/frontend/lowering/generic-functions.js +455 -20
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/intern-tables.js +2 -1
- package/dist/frontend/lowering/intern-tables.js.map +1 -1
- package/dist/frontend/lowering/iterable-values.d.ts +49 -0
- package/dist/frontend/lowering/iterable-values.js +297 -0
- package/dist/frontend/lowering/iterable-values.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.js +195 -9
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
- package/dist/frontend/lowering/js-class-fields.js +45 -10
- package/dist/frontend/lowering/js-class-fields.js.map +1 -1
- package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
- package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
- package/dist/frontend/lowering/json-require.js +2 -1
- package/dist/frontend/lowering/json-require.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +24 -4
- package/dist/frontend/lowering/key-order-witness.js +790 -25
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +466 -10
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lifetime-regions.js +2 -1
- package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +6 -5
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +7 -2
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +11 -0
- package/dist/frontend/lowering/lower-calls.js +776 -126
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +29 -2
- package/dist/frontend/lowering/lower-classes.js +581 -46
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +6 -3
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
- package/dist/frontend/lowering/lower-event-emitter.js +267 -20
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
- package/dist/frontend/lowering/lower-exprs.js +126 -13
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +11 -0
- package/dist/frontend/lowering/lower-functions.js +387 -72
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +41 -31
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +6 -3
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +28 -12
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +2 -1
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.js +2 -1
- package/dist/frontend/lowering/lower-mock.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +47 -5
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.js +2 -2
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
- package/dist/frontend/lowering/lower-namespaces.js +9 -4
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +10 -0
- package/dist/frontend/lowering/lower-server.js +239 -61
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
- package/dist/frontend/lowering/lower-stdlib.js +42 -10
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
- package/dist/frontend/lowering/lower-stmts.js +622 -68
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +20 -2
- package/dist/frontend/lowering/lower-stream.js +2055 -318
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +4 -3
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +197 -29
- package/dist/frontend/lowering/lowerer.js +862 -84
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +21 -9
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
- package/dist/frontend/lowering/module-namespace-elements.js +82 -5
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/narrowing-stability.js +5 -0
- package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +1 -1
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/new-target.d.ts +12 -0
- package/dist/frontend/lowering/new-target.js +280 -0
- package/dist/frontend/lowering/new-target.js.map +1 -0
- package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
- package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.js +2 -1
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/private-brands.d.ts +9 -0
- package/dist/frontend/lowering/private-brands.js +66 -15
- package/dist/frontend/lowering/private-brands.js.map +1 -1
- package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
- package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
- package/dist/frontend/lowering/require-initialization.js +2 -1
- package/dist/frontend/lowering/require-initialization.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
- package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
- package/dist/frontend/lowering/runtime-optional-records.js +18 -5
- package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
- package/dist/frontend/lowering/site-dependencies.js +84 -0
- package/dist/frontend/lowering/site-dependencies.js.map +1 -0
- package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
- package/dist/frontend/lowering/site-dependencies.test.js +53 -0
- package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
- package/dist/frontend/lowering/stable-names.d.ts +11 -0
- package/dist/frontend/lowering/stable-names.js +35 -0
- package/dist/frontend/lowering/stable-names.js.map +1 -0
- package/dist/frontend/lowering/static-typeof.d.ts +2 -2
- package/dist/frontend/lowering/static-typeof.js +42 -3
- package/dist/frontend/lowering/static-typeof.js.map +1 -1
- package/dist/frontend/lowering/strict-equality.js +2 -1
- package/dist/frontend/lowering/strict-equality.js.map +1 -1
- package/dist/frontend/lowering/structural-positions.d.ts +32 -0
- package/dist/frontend/lowering/structural-positions.js +108 -0
- package/dist/frontend/lowering/structural-positions.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +60 -32
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/undefined-index.d.ts +27 -0
- package/dist/frontend/lowering/undefined-index.js +82 -0
- package/dist/frontend/lowering/undefined-index.js.map +1 -0
- package/dist/frontend/lowering/var-hoisting.js +66 -16
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/lowering/width-lift.d.ts +18 -0
- package/dist/frontend/npm-static-bundled-chunks.js +9 -11
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
- package/dist/frontend/npm-static-tsc-helpers.js +106 -0
- package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
- package/dist/frontend/npm-static-type-exports-host.js +214 -0
- package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
- package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.d.ts +52 -0
- package/dist/frontend/npm-static-type-exports.js +261 -0
- package/dist/frontend/npm-static-type-exports.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports.test.js +103 -0
- package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
- package/dist/frontend/npm-static-umd.d.ts +6 -0
- package/dist/frontend/npm-static-umd.js +203 -0
- package/dist/frontend/npm-static-umd.js.map +1 -0
- package/dist/frontend/npm-static-umd.test.d.ts +1 -0
- package/dist/frontend/npm-static-umd.test.js +105 -0
- package/dist/frontend/npm-static-umd.test.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +8 -0
- package/dist/frontend/npm-static.js +51 -22
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +3 -0
- package/dist/frontend/package-shims.js +71 -8
- package/dist/frontend/package-shims.js.map +1 -1
- package/dist/frontend/pipeline.js +18 -10
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/process-fork.d.ts +25 -0
- package/dist/frontend/process-fork.js +2 -0
- package/dist/frontend/process-fork.js.map +1 -0
- package/dist/frontend/program.d.ts +21 -1
- package/dist/frontend/program.js +586 -74
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +44 -4
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/services.d.ts +6 -0
- package/dist/frontend/services.js +18 -0
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/token-equivalence.d.ts +3 -0
- package/dist/frontend/token-equivalence.js +409 -0
- package/dist/frontend/token-equivalence.js.map +1 -0
- package/dist/frontend/token-equivalence.test.d.ts +1 -0
- package/dist/frontend/token-equivalence.test.js +67 -0
- package/dist/frontend/token-equivalence.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +43 -7
- package/dist/frontend/ts7/ast-node.js +1176 -129
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +84 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +29 -3
- package/dist/frontend/ts7/ast-wire.js +144 -31
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.test.js +23 -0
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
- package/dist/frontend/ts7/ast.d.ts +23 -2
- package/dist/frontend/ts7/ast.js +143 -2
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +3 -4
- package/dist/frontend/ts7/checker-backend.js +2 -2
- package/dist/frontend/ts7/checker-backend.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.test.js +5 -9
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +17 -1
- package/dist/frontend/ts7/checker.js +82 -1
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +9 -6
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/enums.d.ts +3 -3
- package/dist/frontend/ts7/enums.generated.d.ts +10 -0
- package/dist/frontend/ts7/enums.generated.js +21 -0
- package/dist/frontend/ts7/enums.generated.js.map +1 -1
- package/dist/frontend/ts7/enums.js +19 -0
- package/dist/frontend/ts7/enums.js.map +1 -1
- package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
- package/dist/frontend/ts7/lib-diagnostics.js +307 -0
- package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
- package/dist/frontend/ts7/program-host.d.ts +7 -0
- package/dist/frontend/ts7/program-host.js +30 -4
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
- package/dist/frontend/ts7/semantic-checker.js +25 -20
- package/dist/frontend/ts7/semantic-checker.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.d.ts +13 -0
- package/dist/frontend/ts7/semantic-json.js +146 -0
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.test.js +57 -1
- package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +15 -0
- package/dist/frontend/ts7/semantic-model.js +67 -19
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +3 -2
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +14 -1
- package/dist/frontend/ts7/session.js +23 -1
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/tsc-codes.d.ts +1 -1
- package/dist/frontend/tsc-codes.js +7 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +51 -7
- package/dist/frontend/type-mapper.js +456 -43
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +1 -1
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend-process-args.d.ts +4 -0
- package/dist/frontend-process-args.js +52 -0
- package/dist/frontend-process-args.js.map +1 -0
- package/dist/frontend-process-args.test.d.ts +1 -0
- package/dist/frontend-process-args.test.js +47 -0
- package/dist/frontend-process-args.test.js.map +1 -0
- package/dist/frontend-process.d.ts +1 -0
- package/dist/frontend-process.js +23 -0
- package/dist/frontend-process.js.map +1 -0
- package/dist/heap-collection.d.ts +16 -0
- package/dist/heap-collection.js +42 -0
- package/dist/heap-collection.js.map +1 -0
- package/dist/heap-collection.test.d.ts +1 -0
- package/dist/heap-collection.test.js +59 -0
- package/dist/heap-collection.test.js.map +1 -0
- package/dist/heap-pressure.d.ts +2 -0
- package/dist/heap-pressure.js +12 -0
- package/dist/heap-pressure.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +435 -89
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +5 -3
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +4 -0
- package/dist/ir/array-length-stability.js +26 -6
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +49 -0
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.d.ts +7 -0
- package/dist/ir/builtin-effects.js +80 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +7 -1
- package/dist/ir/builtin-signatures.js +303 -21
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +2 -1
- package/dist/ir/callback-specialization.js +23 -18
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +19 -0
- package/dist/ir/char-unit-locals.js +185 -0
- package/dist/ir/char-unit-locals.js.map +1 -0
- package/dist/ir/char-unit-locals.test.d.ts +1 -0
- package/dist/ir/char-unit-locals.test.js +94 -0
- package/dist/ir/char-unit-locals.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +3 -1
- package/dist/ir/final-fields.js +15 -17
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.d.ts +2 -0
- package/dist/ir/function-references.js +2 -0
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +5 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/initializer-bindings.d.ts +2 -1
- package/dist/ir/initializer-bindings.js +27 -20
- package/dist/ir/initializer-bindings.js.map +1 -1
- package/dist/ir/int32-arrays.d.ts +108 -0
- package/dist/ir/int32-arrays.js +831 -0
- package/dist/ir/int32-arrays.js.map +1 -0
- package/dist/ir/int32-slots.d.ts +36 -6
- package/dist/ir/int32-slots.js +370 -171
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +3 -1
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +9 -4
- package/dist/ir/integer-loop-facts.js +93 -18
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +49 -0
- package/dist/ir/integer-loops.js +202 -40
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +211 -1
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +5 -0
- package/dist/ir/integer-ranges.js +125 -12
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +94 -0
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +87 -9
- package/dist/ir/ir.js +61 -2
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +21 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +19 -2
- package/dist/ir/js-ic.js +95 -11
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +188 -0
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +57 -0
- package/dist/ir/node-index.js +215 -0
- package/dist/ir/node-index.js.map +1 -0
- package/dist/ir/paired-while-loops.d.ts +25 -0
- package/dist/ir/paired-while-loops.js +335 -0
- package/dist/ir/paired-while-loops.js.map +1 -0
- package/dist/ir/paired-while-loops.test.d.ts +1 -0
- package/dist/ir/paired-while-loops.test.js +163 -0
- package/dist/ir/paired-while-loops.test.js.map +1 -0
- package/dist/ir/parameter-versions.d.ts +25 -0
- package/dist/ir/parameter-versions.js +300 -0
- package/dist/ir/parameter-versions.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +60 -15
- package/dist/ir/runtime-features.js +276 -35
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/serialize.d.ts +12 -2
- package/dist/ir/serialize.js +16 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +17 -0
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/tiers.js +1 -0
- package/dist/ir/tiers.js.map +1 -1
- package/dist/ir/traverse.d.ts +2 -0
- package/dist/ir/traverse.js +29 -5
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +171 -45
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +12 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +2 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/prepare.js +2 -0
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/cache.d.ts +6 -1
- package/dist/native/cache.js +28 -5
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +16 -2
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +26 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +8 -6
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache.d.ts +1 -1
- package/dist/native/executable-cache.js +2 -2
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.d.ts +3 -1
- package/dist/native/prepare.js +123 -31
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +78 -18
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.test.js +6 -1
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/text-file.d.ts +13 -3
- package/dist/native/text-file.js +63 -9
- package/dist/native/text-file.js.map +1 -1
- package/dist/native/text-file.test.d.ts +1 -0
- package/dist/native/text-file.test.js +49 -0
- package/dist/native/text-file.test.js.map +1 -0
- package/dist/native/toolchain.js +4 -4
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +3 -3
- 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/text-parts.d.ts +7 -0
- package/dist/text-parts.js +44 -0
- package/dist/text-parts.js.map +1 -1
- package/dist/text-parts.test.d.ts +1 -0
- package/dist/text-parts.test.js +46 -0
- package/dist/text-parts.test.js.map +1 -0
- package/dist/timing.d.ts +9 -2
- package/dist/timing.js +7 -4
- package/dist/timing.js.map +1 -1
- package/dist/wasm/translate.d.ts +4 -0
- package/dist/wasm/translate.js +2 -2
- package/dist/wasm/translate.js.map +1 -1
- package/package.json +21 -21
- package/shims/chalk/v5.ts +688 -0
- package/shims/hono-node-server/v2.ts +645 -0
- package/shims/hot-shots/client.ts +1126 -0
- package/shims/hot-shots/v8-unix-dgram.ts +8 -0
- package/shims/hot-shots/v8.ts +8 -0
- package/shims/undici/core/client.ts +4 -4
- package/surface-manifest.json +44 -52
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { keyedHelperName } from "./stable-names.js";
|
|
2
|
+
import { perKeyOrder } from "./key-order-witness.js";
|
|
1
3
|
import { isForwardedTupleSpread, lowerForwardingApply } from "./typed-arguments.js";
|
|
2
4
|
import { guardNullProto, nullProtoRecordShape } from "./null-prototype.js";
|
|
3
5
|
import { lowerDynStreamMemberCall } from "./dyn-streams.js";
|
|
@@ -28,9 +30,10 @@ import { lowerClassSymbolMethodCall } from "./symbol-methods.js";
|
|
|
28
30
|
import { lowerReadlineDisposeCall } from "./builtins/readline.js";
|
|
29
31
|
import { errorToStringCall } from "./error-methods.js";
|
|
30
32
|
import { lowerClassPrototypeAssign, lowerClassPrototypeDescriptors } from "./class-prototypes.js";
|
|
31
|
-
import { BYTES_ELEMENT_NAME, BIGINT_T, BOOL, CAUGHT, DYN, DYN_HANDLE_KINDS, F64, NULL_T, STRING, SYMBOL_T, UNDEFINED_T, VOID, arrayOf, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, funcOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, RUNTIME_EMITTER_CLASS, } from "../../ir/ir.js";
|
|
33
|
+
import { BYTES_ELEMENT_NAME, BYTES_U8, BIGINT_T, BOOL, CAUGHT, DYN, DYN_HANDLE_KINDS, F64, NULL_T, STRING, SYMBOL_T, UNDEFINED_T, VOID, arrayOf, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, funcOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, shapeKeyOrders, typeEquals, RUNTIME_EMITTER_CLASS, } from "../../ir/ir.js";
|
|
32
34
|
import { lowerProtocolMethodCall } from "./class-protocol-dispatch.js";
|
|
33
35
|
import { isJsSourceFile, locOf, requireSpecOf } from "../program.js";
|
|
36
|
+
import { isPackageShimFile, isShimIntrinsicName } from "../package-shims.js";
|
|
34
37
|
import { lowerJsonRequireCall } from "./json-require.js";
|
|
35
38
|
import { lowerAssertInstanceCall } from "./assert-instances.js";
|
|
36
39
|
import { isGenericCallableMemberType, isOverloadedCallableMemberType, typeKey, } from "../type-mapper.js";
|
|
@@ -51,7 +54,7 @@ import { createRequireSpecOf } from "./builtins/module-bindings.js";
|
|
|
51
54
|
import { lowerChildStreamMethodCall, lowerChildWriterMethodCall, } from "./builtins/child-process-methods.js";
|
|
52
55
|
import { lowerCreateRequireCall, lowerImportMetaResolveCall, lowerRequireResolveCall, } from "./builtins/module-resolution.js";
|
|
53
56
|
import { isWebCryptoReceiver, lowerCipherMethodCall, lowerCryptoGetRandomValues, lowerCryptoHashMethodCall, lowerPromisifiedCryptoCall, } from "./builtins/crypto.js";
|
|
54
|
-
import { lowerErrorIsErrorCall } from "./builtins/errors.js";
|
|
57
|
+
import { lowerErrorCaptureStackTraceCall, lowerErrorIsErrorCall } from "./builtins/errors.js";
|
|
55
58
|
import { lowerPromisifiedDnsCall } from "./lower-dgram.js";
|
|
56
59
|
import { lowerDisposableStackUseCall } from "./builtins/disposable-stack.js";
|
|
57
60
|
import { lowerDirentMethodCall, lowerFileHandleMethodCall, lowerDirMethodCall, lowerWatcherMethodCall, } from "./builtins/filesystem.js";
|
|
@@ -59,7 +62,7 @@ import { fencePerfEntryKeyWalk, isPerfEntryType, lowerHistogramMethodCall, lower
|
|
|
59
62
|
import { lowerProcStreamMethodCall, lowerProcessBuiltinModuleNamespace, } from "./builtins/process.js";
|
|
60
63
|
import { recordMayKeepSource, throughRecordSource } from "./record-sources.js";
|
|
61
64
|
import { lowerReflectCall } from "./builtins/reflection.js";
|
|
62
|
-
import { lowerAbsenceProbe, v8CalleeText,
|
|
65
|
+
import { lowerAbsenceProbe, v8CalleeText, lowerPromiseAllTupleCall, lowerPromiseRejectCall, lowerToNumberArgument, stringWrapperToString, symbolFieldInfo, templateRawTextOf, primitiveCtorClosure, } from "./lower-exprs.js";
|
|
63
66
|
import { isSafeToDiscard } from "./expressions/evaluation-safety.js";
|
|
64
67
|
import { tryLowerExpression } from "./expressions/try-lower-expression.js";
|
|
65
68
|
import { lowerChildMethodValue, lowerChildPropertyCall } from "./handle-properties.js";
|
|
@@ -71,6 +74,7 @@ import { EMITTER_API_MEMBERS, exactClassOfReceiver, exactInstanceClassOf, findGe
|
|
|
71
74
|
import { classCallbackCall, isClassCallback } from "./class-callbacks.js";
|
|
72
75
|
import { emitterRooted, lowerEmitterMethodCall } from "./lower-event-emitter.js";
|
|
73
76
|
import { eventTargetApiMethod, lowerEventTargetMethodCall } from "./lower-event-target.js";
|
|
77
|
+
import { dateRootOf, isDatePrototypeMethod, lowerInheritedDateMethodCall, } from "./builtins/date-classes.js";
|
|
74
78
|
import { lowerConsoleInstanceCall, lowerConsoleMethodCall, lowerConsoleOutput, } from "./lower-console.js";
|
|
75
79
|
import { STREAM_API_MEMBERS, STREAM_OPERATORS, lowerStreamMethodCall, lowerStreamStaticCall, streamSidesOf, } from "./lower-stream.js";
|
|
76
80
|
import { ambientNsRootOf, ambientUndefReadType, ambientUndefVarRootOf, ambientUndefinedFnSymbolOf, contextualUndefReadType, fenceEarlyAliasUse, fenceEarlyNsMemberRef, nsMemberIdentOf, nsUndefRead, } from "./lower-namespaces.js";
|
|
@@ -80,6 +84,7 @@ import { defaultAfterUndefined, lowerOptionalArgument, lowerStaticallyUndefinedA
|
|
|
80
84
|
import { fenceSymbolFieldCopy } from "./symbol-fields.js";
|
|
81
85
|
import { lowerClassDataDescriptor, lowerClassDescriptorRead } from "./class-descriptors.js";
|
|
82
86
|
import { lowerClassFieldDefine, lowerClassIntegrity } from "./class-attributes.js";
|
|
87
|
+
import { freezableRecordType, lowerNativeFreeze } from "./frozen-records.js";
|
|
83
88
|
import { classStaticDataFor } from "./class-static-data.js";
|
|
84
89
|
import { lowerUrlFactory } from "./lower-url.js";
|
|
85
90
|
import { nullishValueUnitOf } from "./binding-analysis.js";
|
|
@@ -91,8 +96,59 @@ import { maybePromiseReturnStmt, promiseArmedUnionOf } from "./maybe-promise.js"
|
|
|
91
96
|
import { requireObjLitGenericReceiver, objLitGenericFnNodeOf, objLitGenericFnInfoOf, genericCallInstance, } from "./generic-functions.js";
|
|
92
97
|
import { codeGenerationCalleeOf, lowerCodeGenerationCall } from "./code-generation.js";
|
|
93
98
|
const ZLIB_STREAM_METHODS = new Set(["flush", "params", "close", "reset"]);
|
|
99
|
+
/** `Object.defineProperty(target, ...)`, `Object.defineProperties`,
|
|
100
|
+
* `Reflect.defineProperty`, and `target.__defineGetter__/__defineSetter__`
|
|
101
|
+
* over a target that may hold an Error can install an accessor over an
|
|
102
|
+
* error's `name` or `message` (error-methods.ts). */
|
|
103
|
+
function noteErrorAccessorReflection(lowerer, expr) {
|
|
104
|
+
const callee = expr.expression;
|
|
105
|
+
if (!ts.isPropertyAccessExpression(callee))
|
|
106
|
+
return;
|
|
107
|
+
const member = callee.name.text;
|
|
108
|
+
const target = member === "defineProperty" || member === "defineProperties"
|
|
109
|
+
? expr.arguments.nodes[0]
|
|
110
|
+
: member === "__defineGetter__" || member === "__defineSetter__"
|
|
111
|
+
? callee.expression
|
|
112
|
+
: undefined;
|
|
113
|
+
if (!target)
|
|
114
|
+
return;
|
|
115
|
+
const error = lowerer.checker.resolveName("Error", ts.SymbolFlags.Type, target, false);
|
|
116
|
+
const errorType = error ? lowerer.checker.getDeclaredTypeOfSymbol(error) : null;
|
|
117
|
+
if (mayHoldError(lowerer, lowerer.checker.getTypeAtLocation(target), errorType))
|
|
118
|
+
lowerer.errorAccessorReflection = locOf(expr);
|
|
119
|
+
}
|
|
120
|
+
/** An untyped or generic type, a type Error is assignable to (`object`,
|
|
121
|
+
* `{}`, `Object`, `{ message?: string }`), or
|
|
122
|
+
* an Error-shaped type with both `name` and `message`, alone or in a
|
|
123
|
+
* union or intersection. */
|
|
124
|
+
function mayHoldError(lowerer, type, errorType) {
|
|
125
|
+
if (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.Instantiable))
|
|
126
|
+
return true;
|
|
127
|
+
if (type.flags & (ts.TypeFlags.Union | ts.TypeFlags.Intersection))
|
|
128
|
+
return ts.constituentTypes(type).some((part) => mayHoldError(lowerer, part, errorType));
|
|
129
|
+
return ((lowerer.checker.getPropertyOfType(type, "message") !== undefined &&
|
|
130
|
+
lowerer.checker.getPropertyOfType(type, "name") !== undefined) ||
|
|
131
|
+
(errorType !== null && lowerer.checker.isTypeAssignableTo(errorType, type)));
|
|
132
|
+
}
|
|
133
|
+
/** The `f` of a `(0, f)` callee (a numeric left operand, so dropping it
|
|
134
|
+
* changes only the call's receiver), or null. */
|
|
135
|
+
function receiverlessCalleeOf(callee) {
|
|
136
|
+
let e = callee;
|
|
137
|
+
while (ts.isParenthesizedExpression(e))
|
|
138
|
+
e = e.expression;
|
|
139
|
+
if (!ts.isBinaryExpression(e) ||
|
|
140
|
+
e.operatorToken.kind !== ts.SyntaxKind.CommaToken ||
|
|
141
|
+
!ts.isNumericLiteral(e.left))
|
|
142
|
+
return null;
|
|
143
|
+
let right = e.right;
|
|
144
|
+
while (ts.isParenthesizedExpression(right))
|
|
145
|
+
right = right.expression;
|
|
146
|
+
return right;
|
|
147
|
+
}
|
|
94
148
|
export function lowerCall(lowerer, expr) {
|
|
95
149
|
const loc = locOf(expr);
|
|
150
|
+
if (lowerer.errorAccessorReflection === null)
|
|
151
|
+
noteErrorAccessorReflection(lowerer, expr);
|
|
96
152
|
// Object's checker return type is `any`. Claim known object inputs
|
|
97
153
|
// before generic checked-dynamic dispatch tries to load the constructor.
|
|
98
154
|
if (ts.isIdentifier(expr.expression) &&
|
|
@@ -111,6 +167,17 @@ export function lowerCall(lowerer, expr) {
|
|
|
111
167
|
const json = lowerJsonRequireCall(lowerer, expr);
|
|
112
168
|
if (json)
|
|
113
169
|
return json;
|
|
170
|
+
// `(0, ns.member)(...)` over a builtin module (tsc's and esbuild's call
|
|
171
|
+
// without a receiver): Node's module functions do not read `this`, so it
|
|
172
|
+
// is the member call.
|
|
173
|
+
{
|
|
174
|
+
const member = receiverlessCalleeOf(expr.expression);
|
|
175
|
+
if (member !== null && ts.isPropertyAccessExpression(member)) {
|
|
176
|
+
const builtin = lowerer.lowerNamespaceBuiltinCall(expr, member);
|
|
177
|
+
if (builtin)
|
|
178
|
+
return builtin;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
114
181
|
// eval(...) and Function(...): Node's EvalError under
|
|
115
182
|
// --disallow-code-generation-from-strings (code-generation.ts).
|
|
116
183
|
{
|
|
@@ -118,6 +185,13 @@ export function lowerCall(lowerer, expr) {
|
|
|
118
185
|
if (codeGeneration !== null)
|
|
119
186
|
return lowerCodeGenerationCall(lowerer, expr, codeGeneration);
|
|
120
187
|
}
|
|
188
|
+
// A package shim's runtime intrinsic (a bodiless `declare function`
|
|
189
|
+
// named scriptcUnixDgram* in a shipped shim): a direct runtime call.
|
|
190
|
+
if (ts.isIdentifier(expr.expression) && isShimIntrinsicName(expr.expression.text)) {
|
|
191
|
+
const intrinsic = lowerShimIntrinsicCall(lowerer, expr, expr.expression, loc);
|
|
192
|
+
if (intrinsic)
|
|
193
|
+
return intrinsic;
|
|
194
|
+
}
|
|
121
195
|
// Inline require() of a program module (cjs-inline-require.ts): a
|
|
122
196
|
// member call over its export table resolves like a binding's member
|
|
123
197
|
// call after the module's %init at this position; the require itself
|
|
@@ -739,10 +813,9 @@ export function lowerCall(lowerer, expr) {
|
|
|
739
813
|
// excludes shadowed names. parseInt's omitted radix completes
|
|
740
814
|
// to 0 — the spec's "undefined" (base 10 with the 0x hex escape);
|
|
741
815
|
// parseFloat lowers the STRING form only (Node would ToString other
|
|
742
|
-
// values — no static story); isNaN/isFinite's
|
|
743
|
-
//
|
|
744
|
-
//
|
|
745
|
-
// Number.isFinite exactly (ms's `isFinite(val)` guard).
|
|
816
|
+
// values — no static story); isNaN/isFinite apply the global's
|
|
817
|
+
// ToNumber to any argument, then test like Number.isNaN /
|
|
818
|
+
// Number.isFinite.
|
|
746
819
|
if ((expr.expression.text === "parseInt" ||
|
|
747
820
|
expr.expression.text === "isNaN" ||
|
|
748
821
|
expr.expression.text === "parseFloat" ||
|
|
@@ -841,15 +914,11 @@ export function lowerCall(lowerer, expr) {
|
|
|
841
914
|
}
|
|
842
915
|
if (islFn && expr.arguments.nodes.length === islFn.args.length) {
|
|
843
916
|
// The static forms above already took the exactly-typed argument
|
|
844
|
-
// (a string for parseFloat
|
|
845
|
-
//
|
|
846
|
-
//
|
|
847
|
-
// unsupported.
|
|
917
|
+
// (a string for parseFloat): name the argument type that refused
|
|
918
|
+
// the call, so the message states the condition rather than
|
|
919
|
+
// reading as if the global itself were unsupported.
|
|
848
920
|
const argText = loweredArgumentText(lowerer, expr.arguments.nodes[0]);
|
|
849
|
-
|
|
850
|
-
lowerer.refuseUnsupportedApi(`'${expr.expression.text}' with a '${argText}' argument`, expr, exact === "string"
|
|
851
|
-
? "only a string argument compiles statically: convert the argument explicitly first (for example String(x), or narrow the union)"
|
|
852
|
-
: "only a number argument compiles statically: narrow the argument to a number first");
|
|
921
|
+
lowerer.refuseUnsupportedApi(`'${expr.expression.text}' with a '${argText}' argument`, expr, "only a string argument compiles statically: convert the argument explicitly first (for example String(x), or narrow the union)");
|
|
853
922
|
}
|
|
854
923
|
}
|
|
855
924
|
// A TYPE-GUARD call on a catch binding (`isErrnoException(err)` —
|
|
@@ -1237,9 +1306,10 @@ export function lowerCall(lowerer, expr) {
|
|
|
1237
1306
|
lowerer.fenceStaticReadableStreamMember(expr.expression, "call") ??
|
|
1238
1307
|
lowerDisposableStackUseCall(lowerer, expr, expr.expression) ??
|
|
1239
1308
|
lowerer.lowerStdlibMethodCall(expr, expr.expression) ??
|
|
1240
|
-
// crypto.getRandomValues on the WebCrypto global
|
|
1241
|
-
// fallback builds, so before the dyn receiver path) or
|
|
1242
|
-
|
|
1309
|
+
// crypto.getRandomValues / randomUUID on the WebCrypto global
|
|
1310
|
+
// (untyped in fallback builds, so before the dyn receiver path) or
|
|
1311
|
+
// webcrypto.
|
|
1312
|
+
lowerWebCryptoMethodCall(lowerer, expr, expr.expression) ??
|
|
1243
1313
|
// Dyn receivers (JSON.parse-derived `unknown`/`any` values) —
|
|
1244
1314
|
lowerDynReceiverMethodCall(lowerer, expr, expr.expression) ??
|
|
1245
1315
|
// Narrowing filters (inferred predicates, filter(Boolean)) claim
|
|
@@ -1248,6 +1318,7 @@ export function lowerCall(lowerer, expr) {
|
|
|
1248
1318
|
lowerer.lowerFilterNarrowCall(expr, expr.expression) ??
|
|
1249
1319
|
lowerArrayIsArrayCall(lowerer, expr, expr.expression) ??
|
|
1250
1320
|
lowerErrorIsErrorCall(lowerer, expr, expr.expression) ??
|
|
1321
|
+
lowerErrorCaptureStackTraceCall(lowerer, expr, expr.expression) ??
|
|
1251
1322
|
lowerBigIntMethodCall(lowerer, expr, expr.expression) ??
|
|
1252
1323
|
lowerSymbolStaticCall(lowerer, expr, expr.expression) ??
|
|
1253
1324
|
lowerSymbolMethodCall(lowerer, expr, expr.expression) ??
|
|
@@ -1306,7 +1377,17 @@ export function lowerCall(lowerer, expr) {
|
|
|
1306
1377
|
}
|
|
1307
1378
|
const accessorTarget = lowerer.fieldTarget(expr.expression);
|
|
1308
1379
|
if (accessorTarget?.container === "accessor") {
|
|
1309
|
-
|
|
1380
|
+
let callee = lowerer.fieldGetExpr(accessorTarget, locOf(expr.expression), expr.expression);
|
|
1381
|
+
// A getter returning a callable class instance (chalk's
|
|
1382
|
+
// `chalk.red("x")`): call through its `%call` field.
|
|
1383
|
+
if (callee.type.kind === "object") {
|
|
1384
|
+
const direct = callableInstanceStringCall(lowerer, expr, callee, locOf(expr));
|
|
1385
|
+
if (direct)
|
|
1386
|
+
return direct;
|
|
1387
|
+
callee = lowerer.hybridCallUnwrap(callee);
|
|
1388
|
+
if (callee.type.kind === "func")
|
|
1389
|
+
return lowerCallThroughValue(lowerer, expr, callee, locOf(expr));
|
|
1390
|
+
}
|
|
1310
1391
|
if (callee.type.kind === "func") {
|
|
1311
1392
|
const args = completeFuncValueArgs(lowerer, expr, callee.type, locOf(expr));
|
|
1312
1393
|
return { kind: "callValue", callee, args, type: callee.type.ret, loc: locOf(expr) };
|
|
@@ -1523,8 +1604,47 @@ export function lowerCall(lowerer, expr) {
|
|
|
1523
1604
|
// a non-func IR type was already rejected while lowering the callee.
|
|
1524
1605
|
// HYBRID (function-with-properties) values call through their %call slot.
|
|
1525
1606
|
let callee = lowerer.lowerExpr(expr.expression);
|
|
1526
|
-
|
|
1607
|
+
{
|
|
1608
|
+
const direct = callableInstanceStringCall(lowerer, expr, callee, loc);
|
|
1609
|
+
if (direct)
|
|
1610
|
+
return direct;
|
|
1611
|
+
}
|
|
1612
|
+
if (callee.type.kind === "record" || callee.type.kind === "object")
|
|
1527
1613
|
callee = lowerer.hybridCallUnwrap(callee);
|
|
1614
|
+
return lowerCallThroughValue(lowerer, expr, callee, loc);
|
|
1615
|
+
}
|
|
1616
|
+
/** A callable class instance called with one string: its `%call1` method
|
|
1617
|
+
* when the class has one (the chalk shim's typed fast path), skipping the
|
|
1618
|
+
* variadic closure's checked-dynamic arguments. */
|
|
1619
|
+
function callableInstanceStringCall(lowerer, expr, callee, loc) {
|
|
1620
|
+
if (callee.type.kind !== "object" || expr.arguments.nodes.length !== 1)
|
|
1621
|
+
return null;
|
|
1622
|
+
const arg = expr.arguments.nodes[0];
|
|
1623
|
+
if (ts.isSpreadElement(arg))
|
|
1624
|
+
return null;
|
|
1625
|
+
const info = lowerer.classes.get(callee.type.className);
|
|
1626
|
+
if (info === undefined || !info.fields.has("%call") || !lowerer.findMethodOn(info, "%call1"))
|
|
1627
|
+
return null;
|
|
1628
|
+
const value = lowerer.lowerExpr(arg);
|
|
1629
|
+
if (value.type.kind === "string")
|
|
1630
|
+
return lowerer.accessorCall(callee.type.className, "%call1", callee, [value], STRING, loc);
|
|
1631
|
+
// Any other argument (a number behind a cast): the variadic closure,
|
|
1632
|
+
// through the checked-dynamic call as lowerCallThroughValue would.
|
|
1633
|
+
const closure = lowerer.hybridCallUnwrap(callee);
|
|
1634
|
+
if (closure.type.kind !== "func")
|
|
1635
|
+
return null;
|
|
1636
|
+
return {
|
|
1637
|
+
kind: "dynCall",
|
|
1638
|
+
callee: { kind: "dynFrom", value: closure, type: DYN, loc },
|
|
1639
|
+
calleeName: ts.isIdentifier(expr.expression) ? expr.expression.text : "value",
|
|
1640
|
+
args: [lowerer.coerceToExpected(value, DYN)],
|
|
1641
|
+
type: DYN,
|
|
1642
|
+
loc,
|
|
1643
|
+
};
|
|
1644
|
+
}
|
|
1645
|
+
/** A call through an evaluated callee value: checked-dynamic callees,
|
|
1646
|
+
* function unions, typed-rest and runtime-arity closures. */
|
|
1647
|
+
function lowerCallThroughValue(lowerer, expr, callee, loc) {
|
|
1528
1648
|
// A CHECKED-DYNAMIC callee — `fn(a, b)` where fn is an implicit-any
|
|
1529
1649
|
// JS binding (the mustCall body's `fn(...args)`), a dyn capture, or a
|
|
1530
1650
|
// keyed read off a dyn value: the dynCall boundary. Arguments convert
|
|
@@ -1703,7 +1823,7 @@ function lowerOptionalNumberDefault(lowerer, value, dflt, loc) {
|
|
|
1703
1823
|
const key = `number.optionalDefault:${widened.unionId}:${dflt}`;
|
|
1704
1824
|
let helper = lowerer.valueHelpers.get(key);
|
|
1705
1825
|
if (!helper) {
|
|
1706
|
-
helper =
|
|
1826
|
+
helper = keyedHelperName(lowerer, "%number.optionalDefault", key);
|
|
1707
1827
|
lowerer.valueHelpers.set(key, helper);
|
|
1708
1828
|
const input = varRef("value.0", widened, loc);
|
|
1709
1829
|
lowerer.liftedFns.push({
|
|
@@ -1804,7 +1924,7 @@ function primitiveConversionHandler(lowerer, node, inner) {
|
|
|
1804
1924
|
const key = `then.${name}:${typeKey(inner)}`;
|
|
1805
1925
|
let fnName = lowerer.arrHofHelpers.get(key);
|
|
1806
1926
|
if (fnName === undefined) {
|
|
1807
|
-
fnName = `%then.${name}
|
|
1927
|
+
fnName = keyedHelperName(lowerer, `%then.${name}`, key);
|
|
1808
1928
|
lowerer.arrHofHelpers.set(key, fnName);
|
|
1809
1929
|
const value = varRef("v.0", inner, loc);
|
|
1810
1930
|
let body;
|
|
@@ -1918,6 +2038,20 @@ function lowerBigIntConstructorValue(lowerer, arg, loc) {
|
|
|
1918
2038
|
return { kind: "libCall", fn: "bigint.parse", args: [arg], type: BIGINT_T, loc };
|
|
1919
2039
|
if (arg.type.kind === "f64")
|
|
1920
2040
|
return { kind: "libCall", fn: "bigint.fromF64", args: [arg], type: BIGINT_T, loc };
|
|
2041
|
+
// Byte storage converts through ToPrimitive, which BigInt then parses: a
|
|
2042
|
+
// typed array's text is its elements joined with "," (one element reads
|
|
2043
|
+
// as that element, none as 0n, several throw the SyntaxError for the
|
|
2044
|
+
// joined text), a Buffer's is its UTF-8 decoding and a DataView's is
|
|
2045
|
+
// "[object DataView]". The runtime value tells them apart, as for String.
|
|
2046
|
+
if (arg.type.kind === "bytes") {
|
|
2047
|
+
const text = {
|
|
2048
|
+
kind: "toString",
|
|
2049
|
+
operand: { kind: "dynFrom", value: arg, type: DYN, loc },
|
|
2050
|
+
type: STRING,
|
|
2051
|
+
loc,
|
|
2052
|
+
};
|
|
2053
|
+
return { kind: "libCall", fn: "bigint.parse", args: [text], type: BIGINT_T, loc };
|
|
2054
|
+
}
|
|
1921
2055
|
if (arg.type.kind === "bool") {
|
|
1922
2056
|
return {
|
|
1923
2057
|
kind: "ternary",
|
|
@@ -1953,12 +2087,13 @@ function lowerBigIntConstructorValue(lowerer, arg, loc) {
|
|
|
1953
2087
|
arm.kind === "string" ||
|
|
1954
2088
|
arm.kind === "f64" ||
|
|
1955
2089
|
arm.kind === "bool" ||
|
|
2090
|
+
arm.kind === "bytes" ||
|
|
1956
2091
|
isUnitType(arm)))
|
|
1957
2092
|
return null;
|
|
1958
2093
|
const key = `bigint.scalar:${unionId}`;
|
|
1959
2094
|
let helper = lowerer.valueHelpers.get(key);
|
|
1960
2095
|
if (!helper) {
|
|
1961
|
-
helper =
|
|
2096
|
+
helper = keyedHelperName(lowerer, "%bigint.scalar", key);
|
|
1962
2097
|
lowerer.valueHelpers.set(key, helper);
|
|
1963
2098
|
const value = varRef("value.0", arg.type, loc);
|
|
1964
2099
|
const body = [];
|
|
@@ -2647,6 +2782,12 @@ function lowerStringPrototypeCall(lowerer, call, access) {
|
|
|
2647
2782
|
const receiver = lowerer.ensureString(receiverValue, receiverNode);
|
|
2648
2783
|
return lowerStringMethodCallWithOptionalArgs(lowerer, call, methodAccess, () => receiver, call.arguments.nodes.slice(1));
|
|
2649
2784
|
}
|
|
2785
|
+
/** ToNumber of a union of strings, numbers, booleans, null and undefined, as
|
|
2786
|
+
* `Number(value)` converts it; null for other types. Unary `+` takes it too:
|
|
2787
|
+
* the two conversions differ only for BigInt, which such unions don't hold. */
|
|
2788
|
+
export function lowerPrimitiveUnionNumber(lowerer, arg, node, loc) {
|
|
2789
|
+
return (lowerOptionalStringNumber(lowerer, arg, loc) ?? lowerScalarUnionNumber(lowerer, arg, node, loc));
|
|
2790
|
+
}
|
|
2650
2791
|
function lowerScalarUnionNumber(lowerer, arg, node, loc) {
|
|
2651
2792
|
if (arg.type.kind !== "union" ||
|
|
2652
2793
|
!lowerer.unions
|
|
@@ -2656,7 +2797,7 @@ function lowerScalarUnionNumber(lowerer, arg, node, loc) {
|
|
|
2656
2797
|
const key = `number.scalar:${arg.type.unionId}`;
|
|
2657
2798
|
let helper = lowerer.valueHelpers.get(key);
|
|
2658
2799
|
if (!helper) {
|
|
2659
|
-
helper =
|
|
2800
|
+
helper = keyedHelperName(lowerer, "%number.scalar", key);
|
|
2660
2801
|
lowerer.valueHelpers.set(key, helper);
|
|
2661
2802
|
const value = varRef("value.0", arg.type, loc);
|
|
2662
2803
|
const nan = {
|
|
@@ -2697,7 +2838,7 @@ function lowerOptionalStringNumber(lowerer, arg, loc, fn = "num.fromString", lab
|
|
|
2697
2838
|
const key = `${label}.optionalString:${arg.type.unionId}`;
|
|
2698
2839
|
let helper = lowerer.valueHelpers.get(key);
|
|
2699
2840
|
if (!helper) {
|
|
2700
|
-
helper = `%${label}.optionalString
|
|
2841
|
+
helper = keyedHelperName(lowerer, `%${label}.optionalString`, key);
|
|
2701
2842
|
lowerer.valueHelpers.set(key, helper);
|
|
2702
2843
|
const value = varRef("value.0", arg.type, loc);
|
|
2703
2844
|
lowerer.liftedFns.push({
|
|
@@ -2984,6 +3125,15 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
|
|
|
2984
3125
|
// 'unknown' slot does.
|
|
2985
3126
|
if (checkerUntyped && DYN_HANDLE_KINDS.has(recv.type.kind))
|
|
2986
3127
|
recv = lowerer.coerceToExpected(recv, DYN);
|
|
3128
|
+
// A typed array whose checker type collapsed to `any` (a JS binding
|
|
3129
|
+
// referenced in its own initializer's inference — hono's etag digest
|
|
3130
|
+
// `const nextChunk = new Uint8Array(new ArrayBuffer(f(chunk)))` beside
|
|
3131
|
+
// `chunk = nextChunk`) still lowered to its native bytes. The typed
|
|
3132
|
+
// lowerings key on the checker type and decline it, so it boxes by
|
|
3133
|
+
// reference (the box shares the native storage, so writes through the
|
|
3134
|
+
// call stay visible) and the call dispatches on the runtime kind.
|
|
3135
|
+
if (checkerUntyped && recv.type.kind === "bytes")
|
|
3136
|
+
recv = lowerer.coerceToExpected(recv, DYN);
|
|
2987
3137
|
// The last-resort retry (boxTypedTemporary — every other lowering
|
|
2988
3138
|
// already declined): a checker-`any` receiver whose value is a FRESH
|
|
2989
3139
|
// typed result of an earlier step in the chain (`out.split("\n")`
|
|
@@ -3103,11 +3253,25 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
|
|
|
3103
3253
|
if (access.name.text === "flatMap")
|
|
3104
3254
|
return lowerDynArrayFlatMapCall(lowerer, call, access, recv);
|
|
3105
3255
|
// String methods claim only names NO other dyn-representable kind's
|
|
3106
|
-
// prototype declares (Array carries includes/indexOf/slice too)
|
|
3107
|
-
//
|
|
3108
|
-
//
|
|
3109
|
-
// need a receiver-kind dispatch — they keep the fence.
|
|
3256
|
+
// prototype declares (Array carries includes/indexOf/slice too), so no
|
|
3257
|
+
// other kind inherits them. Shared names would need a receiver-kind
|
|
3258
|
+
// dispatch — they keep the fence.
|
|
3110
3259
|
if (DYN_STRING_ONLY_METHODS.has(access.name.text) && !ownCallable) {
|
|
3260
|
+
// A checked-dynamic object can still carry its OWN member of that
|
|
3261
|
+
// name: zod's schemas assign `trim`, `toLowerCase` and `startsWith`
|
|
3262
|
+
// in their constructors (`z.string().trim().min(1)`), an object's
|
|
3263
|
+
// prototype can define `trim`, and a JavaScript module object can
|
|
3264
|
+
// assign `repeat` in a function body (`common.repeat(" ", n)`, an
|
|
3265
|
+
// object-typed receiver the member is missing from). An untyped
|
|
3266
|
+
// receiver, or a member the checker cannot type, dispatches on the
|
|
3267
|
+
// receiver's runtime kind: a string runs the string lowering, anything
|
|
3268
|
+
// else calls its member as Node does.
|
|
3269
|
+
if ((checkerUntyped ||
|
|
3270
|
+
(lowerer.typeOf(access).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) &&
|
|
3271
|
+
!call.questionDotToken &&
|
|
3272
|
+
!access.questionDotToken &&
|
|
3273
|
+
!call.arguments.nodes.some(ts.isSpreadElement))
|
|
3274
|
+
return lowerStringOrMemberCall(lowerer, call, access, recv);
|
|
3111
3275
|
const checked = () => dynStringReceiver(lowerer, recv, access);
|
|
3112
3276
|
return (lowerRegexMethodCall(lowerer, call, access, checked) ??
|
|
3113
3277
|
lowerStringMethodCall(lowerer, call, access, checked));
|
|
@@ -3127,7 +3291,12 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
|
|
|
3127
3291
|
}
|
|
3128
3292
|
// The argument is a radix for bigint and an encoding for Buffer.
|
|
3129
3293
|
// Preserve its runtime value so receiver dispatch can choose correctly.
|
|
3130
|
-
|
|
3294
|
+
// An authored own `toString` member (zod's `errorUtil.toString`, which
|
|
3295
|
+
// answers string | undefined) is an ordinary method call instead.
|
|
3296
|
+
if (access.name.text === "toString" &&
|
|
3297
|
+
call.arguments.nodes.length <= 1 &&
|
|
3298
|
+
!ownCallable &&
|
|
3299
|
+
!(checkerUntyped && jsAssignsOwnToString(lowerer, access.expression))) {
|
|
3131
3300
|
const argument = call.arguments.nodes[0];
|
|
3132
3301
|
return {
|
|
3133
3302
|
kind: "libCall",
|
|
@@ -3229,11 +3398,17 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
|
|
|
3229
3398
|
// The same holds when only the MEMBER is checker-untyped: TypeScript
|
|
3230
3399
|
// importing chalk's JavaScript source types the default export as a
|
|
3231
3400
|
// plain function, so `chalk.bold` reads as `any` on a typed receiver.
|
|
3401
|
+
const ownToString = access.name.text === "toString" &&
|
|
3402
|
+
checkerUntyped &&
|
|
3403
|
+
jsAssignsOwnToString(lowerer, access.expression);
|
|
3232
3404
|
const stringOnlyName = (checkerUntyped ||
|
|
3233
3405
|
(lowerer.typeOf(access).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) &&
|
|
3234
3406
|
!ownCallable &&
|
|
3235
3407
|
DYN_STRING_PROTO_ONLY_NAMES.has(access.name.text);
|
|
3236
|
-
if (DYN_PROTO_METHOD_NAMES.has(access.name.text) &&
|
|
3408
|
+
if (DYN_PROTO_METHOD_NAMES.has(access.name.text) &&
|
|
3409
|
+
!ownCallable &&
|
|
3410
|
+
!ownToString &&
|
|
3411
|
+
!stringOnlyName)
|
|
3237
3412
|
return null;
|
|
3238
3413
|
// Optional forms (`obj.cb?.()`, `obj?.cb()`) belong to the chain
|
|
3239
3414
|
// machinery's short-circuit semantics — not modeled here yet.
|
|
@@ -3294,6 +3469,79 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
|
|
|
3294
3469
|
loc,
|
|
3295
3470
|
};
|
|
3296
3471
|
}
|
|
3472
|
+
/** `value.name(...args)` on a dyn receiver that may be a string or an
|
|
3473
|
+
* object: a string runs the String.prototype lowering, any other value
|
|
3474
|
+
* calls its member. The member is read before the arguments are
|
|
3475
|
+
* evaluated, and the arguments are evaluated once for either branch. */
|
|
3476
|
+
function lowerStringOrMemberCall(lowerer, call, access, recv) {
|
|
3477
|
+
const loc = locOf(call);
|
|
3478
|
+
const receiverLocal = lowerer.declareHiddenLocal("%dynCallReceiver", DYN);
|
|
3479
|
+
const receiver = varRef(receiverLocal.id, DYN, loc);
|
|
3480
|
+
const isString = { kind: "dynTest", test: "string", value: receiver, type: BOOL, loc };
|
|
3481
|
+
const calleeLocal = lowerer.declareHiddenLocal("%dynCallCallee", DYN);
|
|
3482
|
+
const callee = varRef(calleeLocal.id, DYN, loc);
|
|
3483
|
+
const stmts = [
|
|
3484
|
+
{ kind: "varDecl", localId: receiverLocal.id, init: recv, loc },
|
|
3485
|
+
{
|
|
3486
|
+
kind: "varDecl",
|
|
3487
|
+
localId: calleeLocal.id,
|
|
3488
|
+
init: {
|
|
3489
|
+
kind: "ternary",
|
|
3490
|
+
cond: isString,
|
|
3491
|
+
then: dynUndefinedExpr(loc),
|
|
3492
|
+
else_: {
|
|
3493
|
+
kind: "dynKeyGet",
|
|
3494
|
+
key: { kind: "strLit", value: access.name.text, type: STRING, loc: locOf(access) },
|
|
3495
|
+
value: receiver,
|
|
3496
|
+
type: DYN,
|
|
3497
|
+
loc: locOf(access),
|
|
3498
|
+
},
|
|
3499
|
+
type: DYN,
|
|
3500
|
+
loc,
|
|
3501
|
+
},
|
|
3502
|
+
loc,
|
|
3503
|
+
},
|
|
3504
|
+
];
|
|
3505
|
+
const args = call.arguments.nodes.map((node) => {
|
|
3506
|
+
const value = lowerer.lowerExpr(node);
|
|
3507
|
+
const local = lowerer.declareHiddenLocal("%dynCallArg", value.type);
|
|
3508
|
+
stmts.push({ kind: "varDecl", localId: local.id, init: value, loc: value.loc });
|
|
3509
|
+
return { node, value: varRef(local.id, value.type, value.loc) };
|
|
3510
|
+
});
|
|
3511
|
+
// String.prototype methods ignore arguments past the ones they read.
|
|
3512
|
+
const arity = DYN_STRING_ONLY_ARITY[access.name.text] ?? call.arguments.nodes.length;
|
|
3513
|
+
const stringReceiver = () => ({ kind: "dynCheck", value: receiver, type: STRING, loc });
|
|
3514
|
+
const lowerString = () => (call.arguments.nodes.length <= arity
|
|
3515
|
+
? lowerRegexMethodCall(lowerer, call, access, stringReceiver)
|
|
3516
|
+
: null) ??
|
|
3517
|
+
lowerStringMethodCall(lowerer, call, access, stringReceiver, call.arguments.nodes.slice(0, arity));
|
|
3518
|
+
const stringCall = lowerer.withExpressionOverrides(args, lowerString);
|
|
3519
|
+
const memberCall = {
|
|
3520
|
+
kind: "dynCall",
|
|
3521
|
+
callee,
|
|
3522
|
+
receiver,
|
|
3523
|
+
calleeName: ts.getTextOfNode(access),
|
|
3524
|
+
args: args.map((arg) => lowerer.coerceToExpected(arg.value, DYN)),
|
|
3525
|
+
type: DYN,
|
|
3526
|
+
loc,
|
|
3527
|
+
};
|
|
3528
|
+
return {
|
|
3529
|
+
kind: "seqExpr",
|
|
3530
|
+
stmts,
|
|
3531
|
+
result: {
|
|
3532
|
+
kind: "ternary",
|
|
3533
|
+
cond: isString,
|
|
3534
|
+
then: stringCall
|
|
3535
|
+
? lowerer.coerceToExpected(stringCall, DYN)
|
|
3536
|
+
: nodeThrowExpr(0, "SC1090", `method calls like '${ts.getTextOfNode(access)}' on a string are not supported yet [SC1090 at ${ts.getSourceFileOfNode(call).fileName}:${ts.getLineAndCharacterOfPosition(ts.getSourceFileOfNode(call), ts.tokenStartOfNode(call)).line + 1}]`, DYN, loc),
|
|
3537
|
+
else_: memberCall,
|
|
3538
|
+
type: DYN,
|
|
3539
|
+
loc,
|
|
3540
|
+
},
|
|
3541
|
+
type: DYN,
|
|
3542
|
+
loc,
|
|
3543
|
+
};
|
|
3544
|
+
}
|
|
3297
3545
|
/** Prototype method names of the checked-dynamic tree-representable kinds (String, Array,
|
|
3298
3546
|
* Object, Function, Number prototypes): a dyn receiver call on one of
|
|
3299
3547
|
* these could be a REAL method on a real value, which a stored-member
|
|
@@ -3421,6 +3669,7 @@ const DYN_DISPATCH_METHODS = new Set([
|
|
|
3421
3669
|
"shift",
|
|
3422
3670
|
"unshift",
|
|
3423
3671
|
"slice",
|
|
3672
|
+
"splice",
|
|
3424
3673
|
"at",
|
|
3425
3674
|
"indexOf",
|
|
3426
3675
|
"lastIndexOf",
|
|
@@ -3455,6 +3704,12 @@ const DYN_DISPATCH_METHODS = new Set([
|
|
|
3455
3704
|
"prependOnceListener",
|
|
3456
3705
|
"listeners",
|
|
3457
3706
|
"listenerCount",
|
|
3707
|
+
// The rest of EventEmitter.prototype, which compiled emitters answer
|
|
3708
|
+
// through the class dispatch (class-dynamic-dispatch.ts).
|
|
3709
|
+
"rawListeners",
|
|
3710
|
+
"eventNames",
|
|
3711
|
+
"setMaxListeners",
|
|
3712
|
+
"getMaxListeners",
|
|
3458
3713
|
"write",
|
|
3459
3714
|
"end",
|
|
3460
3715
|
"destroy",
|
|
@@ -3556,6 +3811,9 @@ const DYN_DISPATCH_METHODS = new Set([
|
|
|
3556
3811
|
"additionalHeaders",
|
|
3557
3812
|
"altsvc",
|
|
3558
3813
|
"origin",
|
|
3814
|
+
// FinalizationRegistry's methods (scr_finalization_registry_new).
|
|
3815
|
+
"register",
|
|
3816
|
+
"unregister",
|
|
3559
3817
|
// Worker and MessagePort methods use the owning context's handle adapter.
|
|
3560
3818
|
"postMessage",
|
|
3561
3819
|
"terminate",
|
|
@@ -3567,6 +3825,15 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
|
|
|
3567
3825
|
if ((!DYN_DISPATCH_METHODS.has(method) && !isJsSourceFile(ts.getSourceFileOfNode(call))) ||
|
|
3568
3826
|
lowerer.chainBlocked(call, access))
|
|
3569
3827
|
return null;
|
|
3828
|
+
// readable.compose lowers its stages from their syntax, so it needs the
|
|
3829
|
+
// stream's class: a stream a JavaScript function returns untyped has none.
|
|
3830
|
+
if (method === "compose") {
|
|
3831
|
+
const recvT = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
|
|
3832
|
+
if (recvT?.kind === "object" &&
|
|
3833
|
+
streamSidesOf(lowerer, lowerer.classes.get(recvT.className)) !== null) {
|
|
3834
|
+
lowerer.noLowering("readable.compose on a stream held as a checked-dynamic value", call, "type the stream where it comes from, such as a JSDoc @returns {Readable} on the function that returns it");
|
|
3835
|
+
}
|
|
3836
|
+
}
|
|
3570
3837
|
if (call.arguments.nodes.some((arg) => ts.isSpreadElement(arg))) {
|
|
3571
3838
|
const loc = locOf(call);
|
|
3572
3839
|
const local = lowerer.declareHiddenLocal("%spreadReceiver", DYN);
|
|
@@ -3664,7 +3931,19 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
|
|
|
3664
3931
|
}
|
|
3665
3932
|
}
|
|
3666
3933
|
}
|
|
3934
|
+
// `String`, `Number` or `Boolean` as the callback of an array method
|
|
3935
|
+
// (`values.map(String)` over an unknown array): the method calls it with
|
|
3936
|
+
// each element, whatever its type, and cannot observe which function
|
|
3937
|
+
// value it received, so it gets the constructor's form that converts any
|
|
3938
|
+
// argument rather than the string-input form typed code stores.
|
|
3939
|
+
const arrayCallbackReceiver = ARRAY_CALLBACK_METHODS.has(method) &&
|
|
3940
|
+
lowerer.checker.isArrayType(lowerer.typeOf(access.expression));
|
|
3667
3941
|
const args = call.arguments.nodes.map((arg, i) => {
|
|
3942
|
+
const primitive = i === 0 && arrayCallbackReceiver && ts.isIdentifier(arg)
|
|
3943
|
+
? stdlibGlobalNameOf(lowerer, arg)
|
|
3944
|
+
: null;
|
|
3945
|
+
if (primitive === "String" || primitive === "Number" || primitive === "Boolean")
|
|
3946
|
+
return lowerer.coerceInto(arg, primitiveCtorClosure(lowerer, primitive, locOf(arg), true), DYN);
|
|
3668
3947
|
if (i === 0 && predicate)
|
|
3669
3948
|
return lowerer.coerceInto(arg, predicate, DYN);
|
|
3670
3949
|
const undefinedArg = lowerStaticallyUndefinedArgument(lowerer, arg);
|
|
@@ -3682,6 +3961,20 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
|
|
|
3682
3961
|
loc: locOf(call),
|
|
3683
3962
|
};
|
|
3684
3963
|
}
|
|
3964
|
+
/** Array.prototype methods whose first argument is a callback they call
|
|
3965
|
+
* with the elements. */
|
|
3966
|
+
const ARRAY_CALLBACK_METHODS = new Set([
|
|
3967
|
+
"map",
|
|
3968
|
+
"filter",
|
|
3969
|
+
"forEach",
|
|
3970
|
+
"some",
|
|
3971
|
+
"every",
|
|
3972
|
+
"find",
|
|
3973
|
+
"findIndex",
|
|
3974
|
+
"findLast",
|
|
3975
|
+
"findLastIndex",
|
|
3976
|
+
"flatMap",
|
|
3977
|
+
]);
|
|
3685
3978
|
/** Every String.prototype method name a typed or dyn string lowering
|
|
3686
3979
|
* answers. */
|
|
3687
3980
|
function isStringMethodName(name) {
|
|
@@ -3692,6 +3985,28 @@ function isStringMethodName(name) {
|
|
|
3692
3985
|
name === "normalize" ||
|
|
3693
3986
|
name === "lastIndexOf");
|
|
3694
3987
|
}
|
|
3988
|
+
/** How many arguments each DYN_STRING_ONLY_METHODS method reads. */
|
|
3989
|
+
const DYN_STRING_ONLY_ARITY = {
|
|
3990
|
+
charCodeAt: 1,
|
|
3991
|
+
charAt: 1,
|
|
3992
|
+
startsWith: 2,
|
|
3993
|
+
endsWith: 2,
|
|
3994
|
+
substring: 2,
|
|
3995
|
+
repeat: 1,
|
|
3996
|
+
trim: 0,
|
|
3997
|
+
trimStart: 0,
|
|
3998
|
+
trimEnd: 0,
|
|
3999
|
+
split: 2,
|
|
4000
|
+
padStart: 2,
|
|
4001
|
+
padEnd: 2,
|
|
4002
|
+
toLowerCase: 0,
|
|
4003
|
+
toUpperCase: 0,
|
|
4004
|
+
replace: 2,
|
|
4005
|
+
replaceAll: 2,
|
|
4006
|
+
match: 1,
|
|
4007
|
+
matchAll: 1,
|
|
4008
|
+
search: 1,
|
|
4009
|
+
};
|
|
3695
4010
|
/** STR_METHODS ∪ the regex-form names, MINUS everything Array (or any
|
|
3696
4011
|
* other dyn kind's prototype) also declares. */
|
|
3697
4012
|
const DYN_STRING_ONLY_METHODS = new Set([
|
|
@@ -4013,7 +4328,7 @@ function lowerDefaultToStringCall(lowerer, call, access) {
|
|
|
4013
4328
|
const key = `objToStr:${typeKey(recv.type)}${missing ? `:${missing}` : ""}`;
|
|
4014
4329
|
let helper = lowerer.valueHelpers.get(key);
|
|
4015
4330
|
if (!helper) {
|
|
4016
|
-
helper =
|
|
4331
|
+
helper = keyedHelperName(lowerer, "%obj.tostr", key);
|
|
4017
4332
|
lowerer.valueHelpers.set(key, helper);
|
|
4018
4333
|
const o = varRef("o.0", recv.type, loc);
|
|
4019
4334
|
lowerer.liftedFns.push({
|
|
@@ -4625,7 +4940,7 @@ function loweredTemplateStrings(lowerer, expr, cooked, loc, raw) {
|
|
|
4625
4940
|
const site = lowerer.globalsList.length;
|
|
4626
4941
|
const globalId = `%g.templateStrings.${site}`;
|
|
4627
4942
|
const readyId = `%g.templateStringsReady.${site}`;
|
|
4628
|
-
getter =
|
|
4943
|
+
getter = keyedHelperName(lowerer, "%templateStrings.get", key);
|
|
4629
4944
|
lowerer.valueHelpers.set(key, getter);
|
|
4630
4945
|
lowerer.globalsList.push({ id: globalId, name: "%templateStrings", type, mutable: true }, { id: readyId, name: "%templateStringsReady", type: BOOL, mutable: true });
|
|
4631
4946
|
lowerer.liftedFns.push({
|
|
@@ -4794,7 +5109,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
4794
5109
|
// IS the spec's identity/thrower/no-op substitution for all three
|
|
4795
5110
|
// members. An argument expression, when present, is undefined/null
|
|
4796
5111
|
// by construction — nothing to evaluate.
|
|
4797
|
-
const fnName =
|
|
5112
|
+
const fnName = lowerer.closureName(loc, `_${member}pass`);
|
|
4798
5113
|
const funcType = { kind: "func", params: [promT], ret: promT };
|
|
4799
5114
|
const fnCtx = newFnCtx(true, null, funcType, inner);
|
|
4800
5115
|
fnCtx.isAsync = true;
|
|
@@ -4876,7 +5191,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
4876
5191
|
// Evaluate both callback expressions before the wrapper runs, in source order.
|
|
4877
5192
|
const fulfilled = fulfilledAbsent ? null : boxHandler(fulfilledNode, true);
|
|
4878
5193
|
const rejected = rejectedAbsent ? null : boxHandler(rejectedNode, false);
|
|
4879
|
-
const fnName =
|
|
5194
|
+
const fnName = lowerer.closureName(loc, "_then2");
|
|
4880
5195
|
const paramTypes = [
|
|
4881
5196
|
promT,
|
|
4882
5197
|
...(fulfilled ? [fulfilled.value.type] : []),
|
|
@@ -5095,7 +5410,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
5095
5410
|
lowerer.unsupported("SC1090", call.arguments.nodes[0], `then handlers receiving '${lowerer.fmt(v.type)}' values through an untyped handler (the settled value cannot cross the checked-dynamic tree boundary)`);
|
|
5096
5411
|
};
|
|
5097
5412
|
const resultT = { kind: "promise", inner: DYN };
|
|
5098
|
-
const fnName =
|
|
5413
|
+
const fnName = lowerer.closureName(loc, "_then");
|
|
5099
5414
|
const funcType = {
|
|
5100
5415
|
kind: "func",
|
|
5101
5416
|
params: [promT, DYN],
|
|
@@ -5173,12 +5488,24 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
5173
5488
|
!(param.kind === "dyn" && (inner.kind === "void" || lowerer.dynConvertible(inner)))) {
|
|
5174
5489
|
lowerer.unsupported("SC1090", call.arguments.nodes[0], `then handlers whose parameter is not the settled value's type (expected '${lowerer.fmt(inner)}', got '${lowerer.fmt(param)}')`);
|
|
5175
5490
|
}
|
|
5176
|
-
|
|
5491
|
+
let resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
|
|
5492
|
+
// JavaScript whose declared result type has no mapping (zod's
|
|
5493
|
+
// `Promise.all(items).then((r) => ParseStatus.mergeArray(status, r))`,
|
|
5494
|
+
// typed by a .d.ts union): the handler's value settles the promise as
|
|
5495
|
+
// a checked-dynamic value, checked where it is used.
|
|
5496
|
+
if (resultT?.kind !== "promise" &&
|
|
5497
|
+
isJsSourceFile(ts.getSourceFileOfNode(call)) &&
|
|
5498
|
+
cb.type.kind === "func" &&
|
|
5499
|
+
cb.type.ret.kind !== "promise" &&
|
|
5500
|
+
cb.type.ret.kind !== "void" &&
|
|
5501
|
+
(cb.type.ret.kind === "dyn" || lowerer.dynConvertible(cb.type.ret))) {
|
|
5502
|
+
resultT = { kind: "promise", inner: DYN };
|
|
5503
|
+
}
|
|
5177
5504
|
if (resultT?.kind !== "promise") {
|
|
5178
5505
|
lowerer.noLowering("then with this handler's result type", call, "the combined result must be a representable promise");
|
|
5179
5506
|
}
|
|
5180
5507
|
const R = resultT.inner;
|
|
5181
|
-
const fnName =
|
|
5508
|
+
const fnName = lowerer.closureName(loc, "_then");
|
|
5182
5509
|
const funcType = {
|
|
5183
5510
|
kind: "func",
|
|
5184
5511
|
params: [promT, cb.type],
|
|
@@ -5282,7 +5609,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
5282
5609
|
if (cb.type.kind !== "func" || cb.type.params.length !== 0 || cb.type.ret.kind !== "void") {
|
|
5283
5610
|
lowerer.unsupported("SC1090", call.arguments.nodes[0], "finally callbacks with parameters or a return value (use () => { ... })");
|
|
5284
5611
|
}
|
|
5285
|
-
const fnName =
|
|
5612
|
+
const fnName = lowerer.closureName(loc, "_finally");
|
|
5286
5613
|
const funcType = {
|
|
5287
5614
|
kind: "func",
|
|
5288
5615
|
params: [promT, cb.type],
|
|
@@ -5378,7 +5705,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
5378
5705
|
}
|
|
5379
5706
|
if (cb.type.kind === "dyn") {
|
|
5380
5707
|
const resultT = { kind: "promise", inner: DYN };
|
|
5381
|
-
const fnName =
|
|
5708
|
+
const fnName = lowerer.closureName(loc, "_catchdyn");
|
|
5382
5709
|
const funcType = {
|
|
5383
5710
|
kind: "func",
|
|
5384
5711
|
params: [promT, DYN],
|
|
@@ -5495,7 +5822,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
5495
5822
|
"own type, or annotate the handler `(): undefined =>` for the T | undefined result");
|
|
5496
5823
|
}
|
|
5497
5824
|
const R = resultT.inner;
|
|
5498
|
-
const fnName =
|
|
5825
|
+
const fnName = lowerer.closureName(loc, "_catch");
|
|
5499
5826
|
const funcType = { kind: "func", params: [promT], ret: resultT };
|
|
5500
5827
|
const fnCtx = newFnCtx(true, null, funcType, R);
|
|
5501
5828
|
fnCtx.isAsync = true;
|
|
@@ -5648,6 +5975,13 @@ export function lowerFilterNarrowCall(lowerer, call, access) {
|
|
|
5648
5975
|
const narrowed = outElem !== null && !typeEquals(outElem, elem);
|
|
5649
5976
|
if (!narrowed && !isBooleanArg)
|
|
5650
5977
|
return null;
|
|
5978
|
+
// A written predicate (`(p): p is Cat => ...`, a guard function value)
|
|
5979
|
+
// proves nothing at run time: the generic array HOF path filters the
|
|
5980
|
+
// receiver's elements and converts the kept ones checked
|
|
5981
|
+
// (filterResultElem).
|
|
5982
|
+
if (!isBooleanArg &&
|
|
5983
|
+
((!ts.isArrowFunction(argNode) && !ts.isFunctionExpression(argNode)) || argNode.type))
|
|
5984
|
+
return null;
|
|
5651
5985
|
const annotateEscape = "keep the receiver's element type instead — annotate the callback's return ': boolean' " +
|
|
5652
5986
|
"(the checker then skips the predicate) or annotate the result with the receiver's own " +
|
|
5653
5987
|
"element type — and narrow the elements after";
|
|
@@ -5657,6 +5991,10 @@ export function lowerFilterNarrowCall(lowerer, call, access) {
|
|
|
5657
5991
|
lowerer.badType(call, callT); // defensive: a narrowed non-union receiver
|
|
5658
5992
|
}
|
|
5659
5993
|
tag = lowerer.armTag(elem.unionId, outElem);
|
|
5994
|
+
// Several kept arms: the generic path converts the kept elements to
|
|
5995
|
+
// the narrower union (filterResultElem).
|
|
5996
|
+
if (tag < 0 && !isBooleanArg)
|
|
5997
|
+
return null;
|
|
5660
5998
|
if (tag < 0) {
|
|
5661
5999
|
lowerer.unsupported("SC1090", call, `'.filter' narrowing '${lowerer.fmt(elem)}' elements to the multi-arm '${lowerer.fmt(outElem)}' ` +
|
|
5662
6000
|
`(only a SINGLE arm re-tags — ${annotateEscape})`);
|
|
@@ -5673,17 +6011,8 @@ export function lowerFilterNarrowCall(lowerer, call, access) {
|
|
|
5673
6011
|
const helper = filterNarrowHelper(lowerer, "truthy", elem, outElem ?? elem, tag, loc);
|
|
5674
6012
|
return { kind: "call", callee: helper, args: [receiver], type: arrayOf(outElem ?? elem), loc };
|
|
5675
6013
|
}
|
|
5676
|
-
//
|
|
5677
|
-
// annotation
|
|
5678
|
-
// checker reports a predicate over parameter 0.
|
|
5679
|
-
if (!ts.isArrowFunction(argNode) && !ts.isFunctionExpression(argNode)) {
|
|
5680
|
-
lowerer.unsupported("SC1090", argNode, `narrowing '.filter' through a callback VALUE ` +
|
|
5681
|
-
`(only an inline callback whose predicate the checker inferred can re-tag — ${annotateEscape})`);
|
|
5682
|
-
}
|
|
5683
|
-
if (argNode.type) {
|
|
5684
|
-
lowerer.unsupported("SC1090", argNode, `narrowing '.filter' with a hand-written type predicate ` +
|
|
5685
|
-
`(a written 'x is T' is an unchecked assertion nothing validates at runtime — ${annotateEscape})`);
|
|
5686
|
-
}
|
|
6014
|
+
// An inferred type predicate: an inline function literal with no return
|
|
6015
|
+
// annotation, over parameter 0 (written predicates returned above).
|
|
5687
6016
|
// The receiver evaluates FIRST, in the enclosing function, like JS.
|
|
5688
6017
|
const receiver = lowerer.lowerExpr(access.expression);
|
|
5689
6018
|
const fnArg = lowerer.lowerExpr(argNode);
|
|
@@ -5713,7 +6042,7 @@ function filterNarrowHelper(lowerer, test, elem, outElem, tag, loc) {
|
|
|
5713
6042
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
5714
6043
|
if (existing)
|
|
5715
6044
|
return existing;
|
|
5716
|
-
const name =
|
|
6045
|
+
const name = keyedHelperName(lowerer, "%arr.filterNarrow", key);
|
|
5717
6046
|
lowerer.arrHofHelpers.set(key, name);
|
|
5718
6047
|
const arrT = arrayOf(elem);
|
|
5719
6048
|
const outT = arrayOf(outElem);
|
|
@@ -5935,7 +6264,7 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
|
|
|
5935
6264
|
const key = `obj.keys:${argIr.shapeId}:${typeKey(resultT)}`;
|
|
5936
6265
|
let helper = lowerer.arrHofHelpers.get(key);
|
|
5937
6266
|
if (!helper) {
|
|
5938
|
-
helper =
|
|
6267
|
+
helper = keyedHelperName(lowerer, "%obj.keys", key);
|
|
5939
6268
|
const ref = { kind: "varRef", localId: "r.0", type: argIr, loc };
|
|
5940
6269
|
const outRef = { kind: "varRef", localId: "out.0", type: resultT, loc };
|
|
5941
6270
|
lowerer.arrHofHelpers.set(key, helper);
|
|
@@ -5961,8 +6290,10 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
|
|
|
5961
6290
|
loc,
|
|
5962
6291
|
},
|
|
5963
6292
|
];
|
|
5964
|
-
|
|
5965
|
-
|
|
6293
|
+
// One walk per key order (see perKeyOrder).
|
|
6294
|
+
const orders = shapeKeyOrders(current);
|
|
6295
|
+
const walks = orders.map(() => []);
|
|
6296
|
+
for (const [k, name] of orders.flatMap((order, k) => order.map((name) => [k, name]))) {
|
|
5966
6297
|
const f = current.fields.find((x) => x.name === name);
|
|
5967
6298
|
const pushStmt = {
|
|
5968
6299
|
kind: "exprStmt",
|
|
@@ -5979,10 +6310,11 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
|
|
|
5979
6310
|
// Fields that can be absent push behind their presence test (the
|
|
5980
6311
|
// key exists exactly when Object.keys would list it).
|
|
5981
6312
|
const present = lowerer.recordFieldPresent(ref, argIr.shapeId, f.name, loc);
|
|
5982
|
-
|
|
6313
|
+
walks[k].push(present.kind === "recordHas"
|
|
5983
6314
|
? { kind: "if", cond: present, then: [pushStmt], else_: null, loc }
|
|
5984
6315
|
: pushStmt);
|
|
5985
6316
|
}
|
|
6317
|
+
body.push(...perKeyOrder(current, ref, walks, loc));
|
|
5986
6318
|
body.push({ kind: "return", value: outRef, loc });
|
|
5987
6319
|
fn.body = body;
|
|
5988
6320
|
};
|
|
@@ -5998,12 +6330,12 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
|
|
|
5998
6330
|
* (a key is own exactly when Object.keys would list it — the two share
|
|
5999
6331
|
* the test), everything else true. Unmatched keys probe the overflow
|
|
6000
6332
|
* map when present, so explicit undefined values remain own keys. */
|
|
6001
|
-
function recordHasOwnHelper(lowerer, shapeId, loc) {
|
|
6333
|
+
export function recordHasOwnHelper(lowerer, shapeId, loc) {
|
|
6002
6334
|
const key = `obj.hasOwn:${shapeId}`;
|
|
6003
6335
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
6004
6336
|
if (existing)
|
|
6005
6337
|
return existing;
|
|
6006
|
-
const helper =
|
|
6338
|
+
const helper = keyedHelperName(lowerer, "%obj.hasOwn", key);
|
|
6007
6339
|
lowerer.arrHofHelpers.set(key, helper);
|
|
6008
6340
|
const shape = lowerer.shapes.get(shapeId);
|
|
6009
6341
|
const recT = { kind: "record", shapeId };
|
|
@@ -6081,7 +6413,7 @@ function classAssignHelper(lowerer, className, srcShapeId, loc) {
|
|
|
6081
6413
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
6082
6414
|
if (existing)
|
|
6083
6415
|
return existing;
|
|
6084
|
-
const helper =
|
|
6416
|
+
const helper = keyedHelperName(lowerer, "%obj.assignClass", key);
|
|
6085
6417
|
lowerer.arrHofHelpers.set(key, helper);
|
|
6086
6418
|
const sShape = lowerer.shapes.get(srcShapeId);
|
|
6087
6419
|
const oT = { kind: "object", className };
|
|
@@ -6142,7 +6474,7 @@ function recordAssignHelper(lowerer, targetShapeId, srcShapeId, loc) {
|
|
|
6142
6474
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
6143
6475
|
if (existing)
|
|
6144
6476
|
return existing;
|
|
6145
|
-
const helper =
|
|
6477
|
+
const helper = keyedHelperName(lowerer, "%obj.assign", key);
|
|
6146
6478
|
lowerer.arrHofHelpers.set(key, helper);
|
|
6147
6479
|
const sShape = lowerer.shapes.get(srcShapeId);
|
|
6148
6480
|
const tShape = lowerer.shapes.get(targetShapeId);
|
|
@@ -6323,6 +6655,33 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6323
6655
|
if (!lowerer.isStdlibGlobal(access.expression, "Object"))
|
|
6324
6656
|
return null;
|
|
6325
6657
|
const member = access.name.text;
|
|
6658
|
+
// `Object.getOwnPropertyDescriptor(Error, "stackTraceLimit")` (Effect's
|
|
6659
|
+
// isStackTraceLimitWritable): Error's own writable, enumerable,
|
|
6660
|
+
// configurable data property holding the current limit. The interned
|
|
6661
|
+
// Error value models no other statics (builtinGlobalValueAt).
|
|
6662
|
+
const [first, second] = call.arguments.nodes;
|
|
6663
|
+
if (member === "getOwnPropertyDescriptor" &&
|
|
6664
|
+
call.arguments.nodes.length === 2 &&
|
|
6665
|
+
lowerer.isStdlibGlobal(first, "Error") &&
|
|
6666
|
+
ts.isStringLiteralLike(second) &&
|
|
6667
|
+
second.text === "stackTraceLimit") {
|
|
6668
|
+
const loc = locOf(call);
|
|
6669
|
+
const dyn = (value) => ({ kind: "dynFrom", value, type: DYN, loc });
|
|
6670
|
+
const yes = dyn({ kind: "boolLit", value: true, type: BOOL, loc });
|
|
6671
|
+
const limit = { kind: "libCall", fn: "error.stackLimitGet", args: [], type: F64, loc };
|
|
6672
|
+
return {
|
|
6673
|
+
kind: "dynObjLit",
|
|
6674
|
+
fields: [
|
|
6675
|
+
{ key: { kind: "strLit", value: "value", type: STRING, loc }, value: dyn(limit) },
|
|
6676
|
+
...["writable", "enumerable", "configurable"].map((key) => ({
|
|
6677
|
+
key: { kind: "strLit", value: key, type: STRING, loc },
|
|
6678
|
+
value: yes,
|
|
6679
|
+
})),
|
|
6680
|
+
],
|
|
6681
|
+
type: DYN,
|
|
6682
|
+
loc,
|
|
6683
|
+
};
|
|
6684
|
+
}
|
|
6326
6685
|
if ((member === "getOwnPropertyNames" ||
|
|
6327
6686
|
member === "getOwnPropertySymbols" ||
|
|
6328
6687
|
member === "getOwnPropertyDescriptors") &&
|
|
@@ -6677,6 +7036,11 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6677
7036
|
const target = lowerer.lowerExpr(call.arguments.nodes[0]);
|
|
6678
7037
|
const rawSource = lowerer.lowerExpr(call.arguments.nodes[1]);
|
|
6679
7038
|
fenceSymbolFieldCopy(lowerer, call.arguments.nodes[1], rawSource.type);
|
|
7039
|
+
let targetNode = call.arguments.nodes[0];
|
|
7040
|
+
while (ts.isParenthesizedExpression(targetNode))
|
|
7041
|
+
targetNode = targetNode.expression;
|
|
7042
|
+
if (ts.isObjectLiteralExpression(targetNode))
|
|
7043
|
+
fenceClassCopyIntoFreshObject(lowerer, call, call.arguments.nodes[1], rawSource);
|
|
6680
7044
|
const source = lowerer.coerceToExpected(rawSource, DYN);
|
|
6681
7045
|
if (target.type.kind === "dyn" && source.type.kind === "dyn") {
|
|
6682
7046
|
return { kind: "libCall", fn: "dyn.assign", args: [target, source], type: DYN, loc };
|
|
@@ -6815,19 +7179,8 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6815
7179
|
const srcNode = spread ? argNode.expression : argNode;
|
|
6816
7180
|
const rawSource = lowerer.lowerExpr(srcNode);
|
|
6817
7181
|
fenceSymbolFieldCopy(lowerer, srcNode, rawSource.type, spread);
|
|
6818
|
-
|
|
6819
|
-
|
|
6820
|
-
// object holding the instance's own fields, never an
|
|
6821
|
-
// instance, so a result the checker types as the class has
|
|
6822
|
-
// no representation (the checked cast would throw).
|
|
6823
|
-
if (rawSource.type.kind === "object" &&
|
|
6824
|
-
freshLiteralTarget &&
|
|
6825
|
-
!ts.isExpressionStatement(call.parent)) {
|
|
6826
|
-
const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
|
|
6827
|
-
if (resultT !== null && resultT.kind === "object") {
|
|
6828
|
-
lowerer.unsupported("SC1090", srcNode, `Object.assign copying a '${lowerer.fmt(rawSource.type)}' instance into a fresh object typed as the class (the copy is a plain object holding the instance's own fields, not an instance — build the object literal from the fields you need)`);
|
|
6829
|
-
}
|
|
6830
|
-
}
|
|
7182
|
+
if (freshLiteralTarget)
|
|
7183
|
+
fenceClassCopyIntoFreshObject(lowerer, call, srcNode, rawSource);
|
|
6831
7184
|
const src = lowerer.coerceToExpected(rawSource, DYN);
|
|
6832
7185
|
if (src.type.kind !== "dyn") {
|
|
6833
7186
|
ok = false;
|
|
@@ -6944,6 +7297,12 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6944
7297
|
...(fnName !== null ? { fnName } : {}),
|
|
6945
7298
|
};
|
|
6946
7299
|
}
|
|
7300
|
+
// A class value (`Object.defineProperty(Definition, "name", { value })`)
|
|
7301
|
+
// boxes to its constructor function, whose own-property table holds the
|
|
7302
|
+
// definition for every alias of the class.
|
|
7303
|
+
if (target?.type.kind === "classval" && lowerer.dynConvertible(target.type)) {
|
|
7304
|
+
target = { kind: "dynFrom", value: target, type: DYN, loc: locOf(call.arguments.nodes[0]) };
|
|
7305
|
+
}
|
|
6947
7306
|
const descriptorPrimitive = member === "getOwnPropertyDescriptor" &&
|
|
6948
7307
|
target &&
|
|
6949
7308
|
(target.type.kind === "bool" || target.type.kind === "f64" || target.type.kind === "string");
|
|
@@ -7049,6 +7408,25 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
7049
7408
|
loc,
|
|
7050
7409
|
};
|
|
7051
7410
|
}
|
|
7411
|
+
const fnIntegrity = functionIntegrity(lowerer, member, value, call.arguments.nodes[0], locOf(call));
|
|
7412
|
+
if (fnIntegrity)
|
|
7413
|
+
return fnIntegrity;
|
|
7414
|
+
// A Map or Set has no own properties: freeze, seal and preventExtensions
|
|
7415
|
+
// all only make it not extensible.
|
|
7416
|
+
if (value.type.kind === "map" || value.type.kind === "set") {
|
|
7417
|
+
if (member === "preventExtensions" || member === "seal")
|
|
7418
|
+
return lowerNativeFreeze(lowerer, "collection.preventExtensions", value, locOf(call));
|
|
7419
|
+
const extensible = {
|
|
7420
|
+
kind: "libCall",
|
|
7421
|
+
fn: "collection.isExtensible",
|
|
7422
|
+
args: [value],
|
|
7423
|
+
type: BOOL,
|
|
7424
|
+
loc: locOf(call),
|
|
7425
|
+
};
|
|
7426
|
+
return member === "isExtensible"
|
|
7427
|
+
? extensible
|
|
7428
|
+
: { kind: "unary", op: "!", operand: extensible, type: BOOL, loc: locOf(call) };
|
|
7429
|
+
}
|
|
7052
7430
|
if (member === "preventExtensions" || member === "seal") {
|
|
7053
7431
|
const integrity = lowerClassIntegrity(lowerer, call, member, value);
|
|
7054
7432
|
if (integrity)
|
|
@@ -7085,10 +7463,42 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
7085
7463
|
// the argument — no alias exists, so the frozen bit is unobservable
|
|
7086
7464
|
// (writes through the Readonly<T> result are compile errors, and no
|
|
7087
7465
|
// other reference can write). Primitives pass through per ES2015.
|
|
7088
|
-
// Aliased
|
|
7089
|
-
//
|
|
7466
|
+
// Aliased records get the frozen bit of their rc word (frozen-records.ts);
|
|
7467
|
+
// other aliased objects keep a fence: a later write through the original
|
|
7468
|
+
// reference would need a runtime frozen bit (strict mode throws).
|
|
7090
7469
|
if (member === "isFrozen" && call.arguments.nodes.length === 1) {
|
|
7091
|
-
const
|
|
7470
|
+
const argNode = call.arguments.nodes[0];
|
|
7471
|
+
const probedKind = tryLowerExpression(lowerer, argNode)?.type.kind;
|
|
7472
|
+
if (probedKind === "record" ||
|
|
7473
|
+
probedKind === "array" ||
|
|
7474
|
+
probedKind === "map" ||
|
|
7475
|
+
probedKind === "set") {
|
|
7476
|
+
const native = lowerer.lowerExpr(argNode);
|
|
7477
|
+
const loc = locOf(call);
|
|
7478
|
+
if (native.type.kind === "record" || native.type.kind === "array")
|
|
7479
|
+
return {
|
|
7480
|
+
kind: "libCall",
|
|
7481
|
+
fn: native.type.kind === "record" ? "record.isFrozen" : "array.isFrozen",
|
|
7482
|
+
args: [native],
|
|
7483
|
+
type: BOOL,
|
|
7484
|
+
loc,
|
|
7485
|
+
};
|
|
7486
|
+
if (native.type.kind === "map" || native.type.kind === "set")
|
|
7487
|
+
return {
|
|
7488
|
+
kind: "unary",
|
|
7489
|
+
op: "!",
|
|
7490
|
+
operand: {
|
|
7491
|
+
kind: "libCall",
|
|
7492
|
+
fn: "collection.isExtensible",
|
|
7493
|
+
args: [native],
|
|
7494
|
+
type: BOOL,
|
|
7495
|
+
loc,
|
|
7496
|
+
},
|
|
7497
|
+
type: BOOL,
|
|
7498
|
+
loc,
|
|
7499
|
+
};
|
|
7500
|
+
}
|
|
7501
|
+
const value = lowerer.lowerExprExpecting(argNode, DYN);
|
|
7092
7502
|
return { kind: "libCall", fn: "dyn.isFrozen", args: [value], type: BOOL, loc: locOf(call) };
|
|
7093
7503
|
}
|
|
7094
7504
|
if (member === "freeze") {
|
|
@@ -7126,9 +7536,18 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
7126
7536
|
arm.kind === "string" ||
|
|
7127
7537
|
arm.kind === "symbol"))
|
|
7128
7538
|
return value;
|
|
7539
|
+
const fnIntegrity = functionIntegrity(lowerer, "freeze", value, argNode, locOf(call));
|
|
7540
|
+
if (fnIntegrity)
|
|
7541
|
+
return fnIntegrity;
|
|
7129
7542
|
const integrity = lowerClassIntegrity(lowerer, call, "freeze", value);
|
|
7130
7543
|
if (integrity)
|
|
7131
7544
|
return integrity;
|
|
7545
|
+
if (freezableRecordType(lowerer, value.type))
|
|
7546
|
+
return lowerNativeFreeze(lowerer, "record.freeze", value, locOf(call));
|
|
7547
|
+
if (value.type.kind === "array")
|
|
7548
|
+
return lowerNativeFreeze(lowerer, "array.freeze", value, locOf(call));
|
|
7549
|
+
if (value.type.kind === "map" || value.type.kind === "set")
|
|
7550
|
+
return lowerNativeFreeze(lowerer, "collection.preventExtensions", value, locOf(call));
|
|
7132
7551
|
lowerer.noLowering("Object.freeze of a possibly-aliased value", call, "freeze of a FRESH object/array literal (and of primitives) compiles — frozen-ness is unobservable there; an aliased target's later writes would need the runtime frozen bit");
|
|
7133
7552
|
}
|
|
7134
7553
|
// `Object.hasOwn(r, k)` over a RECORD receiver: a record's own-key set
|
|
@@ -7296,10 +7715,14 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
7296
7715
|
const isJsUnion = probed?.type.kind === "union" &&
|
|
7297
7716
|
isJsSourceFile(ts.getSourceFileOfNode(call)) &&
|
|
7298
7717
|
lowerer.dynConvertible(probed.type);
|
|
7718
|
+
// An array walks its live view: the present indices, then its numeric
|
|
7719
|
+
// and named properties.
|
|
7720
|
+
const isArray = probed?.type.kind === "array" && lowerer.dynConvertible(probed.type);
|
|
7299
7721
|
if (isDyn ||
|
|
7300
7722
|
isPrimitive ||
|
|
7301
7723
|
isFunction ||
|
|
7302
7724
|
isJsUnion ||
|
|
7725
|
+
isArray ||
|
|
7303
7726
|
(probed && isDynTypedRefType(probed.type))) {
|
|
7304
7727
|
const fn = member === "keys"
|
|
7305
7728
|
? "dyn.objKeys"
|
|
@@ -7308,7 +7731,13 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
7308
7731
|
: "dyn.objEntries";
|
|
7309
7732
|
let v = lowerer.lowerExpr(argNode);
|
|
7310
7733
|
if (v.type.kind !== "dyn")
|
|
7311
|
-
v = {
|
|
7734
|
+
v = {
|
|
7735
|
+
kind: "dynFrom",
|
|
7736
|
+
value: v,
|
|
7737
|
+
...(isArray ? { liveRef: true } : {}),
|
|
7738
|
+
type: DYN,
|
|
7739
|
+
loc: locOf(call),
|
|
7740
|
+
};
|
|
7312
7741
|
// In TypeScript the keys come back as a native string[] and the
|
|
7313
7742
|
// entries as a native [string, any][]: the checker keeps every later
|
|
7314
7743
|
// write to the arrays well typed. JavaScript may store anything into
|
|
@@ -7445,7 +7874,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
7445
7874
|
const key = `obj.${member}:${argIr.shapeId}:${typeKey(resultT)}`;
|
|
7446
7875
|
let helper = lowerer.arrHofHelpers.get(key);
|
|
7447
7876
|
if (!helper) {
|
|
7448
|
-
helper = `%obj.${member}
|
|
7877
|
+
helper = keyedHelperName(lowerer, `%obj.${member}`, key);
|
|
7449
7878
|
const recT = argIr;
|
|
7450
7879
|
const ref = { kind: "varRef", localId: "r.0", type: recT, loc };
|
|
7451
7880
|
const outRef = { kind: "varRef", localId: "out.0", type: resultT, loc };
|
|
@@ -7471,8 +7900,10 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
7471
7900
|
loc,
|
|
7472
7901
|
},
|
|
7473
7902
|
];
|
|
7474
|
-
|
|
7475
|
-
|
|
7903
|
+
// One walk per key order (see perKeyOrder).
|
|
7904
|
+
const orders = shapeKeyOrders(current);
|
|
7905
|
+
const walks = orders.map(() => []);
|
|
7906
|
+
for (const [k, name] of orders.flatMap((order, k) => order.map((name) => [k, name]))) {
|
|
7476
7907
|
const f = current.fields.find((x) => x.name === name);
|
|
7477
7908
|
const raw = {
|
|
7478
7909
|
kind: "recordGet",
|
|
@@ -7627,8 +8058,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
7627
8058
|
loc,
|
|
7628
8059
|
};
|
|
7629
8060
|
}
|
|
7630
|
-
|
|
8061
|
+
walks[k].push(stmt);
|
|
7631
8062
|
}
|
|
8063
|
+
body.push(...perKeyOrder(current, ref, walks, loc));
|
|
7632
8064
|
body.push({ kind: "return", value: outRef, loc });
|
|
7633
8065
|
fn.body = body;
|
|
7634
8066
|
};
|
|
@@ -7863,7 +8295,17 @@ export function lowerRecordFieldCall(lowerer, call, access) {
|
|
|
7863
8295
|
// A HYBRID (function-with-properties) field is callable through its
|
|
7864
8296
|
// reserved %call slot — `colors.blue("x")` where blue also carries
|
|
7865
8297
|
// `.bold` (the chalk shape).
|
|
7866
|
-
if (callee.type.kind === "
|
|
8298
|
+
if (callee.type.kind === "object" && !init) {
|
|
8299
|
+
const direct = callableInstanceStringCall(lowerer, call, callee, loc);
|
|
8300
|
+
if (direct)
|
|
8301
|
+
return direct;
|
|
8302
|
+
// Other argument counts call the %call closure through its value, as
|
|
8303
|
+
// a call on the builder itself does (`theme.error("a", "b")`).
|
|
8304
|
+
const closure = lowerer.hybridCallUnwrap(callee);
|
|
8305
|
+
if (closure !== callee)
|
|
8306
|
+
return lowerCallThroughValue(lowerer, call, closure, loc);
|
|
8307
|
+
}
|
|
8308
|
+
if (callee.type.kind === "record" || callee.type.kind === "object")
|
|
7867
8309
|
callee = lowerer.hybridCallUnwrap(callee);
|
|
7868
8310
|
// Inferred JavaScript option records can retain checked callables in
|
|
7869
8311
|
// fields even when the checker only describes those members as any.
|
|
@@ -8008,7 +8450,7 @@ function lowerInlineArrowBind(lowerer, call, access) {
|
|
|
8008
8450
|
const length = firstDefault < 0 ? arrow.parameters.nodes.length : firstDefault;
|
|
8009
8451
|
const key = `arrow.bind:${typeKey(type)}:${length}`;
|
|
8010
8452
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
8011
|
-
const name = existing ??
|
|
8453
|
+
const name = existing ?? keyedHelperName(lowerer, "%arrow.bind", key);
|
|
8012
8454
|
if (!existing) {
|
|
8013
8455
|
lowerer.arrHofHelpers.set(key, name);
|
|
8014
8456
|
lowerer.freshClosureAdapters.add(name);
|
|
@@ -8439,7 +8881,9 @@ export function lowerObjectMethodCall(lowerer, call, access) {
|
|
|
8439
8881
|
// so both guards would pass an emitter-named call).
|
|
8440
8882
|
if (info &&
|
|
8441
8883
|
!found &&
|
|
8442
|
-
(STREAM_API_MEMBERS.has(access.name.text) ||
|
|
8884
|
+
(STREAM_API_MEMBERS.has(access.name.text) ||
|
|
8885
|
+
STREAM_OPERATORS.has(access.name.text) ||
|
|
8886
|
+
access.name.text === "compose") &&
|
|
8443
8887
|
streamSidesOf(lowerer, info) !== null) {
|
|
8444
8888
|
const stream = lowerStreamMethodCall(lowerer, call, access, info);
|
|
8445
8889
|
if (stream)
|
|
@@ -8462,6 +8906,10 @@ export function lowerObjectMethodCall(lowerer, call, access) {
|
|
|
8462
8906
|
if (info && !found && eventTargetApiMethod(info, access.name.text)) {
|
|
8463
8907
|
return lowerEventTargetMethodCall(lowerer, call, access, info, lowerReceiver());
|
|
8464
8908
|
}
|
|
8909
|
+
// The Date methods a class declared `extends Date` does not declare.
|
|
8910
|
+
if (info && !found && dateRootOf(info) && isDatePrototypeMethod(access.name.text)) {
|
|
8911
|
+
return lowerInheritedDateMethodCall(lowerer, call, access.name.text, info, lowerReceiver());
|
|
8912
|
+
}
|
|
8465
8913
|
// GENERIC methods (own type parameters) never enter the methods table:
|
|
8466
8914
|
// they monomorphize per call site and dispatch statically
|
|
8467
8915
|
// (lowerClassGenericMethodCall has the exactness rules).
|
|
@@ -8636,7 +9084,23 @@ export function lowerObjectMethodCall(lowerer, call, access) {
|
|
|
8636
9084
|
type: found.sig.ret,
|
|
8637
9085
|
loc,
|
|
8638
9086
|
};
|
|
8639
|
-
|
|
9087
|
+
// The declaring class's original value, built with the observed slot.
|
|
9088
|
+
// An override below (a virtual call) keeps the dynamic call: a slot
|
|
9089
|
+
// reassigned to an ancestor's method must not reach the override. So do
|
|
9090
|
+
// methods declared in unchecked JavaScript, whose results are inferred,
|
|
9091
|
+
// and calls with a spread argument: the dynamic call drains the spread
|
|
9092
|
+
// through the iterator's current `next`, which may be a replacement.
|
|
9093
|
+
const declarerFile = found.declarer.decl ? ts.getSourceFileOfNode(found.declarer.decl) : null;
|
|
9094
|
+
const original = virtual ||
|
|
9095
|
+
call.arguments.nodes.some(ts.isSpreadElement) ||
|
|
9096
|
+
!declarerFile ||
|
|
9097
|
+
(isJsSourceFile(declarerFile) && !lowerer.checkedJsFile(declarerFile))
|
|
9098
|
+
? undefined
|
|
9099
|
+
: {
|
|
9100
|
+
originalId: () => found.declarer.prototypeOriginals?.get(method),
|
|
9101
|
+
directCall: () => fallback,
|
|
9102
|
+
};
|
|
9103
|
+
const result = classCallbackCall(lowerer, value, method, call.arguments.nodes, fallback, loc, ts.getTextOfNode(access), original);
|
|
8640
9104
|
return {
|
|
8641
9105
|
kind: "seqExpr",
|
|
8642
9106
|
stmts: [{ kind: "varDecl", localId: local.id, init: receiver, loc }],
|
|
@@ -8820,7 +9284,7 @@ function lowerUnionObjectDynFieldCall(lowerer, call, access, receiverT) {
|
|
|
8820
9284
|
const receiverRef = varRef(receiverLocal.id, receiverT, loc);
|
|
8821
9285
|
let helper = lowerer.unionCallHelpers.get(key);
|
|
8822
9286
|
if (!helper) {
|
|
8823
|
-
helper =
|
|
9287
|
+
helper = keyedHelperName(lowerer, "%union.call", key);
|
|
8824
9288
|
lowerer.unionCallHelpers.set(key, helper);
|
|
8825
9289
|
const receiverRef = varRef("this.0", receiverT, loc);
|
|
8826
9290
|
const branch = (plan) => {
|
|
@@ -8900,7 +9364,7 @@ function unionObjectMethodHelper(lowerer, sourceCall, receiverT, method, plans,
|
|
|
8900
9364
|
const existing = lowerer.unionCallHelpers.get(key);
|
|
8901
9365
|
if (existing)
|
|
8902
9366
|
return existing;
|
|
8903
|
-
const name =
|
|
9367
|
+
const name = keyedHelperName(lowerer, "%union.call", key);
|
|
8904
9368
|
lowerer.unionCallHelpers.set(key, name);
|
|
8905
9369
|
// A probe that catches a refusal while the body lowers must not leave
|
|
8906
9370
|
// the name registered for a helper that was never emitted.
|
|
@@ -9005,15 +9469,17 @@ function loweredArgumentText(lowerer, arg) {
|
|
|
9005
9469
|
* fences; null when the argument shape has no static form (the caller
|
|
9006
9470
|
* reports the SC2012 refusal). */
|
|
9007
9471
|
export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
|
|
9008
|
-
if (name === "parseInt" || name === "isNaN") {
|
|
9472
|
+
if (name === "parseInt" || name === "isNaN" || name === "isFinite") {
|
|
9009
9473
|
const maxArgs = name === "parseInt" ? 2 : 1;
|
|
9010
9474
|
if (args.length < 1 || args.length > maxArgs) {
|
|
9011
9475
|
lowerer.noLowering(`${name} with ${args.length} argument${args.length === 1 ? "" : "s"}`, call);
|
|
9012
9476
|
}
|
|
9013
|
-
if (name === "isNaN") {
|
|
9014
|
-
// The global's ToNumber turns a missing value into NaN
|
|
9477
|
+
if (name === "isNaN" || name === "isFinite") {
|
|
9478
|
+
// The global's ToNumber turns a missing value into NaN, converts
|
|
9479
|
+
// strings, booleans and null, and calls valueOf/toString on objects.
|
|
9015
9480
|
const x = lowerToNumberArgument(lowerer, args[0]);
|
|
9016
|
-
|
|
9481
|
+
const fn = name === "isNaN" ? "num.isNaN" : "number.isFinite";
|
|
9482
|
+
return { kind: "libCall", fn, args: [x], type: BOOL, loc };
|
|
9017
9483
|
}
|
|
9018
9484
|
const radix = args[1]
|
|
9019
9485
|
? lowerer.lowerExprExpecting(args[1], F64)
|
|
@@ -9050,7 +9516,7 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
|
|
|
9050
9516
|
const key = `parseInt.optional:${unionT.unionId}`;
|
|
9051
9517
|
let helper = lowerer.valueHelpers.get(key);
|
|
9052
9518
|
if (!helper) {
|
|
9053
|
-
helper =
|
|
9519
|
+
helper = keyedHelperName(lowerer, "%parseInt.optional", key);
|
|
9054
9520
|
lowerer.valueHelpers.set(key, helper);
|
|
9055
9521
|
const value = { kind: "varRef", localId: "value.0", type: unionT, loc };
|
|
9056
9522
|
const radixRef = { kind: "varRef", localId: "radix.0", type: F64, loc };
|
|
@@ -9139,27 +9605,32 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
|
|
|
9139
9605
|
: lowerer.lowerExprExpecting(args[0], STRING);
|
|
9140
9606
|
return { kind: "libCall", fn: "num.parseInt", args: [s, radix], type: F64, loc };
|
|
9141
9607
|
}
|
|
9142
|
-
//
|
|
9143
|
-
//
|
|
9144
|
-
//
|
|
9145
|
-
|
|
9146
|
-
|
|
9147
|
-
|
|
9148
|
-
|
|
9149
|
-
|
|
9150
|
-
|
|
9151
|
-
|
|
9152
|
-
|
|
9153
|
-
|
|
9154
|
-
|
|
9155
|
-
|
|
9156
|
-
|
|
9608
|
+
// parseFloat takes one argument; Node ignores the rest after evaluating
|
|
9609
|
+
// them (`parseFloat(text, 10)`). Literal and identifier extras have
|
|
9610
|
+
// nothing to evaluate.
|
|
9611
|
+
if (name === "parseFloat" &&
|
|
9612
|
+
args.length > 1 &&
|
|
9613
|
+
args
|
|
9614
|
+
.slice(1)
|
|
9615
|
+
.every((arg) => ts.isNumericLiteral(arg) || ts.isStringLiteral(arg) || ts.isIdentifier(arg)))
|
|
9616
|
+
return lowerStaticNumberGlobal(lowerer, name, call, args.slice(0, 1), loc);
|
|
9617
|
+
// STATIC parseFloat over string arguments — parseInt's sibling
|
|
9618
|
+
// (num.parseFloat is ECMA 19.2.4's decimal-literal prefix parse in
|
|
9619
|
+
// scr_string.c). Other argument types retain their native coercion
|
|
9620
|
+
// checks or the SC2012 refusal. The probe never emits — lowering is IR
|
|
9621
|
+
// construction.
|
|
9622
|
+
if (name === "parseFloat" && args.length === 1) {
|
|
9623
|
+
const optional = optionalCallValue(lowerer, args[0]);
|
|
9624
|
+
if (optional) {
|
|
9625
|
+
const parsed = lowerOptionalStringNumber(lowerer, optional, loc, "num.parseFloat", "parseFloat");
|
|
9626
|
+
if (parsed)
|
|
9627
|
+
return parsed;
|
|
9157
9628
|
}
|
|
9158
9629
|
const probed = tryLowerExpression(lowerer, args[0]);
|
|
9159
|
-
if (
|
|
9630
|
+
if (probed?.type.kind === "string") {
|
|
9160
9631
|
return { kind: "libCall", fn: "num.parseFloat", args: [probed], type: F64, loc };
|
|
9161
9632
|
}
|
|
9162
|
-
if (
|
|
9633
|
+
if (probed?.type.kind === "dyn") {
|
|
9163
9634
|
return {
|
|
9164
9635
|
kind: "libCall",
|
|
9165
9636
|
fn: "num.parseFloat",
|
|
@@ -9168,29 +9639,38 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
|
|
|
9168
9639
|
loc,
|
|
9169
9640
|
};
|
|
9170
9641
|
}
|
|
9171
|
-
if (name === "isFinite" && probed?.type.kind === "f64") {
|
|
9172
|
-
return { kind: "libCall", fn: "number.isFinite", args: [probed], type: BOOL, loc };
|
|
9173
|
-
}
|
|
9174
|
-
// A number the checker trusts but storage may hold missing (an
|
|
9175
|
-
// out-of-range read): the global's ToNumber makes undefined NaN.
|
|
9176
|
-
if (name === "isFinite" &&
|
|
9177
|
-
probed?.type.kind === "union" &&
|
|
9178
|
-
lowerer.armTag(probed.type.unionId, UNDEFINED_T) >= 0 &&
|
|
9179
|
-
lowerer.stripUndefinedArm(probed.type).kind === "f64") {
|
|
9180
|
-
const x = lowerOptionalNumber(lowerer, probed, loc, args[0]);
|
|
9181
|
-
return { kind: "libCall", fn: "number.isFinite", args: [x], type: BOOL, loc };
|
|
9182
|
-
}
|
|
9183
9642
|
}
|
|
9184
9643
|
return null;
|
|
9185
9644
|
}
|
|
9186
|
-
/** `crypto.getRandomValues(view)` on the
|
|
9187
|
-
|
|
9188
|
-
|
|
9645
|
+
/** `crypto.getRandomValues(view)` and `crypto.randomUUID()` on the
|
|
9646
|
+
* WebCrypto global or webcrypto. Other argument counts (JavaScript only)
|
|
9647
|
+
* invoke the dynamic object's method, which ignores extra arguments and
|
|
9648
|
+
* throws Node's missing-argument TypeError. */
|
|
9649
|
+
function lowerWebCryptoMethodCall(lowerer, call, access) {
|
|
9650
|
+
const member = access.name.text;
|
|
9651
|
+
if ((member !== "getRandomValues" && member !== "randomUUID") ||
|
|
9189
9652
|
call.questionDotToken ||
|
|
9190
9653
|
access.questionDotToken ||
|
|
9191
9654
|
!isWebCryptoReceiver(lowerer, access.expression))
|
|
9192
9655
|
return null;
|
|
9193
|
-
|
|
9656
|
+
const args = call.arguments.nodes;
|
|
9657
|
+
if (member === "getRandomValues" && args.length === 1) {
|
|
9658
|
+
return lowerCryptoGetRandomValues(lowerer, call);
|
|
9659
|
+
}
|
|
9660
|
+
if (member === "randomUUID" && args.length === 0) {
|
|
9661
|
+
return { kind: "libCall", fn: "crypto.randomUUID", args: [], type: STRING, loc: locOf(call) };
|
|
9662
|
+
}
|
|
9663
|
+
if (args.some(ts.isSpreadElement))
|
|
9664
|
+
return null;
|
|
9665
|
+
return {
|
|
9666
|
+
kind: "dynInvoke",
|
|
9667
|
+
recv: lowerer.lowerExprExpecting(access.expression, DYN),
|
|
9668
|
+
method: member,
|
|
9669
|
+
calleeName: v8CalleeText(access),
|
|
9670
|
+
args: args.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
|
|
9671
|
+
type: DYN,
|
|
9672
|
+
loc: locOf(call),
|
|
9673
|
+
};
|
|
9194
9674
|
}
|
|
9195
9675
|
/** A then handler's promise-armed result (`.then(() => cached ?? load())`
|
|
9196
9676
|
* typed `T | Promise<T>`, or a `Promise<void> | void` callback's result):
|
|
@@ -9293,4 +9773,174 @@ function lowerObjectAssignOntoError(lowerer, call) {
|
|
|
9293
9773
|
loc,
|
|
9294
9774
|
};
|
|
9295
9775
|
}
|
|
9776
|
+
/** `Object.freeze(fn)` and the other integrity operations on a function
|
|
9777
|
+
* value: the function's checked-dynamic face holds its own properties (the
|
|
9778
|
+
* ones a program assigns, `name`, `length`, `prototype`) and their
|
|
9779
|
+
* integrity state, which the runtime keeps on its property table. The
|
|
9780
|
+
* mutators answer the function itself; the queries answer from the table.
|
|
9781
|
+
* Null for other values. */
|
|
9782
|
+
function functionIntegrity(lowerer, member, value, node, loc) {
|
|
9783
|
+
if (value.type.kind !== "func" || !lowerer.dynConvertible(value.type))
|
|
9784
|
+
return null;
|
|
9785
|
+
const operations = {
|
|
9786
|
+
freeze: "dyn.freeze",
|
|
9787
|
+
seal: "dyn.seal",
|
|
9788
|
+
preventExtensions: "dyn.preventExtensions",
|
|
9789
|
+
isSealed: "dyn.isSealed",
|
|
9790
|
+
isExtensible: "dyn.isExtensible",
|
|
9791
|
+
};
|
|
9792
|
+
if (!(member in operations))
|
|
9793
|
+
return null;
|
|
9794
|
+
const fn = operations[member];
|
|
9795
|
+
// The first operation on a function creates its property table, whose
|
|
9796
|
+
// `name` comes from the box: give the box the function's JS name, as a
|
|
9797
|
+
// closure flowing into any checked-dynamic slot gets.
|
|
9798
|
+
const name = jsFuncNameOf(node, lowerer);
|
|
9799
|
+
const boxed = (e) => {
|
|
9800
|
+
const box = lowerer.coerceToExpected(e, DYN);
|
|
9801
|
+
return box.kind === "dynFrom" && name !== null ? { ...box, fnName: name } : box;
|
|
9802
|
+
};
|
|
9803
|
+
if (fn === "dyn.isSealed" || fn === "dyn.isExtensible") {
|
|
9804
|
+
return { kind: "libCall", fn, args: [boxed(value)], type: BOOL, loc };
|
|
9805
|
+
}
|
|
9806
|
+
const held = lowerer.declareHiddenLocal("%integrityFn", value.type);
|
|
9807
|
+
const ref = () => ({ kind: "varRef", localId: held.id, type: value.type, loc });
|
|
9808
|
+
return {
|
|
9809
|
+
kind: "seqExpr",
|
|
9810
|
+
stmts: [
|
|
9811
|
+
{ kind: "varDecl", localId: held.id, init: value, loc },
|
|
9812
|
+
{
|
|
9813
|
+
kind: "exprStmt",
|
|
9814
|
+
expr: { kind: "libCall", fn, args: [boxed(ref())], type: DYN, loc },
|
|
9815
|
+
loc,
|
|
9816
|
+
},
|
|
9817
|
+
],
|
|
9818
|
+
result: ref(),
|
|
9819
|
+
type: value.type,
|
|
9820
|
+
loc,
|
|
9821
|
+
};
|
|
9822
|
+
}
|
|
9823
|
+
/** A class instance copied into a fresh object (`Object.assign({},
|
|
9824
|
+
* instance)`): the result is a plain object holding the instance's own
|
|
9825
|
+
* fields, never an instance, so a result the checker types as the class has
|
|
9826
|
+
* no representation (the checked cast would throw). */
|
|
9827
|
+
function fenceClassCopyIntoFreshObject(lowerer, call, srcNode, rawSource) {
|
|
9828
|
+
if (rawSource.type.kind !== "object" || ts.isExpressionStatement(call.parent))
|
|
9829
|
+
return;
|
|
9830
|
+
const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
|
|
9831
|
+
if (resultT === null || resultT.kind !== "object")
|
|
9832
|
+
return;
|
|
9833
|
+
lowerer.unsupported("SC1090", srcNode, `Object.assign copying a '${lowerer.fmt(rawSource.type)}' instance into a fresh object typed as the class (the copy is a plain object holding the instance's own fields, not an instance — build the object literal from the fields you need)`);
|
|
9834
|
+
}
|
|
9835
|
+
/** True when an untyped JavaScript receiver names a binding whose declaring
|
|
9836
|
+
* file assigns it an own `toString` (the TypeScript namespace downlevel
|
|
9837
|
+
* `errorUtil.toString = (message) => ...` in zod): its calls answer what
|
|
9838
|
+
* that function returns, not Object.prototype.toString's string. */
|
|
9839
|
+
function jsAssignsOwnToString(lowerer, receiver) {
|
|
9840
|
+
if (!ts.isIdentifier(receiver))
|
|
9841
|
+
return false;
|
|
9842
|
+
const decl = bindingDeclaration(lowerer, receiver);
|
|
9843
|
+
if (decl === undefined)
|
|
9844
|
+
return false;
|
|
9845
|
+
const sf = ts.getSourceFileOfNode(decl);
|
|
9846
|
+
if (!isJsSourceFile(sf))
|
|
9847
|
+
return false;
|
|
9848
|
+
let targets = lowerer.ownToStringTargets.get(sf);
|
|
9849
|
+
if (targets === undefined) {
|
|
9850
|
+
targets = ownToStringTargets(lowerer, sf);
|
|
9851
|
+
lowerer.ownToStringTargets.set(sf, targets);
|
|
9852
|
+
}
|
|
9853
|
+
return targets.has(decl);
|
|
9854
|
+
}
|
|
9855
|
+
const unparenthesized = (e) => {
|
|
9856
|
+
let out = e;
|
|
9857
|
+
while (ts.isParenthesizedExpression(out))
|
|
9858
|
+
out = out.expression;
|
|
9859
|
+
return out;
|
|
9860
|
+
};
|
|
9861
|
+
/** The declaration of the binding an identifier names, through imports. */
|
|
9862
|
+
function bindingDeclaration(lowerer, id) {
|
|
9863
|
+
let sym = lowerer.checker.getSymbolAtLocation(id);
|
|
9864
|
+
if (sym !== undefined && (sym.flags & ts.SymbolFlags.Alias) !== 0)
|
|
9865
|
+
sym = lowerer.checker.getAliasedSymbol(sym);
|
|
9866
|
+
return sym?.valueDeclaration ?? sym?.declarations?.[0];
|
|
9867
|
+
}
|
|
9868
|
+
/** The declarations of the bindings a file's assignments `x.toString = ...`
|
|
9869
|
+
* (or `x["toString"] = ...`) give an own `toString`. An assignment through
|
|
9870
|
+
* the parameter of an immediately called function counts for the binding
|
|
9871
|
+
* the call passes (`(function (ns) { ns.toString = f; })(ns || (ns = {}))`). */
|
|
9872
|
+
function ownToStringTargets(lowerer, sf) {
|
|
9873
|
+
const targets = new Set();
|
|
9874
|
+
const visit = (node) => {
|
|
9875
|
+
if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
|
|
9876
|
+
const left = unparenthesized(node.left);
|
|
9877
|
+
const named = (ts.isPropertyAccessExpression(left) && left.name.text === "toString") ||
|
|
9878
|
+
(ts.isElementAccessExpression(left) &&
|
|
9879
|
+
ts.isStringLiteralLike(left.argumentExpression) &&
|
|
9880
|
+
left.argumentExpression.text === "toString");
|
|
9881
|
+
const target = named
|
|
9882
|
+
? unparenthesized(left.expression)
|
|
9883
|
+
: undefined;
|
|
9884
|
+
if (target !== undefined && ts.isIdentifier(target)) {
|
|
9885
|
+
const decl = bindingDeclaration(lowerer, target);
|
|
9886
|
+
if (decl !== undefined) {
|
|
9887
|
+
targets.add(decl);
|
|
9888
|
+
const passed = iifeArgumentDeclaration(lowerer, decl);
|
|
9889
|
+
if (passed !== undefined)
|
|
9890
|
+
targets.add(passed);
|
|
9891
|
+
}
|
|
9892
|
+
}
|
|
9893
|
+
}
|
|
9894
|
+
ts.forEachChild(node, visit);
|
|
9895
|
+
};
|
|
9896
|
+
visit(sf);
|
|
9897
|
+
return targets;
|
|
9898
|
+
}
|
|
9899
|
+
/** For a parameter of an immediately called function, the declaration of
|
|
9900
|
+
* the binding its argument names: `x`, `x || (x = {})` or `(x = {})`. */
|
|
9901
|
+
function iifeArgumentDeclaration(lowerer, param) {
|
|
9902
|
+
if (!ts.isParameter(param))
|
|
9903
|
+
return undefined;
|
|
9904
|
+
const fn = param.parent;
|
|
9905
|
+
if (!ts.isFunctionExpression(fn) && !ts.isArrowFunction(fn))
|
|
9906
|
+
return undefined;
|
|
9907
|
+
let callee = fn;
|
|
9908
|
+
while (ts.isParenthesizedExpression(callee.parent))
|
|
9909
|
+
callee = callee.parent;
|
|
9910
|
+
const call = callee.parent;
|
|
9911
|
+
if (!ts.isCallExpression(call) || call.expression !== callee)
|
|
9912
|
+
return undefined;
|
|
9913
|
+
const index = fn.parameters.nodes.indexOf(param);
|
|
9914
|
+
let arg = index < 0 ? undefined : call.arguments.nodes[index];
|
|
9915
|
+
if (arg === undefined)
|
|
9916
|
+
return undefined;
|
|
9917
|
+
arg = unparenthesized(arg);
|
|
9918
|
+
if (ts.isBinaryExpression(arg) && arg.operatorToken.kind === ts.SyntaxKind.BarBarToken)
|
|
9919
|
+
arg = unparenthesized(arg.left);
|
|
9920
|
+
if (ts.isBinaryExpression(arg) && arg.operatorToken.kind === ts.SyntaxKind.EqualsToken)
|
|
9921
|
+
arg = unparenthesized(arg.left);
|
|
9922
|
+
return ts.isIdentifier(arg) ? bindingDeclaration(lowerer, arg) : undefined;
|
|
9923
|
+
}
|
|
9924
|
+
/** The runtime calls package shims declare as bodiless functions. */
|
|
9925
|
+
const SHIM_INTRINSICS = new Map([
|
|
9926
|
+
["scriptcUnixDgramSocket", { fn: "dgram.unixSocket", args: [], ret: F64 }],
|
|
9927
|
+
["scriptcUnixDgramConnect", { fn: "dgram.unixConnect", args: [F64, STRING], ret: F64 }],
|
|
9928
|
+
["scriptcUnixDgramSend", { fn: "dgram.unixSend", args: [F64, BYTES_U8], ret: F64 }],
|
|
9929
|
+
["scriptcUnixDgramClose", { fn: "dgram.unixClose", args: [F64], ret: F64 }],
|
|
9930
|
+
["scriptcResponseLight", { fn: "fetch.responseLight", args: [DYN], ret: arrayOf(STRING) }],
|
|
9931
|
+
]);
|
|
9932
|
+
function lowerShimIntrinsicCall(lowerer, expr, callee, loc) {
|
|
9933
|
+
const intrinsic = SHIM_INTRINSICS.get(callee.text);
|
|
9934
|
+
if (intrinsic === undefined)
|
|
9935
|
+
return null;
|
|
9936
|
+
const decl = lowerer.checker.getSymbolAtLocation(callee)?.valueDeclaration;
|
|
9937
|
+
if (decl === undefined ||
|
|
9938
|
+
!ts.isFunctionDeclaration(decl) ||
|
|
9939
|
+
decl.body ||
|
|
9940
|
+
!isPackageShimFile(ts.getSourceFileOfNode(decl).fileName) ||
|
|
9941
|
+
expr.arguments.nodes.length !== intrinsic.args.length)
|
|
9942
|
+
return null;
|
|
9943
|
+
const args = expr.arguments.nodes.map((arg, i) => lowerer.lowerExprExpecting(arg, intrinsic.args[i]));
|
|
9944
|
+
return { kind: "libCall", fn: intrinsic.fn, args, type: intrinsic.ret, loc };
|
|
9945
|
+
}
|
|
9296
9946
|
//# sourceMappingURL=lower-calls.js.map
|