@geastack/compiler 1.0.15
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/LICENSE +202 -0
- package/README.md +149 -0
- package/dist/cli-analyze.d.ts +1 -0
- package/dist/cli-analyze.js +61 -0
- package/dist/cli-coverage.d.ts +1 -0
- package/dist/cli-coverage.js +329 -0
- package/dist/cli-emit.d.ts +10 -0
- package/dist/cli-emit.js +398 -0
- package/dist/cli-module-graph.d.ts +18 -0
- package/dist/cli-module-graph.js +123 -0
- package/dist/cli-package-source.d.ts +5 -0
- package/dist/cli-package-source.js +116 -0
- package/dist/cli-project.d.ts +2 -0
- package/dist/cli-project.js +60 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +199 -0
- package/dist/compiler.d.ts +228 -0
- package/dist/compiler.js +1029 -0
- package/dist/conversion/algebra.d.ts +218 -0
- package/dist/conversion/algebra.js +155 -0
- package/dist/conversion/build.d.ts +67 -0
- package/dist/conversion/build.js +1378 -0
- package/dist/conversion/derive.d.ts +37 -0
- package/dist/conversion/derive.js +260 -0
- package/dist/conversion/graph-validation.d.ts +8 -0
- package/dist/conversion/graph-validation.js +97 -0
- package/dist/conversion/native-callable-adapter.d.ts +13 -0
- package/dist/conversion/native-callable-adapter.js +53 -0
- package/dist/conversion/native-class-reference.d.ts +12 -0
- package/dist/conversion/native-class-reference.js +39 -0
- package/dist/conversion/native-payload-transport.d.ts +25 -0
- package/dist/conversion/native-payload-transport.js +33 -0
- package/dist/conversion/native-selection.d.ts +49 -0
- package/dist/conversion/native-selection.js +135 -0
- package/dist/conversion/native-sum.d.ts +42 -0
- package/dist/conversion/native-sum.js +115 -0
- package/dist/conversion/nodes.d.ts +55 -0
- package/dist/conversion/nodes.js +91 -0
- package/dist/conversion/operand-view.d.ts +14 -0
- package/dist/conversion/operand-view.js +20 -0
- package/dist/conversion/record-view.d.ts +157 -0
- package/dist/conversion/record-view.js +273 -0
- package/dist/conversion/registry.d.ts +217 -0
- package/dist/conversion/registry.js +1 -0
- package/dist/diagnostics/model.d.ts +76 -0
- package/dist/diagnostics/model.js +60 -0
- package/dist/diagnostics/sweep.d.ts +31 -0
- package/dist/diagnostics/sweep.js +112 -0
- package/dist/identity/ids.d.ts +179 -0
- package/dist/identity/ids.js +212 -0
- package/dist/ir/absent-class-arm.d.ts +48 -0
- package/dist/ir/absent-class-arm.js +157 -0
- package/dist/ir/borrow-effects.d.ts +23 -0
- package/dist/ir/borrow-effects.js +151 -0
- package/dist/ir/borrowed-call-arguments.d.ts +40 -0
- package/dist/ir/borrowed-call-arguments.js +117 -0
- package/dist/ir/build.d.ts +168 -0
- package/dist/ir/build.js +459 -0
- package/dist/ir/call-dispatch.d.ts +38 -0
- package/dist/ir/call-dispatch.js +502 -0
- package/dist/ir/call-entry.d.ts +142 -0
- package/dist/ir/call-entry.js +386 -0
- package/dist/ir/callable-class-flow.d.ts +27 -0
- package/dist/ir/callable-class-flow.js +1386 -0
- package/dist/ir/callable-field-slots.d.ts +22 -0
- package/dist/ir/callable-field-slots.js +166 -0
- package/dist/ir/callable-identity-demand.d.ts +52 -0
- package/dist/ir/callable-identity-demand.js +460 -0
- package/dist/ir/callable-member-candidates.d.ts +9 -0
- package/dist/ir/callable-member-candidates.js +39 -0
- package/dist/ir/callable-records.d.ts +21 -0
- package/dist/ir/callable-records.js +411 -0
- package/dist/ir/captures.d.ts +26 -0
- package/dist/ir/captures.js +335 -0
- package/dist/ir/certificate.d.ts +45 -0
- package/dist/ir/certificate.js +47 -0
- package/dist/ir/certify/carrier-keys.d.ts +73 -0
- package/dist/ir/certify/carrier-keys.js +221 -0
- package/dist/ir/certify/function-source.d.ts +4 -0
- package/dist/ir/certify/function-source.js +28 -0
- package/dist/ir/certify/has-property-key.d.ts +88 -0
- package/dist/ir/certify/has-property-key.js +116 -0
- package/dist/ir/certify/instanceof-key.d.ts +24 -0
- package/dist/ir/certify/instanceof-key.js +35 -0
- package/dist/ir/certify/property-access-keys.d.ts +172 -0
- package/dist/ir/certify/property-access-keys.js +291 -0
- package/dist/ir/certify/property-access.d.ts +3 -0
- package/dist/ir/certify/property-access.js +597 -0
- package/dist/ir/certify/runtime-helper.d.ts +3 -0
- package/dist/ir/certify/runtime-helper.js +326 -0
- package/dist/ir/certify/typeof-operand.d.ts +14 -0
- package/dist/ir/certify/typeof-operand.js +16 -0
- package/dist/ir/certify.d.ts +123 -0
- package/dist/ir/certify.js +481 -0
- package/dist/ir/class-evaluation.d.ts +26 -0
- package/dist/ir/class-evaluation.js +50 -0
- package/dist/ir/class-static-fields.d.ts +60 -0
- package/dist/ir/class-static-fields.js +108 -0
- package/dist/ir/construct-entry.d.ts +26 -0
- package/dist/ir/construct-entry.js +117 -0
- package/dist/ir/dead-values.d.ts +90 -0
- package/dist/ir/dead-values.js +184 -0
- package/dist/ir/deferral.d.ts +99 -0
- package/dist/ir/deferral.js +409 -0
- package/dist/ir/dense-loops.d.ts +230 -0
- package/dist/ir/dense-loops.js +697 -0
- package/dist/ir/dominance.d.ts +82 -0
- package/dist/ir/dominance.js +268 -0
- package/dist/ir/emission-representations.d.ts +71 -0
- package/dist/ir/emission-representations.js +350 -0
- package/dist/ir/facts.d.ts +218 -0
- package/dist/ir/facts.js +181 -0
- package/dist/ir/fixed-data-definition.d.ts +19 -0
- package/dist/ir/fixed-data-definition.js +49 -0
- package/dist/ir/generator-split.d.ts +38 -0
- package/dist/ir/generator-split.js +329 -0
- package/dist/ir/hoist.d.ts +55 -0
- package/dist/ir/hoist.js +375 -0
- package/dist/ir/instantiation.d.ts +61 -0
- package/dist/ir/instantiation.js +137 -0
- package/dist/ir/integer-storage.d.ts +170 -0
- package/dist/ir/integer-storage.js +822 -0
- package/dist/ir/integers.d.ts +161 -0
- package/dist/ir/integers.js +539 -0
- package/dist/ir/integrity-restrictions.d.ts +50 -0
- package/dist/ir/integrity-restrictions.js +118 -0
- package/dist/ir/local-iterators.d.ts +4 -0
- package/dist/ir/local-iterators.js +27 -0
- package/dist/ir/lower-allocation.d.ts +4 -0
- package/dist/ir/lower-allocation.js +325 -0
- package/dist/ir/lower-completion.d.ts +15 -0
- package/dist/ir/lower-completion.js +25 -0
- package/dist/ir/lower-destructuring.d.ts +5 -0
- package/dist/ir/lower-destructuring.js +693 -0
- package/dist/ir/lower-element.d.ts +29 -0
- package/dist/ir/lower-element.js +111 -0
- package/dist/ir/lower-exceptions.d.ts +47 -0
- package/dist/ir/lower-exceptions.js +92 -0
- package/dist/ir/lower-flow.d.ts +137 -0
- package/dist/ir/lower-flow.js +600 -0
- package/dist/ir/lower-graph.d.ts +218 -0
- package/dist/ir/lower-graph.js +687 -0
- package/dist/ir/lower-invocation.d.ts +4 -0
- package/dist/ir/lower-invocation.js +514 -0
- package/dist/ir/lower-narrow.d.ts +53 -0
- package/dist/ir/lower-narrow.js +320 -0
- package/dist/ir/lower-operands.d.ts +272 -0
- package/dist/ir/lower-operands.js +461 -0
- package/dist/ir/lower-property.d.ts +21 -0
- package/dist/ir/lower-property.js +132 -0
- package/dist/ir/lower-protocol.d.ts +11 -0
- package/dist/ir/lower-protocol.js +118 -0
- package/dist/ir/lower-short-circuit.d.ts +41 -0
- package/dist/ir/lower-short-circuit.js +63 -0
- package/dist/ir/lower.d.ts +82 -0
- package/dist/ir/lower.js +1346 -0
- package/dist/ir/model.d.ts +1474 -0
- package/dist/ir/model.js +6 -0
- package/dist/ir/native-absent-property.d.ts +3 -0
- package/dist/ir/native-absent-property.js +13 -0
- package/dist/ir/native-array-transport.d.ts +7 -0
- package/dist/ir/native-array-transport.js +46 -0
- package/dist/ir/native-callable-bind.d.ts +9 -0
- package/dist/ir/native-callable-bind.js +30 -0
- package/dist/ir/native-carrier-predicate.d.ts +34 -0
- package/dist/ir/native-carrier-predicate.js +49 -0
- package/dist/ir/native-class-accessor.d.ts +18 -0
- package/dist/ir/native-class-accessor.js +52 -0
- package/dist/ir/native-class-construction.d.ts +16 -0
- package/dist/ir/native-class-construction.js +71 -0
- package/dist/ir/native-class-initialization.d.ts +15 -0
- package/dist/ir/native-class-initialization.js +56 -0
- package/dist/ir/native-class-origins.d.ts +13 -0
- package/dist/ir/native-class-origins.js +237 -0
- package/dist/ir/native-dictionary-transport.d.ts +6 -0
- package/dist/ir/native-dictionary-transport.js +37 -0
- package/dist/ir/native-enumeration.d.ts +14 -0
- package/dist/ir/native-enumeration.js +26 -0
- package/dist/ir/native-equality.d.ts +10 -0
- package/dist/ir/native-equality.js +18 -0
- package/dist/ir/native-field-owner.d.ts +37 -0
- package/dist/ir/native-field-owner.js +183 -0
- package/dist/ir/native-fixed-layout.d.ts +41 -0
- package/dist/ir/native-fixed-layout.js +232 -0
- package/dist/ir/native-host-construction.d.ts +53 -0
- package/dist/ir/native-host-construction.js +62 -0
- package/dist/ir/native-key-query.d.ts +4 -0
- package/dist/ir/native-key-query.js +38 -0
- package/dist/ir/native-merge-transport.d.ts +25 -0
- package/dist/ir/native-merge-transport.js +71 -0
- package/dist/ir/native-record-index-transport.d.ts +11 -0
- package/dist/ir/native-record-index-transport.js +34 -0
- package/dist/ir/native-record-index.d.ts +12 -0
- package/dist/ir/native-record-index.js +27 -0
- package/dist/ir/native-reflect-field.d.ts +5 -0
- package/dist/ir/native-reflect-field.js +33 -0
- package/dist/ir/native-sequence-transport.d.ts +7 -0
- package/dist/ir/native-sequence-transport.js +53 -0
- package/dist/ir/numeric-intrinsics.d.ts +13 -0
- package/dist/ir/numeric-intrinsics.js +57 -0
- package/dist/ir/object-value-conversions.d.ts +20 -0
- package/dist/ir/object-value-conversions.js +50 -0
- package/dist/ir/physical-class-reflection.d.ts +9 -0
- package/dist/ir/physical-class-reflection.js +57 -0
- package/dist/ir/presence-proof.d.ts +42 -0
- package/dist/ir/presence-proof.js +490 -0
- package/dist/ir/program-facts.d.ts +106 -0
- package/dist/ir/program-facts.js +319 -0
- package/dist/ir/proven-branches.d.ts +16 -0
- package/dist/ir/proven-branches.js +219 -0
- package/dist/ir/queries.d.ts +41 -0
- package/dist/ir/queries.js +213 -0
- package/dist/ir/reflection-demand.d.ts +64 -0
- package/dist/ir/reflection-demand.js +1394 -0
- package/dist/ir/refusal.d.ts +43 -0
- package/dist/ir/refusal.js +28 -0
- package/dist/ir/shake.d.ts +37 -0
- package/dist/ir/shake.js +1078 -0
- package/dist/ir/static-callables.d.ts +11 -0
- package/dist/ir/static-callables.js +163 -0
- package/dist/ir/string-layout-reuse.d.ts +13 -0
- package/dist/ir/string-layout-reuse.js +39 -0
- package/dist/ir/string-length-reuse.d.ts +8 -0
- package/dist/ir/string-length-reuse.js +47 -0
- package/dist/ir/transfer.d.ts +78 -0
- package/dist/ir/transfer.js +270 -0
- package/dist/ir/type-query-results.d.ts +25 -0
- package/dist/ir/type-query-results.js +96 -0
- package/dist/ir/typed-property-access.d.ts +100 -0
- package/dist/ir/typed-property-access.js +161 -0
- package/dist/ir/verify.d.ts +19 -0
- package/dist/ir/verify.js +355 -0
- package/dist/plugins/apple/constructors.d.ts +112 -0
- package/dist/plugins/apple/constructors.js +217 -0
- package/dist/plugins/apple/host.d.ts +181 -0
- package/dist/plugins/apple/host.js +262 -0
- package/dist/plugins/apple/jsx.d.ts +2 -0
- package/dist/plugins/apple/jsx.js +293 -0
- package/dist/plugins/apple/members.d.ts +16 -0
- package/dist/plugins/apple/members.js +190 -0
- package/dist/plugins/apple/plugin.d.ts +2 -0
- package/dist/plugins/apple/plugin.js +156 -0
- package/dist/plugins/gea/component-classes.d.ts +25 -0
- package/dist/plugins/gea/component-classes.js +162 -0
- package/dist/plugins/gea/component-inline.d.ts +13 -0
- package/dist/plugins/gea/component-inline.js +532 -0
- package/dist/plugins/gea/constructors.d.ts +23 -0
- package/dist/plugins/gea/constructors.js +100 -0
- package/dist/plugins/gea/contract.d.ts +150 -0
- package/dist/plugins/gea/contract.js +195 -0
- package/dist/plugins/gea/element-ref.d.ts +31 -0
- package/dist/plugins/gea/element-ref.js +45 -0
- package/dist/plugins/gea/host.d.ts +520 -0
- package/dist/plugins/gea/host.js +762 -0
- package/dist/plugins/gea/lower.d.ts +6 -0
- package/dist/plugins/gea/lower.js +195 -0
- package/dist/plugins/gea/members.d.ts +22 -0
- package/dist/plugins/gea/members.js +221 -0
- package/dist/plugins/gea/plugin.d.ts +22 -0
- package/dist/plugins/gea/plugin.js +307 -0
- package/dist/plugins/gea/prelude.d.ts +78 -0
- package/dist/plugins/gea/prelude.js +153 -0
- package/dist/plugins/gea/producer.d.ts +5 -0
- package/dist/plugins/gea/producer.js +52 -0
- package/dist/plugins/gea/reactive-slots.d.ts +49 -0
- package/dist/plugins/gea/reactive-slots.js +578 -0
- package/dist/plugins/gea/render-bridge.d.ts +6 -0
- package/dist/plugins/gea/render-bridge.js +281 -0
- package/dist/plugins/gea/slots.d.ts +15 -0
- package/dist/plugins/gea/slots.js +36 -0
- package/dist/plugins/gea/template-analysis.d.ts +151 -0
- package/dist/plugins/gea/template-analysis.js +346 -0
- package/dist/plugins/gea/user-agent-styles.d.ts +9 -0
- package/dist/plugins/gea/user-agent-styles.js +94 -0
- package/dist/plugins/installed.d.ts +19 -0
- package/dist/plugins/installed.js +21 -0
- package/dist/plugins/load.d.ts +7 -0
- package/dist/plugins/load.js +207 -0
- package/dist/plugins/model.d.ts +735 -0
- package/dist/plugins/model.js +47 -0
- package/dist/plugins/webgl/host.d.ts +77 -0
- package/dist/plugins/webgl/host.js +162 -0
- package/dist/plugins/webgl/plugin.d.ts +40 -0
- package/dist/plugins/webgl/plugin.js +99 -0
- package/dist/preflight/obligations.d.ts +206 -0
- package/dist/preflight/obligations.js +36 -0
- package/dist/preflight/report.d.ts +20 -0
- package/dist/preflight/report.js +61 -0
- package/dist/preflight/run.d.ts +39 -0
- package/dist/preflight/run.js +403 -0
- package/dist/project-preparation.d.ts +33 -0
- package/dist/project-preparation.js +314 -0
- package/dist/projection/abi.d.ts +82 -0
- package/dist/projection/abi.js +349 -0
- package/dist/projection/apply-arguments.d.ts +12 -0
- package/dist/projection/apply-arguments.js +20 -0
- package/dist/projection/bindings.d.ts +250 -0
- package/dist/projection/bindings.js +340 -0
- package/dist/projection/callee.d.ts +196 -0
- package/dist/projection/callee.js +444 -0
- package/dist/projection/class-property-presence.d.ts +28 -0
- package/dist/projection/class-property-presence.js +58 -0
- package/dist/projection/class-prototype.d.ts +5 -0
- package/dist/projection/class-prototype.js +23 -0
- package/dist/projection/class-storage.d.ts +26 -0
- package/dist/projection/class-storage.js +236 -0
- package/dist/projection/classes.d.ts +283 -0
- package/dist/projection/classes.js +944 -0
- package/dist/projection/coercions.d.ts +20 -0
- package/dist/projection/coercions.js +33 -0
- package/dist/projection/dispatch.d.ts +167 -0
- package/dist/projection/dispatch.js +379 -0
- package/dist/projection/fields.d.ts +123 -0
- package/dist/projection/fields.js +383 -0
- package/dist/projection/instance-test.d.ts +78 -0
- package/dist/projection/instance-test.js +156 -0
- package/dist/projection/slots.d.ts +146 -0
- package/dist/projection/slots.js +663 -0
- package/dist/projection/synthesized-abi.d.ts +61 -0
- package/dist/projection/synthesized-abi.js +94 -0
- package/dist/representation/array-index.d.ts +14 -0
- package/dist/representation/array-index.js +17 -0
- package/dist/representation/callable-object.d.ts +3 -0
- package/dist/representation/callable-object.js +6 -0
- package/dist/representation/collections.d.ts +84 -0
- package/dist/representation/collections.js +139 -0
- package/dist/representation/derive.d.ts +159 -0
- package/dist/representation/derive.js +2546 -0
- package/dist/representation/difference.d.ts +30 -0
- package/dist/representation/difference.js +240 -0
- package/dist/representation/field-descriptor-policy.d.ts +19 -0
- package/dist/representation/field-descriptor-policy.js +39 -0
- package/dist/representation/function-constructor.d.ts +13 -0
- package/dist/representation/function-constructor.js +9 -0
- package/dist/representation/host-abi.d.ts +32 -0
- package/dist/representation/host-abi.js +97 -0
- package/dist/representation/host-templates.d.ts +67 -0
- package/dist/representation/host-templates.js +94 -0
- package/dist/representation/intersection.d.ts +84 -0
- package/dist/representation/intersection.js +149 -0
- package/dist/representation/literal-destination.d.ts +43 -0
- package/dist/representation/literal-destination.js +133 -0
- package/dist/representation/merge.d.ts +18 -0
- package/dist/representation/merge.js +83 -0
- package/dist/representation/model.d.ts +1160 -0
- package/dist/representation/model.js +1019 -0
- package/dist/representation/numeric-index.d.ts +13 -0
- package/dist/representation/numeric-index.js +29 -0
- package/dist/representation/object-shape.d.ts +109 -0
- package/dist/representation/object-shape.js +123 -0
- package/dist/representation/optional.d.ts +12 -0
- package/dist/representation/optional.js +87 -0
- package/dist/representation/plan.d.ts +60 -0
- package/dist/representation/plan.js +78 -0
- package/dist/representation/policies.d.ts +589 -0
- package/dist/representation/policies.js +107 -0
- package/dist/representation/primitive-domain.d.ts +1 -0
- package/dist/representation/primitive-domain.js +1 -0
- package/dist/representation/primitives.d.ts +44 -0
- package/dist/representation/primitives.js +78 -0
- package/dist/representation/publish.d.ts +49 -0
- package/dist/representation/publish.js +648 -0
- package/dist/representation/record-fields.d.ts +96 -0
- package/dist/representation/record-fields.js +116 -0
- package/dist/representation/template-object.d.ts +11 -0
- package/dist/representation/template-object.js +26 -0
- package/dist/representation/union.d.ts +30 -0
- package/dist/representation/union.js +324 -0
- package/dist/representation/value-records.d.ts +3 -0
- package/dist/representation/value-records.js +307 -0
- package/dist/representation/verify.d.ts +17 -0
- package/dist/representation/verify.js +221 -0
- package/dist/semantics/alias-this-field-declaration-transform.d.ts +4 -0
- package/dist/semantics/alias-this-field-declaration-transform.js +207 -0
- package/dist/semantics/ambient-type-realization-transform.d.ts +62 -0
- package/dist/semantics/ambient-type-realization-transform.js +168 -0
- package/dist/semantics/ambient.d.ts +24 -0
- package/dist/semantics/ambient.js +119 -0
- package/dist/semantics/borrowed-builtin-call-bind-source-transform.d.ts +4 -0
- package/dist/semantics/borrowed-builtin-call-bind-source-transform.js +341 -0
- package/dist/semantics/callable-origins.d.ts +46 -0
- package/dist/semantics/callable-origins.js +354 -0
- package/dist/semantics/class-alias.d.ts +7 -0
- package/dist/semantics/class-alias.js +37 -0
- package/dist/semantics/class-heritage.d.ts +34 -0
- package/dist/semantics/class-heritage.js +104 -0
- package/dist/semantics/commonjs-wrapper.d.ts +69 -0
- package/dist/semantics/commonjs-wrapper.js +231 -0
- package/dist/semantics/constructor-slot-subclasses.d.ts +28 -0
- package/dist/semantics/constructor-slot-subclasses.js +112 -0
- package/dist/semantics/declaration-overlay-transform.d.ts +35 -0
- package/dist/semantics/declaration-overlay-transform.js +2157 -0
- package/dist/semantics/define-property-source-transform.d.ts +4 -0
- package/dist/semantics/define-property-source-transform.js +437 -0
- package/dist/semantics/diagnostic-source-preparation.d.ts +24 -0
- package/dist/semantics/diagnostic-source-preparation.js +82 -0
- package/dist/semantics/documentation-ranges.d.ts +22 -0
- package/dist/semantics/documentation-ranges.js +36 -0
- package/dist/semantics/dynamic-fallback.d.ts +86 -0
- package/dist/semantics/dynamic-fallback.js +249 -0
- package/dist/semantics/frontend-timing.d.ts +6 -0
- package/dist/semantics/frontend-timing.js +35 -0
- package/dist/semantics/frontend.d.ts +504 -0
- package/dist/semantics/frontend.js +1157 -0
- package/dist/semantics/host-declaration-provenance.d.ts +11 -0
- package/dist/semantics/host-declaration-provenance.js +18 -0
- package/dist/semantics/host-methods.d.ts +24 -0
- package/dist/semantics/host-methods.js +74 -0
- package/dist/semantics/host-protocols.d.ts +429 -0
- package/dist/semantics/host-protocols.js +1501 -0
- package/dist/semantics/inherited-accessor.d.ts +7 -0
- package/dist/semantics/inherited-accessor.js +48 -0
- package/dist/semantics/interface-families.d.ts +70 -0
- package/dist/semantics/interface-families.js +180 -0
- package/dist/semantics/interface-implementors.d.ts +53 -0
- package/dist/semantics/interface-implementors.js +87 -0
- package/dist/semantics/jsdoc-namepath-transform.d.ts +4 -0
- package/dist/semantics/jsdoc-namepath-transform.js +85 -0
- package/dist/semantics/model/coverage.d.ts +68 -0
- package/dist/semantics/model/coverage.js +73 -0
- package/dist/semantics/model/edges.d.ts +103 -0
- package/dist/semantics/model/edges.js +20 -0
- package/dist/semantics/model/graph.d.ts +55 -0
- package/dist/semantics/model/graph.js +129 -0
- package/dist/semantics/model/operands.d.ts +159 -0
- package/dist/semantics/model/operands.js +26 -0
- package/dist/semantics/model/operations.d.ts +496 -0
- package/dist/semantics/model/operations.js +2 -0
- package/dist/semantics/model/primitive-domain.d.ts +26 -0
- package/dist/semantics/model/primitive-domain.js +38 -0
- package/dist/semantics/model/selected-signature.d.ts +261 -0
- package/dist/semantics/model/selected-signature.js +55 -0
- package/dist/semantics/model/structural-type-table.d.ts +93 -0
- package/dist/semantics/model/structural-type-table.js +237 -0
- package/dist/semantics/model/structural-types.d.ts +367 -0
- package/dist/semantics/model/structural-types.js +200 -0
- package/dist/semantics/module-resolution.d.ts +23 -0
- package/dist/semantics/module-resolution.js +227 -0
- package/dist/semantics/new-callee-class-tag-source-transform.d.ts +4 -0
- package/dist/semantics/new-callee-class-tag-source-transform.js +64 -0
- package/dist/semantics/node-project.d.ts +13 -0
- package/dist/semantics/node-project.js +107 -0
- package/dist/semantics/node-source-hooks.d.ts +1 -0
- package/dist/semantics/node-source-hooks.js +63 -0
- package/dist/semantics/normalize/absent-globals.d.ts +143 -0
- package/dist/semantics/normalize/absent-globals.js +191 -0
- package/dist/semantics/normalize/arguments-objects.d.ts +43 -0
- package/dist/semantics/normalize/arguments-objects.js +60 -0
- package/dist/semantics/normalize/asserted-arm-absence.d.ts +28 -0
- package/dist/semantics/normalize/asserted-arm-absence.js +61 -0
- package/dist/semantics/normalize/assignment-patterns.d.ts +70 -0
- package/dist/semantics/normalize/assignment-patterns.js +147 -0
- package/dist/semantics/normalize/bag-absence.d.ts +8 -0
- package/dist/semantics/normalize/bag-absence.js +42 -0
- package/dist/semantics/normalize/binding-fixpoint.d.ts +36 -0
- package/dist/semantics/normalize/binding-fixpoint.js +140 -0
- package/dist/semantics/normalize/callback-parameter-contracts.d.ts +16 -0
- package/dist/semantics/normalize/callback-parameter-contracts.js +91 -0
- package/dist/semantics/normalize/cells/agreement.d.ts +46 -0
- package/dist/semantics/normalize/cells/agreement.js +34 -0
- package/dist/semantics/normalize/cells/candidates.d.ts +17 -0
- package/dist/semantics/normalize/cells/candidates.js +35 -0
- package/dist/semantics/normalize/cells/facts.d.ts +19 -0
- package/dist/semantics/normalize/cells/facts.js +90 -0
- package/dist/semantics/normalize/cells/index.d.ts +10 -0
- package/dist/semantics/normalize/cells/index.js +6 -0
- package/dist/semantics/normalize/cells/model.d.ts +98 -0
- package/dist/semantics/normalize/cells/model.js +2 -0
- package/dist/semantics/normalize/cells/policies/bag.d.ts +44 -0
- package/dist/semantics/normalize/cells/policies/bag.js +114 -0
- package/dist/semantics/normalize/cells/policies/collection.d.ts +42 -0
- package/dist/semantics/normalize/cells/policies/collection.js +218 -0
- package/dist/semantics/normalize/cells/policies/field.d.ts +28 -0
- package/dist/semantics/normalize/cells/policies/field.js +40 -0
- package/dist/semantics/normalize/cells/policies/index.d.ts +49 -0
- package/dist/semantics/normalize/cells/policies/index.js +58 -0
- package/dist/semantics/normalize/cells/policies/local.d.ts +18 -0
- package/dist/semantics/normalize/cells/policies/local.js +37 -0
- package/dist/semantics/normalize/cells/policies/parameter.d.ts +28 -0
- package/dist/semantics/normalize/cells/policies/parameter.js +39 -0
- package/dist/semantics/normalize/cells/policies/return.d.ts +26 -0
- package/dist/semantics/normalize/cells/policies/return.js +45 -0
- package/dist/semantics/normalize/cells/policies/shared.d.ts +33 -0
- package/dist/semantics/normalize/cells/policies/shared.js +45 -0
- package/dist/semantics/normalize/cells/policy.d.ts +72 -0
- package/dist/semantics/normalize/cells/policy.js +18 -0
- package/dist/semantics/normalize/cells/registry.d.ts +14 -0
- package/dist/semantics/normalize/cells/registry.js +17 -0
- package/dist/semantics/normalize/census-refusal.d.ts +62 -0
- package/dist/semantics/normalize/census-refusal.js +27 -0
- package/dist/semantics/normalize/census.d.ts +109 -0
- package/dist/semantics/normalize/census.js +667 -0
- package/dist/semantics/normalize/collection-bindings.d.ts +278 -0
- package/dist/semantics/normalize/collection-bindings.js +677 -0
- package/dist/semantics/normalize/commonjs-module-record.d.ts +21 -0
- package/dist/semantics/normalize/commonjs-module-record.js +289 -0
- package/dist/semantics/normalize/commonjs-require.d.ts +13 -0
- package/dist/semantics/normalize/commonjs-require.js +1527 -0
- package/dist/semantics/normalize/contribution.d.ts +63 -0
- package/dist/semantics/normalize/contribution.js +172 -0
- package/dist/semantics/normalize/dead-typeof-guards.d.ts +64 -0
- package/dist/semantics/normalize/dead-typeof-guards.js +152 -0
- package/dist/semantics/normalize/deferred-intrinsic-protocols.d.ts +57 -0
- package/dist/semantics/normalize/deferred-intrinsic-protocols.js +109 -0
- package/dist/semantics/normalize/derived-expression-type.d.ts +1070 -0
- package/dist/semantics/normalize/derived-expression-type.js +3463 -0
- package/dist/semantics/normalize/evaluation-order.d.ts +16 -0
- package/dist/semantics/normalize/evaluation-order.js +37 -0
- package/dist/semantics/normalize/field-bindings.d.ts +167 -0
- package/dist/semantics/normalize/field-bindings.js +1125 -0
- package/dist/semantics/normalize/flow/array-element-continuation.d.ts +27 -0
- package/dist/semantics/normalize/flow/array-element-continuation.js +1452 -0
- package/dist/semantics/normalize/flow/callable-array-origins.d.ts +42 -0
- package/dist/semantics/normalize/flow/callable-array-origins.js +318 -0
- package/dist/semantics/normalize/flow/callable-completions.d.ts +45 -0
- package/dist/semantics/normalize/flow/callable-completions.js +82 -0
- package/dist/semantics/normalize/flow/callable-reach.d.ts +237 -0
- package/dist/semantics/normalize/flow/callable-reach.js +7174 -0
- package/dist/semantics/normalize/flow/class-family-member-read.d.ts +16 -0
- package/dist/semantics/normalize/flow/class-family-member-read.js +992 -0
- package/dist/semantics/normalize/flow/collection-value-continuation.d.ts +21 -0
- package/dist/semantics/normalize/flow/collection-value-continuation.js +192 -0
- package/dist/semantics/normalize/flow/component-solver.d.ts +199 -0
- package/dist/semantics/normalize/flow/component-solver.js +587 -0
- package/dist/semantics/normalize/flow/computed-key-set.d.ts +84 -0
- package/dist/semantics/normalize/flow/computed-key-set.js +660 -0
- package/dist/semantics/normalize/flow/export-importers.d.ts +24 -0
- package/dist/semantics/normalize/flow/export-importers.js +269 -0
- package/dist/semantics/normalize/flow/host-text-sink.d.ts +25 -0
- package/dist/semantics/normalize/flow/host-text-sink.js +87 -0
- package/dist/semantics/normalize/flow/intrinsic-array-callback-frames.d.ts +84 -0
- package/dist/semantics/normalize/flow/intrinsic-array-callback-frames.js +180 -0
- package/dist/semantics/normalize/flow/intrinsic-data-definition.d.ts +35 -0
- package/dist/semantics/normalize/flow/intrinsic-data-definition.js +140 -0
- package/dist/semantics/normalize/flow/invocation-facts.d.ts +98 -0
- package/dist/semantics/normalize/flow/invocation-facts.js +257 -0
- package/dist/semantics/normalize/flow/member-call-forwarding.d.ts +122 -0
- package/dist/semantics/normalize/flow/member-call-forwarding.js +835 -0
- package/dist/semantics/normalize/flow/model.d.ts +357 -0
- package/dist/semantics/normalize/flow/model.js +177 -0
- package/dist/semantics/normalize/flow/native-collection-protocol.d.ts +24 -0
- package/dist/semantics/normalize/flow/native-collection-protocol.js +252 -0
- package/dist/semantics/normalize/flow/node-path-token.d.ts +3 -0
- package/dist/semantics/normalize/flow/node-path-token.js +53 -0
- package/dist/semantics/normalize/flow/object-binding-continuation.d.ts +11 -0
- package/dist/semantics/normalize/flow/object-binding-continuation.js +42 -0
- package/dist/semantics/normalize/flow/origin-authority.d.ts +56 -0
- package/dist/semantics/normalize/flow/origin-authority.js +2 -0
- package/dist/semantics/normalize/flow/owned-class-receivers.d.ts +35 -0
- package/dist/semantics/normalize/flow/owned-class-receivers.js +191 -0
- package/dist/semantics/normalize/flow/parameter-values.d.ts +27 -0
- package/dist/semantics/normalize/flow/parameter-values.js +251 -0
- package/dist/semantics/normalize/flow/proof-hypotheses.d.ts +66 -0
- package/dist/semantics/normalize/flow/proof-hypotheses.js +162 -0
- package/dist/semantics/normalize/flow/record-alias-closure.d.ts +27 -0
- package/dist/semantics/normalize/flow/record-alias-closure.js +298 -0
- package/dist/semantics/normalize/flow/seeded-origins.d.ts +43 -0
- package/dist/semantics/normalize/flow/seeded-origins.js +54 -0
- package/dist/semantics/normalize/flow/source-class-data.d.ts +132 -0
- package/dist/semantics/normalize/flow/source-class-data.js +838 -0
- package/dist/semantics/normalize/flow/source-class-instanceof.d.ts +13 -0
- package/dist/semantics/normalize/flow/source-class-instanceof.js +37 -0
- package/dist/semantics/normalize/flow/source-class-static-data.d.ts +16 -0
- package/dist/semantics/normalize/flow/source-class-static-data.js +47 -0
- package/dist/semantics/normalize/flow/source-construction-frames.d.ts +12 -0
- package/dist/semantics/normalize/flow/source-construction-frames.js +118 -0
- package/dist/semantics/normalize/flow/source-invocation-frame-layout.d.ts +34 -0
- package/dist/semantics/normalize/flow/source-invocation-frame-layout.js +78 -0
- package/dist/semantics/normalize/flow/source-invocation-receiver.d.ts +37 -0
- package/dist/semantics/normalize/flow/source-invocation-receiver.js +95 -0
- package/dist/semantics/normalize/flow/source-prototype-method-identity.d.ts +23 -0
- package/dist/semantics/normalize/flow/source-prototype-method-identity.js +81 -0
- package/dist/semantics/normalize/flow/source-record-data.d.ts +29 -0
- package/dist/semantics/normalize/flow/source-record-data.js +626 -0
- package/dist/semantics/normalize/flow/source-value-session.d.ts +77 -0
- package/dist/semantics/normalize/flow/source-value-session.js +3089 -0
- package/dist/semantics/normalize/flow/targets.d.ts +118 -0
- package/dist/semantics/normalize/flow/targets.js +405 -0
- package/dist/semantics/normalize/flow/value-flow.d.ts +36 -0
- package/dist/semantics/normalize/flow/value-flow.js +823 -0
- package/dist/semantics/normalize/flow/value-provenance.d.ts +31 -0
- package/dist/semantics/normalize/flow/value-provenance.js +112 -0
- package/dist/semantics/normalize/gating.d.ts +51 -0
- package/dist/semantics/normalize/gating.js +560 -0
- package/dist/semantics/normalize/generic-function-choice.d.ts +31 -0
- package/dist/semantics/normalize/generic-function-choice.js +115 -0
- package/dist/semantics/normalize/global-host-mutations.d.ts +51 -0
- package/dist/semantics/normalize/global-host-mutations.js +5989 -0
- package/dist/semantics/normalize/host-effect-contracts.d.ts +77 -0
- package/dist/semantics/normalize/host-effect-contracts.js +143 -0
- package/dist/semantics/normalize/host-mutation-computed-keys.d.ts +38 -0
- package/dist/semantics/normalize/host-mutation-computed-keys.js +26 -0
- package/dist/semantics/normalize/host-mutation-key-reader.d.ts +66 -0
- package/dist/semantics/normalize/host-mutation-key-reader.js +192 -0
- package/dist/semantics/normalize/host-mutation-keys.d.ts +114 -0
- package/dist/semantics/normalize/host-mutation-keys.js +183 -0
- package/dist/semantics/normalize/identities.d.ts +172 -0
- package/dist/semantics/normalize/identities.js +426 -0
- package/dist/semantics/normalize/implicit-arguments-tuple.d.ts +97 -0
- package/dist/semantics/normalize/implicit-arguments-tuple.js +197 -0
- package/dist/semantics/normalize/implicit-arguments.d.ts +11 -0
- package/dist/semantics/normalize/implicit-arguments.js +39 -0
- package/dist/semantics/normalize/instantiation.d.ts +73 -0
- package/dist/semantics/normalize/instantiation.js +399 -0
- package/dist/semantics/normalize/intrinsic-property-call.d.ts +18 -0
- package/dist/semantics/normalize/intrinsic-property-call.js +69 -0
- package/dist/semantics/normalize/intrinsic-prototype.d.ts +41 -0
- package/dist/semantics/normalize/intrinsic-prototype.js +87 -0
- package/dist/semantics/normalize/intrinsic-static-member.d.ts +14 -0
- package/dist/semantics/normalize/intrinsic-static-member.js +23 -0
- package/dist/semantics/normalize/jsdoc-type-names.d.ts +32 -0
- package/dist/semantics/normalize/jsdoc-type-names.js +512 -0
- package/dist/semantics/normalize/keyof.d.ts +32 -0
- package/dist/semantics/normalize/keyof.js +110 -0
- package/dist/semantics/normalize/local-bindings.d.ts +176 -0
- package/dist/semantics/normalize/local-bindings.js +1826 -0
- package/dist/semantics/normalize/logical-result-type.d.ts +16 -0
- package/dist/semantics/normalize/logical-result-type.js +102 -0
- package/dist/semantics/normalize/namespace-paths.d.ts +57 -0
- package/dist/semantics/normalize/namespace-paths.js +108 -0
- package/dist/semantics/normalize/normalize.d.ts +57 -0
- package/dist/semantics/normalize/normalize.js +68 -0
- package/dist/semantics/normalize/object-bag-bindings.d.ts +305 -0
- package/dist/semantics/normalize/object-bag-bindings.js +1290 -0
- package/dist/semantics/normalize/omitted-stated-parameter.d.ts +53 -0
- package/dist/semantics/normalize/omitted-stated-parameter.js +59 -0
- package/dist/semantics/normalize/open-type-form.d.ts +10 -0
- package/dist/semantics/normalize/open-type-form.js +32 -0
- package/dist/semantics/normalize/parameter-bindings.d.ts +361 -0
- package/dist/semantics/normalize/parameter-bindings.js +3339 -0
- package/dist/semantics/normalize/parameter-slot.d.ts +264 -0
- package/dist/semantics/normalize/parameter-slot.js +491 -0
- package/dist/semantics/normalize/physical-overload-result.d.ts +77 -0
- package/dist/semantics/normalize/physical-overload-result.js +99 -0
- package/dist/semantics/normalize/primitive-property-absence.d.ts +12 -0
- package/dist/semantics/normalize/primitive-property-absence.js +60 -0
- package/dist/semantics/normalize/producer-context.d.ts +376 -0
- package/dist/semantics/normalize/producer-context.js +1 -0
- package/dist/semantics/normalize/producers/allocations.d.ts +3 -0
- package/dist/semantics/normalize/producers/allocations.js +863 -0
- package/dist/semantics/normalize/producers/binding-kind.d.ts +37 -0
- package/dist/semantics/normalize/producers/binding-kind.js +36 -0
- package/dist/semantics/normalize/producers/bindings.d.ts +85 -0
- package/dist/semantics/normalize/producers/bindings.js +710 -0
- package/dist/semantics/normalize/producers/boundary.d.ts +34 -0
- package/dist/semantics/normalize/producers/boundary.js +123 -0
- package/dist/semantics/normalize/producers/class-lifecycle.d.ts +3 -0
- package/dist/semantics/normalize/producers/class-lifecycle.js +902 -0
- package/dist/semantics/normalize/producers/computations.d.ts +3 -0
- package/dist/semantics/normalize/producers/computations.js +613 -0
- package/dist/semantics/normalize/producers/control-loops.d.ts +30 -0
- package/dist/semantics/normalize/producers/control-loops.js +91 -0
- package/dist/semantics/normalize/producers/control.d.ts +30 -0
- package/dist/semantics/normalize/producers/control.js +923 -0
- package/dist/semantics/normalize/producers/declaration-lifecycle.d.ts +3 -0
- package/dist/semantics/normalize/producers/declaration-lifecycle.js +390 -0
- package/dist/semantics/normalize/producers/destructuring.d.ts +45 -0
- package/dist/semantics/normalize/producers/destructuring.js +1180 -0
- package/dist/semantics/normalize/producers/dynamic-language.d.ts +3 -0
- package/dist/semantics/normalize/producers/dynamic-language.js +70 -0
- package/dist/semantics/normalize/producers/erasure.d.ts +51 -0
- package/dist/semantics/normalize/producers/erasure.js +90 -0
- package/dist/semantics/normalize/producers/installed.d.ts +3 -0
- package/dist/semantics/normalize/producers/installed.js +55 -0
- package/dist/semantics/normalize/producers/invocations.d.ts +35 -0
- package/dist/semantics/normalize/producers/invocations.js +1796 -0
- package/dist/semantics/normalize/producers/iteration-yield.d.ts +59 -0
- package/dist/semantics/normalize/producers/iteration-yield.js +235 -0
- package/dist/semantics/normalize/producers/jsx.d.ts +3 -0
- package/dist/semantics/normalize/producers/jsx.js +360 -0
- package/dist/semantics/normalize/producers/mint.d.ts +39 -0
- package/dist/semantics/normalize/producers/mint.js +44 -0
- package/dist/semantics/normalize/producers/nullish.d.ts +16 -0
- package/dist/semantics/normalize/producers/nullish.js +27 -0
- package/dist/semantics/normalize/producers/object-assignment.d.ts +8 -0
- package/dist/semantics/normalize/producers/object-assignment.js +204 -0
- package/dist/semantics/normalize/producers/object-tag.d.ts +9 -0
- package/dist/semantics/normalize/producers/object-tag.js +119 -0
- package/dist/semantics/normalize/producers/optional-chain.d.ts +44 -0
- package/dist/semantics/normalize/producers/optional-chain.js +75 -0
- package/dist/semantics/normalize/producers/properties.d.ts +21 -0
- package/dist/semantics/normalize/producers/properties.js +1053 -0
- package/dist/semantics/normalize/producers/protocol.d.ts +67 -0
- package/dist/semantics/normalize/producers/protocol.js +695 -0
- package/dist/semantics/normalize/producers/references.d.ts +53 -0
- package/dist/semantics/normalize/producers/references.js +1027 -0
- package/dist/semantics/normalize/producers/shared.d.ts +561 -0
- package/dist/semantics/normalize/producers/shared.js +1683 -0
- package/dist/semantics/normalize/producers/spread-arguments.d.ts +72 -0
- package/dist/semantics/normalize/producers/spread-arguments.js +375 -0
- package/dist/semantics/normalize/producers/tagged-template.d.ts +5 -0
- package/dist/semantics/normalize/producers/tagged-template.js +307 -0
- package/dist/semantics/normalize/producers/tuple-spread.d.ts +189 -0
- package/dist/semantics/normalize/producers/tuple-spread.js +279 -0
- package/dist/semantics/normalize/property-key-domain.d.ts +36 -0
- package/dist/semantics/normalize/property-key-domain.js +150 -0
- package/dist/semantics/normalize/reachability.d.ts +189 -0
- package/dist/semantics/normalize/reachability.js +1057 -0
- package/dist/semantics/normalize/reassigned-bindings.d.ts +13 -0
- package/dist/semantics/normalize/reassigned-bindings.js +41 -0
- package/dist/semantics/normalize/record-storage-families.d.ts +11 -0
- package/dist/semantics/normalize/record-storage-families.js +109 -0
- package/dist/semantics/normalize/return-bindings.d.ts +260 -0
- package/dist/semantics/normalize/return-bindings.js +1311 -0
- package/dist/semantics/normalize/return-paths.d.ts +2 -0
- package/dist/semantics/normalize/return-paths.js +28 -0
- package/dist/semantics/normalize/script-global-redefinition.d.ts +44 -0
- package/dist/semantics/normalize/script-global-redefinition.js +75 -0
- package/dist/semantics/normalize/specialization.d.ts +201 -0
- package/dist/semantics/normalize/specialization.js +1824 -0
- package/dist/semantics/normalize/structural-array-element.d.ts +176 -0
- package/dist/semantics/normalize/structural-array-element.js +700 -0
- package/dist/semantics/normalize/structural-array-read.d.ts +13 -0
- package/dist/semantics/normalize/structural-array-read.js +124 -0
- package/dist/semantics/normalize/structural-callable.d.ts +12 -0
- package/dist/semantics/normalize/structural-callable.js +82 -0
- package/dist/semantics/normalize/structural-creation-order.d.ts +32 -0
- package/dist/semantics/normalize/structural-creation-order.js +111 -0
- package/dist/semantics/normalize/structural-declarations.d.ts +395 -0
- package/dist/semantics/normalize/structural-declarations.js +968 -0
- package/dist/semantics/normalize/structural-declared-body.d.ts +25 -0
- package/dist/semantics/normalize/structural-declared-body.js +147 -0
- package/dist/semantics/normalize/structural-generics.d.ts +56 -0
- package/dist/semantics/normalize/structural-generics.js +120 -0
- package/dist/semantics/normalize/structural-indexed-access.d.ts +11 -0
- package/dist/semantics/normalize/structural-indexed-access.js +126 -0
- package/dist/semantics/normalize/structural-instantiated-member.d.ts +64 -0
- package/dist/semantics/normalize/structural-instantiated-member.js +407 -0
- package/dist/semantics/normalize/structural-joins.d.ts +44 -0
- package/dist/semantics/normalize/structural-joins.js +143 -0
- package/dist/semantics/normalize/structural-layout-relevance.d.ts +29 -0
- package/dist/semantics/normalize/structural-layout-relevance.js +391 -0
- package/dist/semantics/normalize/structural-layout-type.d.ts +11 -0
- package/dist/semantics/normalize/structural-layout-type.js +1468 -0
- package/dist/semantics/normalize/structural-leaves.d.ts +49 -0
- package/dist/semantics/normalize/structural-leaves.js +125 -0
- package/dist/semantics/normalize/structural-local-union.d.ts +13 -0
- package/dist/semantics/normalize/structural-local-union.js +133 -0
- package/dist/semantics/normalize/structural-members.d.ts +26 -0
- package/dist/semantics/normalize/structural-members.js +84 -0
- package/dist/semantics/normalize/structural-mutable-method.d.ts +15 -0
- package/dist/semantics/normalize/structural-mutable-method.js +109 -0
- package/dist/semantics/normalize/structural-parts.d.ts +131 -0
- package/dist/semantics/normalize/structural-parts.js +737 -0
- package/dist/semantics/normalize/structural-receiver.d.ts +66 -0
- package/dist/semantics/normalize/structural-receiver.js +551 -0
- package/dist/semantics/normalize/structural-rules.d.ts +112 -0
- package/dist/semantics/normalize/structural-rules.js +93 -0
- package/dist/semantics/normalize/structural-self-reference.d.ts +150 -0
- package/dist/semantics/normalize/structural-self-reference.js +494 -0
- package/dist/semantics/normalize/structural.d.ts +202 -0
- package/dist/semantics/normalize/structural.js +4218 -0
- package/dist/semantics/normalize/unreduced-type-form.d.ts +41 -0
- package/dist/semantics/normalize/unreduced-type-form.js +53 -0
- package/dist/semantics/normalize/unresolvable-names.d.ts +56 -0
- package/dist/semantics/normalize/unresolvable-names.js +140 -0
- package/dist/semantics/package-sources.d.ts +16 -0
- package/dist/semantics/package-sources.js +365 -0
- package/dist/semantics/program.d.ts +151 -0
- package/dist/semantics/program.js +667 -0
- package/dist/semantics/prototype-install-source-transform.d.ts +4 -0
- package/dist/semantics/prototype-install-source-transform.js +341 -0
- package/dist/semantics/prototype-object-class-source-transform.d.ts +4 -0
- package/dist/semantics/prototype-object-class-source-transform.js +525 -0
- package/dist/semantics/prototype-reparenting.d.ts +50 -0
- package/dist/semantics/prototype-reparenting.js +317 -0
- package/dist/semantics/stable-checker.d.ts +10 -0
- package/dist/semantics/stable-checker.js +148 -0
- package/dist/semantics/subclass-member-overlay-transform.d.ts +35 -0
- package/dist/semantics/subclass-member-overlay-transform.js +1418 -0
- package/dist/semantics/symbol-keyed-expando-source-transform.d.ts +4 -0
- package/dist/semantics/symbol-keyed-expando-source-transform.js +66 -0
- package/dist/semantics/this-constructor-source-transform.d.ts +4 -0
- package/dist/semantics/this-constructor-source-transform.js +122 -0
- package/dist/semantics/uninstantiable-classes.d.ts +22 -0
- package/dist/semantics/uninstantiable-classes.js +75 -0
- package/dist/targets/cpp/balanced-units.d.ts +3 -0
- package/dist/targets/cpp/balanced-units.js +58 -0
- package/dist/targets/cpp/borrowed-call-entry.d.ts +30 -0
- package/dist/targets/cpp/borrowed-call-entry.js +68 -0
- package/dist/targets/cpp/captures.d.ts +68 -0
- package/dist/targets/cpp/captures.js +269 -0
- package/dist/targets/cpp/class-layout.d.ts +313 -0
- package/dist/targets/cpp/class-layout.js +483 -0
- package/dist/targets/cpp/class-properties/computed-method-value.d.ts +25 -0
- package/dist/targets/cpp/class-properties/computed-method-value.js +22 -0
- package/dist/targets/cpp/class-properties/emit-class-properties.d.ts +216 -0
- package/dist/targets/cpp/class-properties/emit-class-properties.js +917 -0
- package/dist/targets/cpp/class-properties/native-prototype.d.ts +11 -0
- package/dist/targets/cpp/class-properties/native-prototype.js +101 -0
- package/dist/targets/cpp/class-ref-transport.d.ts +12 -0
- package/dist/targets/cpp/class-ref-transport.js +32 -0
- package/dist/targets/cpp/conversions.d.ts +3 -0
- package/dist/targets/cpp/conversions.js +2027 -0
- package/dist/targets/cpp/deferral-safety.d.ts +82 -0
- package/dist/targets/cpp/deferral-safety.js +86 -0
- package/dist/targets/cpp/direct-call-receivers.d.ts +37 -0
- package/dist/targets/cpp/direct-call-receivers.js +79 -0
- package/dist/targets/cpp/document.d.ts +74 -0
- package/dist/targets/cpp/document.js +106 -0
- package/dist/targets/cpp/emit-allocation.d.ts +60 -0
- package/dist/targets/cpp/emit-allocation.js +573 -0
- package/dist/targets/cpp/emit-arrays.d.ts +119 -0
- package/dist/targets/cpp/emit-arrays.js +1047 -0
- package/dist/targets/cpp/emit-binding-reference.d.ts +17 -0
- package/dist/targets/cpp/emit-binding-reference.js +120 -0
- package/dist/targets/cpp/emit-bindings.d.ts +158 -0
- package/dist/targets/cpp/emit-bindings.js +769 -0
- package/dist/targets/cpp/emit-buffers.d.ts +156 -0
- package/dist/targets/cpp/emit-buffers.js +573 -0
- package/dist/targets/cpp/emit-callable.d.ts +230 -0
- package/dist/targets/cpp/emit-callable.js +2154 -0
- package/dist/targets/cpp/emit-carrier-members.d.ts +406 -0
- package/dist/targets/cpp/emit-carrier-members.js +1224 -0
- package/dist/targets/cpp/emit-coercion.d.ts +26 -0
- package/dist/targets/cpp/emit-coercion.js +39 -0
- package/dist/targets/cpp/emit-context.d.ts +1882 -0
- package/dist/targets/cpp/emit-context.js +904 -0
- package/dist/targets/cpp/emit-dynamic-properties.d.ts +174 -0
- package/dist/targets/cpp/emit-dynamic-properties.js +1249 -0
- package/dist/targets/cpp/emit-equality.d.ts +39 -0
- package/dist/targets/cpp/emit-equality.js +472 -0
- package/dist/targets/cpp/emit-exceptions.d.ts +104 -0
- package/dist/targets/cpp/emit-exceptions.js +513 -0
- package/dist/targets/cpp/emit-field-owner.d.ts +4 -0
- package/dist/targets/cpp/emit-field-owner.js +27 -0
- package/dist/targets/cpp/emit-in.d.ts +31 -0
- package/dist/targets/cpp/emit-in.js +426 -0
- package/dist/targets/cpp/emit-instanceof.d.ts +19 -0
- package/dist/targets/cpp/emit-instanceof.js +601 -0
- package/dist/targets/cpp/emit-integers.d.ts +68 -0
- package/dist/targets/cpp/emit-integers.js +184 -0
- package/dist/targets/cpp/emit-iterator.d.ts +100 -0
- package/dist/targets/cpp/emit-iterator.js +1137 -0
- package/dist/targets/cpp/emit-json.d.ts +73 -0
- package/dist/targets/cpp/emit-json.js +823 -0
- package/dist/targets/cpp/emit-jsx.d.ts +74 -0
- package/dist/targets/cpp/emit-jsx.js +806 -0
- package/dist/targets/cpp/emit-mixed-binary.d.ts +51 -0
- package/dist/targets/cpp/emit-mixed-binary.js +60 -0
- package/dist/targets/cpp/emit-namespaces.d.ts +101 -0
- package/dist/targets/cpp/emit-namespaces.js +133 -0
- package/dist/targets/cpp/emit-narrowing.d.ts +738 -0
- package/dist/targets/cpp/emit-narrowing.js +3967 -0
- package/dist/targets/cpp/emit-native-equality.d.ts +3 -0
- package/dist/targets/cpp/emit-native-equality.js +14 -0
- package/dist/targets/cpp/emit-native-selection.d.ts +5 -0
- package/dist/targets/cpp/emit-native-selection.js +37 -0
- package/dist/targets/cpp/emit-object-tag.d.ts +4 -0
- package/dist/targets/cpp/emit-object-tag.js +108 -0
- package/dist/targets/cpp/emit-owned-record.d.ts +2 -0
- package/dist/targets/cpp/emit-owned-record.js +15 -0
- package/dist/targets/cpp/emit-presence.d.ts +78 -0
- package/dist/targets/cpp/emit-presence.js +376 -0
- package/dist/targets/cpp/emit-properties.d.ts +105 -0
- package/dist/targets/cpp/emit-properties.js +1640 -0
- package/dist/targets/cpp/emit-record-view.d.ts +20 -0
- package/dist/targets/cpp/emit-record-view.js +354 -0
- package/dist/targets/cpp/emit-return.d.ts +5 -0
- package/dist/targets/cpp/emit-return.js +237 -0
- package/dist/targets/cpp/emit-sum-widening.d.ts +10 -0
- package/dist/targets/cpp/emit-sum-widening.js +69 -0
- package/dist/targets/cpp/emit-tonumber.d.ts +38 -0
- package/dist/targets/cpp/emit-tonumber.js +177 -0
- package/dist/targets/cpp/emit-tostring.d.ts +92 -0
- package/dist/targets/cpp/emit-tostring.js +556 -0
- package/dist/targets/cpp/emit-typeof.d.ts +49 -0
- package/dist/targets/cpp/emit-typeof.js +317 -0
- package/dist/targets/cpp/emit-union-properties.d.ts +181 -0
- package/dist/targets/cpp/emit-union-properties.js +1281 -0
- package/dist/targets/cpp/emit.d.ts +45 -0
- package/dist/targets/cpp/emit.js +2225 -0
- package/dist/targets/cpp/error-types.d.ts +4 -0
- package/dist/targets/cpp/error-types.js +11 -0
- package/dist/targets/cpp/function-source-reads.d.ts +72 -0
- package/dist/targets/cpp/function-source-reads.js +148 -0
- package/dist/targets/cpp/host/atomics.d.ts +25 -0
- package/dist/targets/cpp/host/atomics.js +63 -0
- package/dist/targets/cpp/host/core-globals.d.ts +108 -0
- package/dist/targets/cpp/host/core-globals.js +158 -0
- package/dist/targets/cpp/host/dynamic-argument-members.d.ts +42 -0
- package/dist/targets/cpp/host/dynamic-argument-members.js +61 -0
- package/dist/targets/cpp/host/emit-host-arity.d.ts +139 -0
- package/dist/targets/cpp/host/emit-host-arity.js +232 -0
- package/dist/targets/cpp/host/emit-host-invoke.d.ts +91 -0
- package/dist/targets/cpp/host/emit-host-invoke.js +1105 -0
- package/dist/targets/cpp/host/emit-host-object.d.ts +55 -0
- package/dist/targets/cpp/host/emit-host-object.js +2206 -0
- package/dist/targets/cpp/host/emit-host-properties.d.ts +69 -0
- package/dist/targets/cpp/host/emit-host-properties.js +533 -0
- package/dist/targets/cpp/host/emit-host-reflect.d.ts +4 -0
- package/dist/targets/cpp/host/emit-host-reflect.js +180 -0
- package/dist/targets/cpp/host/emit-host-value.d.ts +120 -0
- package/dist/targets/cpp/host/emit-host-value.js +392 -0
- package/dist/targets/cpp/host/host-members.d.ts +505 -0
- package/dist/targets/cpp/host/host-members.js +819 -0
- package/dist/targets/cpp/host/host-method-aliases.d.ts +30 -0
- package/dist/targets/cpp/host/host-method-aliases.js +76 -0
- package/dist/targets/cpp/host/native-protocols.d.ts +47 -0
- package/dist/targets/cpp/host/native-protocols.js +183 -0
- package/dist/targets/cpp/host/object-protocol.d.ts +351 -0
- package/dist/targets/cpp/host/object-protocol.js +671 -0
- package/dist/targets/cpp/host-namespace-reads.d.ts +83 -0
- package/dist/targets/cpp/host-namespace-reads.js +113 -0
- package/dist/targets/cpp/manifest/capabilities.d.ts +39 -0
- package/dist/targets/cpp/manifest/capabilities.js +1484 -0
- package/dist/targets/cpp/manifest.d.ts +23 -0
- package/dist/targets/cpp/manifest.js +113 -0
- package/dist/targets/cpp/native-error-base.d.ts +38 -0
- package/dist/targets/cpp/native-error-base.js +74 -0
- package/dist/targets/cpp/native-narrowing-transport.d.ts +12 -0
- package/dist/targets/cpp/native-narrowing-transport.js +151 -0
- package/dist/targets/cpp/native-selection-helpers.d.ts +11 -0
- package/dist/targets/cpp/native-selection-helpers.js +46 -0
- package/dist/targets/cpp/native-symbol-keys.d.ts +8 -0
- package/dist/targets/cpp/native-symbol-keys.js +34 -0
- package/dist/targets/cpp/ownership.d.ts +43 -0
- package/dist/targets/cpp/ownership.js +38 -0
- package/dist/targets/cpp/owning-conversion-input.d.ts +14 -0
- package/dist/targets/cpp/owning-conversion-input.js +12 -0
- package/dist/targets/cpp/property-read-claims.d.ts +62 -0
- package/dist/targets/cpp/property-read-claims.js +23 -0
- package/dist/targets/cpp/property-store-claims.d.ts +62 -0
- package/dist/targets/cpp/property-store-claims.js +26 -0
- package/dist/targets/cpp/prototype/emit-prototype-array.d.ts +111 -0
- package/dist/targets/cpp/prototype/emit-prototype-array.js +602 -0
- package/dist/targets/cpp/prototype/emit-prototype-date.d.ts +133 -0
- package/dist/targets/cpp/prototype/emit-prototype-date.js +515 -0
- package/dist/targets/cpp/prototype/emit-prototype-error.d.ts +13 -0
- package/dist/targets/cpp/prototype/emit-prototype-error.js +54 -0
- package/dist/targets/cpp/prototype/emit-prototype-invoke.d.ts +34 -0
- package/dist/targets/cpp/prototype/emit-prototype-invoke.js +1003 -0
- package/dist/targets/cpp/prototype/emit-prototype-iterator.d.ts +47 -0
- package/dist/targets/cpp/prototype/emit-prototype-iterator.js +250 -0
- package/dist/targets/cpp/prototype/emit-prototype-promise.d.ts +46 -0
- package/dist/targets/cpp/prototype/emit-prototype-promise.js +143 -0
- package/dist/targets/cpp/prototype/emit-prototype-regexp.d.ts +335 -0
- package/dist/targets/cpp/prototype/emit-prototype-regexp.js +853 -0
- package/dist/targets/cpp/prototype/emit-prototype-string.d.ts +42 -0
- package/dist/targets/cpp/prototype/emit-prototype-string.js +252 -0
- package/dist/targets/cpp/prototype/prototype-method-reads.d.ts +25 -0
- package/dist/targets/cpp/prototype/prototype-method-reads.js +182 -0
- package/dist/targets/cpp/reactive-dependencies.d.ts +140 -0
- package/dist/targets/cpp/reactive-dependencies.js +432 -0
- package/dist/targets/cpp/reactive-origins.d.ts +44 -0
- package/dist/targets/cpp/reactive-origins.js +82 -0
- package/dist/targets/cpp/records.d.ts +277 -0
- package/dist/targets/cpp/records.js +2427 -0
- package/dist/targets/cpp/recursive-containers.d.ts +43 -0
- package/dist/targets/cpp/recursive-containers.js +144 -0
- package/dist/targets/cpp/regexp-types.d.ts +56 -0
- package/dist/targets/cpp/regexp-types.js +59 -0
- package/dist/targets/cpp/substrate.d.ts +125 -0
- package/dist/targets/cpp/substrate.js +12 -0
- package/dist/targets/cpp/translation-unit.d.ts +219 -0
- package/dist/targets/cpp/translation-unit.js +2063 -0
- package/dist/targets/cpp/types.d.ts +280 -0
- package/dist/targets/cpp/types.js +1135 -0
- package/dist/targets/cpp/virtual-methods.d.ts +95 -0
- package/dist/targets/cpp/virtual-methods.js +264 -0
- package/package.json +95 -0
- package/src/targets/cpp/runtime/gea_dynamic_proxy.h +824 -0
- package/src/targets/cpp/runtime/gea_eval.h +1376 -0
- package/src/targets/cpp/runtime/gea_native_class_prototype.h +44 -0
- package/src/targets/cpp/runtime/gea_runtime.h +29222 -0
- package/src/targets/cpp/runtime/gea_runtime_builtins.cpp +55 -0
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import { representationKey } from '../representation/model.js';
|
|
2
|
+
import { operandsOfIrOperation, resultOfIrOperation } from './queries.js';
|
|
3
|
+
/**
|
|
4
|
+
* Which values render at their use instead of into a temporary of their own.
|
|
5
|
+
*
|
|
6
|
+
* A value with exactly one use, produced by an operation whose whole emitted
|
|
7
|
+
* form is one side-effect-free expression, does not need storage: the text can
|
|
8
|
+
* stand where the use stands. It lives here, beside the loop censuses, because
|
|
9
|
+
* it is a question about the IR -- what an operation reads and how many places
|
|
10
|
+
* read its result -- and not about C++.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* The operation kinds whose emitted statement is a side-effect-free
|
|
14
|
+
* expression.
|
|
15
|
+
*
|
|
16
|
+
* Not "cheap" and not "small": the question is whether moving the statement
|
|
17
|
+
* later, past other statements this census has also withheld, could be
|
|
18
|
+
* observed. A read of a cell, a formal, a literal, an arithmetic result, a
|
|
19
|
+
* conversion and a fresh Array are all answers about state nothing in the
|
|
20
|
+
* window changes. Every kind that writes -- `binding-write`, `set`,
|
|
21
|
+
* `define-own-property`, `delete` -- and every kind that can run a program's
|
|
22
|
+
* own code -- `call`, `construct`, `await`, `yield`, the iterator protocol,
|
|
23
|
+
* the JSX element builders -- is absent, so no deferred read is ever moved
|
|
24
|
+
* across an effect.
|
|
25
|
+
*
|
|
26
|
+
* `get` is the one kind decided per operation rather than by name, because it
|
|
27
|
+
* spells two different things: an index or `length` read off an Array or a
|
|
28
|
+
* string is a pure load, and a member read off anything else may reach a
|
|
29
|
+
* program-defined accessor. The narrow answer is the conservative one -- a
|
|
30
|
+
* receiver this census cannot prove pure simply keeps its temporary, which
|
|
31
|
+
* costs a copy and never correctness.
|
|
32
|
+
*/
|
|
33
|
+
const deferrableOperationKinds = new Set([
|
|
34
|
+
'constant',
|
|
35
|
+
'binding-read',
|
|
36
|
+
'parameter',
|
|
37
|
+
'receiver',
|
|
38
|
+
'compute',
|
|
39
|
+
'test',
|
|
40
|
+
'convert',
|
|
41
|
+
'has-property',
|
|
42
|
+
'allocate-array-object'
|
|
43
|
+
]);
|
|
44
|
+
/**
|
|
45
|
+
* The producers WITH effects whose result may still render inside the one
|
|
46
|
+
* operation that immediately consumes it.
|
|
47
|
+
*
|
|
48
|
+
* A call's result is an SSA temporary like any other, and where its single
|
|
49
|
+
* reader is the very next operation there is no window at all: nothing is
|
|
50
|
+
* crossed, so the call runs exactly where the IR placed it and only the
|
|
51
|
+
* temporary disappears. That temporary is not free the way a `double` is.
|
|
52
|
+
* `fns[slot] = makeKind(i % 4, i)` built a 32-byte `CallableObject` into a
|
|
53
|
+
* function-scope local, then copied it into the array cell -- two retains,
|
|
54
|
+
* two releases, and a store-forwarding stall on the 16-byte reload of what
|
|
55
|
+
* two 8-byte stores had just written. Rendered as the store's right-hand side
|
|
56
|
+
* the value is move-assigned straight from the call's return slot: the
|
|
57
|
+
* `closure` fixture went from 104 to 63 instructions per iteration.
|
|
58
|
+
*
|
|
59
|
+
* Unlike a pure deferral the producer is NOT marked withheld, so it goes on
|
|
60
|
+
* bounding every other value's window: a read defined before the call and
|
|
61
|
+
* used after it keeps its temporary, exactly as it does today, and C++'s
|
|
62
|
+
* unspecified operand order inside the consumer can never reorder it across
|
|
63
|
+
* the call.
|
|
64
|
+
*/
|
|
65
|
+
const forwardableProducerKinds = new Set(['call', 'construct', 'allocate-callable']);
|
|
66
|
+
export const noForwarding = { forwardsCallInto: () => false, forwardsBinding: () => false };
|
|
67
|
+
/**
|
|
68
|
+
* The positions a forwarded call result may occupy in its consumer, decided
|
|
69
|
+
* from the IR alone. An Array element store is admitted only for a stored
|
|
70
|
+
* value already carried as the element's own type: the renderer aligns any
|
|
71
|
+
* other value to the element first, and an alignment is a conversion whose
|
|
72
|
+
* spelling this census does not see.
|
|
73
|
+
*/
|
|
74
|
+
const callSinkOf = (consumer, value) => {
|
|
75
|
+
switch (consumer.kind) {
|
|
76
|
+
case 'call':
|
|
77
|
+
case 'construct': {
|
|
78
|
+
const operand = consumer.arguments.find((argument) => argument.value === value);
|
|
79
|
+
return operand === undefined ? null : { sink: consumer, operand };
|
|
80
|
+
}
|
|
81
|
+
case 'set': {
|
|
82
|
+
if (consumer.value.value !== value || consumer.typedComputedWrite !== undefined)
|
|
83
|
+
return null;
|
|
84
|
+
const receiver = consumer.receiver.representation;
|
|
85
|
+
if (receiver.kind !== 'array-object' || consumer.key.representation.kind !== 'scalar')
|
|
86
|
+
return null;
|
|
87
|
+
if (representationKey(receiver.element) !== representationKey(consumer.value.representation))
|
|
88
|
+
return null;
|
|
89
|
+
return { sink: consumer, operand: consumer.value };
|
|
90
|
+
}
|
|
91
|
+
case 'binding-write':
|
|
92
|
+
return consumer.value.value === value ? { sink: consumer, operand: consumer.value } : null;
|
|
93
|
+
case 'return':
|
|
94
|
+
return consumer.value !== null && consumer.value.value === value ? { sink: consumer, operand: consumer.value } : null;
|
|
95
|
+
default:
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
/** The carriers `gea::CallableObject` physically holds, whose every call path retains the environment it runs. */
|
|
100
|
+
const callableObjectCarrierKinds = new Set([
|
|
101
|
+
'function',
|
|
102
|
+
'function-value-dispatch',
|
|
103
|
+
'function-and-constructor'
|
|
104
|
+
]);
|
|
105
|
+
/**
|
|
106
|
+
* Where a forwarded binding's one read may be consumed.
|
|
107
|
+
*
|
|
108
|
+
* The read no longer copies out of a cell that holds its own count, so a
|
|
109
|
+
* consumer that BORROWS the value for the duration of a call -- a receiver
|
|
110
|
+
* or argument passed by reference -- would borrow the array slot or field the
|
|
111
|
+
* written expression names, and the callee may overwrite that slot while the
|
|
112
|
+
* reference is live. Every admitted position either copies the value (a
|
|
113
|
+
* store, a return, a cell write), reads it before anything else runs (an
|
|
114
|
+
* arithmetic operand, a plain member load) or is the CALLEE of a call, where
|
|
115
|
+
* `CallableObject::call` retains the environment it is about to run for
|
|
116
|
+
* exactly this reason.
|
|
117
|
+
*/
|
|
118
|
+
const forwardedReadPositionAllowed = (consumer, read, representation, pureGet) => {
|
|
119
|
+
switch (consumer.kind) {
|
|
120
|
+
case 'call':
|
|
121
|
+
return consumer.callee.value === read && callableObjectCarrierKinds.has(representation.kind);
|
|
122
|
+
case 'compute':
|
|
123
|
+
case 'test':
|
|
124
|
+
case 'binding-write':
|
|
125
|
+
case 'return':
|
|
126
|
+
return true;
|
|
127
|
+
case 'get': {
|
|
128
|
+
if (consumer.key.value === read)
|
|
129
|
+
return true;
|
|
130
|
+
if (consumer.receiver.value !== read)
|
|
131
|
+
return false;
|
|
132
|
+
const receiver = consumer.receiver.representation.kind;
|
|
133
|
+
return receiver === 'array-object' || receiver === 'string' || pureGet(consumer);
|
|
134
|
+
}
|
|
135
|
+
case 'set':
|
|
136
|
+
return consumer.key.value === read || consumer.value.value === read;
|
|
137
|
+
default:
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
/** A conversion over alternatives can inspect its input once per arm. */
|
|
142
|
+
const carriesAlternatives = (representation) => {
|
|
143
|
+
if (representation.kind === 'optional')
|
|
144
|
+
return carriesAlternatives(representation.payload);
|
|
145
|
+
if (representation.kind === 'borrowed-ref')
|
|
146
|
+
return carriesAlternatives(representation.referent);
|
|
147
|
+
return representation.kind === 'tagged-union';
|
|
148
|
+
};
|
|
149
|
+
const isDeferrableOperation = (operation, pureGet) => {
|
|
150
|
+
// One IR consumer is not necessarily one rendered evaluation. Sum
|
|
151
|
+
// projections may inspect several tags and rebuild a different set of
|
|
152
|
+
// alternatives; substituting one into another multiplies their expression
|
|
153
|
+
// trees. Preserve the SSA temporary at these boundaries, rather than making
|
|
154
|
+
// the target rediscover an expression-size limit after expanding the text.
|
|
155
|
+
if (operation.kind === 'convert' &&
|
|
156
|
+
(carriesAlternatives(operation.source.representation) || carriesAlternatives(operation.result.representation)))
|
|
157
|
+
return false;
|
|
158
|
+
if (operation.kind === 'get') {
|
|
159
|
+
const receiver = operation.receiver.representation.kind;
|
|
160
|
+
return receiver === 'array-object' || receiver === 'string' || pureGet(operation);
|
|
161
|
+
}
|
|
162
|
+
return deferrableOperationKinds.has(operation.kind);
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* Which values may render at their single use instead of into a temporary of
|
|
166
|
+
* their own.
|
|
167
|
+
*
|
|
168
|
+
* The IR is three-address form, and for a `double` that costs nothing: the C++
|
|
169
|
+
* compiler propagates the copy away. For a `std::shared_ptr` it is an atomic
|
|
170
|
+
* increment and a matching decrement, and for a `std::string` it is a heap
|
|
171
|
+
* allocation -- neither of which any optimizer may remove, because both are
|
|
172
|
+
* observable through the refcount and the allocator. An array indexed in a
|
|
173
|
+
* loop was paying one atomic pair per iteration purely to name the array the
|
|
174
|
+
* cell was already holding.
|
|
175
|
+
*
|
|
176
|
+
* Four conditions, and each one is load-bearing. Compound sum conversions
|
|
177
|
+
* additionally retain their named result to bound composition of projections:
|
|
178
|
+
*
|
|
179
|
+
* 1. exactly one use, so the expression is not evaluated twice;
|
|
180
|
+
* 2. that use in the same block, so no `goto` can reach the use without
|
|
181
|
+
* passing the definition;
|
|
182
|
+
* 3. the defining operation side-effect-free (`isDeferrableOperation`); and
|
|
183
|
+
* 4. every operation between the two also deferred.
|
|
184
|
+
*
|
|
185
|
+
* (4) is what makes (3) sufficient. Everything between the definition and the
|
|
186
|
+
* use emitted no statement of its own, so the window contains no write at all
|
|
187
|
+
* -- which is why the order these reads end up in inside the use's own
|
|
188
|
+
* expression, which C++ leaves unspecified for most operators, cannot be
|
|
189
|
+
* observed by the program.
|
|
190
|
+
*
|
|
191
|
+
* Two forwardings ride on the same census, each with a narrower proof:
|
|
192
|
+
*
|
|
193
|
+
* - a `call`, `construct` or `allocate-callable` result whose single reader
|
|
194
|
+
* is the IMMEDIATELY following operation (`forwardableProducerKinds`,
|
|
195
|
+
* `callSinkOf`): no window, so nothing is crossed, and the producer keeps
|
|
196
|
+
* bounding everyone else's windows;
|
|
197
|
+
* - a cell written once and read once in one block, the read itself
|
|
198
|
+
* deferrable, every operation between the two effect-free, and the read
|
|
199
|
+
* consumed where it is copied or called rather than borrowed
|
|
200
|
+
* (`forwardedReadPositionAllowed`): the write renders nothing and the read
|
|
201
|
+
* spells the written value (`forwardedBindings`).
|
|
202
|
+
*
|
|
203
|
+
* The target's `ForwardingPolicy` has the last word on both, because both
|
|
204
|
+
* depend on how a renderer spells its operand and on whose storage a cell is.
|
|
205
|
+
*
|
|
206
|
+
* A use recorded for a merge (`phi`) belongs to the PREDECESSOR block at the
|
|
207
|
+
* position `emitBody` writes merges at -- after that block's operations and
|
|
208
|
+
* before its terminator -- not to the block the phi is written in. Recording
|
|
209
|
+
* it where the phi sits would let a value move across the whole block.
|
|
210
|
+
*/
|
|
211
|
+
/**
|
|
212
|
+
* `pureGet` widens the `get` rule past Arrays and strings to whatever the
|
|
213
|
+
* emitter can prove is a plain field load (`emit-properties.ts`'s
|
|
214
|
+
* `isPlainMemberRead`): `v20 = gea_this->cities; if (b0 < v20->length())`
|
|
215
|
+
* is a `Ref` copy -- an atomic pair -- made only to name the field once, and
|
|
216
|
+
* with the read deferred the comparison spells the field itself. The default
|
|
217
|
+
* refuses every such read, which is the answer the census gave before it was
|
|
218
|
+
* asked.
|
|
219
|
+
*/
|
|
220
|
+
export const deferrableValuesOf = (body, pureGet = () => false, forwarding = noForwarding) => {
|
|
221
|
+
const uses = new Map();
|
|
222
|
+
const record = (value, block, index) => {
|
|
223
|
+
const sites = uses.get(value);
|
|
224
|
+
if (sites)
|
|
225
|
+
sites.push({ block, index });
|
|
226
|
+
else
|
|
227
|
+
uses.set(value, [{ block, index }]);
|
|
228
|
+
};
|
|
229
|
+
// A block that writes merges renders statements between its last operation
|
|
230
|
+
// and its terminator, so a call there is not adjacent to a `return` after it.
|
|
231
|
+
const mergeBlocks = new Set();
|
|
232
|
+
const producers = new Map();
|
|
233
|
+
const bindingWriteCounts = new Map();
|
|
234
|
+
const bindingReads = new Map();
|
|
235
|
+
for (const blockId of body.blockOrder) {
|
|
236
|
+
const block = body.blocks.get(blockId);
|
|
237
|
+
if (!block)
|
|
238
|
+
continue;
|
|
239
|
+
block.operations.forEach((operation, index) => {
|
|
240
|
+
if (operation.kind === 'phi') {
|
|
241
|
+
for (const edge of operation.incoming) {
|
|
242
|
+
mergeBlocks.add(edge.block);
|
|
243
|
+
record(edge.value.value, edge.block, body.blocks.get(edge.block)?.operations.length ?? 0);
|
|
244
|
+
}
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const result = resultOfIrOperation(operation);
|
|
248
|
+
if (result !== null)
|
|
249
|
+
producers.set(result.id, operation);
|
|
250
|
+
if (operation.kind === 'binding-write')
|
|
251
|
+
bindingWriteCounts.set(operation.declaration, (bindingWriteCounts.get(operation.declaration) ?? 0) + 1);
|
|
252
|
+
if (operation.kind === 'binding-read') {
|
|
253
|
+
const reads = bindingReads.get(operation.declaration);
|
|
254
|
+
const site = { block: blockId, index, operation };
|
|
255
|
+
if (reads)
|
|
256
|
+
reads.push(site);
|
|
257
|
+
else
|
|
258
|
+
bindingReads.set(operation.declaration, [site]);
|
|
259
|
+
}
|
|
260
|
+
for (const operand of operandsOfIrOperation(operation))
|
|
261
|
+
record(operand.value, blockId, index);
|
|
262
|
+
});
|
|
263
|
+
for (const operand of operandsOfIrOperation(block.terminator))
|
|
264
|
+
record(operand.value, blockId, block.operations.length + 1);
|
|
265
|
+
}
|
|
266
|
+
for (const region of body.iteratorCloseRegions ?? [])
|
|
267
|
+
record(region.iterator.value, region.entry, 0);
|
|
268
|
+
const deferrable = new Set();
|
|
269
|
+
const forwardedBindings = new Map();
|
|
270
|
+
// A candidate is complete only once the whole body is censused: whether the
|
|
271
|
+
// written value itself defers is decided at its producer, which the
|
|
272
|
+
// descending walk reaches AFTER the write that reads it.
|
|
273
|
+
const bindingCandidates = [];
|
|
274
|
+
// Which withheld values a CALL is the single reader of. An array literal
|
|
275
|
+
// withheld whole has no statement to move -- it materializes from its own
|
|
276
|
+
// elements wherever its text lands (`EmitContext.pendingPacks`) -- so a
|
|
277
|
+
// renderer that spells one operand twice would build two objects where the
|
|
278
|
+
// program wrote one. Every renderer that does spell an operand twice spells
|
|
279
|
+
// its RECEIVER, and a call argument is never that, so restricting the
|
|
280
|
+
// withholding to call arguments is what makes the one-object rule hold
|
|
281
|
+
// without asking each renderer to promise it.
|
|
282
|
+
const consumedByCall = new Set();
|
|
283
|
+
for (const blockId of body.blockOrder) {
|
|
284
|
+
const block = body.blocks.get(blockId);
|
|
285
|
+
if (!block)
|
|
286
|
+
continue;
|
|
287
|
+
// Descending, because whether an operation may be deferred depends on
|
|
288
|
+
// whether every LATER operation up to its use already was.
|
|
289
|
+
const withheld = new Set();
|
|
290
|
+
for (let index = block.operations.length - 1; index >= 0; index -= 1) {
|
|
291
|
+
const operation = block.operations[index];
|
|
292
|
+
if (!operation)
|
|
293
|
+
continue;
|
|
294
|
+
// A merge publishes its name before any block renders and emits no
|
|
295
|
+
// statement where it is written, so it never breaks a window.
|
|
296
|
+
if (operation.kind === 'phi') {
|
|
297
|
+
withheld.add(index);
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
if (forwardableProducerKinds.has(operation.kind)) {
|
|
301
|
+
const result = resultOfIrOperation(operation);
|
|
302
|
+
const sites = result === null ? undefined : uses.get(result.id);
|
|
303
|
+
const site = sites?.length === 1 ? sites[0] : undefined;
|
|
304
|
+
if (result === null || !site || site.block !== blockId)
|
|
305
|
+
continue;
|
|
306
|
+
// Adjacent means the next operation, or the terminator of a block
|
|
307
|
+
// that writes no merges in front of it.
|
|
308
|
+
const consumer = site.index === index + 1 && site.index < block.operations.length
|
|
309
|
+
? block.operations[site.index]
|
|
310
|
+
: index === block.operations.length - 1 && site.index === block.operations.length + 1 && !mergeBlocks.has(blockId)
|
|
311
|
+
? block.terminator
|
|
312
|
+
: undefined;
|
|
313
|
+
if (consumer === undefined)
|
|
314
|
+
continue;
|
|
315
|
+
const sink = callSinkOf(consumer, result.id);
|
|
316
|
+
if (sink === null || !forwarding.forwardsCallInto(sink.sink, sink.operand))
|
|
317
|
+
continue;
|
|
318
|
+
deferrable.add(result.id);
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
if (operation.kind === 'binding-write') {
|
|
322
|
+
if (bindingWriteCounts.get(operation.declaration) !== 1)
|
|
323
|
+
continue;
|
|
324
|
+
const reads = bindingReads.get(operation.declaration);
|
|
325
|
+
const read = reads?.length === 1 ? reads[0] : undefined;
|
|
326
|
+
if (!read || read.block !== blockId || read.index <= index || !deferrable.has(read.operation.result.id))
|
|
327
|
+
continue;
|
|
328
|
+
const readSites = uses.get(read.operation.result.id);
|
|
329
|
+
const readSite = readSites?.length === 1 ? readSites[0] : undefined;
|
|
330
|
+
if (!readSite || readSite.block !== blockId)
|
|
331
|
+
continue;
|
|
332
|
+
const consumer = readSite.index < block.operations.length
|
|
333
|
+
? block.operations[readSite.index]
|
|
334
|
+
: readSite.index === block.operations.length + 1
|
|
335
|
+
? block.terminator
|
|
336
|
+
: undefined;
|
|
337
|
+
if (consumer === undefined)
|
|
338
|
+
continue;
|
|
339
|
+
if (!forwardedReadPositionAllowed(consumer, read.operation.result.id, read.operation.result.representation, pureGet))
|
|
340
|
+
continue;
|
|
341
|
+
// Effect-free is the condition here, not withheld: a pure read that
|
|
342
|
+
// kept its temporary because ITS use lies past some later call still
|
|
343
|
+
// writes nothing, and the written expression only has to reach the
|
|
344
|
+
// read without anything changing what it names. From the read to its
|
|
345
|
+
// use the read's own deferral has already proved the window clear.
|
|
346
|
+
let clear = true;
|
|
347
|
+
for (let between = index + 1; between < read.index; between += 1) {
|
|
348
|
+
const crossed = block.operations[between];
|
|
349
|
+
if (!crossed || (crossed.kind !== 'phi' && !isDeferrableOperation(crossed, pureGet)))
|
|
350
|
+
clear = false;
|
|
351
|
+
}
|
|
352
|
+
if (!clear)
|
|
353
|
+
continue;
|
|
354
|
+
if (!forwarding.forwardsBinding(operation, read.operation))
|
|
355
|
+
continue;
|
|
356
|
+
bindingCandidates.push({
|
|
357
|
+
declaration: operation.declaration,
|
|
358
|
+
value: operation.value,
|
|
359
|
+
read: read.operation.result.id,
|
|
360
|
+
write: index,
|
|
361
|
+
readAt: read.index,
|
|
362
|
+
use: readSite.index
|
|
363
|
+
});
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
if (!isDeferrableOperation(operation, pureGet))
|
|
367
|
+
continue;
|
|
368
|
+
const result = resultOfIrOperation(operation);
|
|
369
|
+
if (result === null)
|
|
370
|
+
continue;
|
|
371
|
+
const sites = uses.get(result.id);
|
|
372
|
+
const site = sites?.length === 1 ? sites[0] : undefined;
|
|
373
|
+
if (!site || site.block !== blockId || site.index <= index)
|
|
374
|
+
continue;
|
|
375
|
+
const limit = Math.min(site.index, block.operations.length);
|
|
376
|
+
let clear = true;
|
|
377
|
+
for (let between = index + 1; between < limit; between += 1)
|
|
378
|
+
if (!withheld.has(between))
|
|
379
|
+
clear = false;
|
|
380
|
+
if (!clear)
|
|
381
|
+
continue;
|
|
382
|
+
withheld.add(index);
|
|
383
|
+
deferrable.add(result.id);
|
|
384
|
+
const reader = block.operations[site.index];
|
|
385
|
+
if (reader && (reader.kind === 'call' || reader.kind === 'construct' || reader.kind === 'super-initialize')) {
|
|
386
|
+
if (!reader.arguments.some((argument) => argument.value === result.id))
|
|
387
|
+
continue;
|
|
388
|
+
consumedByCall.add(result.id);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
for (const candidate of bindingCandidates) {
|
|
393
|
+
if (!deferrable.has(candidate.value.value))
|
|
394
|
+
continue;
|
|
395
|
+
const producer = producers.get(candidate.value.value);
|
|
396
|
+
// A formal reaches its reads by name already (`emit-bindings.ts`'s
|
|
397
|
+
// `collectFormalCells`), and that decision stays where it is.
|
|
398
|
+
if (producer === undefined || producer.kind === 'parameter' || producer.kind === 'receiver')
|
|
399
|
+
continue;
|
|
400
|
+
// A forwarded CALL moves to the read's use, so it may cross nothing at all
|
|
401
|
+
// -- not even a withheld read, whose place inside the use's expression C++
|
|
402
|
+
// orders however it likes.
|
|
403
|
+
if (forwardableProducerKinds.has(producer.kind) &&
|
|
404
|
+
!(candidate.readAt === candidate.write + 1 && candidate.use === candidate.readAt + 1))
|
|
405
|
+
continue;
|
|
406
|
+
forwardedBindings.set(candidate.declaration, { value: candidate.value, read: candidate.read });
|
|
407
|
+
}
|
|
408
|
+
return { values: deferrable, consumedByCall, forwardedBindings };
|
|
409
|
+
};
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import type { DeclarationId, IrValueId } from '../identity/ids.js';
|
|
2
|
+
import type { Representation, TypedArrayElementDomain } from '../representation/model.js';
|
|
3
|
+
import type { IrBlockId, IrBody, IrNonTerminatorOperation, IrOperand } from './model.js';
|
|
4
|
+
/**
|
|
5
|
+
* Loops whose Array accesses can run against a raw element pointer, and the
|
|
6
|
+
* one loop-invariant condition that makes that sound.
|
|
7
|
+
*
|
|
8
|
+
* `c[i * N + j] += a_ik * b_kj` compiles to a load and a store through
|
|
9
|
+
* `ArrayObject`, and both of them can GROW the array -- a store past the end
|
|
10
|
+
* appends, which is what `a[a.length] = x` means in JavaScript. clang has to
|
|
11
|
+
* assume the storage may be reallocated on every iteration, so it reloads the
|
|
12
|
+
* base pointer each time and cannot vectorize anything. Measured on
|
|
13
|
+
* `bench/comparison`'s matrix_multiply: 35.5 ms, against 4.9 ms for the
|
|
14
|
+
* hand-written C++ that indexes a `std::vector` it knows nobody resizes.
|
|
15
|
+
*
|
|
16
|
+
* Hoisting the base pointer alone does not fix it, and neither does a
|
|
17
|
+
* per-access bounds check -- both measured 35 ms, because the branch that
|
|
18
|
+
* could still reallocate is inside the loop either way. What does fix it is a
|
|
19
|
+
* condition computed ONCE, before the loop:
|
|
20
|
+
*
|
|
21
|
+
* geaFast = arr->holes.empty() && lower >= 0 && upper <= arr->size()
|
|
22
|
+
*
|
|
23
|
+
* and an access written `geaFast ? base[i].value : <the general form>`. The
|
|
24
|
+
* flag is loop-invariant, so clang's own loop unswitching produces the two
|
|
25
|
+
* loop bodies, and in the fast one nothing can resize: 7.9 ms, same answer.
|
|
26
|
+
* That is why this is a flag rather than a duplicated block -- the versioning
|
|
27
|
+
* already exists in the backend, and it only needed something invariant to
|
|
28
|
+
* version on.
|
|
29
|
+
*
|
|
30
|
+
* The proof this computes is that the loop's own test bounds every index:
|
|
31
|
+
*
|
|
32
|
+
* - the loop is ascending (`i < B` / `i <= B`) with the counter on the left,
|
|
33
|
+
* and the counter advances by a loop-invariant step, so inside the body
|
|
34
|
+
* `i` never exceeds `B`;
|
|
35
|
+
* - every index is the counter, or a loop-invariant base plus the counter,
|
|
36
|
+
* so the highest index the loop can reach is `base + B`;
|
|
37
|
+
* - and every use of the array inside the loop is one of those accesses --
|
|
38
|
+
* one `push`, one call taking the array, one write of the cell, and the
|
|
39
|
+
* window is no longer a window.
|
|
40
|
+
*
|
|
41
|
+
* The bound itself, the base and the counter's seed are all read at the
|
|
42
|
+
* preheader and checked there. Nothing here assumes a length.
|
|
43
|
+
*/
|
|
44
|
+
export interface DenseArray {
|
|
45
|
+
/** Distinguishes this window's pointer name within one body. */
|
|
46
|
+
readonly ordinal: number;
|
|
47
|
+
/** The loop this window belongs to. One flag per loop, not per array: two invariant flags would ask the backend for four loop versions where one condition covers every window. */
|
|
48
|
+
readonly group: number;
|
|
49
|
+
/** The array, as the emitter already knows how to spell it. */
|
|
50
|
+
readonly reference: DenseReference;
|
|
51
|
+
/** The element carrier, for the pointer's own type. */
|
|
52
|
+
readonly element: Representation;
|
|
53
|
+
/** Typed-array storage has no Cell wrapper or holes. */
|
|
54
|
+
readonly typed: TypedArrayElementDomain | null;
|
|
55
|
+
/** The block the flag and the pointer are computed in. */
|
|
56
|
+
readonly preheader: IrBlockId;
|
|
57
|
+
/** Every invariant addend used by an access, with `null` for the bare counter. All ranges must fit before any access is unchecked. */
|
|
58
|
+
readonly bases: readonly (IrOperand | null)[];
|
|
59
|
+
/** The counter cell, read at the preheader for the lowest index the loop can touch. */
|
|
60
|
+
readonly counter: DeclarationId;
|
|
61
|
+
/** The loop's own bound. */
|
|
62
|
+
readonly bound: IrOperand;
|
|
63
|
+
/** Whether the test admits the bound itself (`<=`), so the window is one wider. */
|
|
64
|
+
readonly inclusive: boolean;
|
|
65
|
+
/** The counter's step, checked non-negative at the preheader. */
|
|
66
|
+
readonly step: IrOperand | null;
|
|
67
|
+
/**
|
|
68
|
+
* Whether this window's indices are REMAINDERS by the array's own length
|
|
69
|
+
* rather than the loop's counter -- `ring[i % ring.length]`, the shape every
|
|
70
|
+
* ring buffer and hash bucket is written in.
|
|
71
|
+
*
|
|
72
|
+
* A different proof, and a simpler one: `x % n` lies in `[0, n)` for every
|
|
73
|
+
* dividend whenever `n > 0`, so the window needs no bound, no base and no
|
|
74
|
+
* counter -- only that the array is non-empty and has no holes, which is what
|
|
75
|
+
* the preheader checks. `bases`, `bound`, `inclusive`, `step` and `widened`
|
|
76
|
+
* carry no meaning for one of these.
|
|
77
|
+
*
|
|
78
|
+
* Worth its own shape because the ordinary bounds test is not cheap enough to
|
|
79
|
+
* leave in the loop. Measured on `bench/comparison/fixtures/object_create.ts`:
|
|
80
|
+
* 11.3ms as emitted, 11.8ms with a per-access `key < size()` guard (no better
|
|
81
|
+
* than doing nothing at all), 10.1ms with an unsigned integer one, and 7.9ms
|
|
82
|
+
* with the bound gone. A per-access size read is what stops clang keeping the
|
|
83
|
+
* base pointer in a register, so the bound has to leave the loop entirely.
|
|
84
|
+
*/
|
|
85
|
+
readonly wrapped: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* What a wrapped window's indices are taken modulo: `null` for the array's
|
|
88
|
+
* own `length`, a positive integer for a CONSTANT divisor.
|
|
89
|
+
*
|
|
90
|
+
* `x % n` lies in `[0, n)` either way, so the proof is the same one; what
|
|
91
|
+
* differs is what the preheader has to check. The array's own length needs
|
|
92
|
+
* only `size() > 0`, because an index below the length is inside the storage
|
|
93
|
+
* by definition. A constant needs `size() >= n`, because nothing ties the two
|
|
94
|
+
* together -- and that check is what makes `table[i % 16]` a window, which is
|
|
95
|
+
* how every fixed-capacity ring buffer, hash bucket and dispatch table is
|
|
96
|
+
* written.
|
|
97
|
+
*
|
|
98
|
+
* Meaningless when `wrapped` is false.
|
|
99
|
+
*/
|
|
100
|
+
readonly modulus: number | null;
|
|
101
|
+
/**
|
|
102
|
+
* Whether an access can see the counter AFTER this turn's advance.
|
|
103
|
+
*
|
|
104
|
+
* The loop's test bounds the counter at the top of the body; a body that
|
|
105
|
+
* advances the counter and THEN reads reaches one step further, and the
|
|
106
|
+
* window has to be that much wider. A latch that advances and jumps straight
|
|
107
|
+
* back to the header -- which is what every `for` loop compiles to -- reaches
|
|
108
|
+
* nothing, and widening it there would cost the window outright: an array of
|
|
109
|
+
* exactly `bound` elements would fail `bound + 1 <= size` on every turn.
|
|
110
|
+
*/
|
|
111
|
+
readonly widened: boolean;
|
|
112
|
+
}
|
|
113
|
+
export type DenseReference = {
|
|
114
|
+
readonly kind: 'cell';
|
|
115
|
+
readonly declaration: DeclarationId;
|
|
116
|
+
readonly representation: Representation;
|
|
117
|
+
} | {
|
|
118
|
+
readonly kind: 'value';
|
|
119
|
+
readonly operand: IrOperand;
|
|
120
|
+
readonly storage: Representation;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* A ROW of another array: `grid[i]` read inside the `j` loop.
|
|
124
|
+
*
|
|
125
|
+
* The receiver of `grid[i][j]` is loop-invariant and yet defined inside the
|
|
126
|
+
* loop -- the row load is one of the loop's own operations -- so neither of
|
|
127
|
+
* the two references above names it. `holder` is the array the row comes out
|
|
128
|
+
* of and `key` the invariant index; the emitter re-reads the row at the
|
|
129
|
+
* preheader, behind the condition that says the read is in range, and takes
|
|
130
|
+
* the pointer from there. `operand` is the row value itself, whose every
|
|
131
|
+
* other use inside the loop the window still has to account for.
|
|
132
|
+
*/
|
|
133
|
+
| {
|
|
134
|
+
readonly kind: 'element';
|
|
135
|
+
readonly holder: DenseReference;
|
|
136
|
+
readonly key: IrOperand;
|
|
137
|
+
readonly operand: IrOperand;
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* One loop's condition.
|
|
141
|
+
*
|
|
142
|
+
* The flag is per LOOP and CUMULATIVE -- it ands its enclosing loop's flag --
|
|
143
|
+
* because the backend's loop unswitching is what turns the ternary into two
|
|
144
|
+
* loop bodies, and it versions on one invariant condition, not on several. An
|
|
145
|
+
* inner body that named three flags measured 62 ms against 7.9 for the same
|
|
146
|
+
* body behind one (`bench/comparison`'s matrix_multiply): clang gave up rather
|
|
147
|
+
* than emit eight versions. Anding outward is also what lets an access reached
|
|
148
|
+
* inside a nested loop cite the innermost flag -- the only one that loop's own
|
|
149
|
+
* unswitching can see -- and still stand for its own window's proof.
|
|
150
|
+
*/
|
|
151
|
+
export interface DenseGroup {
|
|
152
|
+
readonly ordinal: number;
|
|
153
|
+
/** The enclosing loop's group, whose flag this one ands. */
|
|
154
|
+
readonly parent: number | null;
|
|
155
|
+
readonly preheader: IrBlockId;
|
|
156
|
+
}
|
|
157
|
+
export interface DenseAccess {
|
|
158
|
+
/** The window whose pointer this access indexes. */
|
|
159
|
+
readonly array: number;
|
|
160
|
+
/** The flag it renders behind: the innermost enclosing loop's, which implies the window's own. */
|
|
161
|
+
readonly flag: number;
|
|
162
|
+
}
|
|
163
|
+
export interface DenseLoopPlan {
|
|
164
|
+
readonly arrays: readonly DenseArray[];
|
|
165
|
+
readonly groups: readonly DenseGroup[];
|
|
166
|
+
/** Which window each access renders against. */
|
|
167
|
+
readonly accesses: ReadonlyMap<IrNonTerminatorOperation, DenseAccess>;
|
|
168
|
+
/**
|
|
169
|
+
* Every read of a WRAPPED window's own `length`, and the window it belongs to.
|
|
170
|
+
*
|
|
171
|
+
* The divisor of `i % ring.length` is loop-invariant by the same admission
|
|
172
|
+
* that made the window dense -- nothing in the loop resizes the array -- but
|
|
173
|
+
* clang will not hoist the load: the element stores go through a pointer it
|
|
174
|
+
* cannot prove disjoint from the vector's own header, so the length is
|
|
175
|
+
* re-read on every turn and the base pointer never stays in a register.
|
|
176
|
+
* Measured on `object_create.ts`: 11.5ms as emitted, 10.3ms with only the
|
|
177
|
+
* length hoisted, 10.1ms with only the guard branch gone, 8.1ms with both.
|
|
178
|
+
*/
|
|
179
|
+
readonly lengths: ReadonlyMap<IrValueId, number>;
|
|
180
|
+
}
|
|
181
|
+
export declare const emptyDenseLoopPlan: DenseLoopPlan;
|
|
182
|
+
/**
|
|
183
|
+
* The plan a body can actually RENDER, once the target has answered the one
|
|
184
|
+
* question that is genuinely about its own storage.
|
|
185
|
+
*
|
|
186
|
+
* `denseLoopsOf` states what the loop's own control flow proves; it cannot
|
|
187
|
+
* say whether THIS backend already has a plain name for a window's array or
|
|
188
|
+
* counter cell to dereference through -- a local this body owns outright,
|
|
189
|
+
* unboxed, or a global -- because that is the target's own placement, capture
|
|
190
|
+
* and boxing decision, not a fact of the program. `admitsCell` is that one
|
|
191
|
+
* hook (`emit-arrays.ts`'s `denseCellName` is its sole implementation).
|
|
192
|
+
*/
|
|
193
|
+
export type DenseCellPolicy = (declaration: DeclarationId) => boolean;
|
|
194
|
+
/** The windows a body ends up able to render, once `admittedDenseLoopPlanOf` has trimmed the raw plan. */
|
|
195
|
+
export interface AdmittedDenseLoopPlan {
|
|
196
|
+
readonly arrays: readonly DenseArray[];
|
|
197
|
+
readonly groups: ReadonlyMap<number, DenseGroup>;
|
|
198
|
+
readonly accesses: ReadonlyMap<IrNonTerminatorOperation, DenseAccess>;
|
|
199
|
+
readonly lengths: ReadonlyMap<IrValueId, number>;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Narrows `denseLoopsOf`'s raw plan to the windows this body may actually
|
|
203
|
+
* render.
|
|
204
|
+
*
|
|
205
|
+
* A window not admitted here is never a refusal: the array still renders
|
|
206
|
+
* through the ordinary indexed path, which is always correct, and this only
|
|
207
|
+
* decides which windows get the additional fast one. Three things a plan
|
|
208
|
+
* built from the IR alone cannot settle are decided here, and only the first
|
|
209
|
+
* is about this backend's own storage rather than about the program:
|
|
210
|
+
*
|
|
211
|
+
* - whether this body already has a plain name for the cells a window
|
|
212
|
+
* reaches through (`admitsCell`);
|
|
213
|
+
* - whether the integer census narrowed every index a window's accesses
|
|
214
|
+
* read -- an un-narrowed `number` key is not an element access at all --
|
|
215
|
+
* except a WRAPPED window, which is exempt: its own admission already
|
|
216
|
+
* proves the array non-empty and hole-free (`DenseArray.wrapped`), so a
|
|
217
|
+
* remainder by that length or by a literal modulus needs no narrowed index
|
|
218
|
+
* to be a real one; one un-narrowed access anywhere in an ordinary window
|
|
219
|
+
* takes the WHOLE window down, since every access shares the one pointer
|
|
220
|
+
* the narrowing proof is about;
|
|
221
|
+
* - and, once the two above have dropped some accesses, whether anything is
|
|
222
|
+
* left of a window at all: an array with no surviving access has no
|
|
223
|
+
* pointer worth materializing, and a flag chain with no claimed window
|
|
224
|
+
* below it has nothing to compute either -- a flag ands its enclosing
|
|
225
|
+
* loop's, so every group on a claimed window's chain has to exist even
|
|
226
|
+
* when nothing indexes anything in that loop, and no group outside that
|
|
227
|
+
* chain is needed at all.
|
|
228
|
+
*/
|
|
229
|
+
export declare const admittedDenseLoopPlanOf: (plan: DenseLoopPlan, integerValues: ReadonlySet<IrValueId>, admitsCell: DenseCellPolicy) => AdmittedDenseLoopPlan;
|
|
230
|
+
export declare const denseLoopsOf: (body: IrBody) => DenseLoopPlan;
|