@scriptc/compiler 0.3.3 → 0.3.5
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/scriptc-node-fallback.d.ts +844 -36
- package/dist/backend/cycle-mutability.d.ts +5 -0
- package/dist/backend/cycle-mutability.js +62 -3
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +1 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/library-pack.js +1 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/array-search.js +1 -1
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.d.ts +11 -1
- package/dist/backend/llvm/call-lifetimes.js +30 -3
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +31 -1
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +5 -0
- package/dist/backend/llvm/common.js +7 -0
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +2 -21
- package/dist/backend/llvm/constant-callbacks.js +36 -219
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +22 -0
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +9 -0
- package/dist/backend/llvm/dense-array-access.js +29 -3
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +46 -1
- package/dist/backend/llvm/dyn.js +218 -33
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +87 -1
- package/dist/backend/llvm/emitter.js +568 -61
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +17 -7
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +9 -0
- package/dist/backend/llvm/expr-bytes.js +159 -64
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +11 -0
- package/dist/backend/llvm/expr-callbacks.js +53 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +3 -1
- package/dist/backend/llvm/expr-calls.js +137 -3
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +63 -29
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +9 -1
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +4 -0
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/integer-clones.d.ts +103 -0
- package/dist/backend/llvm/integer-clones.js +1336 -0
- package/dist/backend/llvm/integer-clones.js.map +1 -0
- package/dist/backend/llvm/integer-clones.test.d.ts +1 -0
- package/dist/backend/llvm/integer-clones.test.js +219 -0
- package/dist/backend/llvm/integer-clones.test.js.map +1 -0
- package/dist/backend/llvm/intern-tables.test.d.ts +1 -0
- package/dist/backend/llvm/intern-tables.test.js +77 -0
- package/dist/backend/llvm/intern-tables.test.js.map +1 -0
- package/dist/backend/llvm/lib-datagram.js +24 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +96 -1
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +51 -0
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +16 -0
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +24 -0
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.d.ts +5 -0
- package/dist/backend/llvm/lib-shared.js +114 -3
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +87 -0
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-test.js +9 -0
- package/dist/backend/llvm/lib-test.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +6 -0
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +1 -1
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/map-entry-fusion.d.ts +28 -0
- package/dist/backend/llvm/map-entry-fusion.js +233 -0
- package/dist/backend/llvm/map-entry-fusion.js.map +1 -0
- package/dist/backend/llvm/map-entry-fusion.test.d.ts +1 -0
- package/dist/backend/llvm/map-entry-fusion.test.js +183 -0
- package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -0
- package/dist/backend/llvm/map-number-lookup.d.ts +6 -0
- package/dist/backend/llvm/map-number-lookup.js +23 -1
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +60 -5
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.d.ts +11 -0
- package/dist/backend/llvm/map-read-lifetimes.js +92 -1
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +131 -3
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +21 -0
- package/dist/backend/llvm/publish.js +101 -11
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.d.ts +1 -0
- package/dist/backend/llvm/publish.test.js +94 -0
- package/dist/backend/llvm/publish.test.js.map +1 -0
- package/dist/backend/llvm/record-results.js +76 -2
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/record-sources.d.ts +7 -0
- package/dist/backend/llvm/record-sources.js +14 -0
- package/dist/backend/llvm/record-sources.js.map +1 -0
- package/dist/backend/llvm/reference-writes.js +5 -2
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/regions.d.ts +4 -1
- package/dist/backend/llvm/regions.js +12 -3
- package/dist/backend/llvm/regions.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +9 -3
- package/dist/backend/llvm/shapes.js +18 -14
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +5 -3
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +75 -1
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.js +2 -2
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/string-slices.js +2 -2
- package/dist/backend/llvm/string-slices.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +17 -0
- package/dist/backend/llvm/walkers.js +123 -0
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.js +4 -0
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -1
- package/dist/backend/native/executable.js +16 -6
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +4 -4
- package/dist/backend/native-codegen-core.js +4 -6
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.test.js +7 -8
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +3 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/publication.js +3 -1
- 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-targets.test.js +2 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +2 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.js +7 -0
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +1 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +1 -0
- package/dist/executable/executable-cache.js +1 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +1 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/experimental-import.d.ts +5 -1
- package/dist/frontend/experimental-import.js +28 -3
- package/dist/frontend/experimental-import.js.map +1 -1
- package/dist/frontend/lowering/assert-instances.d.ts +38 -0
- package/dist/frontend/lowering/assert-instances.js +269 -0
- package/dist/frontend/lowering/assert-instances.js.map +1 -0
- package/dist/frontend/lowering/builtin-calls.js +3 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/callable-aliases.js +54 -8
- package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-async.d.ts +8 -6
- package/dist/frontend/lowering/builtins/child-process-async.js +45 -29
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
- package/dist/frontend/lowering/builtins/compression.d.ts +18 -0
- package/dist/frontend/lowering/builtins/compression.js +175 -2
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/constants.js +7 -2
- package/dist/frontend/lowering/builtins/constants.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +6 -0
- package/dist/frontend/lowering/builtins/crypto.js +111 -1
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.js +23 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +2 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +5 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.js +60 -0
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-streams.d.ts +26 -0
- package/dist/frontend/lowering/builtins/fs-streams.js +131 -0
- package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-calls.js +5 -1
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.d.ts +3 -0
- package/dist/frontend/lowering/builtins/timers.js +109 -23
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +6 -0
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js +216 -20
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +33 -12
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/devirtualize.js +20 -7
- package/dist/frontend/lowering/devirtualize.js.map +1 -1
- package/dist/frontend/lowering/intern-tables.d.ts +13 -0
- package/dist/frontend/lowering/intern-tables.js +536 -0
- package/dist/frontend/lowering/intern-tables.js.map +1 -0
- package/dist/frontend/lowering/lower-assert.js +700 -61
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +11 -2
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +75 -6
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +3 -0
- package/dist/frontend/lowering/lower-classes.js +43 -0
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +132 -67
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +9 -1
- package/dist/frontend/lowering/lower-event-emitter.js +78 -0
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +4 -0
- package/dist/frontend/lowering/lower-exprs.js +144 -58
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +6 -0
- package/dist/frontend/lowering/lower-inspect.js +138 -39
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.d.ts +11 -0
- package/dist/frontend/lowering/lower-mock.js +504 -0
- package/dist/frontend/lowering/lower-mock.js.map +1 -0
- package/dist/frontend/lowering/lower-modules.js +7 -0
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +4 -0
- package/dist/frontend/lowering/lower-server.js +448 -30
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +35 -8
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +10 -6
- package/dist/frontend/lowering/lower-stream.js +794 -27
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-test.js +86 -8
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +25 -1
- package/dist/frontend/lowering/lowerer.js +74 -9
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.d.ts +6 -0
- package/dist/frontend/lowering/pairs-snapshot.js +49 -0
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/record-sources.d.ts +15 -0
- package/dist/frontend/lowering/record-sources.js +46 -0
- package/dist/frontend/lowering/record-sources.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +4 -0
- package/dist/frontend/lowering/surfaces.js +94 -16
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/zlib-constants.d.ts +1 -0
- package/dist/frontend/lowering/zlib-constants.js +181 -0
- package/dist/frontend/lowering/zlib-constants.js.map +1 -0
- package/dist/frontend/mock-shapes.d.ts +10 -0
- package/dist/frontend/mock-shapes.js +76 -0
- package/dist/frontend/mock-shapes.js.map +1 -0
- package/dist/frontend/pipeline.js +5 -3
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program.js +6 -1
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/resolve.d.ts +4 -0
- package/dist/frontend/resolve.js +14 -0
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/tsc-codes.js +1 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +8 -0
- package/dist/frontend/type-mapper.js +155 -9
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +10 -0
- package/dist/ir/analysis.js +35 -0
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/analysis.test.js +69 -1
- package/dist/ir/analysis.test.js.map +1 -1
- package/dist/ir/builtin-effects.js +72 -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 +238 -15
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/capture-values.d.ts +107 -0
- package/dist/ir/capture-values.js +850 -0
- package/dist/ir/capture-values.js.map +1 -0
- package/dist/ir/capture-values.test.d.ts +1 -0
- package/dist/ir/capture-values.test.js +268 -0
- package/dist/ir/capture-values.test.js.map +1 -0
- package/dist/ir/field-values.d.ts +16 -0
- package/dist/ir/field-values.js +128 -0
- package/dist/ir/field-values.js.map +1 -0
- package/dist/ir/field-values.test.d.ts +1 -0
- package/dist/ir/field-values.test.js +160 -0
- package/dist/ir/field-values.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +4 -1
- package/dist/ir/final-fields.js +11 -3
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.test.js +1 -1
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/init-only-globals.d.ts +16 -0
- package/dist/ir/init-only-globals.js +121 -0
- package/dist/ir/init-only-globals.js.map +1 -0
- package/dist/ir/init-only-globals.test.d.ts +1 -0
- package/dist/ir/init-only-globals.test.js +115 -0
- package/dist/ir/init-only-globals.test.js.map +1 -0
- package/dist/ir/initializer-bindings.d.ts +18 -1
- package/dist/ir/initializer-bindings.js +91 -1
- package/dist/ir/initializer-bindings.js.map +1 -1
- package/dist/ir/initializer-bindings.test.js +57 -2
- package/dist/ir/initializer-bindings.test.js.map +1 -1
- package/dist/ir/int32-slots.d.ts +22 -0
- package/dist/ir/int32-slots.js +376 -13
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +91 -8
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +19 -1
- package/dist/ir/integer-loop-facts.js +155 -7
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +8 -5
- package/dist/ir/integer-ranges.js +147 -55
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +225 -7
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +29 -2
- package/dist/ir/ir.js +17 -0
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/property-bags.d.ts +14 -0
- package/dist/ir/property-bags.js +121 -0
- package/dist/ir/property-bags.js.map +1 -0
- package/dist/ir/receiver-readers.d.ts +21 -0
- package/dist/ir/receiver-readers.js +217 -0
- package/dist/ir/receiver-readers.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +1 -0
- package/dist/ir/runtime-features.js +34 -2
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/validate.js +221 -5
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +21 -0
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/int-infer.js +3 -0
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/ir-policy.js +1 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/cli.js +1 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +1 -3
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/prepare.js +1 -0
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.test.js +1 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +896 -49
|
@@ -21,6 +21,7 @@ import { refreshDescriptorGuards } from "./class-descriptors.js";
|
|
|
21
21
|
import { ClassConstructionDispatch } from "./class-construction.js";
|
|
22
22
|
import { emitterRooted } from "./lower-event-emitter.js";
|
|
23
23
|
import { protocolArm, protocolFieldArm } from "./class-protocol-dispatch.js";
|
|
24
|
+
import { STREAM_OPERATORS } from "./lower-stream.js";
|
|
24
25
|
const STREAM_METHODS = new Set([
|
|
25
26
|
"on",
|
|
26
27
|
"addListener",
|
|
@@ -231,6 +232,45 @@ export function classPropertiesHelper(lowerer, loc, readOnly = false) {
|
|
|
231
232
|
export function classForInHasKey(lowerer, value, key, loc) {
|
|
232
233
|
const name = "%dyn.class.forInHasKey";
|
|
233
234
|
if (!lowerer.liftedFns.some((fn) => fn.name === name)) {
|
|
235
|
+
// The read-only table: a recheck never creates an instance's table, which
|
|
236
|
+
// is undefined while the instance has no own dynamic properties.
|
|
237
|
+
const bagHas = "%dyn.class.forInBagHas";
|
|
238
|
+
const bag = varRef("bag", DYN, loc);
|
|
239
|
+
lowerer.liftedFns.push({
|
|
240
|
+
name: bagHas,
|
|
241
|
+
params: [
|
|
242
|
+
{ localId: "bag", name: "bag", type: DYN },
|
|
243
|
+
{ localId: "key", name: "key", type: STRING },
|
|
244
|
+
],
|
|
245
|
+
returnType: BOOL,
|
|
246
|
+
locals: [
|
|
247
|
+
{ id: "bag", name: "bag", type: DYN, mutable: false },
|
|
248
|
+
{ id: "key", name: "key", type: STRING, mutable: false },
|
|
249
|
+
],
|
|
250
|
+
body: [
|
|
251
|
+
{
|
|
252
|
+
kind: "if",
|
|
253
|
+
cond: { kind: "dynTest", test: "undefined", value: bag, type: BOOL, loc },
|
|
254
|
+
then: [
|
|
255
|
+
{ kind: "return", value: { kind: "boolLit", value: false, type: BOOL, loc }, loc },
|
|
256
|
+
],
|
|
257
|
+
else_: null,
|
|
258
|
+
loc,
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
kind: "return",
|
|
262
|
+
value: {
|
|
263
|
+
kind: "libCall",
|
|
264
|
+
fn: "dyn.hasKey",
|
|
265
|
+
args: [bag, varRef("key", STRING, loc)],
|
|
266
|
+
type: BOOL,
|
|
267
|
+
loc,
|
|
268
|
+
},
|
|
269
|
+
loc,
|
|
270
|
+
},
|
|
271
|
+
],
|
|
272
|
+
loc,
|
|
273
|
+
});
|
|
234
274
|
lowerer.liftedFns.push({
|
|
235
275
|
name,
|
|
236
276
|
params: [
|
|
@@ -249,12 +289,12 @@ export function classForInHasKey(lowerer, value, key, loc) {
|
|
|
249
289
|
kind: "logical",
|
|
250
290
|
op: "||",
|
|
251
291
|
left: {
|
|
252
|
-
kind: "
|
|
253
|
-
|
|
292
|
+
kind: "call",
|
|
293
|
+
callee: bagHas,
|
|
254
294
|
args: [
|
|
255
295
|
{
|
|
256
296
|
kind: "call",
|
|
257
|
-
callee: classPropertiesHelper(lowerer, loc).name,
|
|
297
|
+
callee: classPropertiesHelper(lowerer, loc, true).name,
|
|
258
298
|
args: [varRef("value", DYN, loc)],
|
|
259
299
|
type: DYN,
|
|
260
300
|
loc,
|
|
@@ -960,8 +1000,12 @@ export class ClassDynamicDispatch {
|
|
|
960
1000
|
return [];
|
|
961
1001
|
if (emitterRooted(lowerer, info) && EMITTER_METHODS.has(method))
|
|
962
1002
|
return [info];
|
|
963
|
-
if (info.builtinStream)
|
|
964
|
-
return STREAM_METHODS.has(method)
|
|
1003
|
+
if (info.builtinStream) {
|
|
1004
|
+
return STREAM_METHODS.has(method) ||
|
|
1005
|
+
(STREAM_OPERATORS.has(method) && info.builtinStream !== "w")
|
|
1006
|
+
? [info]
|
|
1007
|
+
: [];
|
|
1008
|
+
}
|
|
965
1009
|
return findMethodOn(lowerer, info, method) || findGenericMethodOn(lowerer, info, method)
|
|
966
1010
|
? [info]
|
|
967
1011
|
: [];
|
|
@@ -1365,6 +1409,17 @@ export class ClassDynamicDispatch {
|
|
|
1365
1409
|
const numericKey = sourceKey.type.kind === "f64" ||
|
|
1366
1410
|
(sourceKey.kind === "dynFrom" && sourceKey.value.type.kind === "f64") ||
|
|
1367
1411
|
(sourceKey.kind === "toString" && sourceKey.operand.type.kind === "f64");
|
|
1412
|
+
// `value[i]` with a number `i`: the helper takes the number and
|
|
1413
|
+
// reads a dense checked array element directly, formatting the
|
|
1414
|
+
// property name only when that does not apply.
|
|
1415
|
+
const indexKey = computedRead &&
|
|
1416
|
+
!reflect &&
|
|
1417
|
+
!dynamicKey &&
|
|
1418
|
+
!computedRead.optional &&
|
|
1419
|
+
computedRead.key.kind === "toString" &&
|
|
1420
|
+
computedRead.key.operand.type.kind === "f64"
|
|
1421
|
+
? computedRead.key
|
|
1422
|
+
: null;
|
|
1368
1423
|
const key = JSON.stringify([
|
|
1369
1424
|
!!computedWrite,
|
|
1370
1425
|
computedRead?.optional ?? false,
|
|
@@ -1372,13 +1427,16 @@ export class ClassDynamicDispatch {
|
|
|
1372
1427
|
probe,
|
|
1373
1428
|
numericKey,
|
|
1374
1429
|
reflect,
|
|
1430
|
+
!!indexKey,
|
|
1375
1431
|
]);
|
|
1376
1432
|
let dispatch = this.computed.get(key);
|
|
1377
1433
|
if (!dispatch) {
|
|
1378
1434
|
const loc = expr.loc;
|
|
1379
1435
|
const params = [
|
|
1380
1436
|
{ localId: "p.0", name: "value", type: DYN },
|
|
1381
|
-
|
|
1437
|
+
indexKey
|
|
1438
|
+
? { localId: "p.index", name: "index", type: F64 }
|
|
1439
|
+
: { localId: "p.key", name: "key", type: dynamicKey ? DYN : STRING },
|
|
1382
1440
|
...(computedWrite ? [{ localId: "p.1", name: "stored", type: DYN }] : []),
|
|
1383
1441
|
...(reflect ? [{ localId: "p.reflectReceiver", name: "receiver", type: DYN }] : []),
|
|
1384
1442
|
];
|
|
@@ -1434,7 +1492,7 @@ export class ClassDynamicDispatch {
|
|
|
1434
1492
|
type: p.type,
|
|
1435
1493
|
mutable: false,
|
|
1436
1494
|
})),
|
|
1437
|
-
...(dynamicKey
|
|
1495
|
+
...(dynamicKey || indexKey
|
|
1438
1496
|
? [{ id: keyLocal, name: "key", type: STRING, mutable: false }]
|
|
1439
1497
|
: []),
|
|
1440
1498
|
],
|
|
@@ -1447,6 +1505,9 @@ export class ClassDynamicDispatch {
|
|
|
1447
1505
|
]
|
|
1448
1506
|
: [{ kind: "return", value: fallback, loc }],
|
|
1449
1507
|
loc,
|
|
1508
|
+
...(numericKey && computedRead && !reflect && !dynamicKey
|
|
1509
|
+
? { fastRead: "index" }
|
|
1510
|
+
: {}),
|
|
1450
1511
|
};
|
|
1451
1512
|
if (dynamicKey)
|
|
1452
1513
|
helper.body.unshift({
|
|
@@ -1570,13 +1631,81 @@ export class ClassDynamicDispatch {
|
|
|
1570
1631
|
},
|
|
1571
1632
|
loc,
|
|
1572
1633
|
});
|
|
1634
|
+
if (indexKey) {
|
|
1635
|
+
// An integer index below a checked array's length names an
|
|
1636
|
+
// element (-0 included: its property name is "0"); dyn.arrLen
|
|
1637
|
+
// answers 0 for every other kind. Holes keep dyn.arrAt's
|
|
1638
|
+
// ordinary named lookup.
|
|
1639
|
+
const index = varRef("p.index", F64, loc);
|
|
1640
|
+
const elementRead = {
|
|
1641
|
+
kind: "if",
|
|
1642
|
+
cond: { kind: "libCall", fn: "number.isInteger", args: [index], type: BOOL, loc },
|
|
1643
|
+
then: [
|
|
1644
|
+
{
|
|
1645
|
+
kind: "if",
|
|
1646
|
+
cond: {
|
|
1647
|
+
kind: "bin",
|
|
1648
|
+
op: ">=",
|
|
1649
|
+
left: index,
|
|
1650
|
+
right: { kind: "numLit", value: 0, type: F64, loc },
|
|
1651
|
+
type: BOOL,
|
|
1652
|
+
loc,
|
|
1653
|
+
},
|
|
1654
|
+
then: [
|
|
1655
|
+
{
|
|
1656
|
+
kind: "if",
|
|
1657
|
+
cond: {
|
|
1658
|
+
kind: "bin",
|
|
1659
|
+
op: "<",
|
|
1660
|
+
left: index,
|
|
1661
|
+
right: {
|
|
1662
|
+
kind: "libCall",
|
|
1663
|
+
fn: "dyn.arrLen",
|
|
1664
|
+
args: [varRef("p.0", DYN, loc)],
|
|
1665
|
+
type: F64,
|
|
1666
|
+
loc,
|
|
1667
|
+
},
|
|
1668
|
+
type: BOOL,
|
|
1669
|
+
loc,
|
|
1670
|
+
},
|
|
1671
|
+
then: [
|
|
1672
|
+
{
|
|
1673
|
+
kind: "return",
|
|
1674
|
+
value: {
|
|
1675
|
+
kind: "libCall",
|
|
1676
|
+
fn: "dyn.arrAt",
|
|
1677
|
+
args: [varRef("p.0", DYN, loc), index],
|
|
1678
|
+
type: DYN,
|
|
1679
|
+
loc,
|
|
1680
|
+
},
|
|
1681
|
+
loc,
|
|
1682
|
+
},
|
|
1683
|
+
],
|
|
1684
|
+
else_: null,
|
|
1685
|
+
loc,
|
|
1686
|
+
},
|
|
1687
|
+
],
|
|
1688
|
+
else_: null,
|
|
1689
|
+
loc,
|
|
1690
|
+
},
|
|
1691
|
+
],
|
|
1692
|
+
else_: null,
|
|
1693
|
+
loc,
|
|
1694
|
+
};
|
|
1695
|
+
helper.body.unshift(elementRead, {
|
|
1696
|
+
kind: "varDecl",
|
|
1697
|
+
localId: keyLocal,
|
|
1698
|
+
init: { ...indexKey, operand: index },
|
|
1699
|
+
loc,
|
|
1700
|
+
});
|
|
1701
|
+
}
|
|
1573
1702
|
dispatch = {
|
|
1574
1703
|
write: !!computedWrite,
|
|
1575
1704
|
reflect,
|
|
1576
1705
|
fn: helper,
|
|
1577
1706
|
classes: new Set(),
|
|
1578
1707
|
keyLocal,
|
|
1579
|
-
branchIndex: dynamicKey ? 3 : 0,
|
|
1708
|
+
branchIndex: dynamicKey ? 3 : indexKey ? 2 : 0,
|
|
1580
1709
|
dynamicKey,
|
|
1581
1710
|
numericKey,
|
|
1582
1711
|
probe,
|
|
@@ -1592,7 +1721,7 @@ export class ClassDynamicDispatch {
|
|
|
1592
1721
|
args: reflect
|
|
1593
1722
|
? (reflectRead ?? reflectWrite).args
|
|
1594
1723
|
: computedRead
|
|
1595
|
-
? [computedRead.value, computedRead.key]
|
|
1724
|
+
? [computedRead.value, indexKey ? indexKey.operand : computedRead.key]
|
|
1596
1725
|
: (computedWrite ?? computedProbe).args,
|
|
1597
1726
|
type: dispatch.fn.returnType,
|
|
1598
1727
|
loc: expr.loc,
|
|
@@ -1635,21 +1764,24 @@ export class ClassDynamicDispatch {
|
|
|
1635
1764
|
loc,
|
|
1636
1765
|
}
|
|
1637
1766
|
: instanceBag;
|
|
1767
|
+
// A read compares the bag with the receiver and then reads it:
|
|
1768
|
+
// evaluate it once, so each read retains the receiver once.
|
|
1769
|
+
const bagRead = varRef("bag.0", DYN, loc);
|
|
1638
1770
|
const fallback = read
|
|
1639
1771
|
? {
|
|
1640
1772
|
kind: "ternary",
|
|
1641
1773
|
cond: {
|
|
1642
1774
|
kind: "dynScalarEq",
|
|
1643
|
-
left:
|
|
1775
|
+
left: bagRead,
|
|
1644
1776
|
right: varRef("p.0", DYN, loc),
|
|
1645
1777
|
type: BOOL,
|
|
1646
1778
|
loc,
|
|
1647
1779
|
},
|
|
1648
|
-
then: { ...read, value:
|
|
1780
|
+
then: { ...read, value: bagRead },
|
|
1649
1781
|
else_: {
|
|
1650
1782
|
kind: "libCall",
|
|
1651
1783
|
fn: "dyn.bagGet",
|
|
1652
|
-
args: [
|
|
1784
|
+
args: [bagRead, read.key, varRef("p.0", DYN, loc)],
|
|
1653
1785
|
type: DYN,
|
|
1654
1786
|
loc,
|
|
1655
1787
|
},
|
|
@@ -1661,18 +1793,24 @@ export class ClassDynamicDispatch {
|
|
|
1661
1793
|
name: `%dyn.class.property.${this.properties.size}`,
|
|
1662
1794
|
params,
|
|
1663
1795
|
returnType: write ? VOID : DYN,
|
|
1664
|
-
locals:
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1796
|
+
locals: [
|
|
1797
|
+
...params.map((p) => ({
|
|
1798
|
+
id: p.localId,
|
|
1799
|
+
name: p.name,
|
|
1800
|
+
type: DYN,
|
|
1801
|
+
mutable: false,
|
|
1802
|
+
})),
|
|
1803
|
+
...(read ? [{ id: "bag.0", name: "bag", type: DYN, mutable: false }] : []),
|
|
1804
|
+
],
|
|
1670
1805
|
body: write
|
|
1671
1806
|
? [
|
|
1672
1807
|
{ kind: "exprStmt", expr: fallback, loc },
|
|
1673
1808
|
{ kind: "return", value: null, loc },
|
|
1674
1809
|
]
|
|
1675
|
-
: [
|
|
1810
|
+
: [
|
|
1811
|
+
{ kind: "varDecl", localId: "bag.0", init: bag, loc },
|
|
1812
|
+
{ kind: "return", value: fallback, loc },
|
|
1813
|
+
],
|
|
1676
1814
|
loc,
|
|
1677
1815
|
};
|
|
1678
1816
|
if (!write && name === "toString" && lowerer.classes.has("%Error")) {
|
|
@@ -2545,7 +2683,9 @@ export class ClassDynamicDispatch {
|
|
|
2545
2683
|
...dispatch.fn.params,
|
|
2546
2684
|
{ localId: "p.receiver", name: "receiver", type: receiverType },
|
|
2547
2685
|
];
|
|
2548
|
-
|
|
2686
|
+
// A derived key (a dynamic key's string, or an index's name) is a
|
|
2687
|
+
// local of the dispatch helper; pass it along.
|
|
2688
|
+
if (!dispatch.fn.params.some((param) => param.localId === dispatch.keyLocal))
|
|
2549
2689
|
params.push({ localId: dispatch.keyLocal, name: "key", type: STRING });
|
|
2550
2690
|
const helper = {
|
|
2551
2691
|
name: `%dyn.class.keys.${lowerer.liftedFns.length}`,
|
|
@@ -3261,6 +3401,25 @@ export class ClassDynamicDispatch {
|
|
|
3261
3401
|
{ kind: "return", value: null, loc },
|
|
3262
3402
|
];
|
|
3263
3403
|
}
|
|
3404
|
+
// fs.ReadStream / fs.WriteStream's members (undefined on other
|
|
3405
|
+
// streams, as in Node).
|
|
3406
|
+
if (info.builtinStream !== undefined &&
|
|
3407
|
+
!write &&
|
|
3408
|
+
(name === "bytesRead" || name === "bytesWritten" || name === "pending" || name === "path")) {
|
|
3409
|
+
return [
|
|
3410
|
+
{
|
|
3411
|
+
kind: "return",
|
|
3412
|
+
value: {
|
|
3413
|
+
kind: "libCall",
|
|
3414
|
+
fn: "fs.fsStreamPropDyn",
|
|
3415
|
+
args: [receiver, { kind: "strLit", value: name, type: STRING, loc }],
|
|
3416
|
+
type: DYN,
|
|
3417
|
+
loc,
|
|
3418
|
+
},
|
|
3419
|
+
loc,
|
|
3420
|
+
},
|
|
3421
|
+
];
|
|
3422
|
+
}
|
|
3264
3423
|
if (info.builtinStream !== undefined && streamProperty(name)) {
|
|
3265
3424
|
if (write)
|
|
3266
3425
|
return [
|
|
@@ -3715,6 +3874,43 @@ export class ClassDynamicDispatch {
|
|
|
3715
3874
|
type: method === "isPaused" ? BOOL : receiver.type,
|
|
3716
3875
|
loc,
|
|
3717
3876
|
});
|
|
3877
|
+
if (STREAM_OPERATORS.has(method) && info.builtinStream && info.builtinStream !== "w") {
|
|
3878
|
+
// The Readable operators over a checked-dynamic receiver: every
|
|
3879
|
+
// argument is already a checked value.
|
|
3880
|
+
const arg = (i) => incoming[i] ?? dynUndefinedExpr(loc);
|
|
3881
|
+
const readableT = { kind: "object", className: "%Readable" };
|
|
3882
|
+
const op = (fn, args, type) => ret({ kind: "libCall", fn: fn, args: [receiver, ...args], type, loc });
|
|
3883
|
+
switch (method) {
|
|
3884
|
+
case "map":
|
|
3885
|
+
return op("readable.opMap", [arg(0), arg(1)], readableT);
|
|
3886
|
+
case "filter":
|
|
3887
|
+
return op("readable.opFilter", [arg(0), arg(1)], readableT);
|
|
3888
|
+
case "flatMap":
|
|
3889
|
+
return op("readable.opFlatMap", [arg(0), arg(1)], readableT);
|
|
3890
|
+
case "drop":
|
|
3891
|
+
return op("readable.opDrop", [arg(0), arg(1)], readableT);
|
|
3892
|
+
case "take":
|
|
3893
|
+
return op("readable.opTake", [arg(0), arg(1)], readableT);
|
|
3894
|
+
case "toArray":
|
|
3895
|
+
return op("readable.opToArray", [arg(0)], { kind: "promise", inner: DYN });
|
|
3896
|
+
case "forEach":
|
|
3897
|
+
return op("readable.opForEach", [arg(0), arg(1)], { kind: "promise", inner: VOID });
|
|
3898
|
+
case "some":
|
|
3899
|
+
return op("readable.opSome", [arg(0), arg(1)], { kind: "promise", inner: BOOL });
|
|
3900
|
+
case "every":
|
|
3901
|
+
return op("readable.opEvery", [arg(0), arg(1)], { kind: "promise", inner: BOOL });
|
|
3902
|
+
case "find":
|
|
3903
|
+
return op("readable.opFind", [arg(0), arg(1)], { kind: "promise", inner: DYN });
|
|
3904
|
+
case "reduce":
|
|
3905
|
+
return op("readable.opReduce", [
|
|
3906
|
+
arg(0),
|
|
3907
|
+
arg(1),
|
|
3908
|
+
{ kind: "boolLit", value: dispatch.source.args.length >= 2, type: BOOL, loc },
|
|
3909
|
+
arg(2),
|
|
3910
|
+
{ kind: "numLit", value: 0, type: F64, loc },
|
|
3911
|
+
], { kind: "promise", inner: DYN });
|
|
3912
|
+
}
|
|
3913
|
+
}
|
|
3718
3914
|
if (method === "destroy" && (!incoming.length || incoming[0]?.kind === "unitLit"))
|
|
3719
3915
|
return ret({
|
|
3720
3916
|
kind: "libCall",
|