mirror of
https://github.com/pybind/pybind11.git
synced 2026-07-14 11:07:22 +00:00
Add SpOwner, test_with_sp_owner, test_with_sp_and_wp_owners
This commit is contained in:
@@ -34,6 +34,20 @@ private:
|
||||
std::weak_ptr<VirtBase> wp;
|
||||
};
|
||||
|
||||
struct SpOwner {
|
||||
void set_sp(const std::shared_ptr<VirtBase> &sp) { this->sp = sp; }
|
||||
|
||||
int get_code() {
|
||||
if (!sp) {
|
||||
return -888;
|
||||
}
|
||||
return sp->get_code();
|
||||
}
|
||||
|
||||
private:
|
||||
std::shared_ptr<VirtBase> sp;
|
||||
};
|
||||
|
||||
} // namespace class_sp_trampoline_weak_ptr
|
||||
} // namespace pybind11_tests
|
||||
|
||||
@@ -48,4 +62,9 @@ TEST_SUBMODULE(class_sp_trampoline_weak_ptr, m) {
|
||||
.def(py::init<>())
|
||||
.def("set_wp", &WpOwner::set_wp)
|
||||
.def("get_code", &WpOwner::get_code);
|
||||
|
||||
py::class_<SpOwner>(m, "SpOwner")
|
||||
.def(py::init<>())
|
||||
.def("set_sp", &SpOwner::set_sp)
|
||||
.def("get_code", &SpOwner::get_code);
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ class PyDrvd(m.VirtBase):
|
||||
|
||||
|
||||
@pytest.mark.parametrize(("vtype", "expected_code"), [(m.VirtBase, 100), (PyDrvd, 200)])
|
||||
def test_weak_ptr_owner(vtype, expected_code):
|
||||
def test_with_wp_owner(vtype, expected_code):
|
||||
wpo = m.WpOwner()
|
||||
assert wpo.get_code() == -999
|
||||
|
||||
@@ -26,3 +26,44 @@ def test_weak_ptr_owner(vtype, expected_code):
|
||||
if env.PYPY or env.GRAALPY:
|
||||
pytest.skip("Cannot reliably trigger GC")
|
||||
assert wpo.get_code() == -999
|
||||
|
||||
|
||||
@pytest.mark.parametrize(("vtype", "expected_code"), [(m.VirtBase, 100), (PyDrvd, 200)])
|
||||
def test_with_sp_owner(vtype, expected_code):
|
||||
spo = m.SpOwner()
|
||||
assert spo.get_code() == -888
|
||||
|
||||
obj = vtype()
|
||||
assert obj.get_code() == expected_code
|
||||
|
||||
spo.set_sp(obj)
|
||||
assert spo.get_code() == expected_code
|
||||
|
||||
del obj
|
||||
if env.PYPY or env.GRAALPY:
|
||||
pytest.skip("Cannot reliably trigger GC")
|
||||
assert spo.get_code() == 100 # Inheritance slicing (issue #1333)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(("vtype", "expected_code"), [(m.VirtBase, 100), (PyDrvd, 200)])
|
||||
def test_with_sp_and_wp_owners(vtype, expected_code):
|
||||
spo = m.SpOwner()
|
||||
wpo = m.WpOwner()
|
||||
|
||||
obj = vtype()
|
||||
spo.set_sp(obj)
|
||||
wpo.set_wp(obj)
|
||||
|
||||
assert spo.get_code() == expected_code
|
||||
assert wpo.get_code() == expected_code
|
||||
|
||||
del obj
|
||||
if env.PYPY or env.GRAALPY:
|
||||
pytest.skip("Cannot reliably trigger GC")
|
||||
|
||||
# Inheritance slicing (issue #1333)
|
||||
assert spo.get_code() == 100
|
||||
assert wpo.get_code() == 100
|
||||
|
||||
del spo
|
||||
assert wpo.get_code() == -999
|
||||
|
||||
Reference in New Issue
Block a user