@scriptc/compiler 0.4.0 → 0.4.2
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 +617 -83
- package/dist/backend/cycle-analysis.d.ts +2 -1
- package/dist/backend/cycle-analysis.js +4 -4
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +2 -1
- package/dist/backend/cycle-mutability.js +2 -2
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +10 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +2 -1
- package/dist/backend/immutability.js +2 -2
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/library-pack.js +7 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/link-plan-core.d.ts +2 -0
- package/dist/backend/link-plan-core.js +2 -0
- package/dist/backend/link-plan-core.js.map +1 -1
- package/dist/backend/link-plan.d.ts +1 -0
- package/dist/backend/link-plan.js +1 -0
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +7 -3
- package/dist/backend/llvm/alloc.js +7 -4
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/array-search.js +4 -1
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +23 -2
- package/dist/backend/llvm/bytes-loop-versions.js +115 -19
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +131 -0
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +99 -2
- package/dist/backend/llvm/classes.js +436 -57
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +235 -16
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +21 -5
- package/dist/backend/llvm/common.js +50 -5
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.js +8 -4
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +4 -4
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +4 -1
- package/dist/backend/llvm/counted-loops.js +62 -23
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +3 -1
- package/dist/backend/llvm/dense-array-access.js +61 -38
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +4 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +19 -16
- package/dist/backend/llvm/dense-array-loops.js +49 -13
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +50 -14
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +34 -1
- package/dist/backend/llvm/dyn.js +393 -14
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +27 -8
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-module.js +67 -39
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +3 -25
- package/dist/backend/llvm/emit-statements.js +414 -37
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +159 -22
- package/dist/backend/llvm/emitter.js +573 -89
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +19 -0
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +5 -2
- package/dist/backend/llvm/expr-bytes.js +110 -40
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +1 -1
- package/dist/backend/llvm/expr-calls.js +51 -26
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +27 -14
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +2 -3
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +95 -5
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +29 -11
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +55 -0
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +48 -20
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.js +131 -35
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/integer-clones.js +3 -3
- package/dist/backend/llvm/integer-clones.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +18 -0
- package/dist/backend/llvm/js-ic.js +712 -0
- package/dist/backend/llvm/js-ic.js.map +1 -0
- package/dist/backend/llvm/jsval.js +139 -11
- package/dist/backend/llvm/jsval.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +10 -0
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +61 -0
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.d.ts +4 -0
- package/dist/backend/llvm/lib-http2.js +20 -17
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +69 -17
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +75 -1
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +65 -28
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +23 -0
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +91 -61
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +14 -0
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +20 -4
- package/dist/backend/llvm/map-number-lookup.js +43 -7
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/narrow-guards.js +64 -0
- package/dist/backend/llvm/narrow-guards.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +11 -1
- package/dist/backend/llvm/publish.js +80 -22
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.js +3 -0
- package/dist/backend/llvm/publish.test.js.map +1 -1
- package/dist/backend/llvm/receivers.js +1 -1
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/reference-writes.js +2 -0
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.js +161 -14
- package/dist/backend/llvm/regex-matchers.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.test.js +18 -0
- package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
- package/dist/backend/llvm/regions.js +2 -2
- package/dist/backend/llvm/regions.js.map +1 -1
- package/dist/backend/llvm/regions.test.js +7 -1
- package/dist/backend/llvm/regions.test.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +17 -9
- package/dist/backend/llvm/shapes.js +21 -17
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +20 -1
- package/dist/backend/llvm/speculative-integers.js +94 -6
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.test.js +55 -1
- package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +2 -1
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +4 -1
- package/dist/backend/llvm/string-reads.js +88 -4
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/thread-slots.test.js +5 -4
- package/dist/backend/llvm/thread-slots.test.js.map +1 -1
- package/dist/backend/llvm/wasm-modules.d.ts +6 -5
- package/dist/backend/llvm/wasm-modules.js +32 -9
- package/dist/backend/llvm/wasm-modules.js.map +1 -1
- package/dist/backend/mangle.d.ts +8 -0
- package/dist/backend/mangle.js +12 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +40 -2
- package/dist/backend/native/executable.js +40 -7
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +3 -1
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +17 -6
- package/dist/backend/native-codegen.js +55 -9
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +18 -14
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +30 -2
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-profile.d.ts +32 -0
- package/dist/backend/native-profile.js +39 -0
- package/dist/backend/native-profile.js.map +1 -0
- package/dist/backend/native-profile.test.d.ts +1 -0
- package/dist/backend/native-profile.test.js +58 -0
- package/dist/backend/native-profile.test.js.map +1 -0
- package/dist/backend/native-tools.d.ts +14 -0
- package/dist/backend/native-tools.js +13 -0
- package/dist/backend/native-tools.js.map +1 -1
- package/dist/backend/optimization.d.ts +2 -2
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +4 -0
- package/dist/backend/runtime-pack-core.js +4 -0
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +7 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +0 -21
- package/dist/backend/runtime-pack.js +0 -29
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +12 -69
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.js +38 -1
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +6 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +89 -7
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/host.d.ts +3 -0
- package/dist/cli/output-options.d.ts +2 -0
- package/dist/cli/output-options.js +9 -0
- package/dist/cli/output-options.js.map +1 -1
- package/dist/cli/usage.d.ts +15 -1
- package/dist/cli/usage.js +30 -2
- package/dist/cli/usage.js.map +1 -1
- package/dist/compile-types.d.ts +9 -0
- package/dist/contracts/check.js +2 -3
- package/dist/contracts/check.js.map +1 -1
- package/dist/coverage/report.d.ts +7 -2
- package/dist/coverage/report.js +18 -0
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +1 -0
- package/dist/coverage/verdict-cache.js +4 -0
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/coverage/verdict-semantic.js +4 -0
- package/dist/coverage/verdict-semantic.js.map +1 -1
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/dynamic-tier.d.ts +40 -0
- package/dist/diagnostics/dynamic-tier.js +57 -0
- package/dist/diagnostics/dynamic-tier.js.map +1 -0
- package/dist/diagnostics/envelope.d.ts +2 -1
- package/dist/diagnostics/envelope.js +5 -2
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +32 -0
- package/dist/executable/executable-cache.js +65 -7
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +50 -3
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +3 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +1 -0
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/arguments-usage.d.ts +8 -0
- package/dist/frontend/arguments-usage.js +98 -0
- package/dist/frontend/arguments-usage.js.map +1 -1
- package/dist/frontend/arguments-usage.test.d.ts +1 -0
- package/dist/frontend/arguments-usage.test.js +32 -0
- package/dist/frontend/arguments-usage.test.js.map +1 -0
- package/dist/frontend/builtin-package-aliases.d.ts +24 -0
- package/dist/frontend/builtin-package-aliases.js +133 -0
- package/dist/frontend/builtin-package-aliases.js.map +1 -0
- package/dist/frontend/builtin-package-aliases.test.d.ts +1 -0
- package/dist/frontend/builtin-package-aliases.test.js +48 -0
- package/dist/frontend/builtin-package-aliases.test.js.map +1 -0
- package/dist/frontend/dispose-hook.d.ts +2 -0
- package/dist/frontend/dispose-hook.js +14 -0
- package/dist/frontend/dispose-hook.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +4 -0
- package/dist/frontend/dts-paths.js +9 -1
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/jsx-entities.d.ts +4 -0
- package/dist/frontend/jsx-entities.js +259 -0
- package/dist/frontend/jsx-entities.js.map +1 -0
- package/dist/frontend/jsx-source.d.ts +71 -0
- package/dist/frontend/jsx-source.js +781 -0
- package/dist/frontend/jsx-source.js.map +1 -0
- package/dist/frontend/jsx-source.test.d.ts +1 -0
- package/dist/frontend/jsx-source.test.js +200 -0
- package/dist/frontend/jsx-source.test.js.map +1 -0
- package/dist/frontend/literal-values.test.js +8 -9
- package/dist/frontend/literal-values.test.js.map +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +3 -2
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
- package/dist/frontend/lowering/binding-analysis.js +2 -2
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
- package/dist/frontend/lowering/builtins/arguments.js +30 -15
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.js +10 -6
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
- package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +8 -0
- package/dist/frontend/lowering/builtins/builtin-class-dyn.js +50 -1
- package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -1
- package/dist/frontend/lowering/builtins/callable-aliases.js +3 -2
- package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +7 -2
- package/dist/frontend/lowering/builtins/crypto.js +63 -4
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
- package/dist/frontend/lowering/builtins/date-classes.js +477 -0
- package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
- package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
- package/dist/frontend/lowering/builtins/dates.js +55 -26
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
- package/dist/frontend/lowering/builtins/dh.js +151 -0
- package/dist/frontend/lowering/builtins/dh.js.map +1 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
- package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
- package/dist/frontend/lowering/builtins/ecdh.d.ts +21 -0
- package/dist/frontend/lowering/builtins/ecdh.js +208 -0
- package/dist/frontend/lowering/builtins/ecdh.js.map +1 -0
- package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
- package/dist/frontend/lowering/builtins/errors.js +110 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.js +6 -4
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
- package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
- package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
- package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
- package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
- package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +54 -1
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
- package/dist/frontend/lowering/builtins/key-object.js +20 -7
- package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +11 -4
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.js +9 -5
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.js +4 -3
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/performance.js +3 -2
- package/dist/frontend/lowering/builtins/performance.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +9 -0
- package/dist/frontend/lowering/builtins/process.js +47 -2
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.js +3 -2
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/promisify-callback.d.ts +3 -0
- package/dist/frontend/lowering/builtins/promisify-callback.js +23 -4
- package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +2 -1
- package/dist/frontend/lowering/builtins/readline.js +23 -6
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/reflection.js +26 -0
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
- package/dist/frontend/lowering/builtins/strings.js +13 -5
- package/dist/frontend/lowering/builtins/strings.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.js +6 -2
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/builtins/typed-array-members.d.ts +7 -0
- package/dist/frontend/lowering/builtins/typed-array-members.js +160 -0
- package/dist/frontend/lowering/builtins/typed-array-members.js.map +1 -0
- package/dist/frontend/lowering/builtins/url.js +4 -3
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/v8.js +2 -1
- package/dist/frontend/lowering/builtins/v8.js.map +1 -1
- package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
- package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.js +2 -1
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.d.ts +4 -0
- package/dist/frontend/lowering/call-signatures.js +137 -13
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
- package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
- package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js +34 -1
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
- package/dist/frontend/lowering/class-assertions.js +3 -2
- package/dist/frontend/lowering/class-assertions.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +2 -1
- package/dist/frontend/lowering/class-construction.js +8 -13
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-descriptors.js +1 -1
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +34 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +577 -152
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +77 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +3 -0
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +1 -1
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +17 -0
- package/dist/frontend/lowering/class-protocols.js +117 -7
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
- package/dist/frontend/lowering/class-prototypes.js +42 -4
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-to-primitive.d.ts +2 -2
- package/dist/frontend/lowering/class-to-primitive.js +31 -8
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
- package/dist/frontend/lowering/class-unions.js +2 -1
- package/dist/frontend/lowering/class-unions.js.map +1 -1
- package/dist/frontend/lowering/coercions/fresh-spread.d.ts +13 -0
- package/dist/frontend/lowering/coercions/fresh-spread.js +95 -0
- package/dist/frontend/lowering/coercions/fresh-spread.js.map +1 -0
- package/dist/frontend/lowering/coercions/function-adapters.js +105 -75
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +8 -7
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.js +8 -7
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/collection-ingestion.js +2 -1
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +15 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +36 -32
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +2 -1
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +32 -4
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +11 -5
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +2 -1
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +10 -1
- package/dist/frontend/lowering/containers/bytes.js +601 -24
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +52 -2
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +80 -10
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +8 -7
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
- package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +85 -22
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +2 -1
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +26 -10
- package/dist/frontend/lowering/cycle-initialization.js +177 -39
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
- package/dist/frontend/lowering/dispatch-sites.js +204 -0
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
- package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
- package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
- package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
- package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
- package/dist/frontend/lowering/dyn-streams.js +1 -1
- package/dist/frontend/lowering/dyn-streams.js.map +1 -1
- package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
- package/dist/frontend/lowering/dynamic-tier.js +327 -0
- package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
- package/dist/frontend/lowering/error-methods.js +4 -0
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +48 -13
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +124 -8
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +30 -7
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +46 -7
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +14 -2
- package/dist/frontend/lowering/expressions/keyed-field-targets.js +91 -10
- package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +52 -7
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +0 -3
- package/dist/frontend/lowering/expressions/object-literals.js +75 -7
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +17 -8
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +5 -4
- package/dist/frontend/lowering/expressions/property-access.js +351 -16
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +112 -9
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +13 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +64 -10
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
- package/dist/frontend/lowering/generator-delegation.js +191 -1
- package/dist/frontend/lowering/generator-delegation.js.map +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +46 -1
- package/dist/frontend/lowering/generic-functions.js +660 -73
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/handle-properties.d.ts +24 -0
- package/dist/frontend/lowering/handle-properties.js +281 -0
- package/dist/frontend/lowering/handle-properties.js.map +1 -0
- package/dist/frontend/lowering/intern-tables.js +2 -1
- package/dist/frontend/lowering/intern-tables.js.map +1 -1
- package/dist/frontend/lowering/iterable-spelling.d.ts +7 -0
- package/dist/frontend/lowering/iterable-spelling.js +38 -0
- package/dist/frontend/lowering/iterable-spelling.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.js +9 -8
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
- package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
- package/dist/frontend/lowering/json-require.js +2 -1
- package/dist/frontend/lowering/json-require.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +7 -2
- package/dist/frontend/lowering/key-order-witness.js +21 -4
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +38 -2
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lifetime-regions.js +2 -1
- package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.d.ts +33 -15
- package/dist/frontend/lowering/lower-array-sort.js +117 -21
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.js +93 -14
- package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +6 -5
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +3 -1
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +1 -0
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +4 -0
- package/dist/frontend/lowering/lower-calls.js +504 -97
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +22 -0
- package/dist/frontend/lowering/lower-classes.js +339 -32
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +65 -15
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
- package/dist/frontend/lowering/lower-event-emitter.js +267 -20
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
- package/dist/frontend/lowering/lower-exprs.js +148 -12
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +308 -72
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +10 -4
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +578 -16
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +2 -1
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.js +2 -1
- package/dist/frontend/lowering/lower-mock.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +11 -3
- package/dist/frontend/lowering/lower-modules.js +227 -72
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.js +2 -2
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
- package/dist/frontend/lowering/lower-namespaces.js +24 -3
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +10 -0
- package/dist/frontend/lowering/lower-server.js +263 -60
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.js +39 -18
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +7 -10
- package/dist/frontend/lowering/lower-stmts.js +584 -69
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +575 -165
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +21 -4
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +151 -30
- package/dist/frontend/lowering/lowerer.js +725 -84
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +21 -9
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/narrowing-stability.js +5 -0
- package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +1 -1
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
- package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.js +2 -1
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/private-brands.d.ts +9 -0
- package/dist/frontend/lowering/private-brands.js +66 -15
- package/dist/frontend/lowering/private-brands.js.map +1 -1
- package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
- package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
- package/dist/frontend/lowering/rebindable-functions.d.ts +8 -0
- package/dist/frontend/lowering/rebindable-functions.js +54 -0
- package/dist/frontend/lowering/rebindable-functions.js.map +1 -0
- package/dist/frontend/lowering/require-initialization.js +2 -1
- package/dist/frontend/lowering/require-initialization.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
- package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
- package/dist/frontend/lowering/runtime-optional-records.js +18 -5
- package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
- package/dist/frontend/lowering/site-dependencies.js +84 -0
- package/dist/frontend/lowering/site-dependencies.js.map +1 -0
- package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
- package/dist/frontend/lowering/site-dependencies.test.js +53 -0
- package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
- package/dist/frontend/lowering/stable-names.d.ts +11 -0
- package/dist/frontend/lowering/stable-names.js +35 -0
- package/dist/frontend/lowering/stable-names.js.map +1 -0
- package/dist/frontend/lowering/static-typeof.d.ts +26 -0
- package/dist/frontend/lowering/static-typeof.js +172 -0
- package/dist/frontend/lowering/static-typeof.js.map +1 -0
- package/dist/frontend/lowering/strict-equality.js +2 -1
- package/dist/frontend/lowering/strict-equality.js.map +1 -1
- package/dist/frontend/lowering/string-index-bounds.js +3 -2
- package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
- package/dist/frontend/lowering/structural-positions.d.ts +32 -0
- package/dist/frontend/lowering/structural-positions.js +108 -0
- package/dist/frontend/lowering/structural-positions.js.map +1 -0
- package/dist/frontend/lowering/surfaces.js +72 -30
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/thenables.d.ts +16 -0
- package/dist/frontend/lowering/thenables.js +124 -0
- package/dist/frontend/lowering/thenables.js.map +1 -0
- package/dist/frontend/lowering/var-hoisting.js +37 -3
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/npm-static-builtin-aliases.d.ts +8 -0
- package/dist/frontend/npm-static-builtin-aliases.js +65 -0
- package/dist/frontend/npm-static-builtin-aliases.js.map +1 -0
- package/dist/frontend/npm-static-bundled-chunks.d.ts +8 -1
- package/dist/frontend/npm-static-bundled-chunks.js +173 -2
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.test.js +112 -0
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
- package/dist/frontend/npm-static-bundled-esm.js +224 -4
- package/dist/frontend/npm-static-bundled-esm.js.map +1 -1
- package/dist/frontend/npm-static-bundled-esm.test.js +129 -0
- package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -1
- package/dist/frontend/npm-static-enum-iife.d.ts +6 -0
- package/dist/frontend/npm-static-enum-iife.js +280 -0
- package/dist/frontend/npm-static-enum-iife.js.map +1 -0
- package/dist/frontend/npm-static-enum-iife.test.d.ts +1 -0
- package/dist/frontend/npm-static-enum-iife.test.js +116 -0
- package/dist/frontend/npm-static-enum-iife.test.js.map +1 -0
- package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
- package/dist/frontend/npm-static-tsc-helpers.js +106 -0
- package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
- package/dist/frontend/npm-static-type-exports-host.js +214 -0
- package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
- package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.d.ts +52 -0
- package/dist/frontend/npm-static-type-exports.js +261 -0
- package/dist/frontend/npm-static-type-exports.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports.test.js +103 -0
- package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
- package/dist/frontend/npm-static-umd.d.ts +6 -0
- package/dist/frontend/npm-static-umd.js +203 -0
- package/dist/frontend/npm-static-umd.js.map +1 -0
- package/dist/frontend/npm-static-umd.test.d.ts +1 -0
- package/dist/frontend/npm-static-umd.test.js +105 -0
- package/dist/frontend/npm-static-umd.test.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +16 -0
- package/dist/frontend/npm-static.js +93 -3
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.js +13 -0
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +47 -0
- package/dist/frontend/package-shims.js +300 -0
- package/dist/frontend/package-shims.js.map +1 -0
- package/dist/frontend/pipeline.js +67 -1
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program.d.ts +21 -0
- package/dist/frontend/program.js +174 -14
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +1 -1
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/resolve.js +13 -0
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/services.d.ts +12 -0
- package/dist/frontend/services.js +37 -0
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/ts7/ast-node.d.ts +21 -7
- package/dist/frontend/ts7/ast-node.js +131 -29
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +60 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +27 -2
- package/dist/frontend/ts7/ast-wire.js +124 -21
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast.d.ts +23 -2
- package/dist/frontend/ts7/ast.js +143 -2
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +13 -1
- package/dist/frontend/ts7/checker.js +75 -1
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +9 -6
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/enums.d.ts +3 -3
- package/dist/frontend/ts7/enums.generated.d.ts +10 -0
- package/dist/frontend/ts7/enums.generated.js +21 -0
- package/dist/frontend/ts7/enums.generated.js.map +1 -1
- package/dist/frontend/ts7/enums.js +19 -0
- package/dist/frontend/ts7/enums.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +6 -5
- package/dist/frontend/ts7/program-host.js +12 -2
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
- package/dist/frontend/ts7/semantic-checker.js +25 -20
- package/dist/frontend/ts7/semantic-checker.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.d.ts +13 -0
- package/dist/frontend/ts7/semantic-json.js +146 -0
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.test.js +57 -1
- package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +18 -0
- package/dist/frontend/ts7/semantic-model.js +90 -16
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +3 -2
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +19 -4
- package/dist/frontend/ts7/session.js +1 -1
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/tsc-codes.d.ts +1 -1
- package/dist/frontend/tsc-codes.js +7 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +38 -6
- package/dist/frontend/type-mapper.js +466 -47
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +1 -1
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend-process-args.d.ts +4 -0
- package/dist/frontend-process-args.js +52 -0
- package/dist/frontend-process-args.js.map +1 -0
- package/dist/frontend-process-args.test.d.ts +1 -0
- package/dist/frontend-process-args.test.js +47 -0
- package/dist/frontend-process-args.test.js.map +1 -0
- package/dist/frontend-process.d.ts +1 -0
- package/dist/frontend-process.js +23 -0
- package/dist/frontend-process.js.map +1 -0
- package/dist/heap-collection.d.ts +16 -0
- package/dist/heap-collection.js +42 -0
- package/dist/heap-collection.js.map +1 -0
- package/dist/heap-collection.test.d.ts +1 -0
- package/dist/heap-collection.test.js +59 -0
- package/dist/heap-collection.test.js.map +1 -0
- package/dist/heap-pressure.d.ts +2 -0
- package/dist/heap-pressure.js +12 -0
- package/dist/heap-pressure.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +453 -85
- package/dist/index.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +3 -2
- package/dist/ir/array-length-stability.js +22 -2
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +47 -1
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.js +41 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +5 -1
- package/dist/ir/builtin-signatures.js +187 -16
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/final-fields.d.ts +2 -1
- package/dist/ir/final-fields.js +2 -2
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.test.js +2 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/int32-slots.d.ts +13 -5
- package/dist/ir/int32-slots.js +112 -115
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +3 -1
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +14 -4
- package/dist/ir/integer-loop-facts.js +172 -32
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +49 -0
- package/dist/ir/integer-loops.js +193 -39
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +201 -1
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +10 -1
- package/dist/ir/integer-ranges.js +122 -25
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +255 -1
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +17 -2
- package/dist/ir/ir.js +11 -1
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/js-ic.d.ts +52 -0
- package/dist/ir/js-ic.js +199 -0
- package/dist/ir/js-ic.js.map +1 -0
- package/dist/ir/js-ic.test.d.ts +1 -0
- package/dist/ir/js-ic.test.js +148 -0
- package/dist/ir/js-ic.test.js.map +1 -0
- package/dist/ir/jsval.js +38 -4
- package/dist/ir/jsval.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +64 -5
- package/dist/ir/runtime-features.js +358 -101
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/tiers.js +1 -0
- package/dist/ir/tiers.js.map +1 -1
- package/dist/ir/traverse.d.ts +2 -0
- package/dist/ir/traverse.js +124 -70
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +77 -24
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +15 -2
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/ir-policy.js +11 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +2 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/prepare.js +2 -0
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/cli.js +22 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +33 -4
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache.js +3 -0
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.js +8 -1
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.test.js +10 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/startup-cache.d.ts +1 -0
- package/dist/startup-cache.js +1 -0
- package/dist/startup-cache.js.map +1 -1
- package/dist/text-parts.d.ts +7 -0
- package/dist/text-parts.js +44 -0
- package/dist/text-parts.js.map +1 -1
- package/dist/text-parts.test.d.ts +1 -0
- package/dist/text-parts.test.js +46 -0
- package/dist/text-parts.test.js.map +1 -0
- package/dist/timing.d.ts +9 -2
- package/dist/timing.js +7 -4
- package/dist/timing.js.map +1 -1
- package/dist/wasm/translate.d.ts +4 -0
- package/dist/wasm/translate.js +2 -2
- package/dist/wasm/translate.js.map +1 -1
- package/package.json +22 -21
- package/shims/fs-extra/core/api.ts +1192 -0
- package/shims/fs-extra/index.ts +9 -0
- package/shims/undici/core/agent.ts +163 -0
- package/shims/undici/core/api.ts +93 -0
- package/shims/undici/core/client.ts +1304 -0
- package/shims/undici/core/connector.ts +157 -0
- package/shims/undici/core/diagnostics-types.ts +68 -0
- package/shims/undici/core/diagnostics.ts +16 -0
- package/shims/undici/core/dispatcher.ts +574 -0
- package/shims/undici/core/errors-v5.ts +22 -0
- package/shims/undici/core/errors-v7.ts +25 -0
- package/shims/undici/core/errors.ts +255 -0
- package/shims/undici/core/fetch.ts +635 -0
- package/shims/undici/core/pool.ts +280 -0
- package/shims/undici/core/readable.ts +268 -0
- package/shims/undici/core/request.ts +313 -0
- package/shims/undici/core/timers.ts +80 -0
- package/shims/undici/core/types.ts +167 -0
- package/shims/undici/core/util.ts +67 -0
- package/shims/undici/v5.ts +119 -0
- package/shims/undici/v7.ts +119 -0
- package/surface-manifest.json +20 -52
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { keyedHelperName } from "./stable-names.js";
|
|
1
2
|
import { isForwardedTupleSpread, lowerForwardingApply } from "./typed-arguments.js";
|
|
2
3
|
import { guardNullProto, nullProtoRecordShape } from "./null-prototype.js";
|
|
3
4
|
import { lowerDynStreamMemberCall } from "./dyn-streams.js";
|
|
@@ -51,7 +52,7 @@ import { createRequireSpecOf } from "./builtins/module-bindings.js";
|
|
|
51
52
|
import { lowerChildStreamMethodCall, lowerChildWriterMethodCall, } from "./builtins/child-process-methods.js";
|
|
52
53
|
import { lowerCreateRequireCall, lowerImportMetaResolveCall, lowerRequireResolveCall, } from "./builtins/module-resolution.js";
|
|
53
54
|
import { isWebCryptoReceiver, lowerCipherMethodCall, lowerCryptoGetRandomValues, lowerCryptoHashMethodCall, lowerPromisifiedCryptoCall, } from "./builtins/crypto.js";
|
|
54
|
-
import { lowerErrorIsErrorCall } from "./builtins/errors.js";
|
|
55
|
+
import { lowerErrorCaptureStackTraceCall, lowerErrorIsErrorCall } from "./builtins/errors.js";
|
|
55
56
|
import { lowerPromisifiedDnsCall } from "./lower-dgram.js";
|
|
56
57
|
import { lowerDisposableStackUseCall } from "./builtins/disposable-stack.js";
|
|
57
58
|
import { lowerDirentMethodCall, lowerFileHandleMethodCall, lowerDirMethodCall, lowerWatcherMethodCall, } from "./builtins/filesystem.js";
|
|
@@ -59,9 +60,10 @@ import { fencePerfEntryKeyWalk, isPerfEntryType, lowerHistogramMethodCall, lower
|
|
|
59
60
|
import { lowerProcStreamMethodCall, lowerProcessBuiltinModuleNamespace, } from "./builtins/process.js";
|
|
60
61
|
import { recordMayKeepSource, throughRecordSource } from "./record-sources.js";
|
|
61
62
|
import { lowerReflectCall } from "./builtins/reflection.js";
|
|
62
|
-
import { lowerAbsenceProbe, v8CalleeText,
|
|
63
|
+
import { lowerAbsenceProbe, v8CalleeText, lowerPromiseAllTupleCall, lowerPromiseRejectCall, lowerToNumberArgument, stringWrapperToString, symbolFieldInfo, templateRawTextOf, primitiveCtorClosure, } from "./lower-exprs.js";
|
|
63
64
|
import { isSafeToDiscard } from "./expressions/evaluation-safety.js";
|
|
64
65
|
import { tryLowerExpression } from "./expressions/try-lower-expression.js";
|
|
66
|
+
import { lowerChildMethodValue, lowerChildPropertyCall } from "./handle-properties.js";
|
|
65
67
|
import { classToNumberConversion } from "./class-to-primitive.js";
|
|
66
68
|
import { hasRuntimeStatics } from "./class-runtime-statics.js";
|
|
67
69
|
import { structuralReadType } from "./class-unions.js";
|
|
@@ -70,6 +72,7 @@ import { EMITTER_API_MEMBERS, exactClassOfReceiver, exactInstanceClassOf, findGe
|
|
|
70
72
|
import { classCallbackCall, isClassCallback } from "./class-callbacks.js";
|
|
71
73
|
import { emitterRooted, lowerEmitterMethodCall } from "./lower-event-emitter.js";
|
|
72
74
|
import { eventTargetApiMethod, lowerEventTargetMethodCall } from "./lower-event-target.js";
|
|
75
|
+
import { dateRootOf, isDatePrototypeMethod, lowerInheritedDateMethodCall, } from "./builtins/date-classes.js";
|
|
73
76
|
import { lowerConsoleInstanceCall, lowerConsoleMethodCall, lowerConsoleOutput, } from "./lower-console.js";
|
|
74
77
|
import { STREAM_API_MEMBERS, STREAM_OPERATORS, lowerStreamMethodCall, lowerStreamStaticCall, streamSidesOf, } from "./lower-stream.js";
|
|
75
78
|
import { ambientNsRootOf, ambientUndefReadType, ambientUndefVarRootOf, ambientUndefinedFnSymbolOf, contextualUndefReadType, fenceEarlyAliasUse, fenceEarlyNsMemberRef, nsMemberIdentOf, nsUndefRead, } from "./lower-namespaces.js";
|
|
@@ -738,10 +741,9 @@ export function lowerCall(lowerer, expr) {
|
|
|
738
741
|
// excludes shadowed names. parseInt's omitted radix completes
|
|
739
742
|
// to 0 — the spec's "undefined" (base 10 with the 0x hex escape);
|
|
740
743
|
// parseFloat lowers the STRING form only (Node would ToString other
|
|
741
|
-
// values — no static story); isNaN/isFinite's
|
|
742
|
-
//
|
|
743
|
-
//
|
|
744
|
-
// Number.isFinite exactly (ms's `isFinite(val)` guard).
|
|
744
|
+
// values — no static story); isNaN/isFinite apply the global's
|
|
745
|
+
// ToNumber to any argument, then test like Number.isNaN /
|
|
746
|
+
// Number.isFinite.
|
|
745
747
|
if ((expr.expression.text === "parseInt" ||
|
|
746
748
|
expr.expression.text === "isNaN" ||
|
|
747
749
|
expr.expression.text === "parseFloat" ||
|
|
@@ -840,15 +842,11 @@ export function lowerCall(lowerer, expr) {
|
|
|
840
842
|
}
|
|
841
843
|
if (islFn && expr.arguments.nodes.length === islFn.args.length) {
|
|
842
844
|
// The static forms above already took the exactly-typed argument
|
|
843
|
-
// (a string for parseFloat
|
|
844
|
-
//
|
|
845
|
-
//
|
|
846
|
-
// unsupported.
|
|
845
|
+
// (a string for parseFloat): name the argument type that refused
|
|
846
|
+
// the call, so the message states the condition rather than
|
|
847
|
+
// reading as if the global itself were unsupported.
|
|
847
848
|
const argText = loweredArgumentText(lowerer, expr.arguments.nodes[0]);
|
|
848
|
-
|
|
849
|
-
lowerer.refuseUnsupportedApi(`'${expr.expression.text}' with a '${argText}' argument`, expr, exact === "string"
|
|
850
|
-
? "only a string argument compiles statically: convert the argument explicitly first (for example String(x), or narrow the union)"
|
|
851
|
-
: "only a number argument compiles statically: narrow the argument to a number first");
|
|
849
|
+
lowerer.refuseUnsupportedApi(`'${expr.expression.text}' with a '${argText}' argument`, expr, "only a string argument compiles statically: convert the argument explicitly first (for example String(x), or narrow the union)");
|
|
852
850
|
}
|
|
853
851
|
}
|
|
854
852
|
// A TYPE-GUARD call on a catch binding (`isErrnoException(err)` —
|
|
@@ -1160,6 +1158,7 @@ export function lowerCall(lowerer, expr) {
|
|
|
1160
1158
|
lowerCipherMethodCall(lowerer, expr, expr.expression) ??
|
|
1161
1159
|
lowerFileHandleMethodCall(lowerer, expr, expr.expression) ??
|
|
1162
1160
|
lowerDirMethodCall(lowerer, expr, expr.expression) ??
|
|
1161
|
+
lowerChildPropertyCall(lowerer, expr, expr.expression) ??
|
|
1163
1162
|
lowerer.lowerChildMethodCall(expr, expr.expression) ??
|
|
1164
1163
|
// Piped child-output stream receivers — on/once("data" | "end").
|
|
1165
1164
|
lowerChildStreamMethodCall(lowerer, expr, expr.expression) ??
|
|
@@ -1235,9 +1234,10 @@ export function lowerCall(lowerer, expr) {
|
|
|
1235
1234
|
lowerer.fenceStaticReadableStreamMember(expr.expression, "call") ??
|
|
1236
1235
|
lowerDisposableStackUseCall(lowerer, expr, expr.expression) ??
|
|
1237
1236
|
lowerer.lowerStdlibMethodCall(expr, expr.expression) ??
|
|
1238
|
-
// crypto.getRandomValues on the WebCrypto global
|
|
1239
|
-
// fallback builds, so before the dyn receiver path) or
|
|
1240
|
-
|
|
1237
|
+
// crypto.getRandomValues / randomUUID on the WebCrypto global
|
|
1238
|
+
// (untyped in fallback builds, so before the dyn receiver path) or
|
|
1239
|
+
// webcrypto.
|
|
1240
|
+
lowerWebCryptoMethodCall(lowerer, expr, expr.expression) ??
|
|
1241
1241
|
// Dyn receivers (JSON.parse-derived `unknown`/`any` values) —
|
|
1242
1242
|
lowerDynReceiverMethodCall(lowerer, expr, expr.expression) ??
|
|
1243
1243
|
// Narrowing filters (inferred predicates, filter(Boolean)) claim
|
|
@@ -1246,6 +1246,7 @@ export function lowerCall(lowerer, expr) {
|
|
|
1246
1246
|
lowerer.lowerFilterNarrowCall(expr, expr.expression) ??
|
|
1247
1247
|
lowerArrayIsArrayCall(lowerer, expr, expr.expression) ??
|
|
1248
1248
|
lowerErrorIsErrorCall(lowerer, expr, expr.expression) ??
|
|
1249
|
+
lowerErrorCaptureStackTraceCall(lowerer, expr, expr.expression) ??
|
|
1249
1250
|
lowerBigIntMethodCall(lowerer, expr, expr.expression) ??
|
|
1250
1251
|
lowerSymbolStaticCall(lowerer, expr, expr.expression) ??
|
|
1251
1252
|
lowerSymbolMethodCall(lowerer, expr, expr.expression) ??
|
|
@@ -1335,6 +1336,11 @@ export function lowerCall(lowerer, expr) {
|
|
|
1335
1336
|
return nsUndefRead(lowerer, ambientRoot.text, expr, t);
|
|
1336
1337
|
}
|
|
1337
1338
|
}
|
|
1339
|
+
{
|
|
1340
|
+
const childCall = lowerChildPropertyCall(lowerer, expr, expr.expression, true);
|
|
1341
|
+
if (childCall)
|
|
1342
|
+
return childCall;
|
|
1343
|
+
}
|
|
1338
1344
|
// The lib fence's METHOD-CALL chokepoint: a stdlib-declared member
|
|
1339
1345
|
// that every lowering above declined — an unlowered member
|
|
1340
1346
|
// (m.keys(), p.then(f), Object.keys(o)) or an unlowered call FORM of
|
|
@@ -1696,7 +1702,7 @@ function lowerOptionalNumberDefault(lowerer, value, dflt, loc) {
|
|
|
1696
1702
|
const key = `number.optionalDefault:${widened.unionId}:${dflt}`;
|
|
1697
1703
|
let helper = lowerer.valueHelpers.get(key);
|
|
1698
1704
|
if (!helper) {
|
|
1699
|
-
helper =
|
|
1705
|
+
helper = keyedHelperName(lowerer, "%number.optionalDefault", key);
|
|
1700
1706
|
lowerer.valueHelpers.set(key, helper);
|
|
1701
1707
|
const input = varRef("value.0", widened, loc);
|
|
1702
1708
|
lowerer.liftedFns.push({
|
|
@@ -1774,6 +1780,59 @@ function lowerStringMethodCallWithOptionalArgs(lowerer, call, access, receiver,
|
|
|
1774
1780
|
}
|
|
1775
1781
|
return changed ? { ...lowered, args } : lowered;
|
|
1776
1782
|
}
|
|
1783
|
+
/** `.then(String)` / `.then(Number)` / `.then(Boolean)` over a promise of
|
|
1784
|
+
* a number, string or boolean: the ambient constructor converts its first
|
|
1785
|
+
* argument (the settled value), so the handler is an interned closure over
|
|
1786
|
+
* the settled type applying that conversion. The constructors' own value
|
|
1787
|
+
* form takes a string, which a number or boolean settled value is not.
|
|
1788
|
+
* Null for every other handler. */
|
|
1789
|
+
function primitiveConversionHandler(lowerer, node, inner) {
|
|
1790
|
+
if (!ts.isIdentifier(node))
|
|
1791
|
+
return null;
|
|
1792
|
+
const name = node.text;
|
|
1793
|
+
if (name !== "String" && name !== "Number" && name !== "Boolean")
|
|
1794
|
+
return null;
|
|
1795
|
+
// A string settled value already fits the constructors' value form.
|
|
1796
|
+
if (inner.kind !== "f64" && inner.kind !== "bool")
|
|
1797
|
+
return null;
|
|
1798
|
+
if (!lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(node) ?? undefined))
|
|
1799
|
+
return null;
|
|
1800
|
+
const loc = locOf(node);
|
|
1801
|
+
const ret = name === "String" ? STRING : name === "Number" ? F64 : BOOL;
|
|
1802
|
+
const fnT = funcOf([inner], ret);
|
|
1803
|
+
const key = `then.${name}:${typeKey(inner)}`;
|
|
1804
|
+
let fnName = lowerer.arrHofHelpers.get(key);
|
|
1805
|
+
if (fnName === undefined) {
|
|
1806
|
+
fnName = keyedHelperName(lowerer, `%then.${name}`, key);
|
|
1807
|
+
lowerer.arrHofHelpers.set(key, fnName);
|
|
1808
|
+
const value = varRef("v.0", inner, loc);
|
|
1809
|
+
let body;
|
|
1810
|
+
if (name === "Boolean")
|
|
1811
|
+
body = { kind: "toBool", operand: value, type: BOOL, loc };
|
|
1812
|
+
else if (name === "String")
|
|
1813
|
+
body = { kind: "toString", operand: value, type: STRING, loc };
|
|
1814
|
+
else if (inner.kind === "f64")
|
|
1815
|
+
body = value;
|
|
1816
|
+
else
|
|
1817
|
+
body = {
|
|
1818
|
+
kind: "ternary",
|
|
1819
|
+
cond: value,
|
|
1820
|
+
then: { kind: "numLit", value: 1, type: F64, loc },
|
|
1821
|
+
else_: { kind: "numLit", value: 0, type: F64, loc },
|
|
1822
|
+
type: F64,
|
|
1823
|
+
loc,
|
|
1824
|
+
};
|
|
1825
|
+
lowerer.liftedFns.push({
|
|
1826
|
+
name: fnName,
|
|
1827
|
+
params: [{ localId: "v.0", name: "v", type: inner }],
|
|
1828
|
+
returnType: ret,
|
|
1829
|
+
locals: [{ id: "v.0", name: "v", type: inner, mutable: false }],
|
|
1830
|
+
body: [{ kind: "return", value: body, loc }],
|
|
1831
|
+
loc,
|
|
1832
|
+
});
|
|
1833
|
+
}
|
|
1834
|
+
return { kind: "closure", fnName, captures: [], type: fnT, loc };
|
|
1835
|
+
}
|
|
1777
1836
|
function lowerNumberConstructorValue(lowerer, argNode, loc) {
|
|
1778
1837
|
const undefinedArg = lowerStaticallyUndefinedArgument(lowerer, argNode);
|
|
1779
1838
|
if (undefinedArg) {
|
|
@@ -1898,7 +1957,7 @@ function lowerBigIntConstructorValue(lowerer, arg, loc) {
|
|
|
1898
1957
|
const key = `bigint.scalar:${unionId}`;
|
|
1899
1958
|
let helper = lowerer.valueHelpers.get(key);
|
|
1900
1959
|
if (!helper) {
|
|
1901
|
-
helper =
|
|
1960
|
+
helper = keyedHelperName(lowerer, "%bigint.scalar", key);
|
|
1902
1961
|
lowerer.valueHelpers.set(key, helper);
|
|
1903
1962
|
const value = varRef("value.0", arg.type, loc);
|
|
1904
1963
|
const body = [];
|
|
@@ -2587,6 +2646,12 @@ function lowerStringPrototypeCall(lowerer, call, access) {
|
|
|
2587
2646
|
const receiver = lowerer.ensureString(receiverValue, receiverNode);
|
|
2588
2647
|
return lowerStringMethodCallWithOptionalArgs(lowerer, call, methodAccess, () => receiver, call.arguments.nodes.slice(1));
|
|
2589
2648
|
}
|
|
2649
|
+
/** ToNumber of a union of strings, numbers, booleans, null and undefined, as
|
|
2650
|
+
* `Number(value)` converts it; null for other types. Unary `+` takes it too:
|
|
2651
|
+
* the two conversions differ only for BigInt, which such unions don't hold. */
|
|
2652
|
+
export function lowerPrimitiveUnionNumber(lowerer, arg, node, loc) {
|
|
2653
|
+
return (lowerOptionalStringNumber(lowerer, arg, loc) ?? lowerScalarUnionNumber(lowerer, arg, node, loc));
|
|
2654
|
+
}
|
|
2590
2655
|
function lowerScalarUnionNumber(lowerer, arg, node, loc) {
|
|
2591
2656
|
if (arg.type.kind !== "union" ||
|
|
2592
2657
|
!lowerer.unions
|
|
@@ -2596,7 +2661,7 @@ function lowerScalarUnionNumber(lowerer, arg, node, loc) {
|
|
|
2596
2661
|
const key = `number.scalar:${arg.type.unionId}`;
|
|
2597
2662
|
let helper = lowerer.valueHelpers.get(key);
|
|
2598
2663
|
if (!helper) {
|
|
2599
|
-
helper =
|
|
2664
|
+
helper = keyedHelperName(lowerer, "%number.scalar", key);
|
|
2600
2665
|
lowerer.valueHelpers.set(key, helper);
|
|
2601
2666
|
const value = varRef("value.0", arg.type, loc);
|
|
2602
2667
|
const nan = {
|
|
@@ -2637,7 +2702,7 @@ function lowerOptionalStringNumber(lowerer, arg, loc, fn = "num.fromString", lab
|
|
|
2637
2702
|
const key = `${label}.optionalString:${arg.type.unionId}`;
|
|
2638
2703
|
let helper = lowerer.valueHelpers.get(key);
|
|
2639
2704
|
if (!helper) {
|
|
2640
|
-
helper = `%${label}.optionalString
|
|
2705
|
+
helper = keyedHelperName(lowerer, `%${label}.optionalString`, key);
|
|
2641
2706
|
lowerer.valueHelpers.set(key, helper);
|
|
2642
2707
|
const value = varRef("value.0", arg.type, loc);
|
|
2643
2708
|
lowerer.liftedFns.push({
|
|
@@ -2781,6 +2846,9 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
|
|
|
2781
2846
|
? lowerer.checker.getNonNullableType(rawRecvTs)
|
|
2782
2847
|
: rawRecvTs;
|
|
2783
2848
|
if (lowerer.classImplementedProtocol(recvTs)) {
|
|
2849
|
+
const viewed = pickViewGenericMethodCall(lowerer, call, access, recvTs);
|
|
2850
|
+
if (viewed)
|
|
2851
|
+
return viewed;
|
|
2784
2852
|
const property = lowerer.checker.getPropertyOfType(recvTs, access.name.text);
|
|
2785
2853
|
if (property &&
|
|
2786
2854
|
isGenericCallableMemberType(lowerer.checker.getTypeOfSymbol(property), lowerer.checker))
|
|
@@ -3045,6 +3113,16 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
|
|
|
3045
3113
|
// IS Node's semantics for every possible dyn value. Shared names would
|
|
3046
3114
|
// need a receiver-kind dispatch — they keep the fence.
|
|
3047
3115
|
if (DYN_STRING_ONLY_METHODS.has(access.name.text) && !ownCallable) {
|
|
3116
|
+
// An object-typed receiver the member is missing from (a JavaScript
|
|
3117
|
+
// module object whose members are assigned in a function body,
|
|
3118
|
+
// `common.repeat(" ", n)`) holds a string or an object with that
|
|
3119
|
+
// member: dispatch on the receiver's runtime kind.
|
|
3120
|
+
if (!checkerUntyped &&
|
|
3121
|
+
(lowerer.typeOf(access).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0 &&
|
|
3122
|
+
!call.questionDotToken &&
|
|
3123
|
+
!access.questionDotToken &&
|
|
3124
|
+
!call.arguments.nodes.some(ts.isSpreadElement))
|
|
3125
|
+
return lowerStringOrMemberCall(lowerer, call, access, recv);
|
|
3048
3126
|
const checked = () => dynStringReceiver(lowerer, recv, access);
|
|
3049
3127
|
return (lowerRegexMethodCall(lowerer, call, access, checked) ??
|
|
3050
3128
|
lowerStringMethodCall(lowerer, call, access, checked));
|
|
@@ -3116,7 +3194,18 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
|
|
|
3116
3194
|
?.arms.every((arm) => arm.kind === "object" &&
|
|
3117
3195
|
lowerer.classes.get(arm.className)?.fields.has(access.name.text)))
|
|
3118
3196
|
return true;
|
|
3197
|
+
// A standard-library member spelled as a function-typed property
|
|
3198
|
+
// (undici-types declares Headers.append/forEach/... and the body mixin
|
|
3199
|
+
// as `readonly append: (...) => void`; scriptc's own declarations use
|
|
3200
|
+
// methods) is still the handle's native method: it takes the shared
|
|
3201
|
+
// receiver dispatch below either way (which also calls a plain object's
|
|
3202
|
+
// own member), so the lowering does not depend on which declaration
|
|
3203
|
+
// file supplies the type.
|
|
3204
|
+
const libMethod = prop !== undefined &&
|
|
3205
|
+
prop.declarations.length > 0 &&
|
|
3206
|
+
prop.declarations.every((decl) => lowerer.isStdlibFile(decl.getSourceFile()));
|
|
3119
3207
|
return (prop !== undefined &&
|
|
3208
|
+
!libMethod &&
|
|
3120
3209
|
prop.declarations.some((decl) => ts.isPropertyDeclaration(decl) || ts.isPropertySignature(decl)));
|
|
3121
3210
|
})();
|
|
3122
3211
|
// Protocol methods keep their static signature: instances of the
|
|
@@ -3220,6 +3309,79 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
|
|
|
3220
3309
|
loc,
|
|
3221
3310
|
};
|
|
3222
3311
|
}
|
|
3312
|
+
/** `value.name(...args)` on a dyn receiver that may be a string or an
|
|
3313
|
+
* object: a string runs the String.prototype lowering, any other value
|
|
3314
|
+
* calls its member. The member is read before the arguments are
|
|
3315
|
+
* evaluated, and the arguments are evaluated once for either branch. */
|
|
3316
|
+
function lowerStringOrMemberCall(lowerer, call, access, recv) {
|
|
3317
|
+
const loc = locOf(call);
|
|
3318
|
+
const receiverLocal = lowerer.declareHiddenLocal("%dynCallReceiver", DYN);
|
|
3319
|
+
const receiver = varRef(receiverLocal.id, DYN, loc);
|
|
3320
|
+
const isString = { kind: "dynTest", test: "string", value: receiver, type: BOOL, loc };
|
|
3321
|
+
const calleeLocal = lowerer.declareHiddenLocal("%dynCallCallee", DYN);
|
|
3322
|
+
const callee = varRef(calleeLocal.id, DYN, loc);
|
|
3323
|
+
const stmts = [
|
|
3324
|
+
{ kind: "varDecl", localId: receiverLocal.id, init: recv, loc },
|
|
3325
|
+
{
|
|
3326
|
+
kind: "varDecl",
|
|
3327
|
+
localId: calleeLocal.id,
|
|
3328
|
+
init: {
|
|
3329
|
+
kind: "ternary",
|
|
3330
|
+
cond: isString,
|
|
3331
|
+
then: dynUndefinedExpr(loc),
|
|
3332
|
+
else_: {
|
|
3333
|
+
kind: "dynKeyGet",
|
|
3334
|
+
key: { kind: "strLit", value: access.name.text, type: STRING, loc: locOf(access) },
|
|
3335
|
+
value: receiver,
|
|
3336
|
+
type: DYN,
|
|
3337
|
+
loc: locOf(access),
|
|
3338
|
+
},
|
|
3339
|
+
type: DYN,
|
|
3340
|
+
loc,
|
|
3341
|
+
},
|
|
3342
|
+
loc,
|
|
3343
|
+
},
|
|
3344
|
+
];
|
|
3345
|
+
const args = call.arguments.nodes.map((node) => {
|
|
3346
|
+
const value = lowerer.lowerExpr(node);
|
|
3347
|
+
const local = lowerer.declareHiddenLocal("%dynCallArg", value.type);
|
|
3348
|
+
stmts.push({ kind: "varDecl", localId: local.id, init: value, loc: value.loc });
|
|
3349
|
+
return { node, value: varRef(local.id, value.type, value.loc) };
|
|
3350
|
+
});
|
|
3351
|
+
// String.prototype methods ignore arguments past the ones they read.
|
|
3352
|
+
const arity = DYN_STRING_ONLY_ARITY[access.name.text] ?? call.arguments.nodes.length;
|
|
3353
|
+
const stringReceiver = () => ({ kind: "dynCheck", value: receiver, type: STRING, loc });
|
|
3354
|
+
const lowerString = () => (call.arguments.nodes.length <= arity
|
|
3355
|
+
? lowerRegexMethodCall(lowerer, call, access, stringReceiver)
|
|
3356
|
+
: null) ??
|
|
3357
|
+
lowerStringMethodCall(lowerer, call, access, stringReceiver, call.arguments.nodes.slice(0, arity));
|
|
3358
|
+
const stringCall = lowerer.withExpressionOverrides(args, lowerString);
|
|
3359
|
+
const memberCall = {
|
|
3360
|
+
kind: "dynCall",
|
|
3361
|
+
callee,
|
|
3362
|
+
receiver,
|
|
3363
|
+
calleeName: ts.getTextOfNode(access),
|
|
3364
|
+
args: args.map((arg) => lowerer.coerceToExpected(arg.value, DYN)),
|
|
3365
|
+
type: DYN,
|
|
3366
|
+
loc,
|
|
3367
|
+
};
|
|
3368
|
+
return {
|
|
3369
|
+
kind: "seqExpr",
|
|
3370
|
+
stmts,
|
|
3371
|
+
result: {
|
|
3372
|
+
kind: "ternary",
|
|
3373
|
+
cond: isString,
|
|
3374
|
+
then: stringCall
|
|
3375
|
+
? lowerer.coerceToExpected(stringCall, DYN)
|
|
3376
|
+
: nodeThrowExpr(0, "SC1090", `method calls like '${ts.getTextOfNode(access)}' on a string are not supported yet [SC1090 at ${ts.getSourceFileOfNode(call).fileName}:${ts.getLineAndCharacterOfPosition(ts.getSourceFileOfNode(call), ts.tokenStartOfNode(call)).line + 1}]`, DYN, loc),
|
|
3377
|
+
else_: memberCall,
|
|
3378
|
+
type: DYN,
|
|
3379
|
+
loc,
|
|
3380
|
+
},
|
|
3381
|
+
type: DYN,
|
|
3382
|
+
loc,
|
|
3383
|
+
};
|
|
3384
|
+
}
|
|
3223
3385
|
/** Prototype method names of the checked-dynamic tree-representable kinds (String, Array,
|
|
3224
3386
|
* Object, Function, Number prototypes): a dyn receiver call on one of
|
|
3225
3387
|
* these could be a REAL method on a real value, which a stored-member
|
|
@@ -3381,6 +3543,12 @@ const DYN_DISPATCH_METHODS = new Set([
|
|
|
3381
3543
|
"prependOnceListener",
|
|
3382
3544
|
"listeners",
|
|
3383
3545
|
"listenerCount",
|
|
3546
|
+
// The rest of EventEmitter.prototype, which compiled emitters answer
|
|
3547
|
+
// through the class dispatch (class-dynamic-dispatch.ts).
|
|
3548
|
+
"rawListeners",
|
|
3549
|
+
"eventNames",
|
|
3550
|
+
"setMaxListeners",
|
|
3551
|
+
"getMaxListeners",
|
|
3384
3552
|
"write",
|
|
3385
3553
|
"end",
|
|
3386
3554
|
"destroy",
|
|
@@ -3590,7 +3758,19 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
|
|
|
3590
3758
|
}
|
|
3591
3759
|
}
|
|
3592
3760
|
}
|
|
3761
|
+
// `String`, `Number` or `Boolean` as the callback of an array method
|
|
3762
|
+
// (`values.map(String)` over an unknown array): the method calls it with
|
|
3763
|
+
// each element, whatever its type, and cannot observe which function
|
|
3764
|
+
// value it received, so it gets the constructor's form that converts any
|
|
3765
|
+
// argument rather than the string-input form typed code stores.
|
|
3766
|
+
const arrayCallbackReceiver = ARRAY_CALLBACK_METHODS.has(method) &&
|
|
3767
|
+
lowerer.checker.isArrayType(lowerer.typeOf(access.expression));
|
|
3593
3768
|
const args = call.arguments.nodes.map((arg, i) => {
|
|
3769
|
+
const primitive = i === 0 && arrayCallbackReceiver && ts.isIdentifier(arg)
|
|
3770
|
+
? stdlibGlobalNameOf(lowerer, arg)
|
|
3771
|
+
: null;
|
|
3772
|
+
if (primitive === "String" || primitive === "Number" || primitive === "Boolean")
|
|
3773
|
+
return lowerer.coerceInto(arg, primitiveCtorClosure(lowerer, primitive, locOf(arg), true), DYN);
|
|
3594
3774
|
if (i === 0 && predicate)
|
|
3595
3775
|
return lowerer.coerceInto(arg, predicate, DYN);
|
|
3596
3776
|
const undefinedArg = lowerStaticallyUndefinedArgument(lowerer, arg);
|
|
@@ -3608,6 +3788,20 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
|
|
|
3608
3788
|
loc: locOf(call),
|
|
3609
3789
|
};
|
|
3610
3790
|
}
|
|
3791
|
+
/** Array.prototype methods whose first argument is a callback they call
|
|
3792
|
+
* with the elements. */
|
|
3793
|
+
const ARRAY_CALLBACK_METHODS = new Set([
|
|
3794
|
+
"map",
|
|
3795
|
+
"filter",
|
|
3796
|
+
"forEach",
|
|
3797
|
+
"some",
|
|
3798
|
+
"every",
|
|
3799
|
+
"find",
|
|
3800
|
+
"findIndex",
|
|
3801
|
+
"findLast",
|
|
3802
|
+
"findLastIndex",
|
|
3803
|
+
"flatMap",
|
|
3804
|
+
]);
|
|
3611
3805
|
/** Every String.prototype method name a typed or dyn string lowering
|
|
3612
3806
|
* answers. */
|
|
3613
3807
|
function isStringMethodName(name) {
|
|
@@ -3618,6 +3812,28 @@ function isStringMethodName(name) {
|
|
|
3618
3812
|
name === "normalize" ||
|
|
3619
3813
|
name === "lastIndexOf");
|
|
3620
3814
|
}
|
|
3815
|
+
/** How many arguments each DYN_STRING_ONLY_METHODS method reads. */
|
|
3816
|
+
const DYN_STRING_ONLY_ARITY = {
|
|
3817
|
+
charCodeAt: 1,
|
|
3818
|
+
charAt: 1,
|
|
3819
|
+
startsWith: 2,
|
|
3820
|
+
endsWith: 2,
|
|
3821
|
+
substring: 2,
|
|
3822
|
+
repeat: 1,
|
|
3823
|
+
trim: 0,
|
|
3824
|
+
trimStart: 0,
|
|
3825
|
+
trimEnd: 0,
|
|
3826
|
+
split: 2,
|
|
3827
|
+
padStart: 2,
|
|
3828
|
+
padEnd: 2,
|
|
3829
|
+
toLowerCase: 0,
|
|
3830
|
+
toUpperCase: 0,
|
|
3831
|
+
replace: 2,
|
|
3832
|
+
replaceAll: 2,
|
|
3833
|
+
match: 1,
|
|
3834
|
+
matchAll: 1,
|
|
3835
|
+
search: 1,
|
|
3836
|
+
};
|
|
3621
3837
|
/** STR_METHODS ∪ the regex-form names, MINUS everything Array (or any
|
|
3622
3838
|
* other dyn kind's prototype) also declares. */
|
|
3623
3839
|
const DYN_STRING_ONLY_METHODS = new Set([
|
|
@@ -3656,8 +3872,14 @@ function lowerArrayIsArrayCall(lowerer, call, access) {
|
|
|
3656
3872
|
if (call.arguments.nodes.length !== 1)
|
|
3657
3873
|
return null; // the stdlib chokepoint fences
|
|
3658
3874
|
const argNode = call.arguments.nodes[0];
|
|
3659
|
-
|
|
3875
|
+
let arg = lowerer.lowerExpr(argNode);
|
|
3660
3876
|
const loc = locOf(call);
|
|
3877
|
+
// A checker-narrowed dyn read arrives as a validated extraction (the
|
|
3878
|
+
// dynCheck bridge). The runtime value may be wider than the flow type
|
|
3879
|
+
// claims (an overload narrower than what arrives), so test the dyn value
|
|
3880
|
+
// itself instead of folding on the extracted type (typeof's rule).
|
|
3881
|
+
if (arg.kind === "dynCheck" && arg.value.type.kind === "dyn")
|
|
3882
|
+
arg = arg.value;
|
|
3661
3883
|
if (arg.type.kind === "dyn") {
|
|
3662
3884
|
return { kind: "dynTest", test: "array", value: arg, type: BOOL, loc };
|
|
3663
3885
|
}
|
|
@@ -3933,7 +4155,7 @@ function lowerDefaultToStringCall(lowerer, call, access) {
|
|
|
3933
4155
|
const key = `objToStr:${typeKey(recv.type)}${missing ? `:${missing}` : ""}`;
|
|
3934
4156
|
let helper = lowerer.valueHelpers.get(key);
|
|
3935
4157
|
if (!helper) {
|
|
3936
|
-
helper =
|
|
4158
|
+
helper = keyedHelperName(lowerer, "%obj.tostr", key);
|
|
3937
4159
|
lowerer.valueHelpers.set(key, helper);
|
|
3938
4160
|
const o = varRef("o.0", recv.type, loc);
|
|
3939
4161
|
lowerer.liftedFns.push({
|
|
@@ -4545,7 +4767,7 @@ function loweredTemplateStrings(lowerer, expr, cooked, loc, raw) {
|
|
|
4545
4767
|
const site = lowerer.globalsList.length;
|
|
4546
4768
|
const globalId = `%g.templateStrings.${site}`;
|
|
4547
4769
|
const readyId = `%g.templateStringsReady.${site}`;
|
|
4548
|
-
getter =
|
|
4770
|
+
getter = keyedHelperName(lowerer, "%templateStrings.get", key);
|
|
4549
4771
|
lowerer.valueHelpers.set(key, getter);
|
|
4550
4772
|
lowerer.globalsList.push({ id: globalId, name: "%templateStrings", type, mutable: true }, { id: readyId, name: "%templateStringsReady", type: BOOL, mutable: true });
|
|
4551
4773
|
lowerer.liftedFns.push({
|
|
@@ -4714,7 +4936,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
4714
4936
|
// IS the spec's identity/thrower/no-op substitution for all three
|
|
4715
4937
|
// members. An argument expression, when present, is undefined/null
|
|
4716
4938
|
// by construction — nothing to evaluate.
|
|
4717
|
-
const fnName =
|
|
4939
|
+
const fnName = lowerer.closureName(loc, `_${member}pass`);
|
|
4718
4940
|
const funcType = { kind: "func", params: [promT], ret: promT };
|
|
4719
4941
|
const fnCtx = newFnCtx(true, null, funcType, inner);
|
|
4720
4942
|
fnCtx.isAsync = true;
|
|
@@ -4796,7 +5018,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
4796
5018
|
// Evaluate both callback expressions before the wrapper runs, in source order.
|
|
4797
5019
|
const fulfilled = fulfilledAbsent ? null : boxHandler(fulfilledNode, true);
|
|
4798
5020
|
const rejected = rejectedAbsent ? null : boxHandler(rejectedNode, false);
|
|
4799
|
-
const fnName =
|
|
5021
|
+
const fnName = lowerer.closureName(loc, "_then2");
|
|
4800
5022
|
const paramTypes = [
|
|
4801
5023
|
promT,
|
|
4802
5024
|
...(fulfilled ? [fulfilled.value.type] : []),
|
|
@@ -4982,7 +5204,8 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
4982
5204
|
// the handle is the value's only story, isIslandExpr's local rule).
|
|
4983
5205
|
if (inner.kind === "moduleNs")
|
|
4984
5206
|
markModuleNsHandlerParams(lowerer, call.arguments.nodes[0], inner);
|
|
4985
|
-
let cb = lowerer
|
|
5207
|
+
let cb = primitiveConversionHandler(lowerer, call.arguments.nodes[0], inner) ??
|
|
5208
|
+
lowerer.lowerExpr(call.arguments.nodes[0]);
|
|
4986
5209
|
// A TYPED handler on a DYN-settling promise (the tracePromise
|
|
4987
5210
|
// result's `.then((value) => ...)` — the checker's generic
|
|
4988
5211
|
// instantiation typed the parameter, but the settled value is a
|
|
@@ -5014,7 +5237,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
5014
5237
|
lowerer.unsupported("SC1090", call.arguments.nodes[0], `then handlers receiving '${lowerer.fmt(v.type)}' values through an untyped handler (the settled value cannot cross the checked-dynamic tree boundary)`);
|
|
5015
5238
|
};
|
|
5016
5239
|
const resultT = { kind: "promise", inner: DYN };
|
|
5017
|
-
const fnName =
|
|
5240
|
+
const fnName = lowerer.closureName(loc, "_then");
|
|
5018
5241
|
const funcType = {
|
|
5019
5242
|
kind: "func",
|
|
5020
5243
|
params: [promT, DYN],
|
|
@@ -5097,7 +5320,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
5097
5320
|
lowerer.noLowering("then with this handler's result type", call, "the combined result must be a representable promise");
|
|
5098
5321
|
}
|
|
5099
5322
|
const R = resultT.inner;
|
|
5100
|
-
const fnName =
|
|
5323
|
+
const fnName = lowerer.closureName(loc, "_then");
|
|
5101
5324
|
const funcType = {
|
|
5102
5325
|
kind: "func",
|
|
5103
5326
|
params: [promT, cb.type],
|
|
@@ -5201,7 +5424,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
5201
5424
|
if (cb.type.kind !== "func" || cb.type.params.length !== 0 || cb.type.ret.kind !== "void") {
|
|
5202
5425
|
lowerer.unsupported("SC1090", call.arguments.nodes[0], "finally callbacks with parameters or a return value (use () => { ... })");
|
|
5203
5426
|
}
|
|
5204
|
-
const fnName =
|
|
5427
|
+
const fnName = lowerer.closureName(loc, "_finally");
|
|
5205
5428
|
const funcType = {
|
|
5206
5429
|
kind: "func",
|
|
5207
5430
|
params: [promT, cb.type],
|
|
@@ -5297,7 +5520,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
5297
5520
|
}
|
|
5298
5521
|
if (cb.type.kind === "dyn") {
|
|
5299
5522
|
const resultT = { kind: "promise", inner: DYN };
|
|
5300
|
-
const fnName =
|
|
5523
|
+
const fnName = lowerer.closureName(loc, "_catchdyn");
|
|
5301
5524
|
const funcType = {
|
|
5302
5525
|
kind: "func",
|
|
5303
5526
|
params: [promT, DYN],
|
|
@@ -5414,7 +5637,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
|
|
|
5414
5637
|
"own type, or annotate the handler `(): undefined =>` for the T | undefined result");
|
|
5415
5638
|
}
|
|
5416
5639
|
const R = resultT.inner;
|
|
5417
|
-
const fnName =
|
|
5640
|
+
const fnName = lowerer.closureName(loc, "_catch");
|
|
5418
5641
|
const funcType = { kind: "func", params: [promT], ret: resultT };
|
|
5419
5642
|
const fnCtx = newFnCtx(true, null, funcType, R);
|
|
5420
5643
|
fnCtx.isAsync = true;
|
|
@@ -5632,7 +5855,7 @@ function filterNarrowHelper(lowerer, test, elem, outElem, tag, loc) {
|
|
|
5632
5855
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
5633
5856
|
if (existing)
|
|
5634
5857
|
return existing;
|
|
5635
|
-
const name =
|
|
5858
|
+
const name = keyedHelperName(lowerer, "%arr.filterNarrow", key);
|
|
5636
5859
|
lowerer.arrHofHelpers.set(key, name);
|
|
5637
5860
|
const arrT = arrayOf(elem);
|
|
5638
5861
|
const outT = arrayOf(outElem);
|
|
@@ -5854,7 +6077,7 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
|
|
|
5854
6077
|
const key = `obj.keys:${argIr.shapeId}:${typeKey(resultT)}`;
|
|
5855
6078
|
let helper = lowerer.arrHofHelpers.get(key);
|
|
5856
6079
|
if (!helper) {
|
|
5857
|
-
helper =
|
|
6080
|
+
helper = keyedHelperName(lowerer, "%obj.keys", key);
|
|
5858
6081
|
const ref = { kind: "varRef", localId: "r.0", type: argIr, loc };
|
|
5859
6082
|
const outRef = { kind: "varRef", localId: "out.0", type: resultT, loc };
|
|
5860
6083
|
lowerer.arrHofHelpers.set(key, helper);
|
|
@@ -5922,7 +6145,7 @@ function recordHasOwnHelper(lowerer, shapeId, loc) {
|
|
|
5922
6145
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
5923
6146
|
if (existing)
|
|
5924
6147
|
return existing;
|
|
5925
|
-
const helper =
|
|
6148
|
+
const helper = keyedHelperName(lowerer, "%obj.hasOwn", key);
|
|
5926
6149
|
lowerer.arrHofHelpers.set(key, helper);
|
|
5927
6150
|
const shape = lowerer.shapes.get(shapeId);
|
|
5928
6151
|
const recT = { kind: "record", shapeId };
|
|
@@ -6000,7 +6223,7 @@ function classAssignHelper(lowerer, className, srcShapeId, loc) {
|
|
|
6000
6223
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
6001
6224
|
if (existing)
|
|
6002
6225
|
return existing;
|
|
6003
|
-
const helper =
|
|
6226
|
+
const helper = keyedHelperName(lowerer, "%obj.assignClass", key);
|
|
6004
6227
|
lowerer.arrHofHelpers.set(key, helper);
|
|
6005
6228
|
const sShape = lowerer.shapes.get(srcShapeId);
|
|
6006
6229
|
const oT = { kind: "object", className };
|
|
@@ -6061,7 +6284,7 @@ function recordAssignHelper(lowerer, targetShapeId, srcShapeId, loc) {
|
|
|
6061
6284
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
6062
6285
|
if (existing)
|
|
6063
6286
|
return existing;
|
|
6064
|
-
const helper =
|
|
6287
|
+
const helper = keyedHelperName(lowerer, "%obj.assign", key);
|
|
6065
6288
|
lowerer.arrHofHelpers.set(key, helper);
|
|
6066
6289
|
const sShape = lowerer.shapes.get(srcShapeId);
|
|
6067
6290
|
const tShape = lowerer.shapes.get(targetShapeId);
|
|
@@ -6242,6 +6465,33 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6242
6465
|
if (!lowerer.isStdlibGlobal(access.expression, "Object"))
|
|
6243
6466
|
return null;
|
|
6244
6467
|
const member = access.name.text;
|
|
6468
|
+
// `Object.getOwnPropertyDescriptor(Error, "stackTraceLimit")` (Effect's
|
|
6469
|
+
// isStackTraceLimitWritable): Error's own writable, enumerable,
|
|
6470
|
+
// configurable data property holding the current limit. The interned
|
|
6471
|
+
// Error value models no other statics (builtinGlobalValueAt).
|
|
6472
|
+
const [first, second] = call.arguments.nodes;
|
|
6473
|
+
if (member === "getOwnPropertyDescriptor" &&
|
|
6474
|
+
call.arguments.nodes.length === 2 &&
|
|
6475
|
+
lowerer.isStdlibGlobal(first, "Error") &&
|
|
6476
|
+
ts.isStringLiteralLike(second) &&
|
|
6477
|
+
second.text === "stackTraceLimit") {
|
|
6478
|
+
const loc = locOf(call);
|
|
6479
|
+
const dyn = (value) => ({ kind: "dynFrom", value, type: DYN, loc });
|
|
6480
|
+
const yes = dyn({ kind: "boolLit", value: true, type: BOOL, loc });
|
|
6481
|
+
const limit = { kind: "libCall", fn: "error.stackLimitGet", args: [], type: F64, loc };
|
|
6482
|
+
return {
|
|
6483
|
+
kind: "dynObjLit",
|
|
6484
|
+
fields: [
|
|
6485
|
+
{ key: { kind: "strLit", value: "value", type: STRING, loc }, value: dyn(limit) },
|
|
6486
|
+
...["writable", "enumerable", "configurable"].map((key) => ({
|
|
6487
|
+
key: { kind: "strLit", value: key, type: STRING, loc },
|
|
6488
|
+
value: yes,
|
|
6489
|
+
})),
|
|
6490
|
+
],
|
|
6491
|
+
type: DYN,
|
|
6492
|
+
loc,
|
|
6493
|
+
};
|
|
6494
|
+
}
|
|
6245
6495
|
if ((member === "getOwnPropertyNames" ||
|
|
6246
6496
|
member === "getOwnPropertySymbols" ||
|
|
6247
6497
|
member === "getOwnPropertyDescriptors") &&
|
|
@@ -6596,6 +6846,11 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6596
6846
|
const target = lowerer.lowerExpr(call.arguments.nodes[0]);
|
|
6597
6847
|
const rawSource = lowerer.lowerExpr(call.arguments.nodes[1]);
|
|
6598
6848
|
fenceSymbolFieldCopy(lowerer, call.arguments.nodes[1], rawSource.type);
|
|
6849
|
+
let targetNode = call.arguments.nodes[0];
|
|
6850
|
+
while (ts.isParenthesizedExpression(targetNode))
|
|
6851
|
+
targetNode = targetNode.expression;
|
|
6852
|
+
if (ts.isObjectLiteralExpression(targetNode))
|
|
6853
|
+
fenceClassCopyIntoFreshObject(lowerer, call, call.arguments.nodes[1], rawSource);
|
|
6599
6854
|
const source = lowerer.coerceToExpected(rawSource, DYN);
|
|
6600
6855
|
if (target.type.kind === "dyn" && source.type.kind === "dyn") {
|
|
6601
6856
|
return { kind: "libCall", fn: "dyn.assign", args: [target, source], type: DYN, loc };
|
|
@@ -6734,19 +6989,8 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6734
6989
|
const srcNode = spread ? argNode.expression : argNode;
|
|
6735
6990
|
const rawSource = lowerer.lowerExpr(srcNode);
|
|
6736
6991
|
fenceSymbolFieldCopy(lowerer, srcNode, rawSource.type, spread);
|
|
6737
|
-
|
|
6738
|
-
|
|
6739
|
-
// object holding the instance's own fields, never an
|
|
6740
|
-
// instance, so a result the checker types as the class has
|
|
6741
|
-
// no representation (the checked cast would throw).
|
|
6742
|
-
if (rawSource.type.kind === "object" &&
|
|
6743
|
-
freshLiteralTarget &&
|
|
6744
|
-
!ts.isExpressionStatement(call.parent)) {
|
|
6745
|
-
const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
|
|
6746
|
-
if (resultT !== null && resultT.kind === "object") {
|
|
6747
|
-
lowerer.unsupported("SC1090", srcNode, `Object.assign copying a '${lowerer.fmt(rawSource.type)}' instance into a fresh object typed as the class (the copy is a plain object holding the instance's own fields, not an instance — build the object literal from the fields you need)`);
|
|
6748
|
-
}
|
|
6749
|
-
}
|
|
6992
|
+
if (freshLiteralTarget)
|
|
6993
|
+
fenceClassCopyIntoFreshObject(lowerer, call, srcNode, rawSource);
|
|
6750
6994
|
const src = lowerer.coerceToExpected(rawSource, DYN);
|
|
6751
6995
|
if (src.type.kind !== "dyn") {
|
|
6752
6996
|
ok = false;
|
|
@@ -6968,6 +7212,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6968
7212
|
loc,
|
|
6969
7213
|
};
|
|
6970
7214
|
}
|
|
7215
|
+
const fnIntegrity = functionIntegrity(lowerer, member, value, call.arguments.nodes[0], locOf(call));
|
|
7216
|
+
if (fnIntegrity)
|
|
7217
|
+
return fnIntegrity;
|
|
6971
7218
|
if (member === "preventExtensions" || member === "seal") {
|
|
6972
7219
|
const integrity = lowerClassIntegrity(lowerer, call, member, value);
|
|
6973
7220
|
if (integrity)
|
|
@@ -7045,6 +7292,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
7045
7292
|
arm.kind === "string" ||
|
|
7046
7293
|
arm.kind === "symbol"))
|
|
7047
7294
|
return value;
|
|
7295
|
+
const fnIntegrity = functionIntegrity(lowerer, "freeze", value, argNode, locOf(call));
|
|
7296
|
+
if (fnIntegrity)
|
|
7297
|
+
return fnIntegrity;
|
|
7048
7298
|
const integrity = lowerClassIntegrity(lowerer, call, "freeze", value);
|
|
7049
7299
|
if (integrity)
|
|
7050
7300
|
return integrity;
|
|
@@ -7364,7 +7614,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
7364
7614
|
const key = `obj.${member}:${argIr.shapeId}:${typeKey(resultT)}`;
|
|
7365
7615
|
let helper = lowerer.arrHofHelpers.get(key);
|
|
7366
7616
|
if (!helper) {
|
|
7367
|
-
helper = `%obj.${member}
|
|
7617
|
+
helper = keyedHelperName(lowerer, `%obj.${member}`, key);
|
|
7368
7618
|
const recT = argIr;
|
|
7369
7619
|
const ref = { kind: "varRef", localId: "r.0", type: recT, loc };
|
|
7370
7620
|
const outRef = { kind: "varRef", localId: "out.0", type: resultT, loc };
|
|
@@ -7927,7 +8177,7 @@ function lowerInlineArrowBind(lowerer, call, access) {
|
|
|
7927
8177
|
const length = firstDefault < 0 ? arrow.parameters.nodes.length : firstDefault;
|
|
7928
8178
|
const key = `arrow.bind:${typeKey(type)}:${length}`;
|
|
7929
8179
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
7930
|
-
const name = existing ??
|
|
8180
|
+
const name = existing ?? keyedHelperName(lowerer, "%arrow.bind", key);
|
|
7931
8181
|
if (!existing) {
|
|
7932
8182
|
lowerer.arrHofHelpers.set(key, name);
|
|
7933
8183
|
lowerer.freshClosureAdapters.add(name);
|
|
@@ -8174,13 +8424,31 @@ function lowerObjLitGenericMethodCall(lowerer, call, access) {
|
|
|
8174
8424
|
if ((name === "apply" || name === "call" || name === "bind") &&
|
|
8175
8425
|
lowerer.checker.getCallSignatures(recvT).length > 0) {
|
|
8176
8426
|
const value = tryLowerExpression(lowerer, access.expression);
|
|
8177
|
-
|
|
8178
|
-
|
|
8427
|
+
// Builtin function values held as checked-dynamic functions
|
|
8428
|
+
// (String.fromCharCode, JSON.stringify) bind the same way, and so
|
|
8429
|
+
// does a member that lowers to a checked-dynamic value (a native
|
|
8430
|
+
// handle's method read in JavaScript).
|
|
8431
|
+
if (value &&
|
|
8432
|
+
(value.type.kind === "dyn" ||
|
|
8433
|
+
(value.type.kind === "func" && lowerer.dynConvertible(value.type))) &&
|
|
8179
8434
|
!call.arguments.nodes.some(ts.isSpreadElement)) {
|
|
8180
8435
|
const loc = locOf(call);
|
|
8181
8436
|
return {
|
|
8182
8437
|
kind: "dynInvoke",
|
|
8183
|
-
recv: { kind: "dynFrom", value, type: DYN, loc },
|
|
8438
|
+
recv: value.type.kind === "dyn" ? value : { kind: "dynFrom", value, type: DYN, loc },
|
|
8439
|
+
method: name,
|
|
8440
|
+
calleeName: ts.getTextOfNode(access),
|
|
8441
|
+
args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
|
|
8442
|
+
type: DYN,
|
|
8443
|
+
loc,
|
|
8444
|
+
};
|
|
8445
|
+
}
|
|
8446
|
+
const childMethod = lowerChildMethodValue(lowerer, access.expression);
|
|
8447
|
+
if (childMethod && !call.arguments.nodes.some(ts.isSpreadElement)) {
|
|
8448
|
+
const loc = locOf(call);
|
|
8449
|
+
return {
|
|
8450
|
+
kind: "dynInvoke",
|
|
8451
|
+
recv: childMethod,
|
|
8184
8452
|
method: name,
|
|
8185
8453
|
calleeName: ts.getTextOfNode(access),
|
|
8186
8454
|
args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
|
|
@@ -8363,6 +8631,10 @@ export function lowerObjectMethodCall(lowerer, call, access) {
|
|
|
8363
8631
|
if (info && !found && eventTargetApiMethod(info, access.name.text)) {
|
|
8364
8632
|
return lowerEventTargetMethodCall(lowerer, call, access, info, lowerReceiver());
|
|
8365
8633
|
}
|
|
8634
|
+
// The Date methods a class declared `extends Date` does not declare.
|
|
8635
|
+
if (info && !found && dateRootOf(info) && isDatePrototypeMethod(access.name.text)) {
|
|
8636
|
+
return lowerInheritedDateMethodCall(lowerer, call, access.name.text, info, lowerReceiver());
|
|
8637
|
+
}
|
|
8366
8638
|
// GENERIC methods (own type parameters) never enter the methods table:
|
|
8367
8639
|
// they monomorphize per call site and dispatch statically
|
|
8368
8640
|
// (lowerClassGenericMethodCall has the exactness rules).
|
|
@@ -8721,7 +8993,7 @@ function lowerUnionObjectDynFieldCall(lowerer, call, access, receiverT) {
|
|
|
8721
8993
|
const receiverRef = varRef(receiverLocal.id, receiverT, loc);
|
|
8722
8994
|
let helper = lowerer.unionCallHelpers.get(key);
|
|
8723
8995
|
if (!helper) {
|
|
8724
|
-
helper =
|
|
8996
|
+
helper = keyedHelperName(lowerer, "%union.call", key);
|
|
8725
8997
|
lowerer.unionCallHelpers.set(key, helper);
|
|
8726
8998
|
const receiverRef = varRef("this.0", receiverT, loc);
|
|
8727
8999
|
const branch = (plan) => {
|
|
@@ -8801,7 +9073,7 @@ function unionObjectMethodHelper(lowerer, sourceCall, receiverT, method, plans,
|
|
|
8801
9073
|
const existing = lowerer.unionCallHelpers.get(key);
|
|
8802
9074
|
if (existing)
|
|
8803
9075
|
return existing;
|
|
8804
|
-
const name =
|
|
9076
|
+
const name = keyedHelperName(lowerer, "%union.call", key);
|
|
8805
9077
|
lowerer.unionCallHelpers.set(key, name);
|
|
8806
9078
|
// A probe that catches a refusal while the body lowers must not leave
|
|
8807
9079
|
// the name registered for a helper that was never emitted.
|
|
@@ -8906,20 +9178,43 @@ function loweredArgumentText(lowerer, arg) {
|
|
|
8906
9178
|
* fences; null when the argument shape has no static form (the caller
|
|
8907
9179
|
* reports the SC2012 refusal). */
|
|
8908
9180
|
export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
|
|
8909
|
-
if (name === "parseInt" || name === "isNaN") {
|
|
9181
|
+
if (name === "parseInt" || name === "isNaN" || name === "isFinite") {
|
|
8910
9182
|
const maxArgs = name === "parseInt" ? 2 : 1;
|
|
8911
9183
|
if (args.length < 1 || args.length > maxArgs) {
|
|
8912
9184
|
lowerer.noLowering(`${name} with ${args.length} argument${args.length === 1 ? "" : "s"}`, call);
|
|
8913
9185
|
}
|
|
8914
|
-
if (name === "isNaN") {
|
|
8915
|
-
// The global's ToNumber turns a missing value into NaN
|
|
9186
|
+
if (name === "isNaN" || name === "isFinite") {
|
|
9187
|
+
// The global's ToNumber turns a missing value into NaN, converts
|
|
9188
|
+
// strings, booleans and null, and calls valueOf/toString on objects.
|
|
8916
9189
|
const x = lowerToNumberArgument(lowerer, args[0]);
|
|
8917
|
-
|
|
9190
|
+
const fn = name === "isNaN" ? "num.isNaN" : "number.isFinite";
|
|
9191
|
+
return { kind: "libCall", fn, args: [x], type: BOOL, loc };
|
|
8918
9192
|
}
|
|
8919
9193
|
const radix = args[1]
|
|
8920
9194
|
? lowerer.lowerExprExpecting(args[1], F64)
|
|
8921
9195
|
: { kind: "numLit", value: 0, type: F64, loc };
|
|
8922
|
-
|
|
9196
|
+
let optional = optionalCallValue(lowerer, args[0]);
|
|
9197
|
+
let lowered = null;
|
|
9198
|
+
// A possibly-missing or untyped text in JavaScript (`parseInt(process.
|
|
9199
|
+
// env.PORT, 10)`): TypeScript rejects the call, Node parses the text
|
|
9200
|
+
// of whatever arrives ("undefined").
|
|
9201
|
+
if (optional === null && isJsSourceFile(ts.getSourceFileOfNode(call))) {
|
|
9202
|
+
const argT = lowerer.typeOf(args[0]);
|
|
9203
|
+
const parts = argT.isUnionType() ? ts.constituentTypes(argT) : [argT];
|
|
9204
|
+
if (parts.some((part) => (part.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Null | ts.TypeFlags.Any)) !== 0)) {
|
|
9205
|
+
const raw = lowerer.lowerExpr(args[0]);
|
|
9206
|
+
if (raw.type.kind === "union") {
|
|
9207
|
+
optional = raw;
|
|
9208
|
+
lowered = raw;
|
|
9209
|
+
}
|
|
9210
|
+
else {
|
|
9211
|
+
const text = raw.type.kind === "dyn"
|
|
9212
|
+
? { kind: "libCall", fn: "dyn.toStringCoerce", args: [raw], type: STRING, loc }
|
|
9213
|
+
: lowerer.coerceInto(args[0], raw, STRING);
|
|
9214
|
+
return { kind: "libCall", fn: "num.parseInt", args: [text, radix], type: F64, loc };
|
|
9215
|
+
}
|
|
9216
|
+
}
|
|
9217
|
+
}
|
|
8923
9218
|
if (optional?.type.kind === "union") {
|
|
8924
9219
|
const def = lowerer.unions.get(optional.type.unionId);
|
|
8925
9220
|
const stringTag = def?.arms.findIndex((arm) => arm.kind === "string") ?? -1;
|
|
@@ -8930,7 +9225,7 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
|
|
|
8930
9225
|
const key = `parseInt.optional:${unionT.unionId}`;
|
|
8931
9226
|
let helper = lowerer.valueHelpers.get(key);
|
|
8932
9227
|
if (!helper) {
|
|
8933
|
-
helper =
|
|
9228
|
+
helper = keyedHelperName(lowerer, "%parseInt.optional", key);
|
|
8934
9229
|
lowerer.valueHelpers.set(key, helper);
|
|
8935
9230
|
const value = { kind: "varRef", localId: "value.0", type: unionT, loc };
|
|
8936
9231
|
const radixRef = { kind: "varRef", localId: "radix.0", type: F64, loc };
|
|
@@ -9014,30 +9309,37 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
|
|
|
9014
9309
|
return { kind: "call", callee: helper, args: [optional, radix], type: F64, loc };
|
|
9015
9310
|
}
|
|
9016
9311
|
}
|
|
9017
|
-
const s =
|
|
9312
|
+
const s = lowered !== null
|
|
9313
|
+
? lowerer.coerceInto(args[0], lowered, STRING)
|
|
9314
|
+
: lowerer.lowerExprExpecting(args[0], STRING);
|
|
9018
9315
|
return { kind: "libCall", fn: "num.parseInt", args: [s, radix], type: F64, loc };
|
|
9019
9316
|
}
|
|
9020
|
-
//
|
|
9021
|
-
//
|
|
9022
|
-
//
|
|
9023
|
-
|
|
9024
|
-
|
|
9025
|
-
|
|
9026
|
-
|
|
9027
|
-
|
|
9028
|
-
|
|
9029
|
-
|
|
9030
|
-
|
|
9031
|
-
|
|
9032
|
-
|
|
9033
|
-
|
|
9034
|
-
|
|
9317
|
+
// parseFloat takes one argument; Node ignores the rest after evaluating
|
|
9318
|
+
// them (`parseFloat(text, 10)`). Literal and identifier extras have
|
|
9319
|
+
// nothing to evaluate.
|
|
9320
|
+
if (name === "parseFloat" &&
|
|
9321
|
+
args.length > 1 &&
|
|
9322
|
+
args
|
|
9323
|
+
.slice(1)
|
|
9324
|
+
.every((arg) => ts.isNumericLiteral(arg) || ts.isStringLiteral(arg) || ts.isIdentifier(arg)))
|
|
9325
|
+
return lowerStaticNumberGlobal(lowerer, name, call, args.slice(0, 1), loc);
|
|
9326
|
+
// STATIC parseFloat over string arguments — parseInt's sibling
|
|
9327
|
+
// (num.parseFloat is ECMA 19.2.4's decimal-literal prefix parse in
|
|
9328
|
+
// scr_string.c). Other argument types retain their native coercion
|
|
9329
|
+
// checks or the SC2012 refusal. The probe never emits — lowering is IR
|
|
9330
|
+
// construction.
|
|
9331
|
+
if (name === "parseFloat" && args.length === 1) {
|
|
9332
|
+
const optional = optionalCallValue(lowerer, args[0]);
|
|
9333
|
+
if (optional) {
|
|
9334
|
+
const parsed = lowerOptionalStringNumber(lowerer, optional, loc, "num.parseFloat", "parseFloat");
|
|
9335
|
+
if (parsed)
|
|
9336
|
+
return parsed;
|
|
9035
9337
|
}
|
|
9036
9338
|
const probed = tryLowerExpression(lowerer, args[0]);
|
|
9037
|
-
if (
|
|
9339
|
+
if (probed?.type.kind === "string") {
|
|
9038
9340
|
return { kind: "libCall", fn: "num.parseFloat", args: [probed], type: F64, loc };
|
|
9039
9341
|
}
|
|
9040
|
-
if (
|
|
9342
|
+
if (probed?.type.kind === "dyn") {
|
|
9041
9343
|
return {
|
|
9042
9344
|
kind: "libCall",
|
|
9043
9345
|
fn: "num.parseFloat",
|
|
@@ -9046,29 +9348,38 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
|
|
|
9046
9348
|
loc,
|
|
9047
9349
|
};
|
|
9048
9350
|
}
|
|
9049
|
-
if (name === "isFinite" && probed?.type.kind === "f64") {
|
|
9050
|
-
return { kind: "libCall", fn: "number.isFinite", args: [probed], type: BOOL, loc };
|
|
9051
|
-
}
|
|
9052
|
-
// A number the checker trusts but storage may hold missing (an
|
|
9053
|
-
// out-of-range read): the global's ToNumber makes undefined NaN.
|
|
9054
|
-
if (name === "isFinite" &&
|
|
9055
|
-
probed?.type.kind === "union" &&
|
|
9056
|
-
lowerer.armTag(probed.type.unionId, UNDEFINED_T) >= 0 &&
|
|
9057
|
-
lowerer.stripUndefinedArm(probed.type).kind === "f64") {
|
|
9058
|
-
const x = lowerOptionalNumber(lowerer, probed, loc, args[0]);
|
|
9059
|
-
return { kind: "libCall", fn: "number.isFinite", args: [x], type: BOOL, loc };
|
|
9060
|
-
}
|
|
9061
9351
|
}
|
|
9062
9352
|
return null;
|
|
9063
9353
|
}
|
|
9064
|
-
/** `crypto.getRandomValues(view)` on the
|
|
9065
|
-
|
|
9066
|
-
|
|
9354
|
+
/** `crypto.getRandomValues(view)` and `crypto.randomUUID()` on the
|
|
9355
|
+
* WebCrypto global or webcrypto. Other argument counts (JavaScript only)
|
|
9356
|
+
* invoke the dynamic object's method, which ignores extra arguments and
|
|
9357
|
+
* throws Node's missing-argument TypeError. */
|
|
9358
|
+
function lowerWebCryptoMethodCall(lowerer, call, access) {
|
|
9359
|
+
const member = access.name.text;
|
|
9360
|
+
if ((member !== "getRandomValues" && member !== "randomUUID") ||
|
|
9067
9361
|
call.questionDotToken ||
|
|
9068
9362
|
access.questionDotToken ||
|
|
9069
9363
|
!isWebCryptoReceiver(lowerer, access.expression))
|
|
9070
9364
|
return null;
|
|
9071
|
-
|
|
9365
|
+
const args = call.arguments.nodes;
|
|
9366
|
+
if (member === "getRandomValues" && args.length === 1) {
|
|
9367
|
+
return lowerCryptoGetRandomValues(lowerer, call);
|
|
9368
|
+
}
|
|
9369
|
+
if (member === "randomUUID" && args.length === 0) {
|
|
9370
|
+
return { kind: "libCall", fn: "crypto.randomUUID", args: [], type: STRING, loc: locOf(call) };
|
|
9371
|
+
}
|
|
9372
|
+
if (args.some(ts.isSpreadElement))
|
|
9373
|
+
return null;
|
|
9374
|
+
return {
|
|
9375
|
+
kind: "dynInvoke",
|
|
9376
|
+
recv: lowerer.lowerExprExpecting(access.expression, DYN),
|
|
9377
|
+
method: member,
|
|
9378
|
+
calleeName: v8CalleeText(access),
|
|
9379
|
+
args: args.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
|
|
9380
|
+
type: DYN,
|
|
9381
|
+
loc: locOf(call),
|
|
9382
|
+
};
|
|
9072
9383
|
}
|
|
9073
9384
|
/** A then handler's promise-armed result (`.then(() => cached ?? load())`
|
|
9074
9385
|
* typed `T | Promise<T>`, or a `Promise<void> | void` callback's result):
|
|
@@ -9084,6 +9395,43 @@ function maybePromiseHandlerResult(lowerer, call, value, R) {
|
|
|
9084
9395
|
}
|
|
9085
9396
|
return stmt;
|
|
9086
9397
|
}
|
|
9398
|
+
/** `view.m(args)` where `view` is a `Pick<C, K>` / `Omit<C, K>` view of a
|
|
9399
|
+
* program class C and `m` is one of C's GENERIC methods (its overloads
|
|
9400
|
+
* included): generic methods have no dispatchable method value, so the
|
|
9401
|
+
* view's live receiver is extracted as the C instance it holds (a checked
|
|
9402
|
+
* extraction — a value of another class throws Node-style TypeError
|
|
9403
|
+
* text naming C) and the call monomorphizes statically against C, the
|
|
9404
|
+
* same lowering a C-typed receiver gets. Null for other receivers. */
|
|
9405
|
+
function pickViewGenericMethodCall(lowerer, call, access, recvTs) {
|
|
9406
|
+
const alias = recvTs.getAliasSymbol();
|
|
9407
|
+
if (alias === undefined || (ts.symbolName(alias) !== "Pick" && ts.symbolName(alias) !== "Omit"))
|
|
9408
|
+
return null;
|
|
9409
|
+
if (!alias.declarations.every((d) => ts.getSourceFileOfNode(d).isDeclarationFile))
|
|
9410
|
+
return null;
|
|
9411
|
+
const source = recvTs.getAliasTypeArguments()[0];
|
|
9412
|
+
const symbol = source?.getSymbol();
|
|
9413
|
+
const info = symbol ? lowerer.classBySymbol.get(symbol) : undefined;
|
|
9414
|
+
if (!info || call.questionDotToken || access.questionDotToken)
|
|
9415
|
+
return null;
|
|
9416
|
+
const found = findGenericMethodOn(lowerer, info, access.name.text);
|
|
9417
|
+
if (!found)
|
|
9418
|
+
return null;
|
|
9419
|
+
const loc = locOf(access.expression);
|
|
9420
|
+
const lowered = lowerer.lowerExpr(access.expression);
|
|
9421
|
+
const instance = { kind: "object", className: info.def.name };
|
|
9422
|
+
// A view that statically holds an instance of another class (a
|
|
9423
|
+
// structurally compatible one) calls that class's method in Node, not
|
|
9424
|
+
// C's: the call is refused rather than extracted as a C instance.
|
|
9425
|
+
if (lowered.type.kind === "object" &&
|
|
9426
|
+
lowered.type.className !== info.def.name &&
|
|
9427
|
+
!lowerer.isSubclassOf(lowered.type.className, info.def.name)) {
|
|
9428
|
+
lowerer.unsupported("SC1090", access, `calling the generic method '${access.name.text}' through a '${ts.symbolName(alias)}' view of '${info.def.name}' that holds a '${lowerer.fmt(lowered.type)}'`);
|
|
9429
|
+
}
|
|
9430
|
+
const receiver = lowered.type.kind === "object"
|
|
9431
|
+
? lowered
|
|
9432
|
+
: { kind: "dynCheck", value: lowerer.coerceToExpected(lowered, DYN), type: instance, loc };
|
|
9433
|
+
return lowerClassGenericMethodCall(lowerer, call, access, info, found, receiver);
|
|
9434
|
+
}
|
|
9087
9435
|
/** `Object.assign(err, ...sources)` in TypeScript onto an error-hierarchy
|
|
9088
9436
|
* target (`Object.assign(new Error(message), details)`): the sources'
|
|
9089
9437
|
* own members land on the error — the runtime copy over its
|
|
@@ -9134,4 +9482,63 @@ function lowerObjectAssignOntoError(lowerer, call) {
|
|
|
9134
9482
|
loc,
|
|
9135
9483
|
};
|
|
9136
9484
|
}
|
|
9485
|
+
/** `Object.freeze(fn)` and the other integrity operations on a function
|
|
9486
|
+
* value: the function's checked-dynamic face holds its own properties (the
|
|
9487
|
+
* ones a program assigns, `name`, `length`, `prototype`) and their
|
|
9488
|
+
* integrity state, which the runtime keeps on its property table. The
|
|
9489
|
+
* mutators answer the function itself; the queries answer from the table.
|
|
9490
|
+
* Null for other values. */
|
|
9491
|
+
function functionIntegrity(lowerer, member, value, node, loc) {
|
|
9492
|
+
if (value.type.kind !== "func" || !lowerer.dynConvertible(value.type))
|
|
9493
|
+
return null;
|
|
9494
|
+
const operations = {
|
|
9495
|
+
freeze: "dyn.freeze",
|
|
9496
|
+
seal: "dyn.seal",
|
|
9497
|
+
preventExtensions: "dyn.preventExtensions",
|
|
9498
|
+
isSealed: "dyn.isSealed",
|
|
9499
|
+
isExtensible: "dyn.isExtensible",
|
|
9500
|
+
};
|
|
9501
|
+
if (!(member in operations))
|
|
9502
|
+
return null;
|
|
9503
|
+
const fn = operations[member];
|
|
9504
|
+
// The first operation on a function creates its property table, whose
|
|
9505
|
+
// `name` comes from the box: give the box the function's JS name, as a
|
|
9506
|
+
// closure flowing into any checked-dynamic slot gets.
|
|
9507
|
+
const name = jsFuncNameOf(node, lowerer);
|
|
9508
|
+
const boxed = (e) => {
|
|
9509
|
+
const box = lowerer.coerceToExpected(e, DYN);
|
|
9510
|
+
return box.kind === "dynFrom" && name !== null ? { ...box, fnName: name } : box;
|
|
9511
|
+
};
|
|
9512
|
+
if (fn === "dyn.isSealed" || fn === "dyn.isExtensible") {
|
|
9513
|
+
return { kind: "libCall", fn, args: [boxed(value)], type: BOOL, loc };
|
|
9514
|
+
}
|
|
9515
|
+
const held = lowerer.declareHiddenLocal("%integrityFn", value.type);
|
|
9516
|
+
const ref = () => ({ kind: "varRef", localId: held.id, type: value.type, loc });
|
|
9517
|
+
return {
|
|
9518
|
+
kind: "seqExpr",
|
|
9519
|
+
stmts: [
|
|
9520
|
+
{ kind: "varDecl", localId: held.id, init: value, loc },
|
|
9521
|
+
{
|
|
9522
|
+
kind: "exprStmt",
|
|
9523
|
+
expr: { kind: "libCall", fn, args: [boxed(ref())], type: DYN, loc },
|
|
9524
|
+
loc,
|
|
9525
|
+
},
|
|
9526
|
+
],
|
|
9527
|
+
result: ref(),
|
|
9528
|
+
type: value.type,
|
|
9529
|
+
loc,
|
|
9530
|
+
};
|
|
9531
|
+
}
|
|
9532
|
+
/** A class instance copied into a fresh object (`Object.assign({},
|
|
9533
|
+
* instance)`): the result is a plain object holding the instance's own
|
|
9534
|
+
* fields, never an instance, so a result the checker types as the class has
|
|
9535
|
+
* no representation (the checked cast would throw). */
|
|
9536
|
+
function fenceClassCopyIntoFreshObject(lowerer, call, srcNode, rawSource) {
|
|
9537
|
+
if (rawSource.type.kind !== "object" || ts.isExpressionStatement(call.parent))
|
|
9538
|
+
return;
|
|
9539
|
+
const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
|
|
9540
|
+
if (resultT === null || resultT.kind !== "object")
|
|
9541
|
+
return;
|
|
9542
|
+
lowerer.unsupported("SC1090", srcNode, `Object.assign copying a '${lowerer.fmt(rawSource.type)}' instance into a fresh object typed as the class (the copy is a plain object holding the instance's own fields, not an instance — build the object literal from the fields you need)`);
|
|
9543
|
+
}
|
|
9137
9544
|
//# sourceMappingURL=lower-calls.js.map
|