@scriptc/compiler 0.4.0 → 0.4.2
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 +617 -83
- package/dist/backend/cycle-analysis.d.ts +2 -1
- package/dist/backend/cycle-analysis.js +4 -4
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +2 -1
- package/dist/backend/cycle-mutability.js +2 -2
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +10 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +2 -1
- package/dist/backend/immutability.js +2 -2
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/library-pack.js +7 -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/alloc.d.ts +7 -3
- package/dist/backend/llvm/alloc.js +7 -4
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/array-search.js +4 -1
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +23 -2
- package/dist/backend/llvm/bytes-loop-versions.js +115 -19
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +131 -0
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +99 -2
- package/dist/backend/llvm/classes.js +436 -57
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +235 -16
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +21 -5
- package/dist/backend/llvm/common.js +50 -5
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.js +8 -4
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +4 -4
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +4 -1
- package/dist/backend/llvm/counted-loops.js +62 -23
- package/dist/backend/llvm/counted-loops.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.d.ts +19 -16
- package/dist/backend/llvm/dense-array-loops.js +49 -13
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +50 -14
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +34 -1
- package/dist/backend/llvm/dyn.js +393 -14
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +27 -8
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-module.js +67 -39
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +3 -25
- package/dist/backend/llvm/emit-statements.js +414 -37
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +159 -22
- package/dist/backend/llvm/emitter.js +573 -89
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +19 -0
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +5 -2
- package/dist/backend/llvm/expr-bytes.js +110 -40
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +1 -1
- package/dist/backend/llvm/expr-calls.js +51 -26
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +27 -14
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +2 -3
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +95 -5
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +29 -11
- 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 +48 -20
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.js +131 -35
- package/dist/backend/llvm/expr-stream-callbacks.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-dispatch.js +10 -0
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +61 -0
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.d.ts +4 -0
- package/dist/backend/llvm/lib-http2.js +20 -17
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +69 -17
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +75 -1
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +65 -28
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +23 -0
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +91 -61
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +14 -0
- package/dist/backend/llvm/local-array-reads.test.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 +11 -1
- package/dist/backend/llvm/publish.js +80 -22
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.js +3 -0
- package/dist/backend/llvm/publish.test.js.map +1 -1
- package/dist/backend/llvm/receivers.js +1 -1
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/reference-writes.js +2 -0
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.js +161 -14
- package/dist/backend/llvm/regex-matchers.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.test.js +18 -0
- package/dist/backend/llvm/regex-matchers.test.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 +17 -9
- package/dist/backend/llvm/shapes.js +21 -17
- 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-lifetimes.test.js +2 -1
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +4 -1
- package/dist/backend/llvm/string-reads.js +88 -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/llvm/wasm-modules.d.ts +6 -5
- package/dist/backend/llvm/wasm-modules.js +32 -9
- package/dist/backend/llvm/wasm-modules.js.map +1 -1
- package/dist/backend/mangle.d.ts +8 -0
- package/dist/backend/mangle.js +12 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +40 -2
- package/dist/backend/native/executable.js +40 -7
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +3 -1
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +17 -6
- package/dist/backend/native-codegen.js +55 -9
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +18 -14
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +30 -2
- 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/optimization.d.ts +2 -2
- 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 +7 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +0 -21
- package/dist/backend/runtime-pack.js +0 -29
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +12 -69
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.js +38 -1
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +6 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +89 -7
- 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 +15 -1
- package/dist/cli/usage.js +30 -2
- package/dist/cli/usage.js.map +1 -1
- package/dist/compile-types.d.ts +9 -0
- package/dist/contracts/check.js +2 -3
- package/dist/contracts/check.js.map +1 -1
- package/dist/coverage/report.d.ts +7 -2
- package/dist/coverage/report.js +18 -0
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +1 -0
- package/dist/coverage/verdict-cache.js +4 -0
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/coverage/verdict-semantic.js +4 -0
- package/dist/coverage/verdict-semantic.js.map +1 -1
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/dynamic-tier.d.ts +40 -0
- package/dist/diagnostics/dynamic-tier.js +57 -0
- package/dist/diagnostics/dynamic-tier.js.map +1 -0
- package/dist/diagnostics/envelope.d.ts +2 -1
- package/dist/diagnostics/envelope.js +5 -2
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +32 -0
- package/dist/executable/executable-cache.js +65 -7
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +50 -3
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +3 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +1 -0
- package/dist/frontend/analysis.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/dispose-hook.d.ts +2 -0
- package/dist/frontend/dispose-hook.js +14 -0
- package/dist/frontend/dispose-hook.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/jsx-entities.d.ts +4 -0
- package/dist/frontend/jsx-entities.js +259 -0
- package/dist/frontend/jsx-entities.js.map +1 -0
- package/dist/frontend/jsx-source.d.ts +71 -0
- package/dist/frontend/jsx-source.js +781 -0
- package/dist/frontend/jsx-source.js.map +1 -0
- package/dist/frontend/jsx-source.test.d.ts +1 -0
- package/dist/frontend/jsx-source.test.js +200 -0
- package/dist/frontend/jsx-source.test.js.map +1 -0
- package/dist/frontend/literal-values.test.js +8 -9
- package/dist/frontend/literal-values.test.js.map +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +3 -2
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
- package/dist/frontend/lowering/binding-analysis.js +2 -2
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
- package/dist/frontend/lowering/builtins/arguments.js +30 -15
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.js +10 -6
- package/dist/frontend/lowering/builtins/atomics.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/child-process-async.js +2 -1
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +7 -2
- package/dist/frontend/lowering/builtins/crypto.js +63 -4
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
- package/dist/frontend/lowering/builtins/date-classes.js +477 -0
- package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
- package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
- package/dist/frontend/lowering/builtins/dates.js +55 -26
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
- package/dist/frontend/lowering/builtins/dh.js +151 -0
- package/dist/frontend/lowering/builtins/dh.js.map +1 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
- package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
- package/dist/frontend/lowering/builtins/ecdh.d.ts +21 -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/errors.d.ts +15 -0
- package/dist/frontend/lowering/builtins/errors.js +110 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.js +6 -4
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
- package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
- package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
- package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
- package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
- package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +54 -1
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
- package/dist/frontend/lowering/builtins/key-object.js +20 -7
- package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +11 -4
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.js +9 -5
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.js +4 -3
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/performance.js +3 -2
- package/dist/frontend/lowering/builtins/performance.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +9 -0
- package/dist/frontend/lowering/builtins/process.js +47 -2
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.js +3 -2
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/promisify-callback.d.ts +3 -0
- package/dist/frontend/lowering/builtins/promisify-callback.js +23 -4
- package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +2 -1
- package/dist/frontend/lowering/builtins/readline.js +23 -6
- package/dist/frontend/lowering/builtins/readline.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/strings.js +13 -5
- package/dist/frontend/lowering/builtins/strings.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.js +6 -2
- 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/builtins/url.js +4 -3
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/v8.js +2 -1
- package/dist/frontend/lowering/builtins/v8.js.map +1 -1
- package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
- package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.js +2 -1
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.d.ts +4 -0
- package/dist/frontend/lowering/call-signatures.js +137 -13
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
- package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
- package/dist/frontend/lowering/caught-value-dispatch.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-assertions.js +3 -2
- package/dist/frontend/lowering/class-assertions.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +2 -1
- package/dist/frontend/lowering/class-construction.js +8 -13
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-descriptors.js +1 -1
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +34 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +577 -152
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +77 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +3 -0
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +1 -1
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +17 -0
- package/dist/frontend/lowering/class-protocols.js +117 -7
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
- package/dist/frontend/lowering/class-prototypes.js +42 -4
- 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 +31 -8
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
- package/dist/frontend/lowering/class-unions.js +2 -1
- package/dist/frontend/lowering/class-unions.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 +105 -75
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +8 -7
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.js +8 -7
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/collection-ingestion.js +2 -1
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +15 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +36 -32
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +2 -1
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +32 -4
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +11 -5
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +2 -1
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +10 -1
- package/dist/frontend/lowering/containers/bytes.js +601 -24
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +52 -2
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +80 -10
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +8 -7
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
- package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +85 -22
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +2 -1
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +26 -10
- package/dist/frontend/lowering/cycle-initialization.js +177 -39
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
- package/dist/frontend/lowering/dispatch-sites.js +204 -0
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
- package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
- package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
- package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
- package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
- package/dist/frontend/lowering/dyn-streams.js +1 -1
- package/dist/frontend/lowering/dyn-streams.js.map +1 -1
- package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
- package/dist/frontend/lowering/dynamic-tier.js +327 -0
- package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
- package/dist/frontend/lowering/error-methods.js +4 -0
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +48 -13
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +124 -8
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +30 -7
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +46 -7
- package/dist/frontend/lowering/expressions/identifiers.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 +52 -7
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +0 -3
- package/dist/frontend/lowering/expressions/object-literals.js +75 -7
- 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 +17 -8
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +5 -4
- package/dist/frontend/lowering/expressions/property-access.js +351 -16
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +112 -9
- 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 +64 -10
- 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/generator-dynamic-dispatch.d.ts +6 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +46 -1
- package/dist/frontend/lowering/generic-functions.js +660 -73
- 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/intern-tables.js +2 -1
- package/dist/frontend/lowering/intern-tables.js.map +1 -1
- 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/iterator-adapters.js +9 -8
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
- package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
- package/dist/frontend/lowering/json-require.js +2 -1
- package/dist/frontend/lowering/json-require.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +7 -2
- package/dist/frontend/lowering/key-order-witness.js +21 -4
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +38 -2
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lifetime-regions.js +2 -1
- package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
- 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-assert.js +6 -5
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +3 -1
- package/dist/frontend/lowering/lower-async-iteration.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.d.ts +4 -0
- package/dist/frontend/lowering/lower-calls.js +504 -97
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +22 -0
- package/dist/frontend/lowering/lower-classes.js +339 -32
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +65 -15
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
- package/dist/frontend/lowering/lower-event-emitter.js +267 -20
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
- package/dist/frontend/lowering/lower-exprs.js +148 -12
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +308 -72
- 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 +578 -16
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +2 -1
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.js +2 -1
- package/dist/frontend/lowering/lower-mock.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +11 -3
- package/dist/frontend/lowering/lower-modules.js +227 -72
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.js +2 -2
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
- package/dist/frontend/lowering/lower-namespaces.js +24 -3
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +10 -0
- package/dist/frontend/lowering/lower-server.js +263 -60
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.js +39 -18
- 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 +584 -69
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +575 -165
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +21 -4
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +151 -30
- package/dist/frontend/lowering/lowerer.js +725 -84
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +21 -9
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/narrowing-stability.js +5 -0
- package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +1 -1
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
- package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.js +2 -1
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/private-brands.d.ts +9 -0
- package/dist/frontend/lowering/private-brands.js +66 -15
- package/dist/frontend/lowering/private-brands.js.map +1 -1
- package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
- package/dist/frontend/lowering/promise-executor-adapter.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/require-initialization.js +2 -1
- package/dist/frontend/lowering/require-initialization.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
- package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
- package/dist/frontend/lowering/runtime-optional-records.js +18 -5
- package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
- package/dist/frontend/lowering/site-dependencies.js +84 -0
- package/dist/frontend/lowering/site-dependencies.js.map +1 -0
- package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
- package/dist/frontend/lowering/site-dependencies.test.js +53 -0
- package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
- package/dist/frontend/lowering/stable-names.d.ts +11 -0
- package/dist/frontend/lowering/stable-names.js +35 -0
- package/dist/frontend/lowering/stable-names.js.map +1 -0
- package/dist/frontend/lowering/static-typeof.d.ts +26 -0
- package/dist/frontend/lowering/static-typeof.js +172 -0
- package/dist/frontend/lowering/static-typeof.js.map +1 -0
- package/dist/frontend/lowering/strict-equality.js +2 -1
- package/dist/frontend/lowering/strict-equality.js.map +1 -1
- 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/structural-positions.d.ts +32 -0
- package/dist/frontend/lowering/structural-positions.js +108 -0
- package/dist/frontend/lowering/structural-positions.js.map +1 -0
- package/dist/frontend/lowering/surfaces.js +72 -30
- 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/lowering/var-hoisting.js +37 -3
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- 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-tsc-helpers.d.ts +5 -0
- package/dist/frontend/npm-static-tsc-helpers.js +106 -0
- package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
- package/dist/frontend/npm-static-type-exports-host.js +214 -0
- package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
- package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.d.ts +52 -0
- package/dist/frontend/npm-static-type-exports.js +261 -0
- package/dist/frontend/npm-static-type-exports.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports.test.js +103 -0
- package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
- package/dist/frontend/npm-static-umd.d.ts +6 -0
- package/dist/frontend/npm-static-umd.js +203 -0
- package/dist/frontend/npm-static-umd.js.map +1 -0
- package/dist/frontend/npm-static-umd.test.d.ts +1 -0
- package/dist/frontend/npm-static-umd.test.js +105 -0
- package/dist/frontend/npm-static-umd.test.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +16 -0
- package/dist/frontend/npm-static.js +93 -3
- 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 +21 -0
- package/dist/frontend/program.js +174 -14
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +1 -1
- package/dist/frontend/program.test.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 +12 -0
- package/dist/frontend/services.js +37 -0
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/ts7/ast-node.d.ts +21 -7
- package/dist/frontend/ts7/ast-node.js +131 -29
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +60 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +27 -2
- package/dist/frontend/ts7/ast-wire.js +124 -21
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast.d.ts +23 -2
- package/dist/frontend/ts7/ast.js +143 -2
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +13 -1
- package/dist/frontend/ts7/checker.js +75 -1
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +9 -6
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/enums.d.ts +3 -3
- package/dist/frontend/ts7/enums.generated.d.ts +10 -0
- package/dist/frontend/ts7/enums.generated.js +21 -0
- package/dist/frontend/ts7/enums.generated.js.map +1 -1
- package/dist/frontend/ts7/enums.js +19 -0
- package/dist/frontend/ts7/enums.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +6 -5
- package/dist/frontend/ts7/program-host.js +12 -2
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
- package/dist/frontend/ts7/semantic-checker.js +25 -20
- package/dist/frontend/ts7/semantic-checker.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.d.ts +13 -0
- package/dist/frontend/ts7/semantic-json.js +146 -0
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.test.js +57 -1
- package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +18 -0
- package/dist/frontend/ts7/semantic-model.js +90 -16
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +3 -2
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +19 -4
- package/dist/frontend/ts7/session.js +1 -1
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/tsc-codes.d.ts +1 -1
- package/dist/frontend/tsc-codes.js +7 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +38 -6
- package/dist/frontend/type-mapper.js +466 -47
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +1 -1
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend-process-args.d.ts +4 -0
- package/dist/frontend-process-args.js +52 -0
- package/dist/frontend-process-args.js.map +1 -0
- package/dist/frontend-process-args.test.d.ts +1 -0
- package/dist/frontend-process-args.test.js +47 -0
- package/dist/frontend-process-args.test.js.map +1 -0
- package/dist/frontend-process.d.ts +1 -0
- package/dist/frontend-process.js +23 -0
- package/dist/frontend-process.js.map +1 -0
- package/dist/heap-collection.d.ts +16 -0
- package/dist/heap-collection.js +42 -0
- package/dist/heap-collection.js.map +1 -0
- package/dist/heap-collection.test.d.ts +1 -0
- package/dist/heap-collection.test.js +59 -0
- package/dist/heap-collection.test.js.map +1 -0
- package/dist/heap-pressure.d.ts +2 -0
- package/dist/heap-pressure.js +12 -0
- package/dist/heap-pressure.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +453 -85
- package/dist/index.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +3 -2
- package/dist/ir/array-length-stability.js +22 -2
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +47 -1
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.js +41 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +5 -1
- package/dist/ir/builtin-signatures.js +187 -16
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/final-fields.d.ts +2 -1
- package/dist/ir/final-fields.js +2 -2
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.test.js +2 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/int32-slots.d.ts +13 -5
- package/dist/ir/int32-slots.js +112 -115
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +3 -1
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +14 -4
- package/dist/ir/integer-loop-facts.js +172 -32
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +49 -0
- package/dist/ir/integer-loops.js +193 -39
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +201 -1
- package/dist/ir/integer-loops.test.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 +255 -1
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +17 -2
- package/dist/ir/ir.js +11 -1
- 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 +64 -5
- package/dist/ir/runtime-features.js +358 -101
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/tiers.js +1 -0
- package/dist/ir/tiers.js.map +1 -1
- package/dist/ir/traverse.d.ts +2 -0
- package/dist/ir/traverse.js +124 -70
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +77 -24
- 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 +11 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +2 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/prepare.js +2 -0
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/cli.js +22 -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 +8 -1
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.test.js +10 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/startup-cache.d.ts +1 -0
- package/dist/startup-cache.js +1 -0
- package/dist/startup-cache.js.map +1 -1
- package/dist/text-parts.d.ts +7 -0
- package/dist/text-parts.js +44 -0
- package/dist/text-parts.js.map +1 -1
- package/dist/text-parts.test.d.ts +1 -0
- package/dist/text-parts.test.js +46 -0
- package/dist/text-parts.test.js.map +1 -0
- package/dist/timing.d.ts +9 -2
- package/dist/timing.js +7 -4
- package/dist/timing.js.map +1 -1
- package/dist/wasm/translate.d.ts +4 -0
- package/dist/wasm/translate.js +2 -2
- package/dist/wasm/translate.js.map +1 -1
- package/package.json +22 -21
- 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 +20 -52
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { InternalCompilerError } from "../../errors.js";
|
|
2
2
|
import { isRefCounted, RUNTIME_EMITTER_CLASS, RUNTIME_EVENT_CLASS, RUNTIME_EVENT_TARGET_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, classValueConstructor, } from "../../ir/ir.js";
|
|
3
3
|
import { streamRooted, undefinedArmTag } from "../../ir/analysis.js";
|
|
4
|
-
import { mangleClassGcFree, mangleClassNew, mangleClassObj, mangleClassRelease, mangleClassReleaseDirect, mangleClassRetain, mangleClassStruct, mangleClassTrace, mangleCtorThunk, mangleFunction, mangleGlobal, mangleVtInstance, mangleVtStruct, } from "../mangle.js";
|
|
4
|
+
import { mangleClassGcFree, mangleClassNew, mangleClassObj, mangleClassRelease, mangleClassReleaseDirect, mangleClassRetain, mangleClassStruct, mangleClassTrace, mangleCtorThunk, mangleFunction, mangleGlobal, mangleVtArray, mangleVtInstance, mangleVtStruct, } from "../mangle.js";
|
|
5
5
|
import { cycTypeDescriptor, emitObjectAlloc, emitObjectFree } from "./alloc.js";
|
|
6
6
|
import { llvmCommentText } from "./common.js";
|
|
7
|
+
import { INLINE_UNION_FIELD } from "./inline-unions.js";
|
|
7
8
|
import { NullableRefFields } from "./nullable-fields.js";
|
|
8
9
|
import { cycleRootLines, traceFieldVisitLines, FN_ATTRS, cycleDeadLines, destroyDefinitions, directChildReleaseLines, directDestroyTarget, usedDirectTargets, llFieldType, releaseBody, releaseFastPath, needsBoundedRelease, releaseSym, retainBody, traceAdapter, youngEntryLines, } from "./shapes.js";
|
|
9
10
|
/** Per-class node of the class graph. */
|
|
@@ -24,6 +25,25 @@ export class LlClassMeta {
|
|
|
24
25
|
* member's struct carries the i32 slot word before its fields
|
|
25
26
|
* (classSlotWordIndex). */
|
|
26
27
|
threadSlot = false;
|
|
28
|
+
/** A member of a program-rooted hierarchy on a 64-bit target: instead of
|
|
29
|
+
* a vtable word, the rc word holds the class id (classIdRcWord) in its
|
|
30
|
+
* high 32 bits (CLASS_ID_OFFSET) and the reference count in its low 32
|
|
31
|
+
* bits, and the hierarchy's vtables are one array indexed by the id
|
|
32
|
+
* (mangleVtArray). */
|
|
33
|
+
idInRc = false;
|
|
34
|
+
/** A ProgramLifetime class with the 32-bit header (assignCompactLayouts):
|
|
35
|
+
* the i32 at offset 0 is compactHeaderWord, with the class id in place of
|
|
36
|
+
* the rc word's high half, and the fields are packed after it. */
|
|
37
|
+
compact = false;
|
|
38
|
+
/** Compact classes: the struct's elements by offset (the header, field
|
|
39
|
+
* -1, then the fields by their index in def.fields). */
|
|
40
|
+
compactElems = [];
|
|
41
|
+
/** Compact classes: each field's GEP index, by its index in def.fields. */
|
|
42
|
+
compactSlots = [];
|
|
43
|
+
/** Compact classes: whether each field (by its index in def.fields) holds
|
|
44
|
+
* a compact class instance as a 32-bit index (COMPACT_REF) rather than a
|
|
45
|
+
* pointer: compactRefLoadLines decodes it, compactRefStoreLines encodes it. */
|
|
46
|
+
compressed = [];
|
|
27
47
|
constructor(def) {
|
|
28
48
|
this.def = def;
|
|
29
49
|
this.root = this;
|
|
@@ -35,7 +55,7 @@ export class LlClassMeta {
|
|
|
35
55
|
* slots — a class's method gets a slot iff no ancestor declares it AND some
|
|
36
56
|
* strict descendant redeclares it (whole-program devirtualization).
|
|
37
57
|
* The preorder intervals also identify runtime class membership. */
|
|
38
|
-
export function buildClassGraph(mod, fnByName) {
|
|
58
|
+
export function buildClassGraph(mod, fnByName, sizeType = "i64") {
|
|
39
59
|
const metaMap = new Map();
|
|
40
60
|
for (const cls of mod.classes ?? []) {
|
|
41
61
|
const meta = new LlClassMeta(cls);
|
|
@@ -64,6 +84,11 @@ export function buildClassGraph(mod, fnByName) {
|
|
|
64
84
|
number(meta, meta);
|
|
65
85
|
meta.hierarchy = meta.base !== null || meta.children.length > 0;
|
|
66
86
|
}
|
|
87
|
+
// The runtime reads the vtable word of runtime-rooted hierarchies (Error,
|
|
88
|
+
// EventEmitter, EventTarget, Event and the streams) and 32-bit targets
|
|
89
|
+
// have no spare half in the rc word: those keep the vtable word.
|
|
90
|
+
for (const meta of metaMap.values())
|
|
91
|
+
meta.idInRc = sizeType === "i64" && meta.hierarchy && meta.root.def.runtime !== true;
|
|
67
92
|
const slotRoots = new Set();
|
|
68
93
|
for (const key of mod.threadSlotKeys ?? []) {
|
|
69
94
|
const meta = metaMap.get(key);
|
|
@@ -243,11 +268,12 @@ function runtimePrefixOf(meta) {
|
|
|
243
268
|
return RUNTIME_PREFIXES.get(meta.root.def.name) ?? null;
|
|
244
269
|
}
|
|
245
270
|
/** The GEP index after a class's header words: rc at 0, the vtable word
|
|
246
|
-
* at 1 on hierarchy members
|
|
271
|
+
* at 1 on hierarchy members that do not keep their class id in the rc
|
|
272
|
+
* word (LlClassMeta.idInRc), then a runtime prefix (state + display name)
|
|
247
273
|
* on classes rooted at a runtime base, then the stream-state slot on
|
|
248
274
|
* stream-rooted ones. */
|
|
249
275
|
function headerEnd(meta) {
|
|
250
|
-
if (!meta.hierarchy)
|
|
276
|
+
if (!meta.hierarchy || meta.idInRc)
|
|
251
277
|
return 1;
|
|
252
278
|
if (streamRooted(meta))
|
|
253
279
|
return 5;
|
|
@@ -264,6 +290,8 @@ export function classSlotWordIndex(meta) {
|
|
|
264
290
|
/** The GEP index where a class's own fields start: after the header words
|
|
265
291
|
* and the slot word. */
|
|
266
292
|
export function classFieldBase(meta) {
|
|
293
|
+
if (meta.compact)
|
|
294
|
+
throw new InternalCompilerError(`llvm emitter bug: compact class ${meta.def.name} packs its fields`);
|
|
267
295
|
return headerEnd(meta) + (meta.threadSlot ? 1 : 0);
|
|
268
296
|
}
|
|
269
297
|
/** Append the lexical environment after inherited fields to preserve base layouts. */
|
|
@@ -272,11 +300,20 @@ export function classEnvironmentIndex(meta) {
|
|
|
272
300
|
}
|
|
273
301
|
/** A field's GEP index inside its class struct: rc at 0, the vtable word
|
|
274
302
|
* at 1 on hierarchy members, then the flattened field list. */
|
|
275
|
-
export function classFieldIndex(meta, field) {
|
|
303
|
+
export function classFieldIndex(meta, field, refs = "pointer") {
|
|
276
304
|
const idx = meta.def.fields.findIndex((f) => f.name === field);
|
|
277
305
|
if (idx < 0)
|
|
278
306
|
throw new InternalCompilerError(`llvm emitter bug: unknown field ${field} on class ${meta.def.name}`);
|
|
279
|
-
|
|
307
|
+
const compressed = meta.compressed[idx] === true;
|
|
308
|
+
// Callers that read or write a field's storage as a pointer must not see
|
|
309
|
+
// a compressed one; callers that decode and encode pass "compressed".
|
|
310
|
+
if (compressed && refs === "pointer")
|
|
311
|
+
throw new InternalCompilerError(`llvm emitter bug: field ${field} of ${meta.def.name} holds a 32-bit reference`);
|
|
312
|
+
return { index: classFieldSlot(meta, idx), type: meta.def.fields[idx].type, compressed };
|
|
313
|
+
}
|
|
314
|
+
/** The GEP index of the field at `idx` in `meta.def.fields`. */
|
|
315
|
+
export function classFieldSlot(meta, idx) {
|
|
316
|
+
return meta.compact ? meta.compactSlots[idx] : classFieldBase(meta) + idx;
|
|
280
317
|
}
|
|
281
318
|
/** Lines that release the ThreadSlots values of the object `%o` before it
|
|
282
319
|
* is freed: its slot word is 0 unless a value was ever set for it. */
|
|
@@ -322,6 +359,268 @@ export function programLifetimeClass(host, meta) {
|
|
|
322
359
|
export function programLifetimeRc(sizeType) {
|
|
323
360
|
return sizeType === "i32" ? "-2147483648" : "-9223372036854775808";
|
|
324
361
|
}
|
|
362
|
+
/** Lines that load the preorder number of the dynamic class of `obj`, an
|
|
363
|
+
* instance of `meta`'s hierarchy whose struct is `struct`, into `pre` (a
|
|
364
|
+
* `sizeType`): from the high half of the rc word (LlClassMeta.idInRc), or
|
|
365
|
+
* from the vtable its vtable word points at. */
|
|
366
|
+
export function classPreLines(meta, struct, obj, pre, sizeType) {
|
|
367
|
+
if (meta.idInRc)
|
|
368
|
+
return [
|
|
369
|
+
...classIdLoadLines(meta, obj, `${pre}.id`, ""),
|
|
370
|
+
` ${pre}.n = add i32 ${pre}.id, -1 ; the class id is the preorder number + 1`,
|
|
371
|
+
` ${pre} = zext i32 ${pre}.n to ${sizeType}`,
|
|
372
|
+
];
|
|
373
|
+
return [
|
|
374
|
+
` ${pre}.vtp = getelementptr inbounds %${struct}, ptr ${obj}, i64 0, i32 1`,
|
|
375
|
+
` ${pre}.vt = load ptr, ptr ${pre}.vtp`,
|
|
376
|
+
` ${pre}.prep = getelementptr inbounds %ScrVt, ptr ${pre}.vt, i64 0, i32 0`,
|
|
377
|
+
` ${pre} = load ${sizeType}, ptr ${pre}.prep`,
|
|
378
|
+
];
|
|
379
|
+
}
|
|
380
|
+
/** Lines that load the class id of the LlClassMeta.idInRc instance `obj`
|
|
381
|
+
* (`group` adds !invariant.group to the load) and point `vt` at its class's
|
|
382
|
+
* element of the hierarchy's vtable array. */
|
|
383
|
+
export function classIdVtLines(meta, obj, vt, group) {
|
|
384
|
+
const t = `${vt}.`;
|
|
385
|
+
const root = meta.root;
|
|
386
|
+
const vtt = `%${mangleVtStruct(root.def.name)}`;
|
|
387
|
+
const n = root.post - root.pre + 1;
|
|
388
|
+
return [
|
|
389
|
+
...classIdLoadLines(meta, `${obj}`, `${t}id`, group),
|
|
390
|
+
` ${t}ix = sub i32 ${t}id, ${root.pre + 1}`,
|
|
391
|
+
` ${t}ix64 = zext i32 ${t}ix to i64`,
|
|
392
|
+
` ${vt} = getelementptr inbounds [${n} x ${vtt}], ptr @${mangleVtArray(root.def.name)}, i64 0, i64 ${t}ix64`,
|
|
393
|
+
];
|
|
394
|
+
}
|
|
395
|
+
/** Lines that load the class id of the LlClassMeta.idInRc instance `obj`
|
|
396
|
+
* into the i32 `id`: the high half of the rc word, or the low 28 bits of a
|
|
397
|
+
* compact instance's header word (compactHeaderWord). `group` is the
|
|
398
|
+
* metadata of the load (`, !invariant.group !{}` for a load LLVM may treat
|
|
399
|
+
* as invariant), and it only goes on bytes that never change: publication
|
|
400
|
+
* sets the top bit of a compact header word, so a compact instance's id is
|
|
401
|
+
* then read as the word's low 16 bits, which hold the whole id when the
|
|
402
|
+
* hierarchy's ids are below 2^16, and otherwise as the masked word without
|
|
403
|
+
* the metadata. */
|
|
404
|
+
export function classIdLoadLines(meta, obj, id, group) {
|
|
405
|
+
if (meta.compact) {
|
|
406
|
+
if (group !== "" && meta.root.post + 1 <= 0xffff)
|
|
407
|
+
return [` ${id}.h = load i16, ptr ${obj}${group}`, ` ${id} = zext i16 ${id}.h to i32`];
|
|
408
|
+
return [` ${id}.w = load i32, ptr ${obj}`, ` ${id} = and i32 ${id}.w, ${COMPACT_ID_MASK}`];
|
|
409
|
+
}
|
|
410
|
+
return [
|
|
411
|
+
` ${id}p = getelementptr inbounds i8, ptr ${obj}, i64 ${CLASS_ID_OFFSET}`,
|
|
412
|
+
` ${id} = load i32, ptr ${id}p${group}`,
|
|
413
|
+
];
|
|
414
|
+
}
|
|
415
|
+
/** The byte offset of the class id in the rc word of an instance that
|
|
416
|
+
* keeps it there (LlClassMeta.idInRc): the high half of the little-endian
|
|
417
|
+
* 64-bit word. The count is the i32 at offset 0. */
|
|
418
|
+
export const CLASS_ID_OFFSET = 4;
|
|
419
|
+
/** The rc word an LlClassMeta.idInRc instance is created with: the class
|
|
420
|
+
* id, its preorder number plus 1, in the high 32 bits, and in the low 32 bits
|
|
421
|
+
* a count of 1, or for a program-lifetime instance the midpoint of the 32-bit
|
|
422
|
+
* count (as programLifetimeRc is of the 32-bit word). The id is never 0,
|
|
423
|
+
* 0x80000000 or 0xffffffff, the high halves of other objects' rc words, so
|
|
424
|
+
* the runtime can tell an object with a class id (scr_rc.h scr_rc_class_id). */
|
|
425
|
+
export function classIdRcWord(meta, lifetime) {
|
|
426
|
+
return (BigInt(meta.pre + 1) * 2n ** 32n + (lifetime ? 2n ** 31n : 1n)).toString();
|
|
427
|
+
}
|
|
428
|
+
/** The 32-bit header of a compact class instance (LlClassMeta.compact):
|
|
429
|
+
* COMPACT_HEADER_TAG, the class id (classIdRcWord's preorder number + 1, 0
|
|
430
|
+
* outside a hierarchy) in the low 28 bits, and COMPACT_PUBLISHED once
|
|
431
|
+
* publication marks the object. No other object's count reaches
|
|
432
|
+
* 0x70000000, so the runtime reads a word of 0xf0000000 and up as published
|
|
433
|
+
* for every object (scr_rc.h SCR_RC_PUBLISHED). */
|
|
434
|
+
export const COMPACT_HEADER_TAG = 0x70000000;
|
|
435
|
+
export const COMPACT_PUBLISHED = 0x80000000;
|
|
436
|
+
export const COMPACT_ID_MASK = 0x0fffffff;
|
|
437
|
+
/** The leading bytes of a new instance that its allocation function stores
|
|
438
|
+
* right after allocating it (emitObjectAlloc's `stored`), which a recycled
|
|
439
|
+
* block therefore need not clear: a compact instance's 4-byte header word
|
|
440
|
+
* (its fields start at offset 4), the 8-byte rc word, or the rc word and
|
|
441
|
+
* the vtable word of a hierarchy member that keeps its class in a vtable. */
|
|
442
|
+
export function storedHeaderBytes(meta) {
|
|
443
|
+
if (meta.compact)
|
|
444
|
+
return 4;
|
|
445
|
+
return meta.hierarchy && !meta.idInRc ? 16 : 8;
|
|
446
|
+
}
|
|
447
|
+
/** The header word a compact instance is created with. */
|
|
448
|
+
export function compactHeaderWord(meta) {
|
|
449
|
+
return COMPACT_HEADER_TAG | (meta.hierarchy ? meta.pre + 1 : 0);
|
|
450
|
+
}
|
|
451
|
+
/** Lines that decode the 32-bit reference `idx` (an i32) of a compressed
|
|
452
|
+
* field into the pointer `out`. The program-lifetime region lies below
|
|
453
|
+
* 32 GiB (LlvmTargetOptions.lowRegion), so a reference is the instance's
|
|
454
|
+
* address over 8 and 0 is NULL: one shift, which x86-64 folds into the
|
|
455
|
+
* address of the next load. `t` names the temporaries. */
|
|
456
|
+
export function compactRefLoadLines(idx, out, t) {
|
|
457
|
+
return [
|
|
458
|
+
` ${t}.z = zext i32 ${idx} to i64`,
|
|
459
|
+
` ${t}.o = shl nuw nsw i64 ${t}.z, 3`,
|
|
460
|
+
` ${out} = inttoptr i64 ${t}.o to ptr`,
|
|
461
|
+
];
|
|
462
|
+
}
|
|
463
|
+
/** Lines that encode the pointer `ptr` (NULL or a compact class instance)
|
|
464
|
+
* as the 32-bit reference `out` (an i32) a compressed field stores. */
|
|
465
|
+
export function compactRefStoreLines(ptr, out, t) {
|
|
466
|
+
return [
|
|
467
|
+
` ${t}.pi = ptrtoint ptr ${ptr} to i64`,
|
|
468
|
+
` ${t}.s = lshr i64 ${t}.pi, 3`,
|
|
469
|
+
` ${out} = trunc i64 ${t}.s to i32`,
|
|
470
|
+
];
|
|
471
|
+
}
|
|
472
|
+
/** The storage type of a compressed field (LlClassMeta.compressed): a
|
|
473
|
+
* 32-bit index into the program-lifetime region. */
|
|
474
|
+
export const COMPACT_REF = "i32";
|
|
475
|
+
/** Lines that allocate `%o`, `size` zeroed bytes in the program-lifetime
|
|
476
|
+
* region: a bump of the calling thread's chunk (scr_rc.h ScrPlrChunk,
|
|
477
|
+
* thread-local in worker programs), and scr_plr_alloc when the chunk is
|
|
478
|
+
* exhausted or the target has no inline allocation. The lines end in an
|
|
479
|
+
* open block. */
|
|
480
|
+
function plrAllocLines(host, size) {
|
|
481
|
+
const S = host.sizeType;
|
|
482
|
+
host.declare(`declare ptr @scr_plr_alloc(${S})`);
|
|
483
|
+
host.declare(`declare i1 @llvm.expect.i1(i1, i1)`);
|
|
484
|
+
if (host.inlineAlloc !== true)
|
|
485
|
+
return [` %o = call ptr @scr_plr_alloc(${S} ${size})`];
|
|
486
|
+
const chunk = [];
|
|
487
|
+
if (host.threadLocalAlloc === true) {
|
|
488
|
+
host.declare(`@scr_plr_chunk = external thread_local global { ptr, ptr }`);
|
|
489
|
+
host.declare(`declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)`);
|
|
490
|
+
chunk.push(` %plr.c = call ptr @llvm.threadlocal.address.p0(ptr @scr_plr_chunk)`);
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
host.declare(`@scr_plr_chunk = external dso_local global { ptr, ptr }`);
|
|
494
|
+
chunk.push(` %plr.c = getelementptr inbounds i8, ptr @scr_plr_chunk, i64 0`);
|
|
495
|
+
}
|
|
496
|
+
// A thread without a chunk has NULL for both, so nothing fits.
|
|
497
|
+
return [
|
|
498
|
+
...chunk,
|
|
499
|
+
` %plr.lp = getelementptr inbounds i8, ptr %plr.c, i64 8`,
|
|
500
|
+
` %plr.next = load ptr, ptr %plr.c`,
|
|
501
|
+
` %plr.lim = load ptr, ptr %plr.lp`,
|
|
502
|
+
` %plr.n7 = add ${S} ${size}, 7`,
|
|
503
|
+
` %plr.n = and ${S} %plr.n7, -8`,
|
|
504
|
+
` %plr.end = getelementptr i8, ptr %plr.next, ${S} %plr.n`,
|
|
505
|
+
` %plr.fits = icmp ule ptr %plr.end, %plr.lim`,
|
|
506
|
+
` %plr.fitsx = call i1 @llvm.expect.i1(i1 %plr.fits, i1 true)`,
|
|
507
|
+
` br i1 %plr.fitsx, label %plr.bump, label %plr.slow`,
|
|
508
|
+
`plr.bump:`,
|
|
509
|
+
` store ptr %plr.end, ptr %plr.c`,
|
|
510
|
+
` br label %plr.done`,
|
|
511
|
+
`plr.slow:`,
|
|
512
|
+
` %plr.o = call ptr @scr_plr_alloc(${S} ${size})`,
|
|
513
|
+
` br label %plr.done`,
|
|
514
|
+
`plr.done:`,
|
|
515
|
+
` %o = phi ptr [ %plr.next, %plr.bump ], [ %plr.o, %plr.slow ]`,
|
|
516
|
+
];
|
|
517
|
+
}
|
|
518
|
+
/** Byte size and alignment of a class field's LLVM storage type. */
|
|
519
|
+
function fieldStorage(type) {
|
|
520
|
+
switch (type) {
|
|
521
|
+
case "i8":
|
|
522
|
+
return { size: 1, align: 1 };
|
|
523
|
+
case "i32":
|
|
524
|
+
return { size: 4, align: 4 };
|
|
525
|
+
case "ptr":
|
|
526
|
+
case "double":
|
|
527
|
+
return { size: 8, align: 8 };
|
|
528
|
+
case INLINE_UNION_FIELD:
|
|
529
|
+
return { size: 16, align: 8 };
|
|
530
|
+
default:
|
|
531
|
+
throw new InternalCompilerError(`llvm emitter bug: class field storage ${type}`);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
/** The LLVM storage type of each of a class's flattened fields. */
|
|
535
|
+
export function classFieldTypes(host, cls, int32) {
|
|
536
|
+
// Whole-program int32 fields (int32-slots.ts) store the exact i32.
|
|
537
|
+
return cls.fields.map((f) => int32?.isField(cls.name, f.name)
|
|
538
|
+
? "i32"
|
|
539
|
+
: llFieldType(f.type, host.inlineUnions.classField(cls.name, f.name)));
|
|
540
|
+
}
|
|
541
|
+
/** Gives the classes `compact` admits (whole hierarchies: the test is the
|
|
542
|
+
* root's) the 32-bit header and packed fields. A class keeps its base's
|
|
543
|
+
* field offsets, and places each of its own fields, widest first, at the
|
|
544
|
+
* first offset after the header that fits it: in a hole another field's
|
|
545
|
+
* alignment left, in the base's tail padding, or at the end. So 32-bit and
|
|
546
|
+
* smaller fields share 8-byte words. The struct lists the header and the
|
|
547
|
+
* fields by offset, which LLVM's layout of the type reproduces (checked). */
|
|
548
|
+
export function assignCompactLayouts(metaMap, compact, fieldTypes, compressedRef) {
|
|
549
|
+
const isCompact = (className) => {
|
|
550
|
+
const target = metaMap.get(className);
|
|
551
|
+
return target !== undefined && target.def.runtime !== true && compact(target.root);
|
|
552
|
+
};
|
|
553
|
+
const byPre = [...metaMap.values()].sort((a, b) => a.pre - b.pre);
|
|
554
|
+
for (const meta of byPre) {
|
|
555
|
+
if (meta.def.runtime === true || !compact(meta.root))
|
|
556
|
+
continue;
|
|
557
|
+
const base = meta.base;
|
|
558
|
+
const inherited = base?.compactElems ?? [
|
|
559
|
+
{ offset: 0, size: 4, align: 4, type: "i32", field: -1 },
|
|
560
|
+
];
|
|
561
|
+
const baseCount = base?.def.fields.length ?? 0;
|
|
562
|
+
if (base !== null && (!base.compact || !sameFieldPrefix(base.def, meta.def)))
|
|
563
|
+
throw new InternalCompilerError(`llvm emitter bug: compact class ${meta.def.name} does not extend its base's layout`);
|
|
564
|
+
const elems = inherited.map((e) => ({ ...e }));
|
|
565
|
+
// A reference to a compact class instance is a 32-bit index into the
|
|
566
|
+
// program-lifetime region (compactRefLoadLines); inherited fields keep the
|
|
567
|
+
// base's choice.
|
|
568
|
+
const compressed = meta.def.fields.map((_, i) => i < baseCount
|
|
569
|
+
? base.compressed[i]
|
|
570
|
+
: compressedRef !== undefined && compressedRef(meta.def, i, isCompact));
|
|
571
|
+
const types = fieldTypes(meta.def).map((t, i) => {
|
|
572
|
+
if (!compressed[i])
|
|
573
|
+
return t;
|
|
574
|
+
if (t !== "ptr")
|
|
575
|
+
throw new InternalCompilerError(`llvm emitter bug: compressed field ${meta.def.fields[i].name} of ${meta.def.name} is stored as ${t}`);
|
|
576
|
+
return COMPACT_REF;
|
|
577
|
+
});
|
|
578
|
+
const own = types
|
|
579
|
+
.map((type, field) => ({ type, field, ...fieldStorage(type) }))
|
|
580
|
+
.slice(baseCount)
|
|
581
|
+
.sort((a, b) => b.size - a.size || a.field - b.field);
|
|
582
|
+
for (const f of own) {
|
|
583
|
+
const sorted = [...elems].sort((a, b) => a.offset - b.offset);
|
|
584
|
+
let at = -1;
|
|
585
|
+
let cursor = 0;
|
|
586
|
+
for (const e of sorted) {
|
|
587
|
+
const start = alignTo(cursor, f.align);
|
|
588
|
+
if (start + f.size <= e.offset) {
|
|
589
|
+
at = start;
|
|
590
|
+
break;
|
|
591
|
+
}
|
|
592
|
+
cursor = Math.max(cursor, e.offset + e.size);
|
|
593
|
+
}
|
|
594
|
+
if (at < 0)
|
|
595
|
+
at = alignTo(cursor, f.align);
|
|
596
|
+
elems.push({ offset: at, size: f.size, align: f.align, type: f.type, field: f.field });
|
|
597
|
+
}
|
|
598
|
+
elems.sort((a, b) => a.offset - b.offset);
|
|
599
|
+
// LLVM places each element at the next offset its alignment allows.
|
|
600
|
+
let end = 0;
|
|
601
|
+
for (const e of elems) {
|
|
602
|
+
if (alignTo(end, e.align) !== e.offset)
|
|
603
|
+
throw new InternalCompilerError(`llvm emitter bug: compact layout of ${meta.def.name} is not LLVM's`);
|
|
604
|
+
end = e.offset + e.size;
|
|
605
|
+
}
|
|
606
|
+
const slots = new Array(types.length).fill(-1);
|
|
607
|
+
elems.forEach((e, index) => {
|
|
608
|
+
if (e.field >= 0)
|
|
609
|
+
slots[e.field] = index;
|
|
610
|
+
});
|
|
611
|
+
meta.compact = true;
|
|
612
|
+
meta.compactElems = elems;
|
|
613
|
+
meta.compactSlots = slots;
|
|
614
|
+
meta.compressed = compressed;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
function alignTo(n, align) {
|
|
618
|
+
return Math.ceil(n / align) * align;
|
|
619
|
+
}
|
|
620
|
+
function sameFieldPrefix(base, cls) {
|
|
621
|
+
return (base.fields.length <= cls.fields.length &&
|
|
622
|
+
base.fields.every((f, i) => cls.fields[i].name === f.name));
|
|
623
|
+
}
|
|
325
624
|
function undefFieldInits(host, meta, nullable) {
|
|
326
625
|
const out = [];
|
|
327
626
|
meta.def.fields.forEach((f, i) => {
|
|
@@ -332,7 +631,11 @@ function undefFieldInits(host, meta, nullable) {
|
|
|
332
631
|
// A nullable-pointer field's zeroed slot already is its unit arm.
|
|
333
632
|
if (nullable?.get(meta.def.name, f.name))
|
|
334
633
|
return;
|
|
335
|
-
|
|
634
|
+
// Only union and dyn fields get a store here; a compressed field is a
|
|
635
|
+
// class reference, which starts NULL.
|
|
636
|
+
const { index, compressed } = classFieldIndex(meta, f.name, "compressed");
|
|
637
|
+
if (compressed)
|
|
638
|
+
return;
|
|
336
639
|
if (f.type.kind === "union" && host.inlineUnions.classField(meta.def.name, f.name)) {
|
|
337
640
|
// An inline field starts at the undefined arm's tag with zero bits.
|
|
338
641
|
const tag = undefinedArmTag(f.type, host.unionsById);
|
|
@@ -361,6 +664,9 @@ function undefFieldInits(host, meta, nullable) {
|
|
|
361
664
|
* +trace/gcFree for cycle-capable shapes) definitions (`defs`). Mirrors
|
|
362
665
|
* emitStructDefs + emitHierarchyClassHelpers. */
|
|
363
666
|
export function emitClassShapes(host, mod, metaMap, nullable, int32) {
|
|
667
|
+
// Whether compact instances live in the program-lifetime region (any
|
|
668
|
+
// field holds a 32-bit reference to one; emitter.ts assignCompactLayouts).
|
|
669
|
+
const regionRefs = [...metaMap.values()].some((m) => m.compressed.some(Boolean));
|
|
364
670
|
const typeDefs = [];
|
|
365
671
|
const defs = [];
|
|
366
672
|
const emitted = (mod.classes ?? []).filter((c) => !c.runtime);
|
|
@@ -373,17 +679,22 @@ export function emitClassShapes(host, mod, metaMap, nullable, int32) {
|
|
|
373
679
|
}
|
|
374
680
|
for (const cls of emitted) {
|
|
375
681
|
const meta = metaMap.get(cls.name);
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
682
|
+
if (meta.compact) {
|
|
683
|
+
typeDefs.push(`%${mangleClassStruct(cls.name)} = type { ${meta.compactElems.map((e) => e.type).join(", ")} } ` +
|
|
684
|
+
`; class ${cls.name} (32-bit header) { ${meta.compactElems
|
|
685
|
+
.slice(1)
|
|
686
|
+
.map((e) => llvmCommentText(cls.fields[e.field].name))
|
|
687
|
+
.join("; ")} }`);
|
|
688
|
+
continue;
|
|
689
|
+
}
|
|
690
|
+
const fieldTys = classFieldTypes(host, cls, int32);
|
|
380
691
|
// Subclasses of a runtime base embed its remaining prefix (the state
|
|
381
692
|
// and display-name slots) between the vtable word and the field list;
|
|
382
693
|
// stream subclasses add the stream-state pointer — upcasts to
|
|
383
694
|
// ScrEmitter* / ScrStream* / ScrEventTargetObj* / ScrEventObj* are the
|
|
384
695
|
// usual pointer reinterprets.
|
|
385
696
|
const runtimePrefix = runtimePrefixOf(meta);
|
|
386
|
-
const prefix = meta.hierarchy
|
|
697
|
+
const prefix = meta.hierarchy && !meta.idInRc
|
|
387
698
|
? streamRooted(meta)
|
|
388
699
|
? ["ptr", "ptr", "ptr", "ptr"]
|
|
389
700
|
: runtimePrefix
|
|
@@ -392,7 +703,7 @@ export function emitClassShapes(host, mod, metaMap, nullable, int32) {
|
|
|
392
703
|
: [];
|
|
393
704
|
const members = [...prefix, ...(meta.threadSlot ? ["i32"] : []), ...fieldTys];
|
|
394
705
|
typeDefs.push(`%${mangleClassStruct(cls.name)} = type { ${host.sizeType}${members.length ? ", " + members.join(", ") : ""} } ` +
|
|
395
|
-
`; class ${cls.name}${meta.hierarchy ? " (vt at 1)" : ""}${streamRooted(meta) ? " (ScrStream prefix at 2)" : runtimePrefix ? ` (${runtimePrefix.struct} prefix at 2)` : ""} { ${cls.fields.map((f) => llvmCommentText(f.name)).join("; ")} }`);
|
|
706
|
+
`; class ${cls.name}${meta.idInRc ? " (class id in rc)" : meta.hierarchy ? " (vt at 1)" : ""}${streamRooted(meta) ? " (ScrStream prefix at 2)" : runtimePrefix ? ` (${runtimePrefix.struct} prefix at 2)` : ""} { ${cls.fields.map((f) => llvmCommentText(f.name)).join("; ")} }`);
|
|
396
707
|
}
|
|
397
708
|
// Vtable struct types, one per ROOT of the emitted hierarchy classes (a
|
|
398
709
|
// runtime root — %Error — counts exactly when an emitted subclass needs
|
|
@@ -413,16 +724,32 @@ export function emitClassShapes(host, mod, metaMap, nullable, int32) {
|
|
|
413
724
|
// One constant vtable instance per emitted hierarchy class: interval,
|
|
414
725
|
// direct release, and the class's dispatch entry for every slot — the
|
|
415
726
|
// method functions THEMSELVES (no adapters; see the header comment).
|
|
416
|
-
|
|
417
|
-
const meta = metaMap.get(cls.name);
|
|
418
|
-
if (!meta.hierarchy)
|
|
419
|
-
continue;
|
|
727
|
+
const vtInit = (meta) => {
|
|
420
728
|
const entries = vtEntriesFor(meta).map(({ slot, impl }) => impl === null
|
|
421
729
|
? `ptr null` // outside the declaring subtree / fully-abstract chain
|
|
422
730
|
: `ptr @${host.virtualEntry?.(`%${impl.def.name}.${slot.method}`) ?? mangleFunction(`%${impl.def.name}.${slot.method}`)}`);
|
|
423
|
-
const head = `%ScrVt { ${host.sizeType} ${meta.pre}, ${host.sizeType} ${meta.post}, ptr @${mangleClassReleaseDirect(
|
|
731
|
+
const head = `%ScrVt { ${host.sizeType} ${meta.pre}, ${host.sizeType} ${meta.post}, ptr @${mangleClassReleaseDirect(meta.def.name)} }`;
|
|
732
|
+
return `{ ${[head, ...entries].join(", ")} }`;
|
|
733
|
+
};
|
|
734
|
+
for (const cls of emitted) {
|
|
735
|
+
const meta = metaMap.get(cls.name);
|
|
736
|
+
if (!meta.hierarchy || meta.idInRc)
|
|
737
|
+
continue;
|
|
424
738
|
defs.push(`@${mangleVtInstance(cls.name)} = internal constant %${mangleVtStruct(meta.root.def.name)} ` +
|
|
425
|
-
|
|
739
|
+
`${vtInit(meta)} ; class ${cls.name}`, ``);
|
|
740
|
+
}
|
|
741
|
+
// A hierarchy whose instances keep their class id in the rc word has
|
|
742
|
+
// one array of its classes' vtables, in preorder: the vtable of an
|
|
743
|
+
// instance is the element at its number minus the root's.
|
|
744
|
+
for (const name of roots) {
|
|
745
|
+
const root = metaMap.get(name);
|
|
746
|
+
if (!root.idInRc)
|
|
747
|
+
continue;
|
|
748
|
+
const members = [...metaMap.values()]
|
|
749
|
+
.filter((m) => m.root === root)
|
|
750
|
+
.sort((a, b) => a.pre - b.pre);
|
|
751
|
+
const vtt = `%${mangleVtStruct(root.def.name)}`;
|
|
752
|
+
defs.push(`@${mangleVtArray(root.def.name)} = internal constant [${members.length} x ${vtt}] [`, ...members.map((m, i) => ` ${vtt} ${vtInit(m)}${i + 1 < members.length ? "," : ""} ; class ${m.def.name}`), `]`, ``);
|
|
426
753
|
}
|
|
427
754
|
// Classes with an out-of-line teardown (a bounded release) whose instances
|
|
428
755
|
// are all of that exact class can be torn down directly by a parent's
|
|
@@ -454,6 +781,7 @@ export function emitClassShapes(host, mod, metaMap, nullable, int32) {
|
|
|
454
781
|
release: `@${release}`,
|
|
455
782
|
destroy: `${teardown}_destroy`,
|
|
456
783
|
traced: host.tracedShapes.has(`object:${cls.name}`),
|
|
784
|
+
...(meta.idInRc ? { count: "i32" } : {}),
|
|
457
785
|
},
|
|
458
786
|
]);
|
|
459
787
|
}
|
|
@@ -465,18 +793,30 @@ export function emitClassShapes(host, mod, metaMap, nullable, int32) {
|
|
|
465
793
|
const traced = host.tracedShapes.has(`object:${cls.name}`);
|
|
466
794
|
const runtimePrefix = runtimePrefixOf(meta);
|
|
467
795
|
const isStreamRooted = streamRooted(meta);
|
|
468
|
-
const fieldIndex = (i) =>
|
|
796
|
+
const fieldIndex = (i) => classFieldSlot(meta, i);
|
|
469
797
|
// Teardown, trace and gcFree see each slot's storage type: a nullable
|
|
470
798
|
// class field holds the instance pointer (NULL for the unit arm), and
|
|
471
|
-
// every class retain/release/visit entry point is NULL-tolerant.
|
|
799
|
+
// every class retain/release/visit entry point is NULL-tolerant. A
|
|
800
|
+
// compressed field refers to a compact instance, which nothing releases
|
|
801
|
+
// or traces, so they skip it.
|
|
472
802
|
const indexedFields = [
|
|
473
|
-
...ownedFields(cls)
|
|
803
|
+
...ownedFields(cls)
|
|
804
|
+
.filter(({ i }) => meta.compressed[i] !== true)
|
|
805
|
+
.map(({ field, i }) => ({
|
|
474
806
|
name: field.name,
|
|
475
807
|
type: storedFieldType(cls, field),
|
|
476
808
|
index: fieldIndex(i),
|
|
477
809
|
})),
|
|
478
810
|
];
|
|
479
811
|
const refFields = indexedFields.filter((f) => isRefCounted(f.type));
|
|
812
|
+
const tracedFields = traced
|
|
813
|
+
? indexedFields.filter((f) => traceAdapter(host, f.type) !== null)
|
|
814
|
+
: [];
|
|
815
|
+
// A traced class whose trace visits nothing carries the collector header
|
|
816
|
+
// only because its hierarchy is traced: it is never on a cycle. Its
|
|
817
|
+
// descriptor names scr_cyc_no_children and its objects start out
|
|
818
|
+
// SCR_CYC_ACYCLIC, so releases never buffer them.
|
|
819
|
+
const acyclic = traced && runtimePrefix === null && !isStreamRooted && tracedFields.length === 0;
|
|
480
820
|
const bounded = runtimePrefix !== null ||
|
|
481
821
|
isStreamRooted ||
|
|
482
822
|
refFields.some((field) => needsBoundedRelease(field.type));
|
|
@@ -496,7 +836,10 @@ export function emitClassShapes(host, mod, metaMap, nullable, int32) {
|
|
|
496
836
|
const stCall = (tag, entry, tail) => prefixCall(tag, 4, entry, tail, "stream state (ScrStream prefix)");
|
|
497
837
|
// retain: NULL-tolerant, immortal-skip — layout-generic (rc at 0), so
|
|
498
838
|
// hierarchy members need no dispatch.
|
|
499
|
-
|
|
839
|
+
// An instance that keeps its class id in the rc word counts in the
|
|
840
|
+
// low half (CLASS_ID_OFFSET).
|
|
841
|
+
const count = meta.idInRc ? "i32" : host.sizeType;
|
|
842
|
+
defs.push(...retainBody(host, mangleClassRetain(cls.name), `retain ${cls.name}`, lifetime, count), ``);
|
|
500
843
|
// An out-of-line teardown tears typed children down directly
|
|
501
844
|
// (directChildReleaseLines). It takes the chain length when it has such
|
|
502
845
|
// children or is itself a direct target.
|
|
@@ -537,37 +880,48 @@ export function emitClassShapes(host, mod, metaMap, nullable, int32) {
|
|
|
537
880
|
? `${mangleClassRelease(cls.name)}_slow`
|
|
538
881
|
: mangleClassRelease(cls.name);
|
|
539
882
|
if (userRooted)
|
|
540
|
-
defs.push(...releaseFastPath(host, mangleClassRelease(cls.name), dispatchName, traced, `release ${cls.name}`, lifetime), ``);
|
|
541
|
-
defs.push(`define internal void @${dispatchName}(ptr %o) ${userRooted ? "noinline " : ""}${FN_ATTRS} { ; release ${cls.name} (dispatches)`, `entry:`, ` %isnull = icmp eq ptr %o, null`, ` br i1 %isnull, label %done, label %check`, `check:`, ` %rc = load ${
|
|
883
|
+
defs.push(...releaseFastPath(host, mangleClassRelease(cls.name), dispatchName, traced, `release ${cls.name}`, lifetime, count), ``);
|
|
884
|
+
defs.push(`define internal void @${dispatchName}(ptr %o) ${userRooted ? "noinline " : ""}${FN_ATTRS} { ; release ${cls.name} (dispatches)`, `entry:`, ` %isnull = icmp eq ptr %o, null`, ` br i1 %isnull, label %done, label %check`, `check:`, ` %rc = load ${count}, ptr %o`, ` %imm = icmp eq ${count} %rc, -1`, ` br i1 %imm, label %done, label %disp`, `disp:`, ...(meta.idInRc
|
|
885
|
+
? classIdVtLines(meta, "%o", "%vt", "")
|
|
886
|
+
: [
|
|
887
|
+
` %vtp = getelementptr inbounds %${struct}, ptr %o, i64 0, i32 1`,
|
|
888
|
+
` %vt = load ptr, ptr %vtp`,
|
|
889
|
+
]), ` %relp = getelementptr inbounds %ScrVt, ptr %vt, i64 0, i32 2`, ` %rel = load ptr, ptr %relp`, ` call void %rel(ptr %o) ; the DYNAMIC class's teardown`, ` br label %done`, `done:`, ` ret void`, `}`, ``);
|
|
542
890
|
// Direct release (the vtable entry): the class's own teardown. The
|
|
543
|
-
// caller already handled NULL/immortal.
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
`entry:`,
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
891
|
+
// caller already handled NULL/immortal. A compact instance has no
|
|
892
|
+
// count: nothing releases it.
|
|
893
|
+
if (meta.compact) {
|
|
894
|
+
defs.push(`define internal void @${mangleClassReleaseDirect(cls.name)}(ptr %o) ${FN_ATTRS} { ; direct release ${cls.name} (immortal)`, `entry:`, ` ret void`, `}`, ``);
|
|
895
|
+
}
|
|
896
|
+
else {
|
|
897
|
+
const reld = [
|
|
898
|
+
`define internal void @${mangleClassReleaseDirect(cls.name)}(ptr %o) ${FN_ATTRS} { ; direct release ${cls.name}`,
|
|
899
|
+
`entry:`,
|
|
900
|
+
` %rc = load ${count}, ptr %o`,
|
|
901
|
+
` %n = sub ${count} %rc, 1`,
|
|
902
|
+
` store ${count} %n, ptr %o`,
|
|
903
|
+
` %dead = icmp eq ${count} %n, 0`,
|
|
904
|
+
` br i1 %dead, label %free, label %${traced ? "root" : "done"}`,
|
|
905
|
+
`free:`,
|
|
906
|
+
];
|
|
907
|
+
if (traced)
|
|
908
|
+
reld.push(...cycleDeadLines(host, "teardown"));
|
|
909
|
+
if (bounded) {
|
|
910
|
+
const destroy = `${mangleClassReleaseDirect(cls.name)}_destroy`;
|
|
911
|
+
const destroyBody = [];
|
|
912
|
+
teardown(destroyBody);
|
|
913
|
+
defs.push(...destroyDefinitions(destroy, destroyBody, chained), ``);
|
|
914
|
+
host.declare(`declare void @scr_rc_destroy(ptr, ptr)`);
|
|
915
|
+
reld.push(` call void @scr_rc_destroy(ptr %o, ptr @${destroy})`);
|
|
916
|
+
}
|
|
917
|
+
else
|
|
918
|
+
teardown(reld);
|
|
919
|
+
reld.push(` br label %done`);
|
|
920
|
+
if (traced)
|
|
921
|
+
reld.push(`root:`, ...cycleRootLines(host, "done"));
|
|
922
|
+
reld.push(`done:`, ` ret void`, `}`, ``);
|
|
923
|
+
defs.push(...reld);
|
|
563
924
|
}
|
|
564
|
-
else
|
|
565
|
-
teardown(reld);
|
|
566
|
-
reld.push(` br label %done`);
|
|
567
|
-
if (traced)
|
|
568
|
-
reld.push(`root:`, ...cycleRootLines(host, "done"));
|
|
569
|
-
reld.push(`done:`, ` ret void`, `}`, ``);
|
|
570
|
-
defs.push(...reld);
|
|
571
925
|
}
|
|
572
926
|
else {
|
|
573
927
|
const freeBody = [];
|
|
@@ -583,8 +937,10 @@ export function emitClassShapes(host, mod, metaMap, nullable, int32) {
|
|
|
583
937
|
`entry:`,
|
|
584
938
|
];
|
|
585
939
|
const cycType = `@${mangleClassTrace(cls.name)}.cyctype`;
|
|
940
|
+
if (acyclic)
|
|
941
|
+
host.declare(`declare void @scr_cyc_no_children(ptr, ptr, ptr)`);
|
|
586
942
|
if (traced)
|
|
587
|
-
defs.push(cycTypeDescriptor(cycType, `@${mangleClassTrace(cls.name)}`, `@${mangleClassGcFree(cls.name)}`, host.nextCycKind?.() ?? 0), ``);
|
|
943
|
+
defs.push(cycTypeDescriptor(cycType, acyclic ? "@scr_cyc_no_children" : `@${mangleClassTrace(cls.name)}`, `@${mangleClassGcFree(cls.name)}`, host.nextCycKind?.() ?? 0), ``);
|
|
588
944
|
// A program-lifetime instance is never freed: no collector header
|
|
589
945
|
// (nothing walks or frees it) and the program-lifetime count, which
|
|
590
946
|
// publication turns into SIZE_MAX (programLifetimeRc). Programs with
|
|
@@ -595,9 +951,33 @@ export function emitClassShapes(host, mod, metaMap, nullable, int32) {
|
|
|
595
951
|
nw.push(...regions.newAlloc(cls.name, sizeOf));
|
|
596
952
|
defs.push(...regions.classDefinitions(cls, sizeOf));
|
|
597
953
|
}
|
|
954
|
+
else if (meta.compact && regionRefs) {
|
|
955
|
+
// Compressed fields refer to compact instances by their index in the
|
|
956
|
+
// program-lifetime region, so every compact instance lives there:
|
|
957
|
+
// zeroed, 8-byte aligned and never freed.
|
|
958
|
+
nw.push(...plrAllocLines(host, sizeOf));
|
|
959
|
+
}
|
|
598
960
|
else
|
|
599
|
-
nw.push(...emitObjectAlloc(host, sizeOf, traced && !lifetime ? { type: cycType } : null, meta
|
|
600
|
-
|
|
961
|
+
nw.push(...emitObjectAlloc(host, sizeOf, traced && !lifetime ? { type: cycType, acyclic } : null, storedHeaderBytes(meta)));
|
|
962
|
+
if (meta.compact && !meta.hierarchy)
|
|
963
|
+
nw.push(` store i32 ${compactHeaderWord(meta)}, ptr %o ; no count (compactHeaderWord)`);
|
|
964
|
+
else if (meta.compact) {
|
|
965
|
+
// The header word: the class id and no count (compactHeaderWord).
|
|
966
|
+
// Only publication writes it again, setting COMPACT_PUBLISHED in the
|
|
967
|
+
// top byte, so the class id reads that carry !invariant.group read
|
|
968
|
+
// the low 16 bits only (classIdLoadLines).
|
|
969
|
+
host.declare(`declare ptr @llvm.launder.invariant.group.p0(ptr)`);
|
|
970
|
+
nw.push(` %o.vt = call ptr @llvm.launder.invariant.group.p0(ptr %o)`, ` store i32 ${compactHeaderWord(meta)}, ptr %o.vt ; class ${llvmCommentText(cls.name)} is ${meta.pre}`);
|
|
971
|
+
}
|
|
972
|
+
else if (meta.idInRc) {
|
|
973
|
+
// The class id in the high half of the rc word, the count in the low
|
|
974
|
+
// half (classIdRcWord). It never changes while the object lives:
|
|
975
|
+
// retains, releases and the runtime write only the low half.
|
|
976
|
+
host.declare(`declare ptr @llvm.launder.invariant.group.p0(ptr)`);
|
|
977
|
+
nw.push(` %o.vt = call ptr @llvm.launder.invariant.group.p0(ptr %o)`, ` store i64 ${classIdRcWord(meta, lifetime)}, ptr %o.vt ; class ${llvmCommentText(cls.name)} is ${meta.pre}`);
|
|
978
|
+
}
|
|
979
|
+
else
|
|
980
|
+
nw.push(` store ${host.sizeType} ${lifetime ? programLifetimeRc(host.sizeType) : 1}, ptr %o`);
|
|
601
981
|
if (lifetime && audit) {
|
|
602
982
|
// --sanitize builds: the RC audit skips its leak report when the
|
|
603
983
|
// program keeps program-lifetime objects (scr_console.c), and
|
|
@@ -605,7 +985,7 @@ export function emitClassShapes(host, mod, metaMap, nullable, int32) {
|
|
|
605
985
|
host.declare(`declare void @scr_obj_lifetime_note(ptr)`);
|
|
606
986
|
nw.push(` call void @scr_obj_lifetime_note(ptr %o)`);
|
|
607
987
|
}
|
|
608
|
-
if (meta.hierarchy) {
|
|
988
|
+
if (meta.hierarchy && !meta.idInRc) {
|
|
609
989
|
// The vtable word is written once, here, and never changes while the
|
|
610
990
|
// object lives: its store and the virtual-call loads carry
|
|
611
991
|
// !invariant.group. A recycled block may have held an object of
|
|
@@ -636,7 +1016,6 @@ export function emitClassShapes(host, mod, metaMap, nullable, int32) {
|
|
|
636
1016
|
// exactly the complement, then free (the trace/teardown complement
|
|
637
1017
|
// contract in scr_runtime.h).
|
|
638
1018
|
const indexed = indexedFields;
|
|
639
|
-
const tracedFields = indexed.filter((f) => traceAdapter(host, f.type) !== null);
|
|
640
1019
|
const untracedRefFields = indexed.filter((f) => isRefCounted(f.type) && traceAdapter(host, f.type) === null);
|
|
641
1020
|
const tr = [
|
|
642
1021
|
`define internal void @${mangleClassTrace(cls.name)}(ptr %o, ptr %visit, ptr %ctx) ${FN_ATTRS} { ; trace ${cls.name}`,
|