@scriptc/compiler 0.4.1 → 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 +582 -78
- 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 +4 -1
- 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 +4 -0
- package/dist/backend/library-pack.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 +2 -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 +72 -1
- package/dist/backend/llvm/classes.js +331 -45
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +223 -16
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +1 -3
- package/dist/backend/llvm/common.js +1 -3
- 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-loops.d.ts +19 -16
- package/dist/backend/llvm/dense-array-loops.js +46 -10
- 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 +25 -1
- package/dist/backend/llvm/dyn.js +331 -8
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +22 -6
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-module.js +17 -11
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +0 -23
- package/dist/backend/llvm/emit-statements.js +325 -25
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +141 -15
- package/dist/backend/llvm/emitter.js +537 -64
- 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 +34 -22
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +21 -5
- 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 +54 -6
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +26 -8
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +38 -6
- 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/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 +65 -14
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +53 -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 +66 -45
- 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/publish.d.ts +8 -1
- package/dist/backend/llvm/publish.js +64 -25
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.js +3 -0
- package/dist/backend/llvm/publish.test.js.map +1 -1
- package/dist/backend/llvm/receivers.js +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/shapes.d.ts +9 -7
- package/dist/backend/llvm/shapes.js +12 -10
- package/dist/backend/llvm/shapes.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 +3 -0
- package/dist/backend/llvm/string-reads.js +84 -0
- package/dist/backend/llvm/string-reads.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 +3 -0
- package/dist/backend/mangle.js +5 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +22 -4
- package/dist/backend/native/executable.js +24 -8
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +1 -0
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +11 -6
- package/dist/backend/native-codegen.js +36 -9
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +0 -23
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +14 -4
- package/dist/backend/native-link-info-core.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 +1 -1
- package/dist/backend/runtime-pack-core.js +1 -1
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +4 -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 +9 -69
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.js +31 -1
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +3 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +26 -6
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +5 -1
- package/dist/cli/usage.js +7 -2
- package/dist/cli/usage.js.map +1 -1
- package/dist/contracts/check.js +1 -1
- 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 +23 -1
- package/dist/executable/executable-cache.js +59 -7
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +45 -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/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/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/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 +4 -2
- package/dist/frontend/lowering/builtins/crypto.js +59 -3
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
- package/dist/frontend/lowering/builtins/date-classes.js +477 -0
- package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
- package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
- package/dist/frontend/lowering/builtins/dates.js +55 -26
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
- package/dist/frontend/lowering/builtins/dh.js +151 -0
- package/dist/frontend/lowering/builtins/dh.js.map +1 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
- package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
- package/dist/frontend/lowering/builtins/ecdh.d.ts +12 -1
- package/dist/frontend/lowering/builtins/ecdh.js +7 -7
- package/dist/frontend/lowering/builtins/ecdh.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
- package/dist/frontend/lowering/builtins/errors.js +110 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.js +6 -4
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
- package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
- package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
- package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
- package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
- package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +2 -1
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
- package/dist/frontend/lowering/builtins/key-object.js +20 -7
- package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +11 -4
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.js +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.js +3 -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.js +2 -1
- 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/strings.js +13 -5
- package/dist/frontend/lowering/builtins/strings.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.js +1 -1
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +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.js +13 -6
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
- package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
- package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-assertions.js +3 -2
- package/dist/frontend/lowering/class-assertions.js.map +1 -1
- package/dist/frontend/lowering/class-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 +568 -151
- 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 +7 -0
- package/dist/frontend/lowering/class-protocols.js +64 -4
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
- package/dist/frontend/lowering/class-prototypes.js +36 -3
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-to-primitive.js +25 -5
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
- package/dist/frontend/lowering/class-unions.js +2 -1
- package/dist/frontend/lowering/class-unions.js.map +1 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +6 -5
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.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 +7 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +14 -13
- 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 +25 -4
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +6 -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 +1 -1
- package/dist/frontend/lowering/containers/bytes.js +129 -28
- 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 +8 -7
- 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 +36 -9
- 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.js +25 -4
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
- package/dist/frontend/lowering/dispatch-sites.js +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 +15 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +45 -3
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +17 -1
- 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/narrowing.js +35 -5
- 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 +27 -6
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +5 -5
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +0 -4
- package/dist/frontend/lowering/expressions/property-access.js +99 -7
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +63 -5
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +63 -9
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +42 -1
- package/dist/frontend/lowering/generic-functions.js +448 -18
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/intern-tables.js +2 -1
- package/dist/frontend/lowering/intern-tables.js.map +1 -1
- package/dist/frontend/lowering/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-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-calls.d.ts +4 -0
- package/dist/frontend/lowering/lower-calls.js +339 -91
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +18 -0
- package/dist/frontend/lowering/lower-classes.js +280 -25
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +3 -2
- 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 +116 -11
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +304 -72
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +10 -6
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +2 -1
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.js +2 -1
- package/dist/frontend/lowering/lower-mock.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +15 -5
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.js +2 -2
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
- package/dist/frontend/lowering/lower-namespaces.js +4 -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 +237 -59
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.js +12 -10
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +168 -20
- 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 +4 -3
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +125 -28
- package/dist/frontend/lowering/lowerer.js +557 -63
- 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/require-initialization.js +2 -1
- package/dist/frontend/lowering/require-initialization.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
- package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
- package/dist/frontend/lowering/runtime-optional-records.js +18 -5
- package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
- package/dist/frontend/lowering/site-dependencies.js +84 -0
- package/dist/frontend/lowering/site-dependencies.js.map +1 -0
- package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
- package/dist/frontend/lowering/site-dependencies.test.js +53 -0
- package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
- package/dist/frontend/lowering/stable-names.d.ts +11 -0
- package/dist/frontend/lowering/stable-names.js +35 -0
- package/dist/frontend/lowering/stable-names.js.map +1 -0
- package/dist/frontend/lowering/static-typeof.d.ts +2 -2
- package/dist/frontend/lowering/static-typeof.js +42 -3
- package/dist/frontend/lowering/static-typeof.js.map +1 -1
- package/dist/frontend/lowering/strict-equality.js +2 -1
- package/dist/frontend/lowering/strict-equality.js.map +1 -1
- package/dist/frontend/lowering/structural-positions.d.ts +32 -0
- package/dist/frontend/lowering/structural-positions.js +108 -0
- package/dist/frontend/lowering/structural-positions.js.map +1 -0
- package/dist/frontend/lowering/surfaces.js +42 -26
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/var-hoisting.js +37 -3
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
- package/dist/frontend/npm-static-tsc-helpers.js +106 -0
- package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
- package/dist/frontend/npm-static-type-exports-host.js +214 -0
- package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
- package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.d.ts +52 -0
- package/dist/frontend/npm-static-type-exports.js +261 -0
- package/dist/frontend/npm-static-type-exports.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports.test.js +103 -0
- package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
- package/dist/frontend/npm-static-umd.d.ts +6 -0
- package/dist/frontend/npm-static-umd.js +203 -0
- package/dist/frontend/npm-static-umd.js.map +1 -0
- package/dist/frontend/npm-static-umd.test.d.ts +1 -0
- package/dist/frontend/npm-static-umd.test.js +105 -0
- package/dist/frontend/npm-static-umd.test.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +8 -0
- package/dist/frontend/npm-static.js +47 -2
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/program.d.ts +13 -0
- package/dist/frontend/program.js +103 -6
- 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/services.d.ts +6 -0
- package/dist/frontend/services.js +18 -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.js +5 -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 +15 -0
- package/dist/frontend/ts7/semantic-model.js +67 -19
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +3 -2
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/session.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 +265 -32
- 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 +7 -0
- package/dist/index.js +402 -86
- package/dist/index.js.map +1 -1
- package/dist/ir/array-length-stability.js +7 -0
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +25 -0
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.js +28 -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 +141 -12
- 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 +9 -4
- package/dist/ir/integer-loop-facts.js +93 -18
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +49 -0
- package/dist/ir/integer-loops.js +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.test.js +64 -0
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +17 -2
- package/dist/ir/ir.js +3 -1
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +31 -7
- package/dist/ir/runtime-features.js +138 -11
- 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 +14 -2
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +56 -16
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +10 -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 +5 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/prepare.js +5 -1
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.test.js +4 -1
- 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 +21 -21
- package/shims/undici/core/client.ts +4 -4
- package/surface-manifest.json +19 -49
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { primitiveConstructorOr } from "./lower-exprs.js";
|
|
2
|
+
import { InternalCompilerError } from "../../errors.js";
|
|
2
3
|
import { dynUndefinedExpr, helperLoc, nodeThrowExpr, varRef } from "../../ir/build.js";
|
|
3
4
|
import { constructedValue } from "./constructor-returns.js";
|
|
4
5
|
import { eventTargetApiMembers, eventTargetInheritedMember } from "./lower-event-target.js";
|
|
5
|
-
import {
|
|
6
|
+
import { DATE_PROTOTYPE_METHOD_NAMES, DATE_TIME_FIELD, dateInheritedMember, dateRootOf, programDeclaresDateClass, } from "./builtins/date-classes.js";
|
|
7
|
+
import { dateValueMethod } from "./builtins/dates.js";
|
|
8
|
+
import { BOOL, DATE_T, DYN, F64, DYN_CLASS_PROPERTIES as PROPERTY_BAG, STRING, VOID, canConvertToDyn, canDynCheckTo, isClassOwnEnumerableFieldName, isDynTypedRefType, isUnitType, typeEquals, typeKey, } from "../../ir/ir.js";
|
|
6
9
|
import { streamTypedRefEligible } from "../../ir/analysis.js";
|
|
7
10
|
import { everyStmtList, transformExpr, transformStmtList } from "../../ir/traverse.js";
|
|
8
11
|
import { PoisonError } from "./lowerer.js";
|
|
@@ -22,7 +25,8 @@ import { isClassCallback } from "./class-callbacks.js";
|
|
|
22
25
|
import { CaughtValueDispatch } from "./caught-value-dispatch.js";
|
|
23
26
|
import { refreshDescriptorGuards } from "./class-descriptors.js";
|
|
24
27
|
import { ClassConstructionDispatch } from "./class-construction.js";
|
|
25
|
-
import {
|
|
28
|
+
import { DispatchSites } from "./dispatch-sites.js";
|
|
29
|
+
import { emitterRooted, lowerDynamicEmitterEmit, lowerDynamicEmitterOn, } from "./lower-event-emitter.js";
|
|
26
30
|
import { protocolArm, protocolFieldArm } from "./class-protocol-dispatch.js";
|
|
27
31
|
import { STREAM_OPERATORS } from "./lower-stream.js";
|
|
28
32
|
import { deletedPropertyNames, fixedFieldFamily } from "./js-class-fields.js";
|
|
@@ -50,6 +54,25 @@ const EMITTER_METHODS = new Set([
|
|
|
50
54
|
"off",
|
|
51
55
|
"removeListener",
|
|
52
56
|
]);
|
|
57
|
+
/** The rest of EventEmitter.prototype, answered through an untyped value
|
|
58
|
+
* on emitters that are not streams (streams keep their own surface). */
|
|
59
|
+
const EMITTER_INTROSPECTION_METHODS = new Set([
|
|
60
|
+
"listenerCount",
|
|
61
|
+
"eventNames",
|
|
62
|
+
"removeAllListeners",
|
|
63
|
+
"listeners",
|
|
64
|
+
"rawListeners",
|
|
65
|
+
"setMaxListeners",
|
|
66
|
+
"getMaxListeners",
|
|
67
|
+
]);
|
|
68
|
+
/** True when the class is or extends one of the runtime stream classes. */
|
|
69
|
+
function streamRooted(info) {
|
|
70
|
+
for (let c = info; c; c = c.base) {
|
|
71
|
+
if (c.builtinStream !== undefined)
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
53
76
|
const STREAM_BOOL_PROPERTIES = new Set([
|
|
54
77
|
"readable",
|
|
55
78
|
"readableEnded",
|
|
@@ -128,7 +151,7 @@ const KEY_CALLS = new Map([
|
|
|
128
151
|
["dyn.keyDeleteComputed", "value"],
|
|
129
152
|
["dyn.keySetComputed", "value"],
|
|
130
153
|
]);
|
|
131
|
-
function toPrimitiveHint(expr) {
|
|
154
|
+
export function toPrimitiveHint(expr) {
|
|
132
155
|
if (expr.kind === "toString")
|
|
133
156
|
return expr.operand.type.kind === "dyn" ? "string" : null;
|
|
134
157
|
if (expr.kind === "dynKeyGet")
|
|
@@ -176,6 +199,7 @@ function isPrimitive(value, loc) {
|
|
|
176
199
|
}
|
|
177
200
|
export function classInstanceOf(lowerer, value, info, loc, classValue) {
|
|
178
201
|
const name = `%dyn.class.${classValue ? "valueInstanceof" : "instanceof"}:${info.def.name}`;
|
|
202
|
+
lowerer.shareHelper(name);
|
|
179
203
|
const params = [
|
|
180
204
|
{ localId: "value", name: "value", type: DYN },
|
|
181
205
|
...(classValue ? [{ localId: "class", name: "class", type: classValue.type }] : []),
|
|
@@ -185,6 +209,32 @@ export function classInstanceOf(lowerer, value, info, loc, classValue) {
|
|
|
185
209
|
const prototype = classPrototypeData(lowerer, info, loc, classValue ? varRef("class", classValue.type, loc) : undefined);
|
|
186
210
|
const body = prototype
|
|
187
211
|
? [
|
|
212
|
+
// In a program that declares a class extending Date, a Date can
|
|
213
|
+
// meet a class test (`date instanceof Moment`): its prototype
|
|
214
|
+
// chain holds no class prototype.
|
|
215
|
+
...(programDeclaresDateClass(lowerer)
|
|
216
|
+
? [
|
|
217
|
+
{
|
|
218
|
+
kind: "if",
|
|
219
|
+
cond: {
|
|
220
|
+
kind: "libCall",
|
|
221
|
+
fn: "dyn.nativeDateHandleIs",
|
|
222
|
+
args: [varRef("value", DYN, loc)],
|
|
223
|
+
type: BOOL,
|
|
224
|
+
loc,
|
|
225
|
+
},
|
|
226
|
+
then: [
|
|
227
|
+
{
|
|
228
|
+
kind: "return",
|
|
229
|
+
value: { kind: "boolLit", value: false, type: BOOL, loc },
|
|
230
|
+
loc,
|
|
231
|
+
},
|
|
232
|
+
],
|
|
233
|
+
else_: null,
|
|
234
|
+
loc,
|
|
235
|
+
},
|
|
236
|
+
]
|
|
237
|
+
: []),
|
|
188
238
|
{ kind: "varDecl", localId: "candidate", init: varRef("value", DYN, loc), loc },
|
|
189
239
|
{
|
|
190
240
|
kind: "while",
|
|
@@ -273,9 +323,106 @@ function readOnlyBagBody(body, orEmpty = false) {
|
|
|
273
323
|
}
|
|
274
324
|
return body;
|
|
275
325
|
}
|
|
326
|
+
/** `value` with the class branch's checked receiver (`p.0` as a dynamic
|
|
327
|
+
* value, possibly cast to the branch's class) replaced by `receiver`, the
|
|
328
|
+
* typed receiver of a per-class helper. */
|
|
329
|
+
function withTypedReceiver(value, receiver) {
|
|
330
|
+
const checked = (e) => e.kind === "dynCheck" && e.value.kind === "varRef" && e.value.localId === "p.0";
|
|
331
|
+
return transformExpr(value, {
|
|
332
|
+
stmt: (stmt) => stmt,
|
|
333
|
+
expr: (expr) => (expr.kind === "downcast" &&
|
|
334
|
+
checked(expr.value) &&
|
|
335
|
+
expr.type.kind === "object" &&
|
|
336
|
+
receiver.type.kind === "object" &&
|
|
337
|
+
expr.type.className === receiver.type.className) ||
|
|
338
|
+
checked(expr)
|
|
339
|
+
? receiver
|
|
340
|
+
: expr,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
/** Re-adds the classes of `set` after the first `from` in a fixed order:
|
|
344
|
+
* the program's classes by name, then the classes the runtime implements by
|
|
345
|
+
* name. The dispatch helpers add each class's branch in front of the
|
|
346
|
+
* earlier ones, so a runtime class's branch, which answers its methods for
|
|
347
|
+
* instances of the program's subclasses too, is tested before the
|
|
348
|
+
* subclasses' own branches. */
|
|
349
|
+
function sortAdded(lowerer, set, from) {
|
|
350
|
+
const runtime = (name) => {
|
|
351
|
+
const info = lowerer.classes.get(name);
|
|
352
|
+
return !!(info &&
|
|
353
|
+
(info.def.runtime || info.builtinEmitter || info.builtinStream || info.builtinError));
|
|
354
|
+
};
|
|
355
|
+
const added = [...set]
|
|
356
|
+
.slice(from)
|
|
357
|
+
.sort((left, right) => Number(runtime(left)) - Number(runtime(right)) ||
|
|
358
|
+
(left < right ? -1 : left > right ? 1 : 0));
|
|
359
|
+
for (const name of added)
|
|
360
|
+
set.delete(name);
|
|
361
|
+
for (const name of added)
|
|
362
|
+
set.add(name);
|
|
363
|
+
}
|
|
364
|
+
function receiverIndex(lowerer, plans) {
|
|
365
|
+
const methods = new Map();
|
|
366
|
+
const members = new Map();
|
|
367
|
+
const rooted = [];
|
|
368
|
+
const add = (table, name, position) => {
|
|
369
|
+
const positions = table.get(name);
|
|
370
|
+
if (positions === undefined)
|
|
371
|
+
table.set(name, [position]);
|
|
372
|
+
else if (positions[positions.length - 1] !== position)
|
|
373
|
+
positions.push(position);
|
|
374
|
+
};
|
|
375
|
+
plans.forEach(({ info }, position) => {
|
|
376
|
+
if (emitterRooted(lowerer, info) ||
|
|
377
|
+
info.builtinStream !== undefined ||
|
|
378
|
+
eventTargetApiMembers(info) !== null ||
|
|
379
|
+
dateRootOf(info) !== null) {
|
|
380
|
+
rooted.push(position);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
for (let c = info; c; c = c.base) {
|
|
384
|
+
for (const name of c.methods.keys()) {
|
|
385
|
+
add(methods, name, position);
|
|
386
|
+
// A `get:`/`set:` key is an accessor of the property after the
|
|
387
|
+
// prefix, or a method whose quoted name has that prefix; the test
|
|
388
|
+
// looks up both.
|
|
389
|
+
add(members, name, position);
|
|
390
|
+
if (name.startsWith("get:") || name.startsWith("set:"))
|
|
391
|
+
add(members, name.slice(4), position);
|
|
392
|
+
}
|
|
393
|
+
if (c.genericMethods)
|
|
394
|
+
for (const name of c.genericMethods.keys()) {
|
|
395
|
+
add(methods, name, position);
|
|
396
|
+
add(members, name, position);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
for (const name of info.fields.keys())
|
|
400
|
+
add(members, name, position);
|
|
401
|
+
});
|
|
402
|
+
for (const table of [methods, members])
|
|
403
|
+
for (const positions of table.values())
|
|
404
|
+
positions.sort((a, b) => a - b);
|
|
405
|
+
return { plans, methods, members, rooted };
|
|
406
|
+
}
|
|
407
|
+
/** The ascending union of two ascending position lists. */
|
|
408
|
+
function mergePositions(left, right) {
|
|
409
|
+
const out = [];
|
|
410
|
+
let i = 0;
|
|
411
|
+
let j = 0;
|
|
412
|
+
while (i < left.length || j < right.length) {
|
|
413
|
+
const next = j >= right.length || (i < left.length && left[i] <= right[j]) ? left[i++] : right[j++];
|
|
414
|
+
if (out[out.length - 1] !== next)
|
|
415
|
+
out.push(next);
|
|
416
|
+
}
|
|
417
|
+
return out;
|
|
418
|
+
}
|
|
419
|
+
/** SCRIPTC_CHECK_DISPATCH_CANDIDATES=1 checks every indexed receiver selection
|
|
420
|
+
* against a test of every receiver. */
|
|
421
|
+
const CHECK_CANDIDATES = process.env["SCRIPTC_CHECK_DISPATCH_CANDIDATES"] === "1";
|
|
276
422
|
export function classPropertiesHelper(lowerer, loc, readOnly = false) {
|
|
277
423
|
const name = readOnly ? READ_PROPERTIES : "%dyn.class.properties";
|
|
278
|
-
|
|
424
|
+
lowerer.shareHelper(name);
|
|
425
|
+
const existing = lowerer.liftedFnNamed(name);
|
|
279
426
|
if (existing)
|
|
280
427
|
return existing;
|
|
281
428
|
const helper = {
|
|
@@ -309,6 +456,8 @@ export function classPropertiesHelper(lowerer, loc, readOnly = false) {
|
|
|
309
456
|
* than that table, so a miss rechecks the instance itself. */
|
|
310
457
|
export function classForInHasKey(lowerer, value, key, loc) {
|
|
311
458
|
const name = "%dyn.class.forInHasKey";
|
|
459
|
+
lowerer.shareHelper(name);
|
|
460
|
+
lowerer.shareHelper("%dyn.class.forInBagHas");
|
|
312
461
|
if (!lowerer.liftedFns.some((fn) => fn.name === name)) {
|
|
313
462
|
// The read-only table: a recheck never creates an instance's table, which
|
|
314
463
|
// is undefined while the instance has no own dynamic properties.
|
|
@@ -568,6 +717,8 @@ export class ClassDynamicDispatch {
|
|
|
568
717
|
generatorDispatch = new GeneratorDynamicDispatch();
|
|
569
718
|
caughtDispatch = new CaughtValueDispatch();
|
|
570
719
|
constructionDispatch = new ClassConstructionDispatch();
|
|
720
|
+
/** What each function's body holds for this pass and its sub-passes. */
|
|
721
|
+
sites = new DispatchSites();
|
|
571
722
|
/** Property names a delete can remove (null: any name), for the field
|
|
572
723
|
* creation tracking decision. */
|
|
573
724
|
deletedNames;
|
|
@@ -589,6 +740,9 @@ export class ClassDynamicDispatch {
|
|
|
589
740
|
/** Per-class prototype selection for new property bags (bagPrototypeHelper). */
|
|
590
741
|
bagPrototypeHelpers = new Map();
|
|
591
742
|
readPropertyBags = [];
|
|
743
|
+
/** Read-only bags of exactly one class (exactPropertyBag), by class and
|
|
744
|
+
* whether an absent bag reads as a fresh empty object. */
|
|
745
|
+
exactPropertyBags = new Map();
|
|
592
746
|
generated = new Set();
|
|
593
747
|
/** Protocol dispatch helpers and callee reads whose receivers normalize. */
|
|
594
748
|
protocols = [];
|
|
@@ -625,16 +779,18 @@ export class ClassDynamicDispatch {
|
|
|
625
779
|
first.value.callee === this.normalization?.name)
|
|
626
780
|
fn.body.shift();
|
|
627
781
|
}
|
|
628
|
-
let changed = this.caughtDispatch.process(lowerer, functions);
|
|
782
|
+
let changed = this.caughtDispatch.process(lowerer, functions, this.sites);
|
|
629
783
|
changed = refreshErrorMethodDispatch(lowerer, functions) || changed;
|
|
630
784
|
changed = refreshClassMethodValueSelections(lowerer) || changed;
|
|
631
785
|
changed = refreshErrorPropertyDispatch(lowerer, functions) || changed;
|
|
632
|
-
changed =
|
|
633
|
-
|
|
786
|
+
changed =
|
|
787
|
+
this.generatorDispatch.process(lowerer, functions, this.generated, this.sites) || changed;
|
|
788
|
+
changed = this.constructionDispatch.process(lowerer, functions, this.sites) || changed;
|
|
634
789
|
const seenTypes = new Set();
|
|
635
790
|
const rewrite = new Set();
|
|
636
791
|
const toPrimitiveSites = new Set();
|
|
637
792
|
const hasKeySites = new Set();
|
|
793
|
+
const caughtSites = new Set();
|
|
638
794
|
const discover = (type) => {
|
|
639
795
|
const key = typeKey(type);
|
|
640
796
|
if (seenTypes.has(key))
|
|
@@ -661,83 +817,30 @@ export class ClassDynamicDispatch {
|
|
|
661
817
|
else if (type.kind === "promise")
|
|
662
818
|
discover(type.inner);
|
|
663
819
|
};
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
case "fieldIncDec":
|
|
689
|
-
if (lowerer.classes.get(expr.className)?.def.tracksOwnFields &&
|
|
690
|
-
isClassOwnEnumerableFieldName(expr.field))
|
|
691
|
-
discover(expr.obj.type);
|
|
692
|
-
break;
|
|
693
|
-
case "call":
|
|
694
|
-
if ((expr.callee === "%dyn.class.properties" ||
|
|
695
|
-
expr.callee === "%dyn.class.readProperties") &&
|
|
696
|
-
expr.args[0]?.kind === "dynFrom" &&
|
|
697
|
-
isDynTypedRefType(expr.args[0].value.type))
|
|
698
|
-
rewrite.add(fn);
|
|
699
|
-
break;
|
|
700
|
-
case "dynHasKey":
|
|
701
|
-
hasKeySites.add(fn);
|
|
702
|
-
break;
|
|
703
|
-
case "dynKeyGet":
|
|
704
|
-
case "dynInvoke":
|
|
705
|
-
rewrite.add(fn);
|
|
706
|
-
break;
|
|
707
|
-
case "dynCheck":
|
|
708
|
-
if (isDynTypedRefType(expr.type))
|
|
709
|
-
rewrite.add(fn);
|
|
710
|
-
// A dynamic function checked into a native function type
|
|
711
|
-
// receives its arguments as dynamic values: class instances
|
|
712
|
-
// passed to it cross the boundary when it is called (a JS
|
|
713
|
-
// `list.map((rec) => rec.match(x))` callback with an untyped
|
|
714
|
-
// parameter).
|
|
715
|
-
if (expr.type.kind === "func")
|
|
716
|
-
expr.type.params.forEach(discover);
|
|
717
|
-
break;
|
|
718
|
-
case "libCall":
|
|
719
|
-
if (expr.fn === "bytes.construct" ||
|
|
720
|
-
expr.fn === "dyn.keySet" ||
|
|
721
|
-
expr.fn === "dyn.keySetComputed" ||
|
|
722
|
-
expr.fn === "dyn.iterator" ||
|
|
723
|
-
expr.fn === "dyn.arrayFromIterator" ||
|
|
724
|
-
expr.fn === "dyn.toString" ||
|
|
725
|
-
expr.fn === "dyn.stringConstructor" ||
|
|
726
|
-
expr.fn === "dyn.forInKeys" ||
|
|
727
|
-
expr.fn === "dyn.forInKeyStrings" ||
|
|
728
|
-
expr.fn === "dyn.hasKeyComputed" ||
|
|
729
|
-
expr.fn === "dyn.hasOwnComputed" ||
|
|
730
|
-
expr.fn === "dyn.propertyIsEnumerableComputed" ||
|
|
731
|
-
expr.fn === "dyn.defineProperty" ||
|
|
732
|
-
expr.fn === "dyn.getPrototype" ||
|
|
733
|
-
expr.fn === "dyn.reflectGet" ||
|
|
734
|
-
expr.fn === "dyn.reflectSet")
|
|
735
|
-
rewrite.add(fn);
|
|
736
|
-
break;
|
|
737
|
-
}
|
|
738
|
-
return true;
|
|
739
|
-
},
|
|
740
|
-
});
|
|
820
|
+
const boxedBefore = this.boxed.size;
|
|
821
|
+
const boxedConstructorsBefore = this.boxedConstructors.size;
|
|
822
|
+
for (const fn of functions) {
|
|
823
|
+
const found = this.sites.of(fn);
|
|
824
|
+
// A class starts tracking its own fields during this pass.
|
|
825
|
+
for (const { type, fieldClass } of found.boxing)
|
|
826
|
+
if (fieldClass === undefined || lowerer.classes.get(fieldClass)?.def.tracksOwnFields)
|
|
827
|
+
discover(type);
|
|
828
|
+
if (found.serializes)
|
|
829
|
+
this.serializesClasses = true;
|
|
830
|
+
if (found.conversions)
|
|
831
|
+
toPrimitiveSites.add(fn);
|
|
832
|
+
if (found.dispatches)
|
|
833
|
+
rewrite.add(fn);
|
|
834
|
+
if (found.keyTests)
|
|
835
|
+
hasKeySites.add(fn);
|
|
836
|
+
if (found.caughtClassTests)
|
|
837
|
+
caughtSites.add(fn);
|
|
838
|
+
}
|
|
839
|
+
// The classes this pass found join the tables in a fixed order, not in
|
|
840
|
+
// the order the scan met them.
|
|
841
|
+
sortAdded(lowerer, this.boxed, boxedBefore);
|
|
842
|
+
sortAdded(lowerer, this.boxedConstructors, boxedConstructorsBefore);
|
|
843
|
+
changed = this.caughtDispatch.dynamicPayloads(lowerer, caughtSites, this.boxed) || changed;
|
|
741
844
|
if (this.boxed.size === 0 && rewrite.size === 0)
|
|
742
845
|
return changed;
|
|
743
846
|
const converting = this.convertingHints(lowerer);
|
|
@@ -879,7 +982,7 @@ export class ClassDynamicDispatch {
|
|
|
879
982
|
const loc = this.propertyBag.loc;
|
|
880
983
|
const method = classMethodValue(lowerer, info.decl, info, "toJSON", loc);
|
|
881
984
|
const prototype = method ? classPrototypeData(lowerer, info, loc) : null;
|
|
882
|
-
const helper = lowerer.
|
|
985
|
+
const helper = lowerer.liftedFnNamed(info.def.prototypeDataHelper);
|
|
883
986
|
const init = helper?.body[0];
|
|
884
987
|
if (!info.prototypeReflectionReady &&
|
|
885
988
|
method &&
|
|
@@ -1079,15 +1182,36 @@ export class ClassDynamicDispatch {
|
|
|
1079
1182
|
}
|
|
1080
1183
|
refreshDescriptorGuards(lowerer);
|
|
1081
1184
|
const byMethod = new Map();
|
|
1185
|
+
// A query asks every receiver about one name, and the program's dispatch
|
|
1186
|
+
// sites ask about thousands: index the receivers by name once per list.
|
|
1187
|
+
let index = null;
|
|
1188
|
+
const indexOf = (plans) => index?.plans === plans ? index : (index = receiverIndex(lowerer, plans));
|
|
1189
|
+
/** The receivers of `plans` that can answer `name`, in list order: those
|
|
1190
|
+
* `table` lists under it and the rooted ones. Emit-override
|
|
1191
|
+
* specializations (`emit:<event>`) join a class's methods while bodies
|
|
1192
|
+
* lower, so they keep every receiver. */
|
|
1193
|
+
const receiversFor = (plans, name, table) => {
|
|
1194
|
+
if (name.startsWith("emit:"))
|
|
1195
|
+
return plans;
|
|
1196
|
+
const found = indexOf(plans);
|
|
1197
|
+
const positions = (table === "methods" ? found.methods : found.members).get(name);
|
|
1198
|
+
return mergePositions(positions ?? [], found.rooted).map((position) => plans[position]);
|
|
1199
|
+
};
|
|
1082
1200
|
const candidates = (method) => {
|
|
1083
1201
|
const found = byMethod.get(method);
|
|
1084
1202
|
if (found)
|
|
1085
1203
|
return found;
|
|
1086
|
-
const
|
|
1204
|
+
const plans = this.propertyReceivers(lowerer, true);
|
|
1205
|
+
const test = ({ info }) => {
|
|
1087
1206
|
if (!info || info.fields.has(method) || info.builtinError)
|
|
1088
1207
|
return [];
|
|
1089
1208
|
if (emitterRooted(lowerer, info) && EMITTER_METHODS.has(method))
|
|
1090
1209
|
return [info];
|
|
1210
|
+
if (emitterRooted(lowerer, info) &&
|
|
1211
|
+
!streamRooted(info) &&
|
|
1212
|
+
EMITTER_INTROSPECTION_METHODS.has(method) &&
|
|
1213
|
+
!findMethodOn(lowerer, info, method))
|
|
1214
|
+
return [info];
|
|
1091
1215
|
if (info.builtinStream) {
|
|
1092
1216
|
return STREAM_METHODS.has(method) ||
|
|
1093
1217
|
(STREAM_OPERATORS.has(method) && info.builtinStream !== "w")
|
|
@@ -1097,10 +1221,25 @@ export class ClassDynamicDispatch {
|
|
|
1097
1221
|
return findMethodOn(lowerer, info, method) || findGenericMethodOn(lowerer, info, method)
|
|
1098
1222
|
? [info]
|
|
1099
1223
|
: [];
|
|
1100
|
-
}
|
|
1224
|
+
};
|
|
1225
|
+
const matching = receiversFor(plans, method, "methods").flatMap(test);
|
|
1226
|
+
if (CHECK_CANDIDATES) {
|
|
1227
|
+
const every = plans.flatMap(test);
|
|
1228
|
+
if (every.length !== matching.length || every.some((info, i) => info !== matching[i]))
|
|
1229
|
+
throw new InternalCompilerError(`indexed candidates for ${method} differ`);
|
|
1230
|
+
}
|
|
1101
1231
|
byMethod.set(method, matching);
|
|
1102
1232
|
return matching;
|
|
1103
1233
|
};
|
|
1234
|
+
const candidateSets = new Map();
|
|
1235
|
+
const candidateSet = (method) => {
|
|
1236
|
+
let set = candidateSets.get(method);
|
|
1237
|
+
if (!set) {
|
|
1238
|
+
set = new Set(candidates(method));
|
|
1239
|
+
candidateSets.set(method, set);
|
|
1240
|
+
}
|
|
1241
|
+
return set;
|
|
1242
|
+
};
|
|
1104
1243
|
for (const fn of functions) {
|
|
1105
1244
|
// Discovery already visits every expression. Preserve bodies without
|
|
1106
1245
|
// dispatch sites instead of rebuilding their entire typed IR tree on
|
|
@@ -2044,14 +2183,14 @@ export class ClassDynamicDispatch {
|
|
|
2044
2183
|
: expr.kind === "dynInvoke"
|
|
2045
2184
|
? expr
|
|
2046
2185
|
: null;
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2186
|
+
// Static methods matter only for methods no instance answers.
|
|
2187
|
+
const staticCandidates = (method) => [...this.boxedConstructors].some((name) => {
|
|
2188
|
+
const info = lowerer.classes.get(name);
|
|
2189
|
+
return info && findStaticOn(lowerer, info, method)?.method;
|
|
2190
|
+
});
|
|
2052
2191
|
if (!invoke ||
|
|
2053
2192
|
(candidates(invoke.method).length === 0 &&
|
|
2054
|
-
!staticCandidates &&
|
|
2193
|
+
!staticCandidates(invoke.method) &&
|
|
2055
2194
|
!(invoke.method === "toString" && lowerer.classes.has("%Error"))))
|
|
2056
2195
|
return expr;
|
|
2057
2196
|
const key = JSON.stringify([
|
|
@@ -2316,17 +2455,41 @@ export class ClassDynamicDispatch {
|
|
|
2316
2455
|
});
|
|
2317
2456
|
changed = true;
|
|
2318
2457
|
}
|
|
2319
|
-
|
|
2458
|
+
// Compute the candidates where the first plan would have, so the
|
|
2459
|
+
// memoized set is the same whichever plans are already answered.
|
|
2460
|
+
const plans = this.propertyReceivers(lowerer, true);
|
|
2461
|
+
const matching = plans.length ? candidateSet(dispatch.source.method) : null;
|
|
2462
|
+
for (const plan of plans) {
|
|
2320
2463
|
const { info } = plan;
|
|
2321
|
-
if (
|
|
2464
|
+
if (dispatch.classes.has(plan.key) || !matching.has(info))
|
|
2322
2465
|
continue;
|
|
2323
2466
|
dispatch.classes.add(plan.key);
|
|
2324
2467
|
const loc = dispatch.source.loc;
|
|
2325
|
-
const value = varRef("p.0", DYN, loc);
|
|
2326
2468
|
const { receiver, condition } = this.propertyReceiver(plan, loc);
|
|
2327
2469
|
if (isClassCallback(lowerer, info, dispatch.source.method)) {
|
|
2328
2470
|
const prototypeMethod = observedPrototypeMethod(lowerer, info, dispatch.source.method, loc, receiver);
|
|
2329
|
-
const bag = this.
|
|
2471
|
+
const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
|
|
2472
|
+
const methodKey = {
|
|
2473
|
+
kind: "strLit",
|
|
2474
|
+
value: dispatch.source.method,
|
|
2475
|
+
type: STRING,
|
|
2476
|
+
loc,
|
|
2477
|
+
};
|
|
2478
|
+
const bagHas = {
|
|
2479
|
+
kind: "libCall",
|
|
2480
|
+
fn: "dyn.hasKey",
|
|
2481
|
+
args: [bag, methodKey],
|
|
2482
|
+
type: BOOL,
|
|
2483
|
+
loc,
|
|
2484
|
+
};
|
|
2485
|
+
// An observed prototype slot answers through the bag when the bag
|
|
2486
|
+
// holds the name (own or through its prototype). A bag read as a
|
|
2487
|
+
// fresh empty object (an instance with no own dynamic properties
|
|
2488
|
+
// whose bag initializer predates the class's prototype data) does
|
|
2489
|
+
// not, so the method then comes from the class's prototype data.
|
|
2490
|
+
const prototype = prototypeMethod
|
|
2491
|
+
? classPrototypeData(lowerer, info, loc, receiver)
|
|
2492
|
+
: null;
|
|
2330
2493
|
dispatch.callback.body.unshift({
|
|
2331
2494
|
kind: "if",
|
|
2332
2495
|
cond: condition,
|
|
@@ -2335,18 +2498,7 @@ export class ClassDynamicDispatch {
|
|
|
2335
2498
|
kind: "return",
|
|
2336
2499
|
value: {
|
|
2337
2500
|
kind: "ternary",
|
|
2338
|
-
cond:
|
|
2339
|
-
? { kind: "boolLit", value: true, type: BOOL, loc }
|
|
2340
|
-
: {
|
|
2341
|
-
kind: "libCall",
|
|
2342
|
-
fn: "dyn.hasKey",
|
|
2343
|
-
args: [
|
|
2344
|
-
bag,
|
|
2345
|
-
{ kind: "strLit", value: dispatch.source.method, type: STRING, loc },
|
|
2346
|
-
],
|
|
2347
|
-
type: BOOL,
|
|
2348
|
-
loc,
|
|
2349
|
-
},
|
|
2501
|
+
cond: prototype ? { kind: "boolLit", value: true, type: BOOL, loc } : bagHas,
|
|
2350
2502
|
then: {
|
|
2351
2503
|
kind: "dynObjLit",
|
|
2352
2504
|
fields: [
|
|
@@ -2354,8 +2506,17 @@ export class ClassDynamicDispatch {
|
|
|
2354
2506
|
key: { kind: "strLit", value: "value", type: STRING, loc },
|
|
2355
2507
|
value: {
|
|
2356
2508
|
kind: "dynKeyGet",
|
|
2357
|
-
value:
|
|
2358
|
-
|
|
2509
|
+
value: prototype
|
|
2510
|
+
? {
|
|
2511
|
+
kind: "ternary",
|
|
2512
|
+
cond: bagHas,
|
|
2513
|
+
then: bag,
|
|
2514
|
+
else_: prototype,
|
|
2515
|
+
type: DYN,
|
|
2516
|
+
loc,
|
|
2517
|
+
}
|
|
2518
|
+
: bag,
|
|
2519
|
+
key: methodKey,
|
|
2359
2520
|
type: DYN,
|
|
2360
2521
|
loc,
|
|
2361
2522
|
},
|
|
@@ -2462,7 +2623,7 @@ export class ClassDynamicDispatch {
|
|
|
2462
2623
|
for (const plan of this.propertyReceivers(lowerer)) {
|
|
2463
2624
|
if (plan.info !== plan.capsule ||
|
|
2464
2625
|
dispatch.classes.has(plan.key) ||
|
|
2465
|
-
(!dispatch.field && !
|
|
2626
|
+
(!dispatch.field && !candidateSet(dispatch.method).has(plan.info)))
|
|
2466
2627
|
continue;
|
|
2467
2628
|
dispatch.classes.add(plan.key);
|
|
2468
2629
|
const loc = dispatch.fn.loc;
|
|
@@ -2545,28 +2706,52 @@ export class ClassDynamicDispatch {
|
|
|
2545
2706
|
});
|
|
2546
2707
|
changed = true;
|
|
2547
2708
|
}
|
|
2548
|
-
|
|
2709
|
+
// Only the receivers that declare or hold the name, and the rooted
|
|
2710
|
+
// ones, can pass the test, except for names it decides on every
|
|
2711
|
+
// receiver. Fields added while bodies lower (the property bag and the
|
|
2712
|
+
// attribute words) have compiler names, which take every receiver.
|
|
2713
|
+
const plans = this.propertyReceivers(lowerer, true);
|
|
2714
|
+
const anyReceiver = !isClassOwnEnumerableFieldName(dispatch.name) ||
|
|
2715
|
+
dispatch.name === "constructor" ||
|
|
2716
|
+
dispatch.name === "stack";
|
|
2717
|
+
const skips = (plan) => !isClassOwnEnumerableFieldName(dispatch.name) ||
|
|
2718
|
+
(!(plan.info.builtinStream !== undefined && streamProperty(dispatch.name)) &&
|
|
2719
|
+
!eventTargetInheritedMember(plan.info, dispatch.name) &&
|
|
2720
|
+
!dateInheritedMember(lowerer, plan.info, dispatch.name) &&
|
|
2721
|
+
!findMethodOn(lowerer, plan.info, dispatch.name) &&
|
|
2722
|
+
!findGenericMethodOn(lowerer, plan.info, dispatch.name) &&
|
|
2723
|
+
dispatch.name !== "constructor" &&
|
|
2724
|
+
!plan.info.fields.has(dispatch.name) &&
|
|
2725
|
+
!(dispatch.name === "stack" && lowerer.isSubclassOf(plan.info.def.name, "%Error")) &&
|
|
2726
|
+
!findMethodOn(lowerer, plan.info, `get:${dispatch.name}`) &&
|
|
2727
|
+
!findMethodOn(lowerer, plan.info, `set:${dispatch.name}`));
|
|
2728
|
+
const selected = anyReceiver ? plans : receiversFor(plans, dispatch.name, "members");
|
|
2729
|
+
if (CHECK_CANDIDATES &&
|
|
2730
|
+
plans.some((plan) => !dispatch.classes.has(plan.key) && !skips(plan) && !selected.includes(plan)))
|
|
2731
|
+
throw new InternalCompilerError(`indexed receivers for ${dispatch.name} differ`);
|
|
2732
|
+
for (const plan of selected) {
|
|
2549
2733
|
const { info } = plan;
|
|
2550
|
-
|
|
2551
|
-
(!(info.builtinStream !== undefined && streamProperty(dispatch.name)) &&
|
|
2552
|
-
!eventTargetInheritedMember(info, dispatch.name) &&
|
|
2553
|
-
!findMethodOn(lowerer, info, dispatch.name) &&
|
|
2554
|
-
!findGenericMethodOn(lowerer, info, dispatch.name) &&
|
|
2555
|
-
dispatch.name !== "constructor" &&
|
|
2556
|
-
!info.fields.has(dispatch.name) &&
|
|
2557
|
-
!(dispatch.name === "stack" && lowerer.isSubclassOf(info.def.name, "%Error")) &&
|
|
2558
|
-
!findMethodOn(lowerer, info, `get:${dispatch.name}`) &&
|
|
2559
|
-
!findMethodOn(lowerer, info, `set:${dispatch.name}`)))
|
|
2560
|
-
continue;
|
|
2734
|
+
// Classes answered in an earlier pass skip the member lookups.
|
|
2561
2735
|
if (dispatch.classes.has(plan.key))
|
|
2562
2736
|
continue;
|
|
2737
|
+
if (skips(plan))
|
|
2738
|
+
continue;
|
|
2563
2739
|
dispatch.classes.add(plan.key);
|
|
2564
2740
|
const loc = dispatch.fn.loc;
|
|
2565
2741
|
const { receiver, condition } = this.propertyReceiver(plan, loc);
|
|
2742
|
+
// The branch checks its receiver once: each use of the checked
|
|
2743
|
+
// receiver would repeat the check.
|
|
2744
|
+
const local = `receiver.${dispatch.fn.locals.length}`;
|
|
2745
|
+
dispatch.fn.locals.push({
|
|
2746
|
+
id: local,
|
|
2747
|
+
name: "receiver",
|
|
2748
|
+
type: receiver.type,
|
|
2749
|
+
mutable: false,
|
|
2750
|
+
});
|
|
2566
2751
|
const before = lowerer.diags.length;
|
|
2567
2752
|
let branch;
|
|
2568
2753
|
try {
|
|
2569
|
-
branch = this.propertyBody(lowerer, dispatch, info, receiver);
|
|
2754
|
+
branch = this.propertyBody(lowerer, dispatch, info, varRef(local, receiver.type, loc));
|
|
2570
2755
|
}
|
|
2571
2756
|
catch (error) {
|
|
2572
2757
|
if (!(error instanceof PoisonError) || !info.decl)
|
|
@@ -2579,7 +2764,7 @@ export class ClassDynamicDispatch {
|
|
|
2579
2764
|
dispatch.fn.body.unshift({
|
|
2580
2765
|
kind: "if",
|
|
2581
2766
|
cond: condition,
|
|
2582
|
-
then: branch,
|
|
2767
|
+
then: [{ kind: "varDecl", localId: local, init: receiver, loc }, ...branch],
|
|
2583
2768
|
else_: null,
|
|
2584
2769
|
loc,
|
|
2585
2770
|
});
|
|
@@ -2655,7 +2840,8 @@ export class ClassDynamicDispatch {
|
|
|
2655
2840
|
},
|
|
2656
2841
|
];
|
|
2657
2842
|
if (((info.builtinStream !== undefined && streamProperty(name)) ||
|
|
2658
|
-
eventTargetInheritedMember(info, name)
|
|
2843
|
+
eventTargetInheritedMember(info, name) ||
|
|
2844
|
+
dateInheritedMember(lowerer, info, name)) &&
|
|
2659
2845
|
dispatch.probe)
|
|
2660
2846
|
return [
|
|
2661
2847
|
{
|
|
@@ -2671,7 +2857,7 @@ export class ClassDynamicDispatch {
|
|
|
2671
2857
|
const prototypeMethod = !info.fields.has(name) && observedPrototypeMethod(lowerer, info, name, loc, receiver);
|
|
2672
2858
|
if (info.fields.has(name) || (dispatch.probe === "in" && !prototypeMethod)) {
|
|
2673
2859
|
if (info.fields.has(name) && info.def.tracksOwnFields) {
|
|
2674
|
-
const bag = this.
|
|
2860
|
+
const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
|
|
2675
2861
|
const symbol = symbolMemberKey(lowerer, info, name, loc);
|
|
2676
2862
|
const fn = dispatch.probe === "in"
|
|
2677
2863
|
? "dyn.hasKey"
|
|
@@ -2696,7 +2882,7 @@ export class ClassDynamicDispatch {
|
|
|
2696
2882
|
{ kind: "return", value: { kind: "boolLit", value: true, type: BOOL, loc }, loc },
|
|
2697
2883
|
];
|
|
2698
2884
|
}
|
|
2699
|
-
const bag = this.
|
|
2885
|
+
const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
|
|
2700
2886
|
const symbol = name.startsWith("sym:") || name.startsWith("%symbol:");
|
|
2701
2887
|
const fn = dispatch.probe === "in"
|
|
2702
2888
|
? "dyn.hasKey"
|
|
@@ -2762,9 +2948,8 @@ export class ClassDynamicDispatch {
|
|
|
2762
2948
|
}
|
|
2763
2949
|
const branches = [];
|
|
2764
2950
|
if (!dispatch.write && !dispatch.reflect && !info.def.tracksOwnFields) {
|
|
2765
|
-
const value = varRef("p.0", DYN, loc);
|
|
2766
2951
|
const key = varRef("p.key", DYN, loc);
|
|
2767
|
-
const bag = this.
|
|
2952
|
+
const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
|
|
2768
2953
|
branches.push({
|
|
2769
2954
|
kind: "if",
|
|
2770
2955
|
cond: {
|
|
@@ -2866,6 +3051,10 @@ export class ClassDynamicDispatch {
|
|
|
2866
3051
|
if (inherited)
|
|
2867
3052
|
for (const name of inherited)
|
|
2868
3053
|
names.add(name);
|
|
3054
|
+
if (dateRootOf(info))
|
|
3055
|
+
for (const name of DATE_PROTOTYPE_METHOD_NAMES)
|
|
3056
|
+
if (dateInheritedMember(lowerer, info, name))
|
|
3057
|
+
names.add(name);
|
|
2869
3058
|
for (let owner = info; owner; owner = owner.base) {
|
|
2870
3059
|
const methodNames = [...owner.methods.keys()];
|
|
2871
3060
|
if (owner.genericMethods)
|
|
@@ -3105,7 +3294,7 @@ export class ClassDynamicDispatch {
|
|
|
3105
3294
|
* each class branch as small as the storing form. */
|
|
3106
3295
|
readBagHas(lowerer, fn, bag, key, loc) {
|
|
3107
3296
|
const name = fn === "dyn.hasKey" ? "%dyn.class.bagHas" : "%dyn.class.bagHasComputed";
|
|
3108
|
-
let helper = lowerer.
|
|
3297
|
+
let helper = lowerer.liftedFnNamed(name);
|
|
3109
3298
|
if (!helper) {
|
|
3110
3299
|
const keyType = fn === "dyn.hasKey" ? STRING : DYN;
|
|
3111
3300
|
const value = varRef("p.0", DYN, loc);
|
|
@@ -3498,6 +3687,66 @@ export class ClassDynamicDispatch {
|
|
|
3498
3687
|
];
|
|
3499
3688
|
return { kind: "if", cond: condition, then: body, else_: null, loc };
|
|
3500
3689
|
}
|
|
3690
|
+
// Date.prototype[Symbol.toPrimitive] takes "default" as "string", and a
|
|
3691
|
+
// class declared `extends Date` inherits Date's toString and valueOf,
|
|
3692
|
+
// which answer primitives from the time value.
|
|
3693
|
+
const dateRoot = dateRootOf(info);
|
|
3694
|
+
if (dateRoot) {
|
|
3695
|
+
const dateOrder = hint === "number" ? ["valueOf", "toString"] : ["toString", "valueOf"];
|
|
3696
|
+
const { receiver } = this.propertyReceiver(plan, loc);
|
|
3697
|
+
const body = [];
|
|
3698
|
+
for (const method of dateOrder) {
|
|
3699
|
+
if (!conversionMethod(lowerer, info, method)) {
|
|
3700
|
+
const time = {
|
|
3701
|
+
kind: "fieldGet",
|
|
3702
|
+
obj: upcastTo(lowerer, receiver, dateRoot.def.name),
|
|
3703
|
+
className: dateRoot.def.name,
|
|
3704
|
+
field: DATE_TIME_FIELD,
|
|
3705
|
+
type: DATE_T,
|
|
3706
|
+
loc,
|
|
3707
|
+
};
|
|
3708
|
+
body.push({
|
|
3709
|
+
kind: "return",
|
|
3710
|
+
value: lowerer.coerceToExpected(dateValueMethod(method, time, loc), DYN),
|
|
3711
|
+
loc,
|
|
3712
|
+
});
|
|
3713
|
+
break;
|
|
3714
|
+
}
|
|
3715
|
+
const result = `%toPrimitive.${method}.${helper.locals.length}`;
|
|
3716
|
+
helper.locals.push({ id: result, name: method, type: DYN, mutable: false });
|
|
3717
|
+
body.push({
|
|
3718
|
+
kind: "varDecl",
|
|
3719
|
+
localId: result,
|
|
3720
|
+
init: {
|
|
3721
|
+
kind: "call",
|
|
3722
|
+
callee: this.toPrimitiveCall(lowerer, plan, method, 0, loc),
|
|
3723
|
+
args: [varRef("p.0", DYN, loc)],
|
|
3724
|
+
type: DYN,
|
|
3725
|
+
loc,
|
|
3726
|
+
},
|
|
3727
|
+
loc,
|
|
3728
|
+
}, {
|
|
3729
|
+
kind: "if",
|
|
3730
|
+
cond: isPrimitive(varRef(result, DYN, loc), loc),
|
|
3731
|
+
then: [{ kind: "return", value: varRef(result, DYN, loc), loc }],
|
|
3732
|
+
else_: null,
|
|
3733
|
+
loc,
|
|
3734
|
+
});
|
|
3735
|
+
}
|
|
3736
|
+
if (body.at(-1)?.kind !== "return")
|
|
3737
|
+
body.push({
|
|
3738
|
+
kind: "return",
|
|
3739
|
+
value: nodeThrowExpr(1, "", "Cannot convert object to primitive value", DYN, loc),
|
|
3740
|
+
loc,
|
|
3741
|
+
});
|
|
3742
|
+
return {
|
|
3743
|
+
kind: "if",
|
|
3744
|
+
cond: this.propertyReceiver(plan, loc).condition,
|
|
3745
|
+
then: body,
|
|
3746
|
+
else_: null,
|
|
3747
|
+
loc,
|
|
3748
|
+
};
|
|
3749
|
+
}
|
|
3501
3750
|
const order = hint === "string" ? ["toString", "valueOf"] : ["valueOf", "toString"];
|
|
3502
3751
|
if (!order.some((method) => conversionMethod(lowerer, info, method)))
|
|
3503
3752
|
return null;
|
|
@@ -3665,7 +3914,7 @@ export class ClassDynamicDispatch {
|
|
|
3665
3914
|
readPropertyBagOrEmpty(lowerer, receiver, loc) {
|
|
3666
3915
|
// One call per read site: large JS programs have a branch per class and
|
|
3667
3916
|
// property, so the absent-bag handling lives in the shared helper.
|
|
3668
|
-
let helper = lowerer.
|
|
3917
|
+
let helper = lowerer.liftedFnNamed(READ_PROPERTIES_OR_EMPTY);
|
|
3669
3918
|
if (!helper) {
|
|
3670
3919
|
// Settled by finalize; until then, the read-only bag's own dispatch.
|
|
3671
3920
|
helper = {
|
|
@@ -3752,6 +4001,86 @@ export class ClassDynamicDispatch {
|
|
|
3752
4001
|
lowerer.liftedFns.push(helper);
|
|
3753
4002
|
return helper;
|
|
3754
4003
|
}
|
|
4004
|
+
/** The read-only bag a class branch reads for its receiver: the
|
|
4005
|
+
* receiver's own field when the branch selected the receiver's exact
|
|
4006
|
+
* class, otherwise the dispatch over every class (readPropertyBag, or
|
|
4007
|
+
* readPropertyBagOrEmpty with `orEmpty`). */
|
|
4008
|
+
branchPropertyBag(lowerer, info, receiver, orEmpty, loc) {
|
|
4009
|
+
const helper = this.exactPropertyBag(lowerer, info, receiver, orEmpty, loc);
|
|
4010
|
+
if (helper)
|
|
4011
|
+
return { kind: "call", callee: helper.name, args: [receiver], type: DYN, loc };
|
|
4012
|
+
return orEmpty
|
|
4013
|
+
? this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc)
|
|
4014
|
+
: this.readPropertyBag(lowerer, receiver, loc);
|
|
4015
|
+
}
|
|
4016
|
+
/** `%class.branchProperties[OrEmpty]:<class>(receiver)`: the read-only bag of
|
|
4017
|
+
* an instance of exactly `info`. A class branch of the dispatch helpers
|
|
4018
|
+
* selects a canonical receiver (normalizeDispatches gives an instance its
|
|
4019
|
+
* actual class's capsule), so its branch for `info` sees only instances
|
|
4020
|
+
* of `info`; instances of its subclasses take their own branches. Such a
|
|
4021
|
+
* receiver needs neither the dispatch over every class nor a boxed copy of
|
|
4022
|
+
* itself. Null
|
|
4023
|
+
* when `receiver` is not typed as `info`, when a runtime or builtin class
|
|
4024
|
+
* in the family keeps its own property contract, or before the class has
|
|
4025
|
+
* a bag. */
|
|
4026
|
+
exactPropertyBag(lowerer, info, receiver, orEmpty, loc) {
|
|
4027
|
+
const type = receiver.type;
|
|
4028
|
+
if (type.kind !== "object" || type.className !== info.def.name)
|
|
4029
|
+
return null;
|
|
4030
|
+
for (let current = info; current; current = current.base)
|
|
4031
|
+
if (current.def.runtime ||
|
|
4032
|
+
current.builtinEmitter ||
|
|
4033
|
+
current.builtinStream ||
|
|
4034
|
+
current.builtinError)
|
|
4035
|
+
return null;
|
|
4036
|
+
const key = `${type.className}:${orEmpty}`;
|
|
4037
|
+
const existing = this.exactPropertyBags.get(key);
|
|
4038
|
+
if (existing)
|
|
4039
|
+
return existing;
|
|
4040
|
+
const initializers = this.bagInitializers.get(type.className);
|
|
4041
|
+
if (!initializers)
|
|
4042
|
+
return null;
|
|
4043
|
+
const self = varRef("p.0", type, loc);
|
|
4044
|
+
const bag = {
|
|
4045
|
+
kind: "fieldGet",
|
|
4046
|
+
obj: self,
|
|
4047
|
+
className: type.className,
|
|
4048
|
+
field: PROPERTY_BAG,
|
|
4049
|
+
type: DYN,
|
|
4050
|
+
loc,
|
|
4051
|
+
};
|
|
4052
|
+
const initialize = {
|
|
4053
|
+
...initializers[0],
|
|
4054
|
+
obj: self,
|
|
4055
|
+
value: withTypedReceiver(initializers[0].value, self),
|
|
4056
|
+
loc,
|
|
4057
|
+
};
|
|
4058
|
+
const helper = {
|
|
4059
|
+
name: `%class.branchProperties${orEmpty ? "OrEmpty" : ""}:${type.className}`,
|
|
4060
|
+
params: [{ localId: "p.0", name: "value", type }],
|
|
4061
|
+
returnType: DYN,
|
|
4062
|
+
locals: [{ id: "p.0", name: "value", type, mutable: false }],
|
|
4063
|
+
loc,
|
|
4064
|
+
body: [
|
|
4065
|
+
{
|
|
4066
|
+
kind: "if",
|
|
4067
|
+
cond: { kind: "dynTest", test: "undefined", value: bag, type: BOOL, loc },
|
|
4068
|
+
then: [initialize],
|
|
4069
|
+
else_: null,
|
|
4070
|
+
loc,
|
|
4071
|
+
},
|
|
4072
|
+
{ kind: "return", value: bag, loc },
|
|
4073
|
+
],
|
|
4074
|
+
};
|
|
4075
|
+
// Initializers gain their prototype as subclasses become constructible;
|
|
4076
|
+
// finalize then turns the lazy store into the read's result.
|
|
4077
|
+
initializers.push(initialize);
|
|
4078
|
+
this.exactPropertyBags.set(key, helper);
|
|
4079
|
+
this.readPropertyBags.push({ helper, initialize, orEmpty });
|
|
4080
|
+
this.generated.add(helper);
|
|
4081
|
+
lowerer.liftedFns.push(helper);
|
|
4082
|
+
return helper;
|
|
4083
|
+
}
|
|
3755
4084
|
/** The prototype a new property bag of `current` (or of the subclass the
|
|
3756
4085
|
* receiver is) starts from, or null when `current` has no prototype data.
|
|
3757
4086
|
* A class with constructible subclasses that have prototype data selects
|
|
@@ -3826,9 +4155,13 @@ export class ClassDynamicDispatch {
|
|
|
3826
4155
|
* prototype-backed bag is produced for this read only. A published object
|
|
3827
4156
|
* cannot take the store, and Node's reads never write. */
|
|
3828
4157
|
finalize(lowerer) {
|
|
3829
|
-
|
|
4158
|
+
// Each table serves every site that reaches it.
|
|
4159
|
+
if (lowerer)
|
|
4160
|
+
for (const fn of this.generated)
|
|
4161
|
+
lowerer.shareHelper(fn);
|
|
4162
|
+
for (const { helper, initialize, orEmpty } of this.readPropertyBags) {
|
|
3830
4163
|
const absent = helper.body[0];
|
|
3831
|
-
if (isEmptyBag(initialize.value))
|
|
4164
|
+
if (isEmptyBag(initialize.value) && !orEmpty)
|
|
3832
4165
|
helper.body.shift();
|
|
3833
4166
|
else if (absent?.kind === "if")
|
|
3834
4167
|
absent.then = [{ kind: "return", value: initialize.value, loc: initialize.loc }];
|
|
@@ -3997,21 +4330,43 @@ export class ClassDynamicDispatch {
|
|
|
3997
4330
|
};
|
|
3998
4331
|
add(root);
|
|
3999
4332
|
}
|
|
4333
|
+
/** propertyReceivers results by mode, with the class graph they were
|
|
4334
|
+
* computed from: the boxed classes, the registered classes, the subclass
|
|
4335
|
+
* links and the constructed classes only grow, so equal counts and the
|
|
4336
|
+
* same capsules give the same plans. */
|
|
4337
|
+
receiverPlans = new Map();
|
|
4000
4338
|
/** A capsule retains its static type, while its object may be a subclass.
|
|
4001
4339
|
* Preorder insertion lets later branches test the most derived layout first. */
|
|
4002
4340
|
propertyReceivers(lowerer, streams = false, normalize = true) {
|
|
4341
|
+
const mode = `${streams}:${normalize}`;
|
|
4342
|
+
const revision = `${this.boxed.size}:${lowerer.classes.size}:${lowerer.subclassLinks}:${lowerer.constructedClassCount()}`;
|
|
4343
|
+
const cached = this.receiverPlans.get(mode);
|
|
4344
|
+
if (cached?.revision === revision) {
|
|
4345
|
+
let i = 0;
|
|
4346
|
+
let same = true;
|
|
4347
|
+
for (const name of this.boxed)
|
|
4348
|
+
if (lowerer.classes.get(name) !== cached.capsules[i++])
|
|
4349
|
+
same = false;
|
|
4350
|
+
if (same)
|
|
4351
|
+
return cached.plans;
|
|
4352
|
+
}
|
|
4353
|
+
const capsules = [];
|
|
4003
4354
|
const plans = [];
|
|
4004
4355
|
const seen = new Set();
|
|
4005
4356
|
for (const name of this.boxed) {
|
|
4006
4357
|
const capsule = lowerer.classes.get(name);
|
|
4358
|
+
capsules.push(capsule);
|
|
4007
4359
|
if (!capsule ||
|
|
4008
4360
|
((capsule.builtinEmitter || capsule.builtinStream) && !streams) ||
|
|
4009
4361
|
capsule.builtinError)
|
|
4010
4362
|
continue;
|
|
4011
4363
|
const canonical = normalize && !capsule.builtinStream && !capsule.builtinEmitter;
|
|
4012
4364
|
const visit = (info) => {
|
|
4013
|
-
|
|
4014
|
-
|
|
4365
|
+
// A seen class was visited with its whole subtree, and a canonical
|
|
4366
|
+
// visit adds no plan for a seen class.
|
|
4367
|
+
if (canonical && seen.has(info.def.name))
|
|
4368
|
+
return;
|
|
4369
|
+
if (info === capsule || lowerer.classCanBeConstructed(info)) {
|
|
4015
4370
|
seen.add(info.def.name);
|
|
4016
4371
|
plans.push({
|
|
4017
4372
|
info,
|
|
@@ -4024,6 +4379,7 @@ export class ClassDynamicDispatch {
|
|
|
4024
4379
|
};
|
|
4025
4380
|
visit(capsule);
|
|
4026
4381
|
}
|
|
4382
|
+
this.receiverPlans.set(mode, { revision, capsules, plans });
|
|
4027
4383
|
return plans;
|
|
4028
4384
|
}
|
|
4029
4385
|
propertyReceiver(plan, loc) {
|
|
@@ -4204,9 +4560,11 @@ export class ClassDynamicDispatch {
|
|
|
4204
4560
|
propertyBody(lowerer, dispatch, info, receiver) {
|
|
4205
4561
|
const { name, write } = dispatch;
|
|
4206
4562
|
const loc = dispatch.fn.loc;
|
|
4207
|
-
// The inherited EventTarget/Event members of a subclass instance
|
|
4208
|
-
//
|
|
4209
|
-
|
|
4563
|
+
// The inherited EventTarget/Event members of a subclass instance, and
|
|
4564
|
+
// the inherited Date methods of an instance of a class declared
|
|
4565
|
+
// `extends Date`: the runtime's capsule view answers the accessors and
|
|
4566
|
+
// method values.
|
|
4567
|
+
if (eventTargetInheritedMember(info, name) || dateInheritedMember(lowerer, info, name)) {
|
|
4210
4568
|
const key = { kind: "strLit", value: name, type: STRING, loc };
|
|
4211
4569
|
if (!write)
|
|
4212
4570
|
return [
|
|
@@ -4348,7 +4706,7 @@ export class ClassDynamicDispatch {
|
|
|
4348
4706
|
},
|
|
4349
4707
|
{
|
|
4350
4708
|
kind: "if",
|
|
4351
|
-
cond: this.readBagHas(lowerer, "dyn.hasKey", this.
|
|
4709
|
+
cond: this.readBagHas(lowerer, "dyn.hasKey", this.branchPropertyBag(lowerer, info, receiver, false, loc), key, loc),
|
|
4352
4710
|
then: [store],
|
|
4353
4711
|
else_: null,
|
|
4354
4712
|
loc,
|
|
@@ -4360,7 +4718,7 @@ export class ClassDynamicDispatch {
|
|
|
4360
4718
|
{ kind: "return", value: null, loc },
|
|
4361
4719
|
];
|
|
4362
4720
|
}
|
|
4363
|
-
const bag = this.
|
|
4721
|
+
const bag = this.branchPropertyBag(lowerer, info, receiver, false, loc);
|
|
4364
4722
|
return [
|
|
4365
4723
|
{
|
|
4366
4724
|
kind: "return",
|
|
@@ -4418,7 +4776,7 @@ export class ClassDynamicDispatch {
|
|
|
4418
4776
|
!info.classDecorators) {
|
|
4419
4777
|
this.constructors.set(info.def.name, info);
|
|
4420
4778
|
const cls = lowerer.coerceToExpected(classValueRef(lowerer, info, info.decl), DYN);
|
|
4421
|
-
const bag = this.
|
|
4779
|
+
const bag = this.branchPropertyBag(lowerer, info, receiver, false, loc);
|
|
4422
4780
|
const key = { kind: "strLit", value: name, type: STRING, loc };
|
|
4423
4781
|
return [
|
|
4424
4782
|
{
|
|
@@ -4489,7 +4847,7 @@ export class ClassDynamicDispatch {
|
|
|
4489
4847
|
if (symbol || (isClassOwnEnumerableFieldName(name) && !name.startsWith("sym:"))) {
|
|
4490
4848
|
const prototypeMethod = observedPrototypeMethod(lowerer, info, name, loc, receiver);
|
|
4491
4849
|
// Selecting the method must not give the object own storage.
|
|
4492
|
-
const bag = this.
|
|
4850
|
+
const bag = this.branchPropertyBag(lowerer, info, receiver, false, loc);
|
|
4493
4851
|
const key = symbol ?? { kind: "strLit", value: name, type: STRING, loc };
|
|
4494
4852
|
body.push({
|
|
4495
4853
|
kind: "if",
|
|
@@ -4550,7 +4908,7 @@ export class ClassDynamicDispatch {
|
|
|
4550
4908
|
}
|
|
4551
4909
|
if (!field && !accessor) {
|
|
4552
4910
|
const instance = lowerer.coerceToExpected(receiver, DYN);
|
|
4553
|
-
const bag = this.
|
|
4911
|
+
const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
|
|
4554
4912
|
const key = { kind: "strLit", value: name, type: STRING, loc };
|
|
4555
4913
|
const own = {
|
|
4556
4914
|
kind: "libCall",
|
|
@@ -4598,7 +4956,7 @@ export class ClassDynamicDispatch {
|
|
|
4598
4956
|
if (boxed.kind === "dynFrom" && mutable(boxed.value.type))
|
|
4599
4957
|
boxed.liveRef = true;
|
|
4600
4958
|
if (accessor) {
|
|
4601
|
-
const bag = this.
|
|
4959
|
+
const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
|
|
4602
4960
|
const key = { kind: "strLit", value: name, type: STRING, loc };
|
|
4603
4961
|
return [
|
|
4604
4962
|
{
|
|
@@ -4625,7 +4983,7 @@ export class ClassDynamicDispatch {
|
|
|
4625
4983
|
}
|
|
4626
4984
|
if (field && info.def.tracksOwnFields) {
|
|
4627
4985
|
const instance = lowerer.coerceToExpected(receiver, DYN);
|
|
4628
|
-
const bag = this.
|
|
4986
|
+
const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
|
|
4629
4987
|
const symbol = symbolMemberKey(lowerer, info, name, loc);
|
|
4630
4988
|
const key = symbol ?? { kind: "strLit", value: name, type: STRING, loc };
|
|
4631
4989
|
return [
|
|
@@ -4730,6 +5088,50 @@ export class ClassDynamicDispatch {
|
|
|
4730
5088
|
};
|
|
4731
5089
|
return [store, { kind: "return", value: null, loc }];
|
|
4732
5090
|
}
|
|
5091
|
+
/** EventEmitter.prototype's introspection and bookkeeping members on an
|
|
5092
|
+
* emitter seen through an untyped value: Node's results over the native
|
|
5093
|
+
* listener registry. */
|
|
5094
|
+
emitterIntrospection(lowerer, dispatch, receiver) {
|
|
5095
|
+
const { method, loc } = dispatch.source;
|
|
5096
|
+
const incoming = dispatch.source.args.map((_, i) => varRef(`p.${i + 1}`, DYN, loc));
|
|
5097
|
+
const ret = (value) => [
|
|
5098
|
+
{ kind: "return", value: lowerer.coerceToExpected(value, DYN), loc },
|
|
5099
|
+
];
|
|
5100
|
+
const call = (fn, args, type) => ({
|
|
5101
|
+
kind: "libCall",
|
|
5102
|
+
fn,
|
|
5103
|
+
args: [receiver, ...args],
|
|
5104
|
+
type,
|
|
5105
|
+
loc,
|
|
5106
|
+
});
|
|
5107
|
+
// Node indexes _events with the argument itself: an omitted name is
|
|
5108
|
+
// the key "undefined".
|
|
5109
|
+
const eventName = () => incoming.length
|
|
5110
|
+
? lowerer.coerceToExpected(incoming[0], STRING)
|
|
5111
|
+
: { kind: "strLit", value: "undefined", type: STRING, loc };
|
|
5112
|
+
switch (method) {
|
|
5113
|
+
case "listenerCount":
|
|
5114
|
+
return ret(incoming.length >= 2
|
|
5115
|
+
? call("emitter.countDyn", [eventName(), incoming[1]], F64)
|
|
5116
|
+
: call("emitter.count", [eventName()], F64));
|
|
5117
|
+
case "eventNames":
|
|
5118
|
+
return ret(call("emitter.names", [], { kind: "array", elem: STRING }));
|
|
5119
|
+
case "removeAllListeners":
|
|
5120
|
+
return ret(incoming.length
|
|
5121
|
+
? call("emitter.removeAll", [eventName(), { kind: "boolLit", value: false, type: BOOL, loc }], receiver.type)
|
|
5122
|
+
: call("emitter.removeAll", [
|
|
5123
|
+
{ kind: "strLit", value: "", type: STRING, loc },
|
|
5124
|
+
{ kind: "boolLit", value: true, type: BOOL, loc },
|
|
5125
|
+
], receiver.type));
|
|
5126
|
+
case "listeners":
|
|
5127
|
+
case "rawListeners":
|
|
5128
|
+
return ret(call("emitter.listenersDyn", [eventName()], DYN));
|
|
5129
|
+
case "setMaxListeners":
|
|
5130
|
+
return ret(call("emitter.setMaxChk", [incoming[0] ?? dynUndefinedExpr(loc)], receiver.type));
|
|
5131
|
+
default:
|
|
5132
|
+
return ret(call("emitter.getMax", [], F64));
|
|
5133
|
+
}
|
|
5134
|
+
}
|
|
4733
5135
|
methodBody(lowerer, dispatch, info, receiver) {
|
|
4734
5136
|
const { method, loc } = dispatch.source;
|
|
4735
5137
|
const fence = () => [
|
|
@@ -4740,6 +5142,12 @@ export class ClassDynamicDispatch {
|
|
|
4740
5142
|
loc,
|
|
4741
5143
|
},
|
|
4742
5144
|
];
|
|
5145
|
+
if (emitterRooted(lowerer, info) &&
|
|
5146
|
+
!streamRooted(info) &&
|
|
5147
|
+
EMITTER_INTROSPECTION_METHODS.has(method) &&
|
|
5148
|
+
!findMethodOn(lowerer, info, method)) {
|
|
5149
|
+
return this.emitterIntrospection(lowerer, dispatch, receiver);
|
|
5150
|
+
}
|
|
4743
5151
|
if (info.builtinStream ||
|
|
4744
5152
|
(emitterRooted(lowerer, info) &&
|
|
4745
5153
|
EMITTER_METHODS.has(method) &&
|
|
@@ -4759,10 +5167,14 @@ export class ClassDynamicDispatch {
|
|
|
4759
5167
|
if (method === "emit") {
|
|
4760
5168
|
if (!incoming.length)
|
|
4761
5169
|
return fence();
|
|
4762
|
-
|
|
5170
|
+
const event = lowerer.coerceToExpected(incoming[0], STRING);
|
|
5171
|
+
const bridged = streamRooted(info)
|
|
5172
|
+
? null
|
|
5173
|
+
: lowerDynamicEmitterEmit(lowerer, receiver, event, incoming.slice(1), loc);
|
|
5174
|
+
return ret(bridged ?? {
|
|
4763
5175
|
kind: "libCall",
|
|
4764
|
-
fn: "emitter.
|
|
4765
|
-
args: [receiver,
|
|
5176
|
+
fn: "emitter.emitAny",
|
|
5177
|
+
args: [receiver, event, ...incoming.slice(1)],
|
|
4766
5178
|
type: BOOL,
|
|
4767
5179
|
loc,
|
|
4768
5180
|
});
|
|
@@ -4772,6 +5184,11 @@ export class ClassDynamicDispatch {
|
|
|
4772
5184
|
return fence();
|
|
4773
5185
|
const event = lowerer.coerceToExpected(incoming[0], STRING);
|
|
4774
5186
|
const cb = incoming[1];
|
|
5187
|
+
const bridged = registering && !streamRooted(info)
|
|
5188
|
+
? lowerDynamicEmitterOn(lowerer, receiver, event, cb, method === "once" || method === "prependOnceListener", method.startsWith("prepend"), loc)
|
|
5189
|
+
: null;
|
|
5190
|
+
if (bridged)
|
|
5191
|
+
return ret(bridged);
|
|
4775
5192
|
return [
|
|
4776
5193
|
{
|
|
4777
5194
|
kind: "exprStmt",
|
|
@@ -4783,7 +5200,7 @@ export class ClassDynamicDispatch {
|
|
|
4783
5200
|
fn: registering
|
|
4784
5201
|
? info.builtinStream
|
|
4785
5202
|
? "stream.onDyn"
|
|
4786
|
-
: "emitter.
|
|
5203
|
+
: "emitter.onAny"
|
|
4787
5204
|
: "emitter.offDyn",
|
|
4788
5205
|
args: [
|
|
4789
5206
|
receiver,
|