Unverified Commit 6c3f9b23 authored by Chanjung Kim's avatar Chanjung Kim Committed by GitHub
Browse files

Fix Kotlin interfaces in Lists and Maps being not destroyed (#2479)

* Don't repeat Disposable.destroy when destroying records

* Fix interfaces in Lists and Maps being not destroyed correctly

* Modify coverall to check interfaces in collections are destroyed correctly

* Insert GC.start before comparing # of alive objects in test_coverall.rb

* Update CHANGELOG.md
parent c696917d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@

- Python: fix using Vecs and other composite types in tuple enums ([#2445](https://github.com/mozilla/uniffi-rs/issues/2445))

- Kotlin: fix interfaces in sequences and records being not disposed ([#2479](https://github.com/mozilla/uniffi-rs/issues/2479))

### What's changed?

- Rust 2024 edition is supported, msrv is 1.82.0
+2 −0
Original line number Diff line number Diff line
@@ -63,6 +63,8 @@ dictionary SimpleDict {
    double float64;
    double? maybe_float64;
    Coveralls? coveralls;
    sequence<Coveralls?> coveralls_list;
    record<string, Coveralls?> coveralls_map;
    NodeTrait? test_trait;
};

+20 −0
Original line number Diff line number Diff line
@@ -194,6 +194,8 @@ pub struct SimpleDict {
    float64: f64,
    maybe_float64: Option<f64>,
    coveralls: Option<Arc<Coveralls>>,
    coveralls_list: Vec<Option<Arc<Coveralls>>>,
    coveralls_map: HashMap<String, Option<Arc<Coveralls>>>,
    test_trait: Option<Arc<dyn NodeTrait>>,
}

@@ -329,6 +331,24 @@ fn create_some_dict() -> SimpleDict {
        float64: 0.0,
        maybe_float64: Some(1.0),
        coveralls: Some(Arc::new(Coveralls::new("some_dict".to_string()))),
        coveralls_list: vec![
            Some(Arc::new(Coveralls::new("some_dict_1".to_string()))),
            None,
            Some(Arc::new(Coveralls::new("some_dict_2".to_string()))),
        ],
        coveralls_map: [
            (
                "some_dict_3".to_string(),
                Some(Arc::new(Coveralls::new("some_dict_3".to_string()))),
            ),
            ("none".to_string(), None),
            (
                "some_dict_4".to_string(),
                Some(Arc::new(Coveralls::new("some_dict_4".to_string()))),
            ),
        ]
        .into_iter()
        .collect(),
        test_trait: Some(Arc::new(traits::Node::default())),
    }
}
+15 −0
Original line number Diff line number Diff line
@@ -39,8 +39,20 @@ createSomeDict().use { d ->
    assert(d.maybeFloat64!!.almostEquals(1.0))

    assert(d.coveralls!!.getName() == "some_dict")

    assert(d.coverallsList[0]!!.getName() == "some_dict_1")
    assert(d.coverallsList[1] == null)
    assert(d.coverallsList[2]!!.getName() == "some_dict_2")

    assert(d.coverallsMap["some_dict_3"]!!.getName() == "some_dict_3")
    assert(d.coverallsMap["none"] == null)
    assert(d.coverallsMap["some_dict_4"]!!.getName() == "some_dict_4")

    assert(getNumAlive() == 5UL)
}

assert(getNumAlive() == 0UL)

createNoneDict().use { d ->
    assert(d.text == "text")
    assert(d.maybeText == null)
@@ -69,8 +81,11 @@ createNoneDict().use { d ->
    assert(d.maybeFloat64 == null)

    assert(d.coveralls == null)

    assert(getNumAlive() == 0UL)
}

assert(getNumAlive() == 0UL)

// Test arcs.

+16 −0
Original line number Diff line number Diff line
@@ -41,6 +41,18 @@ class TestCoverall(unittest.TestCase):
        self.assertAlmostEqual(d.float64, 0.0)
        self.assertAlmostEqual(d.maybe_float64, 1.0)

        self.assertEqual(d.coveralls_list[0].get_name(), "some_dict_1")
        self.assertIsNone(d.coveralls_list[1])
        self.assertEqual(d.coveralls_list[2].get_name(), "some_dict_2")

        self.assertEqual(d.coveralls_map["some_dict_3"].get_name(), "some_dict_3")
        self.assertIsNone(d.coveralls_map["none"])
        self.assertEqual(d.coveralls_map["some_dict_4"].get_name(), "some_dict_4")

        self.assertEqual(get_num_alive(), 5)
        d = None
        self.assertEqual(get_num_alive(), 0)

    def test_none_dict(self):
        d = create_none_dict()
        self.assertEqual(d.text, "text")
@@ -67,6 +79,10 @@ class TestCoverall(unittest.TestCase):
        self.assertIsNone(d.coveralls)
        self.assertIsNone(d.test_trait)

        self.assertEqual(get_num_alive(), 0)
        d = None
        self.assertEqual(get_num_alive(), 0)

    def test_constructors(self):
        self.assertEqual(get_num_alive(), 0)
        # must work.
Loading