@scriptc/compiler 0.4.4 → 0.4.5
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 +198 -44
- package/ambient/scriptc-overrides.d.ts +21 -0
- package/dist/backend/executable-features.js +3 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/library-pack.js +2 -1
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/linker.js +11 -1
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/lld.d.ts +9 -0
- package/dist/backend/lld.js +48 -0
- package/dist/backend/lld.js.map +1 -0
- package/dist/backend/lld.test.d.ts +1 -0
- package/dist/backend/lld.test.js +53 -0
- package/dist/backend/lld.test.js.map +1 -0
- package/dist/backend/llvm/appended-array-literals.d.ts +11 -1
- package/dist/backend/llvm/appended-array-literals.js +29 -0
- package/dist/backend/llvm/appended-array-literals.js.map +1 -1
- package/dist/backend/llvm/blocks.js +10 -1
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +13 -4
- package/dist/backend/llvm/bytes-alias.js +16 -5
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-bounds.d.ts +5 -1
- package/dist/backend/llvm/bytes-bounds.js +199 -2
- package/dist/backend/llvm/bytes-bounds.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +45 -3
- package/dist/backend/llvm/bytes-loop-versions.js +238 -20
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +11 -4
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.d.ts +8 -2
- package/dist/backend/llvm/call-lifetimes.js +87 -18
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +132 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +3 -2
- package/dist/backend/llvm/classes.js +4 -4
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +14 -2
- package/dist/backend/llvm/counted-loops.js +54 -5
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/debug-info.d.ts +42 -1
- package/dist/backend/llvm/debug-info.js +70 -1
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.js +2 -2
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +1 -0
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +65 -8
- package/dist/backend/llvm/dyn.js +375 -40
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +28 -8
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-journal.d.ts +8 -4
- package/dist/backend/llvm/emit-journal.js +75 -5
- package/dist/backend/llvm/emit-journal.js.map +1 -1
- package/dist/backend/llvm/emit-module.d.ts +4 -0
- package/dist/backend/llvm/emit-module.js +58 -23
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.js +297 -28
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +134 -13
- package/dist/backend/llvm/emitter.js +514 -87
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +6 -4
- package/dist/backend/llvm/expr-bytes.js +31 -8
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +13 -11
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +11 -0
- package/dist/backend/llvm/expr-containers.js +87 -9
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +3 -0
- package/dist/backend/llvm/expr-control.js +83 -0
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.d.ts +1 -1
- package/dist/backend/llvm/expr-dynamic.js +22 -4
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +107 -9
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +95 -22
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/forked-analysis.d.ts +8 -0
- package/dist/backend/llvm/forked-analysis.js +43 -0
- package/dist/backend/llvm/forked-analysis.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +7 -0
- package/dist/backend/llvm/integer-values.js +42 -2
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/integer-views.d.ts +2 -1
- package/dist/backend/llvm/integer-views.js +12 -1
- package/dist/backend/llvm/integer-views.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +4 -0
- package/dist/backend/llvm/js-ic.js +133 -15
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/layouts.d.ts +1 -0
- package/dist/backend/llvm/layouts.js.map +1 -1
- package/dist/backend/llvm/lazy-captures.d.ts +6 -1
- package/dist/backend/llvm/lazy-captures.js +10 -5
- package/dist/backend/llvm/lazy-captures.js.map +1 -1
- package/dist/backend/llvm/lib-abi.d.ts +5 -0
- package/dist/backend/llvm/lib-abi.js +19 -0
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +128 -42
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.d.ts +10 -0
- package/dist/backend/llvm/lib-filesystem.js +32 -0
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +2 -2
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +2 -0
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +11 -0
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +43 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +28 -3
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +2 -1
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/loop-array-borrows.d.ts +4 -1
- package/dist/backend/llvm/loop-array-borrows.js +11 -5
- package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
- package/dist/backend/llvm/map-entry-fusion.d.ts +5 -3
- package/dist/backend/llvm/map-entry-fusion.js +20 -11
- package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
- package/dist/backend/llvm/map-entry-fusion.test.js +14 -6
- package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +16 -6
- package/dist/backend/llvm/map-number-lookup.js +41 -9
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +70 -2
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.d.ts +25 -2
- package/dist/backend/llvm/map-read-lifetimes.js +136 -6
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +8 -3
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +5 -0
- package/dist/backend/llvm/nullable-unions.js +29 -2
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.test.js +25 -1
- package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
- package/dist/backend/llvm/record-union-keys.test.d.ts +1 -0
- package/dist/backend/llvm/record-union-keys.test.js +161 -0
- package/dist/backend/llvm/record-union-keys.test.js.map +1 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +4 -5
- package/dist/backend/llvm/shapes.js +104 -51
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +14 -2
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +50 -3
- package/dist/backend/llvm/speculative-integers.js +411 -24
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.test.js +103 -1
- package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
- package/dist/backend/llvm/split.d.ts +10 -1
- package/dist/backend/llvm/split.js +243 -59
- package/dist/backend/llvm/split.js.map +1 -1
- package/dist/backend/llvm/split.test.js +92 -13
- package/dist/backend/llvm/split.test.js.map +1 -1
- package/dist/backend/llvm/stack-objects.test.js +3 -2
- package/dist/backend/llvm/stack-objects.test.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +13 -0
- package/dist/backend/llvm/string-reads.js +22 -0
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/string-slices.d.ts +36 -2
- package/dist/backend/llvm/string-slices.js +308 -12
- package/dist/backend/llvm/string-slices.js.map +1 -1
- package/dist/backend/llvm/string-slices.test.js +182 -3
- package/dist/backend/llvm/string-slices.test.js.map +1 -1
- package/dist/backend/llvm/string-unit-versions.d.ts +11 -0
- package/dist/backend/llvm/string-unit-versions.js +191 -0
- package/dist/backend/llvm/string-unit-versions.js.map +1 -0
- package/dist/backend/llvm/string-unit-versions.test.d.ts +1 -0
- package/dist/backend/llvm/string-unit-versions.test.js +117 -0
- package/dist/backend/llvm/string-unit-versions.test.js.map +1 -0
- package/dist/backend/llvm/test-boxed-unions.d.ts +5 -2
- package/dist/backend/llvm/test-boxed-unions.js +24 -8
- package/dist/backend/llvm/test-boxed-unions.js.map +1 -1
- package/dist/backend/llvm/unwind-abi.d.ts +52 -0
- package/dist/backend/llvm/unwind-abi.js +498 -0
- package/dist/backend/llvm/unwind-abi.js.map +1 -0
- package/dist/backend/llvm/unwind-abi.test.d.ts +1 -0
- package/dist/backend/llvm/unwind-abi.test.js +255 -0
- package/dist/backend/llvm/unwind-abi.test.js.map +1 -0
- package/dist/backend/llvm/wrapping-sums.d.ts +14 -10
- package/dist/backend/llvm/wrapping-sums.js +31 -14
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/loop-polls.d.ts +6 -0
- package/dist/backend/loop-polls.js +24 -0
- package/dist/backend/loop-polls.js.map +1 -1
- package/dist/backend/may-throw.js +8 -8
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +12 -2
- package/dist/backend/native/executable.js +48 -6
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +4 -3
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/program-shards.d.ts +2 -2
- package/dist/backend/native/program-shards.js +2 -2
- package/dist/backend/native/program-shards.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +4 -1
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native/vendor.d.ts +1 -1
- package/dist/backend/native/vendor.js +1 -1
- package/dist/backend/native/vendor.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +3 -1
- package/dist/backend/native-codegen.js +4 -3
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +8 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-profile.d.ts +14 -0
- package/dist/backend/native-profile.js +28 -0
- package/dist/backend/native-profile.js.map +1 -1
- package/dist/backend/native-profile.test.js +8 -1
- package/dist/backend/native-profile.test.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +11 -11
- package/dist/backend/native-toolchain.test.js.map +1 -1
- 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 +3 -1
- package/dist/backend/runtime-pack-core.js +2 -0
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.d.ts +17 -5
- package/dist/backend/runtime-pack-native.js +186 -14
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-native.test.js +160 -3
- package/dist/backend/runtime-pack-native.test.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +2 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +2 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/vendor-archives.d.ts +4 -1
- package/dist/backend/vendor-archives.js +78 -4
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +3 -1
- package/dist/backend/vendor-inputs.js +3 -1
- package/dist/backend/vendor-inputs.js.map +1 -1
- package/dist/backend/warm-cache.js +1 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +78 -11
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +22 -1
- package/dist/cli/usage.js +33 -3
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.d.ts +15 -6
- package/dist/compat/fetch-profile.js +519 -498
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +7 -0
- package/dist/contracts/int32-elements.js +2 -1
- package/dist/contracts/int32-elements.js.map +1 -1
- package/dist/coverage/report.d.ts +14 -3
- package/dist/coverage/report.js +216 -0
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +25 -25
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +2 -0
- package/dist/coverage/verdict-cache.js +10 -1
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +19 -0
- package/dist/diagnostics/diagnostic.js +52 -1
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +54 -0
- package/dist/diagnostics/envelope.js +7 -1
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/diagnostics/render.d.ts +7 -0
- package/dist/diagnostics/render.js +15 -4
- package/dist/diagnostics/render.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +3 -0
- package/dist/executable/executable-cache.js +1 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +1 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +5 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +26 -2
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/fork-target.js +67 -1
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/fork-target.test.js +43 -0
- package/dist/frontend/fork-target.test.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +4 -1
- package/dist/frontend/input-tracker.js +42 -4
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +45 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lowering/abstract-equality.js +38 -1
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/argument-counts.d.ts +36 -0
- package/dist/frontend/lowering/argument-counts.js +201 -0
- package/dist/frontend/lowering/argument-counts.js.map +1 -0
- package/dist/frontend/lowering/array-values.d.ts +27 -0
- package/dist/frontend/lowering/array-values.js +112 -0
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.d.ts +3 -0
- package/dist/frontend/lowering/binding-analysis.js +9 -3
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtin-namespaces.d.ts +13 -0
- package/dist/frontend/lowering/builtin-namespaces.js +238 -0
- package/dist/frontend/lowering/builtin-namespaces.js.map +1 -0
- package/dist/frontend/lowering/builtins/compression.d.ts +4 -3
- package/dist/frontend/lowering/builtins/compression.js +86 -5
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/date-classes.js +17 -1
- package/dist/frontend/lowering/builtins/date-classes.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.d.ts +19 -5
- package/dist/frontend/lowering/builtins/dates.js +159 -8
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +26 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-streams.d.ts +4 -0
- package/dist/frontend/lowering/builtins/fs-streams.js +24 -1
- package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.d.ts +4 -1
- package/dist/frontend/lowering/builtins/json.js +9 -3
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-bindings.d.ts +6 -0
- package/dist/frontend/lowering/builtins/module-bindings.js +23 -1
- package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-resolution.d.ts +5 -0
- package/dist/frontend/lowering/builtins/module-resolution.js +95 -4
- package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.js +144 -1
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
- package/dist/frontend/lowering/builtins/readline.js +22 -11
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/reflection.d.ts +4 -1
- package/dist/frontend/lowering/builtins/reflection.js +41 -1
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +31 -2
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +4 -1
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/builtins/x509.d.ts +33 -0
- package/dist/frontend/lowering/builtins/x509.js +431 -0
- package/dist/frontend/lowering/builtins/x509.js.map +1 -0
- package/dist/frontend/lowering/call-arguments.js +44 -0
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +1 -1
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-inline-require.js +1 -1
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
- package/dist/frontend/lowering/class-attributes.d.ts +7 -0
- package/dist/frontend/lowering/class-attributes.js +52 -10
- package/dist/frontend/lowering/class-attributes.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +13 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +174 -9
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +43 -8
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +71 -1
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +8 -0
- package/dist/frontend/lowering/class-prototypes.js +83 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-to-primitive.d.ts +5 -0
- package/dist/frontend/lowering/class-to-primitive.js +79 -7
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
- package/dist/frontend/lowering/coercions/state.d.ts +1 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +89 -10
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.d.ts +4 -2
- package/dist/frontend/lowering/coercions/unions.js +13 -6
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +51 -15
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.d.ts +4 -1
- package/dist/frontend/lowering/containers/array-construction.js +102 -9
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +85 -5
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +346 -77
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +11 -1
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +12 -0
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +73 -25
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +4 -4
- package/dist/frontend/lowering/containers/iterator-helpers.js +8 -2
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/replacer-params.d.ts +37 -0
- package/dist/frontend/lowering/containers/replacer-params.js +294 -0
- package/dist/frontend/lowering/containers/replacer-params.js.map +1 -0
- package/dist/frontend/lowering/containers/replacer-params.test.d.ts +1 -0
- package/dist/frontend/lowering/containers/replacer-params.test.js +61 -0
- package/dist/frontend/lowering/containers/replacer-params.test.js.map +1 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js +2 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +7 -3
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +4 -2
- package/dist/frontend/lowering/cycle-initialization.js +4 -1
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/date-values.d.ts +9 -6
- package/dist/frontend/lowering/date-values.js +63 -16
- package/dist/frontend/lowering/date-values.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +16 -8
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +22 -6
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/dispatch-sites.js +1 -0
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.d.ts +0 -8
- package/dist/frontend/lowering/expressions/array-literals.js +119 -26
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +38 -0
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +50 -6
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +35 -3
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.d.ts +2 -1
- package/dist/frontend/lowering/expressions/narrowing.js +8 -1
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +8 -2
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.js +65 -34
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +76 -11
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +6 -1
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +20 -11
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/f64-handles.d.ts +8 -0
- package/dist/frontend/lowering/f64-handles.js +16 -0
- package/dist/frontend/lowering/f64-handles.js.map +1 -0
- package/dist/frontend/lowering/frozen-records.d.ts +5 -0
- package/dist/frontend/lowering/frozen-records.js +12 -4
- package/dist/frontend/lowering/frozen-records.js.map +1 -1
- package/dist/frontend/lowering/function-context.d.ts +3 -0
- package/dist/frontend/lowering/function-context.js.map +1 -1
- package/dist/frontend/lowering/function-returns.js +15 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.js +17 -6
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/instantiation-path.d.ts +3 -2
- package/dist/frontend/lowering/instantiation-path.js.map +1 -1
- package/dist/frontend/lowering/instantiation-path.test.js +6 -4
- package/dist/frontend/lowering/instantiation-path.test.js.map +1 -1
- package/dist/frontend/lowering/iterator-adapters.d.ts +4 -2
- package/dist/frontend/lowering/iterator-adapters.js +26 -33
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-collection-types.d.ts +11 -0
- package/dist/frontend/lowering/js-collection-types.js +490 -0
- package/dist/frontend/lowering/js-collection-types.js.map +1 -0
- package/dist/frontend/lowering/lib-boundary.js +2 -2
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.d.ts +14 -0
- package/dist/frontend/lowering/lower-assert.js +283 -26
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +3 -3
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +97 -7
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +59 -7
- package/dist/frontend/lowering/lower-classes.js +647 -176
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-console.js +2 -1
- package/dist/frontend/lowering/lower-console.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +5 -0
- package/dist/frontend/lowering/lower-exprs.js +52 -5
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +7 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +4 -3
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +264 -46
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +28 -17
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +3 -0
- package/dist/frontend/lowering/lower-namespaces.js +44 -1
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-module.js +1 -1
- package/dist/frontend/lowering/lower-node-module.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +126 -32
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +4 -1
- package/dist/frontend/lowering/lower-stdlib.js +51 -37
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +294 -46
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +515 -121
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +52 -10
- package/dist/frontend/lowering/lowerer.js +249 -37
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +1 -1
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +13 -0
- package/dist/frontend/lowering/module-namespace-elements.js +118 -1
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/private-brands.d.ts +5 -0
- package/dist/frontend/lowering/private-brands.js +39 -0
- package/dist/frontend/lowering/private-brands.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.d.ts +6 -0
- package/dist/frontend/lowering/runtime-optional-elements.js +14 -3
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/sanitize-class-types.js +2 -0
- package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.d.ts +7 -2
- package/dist/frontend/lowering/site-dependencies.js +0 -15
- package/dist/frontend/lowering/site-dependencies.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.test.js +7 -5
- package/dist/frontend/lowering/site-dependencies.test.js.map +1 -1
- package/dist/frontend/lowering/string-index-bounds.d.ts +7 -4
- package/dist/frontend/lowering/string-index-bounds.js +21 -7
- package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +12 -3
- package/dist/frontend/lowering/surfaces.js +1576 -1539
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
- package/dist/frontend/lowering/symbol-fields.js +45 -2
- package/dist/frontend/lowering/symbol-fields.js.map +1 -1
- package/dist/frontend/lowering/union-narrow.d.ts +5 -2
- package/dist/frontend/lowering/union-narrow.js +6 -3
- package/dist/frontend/lowering/union-narrow.js.map +1 -1
- package/dist/frontend/lowering/union-narrow.test.js +10 -0
- package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
- package/dist/frontend/npm-static-namespace-defaults.d.ts +6 -0
- package/dist/frontend/npm-static-namespace-defaults.js +163 -0
- package/dist/frontend/npm-static-namespace-defaults.js.map +1 -0
- package/dist/frontend/npm-static-namespace-defaults.test.d.ts +1 -0
- package/dist/frontend/npm-static-namespace-defaults.test.js +72 -0
- package/dist/frontend/npm-static-namespace-defaults.test.js.map +1 -0
- package/dist/frontend/npm-static-prune.js +152 -111
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static.js +35 -32
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +7 -4
- package/dist/frontend/package-shims.js +39 -40
- package/dist/frontend/package-shims.js.map +1 -1
- package/dist/frontend/pipeline-native.d.ts +2 -2
- package/dist/frontend/pipeline-native.js +2 -2
- package/dist/frontend/pipeline-native.js.map +1 -1
- package/dist/frontend/pipeline.d.ts +19 -2
- package/dist/frontend/pipeline.js +102 -11
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +2 -0
- package/dist/frontend/program-analysis.js +3 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +15 -0
- package/dist/frontend/program.js +227 -64
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/resolve.d.ts +2 -0
- package/dist/frontend/resolve.js +5 -0
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/services.d.ts +3 -0
- package/dist/frontend/services.js +31 -4
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/shape-inference/analyze.d.ts +93 -0
- package/dist/frontend/shape-inference/analyze.js +3138 -0
- package/dist/frontend/shape-inference/analyze.js.map +1 -0
- package/dist/frontend/shape-inference/constant-graphs.d.ts +54 -0
- package/dist/frontend/shape-inference/constant-graphs.js +357 -0
- package/dist/frontend/shape-inference/constant-graphs.js.map +1 -0
- package/dist/frontend/shape-inference/domain.d.ts +32 -0
- package/dist/frontend/shape-inference/domain.js +104 -0
- package/dist/frontend/shape-inference/domain.js.map +1 -0
- package/dist/frontend/shape-inference/index.d.ts +7 -0
- package/dist/frontend/shape-inference/index.js +19 -0
- package/dist/frontend/shape-inference/index.js.map +1 -0
- package/dist/frontend/shape-inference/report.d.ts +21 -0
- package/dist/frontend/shape-inference/report.js +348 -0
- package/dist/frontend/shape-inference/report.js.map +1 -0
- package/dist/frontend/token-equivalence.d.ts +6 -0
- package/dist/frontend/token-equivalence.js +66 -9
- package/dist/frontend/token-equivalence.js.map +1 -1
- package/dist/frontend/token-equivalence.test.js +33 -1
- package/dist/frontend/token-equivalence.test.js.map +1 -1
- package/dist/frontend/ts7/checker-features.d.ts +15 -0
- package/dist/frontend/ts7/checker-features.js +45 -0
- package/dist/frontend/ts7/checker-features.js.map +1 -0
- package/dist/frontend/ts7/checker-features.test.d.ts +1 -0
- package/dist/frontend/ts7/checker-features.test.js +40 -0
- package/dist/frontend/ts7/checker-features.test.js.map +1 -0
- package/dist/frontend/ts7/checker-server.d.ts +19 -0
- package/dist/frontend/ts7/checker-server.js +46 -0
- package/dist/frontend/ts7/checker-server.js.map +1 -0
- package/dist/frontend/ts7/checker-server.test.d.ts +1 -0
- package/dist/frontend/ts7/checker-server.test.js +38 -0
- package/dist/frontend/ts7/checker-server.test.js.map +1 -0
- package/dist/frontend/ts7/lib-diagnostics.js +39 -13
- package/dist/frontend/ts7/lib-diagnostics.js.map +1 -1
- package/dist/frontend/ts7/lib-diagnostics.test.js +40 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -1
- package/dist/frontend/ts7/native-api.d.ts +1 -0
- package/dist/frontend/ts7/native-api.js +25 -2
- package/dist/frontend/ts7/native-api.js.map +1 -1
- package/dist/frontend/ts7/native-process.d.ts +9 -2
- package/dist/frontend/ts7/native-process.js +22 -4
- package/dist/frontend/ts7/native-process.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +11 -0
- package/dist/frontend/ts7/program-host.js +36 -22
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.d.ts +9 -0
- package/dist/frontend/ts7/semantic-json.js +25 -5
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.js +3 -1
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/source-parser.js +3 -1
- package/dist/frontend/ts7/source-parser.js.map +1 -1
- package/dist/frontend/tsc-codes.js +10 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +18 -6
- package/dist/frontend/type-mapper.js +160 -28
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +44 -3
- package/dist/index.js +27 -8
- package/dist/index.js.map +1 -1
- package/dist/ir/builtin-effects.js +29 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +7 -2
- package/dist/ir/builtin-signatures.js +5104 -4950
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +4 -2
- package/dist/ir/callback-specialization.js +24 -9
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/capture-values.js +4 -2
- package/dist/ir/capture-values.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +12 -2
- package/dist/ir/char-unit-locals.js +400 -58
- package/dist/ir/char-unit-locals.js.map +1 -1
- package/dist/ir/char-unit-locals.test.js +111 -0
- package/dist/ir/char-unit-locals.test.js.map +1 -1
- package/dist/ir/constant-globals.js +18 -4
- package/dist/ir/constant-globals.js.map +1 -1
- package/dist/ir/expression-inlining.d.ts +15 -0
- package/dist/ir/expression-inlining.js +166 -0
- package/dist/ir/expression-inlining.js.map +1 -0
- package/dist/ir/expression-inlining.test.d.ts +1 -0
- package/dist/ir/expression-inlining.test.js +123 -0
- package/dist/ir/expression-inlining.test.js.map +1 -0
- package/dist/ir/function-references.js +2 -0
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +6 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/int32-arrays.d.ts +27 -6
- package/dist/ir/int32-arrays.js +106 -18
- package/dist/ir/int32-arrays.js.map +1 -1
- package/dist/ir/int32-slots.d.ts +26 -1
- package/dist/ir/int32-slots.js +284 -5
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +5 -0
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +5 -0
- package/dist/ir/integer-loop-facts.js +90 -1
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +14 -1
- package/dist/ir/integer-loops.js +93 -7
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +70 -0
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.js +18 -2
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +64 -4
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +50 -8
- package/dist/ir/ir.js +38 -12
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/js-ic.d.ts +25 -5
- package/dist/ir/js-ic.js +93 -13
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +153 -0
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +7 -0
- package/dist/ir/node-index.js +32 -0
- package/dist/ir/node-index.js.map +1 -1
- package/dist/ir/receiver-readers.d.ts +6 -1
- package/dist/ir/receiver-readers.js +53 -28
- package/dist/ir/receiver-readers.js.map +1 -1
- package/dist/ir/row-pairs.d.ts +15 -0
- package/dist/ir/row-pairs.js +373 -0
- package/dist/ir/row-pairs.js.map +1 -0
- package/dist/ir/row-pairs.test.d.ts +1 -0
- package/dist/ir/row-pairs.test.js +129 -0
- package/dist/ir/row-pairs.test.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +17 -4
- package/dist/ir/runtime-features.js +69 -12
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/scalar-records.d.ts +15 -0
- package/dist/ir/scalar-records.js +301 -1
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/scalar-records.test.js +181 -1
- package/dist/ir/scalar-records.test.js.map +1 -1
- package/dist/ir/self-captures.js +8 -0
- package/dist/ir/self-captures.js.map +1 -1
- package/dist/ir/validate.js +37 -28
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/fence-eval.js +4 -4
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/ir-policy.js +4 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +1 -0
- package/dist/library/library-cache.js +1 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +13 -0
- package/dist/library/library-cache.test.js.map +1 -1
- package/dist/native/cache.d.ts +5 -1
- package/dist/native/cache.js +15 -3
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cli.js +6 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.d.ts +3 -0
- package/dist/native/compiler.js +72 -26
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +87 -2
- package/dist/native/compiler.test.js.map +1 -1
- package/dist/native/executable-cache-open.test.d.ts +1 -0
- package/dist/native/executable-cache-open.test.js +80 -0
- package/dist/native/executable-cache-open.test.js.map +1 -0
- package/dist/native/executable-cache.d.ts +43 -3
- package/dist/native/executable-cache.js +177 -36
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/executable-cache.test.js +103 -0
- package/dist/native/executable-cache.test.js.map +1 -1
- package/dist/native/prepare.js +38 -16
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +51 -1
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.d.ts +1 -1
- package/dist/native/sanitizer.js +17 -3
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +4 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/node-islands/classify.d.ts +14 -0
- package/dist/node-islands/classify.js +114 -0
- package/dist/node-islands/classify.js.map +1 -0
- package/dist/node-islands/detect.d.ts +13 -0
- package/dist/node-islands/detect.js +805 -0
- package/dist/node-islands/detect.js.map +1 -0
- package/dist/node-islands/detect.test.d.ts +1 -0
- package/dist/node-islands/detect.test.js +136 -0
- package/dist/node-islands/detect.test.js.map +1 -0
- package/dist/node-islands/origin.d.ts +21 -0
- package/dist/node-islands/origin.js +60 -0
- package/dist/node-islands/origin.js.map +1 -0
- package/dist/node-islands/policy.d.ts +49 -0
- package/dist/node-islands/policy.js +130 -0
- package/dist/node-islands/policy.js.map +1 -0
- package/dist/node-islands/report.d.ts +22 -0
- package/dist/node-islands/report.js +326 -0
- package/dist/node-islands/report.js.map +1 -0
- package/dist/node-islands/report.test.d.ts +1 -0
- package/dist/node-islands/report.test.js +228 -0
- package/dist/node-islands/report.test.js.map +1 -0
- package/dist/node-islands/rules.d.ts +20 -0
- package/dist/node-islands/rules.js +91 -0
- package/dist/node-islands/rules.js.map +1 -0
- package/dist/node-islands/scan.d.ts +53 -0
- package/dist/node-islands/scan.js +104 -0
- package/dist/node-islands/scan.js.map +1 -0
- package/dist/node-islands/summary.d.ts +78 -0
- package/dist/node-islands/summary.js +26 -0
- package/dist/node-islands/summary.js.map +1 -0
- package/dist/project-config.d.ts +50 -0
- package/dist/project-config.js +372 -0
- package/dist/project-config.js.map +1 -0
- package/dist/project-config.test.d.ts +1 -0
- package/dist/project-config.test.js +154 -0
- package/dist/project-config.test.js.map +1 -0
- package/dist/wasm/discover.js +6 -31
- package/dist/wasm/discover.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +20 -35
|
@@ -5,11 +5,11 @@ import { lowerDateStaticCall } from "./builtins/dates.js";
|
|
|
5
5
|
import { keyedHelperName } from "./stable-names.js";
|
|
6
6
|
import { lowerValueReturningConstructorNew } from "./js-dynamic-objects.js";
|
|
7
7
|
import { adaptPromiseExecutor } from "./promise-executor-adapter.js";
|
|
8
|
-
import { dynUndefinedExpr, nodeThrowExpr, varRef } from "../../ir/build.js";
|
|
8
|
+
import { dynUndefinedExpr, nodeThrowExpr, strLit, varRef } from "../../ir/build.js";
|
|
9
9
|
import { constructedFromValue, constructedValue, superIntoResultSlot, } from "./constructor-returns.js";
|
|
10
10
|
import { checkedIterableSpread } from "./checked-iterable-spread.js";
|
|
11
|
-
import { lowerReadlineUiNew } from "./builtins/readline.js";
|
|
12
|
-
import { builtinMemberRequireDecl } from "./builtins/module-bindings.js";
|
|
11
|
+
import { lowerReadlineInterfaceNew, lowerReadlineUiNew } from "./builtins/readline.js";
|
|
12
|
+
import { builtinMemberBindingTarget, builtinMemberRequireDecl, } from "./builtins/module-bindings.js";
|
|
13
13
|
import { checkedClassUnionAssertion } from "./class-assertions.js";
|
|
14
14
|
import { collectClassMethodMutations } from "./class-method-mutations.js";
|
|
15
15
|
import { InternalCompilerError } from "../../errors.js";
|
|
@@ -26,7 +26,7 @@ import { lowerZlibStreamNew, zlibClassName, zlibStreamModeOf } from "./builtins/
|
|
|
26
26
|
import { everyStmtList } from "../../ir/traverse.js";
|
|
27
27
|
import { builtinClassAliasOf, builtinClassRefOf, } from "./builtins/class-values.js";
|
|
28
28
|
import { inlineNamespaceRequireOf, lowerWithInlineRequireInit } from "./cjs-inline-require.js";
|
|
29
|
-
import { BOOL, canDynCheckTo, DATE_T, DYN, F64, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, STRING, classValueConstructor, UNDEFINED_T, VOID, arrayOf, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, typeEquals, } from "../../ir/ir.js";
|
|
29
|
+
import { BOOL, BYTES_U8, canDynCheckTo, DATE_T, DYN, F64, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, STRING, classValueConstructor, UNDEFINED_T, VOID, arrayOf, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, typeEquals, } from "../../ir/ir.js";
|
|
30
30
|
import { genericCallInstance, implicitAnyParamSymbolsOf, implicitCallInstance, implicitMonoFile, genericLocalClassResult, } from "./generic-functions.js";
|
|
31
31
|
import { extendInstantiationPath, MAX_INSTANTIATION_RECURSION, } from "./instantiation-path.js";
|
|
32
32
|
import { appendImplicitUndefinedReturn, hasExplicitJsDocReturn } from "./function-returns.js";
|
|
@@ -34,19 +34,20 @@ import { bodyReadsArguments } from "../arguments-usage.js";
|
|
|
34
34
|
import { errorNameAfterField, errorViewFields } from "./error-name-order.js";
|
|
35
35
|
import { checkedJsDocumentedParameter, documentedParameter, generatorMeta, } from "./call-signatures.js";
|
|
36
36
|
import { omittedArgFor } from "./call-arguments.js";
|
|
37
|
-
import { checkerTypeDescription, isGenericCallableMemberType, jsOpenObjectType, typeKey, withUnitArm, } from "../type-mapper.js";
|
|
37
|
+
import { checkerTypeDescription, isGenericCallableMemberType, jsOpenObjectType, typeKey, withUnitArm, X509_DER_FIELD, X509_PUBLIC_KEY_FIELD, } from "../type-mapper.js";
|
|
38
38
|
import { canonicalBuiltinModule, cjsClassExprWholeExportOf, isCjsJsFile, isJsSourceFile, isModuleExportsAccess, locOf, requireSpecOf, } from "../program.js";
|
|
39
39
|
import { PoisonError, dynFallbackType, jsFuncNameOf, newFnCtx, own } from "./lowerer.js";
|
|
40
40
|
import { isAssertClassNew } from "./assert-instances.js";
|
|
41
41
|
import { isCjsRequireGlobal } from "./lower-node-module.js";
|
|
42
42
|
import { lowerArrayConstructor } from "./containers/array-construction.js";
|
|
43
|
+
import { initializedCollectionType } from "./js-collection-types.js";
|
|
43
44
|
import { lowerMapSeedNew, lowerSetSeedNew } from "./containers/collection-methods.js";
|
|
44
45
|
import { lowerObjectConstructor } from "./containers/indexed-objects.js";
|
|
45
46
|
import { knownBufEncoding, lowerBufferConstruct } from "./containers/bytes.js";
|
|
46
47
|
import { lowerSearchParamsNew } from "./builtins/url.js";
|
|
47
48
|
import { lowerTextCodecNew } from "./builtins/text-codecs.js";
|
|
48
49
|
import { lowerBroadcastChannelNew, lowerMessageChannelNew, lowerWorkerNew, } from "./builtins/workers.js";
|
|
49
|
-
import { unsupportedPackageValueDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
|
|
50
|
+
import { noLoweringDiag, unsupportedPackageValueDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
|
|
50
51
|
import { STREAM_API_MEMBERS, STREAM_PROP_MEMBERS, STREAM_COMPLETION_CALLBACK_INDEX, UNDERSCORE_METHODS, streamExtraCallbacks, lowerStreamNew, lowerStreamSuperCall, streamCtorShape, } from "./lower-stream.js";
|
|
51
52
|
import { builtinEventTargetBaseOf, eventTargetApiMembers, eventTargetApiMethod, eventTargetRootOf, eventTargetSuperCall, lowerEventTargetMethodCall, } from "./lower-event-target.js";
|
|
52
53
|
import { emitOverrideShapeReason, emitSpecSuperForward, emitterRooted, lowerEmitterSuperCall, } from "./lower-event-emitter.js";
|
|
@@ -63,11 +64,11 @@ import { accessorInterceptsBase, accessorNames, construction, constructionPrefix
|
|
|
63
64
|
import { lowerObjectFactoryNew } from "./object-factory-new.js";
|
|
64
65
|
import { tryLowerExpression } from "./expressions/try-lower-expression.js";
|
|
65
66
|
import { lowerInstanceConstructorNew } from "./class-instance-constructor.js";
|
|
66
|
-
import { classPrototypeData } from "./class-prototypes.js";
|
|
67
|
+
import { classPrototypeData, reflectClassPrototype } from "./class-prototypes.js";
|
|
67
68
|
import { constructionEscape } from "./construction-escapes.js";
|
|
68
69
|
import { checkedClassConstruction, checkedClassConstructionPacked } from "./class-construction.js";
|
|
69
70
|
import { initializeRuntimeStatics, hasRuntimeStatics } from "./class-runtime-statics.js";
|
|
70
|
-
import { reflectedClassStaticMethodValue } from "./class-method-values.js";
|
|
71
|
+
import { reflectedClassMethodValue, reflectedClassStaticMethodValue, } from "./class-method-values.js";
|
|
71
72
|
import { identifierReadSymbol } from "./surfaces.js";
|
|
72
73
|
export function returnsOnlyThis(member) {
|
|
73
74
|
const body = member.body;
|
|
@@ -3431,6 +3432,11 @@ mixin) {
|
|
|
3431
3432
|
// INSTANTIATION prints its family's name — JS has one `Box`.
|
|
3432
3433
|
jsName: jsNameOverride ?? decl.name?.text ?? "",
|
|
3433
3434
|
...(base ? { base: base.def.name } : {}),
|
|
3435
|
+
...(decl.members.nodes.some((member) => ts.isPropertyDeclaration(member) &&
|
|
3436
|
+
!ts.isPrivateIdentifier(member.name) &&
|
|
3437
|
+
member.modifiers?.nodes.some((m) => m.kind === ts.SyntaxKind.StaticKeyword))
|
|
3438
|
+
? { ownStaticFields: true }
|
|
3439
|
+
: {}),
|
|
3434
3440
|
jsLength: ctor?.parameters?.nodes.findIndex((parameter) => parameter.initializer || parameter.dotDotDotToken) === -1
|
|
3435
3441
|
? ctor.parameters.nodes.length
|
|
3436
3442
|
: Math.max(0, ctor?.parameters?.nodes.findIndex((parameter) => parameter.initializer || parameter.dotDotDotToken) ?? 0),
|
|
@@ -4600,20 +4606,27 @@ export function lowerStaticFieldRead(lowerer, expr) {
|
|
|
4600
4606
|
return null;
|
|
4601
4607
|
if (expr.questionDotToken)
|
|
4602
4608
|
return null;
|
|
4603
|
-
|
|
4604
|
-
|
|
4605
|
-
exactClassOfReceiver(lowerer, expr.expression) === null)
|
|
4609
|
+
const info = staticReceiverClass(lowerer, expr.expression);
|
|
4610
|
+
if (!info)
|
|
4606
4611
|
return null;
|
|
4607
|
-
|
|
4608
|
-
|
|
4609
|
-
|
|
4612
|
+
return lowerClassStaticRead(lowerer, info, expr.name.text, expr.expression, expr);
|
|
4613
|
+
}
|
|
4614
|
+
/** The class a static member read through `receiver` reads exactly: the
|
|
4615
|
+
* class a name binds (directly, through a require binding, or through a
|
|
4616
|
+
* const alias), or null. */
|
|
4617
|
+
export function staticReceiverClass(lowerer, receiver) {
|
|
4618
|
+
if (!ts.isIdentifier(receiver) &&
|
|
4619
|
+
receiver.kind !== ts.SyntaxKind.ThisKeyword &&
|
|
4620
|
+
exactClassOfReceiver(lowerer, receiver) === null)
|
|
4621
|
+
return null;
|
|
4622
|
+
const symbol = ts.isIdentifier(receiver) ? lowerer.resolveValueSymbol(receiver) : null;
|
|
4610
4623
|
const info = (symbol ? lowerer.classBySymbol.get(symbol) : undefined) ??
|
|
4611
4624
|
// A require binding over `module.exports = class {…}` (the alias
|
|
4612
4625
|
// lands on the expression's own symbol): resolve/collect on demand,
|
|
4613
4626
|
// or `C.name` below would fall through to paths that answer for
|
|
4614
4627
|
// stdlib globals instead of this class.
|
|
4615
4628
|
propertyAssignedClassInfoOf(lowerer, symbol) ??
|
|
4616
|
-
exactClassOfReceiver(lowerer,
|
|
4629
|
+
exactClassOfReceiver(lowerer, receiver) ??
|
|
4617
4630
|
undefined;
|
|
4618
4631
|
if (!info)
|
|
4619
4632
|
return null;
|
|
@@ -4624,20 +4637,27 @@ export function lowerStaticFieldRead(lowerer, expr) {
|
|
|
4624
4637
|
// runtime value.
|
|
4625
4638
|
if (info.classDecorators?.valueGlobalId !== undefined)
|
|
4626
4639
|
return null;
|
|
4627
|
-
|
|
4628
|
-
|
|
4640
|
+
return info;
|
|
4641
|
+
}
|
|
4642
|
+
/** The static member `name` of `info` read through `receiver` (an exact
|
|
4643
|
+
* reference to the class, see staticReceiverClass): `C.name` for the
|
|
4644
|
+
* property access `site`, or a destructuring element over `C` whose
|
|
4645
|
+
* initializer is `site`. Null when the class has no such member. */
|
|
4646
|
+
export function lowerClassStaticRead(lowerer, info, name, receiver, site) {
|
|
4647
|
+
const loc = locOf(site);
|
|
4648
|
+
const found = findStaticOn(lowerer, info, name);
|
|
4629
4649
|
// A Date static read as a value through a class declared `extends Date`:
|
|
4630
4650
|
// the statics lower only as calls.
|
|
4631
4651
|
if (!found &&
|
|
4632
4652
|
dateRootOf(info) &&
|
|
4633
|
-
["now", "parse", "UTC"].includes(
|
|
4634
|
-
!(ts.isCallExpression(
|
|
4635
|
-
lowerer.noLowering(`Date.${
|
|
4653
|
+
["now", "parse", "UTC"].includes(name) &&
|
|
4654
|
+
!(ts.isCallExpression(site.parent) && site.parent.expression === site))
|
|
4655
|
+
lowerer.noLowering(`Date.${name} read through a class that extends Date`, site);
|
|
4636
4656
|
if (hasRuntimeStatics(info) && !found?.field)
|
|
4637
4657
|
return {
|
|
4638
4658
|
kind: "dynKeyGet",
|
|
4639
|
-
value: lowerer.coerceToExpected(classValueRef(lowerer, info,
|
|
4640
|
-
key: { kind: "strLit", value:
|
|
4659
|
+
value: lowerer.coerceToExpected(classValueRef(lowerer, info, receiver), DYN),
|
|
4660
|
+
key: { kind: "strLit", value: name, type: STRING, loc },
|
|
4641
4661
|
type: DYN,
|
|
4642
4662
|
loc,
|
|
4643
4663
|
};
|
|
@@ -4645,8 +4665,8 @@ export function lowerStaticFieldRead(lowerer, expr) {
|
|
|
4645
4665
|
// name: in JS the brand lives on that one constructor object, so
|
|
4646
4666
|
// `D.#s` (a subclass receiver) throws Node's TypeError instead of
|
|
4647
4667
|
// reaching up the chain — reported as SC1090 instead of resolved.
|
|
4648
|
-
if (found &&
|
|
4649
|
-
lowerer.unsupported("SC1090",
|
|
4668
|
+
if (found && name.startsWith("#") && found.declarer !== info) {
|
|
4669
|
+
lowerer.unsupported("SC1090", site, `reading the private static '${name}' through the subclass '${info.def.name.replace(/^%|^%m\d+\./, "")}' (JS brands the declaring class object alone — Node throws a TypeError here; spell the declaring class's name)`);
|
|
4650
4670
|
}
|
|
4651
4671
|
if (found?.field !== undefined) {
|
|
4652
4672
|
const value = {
|
|
@@ -4655,30 +4675,32 @@ export function lowerStaticFieldRead(lowerer, expr) {
|
|
|
4655
4675
|
type: found.field.type,
|
|
4656
4676
|
loc,
|
|
4657
4677
|
};
|
|
4658
|
-
return found.field.runtimeOptional
|
|
4678
|
+
return found.field.runtimeOptional || !ts.isPropertyAccessExpression(site)
|
|
4679
|
+
? value
|
|
4680
|
+
: lowerer.maybeNarrow(value, site);
|
|
4659
4681
|
}
|
|
4660
4682
|
if (found) {
|
|
4661
|
-
return staticMethodValue(lowerer, found.declarer,
|
|
4683
|
+
return staticMethodValue(lowerer, found.declarer, name, found.method, site, loc);
|
|
4662
4684
|
}
|
|
4663
4685
|
// A GENERIC static method as a VALUE: the pinned-value rule verbatim
|
|
4664
4686
|
// (lowerGenericFnValue) — a slot spelling one concrete signature names
|
|
4665
4687
|
// an instance, an unpinned reference fences by name.
|
|
4666
4688
|
{
|
|
4667
|
-
const gfound = findGenericStaticOn(lowerer, info,
|
|
4689
|
+
const gfound = findGenericStaticOn(lowerer, info, name);
|
|
4668
4690
|
if (gfound)
|
|
4669
|
-
return lowerer.lowerGenericFnValue(
|
|
4691
|
+
return lowerer.lowerGenericFnValue(site, gfound.info);
|
|
4670
4692
|
}
|
|
4671
4693
|
// `C.name` — the JS-observable class name, a compile-time constant on
|
|
4672
4694
|
// the direct spelling (tsc rejects user statics named `name`, so the
|
|
4673
4695
|
// chain above can never shadow it in TypeScript sources). A class of an
|
|
4674
4696
|
// import cycle reads it from its class object instead, whose reference
|
|
4675
4697
|
// checks the class's initialization (checkCycleBindingAccesses).
|
|
4676
|
-
if (
|
|
4698
|
+
if (name === "name" && info.def.jsName !== undefined) {
|
|
4677
4699
|
if (lowerer.classInitFlags.get(info.def.name)?.cycle === true)
|
|
4678
4700
|
return {
|
|
4679
4701
|
kind: "libCall",
|
|
4680
4702
|
fn: "class.name",
|
|
4681
|
-
args: [classValueRef(lowerer, info,
|
|
4703
|
+
args: [classValueRef(lowerer, info, receiver)],
|
|
4682
4704
|
type: STRING,
|
|
4683
4705
|
loc,
|
|
4684
4706
|
};
|
|
@@ -4687,26 +4709,26 @@ export function lowerStaticFieldRead(lowerer, expr) {
|
|
|
4687
4709
|
if (info.callableBase)
|
|
4688
4710
|
return {
|
|
4689
4711
|
kind: "dynKeyGet",
|
|
4690
|
-
value: lowerer.coerceToExpected(classValueRef(lowerer, info,
|
|
4691
|
-
key: { kind: "strLit", value:
|
|
4712
|
+
value: lowerer.coerceToExpected(classValueRef(lowerer, info, receiver), DYN),
|
|
4713
|
+
key: { kind: "strLit", value: name, type: STRING, loc },
|
|
4692
4714
|
type: DYN,
|
|
4693
4715
|
loc,
|
|
4694
4716
|
};
|
|
4695
|
-
const data = classStaticDataFor(lowerer, info,
|
|
4717
|
+
const data = classStaticDataFor(lowerer, info, name, loc);
|
|
4696
4718
|
if (data) {
|
|
4697
4719
|
const value = {
|
|
4698
4720
|
kind: "dynKeyGet",
|
|
4699
4721
|
value: data,
|
|
4700
|
-
key: { kind: "strLit", value:
|
|
4722
|
+
key: { kind: "strLit", value: name, type: STRING, loc },
|
|
4701
4723
|
type: DYN,
|
|
4702
4724
|
loc,
|
|
4703
4725
|
};
|
|
4704
4726
|
// JavaScript often assigns public statics after the class declaration.
|
|
4705
4727
|
// Their storage stays mutable and checked, while reads retain the
|
|
4706
4728
|
// checker's concrete type instead of losing the method receiver.
|
|
4707
|
-
const type = isJsSourceFile(ts.getSourceFileOfNode(
|
|
4729
|
+
const type = isJsSourceFile(ts.getSourceFileOfNode(site))
|
|
4708
4730
|
? null
|
|
4709
|
-
: lowerer.mapTypeOf(lowerer.typeOf(
|
|
4731
|
+
: lowerer.mapTypeOf(lowerer.typeOf(site));
|
|
4710
4732
|
return type ? lowerer.coerceToExpected(value, type) : value;
|
|
4711
4733
|
}
|
|
4712
4734
|
return null;
|
|
@@ -5453,7 +5475,7 @@ function staticCallOn(lowerer, call, access, info, throughValue) {
|
|
|
5453
5475
|
kind: "dynInvoke",
|
|
5454
5476
|
recv: lowerer.lowerExprExpecting(access.expression, DYN),
|
|
5455
5477
|
method: access.name.text,
|
|
5456
|
-
calleeName: access
|
|
5478
|
+
calleeName: ts.getTextOfNode(access),
|
|
5457
5479
|
args: call.arguments.nodes.map((argument) => lowerer.lowerExprExpecting(argument, DYN)),
|
|
5458
5480
|
type: DYN,
|
|
5459
5481
|
loc,
|
|
@@ -5756,8 +5778,8 @@ function capturesEnclosingScope(lowerer, member, classDecl) {
|
|
|
5756
5778
|
* reflection: the member a runtime lookup finds can then differ. */
|
|
5757
5779
|
function memberAssigned(lowerer, member, name) {
|
|
5758
5780
|
let found = false;
|
|
5759
|
-
for (const sf of lowerer.program.
|
|
5760
|
-
if (
|
|
5781
|
+
for (const sf of lowerer.program.getImplementationSourceFiles()) {
|
|
5782
|
+
if (found)
|
|
5761
5783
|
continue;
|
|
5762
5784
|
if (!sf.text.includes(name))
|
|
5763
5785
|
continue;
|
|
@@ -6807,14 +6829,23 @@ export function classMemberNameOf(lowerer, name) {
|
|
|
6807
6829
|
member === "asyncIterator" ||
|
|
6808
6830
|
member === "dispose" ||
|
|
6809
6831
|
member === "asyncDispose" ||
|
|
6810
|
-
member === "toPrimitive"
|
|
6832
|
+
member === "toPrimitive" ||
|
|
6833
|
+
// A toStringTag field keeps its symbol field name; its accessor and
|
|
6834
|
+
// method forms take the method slot name.
|
|
6835
|
+
(member === "toStringTag" && !ts.isPropertyDeclaration(name.parent))) {
|
|
6811
6836
|
return `sym:${member}`;
|
|
6812
6837
|
}
|
|
6813
6838
|
}
|
|
6814
6839
|
return (classSymbolKeyOf(lowerer, name.expression)?.fieldName ??
|
|
6815
6840
|
lowerer.foldedStringKeyOf(name.expression));
|
|
6816
6841
|
}
|
|
6817
|
-
|
|
6842
|
+
/** A return() result type that is always an object: IteratorClose after a
|
|
6843
|
+
* break throws a TypeError for any other result, which these desugars do
|
|
6844
|
+
* not model. */
|
|
6845
|
+
function objectResult(t) {
|
|
6846
|
+
return t.kind === "record" || t.kind === "object";
|
|
6847
|
+
}
|
|
6848
|
+
export function classIteratorOf(lowerer, t, options = {}) {
|
|
6818
6849
|
if (t.kind !== "object")
|
|
6819
6850
|
return null;
|
|
6820
6851
|
const info = lowerer.classes.get(t.className);
|
|
@@ -6824,19 +6855,48 @@ export function classIteratorOf(lowerer, t) {
|
|
|
6824
6855
|
if (!iter || iter.sig.params.length !== 0 || iter.sig.abstract === true)
|
|
6825
6856
|
return null;
|
|
6826
6857
|
const iterT = iter.sig.ret;
|
|
6827
|
-
|
|
6828
|
-
|
|
6829
|
-
|
|
6830
|
-
|
|
6831
|
-
|
|
6832
|
-
|
|
6833
|
-
|
|
6834
|
-
|
|
6835
|
-
|
|
6836
|
-
|
|
6837
|
-
|
|
6858
|
+
let resultT;
|
|
6859
|
+
let hasReturn;
|
|
6860
|
+
if (iterT.kind === "object") {
|
|
6861
|
+
const itInfo = lowerer.classes.get(iterT.className);
|
|
6862
|
+
if (!itInfo)
|
|
6863
|
+
return null;
|
|
6864
|
+
// IteratorClose honesty: a declared return() would be called by JS on
|
|
6865
|
+
// abrupt completion, so only a consumer that closes takes it; for-of
|
|
6866
|
+
// never calls throw(), the other consumers refuse it.
|
|
6867
|
+
const close = findMethodOn(lowerer, itInfo, "return");
|
|
6868
|
+
if (close &&
|
|
6869
|
+
(!options.close ||
|
|
6870
|
+
close.sig.abstract === true ||
|
|
6871
|
+
close.sig.params.length !== 0 ||
|
|
6872
|
+
!objectResult(close.sig.ret)))
|
|
6873
|
+
return null;
|
|
6874
|
+
if (findMethodOn(lowerer, itInfo, "throw") && !options.close)
|
|
6875
|
+
return null;
|
|
6876
|
+
const next = findMethodOn(lowerer, itInfo, "next");
|
|
6877
|
+
if (!next || next.sig.params.length !== 0 || next.sig.abstract === true)
|
|
6878
|
+
return null;
|
|
6879
|
+
resultT = next.sig.ret;
|
|
6880
|
+
hasReturn = !!close;
|
|
6881
|
+
}
|
|
6882
|
+
else if (iterT.kind === "record" && options.records) {
|
|
6883
|
+
const fields = lowerer.shapes.get(iterT.shapeId)?.fields;
|
|
6884
|
+
const next = fields?.find((f) => f.name === "next")?.type;
|
|
6885
|
+
if (!next || next.kind !== "func" || next.params.length !== 0 || next.rest)
|
|
6886
|
+
return null;
|
|
6887
|
+
const close = fields?.find((f) => f.name === "return")?.type;
|
|
6888
|
+
if (close &&
|
|
6889
|
+
(!options.close ||
|
|
6890
|
+
close.kind !== "func" ||
|
|
6891
|
+
close.params.length !== 0 ||
|
|
6892
|
+
close.rest ||
|
|
6893
|
+
!objectResult(close.ret)))
|
|
6894
|
+
return null;
|
|
6895
|
+
resultT = next.ret;
|
|
6896
|
+
hasReturn = close !== undefined;
|
|
6897
|
+
}
|
|
6898
|
+
else
|
|
6838
6899
|
return null;
|
|
6839
|
-
const resultT = next.sig.ret;
|
|
6840
6900
|
if (resultT.kind !== "record")
|
|
6841
6901
|
return null;
|
|
6842
6902
|
const shape = lowerer.shapes.get(resultT.shapeId);
|
|
@@ -6852,12 +6912,62 @@ export function classIteratorOf(lowerer, t) {
|
|
|
6852
6912
|
resultT,
|
|
6853
6913
|
valueT: value.type,
|
|
6854
6914
|
hasDone: done !== undefined,
|
|
6915
|
+
hasReturn,
|
|
6855
6916
|
};
|
|
6856
6917
|
}
|
|
6857
|
-
/** The `
|
|
6858
|
-
*
|
|
6859
|
-
|
|
6860
|
-
|
|
6918
|
+
/** The `next` an object-literal iterator's protocol calls, read once when
|
|
6919
|
+
* the iterator opens: JS keeps the `next` it reads then in the iterator
|
|
6920
|
+
* record, so a `next` the iterator assigns while it runs is not called.
|
|
6921
|
+
* Null for an iterator class, whose `next` is a method. */
|
|
6922
|
+
export function classIteratorNextRead(lowerer, cit, itRef, loc) {
|
|
6923
|
+
const iterT = cit.iterT;
|
|
6924
|
+
if (iterT.kind === "object")
|
|
6925
|
+
return null;
|
|
6926
|
+
const field = lowerer.shapes.get(iterT.shapeId).fields.find((f) => f.name === "next");
|
|
6927
|
+
return {
|
|
6928
|
+
kind: "recordGet",
|
|
6929
|
+
obj: itRef,
|
|
6930
|
+
shapeId: iterT.shapeId,
|
|
6931
|
+
field: "next",
|
|
6932
|
+
type: field.type,
|
|
6933
|
+
loc,
|
|
6934
|
+
};
|
|
6935
|
+
}
|
|
6936
|
+
/** The `it.next()` step of a class iterator: an ordinary (possibly
|
|
6937
|
+
* virtual) method call, or the call of `next`, the object-literal
|
|
6938
|
+
* iterator's `next` that classIteratorNextRead read when it opened. */
|
|
6939
|
+
export function classIteratorNextCall(lowerer, cit, itRef, next, loc) {
|
|
6940
|
+
if (next === null || next.type.kind !== "func")
|
|
6941
|
+
return classIteratorMethodCall(lowerer, cit, "next", itRef, loc);
|
|
6942
|
+
return { kind: "callValue", callee: next, args: [], type: next.type.ret, loc };
|
|
6943
|
+
}
|
|
6944
|
+
/** `it.next()` or `it.return()` of a class iterator: a (possibly virtual)
|
|
6945
|
+
* method call of an iterator class, or the call of an object-literal
|
|
6946
|
+
* iterator's function field. */
|
|
6947
|
+
export function classIteratorMethodCall(lowerer, cit, method, itRef, loc) {
|
|
6948
|
+
const iterT = cit.iterT;
|
|
6949
|
+
if (iterT.kind === "object") {
|
|
6950
|
+
const ret = method === "next"
|
|
6951
|
+
? cit.resultT
|
|
6952
|
+
: findMethodOn(lowerer, lowerer.classes.get(iterT.className), "return").sig.ret;
|
|
6953
|
+
return accessorCall(lowerer, iterT.className, method, itRef, [], ret, loc);
|
|
6954
|
+
}
|
|
6955
|
+
const field = lowerer.shapes.get(iterT.shapeId).fields.find((f) => f.name === method);
|
|
6956
|
+
const fnT = field.type;
|
|
6957
|
+
return {
|
|
6958
|
+
kind: "callValue",
|
|
6959
|
+
callee: {
|
|
6960
|
+
kind: "recordGet",
|
|
6961
|
+
obj: itRef,
|
|
6962
|
+
shapeId: iterT.shapeId,
|
|
6963
|
+
field: method,
|
|
6964
|
+
type: fnT,
|
|
6965
|
+
loc,
|
|
6966
|
+
},
|
|
6967
|
+
args: [],
|
|
6968
|
+
type: fnT.ret,
|
|
6969
|
+
loc,
|
|
6970
|
+
};
|
|
6861
6971
|
}
|
|
6862
6972
|
/** `recv[Symbol.iterator]()` as an ordinary method call. */
|
|
6863
6973
|
export function classIteratorOpenCall(lowerer, cit, recv, loc) {
|
|
@@ -6873,13 +6983,16 @@ export function classIteratorOpenCall(lowerer, cit, recv, loc) {
|
|
|
6873
6983
|
* when the value isn't a recognized class iterable or the element
|
|
6874
6984
|
* doesn't coerce — spread fences stay. */
|
|
6875
6985
|
export function classIteratorDrainCall(lowerer, src, loc, elemT) {
|
|
6876
|
-
|
|
6986
|
+
// A spread takes every value, so it never closes the iterator.
|
|
6987
|
+
const cit = classIteratorOf(lowerer, src.type, { records: true, close: true });
|
|
6877
6988
|
if (!cit)
|
|
6878
6989
|
return null;
|
|
6879
6990
|
const outElem = elemT ?? cit.valueT;
|
|
6880
6991
|
// Probe the element coercion purely: identical types, or an arm of a
|
|
6881
6992
|
// union destination (the wrap coerceToExpected applies below).
|
|
6882
|
-
|
|
6993
|
+
// A checked-dynamic value (`IteratorResult<T>`'s value is `T | any`)
|
|
6994
|
+
// converts to the destination element with a check.
|
|
6995
|
+
if (!typeEquals(outElem, cit.valueT) && cit.valueT.kind !== "dyn") {
|
|
6883
6996
|
if (outElem.kind !== "union" || lowerer.armTag(outElem.unionId, cit.valueT) < 0)
|
|
6884
6997
|
return null;
|
|
6885
6998
|
}
|
|
@@ -6892,6 +7005,8 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
|
|
|
6892
7005
|
const recvT = { kind: "object", className: cit.className };
|
|
6893
7006
|
const recvRef = { kind: "varRef", localId: "r.0", type: recvT, loc };
|
|
6894
7007
|
const itRef = { kind: "varRef", localId: "it.0", type: cit.iterT, loc };
|
|
7008
|
+
const nextRead = classIteratorNextRead(lowerer, cit, itRef, loc);
|
|
7009
|
+
const nextRef = nextRead ? varRef("next.0", nextRead.type, loc) : null;
|
|
6895
7010
|
const outRef = { kind: "varRef", localId: "out.0", type: outT, loc };
|
|
6896
7011
|
const resRef = { kind: "varRef", localId: "res.0", type: cit.resultT, loc };
|
|
6897
7012
|
const valueRead = {
|
|
@@ -6906,7 +7021,7 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
|
|
|
6906
7021
|
{
|
|
6907
7022
|
kind: "varDecl",
|
|
6908
7023
|
localId: "res.0",
|
|
6909
|
-
init: classIteratorNextCall(lowerer, cit, itRef, loc),
|
|
7024
|
+
init: classIteratorNextCall(lowerer, cit, itRef, nextRef, loc),
|
|
6910
7025
|
loc,
|
|
6911
7026
|
},
|
|
6912
7027
|
...(cit.hasDone
|
|
@@ -6947,6 +7062,7 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
|
|
|
6947
7062
|
locals: [
|
|
6948
7063
|
{ id: "r.0", name: "r", type: recvT, mutable: false },
|
|
6949
7064
|
{ id: "it.0", name: "it", type: cit.iterT, mutable: false },
|
|
7065
|
+
...(nextRead ? [{ id: "next.0", name: "next", type: nextRead.type, mutable: false }] : []),
|
|
6950
7066
|
{ id: "out.0", name: "out", type: outT, mutable: false },
|
|
6951
7067
|
{ id: "res.0", name: "res", type: cit.resultT, mutable: true },
|
|
6952
7068
|
],
|
|
@@ -6963,6 +7079,9 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
|
|
|
6963
7079
|
init: classIteratorOpenCall(lowerer, cit, recvRef, loc),
|
|
6964
7080
|
loc,
|
|
6965
7081
|
},
|
|
7082
|
+
...(nextRead
|
|
7083
|
+
? [{ kind: "varDecl", localId: "next.0", init: nextRead, loc }]
|
|
7084
|
+
: []),
|
|
6966
7085
|
{
|
|
6967
7086
|
kind: "while",
|
|
6968
7087
|
cond: { kind: "boolLit", value: true, type: BOOL, loc },
|
|
@@ -6992,7 +7111,7 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
|
|
|
6992
7111
|
* next() still yields): the drain loop keyed by the iterator class. */
|
|
6993
7112
|
export function classIteratorRestDrainCall(lowerer, cit, itVal, loc) {
|
|
6994
7113
|
const outT = arrayOf(cit.valueT);
|
|
6995
|
-
const key = `it:${cit.iterT.className}`;
|
|
7114
|
+
const key = `it:${cit.iterT.kind === "object" ? cit.iterT.className : typeKey(cit.iterT)}`;
|
|
6996
7115
|
let name = lowerer.iterDrainHelpers.get(key);
|
|
6997
7116
|
if (!name) {
|
|
6998
7117
|
name = keyedHelperName(lowerer, "%iter.drain", key);
|
|
@@ -7004,7 +7123,7 @@ export function classIteratorRestDrainCall(lowerer, cit, itVal, loc) {
|
|
|
7004
7123
|
{
|
|
7005
7124
|
kind: "varDecl",
|
|
7006
7125
|
localId: "res.0",
|
|
7007
|
-
init: classIteratorNextCall(lowerer, cit, itRef, loc),
|
|
7126
|
+
init: classIteratorNextCall(lowerer, cit, itRef, null, loc),
|
|
7008
7127
|
loc,
|
|
7009
7128
|
},
|
|
7010
7129
|
...(cit.hasDone
|
|
@@ -7906,22 +8025,51 @@ export function lowerSuperMethodCall(lowerer, call, access) {
|
|
|
7906
8025
|
lowerer.unsupported("SC1080", access);
|
|
7907
8026
|
const loc = locOf(call);
|
|
7908
8027
|
const thisRef = { kind: "varRef", localId: thisLocal.id, type: thisLocal.type, loc };
|
|
7909
|
-
|
|
7910
|
-
|
|
7911
|
-
|
|
7912
|
-
|
|
7913
|
-
|
|
7914
|
-
|
|
7915
|
-
|
|
7916
|
-
|
|
7917
|
-
|
|
7918
|
-
|
|
8028
|
+
// A method whose `this` is the call-site receiver (a JavaScript class's
|
|
8029
|
+
// receiver-independent method value, reflectedClassMethodValue) looks the
|
|
8030
|
+
// method up on the base class's complete prototype, as `super` reads
|
|
8031
|
+
// [[HomeObject]].[[Prototype]], and calls it with that receiver.
|
|
8032
|
+
const dynamicThis = thisRef.type.kind === "dyn";
|
|
8033
|
+
// While no code reads a prototype method by name (which could replace it),
|
|
8034
|
+
// that method is the declaring class's own: its receiver-independent value
|
|
8035
|
+
// is called directly. Reflecting the base's whole prototype instead would
|
|
8036
|
+
// put its members on the prototype chain of every subclass instance's
|
|
8037
|
+
// property bag, ahead of the subclasses' own compiled overrides.
|
|
8038
|
+
const declared = dynamicThis && !lowerer.prototypeMethodAccesses.has(access.name.text)
|
|
8039
|
+
? reflectedClassMethodValue(lowerer, found.declarer, access.name.text)
|
|
8040
|
+
: null;
|
|
8041
|
+
if (dynamicThis || lowerer.prototypeMethodAccesses.has(access.name.text)) {
|
|
8042
|
+
const prototype = declared
|
|
8043
|
+
? null
|
|
8044
|
+
: dynamicThis && cls.base.decl
|
|
8045
|
+
? reflectClassPrototype(lowerer, cls.base, loc, classValueRef(lowerer, cls.base, access))
|
|
8046
|
+
: classPrototypeData(lowerer, cls.base, loc);
|
|
8047
|
+
if (declared || prototype) {
|
|
8048
|
+
const callee = declared
|
|
8049
|
+
? lowerer.coerceToExpected(declared, DYN)
|
|
8050
|
+
: {
|
|
8051
|
+
kind: "dynKeyGet",
|
|
8052
|
+
value: prototype,
|
|
8053
|
+
key: { kind: "strLit", value: access.name.text, type: STRING, loc },
|
|
8054
|
+
type: DYN,
|
|
8055
|
+
loc,
|
|
8056
|
+
};
|
|
8057
|
+
// Spread arguments are spread into the dynamic call, as in a dynamic method call.
|
|
8058
|
+
const spreads = [];
|
|
8059
|
+
const args = call.arguments.nodes.map((arg, index) => {
|
|
8060
|
+
if (!ts.isSpreadElement(arg))
|
|
8061
|
+
return lowerer.lowerExprExpecting(arg, DYN);
|
|
8062
|
+
const spelling = ts.getTextOfNode(arg.expression);
|
|
8063
|
+
spreads.push({ arg: index, what: spelling });
|
|
8064
|
+
return checkedIterableSpread(lowerer, lowerer.lowerExpr(arg.expression), spelling, loc);
|
|
8065
|
+
});
|
|
7919
8066
|
const value = {
|
|
7920
8067
|
kind: "dynCall",
|
|
7921
8068
|
callee,
|
|
7922
8069
|
receiver: lowerer.coerceToExpected(thisRef, DYN),
|
|
7923
8070
|
calleeName: ts.getTextOfNode(access),
|
|
7924
|
-
args
|
|
8071
|
+
args,
|
|
8072
|
+
...(spreads.length > 0 ? { spreads } : {}),
|
|
7925
8073
|
type: DYN,
|
|
7926
8074
|
loc,
|
|
7927
8075
|
};
|
|
@@ -8239,6 +8387,59 @@ function assignedThisFieldType(lowerer, expr) {
|
|
|
8239
8387
|
}
|
|
8240
8388
|
return lowerer.currentClass?.fields.get(parent.left.name.text) ?? null;
|
|
8241
8389
|
}
|
|
8390
|
+
/** `new arr[i](args)` through a narrowed element read: an interned lifted
|
|
8391
|
+
* function takes the read and the completed arguments, which evaluate in
|
|
8392
|
+
* that order as call arguments, then runs the check and constructs. JS
|
|
8393
|
+
* evaluates the arguments before it checks that the callee constructs, and
|
|
8394
|
+
* the arguments stay in the one call, where a spread's argument pack lives
|
|
8395
|
+
* until every argument has read it. */
|
|
8396
|
+
function checkedElementConstruction(lowerer, info, narrowed, args, loc) {
|
|
8397
|
+
const type = { kind: "object", className: info.def.name };
|
|
8398
|
+
const key = `newChecked:${narrowed.check}:${info.def.name}:${args.map((a) => typeKey(a.type)).join(",")}`;
|
|
8399
|
+
let name = lowerer.valueHelpers.get(key);
|
|
8400
|
+
if (!name) {
|
|
8401
|
+
name = keyedHelperName(lowerer, "%new.checked", key);
|
|
8402
|
+
lowerer.valueHelpers.set(key, name);
|
|
8403
|
+
const params = [
|
|
8404
|
+
{ localId: "value", name: "value", type: narrowed.unionT },
|
|
8405
|
+
{ localId: "message", name: "message", type: STRING },
|
|
8406
|
+
...args.map((arg, i) => ({ localId: `arg.${i}`, name: `arg${i}`, type: arg.type })),
|
|
8407
|
+
];
|
|
8408
|
+
lowerer.liftedFns.push({
|
|
8409
|
+
name,
|
|
8410
|
+
params,
|
|
8411
|
+
returnType: type,
|
|
8412
|
+
locals: params.map((p) => ({ id: p.localId, name: p.name, type: p.type, mutable: false })),
|
|
8413
|
+
body: [
|
|
8414
|
+
{
|
|
8415
|
+
kind: "return",
|
|
8416
|
+
value: {
|
|
8417
|
+
kind: "newValue",
|
|
8418
|
+
callee: {
|
|
8419
|
+
kind: "call",
|
|
8420
|
+
callee: narrowed.check,
|
|
8421
|
+
args: [varRef("value", narrowed.unionT, loc), varRef("message", STRING, loc)],
|
|
8422
|
+
type: narrowed.calleeT,
|
|
8423
|
+
loc,
|
|
8424
|
+
},
|
|
8425
|
+
args: params.slice(2).map((p) => varRef(p.localId, p.type, loc)),
|
|
8426
|
+
type,
|
|
8427
|
+
loc,
|
|
8428
|
+
},
|
|
8429
|
+
loc,
|
|
8430
|
+
},
|
|
8431
|
+
],
|
|
8432
|
+
loc,
|
|
8433
|
+
});
|
|
8434
|
+
}
|
|
8435
|
+
return {
|
|
8436
|
+
kind: "call",
|
|
8437
|
+
callee: name,
|
|
8438
|
+
args: [narrowed.read, narrowed.message, ...args],
|
|
8439
|
+
type,
|
|
8440
|
+
loc,
|
|
8441
|
+
};
|
|
8442
|
+
}
|
|
8242
8443
|
/** Map, Set and the error classes construct in lowerNew's identifier
|
|
8243
8444
|
* branch, which a module member alias of one (`new mod.M()`) also takes. */
|
|
8244
8445
|
function isCollectionOrErrorClass(ref) {
|
|
@@ -8276,7 +8477,7 @@ export function lowerNew(lowerer, expr) {
|
|
|
8276
8477
|
const worker = lowerWorkerNew(lowerer, expr);
|
|
8277
8478
|
if (worker)
|
|
8278
8479
|
return worker;
|
|
8279
|
-
const readlineUi = lowerReadlineUiNew(lowerer, expr);
|
|
8480
|
+
const readlineUi = lowerReadlineUiNew(lowerer, expr) ?? lowerReadlineInterfaceNew(lowerer, expr);
|
|
8280
8481
|
if (readlineUi)
|
|
8281
8482
|
return readlineUi;
|
|
8282
8483
|
const channel = lowerMessageChannelNew(lowerer, expr) ?? lowerBroadcastChannelNew(lowerer, expr);
|
|
@@ -8347,19 +8548,39 @@ export function lowerNew(lowerer, expr) {
|
|
|
8347
8548
|
lowerer.isStdlibGlobal(expr.expression.expression, "Intl")) {
|
|
8348
8549
|
const args = expr.arguments?.nodes ?? [];
|
|
8349
8550
|
const undefinedArg = (arg) => (lowerer.typeOf(arg).flags & ts.TypeFlags.Undefined) !== 0;
|
|
8350
|
-
|
|
8351
|
-
|
|
8352
|
-
|
|
8551
|
+
// A literal language tag: Unicode grapheme clusters have no locale
|
|
8552
|
+
// tailoring. Only tags of the form language[-script][-region] are
|
|
8553
|
+
// accepted; each is well-formed, so Node constructs the segmenter
|
|
8554
|
+
// without the RangeError a malformed tag throws.
|
|
8555
|
+
const literalLocale = (arg) => ts.isStringLiteralLike(arg) &&
|
|
8556
|
+
/^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-([A-Za-z]{2}|[0-9]{3}))?$/.test(arg.text);
|
|
8557
|
+
if (args.length > 2 || (args[0] && !undefinedArg(args[0]) && !literalLocale(args[0]))) {
|
|
8558
|
+
lowerer.noLowering("Intl.Segmenter locale negotiation", expr, "omit the locale, pass undefined, or pass one language tag as a string literal");
|
|
8559
|
+
}
|
|
8560
|
+
// JavaScript dependencies may construct word and sentence segmenters
|
|
8561
|
+
// that they use only on some paths (pi-tui's shared word segmenter):
|
|
8562
|
+
// the construction compiles and their segment() throws SC2020.
|
|
8563
|
+
// TypeScript sources keep the build-time refusal.
|
|
8564
|
+
const granularities = isJsSourceFile(ts.getSourceFileOfNode(expr))
|
|
8565
|
+
? ["grapheme", "word", "sentence"]
|
|
8566
|
+
: ["grapheme"];
|
|
8353
8567
|
const options = args[1];
|
|
8354
|
-
|
|
8355
|
-
|
|
8356
|
-
|
|
8357
|
-
|
|
8358
|
-
|
|
8359
|
-
|
|
8360
|
-
|
|
8361
|
-
|
|
8362
|
-
|
|
8568
|
+
let granularity = "grapheme";
|
|
8569
|
+
if (options && !undefinedArg(options)) {
|
|
8570
|
+
// An object literal of `granularity` entries (none: the default; a
|
|
8571
|
+
// repeated key: the last one, as in JavaScript).
|
|
8572
|
+
if (!ts.isObjectLiteralExpression(options))
|
|
8573
|
+
lowerer.noLowering("Intl.Segmenter options", options, 'the native segmenter supports default options and { granularity: "grapheme" }; word and sentence segmentation remain unsupported');
|
|
8574
|
+
for (const property of options.properties.nodes) {
|
|
8575
|
+
if (!ts.isPropertyAssignment(property) ||
|
|
8576
|
+
!(ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) ||
|
|
8577
|
+
property.name.text !== "granularity" ||
|
|
8578
|
+
!ts.isStringLiteral(property.initializer) ||
|
|
8579
|
+
!granularities.includes(property.initializer.text)) {
|
|
8580
|
+
lowerer.noLowering("Intl.Segmenter options", options, 'the native segmenter supports default options and { granularity: "grapheme" }; word and sentence segmentation remain unsupported');
|
|
8581
|
+
}
|
|
8582
|
+
granularity = property.initializer.text;
|
|
8583
|
+
}
|
|
8363
8584
|
}
|
|
8364
8585
|
// Explicit undefined expressions can carry effects; retain argument order.
|
|
8365
8586
|
const stmts = args.map((arg) => {
|
|
@@ -8370,7 +8591,22 @@ export function lowerNew(lowerer, expr) {
|
|
|
8370
8591
|
loc: locOf(arg),
|
|
8371
8592
|
};
|
|
8372
8593
|
});
|
|
8373
|
-
|
|
8594
|
+
let result = { kind: "libCall", fn: "intl.segmenterNew", args: [], type: DYN, loc };
|
|
8595
|
+
// A word or sentence segmenter carries its segment() refusal, which
|
|
8596
|
+
// coverage lists as deferred to runtime.
|
|
8597
|
+
if (granularity !== "grapheme") {
|
|
8598
|
+
const surface = `Intl.Segmenter segmentation with granularity '${granularity}'`;
|
|
8599
|
+
lowerer.runtimeFences.push(noLoweringDiag(surface, loc, "only grapheme segmenters segment; word and sentence segmenters construct"));
|
|
8600
|
+
const line = ts.getLineAndCharacterOfPosition(ts.getSourceFileOfNode(expr), loc.start).line;
|
|
8601
|
+
const refusal = `${surface} is not supported yet [SC2020 at ${loc.file}:${line + 1}]`;
|
|
8602
|
+
result = {
|
|
8603
|
+
kind: "libCall",
|
|
8604
|
+
fn: "intl.segmenterRefusing",
|
|
8605
|
+
args: [strLit(refusal, loc)],
|
|
8606
|
+
type: DYN,
|
|
8607
|
+
loc,
|
|
8608
|
+
};
|
|
8609
|
+
}
|
|
8374
8610
|
return stmts.length ? { kind: "seqExpr", stmts, result, type: DYN, loc } : result;
|
|
8375
8611
|
}
|
|
8376
8612
|
// A package declaration without a compiled constructor cannot provide
|
|
@@ -8534,6 +8770,47 @@ export function lowerNew(lowerer, expr) {
|
|
|
8534
8770
|
if (agent)
|
|
8535
8771
|
return agent;
|
|
8536
8772
|
}
|
|
8773
|
+
// `new crypto.X509Certificate(data)` — the Dirent-style data record:
|
|
8774
|
+
// the certificate's lowered members (fingerprint — the SHA-1 of the
|
|
8775
|
+
// DER, uppercase colon-separated — plus the validFrom/validTo
|
|
8776
|
+
// validity window in Node's ASN1_TIME_print shape) compute AT
|
|
8777
|
+
// CONSTRUCTION, when Node parses too, so unparseable input throws
|
|
8778
|
+
// Node's exact PEM error here (ERR_OSSL_PEM_NO_START_LINE) and the
|
|
8779
|
+
// handle never exists. Both import forms (`crypto.X509Certificate`
|
|
8780
|
+
// through the namespace, named `X509Certificate`); Buffer input only
|
|
8781
|
+
// — the readFileSync idiom. mapType interns the matching record, so
|
|
8782
|
+
// locals and the composed member reads all flow. The data argument
|
|
8783
|
+
// feeds THREE field computations, so construction goes through an
|
|
8784
|
+
// interned helper whose parameter evaluates it exactly once.
|
|
8785
|
+
// It runs before the standard-library constructor fence below, which
|
|
8786
|
+
// also sees `const X = require("crypto").X509Certificate` as the
|
|
8787
|
+
// builtin class.
|
|
8788
|
+
{
|
|
8789
|
+
const callee = expr.expression;
|
|
8790
|
+
const isX509 = (ts.isPropertyAccessExpression(callee) &&
|
|
8791
|
+
callee.name.text === "X509Certificate" &&
|
|
8792
|
+
lowerer.builtinNamespaceModuleOf(callee.expression) === "crypto") ||
|
|
8793
|
+
(ts.isIdentifier(callee) &&
|
|
8794
|
+
(() => {
|
|
8795
|
+
const bi = lowerer.builtinImportOf(callee);
|
|
8796
|
+
return bi?.module === "crypto" && bi.member === "X509Certificate";
|
|
8797
|
+
})());
|
|
8798
|
+
if (isX509) {
|
|
8799
|
+
const args = expr.arguments?.nodes ?? [];
|
|
8800
|
+
if (args.length !== 1) {
|
|
8801
|
+
lowerer.noLowering("X509Certificate with this argument shape", expr, "the supported form is new X509Certificate(readFileSync(path))");
|
|
8802
|
+
}
|
|
8803
|
+
const data = lowerer.lowerExpr(args[0]);
|
|
8804
|
+
const isBytes = data.type.kind === "bytes" && data.type.elem === "u8";
|
|
8805
|
+
if (!isBytes && data.type.kind !== "string") {
|
|
8806
|
+
lowerer.noLowering(`X509Certificate over '${lowerer.fmt(data.type)}' data`, args[0], "pass the certificate Buffer or PEM string (an fs.readFileSync result)");
|
|
8807
|
+
}
|
|
8808
|
+
const t = lowerer.mapTypeOf(lowerer.typeOf(expr));
|
|
8809
|
+
if (t?.kind !== "record")
|
|
8810
|
+
lowerer.badType(expr, lowerer.typeOf(expr));
|
|
8811
|
+
return x509RecordCall(lowerer, data, t, loc);
|
|
8812
|
+
}
|
|
8813
|
+
}
|
|
8537
8814
|
if (ts.isIdentifier(expr.expression) ||
|
|
8538
8815
|
(ts.isPropertyAccessExpression(expr.expression) &&
|
|
8539
8816
|
ts.isIdentifier(expr.expression.name) &&
|
|
@@ -8546,7 +8823,9 @@ export function lowerNew(lowerer, expr) {
|
|
|
8546
8823
|
if (ts.isIdentifier(expr.expression))
|
|
8547
8824
|
fenceEarlyAliasUse(lowerer, expr.expression, expr);
|
|
8548
8825
|
const identifier = ts.isIdentifier(expr.expression) ? expr.expression : expr.expression.name;
|
|
8549
|
-
const
|
|
8826
|
+
// `const SD = require("string_decoder").StringDecoder; new SD()`
|
|
8827
|
+
// constructs the member, as a named import of it does.
|
|
8828
|
+
const symbol = builtinMemberBindingTarget(lowerer, ts.isIdentifier(identifier) ? lowerer.resolveValueSymbol(identifier) : null);
|
|
8550
8829
|
if (ts.isIdentifier(identifier) && lowerer.isStdlibGlobal(identifier, "Array")) {
|
|
8551
8830
|
return lowerArrayConstructor(lowerer, expr, expr.arguments?.nodes ?? []);
|
|
8552
8831
|
}
|
|
@@ -8829,6 +9108,27 @@ export function lowerNew(lowerer, expr) {
|
|
|
8829
9108
|
const time = { kind: "libCall", fn: "date.getTime", args: [arg], type: F64, loc };
|
|
8830
9109
|
return { kind: "libCall", fn: "date.newMs", args: [time], type: DATE_T, loc };
|
|
8831
9110
|
}
|
|
9111
|
+
// A union (`Date | string | number`) or checked-dynamic value: the
|
|
9112
|
+
// runtime's constructor reads a Date's time value, parses a string
|
|
9113
|
+
// and converts anything else to a primitive and a number.
|
|
9114
|
+
if ((arg.type.kind === "union" || arg.type.kind === "dyn") &&
|
|
9115
|
+
lowerer.dynConvertible(arg.type)) {
|
|
9116
|
+
const value = {
|
|
9117
|
+
kind: "libCall",
|
|
9118
|
+
fn: "date.nativeNewValue",
|
|
9119
|
+
args: [
|
|
9120
|
+
{
|
|
9121
|
+
kind: "dynArrLit",
|
|
9122
|
+
elems: [lowerer.coerceToExpected(arg, DYN)],
|
|
9123
|
+
type: DYN,
|
|
9124
|
+
loc,
|
|
9125
|
+
},
|
|
9126
|
+
],
|
|
9127
|
+
type: DYN,
|
|
9128
|
+
loc,
|
|
9129
|
+
};
|
|
9130
|
+
return { kind: "libCall", fn: "date.checkedValue", args: [value], type: DATE_T, loc };
|
|
9131
|
+
}
|
|
8832
9132
|
lowerer.noLowering(`new Date of '${lowerer.fmt(arg.type)}' values`, args[0], "pass milliseconds, a date string, or another Date value", symbol);
|
|
8833
9133
|
}
|
|
8834
9134
|
// `new StringDecoder(encoding?)` (node:string_decoder): the decoder
|
|
@@ -8953,7 +9253,12 @@ export function lowerNew(lowerer, expr) {
|
|
|
8953
9253
|
// expression). The CONTEXTUAL type carries the annotation — adopt
|
|
8954
9254
|
// it when it is a supported map. TS type arguments keep winning:
|
|
8955
9255
|
// their expression type already maps.
|
|
8956
|
-
|
|
9256
|
+
const inferred = initializedCollectionType(lowerer, expr);
|
|
9257
|
+
if (inferred) {
|
|
9258
|
+
tsType = inferred;
|
|
9259
|
+
mapped = lowerer.mapTypeOf(inferred);
|
|
9260
|
+
}
|
|
9261
|
+
else if (mapped?.kind !== "map" || contextualSeed) {
|
|
8957
9262
|
const ctx = lowerer.checker.getContextualType(expr);
|
|
8958
9263
|
const ctxMapped = ctx ? lowerer.mapTypeOf(ctx) : null;
|
|
8959
9264
|
if (ctx && ctxMapped?.kind === "map") {
|
|
@@ -9063,7 +9368,8 @@ export function lowerNew(lowerer, expr) {
|
|
|
9063
9368
|
// `new Set<T>()`: construct + bulk add from supported values,
|
|
9064
9369
|
// including live collection cursors. Duplicates collapse in insertion order.
|
|
9065
9370
|
if (ts.isIdentifier(identifier) && lowerer.isStdlibGlobal(identifier, "Set")) {
|
|
9066
|
-
const
|
|
9371
|
+
const inferred = initializedCollectionType(lowerer, expr);
|
|
9372
|
+
const tsType = inferred ?? lowerer.typeOf(expr);
|
|
9067
9373
|
let mapped = lowerer.mapTypeOf(tsType);
|
|
9068
9374
|
const fieldType = assignedThisFieldType(lowerer, expr);
|
|
9069
9375
|
if (mapped?.kind !== "set" && fieldType?.kind === "set")
|
|
@@ -9222,79 +9528,6 @@ export function lowerNew(lowerer, expr) {
|
|
|
9222
9528
|
lowerer.noLowering(`new ${expr.expression.text}`, expr, ctorHints[ts.isIdentifier(expr.expression) ? expr.expression.text : expr.expression.name.text], symbol);
|
|
9223
9529
|
}
|
|
9224
9530
|
}
|
|
9225
|
-
// `new crypto.X509Certificate(data)` — the Dirent-style data record:
|
|
9226
|
-
// the certificate's lowered members (fingerprint — the SHA-1 of the
|
|
9227
|
-
// DER, uppercase colon-separated — plus the validFrom/validTo
|
|
9228
|
-
// validity window in Node's ASN1_TIME_print shape) compute AT
|
|
9229
|
-
// CONSTRUCTION, when Node parses too, so unparseable input throws
|
|
9230
|
-
// Node's exact PEM error here (ERR_OSSL_PEM_NO_START_LINE) and the
|
|
9231
|
-
// handle never exists. Both import forms (`crypto.X509Certificate`
|
|
9232
|
-
// through the namespace, named `X509Certificate`); Buffer input only
|
|
9233
|
-
// — the readFileSync idiom. mapType interns the matching record, so
|
|
9234
|
-
// locals and the composed member reads all flow. The data argument
|
|
9235
|
-
// feeds THREE field computations, so construction goes through an
|
|
9236
|
-
// interned helper whose parameter evaluates it exactly once.
|
|
9237
|
-
{
|
|
9238
|
-
const callee = expr.expression;
|
|
9239
|
-
const isX509 = (ts.isPropertyAccessExpression(callee) &&
|
|
9240
|
-
callee.name.text === "X509Certificate" &&
|
|
9241
|
-
lowerer.builtinNamespaceModuleOf(callee.expression) === "crypto") ||
|
|
9242
|
-
(ts.isIdentifier(callee) &&
|
|
9243
|
-
(() => {
|
|
9244
|
-
const bi = lowerer.builtinImportOf(callee);
|
|
9245
|
-
return bi?.module === "crypto" && bi.member === "X509Certificate";
|
|
9246
|
-
})());
|
|
9247
|
-
if (isX509) {
|
|
9248
|
-
const args = expr.arguments?.nodes ?? [];
|
|
9249
|
-
if (args.length !== 1) {
|
|
9250
|
-
lowerer.noLowering("X509Certificate with this argument shape", expr, "the supported form is new X509Certificate(readFileSync(path))");
|
|
9251
|
-
}
|
|
9252
|
-
const data = lowerer.lowerExpr(args[0]);
|
|
9253
|
-
const isBytes = data.type.kind === "bytes" && data.type.elem === "u8";
|
|
9254
|
-
if (!isBytes && data.type.kind !== "string") {
|
|
9255
|
-
lowerer.noLowering(`X509Certificate over '${lowerer.fmt(data.type)}' data`, args[0], "pass the certificate Buffer or PEM string (an fs.readFileSync result)");
|
|
9256
|
-
}
|
|
9257
|
-
const t = lowerer.mapTypeOf(lowerer.typeOf(expr));
|
|
9258
|
-
if (t?.kind !== "record")
|
|
9259
|
-
lowerer.badType(expr, lowerer.typeOf(expr));
|
|
9260
|
-
const key = `x509.record:${isBytes ? "bytes" : "str"}`;
|
|
9261
|
-
let helper = lowerer.valueHelpers.get(key);
|
|
9262
|
-
if (!helper) {
|
|
9263
|
-
helper = keyedHelperName(lowerer, "%x509.record", key);
|
|
9264
|
-
lowerer.valueHelpers.set(key, helper);
|
|
9265
|
-
const dataT = data.type;
|
|
9266
|
-
const dRef = { kind: "varRef", localId: "d.0", type: dataT, loc };
|
|
9267
|
-
const field = (name, fn) => ({
|
|
9268
|
-
name,
|
|
9269
|
-
value: { kind: "libCall", fn, args: [dRef], type: STRING, loc },
|
|
9270
|
-
});
|
|
9271
|
-
lowerer.liftedFns.push({
|
|
9272
|
-
name: helper,
|
|
9273
|
-
params: [{ localId: "d.0", name: "d", type: dataT }],
|
|
9274
|
-
returnType: t,
|
|
9275
|
-
locals: [{ id: "d.0", name: "d", type: dataT, mutable: false }],
|
|
9276
|
-
body: [
|
|
9277
|
-
{
|
|
9278
|
-
kind: "return",
|
|
9279
|
-
value: {
|
|
9280
|
-
kind: "recordLit",
|
|
9281
|
-
fields: [
|
|
9282
|
-
field("fingerprint", isBytes ? "crypto.x509Fingerprint" : "crypto.x509FingerprintStr"),
|
|
9283
|
-
field("validFrom", isBytes ? "crypto.x509ValidFrom" : "crypto.x509ValidFromStr"),
|
|
9284
|
-
field("validTo", isBytes ? "crypto.x509ValidTo" : "crypto.x509ValidToStr"),
|
|
9285
|
-
],
|
|
9286
|
-
type: t,
|
|
9287
|
-
loc,
|
|
9288
|
-
},
|
|
9289
|
-
loc,
|
|
9290
|
-
},
|
|
9291
|
-
],
|
|
9292
|
-
loc,
|
|
9293
|
-
});
|
|
9294
|
-
}
|
|
9295
|
-
return { kind: "call", callee: helper, args: [data], type: t, loc };
|
|
9296
|
-
}
|
|
9297
|
-
}
|
|
9298
9531
|
// `new X(...)` through a class VALUE (a classval-typed binding, array
|
|
9299
9532
|
// element, map read, param): the newValue dispatch through the class
|
|
9300
9533
|
// object's construct thunk. Arguments complete against the STATIC
|
|
@@ -9333,9 +9566,108 @@ export function lowerNew(lowerer, expr) {
|
|
|
9333
9566
|
if (info.generic) {
|
|
9334
9567
|
lowerer.unsupported("SC1090", expr, "constructing through a class value of an uninstantiated generic type (annotate the slot with a concrete instantiation — e.g. 'new (v: number) => Box<number>')");
|
|
9335
9568
|
}
|
|
9336
|
-
|
|
9569
|
+
let callee = lowerer.lowerExpr(expr.expression);
|
|
9337
9570
|
if (callee.type.kind === "dyn")
|
|
9338
9571
|
return lowerCheckedConstructor(lowerer, expr, callee);
|
|
9572
|
+
/** The union-typed element read a narrowing check guards, and the
|
|
9573
|
+
* check (`%new.callee`) that yields the class value or throws. */
|
|
9574
|
+
let narrowedCallee = null;
|
|
9575
|
+
// An array element read (`new T[0]()` over `[Dog, Animal]`, whose
|
|
9576
|
+
// checker type is the common base) keeps the undefined an index past
|
|
9577
|
+
// the end reads: the class value is narrowed out with a check, which
|
|
9578
|
+
// throws a TypeError for undefined.
|
|
9579
|
+
if (callee.type.kind === "union") {
|
|
9580
|
+
const arms = lowerer.unions.get(callee.type.unionId)?.arms ?? [];
|
|
9581
|
+
const classArms = arms.filter((arm) => arm.kind === "classval");
|
|
9582
|
+
if (classArms.length === 1 &&
|
|
9583
|
+
classArms[0].kind === "classval" &&
|
|
9584
|
+
classArms[0].className === calleeT.className &&
|
|
9585
|
+
arms.every((arm) => arm.kind === "classval" || arm.kind === "undefinedT")) {
|
|
9586
|
+
const unionT = callee.type;
|
|
9587
|
+
const helper = lowerer.narrowedArmHelper(unionT.unionId, calleeT, callee.loc);
|
|
9588
|
+
if (helper) {
|
|
9589
|
+
const loc = callee.loc;
|
|
9590
|
+
const name = `%new.callee:${unionT.unionId}`;
|
|
9591
|
+
if (!lowerer.liftedFns.some((fn) => fn.name === name)) {
|
|
9592
|
+
const undefinedTag = lowerer.armTag(unionT.unionId, UNDEFINED_T);
|
|
9593
|
+
const value = { kind: "varRef", localId: "value", type: unionT, loc };
|
|
9594
|
+
lowerer.liftedFns.push({
|
|
9595
|
+
name,
|
|
9596
|
+
params: [
|
|
9597
|
+
{ localId: "value", name: "value", type: unionT },
|
|
9598
|
+
{ localId: "message", name: "message", type: STRING },
|
|
9599
|
+
],
|
|
9600
|
+
locals: [
|
|
9601
|
+
{ id: "value", name: "value", type: unionT, mutable: false },
|
|
9602
|
+
{ id: "message", name: "message", type: STRING, mutable: false },
|
|
9603
|
+
],
|
|
9604
|
+
returnType: calleeT,
|
|
9605
|
+
body: [
|
|
9606
|
+
...(undefinedTag >= 0
|
|
9607
|
+
? [
|
|
9608
|
+
{
|
|
9609
|
+
kind: "if",
|
|
9610
|
+
cond: {
|
|
9611
|
+
kind: "unionIsTag",
|
|
9612
|
+
unionId: unionT.unionId,
|
|
9613
|
+
tag: undefinedTag,
|
|
9614
|
+
negated: false,
|
|
9615
|
+
value,
|
|
9616
|
+
type: BOOL,
|
|
9617
|
+
loc,
|
|
9618
|
+
},
|
|
9619
|
+
then: [
|
|
9620
|
+
{
|
|
9621
|
+
kind: "throw",
|
|
9622
|
+
value: {
|
|
9623
|
+
kind: "libCall",
|
|
9624
|
+
fn: "error.new",
|
|
9625
|
+
args: [{ kind: "varRef", localId: "message", type: STRING, loc }],
|
|
9626
|
+
type: { kind: "object", className: "%TypeError" },
|
|
9627
|
+
loc,
|
|
9628
|
+
},
|
|
9629
|
+
loc,
|
|
9630
|
+
},
|
|
9631
|
+
],
|
|
9632
|
+
else_: null,
|
|
9633
|
+
loc,
|
|
9634
|
+
},
|
|
9635
|
+
]
|
|
9636
|
+
: []),
|
|
9637
|
+
{
|
|
9638
|
+
kind: "return",
|
|
9639
|
+
value: lowerer.checkedNarrowCall(helper, value, calleeT, loc),
|
|
9640
|
+
loc,
|
|
9641
|
+
},
|
|
9642
|
+
],
|
|
9643
|
+
loc,
|
|
9644
|
+
});
|
|
9645
|
+
}
|
|
9646
|
+
// JavaScript evaluates the arguments before it checks that the
|
|
9647
|
+
// callee constructs, so the check runs at the construction
|
|
9648
|
+
// (checkedElementConstruction).
|
|
9649
|
+
narrowedCallee = {
|
|
9650
|
+
read: callee,
|
|
9651
|
+
check: name,
|
|
9652
|
+
unionT,
|
|
9653
|
+
calleeT,
|
|
9654
|
+
message: {
|
|
9655
|
+
kind: "strLit",
|
|
9656
|
+
value: `${expr.expression.getText()} is not a constructor`,
|
|
9657
|
+
type: STRING,
|
|
9658
|
+
loc,
|
|
9659
|
+
},
|
|
9660
|
+
};
|
|
9661
|
+
callee = {
|
|
9662
|
+
kind: "call",
|
|
9663
|
+
callee: name,
|
|
9664
|
+
args: [callee, narrowedCallee.message],
|
|
9665
|
+
type: calleeT,
|
|
9666
|
+
loc,
|
|
9667
|
+
};
|
|
9668
|
+
}
|
|
9669
|
+
}
|
|
9670
|
+
}
|
|
9339
9671
|
if (callee.type.kind !== "classval")
|
|
9340
9672
|
lowerer.badType(expr.expression, lowerer.typeOf(expr.expression));
|
|
9341
9673
|
lowerer.noteEdge(classValueConstructor(info.def).fn);
|
|
@@ -9361,13 +9693,15 @@ export function lowerNew(lowerer, expr) {
|
|
|
9361
9693
|
refuseInheritedBuiltinCtorArgs(lowerer, info, expr);
|
|
9362
9694
|
defineClassValueConstruct(lowerer, info);
|
|
9363
9695
|
const args = lowerer.completeArgs(expr.arguments?.nodes ?? [], classValueParams(info), loc, expr);
|
|
9364
|
-
const built = constructedFromValue(lowerer, info,
|
|
9365
|
-
|
|
9366
|
-
|
|
9367
|
-
|
|
9368
|
-
|
|
9369
|
-
|
|
9370
|
-
|
|
9696
|
+
const built = constructedFromValue(lowerer, info, narrowedCallee !== null
|
|
9697
|
+
? checkedElementConstruction(lowerer, info, narrowedCallee, args, loc)
|
|
9698
|
+
: {
|
|
9699
|
+
kind: "newValue",
|
|
9700
|
+
callee,
|
|
9701
|
+
args,
|
|
9702
|
+
type: { kind: "object", className: info.def.name },
|
|
9703
|
+
loc,
|
|
9704
|
+
}, expr);
|
|
9371
9705
|
// A runtime class slot widened from a union (`[Readable, Writable]`'s
|
|
9372
9706
|
// elements hold EventEmitter values): the checker types the result as
|
|
9373
9707
|
// the union of the arms' instances, which the checked class view
|
|
@@ -9502,14 +9836,149 @@ function genericFieldFnNodeOf(member) {
|
|
|
9502
9836
|
}
|
|
9503
9837
|
return null;
|
|
9504
9838
|
}
|
|
9839
|
+
/** The lifted `new crypto.X509Certificate(d)` constructor: raw decodes the
|
|
9840
|
+
* input once (Node's PEM error throws here), and every other field reads
|
|
9841
|
+
* raw. subjectAltName, infoAccess and signatureAlgorithm hold undefined
|
|
9842
|
+
* where the runtime answers "". */
|
|
9843
|
+
/** The X509Certificate record `t` built from `data`, a certificate Buffer
|
|
9844
|
+
* (PEM or DER) or PEM string, through the interned constructor helper.
|
|
9845
|
+
* `der` marks a Buffer known to hold a certificate's DER (a TLS socket's),
|
|
9846
|
+
* which is read without looking for PEM armor inside it. */
|
|
9847
|
+
export function x509RecordCall(lowerer, data, t, loc, der = false) {
|
|
9848
|
+
const isBytes = data.type.kind === "bytes" && data.type.elem === "u8";
|
|
9849
|
+
const key = `x509.record:${der ? "der" : isBytes ? "bytes" : "str"}`;
|
|
9850
|
+
let helper = lowerer.valueHelpers.get(key);
|
|
9851
|
+
if (!helper) {
|
|
9852
|
+
helper = keyedHelperName(lowerer, "%x509.record", key);
|
|
9853
|
+
lowerer.valueHelpers.set(key, helper);
|
|
9854
|
+
lowerer.liftedFns.push(x509RecordHelper(lowerer, helper, data.type, t, isBytes, der, loc));
|
|
9855
|
+
}
|
|
9856
|
+
return { kind: "call", callee: helper, args: [data], type: t, loc };
|
|
9857
|
+
}
|
|
9858
|
+
function x509RecordHelper(lowerer, name, dataT, t, isBytes, der, loc) {
|
|
9859
|
+
const shape = lowerer.shapes.get(t.shapeId);
|
|
9860
|
+
if (!shape)
|
|
9861
|
+
throw new InternalCompilerError("lowerer bug: X509Certificate shape unregistered");
|
|
9862
|
+
const raw = { kind: "varRef", localId: "raw.0", type: BYTES_U8, loc };
|
|
9863
|
+
const call = (fn, type) => ({
|
|
9864
|
+
kind: "libCall",
|
|
9865
|
+
fn,
|
|
9866
|
+
args: [raw],
|
|
9867
|
+
type,
|
|
9868
|
+
loc,
|
|
9869
|
+
});
|
|
9870
|
+
const locals = [
|
|
9871
|
+
{ id: "d.0", name: "d", type: dataT, mutable: false },
|
|
9872
|
+
{ id: "raw.0", name: "raw", type: BYTES_U8, mutable: false },
|
|
9873
|
+
];
|
|
9874
|
+
const decls = [
|
|
9875
|
+
{
|
|
9876
|
+
kind: "varDecl",
|
|
9877
|
+
localId: "raw.0",
|
|
9878
|
+
init: {
|
|
9879
|
+
kind: "libCall",
|
|
9880
|
+
fn: der ? "crypto.x509RawDer" : isBytes ? "crypto.x509Raw" : "crypto.x509RawStr",
|
|
9881
|
+
args: [{ kind: "varRef", localId: "d.0", type: dataT, loc }],
|
|
9882
|
+
type: BYTES_U8,
|
|
9883
|
+
loc,
|
|
9884
|
+
},
|
|
9885
|
+
loc,
|
|
9886
|
+
},
|
|
9887
|
+
];
|
|
9888
|
+
const validTime = (fn) => ({
|
|
9889
|
+
kind: "libCall",
|
|
9890
|
+
fn: "date.newString",
|
|
9891
|
+
args: [call(fn, STRING)],
|
|
9892
|
+
type: DATE_T,
|
|
9893
|
+
loc,
|
|
9894
|
+
});
|
|
9895
|
+
const values = {
|
|
9896
|
+
ca: () => call("crypto.x509Ca", BOOL),
|
|
9897
|
+
fingerprint: () => call("crypto.x509Fingerprint", STRING),
|
|
9898
|
+
fingerprint256: () => call("crypto.x509Fingerprint256", STRING),
|
|
9899
|
+
fingerprint512: () => call("crypto.x509Fingerprint512", STRING),
|
|
9900
|
+
subject: () => call("crypto.x509Subject", STRING),
|
|
9901
|
+
subjectAltName: (type) => optionalText("san", "crypto.x509SubjectAltName", type),
|
|
9902
|
+
infoAccess: (type) => optionalText("access", "crypto.x509InfoAccess", type),
|
|
9903
|
+
issuer: () => call("crypto.x509Issuer", STRING),
|
|
9904
|
+
raw: () => raw,
|
|
9905
|
+
serialNumber: () => call("crypto.x509SerialNumber", STRING),
|
|
9906
|
+
signatureAlgorithm: (type) => optionalText("sigalg", "crypto.x509SignatureAlgorithm", type),
|
|
9907
|
+
signatureAlgorithmOid: () => call("crypto.x509SignatureAlgorithmOid", STRING),
|
|
9908
|
+
validFrom: () => call("crypto.x509ValidFrom", STRING),
|
|
9909
|
+
validFromDate: () => validTime("crypto.x509ValidFrom"),
|
|
9910
|
+
validTo: () => call("crypto.x509ValidTo", STRING),
|
|
9911
|
+
validToDate: () => validTime("crypto.x509ValidTo"),
|
|
9912
|
+
[X509_PUBLIC_KEY_FIELD]: () => ({
|
|
9913
|
+
kind: "dynFrom",
|
|
9914
|
+
value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
|
|
9915
|
+
type: DYN,
|
|
9916
|
+
loc,
|
|
9917
|
+
}),
|
|
9918
|
+
// A copy: writes into `raw` must not reach the methods.
|
|
9919
|
+
[X509_DER_FIELD]: () => call("crypto.x509RawDer", BYTES_U8),
|
|
9920
|
+
};
|
|
9921
|
+
/** A string | undefined field: the runtime's text, or undefined for "". */
|
|
9922
|
+
function optionalText(local, fn, type) {
|
|
9923
|
+
if (type.kind !== "union")
|
|
9924
|
+
throw new InternalCompilerError("lowerer bug: X509Certificate optional field type");
|
|
9925
|
+
const def = lowerer.unions.get(type.unionId);
|
|
9926
|
+
const stringTag = def ? def.arms.findIndex((a) => a.kind === "string") : -1;
|
|
9927
|
+
const undefinedTag = def ? def.arms.findIndex((a) => a.kind === "undefinedT") : -1;
|
|
9928
|
+
if (stringTag < 0 || undefinedTag < 0)
|
|
9929
|
+
throw new InternalCompilerError("lowerer bug: X509Certificate optional field arms");
|
|
9930
|
+
const id = `${local}.0`;
|
|
9931
|
+
locals.push({ id, name: local, type: STRING, mutable: false });
|
|
9932
|
+
decls.push({ kind: "varDecl", localId: id, init: call(fn, STRING), loc });
|
|
9933
|
+
const text = { kind: "varRef", localId: id, type: STRING, loc };
|
|
9934
|
+
return {
|
|
9935
|
+
kind: "ternary",
|
|
9936
|
+
cond: {
|
|
9937
|
+
kind: "strEq",
|
|
9938
|
+
negated: false,
|
|
9939
|
+
left: text,
|
|
9940
|
+
right: { kind: "strLit", value: "", type: STRING, loc },
|
|
9941
|
+
type: BOOL,
|
|
9942
|
+
loc,
|
|
9943
|
+
},
|
|
9944
|
+
then: {
|
|
9945
|
+
kind: "unionWrap",
|
|
9946
|
+
unionId: type.unionId,
|
|
9947
|
+
tag: undefinedTag,
|
|
9948
|
+
value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
|
|
9949
|
+
type,
|
|
9950
|
+
loc,
|
|
9951
|
+
},
|
|
9952
|
+
else_: { kind: "unionWrap", unionId: type.unionId, tag: stringTag, value: text, type, loc },
|
|
9953
|
+
type,
|
|
9954
|
+
loc,
|
|
9955
|
+
};
|
|
9956
|
+
}
|
|
9957
|
+
const fields = shape.fields.map((f) => {
|
|
9958
|
+
const value = values[f.name];
|
|
9959
|
+
if (!value)
|
|
9960
|
+
throw new InternalCompilerError(`lowerer bug: X509Certificate field ${f.name}`);
|
|
9961
|
+
return { name: f.name, value: value(f.type) };
|
|
9962
|
+
});
|
|
9963
|
+
return {
|
|
9964
|
+
name,
|
|
9965
|
+
params: [{ localId: "d.0", name: "d", type: dataT }],
|
|
9966
|
+
returnType: t,
|
|
9967
|
+
locals,
|
|
9968
|
+
body: [...decls, { kind: "return", value: { kind: "recordLit", fields, type: t, loc }, loc }],
|
|
9969
|
+
loc,
|
|
9970
|
+
};
|
|
9971
|
+
}
|
|
9505
9972
|
/** Whether a JavaScript class's own binding is the target of
|
|
9506
|
-
* `Object.defineProperty`/`defineProperties`
|
|
9507
|
-
* (`Object.defineProperty(Definition, "name", { value })
|
|
9973
|
+
* `Object.defineProperty`/`defineProperties` or `Reflect.deleteProperty` in
|
|
9974
|
+
* its file (`Object.defineProperty(Definition, "name", { value })`,
|
|
9975
|
+
* `Reflect.deleteProperty(Response, "getResponseState")`): its constructor
|
|
9508
9976
|
* then needs a live own-property table. */
|
|
9509
9977
|
function definedThroughReflection(lowerer, decl) {
|
|
9510
9978
|
const name = decl.name;
|
|
9511
9979
|
const sf = ts.getSourceFileOfNode(decl);
|
|
9512
|
-
if (name === undefined ||
|
|
9980
|
+
if (name === undefined ||
|
|
9981
|
+
(!sf.text.includes("definePropert") && !sf.text.includes("deleteProperty")))
|
|
9513
9982
|
return false;
|
|
9514
9983
|
const symbol = lowerer.checker.getSymbolAtLocation(name);
|
|
9515
9984
|
if (symbol === undefined)
|
|
@@ -9520,9 +9989,11 @@ function definedThroughReflection(lowerer, decl) {
|
|
|
9520
9989
|
return "stop";
|
|
9521
9990
|
if (ts.isCallExpression(node) &&
|
|
9522
9991
|
ts.isPropertyAccessExpression(node.expression) &&
|
|
9523
|
-
(node.expression.name.text === "defineProperty" ||
|
|
9992
|
+
(((node.expression.name.text === "defineProperty" ||
|
|
9524
9993
|
node.expression.name.text === "defineProperties") &&
|
|
9525
|
-
|
|
9994
|
+
lowerer.stdlibGlobalMember(node.expression, "Object") !== null) ||
|
|
9995
|
+
(node.expression.name.text === "deleteProperty" &&
|
|
9996
|
+
lowerer.stdlibGlobalMember(node.expression, "Reflect") !== null))) {
|
|
9526
9997
|
const target = node.arguments.nodes[0];
|
|
9527
9998
|
if (target !== undefined &&
|
|
9528
9999
|
ts.isIdentifier(target) &&
|