@scriptc/compiler 0.2.2 → 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 (178) 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-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 +2 -2
  16. package/dist/backend/llvm/dyn.js +79 -35
  17. package/dist/backend/llvm/dyn.js.map +1 -1
  18. package/dist/backend/llvm/emitter.d.ts +33 -0
  19. package/dist/backend/llvm/emitter.js +189 -16
  20. package/dist/backend/llvm/emitter.js.map +1 -1
  21. package/dist/backend/llvm/emitter.test.js +20 -1
  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 +70 -13
  28. package/dist/backend/llvm/expr-containers.js.map +1 -1
  29. package/dist/backend/llvm/expr-dynamic.js +1 -1
  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 +5 -10
  36. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  37. package/dist/backend/llvm/lib-shared.js +35 -1
  38. package/dist/backend/llvm/lib-shared.js.map +1 -1
  39. package/dist/backend/llvm/local-array-reads.d.ts +44 -0
  40. package/dist/backend/llvm/local-array-reads.js +313 -0
  41. package/dist/backend/llvm/local-array-reads.js.map +1 -0
  42. package/dist/backend/llvm/local-array-reads.test.d.ts +1 -0
  43. package/dist/backend/llvm/local-array-reads.test.js +446 -0
  44. package/dist/backend/llvm/local-array-reads.test.js.map +1 -0
  45. package/dist/backend/llvm/map-read-lifetimes.d.ts +36 -0
  46. package/dist/backend/llvm/map-read-lifetimes.js +128 -0
  47. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -0
  48. package/dist/backend/llvm/map-read-lifetimes.test.d.ts +1 -0
  49. package/dist/backend/llvm/map-read-lifetimes.test.js +123 -0
  50. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -0
  51. package/dist/backend/llvm/shapes.js +1 -0
  52. package/dist/backend/llvm/shapes.js.map +1 -1
  53. package/dist/backend/llvm/split.js +15 -5
  54. package/dist/backend/llvm/split.js.map +1 -1
  55. package/dist/backend/llvm/split.test.js +17 -0
  56. package/dist/backend/llvm/split.test.js.map +1 -1
  57. package/dist/backend/llvm/stack-unions.d.ts +20 -0
  58. package/dist/backend/llvm/stack-unions.js +61 -0
  59. package/dist/backend/llvm/stack-unions.js.map +1 -0
  60. package/dist/backend/llvm/stack-unions.test.d.ts +1 -0
  61. package/dist/backend/llvm/stack-unions.test.js +241 -0
  62. package/dist/backend/llvm/stack-unions.test.js.map +1 -0
  63. package/dist/backend/llvm/string-lifetimes.d.ts +12 -0
  64. package/dist/backend/llvm/string-lifetimes.js +70 -0
  65. package/dist/backend/llvm/string-lifetimes.js.map +1 -0
  66. package/dist/backend/llvm/string-lifetimes.test.d.ts +1 -0
  67. package/dist/backend/llvm/string-lifetimes.test.js +230 -0
  68. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -0
  69. package/dist/backend/mangle.d.ts +2 -0
  70. package/dist/backend/mangle.js +4 -0
  71. package/dist/backend/mangle.js.map +1 -1
  72. package/dist/backend/may-throw.js +67 -29
  73. package/dist/backend/may-throw.js.map +1 -1
  74. package/dist/backend/may-throw.test.js +104 -1
  75. package/dist/backend/may-throw.test.js.map +1 -1
  76. package/dist/backend/native-toolchain.d.ts +2 -2
  77. package/dist/backend/native-toolchain.js +2 -0
  78. package/dist/backend/native-toolchain.js.map +1 -1
  79. package/dist/frontend/input-tracker.js +3 -3
  80. package/dist/frontend/input-tracker.js.map +1 -1
  81. package/dist/frontend/input-tracker.test.js +38 -2
  82. package/dist/frontend/input-tracker.test.js.map +1 -1
  83. package/dist/frontend/lowering/collection-ingestion.d.ts +31 -0
  84. package/dist/frontend/lowering/collection-ingestion.js +215 -0
  85. package/dist/frontend/lowering/collection-ingestion.js.map +1 -0
  86. package/dist/frontend/lowering/containers/bytes.js +2 -0
  87. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  88. package/dist/frontend/lowering/import-meta.d.ts +10 -0
  89. package/dist/frontend/lowering/import-meta.js +52 -0
  90. package/dist/frontend/lowering/import-meta.js.map +1 -0
  91. package/dist/frontend/lowering/lower-assert.js +105 -41
  92. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  93. package/dist/frontend/lowering/lower-builtin-values.d.ts +2 -0
  94. package/dist/frontend/lowering/lower-builtin-values.js +22 -1
  95. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  96. package/dist/frontend/lowering/lower-builtins.d.ts +3 -13
  97. package/dist/frontend/lowering/lower-builtins.js +150 -46
  98. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  99. package/dist/frontend/lowering/lower-calls.js +6 -3
  100. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  101. package/dist/frontend/lowering/lower-classes.js +4 -4
  102. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  103. package/dist/frontend/lowering/lower-containers.d.ts +5 -1
  104. package/dist/frontend/lowering/lower-containers.js +40 -3
  105. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  106. package/dist/frontend/lowering/lower-exprs.js +35 -41
  107. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  108. package/dist/frontend/lowering/lower-inspect.js +43 -0
  109. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  110. package/dist/frontend/lowering/lower-stmts.js +72 -68
  111. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  112. package/dist/frontend/lowering/lower-system-errors.d.ts +6 -0
  113. package/dist/frontend/lowering/lower-system-errors.js +29 -0
  114. package/dist/frontend/lowering/lower-system-errors.js.map +1 -0
  115. package/dist/frontend/lowering/lowerer.d.ts +4 -3
  116. package/dist/frontend/lowering/lowerer.js +50 -22
  117. package/dist/frontend/lowering/lowerer.js.map +1 -1
  118. package/dist/frontend/lowering/surfaces.d.ts +2 -2
  119. package/dist/frontend/lowering/surfaces.js +69 -21
  120. package/dist/frontend/lowering/surfaces.js.map +1 -1
  121. package/dist/frontend/module-syntax.d.ts +1 -1
  122. package/dist/frontend/module-syntax.js +8 -1
  123. package/dist/frontend/module-syntax.js.map +1 -1
  124. package/dist/frontend/module-syntax.test.js +10 -0
  125. package/dist/frontend/module-syntax.test.js.map +1 -1
  126. package/dist/frontend/npm.d.ts +4 -0
  127. package/dist/frontend/npm.js +86 -33
  128. package/dist/frontend/npm.js.map +1 -1
  129. package/dist/frontend/npm.test.js +103 -0
  130. package/dist/frontend/npm.test.js.map +1 -1
  131. package/dist/frontend/pipeline-native.js +2 -1
  132. package/dist/frontend/pipeline-native.js.map +1 -1
  133. package/dist/frontend/services-node.js +3 -2
  134. package/dist/frontend/services-node.js.map +1 -1
  135. package/dist/frontend/services.d.ts +5 -1
  136. package/dist/frontend/services.js +9 -1
  137. package/dist/frontend/services.js.map +1 -1
  138. package/dist/frontend/services.test.js +21 -0
  139. package/dist/frontend/services.test.js.map +1 -1
  140. package/dist/frontend/ts7/ast-node.d.ts +2 -0
  141. package/dist/frontend/ts7/ast-node.js +30 -4
  142. package/dist/frontend/ts7/ast-node.js.map +1 -1
  143. package/dist/frontend/ts7/ast-node.test.js +60 -1
  144. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  145. package/dist/frontend/type-mapper.js +6 -0
  146. package/dist/frontend/type-mapper.js.map +1 -1
  147. package/dist/index.js +3 -2
  148. package/dist/index.js.map +1 -1
  149. package/dist/ir/analysis.js +1 -0
  150. package/dist/ir/analysis.js.map +1 -1
  151. package/dist/ir/integer-loops.d.ts +7 -0
  152. package/dist/ir/integer-loops.js +23 -0
  153. package/dist/ir/integer-loops.js.map +1 -1
  154. package/dist/ir/integer-loops.test.d.ts +1 -0
  155. package/dist/ir/integer-loops.test.js +41 -0
  156. package/dist/ir/integer-loops.test.js.map +1 -0
  157. package/dist/ir/ir.d.ts +21 -17
  158. package/dist/ir/ir.js +43 -9
  159. package/dist/ir/ir.js.map +1 -1
  160. package/dist/ir/ir.test.js +18 -0
  161. package/dist/ir/ir.test.js.map +1 -1
  162. package/dist/ir/validate.js +161 -76
  163. package/dist/ir/validate.js.map +1 -1
  164. package/dist/ir/validate.test.js +227 -0
  165. package/dist/ir/validate.test.js.map +1 -1
  166. package/dist/library/fence-eval.js +9 -2
  167. package/dist/library/fence-eval.js.map +1 -1
  168. package/dist/library/fence-eval.test.d.ts +1 -0
  169. package/dist/library/fence-eval.test.js +21 -0
  170. package/dist/library/fence-eval.test.js.map +1 -0
  171. package/dist/native/runtime-typescript.d.ts +4 -0
  172. package/dist/native/runtime-typescript.js +61 -0
  173. package/dist/native/runtime-typescript.js.map +1 -0
  174. package/dist/native/runtime-typescript.test.d.ts +1 -0
  175. package/dist/native/runtime-typescript.test.js +41 -0
  176. package/dist/native/runtime-typescript.test.js.map +1 -0
  177. package/package.json +20 -20
  178. 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
@@ -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
@@ -5361,7 +5383,14 @@ export function lowerSetSeedNew(lowerer, node, setT) {
5361
5383
  const elems = node.elements.map((element) => lowerer.lowerCollectionKey(element, setT.elem));
5362
5384
  return { kind: "setNew", seed: { kind: "arrayLit", elems, type: arrayOf(setT.elem), loc }, type: setT, loc };
5363
5385
  }
5364
- 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);
5365
5394
  const scalar = setT.elem.kind === "f64" || setT.elem.kind === "string";
5366
5395
  let source = !scalar && (declared?.kind === "array" || declared?.kind === "record")
5367
5396
  ? lowerer.lowerCollectionKey(node, declared)
@@ -5500,10 +5529,18 @@ export function lowerMapSeedNew(lowerer, argNode, mapT) {
5500
5529
  ], true) };
5501
5530
  return mapFromSeedValue(lowerer, lowerer.lowerArrayLiteral(argNode, { kind: "array", elem: tuple }), mapT);
5502
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
+ }
5503
5540
  const seed = lowerer.lowerExpr(argNode);
5504
5541
  return mapFromSeedValue(lowerer, seed, mapT);
5505
5542
  }
5506
- function mapFromSeedValue(lowerer, seed, mapT) {
5543
+ export function mapFromSeedValue(lowerer, seed, mapT) {
5507
5544
  const loc = seed.loc;
5508
5545
  if (isUnitType(seed.type)) {
5509
5546
  return defaultAfterUndefined(seed, { kind: "mapNew", type: mapT, loc });