Add a cycle-collection fuzzer
This commit is contained in:
parent
3778b6c6a8
commit
4ff46a1502
1 changed files with 59 additions and 0 deletions
59
src/fuzzer/cycles.rs
Normal file
59
src/fuzzer/cycles.rs
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
use std;
|
||||
import std::vec;
|
||||
import std::rand;
|
||||
import std::option;
|
||||
|
||||
// random uint less than n
|
||||
fn under(r : rand::rng, n : uint) -> uint { assert n != 0u; r.next() as uint % n }
|
||||
|
||||
// random choice from a vec
|
||||
fn choice<T>(r : rand::rng, v : [T]) -> T { assert vec::len(v) != 0u; v[under(r, vec::len(v))] }
|
||||
|
||||
// 1 in n chance of being true
|
||||
fn unlikely(r : rand::rng, n : uint) -> bool { under(r, n) == 0u }
|
||||
|
||||
tag maybe_pointy {
|
||||
no_pointy;
|
||||
yes_pointy(@pointy);
|
||||
}
|
||||
|
||||
type pointy = {
|
||||
mutable x : maybe_pointy,
|
||||
mutable y : maybe_pointy,
|
||||
mutable z : fn()->()
|
||||
};
|
||||
|
||||
iter allunder(n: uint) -> uint {
|
||||
let i: uint = 0u;
|
||||
while i < n { put i; i += 1u; }
|
||||
}
|
||||
|
||||
fn nopT(_x : @pointy) { }
|
||||
fn nop() { }
|
||||
|
||||
fn test_cycles(r : rand::rng)
|
||||
{
|
||||
const max : uint = 10u;
|
||||
|
||||
let v : [mutable @pointy] = [mutable];
|
||||
for each i in allunder(max) {
|
||||
v += [mutable @{ mutable x : no_pointy, mutable y : no_pointy, mutable z: nop }];
|
||||
}
|
||||
|
||||
for each i in allunder(max) {
|
||||
v[i].x = yes_pointy(v[under(r, max)]);
|
||||
v[i].y = yes_pointy(v[under(r, max)]);
|
||||
v[i].z = bind nopT(v[under(r, max)]);
|
||||
}
|
||||
|
||||
// Drop refs one at a time
|
||||
for each i in allunder(max) {
|
||||
v[i] = @{ mutable x : no_pointy, mutable y : no_pointy, mutable z: nop };
|
||||
}
|
||||
}
|
||||
|
||||
fn main()
|
||||
{
|
||||
let r = rand::mk_rng();
|
||||
test_cycles(r);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue