use dreck::*; fn alloc_mut<'gc, 'own>(arena: &'gc mut Root<'own>) -> Gc<'gc, 'own, u32> { arena.add(0 as u32) } #[test] fn allocate() { new_root!(owner, root); let a = root.add(1i32); *a.borrow_mut_untraced(&mut owner) += 1; assert_eq!(*a.borrow(&owner), 2); } #[test] fn collect() { new_root!(owner, root); let a = root.add(1i32); *a.borrow_mut_untraced(&mut owner) += 1; assert_eq!(*a.borrow(&owner), 2); root.collect_full(&mut owner); } #[test] fn root() { new_root!(owner, root); let a = root.add(1i32); root!(&root, a); let b = a; *b.borrow_mut_untraced(&mut owner) += 1; root.collect_full(&mut owner); assert_eq!(*b.borrow(&owner), 2); } #[test] fn rebind_root() { new_root!(owner, root); let a = alloc_mut(root); let a = rebind!(&root, a); let b = root.add(1u32); *a.borrow_mut_untraced(&mut owner) += 1; assert_eq!(*a.borrow(&owner), *b.borrow(&owner)); } pub struct Container<'gc, 'own>(Option>>); unsafe impl<'gc, 'own> Trace<'own> for Container<'gc, 'own> { fn needs_trace() -> bool where Self: Sized, { true } fn trace<'a>(&self, trace: Tracer<'a,'own>) { self.0.trace(trace) } } unsafe impl<'from, 'to,'own > Bound<'to> for Container<'from, 'own> { type Rebound = Container<'to,'own>; } #[test] fn container_trace() { new_root!(owner, root); let mut container = Container(None); for _ in 0..20 { let alloc = root.add(container); container = Container(Some(alloc)) } let alloc = root.add(container); root!(&root, alloc); root.collect_full(&mut owner); assert!(alloc.borrow(&owner).0.is_some()) }