@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,39 @@
|
|
|
1
|
+
import type { Representation } from '../../representation/model.js';
|
|
2
|
+
/**
|
|
3
|
+
* The JavaScript answer for a comparison between two string CONSTANTS.
|
|
4
|
+
*
|
|
5
|
+
* A `string` constant is emitted as a C++ string literal, and a C++ string
|
|
6
|
+
* literal is a `const char[N]` -- an initializer the carrier converts from, not
|
|
7
|
+
* a value of the carrier. That is invisible everywhere except between two of
|
|
8
|
+
* them, where `("object") != ("undefined")` compares two array ADDRESSES.
|
|
9
|
+
* Whether two literals even have distinct addresses is up to the linker, so
|
|
10
|
+
* `("a") == ("a")` is permitted to answer false; clang says as much
|
|
11
|
+
* (`-Warray-compare`, `-Wstring-compare`) and it was emitted by every gea app,
|
|
12
|
+
* because `@geastack/core`'s runtime guards its host globals with `typeof X !==
|
|
13
|
+
* "undefined"` and `typeof` had already folded to a constant.
|
|
14
|
+
*
|
|
15
|
+
* Both operands are known here, so this is not a runtime question. Answering it
|
|
16
|
+
* in the source language is also the only way to answer it correctly: relational
|
|
17
|
+
* comparison of strings is by UTF-16 code unit (ECMA-262 7.2.13), which is what
|
|
18
|
+
* comparing the two contents here does, while `std::string`'s `<` compares
|
|
19
|
+
* UTF-8 bytes and disagrees outside the BMP.
|
|
20
|
+
*
|
|
21
|
+
* Only reached when BOTH sides are constants. One constant against a real value
|
|
22
|
+
* is already correct -- `std::string == "literal"` selects the `const char *`
|
|
23
|
+
* overload and compares contents -- so it is left alone.
|
|
24
|
+
*/
|
|
25
|
+
export declare const constantStringComparisonText: (operator: string, left: string, right: string) => string | null;
|
|
26
|
+
export declare const callableIdentityEqualityText: (operator: string, left: {
|
|
27
|
+
readonly text: string;
|
|
28
|
+
readonly representation: Representation;
|
|
29
|
+
}, right: {
|
|
30
|
+
readonly text: string;
|
|
31
|
+
readonly representation: Representation;
|
|
32
|
+
}) => string | null;
|
|
33
|
+
export declare const strictEqualityText: (operator: string, left: {
|
|
34
|
+
readonly text: string;
|
|
35
|
+
readonly representation: Representation;
|
|
36
|
+
}, right: {
|
|
37
|
+
readonly text: string;
|
|
38
|
+
readonly representation: Representation;
|
|
39
|
+
}) => string | null;
|
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
import { representationKey } from '../../representation/model.js';
|
|
2
|
+
import { absenceComparisonText } from './emit-presence.js';
|
|
3
|
+
import { emptyArraySentinelText, widenedStoreText } from './emit-narrowing.js';
|
|
4
|
+
import { typeofTextFor } from './emit-typeof.js';
|
|
5
|
+
/**
|
|
6
|
+
* `===` and `!==` where one side is a sum -- ECMA-262 7.2.16 IsStrictlyEqual.
|
|
7
|
+
*
|
|
8
|
+
* "Sum" is both of this backend's: a `tagged-union`, and an `optional`, whose
|
|
9
|
+
* two arms are discriminated by `has_value()` rather than by an index.
|
|
10
|
+
*
|
|
11
|
+
* The generic binary path cannot answer these. Two carriers that differ send it
|
|
12
|
+
* to its mixed-carrier refusal, and two `gea::TaggedUnion`s that agree send it
|
|
13
|
+
* to `binaryOperatorFor`, which has no `==` for a sum: the C++ type holds a raw
|
|
14
|
+
* byte buffer plus an index, so the compiler-generated comparison it does not
|
|
15
|
+
* have would be comparing padding.
|
|
16
|
+
*
|
|
17
|
+
* 7.2.16 is a two-step rule and both steps are decidable here. Step 1 -- "if
|
|
18
|
+
* Type(x) is not Type(y), return false" -- is the discriminant, which a tagged
|
|
19
|
+
* union carries as its own index and a concrete operand carries in its carrier.
|
|
20
|
+
* Step 2 is the arm's own comparison. So `name === 'error'` over a
|
|
21
|
+
* `string | symbol` is `name.is<0>() && name.get<0>() == "error"`, exactly, and
|
|
22
|
+
* a concrete operand whose carrier matches NO arm is the constant `false`
|
|
23
|
+
* without reading anything.
|
|
24
|
+
*
|
|
25
|
+
* Deliberately `===`/`!==` only. `==` is 7.2.15, which converts -- a union arm
|
|
26
|
+
* against a number would run `ToPrimitive`/`ToNumber`, and choosing which side
|
|
27
|
+
* converts is the conversion algebra's decision, not this file's.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* Whether C++ `==` on this carrier IS JavaScript's `===` for the values it holds.
|
|
31
|
+
*
|
|
32
|
+
* Not a general "is comparable" test: what has to hold is that the two agree.
|
|
33
|
+
* `std::string` and `double` compare by value, which is 7.2.16 for a string and
|
|
34
|
+
* a number (`NaN != NaN` and `+0 == -0` are the same in both languages), and a
|
|
35
|
+
* `shared_ptr` compares by address, which is 7.2.16's reference identity for an
|
|
36
|
+
* object. A `native-handle` is left out even though it has a `bool` conversion:
|
|
37
|
+
* a host's own struct states no `==` at all, and inventing one would compare
|
|
38
|
+
* whatever the wrapper happens to hold.
|
|
39
|
+
*/
|
|
40
|
+
const armComparesByValue = (representation) => {
|
|
41
|
+
if (representation.kind === 'string' || representation.kind === 'scalar' || representation.kind === 'symbol')
|
|
42
|
+
return true;
|
|
43
|
+
if (representation.kind === 'class-ref' ||
|
|
44
|
+
representation.kind === 'native-record-ref' ||
|
|
45
|
+
representation.kind === 'record' ||
|
|
46
|
+
representation.kind === 'record-with-index' ||
|
|
47
|
+
representation.kind === 'array-object' ||
|
|
48
|
+
representation.kind === 'dictionary' ||
|
|
49
|
+
representation.kind === 'typed-array' ||
|
|
50
|
+
representation.kind === 'array-buffer' ||
|
|
51
|
+
representation.kind === 'shared-array-buffer' ||
|
|
52
|
+
representation.kind === 'data-view' ||
|
|
53
|
+
representation.kind === 'keyed-collection') {
|
|
54
|
+
return representation.ownership === 'shared-refcount';
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
};
|
|
58
|
+
/** An arm that IS an absent value: two operands both holding it are equal without reading anything. */
|
|
59
|
+
const isAbsentArm = (representation) => representation.kind === 'null' || representation.kind === 'undefined';
|
|
60
|
+
const callableIdentityCarrier = (representation) => representation.kind === 'function-value-dispatch' || representation.kind === 'function-and-constructor';
|
|
61
|
+
const negate = (operator, text) => operator === '!==' ? (text === 'true' ? 'false' : text === 'false' ? 'true' : `!(${text})`) : text;
|
|
62
|
+
/** One arm's comparison against a same-carrier value, or `null` when this backend cannot state it. */
|
|
63
|
+
/**
|
|
64
|
+
* The answer for two carriers that are not the same key, when neither is a sum
|
|
65
|
+
* to walk -- `'false'` where 7.2.16 step 1 settles it ("If Type(x) is not
|
|
66
|
+
* Type(y), return false"), and `null`, a REFUSAL, where it does not.
|
|
67
|
+
*
|
|
68
|
+
* Two callables are the case that makes the distinction load-bearing. Their
|
|
69
|
+
* C++ carriers differ whenever monomorphization gave one declaration two
|
|
70
|
+
* copies, or an adapter re-spelled a signature -- and `gea::CallableObject`
|
|
71
|
+
* carries a `Ref<FunctionObjectIdentity>` across exactly those transforms on
|
|
72
|
+
* purpose, precisely so that all of them remain ONE ECMAScript function
|
|
73
|
+
* object. So a differing carrier key proves nothing about identity here, and
|
|
74
|
+
* folding to `false` answers a question the carriers were never entitled to
|
|
75
|
+
* settle.
|
|
76
|
+
*
|
|
77
|
+
* Measured: `stack[0] === Impl.a` over a namespace-qualified generic function
|
|
78
|
+
* rendered as the constant `false` while node answers `true`, which turned
|
|
79
|
+
* `test/runtime/generic-state-function-array.ts`'s loop condition into an
|
|
80
|
+
* infinite loop. The identical program written with NON-generic functions --
|
|
81
|
+
* one copy, one carrier -- refused fail-closed at the mixed-carrier boundary
|
|
82
|
+
* instead, which is what made the fold visible as a fail-OPEN: the same
|
|
83
|
+
* comparison was refused in the shape that had no answer and answered wrongly
|
|
84
|
+
* in the shape that had two carriers for one function object.
|
|
85
|
+
*
|
|
86
|
+
* `typeofTextFor` is the one authority for "what type does the language say
|
|
87
|
+
* this carrier holds", already keyed by complete representation for the
|
|
88
|
+
* `typeof` operator itself; asking it here rather than restating a second
|
|
89
|
+
* table is what keeps the two from ever disagreeing.
|
|
90
|
+
*/
|
|
91
|
+
const foldedCarrierMismatchText = (left, right) => {
|
|
92
|
+
const leftType = typeofTextFor(left);
|
|
93
|
+
const rightType = typeofTextFor(right);
|
|
94
|
+
if (leftType === null || rightType === null)
|
|
95
|
+
return null;
|
|
96
|
+
return leftType === rightType ? null : 'false';
|
|
97
|
+
};
|
|
98
|
+
const armEqualityText = (arm, leftText, rightText) => {
|
|
99
|
+
if (isAbsentArm(arm))
|
|
100
|
+
return 'true';
|
|
101
|
+
const callable = callableIdentityEqualityText('===', { text: leftText, representation: arm }, { text: rightText, representation: arm });
|
|
102
|
+
if (callable !== null)
|
|
103
|
+
return callable;
|
|
104
|
+
// A sum nested in a sum (`undefined | null | (string | number | boolean)`,
|
|
105
|
+
// the shape a three-way absence gives a union payload) is the same
|
|
106
|
+
// question one level down.
|
|
107
|
+
if (arm.kind === 'tagged-union' || arm.kind === 'optional') {
|
|
108
|
+
return strictEqualityText('===', { text: leftText, representation: arm }, { text: rightText, representation: arm });
|
|
109
|
+
}
|
|
110
|
+
return armComparesByValue(arm) ? `${leftText} == ${rightText}` : null;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* The JavaScript answer for a comparison between two string CONSTANTS.
|
|
114
|
+
*
|
|
115
|
+
* A `string` constant is emitted as a C++ string literal, and a C++ string
|
|
116
|
+
* literal is a `const char[N]` -- an initializer the carrier converts from, not
|
|
117
|
+
* a value of the carrier. That is invisible everywhere except between two of
|
|
118
|
+
* them, where `("object") != ("undefined")` compares two array ADDRESSES.
|
|
119
|
+
* Whether two literals even have distinct addresses is up to the linker, so
|
|
120
|
+
* `("a") == ("a")` is permitted to answer false; clang says as much
|
|
121
|
+
* (`-Warray-compare`, `-Wstring-compare`) and it was emitted by every gea app,
|
|
122
|
+
* because `@geastack/core`'s runtime guards its host globals with `typeof X !==
|
|
123
|
+
* "undefined"` and `typeof` had already folded to a constant.
|
|
124
|
+
*
|
|
125
|
+
* Both operands are known here, so this is not a runtime question. Answering it
|
|
126
|
+
* in the source language is also the only way to answer it correctly: relational
|
|
127
|
+
* comparison of strings is by UTF-16 code unit (ECMA-262 7.2.13), which is what
|
|
128
|
+
* comparing the two contents here does, while `std::string`'s `<` compares
|
|
129
|
+
* UTF-8 bytes and disagrees outside the BMP.
|
|
130
|
+
*
|
|
131
|
+
* Only reached when BOTH sides are constants. One constant against a real value
|
|
132
|
+
* is already correct -- `std::string == "literal"` selects the `const char *`
|
|
133
|
+
* overload and compares contents -- so it is left alone.
|
|
134
|
+
*/
|
|
135
|
+
export const constantStringComparisonText = (operator, left, right) => {
|
|
136
|
+
if (operator === '===' || operator === '==')
|
|
137
|
+
return left === right ? 'true' : 'false';
|
|
138
|
+
if (operator === '!==' || operator === '!=')
|
|
139
|
+
return left === right ? 'false' : 'true';
|
|
140
|
+
if (operator === '<')
|
|
141
|
+
return left < right ? 'true' : 'false';
|
|
142
|
+
if (operator === '>')
|
|
143
|
+
return left > right ? 'true' : 'false';
|
|
144
|
+
if (operator === '<=')
|
|
145
|
+
return left <= right ? 'true' : 'false';
|
|
146
|
+
if (operator === '>=')
|
|
147
|
+
return left >= right ? 'true' : 'false';
|
|
148
|
+
return null;
|
|
149
|
+
};
|
|
150
|
+
/** The array carrier a comparison's other side holds: itself, its optional payload, or its one array arm. */
|
|
151
|
+
const arrayCarrierWithin = (representation) => {
|
|
152
|
+
if (representation.kind === 'array-object')
|
|
153
|
+
return representation;
|
|
154
|
+
if (representation.kind === 'optional')
|
|
155
|
+
return arrayCarrierWithin(representation.payload);
|
|
156
|
+
if (representation.kind === 'tagged-union') {
|
|
157
|
+
const arrays = representation.arms.flatMap((arm) => (arm.value.kind === 'array-object' ? [arm.value] : []));
|
|
158
|
+
const only = arrays[0];
|
|
159
|
+
return arrays.length === 1 && only ? only : null;
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* Two CALLABLES compared by allocation identity, or `null` when neither pair
|
|
165
|
+
* of carriers is one.
|
|
166
|
+
*
|
|
167
|
+
* `CallableObject` retains one shared function-object owner through every ABI
|
|
168
|
+
* adapter, so comparing that owner is exact across two different C++ template
|
|
169
|
+
* instantiations -- which is the whole reason it cannot be an `operator==`:
|
|
170
|
+
* the two sides need not have the same C++ type, and often do not.
|
|
171
|
+
* `function-and-constructor` is the same identity carrier under another name;
|
|
172
|
+
* `gea::CallableConstructorObject` lays out `invoke`/`environment`/
|
|
173
|
+
* `environmentOwner`/`functionObject` exactly like `gea::CallableObject`,
|
|
174
|
+
* because a source function usable both as `f()` and `new f()` is still one
|
|
175
|
+
* allocation with one identity.
|
|
176
|
+
*
|
|
177
|
+
* Loose equality has the same answer: both operands already have ECMAScript
|
|
178
|
+
* Function type, so 7.2.15 falls through to 7.2.16 unchanged.
|
|
179
|
+
*
|
|
180
|
+
* Lives here rather than inline in `emit.ts` so that every path reaching an
|
|
181
|
+
* equality asks it -- the bare pair, and the one an OPTIONAL wraps.
|
|
182
|
+
* `stateStack[stackIndex] !== State.done` is the second: under
|
|
183
|
+
* `noUncheckedIndexedAccess` the element read is `State | undefined`, so the
|
|
184
|
+
* comparison arrives as `optional(callable)` against `callable`, recurses into
|
|
185
|
+
* the payload, and found no answer at all while this rule lived somewhere the
|
|
186
|
+
* recursion could not reach. It then fell to the arm-key test, which requires
|
|
187
|
+
* the two carriers to spell the SAME key -- and the whole point of comparing
|
|
188
|
+
* the owner is that they need not.
|
|
189
|
+
*/
|
|
190
|
+
const constructorIdentityCarrier = (representation) => representation.kind === 'constructor-family' || representation.kind === 'constructor-value-dispatch';
|
|
191
|
+
/**
|
|
192
|
+
* Two CLASS CONSTRUCTORS compared by identity, or `null` when the pair is not
|
|
193
|
+
* two constructor carriers.
|
|
194
|
+
*
|
|
195
|
+
* `gea::ConstructorObject` carries no function-object owner: a class object
|
|
196
|
+
* is its construct pointer and the environment that pointer closes over, so
|
|
197
|
+
* two values naming the same class hold the same pair and two naming
|
|
198
|
+
* different classes differ in the pointer. That is exact for the shape a
|
|
199
|
+
* CommonJS record hands around -- `require('./box') !== require('./box')` is
|
|
200
|
+
* two copies of one module's `exports` -- and mirrors the callable rule's
|
|
201
|
+
* environment test: a class statement evaluated twice yields two objects,
|
|
202
|
+
* distinguished by their environments.
|
|
203
|
+
*
|
|
204
|
+
* A class evaluation's environment is its own freshly allocated state
|
|
205
|
+
* (`gea::allocateNativeClassMethodEnvironment`), so when there is one it alone
|
|
206
|
+
* is the identity: a subclass stored into its base's constructor slot is
|
|
207
|
+
* reached through an upcasting construct pointer (`gea::upcastConstructor`)
|
|
208
|
+
* and is still the same class object.
|
|
209
|
+
*
|
|
210
|
+
* A monomorphized copy has its own construct pointer, so a family naming a
|
|
211
|
+
* specialization copy is refused rather than answered `false` for two names
|
|
212
|
+
* of one generic class. The two sides need not spell the same C++ type, hence
|
|
213
|
+
* the `void*` view of each pointer rather than an `operator==`.
|
|
214
|
+
*/
|
|
215
|
+
const constructorIdentityEqualityText = (operator, left, right) => {
|
|
216
|
+
if (!constructorIdentityCarrier(left.representation) || !constructorIdentityCarrier(right.representation))
|
|
217
|
+
return null;
|
|
218
|
+
for (const side of [left.representation, right.representation])
|
|
219
|
+
if (side.kind === 'constructor-family' && side.members.some((member) => member.includes('@')))
|
|
220
|
+
return null;
|
|
221
|
+
const equal = `([](const auto& gea_left, const auto& gea_right) -> bool { ` +
|
|
222
|
+
`if (gea_left.environment != nullptr) return gea_left.environment == gea_right.environment; ` +
|
|
223
|
+
`return reinterpret_cast<const void*>(gea_left.construct_) == reinterpret_cast<const void*>(gea_right.construct_) && ` +
|
|
224
|
+
`gea_right.environment == nullptr; })(${left.text}, ${right.text})`;
|
|
225
|
+
return operator === '!==' || operator === '!=' ? `!${equal}` : equal;
|
|
226
|
+
};
|
|
227
|
+
export const callableIdentityEqualityText = (operator, left, right) => {
|
|
228
|
+
if (!['===', '!==', '==', '!='].includes(operator))
|
|
229
|
+
return null;
|
|
230
|
+
const constructors = constructorIdentityEqualityText(operator, left, right);
|
|
231
|
+
if (constructors !== null)
|
|
232
|
+
return constructors;
|
|
233
|
+
if (!callableIdentityCarrier(left.representation) || !callableIdentityCarrier(right.representation))
|
|
234
|
+
return null;
|
|
235
|
+
// TWO tests, in the order ECMAScript's own answer requires.
|
|
236
|
+
//
|
|
237
|
+
// A function with NO captured environment is one object however many
|
|
238
|
+
// monomorphic copies the compiler made of it, so the copies' shared source
|
|
239
|
+
// declaration is the identity -- that is what `declarationIdentity` holds and
|
|
240
|
+
// what `identifyCallable` installs. Without this, `State.done` compiled as
|
|
241
|
+
// `..._206_0` and `..._206_1` compares two allocations and answers `false`
|
|
242
|
+
// for two names of one function.
|
|
243
|
+
//
|
|
244
|
+
// A function that DOES carry an environment is a fresh object per
|
|
245
|
+
// evaluation: `function outer() { return function inner() {} }` returns a
|
|
246
|
+
// different `inner` every call, and both share one declaration. So the
|
|
247
|
+
// environment test guards the declaration test, and everything else falls
|
|
248
|
+
// through to the allocation comparison -- exact across two C++
|
|
249
|
+
// instantiations, because `CallableObject`'s copy propagates the owner, which
|
|
250
|
+
// is the same reason this cannot be an `operator==`.
|
|
251
|
+
//
|
|
252
|
+
// The allocation comparison reads through `functionObjectIdentity()`, not
|
|
253
|
+
// the `functionObject` field directly: a heap-environment closure anchors
|
|
254
|
+
// its identity lazily in its environment block (`gea_runtime.h`'s
|
|
255
|
+
// `EnvironmentIdentityHeader`) and mints nothing at allocation, so the field
|
|
256
|
+
// itself may still be empty on BOTH sides here even though they are the
|
|
257
|
+
// same function object. `functionObjectIdentity()` is what resolves that --
|
|
258
|
+
// through the override, the anchor, or a fallback mint -- and this is the
|
|
259
|
+
// first point anything actually asks, so it is also where the mint (if any
|
|
260
|
+
// is still needed at all) legitimately happens.
|
|
261
|
+
//
|
|
262
|
+
// Written as one generic lambda so each side's text is mentioned once: the
|
|
263
|
+
// operand this reaches through an optional payload is a whole nested
|
|
264
|
+
// conditional, and spelling it six times is unreadable emitted code.
|
|
265
|
+
const equal = `([](const auto& gea_left, const auto& gea_right) -> bool { ` +
|
|
266
|
+
`if (gea_left.environment == nullptr && gea_right.environment == nullptr) { ` +
|
|
267
|
+
`const void* gea_left_decl = gea::callableDeclarationIdentityOf(gea_left.functionObjectIdentity()); ` +
|
|
268
|
+
`const void* gea_right_decl = gea::callableDeclarationIdentityOf(gea_right.functionObjectIdentity()); ` +
|
|
269
|
+
`if (gea_left_decl != nullptr && gea_right_decl != nullptr) return gea_left_decl == gea_right_decl; } ` +
|
|
270
|
+
`const auto& gea_left_identity = gea_left.functionObjectIdentity(); ` +
|
|
271
|
+
`return static_cast<bool>(gea_left_identity) && gea_left_identity == gea_right.functionObjectIdentity(); })` +
|
|
272
|
+
`(${left.text}, ${right.text})`;
|
|
273
|
+
return operator === '!==' || operator === '!=' ? `!${equal}` : equal;
|
|
274
|
+
};
|
|
275
|
+
export const strictEqualityText = (operator, left, right) => {
|
|
276
|
+
if (operator !== '===' && operator !== '!==')
|
|
277
|
+
return null;
|
|
278
|
+
// The box on either side. Answered before the sums below because a
|
|
279
|
+
// `dynamic` operand settles the comparison whatever the other side is: the
|
|
280
|
+
// tag `Value` carries IS 7.2.16's Type(x), so step 1 is a runtime test
|
|
281
|
+
// rather than a static one, and no carrier the other side could have makes
|
|
282
|
+
// that any less true.
|
|
283
|
+
//
|
|
284
|
+
// A concrete operand is boxed to meet it, which is not a coercion: boxing
|
|
285
|
+
// records the JavaScript type the carrier already had (`dynamicTagFor`), so
|
|
286
|
+
// `signal.aborted === true` compares a Boolean tag against a Boolean tag and
|
|
287
|
+
// answers false for a `signal.aborted` holding the string "true", exactly as
|
|
288
|
+
// the language says. A carrier `widenedStoreText` cannot box has no
|
|
289
|
+
// JavaScript type this backend can name, and refusing is then the only
|
|
290
|
+
// answer that is not a guess.
|
|
291
|
+
const dynamicSide = left.representation.kind === 'dynamic' || right.representation.kind === 'dynamic';
|
|
292
|
+
if (dynamicSide) {
|
|
293
|
+
const box = (side, against) => side.representation.kind === 'dynamic' ? side.text : widenedStoreText(against, side.representation, side.text);
|
|
294
|
+
const leftText = box(left, right.representation);
|
|
295
|
+
const rightText = box(right, left.representation);
|
|
296
|
+
if (leftText === null || rightText === null)
|
|
297
|
+
return null;
|
|
298
|
+
return negate(operator, `gea::Value::strictEquals(${leftText}, ${rightText})`);
|
|
299
|
+
}
|
|
300
|
+
// An OPTIONAL on exactly one side. `gea::Optional<T>` is a sum too -- two
|
|
301
|
+
// arms, with `has_value()` for the discriminant instead of an index -- so
|
|
302
|
+
// 7.2.16 reads exactly as it does below: step 1 is the presence test, since
|
|
303
|
+
// an absent optional's Type is Undefined/Null and a present value of any
|
|
304
|
+
// other type never shares it, and step 2 is the payload's own comparison.
|
|
305
|
+
//
|
|
306
|
+
// `boolean | undefined === true` is what reaches here, and before this it
|
|
307
|
+
// reached `emitCompute`'s mixed-carrier refusal instead -- "optional and
|
|
308
|
+
// scalar need a conversion this emitter has no recipe for". There is no
|
|
309
|
+
// conversion to install: the comparison is not one.
|
|
310
|
+
//
|
|
311
|
+
// Against `null`/`undefined` this is never reached: `absenceComparisonText`
|
|
312
|
+
// answers those first. Two optionals compare their absence tags before
|
|
313
|
+
// reading either payload: undefined equals undefined, while undefined does
|
|
314
|
+
// not equal null, regardless of their payload carriers.
|
|
315
|
+
// `elements === emptyArray`: a `never[]` side compares against the other
|
|
316
|
+
// side's own array carrier, as the one empty array of that element type
|
|
317
|
+
// (`emptyArraySentinelText`) -- the identity that comparison exists to
|
|
318
|
+
// test. Only that side is rewritten; the recursion then sees two carriers
|
|
319
|
+
// of one key, or an optional/union holding one.
|
|
320
|
+
// Asked WITHOUT requiring the two carriers to spell one key. Two monomorphic
|
|
321
|
+
// copies of one source function have different keys and are the same
|
|
322
|
+
// JavaScript function object, which is exactly the pair
|
|
323
|
+
// `stateStack[stackIndex] !== State.done` compares once the element read's
|
|
324
|
+
// `State | undefined` has been unwrapped.
|
|
325
|
+
const callableIdentity = callableIdentityEqualityText(operator, left, right);
|
|
326
|
+
if (callableIdentity !== null)
|
|
327
|
+
return callableIdentity;
|
|
328
|
+
const sentinelSide = (side, against) => {
|
|
329
|
+
if (side.representation.kind !== 'array-object' || side.representation.element.kind !== 'undefined')
|
|
330
|
+
return null;
|
|
331
|
+
const target = arrayCarrierWithin(against);
|
|
332
|
+
if (target === null || representationKey(target) === representationKey(side.representation))
|
|
333
|
+
return null;
|
|
334
|
+
const text = emptyArraySentinelText(side.representation, target, side.text);
|
|
335
|
+
return text === null ? null : { text, representation: target };
|
|
336
|
+
};
|
|
337
|
+
const leftAsSentinel = sentinelSide(left, right.representation);
|
|
338
|
+
if (leftAsSentinel !== null)
|
|
339
|
+
return strictEqualityText(operator, leftAsSentinel, right);
|
|
340
|
+
const rightAsSentinel = sentinelSide(right, left.representation);
|
|
341
|
+
if (rightAsSentinel !== null)
|
|
342
|
+
return strictEqualityText(operator, left, rightAsSentinel);
|
|
343
|
+
const leftOptional = left.representation.kind === 'optional' ? left.representation : null;
|
|
344
|
+
const rightOptional = right.representation.kind === 'optional' ? right.representation : null;
|
|
345
|
+
if (leftOptional && rightOptional) {
|
|
346
|
+
const leftPayload = { text: `(*${left.text})`, representation: leftOptional.payload };
|
|
347
|
+
const rightPayload = { text: `(*${right.text})`, representation: rightOptional.payload };
|
|
348
|
+
const compared = strictEqualityText('===', leftPayload, rightPayload) ??
|
|
349
|
+
(representationKey(leftOptional.payload) === representationKey(rightOptional.payload)
|
|
350
|
+
? armEqualityText(leftOptional.payload, leftPayload.text, rightPayload.text)
|
|
351
|
+
: null);
|
|
352
|
+
if (compared === null)
|
|
353
|
+
return null;
|
|
354
|
+
const absent = leftOptional.absence === rightOptional.absence ? `!(${right.text}).has_value()` : 'false';
|
|
355
|
+
return negate(operator, `((${left.text}).has_value() ? ((${right.text}).has_value() && (${compared})) : (${absent}))`);
|
|
356
|
+
}
|
|
357
|
+
if ((leftOptional === null) !== (rightOptional === null)) {
|
|
358
|
+
const optional = leftOptional ?? rightOptional;
|
|
359
|
+
if (!optional)
|
|
360
|
+
return null;
|
|
361
|
+
const optionalText = leftOptional ? left.text : right.text;
|
|
362
|
+
const other = leftOptional ? right : left;
|
|
363
|
+
const present = `(${optionalText}).has_value()`;
|
|
364
|
+
// The payload may itself be a sum. Comparing its carrier key with a
|
|
365
|
+
// concrete operand would incorrectly fold Optional<string | T[]> ===
|
|
366
|
+
// 'plain' to false. Recursively dispatch the live payload, keeping the
|
|
367
|
+
// presence test outside so no absent payload is read.
|
|
368
|
+
const payload = { text: `(*${optionalText})`, representation: optional.payload };
|
|
369
|
+
const compared = strictEqualityText('===', payload, other) ??
|
|
370
|
+
(representationKey(optional.payload) === representationKey(other.representation)
|
|
371
|
+
? armEqualityText(optional.payload, payload.text, other.text)
|
|
372
|
+
: optional.payload.kind === 'tagged-union' || other.representation.kind === 'tagged-union'
|
|
373
|
+
? null
|
|
374
|
+
: foldedCarrierMismatchText(optional.payload, other.representation));
|
|
375
|
+
if (compared === null)
|
|
376
|
+
return null;
|
|
377
|
+
const absent = absenceComparisonText('===', { text: optional.absence, representation: { kind: optional.absence } }, other);
|
|
378
|
+
if (absent !== null && absent !== 'false') {
|
|
379
|
+
return negate(operator, `(${present} ? (${compared}) : (${absent}))`);
|
|
380
|
+
}
|
|
381
|
+
return negate(operator, compared === 'true' ? present : `(${present} && (${compared}))`);
|
|
382
|
+
}
|
|
383
|
+
const leftUnion = left.representation.kind === 'tagged-union' ? left.representation : null;
|
|
384
|
+
const rightUnion = right.representation.kind === 'tagged-union' ? right.representation : null;
|
|
385
|
+
if (!leftUnion && !rightUnion) {
|
|
386
|
+
// Shared native object storage compares by reference identity even when
|
|
387
|
+
// neither operand needs a discriminant. Leave primitive literal folding
|
|
388
|
+
// to the existing binary path (C++ string literals compare addresses).
|
|
389
|
+
const value = left.representation;
|
|
390
|
+
// An upcast changes the layout carrier, not the object's identity. Ref's
|
|
391
|
+
// cross-type equality already compares the held native object addresses.
|
|
392
|
+
if (value.kind === 'class-ref' &&
|
|
393
|
+
value.ownership === 'shared-refcount' &&
|
|
394
|
+
right.representation.kind === 'class-ref' &&
|
|
395
|
+
right.representation.ownership === 'shared-refcount') {
|
|
396
|
+
return negate(operator, `${left.text} == ${right.text}`);
|
|
397
|
+
}
|
|
398
|
+
if ('ownership' in value &&
|
|
399
|
+
value.ownership === 'shared-refcount' &&
|
|
400
|
+
representationKey(value) === representationKey(right.representation)) {
|
|
401
|
+
const compared = armEqualityText(value, left.text, right.text);
|
|
402
|
+
return compared === null ? null : negate(operator, compared);
|
|
403
|
+
}
|
|
404
|
+
return null;
|
|
405
|
+
}
|
|
406
|
+
// Two sums: equal exactly when the same arm is live in both and that arm's
|
|
407
|
+
// own comparison says so. Written as a chain over the arms rather than a
|
|
408
|
+
// memcmp of the storage, which would compare padding, and rather than a
|
|
409
|
+
// single `index()` test, which would call two different strings equal.
|
|
410
|
+
if (leftUnion && rightUnion) {
|
|
411
|
+
if (representationKey(left.representation) !== representationKey(right.representation))
|
|
412
|
+
return null;
|
|
413
|
+
const arms = [];
|
|
414
|
+
for (const [index, arm] of leftUnion.arms.entries()) {
|
|
415
|
+
const compared = armEqualityText(arm.value, `${left.text}.get<${index}>()`, `${right.text}.get<${index}>()`);
|
|
416
|
+
if (compared === null)
|
|
417
|
+
return null;
|
|
418
|
+
arms.push(`${left.text}.is<${index}>() && ${right.text}.is<${index}>() ? (${compared}) : `);
|
|
419
|
+
if (arm.value.kind !== 'class-ref' && !callableIdentityCarrier(arm.value))
|
|
420
|
+
continue;
|
|
421
|
+
// Upcasting before storage can put the same object in a different
|
|
422
|
+
// class arm of the same sum. Discriminant inequality is not identity.
|
|
423
|
+
for (const [otherIndex, otherArm] of rightUnion.arms.entries()) {
|
|
424
|
+
if (otherIndex === index ||
|
|
425
|
+
(!(arm.value.kind === 'class-ref' && otherArm.value.kind === 'class-ref') &&
|
|
426
|
+
!(callableIdentityCarrier(arm.value) && callableIdentityCarrier(otherArm.value))))
|
|
427
|
+
continue;
|
|
428
|
+
const crossClass = strictEqualityText('===', { text: `${left.text}.get<${index}>()`, representation: arm.value }, { text: `${right.text}.get<${otherIndex}>()`, representation: otherArm.value });
|
|
429
|
+
if (crossClass === null)
|
|
430
|
+
return null;
|
|
431
|
+
arms.push(`${left.text}.is<${index}>() && ${right.text}.is<${otherIndex}>() ? (${crossClass}) : `);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return negate(operator, `(${arms.join('')}false)`);
|
|
435
|
+
}
|
|
436
|
+
// A sum against a concrete value: step 1 of 7.2.16 is the arm test, and a
|
|
437
|
+
// carrier no arm holds settles the whole comparison before the program runs.
|
|
438
|
+
const union = leftUnion ?? rightUnion;
|
|
439
|
+
const other = leftUnion ? right : left;
|
|
440
|
+
if (!union)
|
|
441
|
+
return null;
|
|
442
|
+
const otherKey = representationKey(other.representation);
|
|
443
|
+
const index = union.arms.findIndex((arm) => representationKey(arm.value) === otherKey);
|
|
444
|
+
const unionText = leftUnion ? left.text : right.text;
|
|
445
|
+
// A union may retain both a base and a derived class arm. Matching the
|
|
446
|
+
// base's carrier key alone would miss that same object in the derived arm.
|
|
447
|
+
if (index < 0 || other.representation.kind === 'class-ref' || callableIdentityCarrier(other.representation)) {
|
|
448
|
+
const nested = [];
|
|
449
|
+
for (const [nestedIndex, arm] of union.arms.entries()) {
|
|
450
|
+
if (arm.value.kind !== 'tagged-union' &&
|
|
451
|
+
arm.value.kind !== 'optional' &&
|
|
452
|
+
!(arm.value.kind === 'class-ref' && other.representation.kind === 'class-ref') &&
|
|
453
|
+
!(callableIdentityCarrier(arm.value) && callableIdentityCarrier(other.representation)))
|
|
454
|
+
continue;
|
|
455
|
+
const compared = strictEqualityText('===', { text: `${unionText}.get<${nestedIndex}>()`, representation: arm.value }, other);
|
|
456
|
+
if (compared === null)
|
|
457
|
+
return null;
|
|
458
|
+
if (compared !== 'false')
|
|
459
|
+
nested.push(`(${unionText}.is<${nestedIndex}>() && (${compared}))`);
|
|
460
|
+
}
|
|
461
|
+
return negate(operator, nested.length ? `(${nested.join(' || ')})` : 'false');
|
|
462
|
+
}
|
|
463
|
+
const arm = union.arms[index];
|
|
464
|
+
if (!arm)
|
|
465
|
+
return null;
|
|
466
|
+
const compared = armEqualityText(arm.value, `${unionText}.get<${index}>()`, other.text);
|
|
467
|
+
if (compared === null)
|
|
468
|
+
return null;
|
|
469
|
+
if (compared === 'true')
|
|
470
|
+
return negate(operator, `${unionText}.is<${index}>()`);
|
|
471
|
+
return negate(operator, `(${unionText}.is<${index}>() && (${compared}))`);
|
|
472
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { IrValueId } from '../../identity/ids.js';
|
|
2
|
+
import type { IrBlockId, IrBody, IrIteratorCloseRegion, IrNonTerminatorOperation, IrOperand, IrTerminatorOperation, IrTryRegion } from '../../ir/model.js';
|
|
3
|
+
import { type EmitContext } from './emit-context.js';
|
|
4
|
+
/**
|
|
5
|
+
* One try statement's block range, rendered as native C++ `try`/`catch` text.
|
|
6
|
+
*
|
|
7
|
+
* The flat block model connects everything by `goto`, but C++ forbids a `goto`
|
|
8
|
+
* that jumps into a `try` block or a `catch` handler from outside it -- the one
|
|
9
|
+
* transition `emit.ts`'s ordinary per-block loop otherwise never has to
|
|
10
|
+
* special-case. `lower-flow.ts` already keeps that one entry a fallthrough
|
|
11
|
+
* rather than a jump (see `RegionBlocks`'s own comment there); this is where the
|
|
12
|
+
* fallthrough is actually rendered, and where the matching `}` of one side and
|
|
13
|
+
* the `catch (...) {`/closing `}` of the other are written by hand instead of by
|
|
14
|
+
* the ordinary per-block loop.
|
|
15
|
+
*
|
|
16
|
+
* Everything else about a region's blocks is ordinary. This used to walk only a
|
|
17
|
+
* straight run of unconditional jumps and refuse the moment it met a branch,
|
|
18
|
+
* on the stated grounds that "nothing in `lower-flow.ts`'s region bookkeeping
|
|
19
|
+
* tracks which *extra* blocks a nested guard/loop would open while a region is
|
|
20
|
+
* active". That was true of `lower-flow.ts` and irrelevant to the question:
|
|
21
|
+
* the blocks a part owns are not bookkeeping to be carried forward, they are
|
|
22
|
+
* a property of the finished graph -- every block reachable from the part's
|
|
23
|
+
* entry without passing through the region's join. `collectPartBlocks` reads
|
|
24
|
+
* that off the sealed body, so a `try` body may now branch, loop and merge
|
|
25
|
+
* like any other code. What C++ actually forbids is narrower than what was
|
|
26
|
+
* being refused, and it is checked directly in `verifyNoInboundJumps`.
|
|
27
|
+
*
|
|
28
|
+
* Two facts make rendering interior blocks safe. Every SSA value is declared at
|
|
29
|
+
* function scope (see the declaration block `emitBody` emits first, and its own
|
|
30
|
+
* comment about `goto` and initialized scopes), so a label inside a `try` never
|
|
31
|
+
* jumps past an initialization. And a `goto` OUT of a try -- to the join, to an
|
|
32
|
+
* enclosing loop, to a `return` -- is perfectly legal C++; only jumping IN is
|
|
33
|
+
* not.
|
|
34
|
+
*
|
|
35
|
+
* `emitOperation`/`emitTerminator`/`labelOf` are parameters rather than imports
|
|
36
|
+
* to avoid a cycle: all three are `emit.ts`'s own, and this module renders a
|
|
37
|
+
* whole set of arbitrary blocks -- their operations, their merge writes and
|
|
38
|
+
* their real terminators -- by calling back into them.
|
|
39
|
+
*/
|
|
40
|
+
type EmitOperation = (ctx: EmitContext, lines: string[], operation: IrNonTerminatorOperation) => void;
|
|
41
|
+
type EmitTerminator = (ctx: EmitContext, lines: string[], labels: ReadonlyMap<IrBlockId, string>, isSingleBlock: boolean, terminator: IrTerminatorOperation) => void;
|
|
42
|
+
/** What `renderTryRegion` needs from `emit.ts` to render a region's blocks the same way the ordinary per-block loop renders every other block. */
|
|
43
|
+
export interface RegionRendering {
|
|
44
|
+
readonly emitOperation: EmitOperation;
|
|
45
|
+
readonly emitTerminator: EmitTerminator;
|
|
46
|
+
readonly labelOf: (labels: ReadonlyMap<IrBlockId, string>, block: IrBlockId) => string;
|
|
47
|
+
readonly labels: ReadonlyMap<IrBlockId, string>;
|
|
48
|
+
readonly isSingleBlock: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* The merge writes `emit.ts` computed for the whole body.
|
|
51
|
+
*
|
|
52
|
+
* A branching try body is exactly the shape that produces these -- two arms
|
|
53
|
+
* of an `if` writing one merged variable -- and the write belongs in the
|
|
54
|
+
* predecessor, which is an interior block of this region. Rendering the
|
|
55
|
+
* region without them would drop the write and leave the merge holding
|
|
56
|
+
* whatever the declaration default was.
|
|
57
|
+
*/
|
|
58
|
+
readonly mergeWrites: ReadonlyMap<IrBlockId, readonly {
|
|
59
|
+
readonly name: string;
|
|
60
|
+
readonly value: IrOperand;
|
|
61
|
+
}[]>;
|
|
62
|
+
/** Every region in this body by its own `tryEntry`, so a nested one can be recognized -- and refused by name -- rather than rendered as ordinary blocks. */
|
|
63
|
+
readonly regionByTryEntry: ReadonlyMap<IrBlockId, IrTryRegion>;
|
|
64
|
+
/**
|
|
65
|
+
* Every iterator-close/finite-destructuring-close region in this body by its
|
|
66
|
+
* own `entry`, for the identical reason `regionByTryEntry` exists: a `for`
|
|
67
|
+
* `(const x of xs) { ... }` or `const [a] = xs` written directly inside a
|
|
68
|
+
* `try` body/handler/finally clause makes that region's entry block one of
|
|
69
|
+
* THIS part's ordinary reachable blocks, and without recognizing it here it
|
|
70
|
+
* rendered as plain statements -- silently dropping the `CompletionGuard`
|
|
71
|
+
* and the inner protective `try`/`catch` IteratorClose needs. A `for`-`of`
|
|
72
|
+
* loop wrapped in a `try` already worked before this map existed, because
|
|
73
|
+
* that shape nests the other way (the loop's own iterator-close region
|
|
74
|
+
* contains the `try`, not the reverse); a source-level `try` wrapping a
|
|
75
|
+
* FINITE destructuring statement is the one shape only `preparePart` sees.
|
|
76
|
+
*/
|
|
77
|
+
readonly iteratorCloseRegionByEntry: ReadonlyMap<IrBlockId, IrIteratorCloseRegion>;
|
|
78
|
+
/**
|
|
79
|
+
* Renders one iterator-close region as `emit.ts`'s own per-block loop does
|
|
80
|
+
* for a top-level one -- a callback rather than a direct import, because
|
|
81
|
+
* `emit-iterator.ts` already imports `renderTryRegion` from this module for
|
|
82
|
+
* the opposite nesting (a plain `try` written inside a `for`-`of` body), and
|
|
83
|
+
* importing back would cycle the two modules.
|
|
84
|
+
*/
|
|
85
|
+
readonly renderIteratorCloseRegion: (ctx: EmitContext, lines: string[], body: IrBody, region: IrIteratorCloseRegion, rendering: RegionRendering) => readonly IrBlockId[];
|
|
86
|
+
/**
|
|
87
|
+
* The hoist plan's two halves and the block tail, as `emit.ts` writes them
|
|
88
|
+
* for every block it renders itself.
|
|
89
|
+
*
|
|
90
|
+
* A region's blocks are not a different kind of block, and this file's own
|
|
91
|
+
* header says so -- but `renderPart` used to write only operations, merge
|
|
92
|
+
* writes and a terminator, so a hoisted read, a dense window's setup and a
|
|
93
|
+
* counted fill loop were all silently dropped for anything inside a `try`.
|
|
94
|
+
* The first of those is not a missed optimization but a double DEFINITION:
|
|
95
|
+
* the relocated read renders at its destination AND at its origin.
|
|
96
|
+
*/
|
|
97
|
+
readonly relocated: ReadonlySet<IrValueId>;
|
|
98
|
+
readonly emitHoistedInto: (ctx: EmitContext, lines: string[], block: IrBlockId) => void;
|
|
99
|
+
/** A dense window's setup and a counted fill loop; `true` when the fill loop replaced the block's terminator. */
|
|
100
|
+
readonly emitBlockTail: (ctx: EmitContext, lines: string[], block: IrBlockId) => boolean;
|
|
101
|
+
}
|
|
102
|
+
/** 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. */
|
|
103
|
+
export declare const renderTryRegion: (ctx: EmitContext, lines: string[], body: IrBody, region: IrTryRegion, rendering: RegionRendering) => readonly IrBlockId[];
|
|
104
|
+
export {};
|