@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,687 @@
|
|
|
1
|
+
import { operationOfResult } from '../identity/ids.js';
|
|
2
|
+
import { operandOf, resultOf } from '../semantics/model/operands.js';
|
|
3
|
+
/**
|
|
4
|
+
* Shared owner-grouping, ordering, and lookup primitives for IR lowering.
|
|
5
|
+
*
|
|
6
|
+
* `lowerToIr` must abort one owner without harming another, so every failure
|
|
7
|
+
* here is thrown as `IrLoweringBlockedError` and caught once, at the single
|
|
8
|
+
* per-owner boundary in `lower.ts`. That keeps every helper a plain function
|
|
9
|
+
* that either returns an answer or fails closed -- never a `Result` type
|
|
10
|
+
* threaded through a dozen call sites, and never a silent partial answer.
|
|
11
|
+
*/
|
|
12
|
+
/** Thrown to abort lowering of exactly one owner. The message states the missing capability, never a source site. */
|
|
13
|
+
export class IrLoweringBlockedError extends Error {
|
|
14
|
+
constructor(reason) {
|
|
15
|
+
super(reason);
|
|
16
|
+
this.name = 'IrLoweringBlockedError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export const callerOwner = (caller) => (caller.kind === 'function' ? caller.functionId : caller.regionId);
|
|
20
|
+
/** Every operation, bucketed by the owner that executes it. One bucket becomes one `IrBody`. */
|
|
21
|
+
export const groupOperationsByOwner = (graph) => {
|
|
22
|
+
const groups = new Map();
|
|
23
|
+
for (const [id, operation] of graph.operations) {
|
|
24
|
+
const owner = callerOwner(operation.caller);
|
|
25
|
+
const bucket = groups.get(owner);
|
|
26
|
+
if (bucket)
|
|
27
|
+
bucket.push(id);
|
|
28
|
+
else
|
|
29
|
+
groups.set(owner, [id]);
|
|
30
|
+
}
|
|
31
|
+
return groups;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* The result role an IR operation's `lineage` cites for a semantic operation
|
|
35
|
+
* with several published results.
|
|
36
|
+
*
|
|
37
|
+
* `value` is preferred because it is what a consumer most often needs to
|
|
38
|
+
* resolve; the rest follow `resultRoles` order as a deterministic fallback so
|
|
39
|
+
* two lowerings of the same operation always pick the same anchor.
|
|
40
|
+
*/
|
|
41
|
+
const anchorRolePriority = ['value', 'completion', 'reference', 'iterator-record', 'short-circuit'];
|
|
42
|
+
/**
|
|
43
|
+
* The published result an operation's own IR lowering cites as `lineage`.
|
|
44
|
+
*
|
|
45
|
+
* `null` when the operation published no result at all. That is a real gap
|
|
46
|
+
* between the semantic model (a step may publish nothing) and the IR model
|
|
47
|
+
* (`IrOperationBase.lineage` is mandatory): lowering cannot invent a
|
|
48
|
+
* `SemanticResultId` the operation never published without becoming a second,
|
|
49
|
+
* competing authority over what that operation's identity is, so the caller
|
|
50
|
+
* must fail closed instead.
|
|
51
|
+
*/
|
|
52
|
+
export const anchorResultOf = (operation) => {
|
|
53
|
+
for (const role of anchorRolePriority) {
|
|
54
|
+
const found = operation.results.find((result) => result.role === role);
|
|
55
|
+
if (found)
|
|
56
|
+
return found.id;
|
|
57
|
+
}
|
|
58
|
+
return operation.results[0]?.id ?? null;
|
|
59
|
+
};
|
|
60
|
+
/** The one authoritative carrier for a published result, or a thrown blocker naming why it cannot materialize. */
|
|
61
|
+
export const requireRepresentation = (plan, result, describe) => {
|
|
62
|
+
const representation = plan.selected.get(result);
|
|
63
|
+
if (!representation)
|
|
64
|
+
throw new IrLoweringBlockedError(`${describe} has no carrier selected in the sealed representation plan`);
|
|
65
|
+
if (representation.kind === 'unresolved') {
|
|
66
|
+
throw new IrLoweringBlockedError(`${describe} selected an unresolved carrier: ${representation.reason}`);
|
|
67
|
+
}
|
|
68
|
+
return representation;
|
|
69
|
+
};
|
|
70
|
+
export const collectRegionParts = (graph) => {
|
|
71
|
+
const regionParts = new Map();
|
|
72
|
+
for (const edge of graph.edges) {
|
|
73
|
+
if (edge.kind !== 'region')
|
|
74
|
+
continue;
|
|
75
|
+
const key = `${edge.region}|${edge.part}`;
|
|
76
|
+
const bucket = regionParts.get(key);
|
|
77
|
+
if (bucket)
|
|
78
|
+
bucket.push(edge.to);
|
|
79
|
+
else
|
|
80
|
+
regionParts.set(key, [edge.to]);
|
|
81
|
+
}
|
|
82
|
+
return regionParts;
|
|
83
|
+
};
|
|
84
|
+
export const orderOwnerOperations = (graph, operations, membership,
|
|
85
|
+
/**
|
|
86
|
+
* The edges whose target this owner holds, in `graph.edges` order.
|
|
87
|
+
*
|
|
88
|
+
* Every use of the edge table below is a filter that keeps only edges landing
|
|
89
|
+
* inside `operations` -- `addPrecedence` refuses any pair with an endpoint
|
|
90
|
+
* outside `members` -- so passing the owner's own share is the same answer as
|
|
91
|
+
* passing the whole table, reached without walking owners x edges to get it.
|
|
92
|
+
* Order is preserved because the share is dealt in table order.
|
|
93
|
+
*/
|
|
94
|
+
ownerEdges,
|
|
95
|
+
/** The whole program's region-part groups; see `collectRegionParts` for why this one is not split. */
|
|
96
|
+
regionParts) => {
|
|
97
|
+
const members = new Set(operations);
|
|
98
|
+
const indegree = new Map();
|
|
99
|
+
const successors = new Map();
|
|
100
|
+
const predecessors = new Map();
|
|
101
|
+
for (const id of operations) {
|
|
102
|
+
indegree.set(id, 0);
|
|
103
|
+
successors.set(id, new Set());
|
|
104
|
+
predecessors.set(id, new Set());
|
|
105
|
+
}
|
|
106
|
+
const addPrecedence = (before, after) => {
|
|
107
|
+
if (before === after || !members.has(before) || !members.has(after))
|
|
108
|
+
return;
|
|
109
|
+
const bucket = successors.get(before);
|
|
110
|
+
if (!bucket || bucket.has(after))
|
|
111
|
+
return;
|
|
112
|
+
bucket.add(after);
|
|
113
|
+
predecessors.get(after)?.add(before);
|
|
114
|
+
indegree.set(after, (indegree.get(after) ?? 0) + 1);
|
|
115
|
+
};
|
|
116
|
+
for (const id of operations) {
|
|
117
|
+
const operation = graph.operations.get(id);
|
|
118
|
+
if (!operation)
|
|
119
|
+
continue;
|
|
120
|
+
for (const operand of operation.operands) {
|
|
121
|
+
if (operand.source.kind !== 'result')
|
|
122
|
+
continue;
|
|
123
|
+
addPrecedence(operationOfResult(operand.source.result), id);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
for (const edge of ownerEdges) {
|
|
127
|
+
if (edge.kind === 'evaluation' || edge.kind === 'effect')
|
|
128
|
+
addPrecedence(edge.from, edge.to);
|
|
129
|
+
else if (edge.kind === 'conditional')
|
|
130
|
+
addPrecedence(operationOfResult(edge.guard), edge.to);
|
|
131
|
+
// A region's own opening operation (`contributeTry`'s `TryStatement`
|
|
132
|
+
// marker) is not a value the try/catch/finally body's operations consume
|
|
133
|
+
// -- it publishes nothing any operand cites -- so without this it has no
|
|
134
|
+
// precedence forcing it before the body it logically precedes, and
|
|
135
|
+
// census's post-order `evaluationOrdinal` ("children first, then this
|
|
136
|
+
// node") places it *after* instead. Left unordered, `orderOwnerOperations`
|
|
137
|
+
// schedules the whole region body first (contiguity keeps it together and
|
|
138
|
+
// its operations are otherwise ready), then reaches this marker with the
|
|
139
|
+
// scope already closed and the block already terminated -- exactly the
|
|
140
|
+
// same shape a guard's own boolean test avoids via the `'conditional'`
|
|
141
|
+
// case just above, and the identical fix: a real precedence edge, not an
|
|
142
|
+
// ordinal that happens to work out.
|
|
143
|
+
else if (edge.kind === 'region')
|
|
144
|
+
addPrecedence(edge.region, edge.to);
|
|
145
|
+
}
|
|
146
|
+
// A `'catch'` part's own `boundary` operation (`producers/boundary.ts`) --
|
|
147
|
+
// and, when the clause binds a name, the `binding` operation chained off
|
|
148
|
+
// it -- materializes the value entering that specific part, the same role
|
|
149
|
+
// `edge.region` plays for the region as a whole. Nothing else in the group
|
|
150
|
+
// consumes it as an operand (a bindingless catch's boundary publishes no
|
|
151
|
+
// result at all; a bound catch's sibling statements read the *binding*, not
|
|
152
|
+
// the boundary, and only through an ordinary reference, not this list), so
|
|
153
|
+
// without an explicit precedence here it is subject to the identical
|
|
154
|
+
// post-order-ordinal defect `edge.region` needed fixing for above: census
|
|
155
|
+
// orders it after its own part's body, and a body that returns on every
|
|
156
|
+
// path schedules it into an already-closed scope.
|
|
157
|
+
// How many region parts each operation is a member of, so the loop below can
|
|
158
|
+
// tell a group's OWN opener from a boundary that merely sits inside it.
|
|
159
|
+
const partsContaining = new Map();
|
|
160
|
+
for (const members of regionParts.values()) {
|
|
161
|
+
for (const member of members)
|
|
162
|
+
partsContaining.set(member, (partsContaining.get(member) ?? 0) + 1);
|
|
163
|
+
}
|
|
164
|
+
for (const [key, members] of regionParts) {
|
|
165
|
+
// Only a `catch` part is entered through a boundary. A `try` part is
|
|
166
|
+
// entered by falling into it and has no opening operation at all -- and
|
|
167
|
+
// asking for one anyway is what made a NESTED try/catch unlowerable: the
|
|
168
|
+
// gating pass gives an inner catch clause both its own gate and every gate
|
|
169
|
+
// enclosing it, so the inner catch's boundary is a legitimate member of the
|
|
170
|
+
// OUTER try's part, and taking the first boundary found there forced it
|
|
171
|
+
// ahead of the operations that must run before it. The result was a real
|
|
172
|
+
// cycle -- "the evaluation graph for this owner contains a cycle" -- for
|
|
173
|
+
// any `try { try {} catch {} } catch {}`. The key's last segment is the
|
|
174
|
+
// part; see `collectRegionParts` directly above for the format.
|
|
175
|
+
if (!key.endsWith('|catch'))
|
|
176
|
+
continue;
|
|
177
|
+
// The same nesting one level in: a try/catch written INSIDE this catch
|
|
178
|
+
// contributes its own boundary to this group too. The one that opens this
|
|
179
|
+
// group is the one that is in no deeper part -- it belongs to this group
|
|
180
|
+
// plus whatever encloses it, while any nested boundary belongs to all of
|
|
181
|
+
// those and at least one more.
|
|
182
|
+
let opener = null;
|
|
183
|
+
for (const id of members) {
|
|
184
|
+
if (graph.operations.get(id)?.family !== 'boundary')
|
|
185
|
+
continue;
|
|
186
|
+
if (opener === null || (partsContaining.get(id) ?? 0) < (partsContaining.get(opener) ?? 0))
|
|
187
|
+
opener = id;
|
|
188
|
+
}
|
|
189
|
+
if (opener === null)
|
|
190
|
+
continue;
|
|
191
|
+
// The clause's own parameter binding, when it binds a name. The paragraph
|
|
192
|
+
// above says this operation is part of the prologue; it used to leave it
|
|
193
|
+
// out, and the boundary alone is not enough. `catch (caught)` publishes
|
|
194
|
+
// TWO operations -- the boundary that materializes the caught value, and
|
|
195
|
+
// the `binding:initialize` that writes it into `caught`'s cell -- and the
|
|
196
|
+
// handler's own statements read that CELL, through an ordinary
|
|
197
|
+
// `binding:read` whose only operand is a reference. A read cites the
|
|
198
|
+
// reference, never the write, so nothing ordered the write before it, and
|
|
199
|
+
// the census's post-order ordinal ("children first, then this node") puts
|
|
200
|
+
// the CatchClause's own operations after the body it contains. The write
|
|
201
|
+
// was therefore scheduled after the handler's `return`, landing in the
|
|
202
|
+
// region's join block: the handler read an uninitialized cell, and the
|
|
203
|
+
// write itself was emitted outside the `catch` scope where the C++ catch
|
|
204
|
+
// parameter it copies from does not exist. Both halves of that were
|
|
205
|
+
// clang-visible in `test/fixtures/try-catch-bound.ts` ("use of undeclared
|
|
206
|
+
// identifier", plus the bare `return;` the stray block left behind in a
|
|
207
|
+
// `std::string` function) -- and a `typeof` of the caught value certified
|
|
208
|
+
// clean while reading the cell before anything wrote it.
|
|
209
|
+
//
|
|
210
|
+
// Matched by the operand role rather than by family so this stays the same
|
|
211
|
+
// fact the value edge already states: the binding is the operation that
|
|
212
|
+
// takes one of the opener's results AS ITS INITIALIZER. Prologue members
|
|
213
|
+
// are not ordered against each other here -- that value edge already
|
|
214
|
+
// ordered them, and adding the reverse direction would be a cycle.
|
|
215
|
+
const openerResults = new Set((graph.operations.get(opener)?.results ?? []).map((result) => result.id));
|
|
216
|
+
const prologue = members.filter((id) => id === opener ||
|
|
217
|
+
(graph.operations.get(id)?.operands ?? []).some((operand) => operand.role === 'initializer' && operand.source.kind === 'result' && openerResults.has(operand.source.result)));
|
|
218
|
+
const inPrologue = new Set(prologue);
|
|
219
|
+
for (const member of members) {
|
|
220
|
+
if (inPrologue.has(member))
|
|
221
|
+
continue;
|
|
222
|
+
for (const before of prologue)
|
|
223
|
+
addPrecedence(before, member);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// FunctionDeclarationInstantiation creates every direct body-level function
|
|
227
|
+
// binding after parameter initialization and before the first executable
|
|
228
|
+
// body statement. A source-order tie-break cannot express that phase: a
|
|
229
|
+
// declaration written after `return` or after its first call is still live,
|
|
230
|
+
// and one early-called declaration may itself call a sibling declared later.
|
|
231
|
+
//
|
|
232
|
+
// The producer marks both halves of each declaration (callable allocation
|
|
233
|
+
// and binding initialization), and parameter bindings mark the phase that
|
|
234
|
+
// must remain ahead of them. Dependencies of those parameter writes are part
|
|
235
|
+
// of the same prologue. All function bindings then precede everything else;
|
|
236
|
+
// leaving the allocations mutually unordered is deliberate because capture
|
|
237
|
+
// analysis will box any sibling binding an earlier closure must share.
|
|
238
|
+
const parameterRoots = operations.filter((id) => {
|
|
239
|
+
const operation = graph.operations.get(id);
|
|
240
|
+
return operation?.family === 'binding' && operation.parameterInitialization === true;
|
|
241
|
+
});
|
|
242
|
+
const parameterPrologue = new Set();
|
|
243
|
+
const collectPredecessors = (id) => {
|
|
244
|
+
if (parameterPrologue.has(id))
|
|
245
|
+
return;
|
|
246
|
+
parameterPrologue.add(id);
|
|
247
|
+
for (const before of predecessors.get(id) ?? [])
|
|
248
|
+
collectPredecessors(before);
|
|
249
|
+
};
|
|
250
|
+
for (const root of parameterRoots)
|
|
251
|
+
collectPredecessors(root);
|
|
252
|
+
const hoistedAllocations = operations.filter((id) => {
|
|
253
|
+
const operation = graph.operations.get(id);
|
|
254
|
+
return operation?.family === 'allocation' && operation.hoistedFunctionInitialization === true;
|
|
255
|
+
});
|
|
256
|
+
const hoistedBindings = operations.filter((id) => {
|
|
257
|
+
const operation = graph.operations.get(id);
|
|
258
|
+
return operation?.family === 'binding' && operation.hoistedFunctionInitialization === true;
|
|
259
|
+
});
|
|
260
|
+
const hoisted = new Set([...hoistedAllocations, ...hoistedBindings]);
|
|
261
|
+
for (const parameter of parameterRoots)
|
|
262
|
+
for (const allocation of hoistedAllocations)
|
|
263
|
+
addPrecedence(parameter, allocation);
|
|
264
|
+
const orderedHoistedBindings = [...hoistedBindings].sort((left, right) => {
|
|
265
|
+
const byOrdinal = (graph.operations.get(left)?.evaluationOrdinal ?? 0) - (graph.operations.get(right)?.evaluationOrdinal ?? 0);
|
|
266
|
+
return byOrdinal !== 0 ? byOrdinal : left.localeCompare(right);
|
|
267
|
+
});
|
|
268
|
+
for (let index = 1; index < orderedHoistedBindings.length; index += 1) {
|
|
269
|
+
const before = orderedHoistedBindings[index - 1];
|
|
270
|
+
const after = orderedHoistedBindings[index];
|
|
271
|
+
if (before && after)
|
|
272
|
+
addPrecedence(before, after);
|
|
273
|
+
}
|
|
274
|
+
const hoistBarrier = orderedHoistedBindings[orderedHoistedBindings.length - 1];
|
|
275
|
+
if (hoistBarrier) {
|
|
276
|
+
for (const operation of operations) {
|
|
277
|
+
if (parameterPrologue.has(operation) || hoisted.has(operation))
|
|
278
|
+
continue;
|
|
279
|
+
addPrecedence(hoistBarrier, operation);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// A dependency of a region member that lives outside that SAME part has to
|
|
283
|
+
// run before the region opens. Topological contiguity alone cannot ensure
|
|
284
|
+
// this: a hoisted function declaration used halfway through a try body is
|
|
285
|
+
// ready at function entry, but its later source ordinal can leave the try's
|
|
286
|
+
// marker first in the ready queue. Lowering then emits the early try
|
|
287
|
+
// operations, closes the part to materialize the dependency, and re-enters
|
|
288
|
+
// the cached try entry for the use. The finished graph has several outside
|
|
289
|
+
// predecessors for that entry, a transfer C++ cannot express because `goto`
|
|
290
|
+
// may not enter a try block.
|
|
291
|
+
//
|
|
292
|
+
// The dependency edge is the authority for moving the prerequisite. If an
|
|
293
|
+
// operation outside the part must precede something inside it, it must also
|
|
294
|
+
// precede the region marker: executing it between two operations of the part
|
|
295
|
+
// would leave and re-enter the region. A dependency from a sibling part
|
|
296
|
+
// instead forms a cycle with the marker-to-member edges above and therefore
|
|
297
|
+
// still fails closed; no ordering can make a catch-side value available in
|
|
298
|
+
// the try body before the statement begins. Snapshot the existing edges so
|
|
299
|
+
// the entry-precedence edges added here do not recursively become evidence
|
|
300
|
+
// for more edges of their own.
|
|
301
|
+
//
|
|
302
|
+
// "Outside the part" means outside the REGION: a catch handler sequenced
|
|
303
|
+
// before the finally clause of the same statement (`producers/control.ts`
|
|
304
|
+
// wires that edge, and the try marker itself feeds its finally the same
|
|
305
|
+
// way) is not a prerequisite the statement has to wait for -- it is the
|
|
306
|
+
// statement. Reading it as one added `catch -> marker` to the marker's own
|
|
307
|
+
// `marker -> catch`, and every `try`/`catch`/`finally` cycled.
|
|
308
|
+
const dependencies = [...successors].flatMap(([before, afters]) => [...afters].map((after) => ({ before, after })));
|
|
309
|
+
for (const { before, after } of dependencies) {
|
|
310
|
+
const beforeRegions = new Set(membership.requiredScopeOf(before).flatMap((ref) => (ref.kind === 'region' ? [ref.region] : [])));
|
|
311
|
+
for (const ref of membership.requiredScopeOf(after)) {
|
|
312
|
+
if (ref.kind !== 'region' || ref.region === before || beforeRegions.has(ref.region))
|
|
313
|
+
continue;
|
|
314
|
+
addPrecedence(before, ref.region);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
const evaluationOrdinalOf = (id) => graph.operations.get(id)?.evaluationOrdinal ?? 0;
|
|
318
|
+
const compareReady = (left, right) => {
|
|
319
|
+
const byOrdinal = evaluationOrdinalOf(left) - evaluationOrdinalOf(right);
|
|
320
|
+
// Only a tie-break among operations the graph left otherwise unordered;
|
|
321
|
+
// comparing the identity string decides nothing on its own, it just makes
|
|
322
|
+
// that tie reproducible across runs.
|
|
323
|
+
return byOrdinal !== 0 ? byOrdinal : left.localeCompare(right);
|
|
324
|
+
};
|
|
325
|
+
// How much of two scope chains is the same nesting, counted from the
|
|
326
|
+
// outside in. `0` means the two operations share no branch at all, and the
|
|
327
|
+
// lowering has to close every frame one of them is in to reach the other.
|
|
328
|
+
const sharedScopeDepth = (left, right) => {
|
|
329
|
+
let depth = 0;
|
|
330
|
+
while (depth < left.length && depth < right.length) {
|
|
331
|
+
const outer = left[depth];
|
|
332
|
+
const inner = right[depth];
|
|
333
|
+
if (!outer || !inner || scopeKeyOf(outer) !== scopeKeyOf(inner))
|
|
334
|
+
break;
|
|
335
|
+
depth += 1;
|
|
336
|
+
}
|
|
337
|
+
return depth;
|
|
338
|
+
};
|
|
339
|
+
const ready = operations.filter((id) => (indegree.get(id) ?? 0) === 0).sort(compareReady);
|
|
340
|
+
const ordered = [];
|
|
341
|
+
let currentScope = [];
|
|
342
|
+
while (ready.length > 0) {
|
|
343
|
+
// `ready` is kept in `compareReady` order, so scanning it front to back and
|
|
344
|
+
// only accepting a *strictly* deeper match leaves the ordinal tie-break in
|
|
345
|
+
// charge of everything contiguity does not decide.
|
|
346
|
+
let chosen = 0;
|
|
347
|
+
let deepest = -1;
|
|
348
|
+
for (let index = 0; index < ready.length; index += 1) {
|
|
349
|
+
const candidate = ready[index];
|
|
350
|
+
if (candidate === undefined)
|
|
351
|
+
continue;
|
|
352
|
+
const depth = sharedScopeDepth(currentScope, membership.requiredScopeOf(candidate));
|
|
353
|
+
if (depth > deepest) {
|
|
354
|
+
deepest = depth;
|
|
355
|
+
chosen = index;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
const next = ready.splice(chosen, 1)[0];
|
|
359
|
+
if (next === undefined)
|
|
360
|
+
break;
|
|
361
|
+
ordered.push(next);
|
|
362
|
+
currentScope = membership.requiredScopeOf(next);
|
|
363
|
+
const unlocked = [];
|
|
364
|
+
for (const successor of successors.get(next) ?? []) {
|
|
365
|
+
const remaining = (indegree.get(successor) ?? 0) - 1;
|
|
366
|
+
indegree.set(successor, remaining);
|
|
367
|
+
if (remaining === 0)
|
|
368
|
+
unlocked.push(successor);
|
|
369
|
+
}
|
|
370
|
+
if (unlocked.length === 0)
|
|
371
|
+
continue;
|
|
372
|
+
ready.push(...unlocked);
|
|
373
|
+
ready.sort(compareReady);
|
|
374
|
+
}
|
|
375
|
+
if (ordered.length !== operations.length) {
|
|
376
|
+
throw new IrLoweringBlockedError('the evaluation graph for this owner contains a cycle and has no well-defined execution order');
|
|
377
|
+
}
|
|
378
|
+
return { order: ordered, parameterPrologue };
|
|
379
|
+
};
|
|
380
|
+
/**
|
|
381
|
+
* The two-sided arm a `ScopeRef`'s four-valued `takenWhen` selects, independent
|
|
382
|
+
* of which predicate reads it.
|
|
383
|
+
*
|
|
384
|
+
* `nullish`/`present` are not a third and fourth kind of arm -- they are the
|
|
385
|
+
* same two arms tested differently -- so everything that compares scopes has
|
|
386
|
+
* to apply this mapping first. A `ScopeRef` compared before it is mapped is a
|
|
387
|
+
* `ScopeRef` compared in the wrong vocabulary.
|
|
388
|
+
*/
|
|
389
|
+
export const armSideOf = (takenWhen) => takenWhen === 'truthy' || takenWhen === 'present' ? 'truthy' : 'falsy';
|
|
390
|
+
/**
|
|
391
|
+
* One scope's identity. Two refs with the same key name the same block-level
|
|
392
|
+
* nesting, and the ordering and the flow controller must agree on that or one
|
|
393
|
+
* of them will think a scope was left when it was not.
|
|
394
|
+
*/
|
|
395
|
+
export const scopeKeyOf = (ref) => ref.kind === 'loop'
|
|
396
|
+
? `loop|${ref.loop}`
|
|
397
|
+
: ref.kind === 'loop-latch'
|
|
398
|
+
? `loop-latch|${ref.loop}`
|
|
399
|
+
: ref.kind === 'region'
|
|
400
|
+
? `region|${ref.region}|${ref.part}`
|
|
401
|
+
: `guard|${ref.guard}|${armSideOf(ref.takenWhen)}`;
|
|
402
|
+
/**
|
|
403
|
+
* Every operation's conditional membership, read directly from `ConditionalEdge`.
|
|
404
|
+
*
|
|
405
|
+
* Nesting order is derived from edge order rather than guessed: a guard whose
|
|
406
|
+
* producing operation runs earlier can only be an outer condition, because a
|
|
407
|
+
* later guard's own evaluation is itself gated by whichever condition already
|
|
408
|
+
* let it run. That is an edge-derived fact, not a source-shaped one, even
|
|
409
|
+
* though it happens to agree with source order.
|
|
410
|
+
*
|
|
411
|
+
* `operations` is this owner's membership set, in any order -- nothing here
|
|
412
|
+
* reads a position from it. That independence is what lets the execution order
|
|
413
|
+
* be computed *from* this answer rather than before it: `orderOwnerOperations`
|
|
414
|
+
* needs every operation's scope chain to keep one branch's operations
|
|
415
|
+
* contiguous, and a membership that depended on the order would be circular.
|
|
416
|
+
*/
|
|
417
|
+
/**
|
|
418
|
+
* Puts every scope chain in enclosure order, outermost first.
|
|
419
|
+
*
|
|
420
|
+
* The chains arrive in edge-table order, and that is chain order only WITHIN a
|
|
421
|
+
* single publisher. Two publishers state them: a producer states an operation's
|
|
422
|
+
* OWN gate as a conditional edge -- `a?.b()`'s call is placed by the presence
|
|
423
|
+
* test -- while `gatingEdges` states the gates of the SUBTREES it walks
|
|
424
|
+
* (`gating.ts`: "an edge places an operation, a gate places a subtree"). Each is
|
|
425
|
+
* internally outermost-first; between them there is no order at all, because
|
|
426
|
+
* every producer edge is appended while operations are being built and every
|
|
427
|
+
* gating edge afterwards.
|
|
428
|
+
*
|
|
429
|
+
* So an optional chain written inside any other gate came out INVERTED. For
|
|
430
|
+
* `if (k) { s.emit?.("a") }` the call's chain read
|
|
431
|
+
* `[?.-guard, if-guard]` -- the producer's own-gate edge first, the walk's
|
|
432
|
+
* `if` edge second -- while every sibling operation in the branch read
|
|
433
|
+
* `[if-guard]`. `sharedScopeDepth` compares from the outside in, so it scored
|
|
434
|
+
* those two chains as sharing nothing, and the lowering closed the `if` arm to
|
|
435
|
+
* enter the `?.` frame and then tried to re-enter the arm it had just ended:
|
|
436
|
+
* "the truthy arm of guard ... was re-entered after it had already ended".
|
|
437
|
+
* That was not a corner -- it was EVERY `?.` inside an `if`, a `while`, a
|
|
438
|
+
* ternary or a `try`, and it refused the whole body.
|
|
439
|
+
*
|
|
440
|
+
* Sorting is not a second opinion about nesting, because the nesting is not
|
|
441
|
+
* being guessed at: a scope encloses another exactly when the enclosed one's
|
|
442
|
+
* OWN opening operation is gated by it, which the chains already record. Depth
|
|
443
|
+
* is the length of that containment, so ordering by it reproduces the walk's
|
|
444
|
+
* own order wherever one publisher stated the whole chain, and repairs it where
|
|
445
|
+
* two did. A tie keeps insertion order -- the sort is stable -- so nothing that
|
|
446
|
+
* was already coherent moves.
|
|
447
|
+
*
|
|
448
|
+
* A loop is the case that makes position-derived order wrong and this one
|
|
449
|
+
* right: a loop's condition is produced INSIDE the loop, so its chain contains
|
|
450
|
+
* the loop frame, so the guard on that condition scores deeper than the frame
|
|
451
|
+
* and stays within it. Reading position would have hoisted it out.
|
|
452
|
+
*/
|
|
453
|
+
const orderChainsByEnclosure = (perOperation, headTestOfLoop) => {
|
|
454
|
+
const openerOf = (ref) => ref.kind === 'guard' ? operationOfResult(ref.guard) : ref.kind === 'region' ? ref.region : ref.loop;
|
|
455
|
+
const depths = new Map();
|
|
456
|
+
const visiting = new Set();
|
|
457
|
+
const depthAbove = (opener) => {
|
|
458
|
+
let depth = 0;
|
|
459
|
+
for (const enclosing of perOperation.get(opener) ?? [])
|
|
460
|
+
depth = Math.max(depth, depthOf(enclosing) + 1);
|
|
461
|
+
return depth;
|
|
462
|
+
};
|
|
463
|
+
/**
|
|
464
|
+
* A latch is one scope deeper than its loop's test, not one deeper than the
|
|
465
|
+
* loop.
|
|
466
|
+
*
|
|
467
|
+
* Every other scope is measured through the chain of its own opening
|
|
468
|
+
* operation, and a latch has none -- it opens at the END of the body rather
|
|
469
|
+
* than at any operation. Falling back to the loop operation scored it level
|
|
470
|
+
* with the loop frame, so `i++`'s chain `[loop, test-truthy, latch]` sorted to
|
|
471
|
+
* `[loop, latch, test-truthy]` and the lowering closed the body arm to enter
|
|
472
|
+
* the latch and then re-entered the arm it had just ended. That is every
|
|
473
|
+
* head-tested `for` and `while` with an update -- `array_read`'s two loops
|
|
474
|
+
* included -- so the whole ordering pass refused ordinary programs.
|
|
475
|
+
*
|
|
476
|
+
* The containment is not a guess: a head-tested loop reaches its latch only
|
|
477
|
+
* from the body, and the body IS the test's truthy arm, so the latch is
|
|
478
|
+
* inside it. A tail-tested loop has no such arm -- its test decides only the
|
|
479
|
+
* back edge -- and its latch sits directly in the loop frame.
|
|
480
|
+
*/
|
|
481
|
+
const latchDepth = (loop) => {
|
|
482
|
+
const test = headTestOfLoop(loop);
|
|
483
|
+
return test === null ? depthAbove(loop) + 1 : depthAbove(operationOfResult(test)) + 1;
|
|
484
|
+
};
|
|
485
|
+
const depthOf = (ref) => {
|
|
486
|
+
const key = scopeKeyOf(ref);
|
|
487
|
+
const known = depths.get(key);
|
|
488
|
+
if (known !== undefined)
|
|
489
|
+
return known;
|
|
490
|
+
// A chain that refers back to itself has no containment to measure. It
|
|
491
|
+
// cannot arise from a well-formed program -- a scope does not open inside
|
|
492
|
+
// itself -- but answering 0 keeps a malformed graph from recursing forever,
|
|
493
|
+
// and leaves the affected chain in the order it arrived, which is what it
|
|
494
|
+
// would have had before any of this.
|
|
495
|
+
if (visiting.has(key))
|
|
496
|
+
return 0;
|
|
497
|
+
visiting.add(key);
|
|
498
|
+
const depth = ref.kind === 'loop-latch' ? latchDepth(ref.loop) : depthAbove(openerOf(ref));
|
|
499
|
+
visiting.delete(key);
|
|
500
|
+
depths.set(key, depth);
|
|
501
|
+
return depth;
|
|
502
|
+
};
|
|
503
|
+
for (const chain of perOperation.values()) {
|
|
504
|
+
if (chain.length < 2)
|
|
505
|
+
continue;
|
|
506
|
+
chain.sort((left, right) => depthOf(left) - depthOf(right));
|
|
507
|
+
}
|
|
508
|
+
};
|
|
509
|
+
export const collectConditionalMembership = (graph, operations,
|
|
510
|
+
/** This owner's share of the edge table, in `graph.edges` order; the walk below keeps only edges landing inside `operations` anyway. */
|
|
511
|
+
ownerEdges) => {
|
|
512
|
+
const members = new Set(operations);
|
|
513
|
+
const perOperation = new Map();
|
|
514
|
+
const arms = new Map();
|
|
515
|
+
const predicates = new Map();
|
|
516
|
+
const loopGuards = new Map();
|
|
517
|
+
const tailTests = new Map();
|
|
518
|
+
const latchLoops = new Set();
|
|
519
|
+
// Edge order is the chain order WITHIN one publisher, and the chains are
|
|
520
|
+
// sorted by enclosure once the walk below has collected them -- see
|
|
521
|
+
// `orderChainsByEnclosure`.
|
|
522
|
+
for (const edge of ownerEdges) {
|
|
523
|
+
if (!members.has(edge.to))
|
|
524
|
+
continue;
|
|
525
|
+
if (edge.kind === 'loop') {
|
|
526
|
+
const list = perOperation.get(edge.to) ?? [];
|
|
527
|
+
if (!list.some((ref) => ref.kind === 'loop' && ref.loop === edge.loop)) {
|
|
528
|
+
list.push({ kind: 'loop', loop: edge.loop });
|
|
529
|
+
perOperation.set(edge.to, list);
|
|
530
|
+
}
|
|
531
|
+
continue;
|
|
532
|
+
}
|
|
533
|
+
if (edge.kind === 'loop-latch') {
|
|
534
|
+
latchLoops.add(edge.loop);
|
|
535
|
+
const list = perOperation.get(edge.to) ?? [];
|
|
536
|
+
if (!list.some((ref) => ref.kind === 'loop-latch' && ref.loop === edge.loop)) {
|
|
537
|
+
list.push({ kind: 'loop-latch', loop: edge.loop });
|
|
538
|
+
perOperation.set(edge.to, list);
|
|
539
|
+
}
|
|
540
|
+
continue;
|
|
541
|
+
}
|
|
542
|
+
if (edge.kind === 'region') {
|
|
543
|
+
const list = perOperation.get(edge.to) ?? [];
|
|
544
|
+
if (!list.some((ref) => ref.kind === 'region' && ref.region === edge.region && ref.part === edge.part)) {
|
|
545
|
+
list.push({ kind: 'region', region: edge.region, part: edge.part });
|
|
546
|
+
perOperation.set(edge.to, list);
|
|
547
|
+
}
|
|
548
|
+
continue;
|
|
549
|
+
}
|
|
550
|
+
if (edge.kind !== 'conditional')
|
|
551
|
+
continue;
|
|
552
|
+
const list = perOperation.get(edge.to) ?? [];
|
|
553
|
+
if (!list.some((ref) => ref.kind === 'guard' && ref.guard === edge.guard && ref.takenWhen === edge.takenWhen)) {
|
|
554
|
+
list.push({ kind: 'guard', guard: edge.guard, takenWhen: edge.takenWhen });
|
|
555
|
+
perOperation.set(edge.to, list);
|
|
556
|
+
}
|
|
557
|
+
// `present` and `nullish` are the two arms of a nullish branch, not two
|
|
558
|
+
// more kinds of arm: recording them here as truthy/falsy is what lets one
|
|
559
|
+
// pair of blocks serve both branch shapes, with the predicate carrying the
|
|
560
|
+
// only difference.
|
|
561
|
+
const bucket = arms.get(edge.guard) ?? { truthy: false, falsy: false };
|
|
562
|
+
if (edge.takenWhen === 'truthy' || edge.takenWhen === 'present')
|
|
563
|
+
bucket.truthy = true;
|
|
564
|
+
if (edge.takenWhen === 'falsy' || edge.takenWhen === 'nullish')
|
|
565
|
+
bucket.falsy = true;
|
|
566
|
+
arms.set(edge.guard, bucket);
|
|
567
|
+
if (edge.takenWhen === 'present' || edge.takenWhen === 'nullish')
|
|
568
|
+
predicates.set(edge.guard, 'is-present');
|
|
569
|
+
}
|
|
570
|
+
// `a ?? b` tests presence, and that is a fact of the operator -- not of the
|
|
571
|
+
// edge that happens to gate its right-hand side. When the right side produces
|
|
572
|
+
// no operation of its own (`x ?? 'default'`, whose right side is a constant)
|
|
573
|
+
// there is no conditional edge at all, and reading the predicate only off
|
|
574
|
+
// edges silently leaves the guard a truthiness test: `'' ?? 'default'` would
|
|
575
|
+
// then answer `'default'` where the language answers `''`. So the operator
|
|
576
|
+
// states it directly, for every `??` in this owner, edge or no edge.
|
|
577
|
+
for (const operationId of operations) {
|
|
578
|
+
const operation = graph.operations.get(operationId);
|
|
579
|
+
if (operation?.family !== 'computation' || operation.form !== 'logical' || operation.operator !== '??')
|
|
580
|
+
continue;
|
|
581
|
+
const left = operandOf(operation, 'left');
|
|
582
|
+
if (left?.source.kind === 'result')
|
|
583
|
+
predicates.set(left.source.result, 'is-present');
|
|
584
|
+
}
|
|
585
|
+
// A default parameter initializer's guard is the same fact about a
|
|
586
|
+
// different operation: `reference`/`parameter-value` publishes the raw
|
|
587
|
+
// argument for exactly one reason, testing its presence, and every such
|
|
588
|
+
// operation in this owner needs that predicate whether or not the
|
|
589
|
+
// initializer it guards happens to mint an operation of its own --
|
|
590
|
+
// `function f(x = 0)`'s initializer is a constant, so `gatingEdges` never
|
|
591
|
+
// emits a conditional edge for it at all, the same gap the `??` loop above
|
|
592
|
+
// closes for a constant right-hand side.
|
|
593
|
+
for (const operationId of operations) {
|
|
594
|
+
const operation = graph.operations.get(operationId);
|
|
595
|
+
if (operation?.family !== 'reference' || operation.form !== 'parameter-value')
|
|
596
|
+
continue;
|
|
597
|
+
const result = resultOf(operation, 'value');
|
|
598
|
+
// `is-defined`, not `is-present`. A default runs when the argument was
|
|
599
|
+
// OMITTED, and an omitted argument is `undefined` -- `null` is a value a
|
|
600
|
+
// caller chose, and the language binds it: `f(x = 0)` called `f(null)`
|
|
601
|
+
// binds `null`, not `0` (ECMA-262 8.6.3, which tests `undefined` and
|
|
602
|
+
// nothing else). A nullish test answers the wrong question for every
|
|
603
|
+
// carrier that can hold `null` at all -- a box, and the three-armed union
|
|
604
|
+
// a `T | null` default now derives (`normalize/parameter-slot.ts`) -- and
|
|
605
|
+
// asking the right one costs nothing for the carriers that cannot, where
|
|
606
|
+
// both tests read the same flag.
|
|
607
|
+
if (result)
|
|
608
|
+
predicates.set(result.id, 'is-defined');
|
|
609
|
+
}
|
|
610
|
+
// A binding element's default asks the same question of a different
|
|
611
|
+
// operation: `const { width = 10 } = options` runs its initializer when the
|
|
612
|
+
// EXTRACTION was `undefined`. The `default-value` step names that extraction
|
|
613
|
+
// itself, through its own `extracted` operand, so this is a citation rather
|
|
614
|
+
// than a second opinion about which result is the guard -- and `is-defined`
|
|
615
|
+
// over `is-present` for the reason the parameter loop above gives: `{ a = 1 }`
|
|
616
|
+
// destructuring `{ a: null }` binds `null`, never `1` (ECMA-262 8.6.3 tests
|
|
617
|
+
// `undefined` and nothing else). The `nullish` gating edge `gating.ts` writes
|
|
618
|
+
// would otherwise leave this at `is-present`.
|
|
619
|
+
for (const operationId of operations) {
|
|
620
|
+
const operation = graph.operations.get(operationId);
|
|
621
|
+
if (operation?.family !== 'destructuring' || operation.form !== 'default-value')
|
|
622
|
+
continue;
|
|
623
|
+
const extracted = operandOf(operation, 'extracted');
|
|
624
|
+
if (extracted?.source.kind === 'result')
|
|
625
|
+
predicates.set(extracted.source.result, 'is-defined');
|
|
626
|
+
}
|
|
627
|
+
// A loop's own test is the guard its `condition` operand names. The loop
|
|
628
|
+
// operation states that directly, so reading it is a citation rather than a
|
|
629
|
+
// second opinion -- and the distinction matters because closing a loop-test
|
|
630
|
+
// arm is not like closing an `if`: it ends in a back edge to the header, not
|
|
631
|
+
// a jump forward to a join, so the arm is deliberately registered as no join
|
|
632
|
+
// source at all.
|
|
633
|
+
//
|
|
634
|
+
// Deriving it from the scope chain's *shape* instead -- "a guard sitting
|
|
635
|
+
// directly inside a loop frame, whose own condition was evaluated in that
|
|
636
|
+
// loop" -- cannot tell a loop's test from a guard *inside* a compound
|
|
637
|
+
// condition. In `while (a && b)`, the operations computing `b` run under a
|
|
638
|
+
// guard on `a`; that guard also sits directly inside the loop frame and `a`
|
|
639
|
+
// is also evaluated there, so the shape rule classified BOTH `a` and the
|
|
640
|
+
// `&&`'s own merged result as the loop's test. Two guards then claimed one
|
|
641
|
+
// loop, which `guardOfLoop`'s first-match scan resolved arbitrarily, and
|
|
642
|
+
// `a`'s truthy arm was closed with a back edge -- leaving the merge the `&&`
|
|
643
|
+
// still needs with no join source, so `requireMergeSources` jumped an
|
|
644
|
+
// already-terminated block and the compiler threw. `while (a && b)` is
|
|
645
|
+
// ordinary TypeScript, and it crashed compilation outright.
|
|
646
|
+
//
|
|
647
|
+
// A tail-tested loop states its condition through the identical operand, and
|
|
648
|
+
// is separated here by form alone: its test decides only the back edge, so it
|
|
649
|
+
// is recorded as this loop's tail test and never as a guard anything is
|
|
650
|
+
// inside. Folding it into `loopGuards` would make `while`'s own "the truthy
|
|
651
|
+
// arm is the body" rule apply to a body that is not in any arm.
|
|
652
|
+
for (const operationId of operations) {
|
|
653
|
+
const operation = graph.operations.get(operationId);
|
|
654
|
+
if (operation?.family !== 'control')
|
|
655
|
+
continue;
|
|
656
|
+
if (operation.form !== 'loop' && operation.form !== 'loop-tail')
|
|
657
|
+
continue;
|
|
658
|
+
const condition = operandOf(operation, 'condition', 0);
|
|
659
|
+
if (condition?.source.kind !== 'result')
|
|
660
|
+
continue;
|
|
661
|
+
if (operation.form === 'loop')
|
|
662
|
+
loopGuards.set(condition.source.result, operationId);
|
|
663
|
+
else
|
|
664
|
+
tailTests.set(operationId, condition.source.result);
|
|
665
|
+
}
|
|
666
|
+
const headTests = new Map();
|
|
667
|
+
for (const [test, loop] of loopGuards)
|
|
668
|
+
headTests.set(loop, test);
|
|
669
|
+
orderChainsByEnclosure(perOperation, (loop) => headTests.get(loop) ?? null);
|
|
670
|
+
return {
|
|
671
|
+
requiredScopeOf: (operation) => perOperation.get(operation) ?? [],
|
|
672
|
+
predicateOf: (guard) => predicates.get(guard) ?? 'to-boolean',
|
|
673
|
+
armsOf: (guard) => {
|
|
674
|
+
const bucket = arms.get(guard);
|
|
675
|
+
return { hasTruthy: bucket?.truthy ?? false, hasFalsy: bucket?.falsy ?? false };
|
|
676
|
+
},
|
|
677
|
+
loopOfGuard: (guard) => loopGuards.get(guard) ?? null,
|
|
678
|
+
guardOfLoop: (loop) => {
|
|
679
|
+
for (const [guard, owner] of loopGuards)
|
|
680
|
+
if (owner === loop)
|
|
681
|
+
return guard;
|
|
682
|
+
return null;
|
|
683
|
+
},
|
|
684
|
+
hasLatch: (loop) => latchLoops.has(loop),
|
|
685
|
+
tailTestOf: (loop) => tailTests.get(loop) ?? null
|
|
686
|
+
};
|
|
687
|
+
};
|