@scriptc/compiler 0.2.1 → 0.2.3
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 +158 -31
- package/dist/backend/cycle-analysis.js +63 -50
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +51 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/llvm/borrowed-receivers.d.ts +9 -0
- package/dist/backend/llvm/borrowed-receivers.js +58 -0
- package/dist/backend/llvm/borrowed-receivers.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.d.ts +20 -0
- package/dist/backend/llvm/call-lifetimes.js +179 -0
- package/dist/backend/llvm/call-lifetimes.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.test.d.ts +1 -0
- package/dist/backend/llvm/call-lifetimes.test.js +205 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +5 -2
- package/dist/backend/llvm/dyn.js +163 -47
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +37 -1
- package/dist/backend/llvm/emitter.js +209 -21
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +29 -2
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +1 -1
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +42 -5
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +75 -13
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +31 -6
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +6 -5
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +1 -1
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +75 -19
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +7 -57
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +41 -3
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +12 -9
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +70 -2
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.d.ts +44 -0
- package/dist/backend/llvm/local-array-reads.js +313 -0
- package/dist/backend/llvm/local-array-reads.js.map +1 -0
- package/dist/backend/llvm/local-array-reads.test.d.ts +1 -0
- package/dist/backend/llvm/local-array-reads.test.js +446 -0
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -0
- package/dist/backend/llvm/map-read-lifetimes.d.ts +36 -0
- package/dist/backend/llvm/map-read-lifetimes.js +128 -0
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -0
- package/dist/backend/llvm/map-read-lifetimes.test.d.ts +1 -0
- package/dist/backend/llvm/map-read-lifetimes.test.js +123 -0
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -0
- package/dist/backend/llvm/shapes.js +1 -0
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/split.js +15 -5
- package/dist/backend/llvm/split.js.map +1 -1
- package/dist/backend/llvm/split.test.js +17 -0
- package/dist/backend/llvm/split.test.js.map +1 -1
- package/dist/backend/llvm/stack-unions.d.ts +20 -0
- package/dist/backend/llvm/stack-unions.js +61 -0
- package/dist/backend/llvm/stack-unions.js.map +1 -0
- package/dist/backend/llvm/stack-unions.test.d.ts +1 -0
- package/dist/backend/llvm/stack-unions.test.js +241 -0
- package/dist/backend/llvm/stack-unions.test.js.map +1 -0
- package/dist/backend/llvm/string-lifetimes.d.ts +12 -0
- package/dist/backend/llvm/string-lifetimes.js +70 -0
- package/dist/backend/llvm/string-lifetimes.js.map +1 -0
- package/dist/backend/llvm/string-lifetimes.test.d.ts +1 -0
- package/dist/backend/llvm/string-lifetimes.test.js +230 -0
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -0
- package/dist/backend/mangle.d.ts +2 -0
- package/dist/backend/mangle.js +4 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/may-throw.js +71 -29
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +104 -1
- package/dist/backend/may-throw.test.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +1 -1
- package/dist/backend/native-codegen.js +4 -3
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +11 -0
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +2 -2
- package/dist/backend/native-toolchain.js +2 -0
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/target-diagnostics.d.ts +5 -0
- package/dist/backend/target-diagnostics.js +72 -1
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.d.ts +1 -0
- package/dist/backend/target-diagnostics.test.js +68 -0
- package/dist/backend/target-diagnostics.test.js.map +1 -0
- package/dist/coverage/surface-manifest.js +5 -3
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +7 -3
- package/dist/executable/executable-cache.js +47 -11
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +109 -2
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +2 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/builtin-modules.d.ts +1 -1
- package/dist/frontend/builtin-modules.js +1 -1
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/function-completion.d.ts +6 -0
- package/dist/frontend/function-completion.js +50 -0
- package/dist/frontend/function-completion.js.map +1 -0
- package/dist/frontend/input-tracker.js +3 -3
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +38 -2
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lowering/abstract-equality.js +5 -1
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/checked-iterable-spread.d.ts +4 -0
- package/dist/frontend/lowering/checked-iterable-spread.js +30 -0
- package/dist/frontend/lowering/checked-iterable-spread.js.map +1 -0
- package/dist/frontend/lowering/checked-promise-all.d.ts +5 -0
- package/dist/frontend/lowering/checked-promise-all.js +31 -0
- package/dist/frontend/lowering/checked-promise-all.js.map +1 -0
- package/dist/frontend/lowering/class-callbacks.d.ts +1 -1
- package/dist/frontend/lowering/class-callbacks.js +7 -6
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +2 -0
- package/dist/frontend/lowering/class-construction.js +34 -5
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-descriptors.d.ts +1 -1
- package/dist/frontend/lowering/class-descriptors.js +12 -5
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +25 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +597 -78
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +64 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-instance-constructor.d.ts +1 -1
- package/dist/frontend/lowering/class-instance-constructor.js +11 -41
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.d.ts +16 -0
- package/dist/frontend/lowering/class-method-values.js +60 -29
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +5 -1
- package/dist/frontend/lowering/class-prototypes.js +69 -10
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +4 -4
- package/dist/frontend/lowering/class-runtime-statics.js +26 -8
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-static-data.d.ts +1 -0
- package/dist/frontend/lowering/class-static-data.js +4 -2
- package/dist/frontend/lowering/class-static-data.js.map +1 -1
- package/dist/frontend/lowering/collection-ingestion.d.ts +31 -0
- package/dist/frontend/lowering/collection-ingestion.js +215 -0
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -0
- package/dist/frontend/lowering/containers/bytes.js +19 -4
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +6 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.d.ts +13 -0
- package/dist/frontend/lowering/deferred-module-initializers.js +410 -0
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.d.ts +1 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js +92 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -0
- package/dist/frontend/lowering/expressions/object-literals.js +31 -1
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +3 -3
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/import-meta.d.ts +10 -0
- package/dist/frontend/lowering/import-meta.js +52 -0
- package/dist/frontend/lowering/import-meta.js.map +1 -0
- package/dist/frontend/lowering/lower-assert.js +105 -41
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.d.ts +2 -0
- package/dist/frontend/lowering/lower-builtin-values.js +22 -1
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-builtins.d.ts +7 -22
- package/dist/frontend/lowering/lower-builtins.js +439 -95
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +289 -76
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +5 -0
- package/dist/frontend/lowering/lower-classes.js +443 -29
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.d.ts +6 -2
- package/dist/frontend/lowering/lower-containers.js +79 -20
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +10 -6
- package/dist/frontend/lowering/lower-exprs.js +329 -170
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +5 -1
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +58 -1
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.js +4 -0
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-island.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-island.test.js +51 -0
- package/dist/frontend/lowering/lower-island.test.js.map +1 -0
- package/dist/frontend/lowering/lower-modules.d.ts +1 -3
- package/dist/frontend/lowering/lower-modules.js +186 -82
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.js +69 -1
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +172 -103
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-stmts.test.js +77 -0
- package/dist/frontend/lowering/lower-stmts.test.js.map +1 -0
- package/dist/frontend/lowering/lower-stream.js +2 -0
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-system-errors.d.ts +6 -0
- package/dist/frontend/lowering/lower-system-errors.js +29 -0
- package/dist/frontend/lowering/lower-system-errors.js.map +1 -0
- package/dist/frontend/lowering/lower-url.d.ts +2 -1
- package/dist/frontend/lowering/lower-url.js +32 -9
- package/dist/frontend/lowering/lower-url.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +30 -12
- package/dist/frontend/lowering/lowerer.js +268 -49
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +38 -0
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +7 -0
- package/dist/frontend/lowering/module-namespace-elements.js +54 -0
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -0
- package/dist/frontend/lowering/object-factory-new.d.ts +4 -3
- package/dist/frontend/lowering/object-factory-new.js +27 -14
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +3 -2
- package/dist/frontend/lowering/surfaces.js +93 -33
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/text-decoder-encoding.js +3 -0
- package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -1
- package/dist/frontend/lowering/text-decoder-encoding.test.js +2 -1
- package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -1
- package/dist/frontend/module-syntax.d.ts +1 -1
- package/dist/frontend/module-syntax.js +8 -1
- package/dist/frontend/module-syntax.js.map +1 -1
- package/dist/frontend/module-syntax.test.js +10 -0
- package/dist/frontend/module-syntax.test.js.map +1 -1
- package/dist/frontend/npm.d.ts +4 -0
- package/dist/frontend/npm.js +86 -33
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/npm.test.js +103 -0
- package/dist/frontend/npm.test.js.map +1 -1
- package/dist/frontend/pipeline-native.js +2 -1
- package/dist/frontend/pipeline-native.js.map +1 -1
- package/dist/frontend/program.js +4 -2
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/services-node.js +3 -2
- package/dist/frontend/services-node.js.map +1 -1
- package/dist/frontend/services.d.ts +5 -1
- package/dist/frontend/services.js +9 -1
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/services.test.js +21 -0
- package/dist/frontend/services.test.js.map +1 -1
- package/dist/frontend/ts7/ast-node.d.ts +2 -0
- package/dist/frontend/ts7/ast-node.js +30 -4
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +60 -1
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/type-mapper.js +89 -14
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/union-discriminants.js +22 -7
- package/dist/frontend/union-discriminants.js.map +1 -1
- package/dist/index.js +19 -12
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +1 -0
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +7 -0
- package/dist/ir/integer-loops.js +23 -0
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.d.ts +1 -0
- package/dist/ir/integer-loops.test.js +41 -0
- package/dist/ir/integer-loops.test.js.map +1 -0
- package/dist/ir/ir.d.ts +44 -26
- package/dist/ir/ir.js +69 -11
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +18 -0
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/serialize.js +21 -1
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +21 -0
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/traverse.d.ts +0 -3
- package/dist/ir/traverse.js +33 -20
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +216 -80
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +244 -1
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/compiler-self-identity.js +1 -1
- package/dist/library/compiler-self-identity.test.js +2 -2
- package/dist/library/compiler-self-identity.test.js.map +1 -1
- package/dist/library/fence-eval.js +9 -2
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/fence-eval.test.d.ts +1 -0
- package/dist/library/fence-eval.test.js +21 -0
- package/dist/library/fence-eval.test.js.map +1 -0
- package/dist/library/int-infer.d.ts +2 -2
- package/dist/library/int-infer.js +10 -7
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/int-infer.test.js +44 -0
- package/dist/library/int-infer.test.js.map +1 -1
- package/dist/library/prepare.js +2 -1
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/runtime-typescript.d.ts +4 -0
- package/dist/native/runtime-typescript.js +61 -0
- package/dist/native/runtime-typescript.js.map +1 -0
- package/dist/native/runtime-typescript.test.d.ts +1 -0
- package/dist/native/runtime-typescript.test.js +41 -0
- package/dist/native/runtime-typescript.test.js.map +1 -0
- package/package.json +20 -20
- package/surface-manifest.json +385 -29
|
@@ -34,7 +34,7 @@ export declare function lowerArrayConstructor(lowerer: Lowerer, expr: ts.CallExp
|
|
|
34
34
|
export declare function lowerArrayOfCall(lowerer: Lowerer, call: ts.CallExpression, access: ts.PropertyAccessExpression): IrExpr | null;
|
|
35
35
|
/** Mapper-less checked Array.from: acquire once, then step through emitted
|
|
36
36
|
* property and call dispatch so native class iterators retain their methods. */
|
|
37
|
-
export declare function lowerCheckedArrayFrom(lowerer: Lowerer, source: IrExpr, loc: SrcLoc, mapper?: IrExpr, receiver?: IrExpr, numeric?: boolean): Extract<IrExpr, {
|
|
37
|
+
export declare function lowerCheckedArrayFrom(lowerer: Lowerer, source: IrExpr, loc: SrcLoc, mapper?: IrExpr, receiver?: IrExpr, numeric?: boolean, iterable?: IrExpr): Extract<IrExpr, {
|
|
38
38
|
kind: "seqExpr";
|
|
39
39
|
}>;
|
|
40
40
|
export declare function lowerArrayFromValue(lowerer: Lowerer, loc: SrcLoc): IrExpr;
|
|
@@ -49,7 +49,8 @@ export declare function lowerArrayFromValue(lowerer: Lowerer, loc: SrcLoc): IrEx
|
|
|
49
49
|
* terminate (fractional lengths truncate, negative/NaN produce an empty
|
|
50
50
|
* array — Node-exact). Array inputs copy through the iterator's indexed
|
|
51
51
|
* values, including holes as present undefined, and may map each value.
|
|
52
|
-
* Set inputs
|
|
52
|
+
* Map and Set inputs consume live values or entries and may map them.
|
|
53
|
+
* Strings iterate by code point and may map.
|
|
53
54
|
* Other iterable shapes keep the fence. Null when the callee isn't an
|
|
54
55
|
* Array-static access. */
|
|
55
56
|
export declare function lowerArrayFromCall(lowerer: Lowerer, call: ts.CallExpression, access: ts.PropertyAccessExpression): IrExpr | null;
|
|
@@ -225,6 +226,9 @@ export declare function lowerSetSeedNew(lowerer: Lowerer, node: ts.Expression, s
|
|
|
225
226
|
export declare function lowerMapSeedNew(lowerer: Lowerer, argNode: ts.Expression, mapT: IrType & {
|
|
226
227
|
kind: "map";
|
|
227
228
|
}): IrExpr | null;
|
|
229
|
+
export declare function mapFromSeedValue(lowerer: Lowerer, seed: IrExpr, mapT: IrType & {
|
|
230
|
+
kind: "map";
|
|
231
|
+
}): IrExpr | null;
|
|
228
232
|
/** `Object.keys/values/entries` over an INDEX-SIGNATURE (overflow-carrying)
|
|
229
233
|
* record shape: declared fields answer first from the compile-time field
|
|
230
234
|
* list (declaration order, undefined-valued fields skipped — exactly the
|
|
@@ -6,7 +6,7 @@ import { InternalCompilerError } from "../../errors.js";
|
|
|
6
6
|
* record operations. */
|
|
7
7
|
import * as ts from "../ts7/adapter.js";
|
|
8
8
|
import { BOOL, CAUGHT, DYN, F64, JSVAL, STRING, UNDEFINED_T, VOID, arrayOf, funcOf, isRefCounted, isSupportedArrayElem, isSupportedIndexValue, isUnitType, typeEquals } from "../../ir/ir.js";
|
|
9
|
-
import { ARRAY_METHODS, MAP_METHODS, SET_COMBINE_METHODS, SET_METHODS } from "./surfaces.js";
|
|
9
|
+
import { ARRAY_METHODS, COLLECTION_ITERATOR_METHODS, MAP_METHODS, SET_COMBINE_METHODS, SET_METHODS } from "./surfaces.js";
|
|
10
10
|
import { tryLowerExpression } from "./expressions/try-lower-expression.js";
|
|
11
11
|
import { forOfVarTarget, lowerDestructuringAssign } from "./lower-stmts.js";
|
|
12
12
|
import { isJsSourceFile, locOf } from "../program.js";
|
|
@@ -18,6 +18,7 @@ import { dynUndefinedExpr, newFnCtx, nodeThrowExpr } from "./lowerer.js";
|
|
|
18
18
|
import { boolLit, countedFor, numLit, strLit, varRef } from "../../ir/build.js";
|
|
19
19
|
import { defaultAfterUndefined, lowerPositionArgument, lowerStaticallyUndefinedArgument, positionNumber } from "./optional-arguments.js";
|
|
20
20
|
import { lowerArrayCopyWithin, lowerArrayFill } from "./array-indexed-mutation.js";
|
|
21
|
+
import { collectionInput, collectionDestinationMatches, ingestCollection, lowerCollectionInput } from "./collection-ingestion.js";
|
|
21
22
|
/** Object() and new Object() preserve known object inputs. Primitive
|
|
22
23
|
* boxing and unproven checked-dynamic values retain their refusal. */
|
|
23
24
|
export function lowerObjectConstructor(lowerer, args, loc) {
|
|
@@ -2808,6 +2809,14 @@ export function lowerArrayConstructor(lowerer, expr, args) {
|
|
|
2808
2809
|
lowerer.noLowering("Array constructor with spread arguments", expr);
|
|
2809
2810
|
}
|
|
2810
2811
|
let result = lowerer.mapTypeOf(lowerer.typeOf(expr));
|
|
2812
|
+
// Constructors without a concrete element layout keep their checked
|
|
2813
|
+
// reference. Known element forms retain native arrays, including their
|
|
2814
|
+
// existing sparse storage and indexed property contracts.
|
|
2815
|
+
if (!lowerer.dynamic && isJsSourceFile(expr.getSourceFile()) &&
|
|
2816
|
+
(result?.kind !== "array" || result.elem.kind === "dyn")) {
|
|
2817
|
+
return { kind: "dynCall", callee: { kind: "libCall", fn: "dyn.arrayConstructor", args: [], type: DYN, loc },
|
|
2818
|
+
calleeName: "Array", args: args.map((arg) => lowerer.lowerExprExpecting(arg, DYN)), type: DYN, loc };
|
|
2819
|
+
}
|
|
2811
2820
|
if (result?.kind !== "array") {
|
|
2812
2821
|
const contextual = lowerer.checker.getContextualType(expr);
|
|
2813
2822
|
if (contextual)
|
|
@@ -2896,7 +2905,7 @@ export function lowerArrayOfCall(lowerer, call, access) {
|
|
|
2896
2905
|
}
|
|
2897
2906
|
/** Mapper-less checked Array.from: acquire once, then step through emitted
|
|
2898
2907
|
* property and call dispatch so native class iterators retain their methods. */
|
|
2899
|
-
export function lowerCheckedArrayFrom(lowerer, source, loc, mapper, receiver, numeric = false) {
|
|
2908
|
+
export function lowerCheckedArrayFrom(lowerer, source, loc, mapper, receiver, numeric = false, iterable) {
|
|
2900
2909
|
const iterator = lowerer.declareHiddenLocal("%fromIterator", DYN);
|
|
2901
2910
|
const next = lowerer.declareHiddenLocal("%fromNext", DYN);
|
|
2902
2911
|
const step = lowerer.declareHiddenLocal("%fromStep", DYN);
|
|
@@ -2931,7 +2940,7 @@ export function lowerCheckedArrayFrom(lowerer, source, loc, mapper, receiver, nu
|
|
|
2931
2940
|
{ kind: "exprStmt", expr: nodeThrowExpr(1, "", "Array.from mapper is not a function", DYN, loc), loc },
|
|
2932
2941
|
], loc },
|
|
2933
2942
|
], loc }] : []),
|
|
2934
|
-
{ kind: "varDecl", localId: iterator.id, init: { kind: "libCall", fn: "dyn.iteratorResult", args: [{ kind: "libCall", fn: "dyn.arrayFromIterator", args: [source], type: DYN, loc }], type: DYN, loc }, loc },
|
|
2943
|
+
{ kind: "varDecl", localId: iterator.id, init: { kind: "libCall", fn: "dyn.iteratorResult", args: [{ kind: "libCall", fn: iterable ? "dyn.iterator" : "dyn.arrayFromIterator", args: iterable ? [source, iterable] : [source], type: DYN, loc }], type: DYN, loc }, loc },
|
|
2935
2944
|
{ kind: "varDecl", localId: next.id, init: get(varRef(iterator.id, DYN, loc), "next"), loc },
|
|
2936
2945
|
{ kind: "varDecl", localId: out.id, init: { kind: "dynArrLit", elems: [], type: DYN, loc }, loc },
|
|
2937
2946
|
{ kind: "varDecl", localId: done.id, init: boolLit(false, loc), loc },
|
|
@@ -2983,7 +2992,8 @@ export function lowerArrayFromValue(lowerer, loc) {
|
|
|
2983
2992
|
* terminate (fractional lengths truncate, negative/NaN produce an empty
|
|
2984
2993
|
* array — Node-exact). Array inputs copy through the iterator's indexed
|
|
2985
2994
|
* values, including holes as present undefined, and may map each value.
|
|
2986
|
-
* Set inputs
|
|
2995
|
+
* Map and Set inputs consume live values or entries and may map them.
|
|
2996
|
+
* Strings iterate by code point and may map.
|
|
2987
2997
|
* Other iterable shapes keep the fence. Null when the callee isn't an
|
|
2988
2998
|
* Array-static access. */
|
|
2989
2999
|
export function lowerArrayFromCall(lowerer, call, access) {
|
|
@@ -3017,6 +3027,26 @@ export function lowerArrayFromCall(lowerer, call, access) {
|
|
|
3017
3027
|
return { kind: "call", callee: name, args: [0, 1, 2].map((i) => args[i]
|
|
3018
3028
|
? lowerer.lowerExprExpecting(args[i], DYN) : dynUndefinedExpr(loc)), type: DYN, loc };
|
|
3019
3029
|
}
|
|
3030
|
+
if ((args.length === 1 || args.length === 2) && !args.some(ts.isSpreadElement)) {
|
|
3031
|
+
const input = collectionInput(lowerer, args[0]);
|
|
3032
|
+
if (input) {
|
|
3033
|
+
const source = lowerCollectionInput(lowerer, input);
|
|
3034
|
+
if (source) {
|
|
3035
|
+
if (args.length === 1) {
|
|
3036
|
+
fenceProducedArrayElem(lowerer, call, "'Array.from(collection)'", input.element);
|
|
3037
|
+
return ingestCollection(lowerer, input, source, { kind: "array", elem: input.element }, loc);
|
|
3038
|
+
}
|
|
3039
|
+
const callback = hofCallbackArg(lowerer, args[1], [input.element], arrayOf(input.element));
|
|
3040
|
+
if (callback.arity > 2)
|
|
3041
|
+
lowerer.noLowering("Array.from mapper with an array parameter", args[1]);
|
|
3042
|
+
if (callback.fnArg.type.ret.kind === "void" || callback.fnArg.type.ret.kind === "func")
|
|
3043
|
+
lowerer.badType(call, lowerer.typeOf(call));
|
|
3044
|
+
const element = callbackArrayElem(lowerer, call, callback.fnArg.type.ret);
|
|
3045
|
+
fenceProducedArrayElem(lowerer, call, "'Array.from(collection, mapper)'", element);
|
|
3046
|
+
return ingestCollection(lowerer, input, source, { kind: "array", elem: element }, loc, callback.fnArg);
|
|
3047
|
+
}
|
|
3048
|
+
}
|
|
3049
|
+
}
|
|
3020
3050
|
// MAPPER-LESS `Array.from({ length: n })` (usually with an explicit
|
|
3021
3051
|
// type argument — the pMap results-array idiom): a length-n array of
|
|
3022
3052
|
// ABSENT slots, filled by index before any read. Union elements with
|
|
@@ -3314,7 +3344,7 @@ export function lowerMapMethodCall(lowerer, call, access) {
|
|
|
3314
3344
|
if (lowerer.chainBlocked(access, call))
|
|
3315
3345
|
return null;
|
|
3316
3346
|
const name = access.name.text;
|
|
3317
|
-
if (!MAP_METHODS.has(name)
|
|
3347
|
+
if (!MAP_METHODS.has(name))
|
|
3318
3348
|
return null;
|
|
3319
3349
|
let receiverIr = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
|
|
3320
3350
|
let probedUntyped = false;
|
|
@@ -3370,31 +3400,39 @@ export function lowerMapMethodCall(lowerer, call, access) {
|
|
|
3370
3400
|
if (name === "clear") {
|
|
3371
3401
|
return { kind: "mapIntrinsic", method: "clear", receiver, args: [], type: VOID, loc };
|
|
3372
3402
|
}
|
|
3373
|
-
if (
|
|
3403
|
+
if (COLLECTION_ITERATOR_METHODS.has(name)) {
|
|
3374
3404
|
return lowerMapIterDrainCall(lowerer, call, receiver, receiverIr, name);
|
|
3375
3405
|
}
|
|
3376
3406
|
// forEach
|
|
3377
3407
|
return lowerMapForEachCall(lowerer, call, receiver, receiverIr, probedUntyped);
|
|
3378
3408
|
}
|
|
3379
|
-
/**
|
|
3380
|
-
|
|
3409
|
+
/** Stored collection iterators retain the native collection by reference. The
|
|
3410
|
+
* checked-value runtime supplies the live cursor without embedding an engine. */
|
|
3411
|
+
function lowerCollectionIteratorCall(lowerer, call, receiver, method) {
|
|
3412
|
+
const access = call.expression;
|
|
3413
|
+
if (!ts.isPropertyAccessExpression(access))
|
|
3414
|
+
throw new InternalCompilerError("collection iterator requires a member call");
|
|
3415
|
+
const boxed = lowerer.coerceInto(access.expression, receiver, DYN);
|
|
3416
|
+
const result = lowerDynDispatchMethodCall(lowerer, call, access, boxed, false);
|
|
3417
|
+
if (!result)
|
|
3418
|
+
throw new InternalCompilerError(`missing collection iterator dispatch: ${method}`);
|
|
3419
|
+
return result;
|
|
3420
|
+
}
|
|
3381
3421
|
/** `[...m.keys()]` / `[...m.values()]` / `[...m.entries()]` — the iterator
|
|
3382
|
-
* methods
|
|
3422
|
+
* methods use an optimized drain as the operand of a spread inside an array
|
|
3383
3423
|
* literal, where JS drains the iterator on the spot. The call desugars to
|
|
3384
3424
|
* a direct call of a synthetic drain function whose loop walks the same
|
|
3385
3425
|
* iteration primitives as the forEach desugar and pushes each live entry
|
|
3386
3426
|
* into a fresh array — key, value, or `[K, V]` tuple record per method.
|
|
3387
3427
|
* No user code runs mid-drain (and nothing here mutates the map), so no
|
|
3388
3428
|
* compaction can shift indices: the enter/exit bracket is unnecessary and
|
|
3389
|
-
* the snapshot IS what JS's immediate drain observes.
|
|
3390
|
-
*
|
|
3391
|
-
* iterator value — fenced with the spread spelling as the hint. */
|
|
3429
|
+
* the snapshot IS what JS's immediate drain observes. Other contexts keep
|
|
3430
|
+
* a live iterator through the native checked-value runtime. */
|
|
3392
3431
|
function lowerMapIterDrainCall(lowerer, call, receiver, mapT, method) {
|
|
3393
3432
|
const loc = locOf(call);
|
|
3394
3433
|
const inArraySpread = ts.isSpreadElement(call.parent) && ts.isArrayLiteralExpression(call.parent.parent);
|
|
3395
|
-
if (!inArraySpread)
|
|
3396
|
-
lowerer
|
|
3397
|
-
}
|
|
3434
|
+
if (!inArraySpread)
|
|
3435
|
+
return lowerCollectionIteratorCall(lowerer, call, receiver, method);
|
|
3398
3436
|
// The pushed element type. For entries the checker's own element type —
|
|
3399
3437
|
// the [K, V] tuple behind MapIterator<[K, V]> — carries the interned
|
|
3400
3438
|
// tuple shape the surrounding literal will intern too.
|
|
@@ -3747,6 +3785,9 @@ export function lowerSetMethodCall(lowerer, call, access) {
|
|
|
3747
3785
|
if (name === "forEach" && call.arguments.length !== 1) {
|
|
3748
3786
|
lowerer.noLowering(`.forEach with ${call.arguments.length} arguments`, call, "the thisArg parameter has no lowering — use an arrow function");
|
|
3749
3787
|
}
|
|
3788
|
+
if (COLLECTION_ITERATOR_METHODS.has(name)) {
|
|
3789
|
+
return lowerCollectionIteratorCall(lowerer, call, receiver, name);
|
|
3790
|
+
}
|
|
3750
3791
|
if (SET_COMBINE_METHODS.has(name)) {
|
|
3751
3792
|
return lowerSetCombineCall(lowerer, call, name, receiver, receiverIr);
|
|
3752
3793
|
}
|
|
@@ -5342,7 +5383,14 @@ export function lowerSetSeedNew(lowerer, node, setT) {
|
|
|
5342
5383
|
const elems = node.elements.map((element) => lowerer.lowerCollectionKey(element, setT.elem));
|
|
5343
5384
|
return { kind: "setNew", seed: { kind: "arrayLit", elems, type: arrayOf(setT.elem), loc }, type: setT, loc };
|
|
5344
5385
|
}
|
|
5345
|
-
const
|
|
5386
|
+
const input = collectionInput(lowerer, node);
|
|
5387
|
+
if (input && collectionDestinationMatches(lowerer, input, setT)) {
|
|
5388
|
+
const source = lowerCollectionInput(lowerer, input);
|
|
5389
|
+
if (source)
|
|
5390
|
+
return ingestCollection(lowerer, input, source, setT, loc);
|
|
5391
|
+
}
|
|
5392
|
+
const seedType = lowerer.typeOf(node);
|
|
5393
|
+
const declared = lowerer.mapTypeOf(seedType);
|
|
5346
5394
|
const scalar = setT.elem.kind === "f64" || setT.elem.kind === "string";
|
|
5347
5395
|
let source = !scalar && (declared?.kind === "array" || declared?.kind === "record")
|
|
5348
5396
|
? lowerer.lowerCollectionKey(node, declared)
|
|
@@ -5351,8 +5399,8 @@ export function lowerSetSeedNew(lowerer, node, setT) {
|
|
|
5351
5399
|
(source.type.kind === "dyn" || source.type.kind === "jsval")) {
|
|
5352
5400
|
source = lowerer.coerceInto(node, source, STRING);
|
|
5353
5401
|
}
|
|
5354
|
-
if (
|
|
5355
|
-
return { kind: "dynCheck", value: { kind: "libCall", fn: "dyn.nativeSetNew", args: [source], type: DYN, loc }, type: setT, loc };
|
|
5402
|
+
if (setT.elem.kind === "dyn" && lowerer.dynConvertible(source.type)) {
|
|
5403
|
+
return { kind: "dynCheck", value: { kind: "libCall", fn: "dyn.nativeSetNew", args: [lowerer.coerceInto(node, source, DYN)], type: DYN, loc }, type: setT, loc };
|
|
5356
5404
|
}
|
|
5357
5405
|
if (declared?.kind === "array" && typeEquals(declared.elem, setT.elem)) {
|
|
5358
5406
|
// Preserve the existing checked scalar-iterable bridge. Reference
|
|
@@ -5481,10 +5529,18 @@ export function lowerMapSeedNew(lowerer, argNode, mapT) {
|
|
|
5481
5529
|
], true) };
|
|
5482
5530
|
return mapFromSeedValue(lowerer, lowerer.lowerArrayLiteral(argNode, { kind: "array", elem: tuple }), mapT);
|
|
5483
5531
|
}
|
|
5532
|
+
const input = collectionInput(lowerer, argNode);
|
|
5533
|
+
if (input) {
|
|
5534
|
+
if (!collectionDestinationMatches(lowerer, input, mapT))
|
|
5535
|
+
return null;
|
|
5536
|
+
const source = lowerCollectionInput(lowerer, input);
|
|
5537
|
+
if (source)
|
|
5538
|
+
return ingestCollection(lowerer, input, source, mapT, locOf(argNode));
|
|
5539
|
+
}
|
|
5484
5540
|
const seed = lowerer.lowerExpr(argNode);
|
|
5485
5541
|
return mapFromSeedValue(lowerer, seed, mapT);
|
|
5486
5542
|
}
|
|
5487
|
-
function mapFromSeedValue(lowerer, seed, mapT) {
|
|
5543
|
+
export function mapFromSeedValue(lowerer, seed, mapT) {
|
|
5488
5544
|
const loc = seed.loc;
|
|
5489
5545
|
if (isUnitType(seed.type)) {
|
|
5490
5546
|
return defaultAfterUndefined(seed, { kind: "mapNew", type: mapT, loc });
|
|
@@ -5546,7 +5602,7 @@ function mapFromSeedValue(lowerer, seed, mapT) {
|
|
|
5546
5602
|
return { kind: "call", callee: name, args: [seed], type: mapT, loc };
|
|
5547
5603
|
}
|
|
5548
5604
|
if (seed.type.kind === "dyn" || seed.type.kind === "array" &&
|
|
5549
|
-
(seed.type.elem.kind === "
|
|
5605
|
+
!(seed.type.elem.kind === "record" && lowerer.shapes.get(seed.type.elem.shapeId)?.tuple)) {
|
|
5550
5606
|
const key = `checked-seed:${typeKey(mapT)}`;
|
|
5551
5607
|
let name = lowerer.mapHofHelpers.get(key);
|
|
5552
5608
|
if (!name) {
|
|
@@ -5901,6 +5957,9 @@ function lowerTypedObjectFromEntriesCall(lowerer, call, callee) {
|
|
|
5901
5957
|
const argIr = lowerer.mapTypeOf(lowerer.typeOf(argNode));
|
|
5902
5958
|
if (argIr?.kind !== "array")
|
|
5903
5959
|
return null;
|
|
5960
|
+
const represented = tryLowerExpression(lowerer, argNode);
|
|
5961
|
+
if (represented && !typeEquals(represented.type, argIr))
|
|
5962
|
+
return null;
|
|
5904
5963
|
// `Object.fromEntries(rows)` over a `string[][]` VALUE — the env-line
|
|
5905
5964
|
// idiom (`envArray.map((env) => env.split('='))`). The checker has no
|
|
5906
5965
|
// tuple to type here (string[] misses the lib's [PropertyKey, T]
|