@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,600 @@
|
|
|
1
|
+
import { armSideOf, IrLoweringBlockedError, scopeKeyOf } from './lower-graph.js';
|
|
2
|
+
/** The identity a frame is keyed by, so `enterScope` can tell a chain that continues from one that diverges. */
|
|
3
|
+
const frameKeyOf = (frame) => frame.kind === 'loop'
|
|
4
|
+
? `loop|${frame.loop}`
|
|
5
|
+
: frame.kind === 'loop-latch'
|
|
6
|
+
? `loop-latch|${frame.loop}`
|
|
7
|
+
: frame.kind === 'region'
|
|
8
|
+
? `region|${frame.region}|${frame.part}`
|
|
9
|
+
: `guard|${frame.guard}|${frame.takenWhen}`;
|
|
10
|
+
export const createFlowController = (deps) => {
|
|
11
|
+
const { builder, membership, resolveGuardOperand } = deps;
|
|
12
|
+
const guardCache = new Map();
|
|
13
|
+
const loopCache = new Map();
|
|
14
|
+
const regionCache = new Map();
|
|
15
|
+
/** A switch statement's own exit block, reserved by the first `break` that names the switch -- see `switchExitOf`. */
|
|
16
|
+
const switchCache = new Map();
|
|
17
|
+
let stack = [];
|
|
18
|
+
let currentBlock = builder.openBlock();
|
|
19
|
+
/**
|
|
20
|
+
* Whether the block control is currently in already has a terminator.
|
|
21
|
+
*
|
|
22
|
+
* Asked of the builder rather than tracked beside `currentBlock`. A flag was
|
|
23
|
+
* two answers to one question, and they drifted: a frame closing into a block
|
|
24
|
+
* that was already terminated -- which happens whenever no join block was
|
|
25
|
+
* ever opened, because both arms had already gone elsewhere -- cleared the
|
|
26
|
+
* flag anyway, and the next frame to close wrote a second terminator that
|
|
27
|
+
* `build.ts` refused, several frames away from the one that lied.
|
|
28
|
+
*/
|
|
29
|
+
const isTerminated = () => builder.isTerminated(currentBlock);
|
|
30
|
+
/**
|
|
31
|
+
* `falsy` is built by swapping which successor is the "taken" one, never by
|
|
32
|
+
* negating the condition -- there is no boolean-negation primitive in this
|
|
33
|
+
* IR, so the branch operands themselves carry the inversion instead.
|
|
34
|
+
*
|
|
35
|
+
* A guard that is not already a boolean is not an error and not a cast: the
|
|
36
|
+
* language tests truthiness, and `ToBoolean` is the operation that does it.
|
|
37
|
+
* It is emitted here rather than assumed at the branch because the answer
|
|
38
|
+
* depends entirely on the carrier -- an empty string is false, an empty
|
|
39
|
+
* object is true -- and a branch instruction has no carrier to consult.
|
|
40
|
+
*/
|
|
41
|
+
const requireBooleanGuardOperand = (guard, block, predicate) => {
|
|
42
|
+
const operand = resolveGuardOperand(guard);
|
|
43
|
+
// Only a `to-boolean` guard can already be in the form it needs. A boolean
|
|
44
|
+
// is present whatever its value, so a presence test over one is the
|
|
45
|
+
// constant `true` -- and skipping the test would hand the branch the
|
|
46
|
+
// boolean's *value*, which is a different question with a different answer.
|
|
47
|
+
if (predicate === 'to-boolean' && operand.representation.kind === 'scalar' && operand.representation.domain === 'boolean') {
|
|
48
|
+
return operand;
|
|
49
|
+
}
|
|
50
|
+
return { value: builder.test(block, guard, operand, predicate), representation: { kind: 'scalar', domain: 'boolean' } };
|
|
51
|
+
};
|
|
52
|
+
const sendArmToJoin = (guard, info, arm, side) => {
|
|
53
|
+
const join = info.joinBlock ?? builder.openBlock();
|
|
54
|
+
info.joinBlock = join;
|
|
55
|
+
if (side === 'truthy')
|
|
56
|
+
info.truthySource = arm;
|
|
57
|
+
else
|
|
58
|
+
info.falsySource = arm;
|
|
59
|
+
// The jump exists only because this guard's branch does; citing the
|
|
60
|
+
// guard's own result as lineage keeps every synthesized control-transfer
|
|
61
|
+
// traceable to the semantic decision that required it.
|
|
62
|
+
builder.jump(arm, guard, join);
|
|
63
|
+
};
|
|
64
|
+
const ensureGuardBlocks = (guard, predicate = membership.predicateOf(guard)) => {
|
|
65
|
+
const cached = guardCache.get(guard);
|
|
66
|
+
if (cached)
|
|
67
|
+
return cached;
|
|
68
|
+
// The test runs in the block the branch leaves from, before that branch:
|
|
69
|
+
// it is the guard's own evaluation, so it belongs where the guard is, not
|
|
70
|
+
// in an arm it decides between.
|
|
71
|
+
const condition = requireBooleanGuardOperand(guard, currentBlock, predicate);
|
|
72
|
+
const armTrue = builder.openBlock();
|
|
73
|
+
const armFalse = builder.openBlock();
|
|
74
|
+
builder.branch(currentBlock, guard, condition, armTrue, armFalse);
|
|
75
|
+
const info = { armTrue, armFalse, joinBlock: null, truthySource: null, falsySource: null };
|
|
76
|
+
guardCache.set(guard, info);
|
|
77
|
+
const arms = membership.armsOf(guard);
|
|
78
|
+
// An arm nothing ever runs in would otherwise seal with no terminator: it
|
|
79
|
+
// is dead as far as this owner's operations go, so it heads straight to
|
|
80
|
+
// whichever join the live arm eventually creates.
|
|
81
|
+
if (!arms.hasTruthy)
|
|
82
|
+
sendArmToJoin(guard, info, armTrue, 'truthy');
|
|
83
|
+
if (!arms.hasFalsy)
|
|
84
|
+
sendArmToJoin(guard, info, armFalse, 'falsy');
|
|
85
|
+
return info;
|
|
86
|
+
};
|
|
87
|
+
const armBlockOf = (info, takenWhen) => takenWhen === 'truthy' ? info.armTrue : info.armFalse;
|
|
88
|
+
/**
|
|
89
|
+
* Moving control into one of a guard's arms, refusing an arm that has
|
|
90
|
+
* already ended.
|
|
91
|
+
*
|
|
92
|
+
* An arm block is terminated once it has jumped to its join, branched into a
|
|
93
|
+
* nested guard, or returned; appending to it is impossible, and the caller's
|
|
94
|
+
* next `enterScope` would silently open an unreachable block instead --
|
|
95
|
+
* which is exactly how an owner ended up sealing a block that held real
|
|
96
|
+
* operations and was reached from nothing.
|
|
97
|
+
*
|
|
98
|
+
* That only happens when the execution order left this arm and came back to
|
|
99
|
+
* it, which `orderOwnerOperations` is what prevents: it keeps one scope's
|
|
100
|
+
* operations contiguous. So reaching here is an ordering defect rather than
|
|
101
|
+
* a source-program one, and it is reported as a blocker rather than worked
|
|
102
|
+
* around -- a re-entered arm has no correct block to continue in.
|
|
103
|
+
*/
|
|
104
|
+
const enterArm = (guard, info, side) => {
|
|
105
|
+
const arm = armBlockOf(info, side);
|
|
106
|
+
if (builder.isTerminated(arm)) {
|
|
107
|
+
throw new IrLoweringBlockedError(`the ${side} arm of guard ${guard} was re-entered after it had already ended; this owner's execution order does not keep one branch's operations together`);
|
|
108
|
+
}
|
|
109
|
+
return arm;
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Which arm of a two-sided branch an edge takes, and which predicate decides
|
|
113
|
+
* it.
|
|
114
|
+
*
|
|
115
|
+
* `nullish`/`present` are not a third and fourth kind of branch -- they are
|
|
116
|
+
* the same two arms tested differently. `a?.b` runs its member access when
|
|
117
|
+
* `a` is present and skips it when `a` is nullish, exactly as `if (a)` runs
|
|
118
|
+
* its body when `a` is truthy; what differs is the question asked of `a`, and
|
|
119
|
+
* that travels on the test rather than on the branch. Mapping `present` to
|
|
120
|
+
* the true arm of an `is-present` test is what makes them one shape.
|
|
121
|
+
*/
|
|
122
|
+
const branchArmOf = (ref) => {
|
|
123
|
+
const side = armSideOf(ref.takenWhen);
|
|
124
|
+
// An absence arm asks the census which absence test this guard carries --
|
|
125
|
+
// `is-present` for `?.` and `??`, `is-defined` for a defaulted parameter,
|
|
126
|
+
// which are two different questions about the same two arms. Deciding it
|
|
127
|
+
// from `takenWhen` alone would answer `is-present` for both and re-run a
|
|
128
|
+
// default on an explicit `null`.
|
|
129
|
+
const predicate = ref.takenWhen === 'truthy' || ref.takenWhen === 'falsy' ? 'to-boolean' : membership.predicateOf(ref.guard);
|
|
130
|
+
return { side, predicate };
|
|
131
|
+
};
|
|
132
|
+
const openFreshLevel = (ref) => {
|
|
133
|
+
if (ref.kind === 'loop') {
|
|
134
|
+
// Every iteration re-enters the header, so it cannot share a block with
|
|
135
|
+
// whatever ran before the loop -- that code would run again each time.
|
|
136
|
+
// A `for` with an incrementor also reserves its latch here, at the same
|
|
137
|
+
// moment the header is reserved: the incrementor's own operations are
|
|
138
|
+
// ordered after the body in this owner's walk, but a `continue` inside
|
|
139
|
+
// the body must be able to name the latch before the walk ever reaches
|
|
140
|
+
// the incrementor -- exactly the forward-reference the header itself
|
|
141
|
+
// already needs solving for the loop's own back edge.
|
|
142
|
+
const cached = loopCache.get(ref.loop);
|
|
143
|
+
const info = cached ?? {
|
|
144
|
+
header: builder.openBlock(),
|
|
145
|
+
latch: membership.hasLatch(ref.loop) ? builder.openBlock() : null,
|
|
146
|
+
exit: null
|
|
147
|
+
};
|
|
148
|
+
if (!cached)
|
|
149
|
+
loopCache.set(ref.loop, info);
|
|
150
|
+
if (!isTerminated())
|
|
151
|
+
builder.jump(currentBlock, null, info.header);
|
|
152
|
+
currentBlock = info.header;
|
|
153
|
+
// The cached record itself, not a copy: `exit` is filled in later, by
|
|
154
|
+
// whichever `break` asks for it first, and a copy would not see it.
|
|
155
|
+
stack.push({ kind: 'loop', loop: ref.loop, info });
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (ref.kind === 'loop-latch') {
|
|
159
|
+
// Reserved when the loop's own header was, above; a scope asking to
|
|
160
|
+
// enter it before that happened is this module's own invariant broken,
|
|
161
|
+
// not a source program's fault.
|
|
162
|
+
const latch = loopCache.get(ref.loop)?.latch;
|
|
163
|
+
if (!latch)
|
|
164
|
+
throw new IrLoweringBlockedError('a loop-latch scope opened for a loop whose header never reserved one');
|
|
165
|
+
if (!isTerminated())
|
|
166
|
+
builder.jump(currentBlock, null, latch);
|
|
167
|
+
currentBlock = latch;
|
|
168
|
+
stack.push({ kind: 'loop-latch', loop: ref.loop, info: { latch } });
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (ref.kind === 'region') {
|
|
172
|
+
// `finally` is refused before any operation of its own ever requests
|
|
173
|
+
// this scope: `lowerControl`'s `'try'` case reads the try's own
|
|
174
|
+
// evaluation edges and blocks the whole owner the moment it sees one
|
|
175
|
+
// reaching a finally-region operation, well before the ordering could
|
|
176
|
+
// ever schedule anything gated on it. Reaching here regardless is a
|
|
177
|
+
// lowering invariant broken, not a source-program shape -- reported the
|
|
178
|
+
// same way rather than silently opening a scope the emitter has no
|
|
179
|
+
// rendering for.
|
|
180
|
+
const cached = regionCache.get(ref.region);
|
|
181
|
+
const info = cached ?? {
|
|
182
|
+
tryEntry: builder.openBlock(),
|
|
183
|
+
catchEntry: null,
|
|
184
|
+
finallyEntry: null,
|
|
185
|
+
finallyExit: null,
|
|
186
|
+
join: null
|
|
187
|
+
};
|
|
188
|
+
if (!cached)
|
|
189
|
+
regionCache.set(ref.region, info);
|
|
190
|
+
if (ref.part === 'try') {
|
|
191
|
+
// The one transition a `goto`+label pair cannot render: C++ forbids
|
|
192
|
+
// jumping into a `try` block from outside it. The jump is still built
|
|
193
|
+
// here, exactly like a guard's arm entry, because the IR's own
|
|
194
|
+
// reachability and dominance guards need a real predecessor edge --
|
|
195
|
+
// `emit.ts` is what recognizes `tryEntry` from the region table this
|
|
196
|
+
// controller publishes and renders the transition as fallthrough into
|
|
197
|
+
// `try {` instead of `goto`.
|
|
198
|
+
if (!isTerminated())
|
|
199
|
+
builder.jump(currentBlock, null, info.tryEntry);
|
|
200
|
+
currentBlock = info.tryEntry;
|
|
201
|
+
stack.push({ kind: 'region', region: ref.region, part: 'try', info });
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// `catch` is reached only by the C++ runtime unwinding an exception out
|
|
205
|
+
// of the try body -- there is no source-level control-flow edge from
|
|
206
|
+
// "inside try" to "inside catch" for this lowering to build, so
|
|
207
|
+
// `currentBlock` is left exactly where the try's own `finalizeFrame`
|
|
208
|
+
// put it (normally the region's shared join, mid-construction). The
|
|
209
|
+
// catch entry is a block nothing in this owner's own sequence ever
|
|
210
|
+
// `goto`s to.
|
|
211
|
+
if (ref.part === 'catch') {
|
|
212
|
+
const catchEntry = info.catchEntry ?? builder.openBlock();
|
|
213
|
+
info.catchEntry = catchEntry;
|
|
214
|
+
currentBlock = catchEntry;
|
|
215
|
+
stack.push({ kind: 'region', region: ref.region, part: 'catch', info });
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
// `finally` is entered by no control-flow edge either, for a reason one
|
|
219
|
+
// step further from `catch`'s: the emitter runs it from a scope guard's
|
|
220
|
+
// DESTRUCTOR wrapped around the whole region, so every way out of the
|
|
221
|
+
// try body -- falling off the end, `return`, `break`/`continue` to an
|
|
222
|
+
// enclosing loop, an exception unwinding -- already runs it, and none of
|
|
223
|
+
// them is a jump this controller could build. Like `catch`, control is
|
|
224
|
+
// left exactly where the previous part's `finalizeFrame` put it.
|
|
225
|
+
const finallyEntry = info.finallyEntry ?? builder.openBlock();
|
|
226
|
+
info.finallyEntry = finallyEntry;
|
|
227
|
+
currentBlock = finallyEntry;
|
|
228
|
+
stack.push({ kind: 'region', region: ref.region, part: 'finally', info });
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const { side, predicate } = branchArmOf(ref);
|
|
232
|
+
const info = ensureGuardBlocks(ref.guard, predicate);
|
|
233
|
+
currentBlock = enterArm(ref.guard, info, side);
|
|
234
|
+
stack.push({ kind: 'guard', guard: ref.guard, takenWhen: side, info });
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* The jump that closes one iteration, written from wherever that iteration
|
|
238
|
+
* ends.
|
|
239
|
+
*
|
|
240
|
+
* A loop with no test at all (`while (true)`, `do { ... } while (true)`)
|
|
241
|
+
* takes it unconditionally: nothing but a `break` ends such a loop, and the
|
|
242
|
+
* block that `break` lands in is reserved lazily by `loopExitOf`.
|
|
243
|
+
*
|
|
244
|
+
* A tail-tested loop's test is evaluated *here* -- the condition ran in this
|
|
245
|
+
* very block, after the body -- so its back edge is a real two-way branch:
|
|
246
|
+
* true repeats, false leaves. This is the one place a branch is built without
|
|
247
|
+
* going through `ensureGuardBlocks`, and deliberately: that function opens two
|
|
248
|
+
* fresh arm blocks for a guard that has operations on its sides, and a tail
|
|
249
|
+
* test has none. Both successors already exist -- the header the body starts
|
|
250
|
+
* in, and the loop's own exit -- so arms would be two empty blocks jumping to
|
|
251
|
+
* a join nothing ever reaches.
|
|
252
|
+
*
|
|
253
|
+
* A head-tested loop never reaches here: its truthy arm writes the back edge
|
|
254
|
+
* as that arm closes, and `finalizeFrame` returns before calling this.
|
|
255
|
+
*/
|
|
256
|
+
const closeBackEdge = (loop, header) => {
|
|
257
|
+
const tail = membership.tailTestOf(loop);
|
|
258
|
+
if (tail === null) {
|
|
259
|
+
builder.jump(currentBlock, null, header);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
const exit = loopExitOf(loop);
|
|
263
|
+
if (exit === null)
|
|
264
|
+
throw new IrLoweringBlockedError('a tail-tested loop closed its iteration before its own blocks were reserved');
|
|
265
|
+
const condition = requireBooleanGuardOperand(tail, currentBlock, membership.predicateOf(tail));
|
|
266
|
+
builder.branch(currentBlock, tail, condition, header, exit);
|
|
267
|
+
};
|
|
268
|
+
const finalizeFrame = (frame) => {
|
|
269
|
+
if (frame.kind === 'region' && frame.part === 'finally') {
|
|
270
|
+
// A finally clause's normal completion is NOT an arrival anywhere. The
|
|
271
|
+
// try body and the catch handler both converge on the region's join
|
|
272
|
+
// because that is where control actually goes when either falls off its
|
|
273
|
+
// end; a finally clause decides nothing -- control resumes wherever the
|
|
274
|
+
// completion that ran the clause was already headed, and the clause's own
|
|
275
|
+
// end just hands it back. Sending it to the join anyway made the join
|
|
276
|
+
// look reached, so a region whose every other part `return`ed grew a
|
|
277
|
+
// trailing block that lowering then had to terminate with a valueless
|
|
278
|
+
// `return` in a function that returns a value.
|
|
279
|
+
//
|
|
280
|
+
// Its own exit block instead, owned by the region and reached by nothing
|
|
281
|
+
// else, which `targets/cpp/emit-exceptions.ts` renders as falling off the
|
|
282
|
+
// end of the guard body. A block, rather than leaving the part
|
|
283
|
+
// unterminated, because every IR block has a terminator by construction
|
|
284
|
+
// -- and a block of its own, rather than reusing a `return` terminator
|
|
285
|
+
// here, because a `return` written inside the clause by the SOURCE is a
|
|
286
|
+
// different fact that must still refuse by name.
|
|
287
|
+
if (!isTerminated()) {
|
|
288
|
+
const exit = frame.info.finallyExit ?? builder.openBlock();
|
|
289
|
+
frame.info.finallyExit = exit;
|
|
290
|
+
builder.jump(currentBlock, null, exit);
|
|
291
|
+
builder.return(exit, null, null);
|
|
292
|
+
}
|
|
293
|
+
// `leaveInto(null)` leaves `currentBlock` inside the clause, which would
|
|
294
|
+
// be a miscompile if anything were placed there afterwards -- it would
|
|
295
|
+
// land inside the guard's lambda rather than after the statement. Nothing
|
|
296
|
+
// can be: a null `join` means neither the try body nor the catch handler
|
|
297
|
+
// completes normally, which is exactly when TypeScript's own reachability
|
|
298
|
+
// proves the code after the try statement unreachable, so the census
|
|
299
|
+
// publishes no operation for it. That is the same reason the try and
|
|
300
|
+
// catch frames below may leave into a null join.
|
|
301
|
+
leaveInto(frame.info.join);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
if (frame.kind === 'region') {
|
|
305
|
+
// Both parts converge on one shared join: falling off the end of `try`
|
|
306
|
+
// and falling off the end of `catch` reach the same continuation, and
|
|
307
|
+
// there is exactly one join because the language never runs both. A
|
|
308
|
+
// part that already ended (`return`/`throw`/`break`/`continue` inside
|
|
309
|
+
// it) leaves the join to whichever side does complete normally, exactly
|
|
310
|
+
// as a guard arm that already ended leaves the join to its sibling --
|
|
311
|
+
// which means the join must NOT be allocated at all just because this
|
|
312
|
+
// part finished; a `join` conjured here for an already-terminated part
|
|
313
|
+
// is abandoned the moment the sibling part also terminates (nothing
|
|
314
|
+
// ever jumps into it, and `openFreshLevel`'s catch branch overwrites
|
|
315
|
+
// `currentBlock` right behind it), sealing with zero operations and no
|
|
316
|
+
// terminator. Gating the allocation itself behind `!isTerminated()`,
|
|
317
|
+
// exactly like `sendArmToJoin`'s own guard, is what keeps a join from
|
|
318
|
+
// ever existing before something is actually known to reach it.
|
|
319
|
+
if (!isTerminated()) {
|
|
320
|
+
const join = frame.info.join ?? builder.openBlock();
|
|
321
|
+
frame.info.join = join;
|
|
322
|
+
builder.jump(currentBlock, null, join);
|
|
323
|
+
}
|
|
324
|
+
leaveInto(frame.info.join);
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
if (frame.kind === 'loop') {
|
|
328
|
+
// A head-tested loop's test already sent control forward to the exit
|
|
329
|
+
// when it failed, and its taken arm writes the back edge as that arm
|
|
330
|
+
// closes -- so leaving such a loop is nothing more than closing this
|
|
331
|
+
// frame.
|
|
332
|
+
if (membership.guardOfLoop(frame.loop) !== null)
|
|
333
|
+
return;
|
|
334
|
+
// A loop with no test has neither. Without the back edge below, the body
|
|
335
|
+
// of `while (true)` ran exactly once and fell through to whatever came
|
|
336
|
+
// after it -- an ordinary construct compiled into something that is not
|
|
337
|
+
// a loop at all, with nothing refusing it.
|
|
338
|
+
//
|
|
339
|
+
// A tail-tested loop reaches here in exactly one shape: `do`/`while`
|
|
340
|
+
// whose condition published no operation of its own, so no latch was
|
|
341
|
+
// ever reserved for it and the test still has to be written somewhere.
|
|
342
|
+
// The usual shape closes in the latch branch below, already terminated
|
|
343
|
+
// by the time this frame pops.
|
|
344
|
+
if (!isTerminated())
|
|
345
|
+
closeBackEdge(frame.loop, frame.info.header);
|
|
346
|
+
if (frame.info.exit !== null)
|
|
347
|
+
currentBlock = frame.info.exit;
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (frame.kind === 'loop-latch') {
|
|
351
|
+
// The latch's only job is running the incrementor and falling through
|
|
352
|
+
// to re-test the condition -- the same back edge a loop's own truthy
|
|
353
|
+
// arm takes, just one block earlier. For a `do`/`while` the latch *is*
|
|
354
|
+
// the test: the condition's own operations ran here, so the back edge
|
|
355
|
+
// this writes is the conditional one.
|
|
356
|
+
const header = loopCache.get(frame.loop)?.header;
|
|
357
|
+
if (header === undefined)
|
|
358
|
+
throw new IrLoweringBlockedError('a loop latch closed before its loop header was opened');
|
|
359
|
+
if (!isTerminated())
|
|
360
|
+
closeBackEdge(frame.loop, header);
|
|
361
|
+
// Left terminated, not running: the frame this latch sits inside (the
|
|
362
|
+
// loop's own truthy guard arm) closes next, on this very block, and the
|
|
363
|
+
// jump above is what stops it writing a second terminator there.
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
const loop = membership.loopOfGuard(frame.guard);
|
|
367
|
+
// The taken arm of a loop's test ends in a back edge, not a join: that jump
|
|
368
|
+
// is the loop.
|
|
369
|
+
if (loop !== null && frame.takenWhen === 'truthy') {
|
|
370
|
+
const header = loopCache.get(loop)?.header;
|
|
371
|
+
if (header === undefined)
|
|
372
|
+
throw new IrLoweringBlockedError('a loop test closed its body before the loop header was opened');
|
|
373
|
+
if (!isTerminated())
|
|
374
|
+
builder.jump(currentBlock, frame.guard, header);
|
|
375
|
+
leaveInto(frame.info.joinBlock);
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
if (!isTerminated())
|
|
379
|
+
sendArmToJoin(frame.guard, frame.info, currentBlock, frame.takenWhen);
|
|
380
|
+
leaveInto(frame.info.joinBlock);
|
|
381
|
+
};
|
|
382
|
+
/**
|
|
383
|
+
* Where a closed frame leaves control.
|
|
384
|
+
*
|
|
385
|
+
* A frame with no join block -- both arms already gone somewhere else, so
|
|
386
|
+
* nothing ever opened one -- leaves control exactly where it was, terminator
|
|
387
|
+
* and all. Moving to a `null` join would have been moving nowhere while
|
|
388
|
+
* announcing a fresh start.
|
|
389
|
+
*/
|
|
390
|
+
const leaveInto = (join) => {
|
|
391
|
+
if (join !== null)
|
|
392
|
+
currentBlock = join;
|
|
393
|
+
};
|
|
394
|
+
const enterScope = (requiredScope, afterUnwind, placesNothing = false) => {
|
|
395
|
+
let common = 0;
|
|
396
|
+
while (common < stack.length && common < requiredScope.length) {
|
|
397
|
+
const frame = stack[common];
|
|
398
|
+
const ref = requiredScope[common];
|
|
399
|
+
if (!frame || !ref || frameKeyOf(frame) !== scopeKeyOf(ref))
|
|
400
|
+
break;
|
|
401
|
+
common += 1;
|
|
402
|
+
}
|
|
403
|
+
const boundaryFrame = stack[common];
|
|
404
|
+
const boundaryRef = requiredScope[common];
|
|
405
|
+
const isSwitch = boundaryFrame !== undefined &&
|
|
406
|
+
boundaryRef !== undefined &&
|
|
407
|
+
boundaryFrame.kind === 'guard' &&
|
|
408
|
+
boundaryRef.kind === 'guard' &&
|
|
409
|
+
boundaryFrame.guard === boundaryRef.guard;
|
|
410
|
+
// Settled after EACH frame closes, not once after the whole unwind. A short
|
|
411
|
+
// circuit's merge lands in its own guard's join block, and that block is
|
|
412
|
+
// consumed the moment the ENCLOSING frame closes -- it becomes the arm that
|
|
413
|
+
// frame sends onward to its own join. Settling after everything unwound
|
|
414
|
+
// therefore built the merge in a block that had already jumped away, and
|
|
415
|
+
// then went on lowering into it: `enterScope` found the block terminated
|
|
416
|
+
// and opened a fresh one, orphaning the outer join with no terminator at
|
|
417
|
+
// all ("sealed without a terminator; it holds 0 operation(s)"). Which is
|
|
418
|
+
// every `?.` inside an `if`, a loop, a ternary or a `try`. Settling as the
|
|
419
|
+
// owning frame closes puts the merge in its join while that join is still
|
|
420
|
+
// the live block, and the enclosing frame then sends it onward exactly as
|
|
421
|
+
// it would any other. A guard still open further out is skipped rather than
|
|
422
|
+
// blocked on -- see `isGuardOpen`.
|
|
423
|
+
while (stack.length > common) {
|
|
424
|
+
const frame = stack.pop();
|
|
425
|
+
if (!frame)
|
|
426
|
+
break;
|
|
427
|
+
if (isSwitch && frame === boundaryFrame && frame.kind === 'guard') {
|
|
428
|
+
// Same guard, opposite arm: the old arm is done, so it heads to the
|
|
429
|
+
// shared join eventually, but execution continues in the sibling arm
|
|
430
|
+
// rather than at the join itself.
|
|
431
|
+
if (!isTerminated())
|
|
432
|
+
sendArmToJoin(frame.guard, frame.info, currentBlock, frame.takenWhen);
|
|
433
|
+
break;
|
|
434
|
+
}
|
|
435
|
+
finalizeFrame(frame);
|
|
436
|
+
afterUnwind?.();
|
|
437
|
+
}
|
|
438
|
+
const startIndex = isSwitch ? common + 1 : common;
|
|
439
|
+
if (isSwitch && boundaryRef && boundaryRef.kind === 'guard') {
|
|
440
|
+
const { side } = branchArmOf(boundaryRef);
|
|
441
|
+
const info = boundaryFrame && boundaryFrame.kind === 'guard' ? boundaryFrame.info : ensureGuardBlocks(boundaryRef.guard);
|
|
442
|
+
currentBlock = enterArm(boundaryRef.guard, info, side);
|
|
443
|
+
stack.push({ kind: 'guard', guard: boundaryRef.guard, takenWhen: side, info });
|
|
444
|
+
}
|
|
445
|
+
// Every frame this scope leaves has just closed (or, for a same-guard arm
|
|
446
|
+
// switch, been sent toward its join) -- and no frame this scope adds has
|
|
447
|
+
// opened yet. That is the one window in which a guard the new scope is
|
|
448
|
+
// about to open can safely be resolved when its own boolean test is a value
|
|
449
|
+
// only just settled here, which is exactly what a chained optional access
|
|
450
|
+
// used as a `?:`/`&&` condition needs.
|
|
451
|
+
afterUnwind?.();
|
|
452
|
+
for (let index = startIndex; index < requiredScope.length; index += 1) {
|
|
453
|
+
const ref = requiredScope[index];
|
|
454
|
+
if (ref)
|
|
455
|
+
openFreshLevel(ref);
|
|
456
|
+
}
|
|
457
|
+
// Still terminated after unwinding every frame this scope left: nothing
|
|
458
|
+
// reaches here, and closing a frame did not hand control to a join. Such
|
|
459
|
+
// code still needs a legal home, so it gets a block of its own rather than
|
|
460
|
+
// being appended to one that already ended.
|
|
461
|
+
//
|
|
462
|
+
// Reaching this only *after* unwinding is the point. A `return` inside an
|
|
463
|
+
// `if` terminates its arm, but the code after the `if` is reached by the
|
|
464
|
+
// other arm -- discarding the frames on sight would orphan that join and
|
|
465
|
+
// leave it with no terminator at all.
|
|
466
|
+
//
|
|
467
|
+
// A marker is the exception, and the whole reason `placesNothing` exists:
|
|
468
|
+
// it is not code, so there is nothing to give a home to. `if (n === 1)
|
|
469
|
+
// return 'one'; else return 'other';` reaches its own `branch` marker with
|
|
470
|
+
// both arms terminated and no join -- the census orders a statement's
|
|
471
|
+
// marker after everything inside it -- and the block opened here was then
|
|
472
|
+
// sealed empty, unreached, and terminated by `lower.ts`'s body-completion
|
|
473
|
+
// `return`, which in a `string`-returning function is C++ clang rejects
|
|
474
|
+
// outright. Leaving `currentBlock` on the terminated block instead makes
|
|
475
|
+
// `finish` report `alreadyTerminated`, which is the truth.
|
|
476
|
+
if (isTerminated() && !placesNothing) {
|
|
477
|
+
stack = [];
|
|
478
|
+
currentBlock = builder.openBlock();
|
|
479
|
+
}
|
|
480
|
+
return currentBlock;
|
|
481
|
+
};
|
|
482
|
+
const finish = () => {
|
|
483
|
+
// `currentBlock` alone answers "did the arm the walk last tracked end",
|
|
484
|
+
// never "is every open frame's OTHER path also settled". A `region`
|
|
485
|
+
// frame still on `stack` at this point is exactly a case where those
|
|
486
|
+
// differ: `try { push(...) } catch { throw }` as a function's last
|
|
487
|
+
// statement leaves `currentBlock` on the catch arm (terminated by its
|
|
488
|
+
// own `throw`) while the region frame representing the try side's
|
|
489
|
+
// normal completion is still open -- that side fell off its own end
|
|
490
|
+
// without terminating, and its join has not been created yet.
|
|
491
|
+
// Believing `isTerminated()` here skipped popping that frame at all, so
|
|
492
|
+
// `finalizeFrame`'s region case (the one place that join gets opened and
|
|
493
|
+
// connected) never ran, and `builder.seal()` caught the join later as a
|
|
494
|
+
// block sealed without a terminator. Only when NOTHING remains open can
|
|
495
|
+
// the current block's own state answer the question by itself.
|
|
496
|
+
if (stack.length === 0 && isTerminated()) {
|
|
497
|
+
// Every path through the remaining open frames already ended in its own
|
|
498
|
+
// terminator (a return/throw/break/continue lowered while that frame
|
|
499
|
+
// was active); nothing further can execute, so there is nothing left to
|
|
500
|
+
// join, and reopening a block here would just manufacture dead code.
|
|
501
|
+
return { block: currentBlock, alreadyTerminated: true };
|
|
502
|
+
}
|
|
503
|
+
while (stack.length > 0) {
|
|
504
|
+
const frame = stack.pop();
|
|
505
|
+
if (frame)
|
|
506
|
+
finalizeFrame(frame);
|
|
507
|
+
}
|
|
508
|
+
// Draining a frame whose every path already terminated (both arms of a
|
|
509
|
+
// guard return, say) leaves `currentBlock` exactly where it was --
|
|
510
|
+
// `leaveInto(null)` is a no-op -- so the answer has to be asked fresh
|
|
511
|
+
// rather than assumed false now that the stack is provably empty.
|
|
512
|
+
return { block: currentBlock, alreadyTerminated: isTerminated() };
|
|
513
|
+
};
|
|
514
|
+
const isGuardOpen = (guard) => stack.some((frame) => frame.kind === 'guard' && frame.guard === guard);
|
|
515
|
+
const requireMergeSources = (guard) => {
|
|
516
|
+
if (isGuardOpen(guard)) {
|
|
517
|
+
throw new IrLoweringBlockedError("a merge over a guard was requested while one of that guard's arms was still open");
|
|
518
|
+
}
|
|
519
|
+
const info = ensureGuardBlocks(guard);
|
|
520
|
+
if (info.truthySource === null)
|
|
521
|
+
sendArmToJoin(guard, info, info.armTrue, 'truthy');
|
|
522
|
+
if (info.falsySource === null)
|
|
523
|
+
sendArmToJoin(guard, info, info.armFalse, 'falsy');
|
|
524
|
+
const join = info.joinBlock;
|
|
525
|
+
const truthy = info.truthySource;
|
|
526
|
+
const falsy = info.falsySource;
|
|
527
|
+
if (join === null || truthy === null || falsy === null) {
|
|
528
|
+
throw new IrLoweringBlockedError('a guard closed both arms without producing a join block to merge in');
|
|
529
|
+
}
|
|
530
|
+
currentBlock = join;
|
|
531
|
+
return { truthy, falsy, join };
|
|
532
|
+
};
|
|
533
|
+
const loopExitOf = (loop) => {
|
|
534
|
+
const guard = membership.guardOfLoop(loop);
|
|
535
|
+
if (guard !== null)
|
|
536
|
+
return guardCache.get(guard)?.joinBlock ?? null;
|
|
537
|
+
const info = loopCache.get(loop);
|
|
538
|
+
// Asked for before the loop was entered, which for a transfer out of that
|
|
539
|
+
// loop's own body cannot happen -- the body is inside it.
|
|
540
|
+
if (!info)
|
|
541
|
+
return null;
|
|
542
|
+
if (info.exit === null)
|
|
543
|
+
info.exit = builder.openBlock();
|
|
544
|
+
return info.exit;
|
|
545
|
+
};
|
|
546
|
+
const switchExitOf = (switchOp) => {
|
|
547
|
+
const cached = switchCache.get(switchOp);
|
|
548
|
+
if (cached !== undefined)
|
|
549
|
+
return cached;
|
|
550
|
+
const exit = builder.openBlock();
|
|
551
|
+
switchCache.set(switchOp, exit);
|
|
552
|
+
return exit;
|
|
553
|
+
};
|
|
554
|
+
const closeSwitch = (switchOp, lineage) => {
|
|
555
|
+
const exit = switchCache.get(switchOp);
|
|
556
|
+
if (exit === undefined)
|
|
557
|
+
return;
|
|
558
|
+
if (!isTerminated())
|
|
559
|
+
builder.jump(currentBlock, lineage, exit);
|
|
560
|
+
currentBlock = exit;
|
|
561
|
+
};
|
|
562
|
+
const regionsOpened = () => [...regionCache.entries()].map(([region, info]) => ({
|
|
563
|
+
region,
|
|
564
|
+
tryEntry: info.tryEntry,
|
|
565
|
+
catchEntry: info.catchEntry,
|
|
566
|
+
finallyEntry: info.finallyEntry,
|
|
567
|
+
finallyExit: info.finallyExit,
|
|
568
|
+
join: info.join
|
|
569
|
+
}));
|
|
570
|
+
const splitCurrentBlock = (lineage) => {
|
|
571
|
+
if (isTerminated())
|
|
572
|
+
throw new IrLoweringBlockedError('cannot split a terminated block for an iterator cleanup boundary');
|
|
573
|
+
const next = builder.openBlock();
|
|
574
|
+
builder.jump(currentBlock, lineage, next);
|
|
575
|
+
currentBlock = next;
|
|
576
|
+
return next;
|
|
577
|
+
};
|
|
578
|
+
return {
|
|
579
|
+
currentBlock: () => currentBlock,
|
|
580
|
+
requireMergeSources,
|
|
581
|
+
isGuardOpen,
|
|
582
|
+
loopHeaderOf: (loop) => loopCache.get(loop)?.header ?? null,
|
|
583
|
+
loopLatchOf: (loop) => loopCache.get(loop)?.latch ?? null,
|
|
584
|
+
loopNormalExitOf: (loop) => {
|
|
585
|
+
const guard = membership.guardOfLoop(loop);
|
|
586
|
+
return guard === null ? null : (guardCache.get(guard)?.armFalse ?? null);
|
|
587
|
+
},
|
|
588
|
+
loopBodyEntryOf: (loop) => {
|
|
589
|
+
const guard = membership.guardOfLoop(loop);
|
|
590
|
+
return guard === null ? null : (guardCache.get(guard)?.armTrue ?? null);
|
|
591
|
+
},
|
|
592
|
+
loopExitOf,
|
|
593
|
+
switchExitOf,
|
|
594
|
+
closeSwitch,
|
|
595
|
+
splitCurrentBlock,
|
|
596
|
+
regionsOpened,
|
|
597
|
+
enterScope,
|
|
598
|
+
finish
|
|
599
|
+
};
|
|
600
|
+
};
|