summary refs log tree commit diff
path: root/src/test/run-pass/resource-cycle.rs
blob: a20d18ea61ed349f31fac1d3bdce8b1a6130d4a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// 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);
}