@scriptc/compiler 0.4.7 → 0.4.8
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/node-fallback/child_process.d.ts +71 -22
- package/ambient/node-fallback/crypto.d.ts +15 -7
- package/ambient/node-fallback/events.d.ts +23 -5
- package/ambient/node-fallback/fs.d.ts +3 -2
- package/ambient/node-fallback/http.d.ts +23 -17
- package/ambient/node-fallback/https.d.ts +5 -2
- package/ambient/node-fallback/net.d.ts +6 -0
- package/ambient/node-fallback/os.d.ts +11 -1
- package/ambient/node-fallback/path-posix.d.ts +6 -0
- package/ambient/node-fallback/path-win32.d.ts +5 -0
- package/ambient/node-fallback/path.d.ts +2 -0
- package/ambient/node-fallback/zlib.d.ts +31 -2
- package/ambient/scriptc-node-fallback.d.ts +37 -7
- package/ambient/scriptc.d.ts +7 -2
- package/dist/backend/executable-features.js +11 -3
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/library-pack.d.ts +6 -0
- package/dist/backend/library-pack.js +17 -6
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/library-pack.test.d.ts +1 -0
- package/dist/backend/library-pack.test.js +28 -0
- package/dist/backend/library-pack.test.js.map +1 -0
- package/dist/backend/linker.d.ts +9 -2
- package/dist/backend/linker.js +190 -32
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/lld.d.ts +8 -4
- package/dist/backend/lld.js +19 -13
- package/dist/backend/lld.js.map +1 -1
- package/dist/backend/lld.test.js +3 -1
- package/dist/backend/lld.test.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +15 -2
- package/dist/backend/llvm/alloc.js +172 -36
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/alloc.test.js +69 -1
- package/dist/backend/llvm/alloc.test.js.map +1 -1
- package/dist/backend/llvm/arenas.d.ts +17 -4
- package/dist/backend/llvm/arenas.js +105 -10
- package/dist/backend/llvm/arenas.js.map +1 -1
- package/dist/backend/llvm/arenas.test.js +229 -0
- package/dist/backend/llvm/arenas.test.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.js +10 -1
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-headers.js +6 -0
- package/dist/backend/llvm/bytes-headers.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +25 -0
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.js +10 -0
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +16 -9
- package/dist/backend/llvm/classes.js +142 -37
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +42 -0
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/cpu-dispatch.d.ts +15 -5
- package/dist/backend/llvm/cpu-dispatch.js +31 -7
- package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +12 -3
- package/dist/backend/llvm/dyn.js +31 -7
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +67 -4
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-module.js +90 -39
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-module.test.d.ts +1 -0
- package/dist/backend/llvm/emit-module.test.js +52 -0
- package/dist/backend/llvm/emit-module.test.js.map +1 -0
- package/dist/backend/llvm/emit-statements.js +99 -15
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +113 -8
- package/dist/backend/llvm/emitter.js +438 -67
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +31 -3
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +19 -1
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +16 -1
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +18 -2
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +31 -10
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +31 -3
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-records.d.ts +1 -1
- package/dist/backend/llvm/expr-records.js +124 -56
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +17 -0
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/js-groups.d.ts +21 -0
- package/dist/backend/llvm/js-groups.js +277 -0
- package/dist/backend/llvm/js-groups.js.map +1 -0
- package/dist/backend/llvm/js-ic.d.ts +19 -1
- package/dist/backend/llvm/js-ic.js +96 -23
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +132 -1
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +33 -6
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +44 -3
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +69 -2
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +32 -0
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/loop-state.js +7 -2
- package/dist/backend/llvm/loop-state.js.map +1 -1
- package/dist/backend/llvm/map-entry-fusion.d.ts +8 -0
- package/dist/backend/llvm/map-entry-fusion.js +3 -3
- package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +6 -6
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.js +7 -6
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.test.js +4 -1
- package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
- package/dist/backend/llvm/receivers.js +3 -0
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/record-entry-fusion.d.ts +32 -0
- package/dist/backend/llvm/record-entry-fusion.js +217 -0
- package/dist/backend/llvm/record-entry-fusion.js.map +1 -0
- package/dist/backend/llvm/record-results.d.ts +5 -2
- package/dist/backend/llvm/record-results.js +13 -12
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/record-views.js +12 -6
- package/dist/backend/llvm/record-views.js.map +1 -1
- package/dist/backend/llvm/reference-effects.js +1 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.js +3 -0
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/region-ir.js +1 -0
- package/dist/backend/llvm/region-ir.js.map +1 -1
- package/dist/backend/llvm/region-sites.d.ts +18 -0
- package/dist/backend/llvm/region-sites.js +79 -1
- package/dist/backend/llvm/region-sites.js.map +1 -1
- package/dist/backend/llvm/runtime-registries.test.js +53 -6
- package/dist/backend/llvm/runtime-registries.test.js.map +1 -1
- package/dist/backend/llvm/serialized-ir-emission.test.js +3 -1
- package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +33 -3
- package/dist/backend/llvm/shapes.js +183 -13
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +1 -2
- package/dist/backend/llvm/stack-objects.js +8 -5
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +12 -0
- package/dist/backend/llvm/walkers.js +46 -2
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.js +12 -2
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +13 -0
- package/dist/backend/may-throw.test.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +48 -8
- package/dist/backend/native/executable.js +55 -13
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/helper-identity-record.d.ts +11 -0
- package/dist/backend/native/helper-identity-record.js +76 -0
- package/dist/backend/native/helper-identity-record.js.map +1 -0
- package/dist/backend/native/helper-identity-record.test.d.ts +1 -0
- package/dist/backend/native/helper-identity-record.test.js +101 -0
- package/dist/backend/native/helper-identity-record.test.js.map +1 -0
- package/dist/backend/native/library.js +9 -1
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.js +4 -1
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native/vendor.d.ts +1 -1
- package/dist/backend/native/vendor.js +1 -1
- package/dist/backend/native/vendor.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +13 -10
- package/dist/backend/native-codegen-core.js +26 -13
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.js +27 -8
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +110 -14
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +37 -8
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/runtime-pack-core.d.ts +17 -2
- package/dist/backend/runtime-pack-core.js +18 -3
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +211 -2
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/tree-classes.d.ts +42 -0
- package/dist/backend/tree-classes.js +723 -0
- package/dist/backend/tree-classes.js.map +1 -0
- package/dist/backend/tree-classes.test.d.ts +1 -0
- package/dist/backend/tree-classes.test.js +338 -0
- package/dist/backend/tree-classes.test.js.map +1 -0
- package/dist/backend/vendor-archives.d.ts +5 -1
- package/dist/backend/vendor-archives.js +51 -7
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +25 -4
- package/dist/backend/vendor-inputs.js +68 -4
- package/dist/backend/vendor-inputs.js.map +1 -1
- package/dist/backend/vendor-inputs.test.js +35 -1
- package/dist/backend/vendor-inputs.test.js.map +1 -1
- package/dist/backend/warm-cache.js +1 -1
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/compat/fetch-profile.js +2 -2
- package/dist/coverage/report.js +47 -0
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +1 -1
- package/dist/diagnostics/codes.d.ts +8 -0
- package/dist/diagnostics/codes.js +8 -0
- package/dist/diagnostics/codes.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +27 -9
- package/dist/diagnostics/diagnostic.js +60 -19
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +18 -0
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +21 -2
- package/dist/executable/executable-cache.js +21 -1
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +123 -1
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +199 -248
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +200 -18
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/builtin-modules.d.ts +4 -0
- package/dist/frontend/builtin-modules.js +10 -0
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/early-errors.d.ts +12 -2
- package/dist/frontend/early-errors.js +535 -4
- package/dist/frontend/early-errors.js.map +1 -1
- package/dist/frontend/early-errors.test.js +165 -0
- package/dist/frontend/early-errors.test.js.map +1 -1
- package/dist/frontend/inferred-js-diagnostics.test.js +65 -0
- package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
- package/dist/frontend/jsx-opinion-sites.test.d.ts +1 -0
- package/dist/frontend/jsx-opinion-sites.test.js +86 -0
- package/dist/frontend/jsx-opinion-sites.test.js.map +1 -0
- package/dist/frontend/lib-exports.d.ts +23 -4
- package/dist/frontend/lib-exports.js +98 -26
- package/dist/frontend/lib-exports.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.js +21 -3
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/buffers.d.ts +8 -0
- package/dist/frontend/lowering/buffers.js +43 -0
- package/dist/frontend/lowering/buffers.js.map +1 -0
- package/dist/frontend/lowering/builtin-calls.js +4 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtin-namespaces.d.ts +3 -2
- package/dist/frontend/lowering/builtin-namespaces.js +24 -3
- package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
- package/dist/frontend/lowering/builtin-statics.d.ts +24 -0
- package/dist/frontend/lowering/builtin-statics.js +407 -0
- package/dist/frontend/lowering/builtin-statics.js.map +1 -0
- package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
- package/dist/frontend/lowering/builtins/arguments.js +12 -0
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.d.ts +6 -1
- package/dist/frontend/lowering/builtins/atomics.js +87 -1
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.js +2 -2
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.d.ts +13 -0
- package/dist/frontend/lowering/builtins/child-process-sync.js +1 -13
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.d.ts +10 -4
- package/dist/frontend/lowering/builtins/child-process.js +560 -27
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/compression.d.ts +2 -2
- package/dist/frontend/lowering/builtins/compression.js +41 -21
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/constants.js +7 -2
- package/dist/frontend/lowering/builtins/constants.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +28 -2
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +4 -0
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +3 -1
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.d.ts +4 -1
- package/dist/frontend/lowering/builtins/numbers.js +10 -2
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.d.ts +6 -3
- package/dist/frontend/lowering/builtins/operating-system.js +96 -16
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +2 -2
- package/dist/frontend/lowering/builtins/process.js +103 -8
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.js +169 -8
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/properties.js +6 -2
- package/dist/frontend/lowering/builtins/properties.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +6 -4
- package/dist/frontend/lowering/builtins/readline.js +180 -36
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +35 -12
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +2 -0
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.d.ts +10 -0
- package/dist/frontend/lowering/call-arguments.js +37 -2
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.d.ts +10 -0
- package/dist/frontend/lowering/call-signatures.js +103 -0
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +14 -2
- package/dist/frontend/lowering/class-construction.js +99 -5
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +9 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +1283 -1030
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +158 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.js +20 -15
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
- package/dist/frontend/lowering/class-runtime-statics.js +20 -1
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-unions.js +21 -4
- package/dist/frontend/lowering/class-unions.js.map +1 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +9 -0
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/state.d.ts +8 -0
- package/dist/frontend/lowering/coercions/state.js +17 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +20 -5
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +10 -1
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.d.ts +2 -1
- package/dist/frontend/lowering/coercions/unions.js +54 -10
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/constructor-returns.d.ts +23 -2
- package/dist/frontend/lowering/constructor-returns.js +284 -58
- package/dist/frontend/lowering/constructor-returns.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +156 -62
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +21 -3
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-from-async.js +139 -3
- package/dist/frontend/lowering/containers/array-from-async.js.map +1 -1
- package/dist/frontend/lowering/containers/array-iteration.d.ts +14 -4
- package/dist/frontend/lowering/containers/array-iteration.js +24 -7
- package/dist/frontend/lowering/containers/array-iteration.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +14 -11
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +6 -0
- package/dist/frontend/lowering/containers/bytes.js +446 -86
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.d.ts +5 -0
- package/dist/frontend/lowering/containers/callback-arguments.js +21 -12
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-grouping.js +421 -2
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +52 -17
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +23 -0
- package/dist/frontend/lowering/containers/iterator-helpers.js +176 -10
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +5 -2
- package/dist/frontend/lowering/containers/string-and-regexp.js +45 -11
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
- package/dist/frontend/lowering/crypto-tables.js +5 -5
- package/dist/frontend/lowering/dispatch-sites.js +3 -0
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
- package/dist/frontend/lowering/divergences.d.ts +40 -0
- package/dist/frontend/lowering/divergences.js +239 -20
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/effect-free.d.ts +12 -0
- package/dist/frontend/lowering/effect-free.js +44 -0
- package/dist/frontend/lowering/effect-free.js.map +1 -0
- package/dist/frontend/lowering/expressions/array-literals.d.ts +10 -0
- package/dist/frontend/lowering/expressions/array-literals.js +62 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +115 -5
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +151 -7
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +15 -0
- package/dist/frontend/lowering/expressions/hosted-narrowing.js +54 -1
- package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +31 -2
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.d.ts +3 -0
- package/dist/frontend/lowering/expressions/narrowing.js +175 -22
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +173 -11
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +5 -1
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +8 -0
- package/dist/frontend/lowering/expressions/property-access.js +379 -109
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +237 -7
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +8 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-fields.d.ts +20 -1
- package/dist/frontend/lowering/expressions/union-fields.js +103 -13
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +74 -55
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/function-returns.js +37 -10
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/general-streams.js +5 -0
- package/dist/frontend/lowering/general-streams.js.map +1 -1
- package/dist/frontend/lowering/generator-delegation.d.ts +15 -7
- package/dist/frontend/lowering/generator-delegation.js +301 -118
- package/dist/frontend/lowering/generator-delegation.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +27 -1
- package/dist/frontend/lowering/generic-functions.js +432 -18
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/global-function-values.d.ts +25 -0
- package/dist/frontend/lowering/global-function-values.js +193 -0
- package/dist/frontend/lowering/global-function-values.js.map +1 -0
- package/dist/frontend/lowering/global-values.d.ts +6 -4
- package/dist/frontend/lowering/global-values.js +24 -10
- package/dist/frontend/lowering/global-values.js.map +1 -1
- package/dist/frontend/lowering/host-global-values.d.ts +31 -0
- package/dist/frontend/lowering/host-global-values.js +121 -0
- package/dist/frontend/lowering/host-global-values.js.map +1 -0
- package/dist/frontend/lowering/host-globals.d.ts +74 -0
- package/dist/frontend/lowering/host-globals.js +344 -0
- package/dist/frontend/lowering/host-globals.js.map +1 -0
- package/dist/frontend/lowering/http2-constants.js +1 -1
- package/dist/frontend/lowering/iterator-adapters.js +46 -17
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/iterator-prototype.d.ts +30 -0
- package/dist/frontend/lowering/iterator-prototype.js +160 -0
- package/dist/frontend/lowering/iterator-prototype.js.map +1 -0
- package/dist/frontend/lowering/key-order-witness.js +43 -22
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +1 -0
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.js +11 -3
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +30 -15
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.d.ts +11 -0
- package/dist/frontend/lowering/lower-async-iteration.js +15 -0
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +11 -1
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +25 -0
- package/dist/frontend/lowering/lower-calls.js +929 -227
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.test.js +59 -16
- package/dist/frontend/lowering/lower-calls.test.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +20 -0
- package/dist/frontend/lowering/lower-classes.js +468 -44
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -2
- package/dist/frontend/lowering/lower-event-emitter.js +253 -83
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +1 -1
- package/dist/frontend/lowering/lower-exprs.js +71 -20
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +25 -6
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +57 -10
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.d.ts +6 -0
- package/dist/frontend/lowering/lower-global-value.js +14 -5
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
- package/dist/frontend/lowering/lower-inspect.js +638 -64
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +48 -2
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +18 -0
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-island.js +16 -6
- package/dist/frontend/lowering/lower-node-island.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +303 -87
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.js +45 -0
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +14 -11
- package/dist/frontend/lowering/lower-stmts.js +270 -52
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +110 -27
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lower-url.js +6 -3
- package/dist/frontend/lowering/lower-url.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +227 -21
- package/dist/frontend/lowering/lowerer.js +651 -92
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +18 -0
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/lowering-facts.d.ts +110 -0
- package/dist/frontend/lowering/lowering-facts.js +323 -0
- package/dist/frontend/lowering/lowering-facts.js.map +1 -0
- package/dist/frontend/lowering/lowering-facts.test.d.ts +1 -0
- package/dist/frontend/lowering/lowering-facts.test.js +100 -0
- package/dist/frontend/lowering/lowering-facts.test.js.map +1 -0
- package/dist/frontend/lowering/nan-coded-reads.d.ts +27 -4
- package/dist/frontend/lowering/nan-coded-reads.js +112 -9
- package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
- package/dist/frontend/lowering/optional-arguments.d.ts +4 -0
- package/dist/frontend/lowering/optional-arguments.js +26 -2
- package/dist/frontend/lowering/optional-arguments.js.map +1 -1
- package/dist/frontend/lowering/partial-assertions.d.ts +0 -3
- package/dist/frontend/lowering/partial-assertions.js +9 -15
- package/dist/frontend/lowering/partial-assertions.js.map +1 -1
- package/dist/frontend/lowering/primitive-throws.d.ts +100 -0
- package/dist/frontend/lowering/primitive-throws.js +241 -0
- package/dist/frontend/lowering/primitive-throws.js.map +1 -0
- package/dist/frontend/lowering/primitive-wrappers.js +1 -0
- package/dist/frontend/lowering/primitive-wrappers.js.map +1 -1
- package/dist/frontend/lowering/record-inherited.d.ts +17 -1
- package/dist/frontend/lowering/record-inherited.js +16 -2
- package/dist/frontend/lowering/record-inherited.js.map +1 -1
- package/dist/frontend/lowering/record-links.d.ts +73 -0
- package/dist/frontend/lowering/record-links.js +797 -0
- package/dist/frontend/lowering/record-links.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-provenance.d.ts +27 -7
- package/dist/frontend/lowering/runtime-optional-provenance.js +25 -11
- package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-report.d.ts +40 -0
- package/dist/frontend/lowering/runtime-optional-report.js +300 -0
- package/dist/frontend/lowering/runtime-optional-report.js.map +1 -0
- package/dist/frontend/lowering/scoped-type-memo.test.d.ts +1 -0
- package/dist/frontend/lowering/scoped-type-memo.test.js +86 -0
- package/dist/frontend/lowering/scoped-type-memo.test.js.map +1 -0
- package/dist/frontend/lowering/static-typeof.d.ts +3 -1
- package/dist/frontend/lowering/static-typeof.js +6 -1
- package/dist/frontend/lowering/static-typeof.js.map +1 -1
- package/dist/frontend/lowering/strict-mode.d.ts +1 -5
- package/dist/frontend/lowering/strict-mode.js +4 -30
- package/dist/frontend/lowering/strict-mode.js.map +1 -1
- package/dist/frontend/lowering/structural-instances.d.ts +7 -0
- package/dist/frontend/lowering/structural-instances.js +23 -0
- package/dist/frontend/lowering/structural-instances.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +15 -1
- package/dist/frontend/lowering/surfaces.js +78 -10
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/union-retag.d.ts +13 -1
- package/dist/frontend/lowering/union-retag.js +55 -1
- package/dist/frontend/lowering/union-retag.js.map +1 -1
- package/dist/frontend/lowering/union-retag.test.js +51 -0
- package/dist/frontend/lowering/union-retag.test.js.map +1 -1
- package/dist/frontend/lowering/unit-journal.d.ts +8 -0
- package/dist/frontend/lowering/unit-journal.js +14 -0
- package/dist/frontend/lowering/unit-journal.js.map +1 -1
- package/dist/frontend/lowering/unit-journal.test.js +36 -1
- package/dist/frontend/lowering/unit-journal.test.js.map +1 -1
- package/dist/frontend/lowering/zlib-constants.js +3 -2
- package/dist/frontend/lowering/zlib-constants.js.map +1 -1
- package/dist/frontend/npm-static.js +78 -9
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm-static.test.js +95 -2
- package/dist/frontend/npm-static.test.js.map +1 -1
- package/dist/frontend/pipeline.d.ts +5 -4
- package/dist/frontend/pipeline.js +94 -31
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/pipeline.test.js +68 -11
- package/dist/frontend/pipeline.test.js.map +1 -1
- package/dist/frontend/program.d.ts +62 -2
- package/dist/frontend/program.js +695 -422
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +37 -1
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/services-node.d.ts +7 -0
- package/dist/frontend/services-node.js +32 -1
- package/dist/frontend/services-node.js.map +1 -1
- package/dist/frontend/services-node.test.js +51 -0
- package/dist/frontend/services-node.test.js.map +1 -1
- package/dist/frontend/shape-inference/overlay.js +68 -2
- package/dist/frontend/shape-inference/overlay.js.map +1 -1
- package/dist/frontend/tier-analysis.d.ts +9 -0
- package/dist/frontend/tier-analysis.js +1 -0
- package/dist/frontend/tier-analysis.js.map +1 -1
- package/dist/frontend/tsc-codes.d.ts +57 -3
- package/dist/frontend/tsc-codes.js +935 -150
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/tsc-codes.test.js +221 -12
- package/dist/frontend/tsc-codes.test.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +91 -9
- package/dist/frontend/type-mapper.js +622 -181
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +80 -15
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +1 -0
- package/dist/index.test.js +60 -0
- package/dist/index.test.js.map +1 -0
- package/dist/ir/builtin-effects.js +43 -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 +242 -16
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +3 -2
- package/dist/ir/callback-specialization.js +35 -25
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/capture-values.d.ts +8 -4
- package/dist/ir/capture-values.js +9 -6
- package/dist/ir/capture-values.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +6 -2
- package/dist/ir/char-unit-locals.js +11 -2
- package/dist/ir/char-unit-locals.js.map +1 -1
- package/dist/ir/class-key-index.d.ts +18 -0
- package/dist/ir/class-key-index.js +29 -0
- package/dist/ir/class-key-index.js.map +1 -0
- package/dist/ir/class-key-index.test.d.ts +1 -0
- package/dist/ir/class-key-index.test.js +25 -0
- package/dist/ir/class-key-index.test.js.map +1 -0
- package/dist/ir/codec.generated.d.ts +1 -1
- package/dist/ir/codec.generated.js +724 -648
- package/dist/ir/codec.generated.js.map +1 -1
- package/dist/ir/constant-globals.d.ts +5 -2
- package/dist/ir/constant-globals.js +25 -27
- package/dist/ir/constant-globals.js.map +1 -1
- package/dist/ir/expression-inlining.d.ts +4 -2
- package/dist/ir/expression-inlining.js +8 -2
- package/dist/ir/expression-inlining.js.map +1 -1
- package/dist/ir/field-values.d.ts +5 -2
- package/dist/ir/field-values.js +32 -21
- package/dist/ir/field-values.js.map +1 -1
- package/dist/ir/fields.generated.d.ts +11 -2
- package/dist/ir/fields.generated.js +8 -0
- package/dist/ir/fields.generated.js.map +1 -1
- package/dist/ir/final-fields.js +1 -1
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.d.ts +5 -4
- package/dist/ir/function-references.js +7 -4
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +7 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/init-only-globals.d.ts +4 -2
- package/dist/ir/init-only-globals.js +17 -18
- package/dist/ir/init-only-globals.js.map +1 -1
- package/dist/ir/inline-array-views.js +1 -0
- package/dist/ir/inline-array-views.js.map +1 -1
- package/dist/ir/int32-slots.js +7 -0
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/ir.d.ts +59 -4
- package/dist/ir/ir.js +7 -0
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/js-groups.d.ts +51 -0
- package/dist/ir/js-groups.js +394 -0
- package/dist/ir/js-groups.js.map +1 -0
- package/dist/ir/js-groups.test.d.ts +1 -0
- package/dist/ir/js-groups.test.js +555 -0
- package/dist/ir/js-groups.test.js.map +1 -0
- package/dist/ir/js-ic.js +30 -5
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +27 -1
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +23 -6
- package/dist/ir/node-index.js +126 -49
- package/dist/ir/node-index.js.map +1 -1
- package/dist/ir/numeric-call-specialization.d.ts +4 -2
- package/dist/ir/numeric-call-specialization.js +40 -26
- package/dist/ir/numeric-call-specialization.js.map +1 -1
- package/dist/ir/paired-while-loops.d.ts +4 -2
- package/dist/ir/paired-while-loops.js +8 -2
- package/dist/ir/paired-while-loops.js.map +1 -1
- package/dist/ir/parameter-versions.d.ts +13 -4
- package/dist/ir/parameter-versions.js +63 -42
- package/dist/ir/parameter-versions.js.map +1 -1
- package/dist/ir/property-bags.d.ts +4 -2
- package/dist/ir/property-bags.js +22 -17
- package/dist/ir/property-bags.js.map +1 -1
- package/dist/ir/row-pairs.d.ts +4 -2
- package/dist/ir/row-pairs.js +12 -11
- package/dist/ir/row-pairs.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +87 -12
- package/dist/ir/runtime-features.js +263 -160
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/runtime-features.test.js +109 -139
- package/dist/ir/runtime-features.test.js.map +1 -1
- package/dist/ir/runtime-jam-loops.d.ts +35 -0
- package/dist/ir/runtime-jam-loops.js +604 -0
- package/dist/ir/runtime-jam-loops.js.map +1 -0
- package/dist/ir/runtime-jam-loops.test.d.ts +1 -0
- package/dist/ir/runtime-jam-loops.test.js +565 -0
- package/dist/ir/runtime-jam-loops.test.js.map +1 -0
- package/dist/ir/saturating-loop-jams.d.ts +4 -2
- package/dist/ir/saturating-loop-jams.js +11 -10
- package/dist/ir/saturating-loop-jams.js.map +1 -1
- package/dist/ir/scalar-records.d.ts +5 -2
- package/dist/ir/scalar-records.js +12 -2
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/self-captures.d.ts +4 -2
- package/dist/ir/self-captures.js +32 -27
- package/dist/ir/self-captures.js.map +1 -1
- package/dist/ir/serialize.d.ts +6 -1
- package/dist/ir/serialize.js +87 -23
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +26 -0
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/tiers.js +1 -0
- package/dist/ir/tiers.js.map +1 -1
- package/dist/ir/traverse.js +4 -0
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/typed-argument-clones.d.ts +30 -0
- package/dist/ir/typed-argument-clones.js +789 -0
- package/dist/ir/typed-argument-clones.js.map +1 -0
- package/dist/ir/union-arm-loops.d.ts +3 -0
- package/dist/ir/union-arm-loops.js +373 -0
- package/dist/ir/union-arm-loops.js.map +1 -0
- package/dist/ir/union-arm-loops.test.d.ts +1 -0
- package/dist/ir/union-arm-loops.test.js +230 -0
- package/dist/ir/union-arm-loops.test.js.map +1 -0
- package/dist/ir/validate.js +88 -18
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/compiler-self-identity.d.ts +8 -2
- package/dist/library/compiler-self-identity.js +92 -18
- package/dist/library/compiler-self-identity.js.map +1 -1
- package/dist/library/compiler-self-identity.test.js +150 -3
- package/dist/library/compiler-self-identity.test.js.map +1 -1
- package/dist/library/int-infer.d.ts +5 -0
- package/dist/library/int-infer.js +15 -3
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/ir-policy.js +1 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +4 -0
- package/dist/library/library-cache.js +2 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +26 -0
- package/dist/library/library-cache.test.js.map +1 -1
- package/dist/library/prepare.js +99 -31
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/cache.d.ts +7 -0
- package/dist/native/cache.js +47 -0
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +13 -1
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +1 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +18 -3
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache-open.test.js +31 -5
- package/dist/native/executable-cache-open.test.js.map +1 -1
- package/dist/native/executable-cache.d.ts +6 -1
- package/dist/native/executable-cache.js +7 -1
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.d.ts +3 -0
- package/dist/native/prepare.js +43 -26
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +25 -3
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.js +10 -1
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +7 -2
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/node-islands/boundary.d.ts +12 -0
- package/dist/node-islands/boundary.js +38 -6
- package/dist/node-islands/boundary.js.map +1 -1
- package/dist/node-islands/boundary.test.d.ts +1 -0
- package/dist/node-islands/boundary.test.js +76 -0
- package/dist/node-islands/boundary.test.js.map +1 -0
- package/dist/node-islands/detect.d.ts +9 -0
- package/dist/node-islands/detect.js +110 -0
- package/dist/node-islands/detect.js.map +1 -1
- package/dist/node-islands/detect.test.js +24 -0
- package/dist/node-islands/detect.test.js.map +1 -1
- package/dist/node-islands/graph-islands.d.ts +40 -0
- package/dist/node-islands/graph-islands.js +128 -0
- package/dist/node-islands/graph-islands.js.map +1 -0
- package/dist/node-islands/growth.d.ts +57 -0
- package/dist/node-islands/growth.js +205 -0
- package/dist/node-islands/growth.js.map +1 -0
- package/dist/node-islands/report.d.ts +12 -0
- package/dist/node-islands/report.js +28 -0
- package/dist/node-islands/report.js.map +1 -1
- package/dist/node-islands/report.test.js +2 -0
- package/dist/node-islands/report.test.js.map +1 -1
- package/dist/node-islands/rules.js +5 -0
- package/dist/node-islands/rules.js.map +1 -1
- package/dist/node-islands/scan.d.ts +11 -2
- package/dist/node-islands/scan.js +61 -9
- package/dist/node-islands/scan.js.map +1 -1
- package/dist/wasm/translate.js +11 -5
- package/dist/wasm/translate.js.map +1 -1
- package/dist/wasm/translate.test.js +35 -0
- package/dist/wasm/translate.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +184 -117
|
@@ -10,7 +10,7 @@ import { unsignedHex } from "../../format-integer.js";
|
|
|
10
10
|
import { jsFuncNameOf } from "./lowerer.js";
|
|
11
11
|
import { isJsSourceFile, locOf } from "../program.js";
|
|
12
12
|
import { noLoweringDiag } from "../../diagnostics/diagnostic.js";
|
|
13
|
-
import { BOOL, CAUGHT, DYN, F64, RUNTIME_ERROR_CLASSES, STRING, isUnitType, UNDEFINED_T, VOID, canConvertToDyn, canDynCheckTo, funcOf, arrayOf, CLASS_FIELD_ATTRIBUTES_PREFIX, classDynViewSupported, DYN_CLASS_PROPERTIES, isClassOwnEnumerableFieldName, isDirentShape, isDynTypedRefType,
|
|
13
|
+
import { BOOL, CAUGHT, DYN, F64, RUNTIME_ERROR_CLASSES, STRING, isUnitType, UNDEFINED_T, VOID, canConvertToDyn, canDynCheckTo, funcOf, arrayOf, CLASS_FIELD_ATTRIBUTES_PREFIX, classDynViewSupported, DYN_CLASS_PROPERTIES, isClassOwnEnumerableFieldName, isDirentShape, isDynTypedRefType, accessorSlotProp, recordTextCodecClass, shapeKeyOrders, typeKey, } from "../../ir/ir.js";
|
|
14
14
|
import { accessorCall, findMethodOn } from "./lower-classes.js";
|
|
15
15
|
import { isSafeToDiscard, isSafeToRepeat } from "./expressions/evaluation-safety.js";
|
|
16
16
|
import { INSPECT_CUSTOM_MEMBER, symbolFieldDisplayName, TO_STRING_TAG_FIELD, } from "./symbol-fields.js";
|
|
@@ -19,6 +19,7 @@ import { dateRootOf } from "./builtins/date-classes.js";
|
|
|
19
19
|
import { lowerSystemErrorMap } from "./lower-system-errors.js";
|
|
20
20
|
import { isPerfEntryType, perfEntryJson } from "./builtins/performance.js";
|
|
21
21
|
import { recordMayKeepSource, recordSourceTest } from "./record-sources.js";
|
|
22
|
+
import { registerLinkedHelper } from "./record-links.js";
|
|
22
23
|
import { nullProtoRecordShape, recordNullProtoTest } from "./null-prototype.js";
|
|
23
24
|
import { dynArgumentPack } from "./call-arguments.js";
|
|
24
25
|
/* ── IR construction shorthand ───────────────────────────────────────── */
|
|
@@ -222,14 +223,15 @@ function errorInstanceReachesItself(lowerer, c) {
|
|
|
222
223
|
}
|
|
223
224
|
/** An error value whose runtime class may be a program-declared subclass,
|
|
224
225
|
* which may declare fields (`class Bailable extends Error { bail = false }`)
|
|
225
|
-
* or carry a `cause`: Node prints the error base
|
|
226
|
-
*
|
|
227
|
-
* `[Bailable [Error]: m]
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
* prints
|
|
226
|
+
* or carry a `cause`: Node prints the error base — its stack, headed
|
|
227
|
+
* `Bailable [Error]: m` by improveStack, or the bracketed
|
|
228
|
+
* `[Bailable [Error]: m]` when the stack has no frame line — followed by
|
|
229
|
+
* the own properties, `{ bail: true }` after the last frame, with the
|
|
230
|
+
* usual single-line/multi-line choice counting the base. Each program
|
|
231
|
+
* class (most-derived first) is an instanceof arm; other values keep the
|
|
232
|
+
* runtime's error rendering. Beyond the depth budget an instance with own
|
|
233
|
+
* properties prints `[Name]`, as Node does for any object with keys; one
|
|
234
|
+
* without prints its header. */
|
|
233
235
|
function errorInspectHelper(lowerer, t, info, loc) {
|
|
234
236
|
const key = `insp.userError:${typeKey(t)}`;
|
|
235
237
|
const existing = lowerer.inspectHelpers.get(key);
|
|
@@ -548,10 +550,12 @@ function userErrorClasses(info) {
|
|
|
548
550
|
visit(info);
|
|
549
551
|
return out;
|
|
550
552
|
}
|
|
551
|
-
/** Node's improveStack over the
|
|
552
|
-
*
|
|
553
|
-
*
|
|
554
|
-
*
|
|
553
|
+
/** Node's improveStack over the rendering's base: when the instance's
|
|
554
|
+
* constructor name differs from its `name` and the name ends in "Error",
|
|
555
|
+
* the header names both — `[Bailable [Error]: m]`, or `[FetchError: m]`
|
|
556
|
+
* when the constructor name already contains it. Two bases reach here: the
|
|
557
|
+
* bracket form (`[Error: m]`, an error whose stack is empty) and the stack
|
|
558
|
+
* itself (`Error: m\n at ...`, whose first line carries the header). */
|
|
555
559
|
function improvedErrorBase(lowerer, value, base, display, loc) {
|
|
556
560
|
const str = (method, receiver, args, type) => ({
|
|
557
561
|
kind: "strIntrinsic",
|
|
@@ -605,6 +609,36 @@ function improvedErrorBase(lowerer, value, base, display, loc) {
|
|
|
605
609
|
type: STRING,
|
|
606
610
|
loc,
|
|
607
611
|
};
|
|
612
|
+
/** The name's length — where a stack base's header ends. */
|
|
613
|
+
const nameLength = () => str("length", nameRef(), [], F64);
|
|
614
|
+
/** The base's character at `name.length`: `:` or `\n` after the name, or
|
|
615
|
+
* the empty answer when the base is the name alone (Node's
|
|
616
|
+
* `stack.length === len` arm). */
|
|
617
|
+
const atNameEnd = () => str("charAt", baseRef(), [nameLength()], STRING);
|
|
618
|
+
const stackCond = and(and(eq(nameRef(), strLit(display, loc), true), str("endsWith", nameRef(), [strLit("Error", loc)], BOOL)), and(str("startsWith", baseRef(), [nameRef()], BOOL), {
|
|
619
|
+
kind: "logical",
|
|
620
|
+
op: "||",
|
|
621
|
+
left: {
|
|
622
|
+
kind: "logical",
|
|
623
|
+
op: "||",
|
|
624
|
+
left: eq(atNameEnd(), strLit(":", loc)),
|
|
625
|
+
right: eq(atNameEnd(), strLit("\n", loc)),
|
|
626
|
+
type: BOOL,
|
|
627
|
+
loc,
|
|
628
|
+
},
|
|
629
|
+
right: eq(atNameEnd(), strLit("", loc)),
|
|
630
|
+
type: BOOL,
|
|
631
|
+
loc,
|
|
632
|
+
}));
|
|
633
|
+
const stackRest = () => str("slice", baseRef(), [nameLength()], STRING);
|
|
634
|
+
const improvedStack = {
|
|
635
|
+
kind: "ternary",
|
|
636
|
+
cond: str("includes", strLit(display, loc), [nameRef()], BOOL),
|
|
637
|
+
then: concatAll([strLit(display, loc), stackRest()], loc),
|
|
638
|
+
else_: concatAll([strLit(`${display} [`, loc), nameRef(), strLit("]", loc), stackRest()], loc),
|
|
639
|
+
type: STRING,
|
|
640
|
+
loc,
|
|
641
|
+
};
|
|
608
642
|
return {
|
|
609
643
|
kind: "seqExpr",
|
|
610
644
|
stmts: [
|
|
@@ -623,7 +657,21 @@ function improvedErrorBase(lowerer, value, base, display, loc) {
|
|
|
623
657
|
},
|
|
624
658
|
{ kind: "varDecl", localId: "raw.0", init: base, loc },
|
|
625
659
|
],
|
|
626
|
-
result: {
|
|
660
|
+
result: {
|
|
661
|
+
kind: "ternary",
|
|
662
|
+
cond,
|
|
663
|
+
then: improved,
|
|
664
|
+
else_: {
|
|
665
|
+
kind: "ternary",
|
|
666
|
+
cond: stackCond,
|
|
667
|
+
then: improvedStack,
|
|
668
|
+
else_: baseRef(),
|
|
669
|
+
type: STRING,
|
|
670
|
+
loc,
|
|
671
|
+
},
|
|
672
|
+
type: STRING,
|
|
673
|
+
loc,
|
|
674
|
+
},
|
|
627
675
|
type: STRING,
|
|
628
676
|
loc,
|
|
629
677
|
};
|
|
@@ -666,13 +714,6 @@ function inspectSupport(lowerer, t, visiting, out) {
|
|
|
666
714
|
visiting.delete(t.shapeId);
|
|
667
715
|
return null;
|
|
668
716
|
}
|
|
669
|
-
// Accessor-carrying shapes: Node prints the accessor names as
|
|
670
|
-
// `x: [Getter]` / `[Setter]` / `[Getter/Setter]` in insertion order
|
|
671
|
-
// — a position the static field walk does not track (accessor slots
|
|
672
|
-
// live outside declaredOrder), so the render fences by name.
|
|
673
|
-
if (shapeHasAccessorSlots(shape)) {
|
|
674
|
-
return "shapes carrying get/set accessor properties have no inspect lowering yet (Node prints the accessor names as [Getter]/[Setter] in insertion order — read the properties explicitly)";
|
|
675
|
-
}
|
|
676
717
|
if (shape.indexValue !== undefined) {
|
|
677
718
|
// PURE index-signature shapes (Record<string, V> — no declared
|
|
678
719
|
// fields) render like the dyn's objects: a runtime key walk
|
|
@@ -690,6 +731,22 @@ function inspectSupport(lowerer, t, visiting, out) {
|
|
|
690
731
|
return null;
|
|
691
732
|
}
|
|
692
733
|
for (const f of shape.fields) {
|
|
734
|
+
// An accessor's closure slot never renders itself: the property's
|
|
735
|
+
// entry prints Node's label, or the getter's RESULT under the
|
|
736
|
+
// getters option (a setter-only property stays a label). A getter
|
|
737
|
+
// that returns nothing renders `[Getter: undefined]` — the label
|
|
738
|
+
// path already, so its void result is no fence.
|
|
739
|
+
const slot = accessorSlotProp(f.name);
|
|
740
|
+
if (slot && f.type.kind === "func") {
|
|
741
|
+
if (slot.kind === "set")
|
|
742
|
+
continue;
|
|
743
|
+
if (f.type.ret.kind === "void")
|
|
744
|
+
continue;
|
|
745
|
+
const why = inspectSupport(lowerer, f.type.ret, visiting, out);
|
|
746
|
+
if (why !== null)
|
|
747
|
+
return why;
|
|
748
|
+
continue;
|
|
749
|
+
}
|
|
693
750
|
const why = inspectSupport(lowerer, f.type, visiting, out);
|
|
694
751
|
if (why !== null)
|
|
695
752
|
return why;
|
|
@@ -1098,6 +1155,14 @@ export function typeReachesItself(lowerer, t) {
|
|
|
1098
1155
|
};
|
|
1099
1156
|
return walk(t);
|
|
1100
1157
|
}
|
|
1158
|
+
/** Whether a record shape carries an accessor getter, whose result can be
|
|
1159
|
+
* the walked value itself. */
|
|
1160
|
+
function shapeHasGetter(lowerer, shapeId) {
|
|
1161
|
+
const shape = lowerer.shapes.get(shapeId);
|
|
1162
|
+
if (!shape)
|
|
1163
|
+
return false;
|
|
1164
|
+
return shape.fields.some((f) => accessorSlotProp(f.name)?.kind === "get" && f.type.kind === "func");
|
|
1165
|
+
}
|
|
1101
1166
|
/** True when a value of `t` can be cyclic: `t` or any type reachable from
|
|
1102
1167
|
* it reaches itself. */
|
|
1103
1168
|
export function typeReachesCycle(lowerer, t) {
|
|
@@ -1502,8 +1567,11 @@ function inspectHelper(lowerer, t, loc) {
|
|
|
1502
1567
|
// order), seen-push after begin, and refWrap around end's result (end
|
|
1503
1568
|
// adds the <ref *N> prefix on values the walk found circular). Acyclic types
|
|
1504
1569
|
// keep the zero-cost path.
|
|
1570
|
+
// An accessor's getter answers any value — the walked value itself
|
|
1571
|
+
// included — which no declared field type shows, so a shape with a
|
|
1572
|
+
// getter keeps Node's circular bookkeeping on.
|
|
1505
1573
|
const onCycle = (t.kind === "record" || t.kind === "array" || t.kind === "map" || t.kind === "object") &&
|
|
1506
|
-
typeReachesItself(lowerer, t);
|
|
1574
|
+
(typeReachesItself(lowerer, t) || (t.kind === "record" && shapeHasGetter(lowerer, t.shapeId)));
|
|
1507
1575
|
const begin = () => [
|
|
1508
1576
|
exprStmt({ kind: "libCall", fn: "insp.begin", args: [rPlus1()], type: { kind: "void" }, loc }),
|
|
1509
1577
|
...(onCycle
|
|
@@ -1601,6 +1669,15 @@ function inspectHelper(lowerer, t, loc) {
|
|
|
1601
1669
|
const i = () => varRef("i.0", F64, loc);
|
|
1602
1670
|
const next = () => varRef("next.0", F64, loc);
|
|
1603
1671
|
const hasMore = () => lt(i(), n());
|
|
1672
|
+
// The render's maxArrayLength: entries show while the output holds
|
|
1673
|
+
// fewer than the limit, at every nesting level (Node's ctx).
|
|
1674
|
+
const limit = () => ({
|
|
1675
|
+
kind: "libCall",
|
|
1676
|
+
fn: "insp.maxArrayLength",
|
|
1677
|
+
args: [],
|
|
1678
|
+
type: F64,
|
|
1679
|
+
loc,
|
|
1680
|
+
});
|
|
1604
1681
|
// A foreign element (state 3) holds a value outside the element type.
|
|
1605
1682
|
const foreignElements = elementMayBeForeign(lowerer, t.elem);
|
|
1606
1683
|
const foreign = () => ({
|
|
@@ -1671,7 +1748,7 @@ function inspectHelper(lowerer, t, loc) {
|
|
|
1671
1748
|
kind: "logical",
|
|
1672
1749
|
op: "&&",
|
|
1673
1750
|
left: hasMore(),
|
|
1674
|
-
right: lt(shown(),
|
|
1751
|
+
right: lt(shown(), limit()),
|
|
1675
1752
|
type: BOOL,
|
|
1676
1753
|
loc,
|
|
1677
1754
|
},
|
|
@@ -1808,16 +1885,71 @@ function inspectHelper(lowerer, t, loc) {
|
|
|
1808
1885
|
break;
|
|
1809
1886
|
}
|
|
1810
1887
|
if (shape.tuple) {
|
|
1811
|
-
// Tuples ARE arrays to Node: bracket form, array-extras grouping
|
|
1812
|
-
|
|
1888
|
+
// Tuples ARE arrays to Node: bracket form, array-extras grouping,
|
|
1889
|
+
// and the same maxArrayLength bound on the entries shown.
|
|
1890
|
+
const count = shape.fields.length;
|
|
1891
|
+
if (count === 0) {
|
|
1813
1892
|
body = [ret(strLit("[]", loc))];
|
|
1814
1893
|
break;
|
|
1815
1894
|
}
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1895
|
+
locals.push({ id: "lim.0", name: "lim", type: F64, mutable: false });
|
|
1896
|
+
const lim = () => varRef("lim.0", F64, loc);
|
|
1897
|
+
const lt = (left, right) => ({
|
|
1898
|
+
kind: "bin",
|
|
1899
|
+
op: "<",
|
|
1900
|
+
left,
|
|
1901
|
+
right,
|
|
1902
|
+
type: BOOL,
|
|
1903
|
+
loc,
|
|
1904
|
+
});
|
|
1905
|
+
const bounded = () => lt(lim(), numLit(count, loc));
|
|
1906
|
+
body = [
|
|
1907
|
+
depthGate("[Array]"),
|
|
1908
|
+
{
|
|
1909
|
+
kind: "varDecl",
|
|
1910
|
+
localId: "lim.0",
|
|
1911
|
+
init: { kind: "libCall", fn: "insp.maxArrayLength", args: [], type: F64, loc },
|
|
1912
|
+
loc,
|
|
1913
|
+
},
|
|
1914
|
+
...begin(),
|
|
1915
|
+
];
|
|
1916
|
+
for (let i = 0; i < count; i++) {
|
|
1917
|
+
const f = shape.fields[i];
|
|
1918
|
+
body.push({
|
|
1919
|
+
kind: "if",
|
|
1920
|
+
cond: lt(numLit(i, loc), lim()),
|
|
1921
|
+
then: [
|
|
1922
|
+
entry(child(f.type, get(f.name, f.type)), isNumberFlag(lowerer, f.type, () => get(f.name, f.type), loc)),
|
|
1923
|
+
],
|
|
1924
|
+
else_: null,
|
|
1925
|
+
loc,
|
|
1926
|
+
});
|
|
1819
1927
|
}
|
|
1820
|
-
body.push(
|
|
1928
|
+
body.push({
|
|
1929
|
+
kind: "if",
|
|
1930
|
+
cond: bounded(),
|
|
1931
|
+
then: [
|
|
1932
|
+
entry({
|
|
1933
|
+
kind: "libCall",
|
|
1934
|
+
fn: "insp.moreItems",
|
|
1935
|
+
args: [
|
|
1936
|
+
{
|
|
1937
|
+
kind: "bin",
|
|
1938
|
+
op: "-",
|
|
1939
|
+
left: numLit(count, loc),
|
|
1940
|
+
right: lim(),
|
|
1941
|
+
type: F64,
|
|
1942
|
+
loc,
|
|
1943
|
+
},
|
|
1944
|
+
],
|
|
1945
|
+
type: STRING,
|
|
1946
|
+
loc,
|
|
1947
|
+
}, boolLit(false, loc)),
|
|
1948
|
+
],
|
|
1949
|
+
else_: null,
|
|
1950
|
+
loc,
|
|
1951
|
+
});
|
|
1952
|
+
body.push(ret(end(strLit("", loc), strLit("[", loc), strLit("]", loc), true, bounded())));
|
|
1821
1953
|
break;
|
|
1822
1954
|
}
|
|
1823
1955
|
if (shape.indexValue && shape.fields.length === 0) {
|
|
@@ -1928,9 +2060,238 @@ function inspectHelper(lowerer, t, loc) {
|
|
|
1928
2060
|
// reachability can settle this shape after the helper is first
|
|
1929
2061
|
// interned, so rebuild the field walk once metadata is final.
|
|
1930
2062
|
lowerer.keyOrder.observe(t);
|
|
2063
|
+
const accessors = new Map();
|
|
2064
|
+
for (const f of shape.fields) {
|
|
2065
|
+
const slot = accessorSlotProp(f.name);
|
|
2066
|
+
if (!slot || f.type.kind !== "func")
|
|
2067
|
+
continue;
|
|
2068
|
+
const slots = accessors.get(slot.prop) ?? {};
|
|
2069
|
+
if (slot.kind === "get")
|
|
2070
|
+
slots.get = f.type;
|
|
2071
|
+
else
|
|
2072
|
+
slots.set = f.type;
|
|
2073
|
+
accessors.set(slot.prop, slots);
|
|
2074
|
+
}
|
|
2075
|
+
if (accessors.size > 0) {
|
|
2076
|
+
// The getters option, read once per render: the helper is shared
|
|
2077
|
+
// by every call site, so the option is run-time state.
|
|
2078
|
+
locals.push({ id: "gm.0", name: "gm", type: F64, mutable: false });
|
|
2079
|
+
for (let i = 0; i < accessors.size; i++) {
|
|
2080
|
+
locals.push({ id: `a.${i}`, name: "a", type: STRING, mutable: true }, { id: `ae.${i}`, name: "ae", type: CAUGHT, mutable: false });
|
|
2081
|
+
}
|
|
2082
|
+
}
|
|
2083
|
+
const ACCESSOR_PRIMITIVES = new Set([
|
|
2084
|
+
"f64",
|
|
2085
|
+
"string",
|
|
2086
|
+
"bool",
|
|
2087
|
+
"undefinedT",
|
|
2088
|
+
"nullT",
|
|
2089
|
+
"bigint",
|
|
2090
|
+
"symbol",
|
|
2091
|
+
]);
|
|
2092
|
+
let accessorIndex = 0;
|
|
2093
|
+
const accessorValueLocals = new Set();
|
|
2094
|
+
/** `key: <label>` for an accessor property, invoking its getter when
|
|
2095
|
+
* the getters option names it: the result renders by kind (Node's
|
|
2096
|
+
* formatProperty), a throw as `[Label: <Inspection threw (err)>]`. */
|
|
2097
|
+
const accessorEntry = (name, slots) => {
|
|
2098
|
+
const index = accessorIndex++;
|
|
2099
|
+
const strId = `a.${index}`;
|
|
2100
|
+
const caughtId = `ae.${index}`;
|
|
2101
|
+
const label = slots.get ? (slots.set ? "Getter/Setter" : "Getter") : "Setter";
|
|
2102
|
+
const s = () => varRef(strId, STRING, loc);
|
|
2103
|
+
const entryOf = (value) => entry(concatAll([strLit(`${inspectKey(name)}: `, loc), value], loc), boolLit(false, loc));
|
|
2104
|
+
const getType = slots.get;
|
|
2105
|
+
if (getType === undefined) {
|
|
2106
|
+
return [
|
|
2107
|
+
{ kind: "varDecl", localId: strId, init: strLit(`[${label}]`, loc), loc },
|
|
2108
|
+
entryOf(s()),
|
|
2109
|
+
];
|
|
2110
|
+
}
|
|
2111
|
+
const called = {
|
|
2112
|
+
kind: "callValue",
|
|
2113
|
+
callee: {
|
|
2114
|
+
kind: "recordGet",
|
|
2115
|
+
obj: v(),
|
|
2116
|
+
shapeId: t.shapeId,
|
|
2117
|
+
field: `%get:${name}`,
|
|
2118
|
+
type: getType,
|
|
2119
|
+
loc,
|
|
2120
|
+
},
|
|
2121
|
+
args: [],
|
|
2122
|
+
type: getType.ret,
|
|
2123
|
+
loc,
|
|
2124
|
+
};
|
|
2125
|
+
const resultT = getType.ret;
|
|
2126
|
+
// What the getter answered renders by RUNTIME kind (Node's
|
|
2127
|
+
// formatProperty): a null and the primitives `[Label: <primitive>]`,
|
|
2128
|
+
// an object or a function `[Label] <value>`. A checker union
|
|
2129
|
+
// dispatches on the arm that holds; a checked-dynamic answer is
|
|
2130
|
+
// classified by the runtime. A getter that returns nothing runs for
|
|
2131
|
+
// its effects and renders Node's `[Getter: undefined]`.
|
|
2132
|
+
const primitiveText = (armT, value) => concatAll([strLit(`[${label}: `, loc), child(armT, value), strLit("]", loc)], loc);
|
|
2133
|
+
const rendered = (armT, value) => {
|
|
2134
|
+
if (armT.kind === "dyn")
|
|
2135
|
+
return {
|
|
2136
|
+
kind: "libCall",
|
|
2137
|
+
fn: "insp.accessorValue",
|
|
2138
|
+
args: [value, strLit(label, loc), rPlus1(), d()],
|
|
2139
|
+
type: STRING,
|
|
2140
|
+
loc,
|
|
2141
|
+
};
|
|
2142
|
+
return ACCESSOR_PRIMITIVES.has(armT.kind)
|
|
2143
|
+
? primitiveText(armT, value)
|
|
2144
|
+
: concatAll([strLit(`[${label}] `, loc), child(armT, value)], loc);
|
|
2145
|
+
};
|
|
2146
|
+
// The getter runs in an inspection context of its own: util.inspect
|
|
2147
|
+
// calls INSIDE it start from Node's fresh defaults and must leave
|
|
2148
|
+
// this walk's options, frames and circular bookkeeping alone. What
|
|
2149
|
+
// it answered renders in THIS context, at the property's level.
|
|
2150
|
+
const valueId = `av.${index}`;
|
|
2151
|
+
const tokenId = `at.${index}`;
|
|
2152
|
+
const hasValue = resultT.kind !== "void";
|
|
2153
|
+
if (hasValue && !accessorValueLocals.has(valueId)) {
|
|
2154
|
+
accessorValueLocals.add(valueId);
|
|
2155
|
+
// Declared by the try's varDecl, so the answer's release is the
|
|
2156
|
+
// try's; nothing reads it outside.
|
|
2157
|
+
locals.push({ id: valueId, name: "av", type: resultT, mutable: false });
|
|
2158
|
+
}
|
|
2159
|
+
if (!accessorValueLocals.has(tokenId)) {
|
|
2160
|
+
accessorValueLocals.add(tokenId);
|
|
2161
|
+
locals.push({ id: tokenId, name: "at", type: F64, mutable: true });
|
|
2162
|
+
}
|
|
2163
|
+
const val = () => varRef(valueId, resultT, loc);
|
|
2164
|
+
const render = [];
|
|
2165
|
+
if (resultT.kind === "void") {
|
|
2166
|
+
render.push({
|
|
2167
|
+
kind: "assign",
|
|
2168
|
+
localId: strId,
|
|
2169
|
+
value: strLit(`[${label}: undefined]`, loc),
|
|
2170
|
+
loc,
|
|
2171
|
+
});
|
|
2172
|
+
}
|
|
2173
|
+
else if (resultT.kind === "union") {
|
|
2174
|
+
const def = lowerer.unions.get(resultT.unionId);
|
|
2175
|
+
if (!def)
|
|
2176
|
+
throw new InternalCompilerError(`inspect of unknown union ${resultT.unionId}`);
|
|
2177
|
+
// The result is read once, then the arm holding decides the form.
|
|
2178
|
+
def.arms.forEach((arm, tag) => {
|
|
2179
|
+
const narrowed = {
|
|
2180
|
+
kind: "unionNarrow",
|
|
2181
|
+
unionId: resultT.unionId,
|
|
2182
|
+
tag,
|
|
2183
|
+
value: val(),
|
|
2184
|
+
type: arm,
|
|
2185
|
+
loc,
|
|
2186
|
+
};
|
|
2187
|
+
render.push({
|
|
2188
|
+
kind: "if",
|
|
2189
|
+
cond: {
|
|
2190
|
+
kind: "unionIsTag",
|
|
2191
|
+
unionId: resultT.unionId,
|
|
2192
|
+
tag,
|
|
2193
|
+
negated: false,
|
|
2194
|
+
value: val(),
|
|
2195
|
+
type: BOOL,
|
|
2196
|
+
loc,
|
|
2197
|
+
},
|
|
2198
|
+
then: [{ kind: "assign", localId: strId, value: rendered(arm, narrowed), loc }],
|
|
2199
|
+
else_: null,
|
|
2200
|
+
loc,
|
|
2201
|
+
});
|
|
2202
|
+
});
|
|
2203
|
+
}
|
|
2204
|
+
else {
|
|
2205
|
+
render.push({ kind: "assign", localId: strId, value: rendered(resultT, val()), loc });
|
|
2206
|
+
}
|
|
2207
|
+
const threw = concatAll([
|
|
2208
|
+
strLit(`[${label}: <Inspection threw (`, loc),
|
|
2209
|
+
child(DYN, {
|
|
2210
|
+
kind: "caughtToDyn",
|
|
2211
|
+
value: varRef(caughtId, CAUGHT, loc),
|
|
2212
|
+
type: DYN,
|
|
2213
|
+
loc,
|
|
2214
|
+
}),
|
|
2215
|
+
strLit(")>]", loc),
|
|
2216
|
+
], loc);
|
|
2217
|
+
// Node's condition reads the option's truthiness first: `true`
|
|
2218
|
+
// runs every getter, 'get' the ones without a setter and 'set' the
|
|
2219
|
+
// ones with one.
|
|
2220
|
+
const mode = (n) => ({
|
|
2221
|
+
kind: "bin",
|
|
2222
|
+
op: "===",
|
|
2223
|
+
left: varRef("gm.0", F64, loc),
|
|
2224
|
+
right: numLit(n, loc),
|
|
2225
|
+
type: BOOL,
|
|
2226
|
+
loc,
|
|
2227
|
+
});
|
|
2228
|
+
const either = (a, b) => ({
|
|
2229
|
+
kind: "logical",
|
|
2230
|
+
op: "||",
|
|
2231
|
+
left: a,
|
|
2232
|
+
right: b,
|
|
2233
|
+
type: BOOL,
|
|
2234
|
+
loc,
|
|
2235
|
+
});
|
|
2236
|
+
const libStmt = (fn, args = []) => ({
|
|
2237
|
+
kind: "exprStmt",
|
|
2238
|
+
expr: { kind: "libCall", fn, args, type: VOID, loc },
|
|
2239
|
+
loc,
|
|
2240
|
+
});
|
|
2241
|
+
const endCall = libStmt("insp.customCallEnd", [varRef(tokenId, F64, loc)]);
|
|
2242
|
+
return [
|
|
2243
|
+
{ kind: "varDecl", localId: strId, init: strLit(`[${label}]`, loc), loc },
|
|
2244
|
+
{
|
|
2245
|
+
kind: "if",
|
|
2246
|
+
cond: slots.set ? either(mode(1), mode(3)) : either(mode(1), mode(2)),
|
|
2247
|
+
then: [
|
|
2248
|
+
libStmt("insp.mark"),
|
|
2249
|
+
{
|
|
2250
|
+
kind: "assign",
|
|
2251
|
+
localId: tokenId,
|
|
2252
|
+
value: { kind: "libCall", fn: "insp.customCallBegin", args: [], type: F64, loc },
|
|
2253
|
+
loc,
|
|
2254
|
+
},
|
|
2255
|
+
{
|
|
2256
|
+
// Node's try spans the getter call AND the result's
|
|
2257
|
+
// rendering, so a throw from either answers the threw
|
|
2258
|
+
// label. The call's context ends before the result renders
|
|
2259
|
+
// (it renders in this walk's); the mark puts this walk's
|
|
2260
|
+
// options and frames back when the rendering throws and
|
|
2261
|
+
// left them open.
|
|
2262
|
+
kind: "tryCatch",
|
|
2263
|
+
tryBody: [
|
|
2264
|
+
// Declared here, so the answer's release is the try's:
|
|
2265
|
+
// nothing reads it outside.
|
|
2266
|
+
hasValue
|
|
2267
|
+
? { kind: "varDecl", localId: valueId, init: called, loc }
|
|
2268
|
+
: { kind: "exprStmt", expr: called, loc },
|
|
2269
|
+
endCall,
|
|
2270
|
+
...render,
|
|
2271
|
+
libStmt("insp.unwind"),
|
|
2272
|
+
],
|
|
2273
|
+
catchLocalId: caughtId,
|
|
2274
|
+
// A throw from the getter leaves its call open; a throw
|
|
2275
|
+
// from the rendering leaves frames open. The mark returns
|
|
2276
|
+
// this walk to where it was either way.
|
|
2277
|
+
catchBody: [
|
|
2278
|
+
libStmt("insp.unwind"),
|
|
2279
|
+
{ kind: "assign", localId: strId, value: threw, loc },
|
|
2280
|
+
],
|
|
2281
|
+
finallyBody: null,
|
|
2282
|
+
loc,
|
|
2283
|
+
},
|
|
2284
|
+
],
|
|
2285
|
+
else_: null,
|
|
2286
|
+
loc,
|
|
2287
|
+
},
|
|
2288
|
+
entryOf(s()),
|
|
2289
|
+
];
|
|
2290
|
+
};
|
|
1931
2291
|
rebuildShapeOrderBody = () => {
|
|
1932
2292
|
const current = lowerer.shapes.get(t.shapeId) ?? shape;
|
|
1933
|
-
|
|
2293
|
+
accessorIndex = 0;
|
|
2294
|
+
const order = current.accessorOrder ?? current.declaredOrder ?? current.fields.map((f) => f.name);
|
|
1934
2295
|
const byName = new Map(current.fields.map((f) => [f.name, f.type]));
|
|
1935
2296
|
// Optional fields render only while present (an omitted or
|
|
1936
2297
|
// deleted property is not shown; an explicit undefined is). A
|
|
@@ -1953,13 +2314,27 @@ function inspectHelper(lowerer, t, loc) {
|
|
|
1953
2314
|
});
|
|
1954
2315
|
}
|
|
1955
2316
|
body.push(depthGate("[Object]"), ...begin());
|
|
1956
|
-
|
|
1957
|
-
|
|
2317
|
+
if (accessors.size > 0) {
|
|
2318
|
+
body.push({
|
|
2319
|
+
kind: "varDecl",
|
|
2320
|
+
localId: "gm.0",
|
|
2321
|
+
init: { kind: "libCall", fn: "insp.gettersMode", args: [], type: F64, loc },
|
|
2322
|
+
loc,
|
|
2323
|
+
});
|
|
2324
|
+
}
|
|
2325
|
+
// One walk per key order (see perKeyOrder). An accessor-carrying
|
|
2326
|
+
// shape enumerates in accessorOrder, exactly as its
|
|
2327
|
+
// checked-dynamic copy does (dyn.ts).
|
|
2328
|
+
const orders = current.accessorOrder !== undefined ? [current.accessorOrder] : shapeKeyOrders(current);
|
|
1958
2329
|
const walks = orders.map(() => []);
|
|
1959
2330
|
for (const [k, fname] of orders.flatMap((order, k) => order.map((name) => [k, name]))) {
|
|
1960
2331
|
const ft = byName.get(fname);
|
|
1961
|
-
if (!ft)
|
|
2332
|
+
if (!ft) {
|
|
2333
|
+
const slots = accessors.get(fname);
|
|
2334
|
+
if (slots)
|
|
2335
|
+
walks[k].push(...accessorEntry(fname, slots));
|
|
1962
2336
|
continue;
|
|
2337
|
+
}
|
|
1963
2338
|
const show = entry(concatAll([strLit(`${inspectKey(fname)}: `, loc), child(ft, get(fname, ft))], loc), boolLit(false, loc));
|
|
1964
2339
|
const present = lowerer.recordFieldPresent(v(), t.shapeId, fname, loc);
|
|
1965
2340
|
walks[k].push(present.kind === "recordHas"
|
|
@@ -2000,11 +2375,20 @@ function inspectHelper(lowerer, t, loc) {
|
|
|
2000
2375
|
const keyT = isMap
|
|
2001
2376
|
? t.key
|
|
2002
2377
|
: t.elem;
|
|
2378
|
+
// Node's maxArrayLength bounds the entries shown; the tail counts the
|
|
2379
|
+
// entries past the limit.
|
|
2380
|
+
const limit = () => ({
|
|
2381
|
+
kind: "libCall",
|
|
2382
|
+
fn: "insp.maxArrayLength",
|
|
2383
|
+
args: [],
|
|
2384
|
+
type: F64,
|
|
2385
|
+
loc,
|
|
2386
|
+
});
|
|
2003
2387
|
const hasMore = () => ({
|
|
2004
2388
|
kind: "bin",
|
|
2005
2389
|
op: ">",
|
|
2006
2390
|
left: n(),
|
|
2007
|
-
right:
|
|
2391
|
+
right: limit(),
|
|
2008
2392
|
type: BOOL,
|
|
2009
2393
|
loc,
|
|
2010
2394
|
});
|
|
@@ -2060,7 +2444,7 @@ function inspectHelper(lowerer, t, loc) {
|
|
|
2060
2444
|
},
|
|
2061
2445
|
{
|
|
2062
2446
|
kind: "if",
|
|
2063
|
-
cond: { kind: "bin", op: "===", left: c(), right:
|
|
2447
|
+
cond: { kind: "bin", op: "===", left: c(), right: limit(), type: BOOL, loc },
|
|
2064
2448
|
then: [{ kind: "break", loc }],
|
|
2065
2449
|
else_: null,
|
|
2066
2450
|
loc,
|
|
@@ -2082,9 +2466,7 @@ function inspectHelper(lowerer, t, loc) {
|
|
|
2082
2466
|
entry({
|
|
2083
2467
|
kind: "libCall",
|
|
2084
2468
|
fn: "insp.moreItems",
|
|
2085
|
-
args: [
|
|
2086
|
-
{ kind: "bin", op: "-", left: n(), right: numLit(100, loc), type: F64, loc },
|
|
2087
|
-
],
|
|
2469
|
+
args: [{ kind: "bin", op: "-", left: n(), right: limit(), type: F64, loc }],
|
|
2088
2470
|
type: STRING,
|
|
2089
2471
|
loc,
|
|
2090
2472
|
}, boolLit(false, loc)),
|
|
@@ -2352,8 +2734,30 @@ function inspectHelper(lowerer, t, loc) {
|
|
|
2352
2734
|
});
|
|
2353
2735
|
}
|
|
2354
2736
|
lowerer.liftedFns.push(fn);
|
|
2737
|
+
if (t.kind === "record" && recordMayKeepSource(lowerer, t))
|
|
2738
|
+
registerLinkedHelper(lowerer, fn, t.shapeId, "inspect");
|
|
2355
2739
|
return name;
|
|
2356
2740
|
}
|
|
2741
|
+
/** The rendering of `value` at recursion `r` and depth budget `d`: its
|
|
2742
|
+
* type's inspect helper, or the checked-dynamic view's rendering when the
|
|
2743
|
+
* type has no inspect lowering (a record with a function field). */
|
|
2744
|
+
export function inspectHelperCall(lowerer, value, r, d, loc) {
|
|
2745
|
+
if (inspectSupport(lowerer, value.type, new Set(), { recursive: false }) !== null)
|
|
2746
|
+
return {
|
|
2747
|
+
kind: "libCall",
|
|
2748
|
+
fn: "insp.dyn",
|
|
2749
|
+
args: [{ kind: "dynFrom", value, liveRef: true, type: DYN, loc }, r, d],
|
|
2750
|
+
type: STRING,
|
|
2751
|
+
loc,
|
|
2752
|
+
};
|
|
2753
|
+
return {
|
|
2754
|
+
kind: "call",
|
|
2755
|
+
callee: inspectHelper(lowerer, value.type, loc),
|
|
2756
|
+
args: [value, r, d],
|
|
2757
|
+
type: STRING,
|
|
2758
|
+
loc,
|
|
2759
|
+
};
|
|
2760
|
+
}
|
|
2357
2761
|
/* ── the console/format top-level value rendering ────────────────────── */
|
|
2358
2762
|
/** Node's formatWithOptions REST-ARG rule over one statically-typed value
|
|
2359
2763
|
* (console.log's non-format arguments, util.format's %s and trailing
|
|
@@ -2522,9 +2926,13 @@ function parseInspectOptions(lowerer, node, recursive, dir = false, atRunTime =
|
|
|
2522
2926
|
breakLength: 80,
|
|
2523
2927
|
compact: 3,
|
|
2524
2928
|
sorted: false,
|
|
2929
|
+
maxArrayLength: 100,
|
|
2930
|
+
maxStringLength: 10000,
|
|
2525
2931
|
runtime: false,
|
|
2526
2932
|
depthKind: 0,
|
|
2527
2933
|
customInspect: !dir,
|
|
2934
|
+
showHidden: false,
|
|
2935
|
+
getters: 0,
|
|
2528
2936
|
};
|
|
2529
2937
|
if (!node || (ts.isIdentifier(node) && node.text === "undefined"))
|
|
2530
2938
|
return options;
|
|
@@ -2627,13 +3035,91 @@ function parseInspectOptions(lowerer, node, recursive, dir = false, atRunTime =
|
|
|
2627
3035
|
}
|
|
2628
3036
|
options.breakLength = n;
|
|
2629
3037
|
}
|
|
3038
|
+
else if (key === "maxStringLength") {
|
|
3039
|
+
if (value.kind === ts.SyntaxKind.NullKeyword ||
|
|
3040
|
+
(ts.isIdentifier(value) && value.text === "Infinity")) {
|
|
3041
|
+
// Node resolves null to Infinity: every character shows.
|
|
3042
|
+
options.maxStringLength = Infinity;
|
|
3043
|
+
}
|
|
3044
|
+
else {
|
|
3045
|
+
const n = numeric();
|
|
3046
|
+
if (n === null && atRunTime) {
|
|
3047
|
+
options.runtime = true;
|
|
3048
|
+
continue;
|
|
3049
|
+
}
|
|
3050
|
+
if (n === null || !Number.isInteger(n) || n < 0) {
|
|
3051
|
+
lowerer.noLowering(`${surface} with this maxStringLength option`, value, "maxStringLength must be a non-negative integer literal (or null)");
|
|
3052
|
+
}
|
|
3053
|
+
options.maxStringLength = n;
|
|
3054
|
+
}
|
|
3055
|
+
}
|
|
3056
|
+
else if (key === "maxArrayLength") {
|
|
3057
|
+
if (value.kind === ts.SyntaxKind.NullKeyword ||
|
|
3058
|
+
(ts.isIdentifier(value) && value.text === "Infinity")) {
|
|
3059
|
+
// Node resolves null to Infinity: every element shows.
|
|
3060
|
+
options.maxArrayLength = Infinity;
|
|
3061
|
+
}
|
|
3062
|
+
else {
|
|
3063
|
+
const n = numeric();
|
|
3064
|
+
if (n === null && atRunTime) {
|
|
3065
|
+
options.runtime = true;
|
|
3066
|
+
continue;
|
|
3067
|
+
}
|
|
3068
|
+
if (n === null || !Number.isInteger(n) || n < 0) {
|
|
3069
|
+
lowerer.noLowering(`${surface} with this maxArrayLength option`, value, "maxArrayLength must be a non-negative integer literal (or null)");
|
|
3070
|
+
}
|
|
3071
|
+
options.maxArrayLength = n;
|
|
3072
|
+
}
|
|
3073
|
+
}
|
|
3074
|
+
else if (key === "getters") {
|
|
3075
|
+
// Node reads the option's truthiness first and compares it to true
|
|
3076
|
+
// and to 'get'/'set' after: any other value keeps the labels.
|
|
3077
|
+
const spelled = ts.isStringLiteral(value) ? value.text : null;
|
|
3078
|
+
if (value.kind === ts.SyntaxKind.TrueKeyword)
|
|
3079
|
+
options.getters = 1;
|
|
3080
|
+
else if (value.kind === ts.SyntaxKind.FalseKeyword)
|
|
3081
|
+
options.getters = 0;
|
|
3082
|
+
else if (spelled === "get")
|
|
3083
|
+
options.getters = 2;
|
|
3084
|
+
else if (spelled === "set")
|
|
3085
|
+
options.getters = 3;
|
|
3086
|
+
else if (spelled !== null ||
|
|
3087
|
+
numeric() !== null ||
|
|
3088
|
+
value.kind === ts.SyntaxKind.NullKeyword ||
|
|
3089
|
+
(ts.isIdentifier(value) && value.text === "undefined")) {
|
|
3090
|
+
options.getters = 0;
|
|
3091
|
+
}
|
|
3092
|
+
else if (atRunTime) {
|
|
3093
|
+
options.runtime = true;
|
|
3094
|
+
continue;
|
|
3095
|
+
}
|
|
3096
|
+
else {
|
|
3097
|
+
lowerer.noLowering(`${surface} with this getters option`, value, "getters must be true, false, 'get' or 'set'");
|
|
3098
|
+
}
|
|
3099
|
+
}
|
|
2630
3100
|
else if (!dir &&
|
|
2631
3101
|
key === "customInspect" &&
|
|
2632
3102
|
(value.kind === ts.SyntaxKind.TrueKeyword || value.kind === ts.SyntaxKind.FalseKeyword)) {
|
|
2633
3103
|
options.customInspect = value.kind === ts.SyntaxKind.TrueKeyword;
|
|
2634
3104
|
}
|
|
2635
|
-
else if (key === "showHidden"
|
|
2636
|
-
|
|
3105
|
+
else if (key === "showHidden") {
|
|
3106
|
+
if (value.kind === ts.SyntaxKind.FalseKeyword) {
|
|
3107
|
+
// util.inspect's and console.dir's default.
|
|
3108
|
+
}
|
|
3109
|
+
else if (dir) {
|
|
3110
|
+
// console.dir's static entries carry no hidden keys; the option
|
|
3111
|
+
// renders the value's checked-dynamic view instead (dirHidden).
|
|
3112
|
+
if (value.kind !== ts.SyntaxKind.TrueKeyword) {
|
|
3113
|
+
lowerer.noLowering("console.dir with this showHidden option", value, "showHidden must be true or false");
|
|
3114
|
+
}
|
|
3115
|
+
options.showHidden = true;
|
|
3116
|
+
}
|
|
3117
|
+
else {
|
|
3118
|
+
// The hidden entries (an array's [length], a typed array's extras,
|
|
3119
|
+
// non-enumerable and symbol keys) render in the checked-dynamic
|
|
3120
|
+
// walk, so the option takes the runtime reader.
|
|
3121
|
+
options.runtime = true;
|
|
3122
|
+
}
|
|
2637
3123
|
}
|
|
2638
3124
|
else if (dir && key === "customInspect") {
|
|
2639
3125
|
// console.dir's own default; only that value is lowered.
|
|
@@ -2642,49 +3128,111 @@ function parseInspectOptions(lowerer, node, recursive, dir = false, atRunTime =
|
|
|
2642
3128
|
}
|
|
2643
3129
|
}
|
|
2644
3130
|
else {
|
|
2645
|
-
lowerer.noLowering(`${surface} with the '${key}' option`, prop, `the lowered options are depth (numeric literal or null), colors: false, showHidden
|
|
3131
|
+
lowerer.noLowering(`${surface} with the '${key}' option`, prop, `the lowered options are depth (numeric literal or null), colors: false, showHidden (true or false), compact (false or a number), breakLength, maxArrayLength and maxStringLength (a non-negative integer or null), getters (true, false, 'get' or 'set'), ${dir ? "sorted (true or false), and customInspect: false" : "and sorted (true or false)"}`);
|
|
2646
3132
|
}
|
|
2647
3133
|
}
|
|
2648
3134
|
return options;
|
|
2649
3135
|
}
|
|
2650
|
-
/** A render under non-default breakLength/compact/sorted
|
|
2651
|
-
*
|
|
2652
|
-
*
|
|
2653
|
-
*
|
|
2654
|
-
*
|
|
2655
|
-
* try; `tag` names the render for the
|
|
3136
|
+
/** A render under non-default breakLength/compact/sorted/maxArrayLength/
|
|
3137
|
+
* maxStringLength/getters: the value is evaluated first, the options apply
|
|
3138
|
+
* to this render only, and the defaults return however the render ends, an
|
|
3139
|
+
* inspection refusal included. The render runs in a lifted function,
|
|
3140
|
+
* `(v) => { set...; try { return render(v); } finally { restore...; } }`,
|
|
3141
|
+
* since a seqExpr cannot hold the try; `tag` names the render for the
|
|
3142
|
+
* function's key. */
|
|
2656
3143
|
function withInspectLayout(lowerer, options, value, tag, render, loc) {
|
|
2657
|
-
if (options.breakLength === 80 &&
|
|
3144
|
+
if (options.breakLength === 80 &&
|
|
3145
|
+
options.compact === 3 &&
|
|
3146
|
+
!options.sorted &&
|
|
3147
|
+
options.maxArrayLength === 100 &&
|
|
3148
|
+
options.maxStringLength === 10000 &&
|
|
3149
|
+
options.getters === 0)
|
|
2658
3150
|
return render(value);
|
|
2659
|
-
const key = `layout:${tag}:${typeKey(value.type)}:${options.breakLength}:${options.compact}:${options.sorted}:${options.depth}`;
|
|
3151
|
+
const key = `layout:${tag}:${typeKey(value.type)}:${options.breakLength}:${options.compact}:${options.sorted}:${options.maxArrayLength}:${options.maxStringLength}:${options.getters}:${options.depth}`;
|
|
2660
3152
|
let name = lowerer.inspectHelpers.get(key);
|
|
2661
3153
|
if (name === undefined) {
|
|
2662
3154
|
name = keyedHelperName(lowerer, "%util.inspLayout", key);
|
|
2663
3155
|
lowerer.inspectHelpers.set(key, name);
|
|
2664
|
-
const layout = (breakLength, compact, sorted) => ({
|
|
3156
|
+
const layout = (breakLength, compact, sorted, maxArrayLength) => ({
|
|
2665
3157
|
kind: "exprStmt",
|
|
2666
3158
|
expr: {
|
|
2667
3159
|
kind: "libCall",
|
|
2668
3160
|
fn: "insp.layout",
|
|
2669
|
-
args: [
|
|
3161
|
+
args: [
|
|
3162
|
+
numLit(breakLength, loc),
|
|
3163
|
+
numLit(compact, loc),
|
|
3164
|
+
boolLit(sorted, loc),
|
|
3165
|
+
numLit(maxArrayLength, loc),
|
|
3166
|
+
],
|
|
2670
3167
|
type: VOID,
|
|
2671
3168
|
loc,
|
|
2672
3169
|
},
|
|
2673
3170
|
loc,
|
|
2674
3171
|
});
|
|
3172
|
+
const locals = [{ id: "v.0", name: "v", type: value.type, mutable: false }];
|
|
3173
|
+
const apply = [
|
|
3174
|
+
layout(options.breakLength, options.compact, options.sorted, options.maxArrayLength),
|
|
3175
|
+
];
|
|
3176
|
+
const restore = [layout(80, 3, false, 100)];
|
|
3177
|
+
if (options.maxStringLength !== 10000) {
|
|
3178
|
+
// insp.maxStringLength answers the previous value.
|
|
3179
|
+
const previous = `previous.${locals.length}`;
|
|
3180
|
+
locals.push({ id: previous, name: "previous", type: F64, mutable: false });
|
|
3181
|
+
const limit = (arg) => ({
|
|
3182
|
+
kind: "libCall",
|
|
3183
|
+
fn: "insp.maxStringLength",
|
|
3184
|
+
args: [arg],
|
|
3185
|
+
type: F64,
|
|
3186
|
+
loc,
|
|
3187
|
+
});
|
|
3188
|
+
apply.push({
|
|
3189
|
+
kind: "varDecl",
|
|
3190
|
+
localId: previous,
|
|
3191
|
+
init: limit(numLit(options.maxStringLength, loc)),
|
|
3192
|
+
loc,
|
|
3193
|
+
});
|
|
3194
|
+
restore.unshift({
|
|
3195
|
+
kind: "exprStmt",
|
|
3196
|
+
expr: limit(varRef(previous, F64, loc)),
|
|
3197
|
+
loc,
|
|
3198
|
+
});
|
|
3199
|
+
}
|
|
3200
|
+
if (options.getters !== 0) {
|
|
3201
|
+
// insp.getters answers the previous value.
|
|
3202
|
+
const previous = `previous.${locals.length}`;
|
|
3203
|
+
locals.push({ id: previous, name: "previous", type: F64, mutable: false });
|
|
3204
|
+
const getters = (arg) => ({
|
|
3205
|
+
kind: "libCall",
|
|
3206
|
+
fn: "insp.getters",
|
|
3207
|
+
args: [arg],
|
|
3208
|
+
type: F64,
|
|
3209
|
+
loc,
|
|
3210
|
+
});
|
|
3211
|
+
apply.push({
|
|
3212
|
+
kind: "varDecl",
|
|
3213
|
+
localId: previous,
|
|
3214
|
+
init: getters(numLit(options.getters, loc)),
|
|
3215
|
+
loc,
|
|
3216
|
+
});
|
|
3217
|
+
restore.unshift({
|
|
3218
|
+
kind: "exprStmt",
|
|
3219
|
+
expr: getters(varRef(previous, F64, loc)),
|
|
3220
|
+
loc,
|
|
3221
|
+
});
|
|
3222
|
+
}
|
|
2675
3223
|
lowerer.liftedFns.push({
|
|
2676
3224
|
name,
|
|
2677
3225
|
params: [{ localId: "v.0", name: "v", type: value.type }],
|
|
2678
3226
|
returnType: STRING,
|
|
2679
|
-
locals
|
|
3227
|
+
locals,
|
|
2680
3228
|
body: [
|
|
2681
|
-
|
|
3229
|
+
...apply,
|
|
2682
3230
|
{
|
|
2683
3231
|
kind: "tryCatch",
|
|
2684
3232
|
tryBody: [{ kind: "return", value: render(varRef("v.0", value.type, loc)), loc }],
|
|
2685
3233
|
catchBody: null,
|
|
2686
3234
|
catchLocalId: null,
|
|
2687
|
-
finallyBody:
|
|
3235
|
+
finallyBody: restore,
|
|
2688
3236
|
loc,
|
|
2689
3237
|
},
|
|
2690
3238
|
],
|
|
@@ -2811,14 +3359,18 @@ function lowerRuntimeInspect(lowerer, args, loc) {
|
|
|
2811
3359
|
* walk that refuses a Buffer anywhere inside. */
|
|
2812
3360
|
export function lowerInspectValue(lowerer, valueNode, optionsNode, loc, dir) {
|
|
2813
3361
|
const surface = dir ? "console.dir" : "util.inspect";
|
|
3362
|
+
// console.dir's showHidden renders the checked-dynamic walk with its
|
|
3363
|
+
// hidden entries, so the baked forms below must not swallow the option.
|
|
3364
|
+
const dirPreview = dir ? parseInspectOptions(lowerer, optionsNode, false, dir) : null;
|
|
2814
3365
|
// Inline function/class literals and direct declared names render as
|
|
2815
3366
|
// their baked forms; other function-typed values fence below.
|
|
2816
3367
|
const direct = directCallableInspect(lowerer, valueNode, loc);
|
|
2817
|
-
if (direct) {
|
|
3368
|
+
if (direct && !dirPreview?.showHidden) {
|
|
2818
3369
|
parseInspectOptions(lowerer, optionsNode, false, dir);
|
|
2819
3370
|
return direct;
|
|
2820
3371
|
}
|
|
2821
|
-
if (ts.isArrowFunction(valueNode) || ts.isFunctionExpression(valueNode))
|
|
3372
|
+
if ((ts.isArrowFunction(valueNode) || ts.isFunctionExpression(valueNode)) &&
|
|
3373
|
+
!dirPreview?.showHidden) {
|
|
2822
3374
|
parseInspectOptions(lowerer, optionsNode, false, dir);
|
|
2823
3375
|
return strLit(valueNode.kind === ts.SyntaxKind.FunctionExpression &&
|
|
2824
3376
|
valueNode.name
|
|
@@ -2834,6 +3386,23 @@ export function lowerInspectValue(lowerer, valueNode, optionsNode, loc, dir) {
|
|
|
2834
3386
|
const name = jsFuncNameOf(valueNode);
|
|
2835
3387
|
value = { kind: "dynFrom", value, type: DYN, ...(name !== null ? { fnName: name } : {}), loc };
|
|
2836
3388
|
}
|
|
3389
|
+
if (dirPreview?.showHidden) {
|
|
3390
|
+
// console.dir's hidden entries (an array's [length], a typed array's
|
|
3391
|
+
// extras, non-enumerable and symbol keys) render in the checked-dynamic
|
|
3392
|
+
// walk with custom inspection off, dir's default; the value needs a
|
|
3393
|
+
// checked view to reach it.
|
|
3394
|
+
if (value.type.kind !== "dyn" && !lowerer.dynConvertible(value.type)) {
|
|
3395
|
+
lowerer.noLowering(`console.dir with showHidden of '${lowerer.fmt(value.type)}' values`, valueNode, "the hidden entries render through the value's checked-dynamic view, which this type has no conversion to");
|
|
3396
|
+
}
|
|
3397
|
+
const input = value.type.kind === "dyn" ? value : { kind: "dynFrom", value, type: DYN, loc };
|
|
3398
|
+
return withInspectLayout(lowerer, dirPreview, input, "dirHidden", (v) => ({
|
|
3399
|
+
kind: "libCall",
|
|
3400
|
+
fn: "console.dirHidden",
|
|
3401
|
+
args: [v, numLit(dirPreview.depth, loc)],
|
|
3402
|
+
type: STRING,
|
|
3403
|
+
loc,
|
|
3404
|
+
}), loc);
|
|
3405
|
+
}
|
|
2837
3406
|
if (value.type.kind === "bytes") {
|
|
2838
3407
|
// One runtime representation serves Buffer AND Uint8Array; their
|
|
2839
3408
|
// renderings differ (<Buffer aa> vs Uint8Array(1) [ 170 ]), so the
|
|
@@ -2885,7 +3454,7 @@ export function lowerInspectValue(lowerer, valueNode, optionsNode, loc, dir) {
|
|
|
2885
3454
|
// render(v); } finally { restore; } }`, so the previous ones return on
|
|
2886
3455
|
// every exit, an inspection refusal's throw included (a seqExpr cannot
|
|
2887
3456
|
// hold the try).
|
|
2888
|
-
const key = `context:${typeKey(value.type)}:${customContext}:${depthContext}:${options.depthKind}:${options.breakLength}:${options.compact}:${options.sorted}:${depth}`;
|
|
3457
|
+
const key = `context:${typeKey(value.type)}:${customContext}:${depthContext}:${options.depthKind}:${options.breakLength}:${options.compact}:${options.sorted}:${options.maxArrayLength}:${options.maxStringLength}:${options.getters}:${depth}`;
|
|
2889
3458
|
let name = lowerer.inspectHelpers.get(key);
|
|
2890
3459
|
if (name === undefined) {
|
|
2891
3460
|
name = keyedHelperName(lowerer, "%util.inspContext", key);
|
|
@@ -3005,17 +3574,18 @@ function formatSValue(lowerer, node, value, depth, loc) {
|
|
|
3005
3574
|
return inspectExpr(lowerer, t, value, numLit(0, loc), numLit(depth, loc), loc);
|
|
3006
3575
|
}
|
|
3007
3576
|
/** %O (depth 2) / %o (showHidden, depth 4) — inspect with the spec's
|
|
3008
|
-
* option deltas. A
|
|
3009
|
-
*
|
|
3010
|
-
*
|
|
3011
|
-
*
|
|
3577
|
+
* option deltas. A showHidden argument that the checked-dynamic tree can
|
|
3578
|
+
* hold (arrays — whose hidden [length] entry the static rendering has no
|
|
3579
|
+
* lowering for — records, maps, sets, typed arrays and nested dynamic
|
|
3580
|
+
* values) renders through the runtime's showHidden walk; the static
|
|
3581
|
+
* rendering covers the default %O. */
|
|
3012
3582
|
function formatOArg(lowerer, node, depth, loc) {
|
|
3013
3583
|
const value = lowerer.lowerExpr(node);
|
|
3014
|
-
if (depth === 4 && value.type.kind === "dyn") {
|
|
3584
|
+
if (depth === 4 && (value.type.kind === "dyn" || lowerer.dynConvertible(value.type))) {
|
|
3015
3585
|
return {
|
|
3016
3586
|
kind: "libCall",
|
|
3017
3587
|
fn: "insp.dynHidden",
|
|
3018
|
-
args: [value, numLit(4, loc)],
|
|
3588
|
+
args: [lowerer.coerceToExpected(value, DYN), numLit(4, loc)],
|
|
3019
3589
|
type: STRING,
|
|
3020
3590
|
loc,
|
|
3021
3591
|
};
|
|
@@ -3031,6 +3601,8 @@ function formatOArg(lowerer, node, depth, loc) {
|
|
|
3031
3601
|
lowerer.noLowering("util.format %o over values with [util.inspect.custom] methods", node, "%o passes showHidden to the methods — use %O");
|
|
3032
3602
|
}
|
|
3033
3603
|
if (depth === 4 && typeTreeHasHidden(lowerer, value.type, new Set())) {
|
|
3604
|
+
// The static rendering below has no showHidden entries; the tree is
|
|
3605
|
+
// not one the checked-dynamic walk can hold.
|
|
3034
3606
|
lowerer.noLowering("util.format %o over arrays", node, "%o renders with showHidden (arrays gain a hidden [length] entry) — use %O for the default rendering, or pass the value as unknown");
|
|
3035
3607
|
}
|
|
3036
3608
|
return inspectExpr(lowerer, value.type, value, numLit(0, loc), numLit(depth, loc), loc);
|
|
@@ -3625,7 +4197,9 @@ export function heldFormatArgs(lowerer, argNodes, loc) {
|
|
|
3625
4197
|
lowerer.noLowering(unconvertibleSurface(refused.type), refused.node, UNCONVERTIBLE_HINT);
|
|
3626
4198
|
return { stmts, args, specifies, format, joinable };
|
|
3627
4199
|
}
|
|
3628
|
-
/** Arrays anywhere in the tree — the
|
|
4200
|
+
/** Arrays, byte views or checked-dynamic values anywhere in the tree — the
|
|
4201
|
+
* static %o (showHidden) gate, for the types the checked-dynamic walk
|
|
4202
|
+
* cannot hold. */
|
|
3629
4203
|
function typeTreeHasHidden(lowerer, t, visiting) {
|
|
3630
4204
|
switch (t.kind) {
|
|
3631
4205
|
case "array":
|