@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,539 @@
|
|
|
1
|
+
import { controlFlowGraphOf, dominatorTreeOf, naturalLoopsOf } from './dominance.js';
|
|
2
|
+
import { numericIntrinsicsOf } from './numeric-intrinsics.js';
|
|
3
|
+
export const emptyIntegerNarrowing = {
|
|
4
|
+
values: new Set(),
|
|
5
|
+
bindings: new Set(),
|
|
6
|
+
magnitudes: new Map(),
|
|
7
|
+
integral: new Set(),
|
|
8
|
+
integralRemainders: new Set(),
|
|
9
|
+
dynamicRemainders: new Set()
|
|
10
|
+
};
|
|
11
|
+
const noStorageFacts = { reads: new Map(), integral: new Set(), magnitudes: new Map() };
|
|
12
|
+
/** 2^53: the last integer a double can hold with every integer below it. */
|
|
13
|
+
const exactIntegerLimit = 9007199254740992;
|
|
14
|
+
/**
|
|
15
|
+
* The most a narrowed value may grow per loop iteration.
|
|
16
|
+
*
|
|
17
|
+
* The cap is set so that reaching 2^53 costs at least 2^30 turns of a loop --
|
|
18
|
+
* a billion iterations of whatever body does the growing, which no program
|
|
19
|
+
* that answers in finite time runs. At 2^23 that is exactly 2^30 turns; at
|
|
20
|
+
* 2^33 it would be 2^20, which a loop really can run, so the cap is not a
|
|
21
|
+
* formality. It admits `checksum += data[i]` over elements bounded by a
|
|
22
|
+
* million (`bench/comparison/fixtures/array_write.ts`) and still refuses
|
|
23
|
+
* `factorial`'s `acc * i`, which grows by a billion a turn.
|
|
24
|
+
*/
|
|
25
|
+
const linearCoefficientCap = 1 << 23;
|
|
26
|
+
const boundedBy = (limit) => Number.isFinite(limit) && limit <= exactIntegerLimit ? { kind: 'bounded', limit } : null;
|
|
27
|
+
const growsBy = (coefficient) => Number.isFinite(coefficient) && coefficient <= linearCoefficientCap ? { kind: 'linear', coefficient } : null;
|
|
28
|
+
/**
|
|
29
|
+
* A value that grows by at most `coefficient` each time the thing that produces
|
|
30
|
+
* it runs again -- the same judgement `growsBy` makes for a loop counter,
|
|
31
|
+
* published for the whole-program census over storage.
|
|
32
|
+
*
|
|
33
|
+
* A RECURSION is a loop for this purpose and the argument is the one the cap
|
|
34
|
+
* was set from: `fib(n - 1)` steps its own formal by one per call, so reaching
|
|
35
|
+
* 2^53 would take 2^53 nested frames and the stack ends the program first.
|
|
36
|
+
*/
|
|
37
|
+
export const integerLinearMagnitude = (coefficient) => growsBy(coefficient);
|
|
38
|
+
/**
|
|
39
|
+
* The worse of two magnitudes -- what a value reachable by either path can be.
|
|
40
|
+
*
|
|
41
|
+
* Exported because a whole-program census over STORAGE has exactly this join to
|
|
42
|
+
* perform: one record field is written from many bodies, and the magnitude it
|
|
43
|
+
* holds is the worse of all of them. Reusing this rather than restating it is
|
|
44
|
+
* what keeps the two censuses one lattice instead of two that can disagree.
|
|
45
|
+
*/
|
|
46
|
+
export const widenIntegerMagnitude = (left, right) => {
|
|
47
|
+
if (left === null || right === null)
|
|
48
|
+
return null;
|
|
49
|
+
if (left.kind === 'bounded' && right.kind === 'bounded')
|
|
50
|
+
return boundedBy(Math.max(left.limit, right.limit));
|
|
51
|
+
const coefficient = Math.max(left.kind === 'linear' ? left.coefficient : 0, right.kind === 'linear' ? right.coefficient : 0);
|
|
52
|
+
return growsBy(coefficient);
|
|
53
|
+
};
|
|
54
|
+
/** The name every reader inside this file uses for the join above. */
|
|
55
|
+
const widen = widenIntegerMagnitude;
|
|
56
|
+
const sum = (left, right) => {
|
|
57
|
+
if (left.kind === 'bounded' && right.kind === 'bounded')
|
|
58
|
+
return boundedBy(left.limit + right.limit);
|
|
59
|
+
return growsBy((left.kind === 'linear' ? left.coefficient : 0) + (right.kind === 'linear' ? right.coefficient : 0));
|
|
60
|
+
};
|
|
61
|
+
const product = (left, right) => {
|
|
62
|
+
if (left.kind === 'bounded' && right.kind === 'bounded')
|
|
63
|
+
return boundedBy(left.limit * right.limit);
|
|
64
|
+
// A product of two growing values is quadratic; nothing here models that.
|
|
65
|
+
if (left.kind === 'linear' && right.kind === 'linear')
|
|
66
|
+
return null;
|
|
67
|
+
const bounded = left.kind === 'bounded' ? left.limit : right.kind === 'bounded' ? right.limit : 0;
|
|
68
|
+
const growing = left.kind === 'linear' ? left.coefficient : right.kind === 'linear' ? right.coefficient : 0;
|
|
69
|
+
return growsBy(bounded * growing);
|
|
70
|
+
};
|
|
71
|
+
/** 2^32, the width every ECMA-262 bitwise operator reduces to before it computes. */
|
|
72
|
+
const bitwiseWidth = 4294967296;
|
|
73
|
+
/** The operators whose result is an integer whatever reached them (ECMA-262 6.1.6.1.2, .9-.11, .16-.19). */
|
|
74
|
+
const bitwiseOperators = new Set(['&', '|', '^', '<<', '>>', '>>>', '~']);
|
|
75
|
+
const integerText = (text) => {
|
|
76
|
+
const value = Number(text);
|
|
77
|
+
return Number.isSafeInteger(value) ? value : null;
|
|
78
|
+
};
|
|
79
|
+
/** Only the generic `number` domain: `boolean` and `bigint` are scalars too, and neither is a double this may re-carry. */
|
|
80
|
+
const isNumberScalar = (operand) => operand.representation.kind === 'scalar' && operand.representation.domain === 'number';
|
|
81
|
+
/**
|
|
82
|
+
* The magnitude model for one body, and the narrowing it implies.
|
|
83
|
+
*
|
|
84
|
+
* A cell is judged as a whole -- every write into it and every read out of it
|
|
85
|
+
* share one storage, so they share one answer. A counter is recognized here
|
|
86
|
+
* rather than fixed up afterwards, because the recurrence `i = i + 1` is a
|
|
87
|
+
* cycle: asking for its magnitude by walking its operands would ask for its
|
|
88
|
+
* own magnitude, and the honest reading of that cycle is "grows by the step".
|
|
89
|
+
*/
|
|
90
|
+
export const narrowableIntegersOf = (body, storage = noStorageFacts) => {
|
|
91
|
+
// Math.imul always returns a signed int32, including for fractional, NaN,
|
|
92
|
+
// infinite and overflowing inputs. Its callable ABI alone says only number.
|
|
93
|
+
const imulResults = new Set();
|
|
94
|
+
for (const [call, intrinsic] of numericIntrinsicsOf(body).calls) {
|
|
95
|
+
if (intrinsic === 'imul' && call.result)
|
|
96
|
+
imulResults.add(call.result.id);
|
|
97
|
+
}
|
|
98
|
+
const definitions = new Map();
|
|
99
|
+
const computes = new Map();
|
|
100
|
+
const lengthReads = new Set();
|
|
101
|
+
const constantTexts = new Map();
|
|
102
|
+
const constants = new Map();
|
|
103
|
+
const readsCell = new Map();
|
|
104
|
+
const cellWrites = new Map();
|
|
105
|
+
const cellScalar = new Map();
|
|
106
|
+
const phis = new Map();
|
|
107
|
+
const valueRepresentations = new Map();
|
|
108
|
+
for (const blockId of body.blockOrder) {
|
|
109
|
+
const block = body.blocks.get(blockId);
|
|
110
|
+
if (!block)
|
|
111
|
+
continue;
|
|
112
|
+
for (const operation of block.operations) {
|
|
113
|
+
if (operation.kind === 'constant') {
|
|
114
|
+
definitions.set(operation.result.id, { kind: 'constant', operation });
|
|
115
|
+
constantTexts.set(operation.result.id, operation.text);
|
|
116
|
+
if (operation.literal === 'number') {
|
|
117
|
+
const value = integerText(operation.text);
|
|
118
|
+
if (value !== null)
|
|
119
|
+
constants.set(operation.result.id, value);
|
|
120
|
+
}
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (operation.kind === 'compute') {
|
|
124
|
+
definitions.set(operation.result.id, { kind: 'compute', operation });
|
|
125
|
+
computes.set(operation.result.id, operation);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (operation.kind === 'phi') {
|
|
129
|
+
definitions.set(operation.result.id, { kind: 'phi', operation });
|
|
130
|
+
phis.set(operation.result.id, operation.incoming.map((incoming) => incoming.value));
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (operation.kind === 'binding-read') {
|
|
134
|
+
definitions.set(operation.result.id, { kind: 'binding-read', operation });
|
|
135
|
+
readsCell.set(operation.result.id, operation.declaration);
|
|
136
|
+
cellScalar.set(operation.declaration, (cellScalar.get(operation.declaration) ?? true) && isNumberScalar(operation.result));
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (operation.kind === 'binding-write') {
|
|
140
|
+
const written = cellWrites.get(operation.declaration) ?? [];
|
|
141
|
+
written.push({ value: operation.value, block: blockId });
|
|
142
|
+
cellWrites.set(operation.declaration, written);
|
|
143
|
+
cellScalar.set(operation.declaration, (cellScalar.get(operation.declaration) ?? true) && isNumberScalar(operation.value));
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
// An Array's own `length` is a non-negative integer under 2^32 (ECMA-262
|
|
147
|
+
// 10.4.2.1 refuses any other value), so a read of one is an integer this
|
|
148
|
+
// may hold in a `long long` -- and that is what makes `i % ring.length`
|
|
149
|
+
// and every index derived from it an integer expression rather than a
|
|
150
|
+
// pair of doubles going through `fmod`.
|
|
151
|
+
if (operation.kind === 'get' &&
|
|
152
|
+
constantTexts.get(operation.key.value) === 'length' &&
|
|
153
|
+
(operation.receiver.representation.kind === 'array-object' || operation.receiver.representation.kind === 'string'))
|
|
154
|
+
lengthReads.add(operation.result.id);
|
|
155
|
+
const result = 'result' in operation ? operation.result : null;
|
|
156
|
+
if (result)
|
|
157
|
+
definitions.set(result.id, { kind: operation.kind, operation });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// A `const MOD = 1000000007` is a cell, not a literal, and every read of it
|
|
161
|
+
// reaches here as a `binding-read`. A cell written exactly once, with a
|
|
162
|
+
// literal, holds that literal at every read -- so the divisor of
|
|
163
|
+
// `x % MOD` is as constant as the divisor of `x % 1000000007`, and refusing
|
|
164
|
+
// the second spelling would make the lattice's answer depend on whether the
|
|
165
|
+
// program named its modulus.
|
|
166
|
+
for (const [value, cell] of readsCell) {
|
|
167
|
+
if (constants.has(value))
|
|
168
|
+
continue;
|
|
169
|
+
const written = cellWrites.get(cell) ?? [];
|
|
170
|
+
const only = written.length === 1 ? written[0] : undefined;
|
|
171
|
+
const literal = only === undefined ? undefined : constants.get(only.value.value);
|
|
172
|
+
if (literal !== undefined)
|
|
173
|
+
constants.set(value, literal);
|
|
174
|
+
}
|
|
175
|
+
for (const blockId of body.blockOrder) {
|
|
176
|
+
const block = body.blocks.get(blockId);
|
|
177
|
+
if (!block)
|
|
178
|
+
continue;
|
|
179
|
+
for (const operation of block.operations) {
|
|
180
|
+
const result = 'result' in operation ? operation.result : null;
|
|
181
|
+
if (result)
|
|
182
|
+
valueRepresentations.set(result.id, result.representation);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const isNumberScalarValue = (value) => {
|
|
186
|
+
const representation = valueRepresentations.get(value);
|
|
187
|
+
return representation !== undefined && representation.kind === 'scalar' && representation.domain === 'number';
|
|
188
|
+
};
|
|
189
|
+
const graph = controlFlowGraphOf(body);
|
|
190
|
+
const dominance = dominatorTreeOf(body);
|
|
191
|
+
const loops = naturalLoopsOf(graph, dominance);
|
|
192
|
+
/**
|
|
193
|
+
* Which values are integers at all, settled OPTIMISTICALLY before any
|
|
194
|
+
* magnitude is asked for.
|
|
195
|
+
*
|
|
196
|
+
* Integrality is a cyclic question -- `h = (h + i * 3 + 1) % C` is an integer
|
|
197
|
+
* exactly when `h` is -- and a walk that answered "not an integer" on
|
|
198
|
+
* re-entry would refuse every accumulator in the language. Assuming every
|
|
199
|
+
* `number` is an integer and striking out the ones a definition disproves
|
|
200
|
+
* reaches the greatest fixed point instead, which for a cycle with no
|
|
201
|
+
* non-integer anywhere in it is the right answer.
|
|
202
|
+
*/
|
|
203
|
+
const integral = new Set();
|
|
204
|
+
const integralCells = new Set();
|
|
205
|
+
for (const value of valueRepresentations.keys())
|
|
206
|
+
if (isNumberScalarValue(value))
|
|
207
|
+
integral.add(value);
|
|
208
|
+
for (const [cell, scalar] of cellScalar)
|
|
209
|
+
if (scalar)
|
|
210
|
+
integralCells.add(cell);
|
|
211
|
+
const producesInteger = (value) => {
|
|
212
|
+
if (imulResults.has(value))
|
|
213
|
+
return true;
|
|
214
|
+
if (constants.has(value))
|
|
215
|
+
return true;
|
|
216
|
+
if (lengthReads.has(value))
|
|
217
|
+
return true;
|
|
218
|
+
// A read of storage a whole-program census settled. Asked before the
|
|
219
|
+
// definition kinds below because the operation that produced it is a `get`,
|
|
220
|
+
// which none of them models -- without this it falls through to `return
|
|
221
|
+
// false` and every field of every record is a double.
|
|
222
|
+
const slot = storage.reads.get(value);
|
|
223
|
+
if (slot !== undefined)
|
|
224
|
+
return storage.integral.has(slot);
|
|
225
|
+
const cell = readsCell.get(value);
|
|
226
|
+
if (cell !== undefined)
|
|
227
|
+
return integralCells.has(cell);
|
|
228
|
+
const incoming = phis.get(value);
|
|
229
|
+
if (incoming !== undefined)
|
|
230
|
+
return incoming.every((operand) => integral.has(operand.value));
|
|
231
|
+
const compute = computes.get(value);
|
|
232
|
+
if (!compute)
|
|
233
|
+
return false;
|
|
234
|
+
const [left, right] = compute.operands;
|
|
235
|
+
if (!left)
|
|
236
|
+
return false;
|
|
237
|
+
// Every bitwise operator runs ToInt32/ToUint32 on both sides first, so its
|
|
238
|
+
// result is an integer no matter what reached it.
|
|
239
|
+
if (bitwiseOperators.has(compute.operator) && (compute.form === 'binary' || compute.form === 'unary'))
|
|
240
|
+
return true;
|
|
241
|
+
if (compute.form === 'update')
|
|
242
|
+
return integral.has(left.value);
|
|
243
|
+
if (compute.form === 'unary')
|
|
244
|
+
return (compute.operator === '-' || compute.operator === '+') && integral.has(left.value);
|
|
245
|
+
if (compute.form !== 'binary' || !right)
|
|
246
|
+
return false;
|
|
247
|
+
if (compute.operator === '%') {
|
|
248
|
+
const divisor = constants.get(right.value);
|
|
249
|
+
return divisor !== undefined && divisor !== 0 && integral.has(left.value);
|
|
250
|
+
}
|
|
251
|
+
if (compute.operator !== '+' && compute.operator !== '-' && compute.operator !== '*')
|
|
252
|
+
return false;
|
|
253
|
+
return integral.has(left.value) && integral.has(right.value);
|
|
254
|
+
};
|
|
255
|
+
for (let settling = true; settling;) {
|
|
256
|
+
settling = false;
|
|
257
|
+
for (const value of [...integral]) {
|
|
258
|
+
if (producesInteger(value))
|
|
259
|
+
continue;
|
|
260
|
+
integral.delete(value);
|
|
261
|
+
settling = true;
|
|
262
|
+
}
|
|
263
|
+
for (const cell of [...integralCells]) {
|
|
264
|
+
if ((cellWrites.get(cell) ?? []).every((write) => integral.has(write.value.value)))
|
|
265
|
+
continue;
|
|
266
|
+
integralCells.delete(cell);
|
|
267
|
+
settling = true;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const valueMagnitudes = new Map();
|
|
271
|
+
const cellMagnitudes = new Map();
|
|
272
|
+
const openValues = new Set();
|
|
273
|
+
const openCells = new Set();
|
|
274
|
+
/** `x + k` / `x - k` / `x++` where `x` reads `cell`: the step of a recurrence, or `null`. */
|
|
275
|
+
const stepOverCell = (value, cell) => {
|
|
276
|
+
const compute = computes.get(value.value);
|
|
277
|
+
if (!compute)
|
|
278
|
+
return null;
|
|
279
|
+
if (compute.form === 'update') {
|
|
280
|
+
const target = compute.operands[0];
|
|
281
|
+
return target && readsCell.get(target.value) === cell ? { kind: 'bounded', limit: 1 } : null;
|
|
282
|
+
}
|
|
283
|
+
if (compute.form !== 'binary' || (compute.operator !== '+' && compute.operator !== '-'))
|
|
284
|
+
return null;
|
|
285
|
+
const [left, right] = compute.operands;
|
|
286
|
+
if (!left || !right)
|
|
287
|
+
return null;
|
|
288
|
+
const self = readsCell.get(left.value) === cell ? right : readsCell.get(right.value) === cell ? left : null;
|
|
289
|
+
if (!self)
|
|
290
|
+
return null;
|
|
291
|
+
const step = magnitudeOfValue(self);
|
|
292
|
+
return step !== null && step.kind === 'bounded' ? step : null;
|
|
293
|
+
};
|
|
294
|
+
/**
|
|
295
|
+
* The constant a loop's own test holds this cell under, if it has one.
|
|
296
|
+
*
|
|
297
|
+
* Only the header's branch counts. A comparison anywhere else in the body is
|
|
298
|
+
* a question the program asked, not a bound the loop enforces: `if (i < 10)`
|
|
299
|
+
* inside an unbounded loop says nothing about how large `i` gets.
|
|
300
|
+
*/
|
|
301
|
+
const loopBoundOfCell = (cell, steps) => {
|
|
302
|
+
for (const loop of loops) {
|
|
303
|
+
if (!steps.every((block) => loop.blocks.has(block)))
|
|
304
|
+
continue;
|
|
305
|
+
const header = body.blocks.get(loop.header);
|
|
306
|
+
if (header?.terminator.kind !== 'branch')
|
|
307
|
+
continue;
|
|
308
|
+
const test = computes.get(header.terminator.condition.value);
|
|
309
|
+
if (test?.form !== 'binary' || (test.operator !== '<' && test.operator !== '<=' && test.operator !== '>' && test.operator !== '>='))
|
|
310
|
+
continue;
|
|
311
|
+
const [left, right] = test.operands;
|
|
312
|
+
if (!left || !right)
|
|
313
|
+
continue;
|
|
314
|
+
/** Whether this operand is a read of the cell itself. */
|
|
315
|
+
const namesCell = (value) => readsCell.get(value) === cell;
|
|
316
|
+
/** Whether this operand is `cell * cell` -- the sieve's own loop test. */
|
|
317
|
+
const isSquare = (value) => {
|
|
318
|
+
const square = computes.get(value);
|
|
319
|
+
return square?.form === 'binary' && square.operator === '*' && square.operands.every((side) => namesCell(side.value));
|
|
320
|
+
};
|
|
321
|
+
const leftHolds = namesCell(left.value) || isSquare(left.value);
|
|
322
|
+
const against = leftHolds ? right : namesCell(right.value) || isSquare(right.value) ? left : null;
|
|
323
|
+
if (!against)
|
|
324
|
+
continue;
|
|
325
|
+
const limit = magnitudeOfValue(against);
|
|
326
|
+
if (limit === null || limit.kind !== 'bounded')
|
|
327
|
+
continue;
|
|
328
|
+
// `i * i <= LIMIT` bounds `i` at the square root, not at LIMIT. The
|
|
329
|
+
// sieve idiom is written that way, and reading the comparison as a bound
|
|
330
|
+
// on the PRODUCT leaves the loop counter unbounded -- which then leaves
|
|
331
|
+
// the inner `j = i * i; j += i` counter unbounded too, so a sieve over
|
|
332
|
+
// ten million entries indexes its own array with two doubles.
|
|
333
|
+
const bound = isSquare(leftHolds ? left.value : right.value) ? boundedBy(Math.ceil(Math.sqrt(limit.limit))) : limit;
|
|
334
|
+
if (bound !== null)
|
|
335
|
+
return bound;
|
|
336
|
+
}
|
|
337
|
+
return null;
|
|
338
|
+
};
|
|
339
|
+
const magnitudeOfCell = (cell) => {
|
|
340
|
+
const known = cellMagnitudes.get(cell);
|
|
341
|
+
if (known !== undefined)
|
|
342
|
+
return known;
|
|
343
|
+
if (openCells.has(cell))
|
|
344
|
+
return null;
|
|
345
|
+
if (!integralCells.has(cell)) {
|
|
346
|
+
cellMagnitudes.set(cell, null);
|
|
347
|
+
return null;
|
|
348
|
+
}
|
|
349
|
+
openCells.add(cell);
|
|
350
|
+
const written = cellWrites.get(cell) ?? [];
|
|
351
|
+
let seeds = written.length > 0 ? { kind: 'bounded', limit: 0 } : null;
|
|
352
|
+
let step = null;
|
|
353
|
+
const stepBlocks = [];
|
|
354
|
+
for (const write of written) {
|
|
355
|
+
const recurrence = stepOverCell(write.value, cell);
|
|
356
|
+
if (recurrence !== null) {
|
|
357
|
+
step = step === null ? recurrence : widen(step, recurrence);
|
|
358
|
+
stepBlocks.push(write.block);
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
seeds = seeds === null ? null : widen(seeds, magnitudeOfValue(write.value));
|
|
362
|
+
}
|
|
363
|
+
openCells.delete(cell);
|
|
364
|
+
let answer = seeds;
|
|
365
|
+
if (answer !== null && step !== null) {
|
|
366
|
+
const bound = step.kind === 'bounded' ? loopBoundOfCell(cell, stepBlocks) : null;
|
|
367
|
+
answer =
|
|
368
|
+
bound !== null
|
|
369
|
+
? widen(answer, sum(bound, step))
|
|
370
|
+
: widen(answer, growsBy(step.kind === 'bounded' ? step.limit : Number.POSITIVE_INFINITY));
|
|
371
|
+
}
|
|
372
|
+
cellMagnitudes.set(cell, answer);
|
|
373
|
+
return answer;
|
|
374
|
+
};
|
|
375
|
+
function magnitudeOfValue(operand) {
|
|
376
|
+
const known = valueMagnitudes.get(operand.value);
|
|
377
|
+
if (known !== undefined)
|
|
378
|
+
return known;
|
|
379
|
+
if (!isNumberScalar(operand) || !integral.has(operand.value))
|
|
380
|
+
return null;
|
|
381
|
+
if (openValues.has(operand.value))
|
|
382
|
+
return null;
|
|
383
|
+
openValues.add(operand.value);
|
|
384
|
+
const answer = computeMagnitude(operand);
|
|
385
|
+
openValues.delete(operand.value);
|
|
386
|
+
valueMagnitudes.set(operand.value, answer);
|
|
387
|
+
return answer;
|
|
388
|
+
}
|
|
389
|
+
const computeMagnitude = (operand) => {
|
|
390
|
+
if (imulResults.has(operand.value))
|
|
391
|
+
return boundedBy(2 ** 31);
|
|
392
|
+
const constant = constants.get(operand.value);
|
|
393
|
+
if (constant !== undefined)
|
|
394
|
+
return boundedBy(Math.abs(constant));
|
|
395
|
+
if (lengthReads.has(operand.value))
|
|
396
|
+
return boundedBy(bitwiseWidth);
|
|
397
|
+
const slot = storage.reads.get(operand.value);
|
|
398
|
+
if (slot !== undefined)
|
|
399
|
+
return storage.magnitudes.get(slot) ?? null;
|
|
400
|
+
const cell = readsCell.get(operand.value);
|
|
401
|
+
if (cell !== undefined)
|
|
402
|
+
return magnitudeOfCell(cell);
|
|
403
|
+
const incoming = phis.get(operand.value);
|
|
404
|
+
if (incoming !== undefined) {
|
|
405
|
+
let answer = { kind: 'bounded', limit: 0 };
|
|
406
|
+
for (const value of incoming)
|
|
407
|
+
answer = widen(answer, magnitudeOfValue(value));
|
|
408
|
+
return answer;
|
|
409
|
+
}
|
|
410
|
+
const compute = computes.get(operand.value);
|
|
411
|
+
if (!compute)
|
|
412
|
+
return null;
|
|
413
|
+
return magnitudeOfCompute(compute);
|
|
414
|
+
};
|
|
415
|
+
const magnitudeOfCompute = (compute) => {
|
|
416
|
+
const [left, right] = compute.operands;
|
|
417
|
+
if (!left)
|
|
418
|
+
return null;
|
|
419
|
+
if (compute.form === 'update') {
|
|
420
|
+
const target = magnitudeOfValue(left);
|
|
421
|
+
return target === null ? null : sum(target, { kind: 'bounded', limit: 1 });
|
|
422
|
+
}
|
|
423
|
+
if (compute.form === 'unary') {
|
|
424
|
+
// `-x` and `+x` keep the magnitude; `~x` is a 32-bit result like every
|
|
425
|
+
// other bitwise operator.
|
|
426
|
+
if (compute.operator === '~')
|
|
427
|
+
return boundedBy(bitwiseWidth);
|
|
428
|
+
if (compute.operator !== '-' && compute.operator !== '+')
|
|
429
|
+
return null;
|
|
430
|
+
return magnitudeOfValue(left);
|
|
431
|
+
}
|
|
432
|
+
if (compute.form !== 'binary' || !right)
|
|
433
|
+
return null;
|
|
434
|
+
switch (compute.operator) {
|
|
435
|
+
case '&': {
|
|
436
|
+
// A mask by a non-negative constant bounds the result at the mask; any
|
|
437
|
+
// other AND is still a 32-bit quantity.
|
|
438
|
+
const mask = constants.get(right.value) ?? constants.get(left.value);
|
|
439
|
+
return mask !== undefined && mask >= 0 ? boundedBy(mask) : boundedBy(bitwiseWidth);
|
|
440
|
+
}
|
|
441
|
+
case '|':
|
|
442
|
+
case '^':
|
|
443
|
+
case '<<':
|
|
444
|
+
case '>>':
|
|
445
|
+
case '>>>':
|
|
446
|
+
return boundedBy(bitwiseWidth);
|
|
447
|
+
case '+':
|
|
448
|
+
case '-': {
|
|
449
|
+
const a = magnitudeOfValue(left);
|
|
450
|
+
const b = magnitudeOfValue(right);
|
|
451
|
+
return a === null || b === null ? null : sum(a, b);
|
|
452
|
+
}
|
|
453
|
+
case '*': {
|
|
454
|
+
const a = magnitudeOfValue(left);
|
|
455
|
+
const b = magnitudeOfValue(right);
|
|
456
|
+
return a === null || b === null ? null : product(a, b);
|
|
457
|
+
}
|
|
458
|
+
case '%': {
|
|
459
|
+
// The DIVISOR alone bounds a remainder, whatever the dividend was.
|
|
460
|
+
// That is what breaks the cycle in `h = (h + ...) % C`: the cell's
|
|
461
|
+
// magnitude does not depend on its own previous magnitude, so asking
|
|
462
|
+
// for it does not ask for itself. Whether the dividend is an integer at
|
|
463
|
+
// all is settled by the integrality pass above, which handles that
|
|
464
|
+
// cycle optimistically; here it is already known.
|
|
465
|
+
const divisor = constants.get(right.value);
|
|
466
|
+
if (divisor === undefined || divisor === 0)
|
|
467
|
+
return null;
|
|
468
|
+
return boundedBy(Math.abs(divisor));
|
|
469
|
+
}
|
|
470
|
+
default:
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
};
|
|
474
|
+
const values = new Set();
|
|
475
|
+
const bindings = new Set();
|
|
476
|
+
for (const blockId of body.blockOrder) {
|
|
477
|
+
const block = body.blocks.get(blockId);
|
|
478
|
+
if (!block)
|
|
479
|
+
continue;
|
|
480
|
+
for (const operation of block.operations) {
|
|
481
|
+
const result = 'result' in operation ? operation.result : null;
|
|
482
|
+
if (!result || !isNumberScalar(result))
|
|
483
|
+
continue;
|
|
484
|
+
if (magnitudeOfValue({ value: result.id, representation: result.representation }) !== null)
|
|
485
|
+
values.add(result.id);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
for (const cell of cellWrites.keys()) {
|
|
489
|
+
if (magnitudeOfCell(cell) !== null)
|
|
490
|
+
bindings.add(cell);
|
|
491
|
+
}
|
|
492
|
+
// Only the values that HAVE a magnitude: `valueMagnitudes` records a refusal
|
|
493
|
+
// as `null`, and a consumer reading one back would take "refused" for
|
|
494
|
+
// "unknown" and re-derive it.
|
|
495
|
+
const magnitudes = new Map();
|
|
496
|
+
for (const [value, magnitude] of valueMagnitudes)
|
|
497
|
+
if (magnitude !== null)
|
|
498
|
+
magnitudes.set(value, magnitude);
|
|
499
|
+
const integralRemainders = new Set();
|
|
500
|
+
for (const [result, compute] of computes) {
|
|
501
|
+
if (compute.operator !== '%' || compute.form !== 'binary')
|
|
502
|
+
continue;
|
|
503
|
+
const [left, right] = compute.operands;
|
|
504
|
+
if (!left || !right || !integral.has(left.value))
|
|
505
|
+
continue;
|
|
506
|
+
const divisor = constants.get(right.value);
|
|
507
|
+
if (divisor === undefined || divisor === 0)
|
|
508
|
+
continue;
|
|
509
|
+
integralRemainders.add(result);
|
|
510
|
+
}
|
|
511
|
+
const dynamicRemainders = new Set();
|
|
512
|
+
for (const [result, compute] of computes) {
|
|
513
|
+
if (compute.operator !== '%' || compute.form !== 'binary')
|
|
514
|
+
continue;
|
|
515
|
+
if (integralRemainders.has(result))
|
|
516
|
+
continue;
|
|
517
|
+
const [left, right] = compute.operands;
|
|
518
|
+
if (!left || !right)
|
|
519
|
+
continue;
|
|
520
|
+
if (!integral.has(left.value) || !integral.has(right.value))
|
|
521
|
+
continue;
|
|
522
|
+
dynamicRemainders.add(result);
|
|
523
|
+
}
|
|
524
|
+
return { values, bindings, magnitudes, integral, integralRemainders, dynamicRemainders };
|
|
525
|
+
};
|
|
526
|
+
/**
|
|
527
|
+
* Which spelling of `%` an operation gets, or `null` for the general one.
|
|
528
|
+
*
|
|
529
|
+
* `'narrowed'`: both sides are held in a `long long`, so C++'s own `%` is the
|
|
530
|
+
* answer -- ECMA-262 6.1.6.1.6 truncates toward zero exactly as C++ does.
|
|
531
|
+
* `'restated'` and `'dynamic'` are the two integer-valued-but-not-narrowed
|
|
532
|
+
* cases the census separates (`ir/integers.ts`); everything else keeps
|
|
533
|
+
* `gea::remainder`, which rediscovers at run time what neither could prove.
|
|
534
|
+
*/
|
|
535
|
+
/** The two cheaper `%` spellings the census settled, as the emitter records them: one pass, so `emit.ts` states the wiring once. */
|
|
536
|
+
export const remainderFormGroups = (narrowed) => [
|
|
537
|
+
['restated', narrowed.integralRemainders],
|
|
538
|
+
['dynamic', narrowed.dynamicRemainders]
|
|
539
|
+
];
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { IrBody } from './model.js';
|
|
2
|
+
/**
|
|
3
|
+
* Whether ANYTHING in the program can make a native object's own data
|
|
4
|
+
* properties non-writable or the object itself non-extensible.
|
|
5
|
+
*
|
|
6
|
+
* Every native field store guards against exactly that -- `Object.freeze(o)`
|
|
7
|
+
* followed by `o.x = 1` must throw -- and the guard is a presence bit, an
|
|
8
|
+
* attribute bit, the process-wide restriction counter and, when that counter
|
|
9
|
+
* is nonzero, a registry lookup in a call the C++ compiler has to assume can
|
|
10
|
+
* write anything. In a loop that is the difference between a field living in
|
|
11
|
+
* a register and a field living in memory: `method_calls` reloaded
|
|
12
|
+
* `this.value` through the guard on every turn, 25.6 ms against 18.6 for the
|
|
13
|
+
* same loop with the field in a register.
|
|
14
|
+
*
|
|
15
|
+
* So the emitter asks the whole unit first. Integrity is restricted only by
|
|
16
|
+
* `Object.freeze` / `seal` / `preventExtensions` and by a descriptor
|
|
17
|
+
* definition (`defineProperty`, `defineProperties`, their `Reflect` twins),
|
|
18
|
+
* every one of which is a member read the IR shows -- through a host method
|
|
19
|
+
* binding, or as a constant key on whatever receiver -- plus two implicit
|
|
20
|
+
* sources: a tagged template's strings object is born frozen, and an IR
|
|
21
|
+
* `define-own-property` with a non-default attribute states a restriction of
|
|
22
|
+
* its own (an object literal's definitions all carry the defaults). Nothing
|
|
23
|
+
* else in the runtime freezes a user object.
|
|
24
|
+
*
|
|
25
|
+
* Fail-closed on the shapes this cannot see through: a computed key read off
|
|
26
|
+
* a dynamic, host or unresolved receiver could name any of those members
|
|
27
|
+
* (`(Object as any)[name]`), and so counts as restricting. A program whose
|
|
28
|
+
* typed code never touches integrity keeps the fast stores; a program that
|
|
29
|
+
* reaches for it anywhere -- or that reads computed members off `any` --
|
|
30
|
+
* keeps every guard.
|
|
31
|
+
*/
|
|
32
|
+
export declare const integrityRestrictionsOf: (bodies: readonly IrBody[]) => boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Whether ANYTHING in the program can delete a declared field of a generated
|
|
35
|
+
* struct.
|
|
36
|
+
*
|
|
37
|
+
* A required field's presence bit starts `true` and only `delete` ever clears
|
|
38
|
+
* it; an attribute triple only the integrity operations above ever change. So
|
|
39
|
+
* when neither can happen, both are program-wide constants for every struct,
|
|
40
|
+
* and `records.ts` states them once per struct (`static inline` members)
|
|
41
|
+
* instead of once per instance -- on `bench/comparison/fixtures/binary_trees.ts`
|
|
42
|
+
* that is three presence bytes and three attribute bytes off every one of a
|
|
43
|
+
* million nodes whose whole cost is cache misses.
|
|
44
|
+
*
|
|
45
|
+
* Fail-closed the same way `integrityRestrictionsOf` is: a `delete` whose
|
|
46
|
+
* receiver is anything but a dictionary (the one carrier with no fixed
|
|
47
|
+
* fields) counts, so does `Reflect.deleteProperty`, and a receiver the
|
|
48
|
+
* program only knows dynamically counts because it could be any struct.
|
|
49
|
+
*/
|
|
50
|
+
export declare const fixedFieldDeletionsOf: (bodies: readonly IrBody[]) => boolean;
|