From 4ff46a1502461970e50c17a3da0b8bb76c732766 Mon Sep 17 00:00:00 2001 From: Jesse Ruderman Date: Mon, 26 Sep 2011 20:34:07 -0700 Subject: [PATCH] Add a cycle-collection fuzzer --- src/fuzzer/cycles.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/fuzzer/cycles.rs diff --git a/src/fuzzer/cycles.rs b/src/fuzzer/cycles.rs new file mode 100644 index 000000000000..0caf414d1366 --- /dev/null +++ b/src/fuzzer/cycles.rs @@ -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(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); +}