Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,265 changes: 1,265 additions & 0 deletions tslang/test/fuzz/mm_fuzz.py

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions tslang/test/fuzz/seeds/review1__t19_export_id.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class V { constructor(public x: number) {} }
function id(v: V) { return v; }
export const c = id(new V(1));
function main() { print(c.x); }
4 changes: 4 additions & 0 deletions tslang/test/fuzz/seeds/review1__t20_local_id.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class V { constructor(public x: number) {} }
function id(v: V) { return v; }
const c = id(new V(1));
function main() { print(c.x); }
6 changes: 6 additions & 0 deletions tslang/test/fuzz/seeds/review1b__t18b.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class V { constructor(public x: number) {} }
class N { constructor(public c: V) {} }
const n = new N(new V(4));
function child(m: N) { return m.c; }
const c = child(n);
function main() { print(c.x); n.c = new V(5); print(n.c.x); }
7 changes: 7 additions & 0 deletions tslang/test/fuzz/seeds/review1b__t18m.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class V { constructor(public x: number) {} }
class N { constructor(public c: V) {} }
let n = new N(new V(4));
function child(m: N) { return m.c; }
const c = child(n);
function reset() { n = new N(new V(6)); }
function main() { print(c.x); n.c = new V(5); print(n.c.x); }
11 changes: 11 additions & 0 deletions tslang/test/fuzz/seeds/review2__p6.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
interface S { roughness: number; }
let a = new Shared<S>({ roughness: 2 });
let k = a;
class Junk { a = -1; b = -2; }
function churn() { let keep: Junk[] = []; for (let i = 0; i < 1000; i++) { keep.push(new Junk()); } return keep.length; }
function main() {
a = new Shared<S>({ roughness: 3 });
churn();
print(k.value.roughness, a.value.roughness);
print("done.");
}
11 changes: 11 additions & 0 deletions tslang/test/fuzz/seeds/review2__p7.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class C { roughness = 2; constructor(r: number) { this.roughness = r; } }
let a = new Shared<C>(new C(2));
let k = a;
class Junk { a = -1; b = -2; }
function churn() { let keep: Junk[] = []; for (let i = 0; i < 1000; i++) { keep.push(new Junk()); } return keep.length; }
function main() {
a = new Shared<C>(new C(3));
churn();
print(k.value.roughness, a.value.roughness);
print("done.");
}
12 changes: 12 additions & 0 deletions tslang/test/fuzz/seeds/review2__p8.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class C { roughness = 2; constructor(r: number) { this.roughness = r; } }
let a = new Shared<C>(new C(2));
let k = a;
class Junk { a = -1; b = -2; }
function churn() { let keep: Junk[] = []; for (let i = 0; i < 1000; i++) { keep.push(new Junk()); } return keep.length; }
function main() {
k = a;
a = new Shared<C>(new C(3));
churn();
print(k.value.roughness, a.value.roughness);
print("done.");
}
21 changes: 21 additions & 0 deletions tslang/test/fuzz/seeds/review5__b8.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// @strict-null false
class C { x: number = 5; v: number[] = []; m() { return this.x; } }
class H { c: C | null = null; }
function mkH(): H { const r = new H(); return r; }
function mk(): C { const r = new C(); r.v.push(1); return r; }
function churn() {
const junk: C[] = [];
for (let i = 0; i < 64; i++) { const c = mk(); c.x = 999; c.v.push(99); junk.push(c); }
}
function run(h: H) {
const c = mk();
h.c = c;
try {
h.c = null;
return;
} finally {
churn();
print(c.x);
}
}
function main() { const h = mkH(); run(h); }
13 changes: 13 additions & 0 deletions tslang/test/fuzz/seeds/review5__d6base.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// @strict-null false
class C { x: number = 5; v: number[] = []; m() { return this.x; } }
class H { c: C | null = null; }
function mkH(): H { const r = new H(); return r; }
function mk(): C { const r = new C(); r.v.push(1); return r; }
function churn() {
const junk: C[] = [];
for (let i = 0; i < 64; i++) { const c = mk(); c.x = 999; c.v.push(99); junk.push(c); }
}
let G: H = mkH();
function f(x: C) { G.c = null; churn(); print(x.x); }
function g(h: H) { h.c = mk(); f(h.c); }
function main() { g(G); }
12 changes: 12 additions & 0 deletions tslang/test/fuzz/seeds/review5__g6.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// @strict-null false
class C { x: number = 5; v: number[] = []; m() { return this.x; } }
class H { c: C | null = null; }
function mkH(): H { const r = new H(); return r; }
function mk(): C { const r = new C(); r.v.push(1); return r; }
function churn() {
const junk: C[] = [];
for (let i = 0; i < 64; i++) { const c = mk(); c.x = 999; c.v.push(99); junk.push(c); }
}
let G: C = mk();
function run(h: C) { G = mk(); churn(); print(h.x); }
function main() { G.x = 5; run(G); }
8 changes: 8 additions & 0 deletions tslang/test/fuzz/seeds/review5b__h1base.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// @strict-null false
class W { constructor(public x: number) {} }
class V { items: number[] = [1, 2, 3]; constructor(public w: W) {} get() { return this.w.x; } }
interface I { w: W; }
function mkv(n: number) { return new V(new W(n)); }
function churn(): number { let s: number = 0; const a: V[] = []; for (let i = 0; i < 64; i++) { a.push(mkv(1000 + i)); } for (const e of a) { s += e.w.x; } return s; }
function t(c: boolean) { let v = mkv(1); const m = v.get; v = mkv(2); churn(); return m() + v.w.x; }
function main() { print(t(true), t(false)); }
8 changes: 8 additions & 0 deletions tslang/test/fuzz/seeds/review5b__h1base_f.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// @strict-null false
class W { constructor(public x: number) {} }
class V { items: number[] = [1, 2, 3]; constructor(public w: W) {} get() { return this.w.x; } }
interface I { w: W; }
function mkv(n: number) { return new V(new W(n)); }
function churn(): number { let s: number = 0; const a: V[] = []; for (let i = 0; i < 64; i++) { a.push(mkv(1000 + i)); } for (const e of a) { s += e.w.x; } return s; }
function t(c: boolean) { let v = mkv(1); const m = v.get; v = mkv(2); churn(); return m() + v.w.x; }
function main() { print(t(false)); }
10 changes: 10 additions & 0 deletions tslang/test/fuzz/seeds/review6r1__v1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class V { constructor(public x: number) {} }
class H { c: V = new V(5); }
function churn() { let keep: V[] = []; for (let i = 0; i < 2000; i++) { keep.push(new V(77777)); } return keep.length; }
interface Op { run(h: H): number; }
interface Op2 { run(h: H): number; }
class OA2 implements Op2 { run(h: H): number { return h.c.x; } }
class OB implements Op { run(h: H): number { h.c = new V(9); return 0; } }
function f2(o: Op2, h: H) { const c = h.c; o.run(h); churn(); return c.x; }
class Hold { f: (o: Op, h: H) => number = (o: Op, h: H) => 0; }
function main() { const h = new H(); const hd = new Hold(); hd.f = f2 as any as ((o: Op, h: H) => number); print(hd.f(new OB(), h)); print(f2(new OA2(), h)); }
9 changes: 9 additions & 0 deletions tslang/test/fuzz/seeds/review6r1__v1b.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class V { constructor(public x: number) {} }
class H { c: V = new V(5); }
function churn() { let keep: V[] = []; for (let i = 0; i < 2000; i++) { keep.push(new V(77777)); } return keep.length; }
interface Op { run(h: H): number; }
interface Op2 { run(h: H): number; }
class OA2 implements Op2 { run(h: H): number { return h.c.x; } }
class OB implements Op { run(h: H): number { h.c = new V(9); return 0; } }
function f2(o: Op2, h: H) { const c = h.c; o.run(h); churn(); return c.x; }
function main() { const h = new H(); const arr: any[] = [f2]; const fn = arr[0] as ((o: Op, h: H) => number); print(fn(new OB(), h)); print(f2(new OA2(), h)); }
22 changes: 22 additions & 0 deletions tslang/test/fuzz/seeds/review7__pA4.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
class V {
constructor(public x: number) {}
}
function churn() {
const keep: V[] = [];
for (let i = 0; i < 200; i++) {
keep.push(new V(77777));
}
return keep.length;
}
interface Ray { start: V; dir: V; }
interface Hit { thing: Th; ray: Ray; dist: number; }
interface Th { hit(ray: Ray): Hit; k: number; }
class A implements Th { k: number = 1; hit(ray: Ray): Hit { return { thing: this, ray: ray, dist: ray.dir.x }; } }
interface HasDist { dist: number; }
function main() {
const a = new A();
const ray: Ray = { start: new V(1), dir: new V(2) };
const h = a.hit(ray);
const d: HasDist = h;
print(d.dist);
}
41 changes: 41 additions & 0 deletions tslang/test/fuzz/seeds/review7__pM1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// @strict-null false
class V {
constructor(public x: number) {}
}
function churn() {
const keep: V[] = [];
for (let i = 0; i < 200; i++) {
keep.push(new V(77777));
}
return keep.length;
}
interface Ray { start: V; dir: V; }
function len(r: Ray) { return r.start.x + r.dir.x; }
class Cam {
pos: V = new V(3);
pick(c: boolean) {
let r: Ray = { start: new V(10), dir: new V(20) };
churn();
if (c) { r = { start: this.pos, dir: new V(1) }; }
churn();
const n = len(r);
let best: Ray = null;
for (let i = 0; i < 3; i++) {
const t: Ray = i == 1 ? { start: this.pos, dir: new V(i) } : { start: new V(i), dir: new V(i) };
churn();
if (len(t) > 3 && c) { best = t; }
}
churn();
return n + (best == null ? 0 : len(best));
}
}
function main() {
const c = new Cam();
let s = 0;
for (let i = 0; i < 500; i++) {
s += c.pick(i % 2 == 0);
churn();
assert(c.pos.x == 3);
}
print(s, c.pos.x);
}
10 changes: 10 additions & 0 deletions tslang/test/fuzz/seeds/review8r3__L5.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class W { constructor(public x: number) {} }
class V { w: W; constructor(public x: number) { this.w = new W(x); } }
class N { items: V[]; constructor(public v: V) { this.items = [new V(v.x)]; } }
class H { n: N = new N(new V(0)); }
@noinline
function mk(i: number) { return new N(new V(i)); }
function churn() { const hold: V[] = []; for (let i = 0; i < 64; i++) hold.push(new V(777)); }
@noinline
function f(p: N, z: number, q: N) { let r = p; r = new N(new V(2)); churn(); return q.v.x + r.v.x - 2 + z; }
function main() { let s: number = 0; for (let i = 0; i < 1000; i++) { let n = mk(i); s += f(n, (n = mk(i), 0), n) + 2; } print(s); assert(s == 501500); }
10 changes: 10 additions & 0 deletions tslang/test/fuzz/seeds/review8r3__L6.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class W { constructor(public x: number) {} }
class V { w: W; constructor(public x: number) { this.w = new W(x); } }
class N { items: V[]; constructor(public v: V) { this.items = [new V(v.x)]; } }
class H { n: N = new N(new V(0)); }
@noinline
function mk(i: number) { return new N(new V(i)); }
function churn() { const hold: V[] = []; for (let i = 0; i < 64; i++) hold.push(new V(777)); }
@noinline
function f(p: N, z: number) { let r = p; r = new N(new V(2)); churn(); return r.v.x - 2 + z; }
function main() { let s: number = 0; for (let i = 0; i < 1000; i++) { let n = mk(i); s += f(n, (n = mk(i), 0)) + n.v.x + 2 - i + i; } print(s); assert(s == 501500); }
10 changes: 10 additions & 0 deletions tslang/test/fuzz/seeds/review8r3__L6b.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class W { constructor(public x: number) {} }
class V { w: W; constructor(public x: number) { this.w = new W(x); } }
class N { items: V[]; constructor(public v: V) { this.items = [new V(v.x)]; } }
class H { n: N = new N(new V(0)); }
@noinline
function mk(i: number) { return new N(new V(i)); }
function churn() { const hold: V[] = []; for (let i = 0; i < 64; i++) hold.push(new V(777)); }
@noinline
function f(p: N, z: number) { const k = p.v.x; let r = p; r = new N(new V(2)); churn(); return r.v.x - 2 + z + k - k; }
function main() { let s: number = 0; for (let i = 0; i < 1000; i++) { let n = mk(i); s += f(n, (n = mk(i), 0)); churn(); s += n.v.x + 2; } print(s); assert(s == 501500); }
10 changes: 10 additions & 0 deletions tslang/test/fuzz/seeds/review8r3__L7.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class W { constructor(public x: number) {} }
class V { w: W; constructor(public x: number) { this.w = new W(x); } }
class N { items: V[]; constructor(public v: V) { this.items = [new V(v.x)]; } }
class H { n: N = new N(new V(0)); }
@noinline
function mk(i: number) { return new N(new V(i)); }
function churn() { const hold: V[] = []; for (let i = 0; i < 64; i++) hold.push(new V(777)); }
@noinline
function f(p: N, z: number) { const k = p.v.x; churn(); let r = p; r = new N(new V(2)); churn(); return r.v.x - 2 + z + k; }
function main() { let s: number = 0; for (let i = 0; i < 1000; i++) { let n = mk(i); s += f(n, (n = mk(7), 0)) + 2; } print(s); assert(s == 501500); }
11 changes: 11 additions & 0 deletions tslang/test/fuzz/seeds/review8r3__L7h.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class W { constructor(public x: number) {} }
class V { w: W; constructor(public x: number) { this.w = new W(x); } }
class N { items: V[]; constructor(public v: V) { this.items = [new V(v.x)]; } }
class H { n: N = new N(new V(0)); }
@noinline
function mk(i: number) { return new N(new V(i)); }
function churn() { const hold: V[] = []; for (let i = 0; i < 64; i++) hold.push(new V(777)); }
class H2 { n: N = new N(new V(0)); }
@noinline
function f(h: H2, p: N, z: number) { h.n = p; churn(); return h.n.v.x + 2 + z; }
function main() { const h = new H2(); let s: number = 0; for (let i = 0; i < 1000; i++) { let n = mk(i); s += f(h, n, (n = mk(7), 0)); } print(s); assert(s == 501500); }
10 changes: 10 additions & 0 deletions tslang/test/fuzz/seeds/review8r3__L7u.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class W { constructor(public x: number) {} }
class V { w: W; constructor(public x: number) { this.w = new W(x); } }
class N { items: V[]; constructor(public v: V) { this.items = [new V(v.x)]; } }
class H { n: N = new N(new V(0)); }
@noinline
function mk(i: number) { return new N(new V(i)); }
function churn() { const hold: V[] = []; for (let i = 0; i < 64; i++) hold.push(new V(777)); }
@noinline
function f(p: N, z: number) { const k = p.v.x; churn(); let r = p; r = new N(new V(2)); churn(); return r.v.x - 2 + z + k; }
function main() { let s: number = 0; for (let i = 0; i < 1000; i++) { let n = mk(i); try { s += f(n, (n = mk(7), 0)) + 2; } catch (e) { s = -1; } } print(s); assert(s == 501500); }
10 changes: 10 additions & 0 deletions tslang/test/fuzz/seeds/review8r3__k1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class W { constructor(public x: number) {} }
class V { w: W; constructor(public x: number) { this.w = new W(x); } }
class N { items: V[]; constructor(public v: V) { this.items = [new V(v.x)]; } }
class H { n: N = new N(new V(0)); }
@noinline
function mk(i: number) { return new N(new V(i)); }
function churn() { const hold: V[] = []; for (let i = 0; i < 64; i++) hold.push(new V(777)); }
@noinline
function f(p: N, q: N, z: number) { let r = p; let t = q; r = new N(new V(2)); t = new N(new V(0)); churn(); return r.v.x + t.v.x - 2 + z; }
function main() { let s: number = 0; for (let i = 0; i < 1000; i++) { let n = mk(i); s += f(n, n, (n = mk(5), 0)) + i + 2; } print(s); assert(s == 501500); }
10 changes: 10 additions & 0 deletions tslang/test/fuzz/seeds/review8r3__k2.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class W { constructor(public x: number) {} }
class V { w: W; constructor(public x: number) { this.w = new W(x); } }
class N { items: V[]; constructor(public v: V) { this.items = [new V(v.x)]; } }
class H { n: N = new N(new V(0)); }
@noinline
function mk(i: number) { return new N(new V(i)); }
function churn() { const hold: V[] = []; for (let i = 0; i < 64; i++) hold.push(new V(777)); }
@noinline
function f(p: N, q: V, z: number) { let r = p; r = new N(new V(2)); churn(); return q.x + r.v.x - 2 + z; }
function main() { let s: number = 0; for (let i = 0; i < 1000; i++) { let n = mk(i); s += f(n, n.v, (n = mk(5), 0)) + 2; } print(s); assert(s == 501500); }
10 changes: 10 additions & 0 deletions tslang/test/fuzz/seeds/review8r3__k6.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class W { constructor(public x: number) {} }
class V { w: W; constructor(public x: number) { this.w = new W(x); } }
class N { items: V[]; constructor(public v: V) { this.items = [new V(v.x)]; } }
class H { n: N = new N(new V(0)); }
@noinline
function mk(i: number) { return new N(new V(i)); }
function churn() { const hold: V[] = []; for (let i = 0; i < 64; i++) hold.push(new V(777)); }
@noinline
function f(p: N, q: N, z: number) { let r = p; r = new N(new V(2)); churn(); return q.v.x + r.v.x - 2 + z; }
function main() { let s: number = 0; for (let i = 0; i < 1000; i++) { let n = mk(i); s += f(n, n, (n = mk(5), 0)) + 2; } print(s); assert(s == 501500); }
10 changes: 10 additions & 0 deletions tslang/test/fuzz/seeds/review8r3__k6b.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class W { constructor(public x: number) {} }
class V { w: W; constructor(public x: number) { this.w = new W(x); } }
class N { items: V[]; constructor(public v: V) { this.items = [new V(v.x)]; } }
class H { n: N = new N(new V(0)); }
@noinline
function mk(i: number) { return new N(new V(i)); }
function churn() { const hold: V[] = []; for (let i = 0; i < 64; i++) hold.push(new V(777)); }
@noinline
function f(p: N, q: N, z: N) { let r = p; r = new N(new V(2)); churn(); return q.v.x + r.v.x - 2 + z.v.x - 5; }
function main() { let s: number = 0; for (let i = 0; i < 1000; i++) { let n = mk(i); s += f(n, n, n = mk(5)) + 2; } print(s); assert(s == 501500); }
10 changes: 10 additions & 0 deletions tslang/test/fuzz/seeds/review8r3__k6c.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class W { constructor(public x: number) {} }
class V { w: W; constructor(public x: number) { this.w = new W(x); } }
class N { items: V[]; constructor(public v: V) { this.items = [new V(v.x)]; } }
class H { n: N = new N(new V(0)); }
@noinline
function mk(i: number) { return new N(new V(i)); }
function churn() { const hold: V[] = []; for (let i = 0; i < 64; i++) hold.push(new V(777)); }
@noinline
function f(p: N, q: () => number, z: number) { let r = p; r = new N(new V(2)); churn(); return q() + r.v.x - 2 + z; }
function main() { let s: number = 0; for (let i = 0; i < 1000; i++) { let n = mk(i); const g = () => n.v.x; s += f(n, g, (n = mk(5), 0)) + 2; } print(s); }
11 changes: 11 additions & 0 deletions tslang/test/fuzz/seeds/review8r3__k6i.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class W { constructor(public x: number) {} }
class V { w: W; constructor(public x: number) { this.w = new W(x); } }
class N { items: V[]; constructor(public v: V) { this.items = [new V(v.x)]; } }
class H { n: N = new N(new V(0)); }
@noinline
function mk(i: number) { return new N(new V(i)); }
function churn() { const hold: V[] = []; for (let i = 0; i < 64; i++) hold.push(new V(777)); }
interface I { v: V; }
@noinline
function f(p: N, q: I, z: number) { let r = p; r = new N(new V(2)); churn(); return q.v.x + r.v.x - 2 + z; }
function main() { let s: number = 0; for (let i = 0; i < 1000; i++) { let n = mk(i); s += f(n, n, (n = mk(5), 0)) + 2; } print(s); assert(s == 501500); }
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// -mm=own rejects: `f` keeps `p` (it moves into a `let` that is given another value, spec 33) and
// borrows `q`, and the call's own argument list gives `n` another value after both reads of it:
// `f(n, n, (n = mk(5), 0))`. The assignment releases the old object before `f` takes it through
// `p` and reads it through `q`, so the assignment is a use of `n` after the move.
class V {
constructor(public x: number) {}
}

class N {
constructor(public v: V) {}
}

@noinline
function mk(i: number) {
return new N(new V(i));
}

function churn() {
const hold: V[] = [];
for (let i = 0; i < 64; i++) {
hold.push(new V(777));
}
}

@noinline
function f(p: N, q: N, z: number) {
let r = p;
r = new N(new V(2));
churn();
return q.v.x + r.v.x - 2 + z;
}

function main() {
let s: number = 0;
for (let i = 0; i < 1000; i++) {
let n = mk(i);
s += f(n, n, (n = mk(5), 0)) + 2;
}

print(s);
assert(s == 501500);
}
Loading
Loading