@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
package/dist/ir/facts.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { booleanConstantsOf, deadValuesOf, unreadValuesOf } from './dead-values.js';
|
|
2
|
+
import { deferrableValuesOf } from './deferral.js';
|
|
3
|
+
import { loopInvariantHoistsOf, loopInvariantValuesOf } from './hoist.js';
|
|
4
|
+
import { narrowableIntegersOf, remainderFormGroups } from './integers.js';
|
|
5
|
+
import { localIteratorValuesOf } from './local-iterators.js';
|
|
6
|
+
import { allOperationsOf } from './model.js';
|
|
7
|
+
import { numericIntrinsicsOf } from './numeric-intrinsics.js';
|
|
8
|
+
import { operandsOfIrOperation, resultOfIrOperation } from './queries.js';
|
|
9
|
+
import { sharedStringLayoutsOf } from './string-layout-reuse.js';
|
|
10
|
+
import { stringLengthReuseOf } from './string-length-reuse.js';
|
|
11
|
+
import { typeQueryResultsOf } from './type-query-results.js';
|
|
12
|
+
export const irBodyCensusOf = (body, policy) => {
|
|
13
|
+
const localIterators = localIteratorValuesOf(body);
|
|
14
|
+
const censused = deferrableValuesOf(body, policy.deferrableMemberRead, policy.forwarding);
|
|
15
|
+
const dead = deadValuesOf(body, policy.deadValues);
|
|
16
|
+
const unread = unreadValuesOf(body);
|
|
17
|
+
const booleanConstants = booleanConstantsOf(body);
|
|
18
|
+
policy.spellConstants();
|
|
19
|
+
// Mutable from here on: the three censuses below each claim values out of the
|
|
20
|
+
// deferral set, and a claimed value must not be deferred by anyone.
|
|
21
|
+
const deferrable = new Set(censused.values);
|
|
22
|
+
const typeQueries = typeQueryResultsOf(body, policy.stringQueryCell);
|
|
23
|
+
// A tag observes the value at the query/read site, even if a later call
|
|
24
|
+
// mutates the input. Do not turn a saved result into a repeated typeof.
|
|
25
|
+
for (const value of typeQueries.values)
|
|
26
|
+
deferrable.delete(value);
|
|
27
|
+
// Which `number` values may be held in a `long long`, before any rendering:
|
|
28
|
+
// storage is decided at a first write. See `ir/integers.ts`.
|
|
29
|
+
const narrowed = narrowableIntegersOf(body, policy.integerStorage);
|
|
30
|
+
const numericIntrinsics = numericIntrinsicsOf(body);
|
|
31
|
+
const remainderForms = new Map();
|
|
32
|
+
for (const [form, values] of remainderFormGroups(narrowed))
|
|
33
|
+
for (const value of values)
|
|
34
|
+
remainderForms.set(value, form);
|
|
35
|
+
// The two cell facts the forwarding census leaves to this sequence: a
|
|
36
|
+
// narrowed cell is `long long` storage and a type-query cell a saved tag,
|
|
37
|
+
// and a read spelled as the written expression would be neither.
|
|
38
|
+
const forwardedBindings = new Map();
|
|
39
|
+
for (const [declaration, forwarded] of censused.forwardedBindings) {
|
|
40
|
+
if (narrowed.bindings.has(declaration) || typeQueries.bindings.has(declaration))
|
|
41
|
+
continue;
|
|
42
|
+
forwardedBindings.set(declaration, forwarded);
|
|
43
|
+
}
|
|
44
|
+
const settled = {
|
|
45
|
+
localIterators,
|
|
46
|
+
deferrable,
|
|
47
|
+
callArgumentOnly: censused.consumedByCall,
|
|
48
|
+
forwardedBindings,
|
|
49
|
+
dead,
|
|
50
|
+
unread,
|
|
51
|
+
booleanConstants,
|
|
52
|
+
typeQueryValues: typeQueries.values,
|
|
53
|
+
typeQueryBindings: typeQueries.bindings,
|
|
54
|
+
typeQueryComparisons: typeQueries.comparisons,
|
|
55
|
+
integerValues: narrowed.values,
|
|
56
|
+
integerBindings: narrowed.bindings,
|
|
57
|
+
remainderForms,
|
|
58
|
+
numericCalls: numericIntrinsics.calls,
|
|
59
|
+
numericCallOnly: numericIntrinsics.callOnly
|
|
60
|
+
};
|
|
61
|
+
const stableFormals = policy.formalStorage(settled);
|
|
62
|
+
const loopInvariantValues = loopInvariantValuesOf(body);
|
|
63
|
+
const hoists = loopInvariantHoistsOf(body);
|
|
64
|
+
const sharedStringLayouts = sharedStringLayoutsOf(body, hoists, dead);
|
|
65
|
+
// A relocated value leaves the deferral census: a deferred value renders at
|
|
66
|
+
// its use -- the place inside the loop the move exists to get it out of.
|
|
67
|
+
const hoistedResults = new Set();
|
|
68
|
+
for (const value of hoists.relocated) {
|
|
69
|
+
deferrable.delete(value);
|
|
70
|
+
hoistedResults.add(value);
|
|
71
|
+
}
|
|
72
|
+
const reusedStringLengths = stringLengthReuseOf(body, stableFormals, new Set([...dead, ...hoists.relocated]));
|
|
73
|
+
// A reused result must be stored at its dominating definition, even if its
|
|
74
|
+
// original single consumer would otherwise defer that computation.
|
|
75
|
+
for (const prior of reusedStringLengths.values())
|
|
76
|
+
deferrable.delete(prior.value);
|
|
77
|
+
// Every census above that claimed a value out of `deferrable` may have taken
|
|
78
|
+
// a forwarding's written value or read with it; a forwarding whose halves no
|
|
79
|
+
// longer both defer would spell a value that now has storage of its own at
|
|
80
|
+
// a place that storage is not written yet.
|
|
81
|
+
for (const [declaration, forwarded] of forwardedBindings) {
|
|
82
|
+
if (!deferrable.has(forwarded.value.value) || !deferrable.has(forwarded.read))
|
|
83
|
+
forwardedBindings.delete(declaration);
|
|
84
|
+
}
|
|
85
|
+
return { ...settled, loopInvariantValues, hoists, hoistedResults, sharedStringLayouts, reusedStringLengths };
|
|
86
|
+
};
|
|
87
|
+
export const bodyValueOriginsOf = (body) => {
|
|
88
|
+
const computeOrigins = new Map();
|
|
89
|
+
const propertyReadOrigins = new Map();
|
|
90
|
+
const bindingReadDeclarations = new Map();
|
|
91
|
+
const conversionSources = new Map();
|
|
92
|
+
const callCallees = new Map();
|
|
93
|
+
const recordFieldSources = new Map();
|
|
94
|
+
const thunkValues = new Map();
|
|
95
|
+
const staticKeyTexts = new Map();
|
|
96
|
+
const reads = new Map();
|
|
97
|
+
const calleeReads = new Map();
|
|
98
|
+
for (const block of body.blocks.values()) {
|
|
99
|
+
for (const operation of allOperationsOf(block)) {
|
|
100
|
+
for (const operand of operandsOfIrOperation(operation)) {
|
|
101
|
+
reads.set(operand.value, (reads.get(operand.value) ?? 0) + 1);
|
|
102
|
+
if (operation.kind === 'call' && operand === operation.callee)
|
|
103
|
+
calleeReads.set(operand.value, (calleeReads.get(operand.value) ?? 0) + 1);
|
|
104
|
+
}
|
|
105
|
+
if (operation.kind === 'compute')
|
|
106
|
+
computeOrigins.set(operation.result.id, operation);
|
|
107
|
+
else if (operation.kind === 'get')
|
|
108
|
+
propertyReadOrigins.set(operation.result.id, operation);
|
|
109
|
+
else if (operation.kind === 'binding-read')
|
|
110
|
+
bindingReadDeclarations.set(operation.result.id, operation.declaration);
|
|
111
|
+
else if (operation.kind === 'convert')
|
|
112
|
+
conversionSources.set(operation.result.id, operation.source);
|
|
113
|
+
else if (operation.kind === 'constant')
|
|
114
|
+
staticKeyTexts.set(operation.result.id, operation.text);
|
|
115
|
+
else if (operation.kind === 'call') {
|
|
116
|
+
if (operation.result)
|
|
117
|
+
callCallees.set(operation.result.id, operation.callee.value);
|
|
118
|
+
}
|
|
119
|
+
else if (operation.kind === 'allocate-callable') {
|
|
120
|
+
const carrier = operation.result.representation;
|
|
121
|
+
const payload = carrier.kind === 'optional' ? carrier.payload : carrier;
|
|
122
|
+
if (payload.kind === 'function-value-dispatch' && payload.abi.parameters.length === 0 && payload.abi.receiver === null) {
|
|
123
|
+
thunkValues.set(operation.result.id, operation.functionId);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (operation.kind === 'allocate-record') {
|
|
127
|
+
recordFieldSources.set(operation.result.id, new Map(operation.fields.map((field) => [field.key, field.value])));
|
|
128
|
+
}
|
|
129
|
+
else if (operation.kind === 'set' || operation.kind === 'define-own-property') {
|
|
130
|
+
const storedKey = staticKeyTexts.get(operation.key.value);
|
|
131
|
+
if (storedKey !== undefined) {
|
|
132
|
+
const sources = new Map(recordFieldSources.get(operation.receiver.value) ?? []);
|
|
133
|
+
sources.set(storedKey, operation.value);
|
|
134
|
+
recordFieldSources.set(operation.receiver.value, sources);
|
|
135
|
+
if (operation.result)
|
|
136
|
+
recordFieldSources.set(operation.result.id, sources);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// The transitive closure needs its own fixed point: a value's read set is
|
|
142
|
+
// its own binding-read declaration (if any) unioned with every operand's
|
|
143
|
+
// already-settled read set, iterated until nothing grows.
|
|
144
|
+
const valueCellReads = new Map();
|
|
145
|
+
let changed = true;
|
|
146
|
+
while (changed) {
|
|
147
|
+
changed = false;
|
|
148
|
+
for (const block of body.blocks.values()) {
|
|
149
|
+
for (const operation of allOperationsOf(block)) {
|
|
150
|
+
const result = resultOfIrOperation(operation);
|
|
151
|
+
if (result === null)
|
|
152
|
+
continue;
|
|
153
|
+
const current = valueCellReads.get(result.id);
|
|
154
|
+
const next = new Set(current ?? []);
|
|
155
|
+
const ownDeclaration = bindingReadDeclarations.get(result.id);
|
|
156
|
+
if (ownDeclaration !== undefined)
|
|
157
|
+
next.add(ownDeclaration);
|
|
158
|
+
for (const operand of operandsOfIrOperation(operation)) {
|
|
159
|
+
for (const declaration of valueCellReads.get(operand.value) ?? [])
|
|
160
|
+
next.add(declaration);
|
|
161
|
+
}
|
|
162
|
+
if (current !== undefined && current.size === next.size)
|
|
163
|
+
continue;
|
|
164
|
+
valueCellReads.set(result.id, next);
|
|
165
|
+
changed = true;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
computeOrigins,
|
|
171
|
+
propertyReadOrigins,
|
|
172
|
+
staticKeyTexts,
|
|
173
|
+
bindingReadDeclarations,
|
|
174
|
+
conversionSources,
|
|
175
|
+
callCallees,
|
|
176
|
+
calleeOnlyValues: new Set([...calleeReads].filter(([value, count]) => reads.get(value) === count).map(([value]) => value)),
|
|
177
|
+
recordFieldSources,
|
|
178
|
+
thunkValues,
|
|
179
|
+
valueCellReads
|
|
180
|
+
};
|
|
181
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ConversionNodeId } from '../conversion/algebra.js';
|
|
2
|
+
import type { ConversionCensus } from '../conversion/nodes.js';
|
|
3
|
+
import type { DeclarationId } from '../identity/ids.js';
|
|
4
|
+
import type { ClassLayout } from '../projection/classes.js';
|
|
5
|
+
import type { RepresentationDeriver } from '../representation/derive.js';
|
|
6
|
+
import { type RecordField, type Representation } from '../representation/model.js';
|
|
7
|
+
import type { IrOperand } from './model.js';
|
|
8
|
+
/** The descriptor's value and attribute reads are native fixed slots, not an unknown function invocation. */
|
|
9
|
+
export interface FixedDataDefinitionRecipe {
|
|
10
|
+
readonly nativeFieldProtocol: 'unused' | 'required';
|
|
11
|
+
readonly target: string;
|
|
12
|
+
readonly descriptor: string;
|
|
13
|
+
readonly field: RecordField;
|
|
14
|
+
readonly held: Representation;
|
|
15
|
+
readonly value: RecordField;
|
|
16
|
+
readonly conversion: ConversionNodeId;
|
|
17
|
+
readonly attributes: readonly RecordField[];
|
|
18
|
+
}
|
|
19
|
+
export declare const fixedDataDefinitionRecipeOf: (args: readonly IrOperand[], key: string, result: Representation, deriver: RepresentationDeriver, classes: ReadonlyMap<DeclarationId, ClassLayout>, conversions: ConversionCensus, authenticated: boolean) => FixedDataDefinitionRecipe | null;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { declaredFieldRepresentationOf, recordFieldsOfShape, nativeBaseFieldOf } from '../projection/fields.js';
|
|
2
|
+
import { representationKey } from '../representation/model.js';
|
|
3
|
+
export const fixedDataDefinitionRecipeOf = (args, key, result, deriver, classes, conversions, authenticated) => {
|
|
4
|
+
const target = args[0]?.representation;
|
|
5
|
+
const descriptor = args[2]?.representation;
|
|
6
|
+
if (!target || args.length !== 3 || descriptor?.kind !== 'record' || descriptor.accessors.length > 0)
|
|
7
|
+
return null;
|
|
8
|
+
if (representationKey(result) !== representationKey(target))
|
|
9
|
+
return null;
|
|
10
|
+
const fields = target.kind === 'record' || target.kind === 'record-with-index'
|
|
11
|
+
? target.fields
|
|
12
|
+
: target.kind === 'class-ref' || (target.kind === 'native-record-ref' && target.native === null)
|
|
13
|
+
? recordFieldsOfShape(deriver, target.shapeId)
|
|
14
|
+
: null;
|
|
15
|
+
const field = fields?.find((candidate) => candidate.key === key);
|
|
16
|
+
if (!field || nativeBaseFieldOf(deriver, target, key, classes))
|
|
17
|
+
return null;
|
|
18
|
+
const value = descriptor.fields.find((candidate) => candidate.key === 'value');
|
|
19
|
+
if (!value?.required)
|
|
20
|
+
return null;
|
|
21
|
+
const attributes = descriptor.fields.filter((candidate) => candidate.key !== 'value');
|
|
22
|
+
if (attributes.some((attribute) => !['writable', 'enumerable', 'configurable'].includes(attribute.key) ||
|
|
23
|
+
!attribute.required ||
|
|
24
|
+
attribute.value.kind !== 'scalar' ||
|
|
25
|
+
attribute.value.domain !== 'boolean'))
|
|
26
|
+
return null;
|
|
27
|
+
const held = declaredFieldRepresentationOf(deriver, target, key, classes);
|
|
28
|
+
if (!held)
|
|
29
|
+
return null;
|
|
30
|
+
const conversion = conversions.nodeFor(value.value, held);
|
|
31
|
+
// Dynamic adapters can publish the stored object's native protocol. They
|
|
32
|
+
// cannot support the closed effect claimed by this recipe.
|
|
33
|
+
if (conversion.capability.kind === 'never')
|
|
34
|
+
return null;
|
|
35
|
+
const closed = authenticated &&
|
|
36
|
+
(conversion.capability.kind === 'identity' ||
|
|
37
|
+
((conversion.capability.kind === 'atom' || conversion.capability.kind === 'static') &&
|
|
38
|
+
conversion.capability.materializer.nativeFieldProtocol === 'unused'));
|
|
39
|
+
return {
|
|
40
|
+
nativeFieldProtocol: closed ? 'unused' : 'required',
|
|
41
|
+
target: representationKey(target),
|
|
42
|
+
descriptor: representationKey(descriptor),
|
|
43
|
+
field,
|
|
44
|
+
held,
|
|
45
|
+
value,
|
|
46
|
+
conversion: conversion.id,
|
|
47
|
+
attributes
|
|
48
|
+
};
|
|
49
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { DeclarationId, PhysicalBodyId } from '../identity/ids.js';
|
|
2
|
+
import type { BindingPlacement } from '../projection/bindings.js';
|
|
3
|
+
import { type IrBody } from './model.js';
|
|
4
|
+
/**
|
|
5
|
+
* Carves every generator body `ir/lower.ts` marked with a
|
|
6
|
+
* `generatorPrologueBoundary` into an ordinary OUTER function (the body's own
|
|
7
|
+
* declared signature, running `FunctionDeclarationInstantiation`'s prefix)
|
|
8
|
+
* that tail-calls a private INNER coroutine holding the rest.
|
|
9
|
+
*
|
|
10
|
+
* A C++20 coroutine cannot express the ECMA-262 split within one function
|
|
11
|
+
* (10.2.1 step 8 runs before 15.5.2's `GeneratorStart` ever suspends the
|
|
12
|
+
* body), so this stage physically splits one `IrBody` into two -- reusing
|
|
13
|
+
* the ordinary allocate-callable/call/return primitives so the split reads,
|
|
14
|
+
* to every later stage, exactly like an ordinary nested closure a body
|
|
15
|
+
* allocates and immediately invokes. Every declaration bound by the
|
|
16
|
+
* prologue that the rest of the body still needs gets its own, freshly
|
|
17
|
+
* minted, inner-owned copy -- see `bridgedDeclarationsOf` -- fed from the
|
|
18
|
+
* inner coroutine's own new ABI parameters rather than shared cell
|
|
19
|
+
* identity, which is exactly right: the two halves are different physical
|
|
20
|
+
* frames, and the value merely started out equal.
|
|
21
|
+
*
|
|
22
|
+
* Run once, after `lowerToIr` and before `shakeProgram`/`renderTranslationUnit`
|
|
23
|
+
* (`compiler.ts`), because it needs `placements` -- unavailable inside
|
|
24
|
+
* `lowerToIr` itself -- to give each bridged cell's inner copy an identity.
|
|
25
|
+
*
|
|
26
|
+
* Every step here is deliberately conservative: any shape this module is not
|
|
27
|
+
* certain it carves correctly (a try region straddling the cut, a value
|
|
28
|
+
* crossing the boundary some other way than through a bridged declaration, a
|
|
29
|
+
* hand-built body that fails IR verification) refuses the split for that one
|
|
30
|
+
* owner and leaves its original, unsplit body exactly as `lowerToIr` produced
|
|
31
|
+
* it -- a body that still miscompiles the ECMA-262 timing this module exists
|
|
32
|
+
* to fix, never one that compiles to something silently wrong.
|
|
33
|
+
*/
|
|
34
|
+
export interface GeneratorSplitResult {
|
|
35
|
+
readonly bodies: ReadonlyMap<PhysicalBodyId, IrBody>;
|
|
36
|
+
readonly placements: ReadonlyMap<DeclarationId, BindingPlacement>;
|
|
37
|
+
}
|
|
38
|
+
export declare const splitGeneratorBodies: (bodies: ReadonlyMap<PhysicalBodyId, IrBody>, placements: ReadonlyMap<DeclarationId, BindingPlacement>) => GeneratorSplitResult;
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { irValueId, physicalBodyId } from '../identity/ids.js';
|
|
2
|
+
import { passingOf } from '../representation/model.js';
|
|
3
|
+
import { defaultOwnershipPolicy } from '../representation/policies.js';
|
|
4
|
+
import { allOperationsOf, irBlockId } from './model.js';
|
|
5
|
+
import { operandsOfIrOperation, resultOfIrOperation } from './queries.js';
|
|
6
|
+
import { verifyIrBody } from './verify.js';
|
|
7
|
+
export const splitGeneratorBodies = (bodies, placements) => {
|
|
8
|
+
const nextBodies = new Map(bodies);
|
|
9
|
+
let nextPlacements = placements;
|
|
10
|
+
for (const body of bodies.values()) {
|
|
11
|
+
const boundary = body.generatorPrologueBoundary;
|
|
12
|
+
if (!boundary)
|
|
13
|
+
continue;
|
|
14
|
+
const split = splitOneGeneratorBody(body, boundary, nextPlacements);
|
|
15
|
+
if (!split)
|
|
16
|
+
continue;
|
|
17
|
+
nextBodies.set(split.outer.owner, split.outer);
|
|
18
|
+
nextBodies.set(split.inner.owner, split.inner);
|
|
19
|
+
nextPlacements = split.placements;
|
|
20
|
+
}
|
|
21
|
+
return { bodies: nextBodies, placements: nextPlacements };
|
|
22
|
+
};
|
|
23
|
+
/** Every `DeclarationId` a `binding-read`/`binding-write` operation names, across a set of operations. */
|
|
24
|
+
const declarationsTouchedBy = (operations) => {
|
|
25
|
+
const found = new Set();
|
|
26
|
+
for (const operation of operations) {
|
|
27
|
+
if (operation.kind === 'binding-read' || operation.kind === 'binding-write')
|
|
28
|
+
found.add(operation.declaration);
|
|
29
|
+
}
|
|
30
|
+
return found;
|
|
31
|
+
};
|
|
32
|
+
/** A `binding-read`/`binding-write` operation with its declaration swapped for the inner coroutine's own copy; every other kind is returned unchanged (terminators never name a declaration directly). */
|
|
33
|
+
const rewriteDeclaration = (operation, remap) => {
|
|
34
|
+
if (operation.kind !== 'binding-read' && operation.kind !== 'binding-write')
|
|
35
|
+
return operation;
|
|
36
|
+
const to = remap.get(operation.declaration);
|
|
37
|
+
return to === undefined ? operation : { ...operation, declaration: to };
|
|
38
|
+
};
|
|
39
|
+
const valuesIndexOf = (blocks) => {
|
|
40
|
+
const values = new Map();
|
|
41
|
+
for (const block of blocks) {
|
|
42
|
+
for (const operation of allOperationsOf(block)) {
|
|
43
|
+
const result = resultOfIrOperation(operation);
|
|
44
|
+
if (result)
|
|
45
|
+
values.set(result.id, result.representation);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return values;
|
|
49
|
+
};
|
|
50
|
+
/** Whether every operand any of `operations` reads is defined by one of `operations` itself -- the generic guard against a value crossing the cut some way other than through a bridged declaration (a cached `receiver`, or any other reuse this module did not anticipate). */
|
|
51
|
+
const isSelfContained = (blocks, iteratorCloseRegions) => {
|
|
52
|
+
const defined = new Set();
|
|
53
|
+
for (const block of blocks)
|
|
54
|
+
for (const operation of allOperationsOf(block)) {
|
|
55
|
+
const result = resultOfIrOperation(operation);
|
|
56
|
+
if (result)
|
|
57
|
+
defined.add(result.id);
|
|
58
|
+
}
|
|
59
|
+
for (const block of blocks) {
|
|
60
|
+
for (const operation of allOperationsOf(block)) {
|
|
61
|
+
for (const operand of operandsOfIrOperation(operation))
|
|
62
|
+
if (!defined.has(operand.value))
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
for (const region of iteratorCloseRegions)
|
|
67
|
+
if (!defined.has(region.iterator.value))
|
|
68
|
+
return false;
|
|
69
|
+
return true;
|
|
70
|
+
};
|
|
71
|
+
const splitOneGeneratorBody = (body, boundary, placements) => {
|
|
72
|
+
const abi = body.abi;
|
|
73
|
+
// Void is impossible for a real generator (it always hands back an
|
|
74
|
+
// Iterator), and `construct` never applies to one (`new` on a generator
|
|
75
|
+
// function throws) -- both are defensive refusals for a shape this body
|
|
76
|
+
// cannot actually have, not a case this module means to support.
|
|
77
|
+
if (!abi || abi.result.kind === 'void' || body.construct)
|
|
78
|
+
return null;
|
|
79
|
+
const cutBlock = body.blocks.get(boundary.block);
|
|
80
|
+
if (!cutBlock)
|
|
81
|
+
return null;
|
|
82
|
+
// A try/catch/finally cannot lexically wrap a parameter list, so every
|
|
83
|
+
// region belongs entirely to the rest of the body -- UNLESS the try
|
|
84
|
+
// statement is the very first thing after the parameters and its own
|
|
85
|
+
// entry was scheduled into the same block the last default's merge lands
|
|
86
|
+
// in, in which case this module cannot tell "outer" and "inner" apart for
|
|
87
|
+
// that one block by original id alone. Refuse rather than guess.
|
|
88
|
+
const boundaryTouchesRegion = body.tryRegions.some((region) => region.tryEntry === boundary.block ||
|
|
89
|
+
region.catchEntry === boundary.block ||
|
|
90
|
+
region.finallyEntry === boundary.block ||
|
|
91
|
+
region.finallyExit === boundary.block ||
|
|
92
|
+
region.join === boundary.block);
|
|
93
|
+
if (boundaryTouchesRegion)
|
|
94
|
+
return null;
|
|
95
|
+
// IteratorClose regions are lexical C++ scopes too. A region whose block
|
|
96
|
+
// interval touches the split block cannot be divided at an operation index
|
|
97
|
+
// without also splitting its guard lifetime, so refuse that optimization
|
|
98
|
+
// rather than silently dropping or widening cleanup. Regions wholly on one
|
|
99
|
+
// side are preserved below with their original block identities.
|
|
100
|
+
const boundaryTouchesIteratorCloseRegion = (body.iteratorCloseRegions ?? []).some((region) => region.entry === boundary.block || region.blocks.includes(boundary.block) || region.dismissTargets.includes(boundary.block));
|
|
101
|
+
if (boundaryTouchesIteratorCloseRegion)
|
|
102
|
+
return null;
|
|
103
|
+
const headOperations = cutBlock.operations.slice(0, boundary.operationIndex);
|
|
104
|
+
const tailOperations = cutBlock.operations.slice(boundary.operationIndex);
|
|
105
|
+
const restBlockIds = body.blockOrder.filter((id) => !boundary.outerBlocks.has(id));
|
|
106
|
+
const restBlockIdSet = new Set(restBlockIds);
|
|
107
|
+
const outerRegions = [];
|
|
108
|
+
const innerRegions = [];
|
|
109
|
+
for (const region of body.tryRegions) {
|
|
110
|
+
const refs = [region.tryEntry, region.catchEntry, region.finallyEntry, region.finallyExit, region.join].filter((ref) => ref !== null);
|
|
111
|
+
const allOuter = refs.every((ref) => boundary.outerBlocks.has(ref));
|
|
112
|
+
const allInner = refs.every((ref) => restBlockIdSet.has(ref));
|
|
113
|
+
if (allOuter)
|
|
114
|
+
outerRegions.push(region);
|
|
115
|
+
else if (allInner)
|
|
116
|
+
innerRegions.push(region);
|
|
117
|
+
else
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
const outerIteratorCloseRegions = [];
|
|
121
|
+
const innerIteratorCloseRegions = [];
|
|
122
|
+
for (const region of body.iteratorCloseRegions ?? []) {
|
|
123
|
+
const refs = [region.entry, ...region.blocks, ...region.dismissTargets];
|
|
124
|
+
const allOuter = refs.every((ref) => boundary.outerBlocks.has(ref));
|
|
125
|
+
const allInner = refs.every((ref) => restBlockIdSet.has(ref));
|
|
126
|
+
if (allOuter)
|
|
127
|
+
outerIteratorCloseRegions.push(region);
|
|
128
|
+
else if (allInner)
|
|
129
|
+
innerIteratorCloseRegions.push(region);
|
|
130
|
+
else
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
// Every declaration the prologue's own outer half writes, that the rest of
|
|
134
|
+
// the body still reads or writes: the cells the inner coroutine needs its
|
|
135
|
+
// own copy of. A declaration outer writes but rest never touches is purely
|
|
136
|
+
// internal to the prologue (a default's own guard test, say) and needs no
|
|
137
|
+
// bridge; one rest introduces itself (`var it = ...`) is already its own,
|
|
138
|
+
// ordinary inner-owned local and needs no bridge either.
|
|
139
|
+
const outerWritten = new Set();
|
|
140
|
+
for (const id of boundary.outerBlocks) {
|
|
141
|
+
if (id === boundary.block)
|
|
142
|
+
continue;
|
|
143
|
+
const block = body.blocks.get(id);
|
|
144
|
+
if (block)
|
|
145
|
+
for (const operation of block.operations)
|
|
146
|
+
if (operation.kind === 'binding-write')
|
|
147
|
+
outerWritten.add(operation.declaration);
|
|
148
|
+
}
|
|
149
|
+
for (const operation of headOperations)
|
|
150
|
+
if (operation.kind === 'binding-write')
|
|
151
|
+
outerWritten.add(operation.declaration);
|
|
152
|
+
const restOperationsFlat = [...tailOperations, cutBlock.terminator];
|
|
153
|
+
for (const id of restBlockIds) {
|
|
154
|
+
const block = body.blocks.get(id);
|
|
155
|
+
if (block)
|
|
156
|
+
restOperationsFlat.push(...allOperationsOf(block));
|
|
157
|
+
}
|
|
158
|
+
const restReferenced = declarationsTouchedBy(restOperationsFlat);
|
|
159
|
+
const bridged = [...outerWritten].filter((id) => restReferenced.has(id));
|
|
160
|
+
const bridgedRepresentations = new Map();
|
|
161
|
+
for (const id of bridged) {
|
|
162
|
+
const representation = placements.get(id)?.representation;
|
|
163
|
+
if (!representation || representation.kind === 'unresolved')
|
|
164
|
+
return null;
|
|
165
|
+
bridgedRepresentations.set(id, representation);
|
|
166
|
+
}
|
|
167
|
+
const needsReceiver = restOperationsFlat.some((operation) => operation.kind === 'receiver');
|
|
168
|
+
// A `receiver` operation with no receiver of THIS body's own ABI is a
|
|
169
|
+
// relayed, captured `this` from an enclosing frame -- a real shape, but not
|
|
170
|
+
// one this module bridges (see the file comment): refuse rather than drop
|
|
171
|
+
// the read silently.
|
|
172
|
+
if (needsReceiver && abi.receiver === null)
|
|
173
|
+
return null;
|
|
174
|
+
const innerOwnerId = `${body.sourceOwner}#generator-inner`;
|
|
175
|
+
const innerPhysicalBodyId = physicalBodyId(innerOwnerId, 'default');
|
|
176
|
+
const innerDeclarationOf = new Map(bridged.map((id) => [id, `${id}@generator-inner`]));
|
|
177
|
+
// Every other ABI in this compiler picks a parameter's passing mode from the
|
|
178
|
+
// representation's OWN ownership (`representation/policies.ts`'s
|
|
179
|
+
// `defaultOwnershipPolicy.forParameter`, the one every real function's ABI
|
|
180
|
+
// is derived with, `representation/derive.ts`'s `abiOf`) -- `owned` is only
|
|
181
|
+
// the fallback for a carrier that states no ownership of its own (a scalar,
|
|
182
|
+
// a string). Hardcoding `owned` here disagreed with that for every
|
|
183
|
+
// refcounted carrier (`array-object`, `record`, `class-ref`, a keyed
|
|
184
|
+
// collection...): the OUTER half still reads the bridged cell as whatever it
|
|
185
|
+
// is actually stored as -- `gea::Ref<gea::ArrayObject<double>>` for a
|
|
186
|
+
// `shared-refcount` array -- and passes that to the call, while this
|
|
187
|
+
// declared the inner coroutine's formal as the bare, unwrapped carrier
|
|
188
|
+
// (`gea::ArrayObject<double>`), a frame mismatch clang reports as "no
|
|
189
|
+
// matching function for call". The call's argument and the declaration it
|
|
190
|
+
// targets must agree on the SAME ownership, exactly as `cppAbiParameterType`
|
|
191
|
+
// assumes everywhere else.
|
|
192
|
+
const innerAbi = {
|
|
193
|
+
parameters: bridged.map((id) => {
|
|
194
|
+
const value = bridgedRepresentations.get(id);
|
|
195
|
+
const parameterOwnership = defaultOwnershipPolicy.forParameter(value);
|
|
196
|
+
return { value, ownership: parameterOwnership, passing: passingOf(value, parameterOwnership) };
|
|
197
|
+
}),
|
|
198
|
+
result: abi.result,
|
|
199
|
+
receiver: needsReceiver ? abi.receiver : null,
|
|
200
|
+
restFrom: null
|
|
201
|
+
};
|
|
202
|
+
const lineage = headOperations[headOperations.length - 1]?.lineage ?? tailOperations[0]?.lineage ?? cutBlock.terminator.lineage;
|
|
203
|
+
if (!lineage)
|
|
204
|
+
return null;
|
|
205
|
+
// The inner coroutine's own entry: one `parameter` + `binding-write` pair
|
|
206
|
+
// per bridged cell, in the SAME order `innerAbi.parameters` declares them,
|
|
207
|
+
// followed by the rest of the body exactly as it was -- reachable rewrites
|
|
208
|
+
// and all.
|
|
209
|
+
let innerOrdinal = 0;
|
|
210
|
+
const innerEntryOperations = [];
|
|
211
|
+
bridged.forEach((id, ordinal) => {
|
|
212
|
+
const representation = bridgedRepresentations.get(id);
|
|
213
|
+
const paramResult = irValueId(innerPhysicalBodyId, innerOrdinal++);
|
|
214
|
+
innerEntryOperations.push({ kind: 'parameter', lineage, ordinal, result: { id: paramResult, representation } });
|
|
215
|
+
innerEntryOperations.push({
|
|
216
|
+
kind: 'binding-write',
|
|
217
|
+
lineage,
|
|
218
|
+
declaration: innerDeclarationOf.get(id),
|
|
219
|
+
value: { value: paramResult, representation }
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
for (const operation of tailOperations)
|
|
223
|
+
innerEntryOperations.push(rewriteDeclaration(operation, innerDeclarationOf));
|
|
224
|
+
const innerEntryTerminator = cutBlock.terminator;
|
|
225
|
+
const innerEntryBlockId = irBlockId(innerPhysicalBodyId, 0);
|
|
226
|
+
const innerEntryBlock = { id: innerEntryBlockId, operations: innerEntryOperations, terminator: innerEntryTerminator };
|
|
227
|
+
const innerRestBlocks = restBlockIds.map((id) => {
|
|
228
|
+
const block = body.blocks.get(id);
|
|
229
|
+
if (!block)
|
|
230
|
+
throw new Error(`generator split: body ${body.owner} lists block ${id} in blockOrder but has no matching block`);
|
|
231
|
+
return {
|
|
232
|
+
id,
|
|
233
|
+
operations: block.operations.map((operation) => rewriteDeclaration(operation, innerDeclarationOf)),
|
|
234
|
+
terminator: block.terminator
|
|
235
|
+
};
|
|
236
|
+
});
|
|
237
|
+
const innerBlockOrder = [innerEntryBlockId, ...restBlockIds];
|
|
238
|
+
const innerBlocks = new Map([
|
|
239
|
+
[innerEntryBlockId, innerEntryBlock],
|
|
240
|
+
...innerRestBlocks.map((block) => [block.id, block])
|
|
241
|
+
]);
|
|
242
|
+
const allInnerBlocks = [innerEntryBlock, ...innerRestBlocks];
|
|
243
|
+
if (!isSelfContained(allInnerBlocks, innerIteratorCloseRegions))
|
|
244
|
+
return null;
|
|
245
|
+
const inner = {
|
|
246
|
+
owner: innerPhysicalBodyId,
|
|
247
|
+
sourceOwner: innerOwnerId,
|
|
248
|
+
abi: innerAbi,
|
|
249
|
+
construct: null,
|
|
250
|
+
generator: true,
|
|
251
|
+
entry: innerEntryBlockId,
|
|
252
|
+
blocks: innerBlocks,
|
|
253
|
+
blockOrder: innerBlockOrder,
|
|
254
|
+
values: valuesIndexOf(allInnerBlocks),
|
|
255
|
+
tryRegions: innerRegions,
|
|
256
|
+
iteratorCloseRegions: innerIteratorCloseRegions
|
|
257
|
+
};
|
|
258
|
+
// The outer half: the same declared signature, ending where the boundary
|
|
259
|
+
// says to -- an allocation of the inner coroutine (rendered, like any
|
|
260
|
+
// other never-escaping closure allocation, as a direct call -- see
|
|
261
|
+
// `targets/cpp/emit.ts`'s `registerDirectCalleeOfDeadValue`), a read of
|
|
262
|
+
// every bridged cell's CURRENT value, and a call forwarding them, whose
|
|
263
|
+
// result this returns unchanged.
|
|
264
|
+
const outerBlocksList = body.blockOrder.filter((id) => boundary.outerBlocks.has(id));
|
|
265
|
+
let outerOrdinal = 0;
|
|
266
|
+
const nextOuterValue = () => irValueId(body.owner, 1_000_000 + outerOrdinal++);
|
|
267
|
+
const extraOuterOperations = [];
|
|
268
|
+
const calleeRepresentation = { kind: 'function', functionId: innerOwnerId, abi: innerAbi };
|
|
269
|
+
const calleeResult = nextOuterValue();
|
|
270
|
+
extraOuterOperations.push({
|
|
271
|
+
kind: 'allocate-callable',
|
|
272
|
+
lineage,
|
|
273
|
+
functionId: innerOwnerId,
|
|
274
|
+
captures: [],
|
|
275
|
+
result: { id: calleeResult, representation: calleeRepresentation }
|
|
276
|
+
});
|
|
277
|
+
let receiverOperand = null;
|
|
278
|
+
if (needsReceiver && abi.receiver !== null) {
|
|
279
|
+
const receiverRepresentation = abi.receiver;
|
|
280
|
+
const receiverResult = nextOuterValue();
|
|
281
|
+
extraOuterOperations.push({ kind: 'receiver', lineage, result: { id: receiverResult, representation: receiverRepresentation } });
|
|
282
|
+
receiverOperand = { value: receiverResult, representation: receiverRepresentation };
|
|
283
|
+
}
|
|
284
|
+
const argumentOperands = bridged.map((id) => {
|
|
285
|
+
const representation = bridgedRepresentations.get(id);
|
|
286
|
+
const readResult = nextOuterValue();
|
|
287
|
+
extraOuterOperations.push({ kind: 'binding-read', lineage, declaration: id, result: { id: readResult, representation } });
|
|
288
|
+
return { value: readResult, representation };
|
|
289
|
+
});
|
|
290
|
+
const callResult = nextOuterValue();
|
|
291
|
+
extraOuterOperations.push({
|
|
292
|
+
kind: 'call',
|
|
293
|
+
lineage,
|
|
294
|
+
callee: { value: calleeResult, representation: calleeRepresentation },
|
|
295
|
+
receiver: receiverOperand,
|
|
296
|
+
arguments: argumentOperands,
|
|
297
|
+
result: { id: callResult, representation: abi.result }
|
|
298
|
+
});
|
|
299
|
+
const outerCutBlock = {
|
|
300
|
+
id: boundary.block,
|
|
301
|
+
operations: [...headOperations, ...extraOuterOperations],
|
|
302
|
+
terminator: { kind: 'return', lineage: null, value: { value: callResult, representation: abi.result } }
|
|
303
|
+
};
|
|
304
|
+
const outerBlocks = new Map(outerBlocksList.map((id) => [id, id === boundary.block ? outerCutBlock : body.blocks.get(id)]));
|
|
305
|
+
const allOuterBlocks = outerBlocksList.map((id) => outerBlocks.get(id));
|
|
306
|
+
if (!isSelfContained(allOuterBlocks, outerIteratorCloseRegions))
|
|
307
|
+
return null;
|
|
308
|
+
const outer = {
|
|
309
|
+
...body,
|
|
310
|
+
generator: false,
|
|
311
|
+
generatorPrologueBoundary: null,
|
|
312
|
+
blockOrder: outerBlocksList,
|
|
313
|
+
blocks: outerBlocks,
|
|
314
|
+
values: valuesIndexOf(allOuterBlocks),
|
|
315
|
+
tryRegions: outerRegions,
|
|
316
|
+
iteratorCloseRegions: outerIteratorCloseRegions
|
|
317
|
+
};
|
|
318
|
+
const violations = [...verifyIrBody(outer), ...verifyIrBody(inner)];
|
|
319
|
+
if (violations.length > 0)
|
|
320
|
+
return null;
|
|
321
|
+
const nextPlacements = new Map(placements);
|
|
322
|
+
for (const [originalId, newId] of innerDeclarationOf) {
|
|
323
|
+
nextPlacements.set(newId, {
|
|
324
|
+
storage: { kind: 'local', owner: innerOwnerId },
|
|
325
|
+
representation: bridgedRepresentations.get(originalId) ?? null
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
return { outer, inner, placements: nextPlacements };
|
|
329
|
+
};
|