@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,11 +1,22 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type IrModule } from "../../ir/ir.js";
|
|
2
2
|
import type { Int32Slots } from "../../ir/int32-slots.js";
|
|
3
3
|
/** The i32 entry of a function: which number parameters it receives as
|
|
4
|
-
* i32, and whether its number result is returned as i32
|
|
4
|
+
* i32, and whether its number result is returned as i32 or its scalar
|
|
5
|
+
* union result as tag and payload bits. */
|
|
5
6
|
export interface Int32Abi {
|
|
6
7
|
params: readonly boolean[];
|
|
7
8
|
result: boolean;
|
|
9
|
+
/** The result is a union of numbers, booleans and unit values (such as
|
|
10
|
+
* `number | undefined`), returned as SCALAR_UNION_RESULT instead of a
|
|
11
|
+
* heap box. */
|
|
12
|
+
union: boolean;
|
|
8
13
|
}
|
|
14
|
+
/** The register pair of a scalar union result: the union tag and the
|
|
15
|
+
* payload bits of the `%ScrUnion` box it replaces. */
|
|
16
|
+
export declare const SCALAR_UNION_RESULT = "{ i32, i64 }";
|
|
17
|
+
/** The result of an entry that left a pending exception: no arm has tag
|
|
18
|
+
* -1, so the double-ABI wrapper answers the usual NULL dummy. */
|
|
19
|
+
export declare const SCALAR_UNION_DUMMY = "{ i32, i64 } { i32 -1, i64 0 }";
|
|
9
20
|
/** Suffix of a function's i32 entry symbol. The ordinary symbol stays a
|
|
10
21
|
* double-ABI wrapper around it. */
|
|
11
22
|
export declare const INT32_ABI_SUFFIX = ".i32";
|
|
@@ -22,6 +33,11 @@ export declare const INT32_ABI_SUFFIX = ".i32";
|
|
|
22
33
|
* fib(n - 2)`, keeps its double: the incoming double is that result, where
|
|
23
34
|
* an i32 would add a conversion to the path that returns it.
|
|
24
35
|
*
|
|
36
|
+
* A scalar union result (every arm a number, a boolean or a unit value)
|
|
37
|
+
* owns no reference, so the entry returns its tag and payload bits in
|
|
38
|
+
* registers. Callers that only project it never build the heap box; the
|
|
39
|
+
* others box it at the call, as the double-ABI wrapper does.
|
|
40
|
+
*
|
|
25
41
|
* Only direct `call` and `new` sites use the i32 entry. Every other way to
|
|
26
42
|
* reach the function (closure and virtual-dispatch entries, constructor
|
|
27
43
|
* thunks, adapters, the runtime) keeps the double-ABI symbol, which becomes
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
import { isUnitType, } from "../../ir/ir.js";
|
|
1
2
|
import { everyStmtList } from "../../ir/traverse.js";
|
|
3
|
+
/** The register pair of a scalar union result: the union tag and the
|
|
4
|
+
* payload bits of the `%ScrUnion` box it replaces. */
|
|
5
|
+
export const SCALAR_UNION_RESULT = "{ i32, i64 }";
|
|
6
|
+
/** The result of an entry that left a pending exception: no arm has tag
|
|
7
|
+
* -1, so the double-ABI wrapper answers the usual NULL dummy. */
|
|
8
|
+
export const SCALAR_UNION_DUMMY = `${SCALAR_UNION_RESULT} { i32 -1, i64 0 }`;
|
|
2
9
|
/** Suffix of a function's i32 entry symbol. The ordinary symbol stays a
|
|
3
10
|
* double-ABI wrapper around it. */
|
|
4
11
|
export const INT32_ABI_SUFFIX = ".i32";
|
|
@@ -15,6 +22,11 @@ export const INT32_ABI_SUFFIX = ".i32";
|
|
|
15
22
|
* fib(n - 2)`, keeps its double: the incoming double is that result, where
|
|
16
23
|
* an i32 would add a conversion to the path that returns it.
|
|
17
24
|
*
|
|
25
|
+
* A scalar union result (every arm a number, a boolean or a unit value)
|
|
26
|
+
* owns no reference, so the entry returns its tag and payload bits in
|
|
27
|
+
* registers. Callers that only project it never build the heap box; the
|
|
28
|
+
* others box it at the call, as the double-ABI wrapper does.
|
|
29
|
+
*
|
|
18
30
|
* Only direct `call` and `new` sites use the i32 entry. Every other way to
|
|
19
31
|
* reach the function (closure and virtual-dispatch entries, constructor
|
|
20
32
|
* thunks, adapters, the runtime) keeps the double-ABI symbol, which becomes
|
|
@@ -23,20 +35,29 @@ export const INT32_ABI_SUFFIX = ".i32";
|
|
|
23
35
|
* debug builds (numbers stay doubles for the debugger) select none. */
|
|
24
36
|
export function findInt32Abis(mod, slots) {
|
|
25
37
|
const result = new Map();
|
|
38
|
+
const unions = new Map((mod.unions ?? []).map((def) => [def.id, def.arms]));
|
|
26
39
|
for (const fn of mod.functions) {
|
|
27
40
|
if (fn.async || fn.generator || fn.captures !== undefined || !slots.called.has(fn.name))
|
|
28
41
|
continue;
|
|
29
42
|
const ret = fn.returnType.kind === "f64" && slots.hasReturn(fn.name);
|
|
43
|
+
const union = scalarUnionResult(fn, unions);
|
|
30
44
|
let params = fn.params.map((param) => param.type.kind === "f64" && slots.hasParam(fn.name, param.localId));
|
|
31
45
|
if (!ret && params.includes(true)) {
|
|
32
46
|
const returned = returnedLocals(fn);
|
|
33
47
|
params = params.map((i32, index) => i32 && !returned.has(fn.params[index].localId));
|
|
34
48
|
}
|
|
35
|
-
if (ret || params.includes(true))
|
|
36
|
-
result.set(fn.name, { params, result: ret });
|
|
49
|
+
if (ret || union || params.includes(true))
|
|
50
|
+
result.set(fn.name, { params, result: ret, union });
|
|
37
51
|
}
|
|
38
52
|
return result;
|
|
39
53
|
}
|
|
54
|
+
function scalarUnionResult(fn, unions) {
|
|
55
|
+
if (fn.returnType.kind !== "union")
|
|
56
|
+
return false;
|
|
57
|
+
const arms = unions.get(fn.returnType.unionId);
|
|
58
|
+
return (arms !== undefined &&
|
|
59
|
+
arms.every((arm) => arm.kind === "f64" || arm.kind === "bool" || isUnitType(arm)));
|
|
60
|
+
}
|
|
40
61
|
/** Locals some `return` hands back as its value (directly or as an arm of
|
|
41
62
|
* a conditional). */
|
|
42
63
|
function returnedLocals(fn) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"int32-abi.js","sourceRoot":"","sources":["../../../src/backend/llvm/int32-abi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"int32-abi.js","sourceRoot":"","sources":["../../../src/backend/llvm/int32-abi.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { expect, test } from "vitest";
|
|
2
|
-
import { BOOL, F64, STRING, VOID, funcOf, } from "../../ir/ir.js";
|
|
2
|
+
import { BOOL, F64, STRING, UNDEFINED_T, VOID, funcOf, } from "../../ir/ir.js";
|
|
3
3
|
import { validateModule } from "../../ir/validate.js";
|
|
4
4
|
import { emitLlvmModule } from "./emitter.js";
|
|
5
5
|
const loc = { file: "int32-abi.ts", start: 0, end: 0 };
|
|
@@ -104,4 +104,78 @@ test("debug builds keep the double ABI", () => {
|
|
|
104
104
|
expect(llvm).not.toContain(".i32(");
|
|
105
105
|
expect(llvm).toMatch(/define internal double @sc_f_mix\(double %p_\w+, double %p_\w+\)/);
|
|
106
106
|
});
|
|
107
|
+
const optional = { kind: "union", unionId: "optional" };
|
|
108
|
+
const wrap = (value, tag) => ({
|
|
109
|
+
kind: "unionWrap",
|
|
110
|
+
value,
|
|
111
|
+
tag,
|
|
112
|
+
unionId: "optional",
|
|
113
|
+
type: optional,
|
|
114
|
+
loc,
|
|
115
|
+
});
|
|
116
|
+
const missing = () => wrap({ kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc }, 1);
|
|
117
|
+
function unionModule() {
|
|
118
|
+
const positive = {
|
|
119
|
+
kind: "bin",
|
|
120
|
+
op: ">",
|
|
121
|
+
left: ref("n"),
|
|
122
|
+
right: num(0),
|
|
123
|
+
type: BOOL,
|
|
124
|
+
loc,
|
|
125
|
+
};
|
|
126
|
+
return {
|
|
127
|
+
irVersion: 16,
|
|
128
|
+
sourceFile: loc.file,
|
|
129
|
+
entry: "main",
|
|
130
|
+
unions: [{ id: "optional", arms: [F64, UNDEFINED_T] }],
|
|
131
|
+
functions: [
|
|
132
|
+
fn("main", [], [
|
|
133
|
+
stmt({
|
|
134
|
+
kind: "nullish",
|
|
135
|
+
left: call("maybe", [num(3)], optional),
|
|
136
|
+
right: num(0),
|
|
137
|
+
type: F64,
|
|
138
|
+
loc,
|
|
139
|
+
}),
|
|
140
|
+
stmt({
|
|
141
|
+
kind: "closure",
|
|
142
|
+
fnName: "maybe",
|
|
143
|
+
captures: [],
|
|
144
|
+
type: funcOf([F64], optional),
|
|
145
|
+
loc,
|
|
146
|
+
}),
|
|
147
|
+
], VOID),
|
|
148
|
+
fn("maybe", ["n"], [
|
|
149
|
+
stmt(call("throws", [], VOID)),
|
|
150
|
+
ret({
|
|
151
|
+
kind: "ternary",
|
|
152
|
+
cond: positive,
|
|
153
|
+
then: wrap(ref("n"), 0),
|
|
154
|
+
else_: missing(),
|
|
155
|
+
type: optional,
|
|
156
|
+
loc,
|
|
157
|
+
}),
|
|
158
|
+
], optional),
|
|
159
|
+
fn("throws", [], [{ kind: "throw", value: { kind: "strLit", value: "no", type: STRING, loc }, loc }], VOID),
|
|
160
|
+
],
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
test("scalar union results return tag and payload bits on direct calls", () => {
|
|
164
|
+
const mod = unionModule();
|
|
165
|
+
expect(validateModule(mod)).toEqual([]);
|
|
166
|
+
const llvm = emitLlvmModule(mod);
|
|
167
|
+
const entry = define(llvm, "sc_f_maybe.i32");
|
|
168
|
+
expect(entry).toMatch(/^define internal \{ i32, i64 \} @sc_f_maybe\.i32\(double %p_\w+\)/);
|
|
169
|
+
expect(entry).toContain("ret { i32, i64 } { i32 -1, i64 0 }");
|
|
170
|
+
expect(entry).not.toContain("@scr_union_new");
|
|
171
|
+
// A projecting caller reads the pair without a heap box.
|
|
172
|
+
const main = define(llvm, "sc_f_main");
|
|
173
|
+
expect(main).toContain("call { i32, i64 } @sc_f_maybe.i32(double ");
|
|
174
|
+
expect(main).not.toContain("@scr_union_new");
|
|
175
|
+
// The closure keeps the boxed result of the ordinary symbol.
|
|
176
|
+
const wrapper = define(llvm, "sc_f_maybe");
|
|
177
|
+
expect(wrapper).toContain("define internal ptr @sc_f_maybe(double %p0)");
|
|
178
|
+
expect(wrapper).toContain("call { i32, i64 } @sc_f_maybe.i32(double %p0)");
|
|
179
|
+
expect(wrapper).toContain("call ptr @scr_union_new_f64(i32 0, double ");
|
|
180
|
+
});
|
|
107
181
|
//# sourceMappingURL=int32-abi.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"int32-abi.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/int32-abi.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,IAAI,EACJ,GAAG,EACH,MAAM,EACN,IAAI,EACJ,MAAM,
|
|
1
|
+
{"version":3,"file":"int32-abi.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/int32-abi.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type IrExpr } from "../../ir/ir.js";
|
|
1
2
|
import type { LlValue, LlvmEmitterContext } from "./expr-context.js";
|
|
2
3
|
import { type LlInteger } from "./integer-values.js";
|
|
3
4
|
/** Integer proofs exclude negative zero and stay inside the exact-number
|
|
@@ -7,12 +8,34 @@ import { type LlInteger } from "./integer-values.js";
|
|
|
7
8
|
export declare function emitSignedIntegerRemainder(host: LlvmEmitterContext, left: LlValue, dividend: LlInteger, divisor: LlInteger): LlValue | null;
|
|
8
9
|
/** JS `%` with an inline integer path for operands that are not both
|
|
9
10
|
* proven integers with a nonzero divisor. At run time the dividend must be
|
|
10
|
-
* an integer
|
|
11
|
+
* an integer from -2^62 up to but not including 2^62 and the divisor a
|
|
12
|
+
* nonzero integer; then
|
|
11
13
|
* i64 `srem` is exact (no INT64_MIN / -1 overflow is possible), takes the
|
|
12
14
|
* dividend's sign like JS, and an exact zero takes the dividend's sign
|
|
13
|
-
* (`-4 % 2` and `-0 % 3` are -0).
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* (`-4 % 2` and `-0 % 3` are -0). The remainder of two doubles is itself a
|
|
16
|
+
* double, so its conversion back is exact, including for dividends above
|
|
17
|
+
* 2^53 (every double there is an integer). A divisor that passes the round
|
|
18
|
+
* trip with magnitude above 2^62 exceeds the dividend's, so `srem` returns
|
|
19
|
+
* the dividend exactly as JS does. Everything else (fractions, NaN,
|
|
20
|
+
* ±Infinity, zero divisors, huge dividends) takes the floating remainder,
|
|
21
|
+
* unchanged.
|
|
17
22
|
* Returns null when the divisor is the constant zero (always NaN). */
|
|
18
23
|
export declare function emitCheckedRemainder(host: LlvmEmitterContext, left: LlValue, right: LlValue, dividend: LlInteger | null, divisor: LlInteger | null): LlValue | null;
|
|
24
|
+
/** The value of a divisor known at compile time: a number literal, its
|
|
25
|
+
* negation, `2 ** k` for an integer literal k from 0 to 1023 (exactly 2^k),
|
|
26
|
+
* or an integer whose proven range is a single value. */
|
|
27
|
+
export declare function constantDivisor(expr: IrExpr, integer: LlInteger | null): number | null;
|
|
28
|
+
/** JS `%` by a constant divisor whose magnitude c is a power of two of at
|
|
29
|
+
* least 1, as `x - trunc(x / c) * c`, which is exact for every double x.
|
|
30
|
+
* When |x| < c the quotient's magnitude is below 1 and truncates to zero,
|
|
31
|
+
* so the result is x. Otherwise x / c is a normal double and exact, and
|
|
32
|
+
* the truncated quotient times c is a multiple of c of magnitude at most
|
|
33
|
+
* |x|, also exact. When c is below x's ulp, x is itself a multiple of c and
|
|
34
|
+
* the difference is zero; otherwise both terms are multiples of x's ulp and
|
|
35
|
+
* the difference, smaller than c, is exact. ±Infinity gives the default
|
|
36
|
+
* NaN of `Infinity - Infinity`, the NaN fmod also returns for it, and a NaN
|
|
37
|
+
* dividend propagates. A zero difference takes the dividend's sign
|
|
38
|
+
* (`-4 % 2` and `-0 % 1` are -0). The divisor's sign does not change the
|
|
39
|
+
* result. Returns null for any other divisor; a power of two below 1 keeps
|
|
40
|
+
* frem, because x / c can overflow. */
|
|
41
|
+
export declare function emitPowerOfTwoRemainder(host: LlvmEmitterContext, left: LlValue, divisor: number): LlValue | null;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { F64 } from "../../ir/ir.js";
|
|
2
2
|
import { f64Lit } from "./common.js";
|
|
3
3
|
import { integerNumber, widenInteger } from "./integer-values.js";
|
|
4
|
+
import { emitTruncF64 } from "./trunc.js";
|
|
4
5
|
/** Integer proofs exclude negative zero and stay inside the exact-number
|
|
5
6
|
* range, so signed i64 division cannot overflow. A possibly zero divisor
|
|
6
7
|
* keeps floating remainder. Negative multiples must still produce -0;
|
|
@@ -23,13 +24,15 @@ export function emitSignedIntegerRemainder(host, left, dividend, divisor) {
|
|
|
23
24
|
B.line(`${result} = select i1 ${zero}, double ${signedZero}, double ${number}`);
|
|
24
25
|
return { name: result, type: F64 };
|
|
25
26
|
}
|
|
26
|
-
|
|
27
|
+
/** 2^62, the bound on dividends the inline integer path accepts, as an
|
|
28
|
+
* i64 literal (`String(2 ** 62)` rounds its digits). */
|
|
29
|
+
const DIVIDEND_LIMIT = "4611686018427387904";
|
|
27
30
|
/** Convert an unproven double to a candidate i64. `freeze` keeps NaN and
|
|
28
31
|
* out-of-range conversions from producing poison; the returned condition
|
|
29
32
|
* is the exact round trip, so it rejects every non-integer. Integral
|
|
30
33
|
* doubles inside the i64 range convert exactly; a passing value outside
|
|
31
34
|
* it (|x| >= 2^63) can only pair with a frozen integer of magnitude above
|
|
32
|
-
* 2^
|
|
35
|
+
* 2^62. `-0` converts to 0 and passes. */
|
|
33
36
|
function candidateInteger(host, value) {
|
|
34
37
|
const B = host.B;
|
|
35
38
|
const raw = B.tmp(), integer = B.tmp(), back = B.tmp(), exact = B.tmp();
|
|
@@ -41,13 +44,17 @@ function candidateInteger(host, value) {
|
|
|
41
44
|
}
|
|
42
45
|
/** JS `%` with an inline integer path for operands that are not both
|
|
43
46
|
* proven integers with a nonzero divisor. At run time the dividend must be
|
|
44
|
-
* an integer
|
|
47
|
+
* an integer from -2^62 up to but not including 2^62 and the divisor a
|
|
48
|
+
* nonzero integer; then
|
|
45
49
|
* i64 `srem` is exact (no INT64_MIN / -1 overflow is possible), takes the
|
|
46
50
|
* dividend's sign like JS, and an exact zero takes the dividend's sign
|
|
47
|
-
* (`-4 % 2` and `-0 % 3` are -0).
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
+
* (`-4 % 2` and `-0 % 3` are -0). The remainder of two doubles is itself a
|
|
52
|
+
* double, so its conversion back is exact, including for dividends above
|
|
53
|
+
* 2^53 (every double there is an integer). A divisor that passes the round
|
|
54
|
+
* trip with magnitude above 2^62 exceeds the dividend's, so `srem` returns
|
|
55
|
+
* the dividend exactly as JS does. Everything else (fractions, NaN,
|
|
56
|
+
* ±Infinity, zero divisors, huge dividends) takes the floating remainder,
|
|
57
|
+
* unchanged.
|
|
51
58
|
* Returns null when the divisor is the constant zero (always NaN). */
|
|
52
59
|
export function emitCheckedRemainder(host, left, right, dividend, divisor) {
|
|
53
60
|
if (divisor && divisor.range.min === 0 && divisor.range.max === 0)
|
|
@@ -60,8 +67,9 @@ export function emitCheckedRemainder(host, left, right, dividend, divisor) {
|
|
|
60
67
|
else {
|
|
61
68
|
const [integer, exact] = candidateInteger(host, left.name);
|
|
62
69
|
const biased = B.tmp(), inRange = B.tmp();
|
|
63
|
-
|
|
64
|
-
B.line(`${
|
|
70
|
+
// -2^62 <= integer < 2^62: the biased value is nonnegative.
|
|
71
|
+
B.line(`${biased} = add i64 ${integer}, ${DIVIDEND_LIMIT}`);
|
|
72
|
+
B.line(`${inRange} = icmp sge i64 ${biased}, 0`);
|
|
65
73
|
conditions.push(exact, inRange);
|
|
66
74
|
x = integer;
|
|
67
75
|
}
|
|
@@ -114,4 +122,67 @@ export function emitCheckedRemainder(host, left, right, dividend, divisor) {
|
|
|
114
122
|
B.line(`${result} = phi double [ ${fastValue}, %${fast} ], [ ${floating}, %${slow} ]`);
|
|
115
123
|
return { name: result, type: F64 };
|
|
116
124
|
}
|
|
125
|
+
/** The value of a divisor known at compile time: a number literal, its
|
|
126
|
+
* negation, `2 ** k` for an integer literal k from 0 to 1023 (exactly 2^k),
|
|
127
|
+
* or an integer whose proven range is a single value. */
|
|
128
|
+
export function constantDivisor(expr, integer) {
|
|
129
|
+
if (integer && integer.range.min === integer.range.max)
|
|
130
|
+
return integer.range.min;
|
|
131
|
+
if (expr.kind === "numLit")
|
|
132
|
+
return expr.value;
|
|
133
|
+
if (expr.kind === "unary" && expr.op === "-") {
|
|
134
|
+
const value = constantDivisor(expr.operand, null);
|
|
135
|
+
return value === null ? null : -value;
|
|
136
|
+
}
|
|
137
|
+
if (expr.kind === "bin" &&
|
|
138
|
+
expr.op === "**" &&
|
|
139
|
+
expr.left.kind === "numLit" &&
|
|
140
|
+
expr.left.value === 2 &&
|
|
141
|
+
expr.right.kind === "numLit" &&
|
|
142
|
+
Number.isInteger(expr.right.value) &&
|
|
143
|
+
expr.right.value >= 0 &&
|
|
144
|
+
expr.right.value <= 1023)
|
|
145
|
+
return 2 ** expr.right.value;
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
/** Whether `value` is a power of two of at least 1. */
|
|
149
|
+
function isPowerOfTwo(value) {
|
|
150
|
+
if (!Number.isFinite(value) || value < 1)
|
|
151
|
+
return false;
|
|
152
|
+
let power = 1;
|
|
153
|
+
while (power < value)
|
|
154
|
+
power *= 2;
|
|
155
|
+
return power === value;
|
|
156
|
+
}
|
|
157
|
+
/** JS `%` by a constant divisor whose magnitude c is a power of two of at
|
|
158
|
+
* least 1, as `x - trunc(x / c) * c`, which is exact for every double x.
|
|
159
|
+
* When |x| < c the quotient's magnitude is below 1 and truncates to zero,
|
|
160
|
+
* so the result is x. Otherwise x / c is a normal double and exact, and
|
|
161
|
+
* the truncated quotient times c is a multiple of c of magnitude at most
|
|
162
|
+
* |x|, also exact. When c is below x's ulp, x is itself a multiple of c and
|
|
163
|
+
* the difference is zero; otherwise both terms are multiples of x's ulp and
|
|
164
|
+
* the difference, smaller than c, is exact. ±Infinity gives the default
|
|
165
|
+
* NaN of `Infinity - Infinity`, the NaN fmod also returns for it, and a NaN
|
|
166
|
+
* dividend propagates. A zero difference takes the dividend's sign
|
|
167
|
+
* (`-4 % 2` and `-0 % 1` are -0). The divisor's sign does not change the
|
|
168
|
+
* result. Returns null for any other divisor; a power of two below 1 keeps
|
|
169
|
+
* frem, because x / c can overflow. */
|
|
170
|
+
export function emitPowerOfTwoRemainder(host, left, divisor) {
|
|
171
|
+
const magnitude = Math.abs(divisor);
|
|
172
|
+
if (!isPowerOfTwo(magnitude))
|
|
173
|
+
return null;
|
|
174
|
+
const B = host.B;
|
|
175
|
+
const c = f64Lit(magnitude);
|
|
176
|
+
const quotient = B.tmp();
|
|
177
|
+
B.line(`${quotient} = fdiv double ${left.name}, ${c}`);
|
|
178
|
+
const whole = emitTruncF64(host, quotient);
|
|
179
|
+
const multiple = B.tmp(), difference = B.tmp(), zero = B.tmp(), signedZero = B.tmp(), result = B.tmp();
|
|
180
|
+
host.declare("declare double @llvm.copysign.f64(double, double)");
|
|
181
|
+
B.line(`${multiple} = fmul double ${whole}, ${c}`);
|
|
182
|
+
B.line(`${difference} = fsub double ${left.name}, ${multiple}`);
|
|
183
|
+
B.line(`${zero} = fcmp oeq double ${difference}, ${f64Lit(0)}`);
|
|
184
|
+
B.line(`${signedZero} = call double @llvm.copysign.f64(double ${f64Lit(0)}, double ${left.name})`);
|
|
185
|
+
B.line(`${result} = select i1 ${zero}, double ${signedZero}, double ${difference}`);
|
|
186
|
+
return { name: result, type: F64 };
|
|
187
|
+
}
|
|
117
188
|
//# sourceMappingURL=integer-remainder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integer-remainder.js","sourceRoot":"","sources":["../../../src/backend/llvm/integer-remainder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"integer-remainder.js","sourceRoot":"","sources":["../../../src/backend/llvm/integer-remainder.ts"],"names":[],"mappings":"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"}
|