@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,4 +1,5 @@
|
|
|
1
|
-
import { lowerBuiltinByteInput, errorFirstBytesCallback } from "./arguments.js";
|
|
1
|
+
import { lowerBuiltinByteInput, errorFirstBytesCallback, errorFirstCallback } from "./arguments.js";
|
|
2
|
+
import { isKeyObjectValue } from "./key-object.js";
|
|
2
3
|
import { dynUndefinedExpr } from "../../../ir/build.js";
|
|
3
4
|
import * as ts from "../../ts7/adapter.js";
|
|
4
5
|
import { own } from "../lowerer.js";
|
|
@@ -95,7 +96,7 @@ function lowerHashDigestChain(lowerer, call, access) {
|
|
|
95
96
|
const dataNode = updateCall.arguments[0];
|
|
96
97
|
const dataIr = lowerer.mapTypeOf(lowerer.typeOf(dataNode));
|
|
97
98
|
if (dataIr?.kind === "bytes") {
|
|
98
|
-
const data = lowerer.lowerExpr(dataNode);
|
|
99
|
+
const data = cryptoByteView(lowerer, dataNode, lowerer.lowerExpr(dataNode));
|
|
99
100
|
const enc = lowerer.lowerExprExpecting(call.arguments[0], STRING);
|
|
100
101
|
return {
|
|
101
102
|
kind: "libCall",
|
|
@@ -118,19 +119,83 @@ function lowerHashDigestChain(lowerer, call, access) {
|
|
|
118
119
|
}
|
|
119
120
|
return null;
|
|
120
121
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
/** Node's normalizeEncoding(): the canonical name of a Buffer encoding,
|
|
123
|
+
* compared case-insensitively, or undefined for a name Node does not know. */
|
|
124
|
+
function cryptoEncodingName(value) {
|
|
125
|
+
switch (value.toLowerCase()) {
|
|
126
|
+
case "hex":
|
|
127
|
+
return "hex";
|
|
128
|
+
case "base64":
|
|
129
|
+
return "base64";
|
|
130
|
+
case "base64url":
|
|
131
|
+
return "base64url";
|
|
132
|
+
case "":
|
|
133
|
+
case "utf8":
|
|
134
|
+
case "utf-8":
|
|
135
|
+
return "utf8";
|
|
136
|
+
case "latin1":
|
|
137
|
+
case "binary":
|
|
138
|
+
return "latin1";
|
|
139
|
+
case "ascii":
|
|
140
|
+
return "ascii";
|
|
141
|
+
case "utf16le":
|
|
142
|
+
case "utf-16le":
|
|
143
|
+
case "ucs2":
|
|
144
|
+
case "ucs-2":
|
|
145
|
+
return "utf16le";
|
|
146
|
+
default:
|
|
147
|
+
return undefined;
|
|
125
148
|
}
|
|
126
|
-
return lowerer.lowerExprExpecting(node, STRING);
|
|
127
149
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
150
|
+
/** The values of a string literal type or a union of them; undefined when
|
|
151
|
+
* the type allows other values. */
|
|
152
|
+
function stringLiteralValues(type) {
|
|
153
|
+
if (type.isStringLiteralType())
|
|
154
|
+
return [type.value];
|
|
155
|
+
if (!type.isUnionType())
|
|
156
|
+
return undefined;
|
|
157
|
+
const values = [];
|
|
158
|
+
for (const member of ts.constituentTypes(type)) {
|
|
159
|
+
if (!member.isStringLiteralType())
|
|
160
|
+
return undefined;
|
|
161
|
+
values.push(member.value);
|
|
133
162
|
}
|
|
163
|
+
return values;
|
|
164
|
+
}
|
|
165
|
+
/** Whether every value the node's type allows is an encoding that gives a
|
|
166
|
+
* string digest: a Buffer encoding Node knows. Hash.digest() treats ""
|
|
167
|
+
* as no encoding and returns a Buffer; crypto.hash() reads it as UTF-8. */
|
|
168
|
+
function isStringDigestEncoding(lowerer, node, emptyIsString) {
|
|
169
|
+
const values = stringLiteralValues(lowerer.typeOf(node));
|
|
170
|
+
return (!!values &&
|
|
171
|
+
values.every((value) => (value !== "" || emptyIsString) && cryptoEncodingName(value) !== undefined));
|
|
172
|
+
}
|
|
173
|
+
/** Whether every offset/size argument is statically a number; other
|
|
174
|
+
* values take the runtime checks, which throw Node's errors or apply its
|
|
175
|
+
* defaults. */
|
|
176
|
+
function cryptoNumberArgs(lowerer, nodes) {
|
|
177
|
+
return nodes.every((node) => lowerer.mapTypeOf(lowerer.typeOf(node))?.kind === "f64");
|
|
178
|
+
}
|
|
179
|
+
/** A view's bytes as the Uint8Array the byte-input libCalls take: other
|
|
180
|
+
* TypedArrays and DataViews become a u8 view of the same memory. */
|
|
181
|
+
function cryptoByteView(lowerer, node, value) {
|
|
182
|
+
if (value.type.kind !== "bytes" || value.type.elem === "u8")
|
|
183
|
+
return value;
|
|
184
|
+
return {
|
|
185
|
+
kind: "libCall",
|
|
186
|
+
fn: "bytes.bufferSource",
|
|
187
|
+
args: [lowerer.coerceInto(node, value, DYN)],
|
|
188
|
+
type: BYTES_U8,
|
|
189
|
+
loc: locOf(node),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function dynArg(lowerer, node, loc) {
|
|
193
|
+
return node ? lowerer.lowerExprExpecting(node, DYN) : dynUndefinedExpr(loc);
|
|
194
|
+
}
|
|
195
|
+
/** A digest name. The runtime resolves every name and alias Node 24
|
|
196
|
+
* accepts and throws Node's error for the others, so literals are not
|
|
197
|
+
* checked here. */
|
|
198
|
+
function cryptoAlgorithm(lowerer, node) {
|
|
134
199
|
return lowerer.lowerExprExpecting(node, STRING);
|
|
135
200
|
}
|
|
136
201
|
function cryptoKdfInput(lowerer, node) {
|
|
@@ -144,7 +209,7 @@ function cryptoKdfInput(lowerer, node) {
|
|
|
144
209
|
const value = lowerer.coerceInto(node, lowerer.lowerExpr(node), DYN);
|
|
145
210
|
return { kind: "libCall", fn: "bytes.bufferSource", args: [value], type: BYTES_U8, loc };
|
|
146
211
|
}
|
|
147
|
-
lowerer.noLowering("crypto key derivation with this input", node, "strings, Buffers, numeric typed arrays, DataViews, and fixed-length ArrayBuffers are supported; KeyObjects are
|
|
212
|
+
lowerer.noLowering("crypto key derivation with this input", node, "strings, Buffers, numeric typed arrays, DataViews, and fixed-length ArrayBuffers are supported; KeyObjects are accepted only as hkdf's key, as in Node");
|
|
148
213
|
}
|
|
149
214
|
export function lowerCryptoModuleCall(lowerer, expr, bi, loc) {
|
|
150
215
|
if (bi.module !== "crypto")
|
|
@@ -182,7 +247,7 @@ export function lowerCryptoModuleCall(lowerer, expr, bi, loc) {
|
|
|
182
247
|
lowerBuiltinByteInput(lowerer, args[1], locOf(args[1]), "crypto"),
|
|
183
248
|
lowerer.lowerExprExpecting(args[2], F64),
|
|
184
249
|
lowerer.lowerExprExpecting(args[3], F64),
|
|
185
|
-
cryptoAlgorithm(lowerer, args[4]
|
|
250
|
+
cryptoAlgorithm(lowerer, args[4]),
|
|
186
251
|
errorFirstBytesCallback(lowerer, args[5], "crypto"),
|
|
187
252
|
],
|
|
188
253
|
type: VOID,
|
|
@@ -194,8 +259,16 @@ export function lowerCryptoModuleCall(lowerer, expr, bi, loc) {
|
|
|
194
259
|
if (args.length !== (async ? 6 : 5))
|
|
195
260
|
lowerer.noLowering(`crypto.${bi.member} with ${args.length} arguments`, expr);
|
|
196
261
|
const values = [
|
|
197
|
-
cryptoAlgorithm(lowerer, args[0]
|
|
198
|
-
|
|
262
|
+
cryptoAlgorithm(lowerer, args[0]),
|
|
263
|
+
isKeyObjectValue(lowerer, args[1])
|
|
264
|
+
? {
|
|
265
|
+
kind: "libCall",
|
|
266
|
+
fn: "crypto.keyObjectInput",
|
|
267
|
+
args: [lowerer.lowerExprExpecting(args[1], DYN)],
|
|
268
|
+
type: BYTES_U8,
|
|
269
|
+
loc,
|
|
270
|
+
}
|
|
271
|
+
: cryptoKdfInput(lowerer, args[1]),
|
|
199
272
|
cryptoKdfInput(lowerer, args[2]),
|
|
200
273
|
cryptoKdfInput(lowerer, args[3]),
|
|
201
274
|
lowerer.lowerExprExpecting(args[4], F64),
|
|
@@ -235,121 +308,323 @@ export function lowerCryptoModuleCall(lowerer, expr, bi, loc) {
|
|
|
235
308
|
};
|
|
236
309
|
}
|
|
237
310
|
if (bi.member === "createHash") {
|
|
238
|
-
if (args.length
|
|
239
|
-
lowerer.noLowering(`crypto.createHash with ${args.length} arguments`, expr, "createHash(algorithm) is supported
|
|
311
|
+
if (args.length < 1 || args.length > 2 || args.some(ts.isSpreadElement)) {
|
|
312
|
+
lowerer.noLowering(`crypto.createHash with ${args.length} arguments`, expr, "createHash(algorithm[, options]) is supported");
|
|
313
|
+
}
|
|
314
|
+
const algorithm = cryptoAlgorithm(lowerer, args[0]);
|
|
315
|
+
if (args.length === 1) {
|
|
316
|
+
return { kind: "libCall", fn: "crypto.hashNew", args: [algorithm], type: CRYPTOHASH_T, loc };
|
|
240
317
|
}
|
|
241
318
|
return {
|
|
242
319
|
kind: "libCall",
|
|
243
|
-
fn: "crypto.
|
|
244
|
-
args: [
|
|
320
|
+
fn: "crypto.hashNewOpts",
|
|
321
|
+
args: [algorithm, lowerer.lowerExprExpecting(args[1], DYN)],
|
|
245
322
|
type: CRYPTOHASH_T,
|
|
246
323
|
loc,
|
|
247
324
|
};
|
|
248
325
|
}
|
|
249
326
|
if (bi.member === "createHmac") {
|
|
250
|
-
if (args.length
|
|
251
|
-
lowerer.noLowering(`crypto.createHmac with ${args.length} arguments`, expr, "createHmac(algorithm,
|
|
327
|
+
if (args.length < 2 || args.length > 3 || args.some(ts.isSpreadElement)) {
|
|
328
|
+
lowerer.noLowering(`crypto.createHmac with ${args.length} arguments`, expr, "createHmac(algorithm, key[, options]) is supported");
|
|
252
329
|
}
|
|
253
|
-
const algorithm = cryptoAlgorithm(lowerer, args[0]
|
|
330
|
+
const algorithm = cryptoAlgorithm(lowerer, args[0]);
|
|
254
331
|
const key = lowerer.lowerExpr(args[1]);
|
|
255
|
-
if (key.type.kind
|
|
332
|
+
if (args.length === 3 || (key.type.kind !== "string" && key.type.kind !== "bytes")) {
|
|
333
|
+
// Views, ArrayBuffers, options.encoding and values of other types
|
|
334
|
+
// take Node's prepareSecretKey checks at run time.
|
|
256
335
|
return {
|
|
257
336
|
kind: "libCall",
|
|
258
|
-
fn: "crypto.
|
|
259
|
-
args: [algorithm, key],
|
|
337
|
+
fn: "crypto.hmacNewDyn",
|
|
338
|
+
args: [algorithm, lowerer.coerceInto(args[1], key, DYN), dynArg(lowerer, args[2], loc)],
|
|
260
339
|
type: CRYPTOHMAC_T,
|
|
261
340
|
loc,
|
|
262
341
|
};
|
|
263
342
|
}
|
|
264
|
-
if (key.type.kind === "
|
|
343
|
+
if (key.type.kind === "string") {
|
|
265
344
|
return {
|
|
266
345
|
kind: "libCall",
|
|
267
|
-
fn: "crypto.
|
|
346
|
+
fn: "crypto.hmacNewStr",
|
|
268
347
|
args: [algorithm, key],
|
|
269
348
|
type: CRYPTOHMAC_T,
|
|
270
349
|
loc,
|
|
271
350
|
};
|
|
272
351
|
}
|
|
273
|
-
|
|
352
|
+
return {
|
|
353
|
+
kind: "libCall",
|
|
354
|
+
fn: "crypto.hmacNewBytes",
|
|
355
|
+
args: [algorithm, cryptoByteView(lowerer, args[1], key)],
|
|
356
|
+
type: CRYPTOHMAC_T,
|
|
357
|
+
loc,
|
|
358
|
+
};
|
|
274
359
|
}
|
|
275
360
|
if (bi.member === "hash") {
|
|
276
|
-
if (args.length < 2 || args.length > 3) {
|
|
277
|
-
lowerer.noLowering(`crypto.hash with ${args.length} arguments`, expr,
|
|
361
|
+
if (args.length < 2 || args.length > 3 || args.some(ts.isSpreadElement)) {
|
|
362
|
+
lowerer.noLowering(`crypto.hash with ${args.length} arguments`, expr, "hash(algorithm, data[, outputEncodingOrOptions]) is supported");
|
|
278
363
|
}
|
|
279
|
-
const algorithm = cryptoAlgorithm(lowerer, args[0]
|
|
364
|
+
const algorithm = cryptoAlgorithm(lowerer, args[0]);
|
|
280
365
|
const data = lowerer.lowerExpr(args[1]);
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
if (
|
|
366
|
+
let options = args[2];
|
|
367
|
+
// An options literal holding only a literal string-digest
|
|
368
|
+
// outputEncoding is that encoding; evaluating it observes nothing.
|
|
369
|
+
if (options && ts.isObjectLiteralExpression(options) && options.properties.length === 1) {
|
|
370
|
+
const property = options.properties[0];
|
|
371
|
+
if (ts.isPropertyAssignment(property) &&
|
|
372
|
+
ts.isIdentifier(property.name) &&
|
|
373
|
+
property.name.text === "outputEncoding" &&
|
|
374
|
+
ts.isStringLiteral(property.initializer) &&
|
|
375
|
+
isStringDigestEncoding(lowerer, property.initializer, true)) {
|
|
376
|
+
options = property.initializer;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// String data or a view with no options or a string-digest encoding
|
|
380
|
+
// has a string result; every other form takes Node's checks at run
|
|
381
|
+
// time and returns the string or Buffer it produces.
|
|
382
|
+
if ((data.type.kind === "string" || data.type.kind === "bytes") &&
|
|
383
|
+
(options === undefined || isStringDigestEncoding(lowerer, options, true))) {
|
|
384
|
+
const encoding = options
|
|
385
|
+
? lowerer.lowerExprExpecting(options, STRING)
|
|
386
|
+
: { kind: "strLit", value: "hex", type: STRING, loc };
|
|
285
387
|
return {
|
|
286
388
|
kind: "libCall",
|
|
287
|
-
fn: "crypto.hashDigestStr",
|
|
288
|
-
args: [algorithm, data, encoding],
|
|
389
|
+
fn: data.type.kind === "string" ? "crypto.hashDigestStr" : "crypto.hashDigestBytes",
|
|
390
|
+
args: [algorithm, cryptoByteView(lowerer, args[1], data), encoding],
|
|
289
391
|
type: STRING,
|
|
290
392
|
loc,
|
|
291
393
|
};
|
|
292
394
|
}
|
|
293
|
-
|
|
395
|
+
return {
|
|
396
|
+
kind: "libCall",
|
|
397
|
+
fn: "crypto.hashOneshot",
|
|
398
|
+
args: [algorithm, lowerer.coerceInto(args[1], data, DYN), dynArg(lowerer, options, loc)],
|
|
399
|
+
type: DYN,
|
|
400
|
+
loc,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
if (bi.member === "timingSafeEqual") {
|
|
404
|
+
if (args.length < 1 || args.length > 2 || args.some(ts.isSpreadElement))
|
|
405
|
+
lowerer.noLowering(`crypto.timingSafeEqual with ${args.length} arguments`, expr);
|
|
406
|
+
const left = lowerer.lowerExpr(args[0]);
|
|
407
|
+
const right = args[1] ? lowerer.lowerExpr(args[1]) : undefined;
|
|
408
|
+
// Views of every element kind compare their bytes; ArrayBuffers and
|
|
409
|
+
// other values take Node's checks at run time.
|
|
410
|
+
if (left.type.kind === "bytes" && right?.type.kind === "bytes") {
|
|
294
411
|
return {
|
|
295
412
|
kind: "libCall",
|
|
296
|
-
fn: "crypto.
|
|
297
|
-
args: [
|
|
298
|
-
type:
|
|
413
|
+
fn: "crypto.timingSafeEqual",
|
|
414
|
+
args: [left, right],
|
|
415
|
+
type: BOOL,
|
|
299
416
|
loc,
|
|
300
417
|
};
|
|
301
418
|
}
|
|
302
|
-
lowerer.noLowering(`crypto.hash of '${lowerer.fmt(data.type)}' data`, args[1], "string and Buffer/Uint8Array data are supported");
|
|
303
|
-
}
|
|
304
|
-
if (bi.member === "timingSafeEqual") {
|
|
305
|
-
if (args.length !== 2)
|
|
306
|
-
lowerer.noLowering(`crypto.timingSafeEqual with ${args.length} arguments`, expr);
|
|
307
419
|
return {
|
|
308
420
|
kind: "libCall",
|
|
309
|
-
fn: "crypto.
|
|
421
|
+
fn: "crypto.timingSafeEqualDyn",
|
|
310
422
|
args: [
|
|
311
|
-
lowerer.
|
|
312
|
-
lowerer.
|
|
423
|
+
lowerer.coerceInto(args[0], left, DYN),
|
|
424
|
+
right ? lowerer.coerceInto(args[1], right, DYN) : dynUndefinedExpr(loc),
|
|
313
425
|
],
|
|
314
426
|
type: BOOL,
|
|
315
427
|
loc,
|
|
316
428
|
};
|
|
317
429
|
}
|
|
318
430
|
if (bi.member === "randomFillSync") {
|
|
319
|
-
if (args.length < 1 || args.length > 3) {
|
|
431
|
+
if (args.length < 1 || args.length > 3 || args.some(ts.isSpreadElement)) {
|
|
320
432
|
lowerer.noLowering(`crypto.randomFillSync with ${args.length} arguments`, expr, "randomFillSync(buffer[, offset[, size]]) is supported");
|
|
321
433
|
}
|
|
322
|
-
const buffer = lowerer.
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
434
|
+
const buffer = lowerer.lowerExpr(args[0]);
|
|
435
|
+
if (buffer.type.kind === "bytes" && cryptoNumberArgs(lowerer, args.slice(1))) {
|
|
436
|
+
// A view returns itself, at its own type.
|
|
437
|
+
const offset = args[1]
|
|
438
|
+
? lowerer.lowerExprExpecting(args[1], F64)
|
|
439
|
+
: { kind: "numLit", value: 0, type: F64, loc };
|
|
440
|
+
if (args[2]) {
|
|
441
|
+
return {
|
|
442
|
+
kind: "libCall",
|
|
443
|
+
fn: "crypto.randomFillView",
|
|
444
|
+
args: [buffer, offset, lowerer.lowerExprExpecting(args[2], F64)],
|
|
445
|
+
type: buffer.type,
|
|
446
|
+
loc,
|
|
447
|
+
};
|
|
448
|
+
}
|
|
328
449
|
return {
|
|
329
450
|
kind: "libCall",
|
|
330
|
-
fn: "crypto.
|
|
331
|
-
args: [buffer, offset
|
|
332
|
-
type:
|
|
451
|
+
fn: "crypto.randomFillViewRest",
|
|
452
|
+
args: [buffer, offset],
|
|
453
|
+
type: buffer.type,
|
|
333
454
|
loc,
|
|
334
455
|
};
|
|
335
456
|
}
|
|
457
|
+
// ArrayBuffers and other values take Node's checks at run time.
|
|
336
458
|
return {
|
|
337
459
|
kind: "libCall",
|
|
338
|
-
fn: "crypto.
|
|
339
|
-
args: [
|
|
340
|
-
|
|
460
|
+
fn: "crypto.randomFillSyncDyn",
|
|
461
|
+
args: [
|
|
462
|
+
lowerer.coerceInto(args[0], buffer, DYN),
|
|
463
|
+
dynArg(lowerer, args[1], loc),
|
|
464
|
+
dynArg(lowerer, args[2], loc),
|
|
465
|
+
],
|
|
466
|
+
type: DYN,
|
|
467
|
+
loc,
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
if (bi.member === "randomFill") {
|
|
471
|
+
if (args.length < 2 || args.length > 4 || args.some(ts.isSpreadElement)) {
|
|
472
|
+
lowerer.noLowering(`crypto.randomFill with ${args.length} arguments`, expr, "randomFill(buffer[, offset[, size]], callback) is supported");
|
|
473
|
+
}
|
|
474
|
+
const form = { kind: "numLit", value: args.length - 1, type: F64, loc };
|
|
475
|
+
const buffer = lowerer.lowerExpr(args[0]);
|
|
476
|
+
if (buffer.type.kind === "bytes" && cryptoNumberArgs(lowerer, args.slice(1, -1))) {
|
|
477
|
+
const view = buffer.type;
|
|
478
|
+
const offset = args.length >= 3
|
|
479
|
+
? lowerer.lowerExprExpecting(args[1], F64)
|
|
480
|
+
: { kind: "numLit", value: 0, type: F64, loc };
|
|
481
|
+
const size = args.length === 4
|
|
482
|
+
? lowerer.lowerExprExpecting(args[2], F64)
|
|
483
|
+
: { kind: "numLit", value: 0, type: F64, loc };
|
|
484
|
+
const callback = errorFirstCallback(lowerer, args[args.length - 1], "crypto.randomFill", (value) => value.kind === "bytes" && value.elem === view.elem, "the buffer's own view");
|
|
485
|
+
return {
|
|
486
|
+
kind: "libCall",
|
|
487
|
+
fn: "crypto.randomFillCb",
|
|
488
|
+
args: [buffer, offset, size, form, callback],
|
|
489
|
+
type: VOID,
|
|
490
|
+
loc,
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
const callback = errorFirstCallback(lowerer, args[args.length - 1], "crypto.randomFill", () => false, "unknown-typed");
|
|
494
|
+
return {
|
|
495
|
+
kind: "libCall",
|
|
496
|
+
fn: "crypto.randomFillCbDyn",
|
|
497
|
+
args: [
|
|
498
|
+
lowerer.coerceInto(args[0], buffer, DYN),
|
|
499
|
+
args.length >= 3 ? lowerer.lowerExprExpecting(args[1], DYN) : dynUndefinedExpr(loc),
|
|
500
|
+
args.length === 4 ? lowerer.lowerExprExpecting(args[2], DYN) : dynUndefinedExpr(loc),
|
|
501
|
+
form,
|
|
502
|
+
callback,
|
|
503
|
+
],
|
|
504
|
+
type: VOID,
|
|
341
505
|
loc,
|
|
342
506
|
};
|
|
343
507
|
}
|
|
344
508
|
if (bi.member === "randomInt") {
|
|
345
|
-
if (args.length
|
|
346
|
-
lowerer.noLowering(`crypto.randomInt with ${args.length} arguments`, expr, "
|
|
509
|
+
if (args.length < 1 || args.length > 3 || args.some(ts.isSpreadElement)) {
|
|
510
|
+
lowerer.noLowering(`crypto.randomInt with ${args.length} arguments`, expr, "randomInt([min, ]max[, callback]) is supported");
|
|
347
511
|
}
|
|
348
|
-
const
|
|
512
|
+
const last = args[args.length - 1];
|
|
513
|
+
const lastType = lowerer.mapTypeOf(lowerer.typeOf(last));
|
|
514
|
+
const withCallback = args.length === 3 || (args.length === 2 && lastType?.kind === "func");
|
|
515
|
+
const numbers = withCallback ? args.slice(0, -1) : args;
|
|
516
|
+
const min = numbers.length === 1
|
|
349
517
|
? { kind: "numLit", value: 0, type: F64, loc }
|
|
350
|
-
: lowerer.lowerExprExpecting(
|
|
351
|
-
const max = lowerer.lowerExprExpecting(
|
|
352
|
-
|
|
518
|
+
: lowerer.lowerExprExpecting(numbers[0], F64);
|
|
519
|
+
const max = lowerer.lowerExprExpecting(numbers[numbers.length - 1], F64);
|
|
520
|
+
if (!withCallback) {
|
|
521
|
+
if (numbers.length === 1)
|
|
522
|
+
return { kind: "libCall", fn: "crypto.randomIntMax", args: [max], type: F64, loc };
|
|
523
|
+
return { kind: "libCall", fn: "crypto.randomInt", args: [min, max], type: F64, loc };
|
|
524
|
+
}
|
|
525
|
+
const callback = errorFirstCallback(lowerer, last, "crypto.randomInt", (value) => value.kind === "f64", "number");
|
|
526
|
+
const minGiven = {
|
|
527
|
+
kind: "numLit",
|
|
528
|
+
value: numbers.length === 2 ? 1 : 0,
|
|
529
|
+
type: F64,
|
|
530
|
+
loc,
|
|
531
|
+
};
|
|
532
|
+
return {
|
|
533
|
+
kind: "libCall",
|
|
534
|
+
fn: "crypto.randomIntCb",
|
|
535
|
+
args: [min, max, minGiven, callback],
|
|
536
|
+
type: VOID,
|
|
537
|
+
loc,
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
if (bi.member === "randomUUID" && args.length > 0) {
|
|
541
|
+
if (args.length > 1 || args.some(ts.isSpreadElement))
|
|
542
|
+
lowerer.noLowering(`crypto.randomUUID with ${args.length} arguments`, expr, "randomUUID([options]) is supported");
|
|
543
|
+
return {
|
|
544
|
+
kind: "libCall",
|
|
545
|
+
fn: "crypto.randomUUIDOpts",
|
|
546
|
+
args: [dynArg(lowerer, args[0], loc)],
|
|
547
|
+
type: STRING,
|
|
548
|
+
loc,
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
if (bi.member === "createSecretKey") {
|
|
552
|
+
if (args.length < 1 || args.length > 2 || args.some(ts.isSpreadElement))
|
|
553
|
+
lowerer.noLowering(`crypto.createSecretKey with ${args.length} arguments`, expr, "createSecretKey(key[, encoding]) is supported");
|
|
554
|
+
return {
|
|
555
|
+
kind: "libCall",
|
|
556
|
+
fn: "crypto.createSecretKey",
|
|
557
|
+
args: [lowerer.lowerExprExpecting(args[0], DYN), dynArg(lowerer, args[1], loc)],
|
|
558
|
+
type: DYN,
|
|
559
|
+
loc,
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
if (bi.member === "generateKeySync") {
|
|
563
|
+
if (args.length < 1 || args.length > 2 || args.some(ts.isSpreadElement))
|
|
564
|
+
lowerer.noLowering(`crypto.generateKeySync with ${args.length} arguments`, expr, "generateKeySync(type, options) is supported");
|
|
565
|
+
return {
|
|
566
|
+
kind: "libCall",
|
|
567
|
+
fn: "crypto.generateKeySync",
|
|
568
|
+
args: [lowerer.lowerExprExpecting(args[0], DYN), dynArg(lowerer, args[1], loc)],
|
|
569
|
+
type: DYN,
|
|
570
|
+
loc,
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
if (bi.member === "generateKey") {
|
|
574
|
+
if (args.length < 1 || args.length > 3 || args.some(ts.isSpreadElement))
|
|
575
|
+
lowerer.noLowering(`crypto.generateKey with ${args.length} arguments`, expr, "generateKey(type, options, callback) is supported");
|
|
576
|
+
const isFunction = (node) => !!node && lowerer.mapTypeOf(lowerer.typeOf(node))?.kind === "func";
|
|
577
|
+
// Node takes a function in the options position as the callback, and
|
|
578
|
+
// checks the callback before the type and options.
|
|
579
|
+
const optionsNode = args.length === 2 && isFunction(args[1]) ? undefined : args[1];
|
|
580
|
+
const callbackNode = args.length === 2 && isFunction(args[1]) ? args[1] : args[2];
|
|
581
|
+
const callbackType = callbackNode ? lowerer.mapTypeOf(lowerer.typeOf(callbackNode)) : undefined;
|
|
582
|
+
const type = lowerer.lowerExprExpecting(args[0], DYN);
|
|
583
|
+
const options = dynArg(lowerer, optionsNode, loc);
|
|
584
|
+
if (callbackType?.kind !== "func" && callbackType?.kind !== "dyn") {
|
|
585
|
+
const got = callbackNode
|
|
586
|
+
? lowerer.lowerExprExpecting(callbackNode, DYN)
|
|
587
|
+
: dynUndefinedExpr(loc);
|
|
588
|
+
return {
|
|
589
|
+
kind: "seqExpr",
|
|
590
|
+
stmts: [
|
|
591
|
+
{ kind: "exprStmt", expr: type, loc },
|
|
592
|
+
{ kind: "exprStmt", expr: options, loc },
|
|
593
|
+
],
|
|
594
|
+
result: {
|
|
595
|
+
kind: "libCall",
|
|
596
|
+
fn: "error.argTypeThrow",
|
|
597
|
+
args: [
|
|
598
|
+
{ kind: "strLit", value: "callback", type: STRING, loc },
|
|
599
|
+
{ kind: "strLit", value: "of type function", type: STRING, loc },
|
|
600
|
+
got,
|
|
601
|
+
],
|
|
602
|
+
type: VOID,
|
|
603
|
+
loc,
|
|
604
|
+
},
|
|
605
|
+
type: VOID,
|
|
606
|
+
loc,
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
const callback = errorFirstCallback(lowerer, callbackNode, "crypto.generateKey", () => false, "KeyObject");
|
|
610
|
+
return {
|
|
611
|
+
kind: "libCall",
|
|
612
|
+
fn: "crypto.generateKeyCb",
|
|
613
|
+
args: [type, options, callback],
|
|
614
|
+
type: VOID,
|
|
615
|
+
loc,
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
if (bi.member === "randomUUIDv7") {
|
|
619
|
+
if (args.length > 1 || args.some(ts.isSpreadElement))
|
|
620
|
+
lowerer.noLowering(`crypto.randomUUIDv7 with ${args.length} arguments`, expr, "randomUUIDv7([options]) is supported");
|
|
621
|
+
return {
|
|
622
|
+
kind: "libCall",
|
|
623
|
+
fn: "crypto.randomUUIDv7",
|
|
624
|
+
args: [dynArg(lowerer, args[0], loc)],
|
|
625
|
+
type: STRING,
|
|
626
|
+
loc,
|
|
627
|
+
};
|
|
353
628
|
}
|
|
354
629
|
if (bi.member === "pbkdf2Sync") {
|
|
355
630
|
if (args.length !== 5) {
|
|
@@ -365,7 +640,7 @@ export function lowerCryptoModuleCall(lowerer, expr, bi, loc) {
|
|
|
365
640
|
salt,
|
|
366
641
|
lowerer.lowerExprExpecting(args[2], F64),
|
|
367
642
|
lowerer.lowerExprExpecting(args[3], F64),
|
|
368
|
-
cryptoAlgorithm(lowerer, args[4]
|
|
643
|
+
cryptoAlgorithm(lowerer, args[4]),
|
|
369
644
|
],
|
|
370
645
|
type: BYTES_U8,
|
|
371
646
|
loc,
|
|
@@ -406,106 +681,126 @@ export function lowerCryptoHashMethodCall(lowerer, call, access) {
|
|
|
406
681
|
const name = access.name.text;
|
|
407
682
|
const loc = locOf(call);
|
|
408
683
|
const receiver = () => lowerer.lowerExprExpecting(access.expression, receiverType);
|
|
684
|
+
const hash = receiverType.kind === "cryptoHash";
|
|
685
|
+
const label = hash ? "Hash" : "Hmac";
|
|
686
|
+
if (call.arguments.some(ts.isSpreadElement))
|
|
687
|
+
lowerer.noLowering(`${label}.${name} with spread arguments`, call);
|
|
409
688
|
if (name === "update") {
|
|
410
|
-
if (call.arguments.length < 1 ||
|
|
411
|
-
call.arguments.length
|
|
412
|
-
call.arguments.some(ts.isSpreadElement)) {
|
|
413
|
-
lowerer.noLowering(`${receiverType.kind === "cryptoHash" ? "Hash" : "Hmac"}.update with ${call.arguments.length} arguments`, call, "update(stringOrBuffer[, inputEncoding]) is supported");
|
|
689
|
+
if (call.arguments.length < 1 || call.arguments.length > 2) {
|
|
690
|
+
lowerer.noLowering(`${label}.update with ${call.arguments.length} arguments`, call, "update(data[, inputEncoding]) is supported");
|
|
414
691
|
}
|
|
692
|
+
const target = receiver();
|
|
415
693
|
const dataNode = call.arguments[0];
|
|
694
|
+
const encodingNode = call.arguments[1];
|
|
416
695
|
const dataType = lowerer.mapTypeOf(lowerer.typeOf(dataNode));
|
|
417
696
|
// Indexed reads can retain optional storage after a nullish fallback
|
|
418
697
|
// or narrowing. Use the proven argument type through a checked coercion.
|
|
419
698
|
const data = dataType?.kind === "string" || dataType?.kind === "bytes"
|
|
420
699
|
? lowerer.lowerExprExpecting(dataNode, dataType)
|
|
421
700
|
: lowerer.lowerExpr(dataNode);
|
|
422
|
-
const prefix =
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
lowerer.noLowering("Hash/Hmac.update with an encoding for Buffer data", call.arguments[1], "input encodings apply only to string data");
|
|
426
|
-
}
|
|
701
|
+
const prefix = hash ? "crypto.hashUpdate" : "crypto.hmacUpdate";
|
|
702
|
+
const encodingType = encodingNode ? lowerer.mapTypeOf(lowerer.typeOf(encodingNode)) : undefined;
|
|
703
|
+
if (data.type.kind === "bytes" && encodingNode === undefined) {
|
|
427
704
|
return {
|
|
428
705
|
kind: "libCall",
|
|
429
706
|
fn: `${prefix}Bytes`,
|
|
430
|
-
args: [
|
|
707
|
+
args: [target, cryptoByteView(lowerer, dataNode, data)],
|
|
431
708
|
type: receiverType,
|
|
432
709
|
loc,
|
|
433
710
|
};
|
|
434
711
|
}
|
|
435
712
|
if (data.type.kind === "string") {
|
|
436
|
-
const
|
|
437
|
-
|
|
713
|
+
const literal = encodingNode ? stringLiteralValues(lowerer.typeOf(encodingNode)) : undefined;
|
|
714
|
+
const utf8 = encodingNode === undefined ||
|
|
715
|
+
(literal?.length === 1 && cryptoEncodingName(literal[0]) === "utf8");
|
|
716
|
+
if (utf8) {
|
|
717
|
+
if (encodingNode)
|
|
718
|
+
lowerer.lowerExprExpecting(encodingNode, STRING);
|
|
438
719
|
return {
|
|
439
720
|
kind: "libCall",
|
|
440
721
|
fn: `${prefix}Str`,
|
|
441
|
-
args: [
|
|
722
|
+
args: [target, data],
|
|
442
723
|
type: receiverType,
|
|
443
724
|
loc,
|
|
444
725
|
};
|
|
445
726
|
}
|
|
446
|
-
|
|
447
|
-
if (!encodingType.isStringLiteralType() ||
|
|
448
|
-
!["utf8", "utf-8", "hex", "base64"].includes(encodingType.value)) {
|
|
449
|
-
lowerer.noLowering("Hash/Hmac.update with this input encoding", encodingNode, "utf8, hex, and base64 string inputs are supported");
|
|
450
|
-
}
|
|
451
|
-
if (encodingType.value === "utf8" || encodingType.value === "utf-8") {
|
|
452
|
-
lowerer.lowerExprExpecting(encodingNode, STRING);
|
|
727
|
+
if (encodingType?.kind === "string") {
|
|
453
728
|
return {
|
|
454
729
|
kind: "libCall",
|
|
455
|
-
fn: `${prefix}
|
|
456
|
-
args: [
|
|
730
|
+
fn: `${prefix}Enc`,
|
|
731
|
+
args: [target, data, lowerer.lowerExprExpecting(encodingNode, STRING)],
|
|
457
732
|
type: receiverType,
|
|
458
733
|
loc,
|
|
459
734
|
};
|
|
460
735
|
}
|
|
461
|
-
|
|
736
|
+
}
|
|
737
|
+
// Other data and encodings take Node's checks at run time: views and
|
|
738
|
+
// strings hash, anything else throws ERR_INVALID_ARG_TYPE.
|
|
739
|
+
return {
|
|
740
|
+
kind: "libCall",
|
|
741
|
+
fn: `${prefix}Dyn`,
|
|
742
|
+
args: [target, lowerer.coerceInto(dataNode, data, DYN), dynArg(lowerer, encodingNode, loc)],
|
|
743
|
+
type: receiverType,
|
|
744
|
+
loc,
|
|
745
|
+
};
|
|
746
|
+
}
|
|
747
|
+
if (name === "digest") {
|
|
748
|
+
if (call.arguments.length > 1) {
|
|
749
|
+
lowerer.noLowering(`${label}.digest with ${call.arguments.length} arguments`, call, "digest([outputEncoding]) is supported");
|
|
750
|
+
}
|
|
751
|
+
const encodingNode = call.arguments[0];
|
|
752
|
+
if (encodingNode === undefined) {
|
|
753
|
+
return {
|
|
462
754
|
kind: "libCall",
|
|
463
|
-
fn: "
|
|
464
|
-
args: [
|
|
755
|
+
fn: hash ? "crypto.hashDigestBuffer" : "crypto.hmacDigestBuffer",
|
|
756
|
+
args: [receiver()],
|
|
465
757
|
type: BYTES_U8,
|
|
466
758
|
loc,
|
|
467
759
|
};
|
|
760
|
+
}
|
|
761
|
+
if (isStringDigestEncoding(lowerer, encodingNode, false)) {
|
|
468
762
|
return {
|
|
469
763
|
kind: "libCall",
|
|
470
|
-
fn:
|
|
471
|
-
args: [receiver(),
|
|
472
|
-
type:
|
|
764
|
+
fn: hash ? "crypto.hashDigestString" : "crypto.hmacDigestString",
|
|
765
|
+
args: [receiver(), lowerer.lowerExprExpecting(encodingNode, STRING)],
|
|
766
|
+
type: STRING,
|
|
473
767
|
loc,
|
|
474
768
|
};
|
|
475
769
|
}
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
770
|
+
// Node returns a Buffer for a falsy or unknown encoding. A literal
|
|
771
|
+
// whose Buffer result the declared string type cannot hold is refused.
|
|
772
|
+
const literal = stringLiteralValues(lowerer.typeOf(encodingNode));
|
|
773
|
+
const declared = lowerer.mapTypeOf(lowerer.typeOf(call));
|
|
774
|
+
if (literal && declared?.kind === "string") {
|
|
775
|
+
lowerer.noLowering(`${label}.digest with encoding '${literal.join("' | '")}'`, encodingNode, "Node returns a Buffer for this encoding, and the call's declared type is string");
|
|
481
776
|
}
|
|
482
|
-
|
|
777
|
+
return {
|
|
778
|
+
kind: "libCall",
|
|
779
|
+
fn: hash ? "crypto.hashDigestDyn" : "crypto.hmacDigestDyn",
|
|
780
|
+
args: [receiver(), lowerer.lowerExprExpecting(encodingNode, DYN)],
|
|
781
|
+
type: DYN,
|
|
782
|
+
loc,
|
|
783
|
+
};
|
|
784
|
+
}
|
|
785
|
+
if (name === "copy" && hash) {
|
|
786
|
+
if (call.arguments.length > 1)
|
|
787
|
+
lowerer.noLowering(`Hash.copy with ${call.arguments.length} arguments`, call, "copy([options]) is supported");
|
|
788
|
+
if (call.arguments.length === 0)
|
|
483
789
|
return {
|
|
484
790
|
kind: "libCall",
|
|
485
|
-
fn:
|
|
486
|
-
? "crypto.hashDigestBuffer"
|
|
487
|
-
: "crypto.hmacDigestBuffer",
|
|
791
|
+
fn: "crypto.hashCopy",
|
|
488
792
|
args: [receiver()],
|
|
489
|
-
type:
|
|
793
|
+
type: CRYPTOHASH_T,
|
|
490
794
|
loc,
|
|
491
795
|
};
|
|
492
|
-
}
|
|
493
796
|
return {
|
|
494
797
|
kind: "libCall",
|
|
495
|
-
fn:
|
|
496
|
-
args: [
|
|
497
|
-
|
|
498
|
-
cryptoEncoding(lowerer, call.arguments[0], `${receiverType.kind === "cryptoHash" ? "Hash" : "Hmac"}.digest`),
|
|
499
|
-
],
|
|
500
|
-
type: STRING,
|
|
798
|
+
fn: "crypto.hashCopyOpts",
|
|
799
|
+
args: [receiver(), lowerer.lowerExprExpecting(call.arguments[0], DYN)],
|
|
800
|
+
type: CRYPTOHASH_T,
|
|
501
801
|
loc,
|
|
502
802
|
};
|
|
503
803
|
}
|
|
504
|
-
if (name === "copy" && receiverType.kind === "cryptoHash") {
|
|
505
|
-
if (call.arguments.length !== 0)
|
|
506
|
-
lowerer.noLowering(`Hash.copy with ${call.arguments.length} arguments`, call, "copy() without options is supported");
|
|
507
|
-
return { kind: "libCall", fn: "crypto.hashCopy", args: [receiver()], type: CRYPTOHASH_T, loc };
|
|
508
|
-
}
|
|
509
804
|
lowerer.noLowering(`${receiverType.kind === "cryptoHash" ? "Hash" : "Hmac"}.${name}`, call, receiverType.kind === "cryptoHash"
|
|
510
805
|
? "update(), digest(), and copy() are supported"
|
|
511
806
|
: "update() and digest() are supported", lowerer.checker.getSymbolAtLocation(access.name));
|