Skip to content

Commit bfb5fce

Browse files
committed
Revert "[smart_holder] Keep parent alive when returning raw pointers (#4609)"
This reverts commit 99cf27a.
1 parent 7d8e6ea commit bfb5fce

File tree

3 files changed

+1
-66
lines changed

3 files changed

+1
-66
lines changed

include/pybind11/detail/smart_holder_type_casters.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -788,11 +788,7 @@ struct smart_holder_type_caster : smart_holder_type_caster_load<T>,
788788

789789
static handle cast(T *src, return_value_policy policy, handle parent) {
790790
if (policy == return_value_policy::_clif_automatic) {
791-
if (parent) {
792-
policy = return_value_policy::reference_internal;
793-
} else {
794-
policy = return_value_policy::reference;
795-
}
791+
policy = return_value_policy::reference;
796792
}
797793
return cast(const_cast<T const *>(src), policy, parent); // Mutbl2Const
798794
}

tests/test_return_value_policy_override.cpp

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,10 @@
22

33
#include "pybind11_tests.h"
44

5-
#include <vector>
6-
75
namespace test_return_value_policy_override {
86

97
struct some_type {};
108

11-
struct data_field {
12-
int value = -99;
13-
14-
explicit data_field(int v) : value(v) {}
15-
};
16-
17-
struct data_fields_holder {
18-
std::vector<data_field> vec;
19-
20-
explicit data_fields_holder(std::size_t vec_size) {
21-
for (std::size_t i = 0; i < vec_size; i++) {
22-
vec.emplace_back(13 + static_cast<int>(i) * 11);
23-
}
24-
}
25-
26-
data_field *vec_at(std::size_t index) {
27-
if (index >= vec.size()) {
28-
return nullptr;
29-
}
30-
return &vec[index];
31-
}
32-
33-
const data_field *vec_at_const_ptr(std::size_t index) { return vec_at(index); }
34-
};
35-
369
// cp = copyable, mv = movable, 1 = yes, 0 = no
3710
struct type_cp1_mv1 {
3811
std::string mtxt;
@@ -183,8 +156,6 @@ std::unique_ptr<type_cp0_mv0> return_unique_pointer_nocopy_nomove() {
183156

184157
} // namespace test_return_value_policy_override
185158

186-
using test_return_value_policy_override::data_field;
187-
using test_return_value_policy_override::data_fields_holder;
188159
using test_return_value_policy_override::some_type;
189160
using test_return_value_policy_override::type_cp0_mv0;
190161
using test_return_value_policy_override::type_cp0_mv1;
@@ -234,8 +205,6 @@ struct type_caster<some_type> : type_caster_base<some_type> {
234205
} // namespace detail
235206
} // namespace pybind11
236207

237-
PYBIND11_SMART_HOLDER_TYPE_CASTERS(data_field)
238-
PYBIND11_SMART_HOLDER_TYPE_CASTERS(data_fields_holder)
239208
PYBIND11_SMART_HOLDER_TYPE_CASTERS(type_cp1_mv1)
240209
PYBIND11_SMART_HOLDER_TYPE_CASTERS(type_cp0_mv1)
241210
PYBIND11_SMART_HOLDER_TYPE_CASTERS(type_cp1_mv0)
@@ -270,21 +239,6 @@ TEST_SUBMODULE(return_value_policy_override, m) {
270239
},
271240
py::return_value_policy::_clif_automatic);
272241

273-
py::classh<data_field>(m, "data_field").def_readwrite("value", &data_field::value);
274-
py::classh<data_fields_holder>(m, "data_fields_holder")
275-
.def(py::init<std::size_t>())
276-
.def("vec_at",
277-
[](const py::object &self_py, std::size_t index) {
278-
auto *self = py::cast<data_fields_holder *>(self_py);
279-
return py::cast(
280-
self->vec_at(index), py::return_value_policy::_clif_automatic, self_py);
281-
})
282-
.def("vec_at_const_ptr", [](const py::object &self_py, std::size_t index) {
283-
auto *self = py::cast<data_fields_holder *>(self_py);
284-
return py::cast(
285-
self->vec_at_const_ptr(index), py::return_value_policy::_clif_automatic, self_py);
286-
});
287-
288242
py::classh<type_cp1_mv1>(m, "type_cp1_mv1")
289243
.def(py::init<std::string>())
290244
.def_readonly("mtxt", &type_cp1_mv1::mtxt);

tests/test_return_value_policy_override.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,6 @@ def test_return_pointer():
1717
assert m.return_pointer_with_policy_clif_automatic() == "_clif_automatic"
1818

1919

20-
def test_persistent_holder():
21-
h = m.data_fields_holder(2)
22-
assert h.vec_at(0).value == 13
23-
assert h.vec_at(1).value == 24
24-
assert h.vec_at_const_ptr(0).value == 13
25-
assert h.vec_at_const_ptr(1).value == 24
26-
27-
28-
def test_temporary_holder():
29-
data_field = m.data_fields_holder(2).vec_at(1)
30-
assert data_field.value == 24
31-
data_field = m.data_fields_holder(2).vec_at_const_ptr(1)
32-
assert data_field.value == 24
33-
34-
3520
@pytest.mark.parametrize(
3621
("func", "expected"),
3722
[

0 commit comments

Comments
 (0)