@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,1394 @@
|
|
|
1
|
+
import { nativeReflectFieldTransportOf } from './native-reflect-field.js';
|
|
2
|
+
import { canonicalIndexLiteral } from '../representation/array-index.js';
|
|
3
|
+
import { objectPrototypeMemberNames } from '../representation/record-fields.js';
|
|
4
|
+
import { classLayoutOfCopy } from '../projection/classes.js';
|
|
5
|
+
import { classMemberOf, declaredRecordFieldOf } from '../projection/fields.js';
|
|
6
|
+
import { classPrototypeReadOf } from '../projection/class-prototype.js';
|
|
7
|
+
import { representationKey } from '../representation/model.js';
|
|
8
|
+
import { observesNativeCarrierOnly, operandsOfIrOperation, resultOfIrOperation } from './queries.js';
|
|
9
|
+
import { conversionNodeIdOf } from '../conversion/nodes.js';
|
|
10
|
+
import { nativePayloadTransportMatches } from '../conversion/native-payload-transport.js';
|
|
11
|
+
import { hostTemplateFrameOf, nativeCallFrameOf, receivedCallArguments } from './call-entry.js';
|
|
12
|
+
import { censusClassStaticFieldSlots, staticFieldSlotOf } from './class-static-fields.js';
|
|
13
|
+
import { classConstructorBodyMatches, constructMatchesAbi } from './construct-entry.js';
|
|
14
|
+
import { nativeArrayTransportOf } from './native-array-transport.js';
|
|
15
|
+
import { nativeDictionaryTransportOf } from './native-dictionary-transport.js';
|
|
16
|
+
import { nativeRecordIndexHasPropertyOf, nativeRecordIndexTransportOf } from './native-record-index-transport.js';
|
|
17
|
+
import { nativeSequenceTransportOf } from './native-sequence-transport.js';
|
|
18
|
+
import { nativeCallableBindTransportOf } from './native-callable-bind.js';
|
|
19
|
+
import { hasNativePropertyLayout } from './native-fixed-layout.js';
|
|
20
|
+
import { nativeKeyQueryOf } from './native-key-query.js';
|
|
21
|
+
import { nativeCarrierPredicateOf } from './native-carrier-predicate.js';
|
|
22
|
+
import { nativeMergeTransportMatches } from './native-merge-transport.js';
|
|
23
|
+
import { nativeCallableFlowOf } from './callable-class-flow.js';
|
|
24
|
+
import { nativeSuperInitializationOf } from './native-class-initialization.js';
|
|
25
|
+
import { nativeClassAccessorEntryOf } from './native-class-accessor.js';
|
|
26
|
+
import { nativeClassConstructionOf } from './native-class-construction.js';
|
|
27
|
+
import { nativeHostConstructionOf } from './native-host-construction.js';
|
|
28
|
+
import { closePhysicalClassReflection } from './physical-class-reflection.js';
|
|
29
|
+
import { absentClassArmRead } from './absent-class-arm.js';
|
|
30
|
+
import { nativeAbsentPropertyReadOf } from './native-absent-property.js';
|
|
31
|
+
/**
|
|
32
|
+
* Remove a computed-read candidate whose receiver did not receive a sealed
|
|
33
|
+
* keys-only demand. This is deliberately a post-census operation: the
|
|
34
|
+
* lowering recipe owns finite-key and conversion eligibility, while this
|
|
35
|
+
* authority decides whether the receiver's emitted protocol makes that recipe
|
|
36
|
+
* available. Missing rows fail closed and leave the ordinary dynamic read.
|
|
37
|
+
*/
|
|
38
|
+
export const finalizeTypedComputedReads = (bodies, exposure) => {
|
|
39
|
+
const finalized = new Map();
|
|
40
|
+
let changedAny = false;
|
|
41
|
+
for (const [bodyId, body] of bodies) {
|
|
42
|
+
let changed = false;
|
|
43
|
+
const blocks = new Map(body.blocks);
|
|
44
|
+
for (const [blockId, block] of body.blocks) {
|
|
45
|
+
let blockChanged = false;
|
|
46
|
+
const operations = block.operations.map((operation) => {
|
|
47
|
+
if (operation.kind !== 'get' || operation.typedComputedRead === undefined)
|
|
48
|
+
return operation;
|
|
49
|
+
const receiverKey = representationKey(operation.receiver.representation);
|
|
50
|
+
const resultKey = representationKey(operation.result.representation);
|
|
51
|
+
const shapeId = operation.receiver.representation.kind === 'record' ? operation.receiver.representation.shapeId : null;
|
|
52
|
+
const demand = shapeId === null ? undefined : exposure.records.get(shapeId);
|
|
53
|
+
const recipe = operation.typedComputedRead;
|
|
54
|
+
if (exposure.complete &&
|
|
55
|
+
recipe.kind === 'closed-record' &&
|
|
56
|
+
recipe.receiver === receiverKey &&
|
|
57
|
+
recipe.result === resultKey &&
|
|
58
|
+
demand?.level === 'keys-only')
|
|
59
|
+
return operation;
|
|
60
|
+
blockChanged = true;
|
|
61
|
+
changed = true;
|
|
62
|
+
const { typedComputedRead: _typedComputedRead, ...withoutRecipe } = operation;
|
|
63
|
+
return withoutRecipe;
|
|
64
|
+
});
|
|
65
|
+
if (blockChanged)
|
|
66
|
+
blocks.set(blockId, { ...block, operations });
|
|
67
|
+
}
|
|
68
|
+
if (changed)
|
|
69
|
+
changedAny = true;
|
|
70
|
+
finalized.set(bodyId, changed ? { ...body, blocks } : body);
|
|
71
|
+
}
|
|
72
|
+
return changedAny ? finalized : bodies;
|
|
73
|
+
};
|
|
74
|
+
const objectSurfacesOf = (representation) => {
|
|
75
|
+
switch (representation.kind) {
|
|
76
|
+
case 'record':
|
|
77
|
+
case 'record-with-index':
|
|
78
|
+
case 'class-ref':
|
|
79
|
+
case 'native-record-ref':
|
|
80
|
+
case 'array-object':
|
|
81
|
+
case 'keyed-collection':
|
|
82
|
+
case 'dictionary':
|
|
83
|
+
case 'native-handle':
|
|
84
|
+
return [representation];
|
|
85
|
+
case 'borrowed-ref':
|
|
86
|
+
return objectSurfacesOf(representation.referent);
|
|
87
|
+
case 'optional':
|
|
88
|
+
return objectSurfacesOf(representation.payload);
|
|
89
|
+
case 'tagged-union':
|
|
90
|
+
return representation.arms.flatMap((arm) => objectSurfacesOf(arm.value));
|
|
91
|
+
case 'proxy-object':
|
|
92
|
+
return [...objectSurfacesOf(representation.target), ...objectSurfacesOf(representation.handler)];
|
|
93
|
+
default:
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
/** Direct representation children that may contain another native object surface. */
|
|
98
|
+
const directChildrenOf = (representation, classes, deriver) => {
|
|
99
|
+
switch (representation.kind) {
|
|
100
|
+
case 'optional':
|
|
101
|
+
return [representation.payload];
|
|
102
|
+
case 'borrowed-ref':
|
|
103
|
+
return [representation.referent];
|
|
104
|
+
case 'tagged-union':
|
|
105
|
+
return representation.arms.map((arm) => arm.value);
|
|
106
|
+
case 'function':
|
|
107
|
+
case 'function-family':
|
|
108
|
+
case 'constructor-family':
|
|
109
|
+
case 'constructor-value-dispatch':
|
|
110
|
+
case 'function-value-dispatch':
|
|
111
|
+
case 'function-value-family':
|
|
112
|
+
return callableChildrenOf(representation.abi);
|
|
113
|
+
case 'function-and-constructor':
|
|
114
|
+
return [...callableChildrenOf(representation.call), ...callableChildrenOf(representation.construct)];
|
|
115
|
+
case 'iterator':
|
|
116
|
+
return [representation.element, representation.resume, representation.completion];
|
|
117
|
+
case 'promise':
|
|
118
|
+
return [representation.value];
|
|
119
|
+
case 'native-sequence':
|
|
120
|
+
case 'dense-buffer':
|
|
121
|
+
return [representation.element];
|
|
122
|
+
case 'proxy-object':
|
|
123
|
+
return [representation.target, representation.handler];
|
|
124
|
+
case 'record':
|
|
125
|
+
return [...representation.fields.map((field) => field.value), ...representation.accessors.map((accessor) => accessor.value)];
|
|
126
|
+
case 'record-with-index':
|
|
127
|
+
return [...representation.fields.map((field) => field.value), ...representation.indexes.map((index) => index.value)];
|
|
128
|
+
case 'class-ref': {
|
|
129
|
+
const layout = classes.get(representation.declaration);
|
|
130
|
+
if (layout?.nativeStorage !== undefined) {
|
|
131
|
+
const raw = deriver?.layoutOf(representation.shapeId);
|
|
132
|
+
return [
|
|
133
|
+
...layout.nativeStorage.fields.map((field) => field.value),
|
|
134
|
+
...layout.staticFields.flatMap((field) => (field.representation ? [field.representation] : [])),
|
|
135
|
+
...(raw?.kind === 'record' ? raw.accessors.map((accessor) => accessor.value) : []),
|
|
136
|
+
...(raw?.kind === 'record-with-index' ? raw.indexes.map((index) => index.value) : [])
|
|
137
|
+
];
|
|
138
|
+
}
|
|
139
|
+
return [
|
|
140
|
+
...(layout?.fields.flatMap((field) => (field.representation ? [field.representation] : [])) ?? []),
|
|
141
|
+
...(layout?.staticFields.flatMap((field) => (field.representation ? [field.representation] : [])) ?? []),
|
|
142
|
+
...(deriver ? [deriver.layoutOf(representation.shapeId)] : [])
|
|
143
|
+
];
|
|
144
|
+
}
|
|
145
|
+
case 'native-record-ref':
|
|
146
|
+
return deriver ? [deriver.layoutOf(representation.shapeId)] : [];
|
|
147
|
+
case 'array-object':
|
|
148
|
+
return [representation.element, ...(representation.extension ?? []).map((field) => field.value)];
|
|
149
|
+
case 'dictionary':
|
|
150
|
+
return [representation.value];
|
|
151
|
+
case 'keyed-collection':
|
|
152
|
+
return representation.value ? [representation.key, representation.value] : [representation.key];
|
|
153
|
+
case 'native-handle':
|
|
154
|
+
return [representation.call, representation.construct].flatMap((abi) => (abi ? callableChildrenOf(abi) : []));
|
|
155
|
+
default:
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
const callableChildrenOf = (abi) => [
|
|
160
|
+
abi.result,
|
|
161
|
+
...(abi.receiver ? [abi.receiver] : []),
|
|
162
|
+
...abi.parameters.map((parameter) => parameter.value)
|
|
163
|
+
];
|
|
164
|
+
/**
|
|
165
|
+
* Publishing a callable publishes its possible return values, not objects
|
|
166
|
+
* merely named by its input convention. Those inputs arrive from the caller;
|
|
167
|
+
* the call operation accounts for their exposure. Decoding an argument into
|
|
168
|
+
* a native frame does not publish that frame's fields back to dynamic code.
|
|
169
|
+
* Keep the full type inventory in directChildrenOf for candidate discovery.
|
|
170
|
+
*/
|
|
171
|
+
const publishedChildrenOf = (representation, classes, deriver) => {
|
|
172
|
+
switch (representation.kind) {
|
|
173
|
+
case 'function':
|
|
174
|
+
case 'function-family':
|
|
175
|
+
case 'constructor-family':
|
|
176
|
+
case 'constructor-value-dispatch':
|
|
177
|
+
case 'function-value-dispatch':
|
|
178
|
+
case 'function-value-family':
|
|
179
|
+
return [representation.abi.result];
|
|
180
|
+
case 'function-and-constructor':
|
|
181
|
+
return [representation.call.result, representation.construct.result];
|
|
182
|
+
case 'native-handle':
|
|
183
|
+
return [representation.call, representation.construct].flatMap((abi) => (abi ? [abi.result] : []));
|
|
184
|
+
default:
|
|
185
|
+
return directChildrenOf(representation, classes, deriver);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
const callableAbiOf = (representation) => {
|
|
189
|
+
switch (representation.kind) {
|
|
190
|
+
case 'function':
|
|
191
|
+
case 'function-family':
|
|
192
|
+
case 'function-value-dispatch':
|
|
193
|
+
case 'function-value-family':
|
|
194
|
+
return representation.abi;
|
|
195
|
+
case 'function-and-constructor':
|
|
196
|
+
return representation.call;
|
|
197
|
+
default:
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
/** A callable value does not publish the values its signature says it could return. */
|
|
202
|
+
const isCallableCarrier = (representation) => {
|
|
203
|
+
switch (representation.kind) {
|
|
204
|
+
case 'function':
|
|
205
|
+
case 'function-family':
|
|
206
|
+
case 'function-value-dispatch':
|
|
207
|
+
case 'function-value-family':
|
|
208
|
+
case 'constructor-family':
|
|
209
|
+
case 'constructor-value-dispatch':
|
|
210
|
+
case 'function-and-constructor':
|
|
211
|
+
return true;
|
|
212
|
+
case 'optional':
|
|
213
|
+
return isCallableCarrier(representation.payload);
|
|
214
|
+
case 'borrowed-ref':
|
|
215
|
+
return isCallableCarrier(representation.referent);
|
|
216
|
+
case 'tagged-union':
|
|
217
|
+
return representation.arms.every((arm) => arm.value.kind === 'undefined' || arm.value.kind === 'null' || isCallableCarrier(arm.value));
|
|
218
|
+
default:
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
/** Holding a deferred result does not inspect its payload. Actual invocation,
|
|
223
|
+
* stepping, awaiting and publication operations below own that demand. */
|
|
224
|
+
const isDeferredCarrier = (representation) => {
|
|
225
|
+
if (isCallableCarrier(representation) || representation.kind === 'iterator' || representation.kind === 'promise')
|
|
226
|
+
return true;
|
|
227
|
+
if (representation.kind === 'optional')
|
|
228
|
+
return isDeferredCarrier(representation.payload);
|
|
229
|
+
if (representation.kind === 'borrowed-ref')
|
|
230
|
+
return isDeferredCarrier(representation.referent);
|
|
231
|
+
return (representation.kind === 'tagged-union' &&
|
|
232
|
+
representation.arms.every((arm) => arm.value.kind === 'undefined' || arm.value.kind === 'null' || isDeferredCarrier(arm.value)));
|
|
233
|
+
};
|
|
234
|
+
const abiMatches = (left, right) => left.restFrom === right.restFrom &&
|
|
235
|
+
representationKey(left.result) === representationKey(right.result) &&
|
|
236
|
+
(left.receiver === null
|
|
237
|
+
? right.receiver === null
|
|
238
|
+
: right.receiver !== null && representationKey(left.receiver) === representationKey(right.receiver)) &&
|
|
239
|
+
left.parameters.length === right.parameters.length &&
|
|
240
|
+
left.parameters.every((parameter, index) => {
|
|
241
|
+
const counterpart = right.parameters[index];
|
|
242
|
+
return counterpart !== undefined && representationKey(parameter.value) === representationKey(counterpart.value);
|
|
243
|
+
});
|
|
244
|
+
const constantsOf = (operations) => {
|
|
245
|
+
const result = new Map();
|
|
246
|
+
for (const operation of operations)
|
|
247
|
+
if (operation.kind === 'constant')
|
|
248
|
+
result.set(String(operation.result.id), operation);
|
|
249
|
+
return result;
|
|
250
|
+
};
|
|
251
|
+
const keyOf = (operand, constants) => {
|
|
252
|
+
if (!operand)
|
|
253
|
+
return null;
|
|
254
|
+
const constant = constants.get(String(operand.value));
|
|
255
|
+
return constant && (constant.literal === 'string' || constant.literal === 'number') ? constant.text : null;
|
|
256
|
+
};
|
|
257
|
+
const receiverOf = (operation) => {
|
|
258
|
+
switch (operation.kind) {
|
|
259
|
+
case 'get':
|
|
260
|
+
case 'set':
|
|
261
|
+
case 'delete':
|
|
262
|
+
case 'has-property':
|
|
263
|
+
case 'define-own-property':
|
|
264
|
+
case 'own-property-keys':
|
|
265
|
+
case 'get-iterator':
|
|
266
|
+
return operation.receiver;
|
|
267
|
+
default:
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
const keyOperandOf = (operation) => {
|
|
272
|
+
switch (operation.kind) {
|
|
273
|
+
case 'get':
|
|
274
|
+
case 'set':
|
|
275
|
+
case 'delete':
|
|
276
|
+
case 'has-property':
|
|
277
|
+
case 'define-own-property':
|
|
278
|
+
return operation.key;
|
|
279
|
+
default:
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
const extendsClass = (classes, candidate, ancestor) => {
|
|
284
|
+
const seen = new Set();
|
|
285
|
+
let current = candidate;
|
|
286
|
+
while (current !== null && !seen.has(current)) {
|
|
287
|
+
if (current === ancestor)
|
|
288
|
+
return true;
|
|
289
|
+
seen.add(current);
|
|
290
|
+
current = classes.get(current)?.base ?? null;
|
|
291
|
+
}
|
|
292
|
+
return false;
|
|
293
|
+
};
|
|
294
|
+
const valueRepresentationOf = (operation) => {
|
|
295
|
+
switch (operation.kind) {
|
|
296
|
+
case 'get':
|
|
297
|
+
return operation.result.representation;
|
|
298
|
+
case 'set':
|
|
299
|
+
case 'define-own-property':
|
|
300
|
+
return operation.value.representation;
|
|
301
|
+
default:
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
/**
|
|
306
|
+
* A write the emitter lands in the declared member's own storage, converting
|
|
307
|
+
* the value through the census node for exactly `value -> field` -- the
|
|
308
|
+
* mirror of the read side's payload-transport allowance.
|
|
309
|
+
*
|
|
310
|
+
* three's uniform stores are the shape: `uniforms.tEquirect.value = texture`
|
|
311
|
+
* (`WebGLCubeRenderTarget`), `uniforms.map.value = material.map`
|
|
312
|
+
* (`WebGLMaterials`), the shadow-map and background uniforms. The uniform
|
|
313
|
+
* record's `value` is a native sum of every carrier the program writes into
|
|
314
|
+
* it, and the stored `Texture` enters it through
|
|
315
|
+
* `gea::native-sum::inject-alternative` -- `Sum::ofArm<k>(ref)`, which neither
|
|
316
|
+
* allocates, nor touches a field protocol, nor changes the payload it wraps.
|
|
317
|
+
* Treated as an unproven slot, each such store published the written value's
|
|
318
|
+
* whole carrier graph although the emitted C++ is one typed member
|
|
319
|
+
* assignment; a later dynamic use of the uniform is censused on the sum
|
|
320
|
+
* carrier itself and reaches every arm from there.
|
|
321
|
+
*
|
|
322
|
+
* A `define-own-property` qualifies only with the default data descriptor --
|
|
323
|
+
* for this allowance AND for the exact-carrier and static-slot proofs beside
|
|
324
|
+
* it. That is the emitter's own condition (`emit-properties.ts`'s
|
|
325
|
+
* `isDefaultDataDescriptor`) for taking the ordinary member store. Any other
|
|
326
|
+
* descriptor has no native member spelling at all: `emitFieldStoreLines`
|
|
327
|
+
* admits it only into a `dictionary` table or a record's index sidecar, and
|
|
328
|
+
* `recordIndexSidecarTableOf` declines a key the struct declares, so a
|
|
329
|
+
* declared slot's non-default definition is either refused at emission or
|
|
330
|
+
* lands in a sidecar whose non-disjoint spelling
|
|
331
|
+
* (`emitRecordIndexSidecarStore`) boxes the value into a
|
|
332
|
+
* `gea::PropertyDescriptor` for `gea_defineOwnField`. Neither is the typed
|
|
333
|
+
* member store this census would otherwise be certifying.
|
|
334
|
+
*/
|
|
335
|
+
const storesIntoDeclaredSlot = (operation) => operation.kind === 'set' ||
|
|
336
|
+
(operation.kind === 'define-own-property' &&
|
|
337
|
+
operation.attributes.writable &&
|
|
338
|
+
operation.attributes.enumerable &&
|
|
339
|
+
operation.attributes.configurable);
|
|
340
|
+
const callMatchesAbi = (operation, abi) => {
|
|
341
|
+
const resultMatches = abi.result.kind === 'void'
|
|
342
|
+
? operation.result === null
|
|
343
|
+
: operation.result !== null && representationKey(operation.result.representation) === representationKey(abi.result);
|
|
344
|
+
const receiverMatches = abi.receiver === null
|
|
345
|
+
? operation.receiver === null
|
|
346
|
+
: operation.receiver !== null && representationKey(operation.receiver.representation) === representationKey(abi.receiver);
|
|
347
|
+
return (resultMatches &&
|
|
348
|
+
receiverMatches &&
|
|
349
|
+
operation.arguments.length === abi.parameters.length &&
|
|
350
|
+
operation.arguments.every((argument, index) => representationKey(argument.representation) === representationKey(abi.parameters[index].value)));
|
|
351
|
+
};
|
|
352
|
+
const promote = (rows, representation, reason, classes, deriver, visited = new Set(), publishedChildrenCache = new Map(), observe) => {
|
|
353
|
+
const work = [];
|
|
354
|
+
const enqueueNativeChildren = (value, childReason, parent = null) => {
|
|
355
|
+
const directSurfaces = objectSurfacesOf(value);
|
|
356
|
+
if (directSurfaces.length > 0) {
|
|
357
|
+
for (const surface of directSurfaces)
|
|
358
|
+
work.push({ value: surface, reason: childReason, parent });
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
const pending = [value];
|
|
362
|
+
const pendingSeen = new Set();
|
|
363
|
+
while (pending.length > 0) {
|
|
364
|
+
const next = pending.pop();
|
|
365
|
+
if (!next)
|
|
366
|
+
continue;
|
|
367
|
+
const identity = representationKey(next);
|
|
368
|
+
if (pendingSeen.has(identity))
|
|
369
|
+
continue;
|
|
370
|
+
pendingSeen.add(identity);
|
|
371
|
+
const surfaces = objectSurfacesOf(next);
|
|
372
|
+
if (surfaces.length > 0) {
|
|
373
|
+
for (const surface of surfaces)
|
|
374
|
+
work.push({ value: surface, reason: childReason, parent });
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
const children = publishedChildrenCache.get(identity) ?? publishedChildrenOf(next, classes, deriver);
|
|
378
|
+
publishedChildrenCache.set(identity, children);
|
|
379
|
+
pending.push(...children);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
enqueueNativeChildren(representation, reason);
|
|
384
|
+
while (work.length > 0) {
|
|
385
|
+
const item = work.pop();
|
|
386
|
+
if (!item)
|
|
387
|
+
continue;
|
|
388
|
+
const surfaces = objectSurfacesOf(item.value);
|
|
389
|
+
for (const surface of surfaces) {
|
|
390
|
+
const key = representationKey(surface);
|
|
391
|
+
observe?.(key, item.parent);
|
|
392
|
+
const row = rows.get(key) ?? { level: 'keys-only', reasons: new Set(), representations: new Set() };
|
|
393
|
+
row.level = 'full';
|
|
394
|
+
row.reasons.add(item.reason);
|
|
395
|
+
row.representations.add(key);
|
|
396
|
+
rows.set(key, row);
|
|
397
|
+
// A base hook is needed to service the exposed descendant's inherited
|
|
398
|
+
// fields. That support does not publish an arbitrary base instance and
|
|
399
|
+
// therefore cannot expose sibling subclasses. Keep separate expansion
|
|
400
|
+
// states: a later actual base escape must still visit its descendants.
|
|
401
|
+
const expansion = `${item.inheritedProtocolOnly ? 'inherited' : 'instances'}:${key}`;
|
|
402
|
+
if (visited.has(expansion))
|
|
403
|
+
continue;
|
|
404
|
+
visited.add(expansion);
|
|
405
|
+
if (surface.kind === 'class-ref') {
|
|
406
|
+
for (const [declaration, layout] of classes) {
|
|
407
|
+
if (declaration === surface.declaration || !layout.instance)
|
|
408
|
+
continue;
|
|
409
|
+
if (extendsClass(classes, surface.declaration, declaration))
|
|
410
|
+
work.push({
|
|
411
|
+
value: layout.instance,
|
|
412
|
+
reason: `${item.reason}:inherited-protocol`,
|
|
413
|
+
parent: key,
|
|
414
|
+
inheritedProtocolOnly: true
|
|
415
|
+
});
|
|
416
|
+
else if (!item.inheritedProtocolOnly && extendsClass(classes, declaration, surface.declaration))
|
|
417
|
+
work.push({ value: layout.instance, reason: `${item.reason}:class-family`, parent: key });
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
const identity = representationKey(surface);
|
|
421
|
+
const children = publishedChildrenCache.get(identity) ?? publishedChildrenOf(surface, classes, deriver);
|
|
422
|
+
publishedChildrenCache.set(identity, children);
|
|
423
|
+
for (const child of children)
|
|
424
|
+
enqueueNativeChildren(child, `${item.reason}:nested`, key);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
};
|
|
428
|
+
const declaredFieldOf = (surface, key, classes, deriver) => {
|
|
429
|
+
if (deriver) {
|
|
430
|
+
const field = declaredRecordFieldOf(deriver, surface, key, classes);
|
|
431
|
+
if (field !== null)
|
|
432
|
+
return field;
|
|
433
|
+
}
|
|
434
|
+
if (surface.kind === 'record' || surface.kind === 'record-with-index')
|
|
435
|
+
return surface.fields.find((field) => field.key === key) ?? null;
|
|
436
|
+
// `declaredRecordFieldOf` (`projection/fields.ts`) answers for `record`,
|
|
437
|
+
// `record-with-index`, `class-ref` and `native-record-ref` -- it has no
|
|
438
|
+
// case for `array-object` at all. An interface's own fields ADDED on top
|
|
439
|
+
// of the Array it extends (`NodeArray<T> extends ReadonlyArray<T>,
|
|
440
|
+
// ReadonlyTextRange` puts `pos`/`end`/`hasTrailingComma` on every node
|
|
441
|
+
// list -- see `representation/model.ts`'s doc on `array-object.extension`)
|
|
442
|
+
// therefore came back `null` from the deriver-first branch above whenever a
|
|
443
|
+
// deriver was available, which is every real compilation, and every such
|
|
444
|
+
// read fell through to the fully unrestricted `unproven-native-slot-value`
|
|
445
|
+
// path even though the extension sidecar is exactly as closed a field list
|
|
446
|
+
// as an ordinary record's. Fall back to the array's own sidecar, which the
|
|
447
|
+
// deriver never had authority over in the first place.
|
|
448
|
+
if (surface.kind === 'array-object')
|
|
449
|
+
return surface.extension?.find((field) => field.key === key) ?? null;
|
|
450
|
+
return null;
|
|
451
|
+
};
|
|
452
|
+
/**
|
|
453
|
+
* A named GET off a surface `declaredFieldOf` HAS authority over
|
|
454
|
+
* (`hasDeclaredFieldAuthority`) for a key that names no declared field,
|
|
455
|
+
* method or accessor there, but that the language itself guarantees is
|
|
456
|
+
* present through `Object.prototype` -- `.toString`, `.hasOwnProperty`,
|
|
457
|
+
* `.constructor`, and the rest of `objectPrototypeMemberNames`
|
|
458
|
+
* (`representation/record-fields.ts`, the identical closed list
|
|
459
|
+
* `classFamilyLacksKey` already trusts to say a key is not a real absence).
|
|
460
|
+
*
|
|
461
|
+
* `knownNativeMemberReadOf` cannot answer this: it is deliberately restricted
|
|
462
|
+
* to surfaces WITHOUT field authority, because for an authoritative surface a
|
|
463
|
+
* *found* field whose carrier disagrees is a real defect that must keep its
|
|
464
|
+
* promotion. This is a different sub-case -- the authority was asked and said
|
|
465
|
+
* "no such OWN field, method or accessor" -- which is precisely what is true
|
|
466
|
+
* of every ordinary object's inherited `Object.prototype` members: they are
|
|
467
|
+
* never own fields, so no struct member could ever have named them, and the
|
|
468
|
+
* struct's silence is not evidence of anything unproven. The result carrier
|
|
469
|
+
* is the same evidence `knownNativeMemberReadOf` already leans on: a `get`
|
|
470
|
+
* the checker resolved to a concrete, non-`any` type proves the read already
|
|
471
|
+
* settled on a value nothing here needs to invent.
|
|
472
|
+
*
|
|
473
|
+
* A plain assignment cannot ever reach this (guarded by `operation.kind ===
|
|
474
|
+
* 'get'` at the call site): shadowing one of these names with an own
|
|
475
|
+
* property is a real write this proof does not cover, and stays unproven.
|
|
476
|
+
*/
|
|
477
|
+
const objectPrototypeMemberReadOf = (surface, key, value) => hasDeclaredFieldAuthority(surface) && objectPrototypeMemberNames.has(key) && value.kind !== 'dynamic' && value.kind !== 'unresolved';
|
|
478
|
+
/**
|
|
479
|
+
* Whether `declaredRecordFieldOf` -- the authority `declaredFieldOf` delegates
|
|
480
|
+
* to -- can answer about this surface's members AT ALL.
|
|
481
|
+
*
|
|
482
|
+
* It reads a record's own fields, a class's layout, and the shape behind a
|
|
483
|
+
* `native-record-ref`. For every other native surface it returns null, and the
|
|
484
|
+
* named-slot test below could not tell that answer apart from "this object has
|
|
485
|
+
* no such member" -- so a member read off `Math`, an array, a typed array or a
|
|
486
|
+
* Map was filed as an unproven slot value.
|
|
487
|
+
*/
|
|
488
|
+
const hasDeclaredFieldAuthority = (surface) => surface.kind === 'record' || surface.kind === 'record-with-index' || surface.kind === 'class-ref' || surface.kind === 'native-record-ref';
|
|
489
|
+
const primitiveLeaf = (representation) => representation.kind === 'undefined' ||
|
|
490
|
+
representation.kind === 'null' ||
|
|
491
|
+
representation.kind === 'scalar' ||
|
|
492
|
+
representation.kind === 'string';
|
|
493
|
+
/**
|
|
494
|
+
* A read result that can hold no object, so it publishes none. The frame
|
|
495
|
+
* census types `arguments[ 100 ]` exactly `undefined` when no closed caller
|
|
496
|
+
* fills that position; the element such a read never returns owes no protocol.
|
|
497
|
+
*/
|
|
498
|
+
const holdsNoObject = (representation) => {
|
|
499
|
+
if (representation.kind === 'optional')
|
|
500
|
+
return primitiveLeaf(representation.payload);
|
|
501
|
+
if (representation.kind === 'tagged-union')
|
|
502
|
+
return representation.arms.every((arm) => primitiveLeaf(arm.value));
|
|
503
|
+
return primitiveLeaf(representation);
|
|
504
|
+
};
|
|
505
|
+
/**
|
|
506
|
+
* A read of a declared member off a native surface no field authority covers.
|
|
507
|
+
*
|
|
508
|
+
* This is `knownClassMemberReadOf`'s argument, made available to the carriers
|
|
509
|
+
* that have no `ClassLayout` to consult: reading a member the carrier declares
|
|
510
|
+
* hands back that member's own carrier, so the read proves nothing is unproven
|
|
511
|
+
* -- it publishes no field of the receiver, and the value it produces is the
|
|
512
|
+
* one the declaration already stated.
|
|
513
|
+
*
|
|
514
|
+
* The evidence that the key names a declared member is the RESULT CARRIER. A
|
|
515
|
+
* key naming nothing on a typed receiver is typed `any` by the checker and
|
|
516
|
+
* arrives here as `dynamic`, and a member the representation layer could not
|
|
517
|
+
* resolve arrives as `unresolved`; either one keeps the promotion. Receivers
|
|
518
|
+
* that are themselves dynamic never reach this test at all, because
|
|
519
|
+
* `objectSurfacesOf` yields them no surface.
|
|
520
|
+
*
|
|
521
|
+
* Restricted to surfaces with no field authority ON PURPOSE. Where one exists
|
|
522
|
+
* and says the declared carrier differs from the value's, that is a real
|
|
523
|
+
* carrier disagreement about storage the compiler owns, and it must keep its
|
|
524
|
+
* promotion; this answers only the case where nothing was ever asked.
|
|
525
|
+
*
|
|
526
|
+
* What this cost: `Object.defineProperty` read off `ObjectConstructor` returns
|
|
527
|
+
* a callable whose signature the checker instantiated with `Material`, and
|
|
528
|
+
* promoting that callable walks its ABI -- so reading the member promoted the
|
|
529
|
+
* class in its signature. The three.js app had ~1,350 such reads.
|
|
530
|
+
*/
|
|
531
|
+
const knownNativeMemberReadOf = (surface, key, value) => !hasDeclaredFieldAuthority(surface) &&
|
|
532
|
+
!(surface.kind === 'array-object' && canonicalIndexLiteral(key) !== null) &&
|
|
533
|
+
value.kind !== 'dynamic' &&
|
|
534
|
+
value.kind !== 'unresolved';
|
|
535
|
+
const knownClassMemberReadOf = (surface, key, classes) => {
|
|
536
|
+
if (surface.kind !== 'class-ref')
|
|
537
|
+
return false;
|
|
538
|
+
const seen = new Set();
|
|
539
|
+
let declaration = surface.declaration;
|
|
540
|
+
while (declaration !== null && !seen.has(declaration)) {
|
|
541
|
+
seen.add(declaration);
|
|
542
|
+
const layout = classes.get(declaration);
|
|
543
|
+
if (!layout)
|
|
544
|
+
return false;
|
|
545
|
+
if (layout.methods.some((member) => member.key === key) || layout.accessors.some((member) => member.key === key))
|
|
546
|
+
return true;
|
|
547
|
+
if (layout.fields.some((member) => member.key === key))
|
|
548
|
+
return false;
|
|
549
|
+
declaration = layout.base;
|
|
550
|
+
}
|
|
551
|
+
return false;
|
|
552
|
+
};
|
|
553
|
+
/**
|
|
554
|
+
* Sealed reflection exposure census. Every emitted candidate is seeded as
|
|
555
|
+
* `keys-only`; only dynamic/unknown boundaries promote it to `full`.
|
|
556
|
+
*/
|
|
557
|
+
export const reflectionExposureOf = (bodies, classes, deriver, options) => {
|
|
558
|
+
const rows = new Map();
|
|
559
|
+
const directChildrenCache = new Map();
|
|
560
|
+
const publishedChildrenCache = new Map();
|
|
561
|
+
const propertyLayoutCache = new Map();
|
|
562
|
+
const nativePropertyLayoutOf = (representation) => hasNativePropertyLayout(representation, deriver, classes, new Set(), propertyLayoutCache);
|
|
563
|
+
const certifiedComputedReadOf = (operation) => {
|
|
564
|
+
if (operation.kind !== 'get' || operation.typedComputedRead?.kind !== 'closed-record')
|
|
565
|
+
return false;
|
|
566
|
+
return (operation.receiver.representation.kind === 'record' &&
|
|
567
|
+
operation.typedComputedRead.receiver === representationKey(operation.receiver.representation) &&
|
|
568
|
+
operation.typedComputedRead.result === representationKey(operation.result.representation));
|
|
569
|
+
};
|
|
570
|
+
const expandedFull = new Set();
|
|
571
|
+
const unrestricted = new Set();
|
|
572
|
+
const fieldOperations = new Map();
|
|
573
|
+
const origins = [];
|
|
574
|
+
const affecting = new Map();
|
|
575
|
+
const parents = new Map();
|
|
576
|
+
let currentOperation = null;
|
|
577
|
+
const promoteFull = (representation, reason, carrier = representation) => {
|
|
578
|
+
const origin = origins.length;
|
|
579
|
+
if (options.trace)
|
|
580
|
+
origins.push({ reason, carrier, operation: currentOperation });
|
|
581
|
+
const observe = (key, parent) => {
|
|
582
|
+
unrestricted.add(key);
|
|
583
|
+
if (!options.trace)
|
|
584
|
+
return;
|
|
585
|
+
const entries = affecting.get(key) ?? new Set();
|
|
586
|
+
entries.add(origin);
|
|
587
|
+
affecting.set(key, entries);
|
|
588
|
+
if (parent !== null) {
|
|
589
|
+
const sources = parents.get(key) ?? new Set();
|
|
590
|
+
sources.add(parent);
|
|
591
|
+
parents.set(key, sources);
|
|
592
|
+
}
|
|
593
|
+
};
|
|
594
|
+
promote(rows, representation, reason, classes, deriver, expandedFull, publishedChildrenCache, observe);
|
|
595
|
+
};
|
|
596
|
+
/**
|
|
597
|
+
* Retain the protocol for this surface itself without claiming that its
|
|
598
|
+
* fields/children are dynamically published. A sealed Array/Map/callable
|
|
599
|
+
* field can require its own hooks while the containing class is accessed
|
|
600
|
+
* only through fixed native slots; propagating the layout-proof failure into
|
|
601
|
+
* every child would turn that independent demand into a false escape.
|
|
602
|
+
* Actual dynamic reads, calls, conversions and publications continue to use
|
|
603
|
+
* `promoteFull`, which closes the entire reachable carrier graph.
|
|
604
|
+
*/
|
|
605
|
+
const markFullOnly = (representation, reason) => {
|
|
606
|
+
const pending = [representation];
|
|
607
|
+
const seen = new Set();
|
|
608
|
+
while (pending.length > 0) {
|
|
609
|
+
const value = pending.pop();
|
|
610
|
+
if (!value)
|
|
611
|
+
continue;
|
|
612
|
+
const identity = representationKey(value);
|
|
613
|
+
if (seen.has(identity))
|
|
614
|
+
continue;
|
|
615
|
+
seen.add(identity);
|
|
616
|
+
const surfaces = objectSurfacesOf(value);
|
|
617
|
+
if (surfaces.length > 0) {
|
|
618
|
+
for (const surface of surfaces) {
|
|
619
|
+
const key = representationKey(surface);
|
|
620
|
+
const row = rows.get(key) ?? { level: 'keys-only', reasons: new Set(), representations: new Set() };
|
|
621
|
+
row.level = 'full';
|
|
622
|
+
row.reasons.add(reason);
|
|
623
|
+
unrestricted.add(key);
|
|
624
|
+
row.representations.add(key);
|
|
625
|
+
rows.set(key, row);
|
|
626
|
+
}
|
|
627
|
+
continue;
|
|
628
|
+
}
|
|
629
|
+
const children = publishedChildrenCache.get(identity) ?? publishedChildrenOf(value, classes, deriver);
|
|
630
|
+
publishedChildrenCache.set(identity, children);
|
|
631
|
+
pending.push(...children);
|
|
632
|
+
}
|
|
633
|
+
};
|
|
634
|
+
/**
|
|
635
|
+
* A `ClassName.KEY` slot the whole-program static-field census gave native
|
|
636
|
+
* storage of exactly this carrier.
|
|
637
|
+
*
|
|
638
|
+
* `declaredFieldOf` has no answer for a `constructor-family`: a class layout
|
|
639
|
+
* records the static fields a class BODY declares, and the dominant static
|
|
640
|
+
* idiom in ordinary JavaScript writes them from module scope instead
|
|
641
|
+
* (`Color.NAMES = _colorKeywords`, `Object3D.DEFAULT_UP = ...`). Reading that
|
|
642
|
+
* silence as "this key names no slot" promoted the assigned VALUE to a full
|
|
643
|
+
* dynamic field protocol -- 296 boxes for the colour-keyword table alone,
|
|
644
|
+
* from one assignment -- while the target was already storing it in a typed
|
|
645
|
+
* `gea::Ref` global with no `gea::Value` anywhere in sight.
|
|
646
|
+
*
|
|
647
|
+
* The census is the authority that publishes that storage, so it is what
|
|
648
|
+
* gets asked, rather than a shape test invented here that could disagree
|
|
649
|
+
* with the slot actually emitted. It refuses a computed key, a key no
|
|
650
|
+
* `constant` accounts for, a static method or accessor, and any pair of
|
|
651
|
+
* writes whose carriers disagree -- so a slot it answers for is one carrier,
|
|
652
|
+
* fixed, and the equality below is the whole proof.
|
|
653
|
+
*/
|
|
654
|
+
const staticFieldSlots = censusClassStaticFieldSlots(bodies, classes);
|
|
655
|
+
const nativeStaticSlotHolds = (receiver, key, value) => {
|
|
656
|
+
if (value === null)
|
|
657
|
+
return false;
|
|
658
|
+
if (receiver.kind === 'optional')
|
|
659
|
+
return nativeStaticSlotHolds(receiver.payload, key, value);
|
|
660
|
+
if (receiver.kind === 'borrowed-ref')
|
|
661
|
+
return nativeStaticSlotHolds(receiver.referent, key, value);
|
|
662
|
+
if (receiver.kind !== 'constructor-family')
|
|
663
|
+
return false;
|
|
664
|
+
const slot = staticFieldSlotOf(staticFieldSlots, classes, receiver.members, key);
|
|
665
|
+
return slot !== null && representationKey(slot) === representationKey(value);
|
|
666
|
+
};
|
|
667
|
+
const promoteNamedField = (receiver, key, operation) => {
|
|
668
|
+
const origin = origins.length;
|
|
669
|
+
if (options.trace)
|
|
670
|
+
origins.push({ reason: 'named-field-operation', carrier: receiver, operation });
|
|
671
|
+
const surfaces = new Map(objectSurfacesOf(receiver).map((surface) => [representationKey(surface), surface]));
|
|
672
|
+
for (const surface of [...surfaces.values()]) {
|
|
673
|
+
if (surface.kind !== 'class-ref')
|
|
674
|
+
continue;
|
|
675
|
+
for (const layout of classes.values())
|
|
676
|
+
if (layout.instance &&
|
|
677
|
+
(extendsClass(classes, surface.declaration, layout.declaration) || extendsClass(classes, layout.declaration, surface.declaration)))
|
|
678
|
+
surfaces.set(representationKey(layout.instance), layout.instance);
|
|
679
|
+
}
|
|
680
|
+
for (const [identity, surface] of surfaces) {
|
|
681
|
+
const row = rows.get(identity) ?? { level: 'keys-only', reasons: new Set(), representations: new Set() };
|
|
682
|
+
row.level = 'full';
|
|
683
|
+
row.reasons.add('named-field-operation');
|
|
684
|
+
row.representations.add(identity);
|
|
685
|
+
rows.set(identity, row);
|
|
686
|
+
const fields = fieldOperations.get(identity) ?? new Map();
|
|
687
|
+
const uses = fields.get(key) ?? new Set();
|
|
688
|
+
const nativeReflect = operation.kind === 'call'
|
|
689
|
+
? nativeReflectFieldTransportOf(operation, declaredFieldOf(surface, key, classes, deriver), deriver)
|
|
690
|
+
: null;
|
|
691
|
+
if (nativeReflect)
|
|
692
|
+
uses.add(nativeReflect);
|
|
693
|
+
else if (operation.kind === 'get' ||
|
|
694
|
+
(operation.kind === 'compute' && operation.operator === 'ObjectTag') ||
|
|
695
|
+
(operation.kind === 'call' &&
|
|
696
|
+
(operation.intrinsicReflection === 'get' || operation.intrinsicReflection === 'getOwnPropertyDescriptor')))
|
|
697
|
+
uses.add('read');
|
|
698
|
+
else if (operation.kind === 'set' || (operation.kind === 'call' && operation.intrinsicReflection === 'set'))
|
|
699
|
+
uses.add('write');
|
|
700
|
+
else if (operation.kind === 'define-own-property')
|
|
701
|
+
uses.add('define');
|
|
702
|
+
fields.set(key, uses);
|
|
703
|
+
fieldOperations.set(identity, fields);
|
|
704
|
+
if (options.trace) {
|
|
705
|
+
const entries = affecting.get(identity) ?? new Set();
|
|
706
|
+
entries.add(origin);
|
|
707
|
+
affecting.set(identity, entries);
|
|
708
|
+
}
|
|
709
|
+
// A named read can publish that field's object, never every sibling's.
|
|
710
|
+
if (operation.kind === 'get' ||
|
|
711
|
+
(operation.kind === 'call' &&
|
|
712
|
+
(operation.intrinsicReflection === 'get' || operation.intrinsicReflection === 'getOwnPropertyDescriptor') &&
|
|
713
|
+
nativeReflect === null)) {
|
|
714
|
+
const field = declaredFieldOf(surface, key, classes, deriver);
|
|
715
|
+
if (field)
|
|
716
|
+
promoteFull(field.value, 'named-field-result');
|
|
717
|
+
else if (surface.kind === 'array-object' &&
|
|
718
|
+
canonicalIndexLiteral(key) !== null &&
|
|
719
|
+
operation.result !== null &&
|
|
720
|
+
!holdsNoObject(operation.result.representation))
|
|
721
|
+
promoteFull(surface.element, 'indexed-array-field-result');
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
};
|
|
725
|
+
const carriesCallable = (representation, seen = new Set()) => {
|
|
726
|
+
const identity = representationKey(representation);
|
|
727
|
+
if (seen.has(identity))
|
|
728
|
+
return false;
|
|
729
|
+
seen.add(identity);
|
|
730
|
+
if (callableAbiOf(representation) !== null ||
|
|
731
|
+
representation.kind === 'constructor-family' ||
|
|
732
|
+
representation.kind === 'constructor-value-dispatch')
|
|
733
|
+
return true;
|
|
734
|
+
if (objectSurfacesOf(representation).length > 0)
|
|
735
|
+
return false;
|
|
736
|
+
const children = directChildrenCache.get(identity) ?? directChildrenOf(representation, classes, deriver);
|
|
737
|
+
directChildrenCache.set(identity, children);
|
|
738
|
+
return children.some((child) => carriesCallable(child, seen));
|
|
739
|
+
};
|
|
740
|
+
const candidates = new Map();
|
|
741
|
+
// A retained function value can be inspected without its body ever running.
|
|
742
|
+
// Use the callable census's complete entry/escape result, recomputed for this
|
|
743
|
+
// exact program, rather than treating allocation as execution or trusting a
|
|
744
|
+
// stale flag attached before another caller was added. Layout and ABI lookup
|
|
745
|
+
// below still retain every body; only impossible execution contributes no
|
|
746
|
+
// dynamic-operation demand.
|
|
747
|
+
const callableReads = [];
|
|
748
|
+
const enteredBodies = options.shakeComplete
|
|
749
|
+
? nativeCallableFlowOf(bodies, options.placements ?? new Map(), classes, options.conversions, options.trace ? (operation, reason) => callableReads.push({ operation, reason }) : undefined, deriver).enteredBodies
|
|
750
|
+
: null;
|
|
751
|
+
const operations = bodies
|
|
752
|
+
.filter((body) => enteredBodies === null || enteredBodies.has(body.owner))
|
|
753
|
+
.flatMap((body) => body.blockOrder.flatMap((blockId) => {
|
|
754
|
+
const block = body.blocks.get(blockId);
|
|
755
|
+
return block ? [...block.operations, block.terminator] : [];
|
|
756
|
+
}));
|
|
757
|
+
// `GEA_REFLECTION_DEBUG=<representation-key substring>` names, on stderr,
|
|
758
|
+
// every body the callable flow left un-entered (so its operations count for
|
|
759
|
+
// no demand at all) and the final row of every surface whose key contains
|
|
760
|
+
// the substring. A struct emitted WITHOUT the own-field protocol while an
|
|
761
|
+
// emitted body deletes or writes an expando on it is exactly this pair
|
|
762
|
+
// disagreeing, and neither side says so on its own: the emitter renders the
|
|
763
|
+
// body because reachability kept it, the census skipped it because the flow
|
|
764
|
+
// never saw a call enter it.
|
|
765
|
+
const reflectionWatch = process.env.GEA_REFLECTION_DEBUG;
|
|
766
|
+
if (reflectionWatch !== undefined && enteredBodies !== null)
|
|
767
|
+
for (const body of bodies)
|
|
768
|
+
if (!enteredBodies.has(body.owner))
|
|
769
|
+
console.error(`[REFLECTION-UNENTERED] source=${String(body.sourceOwner)} owner=${String(body.owner)}`);
|
|
770
|
+
// A template-backed intrinsic does not materialize its callee as a JS
|
|
771
|
+
// callable. Do not infer a publication of the intrinsic ABI's return type
|
|
772
|
+
// from a value used exclusively by sealed native definitions.
|
|
773
|
+
// lower-invocation publishes intrinsicReflection only for an authenticated
|
|
774
|
+
// template callee. Its actual field effects are handled below; its unused
|
|
775
|
+
// function-value ABI cannot expose the descriptor that template constructs.
|
|
776
|
+
const nativeTemplateCallee = (operation) => operation.kind === 'call' &&
|
|
777
|
+
(operation.fixedDataDefinition?.nativeFieldProtocol === 'unused' || operation.intrinsicReflection !== undefined);
|
|
778
|
+
const nativeDefinitionCallees = new Set();
|
|
779
|
+
for (const operation of operations)
|
|
780
|
+
if (operation.kind === 'call' && nativeTemplateCallee(operation))
|
|
781
|
+
nativeDefinitionCallees.add(operation.callee.value);
|
|
782
|
+
for (const operation of operations)
|
|
783
|
+
for (const operand of operandsOfIrOperation(operation))
|
|
784
|
+
if (!(operation.kind === 'call' &&
|
|
785
|
+
nativeTemplateCallee(operation) &&
|
|
786
|
+
operand.value === operation.callee.value &&
|
|
787
|
+
operation.receiver?.value !== operand.value &&
|
|
788
|
+
!operation.arguments.some((argument) => argument.value === operand.value)))
|
|
789
|
+
nativeDefinitionCallees.delete(operand.value);
|
|
790
|
+
// `options.representations` is the complete sealed plan, including ABI
|
|
791
|
+
// entries whose callable object was shaken away. A callable ABI is an
|
|
792
|
+
// external publication boundary only when a final IR value actually
|
|
793
|
+
// carries it. Results and operands cover allocation, parameter/binding,
|
|
794
|
+
// field, call, return, capture and conversion paths; a body ABI alone is
|
|
795
|
+
// intentionally not evidence that its function object escaped.
|
|
796
|
+
const materializedRepresentations = new Set();
|
|
797
|
+
const observedValues = new Set();
|
|
798
|
+
for (const operation of operations) {
|
|
799
|
+
const result = resultOfIrOperation(operation);
|
|
800
|
+
if (result && !nativeDefinitionCallees.has(result.id))
|
|
801
|
+
materializedRepresentations.add(representationKey(result.representation));
|
|
802
|
+
for (const operand of operandsOfIrOperation(operation)) {
|
|
803
|
+
if (!nativeDefinitionCallees.has(operand.value))
|
|
804
|
+
materializedRepresentations.add(representationKey(operand.representation));
|
|
805
|
+
observedValues.add(operand.value);
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
const bodyByFunction = new Map();
|
|
809
|
+
const bodyByOperation = new Map();
|
|
810
|
+
for (const body of bodies) {
|
|
811
|
+
for (const block of body.blocks.values())
|
|
812
|
+
for (const operation of [...block.operations, block.terminator])
|
|
813
|
+
bodyByOperation.set(operation, body);
|
|
814
|
+
if (body.abi === null)
|
|
815
|
+
continue;
|
|
816
|
+
const key = String(body.sourceOwner);
|
|
817
|
+
bodyByFunction.set(key, bodyByFunction.has(key) ? null : body);
|
|
818
|
+
}
|
|
819
|
+
const knownCallFunctionIds = (operation) => {
|
|
820
|
+
if (operation.argumentsAreSpread || operation.closedCallee === undefined)
|
|
821
|
+
return null;
|
|
822
|
+
return operation.closedCallee.kind === 'exact' ? [operation.closedCallee.functionId] : operation.closedCallee.functionIds;
|
|
823
|
+
};
|
|
824
|
+
const closedCallOperations = new Set();
|
|
825
|
+
for (const operation of operations) {
|
|
826
|
+
if (operation.kind !== 'call')
|
|
827
|
+
continue;
|
|
828
|
+
const functionIds = knownCallFunctionIds(operation);
|
|
829
|
+
if (functionIds === null ||
|
|
830
|
+
functionIds.length === 0 ||
|
|
831
|
+
!functionIds.every((functionId) => {
|
|
832
|
+
const body = bodyByFunction.get(String(functionId));
|
|
833
|
+
return (body !== undefined &&
|
|
834
|
+
body !== null &&
|
|
835
|
+
body.abi !== null &&
|
|
836
|
+
(operation.closedFrame === undefined ? callMatchesAbi(operation, body.abi) : abiMatches(operation.closedFrame.abi, body.abi)));
|
|
837
|
+
}))
|
|
838
|
+
continue;
|
|
839
|
+
closedCallOperations.add(operation);
|
|
840
|
+
}
|
|
841
|
+
const closedConstructOperations = new Set();
|
|
842
|
+
for (const operation of operations) {
|
|
843
|
+
if (operation.kind !== 'construct')
|
|
844
|
+
continue;
|
|
845
|
+
if (nativeClassConstructionOf(operation, classes, (id) => bodyByFunction.get(String(id)), options.conversions) !== null) {
|
|
846
|
+
closedConstructOperations.add(operation);
|
|
847
|
+
continue;
|
|
848
|
+
}
|
|
849
|
+
// A host constructor has no compiler-owned body for the loop below to
|
|
850
|
+
// walk, so its frame is the whole proof, exactly as for a sealed native
|
|
851
|
+
// call: `new WeakMap()` in three's `WebGLProperties` publishes a fresh
|
|
852
|
+
// empty collection, not the texture/material bags it will later hold.
|
|
853
|
+
// See `nativeHostConstructionOf` for what stays open.
|
|
854
|
+
if (nativeHostConstructionOf(operation, options.conversions) !== null) {
|
|
855
|
+
closedConstructOperations.add(operation);
|
|
856
|
+
continue;
|
|
857
|
+
}
|
|
858
|
+
const targets = operation.target.kind === 'exact'
|
|
859
|
+
? [operation.target.target]
|
|
860
|
+
: operation.target.kind === 'closed-family'
|
|
861
|
+
? operation.target.targets
|
|
862
|
+
: null;
|
|
863
|
+
if (targets === null || targets.length === 0)
|
|
864
|
+
continue;
|
|
865
|
+
let closed = true;
|
|
866
|
+
for (const target of targets) {
|
|
867
|
+
if (target.kind === 'function') {
|
|
868
|
+
const body = bodyByFunction.get(String(target.functionId));
|
|
869
|
+
const classLayouts = [...classes.values()].filter((layout) => layout.constructor === target.functionId);
|
|
870
|
+
if (body === undefined || body === null) {
|
|
871
|
+
closed = false;
|
|
872
|
+
break;
|
|
873
|
+
}
|
|
874
|
+
if (classLayouts.length > 0) {
|
|
875
|
+
// Written class constructors use the class body ABI (`this`/
|
|
876
|
+
// instance receiver, void result), while the class allocation owns
|
|
877
|
+
// the receiver-less construct ABI used by this operation.
|
|
878
|
+
if (!classLayouts.every((layout) => layout.construct !== null &&
|
|
879
|
+
constructMatchesAbi(operation, layout.construct, options.conversions) &&
|
|
880
|
+
classConstructorBodyMatches(layout, body))) {
|
|
881
|
+
closed = false;
|
|
882
|
+
break;
|
|
883
|
+
}
|
|
884
|
+
continue;
|
|
885
|
+
}
|
|
886
|
+
// The entry census can also publish a receiver-free call convention
|
|
887
|
+
// when the ordinary constructor's explicit Object return always wins.
|
|
888
|
+
// Reflection must consume the same entry the printer will invoke.
|
|
889
|
+
const entry = operation.entry;
|
|
890
|
+
const constructAbi = entry?.kind === 'explicit-object-return' &&
|
|
891
|
+
entry.functionId === target.functionId &&
|
|
892
|
+
body.abi !== null &&
|
|
893
|
+
abiMatches(entry.abi, body.abi)
|
|
894
|
+
? entry.abi
|
|
895
|
+
: body.construct;
|
|
896
|
+
if (!target.constructable || constructAbi === null || !constructMatchesAbi(operation, constructAbi, options.conversions)) {
|
|
897
|
+
closed = false;
|
|
898
|
+
break;
|
|
899
|
+
}
|
|
900
|
+
continue;
|
|
901
|
+
}
|
|
902
|
+
const layout = classLayoutOfCopy(classes, target.classDeclaration);
|
|
903
|
+
// An implicit-source-constructor target is emitted only for a class with
|
|
904
|
+
// no written constructor. Its class construct ABI is the complete
|
|
905
|
+
// convention; accepting a layout that also names a constructor would
|
|
906
|
+
// silently bypass that body and turn a closed result into a guess.
|
|
907
|
+
if (layout === undefined ||
|
|
908
|
+
layout.constructor !== null ||
|
|
909
|
+
layout.construct === null ||
|
|
910
|
+
!constructMatchesAbi(operation, layout.construct, options.conversions)) {
|
|
911
|
+
closed = false;
|
|
912
|
+
break;
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
if (closed)
|
|
916
|
+
closedConstructOperations.add(operation);
|
|
917
|
+
}
|
|
918
|
+
const unwrappedCallableAbi = (representation) => {
|
|
919
|
+
if (representation.kind === 'optional')
|
|
920
|
+
return unwrappedCallableAbi(representation.payload);
|
|
921
|
+
if (representation.kind === 'borrowed-ref')
|
|
922
|
+
return unwrappedCallableAbi(representation.referent);
|
|
923
|
+
return callableAbiOf(representation);
|
|
924
|
+
};
|
|
925
|
+
// An adapter invokes a compiler-owned source body through its own sealed
|
|
926
|
+
// convention. Its FunctionId alone cannot certify the adapted call frame;
|
|
927
|
+
// follow the conversion's transport proof and check the held entry instead.
|
|
928
|
+
//
|
|
929
|
+
// The frame is the whole proof here, and `closedValue` is deliberately not
|
|
930
|
+
// required beside it. Naming a compiler-owned body is what DISPATCH needs;
|
|
931
|
+
// what this census needs is whether the operands cross a dynamic boundary,
|
|
932
|
+
// and an exact frame already answers that: every argument, the receiver and
|
|
933
|
+
// the result agree with the callee's own stated convention, so each one is
|
|
934
|
+
// held in its declared native carrier and none is published as a `Value`.
|
|
935
|
+
// Requiring a FunctionId beside it asked a question a sealed native member
|
|
936
|
+
// can never answer -- `CallOperation.closedCallee` names "compiler-owned
|
|
937
|
+
// body identity only" -- so `[].push(n)`, `map.get(k)`, `str.split(s)`,
|
|
938
|
+
// `Math.min(a, b)` and `pattern.exec(s)` each read as an open boundary and
|
|
939
|
+
// promoted their receiver and every argument to an unrestricted field
|
|
940
|
+
// protocol. That was 2,480 of the three.js app's 4,193 `unknown-call-boundary`
|
|
941
|
+
// origins, every one of them with a frame that already matched exactly.
|
|
942
|
+
//
|
|
943
|
+
// A callee stating no native convention still fails `abi !== null` -- a
|
|
944
|
+
// `dynamic` callee has no ABI to match -- an inexact frame still fails, and
|
|
945
|
+
// a compiler-owned body contributes its own operations to this same census
|
|
946
|
+
// whether or not a call site names it. So nothing here trusts a body it has
|
|
947
|
+
// not walked; it trusts the convention the carrier already states.
|
|
948
|
+
for (const operation of operations) {
|
|
949
|
+
if (operation.kind !== 'call' || operation.argumentsAreSpread || closedCallOperations.has(operation))
|
|
950
|
+
continue;
|
|
951
|
+
// A call the printer spells from a host template never enters the callee's
|
|
952
|
+
// declared convention, so that convention is not its frame; the template's
|
|
953
|
+
// own is (`hostTemplateFrameOf`), and where it answers it alone decides.
|
|
954
|
+
const template = hostTemplateFrameOf(operation, options.conversions, deriver, classes);
|
|
955
|
+
if (template !== undefined) {
|
|
956
|
+
if (template)
|
|
957
|
+
closedCallOperations.add(operation);
|
|
958
|
+
continue;
|
|
959
|
+
}
|
|
960
|
+
const abi = unwrappedCallableAbi(operation.callee.representation);
|
|
961
|
+
// `native-transfer`, not the value identity provenance and the native
|
|
962
|
+
// class-initialization entry ask for: this census's question is whether an
|
|
963
|
+
// operand crosses a dynamic boundary, and an argument the conversion census
|
|
964
|
+
// carries into its formal in native storage crosses none, whoever's value
|
|
965
|
+
// the body ends up holding.
|
|
966
|
+
if (abi !== null && nativeCallFrameOf(operation, abi, observedValues, options.conversions, 'native-transfer') !== undefined)
|
|
967
|
+
closedCallOperations.add(operation);
|
|
968
|
+
}
|
|
969
|
+
const collectCandidate = (representation) => {
|
|
970
|
+
const rootKey = representationKey(representation);
|
|
971
|
+
const descendants = [];
|
|
972
|
+
const descendantKeys = new Set();
|
|
973
|
+
const pending = [representation];
|
|
974
|
+
const pendingSeen = new Set();
|
|
975
|
+
while (pending.length > 0) {
|
|
976
|
+
const next = pending.pop();
|
|
977
|
+
if (!next)
|
|
978
|
+
continue;
|
|
979
|
+
const identity = representationKey(next);
|
|
980
|
+
if (pendingSeen.has(identity))
|
|
981
|
+
continue;
|
|
982
|
+
pendingSeen.add(identity);
|
|
983
|
+
const surfaces = objectSurfacesOf(next);
|
|
984
|
+
if (surfaces.length > 0) {
|
|
985
|
+
for (const surface of surfaces) {
|
|
986
|
+
const key = representationKey(surface);
|
|
987
|
+
if (key !== rootKey && !descendantKeys.has(key)) {
|
|
988
|
+
descendantKeys.add(key);
|
|
989
|
+
descendants.push(surface);
|
|
990
|
+
}
|
|
991
|
+
if (candidates.has(key))
|
|
992
|
+
continue;
|
|
993
|
+
candidates.set(key, surface);
|
|
994
|
+
// Candidate discovery must publish a row even when this nested
|
|
995
|
+
// surface never appears as a separate root in the emission inventory.
|
|
996
|
+
// A missing row makes consumers retain the unrestricted protocol.
|
|
997
|
+
if (!rows.has(key))
|
|
998
|
+
rows.set(key, { level: 'keys-only', reasons: new Set(), representations: new Set([key]) });
|
|
999
|
+
if (!nativePropertyLayoutOf(surface))
|
|
1000
|
+
markFullOnly(surface, 'unproven-layout-protocol');
|
|
1001
|
+
const children = directChildrenCache.get(key) ?? directChildrenOf(surface, classes, deriver);
|
|
1002
|
+
directChildrenCache.set(key, children);
|
|
1003
|
+
pending.push(...children);
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
else {
|
|
1007
|
+
const children = directChildrenCache.get(identity) ?? directChildrenOf(next, classes, deriver);
|
|
1008
|
+
directChildrenCache.set(identity, children);
|
|
1009
|
+
pending.push(...children);
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
return descendants;
|
|
1013
|
+
};
|
|
1014
|
+
const seededRoots = new Set();
|
|
1015
|
+
for (const representation of options.representations) {
|
|
1016
|
+
const identity = representationKey(representation);
|
|
1017
|
+
if (seededRoots.has(identity))
|
|
1018
|
+
continue;
|
|
1019
|
+
seededRoots.add(identity);
|
|
1020
|
+
const surfaces = objectSurfacesOf(representation);
|
|
1021
|
+
if (surfaces.length === 0) {
|
|
1022
|
+
if (!materializedRepresentations.has(identity))
|
|
1023
|
+
continue;
|
|
1024
|
+
// Inventory includes both sides of the convention. Publication follows
|
|
1025
|
+
// the outgoing side only; an input type is not an exposed object.
|
|
1026
|
+
for (const child of collectCandidate(representation)) {
|
|
1027
|
+
const key = representationKey(child);
|
|
1028
|
+
const row = rows.get(key) ?? { level: 'keys-only', reasons: new Set(), representations: new Set() };
|
|
1029
|
+
row.representations.add(key);
|
|
1030
|
+
if (!nativePropertyLayoutOf(child)) {
|
|
1031
|
+
row.level = 'full';
|
|
1032
|
+
row.reasons.add('unproven-layout-protocol');
|
|
1033
|
+
markFullOnly(child, 'unproven-layout-protocol');
|
|
1034
|
+
}
|
|
1035
|
+
rows.set(key, row);
|
|
1036
|
+
}
|
|
1037
|
+
// A signature is an inventory entry, not an outgoing object. Calls,
|
|
1038
|
+
// conversions and publications below own demand for callable outputs;
|
|
1039
|
+
// even an unknown callable can be discarded without creating its result.
|
|
1040
|
+
if (!isDeferredCarrier(representation))
|
|
1041
|
+
promoteFull(representation, 'unproven-carrier-boundary');
|
|
1042
|
+
}
|
|
1043
|
+
for (const surface of surfaces) {
|
|
1044
|
+
collectCandidate(surface);
|
|
1045
|
+
const key = representationKey(surface);
|
|
1046
|
+
const row = rows.get(key) ?? { level: 'keys-only', reasons: new Set(), representations: new Set() };
|
|
1047
|
+
row.representations.add(key);
|
|
1048
|
+
if (!nativePropertyLayoutOf(surface)) {
|
|
1049
|
+
row.level = 'full';
|
|
1050
|
+
row.reasons.add('unproven-layout-protocol');
|
|
1051
|
+
}
|
|
1052
|
+
rows.set(key, row);
|
|
1053
|
+
if (!nativePropertyLayoutOf(surface))
|
|
1054
|
+
markFullOnly(surface, 'unproven-layout-protocol');
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
const constants = constantsOf(operations);
|
|
1058
|
+
const typedReturnValues = new Set();
|
|
1059
|
+
for (const body of bodies) {
|
|
1060
|
+
// The body publishes its exact native ABI result. How callers expose it
|
|
1061
|
+
// is owned by their call/conversion operations, including unknown calls;
|
|
1062
|
+
// requiring a known direct invocation here conflates those boundaries.
|
|
1063
|
+
if (body.abi === null)
|
|
1064
|
+
continue;
|
|
1065
|
+
for (const blockId of body.blockOrder) {
|
|
1066
|
+
const block = body.blocks.get(blockId);
|
|
1067
|
+
if (block?.terminator.kind === 'return' && block.terminator.value !== null && body.abi.result.kind !== 'void') {
|
|
1068
|
+
if (representationKey(block.terminator.value.representation) === representationKey(body.abi.result))
|
|
1069
|
+
typedReturnValues.add(String(block.terminator.value.value));
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
for (const operation of operations) {
|
|
1074
|
+
currentOperation = operation;
|
|
1075
|
+
if (operation.kind === 'compute' && operation.form === 'unary' && operation.operator === 'ObjectTag') {
|
|
1076
|
+
// The authenticated algorithm reads one well-known symbol. It neither
|
|
1077
|
+
// reads ordinary toString nor publishes unrelated fields or tag objects.
|
|
1078
|
+
const tagDeclaration = [...(options.wellKnownSymbols ?? [])].find(([, name]) => name === 'toStringTag')?.[0];
|
|
1079
|
+
const receiver = operation.operands[0];
|
|
1080
|
+
if (tagDeclaration !== undefined && receiver !== undefined) {
|
|
1081
|
+
if (deriver && nativeRecordIndexHasPropertyOf(deriver, receiver.representation, { kind: 'symbol' }))
|
|
1082
|
+
continue;
|
|
1083
|
+
promoteNamedField(receiver.representation, `sym(${tagDeclaration})`, operation);
|
|
1084
|
+
continue;
|
|
1085
|
+
}
|
|
1086
|
+
// Without the symbol census, retain the ordinary unknown-operation
|
|
1087
|
+
// demand below: an absent authority is not proof of an absent property.
|
|
1088
|
+
}
|
|
1089
|
+
if (operation.kind === 'get' && nativeDefinitionCallees.has(operation.result.id))
|
|
1090
|
+
continue;
|
|
1091
|
+
if (nativeAbsentPropertyReadOf(operation) !== null)
|
|
1092
|
+
continue;
|
|
1093
|
+
if (nativeKeyQueryOf(operation, nativePropertyLayoutOf))
|
|
1094
|
+
continue;
|
|
1095
|
+
if (nativeArrayTransportOf(operation, keyOf(keyOperandOf(operation), constants)))
|
|
1096
|
+
continue;
|
|
1097
|
+
if (nativeDictionaryTransportOf(operation))
|
|
1098
|
+
continue;
|
|
1099
|
+
if (nativeRecordIndexTransportOf(operation, deriver, options.conversions, keyOf(keyOperandOf(operation), constants)))
|
|
1100
|
+
continue;
|
|
1101
|
+
if (nativeSequenceTransportOf(operation))
|
|
1102
|
+
continue;
|
|
1103
|
+
if (nativeCallableBindTransportOf(operation))
|
|
1104
|
+
continue;
|
|
1105
|
+
if (nativeClassAccessorEntryOf(operation, keyOf(keyOperandOf(operation), constants), classes, (id) => bodyByFunction.get(String(id)), options.conversions))
|
|
1106
|
+
continue;
|
|
1107
|
+
if ((operation.kind === 'get' || operation.kind === 'set') && operation.receiver.representation.kind === 'class-ref') {
|
|
1108
|
+
const key = keyOf(operation.key, constants);
|
|
1109
|
+
const member = key === null ? null : classMemberOf(classes, operation.receiver.representation.declaration, key);
|
|
1110
|
+
if (member?.kind === 'accessor') {
|
|
1111
|
+
// The native entry proof above owns safe accessor transport. An
|
|
1112
|
+
// adapting/unknown half must retain both its receiver and its actual
|
|
1113
|
+
// payload convention, even if the get result itself is erased.
|
|
1114
|
+
promoteFull(operation.receiver.representation, 'unproven-accessor-entry');
|
|
1115
|
+
const id = operation.kind === 'get' ? member.accessor.getter : member.accessor.setter;
|
|
1116
|
+
const frame = id === null ? null : bodyByFunction.get(String(id))?.abi;
|
|
1117
|
+
if (operation.kind === 'get') {
|
|
1118
|
+
if (frame)
|
|
1119
|
+
promoteFull(frame.result, 'unproven-accessor-result');
|
|
1120
|
+
promoteFull(operation.result.representation, 'unproven-accessor-result');
|
|
1121
|
+
}
|
|
1122
|
+
else {
|
|
1123
|
+
promoteFull(operation.value.representation, 'unproven-accessor-argument');
|
|
1124
|
+
for (const parameter of frame?.parameters ?? [])
|
|
1125
|
+
promoteFull(parameter.value, 'unproven-accessor-argument');
|
|
1126
|
+
}
|
|
1127
|
+
continue;
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
if (operation.kind === 'merge-live-arm-rebuild' && options.conversions && nativeMergeTransportMatches(operation, options.conversions))
|
|
1131
|
+
continue;
|
|
1132
|
+
const receiver = receiverOf(operation);
|
|
1133
|
+
if (receiver) {
|
|
1134
|
+
const key = keyOf(keyOperandOf(operation), constants);
|
|
1135
|
+
// A computed key three's `Material.setValues`/`Texture.setValues` shape
|
|
1136
|
+
// hands the census a finite, closed-forward name set for
|
|
1137
|
+
// (`PropertyOperation.provenKeyTexts`'s own comment has the full
|
|
1138
|
+
// contract) is an UPPER bound on the key, proven from every closed
|
|
1139
|
+
// caller and checked against the sealed host-mutation census's own
|
|
1140
|
+
// obligations -- never license to assume more than that proof. `null`
|
|
1141
|
+
// here (no hook, a refused proof, or a surviving-obligation check that
|
|
1142
|
+
// failed) means exactly what it meant before this field existed:
|
|
1143
|
+
// publish the whole reachable carrier graph.
|
|
1144
|
+
const provenKeyTexts = (operation.kind === 'get' || operation.kind === 'set') && operation.provenKeyTexts && operation.provenKeyTexts.length > 0
|
|
1145
|
+
? operation.provenKeyTexts
|
|
1146
|
+
: null;
|
|
1147
|
+
if (key === null &&
|
|
1148
|
+
operation.kind !== 'own-property-keys' &&
|
|
1149
|
+
!(operation.kind === 'get-iterator' && operation.protocol === 'enumerate') &&
|
|
1150
|
+
!certifiedComputedReadOf(operation)) {
|
|
1151
|
+
if (provenKeyTexts) {
|
|
1152
|
+
// `promoteNamedField` already fans a `class-ref` receiver out across
|
|
1153
|
+
// its whole family (bases and subclasses) -- exactly what a key
|
|
1154
|
+
// that can name a member declared on ANY of them needs: `this` is
|
|
1155
|
+
// typed `Material` but `color`/`shininess` are declared only on
|
|
1156
|
+
// `MeshPhongMaterial`.
|
|
1157
|
+
for (const name of provenKeyTexts)
|
|
1158
|
+
promoteNamedField(receiver.representation, name, operation);
|
|
1159
|
+
}
|
|
1160
|
+
else
|
|
1161
|
+
promoteFull(receiver.representation, 'runtime-computed-property-key');
|
|
1162
|
+
}
|
|
1163
|
+
else if (key !== null && operation.kind !== 'get' && operation.kind !== 'set' && operation.kind !== 'define-own-property')
|
|
1164
|
+
promoteNamedField(receiver.representation, key, operation);
|
|
1165
|
+
else if (key !== null) {
|
|
1166
|
+
const value = valueRepresentationOf(operation);
|
|
1167
|
+
const surfaces = objectSurfacesOf(receiver.representation);
|
|
1168
|
+
// A `constructor-family` has no object SURFACE at all -- no struct, so
|
|
1169
|
+
// nothing for a field protocol to be published on -- which is why the
|
|
1170
|
+
// surface walk below cannot reach it and why its slot proof is asked of
|
|
1171
|
+
// the receiver itself.
|
|
1172
|
+
// A non-default descriptor is never a native slot write, whatever the
|
|
1173
|
+
// carriers say -- see `storesIntoDeclaredSlot` -- so the exact-carrier
|
|
1174
|
+
// and static-slot proofs below are asked only of a write that takes the
|
|
1175
|
+
// ordinary member store.
|
|
1176
|
+
const exact = value !== null &&
|
|
1177
|
+
!(operation.kind === 'define-own-property' && !storesIntoDeclaredSlot(operation)) &&
|
|
1178
|
+
(nativeStaticSlotHolds(receiver.representation, key, value) ||
|
|
1179
|
+
(operation.kind === 'get' && classPrototypeReadOf(classes, receiver.representation, key, value) !== null) ||
|
|
1180
|
+
(surfaces.length > 0 &&
|
|
1181
|
+
surfaces.every((surface) => {
|
|
1182
|
+
const field = declaredFieldOf(surface, key, classes, deriver);
|
|
1183
|
+
return ((field !== null &&
|
|
1184
|
+
(representationKey(field.value) === representationKey(value) ||
|
|
1185
|
+
(operation.kind === 'get' &&
|
|
1186
|
+
nativePayloadTransportMatches(field.value, value, options.conversions?.nodeById(conversionNodeIdOf(field.value, value)))) ||
|
|
1187
|
+
(storesIntoDeclaredSlot(operation) &&
|
|
1188
|
+
nativePayloadTransportMatches(value, field.value, options.conversions?.nodeById(conversionNodeIdOf(value, field.value)))))) ||
|
|
1189
|
+
(operation.kind === 'get' &&
|
|
1190
|
+
(knownClassMemberReadOf(surface, key, classes) ||
|
|
1191
|
+
knownNativeMemberReadOf(surface, key, value) ||
|
|
1192
|
+
absentClassArmRead(receiver.representation, surface, key, value, classes) ||
|
|
1193
|
+
objectPrototypeMemberReadOf(surface, key, value))));
|
|
1194
|
+
})));
|
|
1195
|
+
if (!exact) {
|
|
1196
|
+
promoteNamedField(receiver.representation, key, operation);
|
|
1197
|
+
if (value)
|
|
1198
|
+
promoteFull(value, 'unproven-native-slot-value');
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
continue;
|
|
1202
|
+
}
|
|
1203
|
+
if (operation.kind === 'convert' && operation.result.representation.kind === 'dynamic') {
|
|
1204
|
+
promoteFull(operation.source.representation, 'object-to-dynamic-conversion');
|
|
1205
|
+
continue;
|
|
1206
|
+
}
|
|
1207
|
+
if (operation.kind === 'convert') {
|
|
1208
|
+
const node = options.conversions?.nodeById(operation.conversionUse);
|
|
1209
|
+
if (node !== null &&
|
|
1210
|
+
node !== undefined &&
|
|
1211
|
+
representationKey(node.source) === representationKey(operation.source.representation) &&
|
|
1212
|
+
representationKey(node.target) === representationKey(operation.result.representation) &&
|
|
1213
|
+
(node.capability.kind === 'identity' ||
|
|
1214
|
+
((node.capability.kind === 'atom' || node.capability.kind === 'static' || node.capability.kind === 'class-family') &&
|
|
1215
|
+
node.capability.materializer.nativeFieldProtocol === 'unused')))
|
|
1216
|
+
continue;
|
|
1217
|
+
// A converted callable receives the target convention's inputs. Unless
|
|
1218
|
+
// the conversion proved native-only transport above, its adapter may
|
|
1219
|
+
// publish those inputs to a dynamic source listener. That publication
|
|
1220
|
+
// happens inside generated adapter code, not in a separate IR call.
|
|
1221
|
+
const targetAbi = unwrappedCallableAbi(operation.result.representation);
|
|
1222
|
+
if (targetAbi !== null) {
|
|
1223
|
+
if (targetAbi.receiver !== null)
|
|
1224
|
+
promoteFull(targetAbi.receiver, 'callable-adapter-input');
|
|
1225
|
+
for (const parameter of targetAbi.parameters)
|
|
1226
|
+
promoteFull(parameter.value, 'callable-adapter-input');
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
if (observesNativeCarrierOnly(operation))
|
|
1230
|
+
continue;
|
|
1231
|
+
if (operation.kind === 'phi' &&
|
|
1232
|
+
operation.incoming.every((incoming) => representationKey(incoming.value.representation) === representationKey(operation.result.representation)))
|
|
1233
|
+
continue;
|
|
1234
|
+
// A representation-preserving conversion is a typed identity transfer.
|
|
1235
|
+
// It does not invoke a native dynamic protocol, even when the source and
|
|
1236
|
+
// destination are borrowed/optional wrappers around the same carrier.
|
|
1237
|
+
// Other conversions stay at the generic boundary below until their
|
|
1238
|
+
// conversion authority publishes a stronger closed proof.
|
|
1239
|
+
if (operation.kind === 'convert' &&
|
|
1240
|
+
representationKey(operation.source.representation) === representationKey(operation.result.representation))
|
|
1241
|
+
continue;
|
|
1242
|
+
if (operation.kind === 'spread-copy') {
|
|
1243
|
+
promoteFull(operation.source.representation, 'dynamic-spread-source');
|
|
1244
|
+
promoteFull(operation.receiver.representation, 'dynamic-spread-target');
|
|
1245
|
+
continue;
|
|
1246
|
+
}
|
|
1247
|
+
if (operation.kind === 'call') {
|
|
1248
|
+
if (operation.intrinsicReflection && !operation.argumentsAreSpread) {
|
|
1249
|
+
const target = operation.arguments[0];
|
|
1250
|
+
const property = operation.arguments[1];
|
|
1251
|
+
if (target && property) {
|
|
1252
|
+
// Native ABI transport does not erase Reflect's actual field access.
|
|
1253
|
+
const key = keyOf(property, constants);
|
|
1254
|
+
if (key === null)
|
|
1255
|
+
promoteFull(target.representation, 'reflect-runtime-key');
|
|
1256
|
+
else
|
|
1257
|
+
promoteNamedField(target.representation, key, operation);
|
|
1258
|
+
promoteFull(property.representation, 'reflect-key-coercion');
|
|
1259
|
+
if (operation.intrinsicReflection === 'set' && operation.arguments[2]) {
|
|
1260
|
+
const surfaces = objectSurfacesOf(target.representation);
|
|
1261
|
+
const native = key !== null &&
|
|
1262
|
+
surfaces.length > 0 &&
|
|
1263
|
+
surfaces.every((surface) => nativeReflectFieldTransportOf(operation, declaredFieldOf(surface, key, classes, deriver)) === 'native-write');
|
|
1264
|
+
if (!native)
|
|
1265
|
+
promoteFull(operation.arguments[2].representation, 'reflect-written-value');
|
|
1266
|
+
}
|
|
1267
|
+
continue;
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
if (operation.fixedDataDefinition !== undefined) {
|
|
1271
|
+
if (operation.fixedDataDefinition.nativeFieldProtocol === 'unused')
|
|
1272
|
+
continue;
|
|
1273
|
+
// The recipe explicitly records missing authentication or a conversion
|
|
1274
|
+
// that needs native field reflection. A matching ABI cannot cancel it.
|
|
1275
|
+
for (const value of operandsOfIrOperation(operation))
|
|
1276
|
+
promoteFull(value.representation, 'unproven-fixed-data-definition');
|
|
1277
|
+
if (operation.result)
|
|
1278
|
+
promoteFull(operation.result.representation, 'unproven-fixed-data-definition-result');
|
|
1279
|
+
continue;
|
|
1280
|
+
}
|
|
1281
|
+
// A call that reads only its argument's carrier exposes nothing inside
|
|
1282
|
+
// it. `Array.isArray` is the whole family so far; its ambient parameter
|
|
1283
|
+
// is `any`, which is why it otherwise reads here as the most open
|
|
1284
|
+
// boundary a program can have.
|
|
1285
|
+
if (nativeCarrierPredicateOf(operation))
|
|
1286
|
+
continue;
|
|
1287
|
+
// CallOperation has no authenticated host-path fact. Unknown calls may
|
|
1288
|
+
// inspect or mutate every native receiver/argument they receive.
|
|
1289
|
+
// A matching call elsewhere cannot certify this operation's ABI.
|
|
1290
|
+
if (closedCallOperations.has(operation))
|
|
1291
|
+
continue;
|
|
1292
|
+
// A native fixed frame cannot inspect trailing arguments it does not
|
|
1293
|
+
// receive. Their evaluation is already represented by preceding IR;
|
|
1294
|
+
// retaining its effects does not publish the resulting values here.
|
|
1295
|
+
for (const value of [operation.callee, operation.receiver, ...receivedCallArguments(operation)])
|
|
1296
|
+
if (value)
|
|
1297
|
+
promoteFull(value.representation, 'unknown-call-boundary');
|
|
1298
|
+
if (operation.result)
|
|
1299
|
+
promoteFull(operation.result.representation, 'unknown-call-result');
|
|
1300
|
+
continue;
|
|
1301
|
+
}
|
|
1302
|
+
if (operation.kind === 'construct' && closedConstructOperations.has(operation))
|
|
1303
|
+
continue;
|
|
1304
|
+
if (operation.kind === 'super-initialize' &&
|
|
1305
|
+
nativeSuperInitializationOf(operation, bodyByOperation.get(operation), classes, (id) => bodyByFunction.get(String(id)), options.conversions) !== null)
|
|
1306
|
+
continue;
|
|
1307
|
+
if (operation.kind === 'construct') {
|
|
1308
|
+
// The fresh object is an output boundary just like an unknown call's
|
|
1309
|
+
// result. It is not listed by operandsOfIrOperation because construct
|
|
1310
|
+
// operands intentionally exclude the result value.
|
|
1311
|
+
promoteFull(operation.result.representation, 'unknown-operation-boundary:construct-result');
|
|
1312
|
+
}
|
|
1313
|
+
if (operation.kind === 'binding-write') {
|
|
1314
|
+
const placement = options.placements?.get(operation.declaration);
|
|
1315
|
+
const local = placement?.storage.kind === 'local' || placement?.storage.kind === 'region';
|
|
1316
|
+
if (!local ||
|
|
1317
|
+
placement?.representation === null ||
|
|
1318
|
+
placement === undefined ||
|
|
1319
|
+
representationKey(placement.representation) !== representationKey(operation.value.representation))
|
|
1320
|
+
promoteFull(operation.value.representation, 'unproven-binding-publication');
|
|
1321
|
+
continue;
|
|
1322
|
+
}
|
|
1323
|
+
if (operation.kind === 'return' && operation.value !== null && typedReturnValues.has(String(operation.value.value)))
|
|
1324
|
+
continue;
|
|
1325
|
+
for (const operand of operandsOfIrOperation(operation))
|
|
1326
|
+
if (objectSurfacesOf(operand.representation).length > 0 ||
|
|
1327
|
+
carriesCallable(operand.representation) ||
|
|
1328
|
+
isDeferredCarrier(operand.representation))
|
|
1329
|
+
promoteFull(operand.representation, `unknown-operation-boundary:${operation.kind}`);
|
|
1330
|
+
// An unknown iterator/await can produce an object independently from its
|
|
1331
|
+
// input's representation. Inventory is not a substitute for this edge.
|
|
1332
|
+
if ((operation.kind === 'iterator-next' || operation.kind === 'await') && operation.result !== null)
|
|
1333
|
+
promoteFull(operation.result.representation, `unknown-operation-result:${operation.kind}`);
|
|
1334
|
+
}
|
|
1335
|
+
currentOperation = null;
|
|
1336
|
+
if (!options.shakeComplete) {
|
|
1337
|
+
for (const representation of options.representations)
|
|
1338
|
+
promoteFull(representation, 'missing-shake-facts');
|
|
1339
|
+
for (const representation of candidates.values())
|
|
1340
|
+
promoteFull(representation, 'missing-shake-facts');
|
|
1341
|
+
}
|
|
1342
|
+
if (reflectionWatch !== undefined)
|
|
1343
|
+
for (const [key, row] of rows)
|
|
1344
|
+
if (key.includes(reflectionWatch))
|
|
1345
|
+
console.error(`[REFLECTION-ROW] ${key} level=${row.level} reasons=${[...row.reasons].join(',')}`);
|
|
1346
|
+
const byRepresentation = new Map();
|
|
1347
|
+
for (const [key, row] of rows)
|
|
1348
|
+
byRepresentation.set(key, Object.freeze({
|
|
1349
|
+
level: row.level,
|
|
1350
|
+
...(unrestricted.has(key) ? {} : { fieldOperations: fieldOperations.get(key) ?? new Map() }),
|
|
1351
|
+
reasons: new Set(row.reasons),
|
|
1352
|
+
representations: new Set(row.representations)
|
|
1353
|
+
}));
|
|
1354
|
+
const classesOut = new Map();
|
|
1355
|
+
const recordsOut = new Map();
|
|
1356
|
+
const joinFields = (left, right) => {
|
|
1357
|
+
if (left.fieldOperations === undefined || right.fieldOperations === undefined)
|
|
1358
|
+
return undefined;
|
|
1359
|
+
const fields = new Map();
|
|
1360
|
+
for (const demand of [left, right])
|
|
1361
|
+
for (const [key, uses] of demand.fieldOperations) {
|
|
1362
|
+
const joined = fields.get(key) ?? new Set();
|
|
1363
|
+
for (const use of uses)
|
|
1364
|
+
joined.add(use);
|
|
1365
|
+
fields.set(key, joined);
|
|
1366
|
+
}
|
|
1367
|
+
return fields;
|
|
1368
|
+
};
|
|
1369
|
+
const join = (left, right) => left === undefined
|
|
1370
|
+
? right
|
|
1371
|
+
: {
|
|
1372
|
+
level: left.level === 'full' || right.level === 'full' ? 'full' : 'keys-only',
|
|
1373
|
+
...(joinFields(left, right) === undefined ? {} : { fieldOperations: joinFields(left, right) }),
|
|
1374
|
+
reasons: new Set([...left.reasons, ...right.reasons]),
|
|
1375
|
+
representations: new Set([...left.representations, ...right.representations])
|
|
1376
|
+
};
|
|
1377
|
+
for (const representation of candidates.values()) {
|
|
1378
|
+
const demand = byRepresentation.get(representationKey(representation));
|
|
1379
|
+
if (!demand)
|
|
1380
|
+
continue;
|
|
1381
|
+
if (representation.kind === 'class-ref')
|
|
1382
|
+
classesOut.set(representation.declaration, join(classesOut.get(representation.declaration), demand));
|
|
1383
|
+
else if (representation.kind === 'record' || representation.kind === 'record-with-index' || representation.kind === 'native-record-ref')
|
|
1384
|
+
recordsOut.set(representation.shapeId, join(recordsOut.get(representation.shapeId), demand));
|
|
1385
|
+
}
|
|
1386
|
+
const exposure = {
|
|
1387
|
+
classes: classesOut,
|
|
1388
|
+
records: recordsOut,
|
|
1389
|
+
byRepresentation,
|
|
1390
|
+
complete: options.shakeComplete,
|
|
1391
|
+
...(options.trace ? { boundaries: { origins, affecting, parents, callableReads } } : {})
|
|
1392
|
+
};
|
|
1393
|
+
return options.physicalClasses ? closePhysicalClassReflection(exposure, options.physicalClasses) : exposure;
|
|
1394
|
+
};
|