@scriptc/compiler 0.3.5 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/scriptc-node-fallback.d.ts +960 -82
- package/ambient/scriptc.d.ts +134 -0
- package/dist/backend/cycle-analysis.d.ts +1 -1
- package/dist/backend/cycle-analysis.js +1 -0
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +13 -1
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.js +16 -5
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +13 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.test.js +1 -1
- package/dist/backend/library-pack.js +6 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +41 -4
- package/dist/backend/llvm/alloc.js +138 -7
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/alloc.test.js +30 -1
- package/dist/backend/llvm/alloc.test.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.test.js +1 -1
- package/dist/backend/llvm/array-search.test.js +1 -1
- package/dist/backend/llvm/blocks.d.ts +8 -0
- package/dist/backend/llvm/blocks.js +43 -1
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/blocks.test.js +22 -1
- package/dist/backend/llvm/blocks.test.js.map +1 -1
- package/dist/backend/llvm/byte-numbers.js +15 -5
- package/dist/backend/llvm/byte-numbers.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +14 -0
- package/dist/backend/llvm/bytes-alias.js +20 -0
- package/dist/backend/llvm/bytes-alias.js.map +1 -0
- package/dist/backend/llvm/bytes-loop-versions.d.ts +86 -0
- package/dist/backend/llvm/bytes-loop-versions.js +506 -0
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -0
- package/dist/backend/llvm/bytes-loop-versions.test.d.ts +1 -0
- package/dist/backend/llvm/bytes-loop-versions.test.js +244 -0
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.js +50 -1
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +34 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/checked-narrows.test.js +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.js +4 -1
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +11 -0
- package/dist/backend/llvm/classes.js +71 -14
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +58 -8
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.js +1 -0
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +5 -1
- package/dist/backend/llvm/constant-callbacks.js +55 -12
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +88 -1
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +4 -0
- package/dist/backend/llvm/counted-loops.js +37 -0
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +12 -3
- package/dist/backend/llvm/dense-array-access.js +72 -14
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +59 -3
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +51 -0
- package/dist/backend/llvm/dense-array-loops.js +162 -0
- package/dist/backend/llvm/dense-array-loops.js.map +1 -0
- package/dist/backend/llvm/dense-array-loops.test.d.ts +1 -0
- package/dist/backend/llvm/dense-array-loops.test.js +128 -0
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -0
- package/dist/backend/llvm/dyn-handle-tags.test.d.ts +1 -0
- package/dist/backend/llvm/dyn-handle-tags.test.js +38 -0
- package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +28 -4
- package/dist/backend/llvm/dyn.js +324 -179
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.d.ts +64 -0
- package/dist/backend/llvm/emit-function.js +1190 -0
- package/dist/backend/llvm/emit-function.js.map +1 -0
- package/dist/backend/llvm/emit-module.d.ts +24 -0
- package/dist/backend/llvm/emit-module.js +1535 -0
- package/dist/backend/llvm/emit-module.js.map +1 -0
- package/dist/backend/llvm/emit-statements.d.ts +58 -0
- package/dist/backend/llvm/emit-statements.js +1964 -0
- package/dist/backend/llvm/emit-statements.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +576 -268
- package/dist/backend/llvm/emitter.js +801 -4447
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +57 -3
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +73 -46
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-async.test.js +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +2 -0
- package/dist/backend/llvm/expr-bytes.js +76 -29
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +6 -2
- package/dist/backend/llvm/expr-callbacks.js +48 -11
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +1 -1
- package/dist/backend/llvm/expr-calls.js +71 -53
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-calls.test.js +1 -1
- package/dist/backend/llvm/expr-containers.js +39 -15
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +16 -16
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.js +1 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.d.ts +3 -0
- package/dist/backend/llvm/expr-dynamic.js +92 -63
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +132 -25
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +2 -2
- package/dist/backend/llvm/expr-records.d.ts +1 -1
- package/dist/backend/llvm/expr-records.js +32 -11
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +54 -12
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +22 -1
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/int32-abi.test.js +2 -2
- package/dist/backend/llvm/integer-clones.test.js +3 -3
- package/dist/backend/llvm/integer-remainder.d.ts +34 -13
- package/dist/backend/llvm/integer-remainder.js +156 -22
- package/dist/backend/llvm/integer-remainder.js.map +1 -1
- package/dist/backend/llvm/intern-tables.test.js +1 -1
- package/dist/backend/llvm/jsval-encoding.d.ts +21 -0
- package/dist/backend/llvm/jsval-encoding.js +20 -0
- package/dist/backend/llvm/jsval-encoding.js.map +1 -0
- package/dist/backend/llvm/jsval.d.ts +12 -0
- package/dist/backend/llvm/jsval.js +488 -0
- package/dist/backend/llvm/jsval.js.map +1 -0
- package/dist/backend/llvm/lazy-captures.d.ts +12 -2
- package/dist/backend/llvm/lazy-captures.js +39 -17
- package/dist/backend/llvm/lazy-captures.js.map +1 -1
- package/dist/backend/llvm/lib-abi.js +1 -1
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-connect.js +1 -1
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +14 -8
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +217 -24
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +102 -13
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +3 -3
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +2 -2
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +77 -25
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +100 -50
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.d.ts +12 -0
- package/dist/backend/llvm/lib-shared.js +229 -5
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +46 -16
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-test.js +57 -8
- package/dist/backend/llvm/lib-test.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +4 -9
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +2 -2
- package/dist/backend/llvm/local-array-reads.test.js +1 -1
- package/dist/backend/llvm/local-extents.d.ts +19 -0
- package/dist/backend/llvm/local-extents.js +169 -0
- package/dist/backend/llvm/local-extents.js.map +1 -0
- package/dist/backend/llvm/local-extents.test.d.ts +1 -0
- package/dist/backend/llvm/local-extents.test.js +92 -0
- package/dist/backend/llvm/local-extents.test.js.map +1 -0
- package/dist/backend/llvm/local-union-storage.js +7 -7
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +2 -2
- package/dist/backend/llvm/map-entry-fusion.test.js +1 -1
- package/dist/backend/llvm/map-number-lookup.js +2 -2
- package/dist/backend/llvm/map-number-lookup.test.js +2 -2
- package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
- package/dist/backend/llvm/narrow-guards.d.ts +38 -0
- package/dist/backend/llvm/narrow-guards.js +151 -0
- package/dist/backend/llvm/narrow-guards.js.map +1 -0
- package/dist/backend/llvm/nullable-unions.d.ts +70 -9
- package/dist/backend/llvm/nullable-unions.js +105 -6
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.test.d.ts +1 -0
- package/dist/backend/llvm/nullable-unions.test.js +65 -0
- package/dist/backend/llvm/nullable-unions.test.js.map +1 -0
- package/dist/backend/llvm/publish.d.ts +4 -0
- package/dist/backend/llvm/publish.js +14 -2
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.js +1 -1
- package/dist/backend/llvm/receivers.d.ts +31 -0
- package/dist/backend/llvm/receivers.js +395 -0
- package/dist/backend/llvm/receivers.js.map +1 -0
- package/dist/backend/llvm/record-results.d.ts +13 -2
- package/dist/backend/llvm/record-results.js +66 -6
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-effects.js +9 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +4 -0
- package/dist/backend/llvm/reference-writes.js +143 -6
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/reference-writes.test.d.ts +1 -0
- package/dist/backend/llvm/reference-writes.test.js +88 -0
- package/dist/backend/llvm/reference-writes.test.js.map +1 -0
- package/dist/backend/llvm/regex-matchers.d.ts +8 -0
- package/dist/backend/llvm/regex-matchers.js +33 -0
- package/dist/backend/llvm/regex-matchers.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.test.js +23 -1
- package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
- package/dist/backend/llvm/regions.d.ts +1 -1
- package/dist/backend/llvm/regions.js +9 -6
- package/dist/backend/llvm/regions.js.map +1 -1
- package/dist/backend/llvm/regions.test.js +1 -1
- package/dist/backend/llvm/shapes.d.ts +69 -43
- package/dist/backend/llvm/shapes.js +285 -21
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +37 -3
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +74 -0
- package/dist/backend/llvm/speculative-integers.js +571 -0
- package/dist/backend/llvm/speculative-integers.js.map +1 -0
- package/dist/backend/llvm/speculative-integers.test.d.ts +1 -0
- package/dist/backend/llvm/speculative-integers.test.js +148 -0
- package/dist/backend/llvm/speculative-integers.test.js.map +1 -0
- package/dist/backend/llvm/split-loops.js +2 -2
- package/dist/backend/llvm/split-loops.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +26 -6
- package/dist/backend/llvm/stack-objects.js +133 -10
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/stack-objects.test.js +55 -1
- package/dist/backend/llvm/stack-objects.test.js.map +1 -1
- package/dist/backend/llvm/stack-unions.test.js +1 -1
- package/dist/backend/llvm/string-construction.test.js +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +15 -14
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-slices.d.ts +25 -0
- package/dist/backend/llvm/string-slices.js +207 -1
- package/dist/backend/llvm/string-slices.js.map +1 -1
- package/dist/backend/llvm/string-slices.test.js +139 -2
- package/dist/backend/llvm/string-slices.test.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.test.js +2 -2
- package/dist/backend/llvm/thread-slots.d.ts +5 -0
- package/dist/backend/llvm/thread-slots.js +142 -0
- package/dist/backend/llvm/thread-slots.js.map +1 -0
- package/dist/backend/llvm/thread-slots.test.d.ts +1 -0
- package/dist/backend/llvm/thread-slots.test.js +110 -0
- package/dist/backend/llvm/thread-slots.test.js.map +1 -0
- package/dist/backend/llvm/union-repr.d.ts +7 -7
- package/dist/backend/llvm/union-repr.js +18 -2
- package/dist/backend/llvm/union-repr.js.map +1 -1
- package/dist/backend/llvm/union-retype.test.js +17 -3
- package/dist/backend/llvm/union-retype.test.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +2 -2
- package/dist/backend/llvm/walkers.js +51 -26
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wasm-modules.d.ts +16 -0
- package/dist/backend/llvm/wasm-modules.js +66 -0
- package/dist/backend/llvm/wasm-modules.js.map +1 -0
- package/dist/backend/llvm/wrapping-sums.d.ts +7 -0
- package/dist/backend/llvm/wrapping-sums.js +11 -3
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/mangle.d.ts +7 -0
- package/dist/backend/mangle.js +11 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/may-throw.d.ts +3 -0
- package/dist/backend/may-throw.js +6 -2
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +1 -1
- package/dist/backend/native/contracts.d.ts +37 -0
- package/dist/backend/native/executable.js +192 -134
- 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 +2 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +30 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/publication.test.js +1 -1
- package/dist/backend/runtime-pack-core.d.ts +9 -1
- package/dist/backend/runtime-pack-core.js +10 -1
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.js +1 -1
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-native.test.d.ts +1 -0
- package/dist/backend/runtime-pack-native.test.js +31 -0
- package/dist/backend/runtime-pack-native.test.js.map +1 -0
- package/dist/backend/runtime-pack-targets.test.js +5 -0
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +7 -3
- package/dist/backend/runtime-pack.js +12 -6
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +20 -6
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/stack-observations.d.ts +22 -0
- package/dist/backend/stack-observations.js +382 -0
- package/dist/backend/stack-observations.js.map +1 -0
- package/dist/backend/stack-observations.test.d.ts +1 -0
- package/dist/backend/stack-observations.test.js +233 -0
- package/dist/backend/stack-observations.test.js.map +1 -0
- package/dist/backend/target-diagnostics.js +8 -0
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +1 -1
- package/dist/backend/warm-cache.js +5 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/backend/young-nursery.d.ts +7 -0
- package/dist/backend/young-nursery.js +10 -0
- package/dist/backend/young-nursery.js.map +1 -0
- package/dist/cli/command.js +44 -4
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +11 -1
- package/dist/cli/usage.js +20 -1
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.js +10 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +13 -0
- package/dist/contracts/check.js +25 -6
- package/dist/contracts/check.js.map +1 -1
- package/dist/contracts/int32-elements.d.ts +115 -0
- package/dist/contracts/int32-elements.js +1179 -0
- package/dist/contracts/int32-elements.js.map +1 -0
- package/dist/coverage/report.d.ts +16 -0
- package/dist/coverage/report.js +182 -1
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +19 -6
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +2 -0
- package/dist/coverage/verdict-cache.js +12 -0
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/coverage/verdict-cache.test.js +2 -1
- package/dist/coverage/verdict-cache.test.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +11 -7
- package/dist/diagnostics/diagnostic.js +35 -23
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +39 -2
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/diagnostics/render.d.ts +7 -0
- package/dist/diagnostics/render.js +50 -13
- package/dist/diagnostics/render.js.map +1 -1
- package/dist/diagnostics/render.test.d.ts +1 -0
- package/dist/diagnostics/render.test.js +49 -0
- package/dist/diagnostics/render.test.js.map +1 -0
- package/dist/executable/executable-cache.d.ts +17 -0
- package/dist/executable/executable-cache.js +13 -1
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +7 -1
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +2 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +6 -1
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/builtin-modules.d.ts +16 -2
- package/dist/frontend/builtin-modules.js +40 -7
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/cjs-syntax.js +52 -51
- package/dist/frontend/cjs-syntax.js.map +1 -1
- package/dist/frontend/contract-types.d.ts +3 -0
- package/dist/frontend/contract-types.js +36 -7
- package/dist/frontend/contract-types.js.map +1 -1
- package/dist/frontend/experimental-import.d.ts +5 -1
- package/dist/frontend/experimental-import.js +26 -7
- package/dist/frontend/experimental-import.js.map +1 -1
- package/dist/frontend/fork-target.js +20 -22
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/fork-target.test.js +2 -1
- package/dist/frontend/fork-target.test.js.map +1 -1
- package/dist/frontend/function-completion.js +6 -6
- package/dist/frontend/function-completion.js.map +1 -1
- package/dist/frontend/helper-tokens.js +15 -3
- package/dist/frontend/helper-tokens.js.map +1 -1
- package/dist/frontend/helper-tokens.test.js +7 -1
- package/dist/frontend/helper-tokens.test.js.map +1 -1
- package/dist/frontend/inferred-js-diagnostics.js +14 -17
- package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +3 -0
- package/dist/frontend/input-tracker.js +32 -3
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/lib-contract.js +36 -32
- package/dist/frontend/lib-contract.js.map +1 -1
- package/dist/frontend/lib-exports.js +3 -3
- package/dist/frontend/lib-exports.js.map +1 -1
- package/dist/frontend/lowering/array-values.d.ts +8 -3
- package/dist/frontend/lowering/array-values.js +60 -11
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/assert-instances.js +4 -4
- package/dist/frontend/lowering/assert-instances.js.map +1 -1
- package/dist/frontend/lowering/assertion-identity.d.ts +12 -0
- package/dist/frontend/lowering/assertion-identity.js +70 -0
- package/dist/frontend/lowering/assertion-identity.js.map +1 -0
- package/dist/frontend/lowering/assertion-members.d.ts +28 -0
- package/dist/frontend/lowering/assertion-members.js +185 -0
- package/dist/frontend/lowering/assertion-members.js.map +1 -0
- package/dist/frontend/lowering/binding-analysis.js +27 -20
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtin-calls.js +72 -4
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtin-function-fences.d.ts +14 -0
- package/dist/frontend/lowering/builtin-function-fences.js +42 -0
- package/dist/frontend/lowering/builtin-function-fences.js.map +1 -0
- package/dist/frontend/lowering/builtins/arguments.js +1 -1
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/async-context.js +53 -52
- package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.js +6 -6
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
- package/dist/frontend/lowering/builtins/blob.js +8 -6
- package/dist/frontend/lowering/builtins/blob.js.map +1 -1
- package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +23 -0
- package/dist/frontend/lowering/builtins/builtin-class-dyn.js +156 -0
- package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -0
- package/dist/frontend/lowering/builtins/callable-aliases.js +45 -6
- package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-async.js +7 -7
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.d.ts +6 -4
- package/dist/frontend/lowering/builtins/child-process-methods.js +310 -57
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js +16 -10
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.d.ts +6 -4
- package/dist/frontend/lowering/builtins/child-process.js +85 -61
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/class-values.d.ts +60 -0
- package/dist/frontend/lowering/builtins/class-values.js +226 -0
- package/dist/frontend/lowering/builtins/class-values.js.map +1 -0
- package/dist/frontend/lowering/builtins/compression.d.ts +18 -0
- package/dist/frontend/lowering/builtins/compression.js +230 -52
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/constants.d.ts +9 -1
- package/dist/frontend/lowering/builtins/constants.js +28 -7
- package/dist/frontend/lowering/builtins/constants.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +19 -0
- package/dist/frontend/lowering/builtins/crypto.js +223 -38
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.d.ts +7 -1
- package/dist/frontend/lowering/builtins/dates.js +92 -16
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/disposable-stack.d.ts +18 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js +137 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -0
- package/dist/frontend/lowering/builtins/environment.js +3 -3
- package/dist/frontend/lowering/builtins/environment.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.d.ts +14 -10
- package/dist/frontend/lowering/builtins/errors.js +174 -6
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +4 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +136 -113
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.d.ts +8 -0
- package/dist/frontend/lowering/builtins/filesystem.js +213 -76
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-glob.js +3 -3
- package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-streams.js +10 -11
- package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
- package/dist/frontend/lowering/builtins/hash-stream.d.ts +12 -0
- package/dist/frontend/lowering/builtins/hash-stream.js +80 -0
- package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -0
- package/dist/frontend/lowering/builtins/ipc.js +45 -8
- package/dist/frontend/lowering/builtins/ipc.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +232 -24
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/key-object.js +4 -4
- package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-bindings.d.ts +8 -0
- package/dist/frontend/lowering/builtins/module-bindings.js +71 -22
- package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +67 -46
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-resolution.d.ts +4 -3
- package/dist/frontend/lowering/builtins/module-resolution.js +24 -23
- package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
- package/dist/frontend/lowering/builtins/navigator.d.ts +13 -0
- package/dist/frontend/lowering/builtins/navigator.js +40 -0
- package/dist/frontend/lowering/builtins/navigator.js.map +1 -0
- package/dist/frontend/lowering/builtins/net-address.d.ts +19 -0
- package/dist/frontend/lowering/builtins/net-address.js +156 -0
- package/dist/frontend/lowering/builtins/net-address.js.map +1 -0
- package/dist/frontend/lowering/builtins/numbers.js +25 -9
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.d.ts +4 -0
- package/dist/frontend/lowering/builtins/operating-system.js +25 -12
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/performance.d.ts +12 -0
- package/dist/frontend/lowering/builtins/performance.js +259 -8
- package/dist/frontend/lowering/builtins/performance.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +32 -1
- package/dist/frontend/lowering/builtins/process.js +468 -99
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +5 -1
- package/dist/frontend/lowering/builtins/promises.js +326 -43
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/promisify-callback.d.ts +37 -0
- package/dist/frontend/lowering/builtins/promisify-callback.js +320 -0
- package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -0
- package/dist/frontend/lowering/builtins/properties.js +37 -1
- package/dist/frontend/lowering/builtins/properties.js.map +1 -1
- package/dist/frontend/lowering/builtins/querystring.js +14 -14
- package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +55 -13
- package/dist/frontend/lowering/builtins/readline.js +931 -69
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/receiver-types.js +3 -5
- package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -1
- package/dist/frontend/lowering/builtins/reflection.js +16 -14
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
- package/dist/frontend/lowering/builtins/runtime-constructor.d.ts +26 -0
- package/dist/frontend/lowering/builtins/runtime-constructor.js +165 -0
- package/dist/frontend/lowering/builtins/runtime-constructor.js.map +1 -0
- package/dist/frontend/lowering/builtins/strings.js +101 -12
- package/dist/frontend/lowering/builtins/strings.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +41 -38
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.js +75 -30
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.d.ts +3 -0
- package/dist/frontend/lowering/builtins/url.js +120 -17
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/util-types.js +20 -4
- package/dist/frontend/lowering/builtins/util-types.js.map +1 -1
- package/dist/frontend/lowering/builtins/v8.d.ts +11 -0
- package/dist/frontend/lowering/builtins/v8.js +105 -0
- package/dist/frontend/lowering/builtins/v8.js.map +1 -0
- package/dist/frontend/lowering/builtins/webassembly.d.ts +33 -0
- package/dist/frontend/lowering/builtins/webassembly.js +388 -0
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -0
- package/dist/frontend/lowering/builtins/webcrypto.d.ts +20 -0
- package/dist/frontend/lowering/builtins/webcrypto.js +112 -0
- package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -0
- package/dist/frontend/lowering/builtins/workers.d.ts +16 -0
- package/dist/frontend/lowering/builtins/workers.js +246 -3
- package/dist/frontend/lowering/builtins/workers.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.js +69 -14
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.d.ts +19 -1
- package/dist/frontend/lowering/call-signatures.js +254 -47
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/checked-promise-all.d.ts +3 -0
- package/dist/frontend/lowering/checked-promise-all.js +1 -1
- package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.d.ts +53 -0
- package/dist/frontend/lowering/cjs-exports-object.js +528 -0
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -0
- package/dist/frontend/lowering/cjs-inline-require.d.ts +86 -0
- package/dist/frontend/lowering/cjs-inline-require.js +314 -0
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -0
- package/dist/frontend/lowering/cjs-tsc-interop.d.ts +28 -0
- package/dist/frontend/lowering/cjs-tsc-interop.js +208 -0
- package/dist/frontend/lowering/cjs-tsc-interop.js.map +1 -0
- package/dist/frontend/lowering/class-attributes.d.ts +19 -0
- package/dist/frontend/lowering/class-attributes.js +378 -0
- package/dist/frontend/lowering/class-attributes.js.map +1 -0
- package/dist/frontend/lowering/class-callbacks.d.ts +3 -1
- package/dist/frontend/lowering/class-callbacks.js +21 -10
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.js +49 -4
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-descriptors.d.ts +2 -0
- package/dist/frontend/lowering/class-descriptors.js +8 -8
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +64 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +1115 -89
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-instance-constructor.js +1 -1
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
- package/dist/frontend/lowering/class-iterables.d.ts +11 -0
- package/dist/frontend/lowering/class-iterables.js +31 -0
- package/dist/frontend/lowering/class-iterables.js.map +1 -0
- package/dist/frontend/lowering/class-method-mutations.js +73 -35
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +56 -10
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-protocol-dispatch.js +24 -22
- package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +55 -0
- package/dist/frontend/lowering/class-protocols.js +738 -22
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +6 -0
- package/dist/frontend/lowering/class-prototypes.js +80 -18
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.js +1 -1
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-static-data.js +2 -2
- package/dist/frontend/lowering/class-static-data.js.map +1 -1
- package/dist/frontend/lowering/class-to-primitive.d.ts +25 -0
- package/dist/frontend/lowering/class-to-primitive.js +261 -0
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -0
- package/dist/frontend/lowering/class-unions.d.ts +25 -0
- package/dist/frontend/lowering/class-unions.js +102 -1
- package/dist/frontend/lowering/class-unions.js.map +1 -1
- package/dist/frontend/lowering/code-generation.d.ts +14 -0
- package/dist/frontend/lowering/code-generation.js +127 -0
- package/dist/frontend/lowering/code-generation.js.map +1 -0
- package/dist/frontend/lowering/coercions/function-adapters.d.ts +16 -2
- package/dist/frontend/lowering/coercions/function-adapters.js +145 -3
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +25 -3
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +35 -3
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.d.ts +15 -0
- package/dist/frontend/lowering/coercions/unions.js +57 -1
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/collection-ingestion.js +2 -2
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
- package/dist/frontend/lowering/collection-narrowing.js +2 -4
- package/dist/frontend/lowering/collection-narrowing.js.map +1 -1
- package/dist/frontend/lowering/construction-escapes.js +8 -8
- package/dist/frontend/lowering/construction-escapes.js.map +1 -1
- package/dist/frontend/lowering/construction-escapes.test.js +4 -4
- package/dist/frontend/lowering/construction-escapes.test.js.map +1 -1
- package/dist/frontend/lowering/constructor-returns.d.ts +61 -0
- package/dist/frontend/lowering/constructor-returns.js +477 -0
- package/dist/frontend/lowering/constructor-returns.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callback-call.js +1 -1
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +9 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +266 -100
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +1 -1
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.d.ts +0 -1
- package/dist/frontend/lowering/containers/array-construction.js +51 -13
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-from-async.d.ts +19 -0
- package/dist/frontend/lowering/containers/array-from-async.js +427 -0
- package/dist/frontend/lowering/containers/array-from-async.js.map +1 -0
- package/dist/frontend/lowering/containers/array-methods.js +89 -77
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +1 -0
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +161 -101
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.d.ts +9 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +55 -5
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-grouping.d.ts +7 -8
- package/dist/frontend/lowering/containers/collection-grouping.js +219 -27
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +81 -48
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/dynamic-receivers.js +1 -1
- package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -1
- package/dist/frontend/lowering/containers/exec-result-uses.js +2 -2
- package/dist/frontend/lowering/containers/exec-result-uses.js.map +1 -1
- package/dist/frontend/lowering/containers/for-of.d.ts +6 -0
- package/dist/frontend/lowering/containers/for-of.js +19 -19
- package/dist/frontend/lowering/containers/for-of.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +142 -57
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +53 -4
- package/dist/frontend/lowering/containers/iterator-helpers.js +1581 -462
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/match-row-uses.d.ts +17 -0
- package/dist/frontend/lowering/containers/match-row-uses.js +264 -0
- package/dist/frontend/lowering/containers/match-row-uses.js.map +1 -0
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +14 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js +419 -30
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +4 -0
- package/dist/frontend/lowering/cycle-initialization.js +39 -0
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +47 -43
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/devirtualize.d.ts +1 -1
- package/dist/frontend/lowering/devirtualize.js +27 -7
- package/dist/frontend/lowering/devirtualize.js.map +1 -1
- package/dist/frontend/lowering/divergences.d.ts +0 -5
- package/dist/frontend/lowering/divergences.js +238 -128
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/dyn-streams.d.ts +25 -0
- package/dist/frontend/lowering/dyn-streams.js +257 -0
- package/dist/frontend/lowering/dyn-streams.js.map +1 -0
- package/dist/frontend/lowering/error-methods.js +4 -1
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/error-name-order.d.ts +19 -0
- package/dist/frontend/lowering/error-name-order.js +93 -0
- package/dist/frontend/lowering/error-name-order.js.map +1 -0
- package/dist/frontend/lowering/expressions/array-literals.d.ts +21 -0
- package/dist/frontend/lowering/expressions/array-literals.js +703 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -0
- package/dist/frontend/lowering/expressions/binary.d.ts +35 -0
- package/dist/frontend/lowering/expressions/binary.js +2483 -0
- package/dist/frontend/lowering/expressions/binary.js.map +1 -0
- package/dist/frontend/lowering/expressions/element-access.d.ts +31 -0
- package/dist/frontend/lowering/expressions/element-access.js +1797 -0
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -3
- package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
- package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +38 -0
- package/dist/frontend/lowering/expressions/hosted-narrowing.js +160 -0
- package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -0
- package/dist/frontend/lowering/expressions/identifiers.d.ts +4 -0
- package/dist/frontend/lowering/expressions/identifiers.js +830 -0
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -0
- package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +40 -0
- package/dist/frontend/lowering/expressions/keyed-field-targets.js +226 -0
- package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -0
- package/dist/frontend/lowering/expressions/narrowing.d.ts +37 -0
- package/dist/frontend/lowering/expressions/narrowing.js +1322 -0
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -0
- package/dist/frontend/lowering/expressions/native-proxy.js +4 -4
- package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +45 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
- package/dist/frontend/lowering/expressions/object-literals.js +253 -85
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +2 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +91 -14
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +110 -0
- package/dist/frontend/lowering/expressions/property-access.js +3544 -0
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -0
- package/dist/frontend/lowering/expressions/relational.d.ts +28 -0
- package/dist/frontend/lowering/expressions/relational.js +1679 -0
- package/dist/frontend/lowering/expressions/relational.js.map +1 -0
- package/dist/frontend/lowering/expressions/typeof.d.ts +22 -0
- package/dist/frontend/lowering/expressions/typeof.js +538 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -0
- package/dist/frontend/lowering/expressions/union-fields.js +1 -1
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.d.ts +21 -0
- package/dist/frontend/lowering/expressions/updates.js +780 -0
- package/dist/frontend/lowering/expressions/updates.js.map +1 -0
- package/dist/frontend/lowering/function-context.d.ts +10 -0
- package/dist/frontend/lowering/function-context.js +11 -1
- package/dist/frontend/lowering/function-context.js.map +1 -1
- package/dist/frontend/lowering/function-returns.js +52 -28
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/general-streams.d.ts +25 -0
- package/dist/frontend/lowering/general-streams.js +108 -0
- package/dist/frontend/lowering/general-streams.js.map +1 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +7 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +172 -69
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +39 -0
- package/dist/frontend/lowering/generic-functions.js +393 -75
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/import-meta.js +2 -2
- package/dist/frontend/lowering/import-meta.js.map +1 -1
- package/dist/frontend/lowering/intern-tables.js +10 -9
- package/dist/frontend/lowering/intern-tables.js.map +1 -1
- package/dist/frontend/lowering/iterator-adapters.d.ts +19 -0
- package/dist/frontend/lowering/iterator-adapters.js +331 -3
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-class-fields.d.ts +28 -0
- package/dist/frontend/lowering/js-class-fields.js +170 -0
- package/dist/frontend/lowering/js-class-fields.js.map +1 -0
- package/dist/frontend/lowering/js-dynamic-objects.d.ts +15 -0
- package/dist/frontend/lowering/js-dynamic-objects.js +299 -0
- package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -0
- package/dist/frontend/lowering/js-dynamic-objects.test.d.ts +1 -0
- package/dist/frontend/lowering/js-dynamic-objects.test.js +35 -0
- package/dist/frontend/lowering/js-dynamic-objects.test.js.map +1 -0
- package/dist/frontend/lowering/json-require.d.ts +22 -0
- package/dist/frontend/lowering/json-require.js +131 -0
- package/dist/frontend/lowering/json-require.js.map +1 -0
- package/dist/frontend/lowering/key-order-witness.d.ts +44 -0
- package/dist/frontend/lowering/key-order-witness.js +641 -0
- package/dist/frontend/lowering/key-order-witness.js.map +1 -0
- package/dist/frontend/lowering/key-order-witness.test.d.ts +1 -0
- package/dist/frontend/lowering/key-order-witness.test.js +239 -0
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -0
- package/dist/frontend/lowering/lifetime-regions.js +7 -7
- package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +61 -60
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.d.ts +10 -1
- package/dist/frontend/lowering/lower-async-iteration.js +34 -6
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.d.ts +5 -0
- package/dist/frontend/lowering/lower-builtin-values.js +32 -3
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +1298 -452
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +50 -3
- package/dist/frontend/lowering/lower-classes.js +1499 -456
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.d.ts +4 -2
- package/dist/frontend/lowering/lower-comptime.js +111 -13
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-console.js +13 -11
- package/dist/frontend/lowering/lower-console.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.d.ts +10 -0
- package/dist/frontend/lowering/lower-dgram.js +179 -8
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-enums.js +113 -14
- package/dist/frontend/lowering/lower-enums.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +16 -7
- package/dist/frontend/lowering/lower-event-emitter.js +268 -71
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-event-target.js +2 -2
- package/dist/frontend/lowering/lower-event-target.js.map +1 -1
- package/dist/frontend/lowering/lower-expando.js +17 -13
- package/dist/frontend/lowering/lower-expando.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +188 -186
- package/dist/frontend/lowering/lower-exprs.js +1493 -12407
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +68 -22
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +6 -0
- package/dist/frontend/lowering/lower-generators.js +29 -16
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +5 -1
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +354 -99
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +23 -20
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.d.ts +19 -2
- package/dist/frontend/lowering/lower-mock.js +557 -74
- package/dist/frontend/lowering/lower-mock.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +268 -61
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +6 -0
- package/dist/frontend/lowering/lower-namespaces.js +45 -33
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-module.d.ts +16 -0
- package/dist/frontend/lowering/lower-node-module.js +147 -14
- package/dist/frontend/lowering/lower-node-module.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +6 -6
- package/dist/frontend/lowering/lower-server.js +638 -105
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
- package/dist/frontend/lowering/lower-stdlib.js +151 -109
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +28 -2
- package/dist/frontend/lowering/lower-stmts.js +1589 -398
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +4 -3
- package/dist/frontend/lowering/lower-stream.js +714 -75
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-test.d.ts +3 -0
- package/dist/frontend/lowering/lower-test.js +574 -100
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +80 -32
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lower-url.js +1 -1
- package/dist/frontend/lowering/lower-url.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +409 -26
- package/dist/frontend/lowering/lowerer.js +1918 -305
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +10 -4
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/maybe-promise.d.ts +46 -0
- package/dist/frontend/lowering/maybe-promise.js +249 -0
- package/dist/frontend/lowering/maybe-promise.js.map +1 -0
- package/dist/frontend/lowering/module-member-this.d.ts +3 -0
- package/dist/frontend/lowering/module-member-this.js +262 -0
- package/dist/frontend/lowering/module-member-this.js.map +1 -0
- package/dist/frontend/lowering/module-namespace-elements.js +1 -1
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/nan-coded-reads.d.ts +3 -0
- package/dist/frontend/lowering/nan-coded-reads.js +45 -32
- package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
- package/dist/frontend/lowering/narrowing-stability.d.ts +18 -3
- package/dist/frontend/lowering/narrowing-stability.js +104 -32
- package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +11 -11
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/null-prototype.d.ts +13 -0
- package/dist/frontend/lowering/null-prototype.js +33 -0
- package/dist/frontend/lowering/null-prototype.js.map +1 -0
- package/dist/frontend/lowering/object-factory-new.js +6 -8
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/private-brands.d.ts +46 -0
- package/dist/frontend/lowering/private-brands.js +265 -0
- package/dist/frontend/lowering/private-brands.js.map +1 -0
- package/dist/frontend/lowering/promise-executor-adapter.d.ts +11 -0
- package/dist/frontend/lowering/promise-executor-adapter.js +87 -0
- package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -0
- package/dist/frontend/lowering/require-initialization.d.ts +32 -0
- package/dist/frontend/lowering/require-initialization.js +246 -0
- package/dist/frontend/lowering/require-initialization.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-bounds.js +7 -7
- package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.js +12 -12
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-guards.js +10 -10
- package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-guards.test.js +1 -1
- package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-ownership.js +10 -9
- package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-provenance.js +2 -2
- package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.d.ts +35 -0
- package/dist/frontend/lowering/runtime-optional-records.js +205 -32
- package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.test.js +19 -1
- package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -1
- package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
- package/dist/frontend/lowering/split-consumers.js +4 -4
- package/dist/frontend/lowering/split-consumers.js.map +1 -1
- package/dist/frontend/lowering/static-function-names.d.ts +28 -0
- package/dist/frontend/lowering/static-function-names.js +212 -0
- package/dist/frontend/lowering/static-function-names.js.map +1 -0
- package/dist/frontend/lowering/static-this.js +6 -6
- package/dist/frontend/lowering/static-this.js.map +1 -1
- package/dist/frontend/lowering/strict-mode.d.ts +5 -0
- package/dist/frontend/lowering/strict-mode.js +31 -0
- package/dist/frontend/lowering/strict-mode.js.map +1 -0
- package/dist/frontend/lowering/string-index-bounds.js +10 -10
- package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
- package/dist/frontend/lowering/string-index.d.ts +12 -0
- package/dist/frontend/lowering/string-index.js +72 -1
- package/dist/frontend/lowering/string-index.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +15 -6
- package/dist/frontend/lowering/surfaces.js +278 -45
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
- package/dist/frontend/lowering/symbol-fields.js +204 -36
- package/dist/frontend/lowering/symbol-fields.js.map +1 -1
- package/dist/frontend/lowering/symbol-methods.d.ts +2 -1
- package/dist/frontend/lowering/symbol-methods.js +24 -6
- package/dist/frontend/lowering/symbol-methods.js.map +1 -1
- package/dist/frontend/lowering/thread-slots.d.ts +13 -0
- package/dist/frontend/lowering/thread-slots.js +208 -0
- package/dist/frontend/lowering/thread-slots.js.map +1 -0
- package/dist/frontend/lowering/typed-arguments.d.ts +74 -0
- package/dist/frontend/lowering/typed-arguments.js +472 -0
- package/dist/frontend/lowering/typed-arguments.js.map +1 -0
- package/dist/frontend/lowering/union-retag.d.ts +8 -0
- package/dist/frontend/lowering/union-retag.js +27 -0
- package/dist/frontend/lowering/union-retag.js.map +1 -1
- package/dist/frontend/lowering/union-retag.test.js +24 -1
- package/dist/frontend/lowering/union-retag.test.js.map +1 -1
- package/dist/frontend/lowering/var-hoisting.js +6 -6
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/lowering/width-lift.d.ts +4 -0
- package/dist/frontend/mock-shapes.d.ts +5 -0
- package/dist/frontend/mock-shapes.js +39 -7
- package/dist/frontend/mock-shapes.js.map +1 -1
- package/dist/frontend/module-source-candidates.js +1 -1
- package/dist/frontend/module-source-candidates.js.map +1 -1
- package/dist/frontend/module-source-candidates.test.js +2 -1
- package/dist/frontend/module-source-candidates.test.js.map +1 -1
- package/dist/frontend/module-syntax.js +8 -8
- package/dist/frontend/module-syntax.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.d.ts +51 -0
- package/dist/frontend/npm-static-bundled-chunks.js +810 -0
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -0
- package/dist/frontend/npm-static-bundled-chunks.test.d.ts +1 -0
- package/dist/frontend/npm-static-bundled-chunks.test.js +287 -0
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -0
- package/dist/frontend/npm-static-bundled-cjs.js +24 -23
- package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
- package/dist/frontend/npm-static-bundled-esm.d.ts +9 -0
- package/dist/frontend/npm-static-bundled-esm.js +768 -0
- package/dist/frontend/npm-static-bundled-esm.js.map +1 -0
- package/dist/frontend/npm-static-bundled-esm.test.d.ts +1 -0
- package/dist/frontend/npm-static-bundled-esm.test.js +207 -0
- package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -0
- package/dist/frontend/npm-static-cjs-exports-alias.d.ts +2 -0
- package/dist/frontend/npm-static-cjs-exports-alias.js +186 -0
- package/dist/frontend/npm-static-cjs-exports-alias.js.map +1 -0
- package/dist/frontend/npm-static-cjs-exports-alias.test.d.ts +1 -0
- package/dist/frontend/npm-static-cjs-exports-alias.test.js +73 -0
- package/dist/frontend/npm-static-cjs-exports-alias.test.js.map +1 -0
- package/dist/frontend/npm-static-cjs-exports-var.d.ts +2 -0
- package/dist/frontend/npm-static-cjs-exports-var.js +236 -0
- package/dist/frontend/npm-static-cjs-exports-var.js.map +1 -0
- package/dist/frontend/npm-static-declaration-syntax.js +102 -101
- package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
- package/dist/frontend/npm-static-prune.js +36 -24
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-host.d.ts +4 -1
- package/dist/frontend/npm-static-rewrite-host.js +14 -3
- package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.d.ts +19 -0
- package/dist/frontend/npm-static-rewrite-syntax.js +274 -101
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static-subtyping.js +7 -9
- package/dist/frontend/npm-static-subtyping.js.map +1 -1
- package/dist/frontend/npm-static.d.ts +17 -1
- package/dist/frontend/npm-static.js +167 -16
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm-static.test.js +22 -1
- package/dist/frontend/npm-static.test.js.map +1 -1
- package/dist/frontend/pipeline.js +164 -26
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/pipeline.test.js +22 -1
- package/dist/frontend/pipeline.test.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +6 -1
- package/dist/frontend/program-analysis.js +7 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +92 -2
- package/dist/frontend/program.js +1557 -254
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +76 -6
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/resolve.js +36 -2
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/resolve.test.js +49 -0
- package/dist/frontend/resolve.test.js.map +1 -1
- package/dist/frontend/services.d.ts +20 -1
- package/dist/frontend/services.js +40 -3
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/services.test.js +2 -1
- package/dist/frontend/services.test.js.map +1 -1
- package/dist/frontend/threads-import.js +1 -1
- package/dist/frontend/threads-import.js.map +1 -1
- package/dist/frontend/tier-analysis.d.ts +71 -0
- package/dist/frontend/tier-analysis.js +522 -0
- package/dist/frontend/tier-analysis.js.map +1 -0
- package/dist/frontend/ts7/api-conformance.d.ts +234 -0
- package/dist/frontend/ts7/api-conformance.js +7 -0
- package/dist/frontend/ts7/api-conformance.js.map +1 -0
- package/dist/frontend/ts7/ast-guards.generated.js +2 -1
- package/dist/frontend/ts7/ast-guards.generated.js.map +1 -1
- package/dist/frontend/ts7/ast-node.d.ts +47 -25
- package/dist/frontend/ts7/ast-node.js +64 -18
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +36 -12
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-types.d.ts +10 -3
- package/dist/frontend/ts7/ast-types.generated.d.ts +39 -39
- package/dist/frontend/ts7/ast.d.ts +1 -0
- package/dist/frontend/ts7/ast.js +3 -2
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +23 -0
- package/dist/frontend/ts7/checker-backend.js +88 -0
- package/dist/frontend/ts7/checker-backend.js.map +1 -0
- package/dist/frontend/ts7/checker-backend.test.d.ts +1 -0
- package/dist/frontend/ts7/checker-backend.test.js +63 -0
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -0
- package/dist/frontend/ts7/checker-cache.d.ts +0 -3
- package/dist/frontend/ts7/checker-cache.js +0 -6
- package/dist/frontend/ts7/checker-cache.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +18 -11
- package/dist/frontend/ts7/checker.js +42 -55
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +10 -7
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/diagnostic.d.ts +19 -0
- package/dist/frontend/ts7/diagnostic.js +22 -0
- package/dist/frontend/ts7/diagnostic.js.map +1 -0
- package/dist/frontend/ts7/node-functions.d.ts +8 -0
- package/dist/frontend/ts7/node-functions.js +18 -0
- package/dist/frontend/ts7/node-functions.js.map +1 -0
- package/dist/frontend/ts7/program-host.d.ts +5 -1
- package/dist/frontend/ts7/program-host.js +12 -0
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/rpc-api.d.ts +5 -1
- package/dist/frontend/ts7/rpc-api.js +8 -1
- package/dist/frontend/ts7/rpc-api.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.d.ts +13 -6
- package/dist/frontend/ts7/semantic-checker.js +26 -8
- package/dist/frontend/ts7/semantic-checker.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.test.js +12 -9
- package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +54 -24
- package/dist/frontend/ts7/semantic-model.js +88 -16
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +4 -4
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-types.d.ts +7 -3
- package/dist/frontend/ts7/semantic-types.js +1 -1
- package/dist/frontend/ts7/semantic-types.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +11 -11
- package/dist/frontend/ts7/session.js +8 -5
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/ts7/session.test.js +9 -5
- package/dist/frontend/ts7/session.test.js.map +1 -1
- package/dist/frontend/ts7/source-parser.d.ts +6 -2
- package/dist/frontend/ts7/source-parser.js +24 -3
- package/dist/frontend/ts7/source-parser.js.map +1 -1
- package/dist/frontend/ts7/source-parser.test.js +38 -17
- package/dist/frontend/ts7/source-parser.test.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +122 -2
- package/dist/frontend/type-mapper.js +2612 -695
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-only-imports.d.ts +28 -0
- package/dist/frontend/type-only-imports.js +122 -0
- package/dist/frontend/type-only-imports.js.map +1 -0
- package/dist/frontend/worker-target.js +8 -8
- package/dist/frontend/worker-target.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +47 -10
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +4 -2
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/api.d.ts +1 -1
- package/dist/ir/api.js +1 -1
- package/dist/ir/api.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +30 -0
- package/dist/ir/array-length-stability.js +236 -0
- package/dist/ir/array-length-stability.js.map +1 -0
- package/dist/ir/array-length-stability.test.d.ts +1 -0
- package/dist/ir/array-length-stability.test.js +113 -0
- package/dist/ir/array-length-stability.test.js.map +1 -0
- package/dist/ir/build.d.ts +2 -2
- package/dist/ir/build.js +1 -1
- package/dist/ir/build.js.map +1 -1
- package/dist/ir/builtin-effects.js +139 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +655 -25
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/byte-numbers.js +3 -0
- package/dist/ir/byte-numbers.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +37 -0
- package/dist/ir/callback-specialization.js +459 -0
- package/dist/ir/callback-specialization.js.map +1 -0
- package/dist/ir/callback-specialization.test.d.ts +1 -0
- package/dist/ir/callback-specialization.test.js +208 -0
- package/dist/ir/callback-specialization.test.js.map +1 -0
- package/dist/ir/capture-values.d.ts +0 -1
- package/dist/ir/capture-values.js +51 -40
- package/dist/ir/capture-values.js.map +1 -1
- package/dist/ir/constant-globals.test.js +1 -1
- package/dist/ir/constant-tables.test.js +1 -1
- package/dist/ir/field-values.test.js +1 -1
- package/dist/ir/final-fields.test.js +1 -1
- package/dist/ir/function-references.test.js +10 -1
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/init-only-globals.test.js +1 -1
- package/dist/ir/initializer-bindings.test.js +1 -1
- package/dist/ir/int32-slots.d.ts +14 -0
- package/dist/ir/int32-slots.js +119 -14
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +29 -1
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +16 -6
- package/dist/ir/integer-loop-facts.js +143 -38
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +1 -1
- package/dist/ir/integer-loops.js +39 -9
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +104 -0
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +3 -0
- package/dist/ir/integer-ranges.js +4 -6
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +142 -1
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/intrinsic-signatures.js +6 -0
- package/dist/ir/intrinsic-signatures.js.map +1 -1
- package/dist/ir/ir.d.ts +234 -58
- package/dist/ir/ir.js +123 -12
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +10 -0
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/jsval.d.ts +8 -0
- package/dist/ir/jsval.js +365 -0
- package/dist/ir/jsval.js.map +1 -0
- package/dist/ir/jsval.test.d.ts +1 -0
- package/dist/ir/jsval.test.js +239 -0
- package/dist/ir/jsval.test.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +150 -33
- package/dist/ir/runtime-features.js +672 -339
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/runtime-features.test.js +62 -0
- package/dist/ir/runtime-features.test.js.map +1 -1
- package/dist/ir/scalar-records.test.js +1 -1
- package/dist/ir/self-captures.d.ts +33 -0
- package/dist/ir/self-captures.js +245 -0
- package/dist/ir/self-captures.js.map +1 -0
- package/dist/ir/self-captures.test.d.ts +1 -0
- package/dist/ir/self-captures.test.js +135 -0
- package/dist/ir/self-captures.test.js.map +1 -0
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +7 -4
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/tiers.d.ts +26 -0
- package/dist/ir/tiers.js +101 -0
- package/dist/ir/tiers.js.map +1 -0
- package/dist/ir/tiers.test.d.ts +1 -0
- package/dist/ir/tiers.test.js +140 -0
- package/dist/ir/tiers.test.js.map +1 -0
- package/dist/ir/traverse.js +107 -94
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/traverse.test.js +33 -30
- package/dist/ir/traverse.test.js.map +1 -1
- package/dist/ir/unshare.js +65 -3
- package/dist/ir/unshare.js.map +1 -1
- package/dist/ir/unshare.test.js +1 -1
- package/dist/ir/validate.js +220 -71
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +64 -9
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/fence-eval.test.js +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/ir-policy.js +18 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +1 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +5 -5
- package/dist/library/library-profile.d.ts +4 -4
- package/dist/library/library-profile.js +35 -7
- package/dist/library/library-profile.js.map +1 -1
- package/dist/library/prepare.js +13 -1
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/cli.js +5 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +2 -2
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +2 -2
- package/dist/native/prepare.js +7 -0
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.test.js +12 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/toolchain.d.ts +2 -0
- package/dist/native/toolchain.js +10 -1
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +39 -1
- package/dist/native/toolchain.test.js.map +1 -1
- package/dist/startup-cache.d.ts +1 -0
- package/dist/startup-cache.js +1 -0
- package/dist/startup-cache.js.map +1 -1
- package/dist/wasm/base64.d.ts +5 -0
- package/dist/wasm/base64.js +62 -0
- package/dist/wasm/base64.js.map +1 -0
- package/dist/wasm/binary.d.ts +36 -0
- package/dist/wasm/binary.js +1976 -0
- package/dist/wasm/binary.js.map +1 -0
- package/dist/wasm/binary.test.d.ts +1 -0
- package/dist/wasm/binary.test.js +190 -0
- package/dist/wasm/binary.test.js.map +1 -0
- package/dist/wasm/discover.d.ts +38 -0
- package/dist/wasm/discover.js +377 -0
- package/dist/wasm/discover.js.map +1 -0
- package/dist/wasm/discover.test.d.ts +1 -0
- package/dist/wasm/discover.test.js +24 -0
- package/dist/wasm/discover.test.js.map +1 -0
- package/dist/wasm/module.d.ts +151 -0
- package/dist/wasm/module.js +575 -0
- package/dist/wasm/module.js.map +1 -0
- package/dist/wasm/translate.d.ts +48 -0
- package/dist/wasm/translate.js +2129 -0
- package/dist/wasm/translate.js.map +1 -0
- package/dist/wasm/translate.test.d.ts +1 -0
- package/dist/wasm/translate.test.js +207 -0
- package/dist/wasm/translate.test.js.map +1 -0
- package/package.json +21 -20
- package/surface-manifest.json +332 -36
|
@@ -0,0 +1,1679 @@
|
|
|
1
|
+
/* instanceof and in, including private-name and runtime-key in. */
|
|
2
|
+
import * as ts from "../../ts7/adapter.js";
|
|
3
|
+
import { builtinClassInstanceOf, builtinClassKind } from "../builtins/builtin-class-dyn.js";
|
|
4
|
+
import { checkedPrivateIn, localPrivateBrandClass, primitiveOperand, privateInMessage, } from "../private-brands.js";
|
|
5
|
+
import { BOOL, BYTES_ELEMENT_NAME, CAUGHT, DYN, F64, RUNTIME_ERROR_CLASSES, STRING, UNDEFINED_T, isUnitType, typeEquals, typeKey, } from "../../../ir/ir.js";
|
|
6
|
+
import { lowerWebAssemblyInstanceof, refuseWebAssemblyUse } from "../builtins/webassembly.js";
|
|
7
|
+
import { lowerSocketInstanceOf } from "../lower-server.js";
|
|
8
|
+
import { builtinClassRefOf } from "../builtins/class-values.js";
|
|
9
|
+
import { lowerZlibInstanceOf } from "../builtins/compression.js";
|
|
10
|
+
import { numLit, strLit, varRef } from "../../../ir/build.js";
|
|
11
|
+
import { lowerDisposableStackInstanceOf } from "../builtins/disposable-stack.js";
|
|
12
|
+
import { lowerBlobInstanceof } from "../builtins/blob.js";
|
|
13
|
+
import { lowerReadlineInstanceof } from "../builtins/readline.js";
|
|
14
|
+
import { lowerKeyObjectInstanceof } from "../builtins/key-object.js";
|
|
15
|
+
import { lowerCryptoKeyInstanceof } from "../builtins/webcrypto.js";
|
|
16
|
+
import { lowerNetAddressInstanceof } from "../builtins/net-address.js";
|
|
17
|
+
import { fenceEarlyNsMemberRef, nsMemberIdentOf } from "../lower-namespaces.js";
|
|
18
|
+
import { maybePromiseInstanceOf } from "../maybe-promise.js";
|
|
19
|
+
import { isSafeToDiscard, isSafeToRepeat } from "./evaluation-safety.js";
|
|
20
|
+
import { storedClassValueType } from "../lower-classes.js";
|
|
21
|
+
import { classInstanceOf } from "../class-dynamic-dispatch.js";
|
|
22
|
+
import { InternalCompilerError } from "../../../errors.js";
|
|
23
|
+
import { tryLowerExpression } from "./try-lower-expression.js";
|
|
24
|
+
import { isJsSourceFile, locOf } from "../../program.js";
|
|
25
|
+
import { checkedClassInstanceOf } from "../class-construction.js";
|
|
26
|
+
import { globalSymbolKey } from "./global-symbols.js";
|
|
27
|
+
import { foldedStringKeyOf } from "./object-literals.js";
|
|
28
|
+
import { NARROW_FIRST, sideEffectFreeOptionValue } from "../surfaces.js";
|
|
29
|
+
import { isExecExceptionType, refuseExecExceptionCode } from "../builtins/errors.js";
|
|
30
|
+
import { hasRuntimeStatics } from "../class-runtime-statics.js";
|
|
31
|
+
import { nullProtoRecordShape, recordNullProtoTest } from "../null-prototype.js";
|
|
32
|
+
/** `x instanceof C` for a program-declared class C. When x's static
|
|
33
|
+
* class and C are both in extends-hierarchies the test is dynamic — the
|
|
34
|
+
* O(1) preorder-interval check against the vtable (`instanceOf` node).
|
|
35
|
+
* Everything else is decided by the static class graph alone and folds
|
|
36
|
+
* to the honest constant: `x instanceof C` is always true when x's
|
|
37
|
+
* static class IS C or descends from it, and always false when the
|
|
38
|
+
* classes are unrelated (a standalone class has no other relatives).
|
|
39
|
+
* Folding is limited to side-effect-free operands — dropping a computed
|
|
40
|
+
* operand would skip its effects, so those are rejected instead. */
|
|
41
|
+
export function lowerInstanceOf(lowerer, expr, loc) {
|
|
42
|
+
const webAssembly = lowerWebAssemblyInstanceof(lowerer, expr);
|
|
43
|
+
if (webAssembly !== null)
|
|
44
|
+
return webAssembly;
|
|
45
|
+
refuseWebAssemblyUse(lowerer, expr.right);
|
|
46
|
+
// `x instanceof net.Socket` over a union with a netSocket arm — the
|
|
47
|
+
// h2 compat 'connect' narrowing (lower-server.ts): a union tag test.
|
|
48
|
+
const sockTest = lowerSocketInstanceOf(lowerer, expr, loc);
|
|
49
|
+
if (sockTest !== null)
|
|
50
|
+
return sockTest;
|
|
51
|
+
const rightClass = builtinClassRefOf(lowerer, expr.right);
|
|
52
|
+
if (rightClass?.kind === "zlib")
|
|
53
|
+
return lowerZlibInstanceOf(lowerer, expr, rightClass.mode, loc);
|
|
54
|
+
if (rightClass?.kind === "collection") {
|
|
55
|
+
const collection = rightClass.which === "Map" ? "map" : "set";
|
|
56
|
+
const value = lowerer.lowerExpr(expr.left);
|
|
57
|
+
if (value.type.kind === "union") {
|
|
58
|
+
const union = lowerer.unions.get(value.type.unionId);
|
|
59
|
+
if (union) {
|
|
60
|
+
const local = lowerer.declareHiddenLocal("%collectionTest", value.type);
|
|
61
|
+
const reference = varRef(local.id, value.type, loc);
|
|
62
|
+
let result = { kind: "boolLit", value: false, type: BOOL, loc };
|
|
63
|
+
union.arms.forEach((arm, tag) => {
|
|
64
|
+
if (arm.kind !== collection)
|
|
65
|
+
return;
|
|
66
|
+
const test = {
|
|
67
|
+
kind: "unionIsTag",
|
|
68
|
+
unionId: union.id,
|
|
69
|
+
value: reference,
|
|
70
|
+
tag,
|
|
71
|
+
negated: false,
|
|
72
|
+
type: BOOL,
|
|
73
|
+
loc,
|
|
74
|
+
};
|
|
75
|
+
result =
|
|
76
|
+
result.kind === "boolLit"
|
|
77
|
+
? test
|
|
78
|
+
: { kind: "logical", op: "||", left: result, right: test, type: BOOL, loc };
|
|
79
|
+
});
|
|
80
|
+
return {
|
|
81
|
+
kind: "seqExpr",
|
|
82
|
+
stmts: [{ kind: "varDecl", localId: local.id, init: value, loc }],
|
|
83
|
+
result,
|
|
84
|
+
type: BOOL,
|
|
85
|
+
loc,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (value.type.kind === "dyn")
|
|
90
|
+
return {
|
|
91
|
+
kind: "libCall",
|
|
92
|
+
fn: collection === "map" ? "dyn.nativeMapIs" : "dyn.nativeSetIs",
|
|
93
|
+
args: [value],
|
|
94
|
+
type: BOOL,
|
|
95
|
+
loc,
|
|
96
|
+
};
|
|
97
|
+
if (value.type.kind === collection)
|
|
98
|
+
return {
|
|
99
|
+
kind: "seqExpr",
|
|
100
|
+
stmts: [{ kind: "exprStmt", expr: value, loc }],
|
|
101
|
+
result: { kind: "boolLit", value: true, type: BOOL, loc },
|
|
102
|
+
type: BOOL,
|
|
103
|
+
loc,
|
|
104
|
+
};
|
|
105
|
+
return {
|
|
106
|
+
kind: "libCall",
|
|
107
|
+
fn: collection === "map" ? "dyn.nativeMapIs" : "dyn.nativeSetIs",
|
|
108
|
+
args: [lowerer.coerceInto(expr.left, value, DYN)],
|
|
109
|
+
type: BOOL,
|
|
110
|
+
loc,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
if (lowerer.isStdlibGlobal(expr.right, "WeakMap") ||
|
|
114
|
+
lowerer.isStdlibGlobal(expr.right, "WeakSet")) {
|
|
115
|
+
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
116
|
+
return {
|
|
117
|
+
kind: "libCall",
|
|
118
|
+
fn: lowerer.isStdlibGlobal(expr.right, "WeakMap") ? "weakMap.is" : "weakSet.is",
|
|
119
|
+
args: [value],
|
|
120
|
+
type: BOOL,
|
|
121
|
+
loc,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const rhsBuiltin = ts.isIdentifier(expr.right)
|
|
125
|
+
? lowerer.builtinImportOf(expr.right)
|
|
126
|
+
: ts.isPropertyAccessExpression(expr.right)
|
|
127
|
+
? lowerer.builtinMemberOf(expr.right)
|
|
128
|
+
: null;
|
|
129
|
+
if (lowerer.isStdlibGlobal(expr.right, "URL") ||
|
|
130
|
+
(rhsBuiltin?.module === "url" && rhsBuiltin.member === "URL")) {
|
|
131
|
+
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
132
|
+
return { kind: "libCall", fn: "dyn.nativeUrlIs", args: [value], type: BOOL, loc };
|
|
133
|
+
}
|
|
134
|
+
{
|
|
135
|
+
const stack = lowerDisposableStackInstanceOf(lowerer, expr);
|
|
136
|
+
if (stack)
|
|
137
|
+
return stack;
|
|
138
|
+
}
|
|
139
|
+
if (lowerer.isStdlibGlobal(expr.right, "DataView")) {
|
|
140
|
+
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
141
|
+
return { kind: "libCall", fn: "dyn.dataViewIs", args: [value], type: BOOL, loc };
|
|
142
|
+
}
|
|
143
|
+
{
|
|
144
|
+
const eventKind = ["Event", "CustomEvent", "EventTarget"].findIndex((name) => lowerer.isStdlibGlobal(expr.right, name));
|
|
145
|
+
if (eventKind >= 0) {
|
|
146
|
+
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
147
|
+
const kind = { kind: "numLit", value: eventKind, type: F64, loc };
|
|
148
|
+
return { kind: "libCall", fn: "event.is", args: [value, kind], type: BOOL, loc };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
{
|
|
152
|
+
const blob = lowerBlobInstanceof(lowerer, expr);
|
|
153
|
+
if (blob)
|
|
154
|
+
return blob;
|
|
155
|
+
const keyObject = lowerKeyObjectInstanceof(lowerer, expr);
|
|
156
|
+
if (keyObject)
|
|
157
|
+
return keyObject;
|
|
158
|
+
const cryptoKey = lowerCryptoKeyInstanceof(lowerer, expr);
|
|
159
|
+
if (cryptoKey)
|
|
160
|
+
return cryptoKey;
|
|
161
|
+
const netAddress = lowerNetAddressInstanceof(lowerer, expr);
|
|
162
|
+
if (netAddress)
|
|
163
|
+
return netAddress;
|
|
164
|
+
const readlineInterface = lowerReadlineInstanceof(lowerer, expr);
|
|
165
|
+
if (readlineInterface)
|
|
166
|
+
return readlineInterface;
|
|
167
|
+
}
|
|
168
|
+
if (lowerer.isStdlibGlobal(expr.right, "SharedArrayBuffer")) {
|
|
169
|
+
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
170
|
+
return { kind: "libCall", fn: "sharedArrayBuffer.is", args: [value], type: BOOL, loc };
|
|
171
|
+
}
|
|
172
|
+
if (lowerer.isStdlibGlobal(expr.right, "ArrayBuffer")) {
|
|
173
|
+
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
174
|
+
return { kind: "libCall", fn: "arrayBuffer.is", args: [value], type: BOOL, loc };
|
|
175
|
+
}
|
|
176
|
+
const rhsSymbol = ts.isIdentifier(expr.right) ? lowerer.resolveValueSymbol(expr.right) : null;
|
|
177
|
+
// `x instanceof events.EventEmitter` — the namespace-member spelling
|
|
178
|
+
// resolves to the same ambient class as the named import.
|
|
179
|
+
const rhsMemberSymbol = (() => {
|
|
180
|
+
if (!ts.isPropertyAccessExpression(expr.right) || !ts.isIdentifier(expr.right.name))
|
|
181
|
+
return null;
|
|
182
|
+
const sym = lowerer.checker.getSymbolAtLocation(expr.right.name);
|
|
183
|
+
return sym && sym.flags & ts.SymbolFlags.Alias
|
|
184
|
+
? lowerer.checker.getAliasedSymbol(sym)
|
|
185
|
+
: (sym ?? null);
|
|
186
|
+
})();
|
|
187
|
+
// `x instanceof N.C` — the USER-namespace-qualified spelling: the
|
|
188
|
+
// member resolves to the registered program class, with the
|
|
189
|
+
// source-order guard (an init-position test above the class's block
|
|
190
|
+
// would read an uninitialized member in Node).
|
|
191
|
+
const rhsNsClass = (() => {
|
|
192
|
+
if (!ts.isPropertyAccessExpression(expr.right))
|
|
193
|
+
return undefined;
|
|
194
|
+
const nsMember = nsMemberIdentOf(lowerer, expr.right);
|
|
195
|
+
if (!nsMember)
|
|
196
|
+
return undefined;
|
|
197
|
+
const memberSym = lowerer.checker.getSymbolAtLocation(nsMember);
|
|
198
|
+
if (memberSym)
|
|
199
|
+
fenceEarlyNsMemberRef(lowerer, expr.right, memberSym);
|
|
200
|
+
const classSym = lowerer.resolveValueSymbol(nsMember);
|
|
201
|
+
const nsInfo = classSym ? lowerer.classBySymbol.get(classSym) : undefined;
|
|
202
|
+
// Qualified spellings of a rebindable decorated class (import=
|
|
203
|
+
// alias chains) must not fold against the declaration — the
|
|
204
|
+
// decoration result decides at runtime.
|
|
205
|
+
return nsInfo?.classDecorators?.valueGlobalId !== undefined ? undefined : nsInfo;
|
|
206
|
+
})();
|
|
207
|
+
// A rebindable decorated name as the RHS: the runtime target is the
|
|
208
|
+
// decoration result — fall to the class-VALUE path below, whose
|
|
209
|
+
// instanceOfValue reads the interval off the bound class object.
|
|
210
|
+
const directRhs = rhsSymbol ? lowerer.classBySymbol.get(rhsSymbol) : undefined;
|
|
211
|
+
const target = (directRhs?.localClass || directRhs?.classDecorators?.valueGlobalId !== undefined
|
|
212
|
+
? undefined
|
|
213
|
+
: directRhs) ??
|
|
214
|
+
rhsNsClass ??
|
|
215
|
+
lowerer.builtinErrorInfoOf(rhsSymbol) ??
|
|
216
|
+
lowerer.builtinErrorInfoOf(rhsMemberSymbol) ??
|
|
217
|
+
lowerer.builtinEmitterInfoOf(rhsSymbol) ??
|
|
218
|
+
lowerer.builtinEmitterInfoOf(rhsMemberSymbol) ??
|
|
219
|
+
lowerer.builtinStreamInfoOf(rhsSymbol) ??
|
|
220
|
+
lowerer.builtinStreamInfoOf(rhsMemberSymbol) ??
|
|
221
|
+
undefined;
|
|
222
|
+
if (!target) {
|
|
223
|
+
const date = lowerer.isStdlibGlobal(expr.right, "Date");
|
|
224
|
+
const url = lowerer.isStdlibGlobal(expr.right, "URL");
|
|
225
|
+
if ((date || url) && !lowerer.caughtLocalOf(expr.left)) {
|
|
226
|
+
const value = lowerer.lowerExpr(expr.left);
|
|
227
|
+
if (value.type.kind === "dyn")
|
|
228
|
+
return {
|
|
229
|
+
kind: "libCall",
|
|
230
|
+
fn: date ? "dyn.nativeDateIs" : "dyn.nativeUrlIs",
|
|
231
|
+
args: [value],
|
|
232
|
+
type: BOOL,
|
|
233
|
+
loc,
|
|
234
|
+
};
|
|
235
|
+
if (value.type.kind === "union")
|
|
236
|
+
return {
|
|
237
|
+
kind: "libCall",
|
|
238
|
+
fn: date ? "dyn.nativeDateIs" : "dyn.nativeUrlIs",
|
|
239
|
+
args: [lowerer.coerceInto(expr.left, value, DYN)],
|
|
240
|
+
type: BOOL,
|
|
241
|
+
loc,
|
|
242
|
+
};
|
|
243
|
+
return {
|
|
244
|
+
kind: "seqExpr",
|
|
245
|
+
stmts: [{ kind: "exprStmt", expr: value, loc }],
|
|
246
|
+
result: {
|
|
247
|
+
kind: "boolLit",
|
|
248
|
+
value: value.type.kind === (date ? "date" : "url"),
|
|
249
|
+
type: BOOL,
|
|
250
|
+
loc,
|
|
251
|
+
},
|
|
252
|
+
type: BOOL,
|
|
253
|
+
loc,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
const webBrand = ["Request", "Response", "Headers"].find((name) => lowerer.isStdlibGlobal(expr.right, name));
|
|
257
|
+
if (webBrand)
|
|
258
|
+
return {
|
|
259
|
+
kind: "libCall",
|
|
260
|
+
fn: "fetch.webIs",
|
|
261
|
+
args: [
|
|
262
|
+
lowerer.lowerExprExpecting(expr.left, DYN),
|
|
263
|
+
{ kind: "strLit", value: webBrand, type: STRING, loc },
|
|
264
|
+
],
|
|
265
|
+
type: BOOL,
|
|
266
|
+
loc,
|
|
267
|
+
};
|
|
268
|
+
if (lowerer.isStdlibGlobal(expr.right, "ReadableStream")) {
|
|
269
|
+
const value = lowerer.lowerExprExpecting(expr.left, DYN);
|
|
270
|
+
return { kind: "libCall", fn: "fetch.streamIs", args: [value], type: BOOL, loc };
|
|
271
|
+
}
|
|
272
|
+
// Unknown storage retains each numeric typed array's exact native brand.
|
|
273
|
+
if (!lowerer.caughtLocalOf(expr.left)) {
|
|
274
|
+
const elem = Object.keys(BYTES_ELEMENT_NAME).find((kind) => lowerer.isStdlibGlobal(expr.right, BYTES_ELEMENT_NAME[kind]));
|
|
275
|
+
if (elem !== undefined) {
|
|
276
|
+
const left = lowerer.lowerExpr(expr.left);
|
|
277
|
+
if (left.type.kind === "dyn") {
|
|
278
|
+
return { kind: "dynTest", test: "bytes", bytesElem: elem, value: left, type: BOOL, loc };
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
kind: "dynTest",
|
|
282
|
+
test: "bytes",
|
|
283
|
+
bytesElem: elem,
|
|
284
|
+
value: lowerer.coerceInto(expr.left, left, DYN),
|
|
285
|
+
type: BOOL,
|
|
286
|
+
loc,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// `x instanceof Promise` over a promise-armed union (the maybe-promise
|
|
291
|
+
// `T | Promise<T>` dispatch): a union tag test — the data arms are
|
|
292
|
+
// never promises (scriptc promises are all native, and no data arm
|
|
293
|
+
// can hold one). A promise-typed operand answers true after its
|
|
294
|
+
// evaluation; a checked-dynamic one asks the runtime.
|
|
295
|
+
if (ts.isIdentifier(expr.right) &&
|
|
296
|
+
lowerer.isStdlibGlobal(expr.right, "Promise") &&
|
|
297
|
+
!lowerer.caughtLocalOf(expr.left)) {
|
|
298
|
+
const left = lowerer.lowerExpr(expr.left);
|
|
299
|
+
const tagTest = maybePromiseInstanceOf(lowerer, left, loc);
|
|
300
|
+
if (tagTest)
|
|
301
|
+
return tagTest;
|
|
302
|
+
if (left.type.kind === "dyn")
|
|
303
|
+
return { kind: "dynTest", test: "promise", value: left, type: BOOL, loc };
|
|
304
|
+
if (left.type.kind === "promise") {
|
|
305
|
+
const yes = { kind: "boolLit", value: true, type: BOOL, loc };
|
|
306
|
+
if (isSafeToDiscard(left))
|
|
307
|
+
return yes;
|
|
308
|
+
return {
|
|
309
|
+
kind: "seqExpr",
|
|
310
|
+
stmts: [{ kind: "exprStmt", expr: left, loc }],
|
|
311
|
+
result: yes,
|
|
312
|
+
type: BOOL,
|
|
313
|
+
loc,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
lowerer.unsupported("SC1090", expr, `'instanceof Promise' on '${lowerer.fmt(left.type)}' values (only promises, promise-armed unions, and checked-dynamic values have a lowering)`);
|
|
317
|
+
}
|
|
318
|
+
// `x instanceof RegExp` over a union with a regex arm (the
|
|
319
|
+
// skip-utility `string | RegExp` dispatch): a union tag test — the
|
|
320
|
+
// socket-narrowing shape; the checker types the branches and
|
|
321
|
+
// maybeNarrow bridges the reads. A plain regex-typed LHS folds
|
|
322
|
+
// true; the fold keeps the operand-purity rule of the class folds
|
|
323
|
+
// (identifier reads only).
|
|
324
|
+
if (ts.isIdentifier(expr.right) &&
|
|
325
|
+
lowerer.isStdlibGlobal(expr.right, "RegExp") &&
|
|
326
|
+
!lowerer.caughtLocalOf(expr.left)) {
|
|
327
|
+
const left = lowerer.lowerExpr(expr.left);
|
|
328
|
+
if (left.type.kind === "dyn")
|
|
329
|
+
return { kind: "libCall", fn: "dyn.nativeRegexIs", args: [left], type: BOOL, loc };
|
|
330
|
+
if (left.type.kind === "union") {
|
|
331
|
+
const def = lowerer.unions.get(left.type.unionId);
|
|
332
|
+
const tag = def ? def.arms.findIndex((a) => a.kind === "regex") : -1;
|
|
333
|
+
if (tag >= 0) {
|
|
334
|
+
return {
|
|
335
|
+
kind: "unionIsTag",
|
|
336
|
+
unionId: left.type.unionId,
|
|
337
|
+
tag,
|
|
338
|
+
negated: false,
|
|
339
|
+
value: left,
|
|
340
|
+
type: BOOL,
|
|
341
|
+
loc,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return {
|
|
346
|
+
kind: "libCall",
|
|
347
|
+
fn: "dyn.nativeRegexIs",
|
|
348
|
+
args: [lowerer.coerceInto(expr.left, left, DYN)],
|
|
349
|
+
type: BOOL,
|
|
350
|
+
loc,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
// `x instanceof X` where X is a class VALUE (a classval-typed
|
|
354
|
+
// binding): the target is DYNAMIC — a hierarchy target reads its
|
|
355
|
+
// interval from the class object at runtime (instanceOfValue); a
|
|
356
|
+
// STANDALONE target class has exactly one possible runtime value
|
|
357
|
+
// (itself — no descendants can flow into the slot), so the answer
|
|
358
|
+
// folds statically exactly like the named-target folds below.
|
|
359
|
+
const rhsClassval = storedClassValueType(lowerer, expr.right);
|
|
360
|
+
if (rhsClassval?.kind === "classval" && !lowerer.caughtLocalOf(expr.left)) {
|
|
361
|
+
const targetInfo = lowerer.classes.get(rhsClassval.className);
|
|
362
|
+
if (!targetInfo) {
|
|
363
|
+
// The type world names a class the lowering never registered
|
|
364
|
+
// (a fenced class expression, a deferred declaration): flush
|
|
365
|
+
// its diagnostics and poison the test site, never an ICE.
|
|
366
|
+
lowerer.flushDeferredClass(rhsClassval.className);
|
|
367
|
+
lowerer.unsupported("SC1090", expr, "'instanceof' against a class value whose class has no lowering (the class declaration itself was rejected — see its own diagnostic)");
|
|
368
|
+
}
|
|
369
|
+
const left = lowerer.lowerExpr(expr.left);
|
|
370
|
+
if (left.type.kind === "dyn") {
|
|
371
|
+
if (targetInfo.def.runtime) {
|
|
372
|
+
lowerer.unsupported("SC1090", expr, "'instanceof' through a runtime-provided class value on an untyped value (give the operand a class type first)");
|
|
373
|
+
}
|
|
374
|
+
const classValue = lowerer.lowerExpr(expr.right);
|
|
375
|
+
return classInstanceOf(lowerer, left, targetInfo, loc, classValue);
|
|
376
|
+
}
|
|
377
|
+
// A union of class instances against a runtime class value (`new K()`
|
|
378
|
+
// through a widened `[Readable, Writable]` element).
|
|
379
|
+
if (left.type.kind === "union" && targetInfo.def.runtime) {
|
|
380
|
+
const tested = unionClassValueInstanceOf(lowerer, left, expr.right, targetInfo, loc);
|
|
381
|
+
if (tested)
|
|
382
|
+
return tested;
|
|
383
|
+
}
|
|
384
|
+
if (left.type.kind !== "object") {
|
|
385
|
+
lowerer.unsupported("SC1090", expr, "'instanceof' on values other than class instances (narrow union-typed values first)");
|
|
386
|
+
}
|
|
387
|
+
const lhsInfo = lowerer.classes.get(left.type.className);
|
|
388
|
+
if (!lhsInfo)
|
|
389
|
+
throw new InternalCompilerError(`lowerer bug: unknown class ${left.type.className}`);
|
|
390
|
+
if ((lowerer.inHierarchy(targetInfo) && lowerer.inHierarchy(lhsInfo)) ||
|
|
391
|
+
(targetInfo.localClass !== undefined && lhsInfo.localClass !== undefined)) {
|
|
392
|
+
const classValue = lowerer.lowerExpr(expr.right);
|
|
393
|
+
if (classValue.type.kind !== "classval")
|
|
394
|
+
lowerer.badType(expr.right, lowerer.typeOf(expr.right));
|
|
395
|
+
const writableTest = writableClassValueTest(lowerer, left, classValue, targetInfo, lhsInfo, loc);
|
|
396
|
+
if (writableTest)
|
|
397
|
+
return writableTest;
|
|
398
|
+
return { kind: "instanceOfValue", value: left, classValue, type: BOOL, loc };
|
|
399
|
+
}
|
|
400
|
+
// A standalone side: the answer is static (the target slot can
|
|
401
|
+
// only hold the named class; a standalone operand's runtime class
|
|
402
|
+
// IS its static class). Folding discards the operands' evaluation,
|
|
403
|
+
// so only side-effect-free shapes fold — the named-target rule.
|
|
404
|
+
const value = left.type.className === targetInfo.def.name ||
|
|
405
|
+
lowerer.isSubclassOf(left.type.className, targetInfo.def.name);
|
|
406
|
+
if (left.kind === "varRef" &&
|
|
407
|
+
(ts.isIdentifier(expr.right) || expr.right.kind === ts.SyntaxKind.ThisKeyword)) {
|
|
408
|
+
return readsClassAfter(lowerer, targetInfo, expr.right, [], {
|
|
409
|
+
kind: "boolLit",
|
|
410
|
+
value,
|
|
411
|
+
type: BOOL,
|
|
412
|
+
loc,
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the values to variables first)");
|
|
416
|
+
}
|
|
417
|
+
const constructor = tryLowerExpression(lowerer, expr.right);
|
|
418
|
+
if (constructor?.type.kind === "dyn" && isJsSourceFile(ts.getSourceFileOfNode(expr))) {
|
|
419
|
+
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
420
|
+
return checkedClassInstanceOf(lowerer, value, constructor, loc);
|
|
421
|
+
}
|
|
422
|
+
// `this instanceof Glob` in a JavaScript constructor function: the
|
|
423
|
+
// function's prototype against the value's prototype chain.
|
|
424
|
+
if (constructor?.type.kind === "func" &&
|
|
425
|
+
isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
|
|
426
|
+
lowerer.dynConvertible(constructor.type)) {
|
|
427
|
+
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
428
|
+
return {
|
|
429
|
+
kind: "libCall",
|
|
430
|
+
fn: "dyn.functionInstanceOf",
|
|
431
|
+
args: [value, { kind: "dynFrom", value: constructor, type: DYN, loc }],
|
|
432
|
+
type: BOOL,
|
|
433
|
+
loc,
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
lowerer.unsupported("SC1090", expr.right, "'instanceof' right-hand sides other than classes declared in the program");
|
|
437
|
+
}
|
|
438
|
+
// `x instanceof Writable`: Node's Writable[Symbol.hasInstance] also
|
|
439
|
+
// answers true for streams with a writable side that do not inherit from
|
|
440
|
+
// Writable, which are Duplex and its subclasses (Transform, PassThrough,
|
|
441
|
+
// the zlib streams). Subclasses of Writable keep the prototype test.
|
|
442
|
+
const duplex = target.def.name === "%Writable" && target.builtinStream !== undefined
|
|
443
|
+
? lowerer.classes.get("%Duplex")
|
|
444
|
+
: undefined;
|
|
445
|
+
// The classes whose interval test can answer true for a value of static
|
|
446
|
+
// class `className`: Writable and Duplex are disjoint, so a value typed
|
|
447
|
+
// as one side needs only that side's test.
|
|
448
|
+
const runtimeTests = (className) => {
|
|
449
|
+
if (!duplex)
|
|
450
|
+
return [target];
|
|
451
|
+
const mayHold = (info) => className === info.def.name ||
|
|
452
|
+
lowerer.isSubclassOf(className, info.def.name) ||
|
|
453
|
+
lowerer.isSubclassOf(info.def.name, className);
|
|
454
|
+
const tests = [target, duplex].filter(mayHold);
|
|
455
|
+
return tests.length > 0 ? tests : [target];
|
|
456
|
+
};
|
|
457
|
+
// A catch binding on the left: the runtime test against the class's
|
|
458
|
+
// preorder interval (false for non-hierarchy-object payloads). tsc's
|
|
459
|
+
// narrowing then types the branches; reads bridge through caughtRead.
|
|
460
|
+
const caughtLocal = lowerer.caughtLocalOf(expr.left);
|
|
461
|
+
if (caughtLocal) {
|
|
462
|
+
const caughtInstanceOf = (info) => {
|
|
463
|
+
if (!lowerer.inHierarchy(info)) {
|
|
464
|
+
const value = varRef(caughtLocal.id, CAUGHT, loc);
|
|
465
|
+
return {
|
|
466
|
+
kind: "ternary",
|
|
467
|
+
cond: {
|
|
468
|
+
kind: "caughtTest",
|
|
469
|
+
value,
|
|
470
|
+
test: "instanceof",
|
|
471
|
+
className: info.def.name,
|
|
472
|
+
type: BOOL,
|
|
473
|
+
loc,
|
|
474
|
+
},
|
|
475
|
+
then: { kind: "boolLit", value: true, type: BOOL, loc },
|
|
476
|
+
else_: classInstanceOf(lowerer, { kind: "caughtToDyn", value, type: DYN, loc }, info, loc),
|
|
477
|
+
type: BOOL,
|
|
478
|
+
loc,
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
return {
|
|
482
|
+
kind: "caughtTest",
|
|
483
|
+
value: { kind: "varRef", localId: caughtLocal.id, type: CAUGHT, loc },
|
|
484
|
+
test: "instanceof",
|
|
485
|
+
className: info.def.name,
|
|
486
|
+
type: BOOL,
|
|
487
|
+
loc,
|
|
488
|
+
};
|
|
489
|
+
};
|
|
490
|
+
const test = caughtInstanceOf(target);
|
|
491
|
+
return duplex
|
|
492
|
+
? { kind: "logical", op: "||", left: test, right: caughtInstanceOf(duplex), type: BOOL, loc }
|
|
493
|
+
: test;
|
|
494
|
+
}
|
|
495
|
+
const left = lowerer.lowerExpr(expr.left);
|
|
496
|
+
// `u instanceof Error` on an `unknown` value: the checked-dynamic tree's error encoding
|
|
497
|
+
// (the shape caughtToDyn builds for Error payloads — the reserved
|
|
498
|
+
// "%error" marker) answers the test, so a caught Error passed through
|
|
499
|
+
// an unknown slot narrows like Node (`error instanceof Error ?
|
|
500
|
+
// error.message : String(error)` — the LAN-monitor handler). ROOT
|
|
501
|
+
// only: the marker cannot honestly answer subclass prototype chains
|
|
502
|
+
// (name strings are user-writable), so `u instanceof TypeError` keeps
|
|
503
|
+
// the fence. Reads past the narrow bridge through maybeNarrow's
|
|
504
|
+
// validated %Error extraction. SEMANTICS.md 67.
|
|
505
|
+
if (left.type.kind === "dyn" &&
|
|
506
|
+
!target.def.runtime &&
|
|
507
|
+
!target.builtinError &&
|
|
508
|
+
!target.builtinEmitter &&
|
|
509
|
+
!target.builtinStream &&
|
|
510
|
+
!target.localClass) {
|
|
511
|
+
return classInstanceOf(lowerer, left, target, loc);
|
|
512
|
+
}
|
|
513
|
+
if (left.type.kind === "dyn" && target.def.name === "%Error") {
|
|
514
|
+
return { kind: "dynTest", test: "error", value: left, type: BOOL, loc };
|
|
515
|
+
}
|
|
516
|
+
// `u instanceof TypeError` (and the other BUILTIN error classes) on a
|
|
517
|
+
// dyn value: the from_error cache holds the checked-dynamic tree↔error identity edge,
|
|
518
|
+
// so the runtime resolves the encoding back to its error and asks the
|
|
519
|
+
// vtable's stamped interval — exact for every error that crossed the
|
|
520
|
+
// boundary (a hand-built {%error} literal answers false: subclass
|
|
521
|
+
// identity is unknowable there). User subclasses keep the fence.
|
|
522
|
+
if (left.type.kind === "dyn" && RUNTIME_ERROR_CLASSES.has(target.def.name)) {
|
|
523
|
+
const rec = RUNTIME_ERROR_CLASSES.get(target.def.name);
|
|
524
|
+
return {
|
|
525
|
+
kind: "libCall",
|
|
526
|
+
fn: "dyn.errInstanceof",
|
|
527
|
+
args: [left, { kind: "numLit", value: rec.kind, type: F64, loc }],
|
|
528
|
+
type: BOOL,
|
|
529
|
+
loc,
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
// `u instanceof EventEmitter` (or a stream class): an untyped object
|
|
533
|
+
// built by a constructor function inherits the untyped constructor's
|
|
534
|
+
// prototype (builtin-class-dyn.ts). Compiled emitters and streams have
|
|
535
|
+
// no untyped form, so the prototype chain answers for every value.
|
|
536
|
+
const builtinKind = builtinClassKind(target.def.name);
|
|
537
|
+
if (left.type.kind === "dyn" && builtinKind !== null) {
|
|
538
|
+
return builtinClassInstanceOf(left, builtinKind, loc);
|
|
539
|
+
}
|
|
540
|
+
if (left.type.kind === "dyn") {
|
|
541
|
+
lowerer.unsupported("SC1090", expr, `'instanceof ${target.def.name.replace(/^%/, "")}' on 'unknown' values (only the Error classes answer — test 'instanceof Error' and read '.name')`);
|
|
542
|
+
}
|
|
543
|
+
if (left.type.kind === "union") {
|
|
544
|
+
const unionId = left.type.unionId;
|
|
545
|
+
const arms = lowerer.unions.get(unionId)?.arms;
|
|
546
|
+
// Ordinary records, arrays and scalar values do not carry a class
|
|
547
|
+
// prototype (no program class extends Array). Dynamic/opaque runtime
|
|
548
|
+
// objects keep their existing instanceof fences.
|
|
549
|
+
if (arms?.every((arm) => arm.kind === "object" ||
|
|
550
|
+
arm.kind === "record" ||
|
|
551
|
+
arm.kind === "array" ||
|
|
552
|
+
arm.kind === "f64" ||
|
|
553
|
+
arm.kind === "string" ||
|
|
554
|
+
arm.kind === "bool" ||
|
|
555
|
+
arm.kind === "bigint" ||
|
|
556
|
+
arm.kind === "symbol" ||
|
|
557
|
+
isUnitType(arm))) {
|
|
558
|
+
const key = `instanceof.union:${unionId}:${target.def.name}`;
|
|
559
|
+
let helper = lowerer.valueHelpers.get(key);
|
|
560
|
+
if (!helper) {
|
|
561
|
+
helper = `%instanceof.union.${lowerer.valueHelpers.size}`;
|
|
562
|
+
lowerer.valueHelpers.set(key, helper);
|
|
563
|
+
const value = { kind: "varRef", localId: "value.0", type: left.type, loc };
|
|
564
|
+
const body = [];
|
|
565
|
+
arms.forEach((arm, tag) => {
|
|
566
|
+
if (arm.kind !== "object")
|
|
567
|
+
return;
|
|
568
|
+
const lhsInfo = lowerer.classes.get(arm.className);
|
|
569
|
+
if (!lhsInfo)
|
|
570
|
+
throw new InternalCompilerError(`lowerer bug: unknown class ${arm.className}`);
|
|
571
|
+
const armTest = (info) => lowerer.inHierarchy(lhsInfo) && lowerer.inHierarchy(info)
|
|
572
|
+
? {
|
|
573
|
+
kind: "instanceOf",
|
|
574
|
+
value: { kind: "unionNarrow", unionId, tag, value, type: arm, loc },
|
|
575
|
+
className: info.def.name,
|
|
576
|
+
type: BOOL,
|
|
577
|
+
loc,
|
|
578
|
+
}
|
|
579
|
+
: {
|
|
580
|
+
kind: "boolLit",
|
|
581
|
+
value: arm.className === info.def.name ||
|
|
582
|
+
lowerer.isSubclassOf(arm.className, info.def.name),
|
|
583
|
+
type: BOOL,
|
|
584
|
+
loc,
|
|
585
|
+
};
|
|
586
|
+
const result = runtimeTests(arm.className)
|
|
587
|
+
.map(armTest)
|
|
588
|
+
.reduce((left, right) => ({
|
|
589
|
+
kind: "logical",
|
|
590
|
+
op: "||",
|
|
591
|
+
left,
|
|
592
|
+
right,
|
|
593
|
+
type: BOOL,
|
|
594
|
+
loc,
|
|
595
|
+
}));
|
|
596
|
+
body.push({
|
|
597
|
+
kind: "if",
|
|
598
|
+
cond: { kind: "unionIsTag", unionId, tag, negated: false, value, type: BOOL, loc },
|
|
599
|
+
then: [{ kind: "return", value: result, loc }],
|
|
600
|
+
else_: null,
|
|
601
|
+
loc,
|
|
602
|
+
});
|
|
603
|
+
});
|
|
604
|
+
body.push({
|
|
605
|
+
kind: "return",
|
|
606
|
+
value: { kind: "boolLit", value: false, type: BOOL, loc },
|
|
607
|
+
loc,
|
|
608
|
+
});
|
|
609
|
+
lowerer.liftedFns.push({
|
|
610
|
+
name: helper,
|
|
611
|
+
params: [{ localId: "value.0", name: "value", type: left.type }],
|
|
612
|
+
returnType: BOOL,
|
|
613
|
+
locals: [{ id: "value.0", name: "value", type: left.type, mutable: false }],
|
|
614
|
+
body,
|
|
615
|
+
loc,
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
return { kind: "call", callee: helper, args: [left], type: BOOL, loc };
|
|
619
|
+
}
|
|
620
|
+
// A class arm could hold an instance: the test cannot be decided
|
|
621
|
+
// statically.
|
|
622
|
+
if (arms?.some((arm) => arm.kind === "object"))
|
|
623
|
+
lowerer.unsupported("SC1090", expr, "'instanceof' on a union of class instances and values without a class prototype test");
|
|
624
|
+
}
|
|
625
|
+
if (left.type.kind !== "object") {
|
|
626
|
+
return readsClassAfter(lowerer, target, expr.right, [{ kind: "exprStmt", expr: left, loc }], {
|
|
627
|
+
kind: "boolLit",
|
|
628
|
+
value: false,
|
|
629
|
+
type: BOOL,
|
|
630
|
+
loc,
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
const lhsInfo = lowerer.classes.get(left.type.className);
|
|
634
|
+
if (!lhsInfo)
|
|
635
|
+
throw new InternalCompilerError(`lowerer bug: unknown class ${left.type.className}`);
|
|
636
|
+
if (lowerer.inHierarchy(lhsInfo) && lowerer.inHierarchy(target)) {
|
|
637
|
+
const tests = runtimeTests(left.type.className);
|
|
638
|
+
if (tests.length === 1) {
|
|
639
|
+
return { kind: "instanceOf", value: left, className: tests[0].def.name, type: BOOL, loc };
|
|
640
|
+
}
|
|
641
|
+
const local = lowerer.declareHiddenLocal("%writableTest", left.type);
|
|
642
|
+
const ref = varRef(local.id, left.type, loc);
|
|
643
|
+
const test = (className) => ({
|
|
644
|
+
kind: "instanceOf",
|
|
645
|
+
value: ref,
|
|
646
|
+
className,
|
|
647
|
+
type: BOOL,
|
|
648
|
+
loc,
|
|
649
|
+
});
|
|
650
|
+
return {
|
|
651
|
+
kind: "seqExpr",
|
|
652
|
+
stmts: [{ kind: "varDecl", localId: local.id, init: left, loc }],
|
|
653
|
+
result: {
|
|
654
|
+
kind: "logical",
|
|
655
|
+
op: "||",
|
|
656
|
+
left: test(tests[0].def.name),
|
|
657
|
+
right: test(tests[1].def.name),
|
|
658
|
+
type: BOOL,
|
|
659
|
+
loc,
|
|
660
|
+
},
|
|
661
|
+
type: BOOL,
|
|
662
|
+
loc,
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
const leftClass = left.type.className;
|
|
666
|
+
const isInstance = (className) => leftClass === className || lowerer.isSubclassOf(leftClass, className);
|
|
667
|
+
const value = isInstance(target.def.name) || (duplex !== undefined && isInstance(duplex.def.name));
|
|
668
|
+
if (left.kind === "varRef") {
|
|
669
|
+
return readsClassAfter(lowerer, target, expr.right, [], {
|
|
670
|
+
kind: "boolLit",
|
|
671
|
+
value,
|
|
672
|
+
type: BOOL,
|
|
673
|
+
loc,
|
|
674
|
+
});
|
|
675
|
+
}
|
|
676
|
+
lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the value to a variable first)");
|
|
677
|
+
}
|
|
678
|
+
/** `x instanceof K` for a union-typed operand whose arms are class
|
|
679
|
+
* instances or unit values: each instance arm tests against the class
|
|
680
|
+
* value (with the Writable rule), unit arms answer false. Null when an arm
|
|
681
|
+
* is anything else. */
|
|
682
|
+
function unionClassValueInstanceOf(lowerer, left, right, targetInfo, loc) {
|
|
683
|
+
if (left.type.kind !== "union")
|
|
684
|
+
return null;
|
|
685
|
+
const unionId = left.type.unionId;
|
|
686
|
+
const arms = lowerer.unions.get(unionId)?.arms;
|
|
687
|
+
if (!arms?.every((arm) => {
|
|
688
|
+
if (arm.kind !== "object")
|
|
689
|
+
return isUnitType(arm);
|
|
690
|
+
const info = lowerer.classes.get(arm.className);
|
|
691
|
+
return info !== undefined && lowerer.inHierarchy(info);
|
|
692
|
+
}))
|
|
693
|
+
return null;
|
|
694
|
+
const classValue = lowerer.lowerExpr(right);
|
|
695
|
+
if (classValue.type.kind !== "classval")
|
|
696
|
+
lowerer.badType(right, lowerer.typeOf(right));
|
|
697
|
+
const value = lowerer.declareHiddenLocal("%instanceValue", left.type);
|
|
698
|
+
const cls = lowerer.declareHiddenLocal("%instanceClass", classValue.type);
|
|
699
|
+
const valueRef = varRef(value.id, left.type, loc);
|
|
700
|
+
const clsRef = varRef(cls.id, classValue.type, loc);
|
|
701
|
+
let result = { kind: "boolLit", value: false, type: BOOL, loc };
|
|
702
|
+
arms.forEach((arm, tag) => {
|
|
703
|
+
if (arm.kind !== "object")
|
|
704
|
+
return;
|
|
705
|
+
const narrowed = { kind: "unionNarrow", unionId, tag, value: valueRef, type: arm, loc };
|
|
706
|
+
const lhsInfo = lowerer.classes.get(arm.className);
|
|
707
|
+
const test = writableClassValueTest(lowerer, narrowed, clsRef, targetInfo, lhsInfo, loc) ?? { kind: "instanceOfValue", value: narrowed, classValue: clsRef, type: BOOL, loc };
|
|
708
|
+
result = {
|
|
709
|
+
kind: "ternary",
|
|
710
|
+
cond: { kind: "unionIsTag", unionId, tag, negated: false, value: valueRef, type: BOOL, loc },
|
|
711
|
+
then: test,
|
|
712
|
+
else_: result,
|
|
713
|
+
type: BOOL,
|
|
714
|
+
loc,
|
|
715
|
+
};
|
|
716
|
+
});
|
|
717
|
+
return {
|
|
718
|
+
kind: "seqExpr",
|
|
719
|
+
stmts: [
|
|
720
|
+
{ kind: "varDecl", localId: value.id, init: left, loc },
|
|
721
|
+
{ kind: "varDecl", localId: cls.id, init: classValue, loc },
|
|
722
|
+
],
|
|
723
|
+
result,
|
|
724
|
+
type: BOOL,
|
|
725
|
+
loc,
|
|
726
|
+
};
|
|
727
|
+
}
|
|
728
|
+
/** `x instanceof K` where K is a class value that may hold Writable (a
|
|
729
|
+
* `typeof Writable` or `typeof EventEmitter` slot): Node's
|
|
730
|
+
* Writable[Symbol.hasInstance] also answers true for streams with a
|
|
731
|
+
* writable side that do not inherit from Writable (Duplex and its
|
|
732
|
+
* subclasses), so when K is Writable the Duplex interval answers too.
|
|
733
|
+
* Null when the slot cannot hold Writable or the operand cannot be a
|
|
734
|
+
* Duplex. */
|
|
735
|
+
function writableClassValueTest(lowerer, left, classValue, targetInfo, lhsInfo, loc) {
|
|
736
|
+
const writable = lowerer.classes.get("%Writable");
|
|
737
|
+
const duplex = lowerer.classes.get("%Duplex");
|
|
738
|
+
if (!writable || !duplex || classValue.type.kind !== "classval" || left.type.kind !== "object")
|
|
739
|
+
return null;
|
|
740
|
+
const slotHoldsWritable = targetInfo === writable || lowerer.isSubclassOf("%Writable", targetInfo.def.name);
|
|
741
|
+
const operandMayBeDuplex = lhsInfo === duplex ||
|
|
742
|
+
lowerer.isSubclassOf(lhsInfo.def.name, "%Duplex") ||
|
|
743
|
+
lowerer.isSubclassOf("%Duplex", lhsInfo.def.name);
|
|
744
|
+
if (!slotHoldsWritable || !operandMayBeDuplex)
|
|
745
|
+
return null;
|
|
746
|
+
lowerer.defineClassValueConstruct(writable);
|
|
747
|
+
const value = lowerer.declareHiddenLocal("%instanceValue", left.type);
|
|
748
|
+
const cls = lowerer.declareHiddenLocal("%instanceClass", classValue.type);
|
|
749
|
+
const valueRef = varRef(value.id, left.type, loc);
|
|
750
|
+
const clsRef = varRef(cls.id, classValue.type, loc);
|
|
751
|
+
return {
|
|
752
|
+
kind: "seqExpr",
|
|
753
|
+
stmts: [
|
|
754
|
+
{ kind: "varDecl", localId: value.id, init: left, loc },
|
|
755
|
+
{ kind: "varDecl", localId: cls.id, init: classValue, loc },
|
|
756
|
+
],
|
|
757
|
+
result: {
|
|
758
|
+
kind: "logical",
|
|
759
|
+
op: "||",
|
|
760
|
+
left: { kind: "instanceOfValue", value: valueRef, classValue: clsRef, type: BOOL, loc },
|
|
761
|
+
right: {
|
|
762
|
+
kind: "logical",
|
|
763
|
+
op: "&&",
|
|
764
|
+
left: {
|
|
765
|
+
kind: "bin",
|
|
766
|
+
op: "===",
|
|
767
|
+
left: clsRef,
|
|
768
|
+
right: {
|
|
769
|
+
kind: "classRef",
|
|
770
|
+
className: "%Writable",
|
|
771
|
+
type: { kind: "classval", className: "%Writable" },
|
|
772
|
+
loc,
|
|
773
|
+
},
|
|
774
|
+
type: BOOL,
|
|
775
|
+
loc,
|
|
776
|
+
},
|
|
777
|
+
right: { kind: "instanceOf", value: valueRef, className: "%Duplex", type: BOOL, loc },
|
|
778
|
+
type: BOOL,
|
|
779
|
+
loc,
|
|
780
|
+
},
|
|
781
|
+
type: BOOL,
|
|
782
|
+
loc,
|
|
783
|
+
},
|
|
784
|
+
type: BOOL,
|
|
785
|
+
loc,
|
|
786
|
+
};
|
|
787
|
+
}
|
|
788
|
+
/** A statically decided `instanceof` still reads its class after the left
|
|
789
|
+
* operand: a class with an initialization flag throws there before its
|
|
790
|
+
* declaration ran. */
|
|
791
|
+
function readsClassAfter(lowerer, target, right, stmts, result) {
|
|
792
|
+
if (!lowerer.classInitFlags.has(target.def.name)) {
|
|
793
|
+
if (stmts.length === 0)
|
|
794
|
+
return result;
|
|
795
|
+
return { kind: "seqExpr", stmts, result, type: result.type, loc: result.loc };
|
|
796
|
+
}
|
|
797
|
+
const read = lowerer.lowerExpr(right);
|
|
798
|
+
return {
|
|
799
|
+
kind: "seqExpr",
|
|
800
|
+
stmts: [...stmts, { kind: "exprStmt", expr: read, loc: locOf(right) }],
|
|
801
|
+
result,
|
|
802
|
+
type: result.type,
|
|
803
|
+
loc: result.loc,
|
|
804
|
+
};
|
|
805
|
+
}
|
|
806
|
+
/** `#name in obj` — the ergonomic brand check. In this closed world a
|
|
807
|
+
* brand is held by exactly the instances of the declaring class
|
|
808
|
+
* (subclasses included — construction always runs the declaring class's
|
|
809
|
+
* own initializers), so the test IS `obj instanceof <declaring class>`:
|
|
810
|
+
* statically decided when the receiver's class sits at/below the
|
|
811
|
+
* declarer (true) or in a disjoint subtree (false) — both folds under
|
|
812
|
+
* the instanceof purity rule — and a runtime interval test when the
|
|
813
|
+
* declarer sits strictly BELOW the receiver's static class (the
|
|
814
|
+
* narrowing use; tsc types the true branch at the class, and reads
|
|
815
|
+
* bridge through maybeNarrow's downcast exactly like instanceof). tsc
|
|
816
|
+
* confines the spelling to the declaring class's body and rejects
|
|
817
|
+
* primitive/unknown receivers, so Node's in-operator TypeError is
|
|
818
|
+
* unreachable in compilable programs. Timing residue: JS installs
|
|
819
|
+
* brands DURING construction, so a check reachable from a base
|
|
820
|
+
* constructor can observe false mid-construction where this answers
|
|
821
|
+
* true (SEMANTICS.md). */
|
|
822
|
+
function lowerPrivateIn(lowerer, expr, priv, loc) {
|
|
823
|
+
const pname = priv.text;
|
|
824
|
+
// The declaring class: the nearest enclosing class declaring the name
|
|
825
|
+
// (JS scoping — an inner class's spelling shadows an outer one's).
|
|
826
|
+
let classDecl = null;
|
|
827
|
+
let staticBrand = false;
|
|
828
|
+
for (let n = priv.parent; n; n = n.parent) {
|
|
829
|
+
if (ts.isClassDeclaration(n) || ts.isClassExpression(n)) {
|
|
830
|
+
const owner = n.members.nodes.find((m) => {
|
|
831
|
+
const name = m.name;
|
|
832
|
+
return name !== undefined && ts.isPrivateIdentifier(name) && name.text === pname;
|
|
833
|
+
});
|
|
834
|
+
if (owner) {
|
|
835
|
+
classDecl = n;
|
|
836
|
+
staticBrand =
|
|
837
|
+
ts.canHaveModifiers(owner) &&
|
|
838
|
+
ts.getModifiers(owner)?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword) === true;
|
|
839
|
+
break;
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
// tsc rejects the spelling outside a declaring class body; defensive.
|
|
844
|
+
if (!classDecl)
|
|
845
|
+
lowerer.unsupported("SC1090", expr, `'${pname} in …' outside a class declaring '${pname}'`);
|
|
846
|
+
if (staticBrand) {
|
|
847
|
+
lowerer.unsupported("SC1090", expr, `'${pname} in …' brand checks for private STATICS (JS brands the declaring class OBJECT, not instances — compare against the class value directly)`);
|
|
848
|
+
}
|
|
849
|
+
const info = lowerer.currentClass?.decl === classDecl
|
|
850
|
+
? lowerer.currentClass
|
|
851
|
+
: (() => {
|
|
852
|
+
const sym = classDecl.name
|
|
853
|
+
? lowerer.checker.getSymbolAtLocation(classDecl.name)
|
|
854
|
+
: undefined;
|
|
855
|
+
return sym ? lowerer.classBySymbol.get(sym) : undefined;
|
|
856
|
+
})();
|
|
857
|
+
if (!info) {
|
|
858
|
+
lowerer.unsupported("SC1090", expr, `'${pname} in …' where the declaring class has no lowering (see the class declaration's own diagnostic)`);
|
|
859
|
+
}
|
|
860
|
+
// A GENERIC family: JS has ONE runtime class and ONE brand for every
|
|
861
|
+
// instantiation, while these layouts mint one class per instantiation
|
|
862
|
+
// — a cross-instantiation check would answer false where Node says
|
|
863
|
+
// true, so the family reports SC1090 instead of splitting the brand.
|
|
864
|
+
if (info.generic || info.genericInstance) {
|
|
865
|
+
lowerer.unsupported("SC1090", expr, `'${pname} in …' inside a generic class (JS shares one brand across every instantiation; these layouts mint one class per instantiation)`);
|
|
866
|
+
}
|
|
867
|
+
const recv = lowerer.lowerExpr(expr.right);
|
|
868
|
+
const declName = info.def.name;
|
|
869
|
+
// A UNION of class instances (`o: Counter | Helper` — the
|
|
870
|
+
// discriminating use): every object arm answers membership STATICALLY
|
|
871
|
+
// (at/below the declarer → true, disjoint subtree → false), so the
|
|
872
|
+
// whole test collapses to runtime TAG tests — the record-shape 'in'
|
|
873
|
+
// discrimination, brand form. An arm ABOVE the declarer answers per
|
|
874
|
+
// VALUE (its slot can hold branded and unbranded instances), and
|
|
875
|
+
// non-object arms have no brand story — both fence.
|
|
876
|
+
if (recv.type.kind === "union") {
|
|
877
|
+
const unionId = recv.type.unionId;
|
|
878
|
+
const arms = lowerer.unions.get(unionId)?.arms ?? [];
|
|
879
|
+
const answers = [];
|
|
880
|
+
let staticAnswers = arms.length > 0;
|
|
881
|
+
for (const arm of arms) {
|
|
882
|
+
const tag = lowerer.armTag(unionId, arm);
|
|
883
|
+
if (tag < 0 || arm.kind !== "object" || lowerer.isSubclassOf(declName, arm.className)) {
|
|
884
|
+
staticAnswers = false;
|
|
885
|
+
break;
|
|
886
|
+
}
|
|
887
|
+
answers.push({
|
|
888
|
+
tag,
|
|
889
|
+
has: arm.className === declName || lowerer.isSubclassOf(arm.className, declName),
|
|
890
|
+
});
|
|
891
|
+
}
|
|
892
|
+
if (staticAnswers) {
|
|
893
|
+
const pureRecv = recv.kind === "varRef" || recv.kind === "recordGet" || recv.kind === "fieldGet";
|
|
894
|
+
const isTag = (tag, negated) => ({
|
|
895
|
+
kind: "unionIsTag",
|
|
896
|
+
unionId,
|
|
897
|
+
tag,
|
|
898
|
+
negated,
|
|
899
|
+
value: recv,
|
|
900
|
+
type: BOOL,
|
|
901
|
+
loc,
|
|
902
|
+
});
|
|
903
|
+
const trues = answers.filter((a) => a.has);
|
|
904
|
+
if (trues.length === answers.length || trues.length === 0) {
|
|
905
|
+
const ans = trues.length !== 0;
|
|
906
|
+
if (pureRecv)
|
|
907
|
+
return { kind: "boolLit", value: ans, type: BOOL, loc };
|
|
908
|
+
// Constant either way, receiver still evaluates once: one tag
|
|
909
|
+
// test whose branches agree (the record-'in' rule verbatim).
|
|
910
|
+
return {
|
|
911
|
+
kind: "ternary",
|
|
912
|
+
cond: isTag(answers[0].tag, false),
|
|
913
|
+
then: { kind: "boolLit", value: ans, type: BOOL, loc },
|
|
914
|
+
else_: { kind: "boolLit", value: ans, type: BOOL, loc },
|
|
915
|
+
type: BOOL,
|
|
916
|
+
loc,
|
|
917
|
+
};
|
|
918
|
+
}
|
|
919
|
+
if (trues.length === 1)
|
|
920
|
+
return isTag(trues[0].tag, false);
|
|
921
|
+
const falses = answers.filter((a) => !a.has);
|
|
922
|
+
if (falses.length === 1)
|
|
923
|
+
return isTag(falses[0].tag, true);
|
|
924
|
+
if (pureRecv) {
|
|
925
|
+
let out = isTag(trues[0].tag, false);
|
|
926
|
+
for (const t of trues.slice(1)) {
|
|
927
|
+
out = {
|
|
928
|
+
kind: "logical",
|
|
929
|
+
op: "||",
|
|
930
|
+
left: out,
|
|
931
|
+
right: isTag(t.tag, false),
|
|
932
|
+
type: BOOL,
|
|
933
|
+
loc,
|
|
934
|
+
};
|
|
935
|
+
}
|
|
936
|
+
return out;
|
|
937
|
+
}
|
|
938
|
+
lowerer.unsupported("SC1090", expr, `statically-decided '${pname} in …' on computed receivers (bind the value to a variable first)`);
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
// A checked value in JavaScript (`#x in this` inside a method, whose
|
|
942
|
+
// receiver is the actual call-site value): the brand is present exactly
|
|
943
|
+
// when the value is a class instance at or below the declarer. A typed
|
|
944
|
+
// reference carries the class it was boxed under: the declarer or a
|
|
945
|
+
// descendant answers true; an ancestor answers per instance.
|
|
946
|
+
if (recv.type.kind === "dyn" &&
|
|
947
|
+
recv.kind === "varRef" &&
|
|
948
|
+
isJsSourceFile(ts.getSourceFileOfNode(expr))) {
|
|
949
|
+
// A function-local class has one brand per evaluation.
|
|
950
|
+
if (info.localClass) {
|
|
951
|
+
const owner = localPrivateBrandClass(lowerer, priv);
|
|
952
|
+
if (!owner) {
|
|
953
|
+
lowerer.unsupported("SC1090", expr, `'${pname} in …' inside a function-local class that is not a named declaration`);
|
|
954
|
+
}
|
|
955
|
+
return checkedPrivateIn(lowerer, owner.info, owner.decl, pname, recv, loc);
|
|
956
|
+
}
|
|
957
|
+
const typedRefIs = (className) => ({
|
|
958
|
+
kind: "libCall",
|
|
959
|
+
fn: "dyn.typedRefIs",
|
|
960
|
+
args: [
|
|
961
|
+
recv,
|
|
962
|
+
{ kind: "strLit", value: typeKey({ kind: "object", className }), type: STRING, loc },
|
|
963
|
+
],
|
|
964
|
+
type: BOOL,
|
|
965
|
+
loc,
|
|
966
|
+
});
|
|
967
|
+
const or = (left, right) => left === null ? right : { kind: "logical", op: "||", left, right, type: BOOL, loc };
|
|
968
|
+
let test = null;
|
|
969
|
+
const below = (c) => {
|
|
970
|
+
test = or(test, typedRefIs(c.def.name));
|
|
971
|
+
for (const sub of c.subclasses)
|
|
972
|
+
below(sub);
|
|
973
|
+
};
|
|
974
|
+
below(info);
|
|
975
|
+
for (let base = info.base; base; base = base.base) {
|
|
976
|
+
const baseType = { kind: "object", className: base.def.name };
|
|
977
|
+
test = or(test, {
|
|
978
|
+
kind: "logical",
|
|
979
|
+
op: "&&",
|
|
980
|
+
left: typedRefIs(base.def.name),
|
|
981
|
+
right: {
|
|
982
|
+
kind: "instanceOf",
|
|
983
|
+
value: { kind: "dynCheck", value: recv, type: baseType, loc },
|
|
984
|
+
className: declName,
|
|
985
|
+
type: BOOL,
|
|
986
|
+
loc,
|
|
987
|
+
},
|
|
988
|
+
type: BOOL,
|
|
989
|
+
loc,
|
|
990
|
+
});
|
|
991
|
+
}
|
|
992
|
+
// Only objects carry private names: a primitive operand throws Node's
|
|
993
|
+
// TypeError.
|
|
994
|
+
return {
|
|
995
|
+
kind: "ternary",
|
|
996
|
+
cond: primitiveOperand(recv, loc),
|
|
997
|
+
then: {
|
|
998
|
+
kind: "libCall",
|
|
999
|
+
fn: "error.nodeThrow",
|
|
1000
|
+
args: [numLit(1, loc), strLit("", loc), privateInMessage(pname, recv, loc)],
|
|
1001
|
+
type: BOOL,
|
|
1002
|
+
loc,
|
|
1003
|
+
},
|
|
1004
|
+
else_: test,
|
|
1005
|
+
type: BOOL,
|
|
1006
|
+
loc,
|
|
1007
|
+
};
|
|
1008
|
+
}
|
|
1009
|
+
if (recv.type.kind !== "object") {
|
|
1010
|
+
lowerer.unsupported("SC1090", expr, `'${pname} in …' on '${lowerer.fmt(recv.type)}' receivers (only class-instance receivers — and unions of classes below or beside the declarer — have a static brand answer; narrow first)`);
|
|
1011
|
+
}
|
|
1012
|
+
const lhsName = recv.type.className;
|
|
1013
|
+
const lhsInfo = lowerer.classes.get(lhsName);
|
|
1014
|
+
if (!lhsInfo)
|
|
1015
|
+
throw new InternalCompilerError(`lowerer bug: unknown class ${lhsName}`);
|
|
1016
|
+
if (lowerer.isSubclassOf(declName, lhsName)) {
|
|
1017
|
+
// The narrowing direction: the declarer strictly below the
|
|
1018
|
+
// receiver's static class — a strict subclass relation puts both in
|
|
1019
|
+
// a hierarchy, so the vtable interval test always exists.
|
|
1020
|
+
return { kind: "instanceOf", value: recv, className: declName, type: BOOL, loc };
|
|
1021
|
+
}
|
|
1022
|
+
const value = lhsName === declName || lowerer.isSubclassOf(lhsName, declName);
|
|
1023
|
+
if (recv.kind === "varRef")
|
|
1024
|
+
return { kind: "boolLit", value, type: BOOL, loc };
|
|
1025
|
+
lowerer.unsupported("SC1090", expr, `statically-decided '${pname} in …' on computed operands (bind the value to a variable first)`);
|
|
1026
|
+
}
|
|
1027
|
+
/** The string keys every record inherits from Object.prototype. */
|
|
1028
|
+
/** Keys built-in errors carry outside their class fields: Node's system
|
|
1029
|
+
* error properties, and AggregateError's, SuppressedError's and
|
|
1030
|
+
* AssertionError's own members. */
|
|
1031
|
+
const BUILTIN_ERROR_SLOT_KEYS = new Set([
|
|
1032
|
+
"errno",
|
|
1033
|
+
"syscall",
|
|
1034
|
+
"path",
|
|
1035
|
+
"dest",
|
|
1036
|
+
"info",
|
|
1037
|
+
"errors",
|
|
1038
|
+
"error",
|
|
1039
|
+
"suppressed",
|
|
1040
|
+
"actual",
|
|
1041
|
+
"expected",
|
|
1042
|
+
"operator",
|
|
1043
|
+
"generatedMessage",
|
|
1044
|
+
]);
|
|
1045
|
+
const OBJECT_PROTOTYPE_KEYS = new Set([
|
|
1046
|
+
"constructor",
|
|
1047
|
+
"__defineGetter__",
|
|
1048
|
+
"__defineSetter__",
|
|
1049
|
+
"hasOwnProperty",
|
|
1050
|
+
"__lookupGetter__",
|
|
1051
|
+
"__lookupSetter__",
|
|
1052
|
+
"isPrototypeOf",
|
|
1053
|
+
"propertyIsEnumerable",
|
|
1054
|
+
"toString",
|
|
1055
|
+
"valueOf",
|
|
1056
|
+
"__proto__",
|
|
1057
|
+
"toLocaleString",
|
|
1058
|
+
]);
|
|
1059
|
+
/** `"key" in v` — the key-presence test. Three lowered receivers:
|
|
1060
|
+
* process.env (getenv(3) presence — Node-exact, an empty value still
|
|
1061
|
+
* counts as present), and monomorphic record shapes, where the answer is
|
|
1062
|
+
* type-directed: a declared non-optional field is a compile-time `true`,
|
|
1063
|
+
* a missing field (no index signature) a compile-time `false` unless
|
|
1064
|
+
* Object.prototype has it — both
|
|
1065
|
+
* folds limited to side-effect-free receivers, the lowerInstanceOf rule —
|
|
1066
|
+
* and an OPTIONAL field (undefined-armed union) is a runtime presence
|
|
1067
|
+
* test on the slot: an omitted or deleted property is absent, while a
|
|
1068
|
+
* property explicitly holding `undefined` is present, as in JS
|
|
1069
|
+
* (`"a" in {a: undefined}` is true). Union receivers (the `in`-narrowing
|
|
1070
|
+
* idiom over multiple shapes), index-signature keys, class instances,
|
|
1071
|
+
* and dyn/unknown stay fenced. Keys are literal strings — a computed key
|
|
1072
|
+
* over a shape would need the runtime key table. */
|
|
1073
|
+
export function lowerInExpression(lowerer, expr, loc) {
|
|
1074
|
+
if (lowerer.isStdlibGlobal(expr.right, "process") &&
|
|
1075
|
+
lowerer.foldedStringKeyOf(expr.left) === "hrtime") {
|
|
1076
|
+
return { kind: "boolLit", value: true, type: BOOL, loc };
|
|
1077
|
+
}
|
|
1078
|
+
const globalKey = globalSymbolKey(lowerer, expr.right, expr.left);
|
|
1079
|
+
if (globalKey)
|
|
1080
|
+
return { kind: "libCall", fn: "dyn.globalSymbolHas", args: [globalKey], type: BOOL, loc };
|
|
1081
|
+
// `#name in obj` — the ergonomic brand check (ES2022) — resolves
|
|
1082
|
+
// before any string-key machinery: the left operand is a private
|
|
1083
|
+
// NAME, not a value.
|
|
1084
|
+
if (ts.isPrivateIdentifier(expr.left)) {
|
|
1085
|
+
return lowerPrivateIn(lowerer, expr, expr.left, loc);
|
|
1086
|
+
}
|
|
1087
|
+
// Compile-time-known STRING keys fold — literals, and the same
|
|
1088
|
+
// const/enum-literal and template folding computed property keys get
|
|
1089
|
+
// (foldedStringKeyOf); runtime-valued keys keep the fence.
|
|
1090
|
+
// NUMERIC literal keys answer on ARRAY receivers through the shared
|
|
1091
|
+
// presence query. Arrays retain holes independently from length, and
|
|
1092
|
+
// noncanonical numeric keys live in their ordinary-property table, so
|
|
1093
|
+
// a length comparison is not an honest `in` answer.
|
|
1094
|
+
{
|
|
1095
|
+
let kNode = expr.left;
|
|
1096
|
+
while (ts.isParenthesizedExpression(kNode))
|
|
1097
|
+
kNode = kNode.expression;
|
|
1098
|
+
if (ts.isNumericLiteral(kNode) &&
|
|
1099
|
+
lowerer.mapTypeOf(lowerer.typeOf(expr.right))?.kind === "array") {
|
|
1100
|
+
const recvArr = lowerer.lowerExpr(expr.right);
|
|
1101
|
+
if (recvArr.type.kind === "array") {
|
|
1102
|
+
const n = Number(kNode.text);
|
|
1103
|
+
return {
|
|
1104
|
+
kind: "arrayHas",
|
|
1105
|
+
arr: recvArr,
|
|
1106
|
+
index: { kind: "numLit", value: n, type: F64, loc },
|
|
1107
|
+
type: BOOL,
|
|
1108
|
+
loc,
|
|
1109
|
+
};
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
// A RUNTIME numeric key over an ARRAY receiver (`if (i in arr)` in a
|
|
1114
|
+
// loop) asks the same slot/property presence query as the literal fold
|
|
1115
|
+
// above and `Object.hasOwn`. The checked-dynamic fallback below would
|
|
1116
|
+
// box the receiver and materialize every element on each evaluation,
|
|
1117
|
+
// which makes such loops quadratic. A Number key never names an
|
|
1118
|
+
// inherited property: neither Array.prototype nor Object.prototype has
|
|
1119
|
+
// index-like or numeric-string keys. JS evaluates the key before the
|
|
1120
|
+
// receiver, so the key is stabilized in a hidden local first.
|
|
1121
|
+
if (lowerer.mapTypeOf(lowerer.typeOf(expr.left))?.kind === "f64" &&
|
|
1122
|
+
lowerer.mapTypeOf(lowerer.typeOf(expr.right))?.kind === "array") {
|
|
1123
|
+
const k = lowerer.lowerExpr(expr.left);
|
|
1124
|
+
const recvArr = lowerer.lowerExpr(expr.right);
|
|
1125
|
+
if (k.type.kind === "f64" && recvArr.type.kind === "array") {
|
|
1126
|
+
const keyLocal = lowerer.declareHiddenLocal("%inIndex", F64);
|
|
1127
|
+
return {
|
|
1128
|
+
kind: "seqExpr",
|
|
1129
|
+
stmts: [{ kind: "varDecl", localId: keyLocal.id, init: k, loc }],
|
|
1130
|
+
result: {
|
|
1131
|
+
kind: "arrayHas",
|
|
1132
|
+
arr: recvArr,
|
|
1133
|
+
index: varRef(keyLocal.id, F64, loc),
|
|
1134
|
+
type: BOOL,
|
|
1135
|
+
loc,
|
|
1136
|
+
},
|
|
1137
|
+
type: BOOL,
|
|
1138
|
+
loc,
|
|
1139
|
+
};
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
const key = foldedStringKeyOf(lowerer, expr.left);
|
|
1143
|
+
if (key === null) {
|
|
1144
|
+
// A RUNTIME string key over an INDEX-SIGNATURE record receiver (the
|
|
1145
|
+
// `names.filter((k) => k in config)` idiom): the interned key-
|
|
1146
|
+
// presence helper — declared fields answer statically per name
|
|
1147
|
+
// (optional slots by their runtime presence), then the overflow
|
|
1148
|
+
// map's live keys. Other receivers keep the
|
|
1149
|
+
// fence: fixed shapes want the literal folds above, and there is no
|
|
1150
|
+
// runtime key table to ask.
|
|
1151
|
+
const rIn = lowerRuntimeKeyIn(lowerer, expr, loc);
|
|
1152
|
+
if (rIn)
|
|
1153
|
+
return rIn;
|
|
1154
|
+
// A runtime key over a CHECKED-DYNAMIC receiver (`name in
|
|
1155
|
+
// agent.sockets` — both sides computed; the checker may type the
|
|
1156
|
+
// receiver as a Dict while the VALUE lives in the checked-dynamic tree, so the
|
|
1157
|
+
// LOWERED type decides): the dyn presence answer, with the key
|
|
1158
|
+
// stringified like every property key (o[k] is o[String(k)] in JS;
|
|
1159
|
+
// `in` shares the coercion).
|
|
1160
|
+
{
|
|
1161
|
+
const probed = tryLowerExpression(lowerer, expr.right);
|
|
1162
|
+
if (probed && lowerer.dynConvertible(probed.type)) {
|
|
1163
|
+
const k = lowerer.lowerExpr(expr.left); // JS order: the key evaluates first
|
|
1164
|
+
if (lowerer.dynConvertible(k.type)) {
|
|
1165
|
+
const boxed = lowerer.coerceToExpected(k, DYN);
|
|
1166
|
+
const keyLocal = lowerer.declareHiddenLocal("%inKey", DYN);
|
|
1167
|
+
return {
|
|
1168
|
+
kind: "seqExpr",
|
|
1169
|
+
stmts: [{ kind: "varDecl", localId: keyLocal.id, init: boxed, loc }],
|
|
1170
|
+
result: {
|
|
1171
|
+
kind: "libCall",
|
|
1172
|
+
fn: "dyn.hasKeyComputed",
|
|
1173
|
+
args: [
|
|
1174
|
+
lowerer.coerceToExpected(lowerer.lowerExpr(expr.right), DYN),
|
|
1175
|
+
varRef(keyLocal.id, DYN, loc),
|
|
1176
|
+
],
|
|
1177
|
+
type: BOOL,
|
|
1178
|
+
loc,
|
|
1179
|
+
},
|
|
1180
|
+
type: BOOL,
|
|
1181
|
+
loc,
|
|
1182
|
+
};
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
lowerer.unsupported("SC1090", expr.left, "'in' with computed (non-literal) keys (a const whose type is one string literal folds; a string-typed key answers over index-signature record receivers)");
|
|
1187
|
+
}
|
|
1188
|
+
// A receiver re-read (the static folds below) is safe for plain reads
|
|
1189
|
+
// AND for side-effect-free expressions (an object literal of literals
|
|
1190
|
+
// — the `"a" in { a: true }` shape).
|
|
1191
|
+
const pureRecvNode = sideEffectFreeOptionValue(expr.right);
|
|
1192
|
+
if (lowerer.isProcessEnv(expr.right)) {
|
|
1193
|
+
// `"NO_COLOR" in process.env`: presence via the one envGet intrinsic —
|
|
1194
|
+
// getenv(3) returning non-NULL is Node's `in` on process.env exactly.
|
|
1195
|
+
const envType = lowerer.envValueType();
|
|
1196
|
+
if (envType.kind !== "union")
|
|
1197
|
+
throw new InternalCompilerError("lowerer bug: env value type is not a union");
|
|
1198
|
+
const undefTag = lowerer.armTag(envType.unionId, UNDEFINED_T);
|
|
1199
|
+
const read = {
|
|
1200
|
+
kind: "libCall",
|
|
1201
|
+
fn: "process.envGet",
|
|
1202
|
+
args: [{ kind: "strLit", value: key, type: STRING, loc }],
|
|
1203
|
+
type: envType,
|
|
1204
|
+
loc,
|
|
1205
|
+
};
|
|
1206
|
+
return {
|
|
1207
|
+
kind: "unionIsTag",
|
|
1208
|
+
unionId: envType.unionId,
|
|
1209
|
+
tag: undefTag,
|
|
1210
|
+
negated: true,
|
|
1211
|
+
value: read,
|
|
1212
|
+
type: BOOL,
|
|
1213
|
+
loc,
|
|
1214
|
+
};
|
|
1215
|
+
}
|
|
1216
|
+
if (key === "code" && isExecExceptionType(lowerer, lowerer.typeOf(expr.right))) {
|
|
1217
|
+
refuseExecExceptionCode(lowerer, expr);
|
|
1218
|
+
}
|
|
1219
|
+
let recv = lowerer.lowerExpr(expr.right);
|
|
1220
|
+
const classInfo = recv.type.kind === "classval" ? lowerer.classes.get(recv.type.className) : undefined;
|
|
1221
|
+
if ((classInfo && (classInfo.callableBase || hasRuntimeStatics(classInfo))) ||
|
|
1222
|
+
(isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
|
|
1223
|
+
recv.type.kind === "func" &&
|
|
1224
|
+
lowerer.dynConvertible(recv.type))) {
|
|
1225
|
+
recv = lowerer.coerceToExpected(recv, DYN);
|
|
1226
|
+
}
|
|
1227
|
+
const siteType = lowerer.mapTypeOf(lowerer.typeOf(expr.right));
|
|
1228
|
+
if (recv.type.kind === "union" &&
|
|
1229
|
+
siteType?.kind === "union" &&
|
|
1230
|
+
!typeEquals(recv.type, siteType)) {
|
|
1231
|
+
const helper = lowerer.narrowedRetagHelper(expr.right, recv.type.unionId, siteType.unionId, loc);
|
|
1232
|
+
if (helper)
|
|
1233
|
+
recv = { kind: "call", callee: helper, args: [recv], type: siteType, loc };
|
|
1234
|
+
}
|
|
1235
|
+
// Error-rooted receivers (builtin or user subclass — the isErrnoException
|
|
1236
|
+
// predicate's `err instanceof Error && "code" in err` shape): `code`
|
|
1237
|
+
// answers from the runtime error's code slot (stamped by fs/system/
|
|
1238
|
+
// event/spawn errors, absent on plain constructions — exactly Node's
|
|
1239
|
+
// own-property answer), and the always-present members (message, name,
|
|
1240
|
+
// stack, Object.prototype's keys, members the static class declares)
|
|
1241
|
+
// fold true. Other keys test the declaring subclasses and the error's
|
|
1242
|
+
// own runtime properties; keys of built-in errors' extra slots fence.
|
|
1243
|
+
if (recv.type.kind === "object") {
|
|
1244
|
+
// %DOMException first: `'cause' in e` answers the options form's
|
|
1245
|
+
// own-property record (the runtime slot), and code/name/message are
|
|
1246
|
+
// always present.
|
|
1247
|
+
if (recv.type.className === "%DOMException") {
|
|
1248
|
+
if (key === "cause") {
|
|
1249
|
+
return { kind: "libCall", fn: "error.domHasCause", args: [recv], type: BOOL, loc };
|
|
1250
|
+
}
|
|
1251
|
+
if ((key === "code" || key === "message" || key === "name") &&
|
|
1252
|
+
(recv.kind === "varRef" || recv.kind === "caughtNarrow")) {
|
|
1253
|
+
return { kind: "boolLit", value: true, type: BOOL, loc };
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
let info = lowerer.classes.get(recv.type.className) ?? null;
|
|
1257
|
+
while (info && info.base)
|
|
1258
|
+
info = info.base;
|
|
1259
|
+
if (info?.def.name === "%Error") {
|
|
1260
|
+
if (key === "cause") {
|
|
1261
|
+
return { kind: "libCall", fn: "error.hasCause", args: [recv], type: BOOL, loc };
|
|
1262
|
+
}
|
|
1263
|
+
// The code slot, or an own `code` with another value
|
|
1264
|
+
// (`err.code = undefined` is present).
|
|
1265
|
+
if (key === "code") {
|
|
1266
|
+
return { kind: "libCall", fn: "error.hasCode", args: [recv], type: BOOL, loc };
|
|
1267
|
+
}
|
|
1268
|
+
// The receiver evaluates for its effects when the answer is static.
|
|
1269
|
+
const always = () => recv.kind === "varRef" || recv.kind === "caughtNarrow"
|
|
1270
|
+
? { kind: "boolLit", value: true, type: BOOL, loc }
|
|
1271
|
+
: {
|
|
1272
|
+
kind: "seqExpr",
|
|
1273
|
+
stmts: [{ kind: "exprStmt", expr: recv, loc }],
|
|
1274
|
+
result: { kind: "boolLit", value: true, type: BOOL, loc },
|
|
1275
|
+
type: BOOL,
|
|
1276
|
+
loc,
|
|
1277
|
+
};
|
|
1278
|
+
if (key === "message" || key === "name")
|
|
1279
|
+
return always();
|
|
1280
|
+
// Every Error has its own `stack`, and Error.prototype's `toString`
|
|
1281
|
+
// and `constructor` are among Object.prototype's keys.
|
|
1282
|
+
if (key === "stack" || OBJECT_PROTOTYPE_KEYS.has(key))
|
|
1283
|
+
return always();
|
|
1284
|
+
// A member the static class declares is always present.
|
|
1285
|
+
const declares = (c) => c.fields.has(key) ||
|
|
1286
|
+
lowerer.findMethodOn(c, key) !== null ||
|
|
1287
|
+
lowerer.findMethodOn(c, `get:${key}`) !== null ||
|
|
1288
|
+
lowerer.findMethodOn(c, `set:${key}`) !== null;
|
|
1289
|
+
const staticInfo = lowerer.classes.get(recv.type.className);
|
|
1290
|
+
if (staticInfo && declares(staticInfo))
|
|
1291
|
+
return always();
|
|
1292
|
+
// Any other key: a descendant class that declares it (instanceof), or
|
|
1293
|
+
// an own property set at runtime (a throw site's extra fields,
|
|
1294
|
+
// Object.assign, writes through a dynamic view). Keys built-in errors
|
|
1295
|
+
// keep outside their class fields depend on the runtime error and
|
|
1296
|
+
// stay fenced.
|
|
1297
|
+
if (!BUILTIN_ERROR_SLOT_KEYS.has(key)) {
|
|
1298
|
+
const stable = recv.kind === "varRef" || recv.kind === "caughtNarrow";
|
|
1299
|
+
const slot = stable ? null : lowerer.declareHiddenLocal("%inRecv", recv.type);
|
|
1300
|
+
const ref = () => (slot ? varRef(slot.id, recv.type, loc) : recv);
|
|
1301
|
+
const tests = [];
|
|
1302
|
+
const staticName = recv.type.className;
|
|
1303
|
+
for (const c of lowerer.classes.values()) {
|
|
1304
|
+
const name = c.def.name;
|
|
1305
|
+
if (name === staticName || !lowerer.isSubclassOf(name, staticName) || !declares(c))
|
|
1306
|
+
continue;
|
|
1307
|
+
// A declaring ancestor below the static class already covers it.
|
|
1308
|
+
if (c.base && c.base.def.name !== staticName && declares(c.base))
|
|
1309
|
+
continue;
|
|
1310
|
+
tests.push({ kind: "instanceOf", value: ref(), className: name, type: BOOL, loc });
|
|
1311
|
+
}
|
|
1312
|
+
tests.push({
|
|
1313
|
+
kind: "libCall",
|
|
1314
|
+
fn: "error.hasKey",
|
|
1315
|
+
args: [ref(), { kind: "strLit", value: key, type: STRING, loc }],
|
|
1316
|
+
type: BOOL,
|
|
1317
|
+
loc,
|
|
1318
|
+
});
|
|
1319
|
+
const answer = tests.reduce((acc, test) => ({
|
|
1320
|
+
kind: "logical",
|
|
1321
|
+
op: "||",
|
|
1322
|
+
left: acc,
|
|
1323
|
+
right: test,
|
|
1324
|
+
type: BOOL,
|
|
1325
|
+
loc,
|
|
1326
|
+
}));
|
|
1327
|
+
if (!slot)
|
|
1328
|
+
return answer;
|
|
1329
|
+
return {
|
|
1330
|
+
kind: "seqExpr",
|
|
1331
|
+
stmts: [{ kind: "varDecl", localId: slot.id, init: recv, loc }],
|
|
1332
|
+
result: answer,
|
|
1333
|
+
type: BOOL,
|
|
1334
|
+
loc,
|
|
1335
|
+
};
|
|
1336
|
+
}
|
|
1337
|
+
lowerer.unsupported("SC1090", expr, `'in' with the key '${key}' on Error receivers (code answers from the error's code slot; message and name are always present)`);
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1340
|
+
// A dyn receiver (`"portless" in pkg` after the `typeof pkg ===
|
|
1341
|
+
// "object"` guard): own-member presence on the checked-dynamic tree — tsc admits `in`
|
|
1342
|
+
// only on object-typed operands, so unit receivers are unreachable.
|
|
1343
|
+
if (recv.type.kind === "dyn") {
|
|
1344
|
+
return { kind: "dynHasKey", key, value: recv, type: BOOL, loc };
|
|
1345
|
+
}
|
|
1346
|
+
// `"k" in u` over a UNION whose arms are FIXED record shapes: every
|
|
1347
|
+
// arm answers membership STATICALLY (a declared non-optional field is
|
|
1348
|
+
// always present, an undeclared name never is), so the whole test
|
|
1349
|
+
// collapses to runtime TAG tests — tsc's own narrowing then types the
|
|
1350
|
+
// branches (the discriminating-`in` idiom). An arm declaring the key
|
|
1351
|
+
// as an optional (undefined-armed) slot answers per VALUE instead:
|
|
1352
|
+
// its tag test joins that payload's presence test (see
|
|
1353
|
+
// perValueUnionIn). Tuple/index-signature arms keep the fence below.
|
|
1354
|
+
if (recv.type.kind === "union") {
|
|
1355
|
+
const unionId = recv.type.unionId;
|
|
1356
|
+
const arms = lowerer.unions.get(unionId)?.arms ?? [];
|
|
1357
|
+
const answers = [];
|
|
1358
|
+
let staticAnswers = arms.length > 0;
|
|
1359
|
+
for (const arm of arms) {
|
|
1360
|
+
const tag = lowerer.armTag(unionId, arm);
|
|
1361
|
+
const shape = arm.kind === "record" ? lowerer.shapes.get(arm.shapeId) : undefined;
|
|
1362
|
+
if (tag < 0 || !shape || shape.tuple || shape.indexValue) {
|
|
1363
|
+
staticAnswers = false;
|
|
1364
|
+
break;
|
|
1365
|
+
}
|
|
1366
|
+
const f = shape.fields.find((x) => x.name === key);
|
|
1367
|
+
const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
|
|
1368
|
+
if (f &&
|
|
1369
|
+
!inherited &&
|
|
1370
|
+
f.type.kind === "union" &&
|
|
1371
|
+
lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0) {
|
|
1372
|
+
answers.push({ tag, has: "slot", arm }); // presence is per-value
|
|
1373
|
+
continue;
|
|
1374
|
+
}
|
|
1375
|
+
// Accessor properties are own properties to `in` (Node answers
|
|
1376
|
+
// true without invoking the getter) — either slot present makes
|
|
1377
|
+
// the name a member.
|
|
1378
|
+
const acc = shape.fields.some((x) => x.name === `%get:${key}` || x.name === `%set:${key}`);
|
|
1379
|
+
answers.push({ tag, has: f !== undefined || acc || inherited, arm });
|
|
1380
|
+
}
|
|
1381
|
+
if (staticAnswers && answers.some((a) => a.has === "slot")) {
|
|
1382
|
+
return perValueUnionIn(lowerer, recv, unionId, key, answers, loc);
|
|
1383
|
+
}
|
|
1384
|
+
if (staticAnswers) {
|
|
1385
|
+
const pureRecv = recv.kind === "varRef" ||
|
|
1386
|
+
recv.kind === "recordGet" ||
|
|
1387
|
+
recv.kind === "fieldGet" ||
|
|
1388
|
+
pureRecvNode;
|
|
1389
|
+
const isTag = (tag, negated) => ({
|
|
1390
|
+
kind: "unionIsTag",
|
|
1391
|
+
unionId,
|
|
1392
|
+
tag,
|
|
1393
|
+
negated,
|
|
1394
|
+
value: recv,
|
|
1395
|
+
type: BOOL,
|
|
1396
|
+
loc,
|
|
1397
|
+
});
|
|
1398
|
+
const trues = answers.filter((a) => a.has);
|
|
1399
|
+
if (trues.length === answers.length || trues.length === 0) {
|
|
1400
|
+
// Constant either way — but JS still EVALUATES the operand (it
|
|
1401
|
+
// may throw: an ambient-const read is a ReferenceError). Pure
|
|
1402
|
+
// reads fold; anything else rides one tag test whose branches
|
|
1403
|
+
// agree, evaluating the receiver exactly once.
|
|
1404
|
+
const ans = trues.length !== 0;
|
|
1405
|
+
if (pureRecv)
|
|
1406
|
+
return { kind: "boolLit", value: ans, type: BOOL, loc };
|
|
1407
|
+
return {
|
|
1408
|
+
kind: "ternary",
|
|
1409
|
+
cond: isTag(answers[0].tag, false),
|
|
1410
|
+
then: { kind: "boolLit", value: ans, type: BOOL, loc },
|
|
1411
|
+
else_: { kind: "boolLit", value: ans, type: BOOL, loc },
|
|
1412
|
+
type: BOOL,
|
|
1413
|
+
loc,
|
|
1414
|
+
};
|
|
1415
|
+
}
|
|
1416
|
+
// One deciding arm (either polarity): a single tag test, receiver
|
|
1417
|
+
// evaluated once — no purity requirement.
|
|
1418
|
+
if (trues.length === 1)
|
|
1419
|
+
return isTag(trues[0].tag, false);
|
|
1420
|
+
const falses = answers.filter((a) => !a.has);
|
|
1421
|
+
if (falses.length === 1)
|
|
1422
|
+
return isTag(falses[0].tag, true);
|
|
1423
|
+
// Several arms on each side: the OR chain re-reads the receiver,
|
|
1424
|
+
// so only side-effect-free reads qualify.
|
|
1425
|
+
if (pureRecv) {
|
|
1426
|
+
let out = isTag(trues[0].tag, false);
|
|
1427
|
+
for (const t of trues.slice(1)) {
|
|
1428
|
+
out = {
|
|
1429
|
+
kind: "logical",
|
|
1430
|
+
op: "||",
|
|
1431
|
+
left: out,
|
|
1432
|
+
right: isTag(t.tag, false),
|
|
1433
|
+
type: BOOL,
|
|
1434
|
+
loc,
|
|
1435
|
+
};
|
|
1436
|
+
}
|
|
1437
|
+
return out;
|
|
1438
|
+
}
|
|
1439
|
+
lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
|
|
1440
|
+
}
|
|
1441
|
+
}
|
|
1442
|
+
if (recv.type.kind !== "record") {
|
|
1443
|
+
lowerer.unsupported("SC1090", expr, `'in' on '${lowerer.fmt(recv.type)}' receivers (only process.env, Error instances, record-typed values, and unions of fixed record shapes answer; ${NARROW_FIRST})`);
|
|
1444
|
+
}
|
|
1445
|
+
const shape = lowerer.shapes.get(recv.type.shapeId);
|
|
1446
|
+
if (!shape)
|
|
1447
|
+
throw new InternalCompilerError(`lowerer bug: unknown shape ${recv.type.shapeId}`);
|
|
1448
|
+
const field = shape.fields.find((f) => f.name === key);
|
|
1449
|
+
if (field) {
|
|
1450
|
+
if (!OBJECT_PROTOTYPE_KEYS.has(key) &&
|
|
1451
|
+
field.type.kind === "union" &&
|
|
1452
|
+
lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) {
|
|
1453
|
+
// Optional slot: the key is present unless the field is absent
|
|
1454
|
+
// (omitted or deleted); an explicit undefined is present.
|
|
1455
|
+
return lowerer.recordFieldPresent(recv, recv.type.shapeId, key, loc);
|
|
1456
|
+
}
|
|
1457
|
+
// A declared non-optional field always exists on every value of the
|
|
1458
|
+
// shape — statically true, but folding may only drop a
|
|
1459
|
+
// side-effect-free receiver read.
|
|
1460
|
+
if (recv.kind === "varRef" ||
|
|
1461
|
+
recv.kind === "recordGet" ||
|
|
1462
|
+
recv.kind === "fieldGet" ||
|
|
1463
|
+
pureRecvNode) {
|
|
1464
|
+
return { kind: "boolLit", value: true, type: BOOL, loc };
|
|
1465
|
+
}
|
|
1466
|
+
lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
|
|
1467
|
+
}
|
|
1468
|
+
// Accessor properties answer `in` as own members (Node: true, getter
|
|
1469
|
+
// NOT invoked) — statically true under the same purity discipline as
|
|
1470
|
+
// declared non-optional fields.
|
|
1471
|
+
if (shape.fields.some((f) => f.name === `%get:${key}` || f.name === `%set:${key}`)) {
|
|
1472
|
+
if (recv.kind === "varRef" ||
|
|
1473
|
+
recv.kind === "recordGet" ||
|
|
1474
|
+
recv.kind === "fieldGet" ||
|
|
1475
|
+
pureRecvNode) {
|
|
1476
|
+
return { kind: "boolLit", value: true, type: BOOL, loc };
|
|
1477
|
+
}
|
|
1478
|
+
lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
|
|
1479
|
+
}
|
|
1480
|
+
// Records are ordinary objects: Object.prototype's members are in them.
|
|
1481
|
+
const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
|
|
1482
|
+
if (shape.indexValue && !inherited) {
|
|
1483
|
+
lowerer.unsupported("SC1090", expr, "'in' over index-signature keys (read the key and test '!== undefined' instead)");
|
|
1484
|
+
}
|
|
1485
|
+
if (recv.kind === "varRef" ||
|
|
1486
|
+
recv.kind === "recordGet" ||
|
|
1487
|
+
recv.kind === "fieldGet" ||
|
|
1488
|
+
pureRecvNode) {
|
|
1489
|
+
// A null-prototype record (Object.groupBy) has no inherited names.
|
|
1490
|
+
const nullProtoT = inherited ? nullProtoRecordShape(lowerer, recv.type) : null;
|
|
1491
|
+
if (nullProtoT) {
|
|
1492
|
+
return {
|
|
1493
|
+
kind: "unary",
|
|
1494
|
+
op: "!",
|
|
1495
|
+
operand: recordNullProtoTest(recv, nullProtoT.shapeId, loc),
|
|
1496
|
+
type: BOOL,
|
|
1497
|
+
loc,
|
|
1498
|
+
};
|
|
1499
|
+
}
|
|
1500
|
+
return { kind: "boolLit", value: inherited, type: BOOL, loc };
|
|
1501
|
+
}
|
|
1502
|
+
lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
|
|
1503
|
+
}
|
|
1504
|
+
/** `"k" in u` over a union of fixed record shapes where some arm declares
|
|
1505
|
+
* `k` as an optional slot. Arms without the name answer false and arms
|
|
1506
|
+
* with an always-present member answer true, both by tag; an optional
|
|
1507
|
+
* slot answers its payload's own-property presence (an explicit
|
|
1508
|
+
* undefined is present, an omitted or deleted property is not), read
|
|
1509
|
+
* through the checked arm extraction the tag test has just proven. The
|
|
1510
|
+
* receiver evaluates once: a non-repeatable one is stabilized in a
|
|
1511
|
+
* hidden local first. */
|
|
1512
|
+
function perValueUnionIn(lowerer, recv, unionId, key, answers, loc) {
|
|
1513
|
+
const recvType = recv.type;
|
|
1514
|
+
const stable = isSafeToRepeat(recv) ? null : lowerer.declareHiddenLocal("%inRecv", recvType);
|
|
1515
|
+
const ref = () => (stable ? varRef(stable.id, recvType, loc) : recv);
|
|
1516
|
+
const isTag = (tag) => ({
|
|
1517
|
+
kind: "unionIsTag",
|
|
1518
|
+
unionId,
|
|
1519
|
+
tag,
|
|
1520
|
+
negated: false,
|
|
1521
|
+
value: ref(),
|
|
1522
|
+
type: BOOL,
|
|
1523
|
+
loc,
|
|
1524
|
+
});
|
|
1525
|
+
let out = null;
|
|
1526
|
+
for (const a of answers) {
|
|
1527
|
+
if (a.has === false)
|
|
1528
|
+
continue;
|
|
1529
|
+
let test = isTag(a.tag);
|
|
1530
|
+
if (a.has === "slot" && a.arm.kind === "record") {
|
|
1531
|
+
test = {
|
|
1532
|
+
kind: "logical",
|
|
1533
|
+
op: "&&",
|
|
1534
|
+
left: test,
|
|
1535
|
+
right: {
|
|
1536
|
+
kind: "recordHas",
|
|
1537
|
+
obj: {
|
|
1538
|
+
kind: "unionNarrow",
|
|
1539
|
+
unionId,
|
|
1540
|
+
tag: a.tag,
|
|
1541
|
+
value: ref(),
|
|
1542
|
+
type: a.arm,
|
|
1543
|
+
loc,
|
|
1544
|
+
},
|
|
1545
|
+
shapeId: a.arm.shapeId,
|
|
1546
|
+
field: key,
|
|
1547
|
+
type: BOOL,
|
|
1548
|
+
loc,
|
|
1549
|
+
},
|
|
1550
|
+
type: BOOL,
|
|
1551
|
+
loc,
|
|
1552
|
+
};
|
|
1553
|
+
}
|
|
1554
|
+
out = out ? { kind: "logical", op: "||", left: out, right: test, type: BOOL, loc } : test;
|
|
1555
|
+
}
|
|
1556
|
+
const result = out ?? { kind: "boolLit", value: false, type: BOOL, loc };
|
|
1557
|
+
if (!stable)
|
|
1558
|
+
return result;
|
|
1559
|
+
return {
|
|
1560
|
+
kind: "seqExpr",
|
|
1561
|
+
stmts: [{ kind: "varDecl", localId: stable.id, init: recv, loc }],
|
|
1562
|
+
result,
|
|
1563
|
+
type: BOOL,
|
|
1564
|
+
loc,
|
|
1565
|
+
};
|
|
1566
|
+
}
|
|
1567
|
+
/** The runtime-key `in` (see lowerInExpression): `k in r` where k is a
|
|
1568
|
+
* runtime string and r an index-signature record — an interned
|
|
1569
|
+
* `%rec.haskey.<n>(k, r)` walks the declared names (a string-equality
|
|
1570
|
+
* chain: non-optional fields and accessor slots answer true, optional
|
|
1571
|
+
* slots answer their per-value tag test) and then probes the overflow
|
|
1572
|
+
* map's hashed key set. Null when the pair is outside that shape (the
|
|
1573
|
+
* caller keeps its fence). */
|
|
1574
|
+
function lowerRuntimeKeyIn(lowerer, expr, loc) {
|
|
1575
|
+
if (lowerer.mapTypeOf(lowerer.typeOf(expr.left))?.kind !== "string")
|
|
1576
|
+
return null;
|
|
1577
|
+
const recvT = lowerer.mapTypeOf(lowerer.typeOf(expr.right));
|
|
1578
|
+
if (recvT?.kind !== "record")
|
|
1579
|
+
return null;
|
|
1580
|
+
const shape = lowerer.shapes.get(recvT.shapeId);
|
|
1581
|
+
if (!shape?.indexValue || shape.tuple)
|
|
1582
|
+
return null;
|
|
1583
|
+
const keyIr = lowerer.lowerExprExpecting(expr.left, STRING);
|
|
1584
|
+
const recv = lowerer.lowerExprExpecting(expr.right, recvT);
|
|
1585
|
+
const hkey = `haskey:${recvT.shapeId}`;
|
|
1586
|
+
let helper = lowerer.valueHelpers.get(hkey);
|
|
1587
|
+
if (!helper) {
|
|
1588
|
+
helper = `%rec.haskey.${lowerer.valueHelpers.size}`;
|
|
1589
|
+
lowerer.valueHelpers.set(hkey, helper);
|
|
1590
|
+
const recT = { kind: "record", shapeId: recvT.shapeId };
|
|
1591
|
+
const k = varRef("k.0", STRING, loc);
|
|
1592
|
+
const r = varRef("r.0", recT, loc);
|
|
1593
|
+
const body = [];
|
|
1594
|
+
const ret = (value) => ({ kind: "return", value, loc });
|
|
1595
|
+
for (const f of shape.fields) {
|
|
1596
|
+
const accessor = f.name.startsWith("%get:") || f.name.startsWith("%set:");
|
|
1597
|
+
if (f.name.startsWith("%") && !accessor)
|
|
1598
|
+
continue;
|
|
1599
|
+
const name = accessor ? f.name.slice(5) : f.name;
|
|
1600
|
+
const eq = {
|
|
1601
|
+
kind: "strEq",
|
|
1602
|
+
negated: false,
|
|
1603
|
+
left: k,
|
|
1604
|
+
right: { kind: "strLit", value: name, type: STRING, loc },
|
|
1605
|
+
type: BOOL,
|
|
1606
|
+
loc,
|
|
1607
|
+
};
|
|
1608
|
+
const answer = accessor
|
|
1609
|
+
? { kind: "boolLit", value: true, type: BOOL, loc }
|
|
1610
|
+
: lowerer.recordFieldPresent(r, recvT.shapeId, f.name, loc);
|
|
1611
|
+
body.push({ kind: "if", cond: eq, then: [ret(answer)], else_: null, loc });
|
|
1612
|
+
}
|
|
1613
|
+
// Overflow keys answer through the map's hashed presence probe (a
|
|
1614
|
+
// stored undefined value is still present), not a scan over a fresh
|
|
1615
|
+
// key snapshot, which made `k in dict` loops quadratic.
|
|
1616
|
+
const ovfHas = {
|
|
1617
|
+
kind: "recordOvfHas",
|
|
1618
|
+
obj: r,
|
|
1619
|
+
shapeId: recvT.shapeId,
|
|
1620
|
+
key: k,
|
|
1621
|
+
type: BOOL,
|
|
1622
|
+
loc,
|
|
1623
|
+
};
|
|
1624
|
+
// A miss in the record's own keys still finds Object.prototype's,
|
|
1625
|
+
// unless the record has a null prototype (Object.groupBy).
|
|
1626
|
+
let protoName = null;
|
|
1627
|
+
for (const name of OBJECT_PROTOTYPE_KEYS) {
|
|
1628
|
+
if (shape.fields.some((f) => f.name === name))
|
|
1629
|
+
continue;
|
|
1630
|
+
const eq = {
|
|
1631
|
+
kind: "strEq",
|
|
1632
|
+
negated: false,
|
|
1633
|
+
left: k,
|
|
1634
|
+
right: { kind: "strLit", value: name, type: STRING, loc },
|
|
1635
|
+
type: BOOL,
|
|
1636
|
+
loc,
|
|
1637
|
+
};
|
|
1638
|
+
protoName =
|
|
1639
|
+
protoName === null
|
|
1640
|
+
? eq
|
|
1641
|
+
: { kind: "logical", op: "||", left: protoName, right: eq, type: BOOL, loc };
|
|
1642
|
+
}
|
|
1643
|
+
if (protoName !== null && nullProtoRecordShape(lowerer, recT)) {
|
|
1644
|
+
protoName = {
|
|
1645
|
+
kind: "logical",
|
|
1646
|
+
op: "&&",
|
|
1647
|
+
left: protoName,
|
|
1648
|
+
right: {
|
|
1649
|
+
kind: "unary",
|
|
1650
|
+
op: "!",
|
|
1651
|
+
operand: recordNullProtoTest(r, recvT.shapeId, loc),
|
|
1652
|
+
type: BOOL,
|
|
1653
|
+
loc,
|
|
1654
|
+
},
|
|
1655
|
+
type: BOOL,
|
|
1656
|
+
loc,
|
|
1657
|
+
};
|
|
1658
|
+
}
|
|
1659
|
+
body.push(ret(protoName === null
|
|
1660
|
+
? ovfHas
|
|
1661
|
+
: { kind: "logical", op: "||", left: ovfHas, right: protoName, type: BOOL, loc }));
|
|
1662
|
+
lowerer.liftedFns.push({
|
|
1663
|
+
name: helper,
|
|
1664
|
+
params: [
|
|
1665
|
+
{ localId: "k.0", name: "k", type: STRING },
|
|
1666
|
+
{ localId: "r.0", name: "r", type: recT },
|
|
1667
|
+
],
|
|
1668
|
+
returnType: BOOL,
|
|
1669
|
+
locals: [
|
|
1670
|
+
{ id: "k.0", name: "k", type: STRING, mutable: true },
|
|
1671
|
+
{ id: "r.0", name: "r", type: recT, mutable: true },
|
|
1672
|
+
],
|
|
1673
|
+
body,
|
|
1674
|
+
loc,
|
|
1675
|
+
});
|
|
1676
|
+
}
|
|
1677
|
+
return { kind: "call", callee: helper, args: [keyIr, recv], type: BOOL, loc };
|
|
1678
|
+
}
|
|
1679
|
+
//# sourceMappingURL=relational.js.map
|