@scriptc/compiler 0.4.0 → 0.4.1
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 +35 -5
- package/dist/backend/executable-features.js +7 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/library-pack.js +3 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/link-plan-core.d.ts +2 -0
- package/dist/backend/link-plan-core.js +2 -0
- package/dist/backend/link-plan-core.js.map +1 -1
- package/dist/backend/link-plan.d.ts +1 -0
- package/dist/backend/link-plan.js +1 -0
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/array-search.js +3 -1
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +27 -1
- package/dist/backend/llvm/classes.js +115 -22
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +21 -9
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +21 -3
- package/dist/backend/llvm/common.js +50 -3
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +3 -1
- package/dist/backend/llvm/dense-array-access.js +61 -38
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +4 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.js +3 -3
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +9 -0
- package/dist/backend/llvm/dyn.js +62 -6
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +5 -2
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-module.js +54 -32
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +3 -2
- package/dist/backend/llvm/emit-statements.js +90 -13
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +20 -9
- package/dist/backend/llvm/emitter.js +42 -31
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +17 -4
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +6 -9
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +46 -4
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +3 -3
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +55 -0
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +11 -15
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/integer-clones.js +3 -3
- package/dist/backend/llvm/integer-clones.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +18 -0
- package/dist/backend/llvm/js-ic.js +712 -0
- package/dist/backend/llvm/js-ic.js.map +1 -0
- package/dist/backend/llvm/jsval.js +139 -11
- package/dist/backend/llvm/jsval.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +4 -3
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +22 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +40 -31
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +20 -4
- package/dist/backend/llvm/map-number-lookup.js +43 -7
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/narrow-guards.js +64 -0
- package/dist/backend/llvm/narrow-guards.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +3 -0
- package/dist/backend/llvm/publish.js +36 -17
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/regions.js +2 -2
- package/dist/backend/llvm/regions.js.map +1 -1
- package/dist/backend/llvm/regions.test.js +7 -1
- package/dist/backend/llvm/regions.test.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +8 -2
- package/dist/backend/llvm/shapes.js +9 -7
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +20 -1
- package/dist/backend/llvm/speculative-integers.js +94 -6
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.test.js +55 -1
- package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +1 -1
- package/dist/backend/llvm/string-reads.js +4 -4
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/thread-slots.test.js +5 -4
- package/dist/backend/llvm/thread-slots.test.js.map +1 -1
- package/dist/backend/mangle.d.ts +5 -0
- package/dist/backend/mangle.js +7 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +20 -0
- package/dist/backend/native/executable.js +20 -3
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +2 -1
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +6 -0
- package/dist/backend/native-codegen.js +19 -0
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +27 -0
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +18 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-profile.d.ts +32 -0
- package/dist/backend/native-profile.js +39 -0
- package/dist/backend/native-profile.js.map +1 -0
- package/dist/backend/native-profile.test.d.ts +1 -0
- package/dist/backend/native-profile.test.js +58 -0
- package/dist/backend/native-profile.test.js.map +1 -0
- package/dist/backend/native-tools.d.ts +14 -0
- package/dist/backend/native-tools.js +13 -0
- package/dist/backend/native-tools.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 +4 -0
- package/dist/backend/runtime-pack-core.js +4 -0
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +4 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +4 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.js +7 -0
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +3 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +63 -1
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/host.d.ts +3 -0
- package/dist/cli/output-options.d.ts +2 -0
- package/dist/cli/output-options.js +9 -0
- package/dist/cli/output-options.js.map +1 -1
- package/dist/cli/usage.d.ts +11 -1
- package/dist/cli/usage.js +23 -0
- package/dist/cli/usage.js.map +1 -1
- package/dist/compile-types.d.ts +9 -0
- package/dist/contracts/check.js +1 -2
- package/dist/contracts/check.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +10 -0
- package/dist/executable/executable-cache.js +6 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +5 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/arguments-usage.d.ts +8 -0
- package/dist/frontend/arguments-usage.js +98 -0
- package/dist/frontend/arguments-usage.js.map +1 -1
- package/dist/frontend/arguments-usage.test.d.ts +1 -0
- package/dist/frontend/arguments-usage.test.js +32 -0
- package/dist/frontend/arguments-usage.test.js.map +1 -0
- package/dist/frontend/builtin-package-aliases.d.ts +24 -0
- package/dist/frontend/builtin-package-aliases.js +133 -0
- package/dist/frontend/builtin-package-aliases.js.map +1 -0
- package/dist/frontend/builtin-package-aliases.test.d.ts +1 -0
- package/dist/frontend/builtin-package-aliases.test.js +48 -0
- package/dist/frontend/builtin-package-aliases.test.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +4 -0
- package/dist/frontend/dts-paths.js +9 -1
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +8 -0
- package/dist/frontend/lowering/builtins/builtin-class-dyn.js +50 -1
- package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -1
- package/dist/frontend/lowering/builtins/callable-aliases.js +3 -2
- package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +3 -0
- package/dist/frontend/lowering/builtins/crypto.js +4 -1
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/ecdh.d.ts +10 -0
- package/dist/frontend/lowering/builtins/ecdh.js +208 -0
- package/dist/frontend/lowering/builtins/ecdh.js.map +1 -0
- package/dist/frontend/lowering/builtins/json.js +52 -0
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +9 -0
- package/dist/frontend/lowering/builtins/process.js +44 -0
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promisify-callback.d.ts +3 -0
- package/dist/frontend/lowering/builtins/promisify-callback.js +21 -3
- package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
- package/dist/frontend/lowering/builtins/reflection.js +26 -0
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.js +5 -1
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/builtins/typed-array-members.d.ts +7 -0
- package/dist/frontend/lowering/builtins/typed-array-members.js +160 -0
- package/dist/frontend/lowering/builtins/typed-array-members.js.map +1 -0
- package/dist/frontend/lowering/call-signatures.d.ts +4 -0
- package/dist/frontend/lowering/call-signatures.js +126 -9
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js +34 -1
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js +9 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +10 -0
- package/dist/frontend/lowering/class-protocols.js +53 -3
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.js +6 -1
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-to-primitive.d.ts +2 -2
- package/dist/frontend/lowering/class-to-primitive.js +6 -3
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
- package/dist/frontend/lowering/coercions/fresh-spread.d.ts +13 -0
- package/dist/frontend/lowering/coercions/fresh-spread.js +95 -0
- package/dist/frontend/lowering/coercions/fresh-spread.js.map +1 -0
- package/dist/frontend/lowering/coercions/function-adapters.js +99 -70
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +22 -19
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +7 -0
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +5 -0
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +9 -0
- package/dist/frontend/lowering/containers/bytes.js +493 -17
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +72 -3
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +49 -13
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +26 -10
- package/dist/frontend/lowering/cycle-initialization.js +152 -35
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +33 -13
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +79 -5
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +13 -6
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +14 -2
- package/dist/frontend/lowering/expressions/keyed-field-targets.js +91 -10
- package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +17 -2
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +48 -1
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +12 -3
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +5 -0
- package/dist/frontend/lowering/expressions/property-access.js +252 -9
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +49 -4
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +13 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +1 -1
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
- package/dist/frontend/lowering/generator-delegation.js +191 -1
- package/dist/frontend/lowering/generator-delegation.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +4 -0
- package/dist/frontend/lowering/generic-functions.js +213 -56
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/handle-properties.d.ts +24 -0
- package/dist/frontend/lowering/handle-properties.js +281 -0
- package/dist/frontend/lowering/handle-properties.js.map +1 -0
- package/dist/frontend/lowering/iterable-spelling.d.ts +7 -0
- package/dist/frontend/lowering/iterable-spelling.js +38 -0
- package/dist/frontend/lowering/iterable-spelling.js.map +1 -0
- package/dist/frontend/lowering/lower-array-sort.d.ts +33 -15
- package/dist/frontend/lowering/lower-array-sort.js +117 -21
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.js +93 -14
- package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +1 -0
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +166 -7
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +4 -0
- package/dist/frontend/lowering/lower-classes.js +59 -7
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +62 -13
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +32 -1
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +4 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +10 -4
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +569 -11
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +11 -3
- package/dist/frontend/lowering/lower-modules.js +212 -67
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +20 -0
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +26 -1
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.js +28 -9
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +7 -10
- package/dist/frontend/lowering/lower-stmts.js +418 -51
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +17 -1
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +29 -5
- package/dist/frontend/lowering/lowerer.js +172 -25
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/rebindable-functions.d.ts +8 -0
- package/dist/frontend/lowering/rebindable-functions.js +54 -0
- package/dist/frontend/lowering/rebindable-functions.js.map +1 -0
- package/dist/frontend/lowering/static-typeof.d.ts +26 -0
- package/dist/frontend/lowering/static-typeof.js +133 -0
- package/dist/frontend/lowering/static-typeof.js.map +1 -0
- package/dist/frontend/lowering/string-index-bounds.js +3 -2
- package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
- package/dist/frontend/lowering/surfaces.js +30 -4
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/thenables.d.ts +16 -0
- package/dist/frontend/lowering/thenables.js +124 -0
- package/dist/frontend/lowering/thenables.js.map +1 -0
- package/dist/frontend/npm-static-builtin-aliases.d.ts +8 -0
- package/dist/frontend/npm-static-builtin-aliases.js +65 -0
- package/dist/frontend/npm-static-builtin-aliases.js.map +1 -0
- package/dist/frontend/npm-static-bundled-chunks.d.ts +8 -1
- package/dist/frontend/npm-static-bundled-chunks.js +173 -2
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.test.js +112 -0
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
- package/dist/frontend/npm-static-bundled-esm.js +224 -4
- package/dist/frontend/npm-static-bundled-esm.js.map +1 -1
- package/dist/frontend/npm-static-bundled-esm.test.js +129 -0
- package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -1
- package/dist/frontend/npm-static-enum-iife.d.ts +6 -0
- package/dist/frontend/npm-static-enum-iife.js +280 -0
- package/dist/frontend/npm-static-enum-iife.js.map +1 -0
- package/dist/frontend/npm-static-enum-iife.test.d.ts +1 -0
- package/dist/frontend/npm-static-enum-iife.test.js +116 -0
- package/dist/frontend/npm-static-enum-iife.test.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +8 -0
- package/dist/frontend/npm-static.js +46 -1
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.js +13 -0
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +47 -0
- package/dist/frontend/package-shims.js +300 -0
- package/dist/frontend/package-shims.js.map +1 -0
- package/dist/frontend/pipeline.js +67 -1
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program.d.ts +8 -0
- package/dist/frontend/program.js +72 -9
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/resolve.js +13 -0
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/services.d.ts +6 -0
- package/dist/frontend/services.js +19 -0
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +6 -5
- package/dist/frontend/ts7/program-host.js +7 -0
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +3 -0
- package/dist/frontend/ts7/semantic-model.js +26 -0
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +19 -4
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/type-mapper.js +201 -15
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +58 -6
- package/dist/index.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +3 -2
- package/dist/ir/array-length-stability.js +15 -2
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +22 -1
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.js +13 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +46 -4
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +5 -0
- package/dist/ir/integer-loop-facts.js +79 -14
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +10 -1
- package/dist/ir/integer-ranges.js +122 -25
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +191 -1
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.js +8 -0
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/js-ic.d.ts +52 -0
- package/dist/ir/js-ic.js +199 -0
- package/dist/ir/js-ic.js.map +1 -0
- package/dist/ir/js-ic.test.d.ts +1 -0
- package/dist/ir/js-ic.test.js +148 -0
- package/dist/ir/js-ic.test.js.map +1 -0
- package/dist/ir/jsval.js +38 -4
- package/dist/ir/jsval.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +39 -4
- package/dist/ir/runtime-features.js +229 -99
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/traverse.js +110 -68
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +21 -8
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +15 -2
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/ir-policy.js +1 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/cli.js +17 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +33 -4
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache.js +3 -0
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.js +3 -0
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.test.js +7 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/package.json +21 -20
- package/shims/fs-extra/core/api.ts +1192 -0
- package/shims/fs-extra/index.ts +9 -0
- package/shims/undici/core/agent.ts +163 -0
- package/shims/undici/core/api.ts +93 -0
- package/shims/undici/core/client.ts +1304 -0
- package/shims/undici/core/connector.ts +157 -0
- package/shims/undici/core/diagnostics-types.ts +68 -0
- package/shims/undici/core/diagnostics.ts +16 -0
- package/shims/undici/core/dispatcher.ts +574 -0
- package/shims/undici/core/errors-v5.ts +22 -0
- package/shims/undici/core/errors-v7.ts +25 -0
- package/shims/undici/core/errors.ts +255 -0
- package/shims/undici/core/fetch.ts +635 -0
- package/shims/undici/core/pool.ts +280 -0
- package/shims/undici/core/readable.ts +268 -0
- package/shims/undici/core/request.ts +313 -0
- package/shims/undici/core/timers.ts +80 -0
- package/shims/undici/core/types.ts +167 -0
- package/shims/undici/core/util.ts +67 -0
- package/shims/undici/v5.ts +119 -0
- package/shims/undici/v7.ts +119 -0
- package/surface-manifest.json +2 -4
|
@@ -32,4 +32,13 @@ export declare function knownBufEncoding(name: string): string | undefined;
|
|
|
32
32
|
/** The literal encoding argument of a Buffer surface, normalized — or a
|
|
33
33
|
* fence when it isn't a literal alias Node knows. */
|
|
34
34
|
export declare function bufEncoding(lowerer: Lowerer, what: string, encNode: ts.Expression): string;
|
|
35
|
+
/** The deprecated `new Buffer(arg[, encoding])` in a dependency's
|
|
36
|
+
* JavaScript, through the global or an alias of it (buffer-crc32 and yazl
|
|
37
|
+
* keep it as the fallback for runtimes without Buffer.alloc/Buffer.from).
|
|
38
|
+
* Node never emits DEP0005 for calls from node_modules, so the construction
|
|
39
|
+
* is exactly Node's: a number allocates zero-filled bytes (and throws
|
|
40
|
+
* ERR_INVALID_ARG_TYPE beside a string second argument), anything else
|
|
41
|
+
* converts as Buffer.from does. Null elsewhere: other callers owe the
|
|
42
|
+
* deprecation warning. */
|
|
43
|
+
export declare function lowerNodeModulesBufferConstruct(lowerer: Lowerer, expr: ts.NewExpression): IrExpr | null;
|
|
35
44
|
export declare function lowerBufferStaticCall(lowerer: Lowerer, call: ts.CallExpression, access: ts.PropertyAccessExpression): IrExpr | null;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { dynUndefinedExpr, varRef } from "../../../ir/build.js";
|
|
1
|
+
import { boolLit, dynUndefinedExpr, numLit, varRef } from "../../../ir/build.js";
|
|
2
2
|
import { BUF_NUM_METHODS } from "./buffer-numeric-methods.js";
|
|
3
3
|
import * as ts from "../../ts7/adapter.js";
|
|
4
4
|
import { BIGINT_T, BOOL, BYTES_ELEMENT_NAME, BYTES_U8, DYN, F64, STRING, UNDEFINED_T, VOID, arrayOf, bytesOf, funcOf, isUnitType, typeEquals, } from "../../../ir/ir.js";
|
|
5
5
|
import { isJsSourceFile, locOf } from "../../program.js";
|
|
6
|
+
import { stdlibGlobalNameOf } from "../surfaces.js";
|
|
6
7
|
import { newFnCtx, own } from "../lowerer.js";
|
|
7
8
|
import { buildBytesSortFn, closureKeyOrder } from "../lower-array-sort.js";
|
|
8
9
|
import { isSafeToDiscard } from "../expressions/evaluation-safety.js";
|
|
@@ -11,6 +12,9 @@ import { defaultAfterUndefined, lowerOptionalArgument, lowerStaticallyUndefinedA
|
|
|
11
12
|
import { lowerCheckedArrayFrom } from "./array-construction.js";
|
|
12
13
|
import { lowerToNumberArgument } from "../lower-exprs.js";
|
|
13
14
|
import { lowerBytesIteratorValue } from "../iterator-adapters.js";
|
|
15
|
+
import { lowerArrayCallback } from "./callback-arguments.js";
|
|
16
|
+
import { findPredicateOk, predicateToBoolean } from "./array-callbacks.js";
|
|
17
|
+
import { typeKey } from "../../type-mapper.js";
|
|
14
18
|
/** TypedArray.prototype.sort and toSorted. The receiver and comparator
|
|
15
19
|
* expressions are evaluated before entering the helper (buildBytesSortFn).
|
|
16
20
|
* The default order is numeric, so the comparator-less form sorts by value
|
|
@@ -90,7 +94,7 @@ function lowerBytesSortCall(lowerer, call, access, bytesT) {
|
|
|
90
94
|
}
|
|
91
95
|
const arity = fnArg.type.params.length;
|
|
92
96
|
const keyed = closureKeyOrder(lowerer.liftedFns, fnArg);
|
|
93
|
-
const order = keyed
|
|
97
|
+
const order = keyed?.length === 1 && keyed[0].read === null ? keyed[0].order : null;
|
|
94
98
|
const helper = helperFor(`${arity}${order === null ? "" : `:keyed${order}`}`, arity, true, order);
|
|
95
99
|
return {
|
|
96
100
|
kind: "call",
|
|
@@ -100,6 +104,317 @@ function lowerBytesSortCall(lowerer, call, access, bytesT) {
|
|
|
100
104
|
loc,
|
|
101
105
|
};
|
|
102
106
|
}
|
|
107
|
+
const BYTES_CALLBACK_METHODS = new Set([
|
|
108
|
+
"forEach",
|
|
109
|
+
"map",
|
|
110
|
+
"filter",
|
|
111
|
+
"some",
|
|
112
|
+
"every",
|
|
113
|
+
"find",
|
|
114
|
+
"findIndex",
|
|
115
|
+
"findLast",
|
|
116
|
+
"findLastIndex",
|
|
117
|
+
"reduce",
|
|
118
|
+
"reduceRight",
|
|
119
|
+
]);
|
|
120
|
+
/** The typed-array callback methods (forEach, map, filter, some, every,
|
|
121
|
+
* find, findIndex, findLast, findLastIndex, reduce, reduceRight). The
|
|
122
|
+
* receiver, the callback and reduce's initial value evaluate in order
|
|
123
|
+
* before the helper runs. The helper reads the length once (typed arrays
|
|
124
|
+
* have no holes) and each element when it visits it, so the callback's
|
|
125
|
+
* writes show in later elements. The callback receives the element, its
|
|
126
|
+
* index and the typed array (reduce's receive the accumulator first). map
|
|
127
|
+
* and filter return a new typed array of the receiver's kind; map stores
|
|
128
|
+
* each result with the element conversion of that kind. A thisArg keeps
|
|
129
|
+
* the fence, as for arrays. */
|
|
130
|
+
function lowerBytesCallbackCall(lowerer, call, access, method, bytesT) {
|
|
131
|
+
const loc = locOf(call);
|
|
132
|
+
const nArgs = call.arguments.nodes.length;
|
|
133
|
+
const reduce = method === "reduce" || method === "reduceRight";
|
|
134
|
+
if (nArgs < 1 || nArgs > (reduce ? 2 : 1) || call.arguments.nodes.some(ts.isSpreadElement)) {
|
|
135
|
+
lowerer.noLowering(`.${method} with ${nArgs} arguments on ${BYTES_ELEMENT_NAME[bytesT.elem]}`, call, reduce ? undefined : "the thisArg parameter has no lowering — use an arrow function");
|
|
136
|
+
}
|
|
137
|
+
const argNode = call.arguments.nodes[0];
|
|
138
|
+
const hasInit = reduce && nArgs === 2;
|
|
139
|
+
const accT = reduce ? (hasInit ? lowerer.irTypeOf(call) : F64) : null;
|
|
140
|
+
if (accT !== null && (accT.kind === "void" || accT.kind === "func"))
|
|
141
|
+
lowerer.badType(call, lowerer.typeOf(call));
|
|
142
|
+
const receiver = lowerer.lowerExprExpecting(access.expression, bytesT);
|
|
143
|
+
const { fnArg, arity } = lowerArrayCallback(lowerer, argNode, accT !== null ? [accT, F64] : [F64], bytesT, false, accT ?? undefined);
|
|
144
|
+
const fnRet = fnArg.type.ret;
|
|
145
|
+
const predicate = method === "filter" ||
|
|
146
|
+
method === "some" ||
|
|
147
|
+
method === "every" ||
|
|
148
|
+
method === "find" ||
|
|
149
|
+
method === "findIndex" ||
|
|
150
|
+
method === "findLast" ||
|
|
151
|
+
method === "findLastIndex";
|
|
152
|
+
if (predicate && !findPredicateOk(lowerer, fnRet))
|
|
153
|
+
lowerer.badType(argNode, lowerer.typeOf(argNode));
|
|
154
|
+
if (method === "map" && !lowerer.coercibleValue(F64, fnRet))
|
|
155
|
+
lowerer.badType(argNode, lowerer.typeOf(argNode));
|
|
156
|
+
const resultT = accT ??
|
|
157
|
+
(method === "forEach"
|
|
158
|
+
? VOID
|
|
159
|
+
: method === "map" || method === "filter"
|
|
160
|
+
? bytesT
|
|
161
|
+
: method === "some" || method === "every"
|
|
162
|
+
? BOOL
|
|
163
|
+
: method === "findIndex" || method === "findLastIndex"
|
|
164
|
+
? F64
|
|
165
|
+
: lowerer.irTypeOf(call));
|
|
166
|
+
const helper = bytesCallbackHelper(lowerer, method, bytesT, resultT, fnRet, arity, hasInit, loc);
|
|
167
|
+
const args = [receiver, fnArg];
|
|
168
|
+
if (hasInit)
|
|
169
|
+
args.push(lowerer.lowerExprExpecting(call.arguments.nodes[1], resultT));
|
|
170
|
+
return { kind: "call", callee: helper, args, type: resultT, loc };
|
|
171
|
+
}
|
|
172
|
+
/** The interned helper of one typed-array callback method shape. */
|
|
173
|
+
function bytesCallbackHelper(lowerer, method, bytesT, resultT, fnRet, arity, hasInit, loc) {
|
|
174
|
+
const key = `bytes.${method}:${bytesT.elem}:${typeKey(resultT)}:${typeKey(fnRet)}:${arity}:${hasInit ? "init" : ""}`;
|
|
175
|
+
const existing = lowerer.arrHofHelpers.get(key);
|
|
176
|
+
if (existing)
|
|
177
|
+
return existing;
|
|
178
|
+
const name = `%bytes.${method}.${lowerer.arrHofHelpers.size}`;
|
|
179
|
+
lowerer.arrHofHelpers.set(key, name);
|
|
180
|
+
const reduce = method === "reduce" || method === "reduceRight";
|
|
181
|
+
const backward = method === "reduceRight" || method === "findLast" || method === "findLastIndex";
|
|
182
|
+
const fnT = funcOf((reduce ? [resultT, F64, F64, bytesT] : [F64, F64, bytesT]).slice(0, arity), fnRet);
|
|
183
|
+
const keptT = arrayOf(F64);
|
|
184
|
+
const a = () => varRef("a.0", bytesT, loc);
|
|
185
|
+
const i = () => varRef("i.0", F64, loc);
|
|
186
|
+
const n = () => varRef("n.0", F64, loc);
|
|
187
|
+
const acc = () => varRef("acc.0", resultT, loc);
|
|
188
|
+
const element = () => varRef("v.0", F64, loc);
|
|
189
|
+
const at = (index) => ({
|
|
190
|
+
kind: "bytesIntrinsic",
|
|
191
|
+
method: "get",
|
|
192
|
+
receiver: a(),
|
|
193
|
+
args: [index],
|
|
194
|
+
type: F64,
|
|
195
|
+
loc,
|
|
196
|
+
});
|
|
197
|
+
const callback = () => ({
|
|
198
|
+
kind: "callValue",
|
|
199
|
+
callee: varRef("f.0", fnT, loc),
|
|
200
|
+
args: (reduce ? [acc(), element(), i(), a()] : [element(), i(), a()]).slice(0, arity),
|
|
201
|
+
type: fnRet,
|
|
202
|
+
loc,
|
|
203
|
+
});
|
|
204
|
+
const inRange = () => backward
|
|
205
|
+
? { kind: "bin", op: ">=", left: i(), right: numLit(0, loc), type: BOOL, loc }
|
|
206
|
+
: { kind: "bin", op: "<", left: i(), right: n(), type: BOOL, loc };
|
|
207
|
+
const advance = () => ({
|
|
208
|
+
kind: "assign",
|
|
209
|
+
localId: "i.0",
|
|
210
|
+
value: {
|
|
211
|
+
kind: "bin",
|
|
212
|
+
op: backward ? "-" : "+",
|
|
213
|
+
left: i(),
|
|
214
|
+
right: numLit(1, loc),
|
|
215
|
+
type: F64,
|
|
216
|
+
loc,
|
|
217
|
+
},
|
|
218
|
+
loc,
|
|
219
|
+
});
|
|
220
|
+
const ret = (value) => ({ kind: "return", value, loc });
|
|
221
|
+
// map and filter of a Buffer return a Buffer (Node's species).
|
|
222
|
+
const copyBrand = (out) => ({
|
|
223
|
+
kind: "exprStmt",
|
|
224
|
+
expr: { kind: "libCall", fn: "bytes.copyBrand", args: [out, a()], type: VOID, loc },
|
|
225
|
+
loc,
|
|
226
|
+
});
|
|
227
|
+
const locals = [
|
|
228
|
+
{ id: "a.0", name: "a", type: bytesT, mutable: true },
|
|
229
|
+
{ id: "f.0", name: "f", type: fnT, mutable: true },
|
|
230
|
+
...(hasInit ? [{ id: "z.0", name: "z", type: resultT, mutable: true }] : []),
|
|
231
|
+
...(reduce || method === "map" || method === "filter"
|
|
232
|
+
? [{ id: "acc.0", name: "acc", type: resultT, mutable: true }]
|
|
233
|
+
: []),
|
|
234
|
+
...(method === "filter"
|
|
235
|
+
? [{ id: "kept.0", name: "kept", type: keptT, mutable: true }]
|
|
236
|
+
: []),
|
|
237
|
+
{ id: "n.0", name: "n", type: F64, mutable: false },
|
|
238
|
+
{ id: "i.0", name: "i", type: F64, mutable: true },
|
|
239
|
+
{ id: "v.0", name: "v", type: F64, mutable: true },
|
|
240
|
+
];
|
|
241
|
+
const params = [
|
|
242
|
+
{ localId: "a.0", name: "a", type: bytesT },
|
|
243
|
+
{ localId: "f.0", name: "f", type: fnT },
|
|
244
|
+
...(hasInit ? [{ localId: "z.0", name: "z", type: resultT }] : []),
|
|
245
|
+
];
|
|
246
|
+
const visit = [{ kind: "assign", localId: "v.0", value: at(i()), loc }];
|
|
247
|
+
const prologue = [];
|
|
248
|
+
let epilogue;
|
|
249
|
+
switch (method) {
|
|
250
|
+
case "forEach":
|
|
251
|
+
visit.push({ kind: "exprStmt", expr: callback(), loc });
|
|
252
|
+
epilogue = [ret(null)];
|
|
253
|
+
break;
|
|
254
|
+
case "map":
|
|
255
|
+
prologue.push({
|
|
256
|
+
kind: "varDecl",
|
|
257
|
+
localId: "acc.0",
|
|
258
|
+
init: { kind: "bytesNew", source: n(), type: bytesT, loc },
|
|
259
|
+
loc,
|
|
260
|
+
});
|
|
261
|
+
visit.push({
|
|
262
|
+
kind: "bytesSet",
|
|
263
|
+
arr: acc(),
|
|
264
|
+
index: i(),
|
|
265
|
+
value: lowerer.coerceToExpected(callback(), F64),
|
|
266
|
+
loc,
|
|
267
|
+
});
|
|
268
|
+
if (bytesT.elem === "u8")
|
|
269
|
+
prologue.push(copyBrand(acc()));
|
|
270
|
+
epilogue = [ret(acc())];
|
|
271
|
+
break;
|
|
272
|
+
case "filter":
|
|
273
|
+
prologue.push({
|
|
274
|
+
kind: "varDecl",
|
|
275
|
+
localId: "kept.0",
|
|
276
|
+
init: { kind: "arrayLit", elems: [], type: keptT, loc },
|
|
277
|
+
loc,
|
|
278
|
+
});
|
|
279
|
+
visit.push({
|
|
280
|
+
kind: "if",
|
|
281
|
+
cond: predicateToBoolean(callback()),
|
|
282
|
+
then: [
|
|
283
|
+
{
|
|
284
|
+
kind: "exprStmt",
|
|
285
|
+
expr: {
|
|
286
|
+
kind: "arrIntrinsic",
|
|
287
|
+
method: "push",
|
|
288
|
+
receiver: varRef("kept.0", keptT, loc),
|
|
289
|
+
args: [element()],
|
|
290
|
+
type: F64,
|
|
291
|
+
loc,
|
|
292
|
+
},
|
|
293
|
+
loc,
|
|
294
|
+
},
|
|
295
|
+
],
|
|
296
|
+
else_: null,
|
|
297
|
+
loc,
|
|
298
|
+
});
|
|
299
|
+
epilogue = [
|
|
300
|
+
{
|
|
301
|
+
kind: "varDecl",
|
|
302
|
+
localId: "acc.0",
|
|
303
|
+
init: { kind: "bytesNew", source: varRef("kept.0", keptT, loc), type: bytesT, loc },
|
|
304
|
+
loc,
|
|
305
|
+
},
|
|
306
|
+
...(bytesT.elem === "u8" ? [copyBrand(acc())] : []),
|
|
307
|
+
ret(acc()),
|
|
308
|
+
];
|
|
309
|
+
break;
|
|
310
|
+
case "some":
|
|
311
|
+
case "every": {
|
|
312
|
+
const found = method === "some";
|
|
313
|
+
const test = predicateToBoolean(callback());
|
|
314
|
+
visit.push({
|
|
315
|
+
kind: "if",
|
|
316
|
+
cond: found ? test : { kind: "unary", op: "!", operand: test, type: BOOL, loc },
|
|
317
|
+
then: [ret(boolLit(found, loc))],
|
|
318
|
+
else_: null,
|
|
319
|
+
loc,
|
|
320
|
+
});
|
|
321
|
+
epilogue = [ret(boolLit(!found, loc))];
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
case "find":
|
|
325
|
+
case "findLast":
|
|
326
|
+
visit.push({
|
|
327
|
+
kind: "if",
|
|
328
|
+
cond: predicateToBoolean(callback()),
|
|
329
|
+
then: [ret(lowerer.coerceToExpected(element(), resultT))],
|
|
330
|
+
else_: null,
|
|
331
|
+
loc,
|
|
332
|
+
});
|
|
333
|
+
epilogue = [
|
|
334
|
+
ret(lowerer.coerceToExpected({ kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc }, resultT)),
|
|
335
|
+
];
|
|
336
|
+
break;
|
|
337
|
+
case "findIndex":
|
|
338
|
+
case "findLastIndex":
|
|
339
|
+
visit.push({
|
|
340
|
+
kind: "if",
|
|
341
|
+
cond: predicateToBoolean(callback()),
|
|
342
|
+
then: [ret(i())],
|
|
343
|
+
else_: null,
|
|
344
|
+
loc,
|
|
345
|
+
});
|
|
346
|
+
epilogue = [ret(numLit(-1, loc))];
|
|
347
|
+
break;
|
|
348
|
+
case "reduce":
|
|
349
|
+
case "reduceRight":
|
|
350
|
+
if (hasInit) {
|
|
351
|
+
prologue.push({
|
|
352
|
+
kind: "varDecl",
|
|
353
|
+
localId: "acc.0",
|
|
354
|
+
init: varRef("z.0", resultT, loc),
|
|
355
|
+
loc,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
prologue.push({
|
|
360
|
+
kind: "if",
|
|
361
|
+
cond: { kind: "unary", op: "!", operand: inRange(), type: BOOL, loc },
|
|
362
|
+
then: [
|
|
363
|
+
{
|
|
364
|
+
kind: "throw",
|
|
365
|
+
value: {
|
|
366
|
+
kind: "libCall",
|
|
367
|
+
fn: "error.new",
|
|
368
|
+
args: [
|
|
369
|
+
{
|
|
370
|
+
kind: "strLit",
|
|
371
|
+
value: "Reduce of empty array with no initial value",
|
|
372
|
+
type: STRING,
|
|
373
|
+
loc,
|
|
374
|
+
},
|
|
375
|
+
],
|
|
376
|
+
type: { kind: "object", className: "%TypeError" },
|
|
377
|
+
loc,
|
|
378
|
+
},
|
|
379
|
+
loc,
|
|
380
|
+
},
|
|
381
|
+
],
|
|
382
|
+
else_: null,
|
|
383
|
+
loc,
|
|
384
|
+
}, { kind: "varDecl", localId: "acc.0", init: at(i()), loc }, advance());
|
|
385
|
+
}
|
|
386
|
+
visit.push({
|
|
387
|
+
kind: "assign",
|
|
388
|
+
localId: "acc.0",
|
|
389
|
+
value: lowerer.coerceToExpected(callback(), resultT),
|
|
390
|
+
loc,
|
|
391
|
+
});
|
|
392
|
+
epilogue = [ret(acc())];
|
|
393
|
+
break;
|
|
394
|
+
}
|
|
395
|
+
const body = [
|
|
396
|
+
{
|
|
397
|
+
kind: "varDecl",
|
|
398
|
+
localId: "n.0",
|
|
399
|
+
init: { kind: "bytesIntrinsic", method: "length", receiver: a(), args: [], type: F64, loc },
|
|
400
|
+
loc,
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
kind: "varDecl",
|
|
404
|
+
localId: "i.0",
|
|
405
|
+
init: backward
|
|
406
|
+
? { kind: "bin", op: "-", left: n(), right: numLit(1, loc), type: F64, loc }
|
|
407
|
+
: numLit(0, loc),
|
|
408
|
+
loc,
|
|
409
|
+
},
|
|
410
|
+
{ kind: "varDecl", localId: "v.0", init: numLit(0, loc), loc },
|
|
411
|
+
...prologue,
|
|
412
|
+
{ kind: "for", init: null, cond: inRange(), update: advance(), body: visit, loc },
|
|
413
|
+
...epilogue,
|
|
414
|
+
];
|
|
415
|
+
lowerer.liftedFns.push({ name, params, returnType: resultT, locals, body, loc });
|
|
416
|
+
return name;
|
|
417
|
+
}
|
|
103
418
|
/* ── typed arrays / Buffer ─────────────────────────────────────────────── */
|
|
104
419
|
/** The typed-array constructors with a runtime representation, by lib
|
|
105
420
|
* interface name. Other flavors (BigInt64Array, BigUint64Array) fall through
|
|
@@ -365,6 +680,9 @@ export function lowerBytesMethodCall(lowerer, call, access) {
|
|
|
365
680
|
if (name === "sort" || name === "toSorted") {
|
|
366
681
|
return lowerBytesSortCall(lowerer, call, access, receiverIr);
|
|
367
682
|
}
|
|
683
|
+
if (BYTES_CALLBACK_METHODS.has(name)) {
|
|
684
|
+
return lowerBytesCallbackCall(lowerer, call, access, name, receiverIr);
|
|
685
|
+
}
|
|
368
686
|
// values()/keys()/entries() as iterator objects (for...of heads and
|
|
369
687
|
// stored numeric iterators lower before this).
|
|
370
688
|
if ((name === "values" || name === "keys" || name === "entries") && nArgs === 0) {
|
|
@@ -1144,6 +1462,158 @@ function knownBufferProducer(lowerer, source, seen = new Set()) {
|
|
|
1144
1462
|
const type = lowerer.mapTypeOf(lowerer.typeOf(callee.expression));
|
|
1145
1463
|
return type?.kind === "cryptoHash" || type?.kind === "cryptoHmac";
|
|
1146
1464
|
}
|
|
1465
|
+
/** Buffer.from over a checked-dynamic source and encoding, both already in
|
|
1466
|
+
* repeatable locals: Node's fromString takes utf8 for an absent, non-string
|
|
1467
|
+
* or empty encoding and throws ERR_UNKNOWN_ENCODING for an unknown name;
|
|
1468
|
+
* other sources ignore the encoding. */
|
|
1469
|
+
function dynBufferFromParts(source, encoding, loc) {
|
|
1470
|
+
const utf8 = { kind: "strLit", value: "utf8", type: STRING, loc };
|
|
1471
|
+
const isString = (x) => ({
|
|
1472
|
+
kind: "dynTest",
|
|
1473
|
+
test: "string",
|
|
1474
|
+
value: x,
|
|
1475
|
+
type: BOOL,
|
|
1476
|
+
loc,
|
|
1477
|
+
});
|
|
1478
|
+
const name = {
|
|
1479
|
+
kind: "ternary",
|
|
1480
|
+
cond: {
|
|
1481
|
+
kind: "logical",
|
|
1482
|
+
op: "&&",
|
|
1483
|
+
left: isString(encoding),
|
|
1484
|
+
right: {
|
|
1485
|
+
kind: "strEq",
|
|
1486
|
+
negated: true,
|
|
1487
|
+
left: { kind: "dynCheck", value: encoding, type: STRING, loc },
|
|
1488
|
+
right: { kind: "strLit", value: "", type: STRING, loc },
|
|
1489
|
+
type: BOOL,
|
|
1490
|
+
loc,
|
|
1491
|
+
},
|
|
1492
|
+
type: BOOL,
|
|
1493
|
+
loc,
|
|
1494
|
+
},
|
|
1495
|
+
then: { kind: "dynCheck", value: encoding, type: STRING, loc },
|
|
1496
|
+
else_: utf8,
|
|
1497
|
+
type: STRING,
|
|
1498
|
+
loc,
|
|
1499
|
+
};
|
|
1500
|
+
return {
|
|
1501
|
+
kind: "ternary",
|
|
1502
|
+
cond: isString(source),
|
|
1503
|
+
then: {
|
|
1504
|
+
kind: "libCall",
|
|
1505
|
+
fn: "buffer.poolFromStrChecked",
|
|
1506
|
+
args: [{ kind: "dynCheck", value: source, type: STRING, loc }, name],
|
|
1507
|
+
type: BYTES_U8,
|
|
1508
|
+
loc,
|
|
1509
|
+
},
|
|
1510
|
+
else_: {
|
|
1511
|
+
kind: "libCall",
|
|
1512
|
+
fn: "buffer.poolFromDynRef",
|
|
1513
|
+
args: [source, utf8],
|
|
1514
|
+
type: BYTES_U8,
|
|
1515
|
+
loc,
|
|
1516
|
+
},
|
|
1517
|
+
type: BYTES_U8,
|
|
1518
|
+
loc,
|
|
1519
|
+
};
|
|
1520
|
+
}
|
|
1521
|
+
/** Lowers `source` and `encNode` (or undefined) into hidden dyn locals, in
|
|
1522
|
+
* source order, and builds the result from their references. */
|
|
1523
|
+
function withDynBufferArguments(lowerer, source, encNode, loc, build) {
|
|
1524
|
+
const v = lowerer.declareHiddenLocal("%bufferValue", DYN);
|
|
1525
|
+
const e = lowerer.declareHiddenLocal("%bufferEncoding", DYN);
|
|
1526
|
+
const result = build(varRef(v.id, DYN, loc), varRef(e.id, DYN, loc));
|
|
1527
|
+
return {
|
|
1528
|
+
kind: "seqExpr",
|
|
1529
|
+
stmts: [
|
|
1530
|
+
{ kind: "varDecl", localId: v.id, init: lowerer.coerceToExpected(source, DYN), loc },
|
|
1531
|
+
{
|
|
1532
|
+
kind: "varDecl",
|
|
1533
|
+
localId: e.id,
|
|
1534
|
+
init: encNode === undefined
|
|
1535
|
+
? dynUndefinedExpr(loc)
|
|
1536
|
+
: lowerer.coerceToExpected(lowerer.lowerExpr(encNode), DYN),
|
|
1537
|
+
loc,
|
|
1538
|
+
},
|
|
1539
|
+
],
|
|
1540
|
+
result,
|
|
1541
|
+
type: result.type,
|
|
1542
|
+
loc,
|
|
1543
|
+
};
|
|
1544
|
+
}
|
|
1545
|
+
/** Buffer.from(value, encoding) over a checked-dynamic value whose encoding
|
|
1546
|
+
* is not a literal: yazl forwards its `encoding` parameter, often undefined.
|
|
1547
|
+
* Null when the encoding is absent or a literal. */
|
|
1548
|
+
function dynBufferFromRuntimeEncoding(lowerer, value, encNode, loc) {
|
|
1549
|
+
if (encNode === undefined || lowerer.typeOf(encNode).isStringLiteralType())
|
|
1550
|
+
return null;
|
|
1551
|
+
return withDynBufferArguments(lowerer, value, encNode, loc, (source, encoding) => dynBufferFromParts(source, encoding, loc));
|
|
1552
|
+
}
|
|
1553
|
+
/** The deprecated `new Buffer(arg[, encoding])` in a dependency's
|
|
1554
|
+
* JavaScript, through the global or an alias of it (buffer-crc32 and yazl
|
|
1555
|
+
* keep it as the fallback for runtimes without Buffer.alloc/Buffer.from).
|
|
1556
|
+
* Node never emits DEP0005 for calls from node_modules, so the construction
|
|
1557
|
+
* is exactly Node's: a number allocates zero-filled bytes (and throws
|
|
1558
|
+
* ERR_INVALID_ARG_TYPE beside a string second argument), anything else
|
|
1559
|
+
* converts as Buffer.from does. Null elsewhere: other callers owe the
|
|
1560
|
+
* deprecation warning. */
|
|
1561
|
+
export function lowerNodeModulesBufferConstruct(lowerer, expr) {
|
|
1562
|
+
const sf = expr.getSourceFile();
|
|
1563
|
+
if (!isJsSourceFile(sf) || !/[\\/]node_modules[\\/]/.test(sf.fileName))
|
|
1564
|
+
return null;
|
|
1565
|
+
const args = expr.arguments?.nodes ?? [];
|
|
1566
|
+
if (args.length < 1 || args.length > 2 || args.some(ts.isSpreadElement))
|
|
1567
|
+
return null;
|
|
1568
|
+
if (stdlibGlobalNameOf(lowerer, expr.expression) !== "Buffer")
|
|
1569
|
+
return null;
|
|
1570
|
+
const loc = locOf(expr);
|
|
1571
|
+
const value = withDynBufferArguments(lowerer, lowerer.lowerExpr(args[0]), args[1], loc, (source, encoding) => ({
|
|
1572
|
+
kind: "ternary",
|
|
1573
|
+
cond: { kind: "dynTest", test: "number", value: source, type: BOOL, loc },
|
|
1574
|
+
then: {
|
|
1575
|
+
kind: "ternary",
|
|
1576
|
+
cond: { kind: "dynTest", test: "string", value: encoding, type: BOOL, loc },
|
|
1577
|
+
then: { kind: "libCall", fn: "buffer.newStringFail", args: [source], type: BYTES_U8, loc },
|
|
1578
|
+
else_: {
|
|
1579
|
+
kind: "libCall",
|
|
1580
|
+
fn: "buffer.alloc",
|
|
1581
|
+
args: [{ kind: "dynCheck", value: source, type: F64, loc }],
|
|
1582
|
+
type: BYTES_U8,
|
|
1583
|
+
loc,
|
|
1584
|
+
},
|
|
1585
|
+
type: BYTES_U8,
|
|
1586
|
+
loc,
|
|
1587
|
+
},
|
|
1588
|
+
else_: dynBufferFromParts(source, encoding, loc),
|
|
1589
|
+
type: BYTES_U8,
|
|
1590
|
+
loc,
|
|
1591
|
+
}));
|
|
1592
|
+
return { kind: "libCall", fn: "buffer.brand", args: [value], type: BYTES_U8, loc };
|
|
1593
|
+
}
|
|
1594
|
+
/** Buffer.from(array or bytes, extra): Node copies an array-like source and
|
|
1595
|
+
* ignores the encoding/offset argument (yazl passes its `encoding` through
|
|
1596
|
+
* unchanged), but JavaScript still evaluates it after the source. */
|
|
1597
|
+
function withIgnoredBufferArgument(lowerer, extraNode, source, build) {
|
|
1598
|
+
if (extraNode === undefined)
|
|
1599
|
+
return build(source);
|
|
1600
|
+
const extra = lowerer.lowerExpr(extraNode);
|
|
1601
|
+
if (isSafeToDiscard(extra))
|
|
1602
|
+
return build(source);
|
|
1603
|
+
const loc = source.loc;
|
|
1604
|
+
const tmp = lowerer.declareHiddenLocal("%bufferSource", source.type);
|
|
1605
|
+
const result = build(varRef(tmp.id, source.type, loc));
|
|
1606
|
+
return {
|
|
1607
|
+
kind: "seqExpr",
|
|
1608
|
+
stmts: [
|
|
1609
|
+
{ kind: "varDecl", localId: tmp.id, init: source, loc },
|
|
1610
|
+
{ kind: "exprStmt", expr: extra, loc },
|
|
1611
|
+
],
|
|
1612
|
+
result,
|
|
1613
|
+
type: result.type,
|
|
1614
|
+
loc,
|
|
1615
|
+
};
|
|
1616
|
+
}
|
|
1147
1617
|
export function lowerBufferStaticCall(lowerer, call, access) {
|
|
1148
1618
|
const value = lowerBufferStaticValue(lowerer, call, access);
|
|
1149
1619
|
// Every byte-valued Buffer factory creates a distinct view. Preserve its
|
|
@@ -1200,11 +1670,15 @@ function lowerBufferStaticValue(lowerer, call, access) {
|
|
|
1200
1670
|
!argNode.elements.nodes.some(ts.isSpreadElement)) {
|
|
1201
1671
|
// A number[] literal (contextually typed by the lib's readonly
|
|
1202
1672
|
// number[] slot — build it element-wise, the Set-seed pattern).
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1673
|
+
const elems = argNode.elements.nodes.map((el) => lowerer.lowerExprExpecting(el, F64));
|
|
1674
|
+
const seed = { kind: "arrayLit", elems, type: arrayOf(F64), loc };
|
|
1675
|
+
return withIgnoredBufferArgument(lowerer, args[1], seed, (array) => ({
|
|
1676
|
+
kind: "libCall",
|
|
1677
|
+
fn: "buffer.poolFromArray",
|
|
1678
|
+
args: [array],
|
|
1679
|
+
type: BYTES_U8,
|
|
1680
|
+
loc,
|
|
1681
|
+
}));
|
|
1208
1682
|
}
|
|
1209
1683
|
else {
|
|
1210
1684
|
const srcIr = lowerer.mapTypeOf(lowerer.typeOf(argNode));
|
|
@@ -1212,6 +1686,9 @@ function lowerBufferStaticValue(lowerer, call, access) {
|
|
|
1212
1686
|
// JS callback storage can be native DYN even when the checker
|
|
1213
1687
|
// reports any (or a narrowed Buffer). Dispatch on its actual ABI.
|
|
1214
1688
|
if (value.type.kind === "dyn") {
|
|
1689
|
+
const runtimeEncoding = dynBufferFromRuntimeEncoding(lowerer, value, args[1], loc);
|
|
1690
|
+
if (runtimeEncoding)
|
|
1691
|
+
return runtimeEncoding;
|
|
1215
1692
|
const encName = args[1] ? bufEncoding(lowerer, "Buffer.from", args[1]) : "utf8";
|
|
1216
1693
|
const enc = { kind: "strLit", value: encName, type: STRING, loc };
|
|
1217
1694
|
return {
|
|
@@ -1256,25 +1733,24 @@ function lowerBufferStaticValue(lowerer, call, access) {
|
|
|
1256
1733
|
// A checker type with no mapping (pako's conditional `O extends
|
|
1257
1734
|
// { toText: true } ? string : Uint8Array` result) whose lowered
|
|
1258
1735
|
// value is a u8 view copies like the typed form.
|
|
1259
|
-
if (
|
|
1260
|
-
(
|
|
1261
|
-
|
|
1262
|
-
return {
|
|
1736
|
+
if ((srcIr?.kind === "bytes" && srcIr.elem === "u8") ||
|
|
1737
|
+
(srcIr === null && value.type.kind === "bytes" && value.type.elem === "u8")) {
|
|
1738
|
+
return withIgnoredBufferArgument(lowerer, args[1], value, (bytes) => ({
|
|
1263
1739
|
kind: "libCall",
|
|
1264
1740
|
fn: "buffer.poolFromBytes",
|
|
1265
|
-
args: [
|
|
1741
|
+
args: [bytes],
|
|
1266
1742
|
type: BYTES_U8,
|
|
1267
1743
|
loc,
|
|
1268
|
-
};
|
|
1744
|
+
}));
|
|
1269
1745
|
}
|
|
1270
|
-
if (
|
|
1271
|
-
return {
|
|
1746
|
+
if (srcIr?.kind === "array" && srcIr.elem.kind === "f64") {
|
|
1747
|
+
return withIgnoredBufferArgument(lowerer, args[1], value, (array) => ({
|
|
1272
1748
|
kind: "libCall",
|
|
1273
1749
|
fn: "buffer.poolFromArray",
|
|
1274
|
-
args: [
|
|
1750
|
+
args: [array],
|
|
1275
1751
|
type: BYTES_U8,
|
|
1276
1752
|
loc,
|
|
1277
|
-
};
|
|
1753
|
+
}));
|
|
1278
1754
|
}
|
|
1279
1755
|
// A union of strings, u8 views and undefined/null (a JS-inferred
|
|
1280
1756
|
// npm result such as pako's deflate): the checked form dispatches
|