@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,671 @@
|
|
|
1
|
+
import { isNativeCallableCarrier, ownershipOfGeneratedCarrier, propertyKeyText } from '../emit-dynamic-properties.js';
|
|
2
|
+
import { intrinsicMemberValueOf } from './emit-host-object.js';
|
|
3
|
+
import { objectShapePrototypeMethods } from '../../../projection/callee.js';
|
|
4
|
+
import { representationKey } from '../../../representation/model.js';
|
|
5
|
+
import { createCppEmitBlockedError, operandText } from '../emit-context.js';
|
|
6
|
+
import { classMemberOf, lazyArrowFieldPlanOf, lazyMaterializedFieldText } from '../class-layout.js';
|
|
7
|
+
import { alignedValueText, widenedStoreText } from '../emit-narrowing.js';
|
|
8
|
+
import { memberAccessOperator } from '../emit-carrier-members.js';
|
|
9
|
+
import { declaredFieldRepresentationOf, enumerationOrdered, recordFieldsOfShape } from '../records.js';
|
|
10
|
+
import { cppRecordFieldAttributesName, cppRecordFieldKeyIsSymbol, cppRecordFieldName, cppRecordFieldPresenceName, cppStringLiteral, cppTypeOf } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* The object primitives every `Object` static is defined in terms of.
|
|
13
|
+
*
|
|
14
|
+
* ECMA-262 does not define ten independent operations. It defines three --
|
|
15
|
+
* `[[OwnPropertyKeys]]` filtered by `[[Enumerable]]`, `Get(o, key)` and
|
|
16
|
+
* `Set(o, key, v)` -- and then writes each static as a loop over them.
|
|
17
|
+
* `Object.assign` is the clearest case (7.3.25 is literally "for each own
|
|
18
|
+
* enumerable key of source: Set(target, key, Get(source, key))"), but
|
|
19
|
+
* `Object.keys`, `values`, `entries`, `hasOwn` and `fromEntries` are the same
|
|
20
|
+
* three in different arrangements, and so are `{...spread}`, rest
|
|
21
|
+
* destructuring, `for...in` and `JSON.stringify` of a plain object.
|
|
22
|
+
*
|
|
23
|
+
* So this file states the three once and `emit-host-object.ts` spells each
|
|
24
|
+
* member as the loop it is. The alternative -- which is what was here before
|
|
25
|
+
* -- is ten renderers that each rediscover the receiver question, agree on the
|
|
26
|
+
* refusal (`refuseObjectCarrier` was already shared) and disagree on
|
|
27
|
+
* everything else: `keys` and `values` grew a static arm, `entries`, `assign`
|
|
28
|
+
* and `defineProperty` refused every known shape outright, and the refusal
|
|
29
|
+
* they printed explained enumeration even when the member was not enumerating
|
|
30
|
+
* anything. `Object.assign(this, opts)` in hono's own constructor refused with
|
|
31
|
+
* "a class instance's own enumerable keys are the fields its constructor
|
|
32
|
+
* actually assigned" -- a true sentence about the SOURCE position, printed for
|
|
33
|
+
* a failure in the TARGET position, where nothing enumerates the class at all.
|
|
34
|
+
*
|
|
35
|
+
* ## The two arms
|
|
36
|
+
*
|
|
37
|
+
* Each primitive has a static arm and a dynamic one, and neither is the
|
|
38
|
+
* other's fallback.
|
|
39
|
+
*
|
|
40
|
+
* The static arm renders against a carrier whose fields the checker knows. The
|
|
41
|
+
* key list is a compile-time constant, `Get` is a struct member read and `Set`
|
|
42
|
+
* is a struct member store -- the loop is unrolled at emission because its
|
|
43
|
+
* bounds are known, which is the same move `Object.values` already made when
|
|
44
|
+
* it emitted a braced `std::vector` rather than a runtime walk.
|
|
45
|
+
*
|
|
46
|
+
* The dynamic arm renders against a value the program itself declared `any`.
|
|
47
|
+
* There the loop belongs to the runtime, because its bounds are only known
|
|
48
|
+
* there, and `gea::host::ObjectConstructor` states each member as one call.
|
|
49
|
+
*
|
|
50
|
+
* ## The third arm, which is not this file's
|
|
51
|
+
*
|
|
52
|
+
* Every struct this backend emits also carries the three primitives as
|
|
53
|
+
* methods: `gea_ownFieldKeys`, `gea_readOwnField` and `gea_writeOwnField`
|
|
54
|
+
* (`records.ts`'s `renderFieldDispatcher`). That is the same three operations
|
|
55
|
+
* for the case where the OBJECT is statically known and the KEY is not, and it
|
|
56
|
+
* shares this file's enumeration order through `enumerationOrdered` so the two
|
|
57
|
+
* cannot answer a different key sequence for one struct. Nothing here calls
|
|
58
|
+
* it: when the key is known too, a direct member access is what the dispatcher
|
|
59
|
+
* would find anyway, without the round trip through `gea::Value` it takes to
|
|
60
|
+
* carry a field past a `PropertyKey`.
|
|
61
|
+
*/
|
|
62
|
+
/** Whether a carrier is the genuine dynamic boundary these renderers walk a real table for. */
|
|
63
|
+
export const isDynamicCarrier = (representation) => representation.kind === 'dynamic';
|
|
64
|
+
export const refuseObjectCarrier = (member, representation, detail) => {
|
|
65
|
+
// `Object.*` renders through this file's own [[OwnPropertyKeys]]/Get/Set
|
|
66
|
+
// primitives, never through the (unreached) `own-property-keys` IR op, so
|
|
67
|
+
// whether a carrier admits one of these statics is a target RULE over the
|
|
68
|
+
// call -- the same shape as Atomics/JSON/Reflect's own `host-member-call`.
|
|
69
|
+
throw createCppEmitBlockedError(`host-member-call:ObjectConstructor.${member}`, `"Object.${member}" of a "${representationKey(representation)}" carrier has no rendering: ${detail}`);
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* A known shape's own field list, whichever way the carrier names it.
|
|
73
|
+
*
|
|
74
|
+
* A `record` carries its fields inline; a `native-record-ref` and a
|
|
75
|
+
* `class-ref` carry a `shapeId` and nothing else (`representation/model.ts`),
|
|
76
|
+
* so their list comes from `recordFieldsOfShape` -- the SAME authority
|
|
77
|
+
* `cppRecordDeclarations` builds the struct body from. That identity is the
|
|
78
|
+
* point: the C++ struct's members and the key list this enumerates have to be
|
|
79
|
+
* one answer, and asking the deriver is what makes them one rather than two
|
|
80
|
+
* that agree today.
|
|
81
|
+
*
|
|
82
|
+
* `native !== null` returns nothing on purpose. A host-stated struct's own
|
|
83
|
+
* enumerable properties are the host's to define -- this compiler emits no
|
|
84
|
+
* definition for it and cannot know whether the C++ members it was told about
|
|
85
|
+
* are the JavaScript object's own keys -- so it refuses rather than reporting
|
|
86
|
+
* a member list as a key list.
|
|
87
|
+
*/
|
|
88
|
+
const knownShapeFieldsOf = (ctx, representation) => {
|
|
89
|
+
if (representation.kind === 'record' || representation.kind === 'record-with-index')
|
|
90
|
+
return representation.fields;
|
|
91
|
+
if (representation.kind === 'class-ref')
|
|
92
|
+
return recordFieldsOfShape(ctx.deriver, representation.shapeId);
|
|
93
|
+
if (representation.kind !== 'native-record-ref' || representation.native !== null)
|
|
94
|
+
return null;
|
|
95
|
+
return recordFieldsOfShape(ctx.deriver, representation.shapeId);
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* The refusal every member shares for a receiver that is neither a known shape
|
|
99
|
+
* nor a declared dynamic value.
|
|
100
|
+
*
|
|
101
|
+
* Stated once so the ten members cannot drift into ten different explanations
|
|
102
|
+
* of the same fact, and phrased as what is missing rather than as what was
|
|
103
|
+
* asked -- a `dictionary` receiver is a gap in the container, not in the call.
|
|
104
|
+
*
|
|
105
|
+
* `position` names which of the call's objects failed, because these members
|
|
106
|
+
* take more than one and a refusal that does not say which is a report nobody
|
|
107
|
+
* can act on: `Object.assign(target, source)` refusing "of a class-ref
|
|
108
|
+
* carrier" left a reader to guess whether the class was the thing being
|
|
109
|
+
* enumerated or the thing being written into, and those have different cures.
|
|
110
|
+
*/
|
|
111
|
+
export const refuseObjectReceiver = (member, representation, position) => {
|
|
112
|
+
const at = position === '' ? '' : ` (the ${position})`;
|
|
113
|
+
// Every `dictionary` -- string-, number- and symbol-keyed alike -- gets a
|
|
114
|
+
// view of its own from `objectViewFrom` and never reaches this function; a
|
|
115
|
+
// member with no arm written for one refuses through `refuseDictionaryArm`
|
|
116
|
+
// instead, which is the "sound but unwritten" channel and not this one.
|
|
117
|
+
if (representation.kind === 'record-with-index') {
|
|
118
|
+
return refuseObjectCarrier(member, representation, `the shape${at} carries named fields AND an index-signature sidecar, so its own keys are two lists that have to be ` +
|
|
119
|
+
'interleaved in one creation order -- which neither half records, and picking either order would be a guess');
|
|
120
|
+
}
|
|
121
|
+
if (representation.kind === 'native-record-ref' && representation.native !== null) {
|
|
122
|
+
return refuseObjectCarrier(member, representation, `the struct${at} is the host's own ("${representation.native}"), so which of its C++ members are the JavaScript ` +
|
|
123
|
+
"object's own enumerable keys is the host's to state and this compiler emits no definition for it");
|
|
124
|
+
}
|
|
125
|
+
if (representation.kind === 'native-record-ref' || representation.kind === 'class-ref') {
|
|
126
|
+
return refuseObjectCarrier(member, representation, `the shape "${representation.shapeId}"${at} derives no record layout, so there is no field list to enumerate -- ` +
|
|
127
|
+
'the carrier it does derive is what says why');
|
|
128
|
+
}
|
|
129
|
+
if (isNativeCallableCarrier(representation.kind)) {
|
|
130
|
+
// A Function object DOES have an own-property table -- its identity's, the
|
|
131
|
+
// one `callableDynamicGet`/`callableDynamicSet` already read and write --
|
|
132
|
+
// so this is `refuseDictionaryArm`'s kind of gap: the carrier can carry the
|
|
133
|
+
// operation and this member's arm for it is missing. Enumerating one is the
|
|
134
|
+
// half nobody has written: `name`, `length` and `prototype` are installed
|
|
135
|
+
// lazily by the runtime rather than being present from the start, so a key
|
|
136
|
+
// list taken off the table today would report a different set depending on
|
|
137
|
+
// what the program had already read.
|
|
138
|
+
return refuseObjectCarrier(member, representation, `a Function object's own properties${at} live in its identity-owned table, which "Object.assign" writes into and this ` +
|
|
139
|
+
'member has no arm for -- enumerating one additionally needs the lazily installed name/length/prototype facts to be ' +
|
|
140
|
+
'materialised first, which nothing here does');
|
|
141
|
+
}
|
|
142
|
+
return refuseObjectCarrier(member, representation, `only a record (whose fields the checker already knows) and a value the program itself declared dynamic have an ` +
|
|
143
|
+
`own-property enumeration; nothing else${at} carries one, and inventing one would answer for a value that has no properties at all`);
|
|
144
|
+
};
|
|
145
|
+
/** The caller supplies the value produced by its certified conversion. */
|
|
146
|
+
export const setOwnCallableText = (receiver, key, value) => `gea::callableDynamicSet(${receiver}, gea::PropertyKey::string(${cppStringLiteral(key)}), ${value});`;
|
|
147
|
+
/**
|
|
148
|
+
* The receiver question, answered once.
|
|
149
|
+
*
|
|
150
|
+
* Every member of this family asks it and none of them may answer it
|
|
151
|
+
* differently, which is the reason this returns a view rather than a boolean:
|
|
152
|
+
* a member that tested `isDynamic` itself and then re-derived the field list
|
|
153
|
+
* is two answers to one question, and that is how `assign` came to refuse a
|
|
154
|
+
* shape `keys` renders.
|
|
155
|
+
*/
|
|
156
|
+
export const objectViewOf = (ctx, member, operand, position) => objectViewFrom(ctx, member, operand.representation, operandText(ctx, operand), position);
|
|
157
|
+
/**
|
|
158
|
+
* The same question asked of a carrier and a spelling rather than an operand,
|
|
159
|
+
* for the one caller that has neither: a TAGGED UNION receiver is enumerated
|
|
160
|
+
* arm by arm (`emit-host-object.ts`'s `overCarrier`), and an arm is a
|
|
161
|
+
* representation plus a `get<N>()` text, never an operand of its own.
|
|
162
|
+
*/
|
|
163
|
+
export const objectViewFrom = (ctx, member, representation, receiver, position) => {
|
|
164
|
+
// `Object.getOwnPropertyDescriptor` (and every other call that mints
|
|
165
|
+
// `T | undefined`) hands its own result STRAIGHT to a later `Object.*`
|
|
166
|
+
// call -- `Object.getOwnPropertyNames(d)`, `hasOwnProperty.call(d, ...)` --
|
|
167
|
+
// with no narrowing in between, since TypeScript's own ambient signatures
|
|
168
|
+
// type the parameter as a bare object and `@ts-nocheck` (or a real type
|
|
169
|
+
// error nobody who writes this pattern actually hits, because the value is
|
|
170
|
+
// never really absent at that call site) suppresses the mismatch. A
|
|
171
|
+
// property ACCESS already unwraps this the same way (`emit-context.ts`'s
|
|
172
|
+
// `assertPresence`); this is that identical deref-or-throw, spelled as one
|
|
173
|
+
// EXPRESSION rather than a statement, because this function hands back a
|
|
174
|
+
// receiver TEXT with no statement list to push into. Recursing after the
|
|
175
|
+
// unwrap means every arm below -- known, dynamic, dictionary -- sees the
|
|
176
|
+
// PAYLOAD's own representation, never the optional wrapper.
|
|
177
|
+
if (representation.kind === 'optional') {
|
|
178
|
+
const payload = representation.payload;
|
|
179
|
+
const unwrapped = `(${receiver}.has_value() ? *${receiver} : gea::host::throwGetPropertyOfNullish<${cppTypeOf(payload)}>())`;
|
|
180
|
+
return objectViewFrom(ctx, member, payload, unwrapped, position);
|
|
181
|
+
}
|
|
182
|
+
if (isDynamicCarrier(representation))
|
|
183
|
+
return { kind: 'dynamic', receiver };
|
|
184
|
+
if (representation.kind === 'dictionary') {
|
|
185
|
+
// Dereferenced here, once: the runtime overloads take the table by
|
|
186
|
+
// reference and a `shared-refcount` dictionary is held behind a `gea::Ref`.
|
|
187
|
+
//
|
|
188
|
+
// A NUMBER-keyed table is admitted here too, alongside string and symbol:
|
|
189
|
+
// `gea::NumericDictionary<V>` stores each entry under its canonical
|
|
190
|
+
// `Number::toString` spelling (`canonicalKey`, gea_runtime.h) the moment it
|
|
191
|
+
// is written, via the SAME spec-correct `gea::host::detail::toString(double)`
|
|
192
|
+
// this backend already uses for template-literal number interpolation --
|
|
193
|
+
// 1e21, -0 and NaN included. So its own keys are exactly as sound to
|
|
194
|
+
// enumerate as a string-keyed table's; there is no unrenderable spelling
|
|
195
|
+
// left to refuse. What each MEMBER still needs is its own runtime overload
|
|
196
|
+
// over `NumericDictionary<V>` (`ownEnumerableKeysText`/`valuesOfView`/
|
|
197
|
+
// `entriesOfView` below) -- a member with none yet refuses through
|
|
198
|
+
// `refuseDictionaryArm`, the "sound but unwritten" channel, rather than
|
|
199
|
+
// through this file no longer being able to see the table at all.
|
|
200
|
+
const table = memberAccessOperator(representation.ownership) === '->' ? `(*${receiver})` : receiver;
|
|
201
|
+
return { kind: 'dictionary', representation, receiver: table, value: representation.value };
|
|
202
|
+
}
|
|
203
|
+
const fields = knownShapeFieldsOf(ctx, representation);
|
|
204
|
+
if (fields === null)
|
|
205
|
+
return refuseObjectReceiver(member, representation, position);
|
|
206
|
+
// Ownership rather than carrier kind decides `.` against `->`: the three
|
|
207
|
+
// kinds `knownShapeFieldsOf` admits are all struct members, and only how the
|
|
208
|
+
// struct is held differs between them.
|
|
209
|
+
return { kind: 'known', representation, fields, receiver, accessor: memberAccessOperator(ownershipOfGeneratedCarrier(representation)) };
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* The refusal for a member that HAS a sound dictionary rendering nobody has
|
|
213
|
+
* written yet, stated by name.
|
|
214
|
+
*
|
|
215
|
+
* Kept apart from `refuseObjectReceiver` for the reason this file's header
|
|
216
|
+
* gives about `freeze` and `defineProperty`: "this carrier cannot be
|
|
217
|
+
* enumerated" and "this carrier can, and this member's arm for it is missing"
|
|
218
|
+
* are different facts with different cures, and reporting the second as the
|
|
219
|
+
* first sends a reader to the wrong one.
|
|
220
|
+
*/
|
|
221
|
+
export const refuseDictionaryArm = (member, view, detail) => refuseObjectCarrier(member, view.representation, `the receiver is a dictionary, whose own keys this backend CAN enumerate -- ${detail}`);
|
|
222
|
+
/** The C++ that names one field of a known view, with no unwrapping of any kind. */
|
|
223
|
+
const fieldText = (view, field) => `${view.receiver}${view.accessor}${cppRecordFieldName(field.key)}`;
|
|
224
|
+
/**
|
|
225
|
+
* PRIMITIVE 1a -- `[[Enumerable]]`: whether this field is an own key at all,
|
|
226
|
+
* as C++ that answers at run time, or `null` when it statically is one.
|
|
227
|
+
*
|
|
228
|
+
* A field the declaration makes OPTIONAL is not statically present: `{ a: 1 }`
|
|
229
|
+
* typed `{ a: number; b?: number }` has one own key, not two, and treating a
|
|
230
|
+
* fixed list of both as the key set would report a property that is not there.
|
|
231
|
+
* So an optional field answers from the independent presence bit emitted next
|
|
232
|
+
* to its value. This remains exact for `undefined`, `null`, and dynamic value
|
|
233
|
+
* carriers because none of those values doubles as property absence.
|
|
234
|
+
*/
|
|
235
|
+
export const ownKeyPresenceText = (member, view, field) => {
|
|
236
|
+
void member;
|
|
237
|
+
// A required TypeScript member starts present, but is still an ordinary
|
|
238
|
+
// configurable data property until its descriptor says otherwise. Every
|
|
239
|
+
// generated fixed field consequently has a physical bit; returning `null`
|
|
240
|
+
// here would make a deleted required key reappear in Object.keys/hasOwn.
|
|
241
|
+
return `${view.receiver}${view.accessor}${cppRecordFieldPresenceName(field.key)}`;
|
|
242
|
+
};
|
|
243
|
+
/**
|
|
244
|
+
* PRIMITIVE 1 -- `[[OwnPropertyKeys]]`, filtered to own enumerable string keys.
|
|
245
|
+
*
|
|
246
|
+
* ECMA-262 10.1.11.1 order, from the same authority the emitted struct's own
|
|
247
|
+
* `gea_ownFieldKeys` uses (`enumerationOrdered`) -- two lists of one object's
|
|
248
|
+
* own keys that could disagree is exactly the shape this compiler keeps
|
|
249
|
+
* finding. A view whose fields are all statically present renders as a flat
|
|
250
|
+
* constant; one with an optional field renders as the push loop, with the
|
|
251
|
+
* optionals IN PLACE rather than appended after the required ones, since a
|
|
252
|
+
* present optional occupies its own creation position.
|
|
253
|
+
*/
|
|
254
|
+
/** A known view's fields in enumeration order -- the one place that order is decided, so a member's keys and its values cannot disagree about it. */
|
|
255
|
+
export const ownKeyFields = (view) => enumerationOrdered(view.fields, (field) => field.key);
|
|
256
|
+
export const ownEnumerableKeysText = (member, view, dynamicCall) => {
|
|
257
|
+
if (view.kind === 'dynamic')
|
|
258
|
+
return `gea::host::ObjectConstructor::${dynamicCall}(${view.receiver})`;
|
|
259
|
+
// `keys` (7.3.23) and `getOwnPropertyNames` (10.1.11) are two calls over a
|
|
260
|
+
// dictionary, and were one until the table could hold a non-enumerable key.
|
|
261
|
+
// Their whole difference IS such a key, so while `Object.defineProperty` on
|
|
262
|
+
// a dictionary could not retain one the two sequences were identical and
|
|
263
|
+
// this arm answered both with the enumerable list -- correct then, and a
|
|
264
|
+
// silently short `getOwnPropertyNames` the moment a table has one. Every
|
|
265
|
+
// other carrier in `keysText` already splits on the member for this reason.
|
|
266
|
+
if (view.kind === 'dictionary') {
|
|
267
|
+
// Object.keys/getOwnPropertyNames are string-only. A SymbolDictionary has
|
|
268
|
+
// real own keys, but none in this projection; returning an empty native
|
|
269
|
+
// array preserves them for symbol-aware operations instead of converting
|
|
270
|
+
// their descriptions into strings.
|
|
271
|
+
if (view.representation.key === 'symbol')
|
|
272
|
+
return 'gea::host::ObjectConstructor::staticKeys({})';
|
|
273
|
+
return `gea::host::ObjectConstructor::${member === 'keys' ? 'keysOf' : 'ownPropertyNamesOf'}(${view.receiver})`;
|
|
274
|
+
}
|
|
275
|
+
const ownership = ownershipOfGeneratedCarrier(view.representation);
|
|
276
|
+
// Every generated shared object can acquire own properties through a
|
|
277
|
+
// dynamic view. The runtime owns the complete enumeration because it joins
|
|
278
|
+
// the struct dispatcher with that object's identity-keyed expando table;
|
|
279
|
+
// emitting only the compile-time field list would make Object.keys disagree
|
|
280
|
+
// with the reads and writes that already use the same sidecar.
|
|
281
|
+
if (ownership === 'shared-refcount') {
|
|
282
|
+
if (member === 'getOwnPropertyNames') {
|
|
283
|
+
// This is intentionally a runtime-owned merge: generated slots and the
|
|
284
|
+
// identity sidecar must be globally ordered before symbols are filtered.
|
|
285
|
+
return `gea::host::ObjectConstructor::staticKeys(gea::nativeOwnPropertyNames(${view.receiver}))`;
|
|
286
|
+
}
|
|
287
|
+
return `gea::host::ObjectConstructor::staticKeys(gea::nativeDynamicKeys(${view.receiver}))`;
|
|
288
|
+
}
|
|
289
|
+
const ordered = ownKeyFields(view);
|
|
290
|
+
const presences = ordered.map((field) => {
|
|
291
|
+
const present = ownKeyPresenceText(member, view, field);
|
|
292
|
+
const enumerable = `${view.receiver}${view.accessor}${cppRecordFieldAttributesName(field.key)}.enumerable`;
|
|
293
|
+
return { field, presence: present === null ? enumerable : `(${present} && ${enumerable})` };
|
|
294
|
+
});
|
|
295
|
+
const pushes = presences.map(({ field, presence }) => {
|
|
296
|
+
const literal = cppStringLiteral(field.key);
|
|
297
|
+
const push = `__gea_keys.push_back(${literal});`;
|
|
298
|
+
return `if (${presence}) ${push}`;
|
|
299
|
+
});
|
|
300
|
+
return `([&]() { std::vector<std::string> __gea_keys; ${pushes.join(' ')} return gea::host::ObjectConstructor::staticKeys(__gea_keys); })()`;
|
|
301
|
+
};
|
|
302
|
+
/**
|
|
303
|
+
* PRIMITIVE 2 -- `Get(o, key)` for one own key of a known view.
|
|
304
|
+
*
|
|
305
|
+
* Presence is stored separately, so the field's value carrier comes through
|
|
306
|
+
* unchanged. In particular, a present `undefined` stays `undefined`; it is not
|
|
307
|
+
* unwrapped or confused with the missing-key state.
|
|
308
|
+
*
|
|
309
|
+
* There is no dynamic arm. A per-key get on a value the runtime owns is a
|
|
310
|
+
* `gea::runtime::object::get` call, and no member here needs one: the dynamic
|
|
311
|
+
* arm of every member in this family expresses its whole loop as a single
|
|
312
|
+
* runtime call, so the iteration and the get stay on the same side.
|
|
313
|
+
*/
|
|
314
|
+
export const getOwnValue = (ctx, view, field) => {
|
|
315
|
+
const raw = fieldText(view, field);
|
|
316
|
+
// A qualifying arrow-function class field's storage starts empty
|
|
317
|
+
// (`class-layout.ts`'s `censusLazyArrowFields`) until something reads it.
|
|
318
|
+
// `emit-properties.ts`'s ordinary property `get` is the choke point for a
|
|
319
|
+
// normal access, but this function is the SAME choke point for every
|
|
320
|
+
// `Object.*` static built out of it (`values`, `entries`, `assign`, spread,
|
|
321
|
+
// `getOwnPropertyDescriptor`'s literal-key arm) -- each of those reads this
|
|
322
|
+
// field's CURRENT value too, through this door instead, and would otherwise
|
|
323
|
+
// hand back the empty sentinel a fresh instance starts with rather than the
|
|
324
|
+
// real callable. `classMemberOf`'s owner is the DECLARING class, exactly as
|
|
325
|
+
// `emit-properties.ts`'s own version of this lookup requires for an
|
|
326
|
+
// inherited field.
|
|
327
|
+
const site = view.representation.kind === 'class-ref' ? classMemberOf(ctx.classes, view.representation.declaration, field.key) : null;
|
|
328
|
+
const plan = site?.kind === 'field' ? lazyArrowFieldPlanOf(ctx.classes, site.owner, field.key) : null;
|
|
329
|
+
const text = plan === null ? raw : lazyMaterializedFieldText(view.receiver, view.accessor, field.key, plan);
|
|
330
|
+
return { text, representation: field.value };
|
|
331
|
+
};
|
|
332
|
+
/**
|
|
333
|
+
* Why a known target has no home for a key, in the target's own terms.
|
|
334
|
+
*
|
|
335
|
+
* A class says more about this than a record can: `classMemberOf` distinguishes
|
|
336
|
+
* a key that resolves to an accessor (real storage exists, behind a call this
|
|
337
|
+
* does not make), a method (on the prototype, never an own property), a class
|
|
338
|
+
* whose members nothing published (a gap upstream, not a missing property) and
|
|
339
|
+
* a key the chain genuinely does not declare. Collapsing those into one
|
|
340
|
+
* "no such field" would send three different defects to the same wrong cure.
|
|
341
|
+
*/
|
|
342
|
+
const missingTargetKeyDetail = (ctx, view, key) => {
|
|
343
|
+
if (view.representation.kind !== 'class-ref') {
|
|
344
|
+
return (`the target declares no field "${key}", and ECMAScript's Set would CREATE an own property there -- a struct ` +
|
|
345
|
+
'whose members are fixed at compile time has nowhere to put one, which is what a dynamic-property sidecar exists for');
|
|
346
|
+
}
|
|
347
|
+
const site = classMemberOf(ctx.classes, view.representation.declaration, key);
|
|
348
|
+
if (site === null) {
|
|
349
|
+
return (`class ${view.representation.declaration} declares no "${key}" anywhere on its chain, and ECMAScript's Set ` +
|
|
350
|
+
'would CREATE an own property there -- which a fixed-layout struct can only answer through a dynamic-property sidecar');
|
|
351
|
+
}
|
|
352
|
+
if (site.kind === 'accessor') {
|
|
353
|
+
return (`"${key}" is an accessor on class ${site.owner}, so writing it is a CALL rather than a store, and this renderer ` +
|
|
354
|
+
'states the store only -- routing it through the setter is a real feature and not this one');
|
|
355
|
+
}
|
|
356
|
+
if (site.kind === 'method') {
|
|
357
|
+
return (`"${key}" is a method on class ${site.owner}'s prototype, which is not an own property of the instance at all, ` +
|
|
358
|
+
'so a store into it would install a shadowing own field the language never had');
|
|
359
|
+
}
|
|
360
|
+
return (`class ${site.owner} published no members, so whether it declares "${key}" is unknown here -- the gap is in what ` +
|
|
361
|
+
'reached this stage, not in the program');
|
|
362
|
+
};
|
|
363
|
+
/**
|
|
364
|
+
* PRIMITIVE 3 -- `Set(o, key, v)` into one own key of a known view.
|
|
365
|
+
*
|
|
366
|
+
* The store's own carrier comes from `declaredFieldRepresentationOf`, the one
|
|
367
|
+
* authority `emitFieldStore` and `emitFieldInits` already ask, so this cannot
|
|
368
|
+
* become a second opinion about what a field holds; and the value is
|
|
369
|
+
* reconciled against it through `convertedValueText`, the same one an ordinary
|
|
370
|
+
* store uses. A pair with no installed conversion refuses by naming both
|
|
371
|
+
* carriers rather than assigning across and leaving clang to reject it.
|
|
372
|
+
*
|
|
373
|
+
* There is no dynamic arm here either, and for the same reason as `Get`.
|
|
374
|
+
*/
|
|
375
|
+
export const setOwnText = (ctx, member, view, key, value) => {
|
|
376
|
+
const held = declaredFieldRepresentationOf(ctx.deriver, view.representation, key, ctx.classes);
|
|
377
|
+
if (held === null) {
|
|
378
|
+
const ownership = ownershipOfGeneratedCarrier(view.representation);
|
|
379
|
+
if (ownership === 'shared-refcount') {
|
|
380
|
+
const boxed = widenedStoreText({ kind: 'dynamic', reason: 'declared-any-never-narrowed' }, value.representation, value.text);
|
|
381
|
+
if (boxed !== null) {
|
|
382
|
+
return `gea::nativeDynamicSet(${view.receiver}, gea::PropertyKey::string(${cppStringLiteral(key)}), ${boxed});`;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
throw createCppEmitBlockedError(`property-access:${representationKey(view.representation)}:set:false`, `"Object.${member}" cannot store "${key}": ${missingTargetKeyDetail(ctx, view, key)}`);
|
|
386
|
+
}
|
|
387
|
+
const converted = alignedValueText(ctx, 'host/object-protocol.ts:468', value.representation, held, value.text);
|
|
388
|
+
if (converted === null) {
|
|
389
|
+
throw createCppEmitBlockedError(`conversion:${representationKey(value.representation)}->${representationKey(held)}`, `"Object.${member}" would store a "${representationKey(value.representation)}" into the field "${key}", which is held ` +
|
|
390
|
+
`as "${representationKey(held)}", and no installed conversion performs that -- the two carriers are a disagreement ` +
|
|
391
|
+
'upstream of this call, not something a store may paper over');
|
|
392
|
+
}
|
|
393
|
+
const write = `${view.receiver}${view.accessor}${cppRecordFieldName(key)} = ${converted};`;
|
|
394
|
+
const field = view.fields.find((candidate) => candidate.key === key);
|
|
395
|
+
const writes = field ? `${write} ${view.receiver}${view.accessor}${cppRecordFieldPresenceName(key)} = true;` : write;
|
|
396
|
+
const ownership = ownershipOfGeneratedCarrier(view.representation);
|
|
397
|
+
if (ownership !== 'shared-refcount')
|
|
398
|
+
return writes;
|
|
399
|
+
const present = field === undefined ? 'false' : `${view.receiver}${view.accessor}${cppRecordFieldPresenceName(key)}`;
|
|
400
|
+
const writable = field === undefined ? 'false' : `${view.receiver}${view.accessor}${cppRecordFieldAttributesName(key)}.writable`;
|
|
401
|
+
return `if ((${present} ? (${writable} && gea::nativeOwnFieldsWritable(${view.receiver})) : gea::nativeIsExtensible(${view.receiver}))) { ${writes} }`;
|
|
402
|
+
};
|
|
403
|
+
/**
|
|
404
|
+
* `hasOwnProperty`/`propertyIsEnumerable` reached as INSTANCE methods off a
|
|
405
|
+
* known-shape receiver (`record`/`native-record-ref`/`class-ref`) -- the
|
|
406
|
+
* method-call spelling of the identical question `Object.hasOwn` already
|
|
407
|
+
* answers off the same layout (`hasOwnText` above).
|
|
408
|
+
*
|
|
409
|
+
* Left unclaimed, the checker still resolves `{ a: 1 }.hasOwnProperty` (every
|
|
410
|
+
* object type structurally carries `Object.prototype`), and the record's own
|
|
411
|
+
* field list has no member of that name -- so the generic dynamic-property
|
|
412
|
+
* sidecar (`emit-dynamic-properties.ts`'s `nativeSidecarGetText`) answered it
|
|
413
|
+
* instead, BOXING a statically known fact into a `gea::Value`-carried
|
|
414
|
+
* `CallableObject` purely to call it once. That is the forbidden shortcut the
|
|
415
|
+
* "no boxing" rule names: the record's own layout is a typed fact, and it has
|
|
416
|
+
* no business inside a box just because the member that reads it is an
|
|
417
|
+
* ambient `Object.prototype` declaration rather than one the record's own
|
|
418
|
+
* shape states.
|
|
419
|
+
*
|
|
420
|
+
* Deferred exactly the way `dictionaryPrototypeMemberRead`
|
|
421
|
+
* (`emit-carrier-members.ts`) defers `hasOwnProperty` off a dictionary: the
|
|
422
|
+
* GET renders nothing, and the CALL that follows fuses receiver, key and
|
|
423
|
+
* field list into one expression (`objectShapeCallText` below).
|
|
424
|
+
*
|
|
425
|
+
* The set itself lives in `projection/callee.ts`: the slot census's
|
|
426
|
+
* `calleeRenderingOf` states the identical claim (a call through one of
|
|
427
|
+
* these names renders from a template, not `Object.prototype`'s declared
|
|
428
|
+
* convention) so the two do not drift into a printer that claims one set of
|
|
429
|
+
* calls and a census that converts arguments for a different one.
|
|
430
|
+
*/
|
|
431
|
+
/**
|
|
432
|
+
* The claim, asked at the `[[Get]]`.
|
|
433
|
+
*
|
|
434
|
+
* Gated on the receiver representation BEFORE `objectViewFrom` is ever asked:
|
|
435
|
+
* that function THROWS for a receiver it cannot enumerate (a `dictionary`
|
|
436
|
+
* already has its own claim; a `dynamic` receiver is a genuine boundary whose
|
|
437
|
+
* `hasOwnProperty` really does need the runtime table), and this claim must
|
|
438
|
+
* answer `false` for those rather than refuse a program this file was never
|
|
439
|
+
* meant to gate.
|
|
440
|
+
*/
|
|
441
|
+
/**
|
|
442
|
+
* Whether a known-shape receiver's `hasOwnProperty`/`propertyIsEnumerable` is
|
|
443
|
+
* a deferred `Object.prototype` read, and what the call needs from it.
|
|
444
|
+
*
|
|
445
|
+
* Stated once; the renderer below and the prototype-read walk both ask it.
|
|
446
|
+
* `objectViewFrom` is the authority for what a known shape's fields and member
|
|
447
|
+
* accessor are, so it is asked here rather than re-derived -- with an empty
|
|
448
|
+
* receiver TEXT, because the `known` arm's `fields` and `accessor` do not
|
|
449
|
+
* depend on it and the receiver is spelled at the call from the operand this
|
|
450
|
+
* record carries.
|
|
451
|
+
*/
|
|
452
|
+
export const deferredObjectShapeMethodClaim = (ctx, operation) => {
|
|
453
|
+
const staticKey = ctx.staticKeyTexts.get(operation.key.value);
|
|
454
|
+
if (staticKey === undefined || !objectShapePrototypeMethods.has(staticKey))
|
|
455
|
+
return null;
|
|
456
|
+
const representation = operation.receiver.representation;
|
|
457
|
+
const known = representation.kind === 'record' ||
|
|
458
|
+
representation.kind === 'class-ref' ||
|
|
459
|
+
(representation.kind === 'native-record-ref' && representation.native === null);
|
|
460
|
+
if (!known)
|
|
461
|
+
return null;
|
|
462
|
+
const view = objectViewFrom(ctx, staticKey, representation, '', 'receiver');
|
|
463
|
+
if (view.kind !== 'known')
|
|
464
|
+
return null;
|
|
465
|
+
return {
|
|
466
|
+
receiverKind: 'object-shape',
|
|
467
|
+
member: staticKey,
|
|
468
|
+
receiver: { kind: 'operand', operand: operation.receiver },
|
|
469
|
+
receiverElement: null,
|
|
470
|
+
objectShapeFields: view.fields,
|
|
471
|
+
objectShapeAccessor: view.accessor
|
|
472
|
+
};
|
|
473
|
+
};
|
|
474
|
+
export const objectShapePrototypeMemberRead = (ctx, operation) => {
|
|
475
|
+
return deferredObjectShapeMethodClaim(ctx, operation) !== null;
|
|
476
|
+
};
|
|
477
|
+
/**
|
|
478
|
+
* The presence text `hasOwnText`'s own `ownKeyPresenceText` renders, spelled
|
|
479
|
+
* without an `ObjectView`: the call site only carries the fields and accessor
|
|
480
|
+
* `objectShapePrototypeMemberRead` snapshotted at the read, not the receiver's
|
|
481
|
+
* full representation the view type demands.
|
|
482
|
+
*/
|
|
483
|
+
const shapeKeyPresenceText = (receiver, accessor, field, member) => {
|
|
484
|
+
const present = `${receiver}${accessor}${cppRecordFieldPresenceName(field.key)}`;
|
|
485
|
+
return member === 'propertyIsEnumerable'
|
|
486
|
+
? `(${present} && ${receiver}${accessor}${cppRecordFieldAttributesName(field.key)}.enumerable)`
|
|
487
|
+
: present;
|
|
488
|
+
};
|
|
489
|
+
/**
|
|
490
|
+
* The call text for a deferred `hasOwnProperty`/`propertyIsEnumerable` read.
|
|
491
|
+
*
|
|
492
|
+
* A literal key answers at compile time, exactly as `Object.hasOwn` does for
|
|
493
|
+
* one. A key only known at runtime dispatches over the SAME finite field set
|
|
494
|
+
* a static receiver's own computed key already switches over
|
|
495
|
+
* (`emit-dynamic-properties.ts`'s `constructorFamilyComputedGetText` is the
|
|
496
|
+
* reference for the shape): every field the layout declares gets one `if`
|
|
497
|
+
* arm, and a key naming none of them is not an own property. Only a string
|
|
498
|
+
* key is admitted -- ToPropertyKey of anything else is a question `hasOwnText`
|
|
499
|
+
* above refuses too, and a record's fields are never symbol- or number-keyed.
|
|
500
|
+
*
|
|
501
|
+
* Presence and enumerability are separate native metadata. defineProperty
|
|
502
|
+
* can make a present fixed field non-enumerable without moving its value to
|
|
503
|
+
* a dynamic sidecar; the query must read that stored attribute too.
|
|
504
|
+
*/
|
|
505
|
+
export const objectShapeCallText = (ctx, member, receiver, accessor, fields, args) => {
|
|
506
|
+
const key = args[0];
|
|
507
|
+
if (key === undefined) {
|
|
508
|
+
throw createCppEmitBlockedError(`host-member-call:Object.prototype.${member}`, `"Object.prototype.${member}" was called with no key`);
|
|
509
|
+
}
|
|
510
|
+
// A claim, not a fold: this decides whether the answer is the compile-time
|
|
511
|
+
// constant below or the runtime switch further down, so it must not see a
|
|
512
|
+
// key text `constantTexts` only holds because the render minted it (e.g. a
|
|
513
|
+
// folded `typeof` result reaching here as the tested key).
|
|
514
|
+
const spelled = ctx.staticKeyTexts.get(key.value);
|
|
515
|
+
if (spelled !== undefined) {
|
|
516
|
+
const field = fields.find((candidate) => candidate.key === spelled);
|
|
517
|
+
return field === undefined ? 'false' : shapeKeyPresenceText(receiver, accessor, field, member);
|
|
518
|
+
}
|
|
519
|
+
if (key.representation.kind === 'symbol') {
|
|
520
|
+
// The identical declared-field dispatch `records.ts`'s field dispatcher
|
|
521
|
+
// uses for a computed `obj[k]` read: a program's own `unique symbol`
|
|
522
|
+
// binding is not a compile-time text (`spelled` above only catches a
|
|
523
|
+
// COMPUTED KEY the checker resolved at normalize time,
|
|
524
|
+
// `properties.ts`'s `keyOf`/`symbolMemberKeyOf` -- an ordinary CALL
|
|
525
|
+
// ARGUMENT such as `p.hasOwnProperty(keyA)` is never one), so a
|
|
526
|
+
// symbol-keyed field is matched by the id its cell registered
|
|
527
|
+
// (`gea::detail::registerDeclaredSymbol`) rather than by name.
|
|
528
|
+
const symbolFields = fields.filter((field) => cppRecordFieldKeyIsSymbol(field.key));
|
|
529
|
+
if (symbolFields.length > 0) {
|
|
530
|
+
const keyText = propertyKeyText(ctx, key, `an "Object.prototype.${member}" call`);
|
|
531
|
+
const arms = symbolFields
|
|
532
|
+
.map((field) => `if (__gea_key.symbolId() == gea::detail::declaredSymbolId(${cppStringLiteral(field.key)})) return ` +
|
|
533
|
+
`${shapeKeyPresenceText(receiver, accessor, field, member)};`)
|
|
534
|
+
.join(' ');
|
|
535
|
+
return `([&]() -> bool { const gea::PropertyKey __gea_key = ${keyText}; ${arms} return false; })()`;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
if (key.representation.kind !== 'string') {
|
|
539
|
+
throw createCppEmitBlockedError(`host-member-call:Object.prototype.${member}`, `"Object.prototype.${member}" received a key carried as "${representationKey(key.representation)}" rather than a ` +
|
|
540
|
+
'string, and ToPropertyKey of anything else runs ToPrimitive, which this backend does not perform');
|
|
541
|
+
}
|
|
542
|
+
if (fields.length === 0)
|
|
543
|
+
return 'false';
|
|
544
|
+
const runtimeKey = operandText(ctx, key);
|
|
545
|
+
const arms = fields
|
|
546
|
+
.map((field) => `if (__gea_key == ${cppStringLiteral(field.key)}) return ${shapeKeyPresenceText(receiver, accessor, field, member)};`)
|
|
547
|
+
.join(' ');
|
|
548
|
+
return `([&]() -> bool { const std::string& __gea_key = ${runtimeKey}; ${arms} return false; })()`;
|
|
549
|
+
};
|
|
550
|
+
/**
|
|
551
|
+
* `hasOwnProperty`/`propertyIsEnumerable` off a `native-handle` receiver
|
|
552
|
+
* (`Math.hasOwnProperty(...)`, or `Object.prototype.hasOwnProperty.call(Math,
|
|
553
|
+
* ...)` after the borrowed-call rewrite), for the SAME finite own-member list
|
|
554
|
+
* `getOwnPropertyDescriptorText`'s native-handle arm reads
|
|
555
|
+
* (`ctx.hosts.intrinsicMembers`) -- see that table's own comment for where it
|
|
556
|
+
* comes from and why it is never hand-listed here.
|
|
557
|
+
*
|
|
558
|
+
* `propertyIsEnumerable` needs no key at all: ECMA-262 specifies every own
|
|
559
|
+
* member of a host intrinsic non-enumerable, whether it is a data constant
|
|
560
|
+
* (21.3.1) or a builtin method (10.2.4) -- so the honest answer is `false`
|
|
561
|
+
* unconditionally, the same fact `emitNativeHandleEnumerateIterator`
|
|
562
|
+
* (`emit-iterator.ts`) already renders as an always-empty `for`-`in` walk.
|
|
563
|
+
* Asking `hasOwnProperty` first and `false` never matters because
|
|
564
|
+
* `propertyIsEnumerable` of an ABSENT key is `false` too -- one constant
|
|
565
|
+
* covers both cases of ECMA-262 20.1.3.7's own two-step definition.
|
|
566
|
+
*
|
|
567
|
+
* `hasOwnProperty` is real membership: a literal key folds against the list
|
|
568
|
+
* at compile time, and a runtime key becomes a switch over it, mirroring
|
|
569
|
+
* `objectShapeCallText`'s own two arms for a record receiver.
|
|
570
|
+
*/
|
|
571
|
+
/**
|
|
572
|
+
* `fn.hasOwnProperty(k)` / `fn.propertyIsEnumerable(k)`: the callable's own
|
|
573
|
+
* properties are its one shared function-object table, with the `name`/
|
|
574
|
+
* `length` facts installed first so both answer for them (10.2.10: present,
|
|
575
|
+
* non-enumerable) exactly as `callableDynamicGet` sees them.
|
|
576
|
+
*/
|
|
577
|
+
export const callableShapeCallText = (ctx, member, receiver, args) => {
|
|
578
|
+
const key = args[0];
|
|
579
|
+
if (key === undefined) {
|
|
580
|
+
throw createCppEmitBlockedError(`host-member-call:Object.prototype.${member}`, `"Object.prototype.${member}" was called with no key`);
|
|
581
|
+
}
|
|
582
|
+
const site = `"Object.prototype.${member}" of a callable`;
|
|
583
|
+
const test = member === 'propertyIsEnumerable' ? '__gea_own != nullptr && __gea_own->enumerable' : '__gea_own != nullptr';
|
|
584
|
+
return (`([&]() -> bool { const auto& __gea_callable = ${receiver}; ` +
|
|
585
|
+
'gea::installCallableOwnFacts(__gea_callable.functionObjectIdentity(), __gea_callable.name(), __gea_callable.length()); ' +
|
|
586
|
+
`const gea::PropertyDescriptor* __gea_own = __gea_callable.functionObjectIdentity()->properties->ownProperty(${propertyKeyText(ctx, key, site)}); ` +
|
|
587
|
+
`return ${test}; })()`);
|
|
588
|
+
};
|
|
589
|
+
export const nativeHandleShapeCallText = (ctx, member, protocol, args) => {
|
|
590
|
+
if (member === 'propertyIsEnumerable')
|
|
591
|
+
return 'false';
|
|
592
|
+
const members = ctx.hosts.intrinsicMembers.get(protocol) ?? [];
|
|
593
|
+
const key = args[0];
|
|
594
|
+
if (key === undefined) {
|
|
595
|
+
throw createCppEmitBlockedError(`host-member-call:Object.prototype.${member}`, `"Object.prototype.${member}" was called with no key`);
|
|
596
|
+
}
|
|
597
|
+
const site = `"Object.prototype.${member}" of a host intrinsic`;
|
|
598
|
+
// A claim, not a fold: this decides whether a non-configurable member folds
|
|
599
|
+
// to a compile-time constant below or falls through to the sidecar dispatch,
|
|
600
|
+
// so it must not see a key text `constantTexts` only holds because the
|
|
601
|
+
// render minted it (e.g. a folded `typeof` result reaching here as the key).
|
|
602
|
+
const spelled = ctx.staticKeyTexts.get(key.value);
|
|
603
|
+
const named = spelled === undefined ? undefined : members.find((candidate) => candidate.name === spelled);
|
|
604
|
+
// A non-configurable member can neither be deleted nor overridden, so its
|
|
605
|
+
// membership is a compile-time fact. Every other key -- a configurable
|
|
606
|
+
// member, or a name the table lacks -- is answered by the intrinsic's
|
|
607
|
+
// dynamic-property sidecar first (`hostIntrinsicSidecar`, gea_runtime.h):
|
|
608
|
+
// test262's `isConfigurable` deletes the member and then asks exactly this
|
|
609
|
+
// question, and an answer read off the static table alone would say the
|
|
610
|
+
// deleted member is still there.
|
|
611
|
+
if (named !== undefined && !intrinsicMemberValueOf(ctx, protocol, named, site).configurable)
|
|
612
|
+
return 'true';
|
|
613
|
+
if (members.length === 0)
|
|
614
|
+
return 'false';
|
|
615
|
+
const arms = members.map((candidate) => `__gea_name == ${cppStringLiteral(candidate.name)}`).join(' || ');
|
|
616
|
+
return (`([&]() -> bool { const gea::PropertyKey __gea_key = ${propertyKeyText(ctx, key, site)}; ` +
|
|
617
|
+
`auto& __gea_side = gea::detail::hostIntrinsicSidecar(${cppStringLiteral(protocol)}); ` +
|
|
618
|
+
`if (__gea_side.hasOverride(__gea_key)) return true; if (__gea_side.isRemoved(__gea_key)) return false; ` +
|
|
619
|
+
`if (__gea_key.isSymbol()) return false; const std::string& __gea_name = __gea_key.text(); return ${arms}; })()`);
|
|
620
|
+
};
|
|
621
|
+
/**
|
|
622
|
+
* `hasOwnProperty` off a receiver the program itself declared dynamic (a
|
|
623
|
+
* `--dynamic-fallback` boxed value carrying a real `gea::DynamicObject`).
|
|
624
|
+
*
|
|
625
|
+
* `objectShapePrototypeMemberRead` above deliberately answers `false` for one
|
|
626
|
+
* of these (`known` excludes `'dynamic'`) rather than claim it, and its own
|
|
627
|
+
* comment says why: "a `dynamic` receiver is a genuine boundary whose
|
|
628
|
+
* `hasOwnProperty` really does need the runtime table". This is that table --
|
|
629
|
+
* `gea::runtime::object::hasOwnProperty` (gea_runtime.h) already implements
|
|
630
|
+
* 20.1.3.7's OWN-half-only membership test for an arbitrary `gea::Value`
|
|
631
|
+
* receiver, generically, for any key. Left unclaimed, this member falls
|
|
632
|
+
* through to `dynamicGetText` (`emit-dynamic-properties.ts`), which reads
|
|
633
|
+
* "hasOwnProperty" as an ordinary property THROUGH the object's real
|
|
634
|
+
* `[[Prototype]]` chain -- correct for a program-defined member, but wrong
|
|
635
|
+
* for this one, because this runtime never links a `DynamicObject` to an
|
|
636
|
+
* `Object.prototype` analogue: the chain a user constructor builds
|
|
637
|
+
* (`instance` -> `Ctor.prototype` -> `null`) has no entry that could ever
|
|
638
|
+
* answer an ambient `Object.prototype` method, so the read comes back
|
|
639
|
+
* `undefined` and calling it aborts.
|
|
640
|
+
*
|
|
641
|
+
* `propertyIsEnumerable` is deliberately left unclaimed here: nothing in this
|
|
642
|
+
* file states which `PropertyDescriptor.enumerable` bit a THIRD idiom
|
|
643
|
+
* (`Object.prototype.propertyIsEnumerable.call(...)`) should read against a
|
|
644
|
+
* `DynamicObject`, and no probe in this codebase exercises it yet -- adding
|
|
645
|
+
* it un-exercised would be a guess, not an answer.
|
|
646
|
+
*/
|
|
647
|
+
export const dynamicObjectPrototypeMethods = new Set(['hasOwnProperty']);
|
|
648
|
+
/** The claim, asked at the `[[Get]]` -- the dynamic-receiver twin of `objectShapePrototypeMemberRead` above. */
|
|
649
|
+
export const deferredDynamicObjectMethodClaim = (staticKeyTexts, receiver, key) => {
|
|
650
|
+
const staticKey = staticKeyTexts.get(key.value);
|
|
651
|
+
if (staticKey === undefined || !dynamicObjectPrototypeMethods.has(staticKey))
|
|
652
|
+
return null;
|
|
653
|
+
if (receiver.representation.kind !== 'dynamic')
|
|
654
|
+
return null;
|
|
655
|
+
return { receiverKind: 'dynamic-object', member: staticKey, receiver: { kind: 'operand', operand: receiver }, receiverElement: null };
|
|
656
|
+
};
|
|
657
|
+
export const dynamicObjectPrototypeMemberRead = (ctx, operation) => deferredDynamicObjectMethodClaim(ctx.staticKeyTexts, operation.receiver, operation.key) !== null;
|
|
658
|
+
/**
|
|
659
|
+
* The call text for a deferred `hasOwnProperty` read off a dynamic receiver.
|
|
660
|
+
*
|
|
661
|
+
* Only a string key is admitted, for the identical reason `objectShapeCallText`
|
|
662
|
+
* and `nativeHandleShapeCallText` above refuse anything else: ToPropertyKey of
|
|
663
|
+
* a non-string runs ToPrimitive, which this backend does not perform.
|
|
664
|
+
*/
|
|
665
|
+
export const dynamicObjectCallText = (ctx, member, receiver, args) => {
|
|
666
|
+
const key = args[0];
|
|
667
|
+
if (key === undefined) {
|
|
668
|
+
throw createCppEmitBlockedError(`host-member-call:Object.prototype.${member}`, `"Object.prototype.${member}" was called with no key`);
|
|
669
|
+
}
|
|
670
|
+
return `gea::runtime::object::hasOwnProperty(${receiver}, ${propertyKeyText(ctx, key, `"Object.prototype.${member}" of a dynamic receiver`)})`;
|
|
671
|
+
};
|