@scriptc/compiler 0.2.2 → 0.2.4

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.
Files changed (243) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +99 -27
  2. package/dist/backend/cycle-analysis.js +63 -50
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/cycle-analysis.test.js +51 -0
  5. package/dist/backend/cycle-analysis.test.js.map +1 -1
  6. package/dist/backend/llvm/borrowed-inputs.d.ts +15 -0
  7. package/dist/backend/llvm/borrowed-inputs.js +28 -0
  8. package/dist/backend/llvm/borrowed-inputs.js.map +1 -0
  9. package/dist/backend/llvm/borrowed-receivers.d.ts +9 -0
  10. package/dist/backend/llvm/borrowed-receivers.js +58 -0
  11. package/dist/backend/llvm/borrowed-receivers.js.map +1 -0
  12. package/dist/backend/llvm/byte-numbers.d.ts +10 -0
  13. package/dist/backend/llvm/byte-numbers.js +235 -0
  14. package/dist/backend/llvm/byte-numbers.js.map +1 -0
  15. package/dist/backend/llvm/bytes-bounds.d.ts +9 -0
  16. package/dist/backend/llvm/bytes-bounds.js +189 -0
  17. package/dist/backend/llvm/bytes-bounds.js.map +1 -0
  18. package/dist/backend/llvm/call-lifetimes.d.ts +27 -0
  19. package/dist/backend/llvm/call-lifetimes.js +199 -0
  20. package/dist/backend/llvm/call-lifetimes.js.map +1 -0
  21. package/dist/backend/llvm/call-lifetimes.test.d.ts +1 -0
  22. package/dist/backend/llvm/call-lifetimes.test.js +259 -0
  23. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -0
  24. package/dist/backend/llvm/checked-value-lifetimes.d.ts +9 -0
  25. package/dist/backend/llvm/checked-value-lifetimes.js +35 -0
  26. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -0
  27. package/dist/backend/llvm/counted-loops.d.ts +6 -0
  28. package/dist/backend/llvm/counted-loops.js +28 -0
  29. package/dist/backend/llvm/counted-loops.js.map +1 -0
  30. package/dist/backend/llvm/dyn.d.ts +2 -2
  31. package/dist/backend/llvm/dyn.js +79 -35
  32. package/dist/backend/llvm/dyn.js.map +1 -1
  33. package/dist/backend/llvm/emitter.d.ts +56 -7
  34. package/dist/backend/llvm/emitter.js +310 -37
  35. package/dist/backend/llvm/emitter.js.map +1 -1
  36. package/dist/backend/llvm/emitter.test.js +24 -5
  37. package/dist/backend/llvm/emitter.test.js.map +1 -1
  38. package/dist/backend/llvm/expr-async.js +4 -3
  39. package/dist/backend/llvm/expr-async.js.map +1 -1
  40. package/dist/backend/llvm/expr-bytes.d.ts +4 -4
  41. package/dist/backend/llvm/expr-bytes.js +68 -35
  42. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  43. package/dist/backend/llvm/expr-calls.js +50 -5
  44. package/dist/backend/llvm/expr-calls.js.map +1 -1
  45. package/dist/backend/llvm/expr-containers.d.ts +2 -1
  46. package/dist/backend/llvm/expr-containers.js +136 -57
  47. package/dist/backend/llvm/expr-containers.js.map +1 -1
  48. package/dist/backend/llvm/expr-context.d.ts +11 -0
  49. package/dist/backend/llvm/expr-control.js +26 -5
  50. package/dist/backend/llvm/expr-control.js.map +1 -1
  51. package/dist/backend/llvm/expr-dynamic.js +33 -31
  52. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  53. package/dist/backend/llvm/expr-primitives.js +61 -27
  54. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  55. package/dist/backend/llvm/expr-records.js +9 -3
  56. package/dist/backend/llvm/expr-records.js.map +1 -1
  57. package/dist/backend/llvm/expr-stream-bridges.js +5 -10
  58. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  59. package/dist/backend/llvm/integer-values.d.ts +10 -0
  60. package/dist/backend/llvm/integer-values.js +41 -0
  61. package/dist/backend/llvm/integer-values.js.map +1 -0
  62. package/dist/backend/llvm/integer-views.d.ts +7 -0
  63. package/dist/backend/llvm/integer-views.js +67 -0
  64. package/dist/backend/llvm/integer-views.js.map +1 -0
  65. package/dist/backend/llvm/integer-views.test.d.ts +1 -0
  66. package/dist/backend/llvm/integer-views.test.js +34 -0
  67. package/dist/backend/llvm/integer-views.test.js.map +1 -0
  68. package/dist/backend/llvm/lib-dispatch.js +3 -1
  69. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  70. package/dist/backend/llvm/lib-filesystem.js +5 -5
  71. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  72. package/dist/backend/llvm/lib-shared.js +35 -1
  73. package/dist/backend/llvm/lib-shared.js.map +1 -1
  74. package/dist/backend/llvm/local-array-reads.d.ts +42 -0
  75. package/dist/backend/llvm/local-array-reads.js +226 -0
  76. package/dist/backend/llvm/local-array-reads.js.map +1 -0
  77. package/dist/backend/llvm/local-array-reads.test.d.ts +1 -0
  78. package/dist/backend/llvm/local-array-reads.test.js +446 -0
  79. package/dist/backend/llvm/local-array-reads.test.js.map +1 -0
  80. package/dist/backend/llvm/map-read-lifetimes.d.ts +36 -0
  81. package/dist/backend/llvm/map-read-lifetimes.js +128 -0
  82. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -0
  83. package/dist/backend/llvm/map-read-lifetimes.test.d.ts +1 -0
  84. package/dist/backend/llvm/map-read-lifetimes.test.js +127 -0
  85. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -0
  86. package/dist/backend/llvm/reference-effects.d.ts +22 -0
  87. package/dist/backend/llvm/reference-effects.js +148 -0
  88. package/dist/backend/llvm/reference-effects.js.map +1 -0
  89. package/dist/backend/llvm/reference-effects.test.d.ts +1 -0
  90. package/dist/backend/llvm/reference-effects.test.js +74 -0
  91. package/dist/backend/llvm/reference-effects.test.js.map +1 -0
  92. package/dist/backend/llvm/shapes.d.ts +7 -4
  93. package/dist/backend/llvm/shapes.js +24 -6
  94. package/dist/backend/llvm/shapes.js.map +1 -1
  95. package/dist/backend/llvm/split.js +15 -5
  96. package/dist/backend/llvm/split.js.map +1 -1
  97. package/dist/backend/llvm/split.test.js +17 -0
  98. package/dist/backend/llvm/split.test.js.map +1 -1
  99. package/dist/backend/llvm/stack-unions.d.ts +20 -0
  100. package/dist/backend/llvm/stack-unions.js +61 -0
  101. package/dist/backend/llvm/stack-unions.js.map +1 -0
  102. package/dist/backend/llvm/stack-unions.test.d.ts +1 -0
  103. package/dist/backend/llvm/stack-unions.test.js +262 -0
  104. package/dist/backend/llvm/stack-unions.test.js.map +1 -0
  105. package/dist/backend/llvm/string-construction.d.ts +10 -0
  106. package/dist/backend/llvm/string-construction.js +38 -0
  107. package/dist/backend/llvm/string-construction.js.map +1 -0
  108. package/dist/backend/llvm/string-construction.test.d.ts +1 -0
  109. package/dist/backend/llvm/string-construction.test.js +65 -0
  110. package/dist/backend/llvm/string-construction.test.js.map +1 -0
  111. package/dist/backend/llvm/string-lifetimes.d.ts +12 -0
  112. package/dist/backend/llvm/string-lifetimes.js +72 -0
  113. package/dist/backend/llvm/string-lifetimes.js.map +1 -0
  114. package/dist/backend/llvm/string-lifetimes.test.d.ts +1 -0
  115. package/dist/backend/llvm/string-lifetimes.test.js +239 -0
  116. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -0
  117. package/dist/backend/mangle.d.ts +2 -0
  118. package/dist/backend/mangle.js +4 -0
  119. package/dist/backend/mangle.js.map +1 -1
  120. package/dist/backend/may-throw.js +67 -29
  121. package/dist/backend/may-throw.js.map +1 -1
  122. package/dist/backend/may-throw.test.js +104 -1
  123. package/dist/backend/may-throw.test.js.map +1 -1
  124. package/dist/backend/native-toolchain.d.ts +2 -2
  125. package/dist/backend/native-toolchain.js +2 -0
  126. package/dist/backend/native-toolchain.js.map +1 -1
  127. package/dist/frontend/input-tracker.js +3 -3
  128. package/dist/frontend/input-tracker.js.map +1 -1
  129. package/dist/frontend/input-tracker.test.js +38 -2
  130. package/dist/frontend/input-tracker.test.js.map +1 -1
  131. package/dist/frontend/lowering/collection-ingestion.d.ts +31 -0
  132. package/dist/frontend/lowering/collection-ingestion.js +224 -0
  133. package/dist/frontend/lowering/collection-ingestion.js.map +1 -0
  134. package/dist/frontend/lowering/containers/bytes.js +2 -0
  135. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  136. package/dist/frontend/lowering/containers/string-and-regexp.js +6 -0
  137. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  138. package/dist/frontend/lowering/import-meta.d.ts +10 -0
  139. package/dist/frontend/lowering/import-meta.js +52 -0
  140. package/dist/frontend/lowering/import-meta.js.map +1 -0
  141. package/dist/frontend/lowering/lower-assert.js +105 -41
  142. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  143. package/dist/frontend/lowering/lower-builtin-values.d.ts +2 -0
  144. package/dist/frontend/lowering/lower-builtin-values.js +22 -1
  145. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  146. package/dist/frontend/lowering/lower-builtins.d.ts +3 -13
  147. package/dist/frontend/lowering/lower-builtins.js +152 -46
  148. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  149. package/dist/frontend/lowering/lower-calls.js +6 -3
  150. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  151. package/dist/frontend/lowering/lower-classes.js +7 -7
  152. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  153. package/dist/frontend/lowering/lower-containers.d.ts +5 -1
  154. package/dist/frontend/lowering/lower-containers.js +52 -37
  155. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  156. package/dist/frontend/lowering/lower-exprs.js +47 -43
  157. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  158. package/dist/frontend/lowering/lower-inspect.js +43 -0
  159. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  160. package/dist/frontend/lowering/lower-stmts.js +72 -68
  161. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  162. package/dist/frontend/lowering/lower-system-errors.d.ts +6 -0
  163. package/dist/frontend/lowering/lower-system-errors.js +29 -0
  164. package/dist/frontend/lowering/lower-system-errors.js.map +1 -0
  165. package/dist/frontend/lowering/lowerer.d.ts +4 -3
  166. package/dist/frontend/lowering/lowerer.js +60 -25
  167. package/dist/frontend/lowering/lowerer.js.map +1 -1
  168. package/dist/frontend/lowering/surfaces.d.ts +2 -2
  169. package/dist/frontend/lowering/surfaces.js +69 -21
  170. package/dist/frontend/lowering/surfaces.js.map +1 -1
  171. package/dist/frontend/module-syntax.d.ts +1 -1
  172. package/dist/frontend/module-syntax.js +8 -1
  173. package/dist/frontend/module-syntax.js.map +1 -1
  174. package/dist/frontend/module-syntax.test.js +10 -0
  175. package/dist/frontend/module-syntax.test.js.map +1 -1
  176. package/dist/frontend/npm.d.ts +4 -0
  177. package/dist/frontend/npm.js +86 -33
  178. package/dist/frontend/npm.js.map +1 -1
  179. package/dist/frontend/npm.test.js +103 -0
  180. package/dist/frontend/npm.test.js.map +1 -1
  181. package/dist/frontend/pipeline-native.js +2 -1
  182. package/dist/frontend/pipeline-native.js.map +1 -1
  183. package/dist/frontend/services-node.js +3 -2
  184. package/dist/frontend/services-node.js.map +1 -1
  185. package/dist/frontend/services.d.ts +5 -1
  186. package/dist/frontend/services.js +9 -1
  187. package/dist/frontend/services.js.map +1 -1
  188. package/dist/frontend/services.test.js +21 -0
  189. package/dist/frontend/services.test.js.map +1 -1
  190. package/dist/frontend/ts7/ast-node.d.ts +2 -0
  191. package/dist/frontend/ts7/ast-node.js +30 -4
  192. package/dist/frontend/ts7/ast-node.js.map +1 -1
  193. package/dist/frontend/ts7/ast-node.test.js +60 -1
  194. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  195. package/dist/frontend/type-mapper.js +8 -2
  196. package/dist/frontend/type-mapper.js.map +1 -1
  197. package/dist/index.js +3 -2
  198. package/dist/index.js.map +1 -1
  199. package/dist/ir/analysis.js +4 -1
  200. package/dist/ir/analysis.js.map +1 -1
  201. package/dist/ir/byte-numbers.d.ts +20 -0
  202. package/dist/ir/byte-numbers.js +65 -0
  203. package/dist/ir/byte-numbers.js.map +1 -0
  204. package/dist/ir/byte-numbers.test.d.ts +1 -0
  205. package/dist/ir/byte-numbers.test.js +42 -0
  206. package/dist/ir/byte-numbers.test.js.map +1 -0
  207. package/dist/ir/integer-loops.d.ts +26 -0
  208. package/dist/ir/integer-loops.js +130 -1
  209. package/dist/ir/integer-loops.js.map +1 -1
  210. package/dist/ir/integer-loops.test.d.ts +1 -0
  211. package/dist/ir/integer-loops.test.js +91 -0
  212. package/dist/ir/integer-loops.test.js.map +1 -0
  213. package/dist/ir/integer-ranges.d.ts +8 -6
  214. package/dist/ir/integer-ranges.js +343 -89
  215. package/dist/ir/integer-ranges.js.map +1 -1
  216. package/dist/ir/integer-ranges.test.js +54 -3
  217. package/dist/ir/integer-ranges.test.js.map +1 -1
  218. package/dist/ir/ir.d.ts +29 -22
  219. package/dist/ir/ir.js +59 -14
  220. package/dist/ir/ir.js.map +1 -1
  221. package/dist/ir/ir.test.js +18 -0
  222. package/dist/ir/ir.test.js.map +1 -1
  223. package/dist/ir/validate.js +208 -105
  224. package/dist/ir/validate.js.map +1 -1
  225. package/dist/ir/validate.test.js +247 -0
  226. package/dist/ir/validate.test.js.map +1 -1
  227. package/dist/library/fence-eval.js +9 -2
  228. package/dist/library/fence-eval.js.map +1 -1
  229. package/dist/library/fence-eval.test.d.ts +1 -0
  230. package/dist/library/fence-eval.test.js +21 -0
  231. package/dist/library/fence-eval.test.js.map +1 -0
  232. package/dist/native/runtime-typescript.d.ts +4 -0
  233. package/dist/native/runtime-typescript.js +61 -0
  234. package/dist/native/runtime-typescript.js.map +1 -0
  235. package/dist/native/runtime-typescript.test.d.ts +1 -0
  236. package/dist/native/runtime-typescript.test.js +41 -0
  237. package/dist/native/runtime-typescript.test.js.map +1 -0
  238. package/dist/native/toolchain.js +6 -3
  239. package/dist/native/toolchain.js.map +1 -1
  240. package/dist/native/toolchain.test.js +43 -5
  241. package/dist/native/toolchain.test.js.map +1 -1
  242. package/package.json +20 -20
  243. package/surface-manifest.json +271 -17
@@ -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 copy their values; strings iterate by code point and may map.
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
@@ -5,7 +5,7 @@ import { InternalCompilerError } from "../../errors.js";
5
5
  * methods with Node-exact forEach desugaring, iterator helpers, and indexed
6
6
  * record operations. */
7
7
  import * as ts from "../ts7/adapter.js";
8
- import { BOOL, CAUGHT, DYN, F64, JSVAL, STRING, UNDEFINED_T, VOID, arrayOf, funcOf, isRefCounted, isSupportedArrayElem, isSupportedIndexValue, isUnitType, typeEquals } from "../../ir/ir.js";
8
+ import { BOOL, CAUGHT, DYN, F64, JSVAL, STRING, UNDEFINED_T, VOID, arrayOf, funcOf, isPrimitiveCollectionKey, isRefCounted, isSupportedArrayElem, isSupportedIndexValue, isUnitType, typeEquals } from "../../ir/ir.js";
9
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";
@@ -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) {
@@ -2991,7 +2992,8 @@ export function lowerArrayFromValue(lowerer, loc) {
2991
2992
  * terminate (fractional lengths truncate, negative/NaN produce an empty
2992
2993
  * array — Node-exact). Array inputs copy through the iterator's indexed
2993
2994
  * values, including holes as present undefined, and may map each value.
2994
- * Set inputs copy their values; strings iterate by code point and may map.
2995
+ * Map and Set inputs consume live values or entries and may map them.
2996
+ * Strings iterate by code point and may map.
2995
2997
  * Other iterable shapes keep the fence. Null when the callee isn't an
2996
2998
  * Array-static access. */
2997
2999
  export function lowerArrayFromCall(lowerer, call, access) {
@@ -3025,6 +3027,26 @@ export function lowerArrayFromCall(lowerer, call, access) {
3025
3027
  return { kind: "call", callee: name, args: [0, 1, 2].map((i) => args[i]
3026
3028
  ? lowerer.lowerExprExpecting(args[i], DYN) : dynUndefinedExpr(loc)), type: DYN, loc };
3027
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
+ }
3028
3050
  // MAPPER-LESS `Array.from({ length: n })` (usually with an explicit
3029
3051
  // type argument — the pMap results-array idiom): a length-n array of
3030
3052
  // ABSENT slots, filled by index before any read. Union elements with
@@ -3364,6 +3386,14 @@ export function lowerMapMethodCall(lowerer, call, access) {
3364
3386
  const v = receiverIr.value.kind === "dyn"
3365
3387
  ? lowerer.lowerCollectionKey(call.arguments[1], receiverIr.value)
3366
3388
  : lowerer.lowerExprExpecting(call.arguments[1], receiverIr.value);
3389
+ // A discarded set result needs no second receiver read or identity
3390
+ // owner. Keep the ordinary operand order: receiver, key, then value.
3391
+ let parent = call.parent;
3392
+ while (ts.isParenthesizedExpression(parent))
3393
+ parent = parent.parent;
3394
+ if (ts.isExpressionStatement(parent)) {
3395
+ return { kind: "mapIntrinsic", method: "set", receiver, args: [k, v], type: VOID, loc };
3396
+ }
3367
3397
  const slot = lowerer.declareHiddenLocal("%mapSetReceiver", receiver.type);
3368
3398
  const ref = varRef(slot.id, receiver.type, loc);
3369
3399
  return { kind: "seqExpr", stmts: [
@@ -5361,8 +5391,15 @@ export function lowerSetSeedNew(lowerer, node, setT) {
5361
5391
  const elems = node.elements.map((element) => lowerer.lowerCollectionKey(element, setT.elem));
5362
5392
  return { kind: "setNew", seed: { kind: "arrayLit", elems, type: arrayOf(setT.elem), loc }, type: setT, loc };
5363
5393
  }
5364
- const declared = lowerer.mapTypeOf(lowerer.typeOf(node));
5365
- const scalar = setT.elem.kind === "f64" || setT.elem.kind === "string";
5394
+ const input = collectionInput(lowerer, node);
5395
+ if (input && collectionDestinationMatches(lowerer, input, setT)) {
5396
+ const source = lowerCollectionInput(lowerer, input);
5397
+ if (source)
5398
+ return ingestCollection(lowerer, input, source, setT, loc);
5399
+ }
5400
+ const seedType = lowerer.typeOf(node);
5401
+ const declared = lowerer.mapTypeOf(seedType);
5402
+ const scalar = isPrimitiveCollectionKey(setT.elem, setT.elem.kind === "union" ? lowerer.unions.get(setT.elem.unionId)?.arms : undefined);
5366
5403
  let source = !scalar && (declared?.kind === "array" || declared?.kind === "record")
5367
5404
  ? lowerer.lowerCollectionKey(node, declared)
5368
5405
  : lowerer.lowerExpr(node);
@@ -5419,7 +5456,7 @@ function setFromSeedValue(lowerer, source, setT, missing) {
5419
5456
  }
5420
5457
  let seed;
5421
5458
  if (source.type.kind === "set" && typeEquals(source.type, setT)) {
5422
- seed = { kind: "setIntrinsic", method: "toArray", receiver: source, args: [], type: arrayOf(setT.elem), loc };
5459
+ return { kind: "setIntrinsic", method: "clone", receiver: source, args: [], type: setT, loc };
5423
5460
  }
5424
5461
  else if (source.type.kind === "string" && setT.elem.kind === "string") {
5425
5462
  seed = strCharsCall(lowerer, source, loc);
@@ -5500,10 +5537,18 @@ export function lowerMapSeedNew(lowerer, argNode, mapT) {
5500
5537
  ], true) };
5501
5538
  return mapFromSeedValue(lowerer, lowerer.lowerArrayLiteral(argNode, { kind: "array", elem: tuple }), mapT);
5502
5539
  }
5540
+ const input = collectionInput(lowerer, argNode);
5541
+ if (input) {
5542
+ if (!collectionDestinationMatches(lowerer, input, mapT))
5543
+ return null;
5544
+ const source = lowerCollectionInput(lowerer, input);
5545
+ if (source)
5546
+ return ingestCollection(lowerer, input, source, mapT, locOf(argNode));
5547
+ }
5503
5548
  const seed = lowerer.lowerExpr(argNode);
5504
5549
  return mapFromSeedValue(lowerer, seed, mapT);
5505
5550
  }
5506
- function mapFromSeedValue(lowerer, seed, mapT) {
5551
+ export function mapFromSeedValue(lowerer, seed, mapT) {
5507
5552
  const loc = seed.loc;
5508
5553
  if (isUnitType(seed.type)) {
5509
5554
  return defaultAfterUndefined(seed, { kind: "mapNew", type: mapT, loc });
@@ -5532,37 +5577,7 @@ function mapFromSeedValue(lowerer, seed, mapT) {
5532
5577
  if (seed.type.kind === "map") {
5533
5578
  if (!typeEquals(seed.type, mapT))
5534
5579
  return null;
5535
- const key = `copy:${typeKey(mapT)}`;
5536
- let name = lowerer.mapHofHelpers.get(key);
5537
- if (!name) {
5538
- name = `%map.copy.${lowerer.mapHofHelpers.size}`;
5539
- lowerer.mapHofHelpers.set(key, name);
5540
- const source = varRef("source.0", mapT, loc);
5541
- const target = varRef("target.0", mapT, loc);
5542
- const index = varRef("i.0", F64, loc);
5543
- const read = (method, type) => ({
5544
- kind: "mapIntrinsic", method, receiver: source, args: method === "iterCount" ? [] : [index], type, loc,
5545
- });
5546
- lowerer.liftedFns.push({
5547
- name, params: [{ localId: "source.0", name: "source", type: mapT }], returnType: mapT,
5548
- locals: [
5549
- { id: "source.0", name: "source", type: mapT, mutable: false },
5550
- { id: "target.0", name: "target", type: mapT, mutable: false },
5551
- { id: "i.0", name: "i", type: F64, mutable: true },
5552
- ],
5553
- body: [
5554
- { kind: "varDecl", localId: "target.0", init: { kind: "mapNew", type: mapT, loc }, loc },
5555
- countedFor(loc, read("iterCount", F64), () => [{
5556
- kind: "if", cond: read("iterLive", BOOL), then: [{ kind: "exprStmt", expr: {
5557
- kind: "mapIntrinsic", method: "set", receiver: target,
5558
- args: [read("iterKey", mapT.key), read("iterValue", mapT.value)], type: VOID, loc,
5559
- }, loc }], else_: null, loc,
5560
- }]),
5561
- { kind: "return", value: target, loc },
5562
- ], loc,
5563
- });
5564
- }
5565
- return { kind: "call", callee: name, args: [seed], type: mapT, loc };
5580
+ return { kind: "mapIntrinsic", method: "clone", receiver: seed, args: [], type: mapT, loc };
5566
5581
  }
5567
5582
  if (seed.type.kind === "dyn" || seed.type.kind === "array" &&
5568
5583
  !(seed.type.elem.kind === "record" && lowerer.shapes.get(seed.type.elem.shapeId)?.tuple)) {