@scriptc/compiler 0.2.8 → 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.
- package/ambient/scriptc-node-fallback.d.ts +1 -0
- package/dist/backend/cycle-analysis.d.ts +56 -0
- package/dist/backend/cycle-analysis.js +222 -28
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +232 -15
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +27 -6
- package/dist/backend/cycle-mutability.js +110 -17
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/immutability.d.ts +57 -0
- package/dist/backend/immutability.js +178 -0
- package/dist/backend/immutability.js.map +1 -0
- package/dist/backend/immutability.test.d.ts +1 -0
- package/dist/backend/immutability.test.js +131 -0
- package/dist/backend/immutability.test.js.map +1 -0
- package/dist/backend/llvm/alloc.d.ts +13 -3
- package/dist/backend/llvm/alloc.js +24 -10
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/alloc.test.js +5 -5
- package/dist/backend/llvm/alloc.test.js.map +1 -1
- package/dist/backend/llvm/borrowed-inputs.d.ts +9 -2
- package/dist/backend/llvm/borrowed-inputs.js +31 -3
- package/dist/backend/llvm/borrowed-inputs.js.map +1 -1
- package/dist/backend/llvm/byte-numbers.js +2 -3
- package/dist/backend/llvm/byte-numbers.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +28 -0
- package/dist/backend/llvm/classes.js +51 -10
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +129 -1
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +30 -0
- package/dist/backend/llvm/common.js +41 -0
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.js +6 -5
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +10 -2
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +6 -4
- package/dist/backend/llvm/dyn.js +30 -14
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +109 -5
- package/dist/backend/llvm/emitter.js +716 -112
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +54 -3
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +35 -28
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +14 -6
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +31 -8
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +2 -0
- package/dist/backend/llvm/expr-control.js +46 -5
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +3 -0
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +30 -3
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +53 -0
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +3 -0
- package/dist/backend/llvm/expr-stream-bridges.js +76 -14
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +18 -2
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +1 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.d.ts +17 -6
- package/dist/backend/llvm/local-array-reads.js +157 -45
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/loop-array-borrows.d.ts +5 -2
- package/dist/backend/llvm/loop-array-borrows.js +27 -8
- package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +7 -0
- package/dist/backend/llvm/map-number-lookup.js +18 -1
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.d.ts +5 -0
- package/dist/backend/llvm/map-read-lifetimes.js +14 -4
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +5 -0
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/reference-effects.js +34 -1
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +124 -0
- package/dist/backend/llvm/reference-writes.js +1090 -0
- package/dist/backend/llvm/reference-writes.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +22 -8
- package/dist/backend/llvm/shapes.js +79 -23
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +5 -5
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +39 -10
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +3 -0
- package/dist/backend/llvm/string-reads.js +45 -11
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/string-slices.js +1 -1
- package/dist/backend/llvm/switch-dispatch.d.ts +2 -2
- package/dist/backend/llvm/switch-dispatch.js +35 -22
- package/dist/backend/llvm/switch-dispatch.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.test.js +28 -10
- package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
- package/dist/backend/llvm/trunc.d.ts +8 -0
- package/dist/backend/llvm/trunc.js +28 -0
- package/dist/backend/llvm/trunc.js.map +1 -0
- package/dist/backend/llvm/walk-borrows.d.ts +8 -1
- package/dist/backend/llvm/walk-borrows.js +15 -4
- package/dist/backend/llvm/walk-borrows.js.map +1 -1
- package/dist/backend/loop-polls.d.ts +14 -0
- package/dist/backend/loop-polls.js +100 -0
- package/dist/backend/loop-polls.js.map +1 -0
- package/dist/backend/loop-polls.test.d.ts +1 -0
- package/dist/backend/loop-polls.test.js +86 -0
- package/dist/backend/loop-polls.test.js.map +1 -0
- package/dist/backend/may-throw.d.ts +36 -2
- package/dist/backend/may-throw.js +328 -13
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +169 -1
- package/dist/backend/may-throw.test.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +1 -3
- package/dist/backend/native-codegen.js +4 -32
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/publication.d.ts +5 -0
- package/dist/backend/publication.js +10 -0
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-abi.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +1 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/cli/command.js +8 -1
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/output-options.d.ts +1 -0
- package/dist/cli/output-options.js +3 -0
- package/dist/cli/output-options.js.map +1 -1
- package/dist/cli/usage.d.ts +5 -1
- package/dist/cli/usage.js +6 -0
- package/dist/cli/usage.js.map +1 -1
- package/dist/compile-types.d.ts +5 -0
- package/dist/contracts/check.d.ts +8 -0
- package/dist/contracts/check.js +1577 -0
- package/dist/contracts/check.js.map +1 -0
- package/dist/executable/executable-cache.d.ts +2 -0
- package/dist/executable/executable-cache.js +3 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +1 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +9 -0
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/contract-types.d.ts +50 -0
- package/dist/frontend/contract-types.js +232 -0
- package/dist/frontend/contract-types.js.map +1 -0
- package/dist/frontend/lowering/array-values.js +37 -1
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/builtins/strings.js +4 -1
- package/dist/frontend/lowering/builtins/strings.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.js +96 -4
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +88 -0
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.d.ts +12 -0
- package/dist/frontend/lowering/coercions/unions.js +63 -0
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +15 -4
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +4 -1
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-fields.d.ts +19 -0
- package/dist/frontend/lowering/expressions/union-fields.js +236 -0
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -0
- package/dist/frontend/lowering/lower-calls.js +21 -4
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +6 -0
- package/dist/frontend/lowering/lower-exprs.js +245 -4
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-island.js +5 -19
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +11 -1
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +14 -0
- package/dist/frontend/lowering/lowerer.js +221 -8
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/nan-coded-reads.d.ts +161 -0
- package/dist/frontend/lowering/nan-coded-reads.js +1342 -0
- package/dist/frontend/lowering/nan-coded-reads.js.map +1 -0
- package/dist/frontend/lowering/narrowing-stability.d.ts +100 -0
- package/dist/frontend/lowering/narrowing-stability.js +1174 -0
- package/dist/frontend/lowering/narrowing-stability.js.map +1 -0
- package/dist/frontend/lowering/narrowing-stability.test.d.ts +1 -0
- package/dist/frontend/lowering/narrowing-stability.test.js +150 -0
- package/dist/frontend/lowering/narrowing-stability.test.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-bounds.d.ts +14 -2
- package/dist/frontend/lowering/runtime-optional-bounds.js +17 -11
- package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-bounds.test.js +28 -0
- package/dist/frontend/lowering/runtime-optional-bounds.test.js.map +1 -1
- package/dist/frontend/lowering/surfaces.js +8 -0
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/program.js +1 -1
- package/dist/frontend/type-mapper.js +43 -0
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +20 -8
- package/dist/index.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +2 -0
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/constant-globals.d.ts +14 -0
- package/dist/ir/constant-globals.js +81 -0
- package/dist/ir/constant-globals.js.map +1 -0
- package/dist/ir/constant-globals.test.d.ts +1 -0
- package/dist/ir/constant-globals.test.js +97 -0
- package/dist/ir/constant-globals.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +35 -0
- package/dist/ir/final-fields.js +187 -0
- package/dist/ir/final-fields.js.map +1 -0
- package/dist/ir/final-fields.test.d.ts +1 -0
- package/dist/ir/final-fields.test.js +106 -0
- package/dist/ir/final-fields.test.js.map +1 -0
- package/dist/ir/int32-slots.d.ts +35 -0
- package/dist/ir/int32-slots.js +217 -104
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +27 -0
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +5 -0
- package/dist/ir/integer-loops.js +23 -4
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +43 -1
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +20 -0
- package/dist/ir/integer-ranges.js +178 -21
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +148 -3
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +38 -1
- package/dist/ir/ir.js +4 -0
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/serialize.d.ts +17 -3
- package/dist/ir/serialize.js +198 -39
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +65 -1
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/unshare.d.ts +14 -0
- package/dist/ir/unshare.js +60 -0
- package/dist/ir/unshare.js.map +1 -0
- package/dist/ir/unshare.test.d.ts +1 -0
- package/dist/ir/unshare.test.js +115 -0
- package/dist/ir/unshare.test.js.map +1 -0
- package/dist/library/prepare.js +9 -0
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/cache.d.ts +8 -1
- package/dist/native/cache.js +38 -1
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +11 -0
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/compiler.js +4 -3
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/prepare.d.ts +3 -1
- package/dist/native/prepare.js +63 -28
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +23 -1
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/text-file.d.ts +10 -0
- package/dist/native/text-file.js +41 -0
- package/dist/native/text-file.js.map +1 -0
- package/dist/text-parts.d.ts +5 -0
- package/dist/text-parts.js +36 -0
- package/dist/text-parts.js.map +1 -0
- package/package.json +20 -20
- package/surface-manifest.json +7 -1
- package/dist/frontend/lowering/expressions/union-field-write.d.ts +0 -8
- package/dist/frontend/lowering/expressions/union-field-write.js +0 -108
- package/dist/frontend/lowering/expressions/union-field-write.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { RUNTIME_EMITTER_CLASS, RUNTIME_STREAM_CLASSES } from "../ir/ir.js";
|
|
2
|
+
import { dynamicFieldStores } from "../ir/int32-slots.js";
|
|
2
3
|
import { everyExprChild, everyModuleNode, everyStmtChild, everyTypeChild } from "../ir/traverse.js";
|
|
3
4
|
const DYNAMIC_ISLAND_EXPRS = new Set([
|
|
4
5
|
"jsMarshal",
|
|
@@ -20,7 +21,12 @@ export function fieldKey(unit, field) {
|
|
|
20
21
|
return `${unit}\0${field}`;
|
|
21
22
|
}
|
|
22
23
|
export function computeCycleMutability(mod, unitOfClass) {
|
|
23
|
-
const result = {
|
|
24
|
+
const result = {
|
|
25
|
+
all: false,
|
|
26
|
+
emptyPropertyBags: false,
|
|
27
|
+
units: new Set(),
|
|
28
|
+
fields: new Set(),
|
|
29
|
+
};
|
|
24
30
|
if (mod.lib !== undefined)
|
|
25
31
|
return { ...result, all: true };
|
|
26
32
|
const classes = mod.classes ?? [];
|
|
@@ -41,6 +47,19 @@ export function computeCycleMutability(mod, unitOfClass) {
|
|
|
41
47
|
if (c.runtime || c.name === RUNTIME_EMITTER_CLASS || RUNTIME_STREAM_CLASSES.has(c.name))
|
|
42
48
|
result.units.add(unitOfClass(c.name));
|
|
43
49
|
}
|
|
50
|
+
// A typed-ref capsule writes into its native object only when a runtime
|
|
51
|
+
// store into the capsule commits (dynamicFieldStores audits which helpers
|
|
52
|
+
// can store; a commit rewrites every field, reference fields possibly
|
|
53
|
+
// with fresh conversions). Without any such store in the program,
|
|
54
|
+
// crossing into checked-dynamic code writes nothing. FFI calls and
|
|
55
|
+
// intrinsics other than publish (which only marks objects immortal) stay
|
|
56
|
+
// conservative.
|
|
57
|
+
const dynStores = dynamicFieldStores(mod);
|
|
58
|
+
const dynamicStores = dynStores.all || dynStores.names.size > 0;
|
|
59
|
+
result.emptyPropertyBags = !dynamicStores;
|
|
60
|
+
const boundaryWrites = (e) => dynamicStores ||
|
|
61
|
+
e.kind === "ffiCall" ||
|
|
62
|
+
(e.kind === "intrinsic" && e.name !== "threads.publish");
|
|
44
63
|
// Types that can become checked-dynamic values: mark their whole closure.
|
|
45
64
|
const exposedTypes = new Set();
|
|
46
65
|
const expose = (root) => {
|
|
@@ -86,11 +105,43 @@ export function computeCycleMutability(mod, unitOfClass) {
|
|
|
86
105
|
}
|
|
87
106
|
}
|
|
88
107
|
};
|
|
108
|
+
// Constructor stores are construction-only until `this` first escapes:
|
|
109
|
+
// stores from the escaping statement on, and every store of a
|
|
110
|
+
// constructor whose ancestor constructor already let `this` escape, are
|
|
111
|
+
// ordinary writes.
|
|
112
|
+
const fnByName = new Map(mod.functions.map((fn) => [fn.name, fn]));
|
|
113
|
+
const classByName = new Map(classes.map((c) => [c.name, c]));
|
|
114
|
+
const escapePoints = new Map();
|
|
115
|
+
/** The constructor's escape point; 0 without an analyzable constructor. */
|
|
116
|
+
const escapePoint = (name) => {
|
|
117
|
+
const known = escapePoints.get(name);
|
|
118
|
+
if (known !== undefined)
|
|
119
|
+
return known;
|
|
120
|
+
const fn = fnByName.get(`%${name}.constructor`);
|
|
121
|
+
const cls = classByName.get(name);
|
|
122
|
+
const thisId = fn?.params[0]?.localId;
|
|
123
|
+
const base = cls?.base !== undefined ? `%${cls.base}.constructor` : null;
|
|
124
|
+
const point = fn === undefined || cls === undefined || thisId === undefined
|
|
125
|
+
? 0
|
|
126
|
+
: constructorEscapePoint(fn, thisId, base);
|
|
127
|
+
escapePoints.set(name, point);
|
|
128
|
+
return point;
|
|
129
|
+
};
|
|
130
|
+
const escapes = (name) => escapePoint(name) < (fnByName.get(`%${name}.constructor`)?.body.length ?? 1);
|
|
131
|
+
const ancestorEscaped = (name) => {
|
|
132
|
+
for (let c = classByName.get(name)?.base; c !== undefined; c = classByName.get(c)?.base)
|
|
133
|
+
if (escapes(c))
|
|
134
|
+
return true;
|
|
135
|
+
return false;
|
|
136
|
+
};
|
|
137
|
+
let privateUntil = 0;
|
|
138
|
+
let topLevel = 0;
|
|
139
|
+
let aliases = new Set();
|
|
89
140
|
const isThisRef = (e, thisId) => {
|
|
90
141
|
if (thisId === null)
|
|
91
142
|
return false;
|
|
92
143
|
if (e.kind === "varRef")
|
|
93
|
-
return e.localId
|
|
144
|
+
return aliases.has(e.localId);
|
|
94
145
|
if (e.kind === "upcast")
|
|
95
146
|
return isThisRef(e.value, thisId);
|
|
96
147
|
if (e.kind === "seqExpr")
|
|
@@ -100,9 +151,14 @@ export function computeCycleMutability(mod, unitOfClass) {
|
|
|
100
151
|
for (const fn of mod.functions) {
|
|
101
152
|
const ctorClass = ctorOf.get(fn.name);
|
|
102
153
|
const thisId = ctorClass !== undefined ? (fn.params[0]?.localId ?? null) : null;
|
|
154
|
+
aliases = thisId !== null ? constructorThisAliases(fn, thisId) : new Set();
|
|
155
|
+
privateUntil =
|
|
156
|
+
ctorClass !== undefined && thisId !== null && !ancestorEscaped(ctorClass.name)
|
|
157
|
+
? escapePoint(ctorClass.name)
|
|
158
|
+
: 0;
|
|
103
159
|
const baseCtor = ctorClass?.base !== undefined ? `%${ctorClass.base}.constructor` : null;
|
|
104
160
|
const expr = (e) => {
|
|
105
|
-
if (DYNAMIC_BOUNDARY_EXPRS.has(e.kind)) {
|
|
161
|
+
if (DYNAMIC_BOUNDARY_EXPRS.has(e.kind) && boundaryWrites(e)) {
|
|
106
162
|
everyExprChild(e, (child) => {
|
|
107
163
|
expose(child.type);
|
|
108
164
|
return true;
|
|
@@ -131,7 +187,7 @@ export function computeCycleMutability(mod, unitOfClass) {
|
|
|
131
187
|
const stmt = (s) => {
|
|
132
188
|
switch (s.kind) {
|
|
133
189
|
case "fieldSet":
|
|
134
|
-
if (!isThisRef(s.obj, thisId))
|
|
190
|
+
if (!isThisRef(s.obj, thisId) || topLevel >= privateUntil)
|
|
135
191
|
result.fields.add(fieldKey(unitOfClass(s.className), s.field));
|
|
136
192
|
break;
|
|
137
193
|
case "recordSet":
|
|
@@ -145,23 +201,52 @@ export function computeCycleMutability(mod, unitOfClass) {
|
|
|
145
201
|
result.units.add(`record:${s.shapeId}`);
|
|
146
202
|
break;
|
|
147
203
|
case "throw":
|
|
148
|
-
|
|
204
|
+
if (dynamicStores)
|
|
205
|
+
expose(s.value.type);
|
|
149
206
|
break;
|
|
150
207
|
}
|
|
151
208
|
return everyStmtChild(s, expr, stmt);
|
|
152
209
|
};
|
|
153
|
-
fn.body.
|
|
154
|
-
|
|
155
|
-
result.units.add(unitOfClass(ctorClass.name));
|
|
210
|
+
for (topLevel = 0; topLevel < fn.body.length; topLevel++)
|
|
211
|
+
stmt(fn.body[topLevel]);
|
|
156
212
|
}
|
|
157
213
|
return result;
|
|
158
214
|
}
|
|
159
|
-
/**
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
function
|
|
215
|
+
/** The locals of a constructor that always hold its `this`: the parameter
|
|
216
|
+
* itself plus immutable locals declared with a `this` initializer and never
|
|
217
|
+
* assigned (the receiver temporaries of compound field assignments). */
|
|
218
|
+
export function constructorThisAliases(fn, thisId) {
|
|
219
|
+
const aliases = new Set([thisId]);
|
|
220
|
+
const immutable = new Set(fn.locals.filter((l) => !l.mutable).map((l) => l.id));
|
|
221
|
+
const assigned = new Set();
|
|
222
|
+
const candidates = [];
|
|
223
|
+
const isThisParam = (e) => (e.kind === "varRef" && e.localId === thisId) ||
|
|
224
|
+
(e.kind === "upcast" && isThisParam(e.value)) ||
|
|
225
|
+
(e.kind === "seqExpr" && isThisParam(e.result));
|
|
226
|
+
const expr = (e) => everyExprChild(e, expr, stmt);
|
|
227
|
+
const stmt = (s) => {
|
|
228
|
+
if (s.kind === "assign")
|
|
229
|
+
assigned.add(s.localId);
|
|
230
|
+
if (s.kind === "varDecl" && s.init !== null && immutable.has(s.localId) && isThisParam(s.init))
|
|
231
|
+
candidates.push(s.localId);
|
|
232
|
+
return everyStmtChild(s, expr, stmt);
|
|
233
|
+
};
|
|
234
|
+
fn.body.every(stmt);
|
|
235
|
+
for (const id of candidates)
|
|
236
|
+
if (!assigned.has(id))
|
|
237
|
+
aliases.add(id);
|
|
238
|
+
return aliases;
|
|
239
|
+
}
|
|
240
|
+
/** The index of the first top-level statement of a constructor body in
|
|
241
|
+
* which `this` can be observed by anything other than the constructor's own
|
|
242
|
+
* field stores and reads (the body length when it never is). Statements run
|
|
243
|
+
* in order, so every store in an earlier statement completes while the
|
|
244
|
+
* object is still private. Within and after the escaping statement nothing
|
|
245
|
+
* is private any more. */
|
|
246
|
+
export function constructorEscapePoint(fn, thisId, baseCtor) {
|
|
163
247
|
let escaped = false;
|
|
164
|
-
const
|
|
248
|
+
const aliases = constructorThisAliases(fn, thisId);
|
|
249
|
+
const isThisRef = (e) => (e.kind === "varRef" && aliases.has(e.localId)) ||
|
|
165
250
|
(e.kind === "upcast" && isThisRef(e.value)) ||
|
|
166
251
|
(e.kind === "seqExpr" && isThisRef(e.result));
|
|
167
252
|
// The non-`this` parts of a `this`-valued wrapper (seqExpr statements).
|
|
@@ -173,12 +258,13 @@ function constructorEscapes(fn, thisId, baseCtor) {
|
|
|
173
258
|
return true;
|
|
174
259
|
};
|
|
175
260
|
const expr = (e) => {
|
|
176
|
-
if (e.kind === "varRef" && e.localId
|
|
261
|
+
if (e.kind === "varRef" && aliases.has(e.localId)) {
|
|
177
262
|
escaped = true;
|
|
178
263
|
return false;
|
|
179
264
|
}
|
|
180
265
|
// Closures and class references are the expressions that capture locals.
|
|
181
|
-
if ((e.kind === "closure" || e.kind === "classRef") &&
|
|
266
|
+
if ((e.kind === "closure" || e.kind === "classRef") &&
|
|
267
|
+
(e.captures ?? []).some((id) => aliases.has(id))) {
|
|
182
268
|
escaped = true;
|
|
183
269
|
return false;
|
|
184
270
|
}
|
|
@@ -197,9 +283,16 @@ function constructorEscapes(fn, thisId, baseCtor) {
|
|
|
197
283
|
return wrapper(s.obj) && expr(s.value);
|
|
198
284
|
if (s.kind === "exprStmt" && isThisRef(s.expr))
|
|
199
285
|
return wrapper(s.expr);
|
|
286
|
+
// Declaring an alias is not an escape; its uses are checked like `this`.
|
|
287
|
+
if (s.kind === "varDecl" && aliases.has(s.localId) && s.init !== null)
|
|
288
|
+
return wrapper(s.init);
|
|
200
289
|
return everyStmtChild(s, expr, stmt);
|
|
201
290
|
};
|
|
202
|
-
fn.body.
|
|
203
|
-
|
|
291
|
+
for (let i = 0; i < fn.body.length; i++) {
|
|
292
|
+
stmt(fn.body[i]);
|
|
293
|
+
if (escaped)
|
|
294
|
+
return i;
|
|
295
|
+
}
|
|
296
|
+
return fn.body.length;
|
|
204
297
|
}
|
|
205
298
|
//# sourceMappingURL=cycle-mutability.js.map
|
|
@@ -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
|