@scriptc/compiler 0.4.3 → 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 +270 -72
- 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 +244 -20
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +18 -6
- 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 +72 -6
- 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 +69 -8
- package/dist/backend/llvm/dyn.js +396 -49
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +30 -16
- 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 +74 -29
- 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 +144 -13
- package/dist/backend/llvm/emitter.js +523 -92
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +11 -2
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +11 -13
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +6 -4
- package/dist/backend/llvm/expr-bytes.js +45 -16
- 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 +101 -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 +121 -14
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +111 -26
- 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 +12 -0
- package/dist/backend/llvm/integer-values.js +69 -5
- 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 +249 -33
- 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 +48 -1
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +64 -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/publish.js +3 -3
- package/dist/backend/llvm/publish.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/reference-effects.js +3 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- 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 +106 -58
- 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-captures.js +1 -5
- package/dist/backend/llvm/stack-captures.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/union-repr.d.ts +4 -3
- package/dist/backend/llvm/union-repr.js +6 -5
- package/dist/backend/llvm/union-repr.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/walkers.js +13 -0
- package/dist/backend/llvm/walkers.js.map +1 -1
- 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-core.d.ts +5 -3
- package/dist/backend/native-codegen-core.js +13 -6
- package/dist/backend/native-codegen-core.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-codegen.test.js +6 -4
- package/dist/backend/native-codegen.test.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/target-cpu.d.ts +26 -0
- package/dist/backend/target-cpu.js +98 -0
- package/dist/backend/target-cpu.js.map +1 -0
- package/dist/backend/target-cpu.test.d.ts +1 -0
- package/dist/backend/target-cpu.test.js +38 -0
- package/dist/backend/target-cpu.test.js.map +1 -0
- 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 +98 -12
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +25 -1
- package/dist/cli/usage.js +40 -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 +14 -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 +53 -2
- 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 +6 -0
- package/dist/executable/executable-cache.js +5 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +3 -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/decl-projection.js +105 -10
- package/dist/frontend/decl-projection.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/async-context.d.ts +8 -2
- package/dist/frontend/lowering/builtins/async-context.js +62 -3
- package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
- 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/crypto.js +3 -1
- package/dist/frontend/lowering/builtins/crypto.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 +163 -9
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +29 -4
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
- package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
- package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
- package/dist/frontend/lowering/builtins/fs-paths.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-calls.js +6 -3
- package/dist/frontend/lowering/builtins/module-calls.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.d.ts +1 -1
- package/dist/frontend/lowering/builtins/promises.js +293 -139
- 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 -2
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
- package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
- package/dist/frontend/lowering/cjs-inline-require.js +308 -5
- 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 +23 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +288 -9
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +97 -26
- 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-protocols.d.ts +25 -0
- package/dist/frontend/lowering/class-protocols.js +183 -1
- package/dist/frontend/lowering/class-protocols.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/completion-callbacks.d.ts +4 -0
- package/dist/frontend/lowering/completion-callbacks.js +146 -0
- package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
- package/dist/frontend/lowering/containers/array-callbacks.js +58 -21
- 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 +107 -9
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +96 -8
- 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/bytes.d.ts +25 -17
- package/dist/frontend/lowering/containers/bytes.js +453 -45
- package/dist/frontend/lowering/containers/bytes.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 +14 -0
- package/dist/frontend/lowering/date-values.js +254 -0
- package/dist/frontend/lowering/date-values.js.map +1 -0
- 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 +125 -26
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +102 -26
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +129 -6
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +66 -4
- 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 +121 -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 +12 -1
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +37 -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 +30 -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/indexed-unions.d.ts +54 -0
- package/dist/frontend/lowering/indexed-unions.js +401 -0
- package/dist/frontend/lowering/indexed-unions.js.map +1 -0
- 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/key-order-witness.js +210 -32
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +104 -4
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- 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 +298 -29
- 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 +116 -10
- 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 +668 -222
- 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 +254 -3
- 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 +5 -4
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
- package/dist/frontend/lowering/lower-inspect.js +299 -57
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +49 -22
- 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 +393 -79
- 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 +82 -12
- package/dist/frontend/lowering/lowerer.js +317 -44
- 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/object-factory-new.d.ts +5 -0
- package/dist/frontend/lowering/object-factory-new.js +20 -6
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/overload-choice.d.ts +33 -0
- package/dist/frontend/lowering/overload-choice.js +190 -0
- package/dist/frontend/lowering/overload-choice.js.map +1 -0
- 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 +1630 -1540
- 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 +103 -12
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +7 -1
- package/dist/frontend/program-analysis.js +8 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +28 -5
- package/dist/frontend/program.js +422 -76
- 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.d.ts +3 -0
- package/dist/frontend/ts7/semantic-model.js +8 -1
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +6 -1
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-types.d.ts +1 -1
- package/dist/frontend/ts7/semantic-types.js +1 -1
- package/dist/frontend/ts7/semantic-types.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 +205 -44
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +44 -3
- package/dist/index.js +39 -8
- package/dist/index.js.map +1 -1
- package/dist/ir/builtin-effects.js +37 -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 -4894
- 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 +291 -5
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +38 -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 +107 -11
- 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 +63 -11
- package/dist/ir/ir.js +47 -7
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +2 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +10 -3
- package/dist/ir/js-ic.js +14 -2
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +11 -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 +94 -13
- 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 +78 -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 +5 -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.d.ts +1 -1
- package/dist/native/prepare.js +49 -17
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +69 -3
- 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 +21 -38
package/dist/backend/llvm/dyn.js
CHANGED
|
@@ -5,7 +5,7 @@ import { BYTES_ELEM_NUM, SCR_ARR_FIELD, SCR_ARR_STATES, f64Lit, sizeToDouble } f
|
|
|
5
5
|
import { emitUnionPeek, emitUnionTag } from "./union-repr.js";
|
|
6
6
|
import { INLINE_UNION_FIELD, loadInlineUnion, stackUnionBox, storeInlineUnion, unionBoxBits, } from "./inline-unions.js";
|
|
7
7
|
import { InternalCompilerError } from "../../errors.js";
|
|
8
|
-
import { accessorSlotProp, DYN_HANDLE_KINDS, isDirentShape, KEY_ORDER_FIELD, shapeKeyOrders, isDynTypedRefType, isRefCounted, isUnitType,
|
|
8
|
+
import { accessorSlotProp, DYN_HANDLE_KINDS, isDirentShape, KEY_ORDER_FIELD, shapeKeyOrders, isDynTypedRefType, isRefCounted, isUnitType, recordHandleCodecClass, textCodecRecordClass, typeKey, } from "../../ir/ir.js";
|
|
9
9
|
import { dynDesc, streamTypedRefEligible } from "../../ir/analysis.js";
|
|
10
10
|
import { mangleRecordNew, mangleRecordStruct } from "../mangle.js";
|
|
11
11
|
import { BlockBuilder } from "./blocks.js";
|
|
@@ -13,6 +13,24 @@ import { llvmCommentText } from "./common.js";
|
|
|
13
13
|
import { arrNewCall, elemAccess, llFieldType, mapFlagsOffset, releaseSym, traceAdapter, traceArg, vAdapters, } from "./shapes.js";
|
|
14
14
|
import { LlvmUnsupportedError } from "./unsupported.js";
|
|
15
15
|
import { recordMayKeepSource, recordSourceFieldOrder } from "./record-sources.js";
|
|
16
|
+
/** typeKey with `?` after every `(T | undefined)[]` (optionalElements),
|
|
17
|
+
* at any depth of arrays, Maps, Sets and promises: checked conversions to
|
|
18
|
+
* `number[][]` and `(number | undefined)[][]` need separate helpers, though
|
|
19
|
+
* the two types share a typeKey. */
|
|
20
|
+
function checkedConversionKey(t) {
|
|
21
|
+
switch (t.kind) {
|
|
22
|
+
case "array":
|
|
23
|
+
return `array<${checkedConversionKey(t.elem)}>${t.optionalElements ? "?" : ""}`;
|
|
24
|
+
case "map":
|
|
25
|
+
return `map<${checkedConversionKey(t.key)},${checkedConversionKey(t.value)}>`;
|
|
26
|
+
case "set":
|
|
27
|
+
return `set<${checkedConversionKey(t.elem)}>`;
|
|
28
|
+
case "promise":
|
|
29
|
+
return `promise<${checkedConversionKey(t.inner)}>`;
|
|
30
|
+
default:
|
|
31
|
+
return typeKey(t);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
16
34
|
/** Whether to-dyn of a record shape keeps the record itself: an empty shape
|
|
17
35
|
* and an event-listener record (a `handleEvent` function field) box their
|
|
18
36
|
* identity. Every other shape, tuples included, copies its fields into a
|
|
@@ -45,10 +63,12 @@ export const DYN_HANDLE_TAG_NUM = {
|
|
|
45
63
|
export const TEXT_CODEC_TAG_NUM = {
|
|
46
64
|
TextDecoder: 76,
|
|
47
65
|
TextEncoder: 77,
|
|
66
|
+
StringDecoder: 78,
|
|
48
67
|
};
|
|
49
68
|
/** The decoder record fields scr_text_decoder_to_dyn reads, in its
|
|
50
69
|
* parameter order. */
|
|
51
70
|
const TEXT_DECODER_FIELDS = ["%TextDecoder", "%fatal", "%ignoreBOM", "%state"];
|
|
71
|
+
const STRING_DECODER_FIELDS = ["%enc", "%pending"];
|
|
52
72
|
/** Handle kinds whose runtime unit boxes them through its own function,
|
|
53
73
|
* which installs the tag's ops on first use (scr_crypto.h). Programs that
|
|
54
74
|
* never box one of these values do not link its dynamic members. */
|
|
@@ -89,6 +109,17 @@ export const DYN_KIND = {
|
|
|
89
109
|
BIGINT: 14,
|
|
90
110
|
SYMBOL: 15,
|
|
91
111
|
};
|
|
112
|
+
/** Union arm kinds whose matchers reject every plain dyn object
|
|
113
|
+
* (trustedArmByLiteral). */
|
|
114
|
+
const NON_OBJECT_ARM_KINDS = new Set([
|
|
115
|
+
"f64",
|
|
116
|
+
"string",
|
|
117
|
+
"bool",
|
|
118
|
+
"nullT",
|
|
119
|
+
"undefinedT",
|
|
120
|
+
"bigint",
|
|
121
|
+
"symbol",
|
|
122
|
+
]);
|
|
92
123
|
const FN_ATTRS = "#0";
|
|
93
124
|
/** scr_dyn_builtin_stream_check's kind for a runtime stream class (the
|
|
94
125
|
* numbering of scr_dyn_builtin_class.c), or null. */
|
|
@@ -102,6 +133,10 @@ function builtinStreamKind(className) {
|
|
|
102
133
|
};
|
|
103
134
|
return kinds[className] ?? null;
|
|
104
135
|
}
|
|
136
|
+
/** Unions whose discriminant has fewer string literals keep one literal test
|
|
137
|
+
* per arm (dispatchValues): one runtime lookup costs about what a few
|
|
138
|
+
* literal tests do. */
|
|
139
|
+
const DISCRIMINANT_DISPATCH_VALUES = 4;
|
|
105
140
|
export class LlDyn {
|
|
106
141
|
host;
|
|
107
142
|
dynMatchers = new Map();
|
|
@@ -276,6 +311,48 @@ export class LlDyn {
|
|
|
276
311
|
this.host.declare(`declare void @scr_dyn_build_add(ptr, ptr, ptr)`);
|
|
277
312
|
B.line(`call void @scr_dyn_build_add(ptr %d, ptr @${name}, ptr ${value})`);
|
|
278
313
|
}
|
|
314
|
+
/** Whether a builder of `def` may pick a plain object's arm by its literal
|
|
315
|
+
* discriminator alone inside a trusted build (scr_dyn_trust_enter): the
|
|
316
|
+
* arms' literals are disjoint, and every arm without a literal has a kind
|
|
317
|
+
* no plain object matches. The value then matched exactly one arm with a
|
|
318
|
+
* literal, the arm whose literal it carries. */
|
|
319
|
+
trustedArmByLiteral(def) {
|
|
320
|
+
const discriminant = def.discriminant;
|
|
321
|
+
if (!discriminant)
|
|
322
|
+
return false;
|
|
323
|
+
const seen = new Set();
|
|
324
|
+
for (const { values } of discriminant.cases) {
|
|
325
|
+
for (const value of values) {
|
|
326
|
+
const key = `${typeof value}:${String(value)}`;
|
|
327
|
+
if (seen.has(key))
|
|
328
|
+
return false;
|
|
329
|
+
seen.add(key);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return def.arms.every((arm, tag) => discriminant.cases.some((candidate) => candidate.tag === tag) ||
|
|
333
|
+
NON_OBJECT_ARM_KINDS.has(arm.kind));
|
|
334
|
+
}
|
|
335
|
+
/** Per arm of `def`, the dyn kind of the values a builder may convert into
|
|
336
|
+
* that arm without matching its structure inside a trusted build, or null.
|
|
337
|
+
* A value there already matched one of the union's arms, so the arm is
|
|
338
|
+
* known when it is the only arm that takes values of its kind: the arm
|
|
339
|
+
* whose literal a plain object carries (trustedArmByLiteral), or the one
|
|
340
|
+
* arm a plain object or an array can match at all. */
|
|
341
|
+
trustedArmKinds(def) {
|
|
342
|
+
const byLiteral = this.trustedArmByLiteral(def);
|
|
343
|
+
const objectArms = def.arms.flatMap((arm, tag) => NON_OBJECT_ARM_KINDS.has(arm.kind) ? [] : [tag]);
|
|
344
|
+
return def.arms.map((arm, tag) => {
|
|
345
|
+
if (def.discriminant?.cases.some((candidate) => candidate.tag === tag))
|
|
346
|
+
return byLiteral ? DYN_KIND.OBJ : null;
|
|
347
|
+
if (objectArms.length !== 1 || objectArms[0] !== tag)
|
|
348
|
+
return null;
|
|
349
|
+
if (arm.kind === "array")
|
|
350
|
+
return DYN_KIND.ARR;
|
|
351
|
+
if (arm.kind === "record" && this.host.recordsById.get(arm.shapeId)?.tuple !== true)
|
|
352
|
+
return DYN_KIND.OBJ;
|
|
353
|
+
return null;
|
|
354
|
+
});
|
|
355
|
+
}
|
|
279
356
|
/** The order a dyn value tries a union's arms in: the canonical order,
|
|
280
357
|
* except that among the record arms, those with more required fields go
|
|
281
358
|
* first, then those with more fields. Records are width-tolerant, so an
|
|
@@ -304,9 +381,99 @@ export class LlDyn {
|
|
|
304
381
|
records.forEach((slot, k) => (order[slot] = widest[k]));
|
|
305
382
|
return order;
|
|
306
383
|
}
|
|
384
|
+
/** The string literals of `def`'s discriminant when its arms are chosen
|
|
385
|
+
* by reading the discriminant once (unionArmsByDiscriminant), or null
|
|
386
|
+
* when the union keeps one literal test per arm: some literal is not a
|
|
387
|
+
* string, or there are fewer than DISCRIMINANT_DISPATCH_VALUES. */
|
|
388
|
+
dispatchValues(def) {
|
|
389
|
+
const values = [];
|
|
390
|
+
for (const guard of def.discriminant?.cases ?? []) {
|
|
391
|
+
if (guard.values.length === 0)
|
|
392
|
+
return null;
|
|
393
|
+
for (const value of guard.values) {
|
|
394
|
+
if (typeof value !== "string")
|
|
395
|
+
return null;
|
|
396
|
+
if (!values.includes(value))
|
|
397
|
+
values.push(value);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return values.length < DISCRIMINANT_DISPATCH_VALUES ? null : values;
|
|
401
|
+
}
|
|
402
|
+
/** Branches to `hits[tag]` for the first arm in `order` that `%d` matches
|
|
403
|
+
* (unionArmMatch), or to `none` when no arm does, for
|
|
404
|
+
* a union whose discriminant literals are `values` (dispatchValues). The
|
|
405
|
+
* discriminant is read once (scr_dyn_discriminant_case, against the
|
|
406
|
+
* constant `table`), and only the arms whose literal it holds and the arms
|
|
407
|
+
* without a literal are tested, in `order`: every other arm's literal test
|
|
408
|
+
* fails. An arm's failed check can run a getter that changes the
|
|
409
|
+
* discriminant, so it is read again after each one; when its case
|
|
410
|
+
* changed, the tests continue arm by arm after the failed arm, as they
|
|
411
|
+
* would have run from the first arm. A value the runtime cannot classify
|
|
412
|
+
* that way (a typed capsule, an accessor, an inherited discriminant) takes
|
|
413
|
+
* the tests arm by arm. */
|
|
414
|
+
unionArmsByDiscriminant(B, def, values, order, hits, none, preserveRefs, table, trustedKinds = def.arms.map(() => null)) {
|
|
415
|
+
const discriminant = def.discriminant;
|
|
416
|
+
const literalsOf = (tag) => discriminant.cases.find((candidate) => candidate.tag === tag)?.values ?? null;
|
|
417
|
+
const host = this.host;
|
|
418
|
+
this.defs.push(`${table} = private unnamed_addr constant [${values.length} x ptr] [${values.map((value) => `ptr ${host.internLiteral(value)}`).join(", ")}]`, ``);
|
|
419
|
+
host.declare(`declare i32 @scr_dyn_discriminant_case(ptr, ptr, ptr, ${host.sizeType})`);
|
|
420
|
+
const classify = () => {
|
|
421
|
+
const index = B.tmp();
|
|
422
|
+
B.line(`${index} = call i32 @scr_dyn_discriminant_case(ptr %d, ptr ${host.internLiteral(discriminant.field)}, ptr ${table}, ${host.sizeType} ${values.length})`);
|
|
423
|
+
return index;
|
|
424
|
+
};
|
|
425
|
+
// The arm-by-arm tests, entered at any arm (`from[i]` tests order[i]
|
|
426
|
+
// and the arms after it).
|
|
427
|
+
const tests = B.newLabel("du.tests");
|
|
428
|
+
const from = order.map((_, i) => (i === 0 ? tests : B.newLabel("du.t")));
|
|
429
|
+
const after = (position) => position + 1 < order.length ? from[position + 1] : none;
|
|
430
|
+
// Tests the arms a value in case `k` (-1: no literal) can match.
|
|
431
|
+
const tryCase = (k) => {
|
|
432
|
+
const value = k < 0 ? null : values[k];
|
|
433
|
+
const positions = order
|
|
434
|
+
.map((_, position) => position)
|
|
435
|
+
.filter((position) => {
|
|
436
|
+
const literals = literalsOf(order[position]);
|
|
437
|
+
return literals === null || (value !== null && literals.includes(value));
|
|
438
|
+
});
|
|
439
|
+
if (positions.length === 0) {
|
|
440
|
+
B.br(none);
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
positions.forEach((position, index) => {
|
|
444
|
+
const tag = order[position];
|
|
445
|
+
const failed = B.newLabel("du.c.f");
|
|
446
|
+
this.unionArmStructure(B, def, tag, hits[tag], failed, preserveRefs, trustedKinds[tag]);
|
|
447
|
+
B.startBlock(failed);
|
|
448
|
+
const next = index === positions.length - 1 ? none : B.newLabel("du.c.n");
|
|
449
|
+
const same = B.tmp();
|
|
450
|
+
B.line(`${same} = icmp eq i32 ${classify()}, ${k}`);
|
|
451
|
+
B.condBr(same, next, after(position));
|
|
452
|
+
if (next !== none)
|
|
453
|
+
B.startBlock(next);
|
|
454
|
+
});
|
|
455
|
+
};
|
|
456
|
+
const index = classify();
|
|
457
|
+
const unmatched = B.newLabel("du.none");
|
|
458
|
+
const cases = values.map(() => B.newLabel("du.case"));
|
|
459
|
+
B.terminate(`switch i32 ${index}, label %${tests} [ i32 -1, label %${unmatched} ${cases.map((label, k) => `i32 ${k}, label %${label}`).join(" ")} ]`);
|
|
460
|
+
values.forEach((_, k) => {
|
|
461
|
+
B.startBlock(cases[k]);
|
|
462
|
+
tryCase(k);
|
|
463
|
+
});
|
|
464
|
+
B.startBlock(unmatched);
|
|
465
|
+
tryCase(-1);
|
|
466
|
+
order.forEach((tag, position) => {
|
|
467
|
+
B.startBlock(from[position]);
|
|
468
|
+
this.unionArmMatch(B, def, tag, hits[tag], after(position), preserveRefs, trustedKinds[tag]);
|
|
469
|
+
});
|
|
470
|
+
}
|
|
307
471
|
/** Branch to a variant only after its literal discriminator and complete
|
|
308
|
-
* structure match. Use the same path for predicates and builders.
|
|
309
|
-
|
|
472
|
+
* structure match. Use the same path for predicates and builders. With a
|
|
473
|
+
* `trustedKind` (builders, trustedArmKinds), a value of that dyn kind
|
|
474
|
+
* inside a trusted build skips the structure match once its literal
|
|
475
|
+
* matched. */
|
|
476
|
+
unionArmMatch(B, def, tag, yes, no, preserveRefs = false, trustedKind = null) {
|
|
310
477
|
const guard = def.discriminant?.cases.find((candidate) => candidate.tag === tag);
|
|
311
478
|
if (guard && def.discriminant) {
|
|
312
479
|
const structure = B.newLabel("du.shape");
|
|
@@ -329,6 +496,25 @@ export class LlDyn {
|
|
|
329
496
|
});
|
|
330
497
|
B.startBlock(structure);
|
|
331
498
|
}
|
|
499
|
+
this.unionArmStructure(B, def, tag, yes, no, preserveRefs, trustedKind);
|
|
500
|
+
}
|
|
501
|
+
/** The part of unionArmMatch past the arm's literal test. With a
|
|
502
|
+
* `trustedKind`, a value of that dyn kind inside a trusted build skips the
|
|
503
|
+
* structure match. */
|
|
504
|
+
unionArmStructure(B, def, tag, yes, no, preserveRefs, trustedKind = null) {
|
|
505
|
+
if (trustedKind !== null) {
|
|
506
|
+
this.host.declare(`declare zeroext i1 @scr_dyn_trusted_build()`);
|
|
507
|
+
const kind = this.kindOf(B, "%d");
|
|
508
|
+
const sameKind = B.tmp();
|
|
509
|
+
const trusted = B.tmp();
|
|
510
|
+
const skip = B.tmp();
|
|
511
|
+
B.line(`${sameKind} = icmp eq i32 ${kind}, ${trustedKind}`);
|
|
512
|
+
B.line(`${trusted} = call zeroext i1 @scr_dyn_trusted_build()`);
|
|
513
|
+
B.line(`${skip} = and i1 ${sameKind}, ${trusted}`);
|
|
514
|
+
const full = B.newLabel("du.full");
|
|
515
|
+
B.condBr(skip, yes, full);
|
|
516
|
+
B.startBlock(full);
|
|
517
|
+
}
|
|
332
518
|
const matches = B.tmp();
|
|
333
519
|
B.line(`${matches} = call zeroext i1 @${this.dynMatchHelper(def.arms[tag], preserveRefs)}(ptr %d)`);
|
|
334
520
|
B.condBr(matches, yes, no);
|
|
@@ -344,7 +530,7 @@ export class LlDyn {
|
|
|
344
530
|
}
|
|
345
531
|
/** The value LLVM type of a dynCheck result / toDyn operand for `t`. */
|
|
346
532
|
valTy(t) {
|
|
347
|
-
return t.kind === "f64" || t.kind === "
|
|
533
|
+
return t.kind === "f64" || t.kind === "procStream"
|
|
348
534
|
? "double"
|
|
349
535
|
: t.kind === "bool"
|
|
350
536
|
? "i1"
|
|
@@ -403,6 +589,12 @@ export class LlDyn {
|
|
|
403
589
|
}
|
|
404
590
|
/* ── dyn node plumbing ─────────────────────────────────────────────── */
|
|
405
591
|
/** Loads a dyn node's kind tag (after the size_t rc word). */
|
|
592
|
+
/** i1: the checked-dynamic value `d` is undefined. */
|
|
593
|
+
isUndefined(B, d) {
|
|
594
|
+
const is = B.tmp();
|
|
595
|
+
B.line(`${is} = icmp eq i32 ${this.kindOf(B, d)}, ${DYN_KIND.UNDEF}`);
|
|
596
|
+
return is;
|
|
597
|
+
}
|
|
406
598
|
kindOf(B, d) {
|
|
407
599
|
const p = B.tmp();
|
|
408
600
|
const k = B.tmp();
|
|
@@ -732,7 +924,7 @@ export class LlDyn {
|
|
|
732
924
|
}
|
|
733
925
|
/** `sc_dm_<n>(ptr d) -> i1` — does this dyn fit T? Never throws. */
|
|
734
926
|
dynMatchHelper(t, preserveRefs = false) {
|
|
735
|
-
const key =
|
|
927
|
+
const key = checkedConversionKey(t);
|
|
736
928
|
const matcherKey = preserveRefs ? `identity:${key}` : key;
|
|
737
929
|
const existing = this.dynMatchers.get(matcherKey);
|
|
738
930
|
if (existing)
|
|
@@ -774,7 +966,10 @@ export class LlDyn {
|
|
|
774
966
|
const lPlain = B.newLabel("dm.tr.plain");
|
|
775
967
|
B.condBr(capsule, lCapsule, lPlain);
|
|
776
968
|
B.startBlock(lCapsule);
|
|
777
|
-
|
|
969
|
+
// A class target matches only capsules of that class (tested above):
|
|
970
|
+
// a materialized view is a plain object, which never carries a class
|
|
971
|
+
// brand, so materializing one cannot change the answer.
|
|
972
|
+
if (preserveRefs || (t.kind === "object" && t.className !== "%Error")) {
|
|
778
973
|
B.terminate(`ret i1 false`);
|
|
779
974
|
}
|
|
780
975
|
else {
|
|
@@ -1022,7 +1217,7 @@ export class LlDyn {
|
|
|
1022
1217
|
B.startBlock(l0);
|
|
1023
1218
|
const n = this.lenOf(B, "%d");
|
|
1024
1219
|
const items = this.itemsOf(B, "%d");
|
|
1025
|
-
this.i64Loop(B, "dm.el", n, (i, brNext) => {
|
|
1220
|
+
this.i64Loop(B, "dm.el", n, (i, brNext, next) => {
|
|
1026
1221
|
this.host.declare(`declare zeroext i1 @scr_dyn_arr_has_index(ptr, ${this.S})`);
|
|
1027
1222
|
const present = B.tmp();
|
|
1028
1223
|
B.line(`${present} = call zeroext i1 @scr_dyn_arr_has_index(ptr %d, ${this.S} ${i})`);
|
|
@@ -1033,6 +1228,15 @@ export class LlDyn {
|
|
|
1033
1228
|
brNext();
|
|
1034
1229
|
B.startBlock(valueLabel);
|
|
1035
1230
|
const e = this.itemAt(B, items, i);
|
|
1231
|
+
if (t.optionalElements) {
|
|
1232
|
+
// A `(T | undefined)[]` stored as T elements takes undefined
|
|
1233
|
+
// elements as well.
|
|
1234
|
+
const undef = B.tmp();
|
|
1235
|
+
const checkLabel = B.newLabel("dm.check");
|
|
1236
|
+
B.line(`${undef} = icmp eq i32 ${this.kindOf(B, e)}, ${DYN_KIND.UNDEF}`);
|
|
1237
|
+
B.condBr(undef, next, checkLabel);
|
|
1238
|
+
B.startBlock(checkLabel);
|
|
1239
|
+
}
|
|
1036
1240
|
const ok = B.tmp();
|
|
1037
1241
|
B.line(`${ok} = call zeroext i1 @${m}(ptr ${e})`);
|
|
1038
1242
|
const lOk = B.newLabel("dm.eo");
|
|
@@ -1050,11 +1254,18 @@ export class LlDyn {
|
|
|
1050
1254
|
throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
|
|
1051
1255
|
// Arms in canonical order; any full match answers true.
|
|
1052
1256
|
const yes = B.newLabel("dm.y");
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
B.
|
|
1257
|
+
const values = this.dispatchValues(def);
|
|
1258
|
+
if (values !== null) {
|
|
1259
|
+
const no = B.newLabel("dm.n");
|
|
1260
|
+
this.unionArmsByDiscriminant(B, def, values, def.arms.map((_, tag) => tag), def.arms.map(() => yes), no, preserveRefs, `@${name}.cases`);
|
|
1261
|
+
B.startBlock(no);
|
|
1057
1262
|
}
|
|
1263
|
+
else
|
|
1264
|
+
for (let tag = 0; tag < def.arms.length; tag++) {
|
|
1265
|
+
const ln = B.newLabel("dm.n");
|
|
1266
|
+
this.unionArmMatch(B, def, tag, yes, ln, preserveRefs);
|
|
1267
|
+
B.startBlock(ln);
|
|
1268
|
+
}
|
|
1058
1269
|
B.terminate(`ret i1 false`);
|
|
1059
1270
|
B.startBlock(yes);
|
|
1060
1271
|
B.terminate(`ret i1 true`);
|
|
@@ -1103,8 +1314,9 @@ export class LlDyn {
|
|
|
1103
1314
|
* fields, and at least one unless an index signature collects the
|
|
1104
1315
|
* members), record members typed as unions of those leaves, records and
|
|
1105
1316
|
* arrays, null and undefined (optional and nullable members; see
|
|
1106
|
-
* jsonUnionSupported),
|
|
1107
|
-
*
|
|
1317
|
+
* jsonUnionSupported), discriminated unions of records anywhere (see
|
|
1318
|
+
* jsonDiscriminatedSupported), and index signatures whose value type is
|
|
1319
|
+
* not a union. Everything else keeps the checked-dynamic route alone. */
|
|
1108
1320
|
jsonSchemaSupported(t, visiting, member = false) {
|
|
1109
1321
|
switch (t.kind) {
|
|
1110
1322
|
case "f64":
|
|
@@ -1129,12 +1341,45 @@ export class LlDyn {
|
|
|
1129
1341
|
this.jsonSchemaSupported(f.type, visiting, true))) &&
|
|
1130
1342
|
(!index || this.jsonSchemaSupported(index, visiting)));
|
|
1131
1343
|
}
|
|
1132
|
-
case "union":
|
|
1344
|
+
case "union": {
|
|
1345
|
+
const def = this.host.unionsById.get(t.unionId);
|
|
1346
|
+
if (def?.discriminant)
|
|
1347
|
+
return this.jsonDiscriminatedSupported(def, visiting);
|
|
1133
1348
|
return member && this.jsonUnionSupported(t, visiting);
|
|
1349
|
+
}
|
|
1134
1350
|
default:
|
|
1135
1351
|
return false;
|
|
1136
1352
|
}
|
|
1137
1353
|
}
|
|
1354
|
+
/** A discriminated union the one-pass parser writes directly, as a record
|
|
1355
|
+
* member, an array element or the whole document: record arms that each
|
|
1356
|
+
* name the string literals their discriminant member holds, every
|
|
1357
|
+
* literal naming one arm, plus null and undefined arms. An object then
|
|
1358
|
+
* selects the one arm whose literal its discriminant member holds, the
|
|
1359
|
+
* only arm the checked route's literal tests leave to match
|
|
1360
|
+
* (unionArmsByDiscriminant); an object holding no such literal declines. */
|
|
1361
|
+
jsonDiscriminatedSupported(def, visiting) {
|
|
1362
|
+
const discriminant = def.discriminant;
|
|
1363
|
+
const literals = new Set();
|
|
1364
|
+
let records = 0;
|
|
1365
|
+
const supported = def.arms.every((arm, tag) => {
|
|
1366
|
+
if (arm.kind === "nullT" || arm.kind === "undefinedT")
|
|
1367
|
+
return true;
|
|
1368
|
+
if (arm.kind !== "record")
|
|
1369
|
+
return false;
|
|
1370
|
+
records++;
|
|
1371
|
+
const guard = discriminant.cases.find((candidate) => candidate.tag === tag);
|
|
1372
|
+
if (!guard || guard.values.length === 0)
|
|
1373
|
+
return false;
|
|
1374
|
+
for (const value of guard.values) {
|
|
1375
|
+
if (typeof value !== "string" || literals.has(value))
|
|
1376
|
+
return false;
|
|
1377
|
+
literals.add(value);
|
|
1378
|
+
}
|
|
1379
|
+
return this.jsonSchemaSupported(arm, visiting);
|
|
1380
|
+
});
|
|
1381
|
+
return supported && records >= 2;
|
|
1382
|
+
}
|
|
1138
1383
|
/** A union record member the one-pass parser writes directly: every arm
|
|
1139
1384
|
* a number, boolean, string, null, undefined, or a supported record or
|
|
1140
1385
|
* array, with at most one record and one array arm and no discriminant.
|
|
@@ -1228,9 +1473,15 @@ export class LlDyn {
|
|
|
1228
1473
|
body = `${S} 3, ${S} ${entries.length}, ptr ${fields}, ptr ${overflow.elem}, ptr @${mangleRecordNew(t.shapeId)}, ptr null, ptr ${vAdapters(host, t).release}, ptr null, ${S} ${overflow.offset}`;
|
|
1229
1474
|
break;
|
|
1230
1475
|
}
|
|
1231
|
-
case "union":
|
|
1232
|
-
|
|
1476
|
+
case "union": {
|
|
1477
|
+
// A discriminated union can be a whole document, whose value the
|
|
1478
|
+
// parser releases when text follows it.
|
|
1479
|
+
const release = host.unionsById.get(t.unionId)?.discriminant
|
|
1480
|
+
? vAdapters(host, t).release
|
|
1481
|
+
: "null";
|
|
1482
|
+
body = `${S} 5, ${S} 0, ptr null, ptr null, ptr null, ptr null, ptr ${release}, ptr @${this.jsonUnionSchema(t, name)}, ${S} 0`;
|
|
1233
1483
|
break;
|
|
1484
|
+
}
|
|
1234
1485
|
default:
|
|
1235
1486
|
throw new InternalCompilerError(`llvm emitter bug: JSON schema of ${t.kind}`);
|
|
1236
1487
|
}
|
|
@@ -1241,7 +1492,11 @@ export class LlDyn {
|
|
|
1241
1492
|
/** The ScrJsonUnion descriptor of a union member (scr_json.h layout):
|
|
1242
1493
|
* its slot representation, the arm each JSON value kind selects, and the
|
|
1243
1494
|
* values the runtime stores for null and for a missing member. Boxed
|
|
1244
|
-
* unions build their boxes through `<name>_box`.
|
|
1495
|
+
* unions build their boxes through `<name>_box`. A discriminated union
|
|
1496
|
+
* also lists its object arms by discriminant literal (`<name>_cases`),
|
|
1497
|
+
* and, because it can be an array element or a whole document, whose
|
|
1498
|
+
* values are boxes unless the union is a pointer union, it keeps its null
|
|
1499
|
+
* value and box whatever its field representation. */
|
|
1245
1500
|
jsonUnionSchema(t, name) {
|
|
1246
1501
|
const host = this.host;
|
|
1247
1502
|
const S = host.sizeType;
|
|
@@ -1259,10 +1514,11 @@ export class LlDyn {
|
|
|
1259
1514
|
: "ptr null");
|
|
1260
1515
|
const nullTag = tags[0];
|
|
1261
1516
|
const absentTag = tags[6];
|
|
1262
|
-
const
|
|
1263
|
-
const
|
|
1517
|
+
const values = !inline || def.discriminant !== undefined;
|
|
1518
|
+
const nullValue = values && nullTag >= 0 ? host.unitInstanceRef(t.unionId, nullTag) : "null";
|
|
1519
|
+
const absentValue = values && absentTag >= 0 ? host.absentInstanceRef(t.unionId) : "null";
|
|
1264
1520
|
let box = "null";
|
|
1265
|
-
if (repr === 2) {
|
|
1521
|
+
if (repr === 2 || (def.discriminant && !nullable)) {
|
|
1266
1522
|
box = `@${name}_box`;
|
|
1267
1523
|
const lines = [`define internal ptr ${box}(i32 %tag, i64 %bits) ${FN_ATTRS} {`, `entry:`];
|
|
1268
1524
|
const cases = [];
|
|
@@ -1289,10 +1545,29 @@ export class LlDyn {
|
|
|
1289
1545
|
});
|
|
1290
1546
|
this.defs.push(...lines, ` switch i32 %tag, label %none [ ${cases.join(" ")} ]`, `none:`, ` unreachable`, ...blocks, `}`, ``);
|
|
1291
1547
|
}
|
|
1548
|
+
let cases = "null";
|
|
1549
|
+
if (def.discriminant) {
|
|
1550
|
+
const discriminant = def.discriminant;
|
|
1551
|
+
const caseTy = `{ ptr, ${S}, ${S}, ptr }`;
|
|
1552
|
+
const entries = discriminant.cases.flatMap((guard) => guard.values.map((value) => `${caseTy} { ptr ${host.cstr(String(value))}, ${S} ${Buffer.byteLength(String(value), "utf8")}, ${S} ${guard.tag}, ptr @${this.jsonSchema(def.arms[guard.tag])} }`));
|
|
1553
|
+
const table = `@${name}_case_table`;
|
|
1554
|
+
cases = `@${name}_cases`;
|
|
1555
|
+
this.defs.push(`${table} = internal constant [${entries.length} x ${caseTy}] [${entries.join(", ")}]`, `${cases} = internal constant { ptr, ${S}, ${S}, ptr } { ptr ${host.cstr(discriminant.field)}, ${S} ${Buffer.byteLength(discriminant.field, "utf8")}, ${S} ${entries.length}, ptr ${table} }`, ``);
|
|
1556
|
+
}
|
|
1292
1557
|
const descriptor = `${name}_union`;
|
|
1293
|
-
this.defs.push(`@${descriptor} = internal constant { ${S}, [7 x ${S}], [7 x ptr], ptr, ptr, ptr } { ${S} ${repr}, [7 x ${S}] [${tags.map((tag) => `${S} ${tag}`).join(", ")}], [7 x ptr] [${arms.join(", ")}], ptr ${nullValue}, ptr ${absentValue}, ptr ${box} }`, ``);
|
|
1558
|
+
this.defs.push(`@${descriptor} = internal constant { ${S}, [7 x ${S}], [7 x ptr], ptr, ptr, ptr, ptr } { ${S} ${repr}, [7 x ${S}] [${tags.map((tag) => `${S} ${tag}`).join(", ")}], [7 x ptr] [${arms.join(", ")}], ptr ${nullValue}, ptr ${absentValue}, ptr ${box}, ptr ${cases} }`, ``);
|
|
1294
1559
|
return descriptor;
|
|
1295
1560
|
}
|
|
1561
|
+
/** `record.sourceSpread(built, value)`: the built record keeps value's
|
|
1562
|
+
* kept-source order over its own declared names. */
|
|
1563
|
+
emitRecordSourceSpread(B, built, value, shapeId) {
|
|
1564
|
+
const host = this.host;
|
|
1565
|
+
const shape = host.recordsById.get(shapeId);
|
|
1566
|
+
this.keepsRecordSources = true;
|
|
1567
|
+
const names = this.recordNameTable(shapeId, shape);
|
|
1568
|
+
host.declare(`declare void @scr_record_source_spread(ptr, ptr, ptr, ptr, ${host.sizeType})`);
|
|
1569
|
+
B.line(`call void @scr_record_source_spread(ptr ${built}, ptr ${value}, ptr ${names.names}, ptr ${names.lens}, ${host.sizeType} ${shape.fields.length})`);
|
|
1570
|
+
}
|
|
1296
1571
|
/** The declared-name tables scr_record_source_note scans: parallel
|
|
1297
1572
|
* constant arrays of field-name bytes and byte lengths in declaration
|
|
1298
1573
|
* order (the order the record serializes), interned per shape. Internal
|
|
@@ -1320,7 +1595,9 @@ export class LlDyn {
|
|
|
1320
1595
|
* dynCheck builder — which reports the exact error. Returns +1, or null
|
|
1321
1596
|
* with the pending flag set. */
|
|
1322
1597
|
jsonParseHelper(t) {
|
|
1323
|
-
if (t.kind !== "record" &&
|
|
1598
|
+
if (t.kind !== "record" &&
|
|
1599
|
+
t.kind !== "array" &&
|
|
1600
|
+
!(t.kind === "union" && this.host.unionsById.get(t.unionId)?.discriminant))
|
|
1324
1601
|
return null;
|
|
1325
1602
|
const key = typeKey(t);
|
|
1326
1603
|
const existing = this.jsonParsers.get(key);
|
|
@@ -1346,7 +1623,8 @@ export class LlDyn {
|
|
|
1346
1623
|
* BUILD the typed value (+1), or throw the catchable path-annotated
|
|
1347
1624
|
* TypeError and return a dummy with the pending flag set. */
|
|
1348
1625
|
dynCheckHelper(t, preserveRefs = false) {
|
|
1349
|
-
|
|
1626
|
+
// A `(T | undefined)[]` stored as T elements also takes undefined ones.
|
|
1627
|
+
const key = checkedConversionKey(t);
|
|
1350
1628
|
const builderKey = preserveRefs ? `identity:${key}` : key;
|
|
1351
1629
|
const existing = this.dynBuilders.get(builderKey);
|
|
1352
1630
|
if (existing)
|
|
@@ -1364,6 +1642,26 @@ export class LlDyn {
|
|
|
1364
1642
|
const B = new BlockBuilder();
|
|
1365
1643
|
if (t.kind === "classval") {
|
|
1366
1644
|
host.declare(`declare ptr @scr_dyn_class_check(ptr, ptr, ptr)`);
|
|
1645
|
+
// A subclass's class value checks into the base class's slot when
|
|
1646
|
+
// construction through the slot can call its thunk with the base
|
|
1647
|
+
// constructor's arguments; any other subclass fails the check.
|
|
1648
|
+
const subclasses = host.classValueSubtypes(t.className);
|
|
1649
|
+
if (subclasses.length > 0) {
|
|
1650
|
+
host.declare(`declare zeroext i1 @scr_dyn_class_is(ptr, ptr)`);
|
|
1651
|
+
for (const className of subclasses) {
|
|
1652
|
+
const subKey = host.cstr(typeKey({ kind: "classval", className }));
|
|
1653
|
+
const matched = B.tmp();
|
|
1654
|
+
B.line(`${matched} = call zeroext i1 @scr_dyn_class_is(ptr %d, ptr ${subKey})`);
|
|
1655
|
+
const yes = B.newLabel("sub.yes");
|
|
1656
|
+
const no = B.newLabel("sub.no");
|
|
1657
|
+
B.condBr(matched, yes, no);
|
|
1658
|
+
B.startBlock(yes);
|
|
1659
|
+
const sub = B.tmp();
|
|
1660
|
+
B.line(`${sub} = call ptr @scr_dyn_class_check(ptr %d, ptr ${subKey}, ptr %path)`);
|
|
1661
|
+
B.terminate(`ret ptr ${sub}`);
|
|
1662
|
+
B.startBlock(no);
|
|
1663
|
+
}
|
|
1664
|
+
}
|
|
1367
1665
|
const checked = B.tmp();
|
|
1368
1666
|
B.line(`${checked} = call ptr @scr_dyn_class_check(ptr %d, ptr ${host.cstr(key)}, ptr %path)`);
|
|
1369
1667
|
B.terminate(`ret ptr ${checked}`);
|
|
@@ -1374,9 +1672,15 @@ export class LlDyn {
|
|
|
1374
1672
|
const codec = textCodecRecordClass(t, (id) => host.recordsById.get(id));
|
|
1375
1673
|
if (codec !== null) {
|
|
1376
1674
|
// The record the codec's handle box holds (+1), or the path TypeError.
|
|
1377
|
-
host.declare(`declare ptr @scr_text_codec_from_dyn(ptr, i1 zeroext, ptr, ptr)`);
|
|
1378
1675
|
const checked = B.tmp();
|
|
1379
|
-
|
|
1676
|
+
if (codec === "StringDecoder") {
|
|
1677
|
+
host.declare(`declare ptr @scr_string_decoder_from_dyn(ptr, ptr, ptr)`);
|
|
1678
|
+
B.line(`${checked} = call ptr @scr_string_decoder_from_dyn(ptr %d, ptr %path, ptr ${want})`);
|
|
1679
|
+
}
|
|
1680
|
+
else {
|
|
1681
|
+
host.declare(`declare ptr @scr_text_codec_from_dyn(ptr, i1 zeroext, ptr, ptr)`);
|
|
1682
|
+
B.line(`${checked} = call ptr @scr_text_codec_from_dyn(ptr %d, i1 ${codec === "TextDecoder"}, ptr %path, ptr ${want})`);
|
|
1683
|
+
}
|
|
1380
1684
|
B.terminate(`ret ptr ${checked}`);
|
|
1381
1685
|
this.defs.push(`define internal ptr @${name}(ptr %d, ptr %path) ${FN_ATTRS} {`, B.render(), `}`, ``);
|
|
1382
1686
|
this.host.journalBuilt?.();
|
|
@@ -1604,10 +1908,10 @@ export class LlDyn {
|
|
|
1604
1908
|
};
|
|
1605
1909
|
switch (t.kind) {
|
|
1606
1910
|
case "date": {
|
|
1607
|
-
host.declare(`declare
|
|
1911
|
+
host.declare(`declare ptr @scr_dyn_native_date_check(ptr, ptr)`);
|
|
1608
1912
|
const r = B.tmp();
|
|
1609
|
-
B.line(`${r} = call
|
|
1610
|
-
B.terminate(`ret
|
|
1913
|
+
B.line(`${r} = call ptr @scr_dyn_native_date_check(ptr %d, ptr %path)`);
|
|
1914
|
+
B.terminate(`ret ptr ${r}`);
|
|
1611
1915
|
break;
|
|
1612
1916
|
}
|
|
1613
1917
|
case "url":
|
|
@@ -2043,6 +2347,21 @@ export class LlDyn {
|
|
|
2043
2347
|
B.line(`${ip} = getelementptr inbounds %ScrDynPath, ptr ${pathSlot}, i64 0, i32 2`);
|
|
2044
2348
|
B.line(`store ${host.sizeType} ${i}, ptr ${ip}`);
|
|
2045
2349
|
const e = this.itemAt(B, items, i);
|
|
2350
|
+
if (t.optionalElements) {
|
|
2351
|
+
// An undefined element is a present undefined element.
|
|
2352
|
+
const undef = B.tmp();
|
|
2353
|
+
const storeUndefined = B.newLabel("dca.undef");
|
|
2354
|
+
const checkLabel = B.newLabel("dca.check");
|
|
2355
|
+
B.line(`${undef} = icmp eq i32 ${this.kindOf(B, e)}, ${DYN_KIND.UNDEF}`);
|
|
2356
|
+
B.condBr(undef, storeUndefined, checkLabel);
|
|
2357
|
+
B.startBlock(storeUndefined);
|
|
2358
|
+
host.declare(`declare void @scr_arr_set_undefined(ptr, double)`);
|
|
2359
|
+
const at = B.tmp();
|
|
2360
|
+
B.line(`${at} = ${sizeToDouble(this.S)} ${this.S} ${i} to double`);
|
|
2361
|
+
B.line(`call void @scr_arr_set_undefined(ptr ${a}, double ${at})`);
|
|
2362
|
+
B.br(doneLabel);
|
|
2363
|
+
B.startBlock(checkLabel);
|
|
2364
|
+
}
|
|
2046
2365
|
const v = B.tmp();
|
|
2047
2366
|
B.line(`${v} = call ${this.valTy(elem)} @${c}(ptr ${e}, ptr ${pathSlot})`);
|
|
2048
2367
|
this.pendingBail(B, "dca", () => {
|
|
@@ -2062,13 +2381,20 @@ export class LlDyn {
|
|
|
2062
2381
|
if (!def)
|
|
2063
2382
|
throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
|
|
2064
2383
|
// Arms in unionArmOrder, first FULL match wins. The matched arm's
|
|
2065
|
-
// builder can no longer fail
|
|
2066
|
-
|
|
2384
|
+
// builder can no longer fail, and it runs as a trusted build: a
|
|
2385
|
+
// nested union inside it picks the arm trustedArmKinds names without
|
|
2386
|
+
// matching the structure that this match already checked.
|
|
2387
|
+
const trustedKinds = preserveRefs ? def.arms.map(() => null) : this.trustedArmKinds(def);
|
|
2388
|
+
const trustedCall = (call) => {
|
|
2389
|
+
host.declare(`declare zeroext i1 @scr_dyn_trust_enter()`);
|
|
2390
|
+
host.declare(`declare void @scr_dyn_trust_exit(i1 zeroext)`);
|
|
2391
|
+
const previous = B.tmp();
|
|
2392
|
+
B.line(`${previous} = call zeroext i1 @scr_dyn_trust_enter()`);
|
|
2393
|
+
call();
|
|
2394
|
+
B.line(`call void @scr_dyn_trust_exit(i1 zeroext ${previous})`);
|
|
2395
|
+
};
|
|
2396
|
+
const build = (i) => {
|
|
2067
2397
|
const arm = def.arms[i];
|
|
2068
|
-
const lHit = B.newLabel("dcu.h");
|
|
2069
|
-
const lNext = B.newLabel("dcu.n");
|
|
2070
|
-
this.unionArmMatch(B, def, i, lHit, lNext, preserveRefs);
|
|
2071
|
-
B.startBlock(lHit);
|
|
2072
2398
|
if (arm.kind === "undefinedT" || arm.kind === "nullT") {
|
|
2073
2399
|
// A matched unit arm builds nothing: THE interned immortal
|
|
2074
2400
|
// instance (rc == SIZE_MAX — no retain owed).
|
|
@@ -2093,7 +2419,7 @@ export class LlDyn {
|
|
|
2093
2419
|
else if (host.nullableUnions.has(t.unionId)) {
|
|
2094
2420
|
// A nullable union is its (+1) reference payload.
|
|
2095
2421
|
const x = B.tmp();
|
|
2096
|
-
B.line(`${x} = call ptr @${this.dynCheckHelper(arm, preserveRefs)}(ptr %d, ptr %path)`);
|
|
2422
|
+
trustedCall(() => B.line(`${x} = call ptr @${this.dynCheckHelper(arm, preserveRefs)}(ptr %d, ptr %path)`));
|
|
2097
2423
|
B.terminate(`ret ptr ${x}`);
|
|
2098
2424
|
}
|
|
2099
2425
|
else {
|
|
@@ -2101,12 +2427,32 @@ export class LlDyn {
|
|
|
2101
2427
|
host.declare(`declare ptr @scr_union_new_ref(i32, ptr, ptr, ptr, ptr)`);
|
|
2102
2428
|
const x = B.tmp();
|
|
2103
2429
|
const u = B.tmp();
|
|
2104
|
-
B.line(`${x} = call ptr @${this.dynCheckHelper(arm, preserveRefs)}(ptr %d, ptr %path)`);
|
|
2430
|
+
trustedCall(() => B.line(`${x} = call ptr @${this.dynCheckHelper(arm, preserveRefs)}(ptr %d, ptr %path)`));
|
|
2105
2431
|
B.line(`${u} = call ptr @scr_union_new_ref(i32 ${i}, ptr ${x}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${traceArg(host, arm)})`);
|
|
2106
2432
|
B.terminate(`ret ptr ${u}`);
|
|
2107
2433
|
}
|
|
2108
|
-
|
|
2434
|
+
};
|
|
2435
|
+
const order = this.unionArmOrder(def);
|
|
2436
|
+
const values = this.dispatchValues(def);
|
|
2437
|
+
if (values !== null) {
|
|
2438
|
+
const hits = def.arms.map(() => B.newLabel("dcu.h"));
|
|
2439
|
+
const unmatched = B.newLabel("dcu.n");
|
|
2440
|
+
this.unionArmsByDiscriminant(B, def, values, order, hits, unmatched, preserveRefs, `@${name}.cases`, trustedKinds);
|
|
2441
|
+
for (const i of order) {
|
|
2442
|
+
B.startBlock(hits[i]);
|
|
2443
|
+
build(i);
|
|
2444
|
+
}
|
|
2445
|
+
B.startBlock(unmatched);
|
|
2109
2446
|
}
|
|
2447
|
+
else
|
|
2448
|
+
for (const i of order) {
|
|
2449
|
+
const lHit = B.newLabel("dcu.h");
|
|
2450
|
+
const lNext = B.newLabel("dcu.n");
|
|
2451
|
+
this.unionArmMatch(B, def, i, lHit, lNext, preserveRefs, trustedKinds[i]);
|
|
2452
|
+
B.startBlock(lHit);
|
|
2453
|
+
build(i);
|
|
2454
|
+
B.startBlock(lNext);
|
|
2455
|
+
}
|
|
2110
2456
|
if (preserveRefs) {
|
|
2111
2457
|
B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${host.cstr("reference with its original layout")}, ptr %d)`);
|
|
2112
2458
|
B.terminate(`ret ptr null`);
|
|
@@ -2330,9 +2676,9 @@ export class LlDyn {
|
|
|
2330
2676
|
B.line(`${matched} = phi i1 [ false, %${entry} ], [ ${same}, %${lHandle} ]`);
|
|
2331
2677
|
return matched;
|
|
2332
2678
|
}
|
|
2333
|
-
/** A TextEncoder or
|
|
2334
|
-
* holds the record by reference.
|
|
2335
|
-
* fields
|
|
2679
|
+
/** A TextEncoder, TextDecoder or StringDecoder record boxes as its
|
|
2680
|
+
* handle (+1), which holds the record by reference. The decoders pass
|
|
2681
|
+
* the byte offsets of the fields their boxed methods read. */
|
|
2336
2682
|
textCodecToDyn(B, t, shape, codec) {
|
|
2337
2683
|
const host = this.host;
|
|
2338
2684
|
const rc = vAdapters(host, t);
|
|
@@ -2346,10 +2692,11 @@ export class LlDyn {
|
|
|
2346
2692
|
const base = host.nullableUnions.fieldBase(t.shapeId);
|
|
2347
2693
|
const start = B.tmp();
|
|
2348
2694
|
B.line(`${start} = ptrtoint ptr %v to ${this.S}`);
|
|
2349
|
-
const
|
|
2695
|
+
const fields = codec === "StringDecoder" ? STRING_DECODER_FIELDS : TEXT_DECODER_FIELDS;
|
|
2696
|
+
const offsets = fields.map((field) => {
|
|
2350
2697
|
const index = shape.fields.findIndex((f) => f.name === field);
|
|
2351
2698
|
if (index < 0)
|
|
2352
|
-
throw new InternalCompilerError(`llvm emitter bug:
|
|
2699
|
+
throw new InternalCompilerError(`llvm emitter bug: ${codec} record lacks ${field}`);
|
|
2353
2700
|
const p = B.tmp();
|
|
2354
2701
|
const at = B.tmp();
|
|
2355
2702
|
const offset = B.tmp();
|
|
@@ -2358,8 +2705,9 @@ export class LlDyn {
|
|
|
2358
2705
|
B.line(`${offset} = sub ${this.S} ${at}, ${start}`);
|
|
2359
2706
|
return `${this.S} ${offset}`;
|
|
2360
2707
|
});
|
|
2361
|
-
|
|
2362
|
-
|
|
2708
|
+
const fn = codec === "StringDecoder" ? "scr_string_decoder_to_dyn" : "scr_text_decoder_to_dyn";
|
|
2709
|
+
host.declare(`declare ptr @${fn}(ptr, ptr, ptr, ${fields.map(() => this.S).join(", ")})`);
|
|
2710
|
+
B.line(`${r} = call ptr @${fn}(ptr %v, ptr ${rc.retain}, ptr ${rc.release}, ${offsets.join(", ")})`);
|
|
2363
2711
|
}
|
|
2364
2712
|
B.terminate(`ret ptr ${r}`);
|
|
2365
2713
|
}
|
|
@@ -2380,11 +2728,10 @@ export class LlDyn {
|
|
|
2380
2728
|
let sourceAccessor = null;
|
|
2381
2729
|
switch (t.kind) {
|
|
2382
2730
|
case "date": {
|
|
2383
|
-
// A Date handle holding the same
|
|
2384
|
-
|
|
2385
|
-
host.declare(`declare ptr @scr_dyn_native_date_from_ms(double)`);
|
|
2731
|
+
// A Date handle holding the same Date object.
|
|
2732
|
+
host.declare(`declare ptr @scr_dyn_native_date(ptr)`);
|
|
2386
2733
|
const r = B.tmp();
|
|
2387
|
-
B.line(`${r} = call ptr @
|
|
2734
|
+
B.line(`${r} = call ptr @scr_dyn_native_date(ptr %v)`);
|
|
2388
2735
|
B.terminate(`ret ptr ${r}`);
|
|
2389
2736
|
break;
|
|
2390
2737
|
}
|
|
@@ -2524,7 +2871,7 @@ export class LlDyn {
|
|
|
2524
2871
|
const shape = host.recordsById.get(t.shapeId);
|
|
2525
2872
|
if (!shape)
|
|
2526
2873
|
throw new InternalCompilerError(`llvm emitter bug: to-dyn of unknown shape ${t.shapeId}`);
|
|
2527
|
-
const codec =
|
|
2874
|
+
const codec = recordHandleCodecClass(shape);
|
|
2528
2875
|
if (codec !== null) {
|
|
2529
2876
|
this.textCodecToDyn(B, t, shape, codec);
|
|
2530
2877
|
break;
|