@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,822 @@
|
|
|
1
|
+
import { walkRepresentation } from '../representation/model.js';
|
|
2
|
+
import { integerLinearMagnitude, narrowableIntegersOf, widenIntegerMagnitude } from './integers.js';
|
|
3
|
+
import { operandsOfIrOperation, resultOfIrOperation } from './queries.js';
|
|
4
|
+
/**
|
|
5
|
+
* A field's identity across the whole program: the struct that declares the
|
|
6
|
+
* member, and the source key.
|
|
7
|
+
*
|
|
8
|
+
* Keyed by struct NAME rather than by shape id because the struct name is what
|
|
9
|
+
* the C++ declaration is spelled from -- a class is `cppClassName`, a record is
|
|
10
|
+
* `cppRecordStructName`, and only the caller knows which. A slot that could not
|
|
11
|
+
* be matched to the member being rendered would narrow every read of it and
|
|
12
|
+
* leave the storage a double.
|
|
13
|
+
*/
|
|
14
|
+
export const integerStorageSlot = (structName, key) => `${structName} ${key}`;
|
|
15
|
+
/**
|
|
16
|
+
* One FORMAL's identity across the whole program: the body it belongs to, and
|
|
17
|
+
* its position.
|
|
18
|
+
*
|
|
19
|
+
* A parameter is storage in exactly the sense a field is: one slot, written by
|
|
20
|
+
* every call site and read by the body. `bench/comparison/fixtures/fibonacci.ts`
|
|
21
|
+
* is the whole argument -- its `n` is only ever `40`, `n - 1` and `n - 2`, and
|
|
22
|
+
* the hand-written baseline beside it declares `static long long fib(int n)`.
|
|
23
|
+
* A census that stopped at fields would leave that body doing its compare, its
|
|
24
|
+
* two subtractions and its recursion in doubles.
|
|
25
|
+
*
|
|
26
|
+
* Spelled with a `#` where a field's slot has a space, so the two families of
|
|
27
|
+
* slot share one map without a key of either ever reading as the other.
|
|
28
|
+
*/
|
|
29
|
+
export const integerParameterSlot = (owner, ordinal) => `${String(owner)}#${ordinal}`;
|
|
30
|
+
/**
|
|
31
|
+
* A body's RESULT, as one slot the same way its formals are.
|
|
32
|
+
*
|
|
33
|
+
* The half without which narrowing a formal can cost more than it saves: with
|
|
34
|
+
* `tick(n)` computing in a `long long` and still DECLARED to return a double,
|
|
35
|
+
* every call converts on the way out and its caller adds the result to a double
|
|
36
|
+
* -- measured on `bench/comparison/fixtures/method_calls.ts`, that one
|
|
37
|
+
* conversion put the fixture 33% behind where it had been before either half
|
|
38
|
+
* landed. Written by every `return` in the body and read at every call site
|
|
39
|
+
* whose callee this census resolved.
|
|
40
|
+
*/
|
|
41
|
+
export const integerResultSlot = (owner) => `${String(owner)}#result`;
|
|
42
|
+
/** The struct half of a slot, for the disqualifications that are struct-wide. Empty for a formal's slot, which no struct owns. */
|
|
43
|
+
const structOfSlot = (slot) => {
|
|
44
|
+
const boundary = slot.indexOf(' ');
|
|
45
|
+
return boundary < 0 ? '' : slot.slice(0, boundary);
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* The operations that may mention a struct-typed value without becoming a
|
|
49
|
+
* second authority over what its members physically are.
|
|
50
|
+
*
|
|
51
|
+
* Everything here either moves the whole value (a cell, a phi, an argument, an
|
|
52
|
+
* array element), tests it, or is one of the three this census models directly
|
|
53
|
+
* (`get`/`set`/`define-own-property` with a constant key, and
|
|
54
|
+
* `allocate-record`). Every other spelling -- `Object.values` building a
|
|
55
|
+
* `std::vector<double>` out of the members, `own-property-keys`, a spread, an
|
|
56
|
+
* `await` -- reads or writes a member through a type it decided for itself, and
|
|
57
|
+
* a member this census narrowed would silently disagree with it. So the struct
|
|
58
|
+
* is struck instead: the accounting has to be COMPLETE before a slot's writes
|
|
59
|
+
* are a proof rather than a sample.
|
|
60
|
+
*/
|
|
61
|
+
const accountedOperations = new Set([
|
|
62
|
+
'get',
|
|
63
|
+
'set',
|
|
64
|
+
'define-own-property',
|
|
65
|
+
'allocate-record',
|
|
66
|
+
'allocate-array-object',
|
|
67
|
+
'binding-read',
|
|
68
|
+
'binding-write',
|
|
69
|
+
'phi',
|
|
70
|
+
'parameter',
|
|
71
|
+
'receiver',
|
|
72
|
+
'constant',
|
|
73
|
+
'compute',
|
|
74
|
+
'test',
|
|
75
|
+
'call',
|
|
76
|
+
'construct',
|
|
77
|
+
'super-initialize'
|
|
78
|
+
]);
|
|
79
|
+
/**
|
|
80
|
+
* Operations that move a whole value and never spell one of its members.
|
|
81
|
+
*
|
|
82
|
+
* A JSX slot and a capture list both take the value and put it somewhere this
|
|
83
|
+
* census does not read -- a host element's property, a capture struct -- which
|
|
84
|
+
* is why neither is in `accountedOperations`. For a CLASS carrier that is not a
|
|
85
|
+
* second authority over anything: the carrier is a pointer (`Ref<T>`), the
|
|
86
|
+
* thing at the other end is the one struct this compilation renders, and
|
|
87
|
+
* whatever slot it is moved into is spelled from the same representation. So a
|
|
88
|
+
* class mentioned in one of these positions is accounted for, and it is the
|
|
89
|
+
* difference between narrowing `examples/apps/weather`'s store and striking it
|
|
90
|
+
* -- eleven integer flags, every one of them handed to a `<View>` prop and
|
|
91
|
+
* captured by an effect, and therefore `Signal<double>` on a core with no
|
|
92
|
+
* double FPU.
|
|
93
|
+
*
|
|
94
|
+
* A RECORD in the same position is a different question and stays struck: a
|
|
95
|
+
* host reads a `style={{...}}` record's members through the type IT declares,
|
|
96
|
+
* which is exactly the second authority `excludedStructs` exists for.
|
|
97
|
+
*/
|
|
98
|
+
const wholeValueMoves = new Set(['element-prop', 'element-child', 'allocate-callable', 'allocate-constructor']);
|
|
99
|
+
/**
|
|
100
|
+
* The Array, Map and Set methods that move their element arguments WHOLE and
|
|
101
|
+
* never spell one of the element's members.
|
|
102
|
+
*
|
|
103
|
+
* A call the census cannot attribute to a body strikes the struct of every
|
|
104
|
+
* operand, because an unknown callee could read or write a member through a
|
|
105
|
+
* type it chose itself. A container method is not unknown: `push` copies the
|
|
106
|
+
* record into a cell, `get` copies it back out, `forEach` hands it whole to a
|
|
107
|
+
* program callback (whose own body the census reads, and whose escape the
|
|
108
|
+
* operand walk records). Without this list `ring.push({x, y, z})` alone kept
|
|
109
|
+
* `object_create`'s three members doubles.
|
|
110
|
+
*
|
|
111
|
+
* Deliberately NOT here: anything that reads members through a conversion of
|
|
112
|
+
* its own -- `join`, `toString`, `toLocaleString`, and `sort` without a
|
|
113
|
+
* comparator (which compares by ToString) -- and every method of a
|
|
114
|
+
* non-container host (`Object.values`, `JSON.stringify`, `console.log`
|
|
115
|
+
* reach their argument's members through the dynamic protocol, which is the
|
|
116
|
+
* box accounting's business, not this list's).
|
|
117
|
+
*/
|
|
118
|
+
const wholeElementMethods = new Set([
|
|
119
|
+
'push',
|
|
120
|
+
'pop',
|
|
121
|
+
'shift',
|
|
122
|
+
'unshift',
|
|
123
|
+
'splice',
|
|
124
|
+
'slice',
|
|
125
|
+
'concat',
|
|
126
|
+
'fill',
|
|
127
|
+
'reverse',
|
|
128
|
+
'at',
|
|
129
|
+
'indexOf',
|
|
130
|
+
'lastIndexOf',
|
|
131
|
+
'includes',
|
|
132
|
+
'find',
|
|
133
|
+
'findIndex',
|
|
134
|
+
'findLast',
|
|
135
|
+
'findLastIndex',
|
|
136
|
+
'some',
|
|
137
|
+
'every',
|
|
138
|
+
'forEach',
|
|
139
|
+
'map',
|
|
140
|
+
'filter',
|
|
141
|
+
'reduce',
|
|
142
|
+
'reduceRight',
|
|
143
|
+
'flat',
|
|
144
|
+
'flatMap',
|
|
145
|
+
'copyWithin',
|
|
146
|
+
'entries',
|
|
147
|
+
'keys',
|
|
148
|
+
'values',
|
|
149
|
+
'with',
|
|
150
|
+
'toReversed',
|
|
151
|
+
'toSpliced',
|
|
152
|
+
'sort',
|
|
153
|
+
'get',
|
|
154
|
+
'set',
|
|
155
|
+
'has',
|
|
156
|
+
'add',
|
|
157
|
+
'delete',
|
|
158
|
+
'clear'
|
|
159
|
+
]);
|
|
160
|
+
/**
|
|
161
|
+
* Every carrier that holds something invocable.
|
|
162
|
+
*
|
|
163
|
+
* A formal's slot is only as complete as the set of calls that write it, so a
|
|
164
|
+
* callable this census cannot follow is a call site it cannot see. These are
|
|
165
|
+
* the carriers that hold one; where each is allowed to APPEAR is decided in
|
|
166
|
+
* `scanBody`.
|
|
167
|
+
*/
|
|
168
|
+
const callableCarriers = new Set([
|
|
169
|
+
'function',
|
|
170
|
+
'function-family',
|
|
171
|
+
'function-value-family',
|
|
172
|
+
'function-value-dispatch',
|
|
173
|
+
'function-and-constructor',
|
|
174
|
+
'constructor-family',
|
|
175
|
+
'constructor-value-dispatch'
|
|
176
|
+
]);
|
|
177
|
+
/**
|
|
178
|
+
* The bodies a callee carrier NAMES, or `null` when the carrier alone does not
|
|
179
|
+
* say.
|
|
180
|
+
*
|
|
181
|
+
* Most direct calls do not have a naming carrier: a module function is a cell
|
|
182
|
+
* whose carrier is `function-value-dispatch`, and it is `buildDirectCallableIndex`
|
|
183
|
+
* -- the same authority the emitter calls the body by name from -- that says
|
|
184
|
+
* which one body that cell holds. So this answers what the representation
|
|
185
|
+
* states, and `scanBody` asks the index for the rest.
|
|
186
|
+
*/
|
|
187
|
+
const calleeOwnersOf = (representation) => {
|
|
188
|
+
if (representation.kind === 'function')
|
|
189
|
+
return [String(representation.functionId)];
|
|
190
|
+
if (representation.kind === 'function-family')
|
|
191
|
+
return representation.members.map(String);
|
|
192
|
+
return null;
|
|
193
|
+
};
|
|
194
|
+
const isNumberScalar = (representation) => representation.kind === 'scalar' && representation.domain === 'number';
|
|
195
|
+
const sameMagnitude = (left, right) => {
|
|
196
|
+
if (left === undefined || left.kind !== right.kind)
|
|
197
|
+
return false;
|
|
198
|
+
if (left.kind === 'bounded' && right.kind === 'bounded')
|
|
199
|
+
return left.limit === right.limit;
|
|
200
|
+
return left.kind === 'linear' && right.kind === 'linear' && left.coefficient === right.coefficient;
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* How far one write steps the slot it reads, when that is all it does.
|
|
204
|
+
*
|
|
205
|
+
* `fib`'s formal is written by `40`, by `n - 1` and by `n - 2`, and the last
|
|
206
|
+
* two READ the slot they write. Derived the ordinary way those two are circular
|
|
207
|
+
* -- the slot's bound is the previous round's bound plus one, which climbs a
|
|
208
|
+
* round at a time and never settles -- and the census would refuse a formal
|
|
209
|
+
* whose whole range is `[0, 40]`. Recognized as a step, they are exactly what
|
|
210
|
+
* `integerLinearMagnitude` already models for a loop counter, and the same
|
|
211
|
+
* argument bounds them.
|
|
212
|
+
*/
|
|
213
|
+
const selfStepOf = (scan, slot, value) => {
|
|
214
|
+
const step = scan.steps.get(value);
|
|
215
|
+
if (step === undefined || (step.operator !== '+' && step.operator !== '-'))
|
|
216
|
+
return null;
|
|
217
|
+
if (scan.reads.get(step.left) !== slot && scan.slotCells.get(step.left) !== slot)
|
|
218
|
+
return null;
|
|
219
|
+
const constant = scan.constants.get(step.right);
|
|
220
|
+
return constant === undefined ? null : Math.abs(constant);
|
|
221
|
+
};
|
|
222
|
+
/**
|
|
223
|
+
* Whether one write of a body's OWN result is the sum of two of its own calls.
|
|
224
|
+
*
|
|
225
|
+
* `fib` returns `fib(n - 1) + fib(n - 2)`, and derived the ordinary way that is
|
|
226
|
+
* the same circularity `selfStepOf` was written for, only doubling instead of
|
|
227
|
+
* climbing: the slot's bound is twice the previous round's, so eight rounds
|
|
228
|
+
* multiply it by 256 and it never settles. The census then refuses a result
|
|
229
|
+
* whose whole range is `[0, 2^40]` and `fib` keeps a double.
|
|
230
|
+
*
|
|
231
|
+
* Recognized as a recursion, the bound is the same argument the file already
|
|
232
|
+
* makes for a loop counter. Such a body returns a sum of BASE-case values, one
|
|
233
|
+
* per leaf call, so a result of `M` needs at least `M / B` calls with `B` the
|
|
234
|
+
* base's own bound -- the value grows by at most `B` per call, exactly what
|
|
235
|
+
* `integerLinearMagnitude(B)` means, and the coefficient cap is what refuses a
|
|
236
|
+
* base big enough to reach 2^53 in few enough calls to matter.
|
|
237
|
+
*
|
|
238
|
+
* Only `+`, and deliberately: `f(n - 1) * f(n - 2)` reaches 2^53 in ~53 nested
|
|
239
|
+
* frames, and no argument about call counts bounds it.
|
|
240
|
+
*/
|
|
241
|
+
const selfSumOf = (scan, slot, value) => {
|
|
242
|
+
if (`${scan.owner}#result` !== slot)
|
|
243
|
+
return false;
|
|
244
|
+
const sum = scan.steps.get(value);
|
|
245
|
+
if (sum === undefined || sum.operator !== '+')
|
|
246
|
+
return false;
|
|
247
|
+
return scan.reads.get(sum.left) === slot && scan.reads.get(sum.right) === slot;
|
|
248
|
+
};
|
|
249
|
+
const emptyFacts = { reads: new Map(), integral: new Set(), magnitudes: new Map() };
|
|
250
|
+
export const emptyIntegerStorageCensus = { slots: new Set(), factsOf: () => emptyFacts };
|
|
251
|
+
/** How many times each pass may re-derive before it gives up and refuses every slot. */
|
|
252
|
+
const settlingRounds = 8;
|
|
253
|
+
const scanBody = (body, question, disqualified) => {
|
|
254
|
+
const owner = String(body.sourceOwner);
|
|
255
|
+
const constantTexts = new Map();
|
|
256
|
+
const reads = new Map();
|
|
257
|
+
const writes = new Map();
|
|
258
|
+
const steps = new Map();
|
|
259
|
+
const constants = new Map();
|
|
260
|
+
const cellReads = new Map();
|
|
261
|
+
const allocatedCallables = new Map();
|
|
262
|
+
const methodReads = new Map();
|
|
263
|
+
const cellWrites = new Map();
|
|
264
|
+
const slotCells = new Map();
|
|
265
|
+
let returns = null;
|
|
266
|
+
let returnCount = 0;
|
|
267
|
+
let returnsNumber = true;
|
|
268
|
+
const boxedStructs = new Set();
|
|
269
|
+
const boxedSlots = new Set();
|
|
270
|
+
const boxedValues = new Set();
|
|
271
|
+
let boxOpaque = false;
|
|
272
|
+
const escapedCallables = new Set();
|
|
273
|
+
// Two walks: a key is a `constant` operation and nothing orders it before the
|
|
274
|
+
// access that names it, so the texts have to be complete before any access is
|
|
275
|
+
// read.
|
|
276
|
+
//
|
|
277
|
+
// The same pre-pass records what each value was DEFINED as, and the source of
|
|
278
|
+
// every conversion, because a box is asked what it carries and the answer is
|
|
279
|
+
// never at the box itself: a value's carrier at the use site is already the
|
|
280
|
+
// `dynamic` one, and its payload is whatever it was before the conversion.
|
|
281
|
+
const definedRepresentations = new Map();
|
|
282
|
+
const convertSources = new Map();
|
|
283
|
+
for (const blockId of body.blockOrder) {
|
|
284
|
+
for (const operation of body.blocks.get(blockId)?.operations ?? []) {
|
|
285
|
+
const produced = resultOfIrOperation(operation);
|
|
286
|
+
if (produced !== null)
|
|
287
|
+
definedRepresentations.set(produced.id, produced.representation);
|
|
288
|
+
if (operation.kind === 'convert')
|
|
289
|
+
convertSources.set(operation.result.id, operation.source.value);
|
|
290
|
+
if (operation.kind === 'binding-read')
|
|
291
|
+
cellReads.set(operation.result.id, operation.declaration);
|
|
292
|
+
if (operation.kind === 'allocate-callable')
|
|
293
|
+
allocatedCallables.set(operation.result.id, String(operation.functionId));
|
|
294
|
+
if (operation.kind !== 'constant')
|
|
295
|
+
continue;
|
|
296
|
+
constantTexts.set(operation.result.id, operation.text);
|
|
297
|
+
if (operation.literal !== 'number')
|
|
298
|
+
continue;
|
|
299
|
+
const numeric = Number(operation.text);
|
|
300
|
+
if (Number.isFinite(numeric) && Number.isInteger(numeric))
|
|
301
|
+
constants.set(operation.result.id, numeric);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* What a boxed value carries, or `null` when this census cannot say.
|
|
306
|
+
*
|
|
307
|
+
* A conversion into the dynamic carrier is followed to its source, because
|
|
308
|
+
* that source's carrier IS the payload -- `throw new Error(...)` boxes a
|
|
309
|
+
* record, and the record is one operand back. A value whose definition is
|
|
310
|
+
* already dynamic and is not a conversion (a member read off a boxed
|
|
311
|
+
* receiver) has no payload anything names, and `null` is the honest answer:
|
|
312
|
+
* `boxOpaque` turns it into a refusal rather than a guess.
|
|
313
|
+
*/
|
|
314
|
+
const boxPayloadOf = (value) => {
|
|
315
|
+
const seen = new Set();
|
|
316
|
+
let at = value;
|
|
317
|
+
while (at !== undefined && !seen.has(at)) {
|
|
318
|
+
seen.add(at);
|
|
319
|
+
const representation = definedRepresentations.get(at);
|
|
320
|
+
if (representation === undefined)
|
|
321
|
+
return null;
|
|
322
|
+
if (representation.kind !== 'dynamic')
|
|
323
|
+
return representation;
|
|
324
|
+
at = convertSources.get(at);
|
|
325
|
+
}
|
|
326
|
+
return null;
|
|
327
|
+
};
|
|
328
|
+
const write = (slot, value) => {
|
|
329
|
+
const existing = writes.get(slot) ?? [];
|
|
330
|
+
existing.push(value);
|
|
331
|
+
writes.set(slot, existing);
|
|
332
|
+
};
|
|
333
|
+
// A second pre-pass: a member read needs its key's text, which the first one
|
|
334
|
+
// is what completes. The same pass names the CONTAINER methods read off an
|
|
335
|
+
// Array, Map or Set -- see `wholeElementMethods`.
|
|
336
|
+
const containerMethodReads = new Map();
|
|
337
|
+
for (const blockId of body.blockOrder) {
|
|
338
|
+
for (const operation of body.blocks.get(blockId)?.operations ?? []) {
|
|
339
|
+
if (operation.kind !== 'get')
|
|
340
|
+
continue;
|
|
341
|
+
const key = constantTexts.get(operation.key.value);
|
|
342
|
+
if (key === undefined)
|
|
343
|
+
continue;
|
|
344
|
+
const receiver = operation.receiver.representation;
|
|
345
|
+
if (receiver.kind === 'class-ref') {
|
|
346
|
+
const method = question.methodBodies.get(`${receiver.declaration} ${key}`);
|
|
347
|
+
if (method !== undefined)
|
|
348
|
+
methodReads.set(operation.result.id, String(method));
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
const container = receiver.kind === 'optional' ? receiver.payload : receiver;
|
|
352
|
+
if ((container.kind === 'array-object' || container.kind === 'keyed-collection') && wholeElementMethods.has(key))
|
|
353
|
+
containerMethodReads.set(operation.result.id, key);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
const calleeOwners = (callee) => {
|
|
357
|
+
const named = calleeOwnersOf(callee.representation);
|
|
358
|
+
if (named !== null)
|
|
359
|
+
return named;
|
|
360
|
+
// A method reaches its body through the callable the site allocates, whose
|
|
361
|
+
// carrier is the dispatching one every callable cell has. The operation
|
|
362
|
+
// that built it names the body outright.
|
|
363
|
+
const method = methodReads.get(callee.value);
|
|
364
|
+
if (method !== undefined)
|
|
365
|
+
return [method];
|
|
366
|
+
const allocated = allocatedCallables.get(callee.value);
|
|
367
|
+
if (allocated !== undefined)
|
|
368
|
+
return [allocated];
|
|
369
|
+
const cell = cellReads.get(callee.value);
|
|
370
|
+
if (cell === undefined)
|
|
371
|
+
return null;
|
|
372
|
+
const resolved = question.directCallees.get(cell);
|
|
373
|
+
return resolved === undefined ? null : [String(resolved)];
|
|
374
|
+
};
|
|
375
|
+
/**
|
|
376
|
+
* Record a callable leaving accountable position.
|
|
377
|
+
*
|
|
378
|
+
* `into` is the cell a `binding-write` puts it in, and the one exemption:
|
|
379
|
+
* `question.directCallees` resolving that cell to the very function the
|
|
380
|
+
* operand names is what makes a call through it attributed rather than
|
|
381
|
+
* indirect, which is the ordinary shape of a top-level declaration and its
|
|
382
|
+
* module binding.
|
|
383
|
+
*/
|
|
384
|
+
const escapes = (operand, into) => {
|
|
385
|
+
const owners = calleeOwners(operand);
|
|
386
|
+
if (owners === null)
|
|
387
|
+
return;
|
|
388
|
+
const held = into === null ? undefined : question.directCallees.get(into);
|
|
389
|
+
if (held !== undefined && owners.length === 1 && owners[0] === String(held))
|
|
390
|
+
return;
|
|
391
|
+
for (const owner of owners)
|
|
392
|
+
escapedCallables.add(owner);
|
|
393
|
+
};
|
|
394
|
+
const slotOf = (receiver, key) => {
|
|
395
|
+
const text = constantTexts.get(key.value);
|
|
396
|
+
if (text === undefined) {
|
|
397
|
+
// An INDEX into an Array, or any key into a dictionary, addresses an
|
|
398
|
+
// element, not a member: `ring[i] = point` moves the whole record in and
|
|
399
|
+
// `ring[i]` moves the whole record out, and the record's members were
|
|
400
|
+
// written where it was allocated. A member is only ever reached through
|
|
401
|
+
// a second `get`/`set` on the element, which this census reads on its
|
|
402
|
+
// own. Reading the element access as "any member" struck every struct
|
|
403
|
+
// an Array held whenever the program indexed the Array by a variable --
|
|
404
|
+
// `object_create`'s whole ring, whose three members are exactly the
|
|
405
|
+
// ones this census exists to narrow. A STRING key into an Array can
|
|
406
|
+
// still name one of its extension fields, so it keeps the strike.
|
|
407
|
+
const carrier = receiver.representation.kind === 'optional' ? receiver.representation.payload : receiver.representation;
|
|
408
|
+
if (carrier.kind === 'dictionary' || (carrier.kind === 'array-object' && isNumberScalar(key.representation)))
|
|
409
|
+
return null;
|
|
410
|
+
// A key this compilation cannot name reaches ANY member, so no member of
|
|
411
|
+
// this struct is one the census still accounts for.
|
|
412
|
+
for (const held of walkRepresentation(receiver.representation))
|
|
413
|
+
for (const name of question.structFamilyOf(held))
|
|
414
|
+
disqualified.add(name);
|
|
415
|
+
return null;
|
|
416
|
+
}
|
|
417
|
+
const structName = question.fieldStructNameOf(receiver.representation, text);
|
|
418
|
+
if (structName === null) {
|
|
419
|
+
// A union access may write any of its arms. Until this census models
|
|
420
|
+
// that multi-slot write, none of those slots has a complete write set.
|
|
421
|
+
for (const held of walkRepresentation(receiver.representation)) {
|
|
422
|
+
const owner = question.fieldStructNameOf(held, text);
|
|
423
|
+
if (owner !== null)
|
|
424
|
+
disqualified.add(integerStorageSlot(owner, text));
|
|
425
|
+
}
|
|
426
|
+
return null;
|
|
427
|
+
}
|
|
428
|
+
const slot = integerStorageSlot(structName, text);
|
|
429
|
+
const stored = question.fieldRepresentationOf(receiver.representation, text);
|
|
430
|
+
if (stored === null || !isNumberScalar(stored))
|
|
431
|
+
disqualified.add(slot);
|
|
432
|
+
return question.excludedStructs.has(structName) ? null : slot;
|
|
433
|
+
};
|
|
434
|
+
// Every struct this operation mentions, in any role. A struct named by an
|
|
435
|
+
// operation the census does not model is one whose members some other
|
|
436
|
+
// authority spells, and it is struck rather than narrowed.
|
|
437
|
+
// What a `convert` does to the structs it names is read off its two
|
|
438
|
+
// carriers, the same way the printer decides which recipe to render. A
|
|
439
|
+
// conversion that carries the object WHOLE -- a by-value record read as a
|
|
440
|
+
// view of itself, an instance upcast to its base, a record wrapped into the
|
|
441
|
+
// optional or union arm that holds it, or unwrapped back out -- never spells
|
|
442
|
+
// a member's type, so the C++ compiler keeps every access to the one struct
|
|
443
|
+
// consistent and nothing about its slots changes. A recast into a DIFFERENT
|
|
444
|
+
// struct copies member by member: the source is read through the type its
|
|
445
|
+
// struct declares (a plain copy, which C++ converts), but the target's
|
|
446
|
+
// members are written by values this census never sees, so that struct is
|
|
447
|
+
// struck. Anything else naming a struct -- a box, a carrier this cannot
|
|
448
|
+
// place -- strikes it, exactly as an unaccounted operation would.
|
|
449
|
+
const carries = (holder, name) => {
|
|
450
|
+
for (const held of walkRepresentation(holder))
|
|
451
|
+
if (question.structNameOf(held) === name)
|
|
452
|
+
return true;
|
|
453
|
+
return false;
|
|
454
|
+
};
|
|
455
|
+
const accountConvert = (source, result) => {
|
|
456
|
+
const from = question.structNameOf(source);
|
|
457
|
+
const to = question.structNameOf(result);
|
|
458
|
+
if (from === null && to === null)
|
|
459
|
+
return;
|
|
460
|
+
if (from !== null && to !== null) {
|
|
461
|
+
if (from === to || (source.kind === 'class-ref' && result.kind === 'class-ref'))
|
|
462
|
+
return;
|
|
463
|
+
disqualified.add(to);
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
if (from !== null && !carries(result, from))
|
|
467
|
+
disqualified.add(from);
|
|
468
|
+
if (to !== null && !carries(source, to))
|
|
469
|
+
disqualified.add(to);
|
|
470
|
+
};
|
|
471
|
+
const account = (operation) => {
|
|
472
|
+
const result = resultOfIrOperation(operation);
|
|
473
|
+
const roles = [...operandsOfIrOperation(operation), ...(result ? [{ value: result.id, representation: result.representation }] : [])];
|
|
474
|
+
// What each box in this body PUTS AT RISK, rather than the fact that the
|
|
475
|
+
// body boxes at all -- see `boxedStructs` and `boxOpaque`.
|
|
476
|
+
for (const operand of roles) {
|
|
477
|
+
if (operand.representation.kind !== 'dynamic')
|
|
478
|
+
continue;
|
|
479
|
+
boxedValues.add(operand.value);
|
|
480
|
+
const payload = boxPayloadOf(operand.value);
|
|
481
|
+
if (payload === null) {
|
|
482
|
+
boxOpaque = true;
|
|
483
|
+
continue;
|
|
484
|
+
}
|
|
485
|
+
// The payload is walked rather than merely named: `Value::box(Tag::String,
|
|
486
|
+
// ...)` -- which is every `console.log` -- carries no struct at all and
|
|
487
|
+
// puts nothing at risk, while an Array of records carries each of them
|
|
488
|
+
// without the array itself naming one.
|
|
489
|
+
for (const held of walkRepresentation(payload)) {
|
|
490
|
+
if (held.kind === 'dynamic' || held.kind === 'unresolved') {
|
|
491
|
+
boxOpaque = true;
|
|
492
|
+
continue;
|
|
493
|
+
}
|
|
494
|
+
for (const named of question.structFamilyOf(held))
|
|
495
|
+
boxedStructs.add(named);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
// A callable is accounted for only while every mention of it is a call site
|
|
499
|
+
// or a move into the cell that resolves to it: those are the two positions
|
|
500
|
+
// from which the census can still see -- or follow -- every invocation.
|
|
501
|
+
// Anywhere else (an argument to a host function, a record member, an array
|
|
502
|
+
// element) it can be invoked by something this census never reads.
|
|
503
|
+
for (const operand of operandsOfIrOperation(operation)) {
|
|
504
|
+
if (!callableCarriers.has(operand.representation.kind))
|
|
505
|
+
continue;
|
|
506
|
+
if ((operation.kind === 'call' || operation.kind === 'construct') && operation.callee.value === operand.value)
|
|
507
|
+
continue;
|
|
508
|
+
escapes(operand, operation.kind === 'binding-write' ? operation.declaration : null);
|
|
509
|
+
}
|
|
510
|
+
// A call to a container method (`ring.push(point)`, `seen.add(point)`)
|
|
511
|
+
// moves its arguments whole -- see `wholeElementMethods` -- so it is
|
|
512
|
+
// accounted the way an element store is, and the callable operands it may
|
|
513
|
+
// also carry were already walked for escapes above.
|
|
514
|
+
if (operation.kind === 'call') {
|
|
515
|
+
const member = containerMethodReads.get(operation.callee.value);
|
|
516
|
+
if (member !== undefined && (member !== 'sort' || operation.arguments.length > 0))
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
// A `construct` needs no callee test: a struct this census can name is one
|
|
520
|
+
// this compilation renders, so its constructor is a body the census reads.
|
|
521
|
+
const accounted = accountedOperations.has(operation.kind) && (operation.kind !== 'call' || calleeOwners(operation.callee) !== null);
|
|
522
|
+
if (accounted)
|
|
523
|
+
return;
|
|
524
|
+
if (operation.kind === 'convert') {
|
|
525
|
+
accountConvert(operation.source.representation, operation.result.representation);
|
|
526
|
+
return;
|
|
527
|
+
}
|
|
528
|
+
const moves = wholeValueMoves.has(operation.kind);
|
|
529
|
+
for (const operand of roles) {
|
|
530
|
+
// A callable signature names its inputs and result without carrying any
|
|
531
|
+
// such instances. Captured values are separate operands of allocation.
|
|
532
|
+
if (callableCarriers.has(operand.representation.kind))
|
|
533
|
+
continue;
|
|
534
|
+
if (moves && operand.representation.kind === 'class-ref')
|
|
535
|
+
continue;
|
|
536
|
+
for (const held of walkRepresentation(operand.representation))
|
|
537
|
+
for (const name of question.structFamilyOf(held))
|
|
538
|
+
disqualified.add(name);
|
|
539
|
+
}
|
|
540
|
+
};
|
|
541
|
+
for (const blockId of body.blockOrder) {
|
|
542
|
+
const block = body.blocks.get(blockId);
|
|
543
|
+
if (!block)
|
|
544
|
+
continue;
|
|
545
|
+
for (const operation of block.operations) {
|
|
546
|
+
account(operation);
|
|
547
|
+
if (operation.kind === 'compute' && operation.form === 'binary') {
|
|
548
|
+
const [left, right] = operation.operands;
|
|
549
|
+
if (left && right)
|
|
550
|
+
steps.set(operation.result.id, { operator: operation.operator, left: left.value, right: right.value });
|
|
551
|
+
}
|
|
552
|
+
if (operation.kind === 'parameter') {
|
|
553
|
+
if (isNumberScalar(operation.result.representation))
|
|
554
|
+
reads.set(operation.result.id, integerParameterSlot(body.sourceOwner, operation.ordinal));
|
|
555
|
+
continue;
|
|
556
|
+
}
|
|
557
|
+
if (operation.kind === 'call') {
|
|
558
|
+
const callees = calleeOwners(operation.callee);
|
|
559
|
+
if (callees === null) {
|
|
560
|
+
// A call this census cannot attribute reaches one of the bodies
|
|
561
|
+
// whose callable escaped, and those already keep their doubles.
|
|
562
|
+
// Nothing is recorded here: the callee got its value from a position
|
|
563
|
+
// the escape walk saw, so naming the reachable set again from a site
|
|
564
|
+
// that says nothing about it could only be less precise.
|
|
565
|
+
continue;
|
|
566
|
+
}
|
|
567
|
+
operation.arguments.forEach((argument, ordinal) => {
|
|
568
|
+
if (!isNumberScalar(argument.representation))
|
|
569
|
+
return;
|
|
570
|
+
for (const callee of callees)
|
|
571
|
+
write(integerParameterSlot(callee, ordinal), argument.value);
|
|
572
|
+
});
|
|
573
|
+
// One callee only: two bodies reaching one call site are two result
|
|
574
|
+
// slots, and this value is exactly one of them.
|
|
575
|
+
const only = callees.length === 1 ? callees[0] : undefined;
|
|
576
|
+
if (only !== undefined && operation.result !== null && isNumberScalar(operation.result.representation)) {
|
|
577
|
+
reads.set(operation.result.id, integerResultSlot(only));
|
|
578
|
+
}
|
|
579
|
+
continue;
|
|
580
|
+
}
|
|
581
|
+
if (operation.kind === 'get') {
|
|
582
|
+
const slot = slotOf(operation.receiver, operation.key);
|
|
583
|
+
if (slot !== null && isNumberScalar(operation.result.representation))
|
|
584
|
+
reads.set(operation.result.id, slot);
|
|
585
|
+
continue;
|
|
586
|
+
}
|
|
587
|
+
if (operation.kind === 'binding-write') {
|
|
588
|
+
const written = cellWrites.get(operation.declaration) ?? [];
|
|
589
|
+
written.push(operation.value.value);
|
|
590
|
+
cellWrites.set(operation.declaration, written);
|
|
591
|
+
}
|
|
592
|
+
if (operation.kind === 'set' || operation.kind === 'define-own-property') {
|
|
593
|
+
const slot = slotOf(operation.receiver, operation.key);
|
|
594
|
+
if (slot === null)
|
|
595
|
+
continue;
|
|
596
|
+
// A write of anything but a plain `number` settles the member's carrier
|
|
597
|
+
// on its own, and narrowing it would make the two disagree.
|
|
598
|
+
if (isNumberScalar(operation.value.representation))
|
|
599
|
+
write(slot, operation.value.value);
|
|
600
|
+
else
|
|
601
|
+
disqualified.add(slot);
|
|
602
|
+
continue;
|
|
603
|
+
}
|
|
604
|
+
if (operation.kind === 'delete') {
|
|
605
|
+
for (const held of walkRepresentation(operation.receiver.representation))
|
|
606
|
+
for (const name of question.structFamilyOf(held))
|
|
607
|
+
disqualified.add(name);
|
|
608
|
+
continue;
|
|
609
|
+
}
|
|
610
|
+
if (operation.kind !== 'allocate-record')
|
|
611
|
+
continue;
|
|
612
|
+
const structName = question.structNameOf(operation.result.representation);
|
|
613
|
+
if (structName === null || question.excludedStructs.has(structName))
|
|
614
|
+
continue;
|
|
615
|
+
for (const field of operation.fields) {
|
|
616
|
+
const slot = integerStorageSlot(structName, field.key);
|
|
617
|
+
const stored = question.fieldRepresentationOf(operation.result.representation, field.key);
|
|
618
|
+
if (stored !== null && isNumberScalar(stored) && isNumberScalar(field.value.representation))
|
|
619
|
+
write(slot, field.value.value);
|
|
620
|
+
else
|
|
621
|
+
disqualified.add(slot);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
if (block.terminator.kind === 'return' && block.terminator.value !== null) {
|
|
625
|
+
// A returned callable is the escape the operand walk cannot see: a
|
|
626
|
+
// factory's arrow reaches its caller through the terminator, and every
|
|
627
|
+
// later mention of it is opaque.
|
|
628
|
+
if (callableCarriers.has(block.terminator.value.representation.kind))
|
|
629
|
+
escapes(block.terminator.value, null);
|
|
630
|
+
returns = block.terminator.value.value;
|
|
631
|
+
returnCount += 1;
|
|
632
|
+
if (isNumberScalar(block.terminator.value.representation))
|
|
633
|
+
write(integerResultSlot(body.sourceOwner), block.terminator.value.value);
|
|
634
|
+
else
|
|
635
|
+
returnsNumber = false;
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
// A cell every write of which comes out of ONE slot is that slot, as far as
|
|
639
|
+
// recognizing a step is concerned. More than one slot, or one write from
|
|
640
|
+
// somewhere else, and it is not.
|
|
641
|
+
const cellSlots = new Map();
|
|
642
|
+
for (const [cell, values] of cellWrites) {
|
|
643
|
+
const held = new Set(values.map((value) => reads.get(value)));
|
|
644
|
+
const only = held.size === 1 ? [...held][0] : undefined;
|
|
645
|
+
if (only !== undefined)
|
|
646
|
+
cellSlots.set(cell, only);
|
|
647
|
+
}
|
|
648
|
+
for (const [value, cell] of cellReads) {
|
|
649
|
+
const slot = cellSlots.get(cell);
|
|
650
|
+
if (slot !== undefined)
|
|
651
|
+
slotCells.set(value, slot);
|
|
652
|
+
}
|
|
653
|
+
// After the walk, not during it: a box can precede the read whose slot it
|
|
654
|
+
// names, and `reads` is only complete once every block has been seen.
|
|
655
|
+
for (const value of boxedValues) {
|
|
656
|
+
const slot = reads.get(value);
|
|
657
|
+
if (slot !== undefined)
|
|
658
|
+
boxedSlots.add(slot);
|
|
659
|
+
}
|
|
660
|
+
return {
|
|
661
|
+
owner,
|
|
662
|
+
reads,
|
|
663
|
+
slotCells,
|
|
664
|
+
writes,
|
|
665
|
+
returns: returnCount === 1 ? returns : null,
|
|
666
|
+
returnsNumber: returnsNumber && returnCount > 0,
|
|
667
|
+
boxedStructs,
|
|
668
|
+
boxedSlots,
|
|
669
|
+
boxOpaque,
|
|
670
|
+
steps,
|
|
671
|
+
constants,
|
|
672
|
+
escapedCallables
|
|
673
|
+
};
|
|
674
|
+
};
|
|
675
|
+
export const integerStorageCensusOf = (question) => {
|
|
676
|
+
const disqualified = new Set();
|
|
677
|
+
const scans = new Map();
|
|
678
|
+
for (const body of question.bodies)
|
|
679
|
+
scans.set(String(body.sourceOwner), scanBody(body, question, disqualified));
|
|
680
|
+
// A box whose payload this census cannot name refuses the whole program, the
|
|
681
|
+
// way any box used to. Every box it CAN name strikes its own struct and the
|
|
682
|
+
// slot it was read out of, and nothing else -- see `BodyScan.boxedStructs`.
|
|
683
|
+
if ([...scans.values()].some((scan) => scan.boxOpaque))
|
|
684
|
+
return emptyIntegerStorageCensus;
|
|
685
|
+
const boxedSlots = new Set();
|
|
686
|
+
for (const scan of scans.values()) {
|
|
687
|
+
for (const name of scan.boxedStructs)
|
|
688
|
+
disqualified.add(name);
|
|
689
|
+
for (const slot of scan.boxedSlots)
|
|
690
|
+
boxedSlots.add(slot);
|
|
691
|
+
}
|
|
692
|
+
const bySlot = new Map();
|
|
693
|
+
const record = (slot, write) => {
|
|
694
|
+
const existing = bySlot.get(slot) ?? [];
|
|
695
|
+
existing.push(write);
|
|
696
|
+
bySlot.set(slot, existing);
|
|
697
|
+
};
|
|
698
|
+
for (const scan of scans.values()) {
|
|
699
|
+
for (const [slot, values] of scan.writes)
|
|
700
|
+
for (const value of values)
|
|
701
|
+
record(slot, { owner: scan.owner, value });
|
|
702
|
+
}
|
|
703
|
+
// A class field's default initializer is a body whose return value seeds the
|
|
704
|
+
// member -- see `fieldSeeds`. A seed this census cannot read is a write it
|
|
705
|
+
// cannot account for, so the member keeps its double.
|
|
706
|
+
for (const [slot, seeds] of question.fieldSeeds)
|
|
707
|
+
for (const seed of seeds) {
|
|
708
|
+
const scan = scans.get(String(seed.initializer));
|
|
709
|
+
if (seed.representation === null || !isNumberScalar(seed.representation) || scan === undefined || scan.returns === null)
|
|
710
|
+
disqualified.add(slot);
|
|
711
|
+
else
|
|
712
|
+
record(slot, { owner: scan.owner, value: scan.returns });
|
|
713
|
+
}
|
|
714
|
+
const escaped = new Set();
|
|
715
|
+
for (const scan of scans.values())
|
|
716
|
+
for (const owner of scan.escapedCallables)
|
|
717
|
+
escaped.add(owner);
|
|
718
|
+
// A formal's slot and a result's slot are admitted on the same terms: both
|
|
719
|
+
// are positions in a signature, and both need every call accounted for --
|
|
720
|
+
// which is exactly what an escaped callable takes away, for that body alone.
|
|
721
|
+
const admitsSignatureSlot = (slot) => {
|
|
722
|
+
const boundary = slot.lastIndexOf('#');
|
|
723
|
+
if (boundary <= 0)
|
|
724
|
+
return false;
|
|
725
|
+
const owner = slot.slice(0, boundary);
|
|
726
|
+
if (escaped.has(owner))
|
|
727
|
+
return false;
|
|
728
|
+
if (question.excludedFormalOwners.has(owner) || question.excludedSignatureSlots.has(slot))
|
|
729
|
+
return false;
|
|
730
|
+
// A body that returns anything but a `number` on some path has a result
|
|
731
|
+
// this census cannot narrow, whatever its numeric returns say.
|
|
732
|
+
return slot.slice(boundary + 1) !== 'result' || scans.get(owner)?.returnsNumber === true;
|
|
733
|
+
};
|
|
734
|
+
const admits = (slot) => {
|
|
735
|
+
if (disqualified.has(slot) || boxedSlots.has(slot))
|
|
736
|
+
return false;
|
|
737
|
+
if (slot.indexOf(' ') < 0)
|
|
738
|
+
return admitsSignatureSlot(slot);
|
|
739
|
+
return !disqualified.has(structOfSlot(slot)) && !question.excludedStructs.has(structOfSlot(slot));
|
|
740
|
+
};
|
|
741
|
+
// A slot nothing writes is one nothing can prove, so the candidates are
|
|
742
|
+
// exactly the written ones -- a read-only member keeps its double.
|
|
743
|
+
let integral = new Set([...bySlot.keys()].filter(admits));
|
|
744
|
+
if (integral.size === 0)
|
|
745
|
+
return emptyIntegerStorageCensus;
|
|
746
|
+
let magnitudes = new Map();
|
|
747
|
+
const censusRound = () => {
|
|
748
|
+
const answers = new Map();
|
|
749
|
+
for (const body of question.bodies) {
|
|
750
|
+
const owner = String(body.sourceOwner);
|
|
751
|
+
const scan = scans.get(owner);
|
|
752
|
+
if (scan === undefined || (scan.reads.size === 0 && scan.writes.size === 0 && scan.returns === null))
|
|
753
|
+
continue;
|
|
754
|
+
answers.set(owner, narrowableIntegersOf(body, { reads: scan.reads, integral, magnitudes }));
|
|
755
|
+
}
|
|
756
|
+
return answers;
|
|
757
|
+
};
|
|
758
|
+
// Pass 1 -- integrality, shrinking from "every candidate holds an integer".
|
|
759
|
+
for (let round = 0; round < settlingRounds; round += 1) {
|
|
760
|
+
const answers = censusRound();
|
|
761
|
+
const survivors = new Set();
|
|
762
|
+
for (const slot of integral) {
|
|
763
|
+
const writes = bySlot.get(slot) ?? [];
|
|
764
|
+
if (writes.every((entry) => answers.get(entry.owner)?.integral.has(entry.value) === true))
|
|
765
|
+
survivors.add(slot);
|
|
766
|
+
}
|
|
767
|
+
if (survivors.size === integral.size)
|
|
768
|
+
break;
|
|
769
|
+
integral = survivors;
|
|
770
|
+
if (integral.size === 0)
|
|
771
|
+
return emptyIntegerStorageCensus;
|
|
772
|
+
}
|
|
773
|
+
// Pass 2 -- magnitude, growing from "no slot is bounded". A round that
|
|
774
|
+
// changes nothing is a fixed point of the same equations the values obey; a
|
|
775
|
+
// census that never reaches one refuses, because an unsettled bound is
|
|
776
|
+
// exactly the case where a `long long` and a double stop agreeing.
|
|
777
|
+
let settled = false;
|
|
778
|
+
for (let round = 0; round < settlingRounds; round += 1) {
|
|
779
|
+
const answers = censusRound();
|
|
780
|
+
const next = new Map();
|
|
781
|
+
for (const slot of integral) {
|
|
782
|
+
let magnitude = { kind: 'bounded', limit: 0 };
|
|
783
|
+
let recursive = false;
|
|
784
|
+
for (const entry of bySlot.get(slot) ?? []) {
|
|
785
|
+
const scan = scans.get(entry.owner);
|
|
786
|
+
// A self-recursive sum is bounded by the OTHER writes, so it is skipped
|
|
787
|
+
// here and applied to their join below -- reading it as arithmetic is
|
|
788
|
+
// what makes the slot climb forever.
|
|
789
|
+
if (scan !== undefined && selfSumOf(scan, slot, entry.value)) {
|
|
790
|
+
recursive = true;
|
|
791
|
+
continue;
|
|
792
|
+
}
|
|
793
|
+
const step = scan === undefined ? null : selfStepOf(scan, slot, entry.value);
|
|
794
|
+
const written = step !== null ? integerLinearMagnitude(step) : (answers.get(entry.owner)?.magnitudes.get(entry.value) ?? null);
|
|
795
|
+
magnitude = widenIntegerMagnitude(magnitude, written);
|
|
796
|
+
}
|
|
797
|
+
if (recursive && magnitude !== null)
|
|
798
|
+
magnitude = integerLinearMagnitude(magnitude.kind === 'bounded' ? magnitude.limit : magnitude.coefficient);
|
|
799
|
+
if (magnitude !== null)
|
|
800
|
+
next.set(slot, magnitude);
|
|
801
|
+
}
|
|
802
|
+
const unchanged = next.size === magnitudes.size && [...next].every(([slot, magnitude]) => sameMagnitude(magnitudes.get(slot), magnitude));
|
|
803
|
+
magnitudes = next;
|
|
804
|
+
if (unchanged) {
|
|
805
|
+
settled = true;
|
|
806
|
+
break;
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
if (!settled)
|
|
810
|
+
return emptyIntegerStorageCensus;
|
|
811
|
+
const slots = new Set(magnitudes.keys());
|
|
812
|
+
const facts = new Map();
|
|
813
|
+
for (const [owner, scan] of scans) {
|
|
814
|
+
const reads = new Map();
|
|
815
|
+
for (const [value, slot] of scan.reads)
|
|
816
|
+
if (slots.has(slot))
|
|
817
|
+
reads.set(value, slot);
|
|
818
|
+
if (reads.size > 0)
|
|
819
|
+
facts.set(owner, { reads, integral: slots, magnitudes });
|
|
820
|
+
}
|
|
821
|
+
return { slots, factsOf: (owner) => facts.get(String(owner)) ?? emptyFacts };
|
|
822
|
+
};
|