@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,108 @@
|
|
|
1
|
+
import { classStaticMemberOf } from '../projection/fields.js';
|
|
2
|
+
import { representationKey } from '../representation/model.js';
|
|
3
|
+
/**
|
|
4
|
+
* Which class of a `constructor-family`'s members owns `key`'s static storage.
|
|
5
|
+
*
|
|
6
|
+
* The one selection rule, so the census and every later lookup name the same
|
|
7
|
+
* class for the same receiver. A key no static member declares is the
|
|
8
|
+
* assignment-only idiom and belongs to the first member that could hold it. A
|
|
9
|
+
* declared static FIELD has the same storage requirement, since its
|
|
10
|
+
* class-lifecycle event has already become an ordinary `set` at the exact
|
|
11
|
+
* evaluation point. Methods and accessors remain callable members and must not
|
|
12
|
+
* acquire a second storage location.
|
|
13
|
+
*/
|
|
14
|
+
export const staticFieldOwnerOf = (classes, members, key) => {
|
|
15
|
+
const member = members.find((candidate) => {
|
|
16
|
+
if (!classes.has(candidate))
|
|
17
|
+
return false;
|
|
18
|
+
const site = classStaticMemberOf(classes, candidate, key);
|
|
19
|
+
return site === null || site.kind === 'field';
|
|
20
|
+
});
|
|
21
|
+
// Through `staticOwner`: the physical layouts of one generic are several
|
|
22
|
+
// structs and ONE constructor object, so `Box.count` is one cell whether it
|
|
23
|
+
// is written inside `Box<number>`'s constructor, inside `Box<string>`'s,
|
|
24
|
+
// or through the class binding itself. Keying storage on the struct would
|
|
25
|
+
// give one `count` per layout, and `Box.count` would read whichever the
|
|
26
|
+
// last write happened to land in.
|
|
27
|
+
return member === undefined ? undefined : staticStorageOwnerOf(classes, member);
|
|
28
|
+
};
|
|
29
|
+
/** The class one class's static storage lives in: itself, or the generic root whose layouts it is one of. */
|
|
30
|
+
export const staticStorageOwnerOf = (classes, declaration) => classes.get(declaration)?.staticOwner ?? declaration;
|
|
31
|
+
/** The carrier `ClassName.KEY` is stored in, or null when the census proved none. */
|
|
32
|
+
export const staticFieldSlotOf = (census, classes, members, key) => {
|
|
33
|
+
const owner = staticFieldOwnerOf(classes, members, key);
|
|
34
|
+
return owner === undefined ? null : (census.slots.get(owner)?.get(key) ?? null);
|
|
35
|
+
};
|
|
36
|
+
export const censusClassStaticFieldSlots = (bodies, classes) => {
|
|
37
|
+
const byDeclaration = new Map();
|
|
38
|
+
const conflicts = new Set();
|
|
39
|
+
const declaredFields = new Set();
|
|
40
|
+
for (const [declaration, layout] of classes) {
|
|
41
|
+
// Keyed by the storage owner, which for one physical layout of a generic
|
|
42
|
+
// is the root every layout shares; the layouts carry identical static
|
|
43
|
+
// members, so the repeats agree by construction.
|
|
44
|
+
const owner = staticStorageOwnerOf(classes, declaration);
|
|
45
|
+
for (const field of layout.staticFields) {
|
|
46
|
+
if (field.representation === null || field.representation.kind === 'unresolved' || field.representation.kind === 'void')
|
|
47
|
+
continue;
|
|
48
|
+
const perClass = byDeclaration.get(owner) ?? new Map();
|
|
49
|
+
byDeclaration.set(owner, perClass);
|
|
50
|
+
perClass.set(field.key, field.representation);
|
|
51
|
+
declaredFields.add(`${owner}.${field.key}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
for (const body of bodies) {
|
|
55
|
+
// Whole-body first pass: a `constant` operation feeding a later block's
|
|
56
|
+
// key is exactly as legitimate as one in the same block, and a single
|
|
57
|
+
// forward-only scan would miss it across a back edge.
|
|
58
|
+
const constants = new Map();
|
|
59
|
+
for (const blockId of body.blockOrder) {
|
|
60
|
+
const block = body.blocks.get(blockId);
|
|
61
|
+
if (!block)
|
|
62
|
+
continue;
|
|
63
|
+
for (const operation of block.operations)
|
|
64
|
+
if (operation.kind === 'constant')
|
|
65
|
+
constants.set(operation.result.id, operation.text);
|
|
66
|
+
}
|
|
67
|
+
for (const blockId of body.blockOrder) {
|
|
68
|
+
const block = body.blocks.get(blockId);
|
|
69
|
+
if (!block)
|
|
70
|
+
continue;
|
|
71
|
+
for (const operation of block.operations) {
|
|
72
|
+
if (operation.kind !== 'set' && operation.kind !== 'define-own-property')
|
|
73
|
+
continue;
|
|
74
|
+
const receiver = operation.receiver.representation;
|
|
75
|
+
if (receiver.kind !== 'constructor-family')
|
|
76
|
+
continue;
|
|
77
|
+
const key = constants.get(operation.key.value);
|
|
78
|
+
if (key === undefined)
|
|
79
|
+
continue;
|
|
80
|
+
const declaration = staticFieldOwnerOf(classes, receiver.members, key);
|
|
81
|
+
if (declaration === undefined)
|
|
82
|
+
continue;
|
|
83
|
+
const representation = operation.value.representation;
|
|
84
|
+
const perClass = byDeclaration.get(declaration) ?? new Map();
|
|
85
|
+
byDeclaration.set(declaration, perClass);
|
|
86
|
+
const existing = perClass.get(key);
|
|
87
|
+
const conflictId = `${declaration}.${key}`;
|
|
88
|
+
if (conflicts.has(conflictId))
|
|
89
|
+
continue;
|
|
90
|
+
if (existing !== undefined) {
|
|
91
|
+
// A declared field's own carrier is the storage authority. Each
|
|
92
|
+
// write is converted against it by the property emitter; differing
|
|
93
|
+
// source carriers such as `Uint8Array` stored into
|
|
94
|
+
// `Uint8Array | null` are expected and do not redefine the cell.
|
|
95
|
+
if (declaredFields.has(conflictId))
|
|
96
|
+
continue;
|
|
97
|
+
if (representationKey(existing) === representationKey(representation))
|
|
98
|
+
continue;
|
|
99
|
+
perClass.delete(key);
|
|
100
|
+
conflicts.add(conflictId);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
perClass.set(key, representation);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { slots: byDeclaration, conflicts: [...conflicts] };
|
|
108
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CallableAbi, Representation } from '../representation/model.js';
|
|
2
|
+
import type { ClassLayout } from '../projection/classes.js';
|
|
3
|
+
import type { ConstructOperation, IrBody } from './model.js';
|
|
4
|
+
import type { ConversionCensus } from '../conversion/nodes.js';
|
|
5
|
+
/** The allocation owns the receiver; explicit arguments and result use its construct ABI. */
|
|
6
|
+
export declare const constructMatchesAbi: (operation: ConstructOperation, abi: CallableAbi, conversions?: Pick<ConversionCensus, "nodeById">) => boolean;
|
|
7
|
+
/** The class allocation supplies this receiver before entering the source constructor. */
|
|
8
|
+
export declare const classConstructorBodyMatches: (layout: ClassLayout, body: IrBody) => boolean;
|
|
9
|
+
/** The native ordinary construct thunk allocates its receiver and forwards
|
|
10
|
+
* the construct frame into the source body. An explicit return needs its own
|
|
11
|
+
* entry proof. A void body or an authenticated return of this preserves the
|
|
12
|
+
* allocated receiver; a matching return type alone does not prove identity. */
|
|
13
|
+
export declare const ordinaryConstructBodyMatches: (operation: ConstructOperation, body: Pick<IrBody, "sourceOwner" | "abi" | "construct" | "blocks">, conversions?: Pick<ConversionCensus, "nodeById">) => boolean;
|
|
14
|
+
/** Allocation and body entry must share one native receiver representation.
|
|
15
|
+
* Both provenance and the construct thunk consume this same admission. */
|
|
16
|
+
export declare const nativeOrdinaryConstructInstanceMatches: (abi: CallableAbi, instance: Representation) => instance is Extract<Representation, {
|
|
17
|
+
kind: "record" | "record-with-index" | "native-record-ref";
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Publish the call entry used by a receiver-free ordinary constructor that
|
|
21
|
+
* always returns an object. The semantic target authenticates [[Construct]];
|
|
22
|
+
* the carrier alone cannot distinguish ordinary functions from arrows. Both
|
|
23
|
+
* the body and the held closure must agree on the entry convention. Keeping
|
|
24
|
+
* the invocation indirect preserves the actual closure's captures.
|
|
25
|
+
*/
|
|
26
|
+
export declare const explicitObjectConstructEntryOf: (operation: ConstructOperation, bodyAbi: CallableAbi | null) => ConstructOperation["entry"];
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { abiKey, representationKey } from '../representation/model.js';
|
|
2
|
+
import { nativeArgumentsMatch } from './call-entry.js';
|
|
3
|
+
/** The allocation owns the receiver; explicit arguments and result use its construct ABI. */
|
|
4
|
+
export const constructMatchesAbi = (operation, abi, conversions) => abi.receiver === null &&
|
|
5
|
+
representationKey(operation.result.representation) === representationKey(abi.result) &&
|
|
6
|
+
nativeArgumentsMatch(abi, operation.arguments, conversions);
|
|
7
|
+
/** The class allocation supplies this receiver before entering the source constructor. */
|
|
8
|
+
export const classConstructorBodyMatches = (layout, body) => {
|
|
9
|
+
const abi = body.abi;
|
|
10
|
+
const construct = layout.construct;
|
|
11
|
+
return (abi !== null &&
|
|
12
|
+
abi.result.kind === 'void' &&
|
|
13
|
+
layout.instance !== null &&
|
|
14
|
+
abi.receiver !== null &&
|
|
15
|
+
representationKey(abi.receiver) === representationKey(layout.instance) &&
|
|
16
|
+
construct !== null &&
|
|
17
|
+
construct.receiver === null &&
|
|
18
|
+
abi.restFrom === construct.restFrom &&
|
|
19
|
+
abi.parameters.length === construct.parameters.length &&
|
|
20
|
+
abi.parameters.every((parameter, index) => representationKey(parameter.value) === representationKey(construct.parameters[index].value)));
|
|
21
|
+
};
|
|
22
|
+
/** The native ordinary construct thunk allocates its receiver and forwards
|
|
23
|
+
* the construct frame into the source body. An explicit return needs its own
|
|
24
|
+
* entry proof. A void body or an authenticated return of this preserves the
|
|
25
|
+
* allocated receiver; a matching return type alone does not prove identity. */
|
|
26
|
+
export const ordinaryConstructBodyMatches = (operation, body, conversions) => {
|
|
27
|
+
const { abi, construct } = body;
|
|
28
|
+
const callee = operation.callee.representation;
|
|
29
|
+
const target = operation.target;
|
|
30
|
+
if (abi === null ||
|
|
31
|
+
construct === null ||
|
|
32
|
+
callee.kind !== 'function-and-constructor' ||
|
|
33
|
+
operation.callee.value !== operation.newTarget.value ||
|
|
34
|
+
target.kind !== 'exact' ||
|
|
35
|
+
target.target.kind !== 'function' ||
|
|
36
|
+
!target.target.constructable ||
|
|
37
|
+
target.target.functionId !== body.sourceOwner ||
|
|
38
|
+
abiKey(callee.call) !== abiKey(abi) ||
|
|
39
|
+
abiKey(callee.construct) !== abiKey(construct) ||
|
|
40
|
+
abiKey({ ...abi, receiver: null, result: construct.result }) !== abiKey(construct) ||
|
|
41
|
+
!constructMatchesAbi(operation, construct, conversions))
|
|
42
|
+
return false;
|
|
43
|
+
if (abi.result.kind !== 'void') {
|
|
44
|
+
if (abi.receiver === null || representationKey(abi.result) !== representationKey(abi.receiver))
|
|
45
|
+
return false;
|
|
46
|
+
const receivers = new Set([...body.blocks.values()].flatMap((block) => block.operations.flatMap((operation) => (operation.kind === 'receiver' ? [operation.result.id] : []))));
|
|
47
|
+
const returns = [...body.blocks.values()].flatMap((block) => (block.terminator.kind === 'return' ? [block.terminator] : []));
|
|
48
|
+
if (returns.length === 0 || returns.some((operation) => operation.value === null || !receivers.has(operation.value.value)))
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
return nativeOrdinaryConstructInstanceMatches(abi, construct.result);
|
|
52
|
+
};
|
|
53
|
+
/** Allocation and body entry must share one native receiver representation.
|
|
54
|
+
* Both provenance and the construct thunk consume this same admission. */
|
|
55
|
+
export const nativeOrdinaryConstructInstanceMatches = (abi, instance) => {
|
|
56
|
+
return ((instance.kind === 'record' || instance.kind === 'record-with-index' || instance.kind === 'native-record-ref') &&
|
|
57
|
+
(instance.ownership === 'owned' || instance.ownership === 'shared-refcount') &&
|
|
58
|
+
(abi.receiver === null || representationKey(abi.receiver) === representationKey(instance)));
|
|
59
|
+
};
|
|
60
|
+
/** ECMA-262 ordinary [[Construct]] uses an explicit Object return instead of its receiver. */
|
|
61
|
+
const alwaysReturnsObject = (representation) => {
|
|
62
|
+
switch (representation.kind) {
|
|
63
|
+
case 'array-buffer':
|
|
64
|
+
case 'shared-array-buffer':
|
|
65
|
+
case 'array-object':
|
|
66
|
+
case 'class-ref':
|
|
67
|
+
case 'constructor-family':
|
|
68
|
+
case 'constructor-value-dispatch':
|
|
69
|
+
case 'data-view':
|
|
70
|
+
case 'dense-buffer':
|
|
71
|
+
case 'dictionary':
|
|
72
|
+
case 'function':
|
|
73
|
+
case 'function-and-constructor':
|
|
74
|
+
case 'function-family':
|
|
75
|
+
case 'function-value-dispatch':
|
|
76
|
+
case 'generic-function-set':
|
|
77
|
+
case 'iterator':
|
|
78
|
+
case 'keyed-collection':
|
|
79
|
+
case 'native-handle':
|
|
80
|
+
case 'native-record-ref':
|
|
81
|
+
case 'native-sequence':
|
|
82
|
+
case 'promise':
|
|
83
|
+
case 'proxy-object':
|
|
84
|
+
case 'record':
|
|
85
|
+
case 'record-with-index':
|
|
86
|
+
case 'typed-array':
|
|
87
|
+
return true;
|
|
88
|
+
case 'function-value-family':
|
|
89
|
+
return !representation.optional;
|
|
90
|
+
case 'tagged-union':
|
|
91
|
+
return representation.arms.length > 0 && representation.arms.every((arm) => alwaysReturnsObject(arm.value));
|
|
92
|
+
default:
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Publish the call entry used by a receiver-free ordinary constructor that
|
|
98
|
+
* always returns an object. The semantic target authenticates [[Construct]];
|
|
99
|
+
* the carrier alone cannot distinguish ordinary functions from arrows. Both
|
|
100
|
+
* the body and the held closure must agree on the entry convention. Keeping
|
|
101
|
+
* the invocation indirect preserves the actual closure's captures.
|
|
102
|
+
*/
|
|
103
|
+
export const explicitObjectConstructEntryOf = (operation, bodyAbi) => {
|
|
104
|
+
const callee = operation.callee.representation;
|
|
105
|
+
const target = operation.target;
|
|
106
|
+
if (operation.newTarget.value !== operation.callee.value ||
|
|
107
|
+
callee.kind !== 'function-value-dispatch' ||
|
|
108
|
+
target.kind !== 'exact' ||
|
|
109
|
+
target.target.kind !== 'function' ||
|
|
110
|
+
!target.target.constructable ||
|
|
111
|
+
bodyAbi === null ||
|
|
112
|
+
callee.abi.receiver !== null ||
|
|
113
|
+
!alwaysReturnsObject(callee.abi.result) ||
|
|
114
|
+
representationKey(callee) !== representationKey({ kind: 'function-value-dispatch', abi: bodyAbi }))
|
|
115
|
+
return undefined;
|
|
116
|
+
return { kind: 'explicit-object-return', functionId: target.target.functionId, abi: bodyAbi };
|
|
117
|
+
};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { IrValueId } from '../identity/ids.js';
|
|
2
|
+
import type { ConstructOperation, GetOperation, IrBody, IrNonTerminatorOperation } from './model.js';
|
|
3
|
+
/**
|
|
4
|
+
* Which results nothing reads, and whose operations may therefore render
|
|
5
|
+
* nothing at all.
|
|
6
|
+
*
|
|
7
|
+
* The IR is three-address form and every producer publishes a result, whether
|
|
8
|
+
* or not the program goes on to read it. A component's render body reads a
|
|
9
|
+
* field the plugin then re-reads through a reactive thunk; a key literal is
|
|
10
|
+
* spelled inline by the member access it keys; a callee that is only ever
|
|
11
|
+
* called by name never needs the function object built for it. Each of those
|
|
12
|
+
* left a statement behind -- `v20 = gea_this->cities;` with no reader,
|
|
13
|
+
* `v13 = "length";`, `v7 = gea::CallableObject<...>{&body, nullptr};` --
|
|
14
|
+
* which the C++ compiler may or may not remove (a `Ref` copy is an atomic
|
|
15
|
+
* increment it may not) and which a reader of the output has to prove dead
|
|
16
|
+
* by hand. `examples/apps/weather` carried 142 unread literal temporaries and
|
|
17
|
+
* 18 unread field reads in one unit.
|
|
18
|
+
*
|
|
19
|
+
* Deletion is a fixed point: an operation whose only reader was itself dead
|
|
20
|
+
* becomes dead in turn, so a chain of pure operations feeding one unread
|
|
21
|
+
* value disappears whole.
|
|
22
|
+
*
|
|
23
|
+
* Only an operation that neither writes nor runs program code may go. The
|
|
24
|
+
* whitelist is by kind, with three exceptions decided per operation:
|
|
25
|
+
*
|
|
26
|
+
* - a `get` is a pure load off an Array, a string, or a record field with no
|
|
27
|
+
* accessor, and a call into the program through an accessor -- the emitter
|
|
28
|
+
* answers which, since it alone knows the receiver's layout;
|
|
29
|
+
* - `compute` and `convert` are arithmetic on primitives and `ToPrimitive`
|
|
30
|
+
* (which runs `valueOf`) on anything else, so they qualify only over
|
|
31
|
+
* primitive operands;
|
|
32
|
+
* - `test` is a comparison, pure on every carrier but the boxed one, where it
|
|
33
|
+
* may reach `valueOf` through loose equality.
|
|
34
|
+
*
|
|
35
|
+
* A `call` reads its callee -- unless the emitter reaches the body by name,
|
|
36
|
+
* in which case the callee's carrier is never spelled. `directCallee` says
|
|
37
|
+
* which producers those are (see `targets/cpp/emit-context.ts`'s
|
|
38
|
+
* `directCallees`), so a function object that exists only to be called
|
|
39
|
+
* directly counts as unread. The name itself is registered up front for
|
|
40
|
+
* every callee `ir/call-dispatch.ts`'s `CallOperation.target` resolved
|
|
41
|
+
* (`emit.ts`'s `emitBody`), independent of whether this producer ends up
|
|
42
|
+
* dead -- what `emit.ts` still has to do where it skips the dead operation is
|
|
43
|
+
* only the handful of side effects genuinely tied to the skipped RENDER
|
|
44
|
+
* itself (a reactive thunk's stashed value, a method read's stashed
|
|
45
|
+
* receiver), never the direct-callee name.
|
|
46
|
+
*/
|
|
47
|
+
export interface DeadValueRules {
|
|
48
|
+
/** Whether this member read is a plain load rather than a call into the program. `key` is the IR's own text for a string-literal key, or `null`. */
|
|
49
|
+
readonly pureGet: (operation: GetOperation, key: string | null) => boolean;
|
|
50
|
+
/** Whether a call through this producer's result reaches the body by name, never spelling the carrier. */
|
|
51
|
+
readonly directCallee: (producer: IrNonTerminatorOperation) => boolean;
|
|
52
|
+
/** Whether a construction through this producer reaches the class constructor by name, never spelling the carrier. */
|
|
53
|
+
readonly directConstructor: (producer: IrNonTerminatorOperation) => boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Whether constructing this operation's result has no consequence anything
|
|
56
|
+
* else can observe -- `ir/instantiation.ts`'s
|
|
57
|
+
* `classesConstructedUnobservably`, asked of the class the result carries.
|
|
58
|
+
*/
|
|
59
|
+
readonly pureConstruct: (operation: ConstructOperation) => boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Whether the body this call reaches never names its receiver, so the
|
|
62
|
+
* receiver operand is not a read of it.
|
|
63
|
+
*
|
|
64
|
+
* A stateless gea component is the case: its render ignores `this`, but the
|
|
65
|
+
* call still has to hand it one, so a `construct` runs to manufacture a
|
|
66
|
+
* receiver nothing looks at. Combined with `pureConstruct`, that whole
|
|
67
|
+
* construction goes. The emitter then spells a default-constructed receiver
|
|
68
|
+
* at the call, because the callee's SIGNATURE still declares the formal --
|
|
69
|
+
* this drops the argument's value, not the parameter.
|
|
70
|
+
*/
|
|
71
|
+
readonly ignoresReceiver: (callee: IrNonTerminatorOperation | undefined) => boolean;
|
|
72
|
+
}
|
|
73
|
+
/** Every string-literal constant's text by value, for member-read purity: a `get` keyed by `"width"` is asked about the member `width`. */
|
|
74
|
+
export declare const stringConstantsOf: (body: IrBody) => ReadonlyMap<IrValueId, string>;
|
|
75
|
+
/** Every boolean-literal constant by value, so a branch on one renders as the jump it is. */
|
|
76
|
+
export declare const booleanConstantsOf: (body: IrBody) => ReadonlyMap<IrValueId, boolean>;
|
|
77
|
+
/**
|
|
78
|
+
* Results no later operation or terminator reads, including effectful
|
|
79
|
+
* producers whose operation must remain.
|
|
80
|
+
*
|
|
81
|
+
* `deadValuesOf` is deliberately narrower: it identifies whole operations
|
|
82
|
+
* the emitter may delete. A call with an unread result is different. The call
|
|
83
|
+
* still runs, but assigning its return value into a temporary pays carrier
|
|
84
|
+
* work that the source program never observes (a returned `Ref`, for example,
|
|
85
|
+
* performs reference-count traffic). Keeping this census separate prevents
|
|
86
|
+
* an effectful operation from ever being mistaken for a deletable one while
|
|
87
|
+
* still letting its backend discard the C++ return value directly.
|
|
88
|
+
*/
|
|
89
|
+
export declare const unreadValuesOf: (body: IrBody) => ReadonlySet<IrValueId>;
|
|
90
|
+
export declare const deadValuesOf: (body: IrBody, rules: DeadValueRules) => ReadonlySet<IrValueId>;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { arrayAllocationDrainsDynamicIterator, operandsOfIrOperation, resultOfIrOperation } from './queries.js';
|
|
2
|
+
const alwaysPureKinds = new Set([
|
|
3
|
+
'constant',
|
|
4
|
+
'binding-read',
|
|
5
|
+
'parameter',
|
|
6
|
+
'receiver',
|
|
7
|
+
'has-property',
|
|
8
|
+
'allocate-callable',
|
|
9
|
+
'allocate-constructor',
|
|
10
|
+
'phi'
|
|
11
|
+
]);
|
|
12
|
+
const primitiveKinds = new Set(['scalar', 'string', 'null', 'undefined', 'symbol']);
|
|
13
|
+
const isPrimitive = (operand) => primitiveKinds.has(operand.representation.kind);
|
|
14
|
+
const isEffectFree = (operation, rules, keyTextOf) => {
|
|
15
|
+
if (alwaysPureKinds.has(operation.kind))
|
|
16
|
+
return true;
|
|
17
|
+
// A `gather` element drains a genuinely dynamic iterator, which can invoke
|
|
18
|
+
// a user-defined method -- see `queries.ts`'s
|
|
19
|
+
// `arrayAllocationDrainsDynamicIterator`. An ordinary literal or a native
|
|
20
|
+
// `spread` range-copy stays pure; only that one arm is not "read nothing,
|
|
21
|
+
// run nothing" the way this operation is for every other array shape.
|
|
22
|
+
if (operation.kind === 'allocate-array-object')
|
|
23
|
+
return !arrayAllocationDrainsDynamicIterator(operation);
|
|
24
|
+
if (operation.kind === 'get')
|
|
25
|
+
return rules.pureGet(operation, keyTextOf(operation.key));
|
|
26
|
+
if (operation.kind === 'compute' &&
|
|
27
|
+
(operation.form === 'require-object-coercible' ||
|
|
28
|
+
operation.form === 'require-iterable-present' ||
|
|
29
|
+
operation.form === 'require-tagged-union-arm'))
|
|
30
|
+
return false;
|
|
31
|
+
if (operation.kind === 'compute' || operation.kind === 'convert')
|
|
32
|
+
return operandsOfIrOperation(operation).every(isPrimitive);
|
|
33
|
+
if (operation.kind === 'test')
|
|
34
|
+
return operandsOfIrOperation(operation).every((operand) => operand.representation.kind !== 'dynamic');
|
|
35
|
+
if (operation.kind === 'construct')
|
|
36
|
+
return rules.pureConstruct(operation);
|
|
37
|
+
return false;
|
|
38
|
+
};
|
|
39
|
+
/** Every string-literal constant's text by value, for member-read purity: a `get` keyed by `"width"` is asked about the member `width`. */
|
|
40
|
+
export const stringConstantsOf = (body) => {
|
|
41
|
+
const texts = new Map();
|
|
42
|
+
for (const block of body.blocks.values()) {
|
|
43
|
+
for (const operation of block.operations) {
|
|
44
|
+
if (operation.kind === 'constant' && operation.literal === 'string')
|
|
45
|
+
texts.set(operation.result.id, operation.text);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return texts;
|
|
49
|
+
};
|
|
50
|
+
/** Every boolean-literal constant by value, so a branch on one renders as the jump it is. */
|
|
51
|
+
export const booleanConstantsOf = (body) => {
|
|
52
|
+
const known = new Map();
|
|
53
|
+
for (const block of body.blocks.values()) {
|
|
54
|
+
for (const operation of block.operations) {
|
|
55
|
+
if (operation.kind === 'constant' && operation.literal === 'boolean')
|
|
56
|
+
known.set(operation.result.id, operation.text === 'true');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return known;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Results no later operation or terminator reads, including effectful
|
|
63
|
+
* producers whose operation must remain.
|
|
64
|
+
*
|
|
65
|
+
* `deadValuesOf` is deliberately narrower: it identifies whole operations
|
|
66
|
+
* the emitter may delete. A call with an unread result is different. The call
|
|
67
|
+
* still runs, but assigning its return value into a temporary pays carrier
|
|
68
|
+
* work that the source program never observes (a returned `Ref`, for example,
|
|
69
|
+
* performs reference-count traffic). Keeping this census separate prevents
|
|
70
|
+
* an effectful operation from ever being mistaken for a deletable one while
|
|
71
|
+
* still letting its backend discard the C++ return value directly.
|
|
72
|
+
*/
|
|
73
|
+
export const unreadValuesOf = (body) => {
|
|
74
|
+
const produced = new Set();
|
|
75
|
+
const read = new Set();
|
|
76
|
+
for (const block of body.blocks.values()) {
|
|
77
|
+
for (const operation of block.operations) {
|
|
78
|
+
const result = resultOfIrOperation(operation);
|
|
79
|
+
if (result !== null)
|
|
80
|
+
produced.add(result.id);
|
|
81
|
+
for (const operand of operandsOfIrOperation(operation))
|
|
82
|
+
read.add(operand.value);
|
|
83
|
+
}
|
|
84
|
+
for (const operand of operandsOfIrOperation(block.terminator))
|
|
85
|
+
read.add(operand.value);
|
|
86
|
+
}
|
|
87
|
+
for (const region of body.iteratorCloseRegions ?? [])
|
|
88
|
+
read.add(region.iterator.value);
|
|
89
|
+
return new Set([...produced].filter((value) => !read.has(value)));
|
|
90
|
+
};
|
|
91
|
+
export const deadValuesOf = (body, rules) => {
|
|
92
|
+
const producers = new Map();
|
|
93
|
+
const readers = new Map();
|
|
94
|
+
const count = (value, by) => {
|
|
95
|
+
readers.set(value, (readers.get(value) ?? 0) + by);
|
|
96
|
+
};
|
|
97
|
+
// A call/construct's callee is read by the operation -- except when the body
|
|
98
|
+
// is reached by name, in which case the carrier is never spelled and its
|
|
99
|
+
// producer is as unread as if the invocation were not there. Guarded on the
|
|
100
|
+
// operand being non-optional: `f?.()` unwraps an `Optional` first, and the
|
|
101
|
+
// call site spells THAT value, not the one the producer published.
|
|
102
|
+
const readsOf = (operation) => {
|
|
103
|
+
const operands = operandsOfIrOperation(operation);
|
|
104
|
+
if (operation.kind === 'construct') {
|
|
105
|
+
const producer = producers.get(operation.callee.value);
|
|
106
|
+
if (operation.callee.representation.kind !== 'optional' && producer !== undefined && rules.directConstructor(producer)) {
|
|
107
|
+
// An ordinary `new C()` publishes C as both [[Construct]]'s callee and
|
|
108
|
+
// its newTarget. The named constructor path spells neither carrier;
|
|
109
|
+
// filtering by value drops both roles when they are that same value,
|
|
110
|
+
// while a distinct Reflect.construct newTarget remains a real read.
|
|
111
|
+
return operands.filter((operand) => operand.value !== operation.callee.value);
|
|
112
|
+
}
|
|
113
|
+
return operands;
|
|
114
|
+
}
|
|
115
|
+
if (operation.kind !== 'call')
|
|
116
|
+
return operands;
|
|
117
|
+
const producer = producers.get(operation.callee.value);
|
|
118
|
+
const ignored = new Set();
|
|
119
|
+
// The callee is read unless the body is reached by name. Guarded on the
|
|
120
|
+
// operand being the callee itself: `f?.()` unwraps an `Optional` first, and
|
|
121
|
+
// the call site spells THAT value, not the one the producer published.
|
|
122
|
+
// A producer may name a body directly while a later conversion exposes it
|
|
123
|
+
// as a boxed dynamic callable. That call necessarily reads the box through
|
|
124
|
+
// `callAsFunction`; deleting the producer under the direct-body rule leaves
|
|
125
|
+
// the emitter with a real callee use and no definition. The callable's
|
|
126
|
+
// carrier at THIS call site decides whether the value is spelled.
|
|
127
|
+
if (operation.callee.representation.kind !== 'optional' &&
|
|
128
|
+
operation.callee.representation.kind !== 'dynamic' &&
|
|
129
|
+
producer !== undefined &&
|
|
130
|
+
rules.directCallee(producer))
|
|
131
|
+
ignored.add(operation.callee);
|
|
132
|
+
if (operation.receiver !== null && rules.ignoresReceiver(producer))
|
|
133
|
+
ignored.add(operation.receiver);
|
|
134
|
+
if (ignored.size === 0)
|
|
135
|
+
return operands;
|
|
136
|
+
return operands.filter((operand) => !ignored.has(operand));
|
|
137
|
+
};
|
|
138
|
+
for (const block of body.blocks.values()) {
|
|
139
|
+
for (const operation of block.operations) {
|
|
140
|
+
const result = resultOfIrOperation(operation);
|
|
141
|
+
if (result !== null)
|
|
142
|
+
producers.set(result.id, operation);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
for (const block of body.blocks.values()) {
|
|
146
|
+
for (const operation of block.operations)
|
|
147
|
+
for (const operand of readsOf(operation))
|
|
148
|
+
count(operand.value, 1);
|
|
149
|
+
for (const operand of operandsOfIrOperation(block.terminator))
|
|
150
|
+
count(operand.value, 1);
|
|
151
|
+
}
|
|
152
|
+
for (const region of body.iteratorCloseRegions ?? [])
|
|
153
|
+
count(region.iterator.value, 1);
|
|
154
|
+
const strings = stringConstantsOf(body);
|
|
155
|
+
const keyTextOf = (operand) => strings.get(operand.value) ?? null;
|
|
156
|
+
const pure = (value) => {
|
|
157
|
+
const producer = producers.get(value);
|
|
158
|
+
return producer !== undefined && isEffectFree(producer, rules, keyTextOf);
|
|
159
|
+
};
|
|
160
|
+
const dead = new Set();
|
|
161
|
+
const pending = [...producers.keys()].filter((value) => (readers.get(value) ?? 0) === 0 && pure(value));
|
|
162
|
+
while (pending.length > 0) {
|
|
163
|
+
const value = pending.pop();
|
|
164
|
+
if (value === undefined || dead.has(value))
|
|
165
|
+
continue;
|
|
166
|
+
dead.add(value);
|
|
167
|
+
const producer = producers.get(value);
|
|
168
|
+
if (producer === undefined)
|
|
169
|
+
continue;
|
|
170
|
+
for (const operand of readsOf(producer)) {
|
|
171
|
+
// A direct class-method read is deleted as a materialized callable, but
|
|
172
|
+
// its receiver is retained beside the result for the later direct call.
|
|
173
|
+
// The call therefore still reads this operand even though it does not
|
|
174
|
+
// read the method carrier. Decrementing it here can delete the receiver
|
|
175
|
+
// and leave the direct call naming an SSA value with no definition.
|
|
176
|
+
if (producer.kind === 'get' && rules.directCallee(producer) && operand === producer.receiver)
|
|
177
|
+
continue;
|
|
178
|
+
count(operand.value, -1);
|
|
179
|
+
if (readers.get(operand.value) === 0 && pure(operand.value))
|
|
180
|
+
pending.push(operand.value);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return dead;
|
|
184
|
+
};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { DeclarationId, IrValueId } from '../identity/ids.js';
|
|
2
|
+
import type { BindingReadOperation, BindingWriteOperation, CallOperation, ConstructOperation, GetOperation, IrBody, IrOperand, ReturnOperation, SetOperation } from './model.js';
|
|
3
|
+
/**
|
|
4
|
+
* The consumers a forwarded call may land in. Every one of them is audited to
|
|
5
|
+
* spell the forwarded operand ONCE per executed path -- an operand a renderer
|
|
6
|
+
* spells twice would run the call twice -- and the target's policy narrows
|
|
7
|
+
* each further to the renderings it can vouch for (`ForwardingPolicy`).
|
|
8
|
+
*/
|
|
9
|
+
export type CallSink = CallOperation | ConstructOperation | SetOperation | BindingWriteOperation | ReturnOperation;
|
|
10
|
+
/**
|
|
11
|
+
* What only the target can answer about a forwarding: which of its renderers
|
|
12
|
+
* spell an operand exactly once, and which cells are private enough to lose.
|
|
13
|
+
*/
|
|
14
|
+
export interface ForwardingPolicy {
|
|
15
|
+
/**
|
|
16
|
+
* Whether the target's rendering of `consumer` spells `value` exactly once
|
|
17
|
+
* on every path, with no conversion that could spell it again. The census
|
|
18
|
+
* has already established that `value` is the consumer's argument, stored
|
|
19
|
+
* element, written value or returned value, that nothing sits between the
|
|
20
|
+
* two, and -- for an Array element store -- that the element carrier is the
|
|
21
|
+
* value's own.
|
|
22
|
+
*/
|
|
23
|
+
readonly forwardsCallInto: (consumer: CallSink, value: IrOperand) => boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Whether `write`'s cell is a private local of this body -- unboxed,
|
|
26
|
+
* captured by nothing, holding exactly the carrier both the write and
|
|
27
|
+
* `read` carry -- so that the one write may render nothing and the one
|
|
28
|
+
* read may spell the written value. Integer-narrowed and type-query cells
|
|
29
|
+
* are excluded by the census itself, which owns both of those facts.
|
|
30
|
+
*/
|
|
31
|
+
readonly forwardsBinding: (write: BindingWriteOperation, read: BindingReadOperation) => boolean;
|
|
32
|
+
}
|
|
33
|
+
export declare const noForwarding: ForwardingPolicy;
|
|
34
|
+
/** A cell whose one write renders nothing and whose one read spells `value` instead: see `deferrableValuesOf`. */
|
|
35
|
+
export interface ForwardedBinding {
|
|
36
|
+
readonly value: IrOperand;
|
|
37
|
+
readonly read: IrValueId;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Which values may render at their single use instead of into a temporary of
|
|
41
|
+
* their own.
|
|
42
|
+
*
|
|
43
|
+
* The IR is three-address form, and for a `double` that costs nothing: the C++
|
|
44
|
+
* compiler propagates the copy away. For a `std::shared_ptr` it is an atomic
|
|
45
|
+
* increment and a matching decrement, and for a `std::string` it is a heap
|
|
46
|
+
* allocation -- neither of which any optimizer may remove, because both are
|
|
47
|
+
* observable through the refcount and the allocator. An array indexed in a
|
|
48
|
+
* loop was paying one atomic pair per iteration purely to name the array the
|
|
49
|
+
* cell was already holding.
|
|
50
|
+
*
|
|
51
|
+
* Four conditions, and each one is load-bearing. Compound sum conversions
|
|
52
|
+
* additionally retain their named result to bound composition of projections:
|
|
53
|
+
*
|
|
54
|
+
* 1. exactly one use, so the expression is not evaluated twice;
|
|
55
|
+
* 2. that use in the same block, so no `goto` can reach the use without
|
|
56
|
+
* passing the definition;
|
|
57
|
+
* 3. the defining operation side-effect-free (`isDeferrableOperation`); and
|
|
58
|
+
* 4. every operation between the two also deferred.
|
|
59
|
+
*
|
|
60
|
+
* (4) is what makes (3) sufficient. Everything between the definition and the
|
|
61
|
+
* use emitted no statement of its own, so the window contains no write at all
|
|
62
|
+
* -- which is why the order these reads end up in inside the use's own
|
|
63
|
+
* expression, which C++ leaves unspecified for most operators, cannot be
|
|
64
|
+
* observed by the program.
|
|
65
|
+
*
|
|
66
|
+
* Two forwardings ride on the same census, each with a narrower proof:
|
|
67
|
+
*
|
|
68
|
+
* - a `call`, `construct` or `allocate-callable` result whose single reader
|
|
69
|
+
* is the IMMEDIATELY following operation (`forwardableProducerKinds`,
|
|
70
|
+
* `callSinkOf`): no window, so nothing is crossed, and the producer keeps
|
|
71
|
+
* bounding everyone else's windows;
|
|
72
|
+
* - a cell written once and read once in one block, the read itself
|
|
73
|
+
* deferrable, every operation between the two effect-free, and the read
|
|
74
|
+
* consumed where it is copied or called rather than borrowed
|
|
75
|
+
* (`forwardedReadPositionAllowed`): the write renders nothing and the read
|
|
76
|
+
* spells the written value (`forwardedBindings`).
|
|
77
|
+
*
|
|
78
|
+
* The target's `ForwardingPolicy` has the last word on both, because both
|
|
79
|
+
* depend on how a renderer spells its operand and on whose storage a cell is.
|
|
80
|
+
*
|
|
81
|
+
* A use recorded for a merge (`phi`) belongs to the PREDECESSOR block at the
|
|
82
|
+
* position `emitBody` writes merges at -- after that block's operations and
|
|
83
|
+
* before its terminator -- not to the block the phi is written in. Recording
|
|
84
|
+
* it where the phi sits would let a value move across the whole block.
|
|
85
|
+
*/
|
|
86
|
+
/**
|
|
87
|
+
* `pureGet` widens the `get` rule past Arrays and strings to whatever the
|
|
88
|
+
* emitter can prove is a plain field load (`emit-properties.ts`'s
|
|
89
|
+
* `isPlainMemberRead`): `v20 = gea_this->cities; if (b0 < v20->length())`
|
|
90
|
+
* is a `Ref` copy -- an atomic pair -- made only to name the field once, and
|
|
91
|
+
* with the read deferred the comparison spells the field itself. The default
|
|
92
|
+
* refuses every such read, which is the answer the census gave before it was
|
|
93
|
+
* asked.
|
|
94
|
+
*/
|
|
95
|
+
export declare const deferrableValuesOf: (body: IrBody, pureGet?: (operation: GetOperation) => boolean, forwarding?: ForwardingPolicy) => {
|
|
96
|
+
readonly values: Set<IrValueId>;
|
|
97
|
+
readonly consumedByCall: Set<IrValueId>;
|
|
98
|
+
readonly forwardedBindings: Map<DeclarationId, ForwardedBinding>;
|
|
99
|
+
};
|