@scriptc/compiler 0.2.9 → 0.2.10

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 (147) hide show
  1. package/dist/backend/cycle-analysis.d.ts +56 -0
  2. package/dist/backend/cycle-analysis.js +175 -14
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/cycle-analysis.test.js +94 -1
  5. package/dist/backend/cycle-analysis.test.js.map +1 -1
  6. package/dist/backend/cycle-mutability.d.ts +2 -6
  7. package/dist/backend/cycle-mutability.js +3 -12
  8. package/dist/backend/cycle-mutability.js.map +1 -1
  9. package/dist/backend/immutability.d.ts +57 -0
  10. package/dist/backend/immutability.js +178 -0
  11. package/dist/backend/immutability.js.map +1 -0
  12. package/dist/backend/immutability.test.d.ts +1 -0
  13. package/dist/backend/immutability.test.js +131 -0
  14. package/dist/backend/immutability.test.js.map +1 -0
  15. package/dist/backend/llvm/borrowed-inputs.d.ts +9 -2
  16. package/dist/backend/llvm/borrowed-inputs.js +31 -3
  17. package/dist/backend/llvm/borrowed-inputs.js.map +1 -1
  18. package/dist/backend/llvm/classes.d.ts +28 -0
  19. package/dist/backend/llvm/classes.js +45 -5
  20. package/dist/backend/llvm/classes.js.map +1 -1
  21. package/dist/backend/llvm/classes.test.js +129 -1
  22. package/dist/backend/llvm/classes.test.js.map +1 -1
  23. package/dist/backend/llvm/common.d.ts +13 -0
  24. package/dist/backend/llvm/common.js +13 -0
  25. package/dist/backend/llvm/common.js.map +1 -1
  26. package/dist/backend/llvm/dense-array-access.js +5 -4
  27. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  28. package/dist/backend/llvm/dense-array-access.test.js +9 -1
  29. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  30. package/dist/backend/llvm/dyn.d.ts +2 -0
  31. package/dist/backend/llvm/dyn.js +3 -3
  32. package/dist/backend/llvm/dyn.js.map +1 -1
  33. package/dist/backend/llvm/emitter.d.ts +64 -2
  34. package/dist/backend/llvm/emitter.js +390 -45
  35. package/dist/backend/llvm/emitter.js.map +1 -1
  36. package/dist/backend/llvm/emitter.test.js +18 -0
  37. package/dist/backend/llvm/emitter.test.js.map +1 -1
  38. package/dist/backend/llvm/expr-calls.js +14 -6
  39. package/dist/backend/llvm/expr-calls.js.map +1 -1
  40. package/dist/backend/llvm/expr-containers.js +30 -7
  41. package/dist/backend/llvm/expr-containers.js.map +1 -1
  42. package/dist/backend/llvm/expr-primitives.js +30 -3
  43. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  44. package/dist/backend/llvm/expr-primitives.test.js +53 -0
  45. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  46. package/dist/backend/llvm/expr-stream-bridges.js +4 -4
  47. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  48. package/dist/backend/llvm/local-array-reads.js +3 -3
  49. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  50. package/dist/backend/llvm/loop-array-borrows.d.ts +5 -2
  51. package/dist/backend/llvm/loop-array-borrows.js +27 -8
  52. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  53. package/dist/backend/llvm/map-number-lookup.d.ts +7 -0
  54. package/dist/backend/llvm/map-number-lookup.js +18 -1
  55. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  56. package/dist/backend/llvm/map-read-lifetimes.d.ts +5 -0
  57. package/dist/backend/llvm/map-read-lifetimes.js +14 -4
  58. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  59. package/dist/backend/llvm/map-read-lifetimes.test.js +5 -0
  60. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  61. package/dist/backend/llvm/reference-writes.d.ts +124 -0
  62. package/dist/backend/llvm/reference-writes.js +1090 -0
  63. package/dist/backend/llvm/reference-writes.js.map +1 -0
  64. package/dist/backend/llvm/shapes.d.ts +8 -5
  65. package/dist/backend/llvm/shapes.js +36 -11
  66. package/dist/backend/llvm/shapes.js.map +1 -1
  67. package/dist/backend/llvm/string-lifetimes.test.js +39 -10
  68. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  69. package/dist/backend/llvm/string-reads.d.ts +3 -0
  70. package/dist/backend/llvm/string-reads.js +31 -0
  71. package/dist/backend/llvm/string-reads.js.map +1 -1
  72. package/dist/backend/llvm/switch-dispatch.d.ts +2 -2
  73. package/dist/backend/llvm/switch-dispatch.js +35 -22
  74. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  75. package/dist/backend/llvm/switch-dispatch.test.js +28 -10
  76. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
  77. package/dist/backend/llvm/walk-borrows.d.ts +8 -1
  78. package/dist/backend/llvm/walk-borrows.js +15 -4
  79. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  80. package/dist/backend/may-throw.d.ts +36 -2
  81. package/dist/backend/may-throw.js +308 -12
  82. package/dist/backend/may-throw.js.map +1 -1
  83. package/dist/backend/may-throw.test.js +146 -1
  84. package/dist/backend/may-throw.test.js.map +1 -1
  85. package/dist/backend/publication.d.ts +5 -0
  86. package/dist/backend/publication.js +10 -0
  87. package/dist/backend/publication.js.map +1 -1
  88. package/dist/backend/runtime-abi.d.ts +2 -2
  89. package/dist/backend/runtime-abi.js +2 -2
  90. package/dist/backend/runtime-pack-targets.test.js +1 -1
  91. package/dist/backend/runtime-pack.test.js +1 -1
  92. package/dist/contracts/check.d.ts +8 -0
  93. package/dist/contracts/check.js +1577 -0
  94. package/dist/contracts/check.js.map +1 -0
  95. package/dist/executable/prepare.js +9 -0
  96. package/dist/executable/prepare.js.map +1 -1
  97. package/dist/frontend/contract-types.d.ts +50 -0
  98. package/dist/frontend/contract-types.js +232 -0
  99. package/dist/frontend/contract-types.js.map +1 -0
  100. package/dist/frontend/lowering/coercions/unions.d.ts +12 -0
  101. package/dist/frontend/lowering/coercions/unions.js +63 -0
  102. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  103. package/dist/frontend/lowering/expressions/optional-chains.js +4 -1
  104. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  105. package/dist/frontend/lowering/lower-calls.js +9 -2
  106. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  107. package/dist/frontend/lowering/lower-exprs.js +83 -1
  108. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  109. package/dist/frontend/lowering/lowerer.d.ts +9 -0
  110. package/dist/frontend/lowering/lowerer.js +47 -0
  111. package/dist/frontend/lowering/lowerer.js.map +1 -1
  112. package/dist/frontend/lowering/narrowing-stability.d.ts +100 -0
  113. package/dist/frontend/lowering/narrowing-stability.js +1174 -0
  114. package/dist/frontend/lowering/narrowing-stability.js.map +1 -0
  115. package/dist/frontend/lowering/narrowing-stability.test.d.ts +1 -0
  116. package/dist/frontend/lowering/narrowing-stability.test.js +150 -0
  117. package/dist/frontend/lowering/narrowing-stability.test.js.map +1 -0
  118. package/dist/frontend/program.js +1 -1
  119. package/dist/frontend/type-mapper.js +43 -0
  120. package/dist/frontend/type-mapper.js.map +1 -1
  121. package/dist/ir/int32-slots.d.ts +26 -0
  122. package/dist/ir/int32-slots.js +147 -47
  123. package/dist/ir/int32-slots.js.map +1 -1
  124. package/dist/ir/integer-loops.js +3 -0
  125. package/dist/ir/integer-loops.js.map +1 -1
  126. package/dist/ir/integer-loops.test.js +26 -1
  127. package/dist/ir/integer-loops.test.js.map +1 -1
  128. package/dist/ir/integer-ranges.d.ts +20 -0
  129. package/dist/ir/integer-ranges.js +178 -21
  130. package/dist/ir/integer-ranges.js.map +1 -1
  131. package/dist/ir/integer-ranges.test.js +148 -3
  132. package/dist/ir/integer-ranges.test.js.map +1 -1
  133. package/dist/ir/ir.d.ts +32 -0
  134. package/dist/ir/ir.js.map +1 -1
  135. package/dist/ir/serialize.d.ts +5 -1
  136. package/dist/ir/serialize.js +8 -0
  137. package/dist/ir/serialize.js.map +1 -1
  138. package/dist/ir/unshare.d.ts +14 -0
  139. package/dist/ir/unshare.js +60 -0
  140. package/dist/ir/unshare.js.map +1 -0
  141. package/dist/ir/unshare.test.d.ts +1 -0
  142. package/dist/ir/unshare.test.js +115 -0
  143. package/dist/ir/unshare.test.js.map +1 -0
  144. package/dist/library/prepare.js +9 -0
  145. package/dist/library/prepare.js.map +1 -1
  146. package/package.json +20 -20
  147. package/surface-manifest.json +1 -1
@@ -1,9 +1,11 @@
1
1
  import { type CycleInitFlag } from "./cycle-initialization.js";
2
2
  import type { FieldLift } from "./coercions/structural-plans.js";
3
3
  import { CoercionState } from "./coercions/state.js";
4
+ import { NarrowingStability } from "./narrowing-stability.js";
4
5
  import { StringIndexBounds } from "./string-index-bounds.js";
5
6
  import { NanCodedReads } from "./nan-coded-reads.js";
6
7
  import { RuntimeOptionalLocals } from "./runtime-optional-locals.js";
8
+ import { type ContractAnnotations } from "../contract-types.js";
7
9
  import type { WidthLift } from "./width-lift.js";
8
10
  import { type FnCtx } from "./function-context.js";
9
11
  import type { FrontendServices } from "../services.js";
@@ -88,6 +90,9 @@ export interface LowerResult {
88
90
  /** Present iff diagnostics is empty. */
89
91
  module: IrModule | null;
90
92
  diagnostics: ScrDiagnostic[];
93
+ /** The program's written contract types (@scriptc/types), keyed by the
94
+ * source locations the IR carries; absent when it writes none. */
95
+ contracts?: ContractAnnotations;
91
96
  /** JS statements whose compile fences DEFERRED to runtime (runtimeFence
92
97
  * statements in the module) — off the build, on the coverage report. */
93
98
  runtimeFences: ScrDiagnostic[];
@@ -476,6 +481,10 @@ export declare class Lowerer {
476
481
  * discriminant was captured. A case match narrows the captured value,
477
482
  * not that mutable binding; preserve its tagged representation on reads. */
478
483
  readonly unstableSwitchBindings: Set<ts.Symbol>;
484
+ /** Whether a checker narrowing of a mutable member or closure-assigned
485
+ * binding still holds at its use (calls do not reset TypeScript's
486
+ * narrowing). Stale ones read the declared storage or check it. */
487
+ readonly narrowing: NarrowingStability;
479
488
  /** All storage slots widened for runtime absence, including slots whose
480
489
  * current control-flow branch has temporarily narrowed the value. */
481
490
  readonly runtimeOptionalStorageLocals: Set<IrLocal>;
@@ -19,12 +19,14 @@ import { lowerUtilTypeValue, pathModuleValue, utilTypesModuleValue, } from "./lo
19
19
  import { everyExprChild, everyStmtChild, transformStmtList } from "../../ir/traverse.js";
20
20
  import { RuntimeOptionalProvenance } from "./runtime-optional-provenance.js";
21
21
  import { presentAtUse, reassignedBindings } from "./runtime-optional-guards.js";
22
+ import { NarrowingStability } from "./narrowing-stability.js";
22
23
  import { ArrayElementStates } from "./runtime-optional-elements.js";
23
24
  import { indexReadInBounds } from "./runtime-optional-bounds.js";
24
25
  import { ArrayOwnership } from "./runtime-optional-ownership.js";
25
26
  import { StringIndexBounds } from "./string-index-bounds.js";
26
27
  import { NanCodedReads } from "./nan-coded-reads.js";
27
28
  import { RuntimeOptionalLocals } from "./runtime-optional-locals.js";
29
+ import { collectContractAnnotations } from "../contract-types.js";
28
30
  import { sanitizeUnregisteredClassTypes } from "./sanitize-class-types.js";
29
31
  import { UnregisteredClassTypes } from "./unregistered-class-types.js";
30
32
  import { bindingInContext, captureContextBinding, declareContextLocal, declareContextThis, } from "./function-context.js";
@@ -395,6 +397,39 @@ export function lowerToIr(program, entry, moduleOrder, options = {}) {
395
397
  timing("divergence-scan", { found: divergences.length });
396
398
  if (divergences.length > 0)
397
399
  result = { ...result, divergences };
400
+ // Contract types (@scriptc/types): written annotations, checked against
401
+ // the IR by the compile pipeline (contracts/check.ts).
402
+ // Acyclic object types name the IR unit the program lowered them to; a
403
+ // type the module never uses has no unit (mapping it now only touches the
404
+ // lowerer's tables, never the finished module).
405
+ const lowered = result.module;
406
+ const contracts = collectContractAnnotations(program.getTypeChecker(), moduleOrder, (type) => {
407
+ if (lowered === null)
408
+ return null;
409
+ const mapped = panicSafe(() => resultLowerer.mapTypeOf(type), null);
410
+ if (mapped?.kind === "object")
411
+ return lowered.classes?.some((c) => c.name === mapped.className)
412
+ ? `object:${mapped.className}`
413
+ : null;
414
+ if (mapped?.kind === "record")
415
+ return lowered.records?.some((r) => r.id === mapped.shapeId)
416
+ ? `record:${mapped.shapeId}`
417
+ : null;
418
+ if (mapped?.kind === "union")
419
+ return lowered.unions?.some((u) => u.id === mapped.unionId)
420
+ ? `union:${mapped.unionId}`
421
+ : null;
422
+ return null;
423
+ });
424
+ timing("contract-annotations", { found: contracts.count });
425
+ if (contracts.diagnostics.length > 0)
426
+ result = {
427
+ ...result,
428
+ module: null,
429
+ diagnostics: [...result.diagnostics, ...contracts.diagnostics],
430
+ };
431
+ else if (contracts.count > 0)
432
+ result = { ...result, contracts };
398
433
  if (options.coverage !== true)
399
434
  return result;
400
435
  const remainder = new Lowerer(program, entry, moduleOrder, dynamic, {
@@ -1219,6 +1254,10 @@ export class Lowerer {
1219
1254
  * discriminant was captured. A case match narrows the captured value,
1220
1255
  * not that mutable binding; preserve its tagged representation on reads. */
1221
1256
  unstableSwitchBindings = new Set();
1257
+ /** Whether a checker narrowing of a mutable member or closure-assigned
1258
+ * binding still holds at its use (calls do not reset TypeScript's
1259
+ * narrowing). Stale ones read the declared storage or check it. */
1260
+ narrowing = new NarrowingStability(this);
1222
1261
  /** All storage slots widened for runtime absence, including slots whose
1223
1262
  * current control-flow branch has temporarily narrowed the value. */
1224
1263
  runtimeOptionalStorageLocals = new Set();
@@ -4941,6 +4980,7 @@ export class Lowerer {
4941
4980
  }
4942
4981
  run() {
4943
4982
  const parts = this.splitFiles();
4983
+ this.narrowing.setFiles(parts.map((fp) => fp.sf));
4944
4984
  // The coverage remainder deliberately visits every body that reachable
4945
4985
  // emit skipped. Those files are already phase-managed, so an ordinary
4946
4986
  // checker miss would stay a one-node IPC query instead of falling back
@@ -5320,6 +5360,7 @@ export class Lowerer {
5320
5360
  emitReachable(extraRoots) {
5321
5361
  this.deferredModuleInitializers = new DeferredModuleInitializers();
5322
5362
  const parts = this.splitFiles();
5363
+ this.narrowing.setFiles(parts.map((fp) => fp.sf));
5323
5364
  // Direct lowering callers do not necessarily run program preflight.
5324
5365
  // Establish the same managed header/top-level batch here before
5325
5366
  // collection, while the production path simply finds warm memos.
@@ -6145,6 +6186,12 @@ export class Lowerer {
6145
6186
  const narrowed = this.chainNarrowedType.get(node);
6146
6187
  if (narrowed)
6147
6188
  return narrowed;
6189
+ // A stale narrowing of a mutable member or closure-assigned binding in
6190
+ // an absence/type test (or a slot accepting the declared type) reads
6191
+ // as declared, so the test inspects the stored value.
6192
+ const widened = this.narrowing.widenedType(node);
6193
+ if (widened)
6194
+ return widened;
6148
6195
  const t = this.checker.getTypeAtLocation(node);
6149
6196
  // ALIASED-TYPEOF narrowing: inside a branch a `type === 'string'`
6150
6197
  // test proves (type = typeof val, both never reassigned), references