@scriptc/compiler 0.0.32 → 0.0.34

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 (120) hide show
  1. package/dist/backend/cc-cache.test.js +430 -1
  2. package/dist/backend/cc-cache.test.js.map +1 -1
  3. package/dist/backend/cc.d.ts +25 -0
  4. package/dist/backend/cc.js +818 -88
  5. package/dist/backend/cc.js.map +1 -1
  6. package/dist/backend/emission/emit-exprs.js +79 -3
  7. package/dist/backend/emission/emit-exprs.js.map +1 -1
  8. package/dist/backend/emission/emit-shapes.js +37 -4
  9. package/dist/backend/emission/emit-shapes.js.map +1 -1
  10. package/dist/backend/emission/emitter.d.ts +23 -7
  11. package/dist/backend/emission/emitter.js +171 -27
  12. package/dist/backend/emission/emitter.js.map +1 -1
  13. package/dist/backend/emission/may-throw.js +7 -4
  14. package/dist/backend/emission/may-throw.js.map +1 -1
  15. package/dist/backend/ffi-callbacks.d.ts +38 -1
  16. package/dist/backend/ffi-callbacks.js +76 -3
  17. package/dist/backend/ffi-callbacks.js.map +1 -1
  18. package/dist/backend/library-identity.d.ts +22 -0
  19. package/dist/backend/library-identity.js +103 -0
  20. package/dist/backend/library-identity.js.map +1 -0
  21. package/dist/backend/llvm/emitter.d.ts +3 -0
  22. package/dist/backend/llvm/emitter.js +278 -17
  23. package/dist/backend/llvm/emitter.js.map +1 -1
  24. package/dist/backend/llvm/shapes.d.ts +1 -0
  25. package/dist/backend/llvm/shapes.js +25 -1
  26. package/dist/backend/llvm/shapes.js.map +1 -1
  27. package/dist/backend/mangle.d.ts +1 -0
  28. package/dist/backend/mangle.js +3 -0
  29. package/dist/backend/mangle.js.map +1 -1
  30. package/dist/backend/object-localize.d.ts +5 -5
  31. package/dist/backend/object-localize.js +19 -16
  32. package/dist/backend/object-localize.js.map +1 -1
  33. package/dist/backend/object-localize.test.js +37 -13
  34. package/dist/backend/object-localize.test.js.map +1 -1
  35. package/dist/diagnostics/diagnostic.js +2 -0
  36. package/dist/diagnostics/diagnostic.js.map +1 -1
  37. package/dist/ffi/profile.d.ts +17 -5
  38. package/dist/ffi/profile.js +169 -22
  39. package/dist/ffi/profile.js.map +1 -1
  40. package/dist/frontend/input-tracker.d.ts +82 -0
  41. package/dist/frontend/input-tracker.js +380 -0
  42. package/dist/frontend/input-tracker.js.map +1 -0
  43. package/dist/frontend/input-tracker.test.d.ts +1 -0
  44. package/dist/frontend/input-tracker.test.js +137 -0
  45. package/dist/frontend/input-tracker.test.js.map +1 -0
  46. package/dist/frontend/lowering/lower-builtins.js +2 -8
  47. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  48. package/dist/frontend/lowering/lower-calls.d.ts +1 -0
  49. package/dist/frontend/lowering/lower-calls.js +244 -163
  50. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  51. package/dist/frontend/lowering/lower-classes.js +3 -0
  52. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  53. package/dist/frontend/lowering/lower-containers.js +113 -28
  54. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  55. package/dist/frontend/lowering/lower-exprs.js +67 -1
  56. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  57. package/dist/frontend/lowering/lower-inspect.js +45 -26
  58. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  59. package/dist/frontend/lowering/lower-modules.js +1 -1
  60. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  61. package/dist/frontend/lowering/lower-stmts.js +48 -3
  62. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  63. package/dist/frontend/lowering/lowerer.d.ts +79 -29
  64. package/dist/frontend/lowering/lowerer.js +429 -87
  65. package/dist/frontend/lowering/lowerer.js.map +1 -1
  66. package/dist/frontend/npm-static-rewrite.js +25 -26
  67. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  68. package/dist/frontend/npm-static.js +29 -30
  69. package/dist/frontend/npm-static.js.map +1 -1
  70. package/dist/frontend/npm-static.test.d.ts +1 -0
  71. package/dist/frontend/npm-static.test.js +15 -0
  72. package/dist/frontend/npm-static.test.js.map +1 -0
  73. package/dist/frontend/npm.js +5 -17
  74. package/dist/frontend/npm.js.map +1 -1
  75. package/dist/frontend/program.js +2 -6
  76. package/dist/frontend/program.js.map +1 -1
  77. package/dist/frontend/resolve.js +8 -29
  78. package/dist/frontend/resolve.js.map +1 -1
  79. package/dist/frontend/ts7/checker.d.ts +2 -0
  80. package/dist/frontend/ts7/checker.js +20 -3
  81. package/dist/frontend/ts7/checker.js.map +1 -1
  82. package/dist/frontend/ts7/program.js +17 -18
  83. package/dist/frontend/ts7/program.js.map +1 -1
  84. package/dist/frontend/types.d.ts +41 -0
  85. package/dist/frontend/types.js +147 -8
  86. package/dist/frontend/types.js.map +1 -1
  87. package/dist/index.d.ts +1 -1
  88. package/dist/index.js +275 -41
  89. package/dist/index.js.map +1 -1
  90. package/dist/ir/nodes.d.ts +42 -12
  91. package/dist/ir/nodes.js +7 -1
  92. package/dist/ir/nodes.js.map +1 -1
  93. package/dist/ir/serialize.d.ts +1 -1
  94. package/dist/ir/serialize.js +1 -1
  95. package/dist/ir/validate.js +104 -1
  96. package/dist/ir/validate.js.map +1 -1
  97. package/dist/library/early-cache.d.ts +65 -0
  98. package/dist/library/early-cache.js +380 -0
  99. package/dist/library/early-cache.js.map +1 -0
  100. package/dist/library/early-cache.test.d.ts +1 -0
  101. package/dist/library/early-cache.test.js +528 -0
  102. package/dist/library/early-cache.test.js.map +1 -0
  103. package/dist/library/int-infer.js +14 -0
  104. package/dist/library/int-infer.js.map +1 -1
  105. package/dist/library/int-infer.test.js +21 -4
  106. package/dist/library/int-infer.test.js.map +1 -1
  107. package/dist/library/profile.d.ts +3 -0
  108. package/dist/library/profile.js +9 -1
  109. package/dist/library/profile.js.map +1 -1
  110. package/dist/library/semantic-source.d.ts +13 -0
  111. package/dist/library/semantic-source.js +257 -0
  112. package/dist/library/semantic-source.js.map +1 -0
  113. package/dist/library/semantic-source.test.d.ts +1 -0
  114. package/dist/library/semantic-source.test.js +113 -0
  115. package/dist/library/semantic-source.test.js.map +1 -0
  116. package/dist/library/sidecar.d.ts +6 -0
  117. package/dist/library/sidecar.js +11 -0
  118. package/dist/library/sidecar.js.map +1 -1
  119. package/package.json +2 -2
  120. package/surface-manifest.json +1 -1
@@ -2453,6 +2453,8 @@ export function droppableStatic(e) {
2453
2453
  return e.elems.every(droppableStatic);
2454
2454
  case "recordLit":
2455
2455
  return e.fields.every((f) => droppableStatic(f.value));
2456
+ case "recordClone":
2457
+ return droppableStatic(e.source) && e.overrides.every((f) => droppableStatic(f.value));
2456
2458
  case "closure":
2457
2459
  return true;
2458
2460
  default:
@@ -4527,6 +4529,66 @@ export function lowerObjectLiteral(L, expr) {
4527
4529
  }
4528
4530
  }
4529
4531
  const fieldTypes = new Map(shape.fields.map((f) => [f.name, f.type]));
4532
+ // The clone probe may lower the leading spread before declining (a
4533
+ // static `as` cast can make the checker-visible shape match while its
4534
+ // erased IR value keeps a wider shape). Reuse that exact value in the
4535
+ // ordinary spread path so lowering still happens once.
4536
+ let leadingSpreadLowered = null;
4537
+ // The overwhelmingly common immutable-update form over a record:
4538
+ // `{ ...model, changed, other: value }`. The historic lowering expanded
4539
+ // the spread into one recordGet per untouched field at EVERY site, then
4540
+ // the backends inlined all of those retains and stores into the caller.
4541
+ // A 178-field model updated hundreds of times consequently produced a
4542
+ // half-million-line LLVM function. Keep the same evaluation/ownership
4543
+ // semantics in one compact IR node: source first, explicit overrides in
4544
+ // source order, and one backend clone helper per shape.
4545
+ //
4546
+ // Stay deliberately narrow. Tuple/index/accessor shapes, conditional or
4547
+ // multiple spreads, spread-after-explicit order, and shape-changing width
4548
+ // copies retain their existing lowering and diagnostics.
4549
+ if (!isJsSourceFile(expr.getSourceFile()) &&
4550
+ !shape.indexValue &&
4551
+ !shape.tuple &&
4552
+ !shapeHasAccessorSlots(shape) &&
4553
+ expr.properties.length >= 2 &&
4554
+ ts.isSpreadAssignment(expr.properties[0]) &&
4555
+ !conditionalSpreadOf(expr.properties[0].expression) &&
4556
+ expr.properties.slice(1).every((p) => (ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p)) &&
4557
+ p.name !== undefined &&
4558
+ (ts.isIdentifier(p.name) ||
4559
+ ts.isStringLiteral(p.name) ||
4560
+ ts.isNumericLiteral(p.name) ||
4561
+ (ts.isComputedPropertyName(p.name) && literalComputedKey(L, p.name) !== null)))) {
4562
+ const spread = expr.properties[0];
4563
+ const props = expr.properties.slice(1);
4564
+ const names = props.map((p) => propNameText(L, p.name));
4565
+ const unique = new Set(names);
4566
+ const sourceType = L.mapTypeOf(L.typeOf(spread.expression));
4567
+ if (sourceType?.kind === "record" &&
4568
+ sourceType.shapeId === type.shapeId &&
4569
+ unique.size === names.length &&
4570
+ names.every((name) => fieldTypes.has(name))) {
4571
+ const source = L.lowerExpr(spread.expression);
4572
+ if (source.type.kind === "record" && source.type.shapeId === type.shapeId) {
4573
+ const overrides = [];
4574
+ for (let i = 0; i < props.length; i++) {
4575
+ const p = props[i];
4576
+ const name = names[i];
4577
+ const fieldType = fieldTypes.get(name);
4578
+ const valueNode = ts.isPropertyAssignment(p) ? p.initializer : p;
4579
+ let value = ts.isPropertyAssignment(p)
4580
+ ? L.lowerExpr(p.initializer)
4581
+ : L.lowerShorthandValue(p);
4582
+ value = L.coerceInto(valueNode, value, fieldType);
4583
+ if (!typeEquals(value.type, fieldType))
4584
+ L.badType(valueNode, L.typeOf(valueNode));
4585
+ overrides.push({ name, value });
4586
+ }
4587
+ return { kind: "recordClone", source, overrides, type, loc };
4588
+ }
4589
+ leadingSpreadLowered = source;
4590
+ }
4591
+ }
4530
4592
  // A PURE index-signature target with spreads — `{ ...process.env }`,
4531
4593
  // `{ ...process.env, ...extraEnv }`, `{ ...env, PATH: p }` (the
4532
4594
  // spawn-env pattern): the field-by-field desugar below cannot
@@ -4743,7 +4805,11 @@ export function lowerObjectLiteral(L, expr) {
4743
4805
  let srcNode = prop.expression;
4744
4806
  while (ts.isParenthesizedExpression(srcNode))
4745
4807
  srcNode = srcNode.expression;
4746
- const srcLowered = ts.isIdentifier(srcNode) ? null : L.lowerExpr(srcNode);
4808
+ const srcLowered = prop === expr.properties[0] && leadingSpreadLowered !== null
4809
+ ? leadingSpreadLowered
4810
+ : ts.isIdentifier(srcNode)
4811
+ ? null
4812
+ : L.lowerExpr(srcNode);
4747
4813
  const srcType = srcLowered ? srcLowered.type : L.mapTypeOf(L.typeOf(srcNode));
4748
4814
  // `...options.installConfig` — a spread of `Partial<X> | undefined`
4749
4815
  // (the optional-options merge idiom `{ ...DEFAULTS, ...overrides }`):