@scriptc/compiler 0.4.6 → 0.4.7
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/ambient/node-fallback/events.d.ts +6 -1
- package/ambient/node-fallback/fs-promises.d.ts +1 -1
- package/ambient/node-fallback/fs.d.ts +54 -10
- package/ambient/node-fallback/http.d.ts +3 -1
- package/ambient/node-fallback/net.d.ts +19 -0
- package/ambient/node-fallback/querystring.d.ts +3 -3
- package/ambient/scriptc-node-fallback.d.ts +58 -13
- package/dist/backend/executable-features.js +13 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +12 -1
- package/dist/backend/immutability.js +50 -4
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/immutability.test.js +95 -1
- package/dist/backend/immutability.test.js.map +1 -1
- package/dist/backend/library-pack.js +2 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/linker.d.ts +11 -0
- package/dist/backend/linker.js +31 -3
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/lld.d.ts +7 -2
- package/dist/backend/lld.js +5 -3
- package/dist/backend/lld.js.map +1 -1
- package/dist/backend/lld.test.js +10 -4
- package/dist/backend/lld.test.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +50 -1
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/cpu-dispatch.js +6 -5
- package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +53 -1
- package/dist/backend/llvm/dyn.js +221 -9
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +1 -1
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-module.js +148 -50
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.js +39 -19
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +29 -2
- package/dist/backend/llvm/emitter.js +86 -7
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +4 -1
- package/dist/backend/llvm/expr-calls.js +20 -4
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +209 -16
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +94 -11
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
- package/dist/backend/llvm/expr-stream-bridges.js +42 -2
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +16 -0
- package/dist/backend/llvm/expr-stream-callbacks.js +206 -20
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/integer-values.d.ts +2 -0
- package/dist/backend/llvm/integer-values.js +6 -0
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +38 -0
- package/dist/backend/llvm/js-ic.js +295 -1
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +20 -0
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +116 -11
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +136 -24
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +70 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +67 -0
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/loop-entry-versions.d.ts +2 -2
- package/dist/backend/llvm/loop-entry-versions.js +43 -21
- package/dist/backend/llvm/loop-entry-versions.js.map +1 -1
- package/dist/backend/llvm/loop-state.d.ts +7 -1
- package/dist/backend/llvm/loop-state.js +20 -2
- package/dist/backend/llvm/loop-state.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +3 -1
- package/dist/backend/llvm/map-number-lookup.js +7 -3
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +52 -11
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/receiver-brackets.test.d.ts +1 -0
- package/dist/backend/llvm/receiver-brackets.test.js +68 -0
- package/dist/backend/llvm/receiver-brackets.test.js.map +1 -0
- package/dist/backend/llvm/record-views.d.ts +22 -2
- package/dist/backend/llvm/record-views.js +139 -10
- package/dist/backend/llvm/record-views.js.map +1 -1
- package/dist/backend/llvm/record-views.test.js +76 -0
- package/dist/backend/llvm/record-views.test.js.map +1 -1
- package/dist/backend/llvm/reference-writes.js +1 -0
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +3 -0
- package/dist/backend/llvm/shapes.js +18 -3
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +4 -0
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +10 -1
- package/dist/backend/llvm/speculative-integers.js +59 -8
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/unwind-abi.d.ts +3 -3
- package/dist/backend/llvm/unwind-abi.js +8 -3
- package/dist/backend/llvm/unwind-abi.js.map +1 -1
- package/dist/backend/llvm/walkers.js +1 -1
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +54 -0
- package/dist/backend/native/executable.js +87 -5
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +1 -1
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.js +5 -1
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native/vendor.d.ts +1 -1
- package/dist/backend/native/vendor.js +1 -1
- package/dist/backend/native/vendor.js.map +1 -1
- package/dist/backend/native-codegen.js +3 -0
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +43 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-link-info.js +1 -0
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-profile.d.ts +4 -1
- package/dist/backend/native-profile.js +12 -1
- package/dist/backend/native-profile.js.map +1 -1
- package/dist/backend/native-profile.test.js +10 -0
- package/dist/backend/native-profile.test.js.map +1 -1
- package/dist/backend/publication.d.ts +4 -1
- package/dist/backend/publication.js +4 -2
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +31 -7
- package/dist/backend/runtime-pack-core.js +21 -1
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.d.ts +18 -1
- package/dist/backend/runtime-pack-native.js +138 -29
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-native.test.js +166 -4
- package/dist/backend/runtime-pack-native.test.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +3 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +7 -0
- package/dist/backend/runtime-pack.js +25 -3
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +3 -11
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/vendor-archives.d.ts +4 -1
- package/dist/backend/vendor-archives.js +264 -3
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +36 -0
- package/dist/backend/vendor-inputs.js +42 -0
- package/dist/backend/vendor-inputs.js.map +1 -1
- package/dist/backend/vendor-inputs.test.js +28 -1
- package/dist/backend/vendor-inputs.test.js.map +1 -1
- package/dist/backend/warm-cache.js +2 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/compat/fetch-profile.d.ts +7 -1
- package/dist/compat/fetch-profile.js +23 -10
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +7 -0
- package/dist/contracts/check.d.ts +3 -0
- package/dist/contracts/check.js +18 -5
- package/dist/contracts/check.js.map +1 -1
- package/dist/coverage/surface-manifest.js +1 -1
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/codes.d.ts +6 -0
- package/dist/diagnostics/codes.js +6 -0
- package/dist/diagnostics/codes.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +50 -0
- package/dist/diagnostics/diagnostic.js +142 -3
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/dynamic-tier.js +3 -1
- package/dist/diagnostics/dynamic-tier.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +29 -0
- package/dist/executable/executable-cache.js +18 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +5 -1
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.d.ts +13 -3
- package/dist/executable/prepare.js +271 -18
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/early-errors.d.ts +14 -0
- package/dist/frontend/early-errors.js +305 -0
- package/dist/frontend/early-errors.js.map +1 -0
- package/dist/frontend/early-errors.test.d.ts +1 -0
- package/dist/frontend/early-errors.test.js +42 -0
- package/dist/frontend/early-errors.test.js.map +1 -0
- package/dist/frontend/inferred-js-diagnostics.test.js +23 -0
- package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +47 -0
- package/dist/frontend/input-tracker.js +173 -36
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +86 -2
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/js-inference.d.ts +2 -0
- package/dist/frontend/js-inference.js +18 -0
- package/dist/frontend/js-inference.js.map +1 -0
- package/dist/frontend/lowering/binding-analysis.d.ts +2 -1
- package/dist/frontend/lowering/binding-analysis.js +65 -1
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtin-calls.js +9 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtin-namespaces.d.ts +1 -1
- package/dist/frontend/lowering/builtin-namespaces.js +19 -2
- package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.d.ts +7 -0
- package/dist/frontend/lowering/builtins/child-process-methods.js +50 -10
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.js +5 -1
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.d.ts +1 -1
- package/dist/frontend/lowering/builtins/dates.js +23 -1
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/environment.d.ts +55 -0
- package/dist/frontend/lowering/builtins/environment.js +213 -2
- package/dist/frontend/lowering/builtins/environment.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +47 -16
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.d.ts +25 -7
- package/dist/frontend/lowering/builtins/filesystem.js +185 -16
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +39 -2
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-resolution.d.ts +8 -0
- package/dist/frontend/lowering/builtins/module-resolution.js +31 -5
- package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.d.ts +3 -2
- package/dist/frontend/lowering/builtins/operating-system.js +5 -4
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +17 -1
- package/dist/frontend/lowering/builtins/process.js +285 -19
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/querystring.d.ts +8 -0
- package/dist/frontend/lowering/builtins/querystring.js +202 -18
- package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.js +21 -3
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/reflection.js +60 -1
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +208 -59
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +20 -1
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/v8.d.ts +5 -5
- package/dist/frontend/lowering/builtins/v8.js +7 -5
- package/dist/frontend/lowering/builtins/v8.js.map +1 -1
- package/dist/frontend/lowering/builtins/web-streams-dyn.d.ts +17 -2
- package/dist/frontend/lowering/builtins/web-streams-dyn.js +97 -9
- package/dist/frontend/lowering/builtins/web-streams-dyn.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +77 -0
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.d.ts +3 -0
- package/dist/frontend/lowering/cjs-exports-object.js +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
- package/dist/frontend/lowering/cjs-inline-require.js +5 -0
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +5 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +114 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.js +59 -10
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.js +15 -0
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-views.d.ts +13 -0
- package/dist/frontend/lowering/class-views.js +51 -0
- package/dist/frontend/lowering/class-views.js.map +1 -0
- package/dist/frontend/lowering/coercions/function-adapters.d.ts +15 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +54 -10
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/state.d.ts +7 -0
- package/dist/frontend/lowering/coercions/state.js +7 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +60 -3
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +29 -1
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +132 -28
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +16 -5
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +16 -0
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +4 -0
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.d.ts +11 -0
- package/dist/frontend/lowering/containers/callback-arguments.js +53 -0
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/filter-predicates.d.ts +10 -0
- package/dist/frontend/lowering/containers/filter-predicates.js +69 -3
- package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +46 -2
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.d.ts +14 -0
- package/dist/frontend/lowering/expressions/array-literals.js +26 -10
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +104 -12
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +121 -4
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +143 -3
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +11 -1
- package/dist/frontend/lowering/expressions/keyed-field-targets.js +22 -1
- package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +25 -1
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +5 -1
- package/dist/frontend/lowering/expressions/object-literals.js +778 -229
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +66 -20
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +31 -0
- package/dist/frontend/lowering/expressions/property-access.js +796 -12
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +29 -1
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +17 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +132 -17
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.d.ts +6 -0
- package/dist/frontend/lowering/frozen-records.js +10 -4
- package/dist/frontend/lowering/frozen-records.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.test.d.ts +1 -0
- package/dist/frontend/lowering/frozen-records.test.js +44 -0
- package/dist/frontend/lowering/frozen-records.test.js.map +1 -0
- package/dist/frontend/lowering/function-names.d.ts +9 -0
- package/dist/frontend/lowering/function-names.js +95 -0
- package/dist/frontend/lowering/function-names.js.map +1 -0
- package/dist/frontend/lowering/function-returns.js +5 -3
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +49 -0
- package/dist/frontend/lowering/generic-functions.js +365 -7
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/global-values.d.ts +9 -0
- package/dist/frontend/lowering/global-values.js +44 -0
- package/dist/frontend/lowering/global-values.js.map +1 -1
- package/dist/frontend/lowering/handle-properties.js +34 -1
- package/dist/frontend/lowering/handle-properties.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +54 -0
- package/dist/frontend/lowering/key-order-witness.js +546 -5
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.js +14 -0
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +110 -1
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.d.ts +36 -6
- package/dist/frontend/lowering/lower-builtin-values.js +332 -58
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +22 -1
- package/dist/frontend/lowering/lower-calls.js +427 -48
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-calls.test.js +78 -0
- package/dist/frontend/lowering/lower-calls.test.js.map +1 -0
- package/dist/frontend/lowering/lower-classes.d.ts +16 -5
- package/dist/frontend/lowering/lower-classes.js +168 -51
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +9 -0
- package/dist/frontend/lowering/lower-event-emitter.js +383 -41
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +14 -0
- package/dist/frontend/lowering/lower-exprs.js +25 -0
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +2 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +80 -33
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +87 -25
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-node-island.d.ts +35 -4
- package/dist/frontend/lowering/lower-node-island.js +456 -61
- package/dist/frontend/lowering/lower-node-island.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +160 -9
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-shared-modules.js +13 -1
- package/dist/frontend/lowering/lower-shared-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +3 -2
- package/dist/frontend/lowering/lower-stdlib.js +32 -18
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +21 -4
- package/dist/frontend/lowering/lower-stmts.js +580 -103
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +126 -8
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +133 -21
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +139 -3
- package/dist/frontend/lowering/lowerer.js +579 -43
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +1 -1
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.js +15 -0
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/new-target.js +2 -2
- package/dist/frontend/lowering/nullish-empty-pattern.d.ts +17 -0
- package/dist/frontend/lowering/nullish-empty-pattern.js +118 -0
- package/dist/frontend/lowering/nullish-empty-pattern.js.map +1 -0
- package/dist/frontend/lowering/partial-assertions.d.ts +39 -0
- package/dist/frontend/lowering/partial-assertions.js +195 -0
- package/dist/frontend/lowering/partial-assertions.js.map +1 -0
- package/dist/frontend/lowering/primitive-wrappers.d.ts +34 -0
- package/dist/frontend/lowering/primitive-wrappers.js +220 -0
- package/dist/frontend/lowering/primitive-wrappers.js.map +1 -0
- package/dist/frontend/lowering/private-statics.d.ts +46 -0
- package/dist/frontend/lowering/private-statics.js +322 -0
- package/dist/frontend/lowering/private-statics.js.map +1 -0
- package/dist/frontend/lowering/record-sources.d.ts +12 -1
- package/dist/frontend/lowering/record-sources.js +60 -0
- package/dist/frontend/lowering/record-sources.js.map +1 -1
- package/dist/frontend/lowering/strict-equality.d.ts +4 -0
- package/dist/frontend/lowering/strict-equality.js +14 -0
- package/dist/frontend/lowering/strict-equality.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +27 -0
- package/dist/frontend/lowering/surfaces.js +135 -62
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/unit-journal.d.ts +128 -17
- package/dist/frontend/lowering/unit-journal.js +310 -53
- package/dist/frontend/lowering/unit-journal.js.map +1 -1
- package/dist/frontend/lowering/unit-journal.test.js +91 -3
- package/dist/frontend/lowering/unit-journal.test.js.map +1 -1
- package/dist/frontend/lowering/unit-reuse.d.ts +92 -0
- package/dist/frontend/lowering/unit-reuse.js +1008 -0
- package/dist/frontend/lowering/unit-reuse.js.map +1 -0
- package/dist/frontend/lowering/width-lift.d.ts +12 -0
- package/dist/frontend/npm-file-import.test.d.ts +1 -0
- package/dist/frontend/npm-file-import.test.js +76 -0
- package/dist/frontend/npm-file-import.test.js.map +1 -0
- package/dist/frontend/npm-static.js +17 -2
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.d.ts +9 -0
- package/dist/frontend/npm.js +82 -0
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/pipeline-native.js +2 -1
- package/dist/frontend/pipeline-native.js.map +1 -1
- package/dist/frontend/pipeline.d.ts +4 -0
- package/dist/frontend/pipeline.js +68 -7
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program-node.d.ts +3 -0
- package/dist/frontend/program-node.js +13 -6
- package/dist/frontend/program-node.js.map +1 -1
- package/dist/frontend/program.d.ts +9 -0
- package/dist/frontend/program.js +159 -7
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/provenance-core.js +4 -0
- package/dist/frontend/provenance-core.js.map +1 -1
- package/dist/frontend/services.d.ts +14 -0
- package/dist/frontend/services.js +52 -2
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/services.test.js +61 -1
- package/dist/frontend/services.test.js.map +1 -1
- package/dist/frontend/shape-inference/analyze.d.ts +5 -0
- package/dist/frontend/shape-inference/analyze.js +104 -4
- package/dist/frontend/shape-inference/analyze.js.map +1 -1
- package/dist/frontend/shape-inference/domain.js +0 -1
- package/dist/frontend/shape-inference/domain.js.map +1 -1
- package/dist/frontend/shape-inference/index.js +5 -1
- package/dist/frontend/shape-inference/index.js.map +1 -1
- package/dist/frontend/shape-inference/memo.d.ts +2 -1
- package/dist/frontend/shape-inference/memo.js +6 -2
- package/dist/frontend/shape-inference/memo.js.map +1 -1
- package/dist/frontend/shape-inference/overlay.d.ts +1 -1
- package/dist/frontend/shape-inference/overlay.js +116 -2
- package/dist/frontend/shape-inference/overlay.js.map +1 -1
- package/dist/frontend/shape-inference/static-objects.js +11 -6
- package/dist/frontend/shape-inference/static-objects.js.map +1 -1
- package/dist/frontend/source-phase-imports.test.d.ts +1 -0
- package/dist/frontend/source-phase-imports.test.js +37 -0
- package/dist/frontend/source-phase-imports.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +6 -1
- package/dist/frontend/ts7/ast-node.js +12 -0
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-wire-protocols.test.js +11 -3
- package/dist/frontend/ts7/ast-wire-protocols.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.js +3 -5
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +13 -0
- package/dist/frontend/ts7/checker-backend.js +84 -2
- package/dist/frontend/ts7/checker-backend.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.test.js +126 -2
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +22 -1
- package/dist/frontend/ts7/program-host.js +49 -4
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/program-host.test.js +83 -0
- package/dist/frontend/ts7/program-host.test.js.map +1 -1
- package/dist/frontend/ts7/rpc-process.d.ts +16 -1
- package/dist/frontend/ts7/rpc-process.js +170 -92
- package/dist/frontend/ts7/rpc-process.js.map +1 -1
- package/dist/frontend/ts7/rpc-process.test.js +49 -21
- package/dist/frontend/ts7/rpc-process.test.js.map +1 -1
- package/dist/frontend/tsc-codes.js +70 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +7 -2
- package/dist/frontend/type-mapper.js +148 -1
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +152 -8
- package/dist/index.js.map +1 -1
- package/dist/ir/api.d.ts +1 -1
- package/dist/ir/api.js +1 -1
- package/dist/ir/api.js.map +1 -1
- package/dist/ir/build.d.ts +3 -2
- package/dist/ir/build.js +4 -2
- package/dist/ir/build.js.map +1 -1
- package/dist/ir/builtin-effects.js +53 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +211 -10
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/codec.d.ts +82 -0
- package/dist/ir/codec.generated.d.ts +13 -0
- package/dist/ir/codec.generated.js +5274 -0
- package/dist/ir/codec.generated.js.map +1 -0
- package/dist/ir/codec.js +325 -0
- package/dist/ir/codec.js.map +1 -0
- package/dist/ir/codec.test.d.ts +1 -0
- package/dist/ir/codec.test.js +225 -0
- package/dist/ir/codec.test.js.map +1 -0
- package/dist/ir/fields.generated.d.ts +20 -10
- package/dist/ir/fields.generated.js +1031 -11
- package/dist/ir/fields.generated.js.map +1 -1
- package/dist/ir/fields.test.js +46 -2
- package/dist/ir/fields.test.js.map +1 -1
- package/dist/ir/function-references.d.ts +5 -4
- package/dist/ir/function-references.js +8 -4
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +7 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/inline-array-sources.js +4 -1
- package/dist/ir/inline-array-sources.js.map +1 -1
- package/dist/ir/inline-array-views.d.ts +13 -0
- package/dist/ir/inline-array-views.js +944 -0
- package/dist/ir/inline-array-views.js.map +1 -0
- package/dist/ir/inline-arrays.d.ts +7 -0
- package/dist/ir/inline-arrays.js +190 -55
- package/dist/ir/inline-arrays.js.map +1 -1
- package/dist/ir/inline-arrays.test.js +140 -2
- package/dist/ir/inline-arrays.test.js.map +1 -1
- package/dist/ir/integer-ranges.js +16 -6
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/ir.d.ts +75 -44
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/js-ic.d.ts +10 -9
- package/dist/ir/js-ic.js +28 -20
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +10 -2
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/jsval.js +374 -63
- package/dist/ir/jsval.js.map +1 -1
- package/dist/ir/jsval.test.js +96 -2
- package/dist/ir/jsval.test.js.map +1 -1
- package/dist/ir/loop-entry-ranges.js +112 -9
- package/dist/ir/loop-entry-ranges.js.map +1 -1
- package/dist/ir/loop-entry-ranges.test.js +40 -0
- package/dist/ir/loop-entry-ranges.test.js.map +1 -1
- package/dist/ir/parameter-versions.d.ts +2 -1
- package/dist/ir/parameter-versions.js +3 -1
- package/dist/ir/parameter-versions.js.map +1 -1
- package/dist/ir/receiver-readers.js +58 -2
- package/dist/ir/receiver-readers.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +60 -1
- package/dist/ir/runtime-features.js +277 -2
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/runtime-features.test.js +165 -1
- package/dist/ir/runtime-features.test.js.map +1 -1
- package/dist/ir/saturating-loop-jams.d.ts +8 -1
- package/dist/ir/saturating-loop-jams.js +46 -7
- package/dist/ir/saturating-loop-jams.js.map +1 -1
- package/dist/ir/saturating-loop-jams.test.js +39 -1
- package/dist/ir/saturating-loop-jams.test.js.map +1 -1
- package/dist/ir/self-captures.js +8 -1
- package/dist/ir/self-captures.js.map +1 -1
- package/dist/ir/self-captures.test.js +15 -0
- package/dist/ir/self-captures.test.js.map +1 -1
- package/dist/ir/serialize.d.ts +3 -2
- package/dist/ir/serialize.js +6 -2
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/validate.js +82 -4
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +46 -0
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/ir-policy.js +3 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/cache.js +2 -0
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cli.js +2 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +8 -2
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/prepare.js +32 -3
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.js +53 -3
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +88 -2
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/toolchain.js +9 -2
- package/dist/native/toolchain.js.map +1 -1
- package/dist/node-islands/boundary.d.ts +25 -1
- package/dist/node-islands/boundary.js +28 -2
- package/dist/node-islands/boundary.js.map +1 -1
- package/dist/node-islands/detect.d.ts +18 -1
- package/dist/node-islands/detect.js +365 -40
- package/dist/node-islands/detect.js.map +1 -1
- package/dist/node-islands/detect.test.js +151 -4
- package/dist/node-islands/detect.test.js.map +1 -1
- package/dist/node-islands/effect-gate.js +30 -20
- package/dist/node-islands/effect-gate.js.map +1 -1
- package/dist/node-islands/effect-gate.test.js +4 -1
- package/dist/node-islands/effect-gate.test.js.map +1 -1
- package/dist/node-islands/libnode.d.ts +1 -1
- package/dist/node-islands/libnode.js +1 -1
- package/dist/node-islands/libnode.js.map +1 -1
- package/dist/node-islands/modules.d.ts +28 -0
- package/dist/node-islands/modules.js +156 -0
- package/dist/node-islands/modules.js.map +1 -1
- package/dist/node-islands/modules.test.js +105 -1
- package/dist/node-islands/modules.test.js.map +1 -1
- package/dist/node-islands/policy.js +2 -3
- package/dist/node-islands/policy.js.map +1 -1
- package/dist/node-islands/probe-recorder.d.ts +1 -0
- package/dist/node-islands/probe-recorder.js +596 -0
- package/dist/node-islands/probe-recorder.js.map +1 -0
- package/dist/node-islands/probe-recorder.test.d.ts +1 -0
- package/dist/node-islands/probe-recorder.test.js +80 -0
- package/dist/node-islands/probe-recorder.test.js.map +1 -0
- package/dist/node-islands/report.test.js +2 -0
- package/dist/node-islands/report.test.js.map +1 -1
- package/dist/node-islands/rules.js +4 -0
- package/dist/node-islands/rules.js.map +1 -1
- package/dist/node-islands/scan.d.ts +7 -1
- package/dist/node-islands/scan.js +51 -2
- package/dist/node-islands/scan.js.map +1 -1
- package/dist/node-islands/snapshot.d.ts +38 -1
- package/dist/node-islands/snapshot.js +165 -161
- package/dist/node-islands/snapshot.js.map +1 -1
- package/dist/node-islands/snapshot.test.js +63 -2
- package/dist/node-islands/snapshot.test.js.map +1 -1
- package/dist/node-islands/summary.js +8 -0
- package/dist/node-islands/summary.js.map +1 -1
- package/dist/node-islands/type-strip.d.ts +11 -0
- package/dist/node-islands/type-strip.js +157 -0
- package/dist/node-islands/type-strip.js.map +1 -0
- package/dist/node-islands/type-strip.test.d.ts +1 -0
- package/dist/node-islands/type-strip.test.js +31 -0
- package/dist/node-islands/type-strip.test.js.map +1 -0
- package/dist/project-config.d.ts +4 -0
- package/dist/project-config.js +19 -0
- package/dist/project-config.js.map +1 -1
- package/dist/project-config.test.js +10 -0
- package/dist/project-config.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +43 -11
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/* Primitive wrapper objects (`new String(s)`, `new Number(n)`, `new
|
|
2
|
+
* Boolean(b)`, `Object(primitive)`) in JavaScript sources. A wrapper is an
|
|
3
|
+
* ordinary dynamic object (scr_js_wrapper.c): its prototype is the
|
|
4
|
+
* wrapper unit's String/Number/Boolean prototype object, whose valueOf,
|
|
5
|
+
* toString and methods read the [[PrimitiveValue]] slot, and a String
|
|
6
|
+
* wrapper owns its index properties and `length`. Every generic dynamic
|
|
7
|
+
* operation (ToPrimitive, property reads, method calls, key listing,
|
|
8
|
+
* identity, typeof) already handles that shape; this module builds the
|
|
9
|
+
* values and routes the few consumers that must see the slot itself. */
|
|
10
|
+
import * as ts from "../ts7/adapter.js";
|
|
11
|
+
import { BOOL, DYN, F64, STRING, } from "../../ir/ir.js";
|
|
12
|
+
import { transformStmtList } from "../../ir/traverse.js";
|
|
13
|
+
import { isJsSourceFile, locOf } from "../program.js";
|
|
14
|
+
import { primitiveCtorClosure } from "./lower-exprs.js";
|
|
15
|
+
/** The runtime's kind numbers (scr_js_wrapper.c SCR_JS_WRAPPER_*). */
|
|
16
|
+
export const WRAPPER_KIND_NUMBER = {
|
|
17
|
+
String: 0,
|
|
18
|
+
Number: 1,
|
|
19
|
+
Boolean: 2,
|
|
20
|
+
};
|
|
21
|
+
/** Whether any compiled source creates a primitive wrapper: a `new` of the
|
|
22
|
+
* stdlib String, Number or Boolean constructor (with or without an
|
|
23
|
+
* argument: `new String()` is a wrapper over "", `new Number()` over 0 and
|
|
24
|
+
* `new Boolean()` over false), or a call of the stdlib Object with an
|
|
25
|
+
* argument. `new Object()` without one is a fresh plain object, so it is
|
|
26
|
+
* not a wrapper. Until a program has one, no value is a wrapper, so the
|
|
27
|
+
* boxed interface types keep their primitive mapping and every fold that
|
|
28
|
+
* relies on it stays. */
|
|
29
|
+
export function programCreatesWrappers(lowerer) {
|
|
30
|
+
for (const sf of lowerer.program.getSourceFiles()) {
|
|
31
|
+
if (sf.isDeclarationFile || !isJsSourceFile(sf))
|
|
32
|
+
continue;
|
|
33
|
+
const text = sf.text;
|
|
34
|
+
if (!text.includes("String") &&
|
|
35
|
+
!text.includes("Number") &&
|
|
36
|
+
!text.includes("Boolean") &&
|
|
37
|
+
!text.includes("Object"))
|
|
38
|
+
continue;
|
|
39
|
+
let found = false;
|
|
40
|
+
const visit = (node) => {
|
|
41
|
+
if (found)
|
|
42
|
+
return;
|
|
43
|
+
if ((ts.isNewExpression(node) || ts.isCallExpression(node)) &&
|
|
44
|
+
ts.isIdentifier(node.expression)) {
|
|
45
|
+
const name = node.expression.text;
|
|
46
|
+
// A `new` of a boxed constructor is a wrapper even without an
|
|
47
|
+
// argument; Object is a wrapper site only when it converts a value.
|
|
48
|
+
const wrapperNew = ts.isNewExpression(node) &&
|
|
49
|
+
(name === "String" || name === "Number" || name === "Boolean");
|
|
50
|
+
const toObject = name === "Object" && (node.arguments?.nodes.length ?? 0) > 0;
|
|
51
|
+
if ((wrapperNew || toObject) && lowerer.isStdlibGlobal(node.expression, name)) {
|
|
52
|
+
found = true;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
ts.forEachChild(node, visit);
|
|
57
|
+
};
|
|
58
|
+
visit(sf);
|
|
59
|
+
if (found)
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
/** `new String(x)` / `new Number(x)` / `new Boolean(x)` in a JavaScript
|
|
65
|
+
* source: the wrapper over ToString/ToNumber/ToBoolean of the argument
|
|
66
|
+
* (the runtime converts, with the object hooks), or over "", 0, false
|
|
67
|
+
* without one. Null outside JavaScript sources and for other callees. */
|
|
68
|
+
export function lowerWrapperNew(lowerer, expr) {
|
|
69
|
+
if (!isJsSourceFile(ts.getSourceFileOfNode(expr)))
|
|
70
|
+
return null;
|
|
71
|
+
if (!ts.isIdentifier(expr.expression))
|
|
72
|
+
return null;
|
|
73
|
+
const kind = expr.expression.text;
|
|
74
|
+
if (kind !== "String" && kind !== "Number" && kind !== "Boolean")
|
|
75
|
+
return null;
|
|
76
|
+
if (!lowerer.isStdlibGlobal(expr.expression, kind))
|
|
77
|
+
return null;
|
|
78
|
+
const args = expr.arguments?.nodes ?? [];
|
|
79
|
+
if (args.some(ts.isSpreadElement))
|
|
80
|
+
return null;
|
|
81
|
+
const loc = locOf(expr);
|
|
82
|
+
// Arguments past the first are evaluated and ignored.
|
|
83
|
+
const value = args.length > 0
|
|
84
|
+
? lowerer.lowerExprExpecting(args[0], DYN)
|
|
85
|
+
: lowerer.coerceToExpected(kind === "String"
|
|
86
|
+
? { kind: "strLit", value: "", type: STRING, loc }
|
|
87
|
+
: kind === "Number"
|
|
88
|
+
? { kind: "numLit", value: 0, type: F64, loc }
|
|
89
|
+
: { kind: "boolLit", value: false, type: BOOL, loc }, DYN);
|
|
90
|
+
const rest = args.slice(1).map((arg) => ({
|
|
91
|
+
kind: "exprStmt",
|
|
92
|
+
expr: lowerer.lowerExpr(arg),
|
|
93
|
+
loc: locOf(arg),
|
|
94
|
+
}));
|
|
95
|
+
const created = {
|
|
96
|
+
kind: "libCall",
|
|
97
|
+
fn: "wrapper.new",
|
|
98
|
+
args: [
|
|
99
|
+
{ kind: "numLit", value: WRAPPER_KIND_NUMBER[kind], type: F64, loc },
|
|
100
|
+
value,
|
|
101
|
+
...wrapperConstructors(lowerer, loc),
|
|
102
|
+
],
|
|
103
|
+
type: DYN,
|
|
104
|
+
loc,
|
|
105
|
+
};
|
|
106
|
+
if (rest.length === 0)
|
|
107
|
+
return created;
|
|
108
|
+
const local = lowerer.declareHiddenLocal("%wrapperArg", DYN);
|
|
109
|
+
return {
|
|
110
|
+
kind: "seqExpr",
|
|
111
|
+
stmts: [{ kind: "varDecl", localId: local.id, init: value, loc }, ...rest],
|
|
112
|
+
result: {
|
|
113
|
+
...created,
|
|
114
|
+
args: [
|
|
115
|
+
created.args[0],
|
|
116
|
+
{ kind: "varRef", localId: local.id, type: DYN, loc },
|
|
117
|
+
...created.args.slice(2),
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
type: DYN,
|
|
121
|
+
loc,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/** The String, Number and Boolean constructor values, for the prototypes'
|
|
125
|
+
* `constructor` property (the interned closures `x === String` compares). */
|
|
126
|
+
export function wrapperConstructors(lowerer, loc) {
|
|
127
|
+
return ["String", "Number", "Boolean"].map((name) => lowerer.coerceToExpected(primitiveCtorClosure(lowerer, name, loc, true), DYN));
|
|
128
|
+
}
|
|
129
|
+
/** Consumers that walk a dynamic value's whole graph and must see the
|
|
130
|
+
* [[PrimitiveValue]] slot (JSON's unwrapping, util.inspect's `[String:
|
|
131
|
+
* 'x']`, structuredClone's wrapper clone, deep equality's primitive
|
|
132
|
+
* compare). Until they know the slot, a wrapper reaching one refuses: each
|
|
133
|
+
* dynamic argument passes through wrapper.guard, which throws the
|
|
134
|
+
* not-supported Error when the value's own data graph holds a wrapper. */
|
|
135
|
+
const GUARDED_CONSUMERS = new Set([
|
|
136
|
+
"json.stringifyValue",
|
|
137
|
+
"json.stringifyReplacer",
|
|
138
|
+
"util.isDeepStrictEqual",
|
|
139
|
+
"dyn.structuredClone",
|
|
140
|
+
"assert.looseDeepDyn",
|
|
141
|
+
"assert.partialDeepDyn",
|
|
142
|
+
"console.dirDyn",
|
|
143
|
+
"insp.format",
|
|
144
|
+
"insp.formatPrimitives",
|
|
145
|
+
"insp.formatList",
|
|
146
|
+
"insp.formatWithOptions",
|
|
147
|
+
"insp.inspect",
|
|
148
|
+
"insp.dynS",
|
|
149
|
+
"insp.dynFormatS",
|
|
150
|
+
]);
|
|
151
|
+
/** util.types brands that read the [[PrimitiveValue]] slot. */
|
|
152
|
+
const WRAPPER_TYPE_PROBES = new Set([
|
|
153
|
+
"isStringObject",
|
|
154
|
+
"isNumberObject",
|
|
155
|
+
"isBooleanObject",
|
|
156
|
+
"isBoxedPrimitive",
|
|
157
|
+
]);
|
|
158
|
+
/** The consumer as the refusal names it. */
|
|
159
|
+
function consumerName(fn) {
|
|
160
|
+
if (fn.startsWith("json."))
|
|
161
|
+
return "JSON.stringify";
|
|
162
|
+
if (fn === "dyn.structuredClone")
|
|
163
|
+
return "structuredClone";
|
|
164
|
+
if (fn === "util.isDeepStrictEqual")
|
|
165
|
+
return "util.isDeepStrictEqual";
|
|
166
|
+
if (fn.startsWith("assert."))
|
|
167
|
+
return "assert's deep equality";
|
|
168
|
+
return "console.log/util.inspect";
|
|
169
|
+
}
|
|
170
|
+
function guarded(arg, fn) {
|
|
171
|
+
const consumer = consumerName(fn);
|
|
172
|
+
if (arg.type.kind !== "dyn" && !(arg.type.kind === "array" && arg.type.elem.kind === "dyn"))
|
|
173
|
+
return arg;
|
|
174
|
+
return {
|
|
175
|
+
kind: "libCall",
|
|
176
|
+
fn: arg.type.kind === "dyn" ? "wrapper.guard" : "wrapper.guardList",
|
|
177
|
+
args: [arg, { kind: "strLit", value: consumer, type: STRING, loc: arg.loc }],
|
|
178
|
+
type: arg.type,
|
|
179
|
+
loc: arg.loc,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/** In a program that creates wrappers, route the consumers that read
|
|
183
|
+
* internal slots: Object.prototype.toString's tag and the util.types
|
|
184
|
+
* brands answer from the slot (wrapper.objectTag, wrapper.typeIs), and the
|
|
185
|
+
* graph-walking consumers above guard their dynamic arguments. Programs
|
|
186
|
+
* without a wrapper site keep every node unchanged. */
|
|
187
|
+
export function routeWrapperConsumers(lowerer, functions) {
|
|
188
|
+
if (!(lowerer.createsWrappers ??= programCreatesWrappers(lowerer)))
|
|
189
|
+
return;
|
|
190
|
+
const transform = {
|
|
191
|
+
expr: (expr) => {
|
|
192
|
+
if (expr.kind === "libCall") {
|
|
193
|
+
if (expr.fn === "dyn.objectTag")
|
|
194
|
+
return { ...expr, fn: "wrapper.objectTag" };
|
|
195
|
+
if (expr.fn === "util.typeIs" &&
|
|
196
|
+
expr.args[1]?.kind === "strLit" &&
|
|
197
|
+
WRAPPER_TYPE_PROBES.has(expr.args[1].value))
|
|
198
|
+
return { ...expr, fn: "wrapper.typeIs" };
|
|
199
|
+
if (GUARDED_CONSUMERS.has(expr.fn))
|
|
200
|
+
return { ...expr, args: expr.args.map((arg) => guarded(arg, expr.fn)) };
|
|
201
|
+
}
|
|
202
|
+
if (expr.kind === "intrinsic" &&
|
|
203
|
+
(expr.name === "console.log" || expr.name === "console.error"))
|
|
204
|
+
return { ...expr, args: expr.args.map((arg) => guarded(arg, expr.name)) };
|
|
205
|
+
return expr;
|
|
206
|
+
},
|
|
207
|
+
stmt: (stmt) => stmt,
|
|
208
|
+
};
|
|
209
|
+
for (const fn of functions)
|
|
210
|
+
fn.body = transformStmtList(fn.body, transform);
|
|
211
|
+
}
|
|
212
|
+
/** `Object(x)` / `new Object(x)` over a checked-dynamic `x` in a program
|
|
213
|
+
* that creates wrappers: ToObject (wrapper.toObject), a wrapper for a
|
|
214
|
+
* primitive, the value itself for an object, a fresh object for null and
|
|
215
|
+
* undefined. */
|
|
216
|
+
export function lowerWrapperToObject(lowerer, value, loc) {
|
|
217
|
+
const ctors = wrapperConstructors(lowerer, loc);
|
|
218
|
+
return { kind: "libCall", fn: "wrapper.toObject", args: [value, ...ctors], type: DYN, loc };
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=primitive-wrappers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitive-wrappers.js","sourceRoot":"","sources":["../../../src/frontend/lowering/primitive-wrappers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as ts from "../ts7/adapter.js";
|
|
2
|
+
import { type IrExpr, type IrStmt, type IrType, type SrcLoc } from "../../ir/ir.js";
|
|
3
|
+
import type { Lowerer } from "./lowerer.js";
|
|
4
|
+
import { type ClassInfo } from "./lower-classes.js";
|
|
5
|
+
/** How a static private name is used: a field read or write, or a method
|
|
6
|
+
* (or accessor) read or call. V8 words each failure differently. */
|
|
7
|
+
export type StaticPrivateUse = "read" | "write" | "method";
|
|
8
|
+
/** The declaration-level class whose body declares `priv` as a STATIC
|
|
9
|
+
* member (the nearest enclosing class declaring the name, as JavaScript
|
|
10
|
+
* scoping resolves it). Null for an instance private, a function-local or
|
|
11
|
+
* generic class, or a class that was not collected. */
|
|
12
|
+
export declare function staticPrivateOwner(lowerer: Lowerer, priv: ts.PrivateIdentifier): ClassInfo | null;
|
|
13
|
+
/** The brand check of a static private: JavaScript installs static private
|
|
14
|
+
* elements on the declaring class object alone, so the receiver must BE
|
|
15
|
+
* that object (a subclass, an object inheriting from it, or a primitive
|
|
16
|
+
* throws). An expression statement calling the lifted helper
|
|
17
|
+
* `%private.static.<use>:<class>:<#name>(value: dyn): void`, which throws
|
|
18
|
+
* V8's TypeError; `value` is the checked-dynamic receiver. */
|
|
19
|
+
export declare function staticPrivateBrandCheck(lowerer: Lowerer, info: ClassInfo, use: StaticPrivateUse, name: string, value: IrExpr, loc: SrcLoc): IrStmt;
|
|
20
|
+
/** `R.#x` / `R.#m` read, where `#x` is a static private of a
|
|
21
|
+
* declaration-level class and `R` is a checked-dynamic value (`this` in a
|
|
22
|
+
* static accessor or method that the constructor object carries): the
|
|
23
|
+
* brand check, then the member's native storage. Null for other reads,
|
|
24
|
+
* which keep their paths (the class's own name reads storage directly). */
|
|
25
|
+
export declare function lowerStaticPrivateRead(lowerer: Lowerer, expr: ts.PropertyAccessExpression, loc: SrcLoc): IrExpr | null;
|
|
26
|
+
/** `R.#m(args)` for a static private method on a checked-dynamic receiver:
|
|
27
|
+
* the brand check, then the call with `this` known to be the declaring
|
|
28
|
+
* class. A receiver other than `this` reaches only methods that do not
|
|
29
|
+
* read `this`; the others keep a loud refusal. */
|
|
30
|
+
export declare function lowerStaticPrivateCall(lowerer: Lowerer, call: ts.CallExpression, access: ts.PropertyAccessExpression): IrExpr | null;
|
|
31
|
+
/** `R.#x = v` for a static private field on a checked-dynamic receiver:
|
|
32
|
+
* the receiver, then the value, then the brand check (PrivateSet checks
|
|
33
|
+
* after the right side runs), then the native global. */
|
|
34
|
+
export declare function lowerStaticPrivateAssignment(lowerer: Lowerer, expr: ts.BinaryExpression): IrExpr | null;
|
|
35
|
+
/** The update target of `R.#x++`, `--R.#x` or `R.#x op= v` for a static
|
|
36
|
+
* private field on a checked-dynamic receiver: the brand check, which runs
|
|
37
|
+
* where PrivateGet reads the old value (before the right side), and the
|
|
38
|
+
* field's native global. The write after it needs no second check: the
|
|
39
|
+
* receiver already passed. Null for other targets. */
|
|
40
|
+
export declare function staticPrivateUpdateTarget(lowerer: Lowerer, access: ts.PropertyAccessExpression): {
|
|
41
|
+
brand: IrStmt;
|
|
42
|
+
target: {
|
|
43
|
+
id: string;
|
|
44
|
+
type: IrType;
|
|
45
|
+
};
|
|
46
|
+
} | null;
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import * as ts from "../ts7/adapter.js";
|
|
2
|
+
import { BOOL, DYN, VOID, } from "../../ir/ir.js";
|
|
3
|
+
import { helperLoc, strLit, varRef } from "../../ir/build.js";
|
|
4
|
+
import { locOf } from "../program.js";
|
|
5
|
+
import { hasStaticThis } from "./static-this.js";
|
|
6
|
+
import { lowerClassStaticRead, lowerStaticMethodCall } from "./lower-classes.js";
|
|
7
|
+
import { tryLowerExpression } from "./expressions/try-lower-expression.js";
|
|
8
|
+
import { lowerCallThroughValue } from "./lower-calls.js";
|
|
9
|
+
/** The declaration-level class whose body declares `priv` as a STATIC
|
|
10
|
+
* member (the nearest enclosing class declaring the name, as JavaScript
|
|
11
|
+
* scoping resolves it). Null for an instance private, a function-local or
|
|
12
|
+
* generic class, or a class that was not collected. */
|
|
13
|
+
export function staticPrivateOwner(lowerer, priv) {
|
|
14
|
+
for (let node = priv.parent; node; node = node.parent) {
|
|
15
|
+
if (!ts.isClassDeclaration(node) && !ts.isClassExpression(node))
|
|
16
|
+
continue;
|
|
17
|
+
const member = node.members.nodes.find((candidate) => {
|
|
18
|
+
const name = candidate.name;
|
|
19
|
+
return name !== undefined && ts.isPrivateIdentifier(name) && name.text === priv.text;
|
|
20
|
+
});
|
|
21
|
+
if (!member)
|
|
22
|
+
continue;
|
|
23
|
+
const isStatic = ts.canHaveModifiers(member) &&
|
|
24
|
+
ts.getModifiers(member)?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword) === true;
|
|
25
|
+
if (!isStatic)
|
|
26
|
+
return null;
|
|
27
|
+
for (const info of lowerer.classes.values()) {
|
|
28
|
+
if (info.decl !== node)
|
|
29
|
+
continue;
|
|
30
|
+
if (info.localClass || info.generic || info.genericInstance)
|
|
31
|
+
return null;
|
|
32
|
+
return info;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
/** V8's TypeError text for a static private `name` of `info` used on a
|
|
39
|
+
* receiver that is not the declaring class object. */
|
|
40
|
+
function brandMessage(info, use, name) {
|
|
41
|
+
if (use === "read")
|
|
42
|
+
return `Cannot read private member ${name} from an object whose class did not declare it`;
|
|
43
|
+
if (use === "write")
|
|
44
|
+
return `Cannot write private member ${name} to an object whose class did not declare it`;
|
|
45
|
+
// V8 names the class by its own identifier; an anonymous class
|
|
46
|
+
// expression prints ".".
|
|
47
|
+
return `Receiver must be class ${info.decl?.name?.text ?? "."}`;
|
|
48
|
+
}
|
|
49
|
+
/** The brand check of a static private: JavaScript installs static private
|
|
50
|
+
* elements on the declaring class object alone, so the receiver must BE
|
|
51
|
+
* that object (a subclass, an object inheriting from it, or a primitive
|
|
52
|
+
* throws). An expression statement calling the lifted helper
|
|
53
|
+
* `%private.static.<use>:<class>:<#name>(value: dyn): void`, which throws
|
|
54
|
+
* V8's TypeError; `value` is the checked-dynamic receiver. */
|
|
55
|
+
export function staticPrivateBrandCheck(lowerer, info, use, name, value, loc) {
|
|
56
|
+
const helper = `%private.static.${use}:${info.def.name}:${name}`;
|
|
57
|
+
if (!lowerer.valueHelpers.has(helper)) {
|
|
58
|
+
const at = helperLoc(loc);
|
|
59
|
+
const param = varRef("value.0", DYN, at);
|
|
60
|
+
const classValue = lowerer.coerceToExpected(lowerer.classValueRef(info, info.decl), DYN);
|
|
61
|
+
lowerer.liftedFns.push({
|
|
62
|
+
name: helper,
|
|
63
|
+
params: [{ localId: "value.0", name: "value", type: DYN }],
|
|
64
|
+
returnType: VOID,
|
|
65
|
+
locals: [{ id: "value.0", name: "value", type: DYN, mutable: false }],
|
|
66
|
+
body: [
|
|
67
|
+
{
|
|
68
|
+
kind: "if",
|
|
69
|
+
cond: {
|
|
70
|
+
kind: "dynScalarEq",
|
|
71
|
+
left: param,
|
|
72
|
+
right: classValue,
|
|
73
|
+
negated: true,
|
|
74
|
+
type: BOOL,
|
|
75
|
+
loc: at,
|
|
76
|
+
},
|
|
77
|
+
then: [
|
|
78
|
+
{
|
|
79
|
+
kind: "throw",
|
|
80
|
+
value: {
|
|
81
|
+
kind: "libCall",
|
|
82
|
+
fn: "error.new",
|
|
83
|
+
args: [strLit(brandMessage(info, use, name), at)],
|
|
84
|
+
type: { kind: "object", className: "%TypeError" },
|
|
85
|
+
loc: at,
|
|
86
|
+
},
|
|
87
|
+
loc: at,
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
else_: null,
|
|
91
|
+
loc: at,
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
loc: at,
|
|
95
|
+
});
|
|
96
|
+
lowerer.valueHelpers.set(helper, helper);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
kind: "exprStmt",
|
|
100
|
+
expr: { kind: "call", callee: helper, args: [value], type: VOID, loc },
|
|
101
|
+
loc,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/** A static private the native storage does not hold (an accessor, a
|
|
105
|
+
* field without an initializer): a loud refusal, never a string-keyed
|
|
106
|
+
* read of the class object. */
|
|
107
|
+
function unsupportedStaticPrivate(lowerer, node, name) {
|
|
108
|
+
return lowerer.unsupported("SC1090", node, `the private static '${name}' in this form on a class whose constructor carries runtime statics`);
|
|
109
|
+
}
|
|
110
|
+
/** The checked-dynamic value `expr` lowers to, or null. */
|
|
111
|
+
function checkedDynamicReceiver(lowerer, node) {
|
|
112
|
+
const probed = tryLowerExpression(lowerer, node);
|
|
113
|
+
if (!probed)
|
|
114
|
+
return null;
|
|
115
|
+
if (probed.type.kind !== "dyn" &&
|
|
116
|
+
!(probed.kind === "dynCheck" && probed.value.type.kind === "dyn"))
|
|
117
|
+
return null;
|
|
118
|
+
const value = lowerer.lowerExpr(node);
|
|
119
|
+
if (value.type.kind === "dyn")
|
|
120
|
+
return value;
|
|
121
|
+
return value.kind === "dynCheck" ? value.value : null;
|
|
122
|
+
}
|
|
123
|
+
/** `R.#x` / `R.#m` read, where `#x` is a static private of a
|
|
124
|
+
* declaration-level class and `R` is a checked-dynamic value (`this` in a
|
|
125
|
+
* static accessor or method that the constructor object carries): the
|
|
126
|
+
* brand check, then the member's native storage. Null for other reads,
|
|
127
|
+
* which keep their paths (the class's own name reads storage directly). */
|
|
128
|
+
export function lowerStaticPrivateRead(lowerer, expr, loc) {
|
|
129
|
+
if (!ts.isPrivateIdentifier(expr.name) || expr.questionDotToken)
|
|
130
|
+
return null;
|
|
131
|
+
const info = staticPrivateOwner(lowerer, expr.name);
|
|
132
|
+
if (!info || !info.runtimeStatics)
|
|
133
|
+
return null;
|
|
134
|
+
if (lowerer.exactClassOfReceiver(expr.expression) === info)
|
|
135
|
+
return null;
|
|
136
|
+
const value = checkedDynamicReceiver(lowerer, expr.expression);
|
|
137
|
+
if (!value)
|
|
138
|
+
return null;
|
|
139
|
+
const name = expr.name.text;
|
|
140
|
+
const found = lowerer.findStaticOn(info, name);
|
|
141
|
+
if (!found)
|
|
142
|
+
unsupportedStaticPrivate(lowerer, expr, name);
|
|
143
|
+
const read = lowerClassStaticRead(lowerer, info, name, expr.expression, expr);
|
|
144
|
+
if (!read)
|
|
145
|
+
return null;
|
|
146
|
+
return {
|
|
147
|
+
kind: "seqExpr",
|
|
148
|
+
stmts: [
|
|
149
|
+
staticPrivateBrandCheck(lowerer, info, found.field ? "read" : "method", name, value, loc),
|
|
150
|
+
],
|
|
151
|
+
result: read,
|
|
152
|
+
type: read.type,
|
|
153
|
+
loc,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/** `R.#m(args)` for a static private method on a checked-dynamic receiver:
|
|
157
|
+
* the brand check, then the call with `this` known to be the declaring
|
|
158
|
+
* class. A receiver other than `this` reaches only methods that do not
|
|
159
|
+
* read `this`; the others keep a loud refusal. */
|
|
160
|
+
export function lowerStaticPrivateCall(lowerer, call, access) {
|
|
161
|
+
if (!ts.isPrivateIdentifier(access.name) || access.questionDotToken)
|
|
162
|
+
return null;
|
|
163
|
+
const info = staticPrivateOwner(lowerer, access.name);
|
|
164
|
+
if (!info || !info.runtimeStatics)
|
|
165
|
+
return null;
|
|
166
|
+
if (lowerer.exactClassOfReceiver(access.expression) === info)
|
|
167
|
+
return null;
|
|
168
|
+
const name = access.name.text;
|
|
169
|
+
const found = lowerer.findStaticOn(info, name);
|
|
170
|
+
if (!found)
|
|
171
|
+
unsupportedStaticPrivate(lowerer, call, name);
|
|
172
|
+
const value = checkedDynamicReceiver(lowerer, access.expression);
|
|
173
|
+
if (!value)
|
|
174
|
+
return null;
|
|
175
|
+
const loc = locOf(call);
|
|
176
|
+
if (found.field !== undefined)
|
|
177
|
+
return lowerStaticPrivateFieldCall(lowerer, call, info, name, found.field, value);
|
|
178
|
+
const brand = staticPrivateBrandCheck(lowerer, info, "method", name, value, loc);
|
|
179
|
+
let result;
|
|
180
|
+
if (access.expression.kind === ts.SyntaxKind.ThisKeyword) {
|
|
181
|
+
// After the check `this` IS the class: lower the call against a
|
|
182
|
+
// class-valued `this`, the exact-receiver static path.
|
|
183
|
+
const classType = { kind: "classval", className: info.def.name };
|
|
184
|
+
const local = lowerer.declareHiddenLocal("%staticPrivateThis", classType);
|
|
185
|
+
const previous = lowerer.ctx.thisLocal;
|
|
186
|
+
lowerer.ctx.thisLocal = local;
|
|
187
|
+
try {
|
|
188
|
+
result = lowerStaticMethodCall(lowerer, call, access);
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
lowerer.ctx.thisLocal = previous;
|
|
192
|
+
}
|
|
193
|
+
if (!result)
|
|
194
|
+
return null;
|
|
195
|
+
return {
|
|
196
|
+
kind: "seqExpr",
|
|
197
|
+
stmts: [
|
|
198
|
+
brand,
|
|
199
|
+
{
|
|
200
|
+
kind: "varDecl",
|
|
201
|
+
localId: local.id,
|
|
202
|
+
init: lowerer.coerceToExpected(lowerer.classValueRef(info, info.decl), classType),
|
|
203
|
+
loc,
|
|
204
|
+
},
|
|
205
|
+
],
|
|
206
|
+
result,
|
|
207
|
+
type: result.type,
|
|
208
|
+
loc,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
if (found.method.member.body && hasStaticThis(found.method.member)) {
|
|
212
|
+
lowerer.unsupported("SC1090", call, `calling the private static '${name}' through a value other than 'this' when the method reads 'this'`);
|
|
213
|
+
}
|
|
214
|
+
const fnName = `%${found.declarer.def.name}.static:${name}`;
|
|
215
|
+
lowerer.noteEdge(fnName);
|
|
216
|
+
const args = lowerer.completeArgs(call.arguments.nodes, found.method.params, loc, call);
|
|
217
|
+
return {
|
|
218
|
+
kind: "seqExpr",
|
|
219
|
+
stmts: [brand],
|
|
220
|
+
result: { kind: "call", callee: fnName, args, type: found.method.ret, loc },
|
|
221
|
+
type: found.method.ret,
|
|
222
|
+
loc,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/** `R.#f(args)` for a function-valued static private field on a
|
|
226
|
+
* checked-dynamic receiver: the receiver, the brand check (PrivateGet's),
|
|
227
|
+
* then a call through the field's value with `this` bound to the receiver,
|
|
228
|
+
* as JavaScript calls a private field's function. The call takes the
|
|
229
|
+
* ordinary call-through-value lanes, so rest parameters, typed rests and
|
|
230
|
+
* checked-dynamic values receive every argument. */
|
|
231
|
+
function lowerStaticPrivateFieldCall(lowerer, call, info, name, field, value) {
|
|
232
|
+
const loc = locOf(call);
|
|
233
|
+
const receiver = lowerer.declareHiddenLocal("%staticPrivateReceiver", DYN);
|
|
234
|
+
const lowered = lowerCallThroughValue(lowerer, call, varRef(field.globalId, field.type, loc), loc);
|
|
235
|
+
if (lowered.kind !== "callValue" && lowered.kind !== "dynCall") {
|
|
236
|
+
return lowerer.unsupported("SC1090", call, `this call of the private static field '${name}' (spread arguments)`);
|
|
237
|
+
}
|
|
238
|
+
const result = { ...lowered, receiver: varRef(receiver.id, DYN, loc) };
|
|
239
|
+
return {
|
|
240
|
+
kind: "seqExpr",
|
|
241
|
+
stmts: [
|
|
242
|
+
{ kind: "varDecl", localId: receiver.id, init: value, loc },
|
|
243
|
+
staticPrivateBrandCheck(lowerer, info, "read", name, varRef(receiver.id, DYN, loc), loc),
|
|
244
|
+
],
|
|
245
|
+
result,
|
|
246
|
+
type: result.type,
|
|
247
|
+
loc,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
/** `R.#x = v` for a static private field on a checked-dynamic receiver:
|
|
251
|
+
* the receiver, then the value, then the brand check (PrivateSet checks
|
|
252
|
+
* after the right side runs), then the native global. */
|
|
253
|
+
export function lowerStaticPrivateAssignment(lowerer, expr) {
|
|
254
|
+
const target = expr.left;
|
|
255
|
+
if (expr.operatorToken.kind !== ts.SyntaxKind.EqualsToken ||
|
|
256
|
+
!ts.isPropertyAccessExpression(target) ||
|
|
257
|
+
!ts.isPrivateIdentifier(target.name))
|
|
258
|
+
return null;
|
|
259
|
+
const info = staticPrivateOwner(lowerer, target.name);
|
|
260
|
+
if (!info || !info.runtimeStatics)
|
|
261
|
+
return null;
|
|
262
|
+
if (lowerer.exactClassOfReceiver(target.expression) === info)
|
|
263
|
+
return null;
|
|
264
|
+
const name = target.name.text;
|
|
265
|
+
const found = lowerer.findStaticOn(info, name);
|
|
266
|
+
if (!found?.field)
|
|
267
|
+
unsupportedStaticPrivate(lowerer, expr, name);
|
|
268
|
+
const value = checkedDynamicReceiver(lowerer, target.expression);
|
|
269
|
+
if (!value)
|
|
270
|
+
return null;
|
|
271
|
+
const loc = locOf(expr);
|
|
272
|
+
const receiver = lowerer.declareHiddenLocal("%staticPrivateReceiver", DYN);
|
|
273
|
+
const assigned = lowerer.declareHiddenLocal("%staticPrivateValue", found.field.type);
|
|
274
|
+
return {
|
|
275
|
+
kind: "seqExpr",
|
|
276
|
+
stmts: [
|
|
277
|
+
{ kind: "varDecl", localId: receiver.id, init: value, loc },
|
|
278
|
+
{
|
|
279
|
+
kind: "varDecl",
|
|
280
|
+
localId: assigned.id,
|
|
281
|
+
init: lowerer.lowerExprExpecting(expr.right, found.field.type),
|
|
282
|
+
loc,
|
|
283
|
+
},
|
|
284
|
+
staticPrivateBrandCheck(lowerer, info, "write", name, varRef(receiver.id, DYN, loc), loc),
|
|
285
|
+
{
|
|
286
|
+
kind: "assign",
|
|
287
|
+
localId: found.field.globalId,
|
|
288
|
+
value: varRef(assigned.id, found.field.type, loc),
|
|
289
|
+
loc,
|
|
290
|
+
},
|
|
291
|
+
],
|
|
292
|
+
result: varRef(assigned.id, found.field.type, loc),
|
|
293
|
+
type: found.field.type,
|
|
294
|
+
loc,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
/** The update target of `R.#x++`, `--R.#x` or `R.#x op= v` for a static
|
|
298
|
+
* private field on a checked-dynamic receiver: the brand check, which runs
|
|
299
|
+
* where PrivateGet reads the old value (before the right side), and the
|
|
300
|
+
* field's native global. The write after it needs no second check: the
|
|
301
|
+
* receiver already passed. Null for other targets. */
|
|
302
|
+
export function staticPrivateUpdateTarget(lowerer, access) {
|
|
303
|
+
if (!ts.isPrivateIdentifier(access.name) || access.questionDotToken)
|
|
304
|
+
return null;
|
|
305
|
+
const info = staticPrivateOwner(lowerer, access.name);
|
|
306
|
+
if (!info || !info.runtimeStatics)
|
|
307
|
+
return null;
|
|
308
|
+
if (lowerer.exactClassOfReceiver(access.expression) === info)
|
|
309
|
+
return null;
|
|
310
|
+
const name = access.name.text;
|
|
311
|
+
const found = lowerer.findStaticOn(info, name);
|
|
312
|
+
if (!found?.field)
|
|
313
|
+
unsupportedStaticPrivate(lowerer, access, name);
|
|
314
|
+
const value = checkedDynamicReceiver(lowerer, access.expression);
|
|
315
|
+
if (!value)
|
|
316
|
+
return null;
|
|
317
|
+
return {
|
|
318
|
+
brand: staticPrivateBrandCheck(lowerer, info, "read", name, value, locOf(access)),
|
|
319
|
+
target: { id: found.field.globalId, type: found.field.type },
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=private-statics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-statics.js","sourceRoot":"","sources":["../../../src/frontend/lowering/private-statics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IrExpr, IrType, SrcLoc } from "../../ir/ir.js";
|
|
1
|
+
import type { IrExpr, IrFunction, IrType, SrcLoc } from "../../ir/ir.js";
|
|
2
2
|
import type { Lowerer } from "./lowerer.js";
|
|
3
3
|
/** Closed declared-field layouts with an ordinary data surface: the targets
|
|
4
4
|
* the checked record builder notes sources for. */
|
|
@@ -8,6 +8,17 @@ export declare function recordMayKeepSource(lowerer: Lowerer, t: IrType & {
|
|
|
8
8
|
/** `record.sourceHas(value)`: whether this record kept undeclared source
|
|
9
9
|
* properties. */
|
|
10
10
|
export declare function recordSourceTest(value: IrExpr, loc: SrcLoc): IrExpr;
|
|
11
|
+
/** Shared work list of the whole-program scan: settled union and record
|
|
12
|
+
* answers, and the unions and records on the current path, by id. */
|
|
13
|
+
export interface KeepsSourceScan {
|
|
14
|
+
memo: Map<string, boolean>;
|
|
15
|
+
visiting: Set<string>;
|
|
16
|
+
}
|
|
17
|
+
/** Whether `fn` holds a validated conversion that can note a record source:
|
|
18
|
+
* a `dynCheck` whose target accepts `recordMayKeepSource`. Only such a
|
|
19
|
+
* conversion creates the kept view `recordSourceTest` answers, so a program
|
|
20
|
+
* without one never needs a capture to consult the view. */
|
|
21
|
+
export declare function functionKeepsRecordSources(lowerer: Lowerer, fn: IrFunction, scan: KeepsSourceScan): boolean;
|
|
11
22
|
/** A reflective answer over a record value that branches on its kept
|
|
12
23
|
* source: `staticAnswer` walks the declared fields, `viewAnswer` answers
|
|
13
24
|
* from the live checked view (typed `type`, the static answer's type). The
|