@scriptc/compiler 0.2.7 → 0.2.8
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 +2 -0
- package/dist/backend/llvm/alloc.d.ts +3 -0
- package/dist/backend/llvm/alloc.js +54 -13
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/blocks.d.ts +9 -0
- package/dist/backend/llvm/blocks.js +9 -0
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/borrowed-receivers.d.ts +7 -0
- package/dist/backend/llvm/borrowed-receivers.js +39 -0
- package/dist/backend/llvm/borrowed-receivers.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.d.ts +4 -1
- package/dist/backend/llvm/call-lifetimes.js +14 -3
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +8 -3
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/checked-narrows.d.ts +24 -0
- package/dist/backend/llvm/checked-narrows.js +108 -0
- package/dist/backend/llvm/checked-narrows.js.map +1 -0
- package/dist/backend/llvm/checked-narrows.test.d.ts +1 -0
- package/dist/backend/llvm/checked-narrows.test.js +208 -0
- package/dist/backend/llvm/checked-narrows.test.js.map +1 -0
- package/dist/backend/llvm/classes.d.ts +13 -1
- package/dist/backend/llvm/classes.js +26 -18
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +32 -3
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/debug-info.d.ts +6 -2
- package/dist/backend/llvm/debug-info.js +11 -1
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +89 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +4 -0
- package/dist/backend/llvm/dyn.js +31 -20
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +184 -11
- package/dist/backend/llvm/emitter.js +1189 -125
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +21 -1
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +4 -4
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +1 -1
- package/dist/backend/llvm/expr-bytes.js +85 -8
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +29 -21
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +5 -0
- package/dist/backend/llvm/expr-calls.js +55 -10
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +7 -1
- package/dist/backend/llvm/expr-containers.js +230 -27
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +25 -10
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +72 -21
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-island.js +3 -8
- package/dist/backend/llvm/expr-island.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +41 -12
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +50 -2
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +28 -14
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +41 -31
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.js +6 -3
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/layouts.d.ts +2 -1
- package/dist/backend/llvm/layouts.js +2 -2
- package/dist/backend/llvm/layouts.js.map +1 -1
- package/dist/backend/llvm/lib-abi.js +10 -0
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +7 -11
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +8 -8
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +1 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +73 -13
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +7 -3
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.js +10 -6
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +3 -2
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +18 -0
- package/dist/backend/llvm/map-number-lookup.js +62 -0
- package/dist/backend/llvm/map-number-lookup.js.map +1 -0
- package/dist/backend/llvm/map-read-lifetimes.d.ts +6 -0
- package/dist/backend/llvm/map-read-lifetimes.js +24 -3
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +38 -19
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +68 -0
- package/dist/backend/llvm/nullable-unions.js +132 -0
- package/dist/backend/llvm/nullable-unions.js.map +1 -0
- package/dist/backend/llvm/publish.d.ts +58 -0
- package/dist/backend/llvm/publish.js +286 -0
- package/dist/backend/llvm/publish.js.map +1 -0
- package/dist/backend/llvm/rebound-parameters.d.ts +12 -0
- package/dist/backend/llvm/rebound-parameters.js +72 -0
- package/dist/backend/llvm/rebound-parameters.js.map +1 -0
- package/dist/backend/llvm/rebound-parameters.test.d.ts +1 -0
- package/dist/backend/llvm/rebound-parameters.test.js +67 -0
- package/dist/backend/llvm/rebound-parameters.test.js.map +1 -0
- package/dist/backend/llvm/reference-effects.d.ts +18 -2
- package/dist/backend/llvm/reference-effects.js +106 -16
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-effects.test.js +52 -1
- package/dist/backend/llvm/reference-effects.test.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +45 -17
- package/dist/backend/llvm/shapes.js +131 -53
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +33 -8
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/stack-unions.test.js +5 -2
- package/dist/backend/llvm/stack-unions.test.js.map +1 -1
- package/dist/backend/llvm/string-construction.d.ts +10 -0
- package/dist/backend/llvm/string-construction.js +42 -0
- package/dist/backend/llvm/string-construction.js.map +1 -1
- package/dist/backend/llvm/string-key-hash.d.ts +9 -2
- package/dist/backend/llvm/string-key-hash.js +20 -3
- package/dist/backend/llvm/string-key-hash.js.map +1 -1
- package/dist/backend/llvm/string-key-hash.test.js +14 -3
- package/dist/backend/llvm/string-key-hash.test.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +24 -11
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +7 -0
- package/dist/backend/llvm/string-reads.js +76 -0
- package/dist/backend/llvm/string-reads.js.map +1 -0
- package/dist/backend/llvm/switch-dispatch.test.js +1 -1
- package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
- package/dist/backend/llvm/test-boxed-unions.d.ts +5 -0
- package/dist/backend/llvm/test-boxed-unions.js +13 -0
- package/dist/backend/llvm/test-boxed-unions.js.map +1 -0
- package/dist/backend/llvm/union-repr.d.ts +15 -0
- package/dist/backend/llvm/union-repr.js +89 -0
- package/dist/backend/llvm/union-repr.js.map +1 -0
- package/dist/backend/llvm/virtual-borrows.d.ts +31 -0
- package/dist/backend/llvm/virtual-borrows.js +82 -0
- package/dist/backend/llvm/virtual-borrows.js.map +1 -0
- package/dist/backend/llvm/walk-borrows.d.ts +43 -0
- package/dist/backend/llvm/walk-borrows.js +150 -0
- package/dist/backend/llvm/walk-borrows.js.map +1 -0
- package/dist/backend/llvm/walk-borrows.test.d.ts +1 -0
- package/dist/backend/llvm/walk-borrows.test.js +119 -0
- package/dist/backend/llvm/walk-borrows.test.js.map +1 -0
- package/dist/backend/llvm/walkers.d.ts +5 -1
- package/dist/backend/llvm/walkers.js +24 -21
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.d.ts +29 -1
- package/dist/backend/may-throw.js +346 -3
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +113 -1
- package/dist/backend/may-throw.test.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 +7 -5
- package/dist/backend/native-codegen-core.js +14 -9
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +4 -0
- package/dist/backend/native-codegen.js +49 -2
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +41 -10
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-tools.d.ts +2 -0
- package/dist/backend/native-tools.js +3 -0
- package/dist/backend/native-tools.js.map +1 -1
- package/dist/backend/publication.d.ts +28 -0
- package/dist/backend/publication.js +155 -0
- package/dist/backend/publication.js.map +1 -0
- package/dist/backend/publication.test.d.ts +1 -0
- package/dist/backend/publication.test.js +72 -0
- package/dist/backend/publication.test.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-targets.test.js +1 -1
- package/dist/backend/runtime-pack.test.js +1 -1
- package/dist/cli/command.js +70 -7
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +4 -1
- package/dist/cli/usage.js +8 -1
- package/dist/cli/usage.js.map +1 -1
- package/dist/compile-types.d.ts +12 -3
- package/dist/coverage/report.d.ts +25 -2
- package/dist/coverage/report.js +161 -33
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +63 -0
- package/dist/coverage/verdict-cache.js +193 -0
- package/dist/coverage/verdict-cache.js.map +1 -0
- package/dist/coverage/verdict-cache.test.d.ts +1 -0
- package/dist/coverage/verdict-cache.test.js +52 -0
- package/dist/coverage/verdict-cache.test.js.map +1 -0
- package/dist/coverage/verdict-semantic.d.ts +2 -0
- package/dist/coverage/verdict-semantic.js +24 -0
- package/dist/coverage/verdict-semantic.js.map +1 -0
- package/dist/coverage/verdict-startup.d.ts +15 -0
- package/dist/coverage/verdict-startup.js +66 -0
- package/dist/coverage/verdict-startup.js.map +1 -0
- package/dist/diagnostics/diagnostic.d.ts +29 -1
- package/dist/diagnostics/diagnostic.js +74 -4
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +130 -0
- package/dist/diagnostics/envelope.js +257 -0
- package/dist/diagnostics/envelope.js.map +1 -0
- package/dist/diagnostics/envelope.test.d.ts +1 -0
- package/dist/diagnostics/envelope.test.js +91 -0
- package/dist/diagnostics/envelope.test.js.map +1 -0
- package/dist/diagnostics/render.d.ts +3 -0
- package/dist/diagnostics/render.js +13 -2
- package/dist/diagnostics/render.js.map +1 -1
- package/dist/executable/prepare.d.ts +4 -0
- package/dist/executable/prepare.js +7 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +1 -0
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/lowering/array-values.d.ts +7 -0
- package/dist/frontend/lowering/array-values.js +120 -4
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.js +29 -1
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +4 -0
- package/dist/frontend/lowering/builtins/process.js +10 -0
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/workers.js +4 -2
- package/dist/frontend/lowering/builtins/workers.js.map +1 -1
- package/dist/frontend/lowering/class-assertions.d.ts +8 -0
- package/dist/frontend/lowering/class-assertions.js +217 -1
- package/dist/frontend/lowering/class-assertions.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js +8 -5
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/coercions/state.d.ts +6 -0
- package/dist/frontend/lowering/coercions/state.js +2 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.d.ts +8 -0
- package/dist/frontend/lowering/coercions/unions.js +67 -2
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/collation-repertoire.d.ts +1 -0
- package/dist/frontend/lowering/collation-repertoire.js +19 -0
- package/dist/frontend/lowering/collation-repertoire.js.map +1 -0
- package/dist/frontend/lowering/construction-escapes.d.ts +38 -0
- package/dist/frontend/lowering/construction-escapes.js +146 -0
- package/dist/frontend/lowering/construction-escapes.js.map +1 -0
- package/dist/frontend/lowering/construction-escapes.test.d.ts +1 -0
- package/dist/frontend/lowering/construction-escapes.test.js +150 -0
- package/dist/frontend/lowering/construction-escapes.test.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +81 -44
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +15 -2
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +231 -12
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +43 -1
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +7 -63
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +6 -1
- package/dist/frontend/lowering/cycle-initialization.js +59 -33
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/divergences.d.ts +9 -0
- package/dist/frontend/lowering/divergences.js +630 -0
- package/dist/frontend/lowering/divergences.js.map +1 -0
- package/dist/frontend/lowering/expressions/object-literals.js +40 -2
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +5 -0
- package/dist/frontend/lowering/lower-calls.js +226 -157
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +4 -0
- package/dist/frontend/lowering/lower-classes.js +72 -22
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +13 -0
- package/dist/frontend/lowering/lower-exprs.js +431 -107
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +19 -13
- package/dist/frontend/lowering/lower-generators.js +67 -44
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +3 -2
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +1 -1
- package/dist/frontend/lowering/lower-island.js +24 -7
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +90 -1
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +36 -6
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +78 -2
- package/dist/frontend/lowering/lowerer.js +986 -73
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-bounds.d.ts +19 -0
- package/dist/frontend/lowering/runtime-optional-bounds.js +354 -0
- package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-bounds.test.d.ts +1 -0
- package/dist/frontend/lowering/runtime-optional-bounds.test.js +66 -0
- package/dist/frontend/lowering/runtime-optional-bounds.test.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-elements.d.ts +117 -0
- package/dist/frontend/lowering/runtime-optional-elements.js +738 -0
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-guards.d.ts +36 -0
- package/dist/frontend/lowering/runtime-optional-guards.js +375 -0
- package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-guards.test.d.ts +1 -0
- package/dist/frontend/lowering/runtime-optional-guards.test.js +92 -0
- package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-ownership.d.ts +63 -0
- package/dist/frontend/lowering/runtime-optional-ownership.js +382 -0
- package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-provenance.d.ts +2 -1
- package/dist/frontend/lowering/runtime-optional-provenance.js +2 -1
- package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
- package/dist/frontend/lowering/string-index-bounds.d.ts +36 -0
- package/dist/frontend/lowering/string-index-bounds.js +537 -0
- package/dist/frontend/lowering/string-index-bounds.js.map +1 -0
- package/dist/frontend/lowering/string-index-bounds.test.d.ts +1 -0
- package/dist/frontend/lowering/string-index-bounds.test.js +223 -0
- package/dist/frontend/lowering/string-index-bounds.test.js.map +1 -0
- package/dist/frontend/lowering/union-narrow.d.ts +2 -0
- package/dist/frontend/lowering/union-narrow.js +10 -6
- package/dist/frontend/lowering/union-narrow.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +10 -0
- package/dist/frontend/program-analysis.js +7 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +25 -0
- package/dist/frontend/program.js +613 -17
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +64 -1
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/resolve.d.ts +6 -0
- package/dist/frontend/resolve.js +14 -0
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/threads-import.d.ts +5 -0
- package/dist/frontend/threads-import.js +21 -0
- package/dist/frontend/threads-import.js.map +1 -0
- package/dist/frontend/type-mapper.d.ts +3 -0
- package/dist/frontend/type-mapper.js +72 -6
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/worker-target.d.ts +4 -0
- package/dist/frontend/worker-target.js +8 -1
- package/dist/frontend/worker-target.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +47 -9
- package/dist/index.js.map +1 -1
- package/dist/ir/build.d.ts +5 -0
- package/dist/ir/build.js +7 -0
- package/dist/ir/build.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +3 -0
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/int32-slots.d.ts +72 -0
- package/dist/ir/int32-slots.js +837 -0
- package/dist/ir/int32-slots.js.map +1 -0
- package/dist/ir/int32-slots.test.d.ts +1 -0
- package/dist/ir/int32-slots.test.js +222 -0
- package/dist/ir/int32-slots.test.js.map +1 -0
- package/dist/ir/integer-ranges.d.ts +19 -3
- package/dist/ir/integer-ranges.js +168 -23
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +74 -2
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +24 -6
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/validate.js +21 -2
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +39 -0
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/native/cache.d.ts +3 -0
- package/dist/native/cache.js +49 -1
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +21 -1
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +1 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.d.ts +5 -0
- package/dist/native/compiler.js +51 -4
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/prepare.d.ts +4 -0
- package/dist/native/prepare.js +2 -1
- package/dist/native/prepare.js.map +1 -1
- package/dist/startup-cache.d.ts +2 -0
- package/dist/startup-cache.js +2 -0
- package/dist/startup-cache.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +1 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as ts from "../ts7/adapter.js";
|
|
2
|
+
/** Proves that an indexed store `xs[i] = v` writes inside the array, so it
|
|
3
|
+
* cannot leave holes before index `i`. A store at an index below the
|
|
4
|
+
* length overwrites an existing slot.
|
|
5
|
+
*
|
|
6
|
+
* The proof is syntactic: a guard that dominates the store shows `i` is
|
|
7
|
+
* below `xs.length`, either a condition `i < xs.length` (`xs.length > i`)
|
|
8
|
+
* of an enclosing `if` or loop, or an earlier asserted read `xs[i]!`, which
|
|
9
|
+
* throws for a missing index. Between the guard and the store nothing may
|
|
10
|
+
* change the length or either operand: no call, construction, `await`,
|
|
11
|
+
* `yield` or `delete`, and no write of `xs`, `i` or `xs.length`. A loop
|
|
12
|
+
* crossed on the way repeats its whole body between the two. */
|
|
13
|
+
export declare function indexStoreInBounds(store: ts.BinaryExpression): boolean;
|
|
14
|
+
/** Proves that an element read `xs[i]` (typically `xs[i]!` forwarded to a
|
|
15
|
+
* call) names an index below the length, by the same dominating guards as
|
|
16
|
+
* indexStoreInBounds. Everything the enclosing statement evaluates before
|
|
17
|
+
* the read (a callee, earlier arguments, a left operand) joins the code
|
|
18
|
+
* that must leave the operands unchanged. */
|
|
19
|
+
export declare function indexReadInBounds(read: ts.ElementAccessExpression): boolean;
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import * as ts from "../ts7/adapter.js";
|
|
2
|
+
/** Proves that an indexed store `xs[i] = v` writes inside the array, so it
|
|
3
|
+
* cannot leave holes before index `i`. A store at an index below the
|
|
4
|
+
* length overwrites an existing slot.
|
|
5
|
+
*
|
|
6
|
+
* The proof is syntactic: a guard that dominates the store shows `i` is
|
|
7
|
+
* below `xs.length`, either a condition `i < xs.length` (`xs.length > i`)
|
|
8
|
+
* of an enclosing `if` or loop, or an earlier asserted read `xs[i]!`, which
|
|
9
|
+
* throws for a missing index. Between the guard and the store nothing may
|
|
10
|
+
* change the length or either operand: no call, construction, `await`,
|
|
11
|
+
* `yield` or `delete`, and no write of `xs`, `i` or `xs.length`. A loop
|
|
12
|
+
* crossed on the way repeats its whole body between the two. */
|
|
13
|
+
export function indexStoreInBounds(store) {
|
|
14
|
+
if (store.operatorToken.kind !== ts.SyntaxKind.EqualsToken)
|
|
15
|
+
return false;
|
|
16
|
+
const target = peel(store.left);
|
|
17
|
+
if (!ts.isElementAccessExpression(target))
|
|
18
|
+
return false;
|
|
19
|
+
const array = peel(target.expression);
|
|
20
|
+
const index = peel(target.argumentExpression);
|
|
21
|
+
if (!isSimpleReference(array) || !(isSimpleReference(index) || ts.isNumericLiteral(index)))
|
|
22
|
+
return false;
|
|
23
|
+
const parent = store.parent;
|
|
24
|
+
if (!parent || !ts.isExpressionStatement(parent))
|
|
25
|
+
return false;
|
|
26
|
+
return boundedBefore(parent, { array, index }, [store.right]);
|
|
27
|
+
}
|
|
28
|
+
/** Proves that an element read `xs[i]` (typically `xs[i]!` forwarded to a
|
|
29
|
+
* call) names an index below the length, by the same dominating guards as
|
|
30
|
+
* indexStoreInBounds. Everything the enclosing statement evaluates before
|
|
31
|
+
* the read (a callee, earlier arguments, a left operand) joins the code
|
|
32
|
+
* that must leave the operands unchanged. */
|
|
33
|
+
export function indexReadInBounds(read) {
|
|
34
|
+
if (read.questionDotToken)
|
|
35
|
+
return false;
|
|
36
|
+
const array = peel(read.expression);
|
|
37
|
+
const index = peel(read.argumentExpression);
|
|
38
|
+
if (!isSimpleReference(array) || !(isSimpleReference(index) || ts.isNumericLiteral(index)))
|
|
39
|
+
return false;
|
|
40
|
+
const before = [];
|
|
41
|
+
let child = read;
|
|
42
|
+
let parent = read.parent;
|
|
43
|
+
while (parent) {
|
|
44
|
+
if (ts.isParenthesizedExpression(parent) ||
|
|
45
|
+
ts.isNonNullExpression(parent) ||
|
|
46
|
+
ts.isAsExpression(parent) ||
|
|
47
|
+
ts.isSatisfiesExpression(parent)) {
|
|
48
|
+
// A value-preserving wrapper.
|
|
49
|
+
}
|
|
50
|
+
else if (ts.isCallExpression(parent) || ts.isNewExpression(parent)) {
|
|
51
|
+
const args = parent.arguments ?? [];
|
|
52
|
+
const at = args.indexOf(child);
|
|
53
|
+
if (at < 0 || (ts.isCallExpression(parent) && parent.questionDotToken))
|
|
54
|
+
return false;
|
|
55
|
+
before.push(parent.expression, ...args.slice(0, at));
|
|
56
|
+
}
|
|
57
|
+
else if (ts.isBinaryExpression(parent)) {
|
|
58
|
+
const op = parent.operatorToken.kind;
|
|
59
|
+
if (op >= ts.SyntaxKind.FirstAssignment && op <= ts.SyntaxKind.LastAssignment) {
|
|
60
|
+
if (parent.right !== child || !ts.isIdentifier(parent.left))
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
else if (parent.right === child)
|
|
64
|
+
before.push(parent.left);
|
|
65
|
+
}
|
|
66
|
+
else if (ts.isVariableDeclaration(parent) &&
|
|
67
|
+
parent.initializer === child &&
|
|
68
|
+
ts.isVariableDeclarationList(parent.parent) &&
|
|
69
|
+
parent.parent.declarations[0] === parent &&
|
|
70
|
+
ts.isVariableStatement(parent.parent.parent)) {
|
|
71
|
+
return boundedBefore(parent.parent.parent, { array, index }, before);
|
|
72
|
+
}
|
|
73
|
+
else if ((ts.isExpressionStatement(parent) || ts.isReturnStatement(parent)) &&
|
|
74
|
+
parent.expression === child) {
|
|
75
|
+
return boundedBefore(parent, { array, index }, before);
|
|
76
|
+
}
|
|
77
|
+
else
|
|
78
|
+
return false;
|
|
79
|
+
child = parent;
|
|
80
|
+
parent = parent.parent;
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
/** A guard dominating `statement` bounds the index, and nothing between the
|
|
85
|
+
* guard and the access (`between`, plus the statements and conditions
|
|
86
|
+
* crossed) can change the operands. */
|
|
87
|
+
function boundedBefore(statement, operands, start) {
|
|
88
|
+
const between = [...start];
|
|
89
|
+
let child = statement;
|
|
90
|
+
let parent = statement.parent;
|
|
91
|
+
while (parent && !isFunctionBoundary(parent)) {
|
|
92
|
+
if (isStatementList(parent)) {
|
|
93
|
+
const statements = parent.statements;
|
|
94
|
+
const at = statements.indexOf(child);
|
|
95
|
+
for (let i = at - 1; i >= 0; i--) {
|
|
96
|
+
const statement = statements[i];
|
|
97
|
+
if (assertsSlot(statement, operands) && unchanged([statement, ...between], operands))
|
|
98
|
+
return true;
|
|
99
|
+
between.push(statement);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else if (ts.isIfStatement(parent)) {
|
|
103
|
+
if (child === parent.thenStatement &&
|
|
104
|
+
(assertsSlot(parent.expression, operands) || boundedBy(parent.expression, operands)) &&
|
|
105
|
+
unchanged([parent.expression, ...between], operands))
|
|
106
|
+
return true;
|
|
107
|
+
between.push(parent.expression);
|
|
108
|
+
}
|
|
109
|
+
else if (ts.isWhileStatement(parent) ||
|
|
110
|
+
ts.isForStatement(parent) ||
|
|
111
|
+
ts.isDoStatement(parent) ||
|
|
112
|
+
ts.isForOfStatement(parent) ||
|
|
113
|
+
ts.isForInStatement(parent)) {
|
|
114
|
+
const condition = ts.isWhileStatement(parent) || ts.isDoStatement(parent)
|
|
115
|
+
? parent.expression
|
|
116
|
+
: ts.isForStatement(parent)
|
|
117
|
+
? parent.condition
|
|
118
|
+
: undefined;
|
|
119
|
+
// The condition runs right before each pass over the body.
|
|
120
|
+
if (!ts.isDoStatement(parent) &&
|
|
121
|
+
child === parent.statement &&
|
|
122
|
+
condition !== undefined &&
|
|
123
|
+
boundedBy(condition, operands) &&
|
|
124
|
+
unchanged([condition, ...between], operands))
|
|
125
|
+
return true;
|
|
126
|
+
between.push(parent);
|
|
127
|
+
}
|
|
128
|
+
else if (ts.isSwitchStatement(parent)) {
|
|
129
|
+
between.push(parent.expression);
|
|
130
|
+
}
|
|
131
|
+
else if (!ts.isBlock(parent) && !ts.isLabeledStatement(parent) && !ts.isCaseBlock(parent)) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
child = parent;
|
|
135
|
+
parent = parent.parent;
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
function isFunctionBoundary(node) {
|
|
140
|
+
return (ts.isFunctionLike(node) ||
|
|
141
|
+
ts.isSourceFile(node) ||
|
|
142
|
+
ts.isClassStaticBlockDeclaration(node) ||
|
|
143
|
+
ts.isTryStatement(node) ||
|
|
144
|
+
ts.isCatchClause(node));
|
|
145
|
+
}
|
|
146
|
+
function isStatementList(node) {
|
|
147
|
+
return ts.isBlock(node) || ts.isCaseClause(node) || ts.isDefaultClause(node);
|
|
148
|
+
}
|
|
149
|
+
function peel(node) {
|
|
150
|
+
let e = node;
|
|
151
|
+
while (ts.isParenthesizedExpression(e) || ts.isNonNullExpression(e))
|
|
152
|
+
e = e.expression;
|
|
153
|
+
return e;
|
|
154
|
+
}
|
|
155
|
+
/** An identifier, `this`, or a property chain over one. */
|
|
156
|
+
function isSimpleReference(node) {
|
|
157
|
+
const e = peel(node);
|
|
158
|
+
if (ts.isIdentifier(e) || e.kind === ts.SyntaxKind.ThisKeyword)
|
|
159
|
+
return true;
|
|
160
|
+
return ts.isPropertyAccessExpression(e) && !e.questionDotToken && isSimpleReference(e.expression);
|
|
161
|
+
}
|
|
162
|
+
function sameReference(a, b) {
|
|
163
|
+
const left = peel(a);
|
|
164
|
+
const right = peel(b);
|
|
165
|
+
if (ts.isIdentifier(left) && ts.isIdentifier(right))
|
|
166
|
+
return left.text === right.text;
|
|
167
|
+
if (ts.isNumericLiteral(left) && ts.isNumericLiteral(right))
|
|
168
|
+
return Number(left.text) === Number(right.text);
|
|
169
|
+
if (left.kind === ts.SyntaxKind.ThisKeyword && right.kind === ts.SyntaxKind.ThisKeyword)
|
|
170
|
+
return true;
|
|
171
|
+
if (ts.isPropertyAccessExpression(left) && ts.isPropertyAccessExpression(right))
|
|
172
|
+
return left.name.text === right.name.text && sameReference(left.expression, right.expression);
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
function isLengthOf(node, array) {
|
|
176
|
+
const e = peel(node);
|
|
177
|
+
return (ts.isPropertyAccessExpression(e) &&
|
|
178
|
+
e.name.text === "length" &&
|
|
179
|
+
sameReference(e.expression, array));
|
|
180
|
+
}
|
|
181
|
+
/** `condition` holding proves `index < array.length`. */
|
|
182
|
+
function boundedBy(condition, { array, index }) {
|
|
183
|
+
const e = peel(condition);
|
|
184
|
+
if (!ts.isBinaryExpression(e))
|
|
185
|
+
return false;
|
|
186
|
+
const op = e.operatorToken.kind;
|
|
187
|
+
if (op === ts.SyntaxKind.AmpersandAmpersandToken)
|
|
188
|
+
return boundedBy(e.left, { array, index }) || boundedBy(e.right, { array, index });
|
|
189
|
+
if (op === ts.SyntaxKind.LessThanToken)
|
|
190
|
+
return sameReference(e.left, index) && isLengthOf(e.right, array);
|
|
191
|
+
if (op === ts.SyntaxKind.GreaterThanToken)
|
|
192
|
+
return isLengthOf(e.left, array) && sameReference(e.right, index);
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
/** Evaluating `node` reads `array[index]!` on every path that completes. */
|
|
196
|
+
function assertsSlot(node, operands) {
|
|
197
|
+
let found = false;
|
|
198
|
+
const visit = (n) => {
|
|
199
|
+
if (found)
|
|
200
|
+
return;
|
|
201
|
+
if (ts.isNonNullExpression(n) &&
|
|
202
|
+
ts.isElementAccessExpression(peel(n.expression)) &&
|
|
203
|
+
!peel(n.expression).questionDotToken) {
|
|
204
|
+
const read = peel(n.expression);
|
|
205
|
+
if (sameReference(read.expression, operands.array) &&
|
|
206
|
+
sameReference(read.argumentExpression, operands.index)) {
|
|
207
|
+
found = true;
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Skip operands that do not run on every completing path.
|
|
212
|
+
if (ts.isBinaryExpression(n)) {
|
|
213
|
+
const op = n.operatorToken.kind;
|
|
214
|
+
visit(n.left);
|
|
215
|
+
if (op !== ts.SyntaxKind.AmpersandAmpersandToken &&
|
|
216
|
+
op !== ts.SyntaxKind.BarBarToken &&
|
|
217
|
+
op !== ts.SyntaxKind.QuestionQuestionToken &&
|
|
218
|
+
op !== ts.SyntaxKind.AmpersandAmpersandEqualsToken &&
|
|
219
|
+
op !== ts.SyntaxKind.BarBarEqualsToken &&
|
|
220
|
+
op !== ts.SyntaxKind.QuestionQuestionEqualsToken)
|
|
221
|
+
visit(n.right);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (ts.isConditionalExpression(n)) {
|
|
225
|
+
visit(n.condition);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (ts.isFunctionLike(n) ||
|
|
229
|
+
ts.isClassDeclaration(n) ||
|
|
230
|
+
ts.isClassExpression(n) ||
|
|
231
|
+
ts.isIfStatement(n) ||
|
|
232
|
+
ts.isWhileStatement(n) ||
|
|
233
|
+
ts.isDoStatement(n) ||
|
|
234
|
+
ts.isForStatement(n) ||
|
|
235
|
+
ts.isForOfStatement(n) ||
|
|
236
|
+
ts.isForInStatement(n) ||
|
|
237
|
+
ts.isSwitchStatement(n) ||
|
|
238
|
+
ts.isTryStatement(n) ||
|
|
239
|
+
ts.isLabeledStatement(n) ||
|
|
240
|
+
ts.isBlock(n)) {
|
|
241
|
+
if (ts.isIfStatement(n))
|
|
242
|
+
visit(n.expression);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if ((n.flags & ts.NodeFlags.OptionalChain) !== 0)
|
|
246
|
+
return;
|
|
247
|
+
n.forEachChild(visit);
|
|
248
|
+
};
|
|
249
|
+
if (ts.isVariableStatement(node)) {
|
|
250
|
+
for (const declaration of node.declarationList.declarations)
|
|
251
|
+
if (declaration.initializer)
|
|
252
|
+
visit(declaration.initializer);
|
|
253
|
+
}
|
|
254
|
+
else if (ts.isExpressionStatement(node))
|
|
255
|
+
visit(node.expression);
|
|
256
|
+
else if (!ts.isStatement(node))
|
|
257
|
+
visit(node);
|
|
258
|
+
return found;
|
|
259
|
+
}
|
|
260
|
+
/** Running `nodes` cannot change the array's length or either operand. */
|
|
261
|
+
function unchanged(nodes, { array, index }) {
|
|
262
|
+
const roots = [];
|
|
263
|
+
for (const operand of [array, index]) {
|
|
264
|
+
const root = rootName(operand);
|
|
265
|
+
if (root !== null)
|
|
266
|
+
roots.push(root);
|
|
267
|
+
}
|
|
268
|
+
// Another reference can alias a property chain, so any property write
|
|
269
|
+
// named `length` or like a link of either chain may change an operand.
|
|
270
|
+
const links = new Set(["length", ...linkNames(array), ...linkNames(index)]);
|
|
271
|
+
let ok = true;
|
|
272
|
+
const writes = (target) => {
|
|
273
|
+
const e = peel(target);
|
|
274
|
+
if (ts.isIdentifier(e))
|
|
275
|
+
return roots.includes(e.text);
|
|
276
|
+
if (ts.isPropertyAccessExpression(e))
|
|
277
|
+
return links.has(e.name.text);
|
|
278
|
+
if (ts.isElementAccessExpression(e)) {
|
|
279
|
+
// A computed key could name `length` or a chain link.
|
|
280
|
+
const key = peel(e.argumentExpression);
|
|
281
|
+
return !ts.isNumericLiteral(key) && !isSimpleReference(key)
|
|
282
|
+
? true
|
|
283
|
+
: ts.isStringLiteral(key) && links.has(key.text);
|
|
284
|
+
}
|
|
285
|
+
if (ts.isArrayLiteralExpression(e) || ts.isObjectLiteralExpression(e)) {
|
|
286
|
+
let hit = false;
|
|
287
|
+
const walk = (n) => {
|
|
288
|
+
if (ts.isIdentifier(n) && roots.includes(n.text))
|
|
289
|
+
hit = true;
|
|
290
|
+
n.forEachChild(walk);
|
|
291
|
+
};
|
|
292
|
+
walk(e);
|
|
293
|
+
return hit;
|
|
294
|
+
}
|
|
295
|
+
return false;
|
|
296
|
+
};
|
|
297
|
+
const visit = (n) => {
|
|
298
|
+
if (!ok)
|
|
299
|
+
return;
|
|
300
|
+
if (ts.isFunctionLike(n) || ts.isClassDeclaration(n) || ts.isClassExpression(n))
|
|
301
|
+
return;
|
|
302
|
+
if (ts.isCallExpression(n) ||
|
|
303
|
+
ts.isNewExpression(n) ||
|
|
304
|
+
ts.isTaggedTemplateExpression(n) ||
|
|
305
|
+
ts.isAwaitExpression(n) ||
|
|
306
|
+
ts.isYieldExpression(n) ||
|
|
307
|
+
ts.isDeleteExpression(n)) {
|
|
308
|
+
ok = false;
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
if (ts.isBinaryExpression(n)) {
|
|
312
|
+
const op = n.operatorToken.kind;
|
|
313
|
+
if (op >= ts.SyntaxKind.FirstAssignment &&
|
|
314
|
+
op <= ts.SyntaxKind.LastAssignment &&
|
|
315
|
+
writes(n.left)) {
|
|
316
|
+
ok = false;
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if ((ts.isPrefixUnaryExpression(n) || ts.isPostfixUnaryExpression(n)) &&
|
|
321
|
+
(n.operator === ts.SyntaxKind.PlusPlusToken ||
|
|
322
|
+
n.operator === ts.SyntaxKind.MinusMinusToken) &&
|
|
323
|
+
writes(n.operand)) {
|
|
324
|
+
ok = false;
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
if ((ts.isForOfStatement(n) || ts.isForInStatement(n)) &&
|
|
328
|
+
!ts.isVariableDeclarationList(n.initializer) &&
|
|
329
|
+
writes(n.initializer)) {
|
|
330
|
+
ok = false;
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
n.forEachChild(visit);
|
|
334
|
+
};
|
|
335
|
+
for (const node of nodes)
|
|
336
|
+
visit(node);
|
|
337
|
+
return ok;
|
|
338
|
+
}
|
|
339
|
+
function linkNames(node) {
|
|
340
|
+
const names = [];
|
|
341
|
+
let e = peel(node);
|
|
342
|
+
while (ts.isPropertyAccessExpression(e)) {
|
|
343
|
+
names.push(e.name.text);
|
|
344
|
+
e = peel(e.expression);
|
|
345
|
+
}
|
|
346
|
+
return names;
|
|
347
|
+
}
|
|
348
|
+
function rootName(node) {
|
|
349
|
+
let e = peel(node);
|
|
350
|
+
while (ts.isPropertyAccessExpression(e))
|
|
351
|
+
e = peel(e.expression);
|
|
352
|
+
return ts.isIdentifier(e) ? e.text : null;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=runtime-optional-bounds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-optional-bounds.js","sourceRoot":"","sources":["../../../src/frontend/lowering/runtime-optional-bounds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAExC;;;;;;;;;;gEAUgE;AAChE,MAAM,UAAU,kBAAkB,CAAC,KAA0B;IAC3D,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IACzE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC9C,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxF,OAAO,KAAK,CAAC;IACf,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/D,OAAO,aAAa,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;;;6CAI6C;AAC7C,MAAM,UAAU,iBAAiB,CAAC,IAAgC;IAChE,IAAI,IAAI,CAAC,gBAAgB;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5C,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxF,OAAO,KAAK,CAAC;IACf,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAY,IAAI,CAAC;IAC1B,IAAI,MAAM,GAAwB,IAAI,CAAC,MAAM,CAAC;IAC9C,OAAO,MAAM,EAAE,CAAC;QACd,IACE,EAAE,CAAC,yBAAyB,CAAC,MAAM,CAAC;YACpC,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC;YAC9B,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;YACzB,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAChC,CAAC;YACD,8BAA8B;QAChC,CAAC;aAAM,IAAI,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAsB,CAAC,CAAC;YAChD,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC;gBAAE,OAAO,KAAK,CAAC;YACrF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,MAAM,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;YACrC,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;gBAC9E,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;oBAAE,OAAO,KAAK,CAAC;YAC5E,CAAC;iBAAM,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC;aAAM,IACL,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC;YAChC,MAAM,CAAC,WAAW,KAAK,KAAK;YAC5B,EAAE,CAAC,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,MAAM;YACxC,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAC5C,CAAC;YACD,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QACvE,CAAC;aAAM,IACL,CAAC,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAClE,MAAM,CAAC,UAAU,KAAK,KAAK,EAC3B,CAAC;YACD,OAAO,aAAa,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QACzD,CAAC;;YAAM,OAAO,KAAK,CAAC;QACpB,KAAK,GAAG,MAAM,CAAC;QACf,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;uCAEuC;AACvC,SAAS,aAAa,CAAC,SAAuB,EAAE,QAAkB,EAAE,KAAgB;IAClF,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC3B,IAAI,KAAK,GAAY,SAAS,CAAC;IAC/B,IAAI,MAAM,GAAwB,SAAS,CAAC,MAAM,CAAC;IACnD,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7C,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAI,MAAqD,CAAC,UAAU,CAAC;YACrF,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,KAAqB,CAAC,CAAC;YACrD,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;gBACjC,IAAI,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,EAAE,QAAQ,CAAC;oBAClF,OAAO,IAAI,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,IACE,KAAK,KAAK,MAAM,CAAC,aAAa;gBAC9B,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACpF,SAAS,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,EAAE,QAAQ,CAAC;gBAEpD,OAAO,IAAI,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;aAAM,IACL,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC3B,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;YACzB,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;YACxB,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC3B,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAC3B,CAAC;YACD,MAAM,SAAS,GACb,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;gBACrD,CAAC,CAAC,MAAM,CAAC,UAAU;gBACnB,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;oBACzB,CAAC,CAAC,MAAM,CAAC,SAAS;oBAClB,CAAC,CAAC,SAAS,CAAC;YAClB,2DAA2D;YAC3D,IACE,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;gBACzB,KAAK,KAAK,MAAM,CAAC,SAAS;gBAC1B,SAAS,KAAK,SAAS;gBACvB,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC;gBAC9B,SAAS,CAAC,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,EAAE,QAAQ,CAAC;gBAE5C,OAAO,IAAI,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5F,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,GAAG,MAAM,CAAC;QACf,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,SAAS,kBAAkB,CAAC,IAAa;IACvC,OAAO,CACL,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC;QACvB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;QACrB,EAAE,CAAC,6BAA6B,CAAC,IAAI,CAAC;QACtC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC;QACvB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CACvB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,IAAI,CAAC,IAAmB;IAC/B,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,OAAO,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;IACtF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,2DAA2D;AAC3D,SAAS,iBAAiB,CAAC,IAAmB;IAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC5E,OAAO,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,IAAI,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,aAAa,CAAC,CAAgB,EAAE,CAAgB;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;IACrF,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC;QACzD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;QACrF,OAAO,IAAI,CAAC;IACd,IAAI,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,0BAA0B,CAAC,KAAK,CAAC;QAC7E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAChG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,IAAmB,EAAE,KAAoB;IAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,OAAO,CACL,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;QACxB,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,yDAAyD;AACzD,SAAS,SAAS,CAAC,SAAwB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAY;IACrE,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;IAChC,IAAI,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;QAC9C,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACrF,IAAI,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa;QACpC,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpE,IAAI,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,gBAAgB;QACvC,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4EAA4E;AAC5E,SAAS,WAAW,CAAC,IAAa,EAAE,QAAkB;IACpD,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,MAAM,KAAK,GAAG,CAAC,CAAU,EAAQ,EAAE;QACjC,IAAI,KAAK;YAAE,OAAO;QAClB,IACE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACzB,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAChD,CAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAgC,CAAC,gBAAgB,EACpE,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAA+B,CAAC;YAC9D,IACE,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC;gBAC9C,aAAa,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,EACtD,CAAC;gBACD,KAAK,GAAG,IAAI,CAAC;gBACb,OAAO;YACT,CAAC;QACH,CAAC;QACD,0DAA0D;QAC1D,IAAI,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;YAChC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACd,IACE,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;gBAC5C,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;gBAChC,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,qBAAqB;gBAC1C,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,6BAA6B;gBAClD,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,iBAAiB;gBACtC,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,2BAA2B;gBAEhD,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QACD,IACE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;YACpB,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACxB,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvB,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;YACnB,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACtB,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;YACnB,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;YACpB,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACtB,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACtB,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvB,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;YACpB,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACxB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EACb,CAAC;YACD,IAAI,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO;QACzD,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC;IACF,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY;YACzD,IAAI,WAAW,CAAC,WAAW;gBAAE,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAC7D,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0EAA0E;AAC1E,SAAS,SAAS,CAAC,KAAyB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAY;IACtE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,sEAAsE;IACtE,uEAAuE;IACvE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,EAAE,GAAG,IAAI,CAAC;IACd,MAAM,MAAM,GAAG,CAAC,MAAqB,EAAW,EAAE;QAChD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,sDAAsD;YACtD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACvC,OAAO,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;gBACzD,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,IAAI,GAAG,GAAG,KAAK,CAAC;YAChB,MAAM,IAAI,GAAG,CAAC,CAAU,EAAQ,EAAE;gBAChC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;oBAAE,GAAG,GAAG,IAAI,CAAC;gBAC7D,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC,CAAC;YACF,IAAI,CAAC,CAAC,CAAC,CAAC;YACR,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,CAAU,EAAQ,EAAE;QACjC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,IAAI,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAAE,OAAO;QACxF,IACE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACtB,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;YACrB,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAChC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvB,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvB,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,EACxB,CAAC;YACD,EAAE,GAAG,KAAK,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;YAChC,IACE,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe;gBACnC,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc;gBAClC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EACd,CAAC;gBACD,EAAE,GAAG,KAAK,CAAC;gBACX,OAAO;YACT,CAAC;QACH,CAAC;QACD,IACE,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa;gBACzC,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC;YAC/C,MAAM,CAAC,CAAC,CAAC,OAAwB,CAAC,EAClC,CAAC;YACD,EAAE,GAAG,KAAK,CAAC;YACX,OAAO;QACT,CAAC;QACD,IACE,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,WAAW,CAAC;YAC5C,MAAM,CAAC,CAAC,CAAC,WAA4B,CAAC,EACtC,CAAC;YACD,EAAE,GAAG,KAAK,CAAC;YACX,OAAO;QACT,CAAC;QACD,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,SAAS,CAAC,IAAmB;IACpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,IAAmB;IACnC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAChE,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { afterAll, expect, test } from "vitest";
|
|
2
|
+
import * as ts from "../ts7/adapter.js";
|
|
3
|
+
import { closeSourceParser, parseSourceFile } from "../ts7/source-parser-node.js";
|
|
4
|
+
import { indexReadInBounds, indexStoreInBounds } from "./runtime-optional-bounds.js";
|
|
5
|
+
afterAll(closeSourceParser);
|
|
6
|
+
/** Whether each indexed store in `body` is proven to stay inside its array. */
|
|
7
|
+
function stores(body) {
|
|
8
|
+
const file = parseSourceFile("bounds.ts", body, "ts");
|
|
9
|
+
const results = [];
|
|
10
|
+
ts.walkPreorder(file, (node) => {
|
|
11
|
+
if (ts.isBinaryExpression(node) &&
|
|
12
|
+
node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
|
13
|
+
ts.isElementAccessExpression(node.left))
|
|
14
|
+
results.push(indexStoreInBounds(node));
|
|
15
|
+
return undefined;
|
|
16
|
+
});
|
|
17
|
+
return results;
|
|
18
|
+
}
|
|
19
|
+
test("a dominating length comparison or asserted read bounds the store", () => {
|
|
20
|
+
expect(stores(`function f(xs: number[], i: number) {
|
|
21
|
+
for (let j = 0; j < xs.length; j++) xs[j] = 0;
|
|
22
|
+
if (i < xs.length) xs[i] = 1;
|
|
23
|
+
if (xs.length > i) { xs[i] = 2; }
|
|
24
|
+
const old = xs[i]!;
|
|
25
|
+
xs[i] = old + 1;
|
|
26
|
+
xs[i] = 3;
|
|
27
|
+
}`)).toEqual([true, true, true, true, true]);
|
|
28
|
+
});
|
|
29
|
+
test("a swap is bounded by the reads that precede each store", () => {
|
|
30
|
+
expect(stores(`function swap(xs: number[], a: number, b: number) {
|
|
31
|
+
const t = xs[a]!;
|
|
32
|
+
xs[a] = xs[b]!;
|
|
33
|
+
xs[b] = t;
|
|
34
|
+
}`)).toEqual([true, true]);
|
|
35
|
+
});
|
|
36
|
+
test("code that can change the length or an operand voids the proof", () => {
|
|
37
|
+
expect(stores(`declare function shrink(): void;
|
|
38
|
+
function f(xs: number[], i: number) {
|
|
39
|
+
if (i < xs.length) { shrink(); xs[i] = 1; }
|
|
40
|
+
if (i < xs.length) { xs.length = 0; xs[i] = 2; }
|
|
41
|
+
if (i < xs.length) { i++; xs[i] = 3; }
|
|
42
|
+
if (i < xs.length) { xs = []; xs[i] = 4; }
|
|
43
|
+
if (i < xs.length) xs[i + 1] = 5;
|
|
44
|
+
if (i <= xs.length) xs[i] = 6;
|
|
45
|
+
while (i < xs.length) { xs[i] = 7; xs.pop(); }
|
|
46
|
+
}`)).toEqual([false, false, false, false, false, false, true]);
|
|
47
|
+
});
|
|
48
|
+
test("a guarded read forwarded to a call is bounded when nothing earlier can change it", () => {
|
|
49
|
+
const file = parseSourceFile("reads.ts", `declare function use(...values: number[]): void;
|
|
50
|
+
declare function shrink(): number;
|
|
51
|
+
function f(xs: number[], i: number) {
|
|
52
|
+
for (let j = 0; j < xs.length; j++) use(xs[j]!);
|
|
53
|
+
if (i < xs.length) use(i, xs[i]!);
|
|
54
|
+
if (i < xs.length) use(shrink(), xs[i]!);
|
|
55
|
+
use(xs[i]!);
|
|
56
|
+
if (i < xs.length) { const v = xs[i]!; use(v); }
|
|
57
|
+
}`, "ts");
|
|
58
|
+
const results = [];
|
|
59
|
+
ts.walkPreorder(file, (node) => {
|
|
60
|
+
if (ts.isElementAccessExpression(node))
|
|
61
|
+
results.push(indexReadInBounds(node));
|
|
62
|
+
return undefined;
|
|
63
|
+
});
|
|
64
|
+
expect(results).toEqual([true, true, false, false, true]);
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=runtime-optional-bounds.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-optional-bounds.test.js","sourceRoot":"","sources":["../../../src/frontend/lowering/runtime-optional-bounds.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAErF,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AAE5B,+EAA+E;AAC/E,SAAS,MAAM,CAAC,IAAY;IAC1B,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtD,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QAC7B,IACE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;YACrD,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;YAEvC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;IAC5E,MAAM,CACJ,MAAM,CAAC;;;;;;;MAOL,CAAC,CACJ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;IAClE,MAAM,CACJ,MAAM,CAAC;;;;MAIL,CAAC,CACJ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;IACzE,MAAM,CACJ,MAAM,CAAC;;;;;;;;;MASL,CAAC,CACJ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kFAAkF,EAAE,GAAG,EAAE;IAC5F,MAAM,IAAI,GAAG,eAAe,CAC1B,UAAU,EACV;;;;;;;;MAQE,EACF,IAAI,CACL,CAAC;IACF,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QAC7B,IAAI,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import * as ts from "../ts7/adapter.js";
|
|
2
|
+
/** Program queries the element-state scan needs from the optional-read
|
|
3
|
+
* analysis. Element keys name a native array's element ABI (`typeKey` of
|
|
4
|
+
* the element type); arrays only alias other arrays with the same key,
|
|
5
|
+
* because a conversion to another element type copies the elements and
|
|
6
|
+
* rejects holes and undefined while it does. */
|
|
7
|
+
export interface ElementStateHost {
|
|
8
|
+
/** Element keys of every native array `node` can evaluate to: `[]` when
|
|
9
|
+
* it is not a native array (or is a dynamic value, whose own storage is
|
|
10
|
+
* separate), `null` when its element ABI is not known yet (a generic
|
|
11
|
+
* element type). */
|
|
12
|
+
arrayKeys(node: ts.Expression): readonly string[] | null;
|
|
13
|
+
/** The element type behind this key admits `undefined` itself. */
|
|
14
|
+
elementAdmitsUndefined(key: string): boolean;
|
|
15
|
+
/** The value stored by `node` can be `undefined` at runtime. */
|
|
16
|
+
mayBeUndefined(node: ts.Expression): boolean;
|
|
17
|
+
/** A callback argument can return `undefined` at runtime. */
|
|
18
|
+
callbackReturnsUndefined(node: ts.Expression): boolean;
|
|
19
|
+
/** The value may be a plain array-like object, whose missing indices
|
|
20
|
+
* read as undefined. */
|
|
21
|
+
isArrayLikeObject(node: ts.Expression): boolean;
|
|
22
|
+
/** The expression's static type is a string. */
|
|
23
|
+
isString(node: ts.Expression): boolean;
|
|
24
|
+
/** `node` names the standard global `name` (`Array`, `Object`, ...). */
|
|
25
|
+
isGlobal(node: ts.Expression, name: string): boolean;
|
|
26
|
+
/** Element keys of the rest parameter that the spread arguments of
|
|
27
|
+
* `call` fill: `[]` when the callee has none, null when it is unknown. */
|
|
28
|
+
restKeys(call: ts.CallExpression | ts.NewExpression): readonly string[] | null;
|
|
29
|
+
/** Record that iterating `node`'s binding can observe `undefined`;
|
|
30
|
+
* `known` when the iterated array's own facts (not only those shared by
|
|
31
|
+
* its element ABI) say so. Returns true when the binding's record grew. */
|
|
32
|
+
markIterationBinding(node: ts.Identifier, known: boolean): boolean;
|
|
33
|
+
/** The storage slot that alone owns the array `node` references, whose
|
|
34
|
+
* facts are tracked for that slot instead of its element ABI. */
|
|
35
|
+
ownerOf(node: ts.Expression): ts.Symbol | null;
|
|
36
|
+
/** The owning slot a newly built array is stored into. */
|
|
37
|
+
allocationOwner(node: ts.Expression): ts.Symbol | null;
|
|
38
|
+
/** Debug provenance for a new fact. */
|
|
39
|
+
note: ((fact: "undefined" | "holes", key: string, site: ts.Node | undefined) => void) | null;
|
|
40
|
+
}
|
|
41
|
+
/** Whole-program facts about which native array element ABIs can hold an
|
|
42
|
+
* explicit `undefined` value or a hole, refined per expression for arrays
|
|
43
|
+
* an expression creates itself. An element parameter of an array callback
|
|
44
|
+
* is present whenever its receiver can hold neither: the callback methods
|
|
45
|
+
* skip holes (except the find family), and every explicit `undefined`
|
|
46
|
+
* enters a native array through a store, a copy, or a builtin scanned
|
|
47
|
+
* here. Facts only grow, so the enclosing fixed point stays monotone. */
|
|
48
|
+
export declare class ArrayElementStates {
|
|
49
|
+
private readonly host;
|
|
50
|
+
private readonly undefinedKeys;
|
|
51
|
+
private readonly holeyKeys;
|
|
52
|
+
/** A store wrote a possibly undefined value or a hole into an array
|
|
53
|
+
* whose element ABI is decided per generic instantiation. */
|
|
54
|
+
private anyUndefined;
|
|
55
|
+
private anyHoley;
|
|
56
|
+
/** Facts of arrays owned by one storage slot. */
|
|
57
|
+
private readonly undefinedOwners;
|
|
58
|
+
private readonly holeyOwners;
|
|
59
|
+
/** The node being scanned, for provenance notes. */
|
|
60
|
+
private site;
|
|
61
|
+
/** While set, arrays judged only by their element ABI count as present. */
|
|
62
|
+
private ownFactsOnly;
|
|
63
|
+
constructor(host: ElementStateHost);
|
|
64
|
+
/** Every element a callback of `method` receives from `receiver` is a
|
|
65
|
+
* present value. */
|
|
66
|
+
elementsPresent(receiver: ts.Expression, method: string): boolean;
|
|
67
|
+
/** Scans one syntax node; true when a fact was added. */
|
|
68
|
+
scan(node: ts.Node): boolean;
|
|
69
|
+
/** `[a, ...rest] = source` copies the remaining indices into a new
|
|
70
|
+
* array: holes become undefined. */
|
|
71
|
+
private scanRestPattern;
|
|
72
|
+
/** `[a, ...rest] = source` as an assignment. */
|
|
73
|
+
private scanRestAssignment;
|
|
74
|
+
/** Contents of the array `node` evaluates to; null when its element ABI
|
|
75
|
+
* is generic. Arrays the expression creates are judged by how they are
|
|
76
|
+
* built; any other array by the facts of its element ABI. */
|
|
77
|
+
private contents;
|
|
78
|
+
/** Contents of an array a call creates; undefined when the call is not a
|
|
79
|
+
* known array constructor or method. */
|
|
80
|
+
private builtContents;
|
|
81
|
+
/** The facts recorded for arrays with these element ABIs. */
|
|
82
|
+
private stored;
|
|
83
|
+
/** Reading every index of `node` (a spread, an iteration, `Array.from`)
|
|
84
|
+
* can produce `undefined`. Only native arrays can: other iterables reject
|
|
85
|
+
* an undefined value when it is stored. */
|
|
86
|
+
private mayYieldUndefined;
|
|
87
|
+
/** One stored value, or the elements a spread copies. */
|
|
88
|
+
private valueMayBeUndefined;
|
|
89
|
+
/** Records an array the expression creates, for the slot that owns it
|
|
90
|
+
* or else under its element ABI. */
|
|
91
|
+
private record;
|
|
92
|
+
/** Element ABIs of a built array, including those an enclosing type
|
|
93
|
+
* assertion gives it (`[a, , b] as T[]`). */
|
|
94
|
+
private keysAsUsed;
|
|
95
|
+
/** A store through `receiver` can add an undefined value. */
|
|
96
|
+
private addUndefinedTo;
|
|
97
|
+
/** A store through `receiver` can leave holes. */
|
|
98
|
+
private addHolesTo;
|
|
99
|
+
private addUndefined;
|
|
100
|
+
private addHoles;
|
|
101
|
+
private scanAssignment;
|
|
102
|
+
private scanCall;
|
|
103
|
+
/** Writes that bypass the array methods: `Object.assign(xs, ...)`,
|
|
104
|
+
* `Reflect.set(xs, ...)`, `Array.prototype.push.call(xs, ...)` and the
|
|
105
|
+
* like may store any value at any index of an array argument. */
|
|
106
|
+
private scanReflectiveWrite;
|
|
107
|
+
/** A for-of loop over `node`'s iterable can bind `undefined`: a hole
|
|
108
|
+
* or a stored undefined in the array it walks. When it cannot, every
|
|
109
|
+
* element the loop reads is a present value. */
|
|
110
|
+
loopMayYieldUndefined(node: ts.ForOfStatement): boolean;
|
|
111
|
+
/** The loop's array itself, as built or as owned by one slot, can hold
|
|
112
|
+
* a hole or undefined. Facts shared by every array with the same element
|
|
113
|
+
* ABI are coarser: a loop judged only by them keeps checked reads. */
|
|
114
|
+
private loopHolesKnown;
|
|
115
|
+
private loopSource;
|
|
116
|
+
private scanForOf;
|
|
117
|
+
}
|