@scriptc/compiler 0.4.2 → 0.4.4
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 +470 -66
- package/dist/backend/cycle-analysis.d.ts +4 -1
- package/dist/backend/cycle-analysis.js +6 -4
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +55 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +7 -0
- package/dist/backend/cycle-mutability.js +19 -1
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +2 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +6 -3
- package/dist/backend/immutability.js +33 -29
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/library-pack.js +1 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +16 -1
- package/dist/backend/llvm/alloc.js +54 -4
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
- package/dist/backend/llvm/appended-array-literals.js +44 -36
- package/dist/backend/llvm/appended-array-literals.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.test.js +4 -3
- package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
- package/dist/backend/llvm/array-search.d.ts +4 -3
- package/dist/backend/llvm/array-search.js +21 -9
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/blocks.d.ts +1 -1
- package/dist/backend/llvm/blocks.js +2 -2
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/byte-windows.js +2 -0
- package/dist/backend/llvm/byte-windows.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +6 -1
- package/dist/backend/llvm/bytes-alias.js +8 -2
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +47 -5
- package/dist/backend/llvm/bytes-loop-versions.js +479 -32
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +263 -2
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +7 -5
- package/dist/backend/llvm/classes.js +44 -20
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +167 -7
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +9 -3
- package/dist/backend/llvm/common.js +9 -3
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
- package/dist/backend/llvm/constant-callbacks.js +83 -52
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +7 -0
- package/dist/backend/llvm/counted-loops.js +18 -0
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/debug-info.js +2 -5
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +39 -8
- package/dist/backend/llvm/dense-array-access.js +222 -52
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +36 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
- package/dist/backend/llvm/dense-array-loops.js +194 -5
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +90 -1
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +30 -0
- package/dist/backend/llvm/dyn.js +373 -70
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +13 -28
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-journal.d.ts +93 -0
- package/dist/backend/llvm/emit-journal.js +170 -0
- package/dist/backend/llvm/emit-journal.js.map +1 -0
- package/dist/backend/llvm/emit-module.js +211 -33
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +0 -4
- package/dist/backend/llvm/emit-statements.js +268 -84
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter-state.d.ts +7 -0
- package/dist/backend/llvm/emitter-state.js +14 -0
- package/dist/backend/llvm/emitter-state.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +186 -37
- package/dist/backend/llvm/emitter.js +733 -90
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +65 -7
- 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.js +48 -20
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +47 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +28 -14
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +14 -2
- package/dist/backend/llvm/expr-containers.js +143 -37
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +14 -0
- package/dist/backend/llvm/expr-dynamic.js +18 -11
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +119 -38
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +11 -6
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.d.ts +12 -0
- package/dist/backend/llvm/expr-records.js +106 -0
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-bridges.js +210 -69
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
- package/dist/backend/llvm/int32-kind-loops.js +106 -0
- package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +25 -1
- package/dist/backend/llvm/integer-values.js +95 -0
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +1 -1
- package/dist/backend/llvm/js-ic.js +1 -1
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/key-orders.d.ts +7 -0
- package/dist/backend/llvm/key-orders.js +33 -0
- package/dist/backend/llvm/key-orders.js.map +1 -0
- package/dist/backend/llvm/lib-connect.js +4 -0
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +11 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +213 -5
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +4 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +4 -0
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +16 -6
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +37 -1
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +94 -2
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +35 -5
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +115 -19
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +14 -0
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/loop-state.d.ts +33 -0
- package/dist/backend/llvm/loop-state.js +42 -0
- package/dist/backend/llvm/loop-state.js.map +1 -0
- package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
- package/dist/backend/llvm/map-number-lookup.js +91 -31
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +55 -0
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.js +4 -2
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +2 -1
- package/dist/backend/llvm/nullable-unions.js +15 -3
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +10 -0
- package/dist/backend/llvm/publish.js +15 -3
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/receivers.js +6 -1
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +1 -9
- package/dist/backend/llvm/record-results.js +2 -11
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-effects.js +3 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +7 -2
- package/dist/backend/llvm/reference-writes.js +89 -72
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/running-extrema.d.ts +11 -0
- package/dist/backend/llvm/running-extrema.js +115 -0
- package/dist/backend/llvm/running-extrema.js.map +1 -0
- package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
- package/dist/backend/llvm/running-extrema.test.js +89 -0
- package/dist/backend/llvm/running-extrema.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +71 -15
- package/dist/backend/llvm/shapes.js +224 -40
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +53 -7
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +6 -0
- package/dist/backend/llvm/speculative-integers.js +2 -2
- package/dist/backend/llvm/speculative-integers.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.d.ts +3 -2
- package/dist/backend/llvm/stack-objects.js +5 -2
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +12 -0
- package/dist/backend/llvm/string-reads.js +44 -0
- package/dist/backend/llvm/string-reads.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/walk-borrows.d.ts +3 -0
- package/dist/backend/llvm/walk-borrows.js +46 -41
- package/dist/backend/llvm/walk-borrows.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +3 -0
- package/dist/backend/llvm/walkers.js +101 -65
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
- package/dist/backend/llvm/wrapping-sums.js +126 -0
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/may-throw.d.ts +8 -10
- package/dist/backend/may-throw.js +14 -10
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -0
- package/dist/backend/native/executable.js +7 -0
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.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.test.js +6 -4
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +4 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/publication.d.ts +12 -1
- package/dist/backend/publication.js +37 -14
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/publication.test.js +30 -0
- package/dist/backend/publication.test.js.map +1 -1
- package/dist/backend/result-slots.d.ts +16 -0
- package/dist/backend/result-slots.js +23 -0
- package/dist/backend/result-slots.js.map +1 -0
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +1 -0
- package/dist/backend/runtime-pack-core.js +1 -0
- package/dist/backend/runtime-pack-core.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/stack-observations.d.ts +2 -1
- package/dist/backend/stack-observations.js +67 -42
- package/dist/backend/stack-observations.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/target-diagnostics.js +5 -3
- package/dist/backend/target-diagnostics.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 +20 -1
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +4 -1
- package/dist/cli/usage.js +10 -3
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.js +1 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +7 -0
- package/dist/contracts/check.js +4 -3
- package/dist/contracts/check.js.map +1 -1
- package/dist/contracts/int32-elements.js +10 -2
- package/dist/contracts/int32-elements.js.map +1 -1
- package/dist/coverage/report.js +12 -3
- package/dist/coverage/report.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +4 -0
- package/dist/diagnostics/diagnostic.js +1 -1
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +3 -0
- package/dist/diagnostics/envelope.js +1 -0
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +5 -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/frontend/decl-projection.d.ts +41 -0
- package/dist/frontend/decl-projection.js +949 -0
- package/dist/frontend/decl-projection.js.map +1 -0
- package/dist/frontend/decl-projection.test.d.ts +1 -0
- package/dist/frontend/decl-projection.test.js +30 -0
- package/dist/frontend/decl-projection.test.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +15 -0
- package/dist/frontend/dts-paths.js +25 -0
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +6 -0
- package/dist/frontend/input-tracker.js +51 -28
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +19 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +100 -2
- package/dist/frontend/lowering/array-values.js.map +1 -1
- 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/child-process-methods.js +46 -15
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.js +13 -2
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.js +87 -10
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.js +4 -1
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
- 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/global-namespace-keys.d.ts +3 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
- 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/numbers.js +9 -1
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +7 -1
- package/dist/frontend/lowering/builtins/promises.js +236 -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 +35 -3
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +24 -1
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +6 -3
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +0 -1
- 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 +307 -4
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
- package/dist/frontend/lowering/class-callbacks.js +82 -12
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +4 -1
- package/dist/frontend/lowering/class-construction.js +17 -3
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +49 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.js +880 -108
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-iterables.d.ts +2 -1
- package/dist/frontend/lowering/class-iterables.js +9 -1
- package/dist/frontend/lowering/class-iterables.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +83 -24
- package/dist/frontend/lowering/class-method-mutations.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.js +31 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
- package/dist/frontend/lowering/class-runtime-statics.js +29 -4
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +91 -1
- package/dist/frontend/lowering/coercions/structural.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-callback-call.js +2 -2
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
- package/dist/frontend/lowering/containers/array-callbacks.js +345 -24
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +10 -0
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +5 -0
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +26 -3
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
- 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 +455 -46
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +7 -2
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
- package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
- package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
- package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
- package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +43 -19
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/date-values.d.ts +11 -0
- package/dist/frontend/lowering/date-values.js +207 -0
- package/dist/frontend/lowering/date-values.js.map +1 -0
- package/dist/frontend/lowering/dispatch-sites.js +15 -1
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
- package/dist/frontend/lowering/divergences.js +9 -1
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/error-methods.js +47 -2
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +53 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +100 -28
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +169 -13
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +64 -5
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +95 -1
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
- package/dist/frontend/lowering/expressions/object-literals.js +138 -51
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.js +168 -10
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +212 -33
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +6 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-fields.js +4 -0
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +39 -3
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.d.ts +28 -0
- package/dist/frontend/lowering/frozen-records.js +322 -0
- package/dist/frontend/lowering/frozen-records.js.map +1 -0
- package/dist/frontend/lowering/function-returns.js +64 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.js +7 -2
- 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/iterable-values.d.ts +49 -0
- package/dist/frontend/lowering/iterable-values.js +297 -0
- package/dist/frontend/lowering/iterable-values.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.js +186 -1
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
- package/dist/frontend/lowering/js-class-fields.js +45 -10
- package/dist/frontend/lowering/js-class-fields.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
- package/dist/frontend/lowering/key-order-witness.js +974 -48
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +530 -10
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +15 -3
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +4 -1
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +7 -0
- package/dist/frontend/lowering/lower-calls.js +462 -44
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +11 -2
- package/dist/frontend/lowering/lower-classes.js +324 -69
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +3 -1
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +215 -3
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +11 -0
- package/dist/frontend/lowering/lower-functions.js +83 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +42 -32
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +6 -3
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
- package/dist/frontend/lowering/lower-inspect.js +53 -17
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +53 -5
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +5 -1
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +2 -2
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
- package/dist/frontend/lowering/lower-stdlib.js +30 -0
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
- package/dist/frontend/lowering/lower-stmts.js +553 -81
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +20 -2
- package/dist/frontend/lowering/lower-stream.js +1483 -156
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +107 -8
- package/dist/frontend/lowering/lowerer.js +381 -36
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
- package/dist/frontend/lowering/module-namespace-elements.js +82 -5
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/new-target.d.ts +12 -0
- package/dist/frontend/lowering/new-target.js +280 -0
- package/dist/frontend/lowering/new-target.js.map +1 -0
- 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/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +73 -8
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/undefined-index.d.ts +27 -0
- package/dist/frontend/lowering/undefined-index.js +82 -0
- package/dist/frontend/lowering/undefined-index.js.map +1 -0
- package/dist/frontend/lowering/var-hoisting.js +29 -13
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/lowering/width-lift.d.ts +18 -0
- package/dist/frontend/npm-static-bundled-chunks.js +9 -11
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static.js +4 -20
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +3 -0
- package/dist/frontend/package-shims.js +71 -8
- package/dist/frontend/package-shims.js.map +1 -1
- package/dist/frontend/pipeline.js +19 -11
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/process-fork.d.ts +25 -0
- package/dist/frontend/process-fork.js +2 -0
- package/dist/frontend/process-fork.js.map +1 -0
- package/dist/frontend/program-analysis.d.ts +5 -1
- package/dist/frontend/program-analysis.js +5 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +21 -6
- package/dist/frontend/program.js +681 -83
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +43 -3
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/token-equivalence.d.ts +3 -0
- package/dist/frontend/token-equivalence.js +409 -0
- package/dist/frontend/token-equivalence.js.map +1 -0
- package/dist/frontend/token-equivalence.test.d.ts +1 -0
- package/dist/frontend/token-equivalence.test.js +67 -0
- package/dist/frontend/token-equivalence.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +22 -0
- package/dist/frontend/ts7/ast-node.js +1048 -103
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +24 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +4 -3
- package/dist/frontend/ts7/ast-wire.js +34 -24
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.test.js +23 -0
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +3 -4
- package/dist/frontend/ts7/checker-backend.js +2 -2
- package/dist/frontend/ts7/checker-backend.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.test.js +5 -9
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +4 -0
- package/dist/frontend/ts7/checker.js +7 -0
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
- package/dist/frontend/ts7/lib-diagnostics.js +307 -0
- package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
- package/dist/frontend/ts7/program-host.d.ts +7 -0
- package/dist/frontend/ts7/program-host.js +25 -2
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +3 -0
- package/dist/frontend/ts7/semantic-model.js +5 -0
- 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/session.d.ts +14 -1
- package/dist/frontend/ts7/session.js +22 -0
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +13 -1
- package/dist/frontend/type-mapper.js +229 -20
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.js +46 -4
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +5 -3
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +4 -0
- package/dist/ir/array-length-stability.js +19 -6
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +24 -0
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.d.ts +7 -0
- package/dist/ir/builtin-effects.js +60 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +6 -4
- package/dist/ir/builtin-signatures.js +222 -13
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +2 -1
- package/dist/ir/callback-specialization.js +23 -18
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +19 -0
- package/dist/ir/char-unit-locals.js +185 -0
- package/dist/ir/char-unit-locals.js.map +1 -0
- package/dist/ir/char-unit-locals.test.d.ts +1 -0
- package/dist/ir/char-unit-locals.test.js +94 -0
- package/dist/ir/char-unit-locals.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +2 -1
- package/dist/ir/final-fields.js +14 -16
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.d.ts +2 -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 +3 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/initializer-bindings.d.ts +2 -1
- package/dist/ir/initializer-bindings.js +27 -20
- package/dist/ir/initializer-bindings.js.map +1 -1
- package/dist/ir/int32-arrays.d.ts +108 -0
- package/dist/ir/int32-arrays.js +831 -0
- package/dist/ir/int32-arrays.js.map +1 -0
- package/dist/ir/int32-slots.d.ts +24 -2
- package/dist/ir/int32-slots.js +266 -57
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +33 -0
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +3 -3
- package/dist/ir/integer-loops.js +28 -10
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +10 -0
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +5 -0
- package/dist/ir/integer-ranges.js +125 -12
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +30 -0
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +83 -10
- package/dist/ir/ir.js +77 -6
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +23 -2
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +4 -0
- package/dist/ir/js-ic.js +17 -1
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +46 -0
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +57 -0
- package/dist/ir/node-index.js +215 -0
- package/dist/ir/node-index.js.map +1 -0
- package/dist/ir/paired-while-loops.d.ts +25 -0
- package/dist/ir/paired-while-loops.js +335 -0
- package/dist/ir/paired-while-loops.js.map +1 -0
- package/dist/ir/paired-while-loops.test.d.ts +1 -0
- package/dist/ir/paired-while-loops.test.js +163 -0
- package/dist/ir/paired-while-loops.test.js.map +1 -0
- package/dist/ir/parameter-versions.d.ts +25 -0
- package/dist/ir/parameter-versions.js +300 -0
- package/dist/ir/parameter-versions.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +34 -13
- package/dist/ir/runtime-features.js +177 -39
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/serialize.d.ts +12 -2
- package/dist/ir/serialize.js +16 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +17 -0
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/traverse.js +18 -6
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +167 -40
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +3 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/cache.d.ts +6 -1
- package/dist/native/cache.js +28 -5
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +16 -2
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +21 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +8 -6
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache.d.ts +1 -1
- package/dist/native/executable-cache.js +2 -2
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.d.ts +4 -2
- package/dist/native/prepare.js +130 -32
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +96 -20
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.test.js +2 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/text-file.d.ts +13 -3
- package/dist/native/text-file.js +63 -9
- package/dist/native/text-file.js.map +1 -1
- package/dist/native/text-file.test.d.ts +1 -0
- package/dist/native/text-file.test.js +49 -0
- package/dist/native/text-file.test.js.map +1 -0
- package/dist/native/toolchain.js +4 -4
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +3 -3
- package/dist/native/toolchain.test.js.map +1 -1
- package/package.json +21 -21
- package/shims/chalk/v5.ts +688 -0
- package/shims/hono-node-server/v2.ts +645 -0
- package/shims/hot-shots/client.ts +1126 -0
- package/shims/hot-shots/v8-unix-dgram.ts +8 -0
- package/shims/hot-shots/v8.ts +8 -0
- package/surface-manifest.json +27 -7
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { expect, test } from "vitest";
|
|
2
|
-
import { F64 } from "../../ir/ir.js";
|
|
2
|
+
import { F64, KEY_ORDER_FIELD, } from "../../ir/ir.js";
|
|
3
3
|
import { observeRecordLiteralRebuilds, transformExpr } from "../../ir/traverse.js";
|
|
4
4
|
import { ShapeRegistry } from "../type-mapper.js";
|
|
5
5
|
import { applyKeyOrderWitnesses, KeyOrderNotes, } from "./key-order-witness.js";
|
|
6
|
+
import * as ts from "../ts7/adapter.js";
|
|
6
7
|
const loc = { file: "order.ts", start: 0, end: 1 };
|
|
7
8
|
/** `number | undefined`: the optional-field slot type. */
|
|
8
9
|
const OPT = { kind: "union", unionId: "u0" };
|
|
@@ -16,7 +17,17 @@ function fixture() {
|
|
|
16
17
|
keyOrder: notes,
|
|
17
18
|
unions: new Map([["u0", { id: "u0", arms: [F64, { kind: "undefinedT" }] }]]),
|
|
18
19
|
classes: new Map(),
|
|
20
|
+
methodAccessSites: new Map(),
|
|
21
|
+
dynConvertible: () => true,
|
|
19
22
|
armTag: (unionId, arm) => unionId === "u0" && arm.kind === "undefinedT" ? 1 : -1,
|
|
23
|
+
recordFieldPresent: (obj, shapeId, field) => ({
|
|
24
|
+
kind: "recordHas",
|
|
25
|
+
obj,
|
|
26
|
+
shapeId,
|
|
27
|
+
field,
|
|
28
|
+
type: { kind: "bool" },
|
|
29
|
+
loc,
|
|
30
|
+
}),
|
|
20
31
|
};
|
|
21
32
|
const record = (fields, order) => ({
|
|
22
33
|
kind: "record",
|
|
@@ -30,13 +41,16 @@ function fixture() {
|
|
|
30
41
|
fields.push({ name: f.name, value: absent });
|
|
31
42
|
return notes.literal({ kind: "recordLit", fields, type, loc }, segments ?? keys.map((name) => ({ kind: "key", name, definite: true })));
|
|
32
43
|
};
|
|
33
|
-
const run = (body) => {
|
|
34
|
-
const fn = { name
|
|
44
|
+
const run = (body, name = "main") => {
|
|
45
|
+
const fn = { name, params: [], returnType: F64, locals: [], body, loc };
|
|
35
46
|
applyKeyOrderWitnesses(lowerer, [fn]);
|
|
47
|
+
return fn;
|
|
36
48
|
};
|
|
37
49
|
const order = (type) => shapes.get(type.shapeId)?.declaredOrder;
|
|
38
50
|
return { lowerer, shapes, notes, record, literal, run, order };
|
|
39
51
|
}
|
|
52
|
+
/** The order index a literal stores (KEY_ORDER_FIELD), when it stores one. */
|
|
53
|
+
const orderIndexOf = (lit) => lit.kind === "recordLit" ? lit.fields.find((x) => x.name === KEY_ORDER_FIELD)?.value : undefined;
|
|
40
54
|
const observe = (value) => ({
|
|
41
55
|
kind: "exprStmt",
|
|
42
56
|
expr: { kind: "jsonStringify", value, type: { kind: "string" }, loc },
|
|
@@ -73,14 +87,67 @@ test("literals that agree with the table leave the same array in place", () => {
|
|
|
73
87
|
expect(f.order(ab)).toBe(before);
|
|
74
88
|
expect(f.notes.changed.size).toBe(0);
|
|
75
89
|
});
|
|
76
|
-
test("values built in two orders
|
|
90
|
+
test("values built in two orders each record their literal's order", () => {
|
|
77
91
|
const f = fixture();
|
|
78
92
|
const ab = f.record([
|
|
79
93
|
["a", F64],
|
|
80
94
|
["b", F64],
|
|
81
95
|
], ["a", "b"]);
|
|
82
|
-
|
|
96
|
+
const ba = f.literal(ab, ["b", "a"]);
|
|
97
|
+
const aOrder = f.literal(ab, ["a", "b"]);
|
|
98
|
+
f.run([observe(ba), observe(aOrder)]);
|
|
83
99
|
expect(f.order(ab)).toEqual(["a", "b"]);
|
|
100
|
+
const shape = f.shapes.get(ab.shapeId);
|
|
101
|
+
expect(shape.orderVariants).toEqual([
|
|
102
|
+
["a", "b"],
|
|
103
|
+
["b", "a"],
|
|
104
|
+
]);
|
|
105
|
+
expect(shape.fields.map((x) => x.name)).toEqual([KEY_ORDER_FIELD, "a", "b"]);
|
|
106
|
+
expect(orderIndexOf(ba)).toMatchObject({ kind: "numLit", value: 1 });
|
|
107
|
+
expect(orderIndexOf(aOrder)).toMatchObject({ kind: "numLit", value: 0 });
|
|
108
|
+
});
|
|
109
|
+
test("a copy of a value with orders stores its source's index", () => {
|
|
110
|
+
const f = fixture();
|
|
111
|
+
const abc = f.record([
|
|
112
|
+
["a", F64],
|
|
113
|
+
["b", F64],
|
|
114
|
+
["c", F64],
|
|
115
|
+
], ["a", "b", "c"]);
|
|
116
|
+
const ab = f.record([
|
|
117
|
+
["a", F64],
|
|
118
|
+
["b", F64],
|
|
119
|
+
], ["a", "b"]);
|
|
120
|
+
const read = (field) => ({
|
|
121
|
+
kind: "recordGet",
|
|
122
|
+
obj: ref("x", abc),
|
|
123
|
+
shapeId: abc.shapeId,
|
|
124
|
+
field,
|
|
125
|
+
type: F64,
|
|
126
|
+
loc,
|
|
127
|
+
});
|
|
128
|
+
const rest = f.notes.copy({
|
|
129
|
+
kind: "recordLit",
|
|
130
|
+
fields: [
|
|
131
|
+
{ name: "a", value: read("a") },
|
|
132
|
+
{ name: "b", value: read("b") },
|
|
133
|
+
],
|
|
134
|
+
type: ab,
|
|
135
|
+
loc,
|
|
136
|
+
}, abc.shapeId);
|
|
137
|
+
f.run([
|
|
138
|
+
decl("x", f.literal(abc, ["c", "b", "a"])),
|
|
139
|
+
observe(f.literal(abc, ["a", "b", "c"])),
|
|
140
|
+
observe(rest),
|
|
141
|
+
]);
|
|
142
|
+
expect(f.shapes.get(ab.shapeId).orderVariants).toEqual([
|
|
143
|
+
["a", "b"],
|
|
144
|
+
["b", "a"],
|
|
145
|
+
]);
|
|
146
|
+
expect(orderIndexOf(rest)).toMatchObject({
|
|
147
|
+
kind: "recordGet",
|
|
148
|
+
obj: { kind: "varRef", localId: "x" },
|
|
149
|
+
field: KEY_ORDER_FIELD,
|
|
150
|
+
});
|
|
84
151
|
});
|
|
85
152
|
test("an unobserved shape keeps today's table", () => {
|
|
86
153
|
const f = fixture();
|
|
@@ -109,6 +176,28 @@ test("a synthesized construction pins today's table", () => {
|
|
|
109
176
|
f.run([observe(f.literal(ab, ["b", "a"])), observe(synthesized)]);
|
|
110
177
|
expect(f.order(ab)).toEqual(["a", "b"]);
|
|
111
178
|
});
|
|
179
|
+
test("a runtime builder typed by its use site pins today's table", () => {
|
|
180
|
+
const f = fixture();
|
|
181
|
+
const ab = f.record([
|
|
182
|
+
["a", F64],
|
|
183
|
+
["b", F64],
|
|
184
|
+
], ["a", "b"]);
|
|
185
|
+
// net.serverAddress's signature result is VOID: the call takes its record
|
|
186
|
+
// type from its use site, and the runtime builds the record in that order.
|
|
187
|
+
const built = { kind: "libCall", fn: "net.serverAddress", args: [], type: ab, loc };
|
|
188
|
+
f.run([observe(f.literal(ab, ["b", "a"])), observe(built)]);
|
|
189
|
+
expect(f.order(ab)).toEqual(["a", "b"]);
|
|
190
|
+
});
|
|
191
|
+
test("an always-throwing call typed as the record leaves its literals' order", () => {
|
|
192
|
+
const f = fixture();
|
|
193
|
+
const ab = f.record([
|
|
194
|
+
["a", F64],
|
|
195
|
+
["b", F64],
|
|
196
|
+
], ["a", "b"]);
|
|
197
|
+
const thrown = { kind: "libCall", fn: "error.nodeThrow", args: [], type: ab, loc };
|
|
198
|
+
f.run([observe(f.literal(ab, ["b", "a"])), observe(thrown)]);
|
|
199
|
+
expect(f.order(ab)).toEqual(["b", "a"]);
|
|
200
|
+
});
|
|
112
201
|
test("a checked conversion alone pins today's table", () => {
|
|
113
202
|
const f = fixture();
|
|
114
203
|
const ab = f.record([
|
|
@@ -220,7 +309,7 @@ test("straight-line writes of late-only keys keep program order", () => {
|
|
|
220
309
|
]);
|
|
221
310
|
expect(f.order(o)).toEqual(["id", "y", "x"]);
|
|
222
311
|
});
|
|
223
|
-
test("late-only keys written through different bindings
|
|
312
|
+
test("late-only keys written through different bindings move to the end per value", () => {
|
|
224
313
|
const f = fixture();
|
|
225
314
|
const o = f.record([
|
|
226
315
|
["id", F64],
|
|
@@ -234,15 +323,19 @@ test("late-only keys written through different bindings keep today's table", ()
|
|
|
234
323
|
observe(ref("o", o)),
|
|
235
324
|
]);
|
|
236
325
|
expect(f.order(o)).toEqual(["id", "x", "y"]);
|
|
326
|
+
expect(f.shapes.get(o.shapeId).orderVariants).toEqual([
|
|
327
|
+
["id", "x", "y"],
|
|
328
|
+
["id", "y", "x"],
|
|
329
|
+
]);
|
|
237
330
|
});
|
|
238
|
-
test("a late-only key written in a loop
|
|
331
|
+
test("a late-only key written in a loop guards the write with its move", () => {
|
|
239
332
|
const f = fixture();
|
|
240
333
|
const o = f.record([
|
|
241
334
|
["id", F64],
|
|
242
335
|
["x", OPT],
|
|
243
336
|
["y", OPT],
|
|
244
337
|
], ["id", "x", "y"]);
|
|
245
|
-
|
|
338
|
+
const body = [
|
|
246
339
|
decl("o", f.literal(o, ["id"])),
|
|
247
340
|
set(ref("o", o), "y"),
|
|
248
341
|
{
|
|
@@ -252,10 +345,17 @@ test("a late-only key written in a loop over an outer binding keeps today's tabl
|
|
|
252
345
|
loc,
|
|
253
346
|
},
|
|
254
347
|
observe(ref("o", o)),
|
|
255
|
-
]
|
|
348
|
+
];
|
|
349
|
+
const fn = f.run(body);
|
|
256
350
|
expect(f.order(o)).toEqual(["id", "x", "y"]);
|
|
351
|
+
const loop = fn.body.find((st) => st.kind === "while");
|
|
352
|
+
const guarded = loop.body[0];
|
|
353
|
+
expect(guarded.kind).toBe("block");
|
|
354
|
+
const [move, write] = guarded.body;
|
|
355
|
+
expect(move).toMatchObject({ kind: "if", cond: { kind: "unary", op: "!" } });
|
|
356
|
+
expect(write).toMatchObject({ kind: "recordSet", field: "x" });
|
|
257
357
|
});
|
|
258
|
-
test("re-adding a key a literal creates earlier
|
|
358
|
+
test("re-adding a key a literal creates earlier moves it to the end of that value", () => {
|
|
259
359
|
const f = fixture();
|
|
260
360
|
const o = f.record([
|
|
261
361
|
["a", OPT],
|
|
@@ -271,5 +371,425 @@ test("re-adding a key a literal creates earlier keeps today's table", () => {
|
|
|
271
371
|
};
|
|
272
372
|
f.run([decl("o", f.literal(o, ["a", "b"])), del, set(ref("o", o), "a"), observe(ref("o", o))]);
|
|
273
373
|
expect(f.order(o)).toEqual(["a", "b"]);
|
|
374
|
+
expect(f.shapes.get(o.shapeId).orderVariants).toEqual([
|
|
375
|
+
["a", "b"],
|
|
376
|
+
["b", "a"],
|
|
377
|
+
]);
|
|
378
|
+
});
|
|
379
|
+
test("a moving write evaluates its value before it tests and moves the key", () => {
|
|
380
|
+
const f = fixture();
|
|
381
|
+
const o = f.record([
|
|
382
|
+
["id", F64],
|
|
383
|
+
["x", OPT],
|
|
384
|
+
["y", OPT],
|
|
385
|
+
], ["id", "x", "y"]);
|
|
386
|
+
// `o.x = ((o.y = 2), 3)`: y is created first.
|
|
387
|
+
const value = {
|
|
388
|
+
kind: "seqExpr",
|
|
389
|
+
stmts: [set(ref("o", o), "y")],
|
|
390
|
+
result: num(3),
|
|
391
|
+
type: F64,
|
|
392
|
+
loc,
|
|
393
|
+
};
|
|
394
|
+
const write = {
|
|
395
|
+
kind: "recordSet",
|
|
396
|
+
obj: ref("o", o),
|
|
397
|
+
shapeId: o.shapeId,
|
|
398
|
+
field: "x",
|
|
399
|
+
value,
|
|
400
|
+
loc,
|
|
401
|
+
};
|
|
402
|
+
const fn = f.run([
|
|
403
|
+
decl("o", f.literal(o, ["id"])),
|
|
404
|
+
observe(f.literal(o, ["x", "id"])),
|
|
405
|
+
write,
|
|
406
|
+
observe(ref("o", o)),
|
|
407
|
+
]);
|
|
408
|
+
const shape = f.shapes.get(o.shapeId);
|
|
409
|
+
expect(shape.orderVariants).toBeDefined();
|
|
410
|
+
const block = fn.body[2];
|
|
411
|
+
expect(block.kind).toBe("block");
|
|
412
|
+
// The receiver evaluates first, since the value may assign its binding.
|
|
413
|
+
const [receiver, first, guard, written] = block.body;
|
|
414
|
+
expect(receiver).toMatchObject({ kind: "varDecl", init: { kind: "varRef", localId: "o" } });
|
|
415
|
+
const target = receiver.localId;
|
|
416
|
+
expect(first).toMatchObject({ kind: "varDecl", init: { kind: "seqExpr" } });
|
|
417
|
+
const local = first.localId;
|
|
418
|
+
expect(guard).toMatchObject({ kind: "if", cond: { kind: "unary", op: "!" } });
|
|
419
|
+
expect(written).toMatchObject({
|
|
420
|
+
kind: "recordSet",
|
|
421
|
+
obj: { kind: "varRef", localId: target },
|
|
422
|
+
field: "x",
|
|
423
|
+
value: { kind: "varRef", localId: local },
|
|
424
|
+
});
|
|
425
|
+
// The write inside the value moves y in its own block.
|
|
426
|
+
const init = first.init;
|
|
427
|
+
expect(init.stmts[0]).toMatchObject({ kind: "block" });
|
|
428
|
+
});
|
|
429
|
+
test("a key after a spread that the source may lack picks its order from the source's keys", () => {
|
|
430
|
+
const f = fixture();
|
|
431
|
+
const s = f.record([
|
|
432
|
+
["a", F64],
|
|
433
|
+
["b", OPT],
|
|
434
|
+
["c", OPT],
|
|
435
|
+
], ["a", "b", "c"]);
|
|
436
|
+
const t = f.record([
|
|
437
|
+
["a", F64],
|
|
438
|
+
["b", F64],
|
|
439
|
+
["c", OPT],
|
|
440
|
+
], ["a", "b", "c"]);
|
|
441
|
+
const read = (field) => ({
|
|
442
|
+
kind: "recordGet",
|
|
443
|
+
obj: ref("v", s),
|
|
444
|
+
shapeId: s.shapeId,
|
|
445
|
+
field,
|
|
446
|
+
type: OPT,
|
|
447
|
+
loc,
|
|
448
|
+
});
|
|
449
|
+
// `{ ...x, b: 1 }`, which evaluates `x` into `v` first
|
|
450
|
+
const merged = f.notes.literal({
|
|
451
|
+
kind: "recordLit",
|
|
452
|
+
fields: [
|
|
453
|
+
{ name: "a", value: read("a") },
|
|
454
|
+
{ name: "c", value: read("c") },
|
|
455
|
+
{ name: "b", value: num(1) },
|
|
456
|
+
],
|
|
457
|
+
type: t,
|
|
458
|
+
loc,
|
|
459
|
+
}, [
|
|
460
|
+
{
|
|
461
|
+
kind: "spread",
|
|
462
|
+
shapeId: s.shapeId,
|
|
463
|
+
maybeAbsent: false,
|
|
464
|
+
value: { kind: "varRef", localId: "v", type: s, loc },
|
|
465
|
+
},
|
|
466
|
+
{ kind: "key", name: "b", definite: true },
|
|
467
|
+
]);
|
|
468
|
+
const prologue = [decl("v", ref("x", s))];
|
|
469
|
+
f.run([
|
|
470
|
+
decl("x", f.literal(s, ["c", "a"])),
|
|
471
|
+
observe(f.literal(s, ["a", "c"])),
|
|
472
|
+
observe({ kind: "seqExpr", stmts: prologue, result: merged, type: t, loc }),
|
|
473
|
+
]);
|
|
474
|
+
// b keeps its place in the source's order when the source has it, and
|
|
475
|
+
// follows the source's keys when it does not.
|
|
476
|
+
expect(f.shapes.get(t.shapeId).orderVariants).toEqual([
|
|
477
|
+
["a", "c", "b"],
|
|
478
|
+
["c", "a", "b"],
|
|
479
|
+
["a", "b", "c"],
|
|
480
|
+
]);
|
|
481
|
+
expect(prologue[1]).toMatchObject({
|
|
482
|
+
kind: "varDecl",
|
|
483
|
+
init: {
|
|
484
|
+
kind: "ternary",
|
|
485
|
+
cond: { kind: "recordHas", obj: { kind: "varRef", localId: "v" }, field: "b" },
|
|
486
|
+
},
|
|
487
|
+
});
|
|
488
|
+
const snapshot = prologue[1].localId;
|
|
489
|
+
expect(orderIndexOf(merged)).toMatchObject({ kind: "varRef", localId: snapshot });
|
|
490
|
+
});
|
|
491
|
+
test("a spread reads its source's order right after the literal evaluates the source", () => {
|
|
492
|
+
const f = fixture();
|
|
493
|
+
const s = f.record([
|
|
494
|
+
["a", F64],
|
|
495
|
+
["b", F64],
|
|
496
|
+
], ["a", "b"]);
|
|
497
|
+
const t = f.record([
|
|
498
|
+
["a", F64],
|
|
499
|
+
["b", F64],
|
|
500
|
+
["first", F64],
|
|
501
|
+
["last", F64],
|
|
502
|
+
], ["first", "a", "b", "last"]);
|
|
503
|
+
const read = (localId, field) => ({
|
|
504
|
+
kind: "recordGet",
|
|
505
|
+
obj: ref(localId, s),
|
|
506
|
+
shapeId: s.shapeId,
|
|
507
|
+
field,
|
|
508
|
+
type: F64,
|
|
509
|
+
loc,
|
|
510
|
+
});
|
|
511
|
+
// `{ first: y.a, ...x, last: y.b }`: the literal evaluates `first`, then
|
|
512
|
+
// the source into `v` and its fields, then `last`, which reads another
|
|
513
|
+
// value of the source's shape.
|
|
514
|
+
const lit = f.notes.literal({
|
|
515
|
+
kind: "recordLit",
|
|
516
|
+
fields: [
|
|
517
|
+
{ name: "first", value: ref("p", F64) },
|
|
518
|
+
{ name: "a", value: ref("va", F64) },
|
|
519
|
+
{ name: "b", value: ref("vb", F64) },
|
|
520
|
+
{ name: "last", value: read("y", "b") },
|
|
521
|
+
],
|
|
522
|
+
type: t,
|
|
523
|
+
loc,
|
|
524
|
+
}, [
|
|
525
|
+
{ kind: "key", name: "first", definite: true },
|
|
526
|
+
{
|
|
527
|
+
kind: "spread",
|
|
528
|
+
shapeId: s.shapeId,
|
|
529
|
+
maybeAbsent: false,
|
|
530
|
+
value: { kind: "varRef", localId: "v", type: s, loc },
|
|
531
|
+
},
|
|
532
|
+
{ kind: "key", name: "last", definite: true },
|
|
533
|
+
]);
|
|
534
|
+
const prologue = [
|
|
535
|
+
decl("p", read("y", "a")),
|
|
536
|
+
decl("v", ref("x", s)),
|
|
537
|
+
decl("va", read("v", "a")),
|
|
538
|
+
decl("vb", read("v", "b")),
|
|
539
|
+
];
|
|
540
|
+
f.run([
|
|
541
|
+
decl("x", f.literal(s, ["b", "a"])),
|
|
542
|
+
decl("y", f.literal(s, ["a", "b"])),
|
|
543
|
+
observe({ kind: "seqExpr", stmts: prologue, result: lit, type: t, loc }),
|
|
544
|
+
]);
|
|
545
|
+
expect(f.shapes.get(t.shapeId).orderVariants).toEqual([
|
|
546
|
+
["first", "a", "b", "last"],
|
|
547
|
+
["first", "b", "a", "last"],
|
|
548
|
+
]);
|
|
549
|
+
// The index is the spread binding's, read before `last` evaluates.
|
|
550
|
+
expect(prologue[2]).toMatchObject({
|
|
551
|
+
kind: "varDecl",
|
|
552
|
+
init: { kind: "recordGet", obj: { kind: "varRef", localId: "v" }, field: KEY_ORDER_FIELD },
|
|
553
|
+
});
|
|
554
|
+
const snapshot = prologue[2].localId;
|
|
555
|
+
expect(orderIndexOf(lit)).toMatchObject({ kind: "varRef", localId: snapshot });
|
|
556
|
+
});
|
|
557
|
+
/** `{ a, b }` with a declared table `["a", "b"]` and a literal `{ b, a }`
|
|
558
|
+
* plus `{ ...value, a }` of the same shape, beside `extra`. */
|
|
559
|
+
function selfCopy(extra, fnName = "main") {
|
|
560
|
+
const f = fixture();
|
|
561
|
+
const ab = f.record([
|
|
562
|
+
["a", F64],
|
|
563
|
+
["b", F64],
|
|
564
|
+
], ["a", "b"]);
|
|
565
|
+
const self = { kind: "spread", shapeId: ab.shapeId, maybeAbsent: false };
|
|
566
|
+
f.run([
|
|
567
|
+
decl("v", f.literal(ab, ["b", "a"])),
|
|
568
|
+
observe(f.literal(ab, ["a", "b"], [self, { kind: "key", name: "a", definite: true }])),
|
|
569
|
+
...extra(f, ab),
|
|
570
|
+
], fnName);
|
|
571
|
+
return f.order(ab);
|
|
572
|
+
}
|
|
573
|
+
test("a literal that starts by spreading its own shape takes the other literals' order", () => {
|
|
574
|
+
expect(selfCopy(() => [])).toEqual(["b", "a"]);
|
|
575
|
+
});
|
|
576
|
+
test("a self copy of a shape a checked conversion builds cannot be ordered statically", () => {
|
|
577
|
+
const parsed = (ab) => ({
|
|
578
|
+
kind: "dynCheck",
|
|
579
|
+
value: ref("j", { kind: "dyn" }),
|
|
580
|
+
type: ab,
|
|
581
|
+
loc,
|
|
582
|
+
});
|
|
583
|
+
expect(selfCopy((_, ab) => [observe(parsed(ab))])).toEqual(["a", "b"]);
|
|
584
|
+
});
|
|
585
|
+
test("a replaceable method's checked result builds no record", () => {
|
|
586
|
+
expect(selfCopy((f, ab) => {
|
|
587
|
+
const result = { kind: "dynCheck", value: ref("r", { kind: "dyn" }), type: ab, loc };
|
|
588
|
+
return [observe(f.notes.methodResult(result, "load"))];
|
|
589
|
+
})).toEqual(["b", "a"]);
|
|
590
|
+
});
|
|
591
|
+
test("a replaceable method's checked result builds records when a replacement may return one", () => {
|
|
592
|
+
expect(selfCopy((f, ab) => {
|
|
593
|
+
// A site the census cannot see through (a computed write of some
|
|
594
|
+
// value, a reflection call) may install a replacement returning a
|
|
595
|
+
// record built in any order.
|
|
596
|
+
f.lowerer.methodAccessSites.set("load", [
|
|
597
|
+
{ kind: ts.SyntaxKind.CallExpression },
|
|
598
|
+
]);
|
|
599
|
+
const result = { kind: "dynCheck", value: ref("r", { kind: "dyn" }), type: ab, loc };
|
|
600
|
+
return [observe(f.notes.methodResult(result, "load"))];
|
|
601
|
+
})).toEqual(["a", "b"]);
|
|
602
|
+
});
|
|
603
|
+
/** A native callback taking the shape, boxed for JavaScript. */
|
|
604
|
+
const boxedCallback = (ab) => ({
|
|
605
|
+
kind: "dynFrom",
|
|
606
|
+
value: {
|
|
607
|
+
kind: "closure",
|
|
608
|
+
fnName: "callback",
|
|
609
|
+
captures: [],
|
|
610
|
+
type: { kind: "func", params: [ab], ret: { kind: "void" } },
|
|
611
|
+
loc,
|
|
612
|
+
},
|
|
613
|
+
type: { kind: "dyn" },
|
|
614
|
+
loc,
|
|
615
|
+
});
|
|
616
|
+
test("a native callback boxed for JavaScript receives records JavaScript builds", () => {
|
|
617
|
+
expect(selfCopy((_, ab) => [observe(boxedCallback(ab))])).toEqual(["a", "b"]);
|
|
618
|
+
});
|
|
619
|
+
test("a class's prototype slots box its methods without building their parameters", () => {
|
|
620
|
+
expect(selfCopy((_, ab) => [observe(boxedCallback(ab))], "%prototype.data.Service")).toEqual([
|
|
621
|
+
"b",
|
|
622
|
+
"a",
|
|
623
|
+
]);
|
|
624
|
+
});
|
|
625
|
+
test("a replaceable method's result keeps its witness through an IR rewrite", () => {
|
|
626
|
+
expect(selfCopy((f, ab) => {
|
|
627
|
+
const result = f.notes.methodResult({
|
|
628
|
+
kind: "dynCheck",
|
|
629
|
+
value: ref("r", { kind: "dyn" }),
|
|
630
|
+
type: ab,
|
|
631
|
+
loc,
|
|
632
|
+
}, "load");
|
|
633
|
+
const identity = { expr: (e) => e, stmt: (st) => st };
|
|
634
|
+
observeRecordLiteralRebuilds((from, to) => f.notes.follow(from, to));
|
|
635
|
+
try {
|
|
636
|
+
const rebuilt = transformExpr(result, identity);
|
|
637
|
+
expect(rebuilt).not.toBe(result);
|
|
638
|
+
return [observe(rebuilt)];
|
|
639
|
+
}
|
|
640
|
+
finally {
|
|
641
|
+
observeRecordLiteralRebuilds(null);
|
|
642
|
+
}
|
|
643
|
+
})).toEqual(["b", "a"]);
|
|
644
|
+
});
|
|
645
|
+
test("a checked conversion of a boxed primitive builds no record", () => {
|
|
646
|
+
expect(selfCopy((_, ab) => {
|
|
647
|
+
const missing = {
|
|
648
|
+
kind: "dynFrom",
|
|
649
|
+
value: { kind: "unitLit", unit: "undefined", type: { kind: "undefinedT" }, loc },
|
|
650
|
+
type: { kind: "dyn" },
|
|
651
|
+
loc,
|
|
652
|
+
};
|
|
653
|
+
return [observe({ kind: "dynCheck", value: missing, type: ab, loc })];
|
|
654
|
+
})).toEqual(["b", "a"]);
|
|
655
|
+
});
|
|
656
|
+
test("a checked conversion into a class builds none of its fields' records", () => {
|
|
657
|
+
expect(selfCopy((f, ab) => {
|
|
658
|
+
f.lowerer.classes.set("Holder", {
|
|
659
|
+
def: { fields: [{ name: "value", type: ab }] },
|
|
660
|
+
});
|
|
661
|
+
const holder = { kind: "object", className: "Holder" };
|
|
662
|
+
const checked = {
|
|
663
|
+
kind: "dynCheck",
|
|
664
|
+
value: ref("h", { kind: "dyn" }),
|
|
665
|
+
type: holder,
|
|
666
|
+
loc,
|
|
667
|
+
};
|
|
668
|
+
return [{ kind: "exprStmt", expr: checked, loc }];
|
|
669
|
+
})).toEqual(["b", "a"]);
|
|
670
|
+
});
|
|
671
|
+
test("a checked function passes its record parameters out, and its callbacks' back in", () => {
|
|
672
|
+
const callable = (params) => ({
|
|
673
|
+
kind: "func",
|
|
674
|
+
params,
|
|
675
|
+
ret: { kind: "string" },
|
|
676
|
+
});
|
|
677
|
+
const checkedAs = (type) => ({
|
|
678
|
+
kind: "exprStmt",
|
|
679
|
+
expr: { kind: "dynCheck", value: ref("fn", { kind: "dyn" }), type, loc },
|
|
680
|
+
loc,
|
|
681
|
+
});
|
|
682
|
+
expect(selfCopy((_, ab) => [checkedAs(callable([ab]))])).toEqual(["b", "a"]);
|
|
683
|
+
// A callback parameter receives values the JavaScript function builds.
|
|
684
|
+
expect(selfCopy((_, ab) => [checkedAs(callable([callable([ab])]))])).toEqual(["a", "b"]);
|
|
685
|
+
// So does a container parameter, which the function can write into.
|
|
686
|
+
expect(selfCopy((_, ab) => [checkedAs(callable([{ kind: "array", elem: ab }]))])).toEqual([
|
|
687
|
+
"a",
|
|
688
|
+
"b",
|
|
689
|
+
]);
|
|
690
|
+
});
|
|
691
|
+
test("a generator resume builds only its result record, never the value it carries", () => {
|
|
692
|
+
const f = fixture();
|
|
693
|
+
const ab = f.record([
|
|
694
|
+
["a", F64],
|
|
695
|
+
["b", F64],
|
|
696
|
+
], ["a", "b"]);
|
|
697
|
+
const result = f.record([
|
|
698
|
+
["done", { kind: "bool" }],
|
|
699
|
+
["value", ab],
|
|
700
|
+
], ["value", "done"]);
|
|
701
|
+
const gen = {
|
|
702
|
+
kind: "generator",
|
|
703
|
+
yieldT: ab,
|
|
704
|
+
retT: { kind: "void" },
|
|
705
|
+
nextT: { kind: "undefinedT" },
|
|
706
|
+
};
|
|
707
|
+
const resume = (mode, type) => observe({ kind: "genResume", mode, gen: ref("g", gen), arg: null, type, loc });
|
|
708
|
+
f.run([
|
|
709
|
+
observe(f.literal(ab, ["b", "a"])),
|
|
710
|
+
observe(f.literal(result, ["done", "value"])),
|
|
711
|
+
resume("value", ab),
|
|
712
|
+
resume("next", result),
|
|
713
|
+
]);
|
|
714
|
+
expect(f.order(ab)).toEqual(["b", "a"]);
|
|
715
|
+
// The result record itself is built in its fixed layout: today's table.
|
|
716
|
+
expect(f.order(result)).toEqual(["value", "done"]);
|
|
717
|
+
});
|
|
718
|
+
/** `{ a, b }` built by a checked conversion and by the literal `{ b, a }`,
|
|
719
|
+
* copied by `{ ...value, a }` (evaluating the value into a binding, as
|
|
720
|
+
* spread literals do), observed. Answers the table and the function. */
|
|
721
|
+
function checkedSelfCopy() {
|
|
722
|
+
const f = fixture();
|
|
723
|
+
const ab = f.record([
|
|
724
|
+
["a", F64],
|
|
725
|
+
["b", F64],
|
|
726
|
+
], ["a", "b"]);
|
|
727
|
+
const value = ref("value", ab);
|
|
728
|
+
const self = { kind: "spread", shapeId: ab.shapeId, maybeAbsent: false, value };
|
|
729
|
+
const literal = f.literal(ab, ["a", "b"], [self, { kind: "key", name: "a", definite: true }]);
|
|
730
|
+
const copy = {
|
|
731
|
+
kind: "seqExpr",
|
|
732
|
+
stmts: [decl("value", { kind: "dynCheck", value: ref("j", { kind: "dyn" }), type: ab, loc })],
|
|
733
|
+
result: literal,
|
|
734
|
+
type: ab,
|
|
735
|
+
loc,
|
|
736
|
+
};
|
|
737
|
+
const fn = f.run([observe(f.literal(ab, ["b", "a"])), observe(copy)]);
|
|
738
|
+
return { order: f.order(ab), fn, copy };
|
|
739
|
+
}
|
|
740
|
+
test("a spread of a value a checked conversion built carries the value's order over", () => {
|
|
741
|
+
const { order, fn, copy } = checkedSelfCopy();
|
|
742
|
+
// Values the literal builds enumerate in its order; copies of converted
|
|
743
|
+
// values keep the order their record source holds.
|
|
744
|
+
expect(order).toEqual(["b", "a"]);
|
|
745
|
+
expect(copy).toMatchObject({
|
|
746
|
+
kind: "seqExpr",
|
|
747
|
+
stmts: [
|
|
748
|
+
{ kind: "varDecl", localId: "value" },
|
|
749
|
+
{ kind: "varDecl", localId: "%orderedSpread.0", init: { kind: "recordLit" } },
|
|
750
|
+
{
|
|
751
|
+
kind: "exprStmt",
|
|
752
|
+
expr: {
|
|
753
|
+
kind: "libCall",
|
|
754
|
+
fn: "record.sourceSpread",
|
|
755
|
+
args: [
|
|
756
|
+
{ kind: "varRef", localId: "%orderedSpread.0" },
|
|
757
|
+
{ kind: "varRef", localId: "value" },
|
|
758
|
+
],
|
|
759
|
+
},
|
|
760
|
+
},
|
|
761
|
+
],
|
|
762
|
+
result: { kind: "varRef", localId: "%orderedSpread.0" },
|
|
763
|
+
});
|
|
764
|
+
expect(fn.locals.map((local) => local.id)).toEqual(["%orderedSpread.0"]);
|
|
765
|
+
});
|
|
766
|
+
test("a spread of a converted value into a wider shape orders the wider shape", () => {
|
|
767
|
+
const f = fixture();
|
|
768
|
+
const ab = f.record([
|
|
769
|
+
["a", F64],
|
|
770
|
+
["b", F64],
|
|
771
|
+
], ["a", "b"]);
|
|
772
|
+
const abc = f.record([
|
|
773
|
+
["a", F64],
|
|
774
|
+
["b", F64],
|
|
775
|
+
["c", F64],
|
|
776
|
+
], ["c", "a", "b"]);
|
|
777
|
+
const value = ref("value", ab);
|
|
778
|
+
const spread = {
|
|
779
|
+
kind: "spread",
|
|
780
|
+
shapeId: ab.shapeId,
|
|
781
|
+
maybeAbsent: false,
|
|
782
|
+
value,
|
|
783
|
+
};
|
|
784
|
+
const wide = {
|
|
785
|
+
kind: "seqExpr",
|
|
786
|
+
stmts: [decl("value", { kind: "dynCheck", value: ref("j", { kind: "dyn" }), type: ab, loc })],
|
|
787
|
+
result: f.literal(abc, ["a", "b", "c"], [spread, { kind: "key", name: "c", definite: true }]),
|
|
788
|
+
type: abc,
|
|
789
|
+
loc,
|
|
790
|
+
};
|
|
791
|
+
f.run([observe(f.literal(ab, ["b", "a"])), observe(wide)]);
|
|
792
|
+
expect(f.order(ab)).toEqual(["b", "a"]);
|
|
793
|
+
expect(f.order(abc)).toEqual(["b", "a", "c"]);
|
|
274
794
|
});
|
|
275
795
|
//# sourceMappingURL=key-order-witness.test.js.map
|