@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,513 @@
|
|
|
1
|
+
import { controlFlowGraphOf } from '../../ir/dominance.js';
|
|
2
|
+
import { thrownValueCarrier } from '../../ir/lower-exceptions.js';
|
|
3
|
+
import { successorsOfTerminator } from '../../ir/queries.js';
|
|
4
|
+
import { createCppEmitBlockedError, defineValueBoundElsewhere, operandText } from './emit-context.js';
|
|
5
|
+
import { cppFinallyGuardName, cppFinallyPendingName, cppTypeOf } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Every block one part of a region owns: reachable from that part's entry
|
|
8
|
+
* without passing through the region's join, minus everything the try
|
|
9
|
+
* STATEMENT does not contain.
|
|
10
|
+
*
|
|
11
|
+
* The join is where both parts hand control back to the ordinary per-block
|
|
12
|
+
* loop, so it belongs to neither and stops the walk. A part that never reaches
|
|
13
|
+
* it -- both arms `return` -- simply runs out of successors instead.
|
|
14
|
+
*
|
|
15
|
+
* Reachability alone is not ownership, and a jump OUT of the part is what
|
|
16
|
+
* exposes the difference. A `continue` written inside a catch handler --
|
|
17
|
+
* hono's `SmartRouter.match` skipping a router that rejected the route set --
|
|
18
|
+
* targets the enclosing loop's latch, so the plain walk collected the latch,
|
|
19
|
+
* then the loop header, then the header's test, and then walked straight back
|
|
20
|
+
* into the try body: the handler "owned" the body's blocks and emission
|
|
21
|
+
* refused with `a catch handler contains a block reached by a jump from
|
|
22
|
+
* outside it`. The jump the source wrote is legal C++ (leaving a try block is
|
|
23
|
+
* fine; only entering one is not); it was the walk that was wrong.
|
|
24
|
+
*
|
|
25
|
+
* Two cuts fix it, and both are about what the BRACES may contain rather than
|
|
26
|
+
* about what control can reach.
|
|
27
|
+
*
|
|
28
|
+
* The first is the enclosing loop's own cycle. A block from which the region's
|
|
29
|
+
* `tryEntry` is reachable again -- without going through the join, which the
|
|
30
|
+
* walk already stops at -- can only be on a path that RE-ENTERS the try
|
|
31
|
+
* statement, so it is the enclosing loop's latch, header or test and not part
|
|
32
|
+
* of this statement at all. That is exactly what ECMAScript says: `continue`
|
|
33
|
+
* completes the try statement first and the incrementor runs after it, so
|
|
34
|
+
* rendering the latch inside `try { }` would put a throwing `for (;; next())`
|
|
35
|
+
* under a handler the language says it has left. A loop written INSIDE the try
|
|
36
|
+
* body is untouched, because its latch reaches its own header and never
|
|
37
|
+
* `tryEntry` -- nothing jumps back to the first block of a try statement from
|
|
38
|
+
* within it.
|
|
39
|
+
*
|
|
40
|
+
* The second is entry-dominance, as a fixpoint rather than a dominator query:
|
|
41
|
+
* a catch entry is reached by NO control-flow edge and so is globally
|
|
42
|
+
* unreachable, and `dominatorTreeOf` fails closed on exactly the part that
|
|
43
|
+
* needs it most. Dropping every non-entry block that has a predecessor outside
|
|
44
|
+
* the set, until nothing more drops, computes entry-dominance within the
|
|
45
|
+
* walked subgraph, which is what the braces require: a block rendered inside
|
|
46
|
+
* them must have no way in except through them.
|
|
47
|
+
*
|
|
48
|
+
* Neither cut can shrink a set that used to be accepted. `verifyNoInboundJumps`
|
|
49
|
+
* already demanded that no non-entry owned block have an outside predecessor
|
|
50
|
+
* -- the fixpoint's own stopping condition -- and a set holding a block that
|
|
51
|
+
* re-enters `tryEntry` necessarily held `tryEntry`'s outside predecessor too,
|
|
52
|
+
* which that check refused.
|
|
53
|
+
*/
|
|
54
|
+
const collectPartBlocks = (body, entry, join, regionEntry) => {
|
|
55
|
+
const owned = new Set();
|
|
56
|
+
const pending = [entry];
|
|
57
|
+
while (pending.length > 0) {
|
|
58
|
+
const current = pending.pop();
|
|
59
|
+
if (current === undefined || current === join || owned.has(current))
|
|
60
|
+
continue;
|
|
61
|
+
owned.add(current);
|
|
62
|
+
const block = body.blocks.get(current);
|
|
63
|
+
if (!block)
|
|
64
|
+
throw new Error(`ir body ${body.owner} names block ${current} in a try region but has no matching block`);
|
|
65
|
+
for (const successor of successorsOfTerminator(block.terminator))
|
|
66
|
+
pending.push(successor);
|
|
67
|
+
}
|
|
68
|
+
const predecessors = controlFlowGraphOf(body).predecessors;
|
|
69
|
+
// Backwards from the region's own first block, over predecessors the walk
|
|
70
|
+
// already admitted: every block from which the try statement is re-entered.
|
|
71
|
+
const reenters = new Set();
|
|
72
|
+
const backwards = [regionEntry];
|
|
73
|
+
while (backwards.length > 0) {
|
|
74
|
+
const current = backwards.pop();
|
|
75
|
+
if (current === undefined)
|
|
76
|
+
continue;
|
|
77
|
+
for (const from of predecessors.get(current) ?? []) {
|
|
78
|
+
if (!owned.has(from) || reenters.has(from))
|
|
79
|
+
continue;
|
|
80
|
+
reenters.add(from);
|
|
81
|
+
backwards.push(from);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
for (const id of reenters)
|
|
85
|
+
if (id !== entry)
|
|
86
|
+
owned.delete(id);
|
|
87
|
+
for (let dropped = true; dropped;) {
|
|
88
|
+
dropped = false;
|
|
89
|
+
for (const id of owned) {
|
|
90
|
+
if (id === entry)
|
|
91
|
+
continue;
|
|
92
|
+
if ((predecessors.get(id) ?? []).every((from) => owned.has(from)))
|
|
93
|
+
continue;
|
|
94
|
+
owned.delete(id);
|
|
95
|
+
dropped = true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return owned;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* The rendering order for one part: its entry first, then everything else in
|
|
102
|
+
* the body's own block order.
|
|
103
|
+
*
|
|
104
|
+
* The entry has to come first because it is reached by FALLTHROUGH -- into
|
|
105
|
+
* `try {` from the predecessor whose `goto` `emit.ts` omits, and into
|
|
106
|
+
* `catch (...) {` from the native unwinder. Neither can land on a label, so
|
|
107
|
+
* whatever is written first inside those braces is what runs first. Every other
|
|
108
|
+
* block is reached by an ordinary `goto` and so may sit in any order; taking
|
|
109
|
+
* the body's own keeps the output stable and matches the loop outside.
|
|
110
|
+
*/
|
|
111
|
+
const partOrder = (body, owned, entry, rendersItself) => [entry, ...body.blockOrder.filter((id) => owned.has(id) && id !== entry && !rendersItself.has(id))];
|
|
112
|
+
/**
|
|
113
|
+
* Every block a region owns, across all three of its parts and every region
|
|
114
|
+
* nested inside them. A nested region's catch handler and finally clause are
|
|
115
|
+
* reached by no control-flow edge, so a reachability walk from the outer
|
|
116
|
+
* part's entry never finds them -- yet textually they sit inside the outer
|
|
117
|
+
* braces, and a jump out of them to the outer part is a jump WITHIN the outer
|
|
118
|
+
* try block, which C++ allows. Counting them as the outer part's own is what
|
|
119
|
+
* lets `verifyNoInboundJumps` see that edge for what it is.
|
|
120
|
+
*/
|
|
121
|
+
const blocksOfRegion = (body, region, rendering) => {
|
|
122
|
+
const all = new Set();
|
|
123
|
+
for (const entry of [region.tryEntry, region.catchEntry, region.finallyEntry]) {
|
|
124
|
+
if (entry === null)
|
|
125
|
+
continue;
|
|
126
|
+
for (const id of collectPartBlocks(body, entry, region.join, region.tryEntry))
|
|
127
|
+
all.add(id);
|
|
128
|
+
}
|
|
129
|
+
for (const id of [...all]) {
|
|
130
|
+
const nested = id === region.tryEntry ? undefined : rendering.regionByTryEntry.get(id);
|
|
131
|
+
if (nested)
|
|
132
|
+
for (const inner of blocksOfRegion(body, nested, rendering))
|
|
133
|
+
all.add(inner);
|
|
134
|
+
// A finite destructuring / `for`-`of` written directly inside this try
|
|
135
|
+
// region's own body/handler/finally names its OWN block list already
|
|
136
|
+
// (`IrIteratorCloseRegion.blocks`, computed by `iterator-close-regions-of`
|
|
137
|
+
// in `ir/lower.ts` over the very same predecessor-closure `closeRegionOverGraph`
|
|
138
|
+
// uses for a loop's) -- no recursive reachability walk is needed here the
|
|
139
|
+
// way a try region's needs one for its handler/finally, which no ordinary
|
|
140
|
+
// control-flow edge reaches.
|
|
141
|
+
const nestedIteratorClose = id === region.tryEntry ? undefined : rendering.iteratorCloseRegionByEntry.get(id);
|
|
142
|
+
if (nestedIteratorClose)
|
|
143
|
+
for (const inner of nestedIteratorClose.blocks)
|
|
144
|
+
all.add(inner);
|
|
145
|
+
}
|
|
146
|
+
return all;
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Refuses a part no native `try`/`catch` can express, by name, before a line of it is written.
|
|
150
|
+
*
|
|
151
|
+
* The rule C++ states is narrow and exact: a `goto` may not enter a `try` block
|
|
152
|
+
* or a handler from outside. So every edge into an interior block must come
|
|
153
|
+
* from inside the same part, and the entry itself may be entered from outside
|
|
154
|
+
* at most once -- that one entry being the fallthrough. A second outside
|
|
155
|
+
* predecessor would need a `goto` the language does not allow, and a source
|
|
156
|
+
* program cannot write one anyway; reaching this means the graph disagrees with
|
|
157
|
+
* the source, which is worth saying rather than silently emitting a jump the
|
|
158
|
+
* compiler will reject.
|
|
159
|
+
*/
|
|
160
|
+
const verifyNoInboundJumps = (body, owned, entry, describe) => {
|
|
161
|
+
const predecessors = controlFlowGraphOf(body).predecessors;
|
|
162
|
+
for (const id of owned) {
|
|
163
|
+
const outside = (predecessors.get(id) ?? []).filter((from) => !owned.has(from));
|
|
164
|
+
if (id === entry) {
|
|
165
|
+
if (outside.length > 1) {
|
|
166
|
+
throw createCppEmitBlockedError('runtime-helper:control:try', `${describe} is entered from ${outside.length} places outside it; C++ enters a try block by falling into it, which admits exactly one`);
|
|
167
|
+
}
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (outside.length > 0) {
|
|
171
|
+
throw createCppEmitBlockedError('runtime-helper:control:try', `${describe} contains a block reached by a jump from outside it, which C++ forbids ("goto" into a try block)`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* One part's blocks, rendered exactly as the ordinary per-block loop renders
|
|
177
|
+
* every other block: label, operations, merge writes, terminator.
|
|
178
|
+
*
|
|
179
|
+
* A label is written only for a block something in this part actually jumps to.
|
|
180
|
+
* Nothing outside can (that is what `verifyNoInboundJumps` just established),
|
|
181
|
+
* so an untargeted block needs no label -- which keeps the common straight-line
|
|
182
|
+
* case rendering as the plain run of statements it always was.
|
|
183
|
+
*
|
|
184
|
+
* The terminator is always rendered, including the trailing `jump` to the
|
|
185
|
+
* region's join. That jump used to be omitted, on the reasoning that the join's
|
|
186
|
+
* own text follows immediately and fallthrough reaches it either way. That
|
|
187
|
+
* holds for exactly one exit; a body that branches has several, and only one of
|
|
188
|
+
* them can be the last thing inside the brace. Writing the `goto` every time is
|
|
189
|
+
* correct for all of them, and costs a jump to the next line in the case that
|
|
190
|
+
* used to fall through.
|
|
191
|
+
*/
|
|
192
|
+
const renderPart = (ctx, body, rendering, order, owned, skipFirstOperation, entryLabelledOutside) => {
|
|
193
|
+
const targeted = new Set();
|
|
194
|
+
for (const id of owned) {
|
|
195
|
+
const block = body.blocks.get(id);
|
|
196
|
+
if (!block)
|
|
197
|
+
continue;
|
|
198
|
+
for (const successor of successorsOfTerminator(block.terminator))
|
|
199
|
+
if (owned.has(successor))
|
|
200
|
+
targeted.add(successor);
|
|
201
|
+
}
|
|
202
|
+
const lines = [];
|
|
203
|
+
order.forEach((id, index) => {
|
|
204
|
+
const block = body.blocks.get(id);
|
|
205
|
+
if (!block)
|
|
206
|
+
return;
|
|
207
|
+
// A nested try statement is rendered where its entry falls, as its own
|
|
208
|
+
// `try`/`catch` text inside this part's braces: C++ nests try blocks
|
|
209
|
+
// freely, and the nested region's interior blocks were left out of this
|
|
210
|
+
// part's order (`partOrder`) precisely so the nested rendering owns them.
|
|
211
|
+
const nested = index === 0 ? undefined : rendering.regionByTryEntry.get(id);
|
|
212
|
+
if (nested) {
|
|
213
|
+
renderTryRegion(ctx, lines, body, nested, rendering);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
// The identical accommodation for a `for`-`of`/finite-destructuring
|
|
217
|
+
// IteratorClose region whose entry falls inside this part: it renders its
|
|
218
|
+
// own `CompletionGuard`/`try`/`catch` text, exactly as a nested try does.
|
|
219
|
+
const nestedIteratorClose = index === 0 ? undefined : rendering.iteratorCloseRegionByEntry.get(id);
|
|
220
|
+
if (nestedIteratorClose) {
|
|
221
|
+
rendering.renderIteratorCloseRegion(ctx, lines, body, nestedIteratorClose, rendering);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
// The entry's own label belongs OUTSIDE the braces -- `renderTryRegion`
|
|
225
|
+
// writes it there so a jump into the region is an ordinary `goto` -- and
|
|
226
|
+
// repeating it here would define one label twice.
|
|
227
|
+
if (targeted.has(id) && !(index === 0 && entryLabelledOutside))
|
|
228
|
+
lines.push(`${rendering.labelOf(rendering.labels, id)}:`);
|
|
229
|
+
const operations = index === 0 && skipFirstOperation ? block.operations.slice(1) : block.operations;
|
|
230
|
+
for (const operation of operations) {
|
|
231
|
+
// A read the hoist plan RELOCATED renders in its destination block, not
|
|
232
|
+
// here. The ordinary per-block loop has always skipped it at its origin;
|
|
233
|
+
// this part did not, and a try body holding a loop-invariant read inside
|
|
234
|
+
// an enclosing loop -- `try { found = attempt(i) } catch { continue }`,
|
|
235
|
+
// whose `attempt` binding is hoisted to the loop's preheader -- defined
|
|
236
|
+
// the same SSA value twice. It went unseen only because every shape that
|
|
237
|
+
// reaches it was refused a step earlier, for the unrelated reason
|
|
238
|
+
// `collectPartBlocks` records.
|
|
239
|
+
const result = 'result' in operation ? operation.result : null;
|
|
240
|
+
if (result && rendering.relocated.has(result.id))
|
|
241
|
+
continue;
|
|
242
|
+
rendering.emitOperation(ctx, lines, operation);
|
|
243
|
+
}
|
|
244
|
+
// The other half of the same plan, in the same order the ordinary loop
|
|
245
|
+
// writes it: the reads hoisted INTO this block, then the merge writes,
|
|
246
|
+
// then a dense window's setup, then a counted fill loop -- which REPLACES
|
|
247
|
+
// the terminator, and says so by answering `true`.
|
|
248
|
+
rendering.emitHoistedInto(ctx, lines, id);
|
|
249
|
+
for (const write of rendering.mergeWrites.get(id) ?? [])
|
|
250
|
+
lines.push(`${write.name} = ${operandText(ctx, write.value)};`);
|
|
251
|
+
if (rendering.emitBlockTail(ctx, lines, id))
|
|
252
|
+
return;
|
|
253
|
+
rendering.emitTerminator(ctx, lines, rendering.labels, rendering.isSingleBlock, block.terminator);
|
|
254
|
+
});
|
|
255
|
+
return lines;
|
|
256
|
+
};
|
|
257
|
+
/** Every block of one part, refused as a whole if it holds a shape no native handler can express. */
|
|
258
|
+
const preparePart = (body, rendering, region, entry, join, describe) => {
|
|
259
|
+
const reachable = collectPartBlocks(body, entry, join, region.tryEntry);
|
|
260
|
+
// A nested try statement's blocks -- all three parts, handlers included --
|
|
261
|
+
// belong to this part for ownership and for the inbound-jump check, and are
|
|
262
|
+
// rendered by the nested region itself rather than by this part's loop.
|
|
263
|
+
const owned = new Set(reachable);
|
|
264
|
+
const rendersItself = new Set();
|
|
265
|
+
for (const id of reachable) {
|
|
266
|
+
const nested = id === entry ? undefined : rendering.regionByTryEntry.get(id);
|
|
267
|
+
if (nested) {
|
|
268
|
+
for (const inner of blocksOfRegion(body, nested, rendering)) {
|
|
269
|
+
owned.add(inner);
|
|
270
|
+
if (inner !== id)
|
|
271
|
+
rendersItself.add(inner);
|
|
272
|
+
}
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
// A finite destructuring/`for`-`of` IteratorClose region written directly
|
|
276
|
+
// in this part is the reverse nesting of the ordinary case above -- see
|
|
277
|
+
// `RegionRendering.iteratorCloseRegionByEntry`'s own comment -- and is
|
|
278
|
+
// folded in the identical way: its blocks belong to this part's ownership
|
|
279
|
+
// and inbound-jump check, but its ENTRY renders itself.
|
|
280
|
+
const nestedIteratorClose = id === entry ? undefined : rendering.iteratorCloseRegionByEntry.get(id);
|
|
281
|
+
if (nestedIteratorClose) {
|
|
282
|
+
for (const inner of nestedIteratorClose.blocks) {
|
|
283
|
+
owned.add(inner);
|
|
284
|
+
if (inner !== id)
|
|
285
|
+
rendersItself.add(inner);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
verifyNoInboundJumps(body, owned, entry, describe);
|
|
290
|
+
return { owned, order: partOrder(body, owned, entry, rendersItself) };
|
|
291
|
+
};
|
|
292
|
+
/**
|
|
293
|
+
* The C++ type of a finally clause's scope guard, and the name one region's
|
|
294
|
+
* guard is declared under.
|
|
295
|
+
*
|
|
296
|
+
* A destructor is the mechanism for THREE of the four completions. ECMAScript
|
|
297
|
+
* says a finally block runs however the try body completes, and C++ says a
|
|
298
|
+
* scoped object is destroyed however the scope is left -- falling off the end,
|
|
299
|
+
* `return`, and a `goto` past it (which is what `break`/`continue` lower to
|
|
300
|
+
* here). Those stay ordinary IR terminators and the guard covers each with no
|
|
301
|
+
* completion record and no dispatch.
|
|
302
|
+
*
|
|
303
|
+
* The fourth -- an exception propagating out of the try body or the catch
|
|
304
|
+
* handler -- is the one a destructor CANNOT express, and it is why a pending
|
|
305
|
+
* slot sits beside the guard. C++ destroys the guard while that exception is
|
|
306
|
+
* unwinding, and a destructor that throws during unwinding calls
|
|
307
|
+
* `std::terminate`; ECMAScript instead says the clause's own throw REPLACES
|
|
308
|
+
* the in-flight completion (14.15.3: the finally block's abrupt completion is
|
|
309
|
+
* the statement's completion). The two are not reconcilable while the clause
|
|
310
|
+
* runs under an unwind, so the emitted region does not let it: an outer
|
|
311
|
+
* `catch (...)` parks the exception in an `std::exception_ptr` declared before
|
|
312
|
+
* the guard's scope, the scope then closes NORMALLY -- so a clause that throws
|
|
313
|
+
* propagates ordinarily and the parked exception is simply dropped, which is
|
|
314
|
+
* exactly the replacement ECMAScript asks for -- and a rethrow after the scope
|
|
315
|
+
* resumes the parked one when the clause completes normally.
|
|
316
|
+
*
|
|
317
|
+
* `generator-finite-destructuring-close.ts` is the program that made this
|
|
318
|
+
* necessary: `.return()` on a paused generator is delivered as a `ReturnSignal`
|
|
319
|
+
* throw at the `yield` (`gea_runtime.h`'s `YieldAwaiter::await_resume`), so a
|
|
320
|
+
* `finally { throw x }` in that generator ran under an unwind on EVERY close,
|
|
321
|
+
* not on some rare path, and aborted the process instead of delivering `x` to
|
|
322
|
+
* the caller's `catch`. The park makes `ReturnSignal` an ordinary parked
|
|
323
|
+
* completion like any other: dropped when the clause throws, rethrown into the
|
|
324
|
+
* promise's `unhandled_exception` when it does not.
|
|
325
|
+
*
|
|
326
|
+
* The names are keyed by the region's own operation id so two try statements in
|
|
327
|
+
* one function never collide, and so the declarations are stable across builds.
|
|
328
|
+
*/
|
|
329
|
+
const finallyGuardType = 'const gea::ScopeExit';
|
|
330
|
+
const finallyGuardName = (region) => cppFinallyGuardName(region.region);
|
|
331
|
+
const finallyPendingName = (region) => cppFinallyPendingName(region.region);
|
|
332
|
+
/**
|
|
333
|
+
* The finally clause's own blocks, refused by name for every shape a
|
|
334
|
+
* destructor body cannot express.
|
|
335
|
+
*
|
|
336
|
+
* Three of them, and each is a real source program rather than a hypothetical:
|
|
337
|
+
*
|
|
338
|
+
* - a `return` written inside the finally clause. `producers/control.ts`'s
|
|
339
|
+
* `nearestInterceptingFinally` deliberately does NOT intercept a completion
|
|
340
|
+
* originating inside the clause itself, so such a return reaches lowering as
|
|
341
|
+
* an ordinary one -- and an ordinary `return` inside the guard's lambda would
|
|
342
|
+
* return from the LAMBDA, leaving the enclosing function running. That is a
|
|
343
|
+
* silent miscompile, not a compile error, which is exactly the kind this
|
|
344
|
+
* refuses rather than emits.
|
|
345
|
+
* - a `break`/`continue` inside the clause targeting an enclosing loop. It
|
|
346
|
+
* lowers to a jump to a block outside the clause, and `verifyNoInboundJumps`
|
|
347
|
+
* catches it from the other side: the loop's own exit or latch becomes
|
|
348
|
+
* reachable from this part while the loop's branch also reaches it from
|
|
349
|
+
* outside.
|
|
350
|
+
* - a clause sharing a block with the try body or the catch handler, which
|
|
351
|
+
* would put one run of statements inside two different braces.
|
|
352
|
+
*
|
|
353
|
+
* A `throw` inside the clause is NOT refused here and does not need to be: it
|
|
354
|
+
* lowers to an ordinary `throw` terminator, and `gea::ScopeExit` is
|
|
355
|
+
* deliberately not `noexcept`, so it propagates the way ECMAScript says it
|
|
356
|
+
* does. It used to need the caveat that a clause throwing while an exception
|
|
357
|
+
* was ALREADY propagating terminated instead of replacing it; the region's
|
|
358
|
+
* pending slot removes that case rather than stating it -- see
|
|
359
|
+
* `finallyGuardType`.
|
|
360
|
+
*/
|
|
361
|
+
const prepareFinallyPart = (body, rendering, region, tryOwned, catchOwned) => {
|
|
362
|
+
if (region.finallyEntry === null)
|
|
363
|
+
throw new Error('prepareFinallyPart called for a region with no finally clause');
|
|
364
|
+
const part = preparePart(body, rendering, region, region.finallyEntry, region.join, 'a finally clause');
|
|
365
|
+
for (const id of part.owned) {
|
|
366
|
+
if (tryOwned.has(id) || catchOwned?.has(id) === true) {
|
|
367
|
+
throw createCppEmitBlockedError('runtime-helper:control:finally', 'a finally clause shares a block with the try body or catch handler, so neither owns it');
|
|
368
|
+
}
|
|
369
|
+
// The clause's own exit is the one `return` terminator here that is not a
|
|
370
|
+
// source `return`: `lower-flow.ts` builds it to give the part's normal
|
|
371
|
+
// completion a block, and falling off the end of the guard body is exactly
|
|
372
|
+
// what it means. Every other one came from the program.
|
|
373
|
+
if (id === region.finallyExit)
|
|
374
|
+
continue;
|
|
375
|
+
const block = body.blocks.get(id);
|
|
376
|
+
if (block?.terminator.kind === 'return') {
|
|
377
|
+
throw createCppEmitBlockedError('abrupt-edge:return', 'a "return" written inside a finally clause would return from the scope guard that runs the clause, not from the function');
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return part;
|
|
381
|
+
};
|
|
382
|
+
/**
|
|
383
|
+
* The finally clause's rendering, differing from every other part's in TWO
|
|
384
|
+
* terminators: its own `finallyExit`, and a `throw`.
|
|
385
|
+
*
|
|
386
|
+
* The clause's body is a LAMBDA returning `void`, and the enclosing function's
|
|
387
|
+
* return type is not this lambda's. `emit-return.ts` renders a valueless return
|
|
388
|
+
* against the enclosing function's ABI -- for a `Promise<void>` result it
|
|
389
|
+
* writes `return gea::Promise<void>::settled_value();`, because a bare
|
|
390
|
+
* `return;` from a function declared to return a class type is a C++ error.
|
|
391
|
+
* Inside the guard body that reasoning is inverted and the bare `return;` is
|
|
392
|
+
* the only correct text, so the override is here rather than a condition inside
|
|
393
|
+
* `emit-return.ts`: the fact that differs is which function is being returned
|
|
394
|
+
* from, and only this caller knows it.
|
|
395
|
+
*
|
|
396
|
+
* `emit.ts`'s own `throw` case appends an unreachable `co_return;` whenever
|
|
397
|
+
* `ctx.generatorBody` is set, so a `function*` whose body is nothing but a
|
|
398
|
+
* `throw` still compiles as a coroutine (see that file's comment). `ctx` is
|
|
399
|
+
* the whole PHYSICAL BODY's context and cannot tell "the generator's own
|
|
400
|
+
* frame" apart from "a plain lambda this body happens to render inside it" --
|
|
401
|
+
* and a finally clause's guard is exactly the latter: `gea::ScopeExit`'s
|
|
402
|
+
* `[&]() { ... }` is an ordinary `void`-returning lambda even when the
|
|
403
|
+
* generator that owns it is a coroutine. `defaultGenerator`'s `finally {
|
|
404
|
+
* ...; throw x }` (`generator-finite-destructuring-close.ts`) emitted that
|
|
405
|
+
* `co_return;` straight into the guard lambda, and clang refuses a `co_return`
|
|
406
|
+
* in a function with a deduced return type. The throw itself is unaffected by
|
|
407
|
+
* this override -- it is a real ECMAScript throw out of the guard, exactly as
|
|
408
|
+
* `renderTryRegion`'s own header comment already says a `throw` in a finally
|
|
409
|
+
* clause is not refused and needs no special handling beyond an ordinary
|
|
410
|
+
* `throw` terminator.
|
|
411
|
+
*/
|
|
412
|
+
const finallyRendering = (rendering) => ({
|
|
413
|
+
...rendering,
|
|
414
|
+
emitTerminator: (ctx, lines, labels, isSingleBlock, terminator) => {
|
|
415
|
+
if (terminator.kind === 'return' && terminator.value === null) {
|
|
416
|
+
lines.push('return;');
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
if (terminator.kind === 'throw') {
|
|
420
|
+
lines.push(`throw ${operandText(ctx, terminator.value)};`);
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
rendering.emitTerminator(ctx, lines, labels, isSingleBlock, terminator);
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
/** Renders one region's `try { } catch (...) { }` text and returns every block it consumed, so the caller can skip them in the ordinary per-block loop. */
|
|
427
|
+
export const renderTryRegion = (ctx, lines, body, region, rendering) => {
|
|
428
|
+
const tryPart = preparePart(body, rendering, region, region.tryEntry, region.join, 'a try body');
|
|
429
|
+
if (region.catchEntry === null && region.finallyEntry === null) {
|
|
430
|
+
// Every `TryStatement` the checker accepted has a catch or a finally, so
|
|
431
|
+
// a region with neither is one whose handler the lowering proved dead --
|
|
432
|
+
// a try body nothing in it can throw out of. The body is then ordinary
|
|
433
|
+
// straight-line code and is rendered as exactly that: no braces, no
|
|
434
|
+
// handler, the same blocks in the same order.
|
|
435
|
+
lines.push(`${rendering.labelOf(rendering.labels, region.tryEntry)}:`);
|
|
436
|
+
lines.push(...renderPart(ctx, body, rendering, tryPart.order, tryPart.owned, false, true));
|
|
437
|
+
return [...tryPart.owned];
|
|
438
|
+
}
|
|
439
|
+
const catchPart = region.catchEntry === null ? null : preparePart(body, rendering, region, region.catchEntry, region.join, 'a catch handler');
|
|
440
|
+
for (const id of catchPart?.owned ?? []) {
|
|
441
|
+
// Two parts sharing a block would put one run of statements inside both
|
|
442
|
+
// braces, which is not a rendering problem but a claim about the graph that
|
|
443
|
+
// cannot be true: nothing reaches a handler except by throwing.
|
|
444
|
+
if (tryPart.owned.has(id))
|
|
445
|
+
throw createCppEmitBlockedError('runtime-helper:control:try', 'a try body and its catch handler share a block, so neither owns it');
|
|
446
|
+
}
|
|
447
|
+
const finallyPart = region.finallyEntry === null ? null : prepareFinallyPart(body, rendering, region, tryPart.owned, catchPart?.owned ?? null);
|
|
448
|
+
const catchEntryBlock = region.catchEntry === null ? null : body.blocks.get(region.catchEntry);
|
|
449
|
+
if (region.catchEntry !== null && !catchEntryBlock) {
|
|
450
|
+
throw new Error(`ir body ${body.owner} names catch block ${region.catchEntry} but has no matching block`);
|
|
451
|
+
}
|
|
452
|
+
const firstOperation = catchEntryBlock?.operations[0];
|
|
453
|
+
const binding = firstOperation && firstOperation.kind === 'catch-binding' ? firstOperation : null;
|
|
454
|
+
// A native C++ handler catches BY TYPE, so this parameter's type and the type
|
|
455
|
+
// every `throw` actually throws are one fact, not two. `ir/lower.ts` converts
|
|
456
|
+
// every thrown value into `thrownValueCarrier` for that reason; this is the
|
|
457
|
+
// other half of the same agreement, checked rather than assumed -- the two
|
|
458
|
+
// sides sat in different files with no test between them, and the version
|
|
459
|
+
// that disagreed emitted `throw v0;` of a `std::string` against
|
|
460
|
+
// `catch (const gea::Value& v1)`: clang-clean, certificate clean, and the
|
|
461
|
+
// handler the source program wrote never ran. Compared on the C++ spelling
|
|
462
|
+
// rather than on `representationKey`, because agreeing physically is the
|
|
463
|
+
// whole requirement: a caught binding's carrier states the reason
|
|
464
|
+
// `'declared-any-never-narrowed'` (the checker's `unknown`) where the thrown
|
|
465
|
+
// one states `'thrown-error-carrier'`, and those are the same storage.
|
|
466
|
+
if (binding && cppTypeOf(binding.result.representation) !== cppTypeOf(thrownValueCarrier)) {
|
|
467
|
+
throw createCppEmitBlockedError('runtime-helper:control:catch', `a catch clause binds its parameter as "${cppTypeOf(binding.result.representation)}" but every throw carries ` +
|
|
468
|
+
`"${cppTypeOf(thrownValueCarrier)}"; a native handler matches by type, so this handler could never catch`);
|
|
469
|
+
}
|
|
470
|
+
const parameter = binding ? `const ${cppTypeOf(binding.result.representation)}& ${defineValueBoundElsewhere(ctx, binding.result)}` : '...';
|
|
471
|
+
// The region's entry label, immediately BEFORE the `try` rather than inside
|
|
472
|
+
// it. C++ forbids transferring control into a try block, which is why this
|
|
473
|
+
// rendering used to demand that the predecessor fall through -- the region's
|
|
474
|
+
// text had to be the next thing emitted, and a block order that put anything
|
|
475
|
+
// between the two refused. A label on the try STATEMENT is not inside the
|
|
476
|
+
// block, so an ordinary `goto` reaches it and the region can be rendered
|
|
477
|
+
// wherever the block order puts it. The cost is a jump to the next line in
|
|
478
|
+
// the case that used to fall through, the same trade `renderPart`'s own
|
|
479
|
+
// terminator note already records.
|
|
480
|
+
lines.push(`${rendering.labelOf(rendering.labels, region.tryEntry)}:`);
|
|
481
|
+
// The guard's own scope opens OUTSIDE the label's statement, so a `goto` to
|
|
482
|
+
// the region enters this block from the top and initializes the guard on the
|
|
483
|
+
// way in. Jumping PAST the initialization of an object with a destructor is
|
|
484
|
+
// what C++ forbids, and entering the block normally is not that.
|
|
485
|
+
// The pending slot is declared OUTSIDE the guard's scope, so the rethrow that
|
|
486
|
+
// reads it can be written AFTER the guard has been destroyed -- which is the
|
|
487
|
+
// whole reason the slot exists (`finallyGuardType`'s comment says why).
|
|
488
|
+
if (finallyPart) {
|
|
489
|
+
lines.push('{');
|
|
490
|
+
lines.push(`std::exception_ptr ${finallyPendingName(region)};`);
|
|
491
|
+
lines.push('{');
|
|
492
|
+
lines.push(`${finallyGuardType} ${finallyGuardName(region)}{[&]() {`);
|
|
493
|
+
lines.push(...renderPart(ctx, body, finallyRendering(rendering), finallyPart.order, finallyPart.owned, false, true));
|
|
494
|
+
lines.push('}};');
|
|
495
|
+
lines.push('try {');
|
|
496
|
+
}
|
|
497
|
+
if (catchPart !== null)
|
|
498
|
+
lines.push('try {');
|
|
499
|
+
lines.push(...renderPart(ctx, body, rendering, tryPart.order, tryPart.owned, false, true));
|
|
500
|
+
if (catchPart) {
|
|
501
|
+
lines.push('}');
|
|
502
|
+
lines.push(`catch (${parameter}) {`);
|
|
503
|
+
lines.push(...renderPart(ctx, body, rendering, catchPart.order, catchPart.owned, binding !== null, false));
|
|
504
|
+
lines.push('}');
|
|
505
|
+
}
|
|
506
|
+
if (finallyPart) {
|
|
507
|
+
lines.push(`} catch (...) { ${finallyPendingName(region)} = std::current_exception(); }`);
|
|
508
|
+
lines.push('}');
|
|
509
|
+
lines.push(`if (${finallyPendingName(region)}) std::rethrow_exception(${finallyPendingName(region)});`);
|
|
510
|
+
lines.push('}');
|
|
511
|
+
}
|
|
512
|
+
return [...tryPart.owned, ...(catchPart?.owned ?? []), ...(finallyPart?.owned ?? [])];
|
|
513
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GetOperation } from '../../ir/model.js';
|
|
2
|
+
import { type EmitContext } from './emit-context.js';
|
|
3
|
+
/** Print the class identities and conversion nodes certified on the read. */
|
|
4
|
+
export declare const nativeFieldOwnerReadText: (ctx: EmitContext, operation: GetOperation) => string | null;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createCppEmitBlockedError, operandText } from './emit-context.js';
|
|
2
|
+
import { recipeText } from './emit-narrowing.js';
|
|
3
|
+
import { cppClassName, cppRecordFieldName, cppRecordFieldPresenceName, cppTypeOf } from './types.js';
|
|
4
|
+
/** Print the class identities and conversion nodes certified on the read. */
|
|
5
|
+
export const nativeFieldOwnerReadText = (ctx, operation) => {
|
|
6
|
+
const recipe = operation.nativeFieldOwnerRead;
|
|
7
|
+
if (!recipe)
|
|
8
|
+
return null;
|
|
9
|
+
const render = (id, value) => {
|
|
10
|
+
const node = ctx.conversions.nodeById(id);
|
|
11
|
+
const text = node ? recipeText(ctx, node, value) : null;
|
|
12
|
+
if (text === null)
|
|
13
|
+
throw createCppEmitBlockedError(`conversion:${id}`, 'a certified native field-owner read has no conversion renderer');
|
|
14
|
+
return text;
|
|
15
|
+
};
|
|
16
|
+
const missing = render(recipe.missing, 'gea::Undefined{}');
|
|
17
|
+
const arms = recipe.arms.map((arm) => {
|
|
18
|
+
const type = cppClassName(arm.member.declaration);
|
|
19
|
+
const value = `gea_field_owner->${cppRecordFieldName(recipe.key)}`;
|
|
20
|
+
const present = `gea_field_owner->${cppRecordFieldPresenceName(recipe.key)}`;
|
|
21
|
+
return (`if (gea::host::hasNativeClassLayoutRef<${type}>(gea_field_receiver)) { ` +
|
|
22
|
+
`const auto gea_field_owner = gea::host::downcastClassRef<${type}>(gea_field_receiver); ` +
|
|
23
|
+
`return ${present} ? ${render(arm.conversion, value)} : ${missing}; }`);
|
|
24
|
+
});
|
|
25
|
+
return (`([&]() -> ${cppTypeOf(operation.result.representation)} { const auto& gea_field_receiver = ${operandText(ctx, operation.receiver)}; ` +
|
|
26
|
+
`${arms.join(' ')} return ${missing}; })()`);
|
|
27
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { HasPropertyOperation } from '../../ir/model.js';
|
|
2
|
+
import { type EmitContext } from './emit-context.js';
|
|
3
|
+
/**
|
|
4
|
+
* The single `[[HasProperty]]` dispatcher.
|
|
5
|
+
*
|
|
6
|
+
* The runtime-table renderer is asked first and the layout rules second because
|
|
7
|
+
* the two are disjoint by construction -- a `dynamic` receiver has no layout to
|
|
8
|
+
* read fields from, and no other carrier owns that table -- so the order states
|
|
9
|
+
* a preference that can never be exercised rather than hiding a fallthrough.
|
|
10
|
+
*/
|
|
11
|
+
export declare const emitHasProperty: (ctx: EmitContext, lines: string[], operation: HasPropertyOperation) => void;
|
|
12
|
+
/**
|
|
13
|
+
* The `computation:in:*` rows this file renders, stated here rather than in
|
|
14
|
+
* `manifest.ts` so the claim and the rendering are one authority: a row added
|
|
15
|
+
* to the manifest without a branch above would certify a program this file then
|
|
16
|
+
* refuses, which is the certify-then-crash the whole obligation census exists
|
|
17
|
+
* to prevent.
|
|
18
|
+
*
|
|
19
|
+
* `record(own-field)` is the constant `true` above; the two `dictionary(...)`
|
|
20
|
+
* domains are the two containers' own `has`, claimed separately because
|
|
21
|
+
* `gea::Dictionary` (string-keyed) and `gea::NumericDictionary` (double-keyed)
|
|
22
|
+
* are different types and a key of the wrong domain would not compile.
|
|
23
|
+
*
|
|
24
|
+
* The `dynamic` rows are the four key forms `propertyKeyText` can turn into a
|
|
25
|
+
* `gea::PropertyKey` -- a string constant, a numeric constant, a `std::string`,
|
|
26
|
+
* a `gea::Symbol`, and a number through ToString. A boolean or bigint key is
|
|
27
|
+
* deliberately absent: ToPropertyKey over one is ToString of it, which is a
|
|
28
|
+
* conversion this backend does not install for those domains, so it is refused
|
|
29
|
+
* by name at the site rather than certified here and crashed on there.
|
|
30
|
+
*/
|
|
31
|
+
export declare const hasPropertyHelperClaims: readonly string[];
|