From b2b44a9af81b591b273fa98fa0780237c66a3a7d Mon Sep 17 00:00:00 2001 From: Wenzel Jakob Date: Fri, 15 Apr 2016 17:50:40 +0200 Subject: [PATCH] fix for virtual dispatch on newly created threads --- docs/changelog.rst | 4 +++- include/pybind11/pybind11.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 57c4dc0e5..92b23670b 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -10,7 +10,9 @@ Changelog * Added a convenience routine ``make_iterator()`` which turns a range indicated by a pair of C++ iterators into a iterable Python object * Added ``len()`` and a variadic ``make_tuple()`` function -* Addressed a rare issue that could confuse the current virtual function dispatcher +* Addressed a rare issue that could confuse the current virtual function + dispatcher and another that could lead to crashes in multi-threaded + applications * Added a ``get_include()`` function to the Python module that returns the path of the directory containing the installed pybind11 header files * Documentation improvements: import issues, symbol visibility, pickling, limitations diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h index 00c36dcf5..22044feeb 100644 --- a/include/pybind11/pybind11.h +++ b/include/pybind11/pybind11.h @@ -1070,7 +1070,7 @@ inline function get_overload(const void *this_ptr, const char *name) { /* Don't call dispatch code if invoked from overridden function */ PyFrameObject *frame = PyThreadState_Get()->frame; - if ((std::string) pybind11::handle(frame->f_code->co_name).str() == name && + if (frame && (std::string) pybind11::handle(frame->f_code->co_name).str() == name && frame->f_code->co_argcount > 0) { PyFrame_FastToLocals(frame); PyObject *self_caller = PyDict_GetItem(