@scriptc/compiler 0.2.1 → 0.2.2

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 (193) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +59 -4
  2. package/dist/backend/llvm/dyn.d.ts +3 -0
  3. package/dist/backend/llvm/dyn.js +84 -12
  4. package/dist/backend/llvm/dyn.js.map +1 -1
  5. package/dist/backend/llvm/emitter.d.ts +4 -1
  6. package/dist/backend/llvm/emitter.js +20 -5
  7. package/dist/backend/llvm/emitter.js.map +1 -1
  8. package/dist/backend/llvm/emitter.test.js +9 -1
  9. package/dist/backend/llvm/emitter.test.js.map +1 -1
  10. package/dist/backend/llvm/expr-containers.js +5 -0
  11. package/dist/backend/llvm/expr-containers.js.map +1 -1
  12. package/dist/backend/llvm/expr-dynamic.js +30 -5
  13. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  14. package/dist/backend/llvm/expr-stream-bridges.js +70 -9
  15. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  16. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  17. package/dist/backend/llvm/expr-stream-callbacks.js +7 -57
  18. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  19. package/dist/backend/llvm/lib-dispatch.js +41 -3
  20. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  21. package/dist/backend/llvm/lib-filesystem.js +12 -9
  22. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  23. package/dist/backend/llvm/lib-shared.js +35 -1
  24. package/dist/backend/llvm/lib-shared.js.map +1 -1
  25. package/dist/backend/may-throw.js +4 -0
  26. package/dist/backend/may-throw.js.map +1 -1
  27. package/dist/backend/native-codegen.d.ts +1 -1
  28. package/dist/backend/native-codegen.js +4 -3
  29. package/dist/backend/native-codegen.js.map +1 -1
  30. package/dist/backend/native-codegen.test.js +11 -0
  31. package/dist/backend/native-codegen.test.js.map +1 -1
  32. package/dist/backend/target-diagnostics.d.ts +5 -0
  33. package/dist/backend/target-diagnostics.js +72 -1
  34. package/dist/backend/target-diagnostics.js.map +1 -1
  35. package/dist/backend/target-diagnostics.test.d.ts +1 -0
  36. package/dist/backend/target-diagnostics.test.js +68 -0
  37. package/dist/backend/target-diagnostics.test.js.map +1 -0
  38. package/dist/coverage/surface-manifest.js +5 -3
  39. package/dist/coverage/surface-manifest.js.map +1 -1
  40. package/dist/executable/executable-cache.d.ts +7 -3
  41. package/dist/executable/executable-cache.js +47 -11
  42. package/dist/executable/executable-cache.js.map +1 -1
  43. package/dist/executable/executable-cache.test.js +109 -2
  44. package/dist/executable/executable-cache.test.js.map +1 -1
  45. package/dist/executable/prepare.js +2 -1
  46. package/dist/executable/prepare.js.map +1 -1
  47. package/dist/frontend/builtin-modules.d.ts +1 -1
  48. package/dist/frontend/builtin-modules.js +1 -1
  49. package/dist/frontend/builtin-modules.js.map +1 -1
  50. package/dist/frontend/function-completion.d.ts +6 -0
  51. package/dist/frontend/function-completion.js +50 -0
  52. package/dist/frontend/function-completion.js.map +1 -0
  53. package/dist/frontend/lowering/abstract-equality.js +5 -1
  54. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  55. package/dist/frontend/lowering/checked-iterable-spread.d.ts +4 -0
  56. package/dist/frontend/lowering/checked-iterable-spread.js +30 -0
  57. package/dist/frontend/lowering/checked-iterable-spread.js.map +1 -0
  58. package/dist/frontend/lowering/checked-promise-all.d.ts +5 -0
  59. package/dist/frontend/lowering/checked-promise-all.js +31 -0
  60. package/dist/frontend/lowering/checked-promise-all.js.map +1 -0
  61. package/dist/frontend/lowering/class-callbacks.d.ts +1 -1
  62. package/dist/frontend/lowering/class-callbacks.js +7 -6
  63. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  64. package/dist/frontend/lowering/class-construction.d.ts +2 -0
  65. package/dist/frontend/lowering/class-construction.js +34 -5
  66. package/dist/frontend/lowering/class-construction.js.map +1 -1
  67. package/dist/frontend/lowering/class-descriptors.d.ts +1 -1
  68. package/dist/frontend/lowering/class-descriptors.js +12 -5
  69. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  70. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +25 -0
  71. package/dist/frontend/lowering/class-dynamic-dispatch.js +597 -78
  72. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  73. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +64 -2
  74. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  75. package/dist/frontend/lowering/class-instance-constructor.d.ts +1 -1
  76. package/dist/frontend/lowering/class-instance-constructor.js +11 -41
  77. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
  78. package/dist/frontend/lowering/class-method-values.d.ts +16 -0
  79. package/dist/frontend/lowering/class-method-values.js +60 -29
  80. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  81. package/dist/frontend/lowering/class-prototypes.d.ts +5 -1
  82. package/dist/frontend/lowering/class-prototypes.js +69 -10
  83. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  84. package/dist/frontend/lowering/class-runtime-statics.d.ts +4 -4
  85. package/dist/frontend/lowering/class-runtime-statics.js +26 -8
  86. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  87. package/dist/frontend/lowering/class-static-data.d.ts +1 -0
  88. package/dist/frontend/lowering/class-static-data.js +4 -2
  89. package/dist/frontend/lowering/class-static-data.js.map +1 -1
  90. package/dist/frontend/lowering/containers/bytes.js +17 -4
  91. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  92. package/dist/frontend/lowering/containers/string-and-regexp.js +6 -1
  93. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  94. package/dist/frontend/lowering/deferred-module-initializers.d.ts +13 -0
  95. package/dist/frontend/lowering/deferred-module-initializers.js +410 -0
  96. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -0
  97. package/dist/frontend/lowering/deferred-module-initializers.test.d.ts +1 -0
  98. package/dist/frontend/lowering/deferred-module-initializers.test.js +92 -0
  99. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -0
  100. package/dist/frontend/lowering/expressions/object-literals.js +31 -1
  101. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  102. package/dist/frontend/lowering/expressions/optional-chains.js +3 -3
  103. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  104. package/dist/frontend/lowering/lower-builtins.d.ts +4 -9
  105. package/dist/frontend/lowering/lower-builtins.js +291 -51
  106. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  107. package/dist/frontend/lowering/lower-calls.js +283 -73
  108. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  109. package/dist/frontend/lowering/lower-classes.d.ts +5 -0
  110. package/dist/frontend/lowering/lower-classes.js +439 -25
  111. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  112. package/dist/frontend/lowering/lower-containers.d.ts +1 -1
  113. package/dist/frontend/lowering/lower-containers.js +39 -17
  114. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  115. package/dist/frontend/lowering/lower-exprs.d.ts +10 -6
  116. package/dist/frontend/lowering/lower-exprs.js +294 -129
  117. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  118. package/dist/frontend/lowering/lower-generators.js +5 -1
  119. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  120. package/dist/frontend/lowering/lower-inspect.js +15 -1
  121. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  122. package/dist/frontend/lowering/lower-island.js +4 -0
  123. package/dist/frontend/lowering/lower-island.js.map +1 -1
  124. package/dist/frontend/lowering/lower-island.test.d.ts +1 -0
  125. package/dist/frontend/lowering/lower-island.test.js +51 -0
  126. package/dist/frontend/lowering/lower-island.test.js.map +1 -0
  127. package/dist/frontend/lowering/lower-modules.d.ts +1 -3
  128. package/dist/frontend/lowering/lower-modules.js +186 -82
  129. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  130. package/dist/frontend/lowering/lower-modules.test.js +69 -1
  131. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  132. package/dist/frontend/lowering/lower-stmts.js +100 -35
  133. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  134. package/dist/frontend/lowering/lower-stmts.test.d.ts +1 -0
  135. package/dist/frontend/lowering/lower-stmts.test.js +77 -0
  136. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -0
  137. package/dist/frontend/lowering/lower-stream.js +2 -0
  138. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  139. package/dist/frontend/lowering/lower-url.d.ts +2 -1
  140. package/dist/frontend/lowering/lower-url.js +32 -9
  141. package/dist/frontend/lowering/lower-url.js.map +1 -1
  142. package/dist/frontend/lowering/lowerer.d.ts +26 -9
  143. package/dist/frontend/lowering/lowerer.js +218 -27
  144. package/dist/frontend/lowering/lowerer.js.map +1 -1
  145. package/dist/frontend/lowering/lowerer.test.js +38 -0
  146. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  147. package/dist/frontend/lowering/module-namespace-elements.d.ts +7 -0
  148. package/dist/frontend/lowering/module-namespace-elements.js +54 -0
  149. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -0
  150. package/dist/frontend/lowering/object-factory-new.d.ts +4 -3
  151. package/dist/frontend/lowering/object-factory-new.js +27 -14
  152. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  153. package/dist/frontend/lowering/surfaces.d.ts +1 -0
  154. package/dist/frontend/lowering/surfaces.js +24 -12
  155. package/dist/frontend/lowering/surfaces.js.map +1 -1
  156. package/dist/frontend/lowering/text-decoder-encoding.js +3 -0
  157. package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -1
  158. package/dist/frontend/lowering/text-decoder-encoding.test.js +2 -1
  159. package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -1
  160. package/dist/frontend/program.js +4 -2
  161. package/dist/frontend/program.js.map +1 -1
  162. package/dist/frontend/type-mapper.js +83 -14
  163. package/dist/frontend/type-mapper.js.map +1 -1
  164. package/dist/frontend/union-discriminants.js +22 -7
  165. package/dist/frontend/union-discriminants.js.map +1 -1
  166. package/dist/index.js +16 -10
  167. package/dist/index.js.map +1 -1
  168. package/dist/ir/ir.d.ts +27 -13
  169. package/dist/ir/ir.js +26 -2
  170. package/dist/ir/ir.js.map +1 -1
  171. package/dist/ir/serialize.js +21 -1
  172. package/dist/ir/serialize.js.map +1 -1
  173. package/dist/ir/serialize.test.js +21 -0
  174. package/dist/ir/serialize.test.js.map +1 -1
  175. package/dist/ir/traverse.d.ts +0 -3
  176. package/dist/ir/traverse.js +33 -20
  177. package/dist/ir/traverse.js.map +1 -1
  178. package/dist/ir/validate.js +56 -5
  179. package/dist/ir/validate.js.map +1 -1
  180. package/dist/ir/validate.test.js +17 -1
  181. package/dist/ir/validate.test.js.map +1 -1
  182. package/dist/library/compiler-self-identity.js +1 -1
  183. package/dist/library/compiler-self-identity.test.js +2 -2
  184. package/dist/library/compiler-self-identity.test.js.map +1 -1
  185. package/dist/library/int-infer.d.ts +2 -2
  186. package/dist/library/int-infer.js +10 -7
  187. package/dist/library/int-infer.js.map +1 -1
  188. package/dist/library/int-infer.test.js +44 -0
  189. package/dist/library/int-infer.test.js.map +1 -1
  190. package/dist/library/prepare.js +2 -1
  191. package/dist/library/prepare.js.map +1 -1
  192. package/package.json +20 -20
  193. package/surface-manifest.json +115 -13
@@ -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;
@@ -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";
@@ -2808,6 +2808,14 @@ export function lowerArrayConstructor(lowerer, expr, args) {
2808
2808
  lowerer.noLowering("Array constructor with spread arguments", expr);
2809
2809
  }
2810
2810
  let result = lowerer.mapTypeOf(lowerer.typeOf(expr));
2811
+ // Constructors without a concrete element layout keep their checked
2812
+ // reference. Known element forms retain native arrays, including their
2813
+ // existing sparse storage and indexed property contracts.
2814
+ if (!lowerer.dynamic && isJsSourceFile(expr.getSourceFile()) &&
2815
+ (result?.kind !== "array" || result.elem.kind === "dyn")) {
2816
+ return { kind: "dynCall", callee: { kind: "libCall", fn: "dyn.arrayConstructor", args: [], type: DYN, loc },
2817
+ calleeName: "Array", args: args.map((arg) => lowerer.lowerExprExpecting(arg, DYN)), type: DYN, loc };
2818
+ }
2811
2819
  if (result?.kind !== "array") {
2812
2820
  const contextual = lowerer.checker.getContextualType(expr);
2813
2821
  if (contextual)
@@ -2896,7 +2904,7 @@ export function lowerArrayOfCall(lowerer, call, access) {
2896
2904
  }
2897
2905
  /** Mapper-less checked Array.from: acquire once, then step through emitted
2898
2906
  * property and call dispatch so native class iterators retain their methods. */
2899
- export function lowerCheckedArrayFrom(lowerer, source, loc, mapper, receiver, numeric = false) {
2907
+ export function lowerCheckedArrayFrom(lowerer, source, loc, mapper, receiver, numeric = false, iterable) {
2900
2908
  const iterator = lowerer.declareHiddenLocal("%fromIterator", DYN);
2901
2909
  const next = lowerer.declareHiddenLocal("%fromNext", DYN);
2902
2910
  const step = lowerer.declareHiddenLocal("%fromStep", DYN);
@@ -2931,7 +2939,7 @@ export function lowerCheckedArrayFrom(lowerer, source, loc, mapper, receiver, nu
2931
2939
  { kind: "exprStmt", expr: nodeThrowExpr(1, "", "Array.from mapper is not a function", DYN, loc), loc },
2932
2940
  ], loc },
2933
2941
  ], 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 },
2942
+ { 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
2943
  { kind: "varDecl", localId: next.id, init: get(varRef(iterator.id, DYN, loc), "next"), loc },
2936
2944
  { kind: "varDecl", localId: out.id, init: { kind: "dynArrLit", elems: [], type: DYN, loc }, loc },
2937
2945
  { kind: "varDecl", localId: done.id, init: boolLit(false, loc), loc },
@@ -3314,7 +3322,7 @@ export function lowerMapMethodCall(lowerer, call, access) {
3314
3322
  if (lowerer.chainBlocked(access, call))
3315
3323
  return null;
3316
3324
  const name = access.name.text;
3317
- if (!MAP_METHODS.has(name) && !MAP_ITER_METHODS.has(name))
3325
+ if (!MAP_METHODS.has(name))
3318
3326
  return null;
3319
3327
  let receiverIr = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
3320
3328
  let probedUntyped = false;
@@ -3370,31 +3378,39 @@ export function lowerMapMethodCall(lowerer, call, access) {
3370
3378
  if (name === "clear") {
3371
3379
  return { kind: "mapIntrinsic", method: "clear", receiver, args: [], type: VOID, loc };
3372
3380
  }
3373
- if (MAP_ITER_METHODS.has(name)) {
3381
+ if (COLLECTION_ITERATOR_METHODS.has(name)) {
3374
3382
  return lowerMapIterDrainCall(lowerer, call, receiver, receiverIr, name);
3375
3383
  }
3376
3384
  // forEach
3377
3385
  return lowerMapForEachCall(lowerer, call, receiver, receiverIr, probedUntyped);
3378
3386
  }
3379
- /** The iterator methods the lowering DOES cover — in exactly one context. */
3380
- const MAP_ITER_METHODS = new Set(["keys", "values", "entries"]);
3387
+ /** Stored collection iterators retain the native collection by reference. The
3388
+ * checked-value runtime supplies the live cursor without embedding an engine. */
3389
+ function lowerCollectionIteratorCall(lowerer, call, receiver, method) {
3390
+ const access = call.expression;
3391
+ if (!ts.isPropertyAccessExpression(access))
3392
+ throw new InternalCompilerError("collection iterator requires a member call");
3393
+ const boxed = lowerer.coerceInto(access.expression, receiver, DYN);
3394
+ const result = lowerDynDispatchMethodCall(lowerer, call, access, boxed, false);
3395
+ if (!result)
3396
+ throw new InternalCompilerError(`missing collection iterator dispatch: ${method}`);
3397
+ return result;
3398
+ }
3381
3399
  /** `[...m.keys()]` / `[...m.values()]` / `[...m.entries()]` — the iterator
3382
- * methods, lowered ONLY as the operand of a spread inside an array
3400
+ * methods use an optimized drain as the operand of a spread inside an array
3383
3401
  * literal, where JS drains the iterator on the spot. The call desugars to
3384
3402
  * a direct call of a synthetic drain function whose loop walks the same
3385
3403
  * iteration primitives as the forEach desugar and pushes each live entry
3386
3404
  * into a fresh array — key, value, or `[K, V]` tuple record per method.
3387
3405
  * No user code runs mid-drain (and nothing here mutates the map), so no
3388
3406
  * 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. */
3407
+ * the snapshot IS what JS's immediate drain observes. Other contexts keep
3408
+ * a live iterator through the native checked-value runtime. */
3392
3409
  function lowerMapIterDrainCall(lowerer, call, receiver, mapT, method) {
3393
3410
  const loc = locOf(call);
3394
3411
  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
- }
3412
+ if (!inArraySpread)
3413
+ return lowerCollectionIteratorCall(lowerer, call, receiver, method);
3398
3414
  // The pushed element type. For entries the checker's own element type —
3399
3415
  // the [K, V] tuple behind MapIterator<[K, V]> — carries the interned
3400
3416
  // tuple shape the surrounding literal will intern too.
@@ -3747,6 +3763,9 @@ export function lowerSetMethodCall(lowerer, call, access) {
3747
3763
  if (name === "forEach" && call.arguments.length !== 1) {
3748
3764
  lowerer.noLowering(`.forEach with ${call.arguments.length} arguments`, call, "the thisArg parameter has no lowering — use an arrow function");
3749
3765
  }
3766
+ if (COLLECTION_ITERATOR_METHODS.has(name)) {
3767
+ return lowerCollectionIteratorCall(lowerer, call, receiver, name);
3768
+ }
3750
3769
  if (SET_COMBINE_METHODS.has(name)) {
3751
3770
  return lowerSetCombineCall(lowerer, call, name, receiver, receiverIr);
3752
3771
  }
@@ -5351,8 +5370,8 @@ export function lowerSetSeedNew(lowerer, node, setT) {
5351
5370
  (source.type.kind === "dyn" || source.type.kind === "jsval")) {
5352
5371
  source = lowerer.coerceInto(node, source, STRING);
5353
5372
  }
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 };
5373
+ if (setT.elem.kind === "dyn" && lowerer.dynConvertible(source.type)) {
5374
+ return { kind: "dynCheck", value: { kind: "libCall", fn: "dyn.nativeSetNew", args: [lowerer.coerceInto(node, source, DYN)], type: DYN, loc }, type: setT, loc };
5356
5375
  }
5357
5376
  if (declared?.kind === "array" && typeEquals(declared.elem, setT.elem)) {
5358
5377
  // Preserve the existing checked scalar-iterable bridge. Reference
@@ -5546,7 +5565,7 @@ function mapFromSeedValue(lowerer, seed, mapT) {
5546
5565
  return { kind: "call", callee: name, args: [seed], type: mapT, loc };
5547
5566
  }
5548
5567
  if (seed.type.kind === "dyn" || seed.type.kind === "array" &&
5549
- (seed.type.elem.kind === "dyn" || seed.type.elem.kind === "array")) {
5568
+ !(seed.type.elem.kind === "record" && lowerer.shapes.get(seed.type.elem.shapeId)?.tuple)) {
5550
5569
  const key = `checked-seed:${typeKey(mapT)}`;
5551
5570
  let name = lowerer.mapHofHelpers.get(key);
5552
5571
  if (!name) {
@@ -5901,6 +5920,9 @@ function lowerTypedObjectFromEntriesCall(lowerer, call, callee) {
5901
5920
  const argIr = lowerer.mapTypeOf(lowerer.typeOf(argNode));
5902
5921
  if (argIr?.kind !== "array")
5903
5922
  return null;
5923
+ const represented = tryLowerExpression(lowerer, argNode);
5924
+ if (represented && !typeEquals(represented.type, argIr))
5925
+ return null;
5904
5926
  // `Object.fromEntries(rows)` over a `string[][]` VALUE — the env-line
5905
5927
  // idiom (`envArray.map((env) => env.split('='))`). The checker has no
5906
5928
  // tuple to type here (string[] misses the lib's [PropertyKey, T]