@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.
Files changed (315) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +158 -31
  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-receivers.d.ts +9 -0
  7. package/dist/backend/llvm/borrowed-receivers.js +58 -0
  8. package/dist/backend/llvm/borrowed-receivers.js.map +1 -0
  9. package/dist/backend/llvm/call-lifetimes.d.ts +20 -0
  10. package/dist/backend/llvm/call-lifetimes.js +179 -0
  11. package/dist/backend/llvm/call-lifetimes.js.map +1 -0
  12. package/dist/backend/llvm/call-lifetimes.test.d.ts +1 -0
  13. package/dist/backend/llvm/call-lifetimes.test.js +205 -0
  14. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -0
  15. package/dist/backend/llvm/dyn.d.ts +5 -2
  16. package/dist/backend/llvm/dyn.js +163 -47
  17. package/dist/backend/llvm/dyn.js.map +1 -1
  18. package/dist/backend/llvm/emitter.d.ts +37 -1
  19. package/dist/backend/llvm/emitter.js +209 -21
  20. package/dist/backend/llvm/emitter.js.map +1 -1
  21. package/dist/backend/llvm/emitter.test.js +29 -2
  22. package/dist/backend/llvm/emitter.test.js.map +1 -1
  23. package/dist/backend/llvm/expr-async.js +1 -1
  24. package/dist/backend/llvm/expr-async.js.map +1 -1
  25. package/dist/backend/llvm/expr-calls.js +42 -5
  26. package/dist/backend/llvm/expr-calls.js.map +1 -1
  27. package/dist/backend/llvm/expr-containers.js +75 -13
  28. package/dist/backend/llvm/expr-containers.js.map +1 -1
  29. package/dist/backend/llvm/expr-dynamic.js +31 -6
  30. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  31. package/dist/backend/llvm/expr-primitives.js +6 -5
  32. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  33. package/dist/backend/llvm/expr-records.js +1 -1
  34. package/dist/backend/llvm/expr-records.js.map +1 -1
  35. package/dist/backend/llvm/expr-stream-bridges.js +75 -19
  36. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  37. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  38. package/dist/backend/llvm/expr-stream-callbacks.js +7 -57
  39. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  40. package/dist/backend/llvm/lib-dispatch.js +41 -3
  41. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  42. package/dist/backend/llvm/lib-filesystem.js +12 -9
  43. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  44. package/dist/backend/llvm/lib-shared.js +70 -2
  45. package/dist/backend/llvm/lib-shared.js.map +1 -1
  46. package/dist/backend/llvm/local-array-reads.d.ts +44 -0
  47. package/dist/backend/llvm/local-array-reads.js +313 -0
  48. package/dist/backend/llvm/local-array-reads.js.map +1 -0
  49. package/dist/backend/llvm/local-array-reads.test.d.ts +1 -0
  50. package/dist/backend/llvm/local-array-reads.test.js +446 -0
  51. package/dist/backend/llvm/local-array-reads.test.js.map +1 -0
  52. package/dist/backend/llvm/map-read-lifetimes.d.ts +36 -0
  53. package/dist/backend/llvm/map-read-lifetimes.js +128 -0
  54. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -0
  55. package/dist/backend/llvm/map-read-lifetimes.test.d.ts +1 -0
  56. package/dist/backend/llvm/map-read-lifetimes.test.js +123 -0
  57. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -0
  58. package/dist/backend/llvm/shapes.js +1 -0
  59. package/dist/backend/llvm/shapes.js.map +1 -1
  60. package/dist/backend/llvm/split.js +15 -5
  61. package/dist/backend/llvm/split.js.map +1 -1
  62. package/dist/backend/llvm/split.test.js +17 -0
  63. package/dist/backend/llvm/split.test.js.map +1 -1
  64. package/dist/backend/llvm/stack-unions.d.ts +20 -0
  65. package/dist/backend/llvm/stack-unions.js +61 -0
  66. package/dist/backend/llvm/stack-unions.js.map +1 -0
  67. package/dist/backend/llvm/stack-unions.test.d.ts +1 -0
  68. package/dist/backend/llvm/stack-unions.test.js +241 -0
  69. package/dist/backend/llvm/stack-unions.test.js.map +1 -0
  70. package/dist/backend/llvm/string-lifetimes.d.ts +12 -0
  71. package/dist/backend/llvm/string-lifetimes.js +70 -0
  72. package/dist/backend/llvm/string-lifetimes.js.map +1 -0
  73. package/dist/backend/llvm/string-lifetimes.test.d.ts +1 -0
  74. package/dist/backend/llvm/string-lifetimes.test.js +230 -0
  75. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -0
  76. package/dist/backend/mangle.d.ts +2 -0
  77. package/dist/backend/mangle.js +4 -0
  78. package/dist/backend/mangle.js.map +1 -1
  79. package/dist/backend/may-throw.js +71 -29
  80. package/dist/backend/may-throw.js.map +1 -1
  81. package/dist/backend/may-throw.test.js +104 -1
  82. package/dist/backend/may-throw.test.js.map +1 -1
  83. package/dist/backend/native-codegen.d.ts +1 -1
  84. package/dist/backend/native-codegen.js +4 -3
  85. package/dist/backend/native-codegen.js.map +1 -1
  86. package/dist/backend/native-codegen.test.js +11 -0
  87. package/dist/backend/native-codegen.test.js.map +1 -1
  88. package/dist/backend/native-toolchain.d.ts +2 -2
  89. package/dist/backend/native-toolchain.js +2 -0
  90. package/dist/backend/native-toolchain.js.map +1 -1
  91. package/dist/backend/target-diagnostics.d.ts +5 -0
  92. package/dist/backend/target-diagnostics.js +72 -1
  93. package/dist/backend/target-diagnostics.js.map +1 -1
  94. package/dist/backend/target-diagnostics.test.d.ts +1 -0
  95. package/dist/backend/target-diagnostics.test.js +68 -0
  96. package/dist/backend/target-diagnostics.test.js.map +1 -0
  97. package/dist/coverage/surface-manifest.js +5 -3
  98. package/dist/coverage/surface-manifest.js.map +1 -1
  99. package/dist/executable/executable-cache.d.ts +7 -3
  100. package/dist/executable/executable-cache.js +47 -11
  101. package/dist/executable/executable-cache.js.map +1 -1
  102. package/dist/executable/executable-cache.test.js +109 -2
  103. package/dist/executable/executable-cache.test.js.map +1 -1
  104. package/dist/executable/prepare.js +2 -1
  105. package/dist/executable/prepare.js.map +1 -1
  106. package/dist/frontend/builtin-modules.d.ts +1 -1
  107. package/dist/frontend/builtin-modules.js +1 -1
  108. package/dist/frontend/builtin-modules.js.map +1 -1
  109. package/dist/frontend/function-completion.d.ts +6 -0
  110. package/dist/frontend/function-completion.js +50 -0
  111. package/dist/frontend/function-completion.js.map +1 -0
  112. package/dist/frontend/input-tracker.js +3 -3
  113. package/dist/frontend/input-tracker.js.map +1 -1
  114. package/dist/frontend/input-tracker.test.js +38 -2
  115. package/dist/frontend/input-tracker.test.js.map +1 -1
  116. package/dist/frontend/lowering/abstract-equality.js +5 -1
  117. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  118. package/dist/frontend/lowering/checked-iterable-spread.d.ts +4 -0
  119. package/dist/frontend/lowering/checked-iterable-spread.js +30 -0
  120. package/dist/frontend/lowering/checked-iterable-spread.js.map +1 -0
  121. package/dist/frontend/lowering/checked-promise-all.d.ts +5 -0
  122. package/dist/frontend/lowering/checked-promise-all.js +31 -0
  123. package/dist/frontend/lowering/checked-promise-all.js.map +1 -0
  124. package/dist/frontend/lowering/class-callbacks.d.ts +1 -1
  125. package/dist/frontend/lowering/class-callbacks.js +7 -6
  126. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  127. package/dist/frontend/lowering/class-construction.d.ts +2 -0
  128. package/dist/frontend/lowering/class-construction.js +34 -5
  129. package/dist/frontend/lowering/class-construction.js.map +1 -1
  130. package/dist/frontend/lowering/class-descriptors.d.ts +1 -1
  131. package/dist/frontend/lowering/class-descriptors.js +12 -5
  132. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  133. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +25 -0
  134. package/dist/frontend/lowering/class-dynamic-dispatch.js +597 -78
  135. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  136. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +64 -2
  137. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  138. package/dist/frontend/lowering/class-instance-constructor.d.ts +1 -1
  139. package/dist/frontend/lowering/class-instance-constructor.js +11 -41
  140. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
  141. package/dist/frontend/lowering/class-method-values.d.ts +16 -0
  142. package/dist/frontend/lowering/class-method-values.js +60 -29
  143. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  144. package/dist/frontend/lowering/class-prototypes.d.ts +5 -1
  145. package/dist/frontend/lowering/class-prototypes.js +69 -10
  146. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  147. package/dist/frontend/lowering/class-runtime-statics.d.ts +4 -4
  148. package/dist/frontend/lowering/class-runtime-statics.js +26 -8
  149. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  150. package/dist/frontend/lowering/class-static-data.d.ts +1 -0
  151. package/dist/frontend/lowering/class-static-data.js +4 -2
  152. package/dist/frontend/lowering/class-static-data.js.map +1 -1
  153. package/dist/frontend/lowering/collection-ingestion.d.ts +31 -0
  154. package/dist/frontend/lowering/collection-ingestion.js +215 -0
  155. package/dist/frontend/lowering/collection-ingestion.js.map +1 -0
  156. package/dist/frontend/lowering/containers/bytes.js +19 -4
  157. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  158. package/dist/frontend/lowering/containers/string-and-regexp.js +6 -1
  159. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  160. package/dist/frontend/lowering/deferred-module-initializers.d.ts +13 -0
  161. package/dist/frontend/lowering/deferred-module-initializers.js +410 -0
  162. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -0
  163. package/dist/frontend/lowering/deferred-module-initializers.test.d.ts +1 -0
  164. package/dist/frontend/lowering/deferred-module-initializers.test.js +92 -0
  165. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -0
  166. package/dist/frontend/lowering/expressions/object-literals.js +31 -1
  167. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  168. package/dist/frontend/lowering/expressions/optional-chains.js +3 -3
  169. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  170. package/dist/frontend/lowering/import-meta.d.ts +10 -0
  171. package/dist/frontend/lowering/import-meta.js +52 -0
  172. package/dist/frontend/lowering/import-meta.js.map +1 -0
  173. package/dist/frontend/lowering/lower-assert.js +105 -41
  174. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  175. package/dist/frontend/lowering/lower-builtin-values.d.ts +2 -0
  176. package/dist/frontend/lowering/lower-builtin-values.js +22 -1
  177. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  178. package/dist/frontend/lowering/lower-builtins.d.ts +7 -22
  179. package/dist/frontend/lowering/lower-builtins.js +439 -95
  180. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  181. package/dist/frontend/lowering/lower-calls.js +289 -76
  182. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  183. package/dist/frontend/lowering/lower-classes.d.ts +5 -0
  184. package/dist/frontend/lowering/lower-classes.js +443 -29
  185. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  186. package/dist/frontend/lowering/lower-containers.d.ts +6 -2
  187. package/dist/frontend/lowering/lower-containers.js +79 -20
  188. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  189. package/dist/frontend/lowering/lower-exprs.d.ts +10 -6
  190. package/dist/frontend/lowering/lower-exprs.js +329 -170
  191. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  192. package/dist/frontend/lowering/lower-generators.js +5 -1
  193. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  194. package/dist/frontend/lowering/lower-inspect.js +58 -1
  195. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  196. package/dist/frontend/lowering/lower-island.js +4 -0
  197. package/dist/frontend/lowering/lower-island.js.map +1 -1
  198. package/dist/frontend/lowering/lower-island.test.d.ts +1 -0
  199. package/dist/frontend/lowering/lower-island.test.js +51 -0
  200. package/dist/frontend/lowering/lower-island.test.js.map +1 -0
  201. package/dist/frontend/lowering/lower-modules.d.ts +1 -3
  202. package/dist/frontend/lowering/lower-modules.js +186 -82
  203. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  204. package/dist/frontend/lowering/lower-modules.test.js +69 -1
  205. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  206. package/dist/frontend/lowering/lower-stmts.js +172 -103
  207. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  208. package/dist/frontend/lowering/lower-stmts.test.d.ts +1 -0
  209. package/dist/frontend/lowering/lower-stmts.test.js +77 -0
  210. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -0
  211. package/dist/frontend/lowering/lower-stream.js +2 -0
  212. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  213. package/dist/frontend/lowering/lower-system-errors.d.ts +6 -0
  214. package/dist/frontend/lowering/lower-system-errors.js +29 -0
  215. package/dist/frontend/lowering/lower-system-errors.js.map +1 -0
  216. package/dist/frontend/lowering/lower-url.d.ts +2 -1
  217. package/dist/frontend/lowering/lower-url.js +32 -9
  218. package/dist/frontend/lowering/lower-url.js.map +1 -1
  219. package/dist/frontend/lowering/lowerer.d.ts +30 -12
  220. package/dist/frontend/lowering/lowerer.js +268 -49
  221. package/dist/frontend/lowering/lowerer.js.map +1 -1
  222. package/dist/frontend/lowering/lowerer.test.js +38 -0
  223. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  224. package/dist/frontend/lowering/module-namespace-elements.d.ts +7 -0
  225. package/dist/frontend/lowering/module-namespace-elements.js +54 -0
  226. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -0
  227. package/dist/frontend/lowering/object-factory-new.d.ts +4 -3
  228. package/dist/frontend/lowering/object-factory-new.js +27 -14
  229. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  230. package/dist/frontend/lowering/surfaces.d.ts +3 -2
  231. package/dist/frontend/lowering/surfaces.js +93 -33
  232. package/dist/frontend/lowering/surfaces.js.map +1 -1
  233. package/dist/frontend/lowering/text-decoder-encoding.js +3 -0
  234. package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -1
  235. package/dist/frontend/lowering/text-decoder-encoding.test.js +2 -1
  236. package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -1
  237. package/dist/frontend/module-syntax.d.ts +1 -1
  238. package/dist/frontend/module-syntax.js +8 -1
  239. package/dist/frontend/module-syntax.js.map +1 -1
  240. package/dist/frontend/module-syntax.test.js +10 -0
  241. package/dist/frontend/module-syntax.test.js.map +1 -1
  242. package/dist/frontend/npm.d.ts +4 -0
  243. package/dist/frontend/npm.js +86 -33
  244. package/dist/frontend/npm.js.map +1 -1
  245. package/dist/frontend/npm.test.js +103 -0
  246. package/dist/frontend/npm.test.js.map +1 -1
  247. package/dist/frontend/pipeline-native.js +2 -1
  248. package/dist/frontend/pipeline-native.js.map +1 -1
  249. package/dist/frontend/program.js +4 -2
  250. package/dist/frontend/program.js.map +1 -1
  251. package/dist/frontend/services-node.js +3 -2
  252. package/dist/frontend/services-node.js.map +1 -1
  253. package/dist/frontend/services.d.ts +5 -1
  254. package/dist/frontend/services.js +9 -1
  255. package/dist/frontend/services.js.map +1 -1
  256. package/dist/frontend/services.test.js +21 -0
  257. package/dist/frontend/services.test.js.map +1 -1
  258. package/dist/frontend/ts7/ast-node.d.ts +2 -0
  259. package/dist/frontend/ts7/ast-node.js +30 -4
  260. package/dist/frontend/ts7/ast-node.js.map +1 -1
  261. package/dist/frontend/ts7/ast-node.test.js +60 -1
  262. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  263. package/dist/frontend/type-mapper.js +89 -14
  264. package/dist/frontend/type-mapper.js.map +1 -1
  265. package/dist/frontend/union-discriminants.js +22 -7
  266. package/dist/frontend/union-discriminants.js.map +1 -1
  267. package/dist/index.js +19 -12
  268. package/dist/index.js.map +1 -1
  269. package/dist/ir/analysis.js +1 -0
  270. package/dist/ir/analysis.js.map +1 -1
  271. package/dist/ir/integer-loops.d.ts +7 -0
  272. package/dist/ir/integer-loops.js +23 -0
  273. package/dist/ir/integer-loops.js.map +1 -1
  274. package/dist/ir/integer-loops.test.d.ts +1 -0
  275. package/dist/ir/integer-loops.test.js +41 -0
  276. package/dist/ir/integer-loops.test.js.map +1 -0
  277. package/dist/ir/ir.d.ts +44 -26
  278. package/dist/ir/ir.js +69 -11
  279. package/dist/ir/ir.js.map +1 -1
  280. package/dist/ir/ir.test.js +18 -0
  281. package/dist/ir/ir.test.js.map +1 -1
  282. package/dist/ir/serialize.js +21 -1
  283. package/dist/ir/serialize.js.map +1 -1
  284. package/dist/ir/serialize.test.js +21 -0
  285. package/dist/ir/serialize.test.js.map +1 -1
  286. package/dist/ir/traverse.d.ts +0 -3
  287. package/dist/ir/traverse.js +33 -20
  288. package/dist/ir/traverse.js.map +1 -1
  289. package/dist/ir/validate.js +216 -80
  290. package/dist/ir/validate.js.map +1 -1
  291. package/dist/ir/validate.test.js +244 -1
  292. package/dist/ir/validate.test.js.map +1 -1
  293. package/dist/library/compiler-self-identity.js +1 -1
  294. package/dist/library/compiler-self-identity.test.js +2 -2
  295. package/dist/library/compiler-self-identity.test.js.map +1 -1
  296. package/dist/library/fence-eval.js +9 -2
  297. package/dist/library/fence-eval.js.map +1 -1
  298. package/dist/library/fence-eval.test.d.ts +1 -0
  299. package/dist/library/fence-eval.test.js +21 -0
  300. package/dist/library/fence-eval.test.js.map +1 -0
  301. package/dist/library/int-infer.d.ts +2 -2
  302. package/dist/library/int-infer.js +10 -7
  303. package/dist/library/int-infer.js.map +1 -1
  304. package/dist/library/int-infer.test.js +44 -0
  305. package/dist/library/int-infer.test.js.map +1 -1
  306. package/dist/library/prepare.js +2 -1
  307. package/dist/library/prepare.js.map +1 -1
  308. package/dist/native/runtime-typescript.d.ts +4 -0
  309. package/dist/native/runtime-typescript.js +61 -0
  310. package/dist/native/runtime-typescript.js.map +1 -0
  311. package/dist/native/runtime-typescript.test.d.ts +1 -0
  312. package/dist/native/runtime-typescript.test.js +41 -0
  313. package/dist/native/runtime-typescript.test.js.map +1 -0
  314. package/package.json +20 -20
  315. 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 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
@@ -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 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.
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) && !MAP_ITER_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 (MAP_ITER_METHODS.has(name)) {
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
- /** The iterator methods the lowering DOES cover — in exactly one context. */
3380
- const MAP_ITER_METHODS = new Set(["keys", "values", "entries"]);
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, lowered ONLY as the operand of a spread inside an array
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. Every other context
3390
- * (storing the iterator, .next(), passing it along) would need a real
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.noLowering(`.${method}() outside an immediate array spread`, call, `iterator objects have no lowering — drain it into an array where it is made: [...m.${method}()]`);
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 declared = lowerer.mapTypeOf(lowerer.typeOf(node));
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 (source.type.kind === "dyn" && setT.elem.kind === "dyn") {
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 === "dyn" || seed.type.elem.kind === "array")) {
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]