rust/src/test/run-pass/resource-cycle.rs

63 lines
1.7 KiB
Rust
Raw Normal View History

// Don't leak the unique pointers
class r {
let v: *int;
new(v: *int) unsafe {
self.v = v;
#debug("r's ctor: v = %x, self = %x, self.v = %x",
unsafe::reinterpret_cast::<*int, uint>(v),
unsafe::reinterpret_cast::<*r, uint>(ptr::addr_of(self)),
unsafe::reinterpret_cast::<**int, uint>(ptr::addr_of(self.v)));
}
drop unsafe {
#debug("r's dtor: self = %x, self.v = %x, self.v's value = %x",
unsafe::reinterpret_cast::<*r, uint>(ptr::addr_of(self)),
unsafe::reinterpret_cast::<**int, uint>(ptr::addr_of(self.v)),
unsafe::reinterpret_cast::<*int, uint>(self.v));
let v2: ~int = unsafe::reinterpret_cast(self.v); }
}
enum t = {
mut next: option<@t>,
r: r
};
fn main() unsafe {
let i1 = ~0;
let i1p = unsafe::reinterpret_cast(i1);
unsafe::forget(i1);
let i2 = ~0;
let i2p = unsafe::reinterpret_cast(i2);
unsafe::forget(i2);
let x1 = @t({
mut next: none,
r: {
let rs = r(i1p);
#debug("r = %x",
unsafe::reinterpret_cast::<*r, uint>(ptr::addr_of(rs)));
rs }
});
#debug("x1 = %x, x1.r = %x",
unsafe::reinterpret_cast::<@t, uint>(x1),
unsafe::reinterpret_cast::<*r, uint>(ptr::addr_of(x1.r)));
let x2 = @t({
mut next: none,
r: {
let rs = r(i2p);
#debug("r2 = %x",
unsafe::reinterpret_cast::<*r, uint>(ptr::addr_of(rs)));
rs
}
});
#debug("x2 = %x, x2.r = %x",
unsafe::reinterpret_cast::<@t, uint>(x2),
unsafe::reinterpret_cast::<*r, uint>(ptr::addr_of(x2.r)));
x1.next = some(x2);
x2.next = some(x1);
}