12 std::vector<PyObject *> make_vector_pyobject_ptr(
const py::object &ValueHolder) {
13 std::vector<PyObject *> vec_obj;
14 for (
int i = 1;
i < 3;
i++) {
15 vec_obj.push_back(ValueHolder(
i * 93).
release().ptr());
24 m.def(
"cast_from_pyobject_ptr", []() {
25 PyObject *ptr = PyLong_FromLongLong(6758
L);
26 return py::cast(ptr, py::return_value_policy::take_ownership);
28 m.def(
"cast_handle_to_pyobject_ptr", [](py::handle obj) {
29 auto rc1 = obj.ref_count();
30 auto *ptr = py::cast<PyObject *>(obj);
31 auto rc2 = obj.ref_count();
35 return 100 - py::reinterpret_steal<py::object>(ptr).attr(
"value").cast<
int>();
37 m.def(
"cast_object_to_pyobject_ptr", [](py::object obj) {
39 auto rc1 = hdl.ref_count();
40 auto *ptr = py::cast<PyObject *>(std::move(obj));
41 auto rc2 = hdl.ref_count();
45 return 300 - py::reinterpret_steal<py::object>(ptr).attr(
"value").cast<
int>();
47 m.def(
"cast_list_to_pyobject_ptr", [](py::list lst) {
50 auto rc1 = hdl.ref_count();
51 auto *ptr = py::cast<PyObject *>(std::move(lst));
52 auto rc2 = hdl.ref_count();
56 return 400 -
static_cast<int>(
py::len(py::reinterpret_steal<py::list>(ptr)));
60 "return_pyobject_ptr",
61 []() {
return PyLong_FromLongLong(2314
L); },
62 py::return_value_policy::take_ownership);
63 m.def(
"pass_pyobject_ptr", [](PyObject *ptr) {
64 return 200 - py::reinterpret_borrow<py::object>(ptr).attr(
"value").cast<
int>();
67 m.def(
"call_callback_with_object_return",
68 [](
const std::function<py::object(
int)> &cb,
int value) {
return cb(
value); });
70 "call_callback_with_pyobject_ptr_return",
71 [](
const std::function<PyObject *(
int)> &cb,
int value) {
return cb(
value); },
72 py::return_value_policy::take_ownership);
74 "call_callback_with_pyobject_ptr_arg",
75 [](
const std::function<
int(PyObject *)> &cb, py::handle obj) {
return cb(obj.ptr()); },
79 m.def(
"cast_to_pyobject_ptr_nullptr", [](
bool set_error) {
81 PyErr_SetString(PyExc_RuntimeError,
"Reflective of healthy error handling.");
83 PyObject *ptr =
nullptr;
87 m.def(
"cast_to_pyobject_ptr_non_nullptr_with_error_set", []() {
88 PyErr_SetString(PyExc_RuntimeError,
"Reflective of unhealthy error handling.");
92 m.def(
"pass_list_pyobject_ptr", [](
const std::vector<PyObject *> &vec_obj) {
94 for (
const auto &ptr : vec_obj) {
95 acc = acc * 1000 + py::reinterpret_borrow<py::object>(ptr).attr(
"value").cast<
int>();
100 m.def(
"return_list_pyobject_ptr_take_ownership",
101 make_vector_pyobject_ptr,
103 py::return_value_policy::take_ownership);
105 m.def(
"return_list_pyobject_ptr_reference",
106 make_vector_pyobject_ptr,
108 py::return_value_policy::reference);
110 m.def(
"dec_ref_each_pyobject_ptr", [](
const std::vector<PyObject *> &vec_obj) {
112 for (;
i < vec_obj.size();
i++) {
113 py::handle
h(vec_obj[
i]);
122 m.def(
"pass_pyobject_ptr_and_int", [](PyObject *,
int) {});
124 #ifdef PYBIND11_NO_COMPILE_SECTION // Change to ifndef for manual testing.
126 PyObject *ptr =
nullptr;