mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-14 09:34:46 +00:00
Added a test to detect invalid RTTI caching
The current inheritance testing isn't sufficient to detect a cache failure; the test added here breaks PR #390, which caches the run-time-determined return type the first time a function is called, then reuses that cached type even though the run-time type could be different for a future call.
This commit is contained in:
parent
f22683806e
commit
0e489777ff
@ -77,5 +77,10 @@ test_initializer inheritance([](py::module &m) {
|
|||||||
|
|
||||||
m.def("return_class_1", []() -> BaseClass* { return new DerivedClass1(); });
|
m.def("return_class_1", []() -> BaseClass* { return new DerivedClass1(); });
|
||||||
m.def("return_class_2", []() -> BaseClass* { return new DerivedClass2(); });
|
m.def("return_class_2", []() -> BaseClass* { return new DerivedClass2(); });
|
||||||
|
m.def("return_class_n", [](int n) -> BaseClass* {
|
||||||
|
if (n == 1) return new DerivedClass1();
|
||||||
|
if (n == 2) return new DerivedClass2();
|
||||||
|
return new BaseClass();
|
||||||
|
});
|
||||||
m.def("return_none", []() -> BaseClass* { return nullptr; });
|
m.def("return_none", []() -> BaseClass* { return nullptr; });
|
||||||
});
|
});
|
||||||
|
@ -31,8 +31,16 @@ def test_inheritance(msg):
|
|||||||
|
|
||||||
|
|
||||||
def test_automatic_upcasting():
|
def test_automatic_upcasting():
|
||||||
from pybind11_tests import return_class_1, return_class_2, return_none
|
from pybind11_tests import return_class_1, return_class_2, return_class_n, return_none
|
||||||
|
|
||||||
assert type(return_class_1()).__name__ == "DerivedClass1"
|
assert type(return_class_1()).__name__ == "DerivedClass1"
|
||||||
assert type(return_class_2()).__name__ == "DerivedClass2"
|
assert type(return_class_2()).__name__ == "DerivedClass2"
|
||||||
assert type(return_none()).__name__ == "NoneType"
|
assert type(return_none()).__name__ == "NoneType"
|
||||||
|
# Repeat these a few times in a random order to ensure no invalid caching is applied
|
||||||
|
assert type(return_class_n(1)).__name__ == "DerivedClass1"
|
||||||
|
assert type(return_class_n(2)).__name__ == "DerivedClass2"
|
||||||
|
assert type(return_class_n(0)).__name__ == "BaseClass"
|
||||||
|
assert type(return_class_n(2)).__name__ == "DerivedClass2"
|
||||||
|
assert type(return_class_n(2)).__name__ == "DerivedClass2"
|
||||||
|
assert type(return_class_n(0)).__name__ == "BaseClass"
|
||||||
|
assert type(return_class_n(1)).__name__ == "DerivedClass1"
|
||||||
|
Loading…
Reference in New Issue
Block a user