@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
@@ -56,9 +56,5 @@ export declare function constructorThisAliases(fn: IrFunction, thisId: string):
56
56
  * field stores and reads (the body length when it never is). Statements run
57
57
  * in order, so every store in an earlier statement completes while the
58
58
  * object is still private. Within and after the escaping statement nothing
59
- * is private any more. With `selfStores`, storing `this` into one of its
60
- * own fields is not an escape (it exposes nothing to other code, but it
61
- * does create a cycle). */
62
- export declare function constructorEscapePoint(fn: IrFunction, thisId: string, baseCtor: string | null, options?: {
63
- selfStores?: boolean;
64
- }): number;
59
+ * is private any more. */
60
+ export declare function constructorEscapePoint(fn: IrFunction, thisId: string, baseCtor: string | null): number;
@@ -242,10 +242,8 @@ export function constructorThisAliases(fn, thisId) {
242
242
  * field stores and reads (the body length when it never is). Statements run
243
243
  * in order, so every store in an earlier statement completes while the
244
244
  * object is still private. Within and after the escaping statement nothing
245
- * is private any more. With `selfStores`, storing `this` into one of its
246
- * own fields is not an escape (it exposes nothing to other code, but it
247
- * does create a cycle). */
248
- export function constructorEscapePoint(fn, thisId, baseCtor, options = {}) {
245
+ * is private any more. */
246
+ export function constructorEscapePoint(fn, thisId, baseCtor) {
249
247
  let escaped = false;
250
248
  const aliases = constructorThisAliases(fn, thisId);
251
249
  const isThisRef = (e) => (e.kind === "varRef" && aliases.has(e.localId)) ||
@@ -281,15 +279,8 @@ export function constructorEscapePoint(fn, thisId, baseCtor, options = {}) {
281
279
  return everyExprChild(e, expr, stmt);
282
280
  };
283
281
  const stmt = (s) => {
284
- if (s.kind === "fieldSet" && isThisRef(s.obj)) {
285
- if (options.selfStores === true) {
286
- // `this` itself, possibly wrapped into the field's union type.
287
- const self = s.value.kind === "unionWrap" ? s.value.value : s.value;
288
- if (isThisRef(self))
289
- return wrapper(s.obj) && wrapper(self);
290
- }
282
+ if (s.kind === "fieldSet" && isThisRef(s.obj))
291
283
  return wrapper(s.obj) && expr(s.value);
292
- }
293
284
  if (s.kind === "exprStmt" && isThisRef(s.expr))
294
285
  return wrapper(s.expr);
295
286
  // Declaring an alias is not an escape; its uses are checked like `this`.
@@ -1 +1 @@
1
- {"version":3,"file":"cycle-mutability.js","sourceRoot":"","sources":["../../src/backend/cycle-mutability.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cycle-mutability.js","sourceRoot":"","sources":["../../src/backend/cycle-mutability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { IrModule, IrStmt } from "../ir/ir.js";
2
+ import { type CycleMutability } from "./cycle-mutability.js";
3
+ /** Fields that are never written once their object can be observed outside
4
+ * its own construction (cycle-mutability.ts derives the facts from every
5
+ * store in the IR, including typed-ref commits from checked-dynamic code,
6
+ * and disables them for library builds and dynamic islands).
7
+ *
8
+ * Outside constructors, a reference read from such a field stays valid for
9
+ * as long as its owner object is alive: nothing can replace it and release
10
+ * the old value. Constructors themselves may still write their own
11
+ * `this`'s fields, so the facts do not apply while one runs. */
12
+ export declare class ImmutableFields {
13
+ private readonly mutability;
14
+ private readonly unitOfClass;
15
+ constructor(mutability: CycleMutability, unitOfClass: (className: string) => string);
16
+ /** `obj.field` on a class instance is construction-only. */
17
+ classField(className: string, field: string): boolean;
18
+ /** `obj.field` on a record is never written after the literal. */
19
+ recordField(shapeId: string, field: string): boolean;
20
+ private unit;
21
+ }
22
+ export declare function computeImmutableFields(mod: IrModule): ImmutableFields | null;
23
+ /** Stores that provably target an object no other code can reach yet.
24
+ *
25
+ * A published object (@scriptc/threads `publish`) rejects every write, so
26
+ * the emitter guards each store into a type the program may publish. A
27
+ * store into the constructor's own `this` cannot target a published object
28
+ * when nothing outside the construction can hold `this` at that point:
29
+ *
30
+ * - the constructor runs on a fresh object: it is only reached through
31
+ * `new` (or a construct thunk) for its class or a subclass, never by a
32
+ * direct call on an existing object (`%C.constructor` called anywhere but
33
+ * as the direct super call of a subclass constructor disqualifies C and
34
+ * every ancestor, which that call reaches with the same receiver);
35
+ * - no ancestor constructor, which runs before this body continues, lets
36
+ * `this` escape, and the store lies in a top-level statement before the
37
+ * first one in which this constructor lets it escape
38
+ * (cycle-mutability's constructorEscapePoint: `this`, or a constant alias
39
+ * of it, may only be a field-store target, a field-read receiver or the
40
+ * direct base constructor's receiver; storing it anywhere, including
41
+ * into one of its own fields whose later reads would hand it out again,
42
+ * and closures and class references capturing it count as escapes).
43
+ * A subclass constructor's code only runs after this body returns.
44
+ *
45
+ * Library builds keep every guard: their constructors can be invoked by an
46
+ * embedder in ways the module does not show. */
47
+ export interface ConstructionFacts {
48
+ /** `fieldSet` statements whose target is a still-private `this`. */
49
+ privateStores: Set<IrStmt>;
50
+ }
51
+ export declare function computeConstructionFacts(mod: IrModule): ConstructionFacts;
52
+ /** Module constants whose value never changes once initialized: immutable,
53
+ * not TDZ-checked (every read follows the initialization), no import-cycle
54
+ * init flag, and at most one assignment in the whole module. Such a global
55
+ * owns its value for the rest of the program, so a read of it can be
56
+ * borrowed across any later operand or call. */
57
+ export declare function stableGlobals(mod: IrModule): Set<string>;
@@ -0,0 +1,178 @@
1
+ import { everyExprChild, everyStmtChild } from "../ir/traverse.js";
2
+ import { computeCycleMutability, constructorEscapePoint, constructorThisAliases, fieldKey, } from "./cycle-mutability.js";
3
+ /** Fields that are never written once their object can be observed outside
4
+ * its own construction (cycle-mutability.ts derives the facts from every
5
+ * store in the IR, including typed-ref commits from checked-dynamic code,
6
+ * and disables them for library builds and dynamic islands).
7
+ *
8
+ * Outside constructors, a reference read from such a field stays valid for
9
+ * as long as its owner object is alive: nothing can replace it and release
10
+ * the old value. Constructors themselves may still write their own
11
+ * `this`'s fields, so the facts do not apply while one runs. */
12
+ export class ImmutableFields {
13
+ mutability;
14
+ unitOfClass;
15
+ constructor(mutability, unitOfClass) {
16
+ this.mutability = mutability;
17
+ this.unitOfClass = unitOfClass;
18
+ }
19
+ /** `obj.field` on a class instance is construction-only. */
20
+ classField(className, field) {
21
+ return this.unit(this.unitOfClass(className), field);
22
+ }
23
+ /** `obj.field` on a record is never written after the literal. */
24
+ recordField(shapeId, field) {
25
+ return this.unit(`record:${shapeId}`, field);
26
+ }
27
+ unit(unit, field) {
28
+ return (!this.mutability.all &&
29
+ !this.mutability.units.has(unit) &&
30
+ !this.mutability.fields.has(fieldKey(unit, field)));
31
+ }
32
+ }
33
+ export function computeImmutableFields(mod) {
34
+ if (mod.lib !== undefined)
35
+ return null;
36
+ const baseOf = new Map((mod.classes ?? []).map((c) => [c.name, c.base ?? null]));
37
+ const roots = new Map();
38
+ const rootOf = (name) => {
39
+ const known = roots.get(name);
40
+ if (known !== undefined)
41
+ return known;
42
+ let cur = name;
43
+ for (let base = baseOf.get(cur); base !== null && base !== undefined; base = baseOf.get(cur))
44
+ cur = base;
45
+ roots.set(name, cur);
46
+ return cur;
47
+ };
48
+ const unitOfClass = (name) => `object:${rootOf(name)}`;
49
+ const mutability = computeCycleMutability(mod, unitOfClass);
50
+ return mutability.all ? null : new ImmutableFields(mutability, unitOfClass);
51
+ }
52
+ export function computeConstructionFacts(mod) {
53
+ const facts = { privateStores: new Set() };
54
+ if (mod.lib !== undefined)
55
+ return facts;
56
+ const classes = new Map((mod.classes ?? []).map((c) => [c.name, c]));
57
+ const ctorClass = new Map([...classes.keys()].map((name) => [`%${name}.constructor`, name]));
58
+ const fnByName = new Map(mod.functions.map((fn) => [fn.name, fn]));
59
+ const thisOf = (name) => fnByName.get(`%${name}.constructor`)?.params[0]?.localId ?? null;
60
+ const isThisRef = (e, thisId) => {
61
+ if (thisId === null)
62
+ return false;
63
+ if (e.kind === "varRef")
64
+ return e.localId === thisId;
65
+ if (e.kind === "upcast")
66
+ return isThisRef(e.value, thisId);
67
+ if (e.kind === "seqExpr")
68
+ return isThisRef(e.result, thisId);
69
+ return false;
70
+ };
71
+ // Constructors reached with a receiver that may not be fresh.
72
+ const reused = new Set();
73
+ const markReused = (name) => {
74
+ for (let c = name; c !== undefined && classes.has(c);) {
75
+ if (reused.has(c))
76
+ break;
77
+ reused.add(c);
78
+ c = classes.get(c).base;
79
+ }
80
+ };
81
+ for (const fn of mod.functions) {
82
+ const own = ctorClass.get(fn.name);
83
+ const thisId = own !== undefined ? thisOf(own) : null;
84
+ const baseCtor = own !== undefined && classes.get(own).base !== undefined
85
+ ? `%${classes.get(own).base}.constructor`
86
+ : null;
87
+ const expr = (e) => {
88
+ if (e.kind === "call") {
89
+ const target = ctorClass.get(e.callee);
90
+ if (target !== undefined &&
91
+ !(e.callee === baseCtor && e.args.length > 0 && isThisRef(e.args[0], thisId)))
92
+ markReused(target);
93
+ }
94
+ else if (e.kind === "closure") {
95
+ const target = ctorClass.get(e.fnName);
96
+ if (target !== undefined)
97
+ markReused(target);
98
+ }
99
+ return everyExprChild(e, expr, stmt);
100
+ };
101
+ const stmt = (s) => everyStmtChild(s, expr, stmt);
102
+ fn.body.every(stmt);
103
+ }
104
+ // The first escaping statement of each constructor (body length: none).
105
+ // A class without a constructor function of its own (runtime roots) is
106
+ // treated as escaping at once.
107
+ const points = new Map();
108
+ const escapePoint = (name) => {
109
+ const known = points.get(name);
110
+ if (known !== undefined)
111
+ return known;
112
+ const fn = fnByName.get(`%${name}.constructor`);
113
+ const base = classes.get(name)?.base;
114
+ const thisId = thisOf(name);
115
+ const point = fn === undefined || thisId === null || classes.get(name)?.runtime === true
116
+ ? 0
117
+ : constructorEscapePoint(fn, thisId, base !== undefined ? `%${base}.constructor` : null);
118
+ points.set(name, point);
119
+ return point;
120
+ };
121
+ const ancestorEscapes = (name) => {
122
+ for (let c = classes.get(name)?.base; c !== undefined; c = classes.get(c)?.base) {
123
+ const fn = fnByName.get(`%${c}.constructor`);
124
+ if (!classes.has(c) || fn === undefined || escapePoint(c) < fn.body.length)
125
+ return true;
126
+ }
127
+ return false;
128
+ };
129
+ for (const [name] of classes) {
130
+ const fn = fnByName.get(`%${name}.constructor`);
131
+ if (fn === undefined || reused.has(name) || ancestorEscapes(name))
132
+ continue;
133
+ const point = escapePoint(name);
134
+ if (point === 0)
135
+ continue;
136
+ const aliases = constructorThisAliases(fn, thisOf(name));
137
+ const isOwn = (e) => (e.kind === "varRef" && aliases.has(e.localId)) ||
138
+ (e.kind === "upcast" && isOwn(e.value)) ||
139
+ (e.kind === "seqExpr" && isOwn(e.result));
140
+ const expr = (e) => everyExprChild(e, expr, stmt);
141
+ const stmt = (s) => {
142
+ if (s.kind === "fieldSet" && isOwn(s.obj))
143
+ facts.privateStores.add(s);
144
+ return everyStmtChild(s, expr, stmt);
145
+ };
146
+ for (let i = 0; i < point; i++)
147
+ stmt(fn.body[i]);
148
+ }
149
+ return facts;
150
+ }
151
+ /** Module constants whose value never changes once initialized: immutable,
152
+ * not TDZ-checked (every read follows the initialization), no import-cycle
153
+ * init flag, and at most one assignment in the whole module. Such a global
154
+ * owns its value for the rest of the program, so a read of it can be
155
+ * borrowed across any later operand or call. */
156
+ export function stableGlobals(mod) {
157
+ const candidates = new Set((mod.globals ?? [])
158
+ .filter((g) => !g.mutable && g.tdz !== true && g.initFlag === undefined)
159
+ .map((g) => g.id));
160
+ const assigned = new Set();
161
+ const expr = (e) => {
162
+ if (e.kind === "assignExpr" && candidates.has(e.localId))
163
+ candidates.delete(e.localId);
164
+ return everyExprChild(e, expr, stmt);
165
+ };
166
+ const stmt = (s) => {
167
+ if (s.kind === "assign" && candidates.has(s.localId)) {
168
+ if (assigned.has(s.localId))
169
+ candidates.delete(s.localId);
170
+ assigned.add(s.localId);
171
+ }
172
+ return everyStmtChild(s, expr, stmt);
173
+ };
174
+ for (const fn of mod.functions)
175
+ fn.body.every(stmt);
176
+ return candidates;
177
+ }
178
+ //# sourceMappingURL=immutability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"immutability.js","sourceRoot":"","sources":["../../src/backend/immutability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,131 @@
1
+ import { expect, test } from "vitest";
2
+ import { DYN, F64, STRING, VOID, } from "../ir/ir.js";
3
+ import { computeConstructionFacts, computeImmutableFields, stableGlobals } from "./immutability.js";
4
+ const loc = { file: "immutability.ts", start: 0, end: 1 };
5
+ const obj = (className) => ({ kind: "object", className });
6
+ const value = (type) => ({ kind: "varRef", localId: "v", type, loc });
7
+ const thisRef = (className) => ({
8
+ kind: "varRef",
9
+ localId: "this.0",
10
+ type: obj(className),
11
+ loc,
12
+ });
13
+ const setThis = (className, field) => ({
14
+ kind: "fieldSet",
15
+ obj: thisRef(className),
16
+ className,
17
+ field,
18
+ value: value(F64),
19
+ loc,
20
+ });
21
+ const call = (callee, args) => ({
22
+ kind: "exprStmt",
23
+ expr: { kind: "call", callee, args, type: VOID, loc },
24
+ loc,
25
+ });
26
+ function ctor(className, body) {
27
+ return {
28
+ name: `%${className}.constructor`,
29
+ params: [{ localId: "this.0", name: "this", type: obj(className) }],
30
+ locals: [],
31
+ returnType: VOID,
32
+ body,
33
+ loc,
34
+ };
35
+ }
36
+ function module(classes, functions) {
37
+ return {
38
+ irVersion: 15,
39
+ sourceFile: loc.file,
40
+ entry: "main",
41
+ classes,
42
+ functions: [
43
+ { name: "main", locals: [], params: [], returnType: VOID, body: [], loc },
44
+ ...functions,
45
+ ],
46
+ };
47
+ }
48
+ const fields = (...names) => names.map((name) => ({ name, type: F64 }));
49
+ /** The fields of `className` whose constructor stores are private. */
50
+ function privateFields(mod, className) {
51
+ const facts = computeConstructionFacts(mod);
52
+ const fn = mod.functions.find((f) => f.name === `%${className}.constructor`);
53
+ return fn.body
54
+ .filter((s) => s.kind === "fieldSet")
55
+ .filter((s) => facts.privateStores.has(s))
56
+ .map((s) => s.field);
57
+ }
58
+ test("constructor stores before this escapes are private", () => {
59
+ const mod = module([{ name: "P", fields: fields("a", "b"), loc }], [ctor("P", [setThis("P", "a"), call("register", [thisRef("P")]), setThis("P", "b")])]);
60
+ expect(privateFields(mod, "P")).toEqual(["a"]);
61
+ });
62
+ test("storing this into its own field ends private construction", () => {
63
+ // A later read of the field yields `this` again, so any use of it
64
+ // (publishing it, handing it to a worker) would expose the object.
65
+ const self = { ...setThis("P", "self"), value: thisRef("P") };
66
+ const mod = module([{ name: "P", fields: [...fields("a", "b"), { name: "self", type: obj("P") }], loc }], [ctor("P", [setThis("P", "a"), self, setThis("P", "b")])]);
67
+ expect(privateFields(mod, "P")).toEqual(["a"]);
68
+ });
69
+ test("a base constructor's escape makes every subclass store public", () => {
70
+ const superCall = call("%Base.constructor", [
71
+ { kind: "upcast", value: thisRef("Sub"), type: obj("Base"), loc },
72
+ ]);
73
+ const mod = module([
74
+ { name: "Base", fields: fields("a"), loc },
75
+ { name: "Sub", base: "Base", fields: fields("a", "b"), loc },
76
+ ], [
77
+ ctor("Base", [setThis("Base", "a"), call("register", [thisRef("Base")])]),
78
+ ctor("Sub", [superCall, setThis("Sub", "b")]),
79
+ ]);
80
+ expect(privateFields(mod, "Base")).toEqual(["a"]);
81
+ expect(privateFields(mod, "Sub")).toEqual([]);
82
+ });
83
+ test("a constructor called on an existing object keeps every guard", () => {
84
+ const mod = module([{ name: "P", fields: fields("a"), loc }], [ctor("P", [setThis("P", "a")])]);
85
+ expect(privateFields(mod, "P")).toEqual(["a"]);
86
+ mod.functions[0].body.push(call("%P.constructor", [value(obj("P"))]));
87
+ expect(privateFields(mod, "P")).toEqual([]);
88
+ });
89
+ test("library builds keep every guard", () => {
90
+ const mod = module([{ name: "P", fields: fields("a"), loc }], [ctor("P", [setThis("P", "a")])]);
91
+ mod.lib = {};
92
+ expect(privateFields(mod, "P")).toEqual([]);
93
+ });
94
+ test("construction-only fields exclude later writes and dynamic stores", () => {
95
+ const mod = module([{ name: "P", fields: fields("a", "b"), loc }], [ctor("P", [setThis("P", "a"), setThis("P", "b")])]);
96
+ mod.functions[0].body.push({ kind: "fieldSet", obj: value(obj("P")), className: "P", field: "b", value: value(F64), loc }, { kind: "exprStmt", expr: { kind: "dynFrom", value: value(obj("P")), type: DYN, loc }, loc });
97
+ const facts = computeImmutableFields(mod);
98
+ expect(facts.classField("P", "a")).toBe(true);
99
+ expect(facts.classField("P", "b")).toBe(false);
100
+ // A runtime store into a dynamic value can reach P through its capsule.
101
+ mod.functions[0].body.push({
102
+ kind: "exprStmt",
103
+ expr: {
104
+ kind: "libCall",
105
+ fn: "dyn.keySet",
106
+ args: [value(DYN), value(STRING), value(DYN)],
107
+ type: VOID,
108
+ loc,
109
+ },
110
+ loc,
111
+ });
112
+ expect(computeImmutableFields(mod).classField("P", "a")).toBe(false);
113
+ });
114
+ test("module constants are stable once assigned exactly once", () => {
115
+ const mod = module([], []);
116
+ mod.globals = [
117
+ { id: "%g.k", name: "k", type: STRING, mutable: false },
118
+ { id: "%g.m", name: "m", type: STRING, mutable: true },
119
+ { id: "%g.t", name: "t", type: STRING, mutable: false, tdz: true },
120
+ { id: "%g.twice", name: "twice", type: STRING, mutable: false },
121
+ ];
122
+ const assign = (localId) => ({
123
+ kind: "assign",
124
+ localId,
125
+ value: value(STRING),
126
+ loc,
127
+ });
128
+ mod.functions[0].body.push(assign("%g.k"), assign("%g.m"), assign("%g.t"), assign("%g.twice"), assign("%g.twice"));
129
+ expect([...stableGlobals(mod)]).toEqual(["%g.k"]);
130
+ });
131
+ //# sourceMappingURL=immutability.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"immutability.test.js","sourceRoot":"","sources":["../../src/backend/immutability.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { IrExpr } from "../../ir/ir.js";
2
+ import type { Writes } from "./reference-writes.js";
2
3
  import type { LlValue, LlvmEmitterContext } from "./expr-context.js";
3
4
  /** For a runtime input whose ABI borrows rather than consumes ownership.
4
5
  * An unchanged, unboxed local owns its value across all later arguments and
@@ -10,6 +11,12 @@ export declare function emitBorrowedInput(host: LlvmEmitterContext, value: IrExp
10
11
  * while every operation preserves existing owners. Compute suffix facts
11
12
  * once, keeping left-to-right evaluation and the owning fallback for each
12
13
  * argument independently. The consumer must borrow all inputs and preserve
13
- * reference edges itself; mutating runtime operations use emitBorrowedInput. */
14
- export declare function borrowableInputs(host: LlvmEmitterContext, inputs: readonly IrExpr[], consumerPreserves?: boolean): boolean[];
14
+ * reference edges itself; mutating runtime operations use emitBorrowedInput.
15
+ * With `consumerWrites` (the locations the consumer may overwrite), a
16
+ * projection also borrows when neither the consumer nor any later operand
17
+ * can write a location its read depends on (ReferenceWrites). */
18
+ export declare function borrowableInputs(host: LlvmEmitterContext, inputs: readonly IrExpr[], consumerPreserves?: boolean, consumerWrites?: Writes): boolean[];
15
19
  export declare function emitBorrowedInputs(host: LlvmEmitterContext, inputs: readonly IrExpr[]): LlValue[];
20
+ /** The writes after each input: the consumer's plus every later input's
21
+ * (null entries: nothing; an empty array without ReferenceWrites). */
22
+ export declare function inputSuffixWrites(host: LlvmEmitterContext, inputs: readonly IrExpr[], consumerWrites: Writes): Writes[];
@@ -10,14 +10,28 @@ export function emitBorrowedInput(host, value) {
10
10
  * while every operation preserves existing owners. Compute suffix facts
11
11
  * once, keeping left-to-right evaluation and the owning fallback for each
12
12
  * argument independently. The consumer must borrow all inputs and preserve
13
- * reference edges itself; mutating runtime operations use emitBorrowedInput. */
14
- export function borrowableInputs(host, inputs, consumerPreserves = true) {
13
+ * reference edges itself; mutating runtime operations use emitBorrowedInput.
14
+ * With `consumerWrites` (the locations the consumer may overwrite), a
15
+ * projection also borrows when neither the consumer nor any later operand
16
+ * can write a location its read depends on (ReferenceWrites). */
17
+ export function borrowableInputs(host, inputs, consumerPreserves = true, consumerWrites) {
15
18
  const result = new Array(inputs.length);
16
19
  let preserves = consumerPreserves;
20
+ const writes = host.referenceWrites;
21
+ let suffix = consumerWrites !== undefined
22
+ ? consumerWrites
23
+ : consumerPreserves
24
+ ? null
25
+ : (writes?.heapAll ?? null);
17
26
  for (let i = inputs.length - 1; i >= 0; i--) {
18
27
  const value = inputs[i];
19
- result[i] = host.canBorrowCallArgument(value) || (preserves && host.canBorrowReceiver(value));
28
+ result[i] =
29
+ host.canBorrowCallArgument(value) ||
30
+ (preserves && host.canBorrowReceiver(value)) ||
31
+ (writes !== null && host.canBorrowReceiver(value) && host.unwrittenRead(value, suffix));
20
32
  preserves = preserves && host.referenceEffects.preserves(value);
33
+ if (writes !== null)
34
+ suffix = writes.union([suffix, writes.expr(value)]);
21
35
  }
22
36
  return result;
23
37
  }
@@ -25,4 +39,18 @@ export function emitBorrowedInputs(host, inputs) {
25
39
  const borrowed = borrowableInputs(host, inputs);
26
40
  return inputs.map((value, index) => borrowed[index] ? host.emitReadReceiver(value) : host.emitExpr(value));
27
41
  }
42
+ /** The writes after each input: the consumer's plus every later input's
43
+ * (null entries: nothing; an empty array without ReferenceWrites). */
44
+ export function inputSuffixWrites(host, inputs, consumerWrites) {
45
+ const writes = host.referenceWrites;
46
+ if (writes === null)
47
+ return [];
48
+ const out = new Array(inputs.length);
49
+ let suffix = consumerWrites;
50
+ for (let i = inputs.length - 1; i >= 0; i--) {
51
+ out[i] = suffix;
52
+ suffix = writes.union([suffix, writes.expr(inputs[i])]);
53
+ }
54
+ return out;
55
+ }
28
56
  //# sourceMappingURL=borrowed-inputs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"borrowed-inputs.js","sourceRoot":"","sources":["../../../src/backend/llvm/borrowed-inputs.ts"],"names":[],"mappings":"AAGA;;;;uEAIuE;AACvE,MAAM,UAAU,iBAAiB,CAAC,IAAwB,EAAE,KAAa;IACvE,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjG,CAAC;AAED;;;;gFAIgF;AAChF,MAAM,UAAU,gBAAgB,CAC9B,IAAwB,EACxB,MAAyB,EACzB,iBAAiB,GAAG,IAAI;IAExB,MAAM,MAAM,GAAc,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,SAAS,GAAG,iBAAiB,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACzB,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9F,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAwB,EAAE,MAAyB;IACpF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACjC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CACtE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"borrowed-inputs.js","sourceRoot":"","sources":["../../../src/backend/llvm/borrowed-inputs.ts"],"names":[],"mappings":"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"}
@@ -80,7 +80,35 @@ export interface ClassHost extends ShapeHost {
80
80
  * entry point unless the slot's calling convention borrows; see
81
81
  * LlEmitter.virtualEntry). */
82
82
  virtualEntry?(implFn: string): string;
83
+ /** Roots of the hierarchies declared `implements ProgramLifetime`
84
+ * (IrContracts.programLifetime). Absent: none. */
85
+ readonly programLifetime?: ReadonlySet<string>;
83
86
  }
87
+ /** Whether `meta`'s instances live until the process exits (a
88
+ * ProgramLifetime hierarchy, contracts/check.ts): `new` allocates them
89
+ * without a collector header and with the reference count
90
+ * programLifetimeRc, nothing frees them, and the class's retain and release
91
+ * entry points are empty, so reference counting on any static type of the
92
+ * hierarchy folds away. The cycle analysis leaves the hierarchy untraced, so
93
+ * no trace adapter ever visits an instance (as for every untraced class). */
94
+ export declare function programLifetimeClass(host: ClassHost, meta: LlClassMeta): boolean;
95
+ /** The reference count a program-lifetime instance is created with: the
96
+ * midpoint of the size_t range (2^63, or 2^31 on 32-bit targets).
97
+ *
98
+ * SIZE_MAX would also keep the object alive, but every runtime contract
99
+ * reads rc == SIZE_MAX as "published": immutable (the frozen-object guards
100
+ * throw on stores), shareable by pointer (postMessage and workerData deliver
101
+ * it without a clone) and already walked (publication stops there). A
102
+ * program-lifetime object is none of these until the program publishes it;
103
+ * it is mutable and owned by the thread that made it. Publication then marks
104
+ * it SIZE_MAX like any other object it reaches (and restores this count when
105
+ * a refusal undoes the publish), so the count doubles as the published and
106
+ * visited mark without a header or an extra word.
107
+ *
108
+ * Only the class's empty helpers count references on these types, so any
109
+ * count away from 0, 1 and SIZE_MAX would do; the midpoint keeps even an
110
+ * unpaired generic retain or release from ever reaching either end. */
111
+ export declare function programLifetimeRc(sizeType: "i32" | "i64"): string;
84
112
  /** Per-class LLVM emission for every non-runtime class: the struct types
85
113
  * (`typeDefs`), the vtable struct types + per-class constant instances,
86
114
  * and the new/retain/release (+releaseDirect for hierarchy members,