ps-boa-gc 1.0.2-dev

Garbage collector for the Boa JavaScript engine.
Documentation
mod miri {
    use super::super::run_test;
    use crate::{Gc, WeakMap, force_collect, has_weak_maps};

    #[test]
    fn weak_map_basic() {
        run_test(|| {
            let key1 = Gc::new(String::from("key1"));
            let key2 = Gc::new(String::from("key2"));
            let key3 = Gc::new(String::from("key3"));

            assert!(!has_weak_maps());

            let mut map = WeakMap::new();

            assert!(has_weak_maps());

            map.insert(&key1, ());
            map.insert(&key2, ());
            map.insert(&key3, ());

            force_collect();
            assert!(has_weak_maps());

            assert!(map.contains_key(&key1));
            assert!(map.contains_key(&key2));
            assert!(map.contains_key(&key3));

            drop(key1);

            force_collect();
            assert!(has_weak_maps());

            assert!(map.contains_key(&key2));
            assert!(map.contains_key(&key3));

            drop(key2);

            force_collect();
            assert!(has_weak_maps());

            assert!(map.contains_key(&key3));
            assert!(has_weak_maps());

            drop(key3);

            assert!(has_weak_maps());

            force_collect();
            assert!(has_weak_maps());

            drop(map);

            force_collect();
            assert!(!has_weak_maps());
        });
    }

    #[test]
    fn weak_map_multiple() {
        run_test(|| {
            let key1 = Gc::new(String::from("key1"));
            let key2 = Gc::new(String::from("key2"));
            let key3 = Gc::new(String::from("key3"));

            assert!(!has_weak_maps());

            let mut map_1 = WeakMap::new();
            let mut map_2 = WeakMap::new();

            assert!(has_weak_maps());

            map_1.insert(&key1, ());
            map_1.insert(&key2, ());
            map_2.insert(&key3, ());

            force_collect();
            assert!(has_weak_maps());

            assert!(map_1.contains_key(&key1));
            assert!(map_1.contains_key(&key2));
            assert!(!map_1.contains_key(&key3));
            assert!(!map_2.contains_key(&key1));
            assert!(!map_2.contains_key(&key2));
            assert!(map_2.contains_key(&key3));

            force_collect();
            assert!(has_weak_maps());

            drop(key1);
            drop(key2);

            force_collect();
            assert!(has_weak_maps());

            assert!(!map_1.contains_key(&key3));
            assert!(map_2.contains_key(&key3));

            drop(key3);

            force_collect();
            assert!(has_weak_maps());

            drop(map_1);

            force_collect();
            assert!(has_weak_maps());

            drop(map_2);

            force_collect();
            assert!(!has_weak_maps());
        });
    }

    #[test]
    fn weak_map_key_live() {
        run_test(|| {
            let key = Gc::new(String::from("key"));
            let key_copy = key.clone();

            let mut map = WeakMap::new();

            map.insert(&key, ());

            assert!(map.contains_key(&key));
            assert!(map.contains_key(&key_copy));

            assert!(map.remove(&key));

            map.insert(&key, ());

            drop(key);

            force_collect();

            assert!(map.contains_key(&key_copy));
        });
    }
}