@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { dynUndefinedExpr, boolLit, helperLoc, numLit, strLit, varRef } from "../../ir/build.js";
|
|
1
|
+
import { dynUndefinedExpr, boolLit, helperLoc, nodeThrowExpr, numLit, strLit, varRef, } from "../../ir/build.js";
|
|
2
2
|
import { builtinClassDynValueOf, builtinClassKindOf } from "./builtins/builtin-class-dyn.js";
|
|
3
3
|
import { InternalCompilerError } from "../../errors.js";
|
|
4
4
|
import * as ts from "../ts7/adapter.js";
|
|
@@ -85,13 +85,540 @@ function inspectKey(name) {
|
|
|
85
85
|
function errorRenderable(info) {
|
|
86
86
|
// The builtin classes' name/message/code live in runtime slots (the
|
|
87
87
|
// ScrError prefix insp.error reads), not IR fields; only USER-declared
|
|
88
|
-
// fields are own properties the runtime rendering would miss.
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
-
|
|
88
|
+
// fields are own properties the runtime rendering would miss. A user
|
|
89
|
+
// class's layout repeats its builtin base's prefix fields, which are
|
|
90
|
+
// those same slots. #private fields are NOT own properties — Node never
|
|
91
|
+
// prints them — so they don't disqualify.
|
|
92
|
+
if (!info.builtinError) {
|
|
93
|
+
const inherited = new Set();
|
|
94
|
+
for (let c = info.base; c; c = c.base) {
|
|
95
|
+
if (c.builtinError || c.def.runtime)
|
|
96
|
+
for (const f of c.def.fields)
|
|
97
|
+
inherited.add(f.name);
|
|
98
|
+
}
|
|
99
|
+
if (info.def.fields.some((f) => !f.name.startsWith("#") && !inherited.has(f.name)))
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
93
102
|
return info.subclasses.every((s) => errorRenderable(s));
|
|
94
103
|
}
|
|
104
|
+
/** The accessors that change what Node reads for an error's header. The
|
|
105
|
+
* runtime renders the instance's own name and message slots. */
|
|
106
|
+
const ERROR_HEADER_ACCESSORS = [
|
|
107
|
+
"get:name",
|
|
108
|
+
"set:name",
|
|
109
|
+
"get:message",
|
|
110
|
+
"set:message",
|
|
111
|
+
"get:stack",
|
|
112
|
+
"set:stack",
|
|
113
|
+
];
|
|
114
|
+
/** Whether Node's header for an instance of `info`'s hierarchy can differ
|
|
115
|
+
* from the runtime's slots: a program class among its ancestors or
|
|
116
|
+
* descendants declares a `name`, `message` or `stack` accessor, or the
|
|
117
|
+
* program writes a prototype's `name` or `message`. */
|
|
118
|
+
function errorHeaderOverridden(lowerer, info) {
|
|
119
|
+
if (lowerer.prototypeMethodAccesses.has("name") || lowerer.prototypeMethodAccesses.has("message"))
|
|
120
|
+
return true;
|
|
121
|
+
const declares = (c) => !c.builtinError && !c.def.runtime && ERROR_HEADER_ACCESSORS.some((m) => c.methods.has(m));
|
|
122
|
+
for (let c = info.base; c; c = c.base)
|
|
123
|
+
if (declares(c))
|
|
124
|
+
return true;
|
|
125
|
+
const below = (c) => declares(c) || c.subclasses.some(below);
|
|
126
|
+
return below(info);
|
|
127
|
+
}
|
|
128
|
+
/** Error keys Node's error inspector folds into the base or hides. */
|
|
129
|
+
const ERROR_SPECIAL_KEYS = new Set(["name", "message", "stack", "cause", "errors"]);
|
|
130
|
+
/** The declared own (enumerable) fields of a user error class, in layout
|
|
131
|
+
* order (the base chain first). */
|
|
132
|
+
function ownErrorFields(info) {
|
|
133
|
+
// The builtin bases' layout fields (name, message) are runtime slots the
|
|
134
|
+
// error base already renders, not own enumerable properties.
|
|
135
|
+
const builtin = new Set();
|
|
136
|
+
for (let c = info.base; c; c = c.base) {
|
|
137
|
+
if (c.builtinError || c.def.runtime)
|
|
138
|
+
for (const f of c.def.fields)
|
|
139
|
+
builtin.add(f.name);
|
|
140
|
+
}
|
|
141
|
+
return info.def.fields.filter((f) => isClassOwnEnumerableFieldName(f.name) && !builtin.has(f.name));
|
|
142
|
+
}
|
|
143
|
+
/** `info` and its descendants that declare fields, most-derived first (a
|
|
144
|
+
* runtime instance tests against its own class before an ancestor's). */
|
|
145
|
+
function fieldedErrorClasses(info) {
|
|
146
|
+
const out = [];
|
|
147
|
+
const visit = (c) => {
|
|
148
|
+
for (const s of c.subclasses)
|
|
149
|
+
visit(s);
|
|
150
|
+
if (!c.builtinError && !c.def.runtime && ownErrorFields(c).length > 0)
|
|
151
|
+
out.push(c);
|
|
152
|
+
};
|
|
153
|
+
visit(info);
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
/** Why a fielded error class's own properties have no static rendering,
|
|
157
|
+
* or null when every field renders. `visiting` and `out` are the caller's
|
|
158
|
+
* inspectSupport walk: a field typed as the class itself (`next?: Chain`)
|
|
159
|
+
* is a recursive shape, not a new walk. */
|
|
160
|
+
function fieldedErrorReason(lowerer, info, visiting = new Set(), out = { recursive: false }) {
|
|
161
|
+
const key = `error:${info.def.name}`;
|
|
162
|
+
if (visiting.has(key)) {
|
|
163
|
+
out.recursive = true;
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
visiting.add(key);
|
|
167
|
+
try {
|
|
168
|
+
for (let c = info; c && !c.builtinError && !c.def.runtime; c = c.base) {
|
|
169
|
+
// Node prints the own properties in creation order, which puts a
|
|
170
|
+
// declared `cause` among the fields; the cause renders after them.
|
|
171
|
+
if (c.fieldOrder.some((f) => f.errorCause))
|
|
172
|
+
return "its field 'cause' is one Node's error inspector treats specially";
|
|
173
|
+
// A JavaScript class's fields exist once its constructor creates them,
|
|
174
|
+
// which can be conditional; the layout reads every field.
|
|
175
|
+
if (c.decl && isJsSourceFile(c.decl.getSourceFile()) && ownErrorFields(c).length > 0)
|
|
176
|
+
return "its fields are JavaScript properties, which its constructor may not create";
|
|
177
|
+
}
|
|
178
|
+
for (const f of ownErrorFields(info)) {
|
|
179
|
+
if (ERROR_SPECIAL_KEYS.has(f.name))
|
|
180
|
+
return `its field '${f.name}' is one Node's error inspector treats specially`;
|
|
181
|
+
const why = inspectSupport(lowerer, f.type, visiting, out);
|
|
182
|
+
if (why !== null)
|
|
183
|
+
return `its field '${f.name}': ${why}`;
|
|
184
|
+
}
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
visiting.delete(key);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/** True when an instance of `c` can contain itself: its fields reach `c`
|
|
192
|
+
* or one of its bases, whose slots can hold a `c` (`next: Chain` in a
|
|
193
|
+
* subclass of Chain, a field typed as Error). */
|
|
194
|
+
function errorInstanceReachesItself(lowerer, c) {
|
|
195
|
+
const holders = new Set();
|
|
196
|
+
for (let a = c; a; a = a.base)
|
|
197
|
+
holders.add(a.def.name);
|
|
198
|
+
const seen = new Set();
|
|
199
|
+
const walk = (u) => {
|
|
200
|
+
for (const x of typeConstituents(lowerer, u)) {
|
|
201
|
+
if (x.kind === "object" && holders.has(x.className))
|
|
202
|
+
return true;
|
|
203
|
+
const k = typeKey(x);
|
|
204
|
+
if (!seen.has(k)) {
|
|
205
|
+
seen.add(k);
|
|
206
|
+
if (walk(x))
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return false;
|
|
211
|
+
};
|
|
212
|
+
return walk({ kind: "object", className: c.def.name });
|
|
213
|
+
}
|
|
214
|
+
/** An error value whose runtime class may be a program-declared subclass,
|
|
215
|
+
* which may declare fields (`class Bailable extends Error { bail = false }`)
|
|
216
|
+
* or carry a `cause`: Node prints the error base (`[Bailable [Error]: m]`,
|
|
217
|
+
* the stackless form compiled errors use) followed by the own properties,
|
|
218
|
+
* `[Bailable [Error]: m] { bail: true }`, with the usual single-line/
|
|
219
|
+
* multi-line choice counting the base. Each program class (most-derived
|
|
220
|
+
* first) is an instanceof arm; other values keep the runtime's error
|
|
221
|
+
* rendering. Beyond the depth budget an instance with own properties
|
|
222
|
+
* prints `[Name]`, as Node does for any object with keys; one without
|
|
223
|
+
* prints its header. */
|
|
224
|
+
function errorInspectHelper(lowerer, t, info, loc) {
|
|
225
|
+
const key = `insp.userError:${typeKey(t)}`;
|
|
226
|
+
const existing = lowerer.inspectHelpers.get(key);
|
|
227
|
+
if (existing)
|
|
228
|
+
return existing;
|
|
229
|
+
const name = `%util.insp.${lowerer.inspectHelpers.size}`;
|
|
230
|
+
lowerer.inspectHelpers.set(key, name);
|
|
231
|
+
const v = () => varRef("v.0", t, loc);
|
|
232
|
+
const r = () => varRef("r.0", F64, loc);
|
|
233
|
+
const d = () => varRef("d.0", F64, loc);
|
|
234
|
+
const rPlus1 = () => ({
|
|
235
|
+
kind: "bin",
|
|
236
|
+
op: "+",
|
|
237
|
+
left: r(),
|
|
238
|
+
right: numLit(1, loc),
|
|
239
|
+
type: F64,
|
|
240
|
+
loc,
|
|
241
|
+
});
|
|
242
|
+
const base = () => ({
|
|
243
|
+
kind: "libCall",
|
|
244
|
+
fn: "insp.error",
|
|
245
|
+
args: [v(), r(), d()],
|
|
246
|
+
type: STRING,
|
|
247
|
+
loc,
|
|
248
|
+
});
|
|
249
|
+
const error = () => lowerer.upcastTo(v(), "%Error");
|
|
250
|
+
const hasCause = () => ({
|
|
251
|
+
kind: "libCall",
|
|
252
|
+
fn: "insp.errorHasCause",
|
|
253
|
+
args: [error()],
|
|
254
|
+
type: BOOL,
|
|
255
|
+
loc,
|
|
256
|
+
});
|
|
257
|
+
const entry = (text) => ({
|
|
258
|
+
kind: "exprStmt",
|
|
259
|
+
expr: {
|
|
260
|
+
kind: "libCall",
|
|
261
|
+
fn: "insp.entry",
|
|
262
|
+
args: [text, boolLit(false, loc)],
|
|
263
|
+
type: VOID,
|
|
264
|
+
loc,
|
|
265
|
+
},
|
|
266
|
+
loc,
|
|
267
|
+
});
|
|
268
|
+
/** The own properties of an instance of `c`: its fields, then its
|
|
269
|
+
* `cause` (an assignment in the constructor or later, or the
|
|
270
|
+
* constructor's options, which Node lists last as `[cause]`). */
|
|
271
|
+
const propertiesArm = (c, display, fields) => {
|
|
272
|
+
const cls = { kind: "object", className: c.def.name };
|
|
273
|
+
const instance = c.def.name === t.className ? v() : { kind: "downcast", value: v(), type: cls, loc };
|
|
274
|
+
// A class whose fields can hold the instance itself (`next: Chain`)
|
|
275
|
+
// runs Node's circular machinery, as other cycle-capable objects do:
|
|
276
|
+
// an instance already on the traversal stack renders [Circular *N],
|
|
277
|
+
// before the depth answer, and the frame's text gets the <ref *N>
|
|
278
|
+
// prefix when the walk found it circular.
|
|
279
|
+
const onCycle = errorInstanceReachesItself(lowerer, c);
|
|
280
|
+
const circular = () => varRef("cc.0", F64, loc);
|
|
281
|
+
const arm = [
|
|
282
|
+
...(onCycle
|
|
283
|
+
? [
|
|
284
|
+
{
|
|
285
|
+
kind: "varDecl",
|
|
286
|
+
localId: "cc.0",
|
|
287
|
+
init: { kind: "libCall", fn: "insp.circCheck", args: [v()], type: F64, loc },
|
|
288
|
+
loc,
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
kind: "if",
|
|
292
|
+
cond: {
|
|
293
|
+
kind: "bin",
|
|
294
|
+
op: ">",
|
|
295
|
+
left: circular(),
|
|
296
|
+
right: numLit(0, loc),
|
|
297
|
+
type: BOOL,
|
|
298
|
+
loc,
|
|
299
|
+
},
|
|
300
|
+
then: [
|
|
301
|
+
{
|
|
302
|
+
kind: "return",
|
|
303
|
+
value: {
|
|
304
|
+
kind: "libCall",
|
|
305
|
+
fn: "insp.circular",
|
|
306
|
+
args: [circular()],
|
|
307
|
+
type: STRING,
|
|
308
|
+
loc,
|
|
309
|
+
},
|
|
310
|
+
loc,
|
|
311
|
+
},
|
|
312
|
+
],
|
|
313
|
+
else_: null,
|
|
314
|
+
loc,
|
|
315
|
+
},
|
|
316
|
+
]
|
|
317
|
+
: []),
|
|
318
|
+
{
|
|
319
|
+
kind: "if",
|
|
320
|
+
cond: { kind: "bin", op: ">", left: r(), right: d(), type: BOOL, loc },
|
|
321
|
+
then: [{ kind: "return", value: strLit(`[${display}]`, loc), loc }],
|
|
322
|
+
else_: null,
|
|
323
|
+
loc,
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
kind: "varDecl",
|
|
327
|
+
localId: "base.0",
|
|
328
|
+
init: improvedErrorBase(lowerer, v(), base(), display, loc),
|
|
329
|
+
loc,
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
kind: "exprStmt",
|
|
333
|
+
expr: { kind: "libCall", fn: "insp.begin", args: [rPlus1()], type: VOID, loc },
|
|
334
|
+
loc,
|
|
335
|
+
},
|
|
336
|
+
...(onCycle
|
|
337
|
+
? [
|
|
338
|
+
{
|
|
339
|
+
kind: "exprStmt",
|
|
340
|
+
expr: { kind: "libCall", fn: "insp.seenPush", args: [v()], type: VOID, loc },
|
|
341
|
+
loc,
|
|
342
|
+
},
|
|
343
|
+
]
|
|
344
|
+
: []),
|
|
345
|
+
];
|
|
346
|
+
for (const f of fields) {
|
|
347
|
+
const read = {
|
|
348
|
+
kind: "fieldGet",
|
|
349
|
+
obj: instance,
|
|
350
|
+
className: c.def.name,
|
|
351
|
+
field: f.name,
|
|
352
|
+
type: f.type,
|
|
353
|
+
loc,
|
|
354
|
+
};
|
|
355
|
+
arm.push(entry(concatAll([
|
|
356
|
+
strLit(`${inspectKey(f.name)}: `, loc),
|
|
357
|
+
inspectExpr(lowerer, f.type, read, rPlus1(), d(), loc),
|
|
358
|
+
], loc)));
|
|
359
|
+
}
|
|
360
|
+
arm.push({
|
|
361
|
+
kind: "if",
|
|
362
|
+
cond: hasCause(),
|
|
363
|
+
then: [
|
|
364
|
+
entry({
|
|
365
|
+
kind: "libCall",
|
|
366
|
+
fn: "insp.errorCause",
|
|
367
|
+
args: [error(), rPlus1(), d()],
|
|
368
|
+
type: STRING,
|
|
369
|
+
loc,
|
|
370
|
+
}),
|
|
371
|
+
],
|
|
372
|
+
else_: null,
|
|
373
|
+
loc,
|
|
374
|
+
});
|
|
375
|
+
const ended = {
|
|
376
|
+
kind: "libCall",
|
|
377
|
+
fn: "insp.end",
|
|
378
|
+
args: [
|
|
379
|
+
varRef("base.0", STRING, loc),
|
|
380
|
+
strLit("{", loc),
|
|
381
|
+
strLit("}", loc),
|
|
382
|
+
rPlus1(),
|
|
383
|
+
boolLit(false, loc),
|
|
384
|
+
boolLit(false, loc),
|
|
385
|
+
],
|
|
386
|
+
type: STRING,
|
|
387
|
+
loc,
|
|
388
|
+
};
|
|
389
|
+
arm.push({
|
|
390
|
+
kind: "return",
|
|
391
|
+
value: onCycle
|
|
392
|
+
? { kind: "libCall", fn: "insp.refWrap", args: [v(), ended], type: STRING, loc }
|
|
393
|
+
: ended,
|
|
394
|
+
loc,
|
|
395
|
+
});
|
|
396
|
+
return arm;
|
|
397
|
+
};
|
|
398
|
+
const body = [];
|
|
399
|
+
for (const c of userErrorClasses(info)) {
|
|
400
|
+
const display = c.def.jsName ?? c.decl?.name?.text ?? c.def.name.replace(/^%/, "");
|
|
401
|
+
const fields = ownErrorFields(c);
|
|
402
|
+
const why = fields.length > 0 ? fieldedErrorReason(lowerer, c) : null;
|
|
403
|
+
let arm;
|
|
404
|
+
if (why !== null) {
|
|
405
|
+
// An instance of a subclass whose own properties have no rendering
|
|
406
|
+
// throws a named refusal instead of printing a partial object.
|
|
407
|
+
arm = [
|
|
408
|
+
{
|
|
409
|
+
kind: "return",
|
|
410
|
+
value: nodeThrowExpr(0, "SC2020", `inspecting a '${display}' error (${why}) is not supported yet`, STRING, loc),
|
|
411
|
+
loc,
|
|
412
|
+
},
|
|
413
|
+
];
|
|
414
|
+
}
|
|
415
|
+
else if (fields.length === 0) {
|
|
416
|
+
// A field-less program class: without a `cause` it has no own
|
|
417
|
+
// properties, and Node prints the header alone at any depth.
|
|
418
|
+
arm = [
|
|
419
|
+
{
|
|
420
|
+
kind: "if",
|
|
421
|
+
cond: { kind: "unary", op: "!", operand: hasCause(), type: BOOL, loc },
|
|
422
|
+
then: [
|
|
423
|
+
{ kind: "return", value: improvedErrorBase(lowerer, v(), base(), display, loc), loc },
|
|
424
|
+
],
|
|
425
|
+
else_: null,
|
|
426
|
+
loc,
|
|
427
|
+
},
|
|
428
|
+
...propertiesArm(c, display, fields),
|
|
429
|
+
];
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
arm = propertiesArm(c, display, fields);
|
|
433
|
+
}
|
|
434
|
+
if (c.def.name === t.className) {
|
|
435
|
+
body.push({ kind: "block", body: arm, loc });
|
|
436
|
+
break;
|
|
437
|
+
}
|
|
438
|
+
body.push({
|
|
439
|
+
kind: "if",
|
|
440
|
+
cond: { kind: "instanceOf", value: v(), className: c.def.name, type: BOOL, loc },
|
|
441
|
+
then: arm,
|
|
442
|
+
else_: null,
|
|
443
|
+
loc,
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
if (body.at(-1)?.kind !== "block")
|
|
447
|
+
body.push({ kind: "return", value: base(), loc });
|
|
448
|
+
const fn = {
|
|
449
|
+
name,
|
|
450
|
+
params: [
|
|
451
|
+
{ localId: "v.0", name: "v", type: t },
|
|
452
|
+
{ localId: "r.0", name: "r", type: F64 },
|
|
453
|
+
{ localId: "d.0", name: "d", type: F64 },
|
|
454
|
+
],
|
|
455
|
+
returnType: STRING,
|
|
456
|
+
locals: [
|
|
457
|
+
{ id: "v.0", name: "v", type: t, mutable: false },
|
|
458
|
+
{ id: "r.0", name: "r", type: F64, mutable: false },
|
|
459
|
+
{ id: "d.0", name: "d", type: F64, mutable: false },
|
|
460
|
+
{ id: "base.0", name: "base", type: STRING, mutable: false },
|
|
461
|
+
{ id: "cc.0", name: "cc", type: F64, mutable: false },
|
|
462
|
+
{ id: "name.0", name: "name", type: STRING, mutable: true },
|
|
463
|
+
{ id: "raw.0", name: "raw", type: STRING, mutable: true },
|
|
464
|
+
],
|
|
465
|
+
body,
|
|
466
|
+
loc,
|
|
467
|
+
};
|
|
468
|
+
// Dynamic stores (a JavaScript class's `this.x = ...` outside its
|
|
469
|
+
// declared fields, or a write through an untyped reference) add a
|
|
470
|
+
// property bag to a class after this helper was built. The rendering
|
|
471
|
+
// reads only a `cause` from it, so an instance whose bag holds another
|
|
472
|
+
// property throws a named refusal instead of printing a partial object.
|
|
473
|
+
lowerer.shapeOrderHelperFinalizers.push(() => {
|
|
474
|
+
const bagged = [info, ...userErrorClasses(info)].filter((c) => !c.builtinError &&
|
|
475
|
+
!c.def.runtime &&
|
|
476
|
+
c.def.fields.some((f) => f.name === DYN_CLASS_PROPERTIES));
|
|
477
|
+
if (bagged.length === 0)
|
|
478
|
+
return;
|
|
479
|
+
fn.body = [
|
|
480
|
+
...bagged.map((c) => ({
|
|
481
|
+
kind: "if",
|
|
482
|
+
cond: {
|
|
483
|
+
kind: "logical",
|
|
484
|
+
op: "&&",
|
|
485
|
+
left: { kind: "instanceOf", value: v(), className: c.def.name, type: BOOL, loc },
|
|
486
|
+
right: {
|
|
487
|
+
kind: "libCall",
|
|
488
|
+
fn: "insp.errorBagHasProperties",
|
|
489
|
+
args: [
|
|
490
|
+
{
|
|
491
|
+
kind: "fieldGet",
|
|
492
|
+
obj: c.def.name === t.className
|
|
493
|
+
? v()
|
|
494
|
+
: {
|
|
495
|
+
kind: "downcast",
|
|
496
|
+
value: v(),
|
|
497
|
+
type: { kind: "object", className: c.def.name },
|
|
498
|
+
loc,
|
|
499
|
+
},
|
|
500
|
+
className: c.def.name,
|
|
501
|
+
field: DYN_CLASS_PROPERTIES,
|
|
502
|
+
type: DYN,
|
|
503
|
+
loc,
|
|
504
|
+
},
|
|
505
|
+
],
|
|
506
|
+
type: BOOL,
|
|
507
|
+
loc,
|
|
508
|
+
},
|
|
509
|
+
type: BOOL,
|
|
510
|
+
loc,
|
|
511
|
+
},
|
|
512
|
+
then: [
|
|
513
|
+
{
|
|
514
|
+
kind: "return",
|
|
515
|
+
value: nodeThrowExpr(0, "SC2020", `inspecting a '${c.def.jsName ?? c.def.name.replace(/^%/, "")}' error with properties created at run time is not supported yet`, STRING, loc),
|
|
516
|
+
loc,
|
|
517
|
+
},
|
|
518
|
+
],
|
|
519
|
+
else_: null,
|
|
520
|
+
loc,
|
|
521
|
+
})),
|
|
522
|
+
...body,
|
|
523
|
+
];
|
|
524
|
+
});
|
|
525
|
+
lowerer.liftedFns.push(fn);
|
|
526
|
+
return name;
|
|
527
|
+
}
|
|
528
|
+
/** The program-declared classes among `info` and its descendants, most
|
|
529
|
+
* derived first (an instance tests against its own class before an
|
|
530
|
+
* ancestor's). Runtime-provided error classes are not among them. */
|
|
531
|
+
function userErrorClasses(info) {
|
|
532
|
+
const out = [];
|
|
533
|
+
const visit = (c) => {
|
|
534
|
+
for (const s of c.subclasses)
|
|
535
|
+
visit(s);
|
|
536
|
+
if (!c.builtinError && !c.def.runtime)
|
|
537
|
+
out.push(c);
|
|
538
|
+
};
|
|
539
|
+
visit(info);
|
|
540
|
+
return out;
|
|
541
|
+
}
|
|
542
|
+
/** Node's improveStack over the stackless base (`[Error: m]`): when the
|
|
543
|
+
* instance's constructor name differs from its `name` and the name ends in
|
|
544
|
+
* "Error", the header names both — `[Bailable [Error]: m]`, or
|
|
545
|
+
* `[FetchError: m]` when the constructor name already contains it. */
|
|
546
|
+
function improvedErrorBase(lowerer, value, base, display, loc) {
|
|
547
|
+
const str = (method, receiver, args, type) => ({
|
|
548
|
+
kind: "strIntrinsic",
|
|
549
|
+
method,
|
|
550
|
+
receiver,
|
|
551
|
+
args,
|
|
552
|
+
type,
|
|
553
|
+
loc,
|
|
554
|
+
});
|
|
555
|
+
const and = (left, right) => ({
|
|
556
|
+
kind: "logical",
|
|
557
|
+
op: "&&",
|
|
558
|
+
left,
|
|
559
|
+
right,
|
|
560
|
+
type: BOOL,
|
|
561
|
+
loc,
|
|
562
|
+
});
|
|
563
|
+
const eq = (left, right, negated = false) => ({
|
|
564
|
+
kind: "strEq",
|
|
565
|
+
negated,
|
|
566
|
+
left,
|
|
567
|
+
right,
|
|
568
|
+
type: BOOL,
|
|
569
|
+
loc,
|
|
570
|
+
});
|
|
571
|
+
const nameRef = () => varRef("name.0", STRING, loc);
|
|
572
|
+
const baseRef = () => varRef("raw.0", STRING, loc);
|
|
573
|
+
const after = () => ({
|
|
574
|
+
kind: "bin",
|
|
575
|
+
op: "+",
|
|
576
|
+
left: str("length", nameRef(), [], F64),
|
|
577
|
+
right: numLit(1, loc),
|
|
578
|
+
type: F64,
|
|
579
|
+
loc,
|
|
580
|
+
});
|
|
581
|
+
const next = () => str("charAt", baseRef(), [after()], STRING);
|
|
582
|
+
const cond = and(and(eq(nameRef(), strLit(display, loc), true), str("endsWith", nameRef(), [strLit("Error", loc)], BOOL)), and(str("startsWith", baseRef(), [concatAll([strLit("[", loc), nameRef()], loc)], BOOL), {
|
|
583
|
+
kind: "logical",
|
|
584
|
+
op: "||",
|
|
585
|
+
left: eq(next(), strLit(":", loc)),
|
|
586
|
+
right: eq(next(), strLit("]", loc)),
|
|
587
|
+
type: BOOL,
|
|
588
|
+
loc,
|
|
589
|
+
}));
|
|
590
|
+
const rest = () => str("slice", baseRef(), [after()], STRING);
|
|
591
|
+
const improved = {
|
|
592
|
+
kind: "ternary",
|
|
593
|
+
cond: str("includes", strLit(display, loc), [nameRef()], BOOL),
|
|
594
|
+
then: concatAll([strLit(`[${display}`, loc), rest()], loc),
|
|
595
|
+
else_: concatAll([strLit(`[${display} [`, loc), nameRef(), strLit("]", loc), rest()], loc),
|
|
596
|
+
type: STRING,
|
|
597
|
+
loc,
|
|
598
|
+
};
|
|
599
|
+
return {
|
|
600
|
+
kind: "seqExpr",
|
|
601
|
+
stmts: [
|
|
602
|
+
{
|
|
603
|
+
kind: "varDecl",
|
|
604
|
+
localId: "name.0",
|
|
605
|
+
init: {
|
|
606
|
+
kind: "fieldGet",
|
|
607
|
+
obj: lowerer.upcastTo(value, "%Error"),
|
|
608
|
+
className: "%Error",
|
|
609
|
+
field: "name",
|
|
610
|
+
type: STRING,
|
|
611
|
+
loc,
|
|
612
|
+
},
|
|
613
|
+
loc,
|
|
614
|
+
},
|
|
615
|
+
{ kind: "varDecl", localId: "raw.0", init: base, loc },
|
|
616
|
+
],
|
|
617
|
+
result: { kind: "ternary", cond, then: improved, else_: baseRef(), type: STRING, loc },
|
|
618
|
+
type: STRING,
|
|
619
|
+
loc,
|
|
620
|
+
};
|
|
621
|
+
}
|
|
95
622
|
function isErrorClass(lowerer, className) {
|
|
96
623
|
if (RUNTIME_ERROR_CLASSES.has(className))
|
|
97
624
|
return true;
|
|
@@ -200,9 +727,19 @@ function inspectSupport(lowerer, t, visiting, out) {
|
|
|
200
727
|
if (eventTargetRootOf(info) !== null)
|
|
201
728
|
return null;
|
|
202
729
|
if (isErrorClass(lowerer, t.className)) {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
730
|
+
if (userErrorClasses(info).length > 0 && errorHeaderOverridden(lowerer, info))
|
|
731
|
+
return "error subclasses whose name, message or stack is an accessor or a prototype property have no inspect lowering yet";
|
|
732
|
+
if (errorRenderable(info))
|
|
733
|
+
return null;
|
|
734
|
+
// Subclasses with declared fields render the error base followed
|
|
735
|
+
// by their own properties. The static class's own fields must
|
|
736
|
+
// render; a subclass whose fields cannot is a runtime refusal on
|
|
737
|
+
// its own instances only (see errorInspectHelper).
|
|
738
|
+
const own = fieldedErrorClasses(info).find((c) => c === info);
|
|
739
|
+
const ownWhy = own ? fieldedErrorReason(lowerer, own, visiting, out) : null;
|
|
740
|
+
if (ownWhy !== null)
|
|
741
|
+
return `'${t.className.replace(/^%(m\d+\.)?/, "")}' error values (${ownWhy})`;
|
|
742
|
+
return null;
|
|
206
743
|
}
|
|
207
744
|
// A class with subclasses, or a JavaScript class, renders through its
|
|
208
745
|
// checked-dynamic view, which names the instance's own class and holds
|
|
@@ -347,6 +884,16 @@ export function inspectExpr(lowerer, t, value, recurse, depth, loc) {
|
|
|
347
884
|
};
|
|
348
885
|
}
|
|
349
886
|
if (isErrorClass(lowerer, t.className)) {
|
|
887
|
+
const info = lowerer.classes.get(t.className);
|
|
888
|
+
if (info && userErrorClasses(info).length > 0) {
|
|
889
|
+
return {
|
|
890
|
+
kind: "call",
|
|
891
|
+
callee: errorInspectHelper(lowerer, t, info, loc),
|
|
892
|
+
args: [value, recurse, depth],
|
|
893
|
+
type: STRING,
|
|
894
|
+
loc,
|
|
895
|
+
};
|
|
896
|
+
}
|
|
350
897
|
return {
|
|
351
898
|
kind: "libCall",
|
|
352
899
|
fn: "insp.error",
|
|
@@ -452,8 +999,19 @@ function typeConstituents(lowerer, u) {
|
|
|
452
999
|
return [u.key, u.value];
|
|
453
1000
|
case "union":
|
|
454
1001
|
return lowerer.unions.get(u.unionId)?.arms.slice() ?? [];
|
|
455
|
-
case "object":
|
|
456
|
-
|
|
1002
|
+
case "object": {
|
|
1003
|
+
const info = lowerer.classes.get(u.className);
|
|
1004
|
+
if (!info)
|
|
1005
|
+
return [];
|
|
1006
|
+
const types = info.def.fields.map((f) => f.type);
|
|
1007
|
+
// An error value can be an instance of a program-declared subclass,
|
|
1008
|
+
// whose own fields its inspection renders (errorInspectHelper).
|
|
1009
|
+
if (isErrorClass(lowerer, u.className))
|
|
1010
|
+
for (const c of userErrorClasses(info))
|
|
1011
|
+
for (const f of ownErrorFields(c))
|
|
1012
|
+
types.push(f.type);
|
|
1013
|
+
return types;
|
|
1014
|
+
}
|
|
457
1015
|
default:
|
|
458
1016
|
return [];
|
|
459
1017
|
}
|