mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-22 05:05:11 +00:00
Allow function pointer extraction from overloaded functions (#2944)
* Add a failure test for overloaded functions * Allow function pointer extraction from overloaded functions
This commit is contained in:
parent
e0c1dadb75
commit
6709abba93
@ -46,12 +46,18 @@ public:
|
||||
auto c = reinterpret_borrow<capsule>(PyCFunction_GET_SELF(cfunc.ptr()));
|
||||
auto rec = (function_record *) c;
|
||||
|
||||
if (rec && rec->is_stateless &&
|
||||
same_type(typeid(function_type), *reinterpret_cast<const std::type_info *>(rec->data[1]))) {
|
||||
struct capture { function_type f; };
|
||||
while (rec != nullptr) {
|
||||
if (rec->is_stateless
|
||||
&& same_type(typeid(function_type),
|
||||
*reinterpret_cast<const std::type_info *>(rec->data[1]))) {
|
||||
struct capture {
|
||||
function_type f;
|
||||
};
|
||||
value = ((capture *) &rec->data)->f;
|
||||
return true;
|
||||
}
|
||||
rec = rec->next;
|
||||
}
|
||||
}
|
||||
|
||||
// ensure GIL is held during functor destruction
|
||||
|
@ -97,6 +97,8 @@ TEST_SUBMODULE(callbacks, m) {
|
||||
// test_cpp_function_roundtrip
|
||||
/* Test if passing a function pointer from C++ -> Python -> C++ yields the original pointer */
|
||||
m.def("dummy_function", &dummy_function);
|
||||
m.def("dummy_function_overloaded", [](int i, int j) { return i + j; });
|
||||
m.def("dummy_function_overloaded", &dummy_function);
|
||||
m.def("dummy_function2", [](int i, int j) { return i + j; });
|
||||
m.def("roundtrip", [](std::function<int(int)> f, bool expect_none = false) {
|
||||
if (expect_none && f)
|
||||
|
@ -93,6 +93,10 @@ def test_cpp_function_roundtrip():
|
||||
m.test_dummy_function(m.roundtrip(m.dummy_function))
|
||||
== "matches dummy_function: eval(1) = 2"
|
||||
)
|
||||
assert (
|
||||
m.test_dummy_function(m.dummy_function_overloaded)
|
||||
== "matches dummy_function: eval(1) = 2"
|
||||
)
|
||||
assert m.roundtrip(None, expect_none=True) is None
|
||||
assert (
|
||||
m.test_dummy_function(lambda x: x + 2)
|
||||
|
Loading…
Reference in New Issue
Block a user