@scriptc/compiler 0.3.1 → 0.3.3
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 +832 -55
- package/dist/backend/cycle-analysis.js +6 -1
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/executable-features.js +1 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/literals.d.ts +7 -0
- package/dist/backend/literals.js +32 -0
- package/dist/backend/literals.js.map +1 -1
- package/dist/backend/literals.test.js +17 -1
- package/dist/backend/literals.test.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +15 -4
- package/dist/backend/llvm/alloc.js +63 -25
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/alloc.test.js +62 -2
- package/dist/backend/llvm/alloc.test.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.d.ts +2 -0
- package/dist/backend/llvm/appended-array-literals.js +109 -0
- package/dist/backend/llvm/appended-array-literals.js.map +1 -0
- package/dist/backend/llvm/appended-array-literals.test.d.ts +1 -0
- package/dist/backend/llvm/appended-array-literals.test.js +90 -0
- package/dist/backend/llvm/appended-array-literals.test.js.map +1 -0
- package/dist/backend/llvm/array-search.d.ts +8 -0
- package/dist/backend/llvm/array-search.js +52 -0
- package/dist/backend/llvm/array-search.js.map +1 -0
- package/dist/backend/llvm/array-search.test.d.ts +1 -0
- package/dist/backend/llvm/array-search.test.js +72 -0
- package/dist/backend/llvm/array-search.test.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.d.ts +11 -1
- package/dist/backend/llvm/call-lifetimes.js +74 -4
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +54 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/classes.js +97 -38
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +2 -2
- package/dist/backend/llvm/common.d.ts +1 -1
- package/dist/backend/llvm/common.js +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +5 -0
- package/dist/backend/llvm/dense-array-access.js +18 -13
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +15 -2
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +6 -0
- package/dist/backend/llvm/dyn.js +84 -11
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +108 -16
- package/dist/backend/llvm/emitter.js +598 -108
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +26 -3
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +174 -7
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +11 -0
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +8 -0
- package/dist/backend/llvm/expr-callbacks.js +96 -2
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +12 -1
- package/dist/backend/llvm/expr-calls.js +133 -54
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +7 -0
- package/dist/backend/llvm/expr-containers.js +80 -22
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +2 -0
- package/dist/backend/llvm/expr-control.d.ts +8 -0
- package/dist/backend/llvm/expr-control.js +103 -69
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +21 -10
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +7 -0
- package/dist/backend/llvm/expr-primitives.js +53 -51
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +19 -5
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
- package/dist/backend/llvm/expr-stream-bridges.js +111 -39
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +49 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +13 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +80 -5
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/inline-unions.d.ts +48 -0
- package/dist/backend/llvm/inline-unions.js +134 -0
- package/dist/backend/llvm/inline-unions.js.map +1 -0
- package/dist/backend/llvm/inline-unions.test.d.ts +1 -0
- package/dist/backend/llvm/inline-unions.test.js +124 -0
- package/dist/backend/llvm/inline-unions.test.js.map +1 -0
- package/dist/backend/llvm/int32-abi.d.ts +18 -2
- package/dist/backend/llvm/int32-abi.js +23 -2
- package/dist/backend/llvm/int32-abi.js.map +1 -1
- package/dist/backend/llvm/int32-abi.test.js +75 -1
- package/dist/backend/llvm/int32-abi.test.js.map +1 -1
- package/dist/backend/llvm/integer-remainder.d.ts +28 -5
- package/dist/backend/llvm/integer-remainder.js +80 -9
- package/dist/backend/llvm/integer-remainder.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +170 -28
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +181 -5
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +9 -6
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +2 -2
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +208 -9
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +97 -0
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +12 -6
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +6 -3
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.d.ts +26 -2
- package/dist/backend/llvm/local-union-storage.js +132 -12
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +107 -1
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/loop-array-borrows.d.ts +8 -2
- package/dist/backend/llvm/loop-array-borrows.js +93 -13
- package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +20 -0
- package/dist/backend/llvm/map-number-lookup.js +66 -0
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.d.ts +1 -0
- package/dist/backend/llvm/map-number-lookup.test.js +102 -0
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -0
- package/dist/backend/llvm/map-read-lifetimes.js +1 -0
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +4 -0
- package/dist/backend/llvm/publish.js +3 -1
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +29 -0
- package/dist/backend/llvm/record-results.js +260 -0
- package/dist/backend/llvm/record-results.js.map +1 -0
- package/dist/backend/llvm/reference-effects.js +15 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.js +29 -9
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/regions.d.ts +68 -0
- package/dist/backend/llvm/regions.js +314 -0
- package/dist/backend/llvm/regions.js.map +1 -0
- package/dist/backend/llvm/regions.test.d.ts +1 -0
- package/dist/backend/llvm/regions.test.js +173 -0
- package/dist/backend/llvm/regions.test.js.map +1 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +86 -13
- package/dist/backend/llvm/shapes.js +208 -54
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +68 -9
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/split-loops.js +1 -1
- package/dist/backend/llvm/split-loops.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +29 -0
- package/dist/backend/llvm/stack-objects.js +142 -0
- package/dist/backend/llvm/stack-objects.js.map +1 -0
- package/dist/backend/llvm/stack-objects.test.d.ts +1 -0
- package/dist/backend/llvm/stack-objects.test.js +255 -0
- package/dist/backend/llvm/stack-objects.test.js.map +1 -0
- package/dist/backend/llvm/string-reads.d.ts +4 -1
- package/dist/backend/llvm/string-reads.js +89 -9
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.js +5 -4
- package/dist/backend/llvm/switch-dispatch.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +13 -0
- package/dist/backend/llvm/walkers.js +108 -10
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.js +10 -4
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +7 -2
- package/dist/backend/native/executable.js +28 -2
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +1 -1
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +3 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +1 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +1 -1
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +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 +1 -1
- package/dist/backend/runtime-pack.test.js +1 -1
- package/dist/backend/target-diagnostics.js +17 -0
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +16 -0
- package/dist/backend/target-diagnostics.test.js.map +1 -1
- package/dist/compat/fetch-profile.js +4 -4
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/contracts/check.js +2 -0
- package/dist/contracts/check.js.map +1 -1
- package/dist/coverage/report.js +1 -1
- package/dist/coverage/report.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +6 -5
- package/dist/diagnostics/diagnostic.js +7 -6
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +1 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/frontend/builtin-modules.d.ts +1 -1
- package/dist/frontend/builtin-modules.js +1 -0
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/comptime-node.js +2 -2
- package/dist/frontend/comptime-node.js.map +1 -1
- package/dist/frontend/experimental-import.d.ts +12 -0
- package/dist/frontend/experimental-import.js +63 -0
- package/dist/frontend/experimental-import.js.map +1 -0
- package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
- package/dist/frontend/lowering/binding-analysis.js +1 -1
- package/dist/frontend/lowering/builtin-calls.d.ts +6 -1
- package/dist/frontend/lowering/builtin-calls.js +36 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
- package/dist/frontend/lowering/builtins/arguments.js +8 -4
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/blob.d.ts +20 -0
- package/dist/frontend/lowering/builtins/blob.js +167 -0
- package/dist/frontend/lowering/builtins/blob.js.map +1 -0
- package/dist/frontend/lowering/builtins/child-process-async.d.ts +2 -2
- package/dist/frontend/lowering/builtins/child-process-async.js +2 -2
- package/dist/frontend/lowering/builtins/child-process-methods.js +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
- package/dist/frontend/lowering/builtins/compression.js +3 -2
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/console.d.ts +16 -6
- package/dist/frontend/lowering/builtins/console.js +33 -9
- package/dist/frontend/lowering/builtins/console.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.js +415 -120
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.js +20 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +10 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +89 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.d.ts +16 -7
- package/dist/frontend/lowering/builtins/filesystem.js +97 -15
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-glob.d.ts +23 -0
- package/dist/frontend/lowering/builtins/fs-glob.js +224 -0
- package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -0
- package/dist/frontend/lowering/builtins/json.d.ts +2 -2
- package/dist/frontend/lowering/builtins/json.js +13 -4
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/key-object.d.ts +13 -0
- package/dist/frontend/lowering/builtins/key-object.js +56 -0
- package/dist/frontend/lowering/builtins/key-object.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-calls.js +60 -12
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.d.ts +1 -0
- package/dist/frontend/lowering/builtins/numbers.js +17 -0
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.d.ts +18 -0
- package/dist/frontend/lowering/builtins/operating-system.js +361 -1
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/performance.d.ts +25 -3
- package/dist/frontend/lowering/builtins/performance.js +340 -5
- package/dist/frontend/lowering/builtins/performance.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +2 -2
- package/dist/frontend/lowering/builtins/process.js +122 -17
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.js +109 -2
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/properties.d.ts +0 -7
- package/dist/frontend/lowering/builtins/properties.js +39 -11
- package/dist/frontend/lowering/builtins/properties.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +23 -8
- package/dist/frontend/lowering/builtins/readline.js +266 -90
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.d.ts +3 -4
- package/dist/frontend/lowering/builtins/text-codecs.js +3 -4
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.d.ts +8 -0
- package/dist/frontend/lowering/builtins/url.js +36 -0
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.js +1 -1
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +20 -2
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/checked-promise-all.d.ts +10 -3
- package/dist/frontend/lowering/checked-promise-all.js +52 -6
- package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +8 -3
- package/dist/frontend/lowering/class-dynamic-dispatch.js +159 -32
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-protocol-dispatch.d.ts +45 -0
- package/dist/frontend/lowering/class-protocol-dispatch.js +516 -0
- package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -0
- package/dist/frontend/lowering/coercions/structural-plans.js +2 -1
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +3 -3
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/collation-repertoire.js +6 -5
- package/dist/frontend/lowering/collation-repertoire.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +33 -6
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +8 -4
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.d.ts +0 -7
- package/dist/frontend/lowering/containers/array-methods.js +43 -2
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +38 -26
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/for-of.d.ts +1 -1
- package/dist/frontend/lowering/containers/for-of.js +5 -1
- package/dist/frontend/lowering/containers/for-of.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +91 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
- package/dist/frontend/lowering/crypto-tables.js +77 -12
- package/dist/frontend/lowering/crypto-tables.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +18 -2
- package/dist/frontend/lowering/cycle-initialization.js +166 -12
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +7 -2
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +10 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +21 -68
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
- package/dist/frontend/lowering/generator-delegation.js +231 -10
- package/dist/frontend/lowering/generator-delegation.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +2 -2
- package/dist/frontend/lowering/generic-functions.js +2 -2
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/http2-constants.js +1 -1
- package/dist/frontend/lowering/lifetime-regions.d.ts +11 -0
- package/dist/frontend/lowering/lifetime-regions.js +216 -0
- package/dist/frontend/lowering/lifetime-regions.js.map +1 -0
- package/dist/frontend/lowering/lower-array-sort.d.ts +40 -3
- package/dist/frontend/lowering/lower-array-sort.js +661 -194
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.js +103 -4
- package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +2 -2
- package/dist/frontend/lowering/lower-async-iteration.d.ts +6 -3
- package/dist/frontend/lowering/lower-async-iteration.js +248 -2
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +173 -111
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +12 -5
- package/dist/frontend/lowering/lower-classes.js +156 -11
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
- package/dist/frontend/lowering/lower-comptime.js +4 -4
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-console.d.ts +13 -0
- package/dist/frontend/lowering/lower-console.js +460 -4
- package/dist/frontend/lowering/lower-console.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -0
- package/dist/frontend/lowering/lower-event-emitter.js +124 -38
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-event-target.d.ts +63 -0
- package/dist/frontend/lowering/lower-event-target.js +362 -0
- package/dist/frontend/lowering/lower-event-target.js.map +1 -0
- package/dist/frontend/lowering/lower-expando.js +2 -2
- package/dist/frontend/lowering/lower-exprs.js +247 -42
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +15 -7
- package/dist/frontend/lowering/lower-generators.js +183 -99
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +8 -1
- package/dist/frontend/lowering/lower-inspect.js +247 -28
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +1 -1
- package/dist/frontend/lowering/lower-modules.js +27 -17
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +2 -2
- package/dist/frontend/lowering/lower-namespaces.js +2 -2
- package/dist/frontend/lowering/lower-server.js +39 -14
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +11 -1
- package/dist/frontend/lowering/lower-stdlib.js +45 -4
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +2 -2
- package/dist/frontend/lowering/lower-stmts.js +112 -23
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +234 -22
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +45 -6
- package/dist/frontend/lowering/lowerer.js +360 -48
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +2 -2
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/regex-span-reads.d.ts +12 -0
- package/dist/frontend/lowering/regex-span-reads.js +164 -0
- package/dist/frontend/lowering/regex-span-reads.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-records.d.ts +115 -0
- package/dist/frontend/lowering/runtime-optional-records.js +715 -0
- package/dist/frontend/lowering/runtime-optional-records.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-records.test.d.ts +1 -0
- package/dist/frontend/lowering/runtime-optional-records.test.js +175 -0
- package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +7 -3
- package/dist/frontend/lowering/surfaces.js +385 -32
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/var-hoisting.d.ts +3 -0
- package/dist/frontend/lowering/var-hoisting.js +261 -0
- package/dist/frontend/lowering/var-hoisting.js.map +1 -0
- package/dist/frontend/module-syntax.d.ts +1 -1
- package/dist/frontend/module-syntax.js +1 -1
- package/dist/frontend/npm-static-prune.js +1 -1
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +4 -3
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/pipeline.js +6 -4
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program.d.ts +6 -5
- package/dist/frontend/program.js +42 -22
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +13 -0
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/resolve.js +1 -1
- package/dist/frontend/ts7/adapter.js +1 -1
- package/dist/frontend/ts7/ast-bytes.d.ts +1 -1
- package/dist/frontend/ts7/ast-bytes.js +1 -1
- package/dist/frontend/ts7/semantic-json.d.ts +1 -1
- package/dist/frontend/ts7/semantic-json.js +1 -1
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/world-check.js +1 -1
- package/dist/frontend/tsc-codes.js +2 -2
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +28 -1
- package/dist/frontend/type-mapper.js +288 -30
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +12 -6
- package/dist/ir/analysis.js +26 -10
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/analysis.test.js +15 -3
- package/dist/ir/analysis.test.js.map +1 -1
- package/dist/ir/builtin-effects.js +108 -2
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +436 -53
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/function-references.test.js +1 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/int32-slots.js +2 -0
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/intrinsic-signatures.js +2 -0
- package/dist/ir/intrinsic-signatures.js.map +1 -1
- package/dist/ir/ir.d.ts +129 -36
- package/dist/ir/ir.js +42 -1
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +1 -0
- package/dist/ir/runtime-features.js +116 -5
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/scalar-records.js +1 -2
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/serialize.js +1 -1
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/traverse.js +1 -0
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +250 -34
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +125 -0
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/fence-eval.d.ts +1 -1
- package/dist/library/fence-eval.js +5 -4
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/ir-policy.js +11 -4
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-profile.js +13 -13
- package/dist/library/library-profile.js.map +1 -1
- package/dist/library/prepare.js +1 -1
- package/dist/library/prepare.js.map +1 -1
- package/dist/library/sidecar.js +3 -3
- package/dist/library/sidecar.js.map +1 -1
- package/dist/native/prepare.js +3 -2
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.test.js +1 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +537 -142
|
@@ -1,8 +1,15 @@
|
|
|
1
|
+
import { lowerProtocolPropertyRead } from "./class-protocol-dispatch.js";
|
|
1
2
|
import { generatorDrain } from "./iterator-adapters.js";
|
|
3
|
+
import { lowerEventObjectProperty, lowerEventObjectPropertyWrite } from "./lower-event-target.js";
|
|
4
|
+
import { lowerEventStaticProperty } from "./builtins/numbers.js";
|
|
2
5
|
import { lowerUnionEquality, tagEqualityMayMissAlias } from "./strict-equality.js";
|
|
3
6
|
import { isOptionalProcessStreamProperty } from "./builtins/process.js";
|
|
4
7
|
import { lowerWorkerMetadata } from "./builtins/workers.js";
|
|
8
|
+
import { lowerBlobInstanceof } from "./builtins/blob.js";
|
|
9
|
+
import { lowerKeyObjectInstanceof } from "./builtins/key-object.js";
|
|
10
|
+
import { STATS_TYPE_TESTS } from "./builtins/filesystem.js";
|
|
5
11
|
import { threadsImportOf } from "../threads-import.js";
|
|
12
|
+
import { experimentalImportOf, lifetimeRegionMemberOf } from "../experimental-import.js";
|
|
6
13
|
import { dynUndefinedExpr, nodeThrowExpr, numLit, strLit, varRef } from "../../ir/build.js";
|
|
7
14
|
import { InternalCompilerError } from "../../errors.js";
|
|
8
15
|
import { SYMBOL_T } from "../../ir/ir.js";
|
|
@@ -22,7 +29,7 @@ import { checkedClassAssertion, checkedClassUnionAssertion } from "./class-asser
|
|
|
22
29
|
import { checkedArmExtraction } from "./coercions/unions.js";
|
|
23
30
|
import { narrowClassUnion, narrowStoredClassValue } from "./class-unions.js";
|
|
24
31
|
import { lowerUnionFieldRead, lowerUnionFieldWrite } from "./expressions/union-fields.js";
|
|
25
|
-
import { captureContextArguments } from "./function-context.js";
|
|
32
|
+
import { captureContextArguments, declareContextLocal } from "./function-context.js";
|
|
26
33
|
import { OBJECT_CALLABLE_VALUES } from "./surfaces.js";
|
|
27
34
|
import { wasiGuestPath } from "../../wasi-paths.js";
|
|
28
35
|
import { BIGINT_T, BYTES_ELEMENT_NAME, BOOL, CAUGHT, DYN, DYN_HANDLE_KINDS, F64, NULL_T, REF_TRUTHY_KINDS, REGEX, RUNTIME_ERROR_CLASSES, SEARCH_PARAMS_T, STRING, UNDEFINED_T, VOID, arrayOf, canAdaptDynFuncTo, canDynCheckTo, canBoxFuncIntoDyn, funcOf, isDynTypedRefType, isSupportedArrayElem, isUnitType, shapeHasAccessorSlots, typeEquals, typeKey, unionContainerArmsOk, } from "../../ir/ir.js";
|
|
@@ -48,8 +55,8 @@ import { funcTypeFromParamShapes } from "./call-signatures.js";
|
|
|
48
55
|
import { implicitMonoFile, objLitGenericFnInfoOf, objLitGenericFnNodeOf, requireObjLitGenericReceiver, } from "./generic-functions.js";
|
|
49
56
|
import { lowerTaggedTemplate } from "./lower-calls.js";
|
|
50
57
|
import { mixinFnOfCallee } from "./lower-mixins.js";
|
|
51
|
-
import { isConstAssertionTypeNode, isGenericCallableMemberType, isParseArgsDynTypeName, underConstAssertion, unitOnlyUnion, withUnitArm, } from "../type-mapper.js";
|
|
52
|
-
import { lowerYield } from "./lower-generators.js";
|
|
58
|
+
import { isConstAssertionTypeNode, isGenericCallableMemberType, isLegacyUrlSymbol, isOsConstantsType, isParseArgsDynTypeName, underConstAssertion, unitOnlyUnion, withUnitArm, } from "../type-mapper.js";
|
|
59
|
+
import { iteratorResultValueRead, lowerYield } from "./lower-generators.js";
|
|
53
60
|
import { errorPropertyRead, errorPropertyWrite, errorToStringCall } from "./error-methods.js";
|
|
54
61
|
import { lowerStreamProperty, lowerStreamStateProperty, streamSidesOf } from "./lower-stream.js";
|
|
55
62
|
import { unionWideningTags } from "../../ir/analysis.js";
|
|
@@ -77,6 +84,7 @@ import { lowerUrlAssignment } from "./builtins/url.js";
|
|
|
77
84
|
import { jsBindingHasOpenWrites } from "./lower-stmts.js";
|
|
78
85
|
import { checkedClassInstanceOf } from "./class-construction.js";
|
|
79
86
|
import { lowerModuleNamespaceElement } from "./module-namespace-elements.js";
|
|
87
|
+
import { isPerfEntryType, perfEntryTag } from "./builtins/performance.js";
|
|
80
88
|
/** A template piece's RAW text (String.raw's contract: escapes stay
|
|
81
89
|
* characters). 7's client AST ships no rawText at runtime (the typing
|
|
82
90
|
* declares it; the serialized node data omits it), so the raw span comes
|
|
@@ -731,7 +739,9 @@ function lowerExprInner(lowerer, expr) {
|
|
|
731
739
|
lowerer.unions.get(g.type.unionId)?.arms.length === 2 &&
|
|
732
740
|
lowerer.unions.get(g.type.unionId).arms.some((a) => a.kind === "f64") &&
|
|
733
741
|
lowerer.unions.get(g.type.unionId).arms.some((a) => a.kind === "string");
|
|
742
|
+
const symbol = lowerer.resolveValueSymbol(expr);
|
|
734
743
|
if (!arithmeticUnion &&
|
|
744
|
+
!(symbol !== null && lowerer.earlyReadVars.has(symbol)) &&
|
|
735
745
|
g.type.kind === "union" &&
|
|
736
746
|
narrowed &&
|
|
737
747
|
narrowed.kind !== "union" &&
|
|
@@ -849,6 +859,8 @@ function lowerExprInner(lowerer, expr) {
|
|
|
849
859
|
return { kind: "boolLit", value: true, type: BOOL, loc };
|
|
850
860
|
if (member === "publish")
|
|
851
861
|
lowerer.noLowering("publish (@scriptc/threads) as a value", expr, "call publish(value) directly");
|
|
862
|
+
if (experimentalImportOf(lowerer.program, expr) === "LifetimeRegion")
|
|
863
|
+
lowerer.noLowering("LifetimeRegion (@scriptc/experimental) as a value", expr, "construct regions with new LifetimeRegion()");
|
|
852
864
|
}
|
|
853
865
|
{
|
|
854
866
|
const bi = lowerer.builtinImportOf(expr);
|
|
@@ -872,6 +884,9 @@ function lowerExprInner(lowerer, expr) {
|
|
|
872
884
|
if (bi.module === "http" && bi.member === "STATUS_CODES") {
|
|
873
885
|
return { kind: "libCall", fn: "http.statusCodes", args: [], type: DYN, loc };
|
|
874
886
|
}
|
|
887
|
+
if (bi.module === "os" && bi.member === "constants") {
|
|
888
|
+
return { kind: "libCall", fn: "os.constants", args: [], type: DYN, loc };
|
|
889
|
+
}
|
|
875
890
|
// tls.rootCertificates: a runtime-valued module constant (the
|
|
876
891
|
// cached bundled-CA array) — the one member read that lowers
|
|
877
892
|
// to a libCall instead of a baked literal.
|
|
@@ -1413,6 +1428,11 @@ function lowerExprInner(lowerer, expr) {
|
|
|
1413
1428
|
if (ts.isConditionalExpression(expr))
|
|
1414
1429
|
return lowerTernary(lowerer, expr);
|
|
1415
1430
|
if (ts.isPropertyAccessExpression(expr)) {
|
|
1431
|
+
{
|
|
1432
|
+
const member = lifetimeRegionMemberOf(lowerer.program, expr, lowerer.experimentalFiles);
|
|
1433
|
+
if (member !== null)
|
|
1434
|
+
lowerer.noLowering(`LifetimeRegion.${member} (@scriptc/experimental) as a value`, expr, `call region.${member}(${member === "run" ? "fn" : ""}) directly`);
|
|
1435
|
+
}
|
|
1416
1436
|
// Expando statics may still be absent even when JS inference sees
|
|
1417
1437
|
// the eventual assignment's scalar type. Preserve the checked value.
|
|
1418
1438
|
const staticField = lowerStaticFieldRead(lowerer, expr);
|
|
@@ -1772,7 +1792,7 @@ function lowerExprInner(lowerer, expr) {
|
|
|
1772
1792
|
// attached this name to it (`exports.<name> =` nowhere in the
|
|
1773
1793
|
// file), the honest answer is undefined. tsc types the read off the
|
|
1774
1794
|
// REPLACEMENT (its CJS model is identity-blind), which is exactly
|
|
1775
|
-
// the
|
|
1795
|
+
// the undiagnosed divergence this lowering closes. Reads in modules with
|
|
1776
1796
|
// real `exports.<name> =` attachments keep their fences.
|
|
1777
1797
|
{
|
|
1778
1798
|
const ex = lowerReplacedExportsRead(lowerer, expr);
|
|
@@ -1787,6 +1807,13 @@ function lowerExprInner(lowerer, expr) {
|
|
|
1787
1807
|
if (tm)
|
|
1788
1808
|
return tm;
|
|
1789
1809
|
}
|
|
1810
|
+
// Property signatures of class-backed protocols read implementing
|
|
1811
|
+
// classes' fields directly.
|
|
1812
|
+
if (!hasOptionalChainGuard(expr.expression)) {
|
|
1813
|
+
const typed = lowerProtocolPropertyRead(lowerer, expr);
|
|
1814
|
+
if (typed)
|
|
1815
|
+
return typed;
|
|
1816
|
+
}
|
|
1790
1817
|
const handled = lowerer.lowerProcessEnvGet(expr) ??
|
|
1791
1818
|
lowerer.lowerServerProperty(expr) ??
|
|
1792
1819
|
// diagnostics_channel Channel receivers — name/hasSubscribers
|
|
@@ -1809,6 +1836,7 @@ function lowerExprInner(lowerer, expr) {
|
|
|
1809
1836
|
lowerer.lowerJsonProperty(expr) ??
|
|
1810
1837
|
lowerer.lowerErrorCodeProperty(expr) ??
|
|
1811
1838
|
lowerer.lowerNumberStaticProperty(expr) ??
|
|
1839
|
+
lowerEventStaticProperty(lowerer, expr) ??
|
|
1812
1840
|
lowerer.lowerMathProperty(expr) ??
|
|
1813
1841
|
lowerer.lowerIntrinsicProperty(expr) ??
|
|
1814
1842
|
// The _readableState/_writableState scalar READS (the suite's
|
|
@@ -1816,6 +1844,7 @@ function lowerExprInner(lowerer, expr) {
|
|
|
1816
1844
|
// the inner access maps no type of its own.
|
|
1817
1845
|
lowerStreamStateProperty(lowerer, expr) ??
|
|
1818
1846
|
lowerStreamObjectProperty(lowerer, expr) ??
|
|
1847
|
+
lowerEventObjectProperty(lowerer, expr) ??
|
|
1819
1848
|
lowerer.lowerUnionProperty(expr) ??
|
|
1820
1849
|
lowerer.lowerFieldRead(expr);
|
|
1821
1850
|
// A union-typed field read narrows like an identifier when the
|
|
@@ -1831,7 +1860,7 @@ function lowerExprInner(lowerer, expr) {
|
|
|
1831
1860
|
// arm is real (`obj.n = bytes[i]; obj.n` is undefined in Node).
|
|
1832
1861
|
if (runtimeOptionalClassField(lowerer, handled, expr))
|
|
1833
1862
|
return handled;
|
|
1834
|
-
return lowerer.maybeNarrow(handled, expr);
|
|
1863
|
+
return iteratorResultValueRead(lowerer, handled, expr) ?? lowerer.maybeNarrow(handled, expr);
|
|
1835
1864
|
}
|
|
1836
1865
|
// `globalThis.<name>` that no lowering above claimed
|
|
1837
1866
|
// (globalThis.crypto, globalThis.SubtleCrypto, globalThis.localStorage
|
|
@@ -2021,14 +2050,15 @@ function lowerExprInner(lowerer, expr) {
|
|
|
2021
2050
|
const shape = lowerer.shapes.get(recv.type.shapeId);
|
|
2022
2051
|
const field = shape?.fields.find((f) => f.name === expr.name.text);
|
|
2023
2052
|
if (field) {
|
|
2024
|
-
|
|
2053
|
+
const read = {
|
|
2025
2054
|
kind: "recordGet",
|
|
2026
2055
|
obj: recv,
|
|
2027
2056
|
shapeId: recv.type.shapeId,
|
|
2028
2057
|
field: field.name,
|
|
2029
2058
|
type: field.type,
|
|
2030
2059
|
loc,
|
|
2031
|
-
}
|
|
2060
|
+
};
|
|
2061
|
+
return iteratorResultValueRead(lowerer, read, expr) ?? lowerer.maybeNarrow(read, expr);
|
|
2032
2062
|
}
|
|
2033
2063
|
}
|
|
2034
2064
|
}
|
|
@@ -2055,9 +2085,15 @@ function lowerExprInner(lowerer, expr) {
|
|
|
2055
2085
|
const segmentDataProperty = segmentDataSymbol?.name === "SegmentData" &&
|
|
2056
2086
|
lowerer.isStdlibSymbol(segmentDataSymbol) &&
|
|
2057
2087
|
["segment", "index", "input", "isWordLike"].includes(expr.name.text);
|
|
2088
|
+
// os.constants members vary by platform (the declared groups list
|
|
2089
|
+
// every platform's names): a number member reads as `number |
|
|
2090
|
+
// undefined`, like an array element, and a group stays checked.
|
|
2091
|
+
const osConstants = isOsConstantsType(lowerer.typeOf(expr.expression), lowerer);
|
|
2058
2092
|
if (isParseArgsDynProperty(lowerer, expr) ||
|
|
2059
2093
|
isStatFsDynProperty(lowerer, expr) ||
|
|
2060
|
-
segmentDataProperty
|
|
2094
|
+
segmentDataProperty ||
|
|
2095
|
+
osConstants ||
|
|
2096
|
+
isLegacyUrlSymbol(lowerer.checker.getSymbolAtLocation(expr.name), lowerer)) {
|
|
2061
2097
|
const recv = lowerer.lowerExpr(expr.expression);
|
|
2062
2098
|
if (recv.type.kind === "dyn") {
|
|
2063
2099
|
const key = {
|
|
@@ -2067,14 +2103,20 @@ function lowerExprInner(lowerer, expr) {
|
|
|
2067
2103
|
loc: locOf(expr.name),
|
|
2068
2104
|
};
|
|
2069
2105
|
const opt = hasOptionalChainGuard(expr.expression);
|
|
2070
|
-
|
|
2106
|
+
const read = {
|
|
2071
2107
|
kind: "dynKeyGet",
|
|
2072
2108
|
key,
|
|
2073
2109
|
...(opt ? { optional: true } : {}),
|
|
2074
2110
|
value: recv,
|
|
2075
2111
|
type: DYN,
|
|
2076
2112
|
loc,
|
|
2077
|
-
}
|
|
2113
|
+
};
|
|
2114
|
+
if (osConstants) {
|
|
2115
|
+
return lowerer.mapTypeOf(lowerer.typeOf(expr))?.kind === "f64"
|
|
2116
|
+
? lowerer.coerceToExpected(read, lowerer.withUndefinedArm(F64))
|
|
2117
|
+
: read;
|
|
2118
|
+
}
|
|
2119
|
+
return lowerer.maybeNarrow(read, expr);
|
|
2078
2120
|
}
|
|
2079
2121
|
}
|
|
2080
2122
|
// A member read through a NULLISH generic binding (`const i: I<A &
|
|
@@ -4286,10 +4328,10 @@ export function lowerIntrinsicProperty(lowerer, expr) {
|
|
|
4286
4328
|
const receiver = lowerer.lowerExpr(expr.expression);
|
|
4287
4329
|
return { kind: "libCall", fn: "stats.size", args: [receiver], type: F64, loc: locOf(expr) };
|
|
4288
4330
|
}
|
|
4289
|
-
if (
|
|
4331
|
+
if (Object.hasOwn(STATS_TYPE_TESTS, name)) {
|
|
4290
4332
|
lowerer.unsupported("SC1090", expr, `Stats methods as values (call '${name}' directly)`);
|
|
4291
4333
|
}
|
|
4292
|
-
lowerer.noLowering(`Stats.${name}`, expr, "isFile(), isDirectory(), isSymbolicLink(), dev, ino, size, blocks,
|
|
4334
|
+
lowerer.noLowering(`Stats.${name}`, expr, "isFile(), isDirectory(), isSymbolicLink(), isBlockDevice(), isCharacterDevice(), isFIFO(), isSocket(), dev, mode, nlink, uid, gid, rdev, blksize, ino, size, blocks, atimeMs, mtimeMs, ctimeMs, birthtimeMs, atime, mtime, ctime, and birthtime are the supported Stats members", lowerer.checker.getSymbolAtLocation(expr.name));
|
|
4293
4335
|
}
|
|
4294
4336
|
if (kind === "date") {
|
|
4295
4337
|
const methods = new Set([
|
|
@@ -7122,6 +7164,8 @@ export function ensureString(lowerer, e, node) {
|
|
|
7122
7164
|
// prints its elements like an array (not lowered — fenced) — every
|
|
7123
7165
|
// other record is Object.prototype.toString's constant.
|
|
7124
7166
|
const shape = lowerer.shapes.get(e.type.shapeId);
|
|
7167
|
+
if (isPerfEntryType(lowerer, e.type))
|
|
7168
|
+
return perfEntryTag(lowerer, e, e.type, e.loc);
|
|
7125
7169
|
if (shape && !shape.tuple && !shape.fields.some((f) => f.name === "toString")) {
|
|
7126
7170
|
return { kind: "toString", operand: e, type: STRING, loc: e.loc };
|
|
7127
7171
|
}
|
|
@@ -7272,7 +7316,23 @@ export function lowerAsExpression(lowerer, expr) {
|
|
|
7272
7316
|
lowerer.unsupported("SC1090", expr, "opaque structural views of classes or accessor records (name the property's concrete type to retain native accessor dispatch)");
|
|
7273
7317
|
}
|
|
7274
7318
|
const boxed = lowerer.coerceInto(expr, inner, DYN);
|
|
7275
|
-
|
|
7319
|
+
// Only references box live; a scalar or unit source (`value as
|
|
7320
|
+
// unknown as View`) is an ordinary snapshot.
|
|
7321
|
+
const seen = new Set();
|
|
7322
|
+
const live = (type) => {
|
|
7323
|
+
if (type.kind === "record" ||
|
|
7324
|
+
type.kind === "array" ||
|
|
7325
|
+
type.kind === "bytes" ||
|
|
7326
|
+
isDynTypedRefType(type))
|
|
7327
|
+
return true;
|
|
7328
|
+
if (type.kind !== "union" || seen.has(type.unionId))
|
|
7329
|
+
return false;
|
|
7330
|
+
seen.add(type.unionId);
|
|
7331
|
+
return lowerer.unions.get(type.unionId)?.arms.some(live) ?? false;
|
|
7332
|
+
};
|
|
7333
|
+
return boxed.kind === "dynFrom" && live(boxed.value.type)
|
|
7334
|
+
? { ...boxed, liveRef: true }
|
|
7335
|
+
: boxed;
|
|
7276
7336
|
}
|
|
7277
7337
|
// Collection assertions are interface views only: their backing
|
|
7278
7338
|
// value must already have the same native key/element/value layout.
|
|
@@ -7916,6 +7976,13 @@ export function lowerBinary(lowerer, expr) {
|
|
|
7916
7976
|
if (ts.isPropertyAccessExpression(expr.left) || ts.isElementAccessExpression(expr.left)) {
|
|
7917
7977
|
fenceNodeModuleMutation(lowerer, expr.left, "assignment");
|
|
7918
7978
|
}
|
|
7979
|
+
// The writable Event accessors on Event subclass instances, in value
|
|
7980
|
+
// position (`const r = (event.returnValue = false)`).
|
|
7981
|
+
if (op === ts.SyntaxKind.EqualsToken && ts.isPropertyAccessExpression(expr.left)) {
|
|
7982
|
+
const eventWrite = lowerEventObjectPropertyWrite(lowerer, expr.left, expr.right);
|
|
7983
|
+
if (eventWrite)
|
|
7984
|
+
return eventWrite;
|
|
7985
|
+
}
|
|
7919
7986
|
// `x = e` in EXPRESSION position (`while ((idx = s.indexOf("\n")) !== -1)`,
|
|
7920
7987
|
// `f(x = v)`): evaluate e once, write the binding, yield the assigned
|
|
7921
7988
|
// value — JS evaluation order. Variable targets only (locals and module
|
|
@@ -8252,14 +8319,24 @@ export function lowerBinary(lowerer, expr) {
|
|
|
8252
8319
|
reference.kind === "union" ||
|
|
8253
8320
|
DYN_HANDLE_KINDS.has(reference.kind)) &&
|
|
8254
8321
|
lowerer.dynConvertible(reference)) {
|
|
8322
|
+
// Records, arrays and byte views compare by the capsule identity
|
|
8323
|
+
// their dyn reads produce, including when they arrive through a
|
|
8324
|
+
// union (an optional array field read from a typed record).
|
|
8325
|
+
const liveArm = (type) => {
|
|
8326
|
+
if (type.kind === "array" || type.kind === "bytes")
|
|
8327
|
+
return true;
|
|
8328
|
+
const shape = type.kind === "record" ? lowerer.shapes.get(type.shapeId) : undefined;
|
|
8329
|
+
return !!shape && (shape.fields.length > 0 || shape.indexValue !== undefined);
|
|
8330
|
+
};
|
|
8255
8331
|
const boxed = {
|
|
8256
8332
|
kind: "dynFrom",
|
|
8257
8333
|
value: scalarSide,
|
|
8258
8334
|
type: DYN,
|
|
8259
8335
|
loc: scalarSide.loc,
|
|
8260
8336
|
...(reference.kind === "record" ||
|
|
8261
|
-
reference
|
|
8262
|
-
reference.kind === "
|
|
8337
|
+
liveArm(reference) ||
|
|
8338
|
+
(reference.kind === "union" &&
|
|
8339
|
+
(lowerer.unions.get(reference.unionId)?.arms.some(liveArm) ?? false))
|
|
8263
8340
|
? { liveRef: true }
|
|
8264
8341
|
: {}),
|
|
8265
8342
|
};
|
|
@@ -8523,8 +8600,8 @@ export function lowerBinary(lowerer, expr) {
|
|
|
8523
8600
|
// the checker typed the binding as `string`. An optional string is not
|
|
8524
8601
|
// itself a string operand for `+`: `undefined + 1` and
|
|
8525
8602
|
// `undefined + undefined` are NaN, while a present string concatenates.
|
|
8526
|
-
// Keep this predicate exact so a nullable string does not
|
|
8527
|
-
//
|
|
8603
|
+
// Keep this predicate exact so a nullable string does not take the
|
|
8604
|
+
// string path either.
|
|
8528
8605
|
const optionalStringType = (type) => {
|
|
8529
8606
|
if (type.kind !== "union")
|
|
8530
8607
|
return false;
|
|
@@ -9518,6 +9595,7 @@ function typeofAnswer(arm) {
|
|
|
9518
9595
|
case "searchParams":
|
|
9519
9596
|
case "stats":
|
|
9520
9597
|
case "fileHandle":
|
|
9598
|
+
case "dir":
|
|
9521
9599
|
case "spawnRes":
|
|
9522
9600
|
case "child":
|
|
9523
9601
|
case "netServer":
|
|
@@ -10140,6 +10218,22 @@ export function lowerInstanceOf(lowerer, expr, loc) {
|
|
|
10140
10218
|
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
10141
10219
|
return { kind: "libCall", fn: "dyn.dataViewIs", args: [value], type: BOOL, loc };
|
|
10142
10220
|
}
|
|
10221
|
+
{
|
|
10222
|
+
const eventKind = ["Event", "CustomEvent", "EventTarget"].findIndex((name) => lowerer.isStdlibGlobal(expr.right, name));
|
|
10223
|
+
if (eventKind >= 0) {
|
|
10224
|
+
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
10225
|
+
const kind = { kind: "numLit", value: eventKind, type: F64, loc };
|
|
10226
|
+
return { kind: "libCall", fn: "event.is", args: [value, kind], type: BOOL, loc };
|
|
10227
|
+
}
|
|
10228
|
+
}
|
|
10229
|
+
{
|
|
10230
|
+
const blob = lowerBlobInstanceof(lowerer, expr);
|
|
10231
|
+
if (blob)
|
|
10232
|
+
return blob;
|
|
10233
|
+
const keyObject = lowerKeyObjectInstanceof(lowerer, expr);
|
|
10234
|
+
if (keyObject)
|
|
10235
|
+
return keyObject;
|
|
10236
|
+
}
|
|
10143
10237
|
if (lowerer.isStdlibGlobal(expr.right, "SharedArrayBuffer")) {
|
|
10144
10238
|
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
10145
10239
|
return { kind: "libCall", fn: "sharedArrayBuffer.is", args: [value], type: BOOL, loc };
|
|
@@ -10339,7 +10433,12 @@ export function lowerInstanceOf(lowerer, expr, loc) {
|
|
|
10339
10433
|
lowerer.isSubclassOf(left.type.className, targetInfo.def.name);
|
|
10340
10434
|
if (left.kind === "varRef" &&
|
|
10341
10435
|
(ts.isIdentifier(expr.right) || expr.right.kind === ts.SyntaxKind.ThisKeyword)) {
|
|
10342
|
-
return
|
|
10436
|
+
return readsClassAfter(lowerer, targetInfo, expr.right, [], {
|
|
10437
|
+
kind: "boolLit",
|
|
10438
|
+
value,
|
|
10439
|
+
type: BOOL,
|
|
10440
|
+
loc,
|
|
10441
|
+
});
|
|
10343
10442
|
}
|
|
10344
10443
|
lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the values to variables first)");
|
|
10345
10444
|
}
|
|
@@ -10489,13 +10588,12 @@ export function lowerInstanceOf(lowerer, expr, loc) {
|
|
|
10489
10588
|
}
|
|
10490
10589
|
}
|
|
10491
10590
|
if (left.type.kind !== "object") {
|
|
10492
|
-
return {
|
|
10493
|
-
kind: "
|
|
10494
|
-
|
|
10495
|
-
result: { kind: "boolLit", value: false, type: BOOL, loc },
|
|
10591
|
+
return readsClassAfter(lowerer, target, expr.right, [{ kind: "exprStmt", expr: left, loc }], {
|
|
10592
|
+
kind: "boolLit",
|
|
10593
|
+
value: false,
|
|
10496
10594
|
type: BOOL,
|
|
10497
10595
|
loc,
|
|
10498
|
-
};
|
|
10596
|
+
});
|
|
10499
10597
|
}
|
|
10500
10598
|
const lhsInfo = lowerer.classes.get(left.type.className);
|
|
10501
10599
|
if (!lhsInfo)
|
|
@@ -10506,10 +10604,33 @@ export function lowerInstanceOf(lowerer, expr, loc) {
|
|
|
10506
10604
|
const value = left.type.className === target.def.name ||
|
|
10507
10605
|
lowerer.isSubclassOf(left.type.className, target.def.name);
|
|
10508
10606
|
if (left.kind === "varRef") {
|
|
10509
|
-
return
|
|
10607
|
+
return readsClassAfter(lowerer, target, expr.right, [], {
|
|
10608
|
+
kind: "boolLit",
|
|
10609
|
+
value,
|
|
10610
|
+
type: BOOL,
|
|
10611
|
+
loc,
|
|
10612
|
+
});
|
|
10510
10613
|
}
|
|
10511
10614
|
lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the value to a variable first)");
|
|
10512
10615
|
}
|
|
10616
|
+
/** A statically decided `instanceof` still reads its class after the left
|
|
10617
|
+
* operand: a class with an initialization flag throws there before its
|
|
10618
|
+
* declaration ran. */
|
|
10619
|
+
function readsClassAfter(lowerer, target, right, stmts, result) {
|
|
10620
|
+
if (!lowerer.classInitFlags.has(target.def.name)) {
|
|
10621
|
+
if (stmts.length === 0)
|
|
10622
|
+
return result;
|
|
10623
|
+
return { kind: "seqExpr", stmts, result, type: result.type, loc: result.loc };
|
|
10624
|
+
}
|
|
10625
|
+
const read = lowerer.lowerExpr(right);
|
|
10626
|
+
return {
|
|
10627
|
+
kind: "seqExpr",
|
|
10628
|
+
stmts: [...stmts, { kind: "exprStmt", expr: read, loc: locOf(right) }],
|
|
10629
|
+
result,
|
|
10630
|
+
type: result.type,
|
|
10631
|
+
loc: result.loc,
|
|
10632
|
+
};
|
|
10633
|
+
}
|
|
10513
10634
|
/** `#name in obj` — the ergonomic brand check. In this closed world a
|
|
10514
10635
|
* brand is held by exactly the instances of the declaring class
|
|
10515
10636
|
* (subclasses included — construction always runs the declaring class's
|
|
@@ -10567,7 +10688,7 @@ function lowerPrivateIn(lowerer, expr, priv, loc) {
|
|
|
10567
10688
|
// A GENERIC family: JS has ONE runtime class and ONE brand for every
|
|
10568
10689
|
// instantiation, while these layouts mint one class per instantiation
|
|
10569
10690
|
// — a cross-instantiation check would answer false where Node says
|
|
10570
|
-
// true, so the family
|
|
10691
|
+
// true, so the family reports SC1090 instead of splitting the brand.
|
|
10571
10692
|
if (info.generic || info.genericInstance) {
|
|
10572
10693
|
lowerer.unsupported("SC1090", expr, `'${pname} in …' inside a generic class (JS shares one brand across every instantiation; these layouts mint one class per instantiation)`);
|
|
10573
10694
|
}
|
|
@@ -10663,11 +10784,27 @@ function lowerPrivateIn(lowerer, expr, priv, loc) {
|
|
|
10663
10784
|
return { kind: "boolLit", value, type: BOOL, loc };
|
|
10664
10785
|
lowerer.unsupported("SC1090", expr, `statically-decided '${pname} in …' on computed operands (bind the value to a variable first)`);
|
|
10665
10786
|
}
|
|
10787
|
+
/** The string keys every record inherits from Object.prototype. */
|
|
10788
|
+
const OBJECT_PROTOTYPE_KEYS = new Set([
|
|
10789
|
+
"constructor",
|
|
10790
|
+
"__defineGetter__",
|
|
10791
|
+
"__defineSetter__",
|
|
10792
|
+
"hasOwnProperty",
|
|
10793
|
+
"__lookupGetter__",
|
|
10794
|
+
"__lookupSetter__",
|
|
10795
|
+
"isPrototypeOf",
|
|
10796
|
+
"propertyIsEnumerable",
|
|
10797
|
+
"toString",
|
|
10798
|
+
"valueOf",
|
|
10799
|
+
"__proto__",
|
|
10800
|
+
"toLocaleString",
|
|
10801
|
+
]);
|
|
10666
10802
|
/** `"key" in v` — the key-presence test. Three lowered receivers:
|
|
10667
10803
|
* process.env (getenv(3) presence — Node-exact, an empty value still
|
|
10668
10804
|
* counts as present), and monomorphic record shapes, where the answer is
|
|
10669
10805
|
* type-directed: a declared non-optional field is a compile-time `true`,
|
|
10670
|
-
* a missing field (no index signature) a compile-time `false`
|
|
10806
|
+
* a missing field (no index signature) a compile-time `false` unless
|
|
10807
|
+
* Object.prototype has it — both
|
|
10671
10808
|
* folds limited to side-effect-free receivers, the lowerInstanceOf rule —
|
|
10672
10809
|
* and an OPTIONAL field (undefined-armed union) is a runtime presence
|
|
10673
10810
|
* test on the slot: an omitted or deleted property is absent, while a
|
|
@@ -10917,7 +11054,11 @@ function lowerInExpression(lowerer, expr, loc) {
|
|
|
10917
11054
|
break;
|
|
10918
11055
|
}
|
|
10919
11056
|
const f = shape.fields.find((x) => x.name === key);
|
|
10920
|
-
|
|
11057
|
+
const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
|
|
11058
|
+
if (f &&
|
|
11059
|
+
!inherited &&
|
|
11060
|
+
f.type.kind === "union" &&
|
|
11061
|
+
lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0) {
|
|
10921
11062
|
staticAnswers = false; // an optional slot: presence is per-value
|
|
10922
11063
|
break;
|
|
10923
11064
|
}
|
|
@@ -10925,7 +11066,7 @@ function lowerInExpression(lowerer, expr, loc) {
|
|
|
10925
11066
|
// true without invoking the getter) — either slot present makes
|
|
10926
11067
|
// the name a member.
|
|
10927
11068
|
const acc = shape.fields.some((x) => x.name === `%get:${key}` || x.name === `%set:${key}`);
|
|
10928
|
-
answers.push({ tag, has: f !== undefined || acc });
|
|
11069
|
+
answers.push({ tag, has: f !== undefined || acc || inherited });
|
|
10929
11070
|
}
|
|
10930
11071
|
if (staticAnswers) {
|
|
10931
11072
|
const pureRecv = recv.kind === "varRef" ||
|
|
@@ -10993,7 +11134,9 @@ function lowerInExpression(lowerer, expr, loc) {
|
|
|
10993
11134
|
throw new InternalCompilerError(`lowerer bug: unknown shape ${recv.type.shapeId}`);
|
|
10994
11135
|
const field = shape.fields.find((f) => f.name === key);
|
|
10995
11136
|
if (field) {
|
|
10996
|
-
if (
|
|
11137
|
+
if (!OBJECT_PROTOTYPE_KEYS.has(key) &&
|
|
11138
|
+
field.type.kind === "union" &&
|
|
11139
|
+
lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) {
|
|
10997
11140
|
// Optional slot: the key is present unless the field is absent
|
|
10998
11141
|
// (omitted or deleted); an explicit undefined is present.
|
|
10999
11142
|
return lowerer.recordFieldPresent(recv, recv.type.shapeId, key, loc);
|
|
@@ -11021,14 +11164,16 @@ function lowerInExpression(lowerer, expr, loc) {
|
|
|
11021
11164
|
}
|
|
11022
11165
|
lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
|
|
11023
11166
|
}
|
|
11024
|
-
|
|
11167
|
+
// Records are ordinary objects: Object.prototype's members are in them.
|
|
11168
|
+
const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
|
|
11169
|
+
if (shape.indexValue && !inherited) {
|
|
11025
11170
|
lowerer.unsupported("SC1090", expr, "'in' over index-signature keys (read the key and test '!== undefined' instead)");
|
|
11026
11171
|
}
|
|
11027
11172
|
if (recv.kind === "varRef" ||
|
|
11028
11173
|
recv.kind === "recordGet" ||
|
|
11029
11174
|
recv.kind === "fieldGet" ||
|
|
11030
11175
|
pureRecvNode) {
|
|
11031
|
-
return { kind: "boolLit", value:
|
|
11176
|
+
return { kind: "boolLit", value: inherited, type: BOOL, loc };
|
|
11032
11177
|
}
|
|
11033
11178
|
lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
|
|
11034
11179
|
}
|
|
@@ -11081,7 +11226,36 @@ function lowerRuntimeKeyIn(lowerer, expr, loc) {
|
|
|
11081
11226
|
// Overflow keys answer through the map's hashed presence probe (a
|
|
11082
11227
|
// stored undefined value is still present), not a scan over a fresh
|
|
11083
11228
|
// key snapshot, which made `k in dict` loops quadratic.
|
|
11084
|
-
|
|
11229
|
+
const ovfHas = {
|
|
11230
|
+
kind: "recordOvfHas",
|
|
11231
|
+
obj: r,
|
|
11232
|
+
shapeId: recvT.shapeId,
|
|
11233
|
+
key: k,
|
|
11234
|
+
type: BOOL,
|
|
11235
|
+
loc,
|
|
11236
|
+
};
|
|
11237
|
+
// A miss in the record's own keys still finds Object.prototype's.
|
|
11238
|
+
let inherited = ovfHas;
|
|
11239
|
+
for (const name of OBJECT_PROTOTYPE_KEYS) {
|
|
11240
|
+
if (shape.fields.some((f) => f.name === name))
|
|
11241
|
+
continue;
|
|
11242
|
+
inherited = {
|
|
11243
|
+
kind: "logical",
|
|
11244
|
+
op: "||",
|
|
11245
|
+
left: inherited,
|
|
11246
|
+
right: {
|
|
11247
|
+
kind: "strEq",
|
|
11248
|
+
negated: false,
|
|
11249
|
+
left: k,
|
|
11250
|
+
right: { kind: "strLit", value: name, type: STRING, loc },
|
|
11251
|
+
type: BOOL,
|
|
11252
|
+
loc,
|
|
11253
|
+
},
|
|
11254
|
+
type: BOOL,
|
|
11255
|
+
loc,
|
|
11256
|
+
};
|
|
11257
|
+
}
|
|
11258
|
+
body.push(ret(inherited));
|
|
11085
11259
|
lowerer.liftedFns.push({
|
|
11086
11260
|
name: helper,
|
|
11087
11261
|
params: [
|
|
@@ -12912,8 +13086,8 @@ function lowerFieldCompoundValue(lowerer, access, op, rhsNode, loc) {
|
|
|
12912
13086
|
// accounting; dot spelling only — symbol-keyed element targets are
|
|
12913
13087
|
// static fields): read the member (dynKeyGet), VALIDATE it as a
|
|
12914
13088
|
// number (dynCheck — a non-number member throws the catchable
|
|
12915
|
-
// TypeError where JS would ToNumber-coerce;
|
|
12916
|
-
// NaN — SEMANTICS.md), combine, write back (dyn.keySet). The
|
|
13089
|
+
// TypeError where JS would ToNumber-coerce; it throws instead of
|
|
13090
|
+
// producing NaN — SEMANTICS.md), combine, write back (dyn.keySet). The
|
|
12917
13091
|
// receiver and member read are saved before evaluating the RHS.
|
|
12918
13092
|
if (ts.isPropertyAccessExpression(access)) {
|
|
12919
13093
|
let probed = tryLowerExpression(lowerer, access.expression);
|
|
@@ -12987,22 +13161,33 @@ function lowerFieldCompoundValue(lowerer, access, op, rhsNode, loc) {
|
|
|
12987
13161
|
target.obj = save(target.obj, "%compoundReceiver");
|
|
12988
13162
|
// Accessors observe getter, RHS side effects, then setter, all through
|
|
12989
13163
|
// the saved receiver.
|
|
12990
|
-
const
|
|
13164
|
+
const fieldRead = lowerer.fieldGetExpr(target, locOf(access), access);
|
|
13165
|
+
// `+=` on a stored string field reads it into a mutable local, so the
|
|
13166
|
+
// concat below can append to that local in place.
|
|
13167
|
+
const storedString = op === "+" &&
|
|
13168
|
+
fieldRead.type.kind === "string" &&
|
|
13169
|
+
target.fieldType.kind === "string" &&
|
|
13170
|
+
(target.container === "class" || target.container === "record");
|
|
13171
|
+
let read;
|
|
13172
|
+
if (storedString) {
|
|
13173
|
+
const old = declareContextLocal(lowerer.ctx, "%compoundOld", STRING, true, undefined, undefined);
|
|
13174
|
+
body.push({ kind: "varDecl", localId: old.id, init: fieldRead, loc: fieldRead.loc });
|
|
13175
|
+
read = varRef(old.id, STRING, fieldRead.loc);
|
|
13176
|
+
}
|
|
13177
|
+
else {
|
|
13178
|
+
read = save(fieldRead, "%compoundOld");
|
|
13179
|
+
}
|
|
12991
13180
|
const rhs = save(rhsNode ? lowerer.lowerExpr(rhsNode) : { kind: "numLit", value: 1, type: F64, loc }, "%compoundRhs");
|
|
12992
13181
|
const numericRhs = rhs.type.kind === "dyn" && isJsSourceFile(access.getSourceFile())
|
|
12993
13182
|
? { kind: "dynCheck", value: rhs, type: F64, loc: rhs.loc }
|
|
12994
13183
|
: lowerOptionalNumber(lowerer, rhs, loc);
|
|
12995
13184
|
let value;
|
|
13185
|
+
let appended = null;
|
|
12996
13186
|
const numericRead = lowerOptionalNumber(lowerer, read, loc, access);
|
|
12997
13187
|
const bigintValue = rhsNode ? bigintCompoundValue(op, read, rhs, loc) : null;
|
|
12998
13188
|
if (op === "+" && read.type.kind === "string") {
|
|
12999
|
-
|
|
13000
|
-
|
|
13001
|
-
left: read,
|
|
13002
|
-
right: lowerer.ensureString(rhs, rhsNode ?? access),
|
|
13003
|
-
type: STRING,
|
|
13004
|
-
loc,
|
|
13005
|
-
};
|
|
13189
|
+
appended = lowerer.ensureString(rhs, rhsNode ?? access);
|
|
13190
|
+
value = { kind: "strConcat", left: read, right: appended, type: STRING, loc };
|
|
13006
13191
|
}
|
|
13007
13192
|
else if (numericRead.type.kind === "f64" && numericRhs.type.kind === "f64") {
|
|
13008
13193
|
value = { kind: "bin", op, left: numericRead, right: numericRhs, type: F64, loc };
|
|
@@ -13027,6 +13212,26 @@ function lowerFieldCompoundValue(lowerer, access, op, rhsNode, loc) {
|
|
|
13027
13212
|
else {
|
|
13028
13213
|
lowerer.unsupported("SC1043", access);
|
|
13029
13214
|
}
|
|
13215
|
+
if (storedString && rhs.type.kind === "string" && read.kind === "varRef" && appended !== null) {
|
|
13216
|
+
// The field gives up its value before the concat (no code runs in
|
|
13217
|
+
// between: both operands are already strings), and the concat is the
|
|
13218
|
+
// self-append `old = old + rhs`, which hands the local's reference to
|
|
13219
|
+
// the runtime: the old string is then uniquely owned unless something
|
|
13220
|
+
// else holds it, and is appended to in place. Repeated `this.text += s`
|
|
13221
|
+
// is linear rather than a copy per append.
|
|
13222
|
+
const oldId = read.localId;
|
|
13223
|
+
const oldLoc = read.loc;
|
|
13224
|
+
const oldRef = () => varRef(oldId, STRING, oldLoc);
|
|
13225
|
+
const concat = {
|
|
13226
|
+
kind: "strConcat",
|
|
13227
|
+
left: oldRef(),
|
|
13228
|
+
right: appended,
|
|
13229
|
+
type: STRING,
|
|
13230
|
+
loc,
|
|
13231
|
+
};
|
|
13232
|
+
body.push(lowerer.fieldSetStmt(target, { kind: "strLit", value: "", type: STRING, loc }, loc, access), { kind: "assign", localId: oldId, value: concat, loc }, lowerer.fieldSetStmt(target, oldRef(), loc, access));
|
|
13233
|
+
return { kind: "seqExpr", stmts: body, result: oldRef(), type: STRING, loc };
|
|
13234
|
+
}
|
|
13030
13235
|
const result = save(value, "%compoundResult");
|
|
13031
13236
|
body.push(lowerer.fieldSetStmt(target, lowerer.coerceInto(access, result, target.fieldType), loc, access));
|
|
13032
13237
|
return { kind: "seqExpr", stmts: body, result, type: result.type, loc };
|