@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
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { primitiveConstructorOr } from "./lower-exprs.js";
|
|
2
|
+
import { dynUndefinedExpr, helperLoc, nodeThrowExpr, varRef } from "../../ir/build.js";
|
|
3
|
+
import { constructedValue } from "./constructor-returns.js";
|
|
2
4
|
import { eventTargetApiMembers, eventTargetInheritedMember } from "./lower-event-target.js";
|
|
3
5
|
import { BOOL, DYN, F64, DYN_CLASS_PROPERTIES as PROPERTY_BAG, STRING, VOID, canConvertToDyn, canDynCheckTo, isClassOwnEnumerableFieldName, isDynTypedRefType, isUnitType, typeEquals, typeKey, } from "../../ir/ir.js";
|
|
4
6
|
import { streamTypedRefEligible } from "../../ir/analysis.js";
|
|
5
7
|
import { everyStmtList, transformExpr, transformStmtList } from "../../ir/traverse.js";
|
|
6
8
|
import { PoisonError } from "./lowerer.js";
|
|
7
|
-
import { implicitDefaultInstance } from "./generic-functions.js";
|
|
9
|
+
import { erasedGenericInstance, implicitDefaultInstance } from "./generic-functions.js";
|
|
8
10
|
import {} from "./call-signatures.js";
|
|
9
11
|
import { accessorCall, classValueRef, findGenericMethodOn, findGenericStaticOn, findMethodOn, findStaticOn, genericOverrideBelow, upcastTo, } from "./lower-classes.js";
|
|
10
|
-
import { classPrototypeData, hasClassPrototypeData, reflectClassPrototype, } from "./class-prototypes.js";
|
|
12
|
+
import { classPrototypeData, hasClassPrototypeData, observedPrototypeMethod, reflectClassPrototype, } from "./class-prototypes.js";
|
|
13
|
+
import { perEvaluationPrivateNames } from "./private-brands.js";
|
|
11
14
|
import { errorPropertyRead, errorPropertyWrite, errorToStringCall, errorToStringMethod, refreshErrorPropertyDispatch, refreshErrorMethodDispatch, } from "./error-methods.js";
|
|
12
15
|
import { GeneratorDynamicDispatch } from "./generator-dynamic-dispatch.js";
|
|
13
16
|
import { classMethodValue, reflectedClassStaticMethodValue, refreshClassMethodValueSelections, } from "./class-method-values.js";
|
|
@@ -22,6 +25,7 @@ import { ClassConstructionDispatch } from "./class-construction.js";
|
|
|
22
25
|
import { emitterRooted } from "./lower-event-emitter.js";
|
|
23
26
|
import { protocolArm, protocolFieldArm } from "./class-protocol-dispatch.js";
|
|
24
27
|
import { STREAM_OPERATORS } from "./lower-stream.js";
|
|
28
|
+
import { deletedPropertyNames, fixedFieldFamily } from "./js-class-fields.js";
|
|
25
29
|
const STREAM_METHODS = new Set([
|
|
26
30
|
"on",
|
|
27
31
|
"addListener",
|
|
@@ -96,6 +100,80 @@ function symbolMemberKey(lowerer, info, name, loc) {
|
|
|
96
100
|
}
|
|
97
101
|
return null;
|
|
98
102
|
}
|
|
103
|
+
const CONVERSION_CALL_PREFIX = "%conversionCall.";
|
|
104
|
+
const TO_PRIMITIVE_PREFIX = "%dyn.class.toPrimitive.";
|
|
105
|
+
/** Operations that convert their dynamic operands with ToPrimitive: `+`
|
|
106
|
+
* and `==` take the default hint, the arithmetic, bitwise, relational and
|
|
107
|
+
* numeric conversions the number hint, and the string conversions the
|
|
108
|
+
* string hint. */
|
|
109
|
+
const DEFAULT_HINT_CALLS = new Set(["dyn.abstractEq", "dyn.add"]);
|
|
110
|
+
const NUMBER_HINT_CALLS = new Set([
|
|
111
|
+
"dyn.arithmetic",
|
|
112
|
+
"dyn.bigintConstructor",
|
|
113
|
+
"dyn.bitwise",
|
|
114
|
+
"dyn.compare",
|
|
115
|
+
"dyn.numberConstructor",
|
|
116
|
+
"dyn.toNumberCoerce",
|
|
117
|
+
"dyn.toNumeric",
|
|
118
|
+
]);
|
|
119
|
+
const STRING_HINT_CALLS = new Set(["dyn.stringConstructor", "dyn.toStringCoerce"]);
|
|
120
|
+
/** Operations whose second operand is a property key, converted with the
|
|
121
|
+
* string hint when the receiver admits a key: `in` needs an object,
|
|
122
|
+
* propertyIsEnumerable converts before checking its receiver, and the
|
|
123
|
+
* others need a receiver other than null and undefined. */
|
|
124
|
+
const KEY_CALLS = new Map([
|
|
125
|
+
["dyn.hasKeyComputed", "object"],
|
|
126
|
+
["dyn.propertyIsEnumerableComputed", "any"],
|
|
127
|
+
["dyn.hasOwnComputed", "value"],
|
|
128
|
+
["dyn.keyDeleteComputed", "value"],
|
|
129
|
+
["dyn.keySetComputed", "value"],
|
|
130
|
+
]);
|
|
131
|
+
function toPrimitiveHint(expr) {
|
|
132
|
+
if (expr.kind === "toString")
|
|
133
|
+
return expr.operand.type.kind === "dyn" ? "string" : null;
|
|
134
|
+
if (expr.kind === "dynKeyGet")
|
|
135
|
+
return expr.key.type.kind === "dyn" ? "string" : null;
|
|
136
|
+
if (expr.kind !== "libCall")
|
|
137
|
+
return null;
|
|
138
|
+
if (DEFAULT_HINT_CALLS.has(expr.fn))
|
|
139
|
+
return "default";
|
|
140
|
+
if (NUMBER_HINT_CALLS.has(expr.fn))
|
|
141
|
+
return "number";
|
|
142
|
+
if (STRING_HINT_CALLS.has(expr.fn) || KEY_CALLS.has(expr.fn))
|
|
143
|
+
return "string";
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
/** An operand that needs no conversion: already passed through a
|
|
147
|
+
* conversion helper (loose equality converts conditionally), or boxed from
|
|
148
|
+
* a statically primitive value. */
|
|
149
|
+
function isConversion(expr) {
|
|
150
|
+
if (expr.kind === "ternary")
|
|
151
|
+
return isConversion(expr.then);
|
|
152
|
+
if (expr.kind === "dynFrom")
|
|
153
|
+
return PRIMITIVE_KINDS.has(expr.value.type.kind);
|
|
154
|
+
return expr.kind === "call" && expr.callee.startsWith(TO_PRIMITIVE_PREFIX);
|
|
155
|
+
}
|
|
156
|
+
const PRIMITIVE_KINDS = new Set([
|
|
157
|
+
"f64",
|
|
158
|
+
"string",
|
|
159
|
+
"bool",
|
|
160
|
+
"bigint",
|
|
161
|
+
"symbol",
|
|
162
|
+
"undefinedT",
|
|
163
|
+
"nullT",
|
|
164
|
+
]);
|
|
165
|
+
/** A declared conversion method, own or inherited. */
|
|
166
|
+
function conversionMethod(lowerer, info, method) {
|
|
167
|
+
if (info.fields.has(method))
|
|
168
|
+
return false;
|
|
169
|
+
const found = findMethodOn(lowerer, info, method);
|
|
170
|
+
return !!found && !found.declarer.builtinError;
|
|
171
|
+
}
|
|
172
|
+
function isPrimitive(value, loc) {
|
|
173
|
+
return ["number", "string", "boolean", "undefined", "null", "bigint", "symbol"]
|
|
174
|
+
.map((test) => ({ kind: "dynTest", test, value, type: BOOL, loc }))
|
|
175
|
+
.reduce((a, b) => ({ kind: "logical", op: "||", left: a, right: b, type: BOOL, loc }));
|
|
176
|
+
}
|
|
99
177
|
export function classInstanceOf(lowerer, value, info, loc, classValue) {
|
|
100
178
|
const name = `%dyn.class.${classValue ? "valueInstanceof" : "instanceof"}:${info.def.name}`;
|
|
101
179
|
const params = [
|
|
@@ -490,6 +568,9 @@ export class ClassDynamicDispatch {
|
|
|
490
568
|
generatorDispatch = new GeneratorDynamicDispatch();
|
|
491
569
|
caughtDispatch = new CaughtValueDispatch();
|
|
492
570
|
constructionDispatch = new ClassConstructionDispatch();
|
|
571
|
+
/** Property names a delete can remove (null: any name), for the field
|
|
572
|
+
* creation tracking decision. */
|
|
573
|
+
deletedNames;
|
|
493
574
|
boxed = new Set();
|
|
494
575
|
boxedConstructors = new Set();
|
|
495
576
|
dispatches = new Map();
|
|
@@ -505,6 +586,8 @@ export class ClassDynamicDispatch {
|
|
|
505
586
|
bagClasses = new Set();
|
|
506
587
|
bagInitializers = new Map();
|
|
507
588
|
typedPropertyBags = new Map();
|
|
589
|
+
/** Per-class prototype selection for new property bags (bagPrototypeHelper). */
|
|
590
|
+
bagPrototypeHelpers = new Map();
|
|
508
591
|
readPropertyBags = [];
|
|
509
592
|
generated = new Set();
|
|
510
593
|
/** Protocol dispatch helpers and callee reads whose receivers normalize. */
|
|
@@ -525,6 +608,13 @@ export class ClassDynamicDispatch {
|
|
|
525
608
|
/** The for-in key helpers, by libCall (dyn and native string[] keys). */
|
|
526
609
|
enumerations = new Map();
|
|
527
610
|
enumerationClasses = new Set();
|
|
611
|
+
/** OrdinaryToPrimitive over boxed class instances, by hint, and the
|
|
612
|
+
* per-class method calls its arms make. */
|
|
613
|
+
toPrimitives = new Map();
|
|
614
|
+
toPrimitiveCalls = new Map();
|
|
615
|
+
/** `value.valueOf()` and `value.toString()` on a dynamic receiver: a test
|
|
616
|
+
* for boxed instances of classes declaring the method, and the call. */
|
|
617
|
+
conversionCalls = new Map();
|
|
528
618
|
process(lowerer, functions) {
|
|
529
619
|
// Dispatch tables grow between worklist waves. Keep their normalization
|
|
530
620
|
// entry ahead of every newly inserted branch after rebuilding the tables.
|
|
@@ -543,6 +633,8 @@ export class ClassDynamicDispatch {
|
|
|
543
633
|
changed = this.constructionDispatch.process(lowerer, functions) || changed;
|
|
544
634
|
const seenTypes = new Set();
|
|
545
635
|
const rewrite = new Set();
|
|
636
|
+
const toPrimitiveSites = new Set();
|
|
637
|
+
const hasKeySites = new Set();
|
|
546
638
|
const discover = (type) => {
|
|
547
639
|
const key = typeKey(type);
|
|
548
640
|
if (seenTypes.has(key))
|
|
@@ -586,6 +678,9 @@ export class ClassDynamicDispatch {
|
|
|
586
678
|
(expr.fn === "json.stringifyValue" || expr.fn === "json.stringifyReplacer"))) {
|
|
587
679
|
this.serializesClasses = true;
|
|
588
680
|
}
|
|
681
|
+
if (toPrimitiveHint(expr) !== null ||
|
|
682
|
+
(expr.kind === "libCall" && (expr.fn === "dyn.valueOf" || expr.fn === "dyn.toString")))
|
|
683
|
+
toPrimitiveSites.add(fn);
|
|
589
684
|
switch (expr.kind) {
|
|
590
685
|
case "dynFrom":
|
|
591
686
|
discover(expr.value.type);
|
|
@@ -602,6 +697,9 @@ export class ClassDynamicDispatch {
|
|
|
602
697
|
isDynTypedRefType(expr.args[0].value.type))
|
|
603
698
|
rewrite.add(fn);
|
|
604
699
|
break;
|
|
700
|
+
case "dynHasKey":
|
|
701
|
+
hasKeySites.add(fn);
|
|
702
|
+
break;
|
|
605
703
|
case "dynKeyGet":
|
|
606
704
|
case "dynInvoke":
|
|
607
705
|
rewrite.add(fn);
|
|
@@ -609,6 +707,13 @@ export class ClassDynamicDispatch {
|
|
|
609
707
|
case "dynCheck":
|
|
610
708
|
if (isDynTypedRefType(expr.type))
|
|
611
709
|
rewrite.add(fn);
|
|
710
|
+
// A dynamic function checked into a native function type
|
|
711
|
+
// receives its arguments as dynamic values: class instances
|
|
712
|
+
// passed to it cross the boundary when it is called (a JS
|
|
713
|
+
// `list.map((rec) => rec.match(x))` callback with an untyped
|
|
714
|
+
// parameter).
|
|
715
|
+
if (expr.type.kind === "func")
|
|
716
|
+
expr.type.params.forEach(discover);
|
|
612
717
|
break;
|
|
613
718
|
case "libCall":
|
|
614
719
|
if (expr.fn === "bytes.construct" ||
|
|
@@ -635,6 +740,15 @@ export class ClassDynamicDispatch {
|
|
|
635
740
|
});
|
|
636
741
|
if (this.boxed.size === 0 && rewrite.size === 0)
|
|
637
742
|
return changed;
|
|
743
|
+
const converting = this.convertingHints(lowerer);
|
|
744
|
+
const calling = this.calledConversions(lowerer);
|
|
745
|
+
if (converting.size || calling.size)
|
|
746
|
+
for (const fn of toPrimitiveSites)
|
|
747
|
+
rewrite.add(fn);
|
|
748
|
+
const prototypeMembers = this.prototypeMemberNames(lowerer);
|
|
749
|
+
if (prototypeMembers.size)
|
|
750
|
+
for (const fn of hasKeySites)
|
|
751
|
+
rewrite.add(fn);
|
|
638
752
|
for (const fn of functions) {
|
|
639
753
|
if (!fn.name.startsWith("%dyn.class.instanceof:") &&
|
|
640
754
|
!fn.name.startsWith("%dyn.class.valueInstanceof:"))
|
|
@@ -884,38 +998,7 @@ export class ClassDynamicDispatch {
|
|
|
884
998
|
}
|
|
885
999
|
const needsPrototype = (current) => hasClassPrototypeData(current) ||
|
|
886
1000
|
current.subclasses.some((child) => lowerer.classCanBeConstructed(child) && needsPrototype(child));
|
|
887
|
-
const prototypeFor = (current, receiver, loc) =>
|
|
888
|
-
const currentReceiver = receiver.type.kind === "object" && receiver.type.className !== current.def.name
|
|
889
|
-
? {
|
|
890
|
-
kind: "downcast",
|
|
891
|
-
value: receiver,
|
|
892
|
-
type: { kind: "object", className: current.def.name },
|
|
893
|
-
loc,
|
|
894
|
-
}
|
|
895
|
-
: receiver;
|
|
896
|
-
let result = classPrototypeData(lowerer, current, loc, currentReceiver);
|
|
897
|
-
for (const child of current.subclasses) {
|
|
898
|
-
if (!lowerer.classCanBeConstructed(child))
|
|
899
|
-
continue;
|
|
900
|
-
const selected = prototypeFor(child, receiver, loc);
|
|
901
|
-
if (selected && result)
|
|
902
|
-
result = {
|
|
903
|
-
kind: "ternary",
|
|
904
|
-
cond: {
|
|
905
|
-
kind: "instanceOf",
|
|
906
|
-
value: receiver,
|
|
907
|
-
className: child.def.name,
|
|
908
|
-
type: BOOL,
|
|
909
|
-
loc,
|
|
910
|
-
},
|
|
911
|
-
then: selected,
|
|
912
|
-
else_: result,
|
|
913
|
-
type: DYN,
|
|
914
|
-
loc,
|
|
915
|
-
};
|
|
916
|
-
}
|
|
917
|
-
return result;
|
|
918
|
-
};
|
|
1001
|
+
const prototypeFor = (current, receiver, loc) => this.bagPrototype(lowerer, current, receiver, loc);
|
|
919
1002
|
for (const existingInit of this.bagInitializers.get(className) ?? []) {
|
|
920
1003
|
if (existingInit.value.kind === "dynObjLit" && needsPrototype(info)) {
|
|
921
1004
|
const prototype = prototypeFor(info, existingInit.obj, existingInit.loc);
|
|
@@ -935,7 +1018,7 @@ export class ClassDynamicDispatch {
|
|
|
935
1018
|
continue;
|
|
936
1019
|
this.bagClasses.add(plan.key);
|
|
937
1020
|
this.ensurePropertyBag(info);
|
|
938
|
-
if (info.decl && isJsSourceFile(info.decl
|
|
1021
|
+
if (info.decl && isJsSourceFile(ts.getSourceFileOfNode(info.decl))) {
|
|
939
1022
|
let root = info;
|
|
940
1023
|
while (root.base && !root.base.def.runtime)
|
|
941
1024
|
root = root.base;
|
|
@@ -943,8 +1026,13 @@ export class ClassDynamicDispatch {
|
|
|
943
1026
|
current.def.tracksOwnFields = true;
|
|
944
1027
|
current.subclasses.forEach(track);
|
|
945
1028
|
};
|
|
946
|
-
// Runtime-owned roots keep their dedicated property contracts.
|
|
947
|
-
|
|
1029
|
+
// Runtime-owned roots keep their dedicated property contracts. A
|
|
1030
|
+
// family whose fields all exist from construction and are never
|
|
1031
|
+
// deleted keeps a fixed layout, as TypeScript classes do.
|
|
1032
|
+
// null is a result too; undefined means not computed yet.
|
|
1033
|
+
if (this.deletedNames === undefined)
|
|
1034
|
+
this.deletedNames = deletedPropertyNames(lowerer.moduleOrder);
|
|
1035
|
+
if (!root.base?.def.runtime && !fixedFieldFamily(root, this.deletedNames))
|
|
948
1036
|
track(root);
|
|
949
1037
|
}
|
|
950
1038
|
const loc = this.propertyBag.loc;
|
|
@@ -1060,6 +1148,54 @@ export class ClassDynamicDispatch {
|
|
|
1060
1148
|
fn.body = transformStmtList(fn.body, {
|
|
1061
1149
|
stmt: (stmt) => stmt,
|
|
1062
1150
|
expr: (expr) => {
|
|
1151
|
+
if (expr.kind === "dynHasKey" && prototypeMembers.has(expr.key)) {
|
|
1152
|
+
// A class instance's snapshot can carry its class's prototype
|
|
1153
|
+
// data, which holds only the methods the program reads through
|
|
1154
|
+
// the prototype. The computed-key form answers methods and
|
|
1155
|
+
// accessors from the class itself.
|
|
1156
|
+
const loc = expr.loc;
|
|
1157
|
+
const test = {
|
|
1158
|
+
kind: "libCall",
|
|
1159
|
+
fn: "dyn.hasKeyComputed",
|
|
1160
|
+
args: [
|
|
1161
|
+
expr.value,
|
|
1162
|
+
{
|
|
1163
|
+
kind: "dynFrom",
|
|
1164
|
+
value: { kind: "strLit", value: expr.key, type: STRING, loc },
|
|
1165
|
+
type: DYN,
|
|
1166
|
+
loc,
|
|
1167
|
+
},
|
|
1168
|
+
],
|
|
1169
|
+
type: BOOL,
|
|
1170
|
+
loc,
|
|
1171
|
+
};
|
|
1172
|
+
changed = true;
|
|
1173
|
+
return {
|
|
1174
|
+
kind: "seqExpr",
|
|
1175
|
+
stmts: [],
|
|
1176
|
+
result: expr.negated
|
|
1177
|
+
? { kind: "unary", op: "!", operand: test, type: BOOL, loc }
|
|
1178
|
+
: test,
|
|
1179
|
+
type: BOOL,
|
|
1180
|
+
loc,
|
|
1181
|
+
};
|
|
1182
|
+
}
|
|
1183
|
+
const called = calling.size ? this.convertMethodCall(lowerer, fn, expr, calling) : null;
|
|
1184
|
+
if (called) {
|
|
1185
|
+
changed = true;
|
|
1186
|
+
return called;
|
|
1187
|
+
}
|
|
1188
|
+
const converted = converting.size
|
|
1189
|
+
? this.convertOperands(lowerer, fn, expr, converting)
|
|
1190
|
+
: null;
|
|
1191
|
+
if (converted) {
|
|
1192
|
+
changed = true;
|
|
1193
|
+
// A hoisting sequence revisits the operation as its child; a
|
|
1194
|
+
// wrapped operation continues through the rewrites below.
|
|
1195
|
+
if (converted.kind === "seqExpr")
|
|
1196
|
+
return converted;
|
|
1197
|
+
expr = converted;
|
|
1198
|
+
}
|
|
1063
1199
|
if (expr.kind === "dynCheck" && isDynTypedRefType(expr.type)) {
|
|
1064
1200
|
const type = expr.type;
|
|
1065
1201
|
let cast = this.checkedCasts.get(type.className);
|
|
@@ -1767,6 +1903,48 @@ export class ClassDynamicDispatch {
|
|
|
1767
1903
|
// A read compares the bag with the receiver and then reads it:
|
|
1768
1904
|
// evaluate it once, so each read retains the receiver once.
|
|
1769
1905
|
const bagRead = varRef("bag.0", DYN, loc);
|
|
1906
|
+
const bagGet = read
|
|
1907
|
+
? {
|
|
1908
|
+
kind: "libCall",
|
|
1909
|
+
fn: "dyn.bagGet",
|
|
1910
|
+
args: [bagRead, read.key, varRef("p.0", DYN, loc)],
|
|
1911
|
+
type: DYN,
|
|
1912
|
+
loc,
|
|
1913
|
+
}
|
|
1914
|
+
: null;
|
|
1915
|
+
// A class instance whose class chain declares no member of an
|
|
1916
|
+
// Object.prototype method's name (classes that do answer in
|
|
1917
|
+
// their own branches) inherits it unless an own property
|
|
1918
|
+
// shadows it; a class constructor's static bag reads as before.
|
|
1919
|
+
const instanceRead = read && INHERITED_OBJECT_METHODS.has(name)
|
|
1920
|
+
? {
|
|
1921
|
+
kind: "ternary",
|
|
1922
|
+
cond: {
|
|
1923
|
+
kind: "dynTest",
|
|
1924
|
+
test: "function",
|
|
1925
|
+
value: varRef("p.0", DYN, loc),
|
|
1926
|
+
type: BOOL,
|
|
1927
|
+
loc,
|
|
1928
|
+
},
|
|
1929
|
+
then: bagGet,
|
|
1930
|
+
else_: {
|
|
1931
|
+
kind: "ternary",
|
|
1932
|
+
cond: this.readBagHas(lowerer, "dyn.hasKey", bagRead, read.key, loc),
|
|
1933
|
+
then: bagGet,
|
|
1934
|
+
else_: {
|
|
1935
|
+
kind: "libCall",
|
|
1936
|
+
fn: "dyn.builtinMethod",
|
|
1937
|
+
args: [{ kind: "strLit", value: "Object", type: STRING, loc }, read.key],
|
|
1938
|
+
type: DYN,
|
|
1939
|
+
loc,
|
|
1940
|
+
},
|
|
1941
|
+
type: DYN,
|
|
1942
|
+
loc,
|
|
1943
|
+
},
|
|
1944
|
+
type: DYN,
|
|
1945
|
+
loc,
|
|
1946
|
+
}
|
|
1947
|
+
: bagGet;
|
|
1770
1948
|
const fallback = read
|
|
1771
1949
|
? {
|
|
1772
1950
|
kind: "ternary",
|
|
@@ -1778,13 +1956,7 @@ export class ClassDynamicDispatch {
|
|
|
1778
1956
|
loc,
|
|
1779
1957
|
},
|
|
1780
1958
|
then: { ...read, value: bagRead },
|
|
1781
|
-
else_:
|
|
1782
|
-
kind: "libCall",
|
|
1783
|
-
fn: "dyn.bagGet",
|
|
1784
|
-
args: [bagRead, read.key, varRef("p.0", DYN, loc)],
|
|
1785
|
-
type: DYN,
|
|
1786
|
-
loc,
|
|
1787
|
-
},
|
|
1959
|
+
else_: instanceRead,
|
|
1788
1960
|
type: DYN,
|
|
1789
1961
|
loc,
|
|
1790
1962
|
}
|
|
@@ -1809,7 +1981,14 @@ export class ClassDynamicDispatch {
|
|
|
1809
1981
|
]
|
|
1810
1982
|
: [
|
|
1811
1983
|
{ kind: "varDecl", localId: "bag.0", init: bag, loc },
|
|
1812
|
-
{
|
|
1984
|
+
{
|
|
1985
|
+
kind: "return",
|
|
1986
|
+
// Primitives answer their wrapper constructors.
|
|
1987
|
+
value: name === "constructor"
|
|
1988
|
+
? primitiveConstructorOr(lowerer, varRef("p.0", DYN, loc), fallback, loc)
|
|
1989
|
+
: fallback,
|
|
1990
|
+
loc,
|
|
1991
|
+
},
|
|
1813
1992
|
],
|
|
1814
1993
|
loc,
|
|
1815
1994
|
};
|
|
@@ -2146,9 +2325,7 @@ export class ClassDynamicDispatch {
|
|
|
2146
2325
|
const value = varRef("p.0", DYN, loc);
|
|
2147
2326
|
const { receiver, condition } = this.propertyReceiver(plan, loc);
|
|
2148
2327
|
if (isClassCallback(lowerer, info, dispatch.source.method)) {
|
|
2149
|
-
const prototypeMethod = lowerer
|
|
2150
|
-
if (prototypeMethod)
|
|
2151
|
-
classPrototypeData(lowerer, info, loc);
|
|
2328
|
+
const prototypeMethod = observedPrototypeMethod(lowerer, info, dispatch.source.method, loc, receiver);
|
|
2152
2329
|
const bag = this.readPropertyBagOrEmpty(lowerer, value, loc);
|
|
2153
2330
|
dispatch.callback.body.unshift({
|
|
2154
2331
|
kind: "if",
|
|
@@ -2221,6 +2398,60 @@ export class ClassDynamicDispatch {
|
|
|
2221
2398
|
changed = true;
|
|
2222
2399
|
}
|
|
2223
2400
|
}
|
|
2401
|
+
for (const [method, conversion] of this.conversionCalls) {
|
|
2402
|
+
for (const plan of this.propertyReceivers(lowerer)) {
|
|
2403
|
+
if (conversion.classes.has(plan.key))
|
|
2404
|
+
continue;
|
|
2405
|
+
conversion.classes.add(plan.key);
|
|
2406
|
+
if (!conversionMethod(lowerer, plan.info, method))
|
|
2407
|
+
continue;
|
|
2408
|
+
const loc = conversion.call.loc;
|
|
2409
|
+
const { condition } = this.propertyReceiver(plan, loc);
|
|
2410
|
+
const value = varRef("p.0", DYN, loc);
|
|
2411
|
+
const result = {
|
|
2412
|
+
kind: "call",
|
|
2413
|
+
callee: this.toPrimitiveCall(lowerer, plan, method, method === "toString" ? 1 : 0, loc),
|
|
2414
|
+
args: method === "toString" ? [value, varRef("p.1", DYN, loc)] : [value],
|
|
2415
|
+
type: DYN,
|
|
2416
|
+
loc,
|
|
2417
|
+
};
|
|
2418
|
+
conversion.test.body.unshift({
|
|
2419
|
+
kind: "if",
|
|
2420
|
+
cond: condition,
|
|
2421
|
+
then: [{ kind: "return", value: { kind: "boolLit", value: true, type: BOOL, loc }, loc }],
|
|
2422
|
+
else_: null,
|
|
2423
|
+
loc,
|
|
2424
|
+
});
|
|
2425
|
+
conversion.call.body.unshift({
|
|
2426
|
+
kind: "if",
|
|
2427
|
+
cond: condition,
|
|
2428
|
+
then: [
|
|
2429
|
+
{
|
|
2430
|
+
kind: "return",
|
|
2431
|
+
value: method === "toString"
|
|
2432
|
+
? { kind: "dynCheck", value: result, type: STRING, loc }
|
|
2433
|
+
: result,
|
|
2434
|
+
loc,
|
|
2435
|
+
},
|
|
2436
|
+
],
|
|
2437
|
+
else_: null,
|
|
2438
|
+
loc,
|
|
2439
|
+
});
|
|
2440
|
+
changed = true;
|
|
2441
|
+
}
|
|
2442
|
+
}
|
|
2443
|
+
for (const [hint, conversion] of this.toPrimitives) {
|
|
2444
|
+
for (const plan of this.propertyReceivers(lowerer)) {
|
|
2445
|
+
if (conversion.classes.has(plan.key))
|
|
2446
|
+
continue;
|
|
2447
|
+
conversion.classes.add(plan.key);
|
|
2448
|
+
const arm = this.toPrimitiveArm(lowerer, plan, hint, conversion.fn);
|
|
2449
|
+
if (!arm)
|
|
2450
|
+
continue;
|
|
2451
|
+
conversion.fn.body.unshift(arm);
|
|
2452
|
+
changed = true;
|
|
2453
|
+
}
|
|
2454
|
+
}
|
|
2224
2455
|
for (const dispatch of lowerer.protocolDispatches.values()) {
|
|
2225
2456
|
if (!this.generated.has(dispatch.fn)) {
|
|
2226
2457
|
this.generated.add(dispatch.fn);
|
|
@@ -2323,6 +2554,7 @@ export class ClassDynamicDispatch {
|
|
|
2323
2554
|
!findGenericMethodOn(lowerer, info, dispatch.name) &&
|
|
2324
2555
|
dispatch.name !== "constructor" &&
|
|
2325
2556
|
!info.fields.has(dispatch.name) &&
|
|
2557
|
+
!(dispatch.name === "stack" && lowerer.isSubclassOf(info.def.name, "%Error")) &&
|
|
2326
2558
|
!findMethodOn(lowerer, info, `get:${dispatch.name}`) &&
|
|
2327
2559
|
!findMethodOn(lowerer, info, `set:${dispatch.name}`)))
|
|
2328
2560
|
continue;
|
|
@@ -2436,7 +2668,7 @@ export class ClassDynamicDispatch {
|
|
|
2436
2668
|
return dispatch.reflect
|
|
2437
2669
|
? this.reflectPropertyBody(lowerer, { ...dispatch, name }, info, receiver)
|
|
2438
2670
|
: this.propertyBody(lowerer, { ...dispatch, name }, info, receiver);
|
|
2439
|
-
const prototypeMethod =
|
|
2671
|
+
const prototypeMethod = !info.fields.has(name) && observedPrototypeMethod(lowerer, info, name, loc, receiver);
|
|
2440
2672
|
if (info.fields.has(name) || (dispatch.probe === "in" && !prototypeMethod)) {
|
|
2441
2673
|
if (info.fields.has(name) && info.def.tracksOwnFields) {
|
|
2442
2674
|
const bag = this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc);
|
|
@@ -2464,8 +2696,6 @@ export class ClassDynamicDispatch {
|
|
|
2464
2696
|
{ kind: "return", value: { kind: "boolLit", value: true, type: BOOL, loc }, loc },
|
|
2465
2697
|
];
|
|
2466
2698
|
}
|
|
2467
|
-
if (prototypeMethod)
|
|
2468
|
-
classPrototypeData(lowerer, info, loc, receiver);
|
|
2469
2699
|
const bag = this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc);
|
|
2470
2700
|
const symbol = name.startsWith("sym:") || name.startsWith("%symbol:");
|
|
2471
2701
|
const fn = dispatch.probe === "in"
|
|
@@ -2502,10 +2732,12 @@ export class ClassDynamicDispatch {
|
|
|
2502
2732
|
for (const [symbol, name] of info.symbolMethods)
|
|
2503
2733
|
symbolEntries.push([symbol, name]);
|
|
2504
2734
|
for (const [symbol, name] of symbolEntries) {
|
|
2505
|
-
const declaration =
|
|
2735
|
+
const declaration = symbol.valueDeclaration;
|
|
2736
|
+
// Module-scope consts and CommonJS key-table properties
|
|
2737
|
+
// (classSymbolKeyOfSymbol) both hold their key in a global.
|
|
2506
2738
|
if (declaration &&
|
|
2507
|
-
ts.isVariableDeclaration(declaration) &&
|
|
2508
|
-
|
|
2739
|
+
((ts.isVariableDeclaration(declaration) && ts.isIdentifier(declaration.name)) ||
|
|
2740
|
+
ts.isPropertyAssignment(declaration))) {
|
|
2509
2741
|
const global = lowerer.globalsBySymbol.get(symbol);
|
|
2510
2742
|
if (global)
|
|
2511
2743
|
symbols.set(name, lowerer.coerceToExpected(varRef(global.id, global.type, loc), DYN));
|
|
@@ -2787,13 +3019,13 @@ export class ClassDynamicDispatch {
|
|
|
2787
3019
|
if (!supported || !info.decl)
|
|
2788
3020
|
continue;
|
|
2789
3021
|
const cls = classValueRef(lowerer, info, info.decl);
|
|
2790
|
-
const result = {
|
|
3022
|
+
const result = constructedValue(lowerer, info, {
|
|
2791
3023
|
kind: "new",
|
|
2792
3024
|
className: name,
|
|
2793
3025
|
args,
|
|
2794
3026
|
type: { kind: "object", className: name },
|
|
2795
3027
|
loc,
|
|
2796
|
-
};
|
|
3028
|
+
});
|
|
2797
3029
|
this.constructDispatch.body.unshift({
|
|
2798
3030
|
kind: "if",
|
|
2799
3031
|
cond: {
|
|
@@ -2814,7 +3046,7 @@ export class ClassDynamicDispatch {
|
|
|
2814
3046
|
if (this.staticBagClasses.has(name))
|
|
2815
3047
|
continue;
|
|
2816
3048
|
const info = lowerer.classes.get(name);
|
|
2817
|
-
if (!info?.decl || !isJsSourceFile(info.decl
|
|
3049
|
+
if (!info?.decl || !isJsSourceFile(ts.getSourceFileOfNode(info.decl)))
|
|
2818
3050
|
continue;
|
|
2819
3051
|
const loc = this.staticPropertyBag.loc;
|
|
2820
3052
|
const bag = classStaticData(lowerer, info, loc);
|
|
@@ -2917,6 +3149,519 @@ export class ClassDynamicDispatch {
|
|
|
2917
3149
|
this.generated.add(helper);
|
|
2918
3150
|
return { kind: "call", callee: name, args: [bag, key], type: BOOL, loc };
|
|
2919
3151
|
}
|
|
3152
|
+
/** The hints for which some boxed class declares a conversion method. A
|
|
3153
|
+
* string conversion calls toString first, so without a declared toString
|
|
3154
|
+
* or Symbol.toPrimitive it answers Object.prototype.toString's
|
|
3155
|
+
* "[object Object]" as before. */
|
|
3156
|
+
convertingHints(lowerer) {
|
|
3157
|
+
const hints = new Set();
|
|
3158
|
+
for (const { info } of this.propertyReceivers(lowerer)) {
|
|
3159
|
+
if (conversionMethod(lowerer, info, "sym:toPrimitive") ||
|
|
3160
|
+
conversionMethod(lowerer, info, "toString")) {
|
|
3161
|
+
hints.add("string");
|
|
3162
|
+
hints.add("number");
|
|
3163
|
+
hints.add("default");
|
|
3164
|
+
}
|
|
3165
|
+
else if (conversionMethod(lowerer, info, "valueOf")) {
|
|
3166
|
+
hints.add("number");
|
|
3167
|
+
hints.add("default");
|
|
3168
|
+
}
|
|
3169
|
+
}
|
|
3170
|
+
return hints;
|
|
3171
|
+
}
|
|
3172
|
+
/** An operation that converts dynamic operands to primitives, with each
|
|
3173
|
+
* operand passed through the hint's conversion helper first. Operations
|
|
3174
|
+
* with two dynamic operands evaluate both before converting the left one,
|
|
3175
|
+
* as JavaScript does. Returns null when `expr` needs no conversion. */
|
|
3176
|
+
convertOperands(lowerer, fn, expr, converting) {
|
|
3177
|
+
const hint = toPrimitiveHint(expr);
|
|
3178
|
+
if (hint === null || !converting.has(hint))
|
|
3179
|
+
return null;
|
|
3180
|
+
const loc = expr.loc;
|
|
3181
|
+
const convert = (value) => ({
|
|
3182
|
+
kind: "call",
|
|
3183
|
+
callee: this.toPrimitiveHelper(lowerer, hint, loc),
|
|
3184
|
+
args: [value],
|
|
3185
|
+
type: DYN,
|
|
3186
|
+
loc,
|
|
3187
|
+
});
|
|
3188
|
+
if (expr.kind === "toString") {
|
|
3189
|
+
if (isConversion(expr.operand))
|
|
3190
|
+
return null;
|
|
3191
|
+
return { ...expr, operand: convert(expr.operand) };
|
|
3192
|
+
}
|
|
3193
|
+
if (expr.kind === "dynKeyGet") {
|
|
3194
|
+
// A computed read converts its key after evaluating the receiver,
|
|
3195
|
+
// unless the receiver is null or undefined.
|
|
3196
|
+
if (expr.key.type.kind !== "dyn" || isConversion(expr.key))
|
|
3197
|
+
return null;
|
|
3198
|
+
const [receiver, key] = this.hoistOperands(fn, [expr.value, expr.key], loc);
|
|
3199
|
+
return {
|
|
3200
|
+
kind: "seqExpr",
|
|
3201
|
+
stmts: receiver.stmts.concat(key.stmts),
|
|
3202
|
+
result: {
|
|
3203
|
+
...expr,
|
|
3204
|
+
value: receiver.value,
|
|
3205
|
+
key: {
|
|
3206
|
+
kind: "ternary",
|
|
3207
|
+
cond: {
|
|
3208
|
+
kind: "dynTest",
|
|
3209
|
+
test: "nullish",
|
|
3210
|
+
negated: true,
|
|
3211
|
+
value: receiver.value,
|
|
3212
|
+
type: BOOL,
|
|
3213
|
+
loc,
|
|
3214
|
+
},
|
|
3215
|
+
then: convert(key.value),
|
|
3216
|
+
else_: key.value,
|
|
3217
|
+
type: DYN,
|
|
3218
|
+
loc,
|
|
3219
|
+
},
|
|
3220
|
+
},
|
|
3221
|
+
type: expr.type,
|
|
3222
|
+
loc,
|
|
3223
|
+
};
|
|
3224
|
+
}
|
|
3225
|
+
if (expr.kind !== "libCall")
|
|
3226
|
+
return null;
|
|
3227
|
+
const receiverNeeds = KEY_CALLS.get(expr.fn);
|
|
3228
|
+
if (receiverNeeds) {
|
|
3229
|
+
if (expr.args[1]?.type.kind !== "dyn" || isConversion(expr.args[1]))
|
|
3230
|
+
return null;
|
|
3231
|
+
// Every operand is evaluated before the key converts, as in
|
|
3232
|
+
// `obj[key] = value`, where the value is evaluated first.
|
|
3233
|
+
const hoisted = this.hoistOperands(fn, expr.args, loc);
|
|
3234
|
+
const args = hoisted.map((operand) => operand.value);
|
|
3235
|
+
const receiver = args[0];
|
|
3236
|
+
const admits = receiverNeeds === "any"
|
|
3237
|
+
? null
|
|
3238
|
+
: receiverNeeds === "object"
|
|
3239
|
+
? { kind: "unary", op: "!", operand: isPrimitive(receiver, loc), type: BOOL, loc }
|
|
3240
|
+
: { kind: "dynTest", test: "nullish", negated: true, value: receiver, type: BOOL, loc };
|
|
3241
|
+
args[1] = admits
|
|
3242
|
+
? {
|
|
3243
|
+
kind: "ternary",
|
|
3244
|
+
cond: admits,
|
|
3245
|
+
then: convert(args[1]),
|
|
3246
|
+
else_: args[1],
|
|
3247
|
+
type: DYN,
|
|
3248
|
+
loc,
|
|
3249
|
+
}
|
|
3250
|
+
: convert(args[1]);
|
|
3251
|
+
return {
|
|
3252
|
+
kind: "seqExpr",
|
|
3253
|
+
stmts: hoisted.flatMap((operand) => operand.stmts),
|
|
3254
|
+
result: { ...expr, args },
|
|
3255
|
+
type: expr.type,
|
|
3256
|
+
loc,
|
|
3257
|
+
};
|
|
3258
|
+
}
|
|
3259
|
+
const dynamic = expr.args.flatMap((arg, i) => (arg.type.kind === "dyn" ? [i] : []));
|
|
3260
|
+
if (dynamic.some((i) => isConversion(expr.args[i]) && expr.args[i].kind !== "dynFrom"))
|
|
3261
|
+
return null;
|
|
3262
|
+
const operands = dynamic.filter((i) => !isConversion(expr.args[i]));
|
|
3263
|
+
if (operands.length === 0)
|
|
3264
|
+
return null;
|
|
3265
|
+
if (expr.args.length === 1)
|
|
3266
|
+
return { ...expr, args: [convert(expr.args[0])] };
|
|
3267
|
+
// Every operand is evaluated before the first conversion.
|
|
3268
|
+
const hoisted = expr.args.map((arg) => arg.kind === "strLit" || arg.kind === "numLit" || arg.kind === "boolLit"
|
|
3269
|
+
? { stmts: [], value: arg }
|
|
3270
|
+
: this.hoistOperands(fn, [arg], loc)[0]);
|
|
3271
|
+
const args = hoisted.map((operand) => operand.value);
|
|
3272
|
+
if (expr.fn === "dyn.abstractEq") {
|
|
3273
|
+
// Loose equality converts an object only when the other operand is a
|
|
3274
|
+
// primitive other than null and undefined.
|
|
3275
|
+
if (dynamic.length !== 2)
|
|
3276
|
+
return null;
|
|
3277
|
+
const primitive = (value) => ["number", "string", "boolean", "bigint", "symbol"]
|
|
3278
|
+
.map((test) => ({ kind: "dynTest", test, value, type: BOOL, loc }))
|
|
3279
|
+
.reduce((a, b) => ({ kind: "logical", op: "||", left: a, right: b, type: BOOL, loc }));
|
|
3280
|
+
const [left, right] = [args[0], args[1]];
|
|
3281
|
+
for (const i of operands)
|
|
3282
|
+
args[i] = {
|
|
3283
|
+
kind: "ternary",
|
|
3284
|
+
cond: primitive(i === 0 ? right : left),
|
|
3285
|
+
then: convert(args[i]),
|
|
3286
|
+
else_: args[i],
|
|
3287
|
+
type: DYN,
|
|
3288
|
+
loc,
|
|
3289
|
+
};
|
|
3290
|
+
}
|
|
3291
|
+
else
|
|
3292
|
+
for (const i of operands)
|
|
3293
|
+
args[i] = convert(args[i]);
|
|
3294
|
+
return {
|
|
3295
|
+
kind: "seqExpr",
|
|
3296
|
+
stmts: hoisted.flatMap((operand) => operand.stmts),
|
|
3297
|
+
result: { ...expr, args },
|
|
3298
|
+
type: expr.type,
|
|
3299
|
+
loc,
|
|
3300
|
+
};
|
|
3301
|
+
}
|
|
3302
|
+
/** The method and accessor names of boxed classes whose instances can
|
|
3303
|
+
* carry their class's prototype data. */
|
|
3304
|
+
prototypeMemberNames(lowerer) {
|
|
3305
|
+
const names = new Set();
|
|
3306
|
+
for (const { info } of this.propertyReceivers(lowerer)) {
|
|
3307
|
+
if (!hasClassPrototypeData(info))
|
|
3308
|
+
continue;
|
|
3309
|
+
for (let c = info; c; c = c.base)
|
|
3310
|
+
for (const name of c.methods.keys())
|
|
3311
|
+
names.add(name.startsWith("get:") || name.startsWith("set:") ? name.slice(4) : name);
|
|
3312
|
+
}
|
|
3313
|
+
return names;
|
|
3314
|
+
}
|
|
3315
|
+
/** The methods some boxed class declares among valueOf and toString. */
|
|
3316
|
+
calledConversions(lowerer) {
|
|
3317
|
+
const methods = new Set();
|
|
3318
|
+
for (const { info } of this.propertyReceivers(lowerer)) {
|
|
3319
|
+
if (conversionMethod(lowerer, info, "valueOf"))
|
|
3320
|
+
methods.add("valueOf");
|
|
3321
|
+
if (conversionMethod(lowerer, info, "toString"))
|
|
3322
|
+
methods.add("toString");
|
|
3323
|
+
}
|
|
3324
|
+
return methods;
|
|
3325
|
+
}
|
|
3326
|
+
/** `value.valueOf()` or `value.toString(argument)` on a dynamic receiver:
|
|
3327
|
+
* a boxed instance of a class declaring the method calls it, any other
|
|
3328
|
+
* value keeps the runtime method call. The toString result must be a
|
|
3329
|
+
* string, as for the runtime's own-member call. */
|
|
3330
|
+
convertMethodCall(lowerer, fn, expr, calling) {
|
|
3331
|
+
if (expr.kind !== "libCall" || (expr.fn !== "dyn.valueOf" && expr.fn !== "dyn.toString"))
|
|
3332
|
+
return null;
|
|
3333
|
+
const method = expr.fn === "dyn.valueOf" ? "valueOf" : "toString";
|
|
3334
|
+
const receiver = expr.args[0];
|
|
3335
|
+
if (!calling.has(method))
|
|
3336
|
+
return null;
|
|
3337
|
+
if (receiver.kind === "varRef" && receiver.localId.startsWith(CONVERSION_CALL_PREFIX))
|
|
3338
|
+
return null;
|
|
3339
|
+
const loc = expr.loc;
|
|
3340
|
+
const operands = this.hoistOperands(fn, method === "toString" ? [receiver, expr.args[1]] : [receiver], loc, CONVERSION_CALL_PREFIX);
|
|
3341
|
+
const values = operands.map((operand) => operand.value);
|
|
3342
|
+
const helpers = this.conversionCallHelpers(lowerer, method, loc);
|
|
3343
|
+
return {
|
|
3344
|
+
kind: "seqExpr",
|
|
3345
|
+
stmts: operands.flatMap((operand) => operand.stmts),
|
|
3346
|
+
result: {
|
|
3347
|
+
kind: "ternary",
|
|
3348
|
+
cond: { kind: "call", callee: helpers.test.name, args: [values[0]], type: BOOL, loc },
|
|
3349
|
+
then: { kind: "call", callee: helpers.call.name, args: values, type: expr.type, loc },
|
|
3350
|
+
else_: { ...expr, args: [...values, ...expr.args.slice(values.length)] },
|
|
3351
|
+
type: expr.type,
|
|
3352
|
+
loc,
|
|
3353
|
+
},
|
|
3354
|
+
type: expr.type,
|
|
3355
|
+
loc,
|
|
3356
|
+
};
|
|
3357
|
+
}
|
|
3358
|
+
conversionCallHelpers(lowerer, method, loc) {
|
|
3359
|
+
let helpers = this.conversionCalls.get(method);
|
|
3360
|
+
if (!helpers) {
|
|
3361
|
+
const at = helperLoc(loc);
|
|
3362
|
+
const params = [
|
|
3363
|
+
{ localId: "p.0", name: "value", type: DYN },
|
|
3364
|
+
...(method === "toString" ? [{ localId: "p.1", name: "argument", type: DYN }] : []),
|
|
3365
|
+
];
|
|
3366
|
+
const locals = params.map((param) => ({
|
|
3367
|
+
id: param.localId,
|
|
3368
|
+
name: param.name,
|
|
3369
|
+
type: param.type,
|
|
3370
|
+
mutable: false,
|
|
3371
|
+
}));
|
|
3372
|
+
const name = { kind: "strLit", value: method, type: STRING, loc: at };
|
|
3373
|
+
const test = {
|
|
3374
|
+
name: `${TO_PRIMITIVE_PREFIX}${method}.test`,
|
|
3375
|
+
params: params.slice(0, 1),
|
|
3376
|
+
locals: locals.slice(0, 1),
|
|
3377
|
+
returnType: BOOL,
|
|
3378
|
+
body: [
|
|
3379
|
+
{
|
|
3380
|
+
kind: "return",
|
|
3381
|
+
value: { kind: "boolLit", value: false, type: BOOL, loc: at },
|
|
3382
|
+
loc: at,
|
|
3383
|
+
},
|
|
3384
|
+
],
|
|
3385
|
+
loc: at,
|
|
3386
|
+
};
|
|
3387
|
+
const call = {
|
|
3388
|
+
name: `${TO_PRIMITIVE_PREFIX}${method}.call`,
|
|
3389
|
+
params,
|
|
3390
|
+
locals,
|
|
3391
|
+
returnType: method === "toString" ? STRING : DYN,
|
|
3392
|
+
body: [
|
|
3393
|
+
{
|
|
3394
|
+
kind: "return",
|
|
3395
|
+
value: method === "toString"
|
|
3396
|
+
? {
|
|
3397
|
+
kind: "libCall",
|
|
3398
|
+
fn: "dyn.toString",
|
|
3399
|
+
args: [varRef("p.0", DYN, at), varRef("p.1", DYN, at), name],
|
|
3400
|
+
type: STRING,
|
|
3401
|
+
loc: at,
|
|
3402
|
+
}
|
|
3403
|
+
: {
|
|
3404
|
+
kind: "libCall",
|
|
3405
|
+
fn: "dyn.valueOf",
|
|
3406
|
+
args: [varRef("p.0", DYN, at), name],
|
|
3407
|
+
type: DYN,
|
|
3408
|
+
loc: at,
|
|
3409
|
+
},
|
|
3410
|
+
loc: at,
|
|
3411
|
+
},
|
|
3412
|
+
],
|
|
3413
|
+
loc: at,
|
|
3414
|
+
};
|
|
3415
|
+
helpers = { test, call, classes: new Set() };
|
|
3416
|
+
this.conversionCalls.set(method, helpers);
|
|
3417
|
+
this.generated.add(test);
|
|
3418
|
+
this.generated.add(call);
|
|
3419
|
+
lowerer.liftedFns.push(test, call);
|
|
3420
|
+
}
|
|
3421
|
+
return helpers;
|
|
3422
|
+
}
|
|
3423
|
+
/** Evaluates each operand into a fresh local, in order. */
|
|
3424
|
+
hoistOperands(fn, operands, loc, prefix = "%toPrimitive.operand.") {
|
|
3425
|
+
return operands.map((operand) => {
|
|
3426
|
+
const id = `${prefix}${fn.locals.length}`;
|
|
3427
|
+
fn.locals.push({ id, name: "operand", type: operand.type, mutable: false });
|
|
3428
|
+
const stmts = [{ kind: "varDecl", localId: id, init: operand, loc }];
|
|
3429
|
+
return { stmts, value: varRef(id, operand.type, loc) };
|
|
3430
|
+
});
|
|
3431
|
+
}
|
|
3432
|
+
/** The conversion helper for `hint`: a boxed class instance answers its
|
|
3433
|
+
* OrdinaryToPrimitive result, any other value is returned unchanged for
|
|
3434
|
+
* the runtime operation to convert. Arms are added per boxed class. */
|
|
3435
|
+
toPrimitiveHelper(lowerer, hint, loc) {
|
|
3436
|
+
let conversion = this.toPrimitives.get(hint);
|
|
3437
|
+
if (!conversion) {
|
|
3438
|
+
const at = helperLoc(loc);
|
|
3439
|
+
const fn = {
|
|
3440
|
+
name: `${TO_PRIMITIVE_PREFIX}${hint}`,
|
|
3441
|
+
params: [{ localId: "p.0", name: "value", type: DYN }],
|
|
3442
|
+
locals: [{ id: "p.0", name: "value", type: DYN, mutable: false }],
|
|
3443
|
+
returnType: DYN,
|
|
3444
|
+
body: [{ kind: "return", value: varRef("p.0", DYN, at), loc: at }],
|
|
3445
|
+
loc: at,
|
|
3446
|
+
};
|
|
3447
|
+
conversion = { fn, classes: new Set() };
|
|
3448
|
+
this.toPrimitives.set(hint, conversion);
|
|
3449
|
+
this.generated.add(fn);
|
|
3450
|
+
lowerer.liftedFns.push(fn);
|
|
3451
|
+
}
|
|
3452
|
+
return conversion.fn.name;
|
|
3453
|
+
}
|
|
3454
|
+
/** OrdinaryToPrimitive for one boxed class: the declared conversion
|
|
3455
|
+
* methods in hint order, each result returned when it is a primitive.
|
|
3456
|
+
* Object.prototype.valueOf answers the object itself and its toString
|
|
3457
|
+
* answers "[object Object]". */
|
|
3458
|
+
toPrimitiveArm(lowerer, plan, hint, helper) {
|
|
3459
|
+
const { info } = plan;
|
|
3460
|
+
const loc = helper.loc;
|
|
3461
|
+
const { condition } = this.propertyReceiver(plan, loc);
|
|
3462
|
+
if (conversionMethod(lowerer, info, "sym:toPrimitive")) {
|
|
3463
|
+
// A Symbol.toPrimitive method decides alone: its result must be a
|
|
3464
|
+
// primitive.
|
|
3465
|
+
const result = `%toPrimitive.exotic.${helper.locals.length}`;
|
|
3466
|
+
helper.locals.push({ id: result, name: "exotic", type: DYN, mutable: false });
|
|
3467
|
+
const hintValue = {
|
|
3468
|
+
kind: "dynFrom",
|
|
3469
|
+
value: { kind: "strLit", value: hint, type: STRING, loc },
|
|
3470
|
+
type: DYN,
|
|
3471
|
+
loc,
|
|
3472
|
+
};
|
|
3473
|
+
const body = [
|
|
3474
|
+
{
|
|
3475
|
+
kind: "varDecl",
|
|
3476
|
+
localId: result,
|
|
3477
|
+
init: {
|
|
3478
|
+
kind: "call",
|
|
3479
|
+
callee: this.toPrimitiveCall(lowerer, plan, "sym:toPrimitive", 1, loc),
|
|
3480
|
+
args: [varRef("p.0", DYN, loc), hintValue],
|
|
3481
|
+
type: DYN,
|
|
3482
|
+
loc,
|
|
3483
|
+
},
|
|
3484
|
+
loc,
|
|
3485
|
+
},
|
|
3486
|
+
{
|
|
3487
|
+
kind: "if",
|
|
3488
|
+
cond: isPrimitive(varRef(result, DYN, loc), loc),
|
|
3489
|
+
then: [{ kind: "return", value: varRef(result, DYN, loc), loc }],
|
|
3490
|
+
else_: null,
|
|
3491
|
+
loc,
|
|
3492
|
+
},
|
|
3493
|
+
{
|
|
3494
|
+
kind: "return",
|
|
3495
|
+
value: nodeThrowExpr(1, "", "Cannot convert object to primitive value", DYN, loc),
|
|
3496
|
+
loc,
|
|
3497
|
+
},
|
|
3498
|
+
];
|
|
3499
|
+
return { kind: "if", cond: condition, then: body, else_: null, loc };
|
|
3500
|
+
}
|
|
3501
|
+
const order = hint === "string" ? ["toString", "valueOf"] : ["valueOf", "toString"];
|
|
3502
|
+
if (!order.some((method) => conversionMethod(lowerer, info, method)))
|
|
3503
|
+
return null;
|
|
3504
|
+
if (hint === "string" && !conversionMethod(lowerer, info, "toString"))
|
|
3505
|
+
return null;
|
|
3506
|
+
const body = [];
|
|
3507
|
+
let settled = false;
|
|
3508
|
+
for (const method of order) {
|
|
3509
|
+
if (!conversionMethod(lowerer, info, method)) {
|
|
3510
|
+
if (method === "toString") {
|
|
3511
|
+
body.push({
|
|
3512
|
+
kind: "return",
|
|
3513
|
+
value: {
|
|
3514
|
+
kind: "dynFrom",
|
|
3515
|
+
value: { kind: "strLit", value: "[object Object]", type: STRING, loc },
|
|
3516
|
+
type: DYN,
|
|
3517
|
+
loc,
|
|
3518
|
+
},
|
|
3519
|
+
loc,
|
|
3520
|
+
});
|
|
3521
|
+
settled = true;
|
|
3522
|
+
break;
|
|
3523
|
+
}
|
|
3524
|
+
continue;
|
|
3525
|
+
}
|
|
3526
|
+
const result = `%toPrimitive.${method}.${helper.locals.length}`;
|
|
3527
|
+
helper.locals.push({ id: result, name: method, type: DYN, mutable: false });
|
|
3528
|
+
body.push({
|
|
3529
|
+
kind: "varDecl",
|
|
3530
|
+
localId: result,
|
|
3531
|
+
init: {
|
|
3532
|
+
kind: "call",
|
|
3533
|
+
callee: this.toPrimitiveCall(lowerer, plan, method, 0, loc),
|
|
3534
|
+
args: [varRef("p.0", DYN, loc)],
|
|
3535
|
+
type: DYN,
|
|
3536
|
+
loc,
|
|
3537
|
+
},
|
|
3538
|
+
loc,
|
|
3539
|
+
}, {
|
|
3540
|
+
kind: "if",
|
|
3541
|
+
cond: isPrimitive(varRef(result, DYN, loc), loc),
|
|
3542
|
+
then: [{ kind: "return", value: varRef(result, DYN, loc), loc }],
|
|
3543
|
+
else_: null,
|
|
3544
|
+
loc,
|
|
3545
|
+
});
|
|
3546
|
+
}
|
|
3547
|
+
if (!settled)
|
|
3548
|
+
body.push({
|
|
3549
|
+
kind: "return",
|
|
3550
|
+
value: nodeThrowExpr(1, "", "Cannot convert object to primitive value", DYN, loc),
|
|
3551
|
+
loc,
|
|
3552
|
+
});
|
|
3553
|
+
return { kind: "if", cond: condition, then: body, else_: null, loc };
|
|
3554
|
+
}
|
|
3555
|
+
/** A function calling `method` with `arity` arguments on a boxed instance
|
|
3556
|
+
* of `plan`'s class, as a dynamic method call would: an own replacement on
|
|
3557
|
+
* the instance answers first for methods the program can replace. */
|
|
3558
|
+
toPrimitiveCall(lowerer, plan, method, arity, loc) {
|
|
3559
|
+
const key = JSON.stringify([plan.key, method, arity]);
|
|
3560
|
+
const existing = this.toPrimitiveCalls.get(key);
|
|
3561
|
+
if (existing)
|
|
3562
|
+
return existing.name;
|
|
3563
|
+
const { info } = plan;
|
|
3564
|
+
const { receiver } = this.propertyReceiver(plan, loc);
|
|
3565
|
+
const args = Array.from({ length: arity }, (_, i) => varRef(`p.${i + 1}`, DYN, loc));
|
|
3566
|
+
const source = {
|
|
3567
|
+
kind: "dynInvoke",
|
|
3568
|
+
recv: varRef("p.0", DYN, loc),
|
|
3569
|
+
method,
|
|
3570
|
+
calleeName: method === "sym:toPrimitive" ? "value[Symbol.toPrimitive]" : `value.${method}`,
|
|
3571
|
+
args,
|
|
3572
|
+
type: DYN,
|
|
3573
|
+
loc,
|
|
3574
|
+
};
|
|
3575
|
+
const value = varRef("p.0", DYN, loc);
|
|
3576
|
+
let callback = dynUndefinedExpr(loc);
|
|
3577
|
+
if (isClassCallback(lowerer, info, method)) {
|
|
3578
|
+
const prototypeMethod = lowerer.prototypeMethodAccesses.has(method);
|
|
3579
|
+
if (prototypeMethod)
|
|
3580
|
+
classPrototypeData(lowerer, info, loc);
|
|
3581
|
+
const bag = this.readPropertyBagOrEmpty(lowerer, value, loc);
|
|
3582
|
+
callback = {
|
|
3583
|
+
kind: "ternary",
|
|
3584
|
+
cond: prototypeMethod
|
|
3585
|
+
? { kind: "boolLit", value: true, type: BOOL, loc }
|
|
3586
|
+
: {
|
|
3587
|
+
kind: "libCall",
|
|
3588
|
+
fn: "dyn.hasKey",
|
|
3589
|
+
args: [bag, { kind: "strLit", value: method, type: STRING, loc }],
|
|
3590
|
+
type: BOOL,
|
|
3591
|
+
loc,
|
|
3592
|
+
},
|
|
3593
|
+
then: {
|
|
3594
|
+
kind: "dynObjLit",
|
|
3595
|
+
fields: [
|
|
3596
|
+
{
|
|
3597
|
+
key: { kind: "strLit", value: "value", type: STRING, loc },
|
|
3598
|
+
value: {
|
|
3599
|
+
kind: "dynKeyGet",
|
|
3600
|
+
value: bag,
|
|
3601
|
+
key: { kind: "strLit", value: method, type: STRING, loc },
|
|
3602
|
+
type: DYN,
|
|
3603
|
+
loc,
|
|
3604
|
+
},
|
|
3605
|
+
},
|
|
3606
|
+
],
|
|
3607
|
+
type: DYN,
|
|
3608
|
+
loc,
|
|
3609
|
+
},
|
|
3610
|
+
else_: dynUndefinedExpr(loc),
|
|
3611
|
+
type: DYN,
|
|
3612
|
+
loc,
|
|
3613
|
+
};
|
|
3614
|
+
}
|
|
3615
|
+
const params = [
|
|
3616
|
+
{ localId: "p.0", name: "value", type: DYN },
|
|
3617
|
+
...args.map((_, i) => ({ localId: `p.${i + 1}`, name: `p${i + 1}`, type: DYN })),
|
|
3618
|
+
];
|
|
3619
|
+
const fn = {
|
|
3620
|
+
name: `${TO_PRIMITIVE_PREFIX}call.${this.toPrimitiveCalls.size}`,
|
|
3621
|
+
params,
|
|
3622
|
+
locals: [
|
|
3623
|
+
...params.map((param) => ({
|
|
3624
|
+
id: param.localId,
|
|
3625
|
+
name: param.name,
|
|
3626
|
+
type: param.type,
|
|
3627
|
+
mutable: false,
|
|
3628
|
+
})),
|
|
3629
|
+
{ id: "p.callback", name: "callback", type: DYN, mutable: false },
|
|
3630
|
+
{ id: "p.calleeName", name: "calleeName", type: STRING, mutable: false },
|
|
3631
|
+
],
|
|
3632
|
+
returnType: DYN,
|
|
3633
|
+
body: [],
|
|
3634
|
+
loc,
|
|
3635
|
+
};
|
|
3636
|
+
const dispatch = { source, fn, callback: fn, classes: new Set() };
|
|
3637
|
+
const before = lowerer.diags.length;
|
|
3638
|
+
let body;
|
|
3639
|
+
try {
|
|
3640
|
+
body = this.methodBody(lowerer, dispatch, info, receiver);
|
|
3641
|
+
}
|
|
3642
|
+
catch (error) {
|
|
3643
|
+
if (!(error instanceof PoisonError) || !info.decl)
|
|
3644
|
+
throw error;
|
|
3645
|
+
const fence = lowerer.deferToRuntimeFence(before, info.decl, { kind: "statement" });
|
|
3646
|
+
if (!fence)
|
|
3647
|
+
throw error;
|
|
3648
|
+
body = [fence];
|
|
3649
|
+
}
|
|
3650
|
+
fn.body = [
|
|
3651
|
+
{ kind: "varDecl", localId: "p.callback", init: callback, loc },
|
|
3652
|
+
{
|
|
3653
|
+
kind: "varDecl",
|
|
3654
|
+
localId: "p.calleeName",
|
|
3655
|
+
init: { kind: "strLit", value: source.calleeName, type: STRING, loc },
|
|
3656
|
+
loc,
|
|
3657
|
+
},
|
|
3658
|
+
...body,
|
|
3659
|
+
];
|
|
3660
|
+
this.toPrimitiveCalls.set(key, fn);
|
|
3661
|
+
this.generated.add(fn);
|
|
3662
|
+
lowerer.liftedFns.push(fn);
|
|
3663
|
+
return fn.name;
|
|
3664
|
+
}
|
|
2920
3665
|
readPropertyBagOrEmpty(lowerer, receiver, loc) {
|
|
2921
3666
|
// One call per read site: large JS programs have a branch per class and
|
|
2922
3667
|
// property, so the absent-bag handling lives in the shared helper.
|
|
@@ -2968,9 +3713,17 @@ export class ClassDynamicDispatch {
|
|
|
2968
3713
|
obj: receiver,
|
|
2969
3714
|
value: transformExpr(initializers[0].value, {
|
|
2970
3715
|
stmt: (stmt) => stmt,
|
|
2971
|
-
expr: (expr) =>
|
|
2972
|
-
|
|
2973
|
-
|
|
3716
|
+
expr: (expr) => {
|
|
3717
|
+
const checked = (e) => e.kind === "dynCheck" && e.value.kind === "varRef" && e.value.localId === "p.0";
|
|
3718
|
+
// The checked receiver, possibly cast to this class (the prototype
|
|
3719
|
+
// helper's argument), is the typed parameter itself.
|
|
3720
|
+
if (expr.kind === "downcast" &&
|
|
3721
|
+
checked(expr.value) &&
|
|
3722
|
+
expr.type.kind === "object" &&
|
|
3723
|
+
expr.type.className === type.className)
|
|
3724
|
+
return receiver;
|
|
3725
|
+
return checked(expr) ? receiver : expr;
|
|
3726
|
+
},
|
|
2974
3727
|
}),
|
|
2975
3728
|
loc,
|
|
2976
3729
|
};
|
|
@@ -2999,6 +3752,74 @@ export class ClassDynamicDispatch {
|
|
|
2999
3752
|
lowerer.liftedFns.push(helper);
|
|
3000
3753
|
return helper;
|
|
3001
3754
|
}
|
|
3755
|
+
/** The prototype a new property bag of `current` (or of the subclass the
|
|
3756
|
+
* receiver is) starts from, or null when `current` has no prototype data.
|
|
3757
|
+
* A class with constructible subclasses that have prototype data selects
|
|
3758
|
+
* it through its `%class.bagPrototype` helper; any other class reads its
|
|
3759
|
+
* own prototype data. */
|
|
3760
|
+
bagPrototype(lowerer, current, receiver, loc) {
|
|
3761
|
+
const arg = receiver.type.kind === "object" && receiver.type.className !== current.def.name
|
|
3762
|
+
? {
|
|
3763
|
+
kind: "downcast",
|
|
3764
|
+
value: receiver,
|
|
3765
|
+
type: { kind: "object", className: current.def.name },
|
|
3766
|
+
loc,
|
|
3767
|
+
}
|
|
3768
|
+
: receiver;
|
|
3769
|
+
const helper = this.bagPrototypeHelper(lowerer, current, loc);
|
|
3770
|
+
return helper
|
|
3771
|
+
? { kind: "call", callee: helper.name, args: [arg], type: DYN, loc }
|
|
3772
|
+
: classPrototypeData(lowerer, current, loc, arg);
|
|
3773
|
+
}
|
|
3774
|
+
/** `%class.bagPrototype:<class>(this)`: the prototype data of the most
|
|
3775
|
+
* derived constructible class `this` is an instance of, tested from the
|
|
3776
|
+
* last subclass to the first and then the class itself. One helper per
|
|
3777
|
+
* class, calling its subclasses' helpers, keeps every property-bag branch
|
|
3778
|
+
* a single call: a whole hierarchy inlined into each branch grows with the
|
|
3779
|
+
* square of its depth. Null when the class has no prototype data, in which
|
|
3780
|
+
* case its subclasses are not tested either, or while no constructible
|
|
3781
|
+
* subclass has any. The body is rebuilt on each use, as classes become
|
|
3782
|
+
* constructible. */
|
|
3783
|
+
bagPrototypeHelper(lowerer, current, loc) {
|
|
3784
|
+
const type = { kind: "object", className: current.def.name };
|
|
3785
|
+
const self = varRef("this", type, loc);
|
|
3786
|
+
const own = classPrototypeData(lowerer, current, loc, self);
|
|
3787
|
+
if (!own)
|
|
3788
|
+
return null;
|
|
3789
|
+
const body = [];
|
|
3790
|
+
const children = current.subclasses.filter((child) => lowerer.classCanBeConstructed(child));
|
|
3791
|
+
for (const child of children.reverse()) {
|
|
3792
|
+
const selected = this.bagPrototype(lowerer, child, self, loc);
|
|
3793
|
+
if (!selected)
|
|
3794
|
+
continue;
|
|
3795
|
+
body.push({
|
|
3796
|
+
kind: "if",
|
|
3797
|
+
cond: { kind: "instanceOf", value: self, className: child.def.name, type: BOOL, loc },
|
|
3798
|
+
then: [{ kind: "return", value: selected, loc }],
|
|
3799
|
+
else_: null,
|
|
3800
|
+
loc,
|
|
3801
|
+
});
|
|
3802
|
+
}
|
|
3803
|
+
let helper = this.bagPrototypeHelpers.get(current.def.name);
|
|
3804
|
+
if (!helper && body.length === 0)
|
|
3805
|
+
return null;
|
|
3806
|
+
body.push({ kind: "return", value: own, loc });
|
|
3807
|
+
if (!helper) {
|
|
3808
|
+
helper = {
|
|
3809
|
+
name: `%class.bagPrototype:${current.def.name}`,
|
|
3810
|
+
params: [{ localId: "this", name: "this", type }],
|
|
3811
|
+
returnType: DYN,
|
|
3812
|
+
locals: [{ id: "this", name: "this", type, mutable: false }],
|
|
3813
|
+
body,
|
|
3814
|
+
loc,
|
|
3815
|
+
};
|
|
3816
|
+
this.bagPrototypeHelpers.set(current.def.name, helper);
|
|
3817
|
+
this.generated.add(helper);
|
|
3818
|
+
lowerer.liftedFns.push(helper);
|
|
3819
|
+
}
|
|
3820
|
+
helper.body = body;
|
|
3821
|
+
return helper;
|
|
3822
|
+
}
|
|
3002
3823
|
/** Prototype state may appear in a later reachable body, so read-only bags
|
|
3003
3824
|
* settle only after the dispatch worklist closes. A read never stores: an
|
|
3004
3825
|
* absent empty bag stays undefined (callers test it), and an absent
|
|
@@ -3270,19 +4091,43 @@ export class ClassDynamicDispatch {
|
|
|
3270
4091
|
loc,
|
|
3271
4092
|
};
|
|
3272
4093
|
if (accessor && info.decl) {
|
|
3273
|
-
|
|
3274
|
-
|
|
3275
|
-
|
|
3276
|
-
|
|
3277
|
-
|
|
3278
|
-
|
|
3279
|
-
|
|
3280
|
-
|
|
3281
|
-
|
|
3282
|
-
|
|
3283
|
-
|
|
3284
|
-
|
|
3285
|
-
|
|
4094
|
+
// An accessor whose private names belong to one evaluation runs as
|
|
4095
|
+
// the instance's own evaluation's prototype accessor.
|
|
4096
|
+
const declarer = accessor.declarer;
|
|
4097
|
+
const prototype = perEvaluationPrivateNames(declarer)
|
|
4098
|
+
? classPrototypeData(lowerer, declarer, loc, upcastTo(lowerer, receiver, declarer.def.name))
|
|
4099
|
+
: null;
|
|
4100
|
+
const method = prototype ? null : classMethodValue(lowerer, info.decl, info, member, loc);
|
|
4101
|
+
if (prototype || method) {
|
|
4102
|
+
const call = prototype
|
|
4103
|
+
? {
|
|
4104
|
+
kind: "libCall",
|
|
4105
|
+
fn: write ? "dyn.reflectSet" : "dyn.reflectGet",
|
|
4106
|
+
args: [
|
|
4107
|
+
prototype,
|
|
4108
|
+
lowerer.coerceToExpected(key, DYN),
|
|
4109
|
+
...(write ? [varRef("p.1", DYN, loc)] : []),
|
|
4110
|
+
actualReceiver,
|
|
4111
|
+
],
|
|
4112
|
+
type: write ? BOOL : DYN,
|
|
4113
|
+
loc,
|
|
4114
|
+
}
|
|
4115
|
+
: {
|
|
4116
|
+
kind: "libCall",
|
|
4117
|
+
fn: "dyn.reflectApply",
|
|
4118
|
+
args: [
|
|
4119
|
+
lowerer.coerceToExpected(method, DYN),
|
|
4120
|
+
actualReceiver,
|
|
4121
|
+
{
|
|
4122
|
+
kind: "dynArrLit",
|
|
4123
|
+
elems: write ? [varRef("p.1", DYN, loc)] : [],
|
|
4124
|
+
type: DYN,
|
|
4125
|
+
loc,
|
|
4126
|
+
},
|
|
4127
|
+
],
|
|
4128
|
+
type: DYN,
|
|
4129
|
+
loc,
|
|
4130
|
+
};
|
|
3286
4131
|
return [
|
|
3287
4132
|
{
|
|
3288
4133
|
kind: "if",
|
|
@@ -3444,6 +4289,99 @@ export class ClassDynamicDispatch {
|
|
|
3444
4289
|
},
|
|
3445
4290
|
];
|
|
3446
4291
|
}
|
|
4292
|
+
// An Error's own `stack`: a string is the native error's stack, which
|
|
4293
|
+
// typed reads share; any other value is kept with the instance's own
|
|
4294
|
+
// properties, which a read checks first. A class whose chain declares
|
|
4295
|
+
// a `stack` accessor answers through it (the accessor code below).
|
|
4296
|
+
if (name === "stack" &&
|
|
4297
|
+
!info.fields.has(name) &&
|
|
4298
|
+
lowerer.isSubclassOf(info.def.name, "%Error") &&
|
|
4299
|
+
!findMethodOn(lowerer, info, "get:stack") &&
|
|
4300
|
+
!findMethodOn(lowerer, info, "set:stack")) {
|
|
4301
|
+
const key = { kind: "strLit", value: name, type: STRING, loc };
|
|
4302
|
+
const error = lowerer.upcastTo(receiver, "%Error");
|
|
4303
|
+
if (write) {
|
|
4304
|
+
const helper = classPropertiesHelper(lowerer, loc);
|
|
4305
|
+
this.generated.add(helper);
|
|
4306
|
+
const store = {
|
|
4307
|
+
kind: "exprStmt",
|
|
4308
|
+
expr: {
|
|
4309
|
+
kind: "libCall",
|
|
4310
|
+
fn: "dyn.keySet",
|
|
4311
|
+
args: [
|
|
4312
|
+
{
|
|
4313
|
+
kind: "call",
|
|
4314
|
+
callee: helper.name,
|
|
4315
|
+
args: [lowerer.coerceToExpected(receiver, DYN)],
|
|
4316
|
+
type: DYN,
|
|
4317
|
+
loc,
|
|
4318
|
+
},
|
|
4319
|
+
key,
|
|
4320
|
+
varRef("p.1", DYN, loc),
|
|
4321
|
+
],
|
|
4322
|
+
type: VOID,
|
|
4323
|
+
loc,
|
|
4324
|
+
},
|
|
4325
|
+
loc,
|
|
4326
|
+
};
|
|
4327
|
+
return [
|
|
4328
|
+
{
|
|
4329
|
+
kind: "if",
|
|
4330
|
+
cond: {
|
|
4331
|
+
kind: "dynTest",
|
|
4332
|
+
test: "string",
|
|
4333
|
+
value: varRef("p.1", DYN, loc),
|
|
4334
|
+
type: BOOL,
|
|
4335
|
+
loc,
|
|
4336
|
+
},
|
|
4337
|
+
then: [
|
|
4338
|
+
{
|
|
4339
|
+
kind: "exprStmt",
|
|
4340
|
+
expr: {
|
|
4341
|
+
kind: "libCall",
|
|
4342
|
+
fn: "error.setStack",
|
|
4343
|
+
args: [error, lowerer.coerceToExpected(varRef("p.1", DYN, loc), STRING)],
|
|
4344
|
+
type: VOID,
|
|
4345
|
+
loc,
|
|
4346
|
+
},
|
|
4347
|
+
loc,
|
|
4348
|
+
},
|
|
4349
|
+
{
|
|
4350
|
+
kind: "if",
|
|
4351
|
+
cond: this.readBagHas(lowerer, "dyn.hasKey", this.readPropertyBag(lowerer, receiver, loc), key, loc),
|
|
4352
|
+
then: [store],
|
|
4353
|
+
else_: null,
|
|
4354
|
+
loc,
|
|
4355
|
+
},
|
|
4356
|
+
],
|
|
4357
|
+
else_: [store],
|
|
4358
|
+
loc,
|
|
4359
|
+
},
|
|
4360
|
+
{ kind: "return", value: null, loc },
|
|
4361
|
+
];
|
|
4362
|
+
}
|
|
4363
|
+
const bag = this.readPropertyBag(lowerer, receiver, loc);
|
|
4364
|
+
return [
|
|
4365
|
+
{
|
|
4366
|
+
kind: "return",
|
|
4367
|
+
value: {
|
|
4368
|
+
kind: "ternary",
|
|
4369
|
+
cond: this.readBagHas(lowerer, "dyn.hasKey", bag, key, loc),
|
|
4370
|
+
then: {
|
|
4371
|
+
kind: "libCall",
|
|
4372
|
+
fn: "dyn.bagGet",
|
|
4373
|
+
args: [bag, key, lowerer.coerceToExpected(receiver, DYN)],
|
|
4374
|
+
type: DYN,
|
|
4375
|
+
loc,
|
|
4376
|
+
},
|
|
4377
|
+
else_: lowerer.coerceToExpected({ kind: "libCall", fn: "error.stack", args: [error], type: STRING, loc }, DYN),
|
|
4378
|
+
type: DYN,
|
|
4379
|
+
loc,
|
|
4380
|
+
},
|
|
4381
|
+
loc,
|
|
4382
|
+
},
|
|
4383
|
+
];
|
|
4384
|
+
}
|
|
3447
4385
|
if ((name === "message" || name === "name") && lowerer.isSubclassOf(info.def.name, "%Error"))
|
|
3448
4386
|
return write
|
|
3449
4387
|
? [
|
|
@@ -3549,9 +4487,7 @@ export class ClassDynamicDispatch {
|
|
|
3549
4487
|
const body = [];
|
|
3550
4488
|
const symbol = symbolMemberKey(lowerer, info, name, loc);
|
|
3551
4489
|
if (symbol || (isClassOwnEnumerableFieldName(name) && !name.startsWith("sym:"))) {
|
|
3552
|
-
const prototypeMethod = lowerer
|
|
3553
|
-
if (prototypeMethod)
|
|
3554
|
-
classPrototypeData(lowerer, info, loc, receiver);
|
|
4490
|
+
const prototypeMethod = observedPrototypeMethod(lowerer, info, name, loc, receiver);
|
|
3555
4491
|
// Selecting the method must not give the object own storage.
|
|
3556
4492
|
const bag = this.readPropertyBag(lowerer, receiver, loc);
|
|
3557
4493
|
const key = symbol ?? { kind: "strLit", value: name, type: STRING, loc };
|
|
@@ -3615,19 +4551,40 @@ export class ClassDynamicDispatch {
|
|
|
3615
4551
|
if (!field && !accessor) {
|
|
3616
4552
|
const instance = lowerer.coerceToExpected(receiver, DYN);
|
|
3617
4553
|
const bag = this.readPropertyBagOrEmpty(lowerer, instance, loc);
|
|
3618
|
-
|
|
3619
|
-
|
|
3620
|
-
|
|
3621
|
-
|
|
3622
|
-
|
|
3623
|
-
|
|
3624
|
-
|
|
3625
|
-
|
|
4554
|
+
const key = { kind: "strLit", value: name, type: STRING, loc };
|
|
4555
|
+
const own = {
|
|
4556
|
+
kind: "libCall",
|
|
4557
|
+
fn: "dyn.bagGet",
|
|
4558
|
+
args: [bag, key, instance],
|
|
4559
|
+
type: DYN,
|
|
4560
|
+
loc,
|
|
4561
|
+
};
|
|
4562
|
+
// An Object.prototype method no class in the chain declares: an
|
|
4563
|
+
// own property shadows it, otherwise the read answers the same
|
|
4564
|
+
// interned value `Object.prototype.<name>` reads.
|
|
4565
|
+
if (INHERITED_OBJECT_METHODS.has(name) && !findMethodOn(lowerer, info, name)) {
|
|
4566
|
+
return [
|
|
4567
|
+
{
|
|
4568
|
+
kind: "return",
|
|
4569
|
+
value: {
|
|
4570
|
+
kind: "ternary",
|
|
4571
|
+
cond: this.readBagHas(lowerer, "dyn.hasKey", bag, key, loc),
|
|
4572
|
+
then: own,
|
|
4573
|
+
else_: {
|
|
4574
|
+
kind: "libCall",
|
|
4575
|
+
fn: "dyn.builtinMethod",
|
|
4576
|
+
args: [{ kind: "strLit", value: "Object", type: STRING, loc }, key],
|
|
4577
|
+
type: DYN,
|
|
4578
|
+
loc,
|
|
4579
|
+
},
|
|
4580
|
+
type: DYN,
|
|
4581
|
+
loc,
|
|
4582
|
+
},
|
|
3626
4583
|
loc,
|
|
3627
4584
|
},
|
|
3628
|
-
|
|
3629
|
-
|
|
3630
|
-
];
|
|
4585
|
+
];
|
|
4586
|
+
}
|
|
4587
|
+
return [{ kind: "return", value: own, loc }];
|
|
3631
4588
|
}
|
|
3632
4589
|
const type = field ?? accessor.sig.ret;
|
|
3633
4590
|
if (!canConvertToDyn(type, getRecord, getUnion))
|
|
@@ -3947,6 +4904,8 @@ export class ClassDynamicDispatch {
|
|
|
3947
4904
|
let callee;
|
|
3948
4905
|
let virtual = false;
|
|
3949
4906
|
let owner;
|
|
4907
|
+
/** Erased instances of subclasses that redeclare a generic method. */
|
|
4908
|
+
const overrides = [];
|
|
3950
4909
|
if (methodInfo) {
|
|
3951
4910
|
owner = methodInfo.declarer;
|
|
3952
4911
|
params = methodInfo.sig.params;
|
|
@@ -3969,6 +4928,42 @@ export class ClassDynamicDispatch {
|
|
|
3969
4928
|
result = instance.returnType;
|
|
3970
4929
|
callee = instance.name;
|
|
3971
4930
|
}
|
|
4931
|
+
else if (generic &&
|
|
4932
|
+
!generic.info.implicitParams &&
|
|
4933
|
+
generic.info.typeParams.length > 0 &&
|
|
4934
|
+
generic.declarer.decl &&
|
|
4935
|
+
!lowerer.overrideBelow(info, method)) {
|
|
4936
|
+
// A generic method called by name runs its erased instance; a
|
|
4937
|
+
// subclass that redeclares it runs its own, selected by the
|
|
4938
|
+
// receiver's runtime class (most derived first).
|
|
4939
|
+
owner = generic.declarer;
|
|
4940
|
+
const instance = erasedGenericInstance(lowerer, generic.declarer.decl, generic.info);
|
|
4941
|
+
params = instance.params;
|
|
4942
|
+
result = instance.returnType;
|
|
4943
|
+
callee = instance.name;
|
|
4944
|
+
if (genericOverrideBelow(info, method)) {
|
|
4945
|
+
const subclasses = [];
|
|
4946
|
+
const collect = (c) => {
|
|
4947
|
+
for (const sub of c.subclasses) {
|
|
4948
|
+
collect(sub);
|
|
4949
|
+
if (sub.genericMethods?.has(method) && lowerer.classCanBeConstructed(sub))
|
|
4950
|
+
subclasses.push(sub);
|
|
4951
|
+
}
|
|
4952
|
+
};
|
|
4953
|
+
collect(info);
|
|
4954
|
+
for (const sub of subclasses) {
|
|
4955
|
+
const own = sub.genericMethods.get(method);
|
|
4956
|
+
if (!sub.decl || own.implicitParams || own.typeParams.length === 0)
|
|
4957
|
+
return fence();
|
|
4958
|
+
const subInstance = erasedGenericInstance(lowerer, sub.decl, own);
|
|
4959
|
+
if (subInstance.params.length !== params.length ||
|
|
4960
|
+
subInstance.params.some((p, i) => !typeEquals(p.type, params[i].type)) ||
|
|
4961
|
+
!typeEquals(subInstance.returnType, result))
|
|
4962
|
+
return fence();
|
|
4963
|
+
overrides.push({ cls: sub, callee: subInstance.name });
|
|
4964
|
+
}
|
|
4965
|
+
}
|
|
4966
|
+
}
|
|
3972
4967
|
else
|
|
3973
4968
|
return fence();
|
|
3974
4969
|
const incoming = dispatch.source.args.map((_, i) => varRef(`p.${i + 1}`, DYN, loc));
|
|
@@ -4004,7 +4999,7 @@ export class ClassDynamicDispatch {
|
|
|
4004
4999
|
return fence();
|
|
4005
5000
|
args.push(converted);
|
|
4006
5001
|
}
|
|
4007
|
-
|
|
5002
|
+
let call = virtual
|
|
4008
5003
|
? {
|
|
4009
5004
|
kind: "virtualCall",
|
|
4010
5005
|
className: owner.def.name,
|
|
@@ -4020,6 +5015,29 @@ export class ClassDynamicDispatch {
|
|
|
4020
5015
|
type: result,
|
|
4021
5016
|
loc,
|
|
4022
5017
|
};
|
|
5018
|
+
for (const override of overrides.toReversed()) {
|
|
5019
|
+
const subType = { kind: "object", className: override.cls.def.name };
|
|
5020
|
+
call = {
|
|
5021
|
+
kind: "ternary",
|
|
5022
|
+
cond: {
|
|
5023
|
+
kind: "instanceOf",
|
|
5024
|
+
value: receiver,
|
|
5025
|
+
className: override.cls.def.name,
|
|
5026
|
+
type: BOOL,
|
|
5027
|
+
loc,
|
|
5028
|
+
},
|
|
5029
|
+
then: {
|
|
5030
|
+
kind: "call",
|
|
5031
|
+
callee: override.callee,
|
|
5032
|
+
args: [{ kind: "downcast", value: receiver, type: subType, loc }, ...args],
|
|
5033
|
+
type: result,
|
|
5034
|
+
loc,
|
|
5035
|
+
},
|
|
5036
|
+
else_: call,
|
|
5037
|
+
type: result,
|
|
5038
|
+
loc,
|
|
5039
|
+
};
|
|
5040
|
+
}
|
|
4023
5041
|
let body;
|
|
4024
5042
|
if (result.kind === "void")
|
|
4025
5043
|
body = [
|
|
@@ -4079,4 +5097,12 @@ export class ClassDynamicDispatch {
|
|
|
4079
5097
|
return body;
|
|
4080
5098
|
}
|
|
4081
5099
|
}
|
|
5100
|
+
/** Object.prototype methods every class instance inherits unless its class
|
|
5101
|
+
* chain declares them. */
|
|
5102
|
+
const INHERITED_OBJECT_METHODS = new Set([
|
|
5103
|
+
"valueOf",
|
|
5104
|
+
"toString",
|
|
5105
|
+
"hasOwnProperty",
|
|
5106
|
+
"propertyIsEnumerable",
|
|
5107
|
+
]);
|
|
4082
5108
|
//# sourceMappingURL=class-dynamic-dispatch.js.map
|