Skip to content

Commit

Permalink
[tmp] test in CI
Browse files Browse the repository at this point in the history
  • Loading branch information
svenevs committed Nov 7, 2022
1 parent 7637d47 commit e7e1edf
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
60 changes: 60 additions & 0 deletions tools/workspace/pybind11/patches/python-3.11.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
--- include/pybind11/detail/type_caster_base.h
+++ include/pybind11/detail/type_caster_base.h
@@ -524,9 +524,10 @@ PYBIND11_NOINLINE std::string error_string() {
trace = trace->tb_next;

PyFrameObject *frame = trace->tb_frame;
+ Py_XINCREF(frame);
errorString += "\n\nAt:\n";
while (frame) {
-#if PY_VERSION_HEX >= 0x03090000
+#if PY_VERSION_HEX >= 0x030900B1
PyCodeObject *f_code = PyFrame_GetCode(frame);
#else
PyCodeObject *f_code = frame->f_code;
@@ -537,8 +538,15 @@ PYBIND11_NOINLINE std::string error_string() {
" " + handle(f_code->co_filename).cast<std::string>() +
"(" + std::to_string(lineno) + "): " +
handle(f_code->co_name).cast<std::string>() + "\n";
- frame = frame->f_back;
Py_DECREF(f_code);
+#if PY_VERSION_HEX >= 0x030900B1
+ auto *b_frame = PyFrame_GetBack(frame);
+#else
+ auto *b_frame = frame->f_back;
+ Py_XINCREF(b_frame);
+#endif
+ Py_DECREF(frame);
+ frame = b_frame;
}
}
#endif
--- include/pybind11/pybind11.h
+++ include/pybind11/pybind11.h
@@ -2776,9 +2776,7 @@ inline function get_type_override(const void *this_ptr, const type_info *this_ty

/* Don't call dispatch code if invoked from overridden function.
Unfortunately this doesn't work on PyPy. */
-#if !defined(PYPY_VERSION) && PY_VERSION_HEX < 0x030B0000
- // TODO: Remove PyPy workaround for Python 3.11.
- // Current API fails on 3.11 since co_varnames can be null.
+#if !defined(PYPY_VERSION)
#if PY_VERSION_HEX >= 0x03090000
PyFrameObject *frame = PyThreadState_GetFrame(PyThreadState_Get());
if (frame != nullptr) {
@@ -2786,10 +2784,11 @@ inline function get_type_override(const void *this_ptr, const type_info *this_ty
// f_code is guaranteed to not be NULL
if ((std::string) str(f_code->co_name) == name && f_code->co_argcount > 0) {
PyObject* locals = PyEval_GetLocals();
- if (locals != nullptr && f_code->co_varnames != nullptr) {
- PyObject *self_caller = dict_getitem(
- locals, PyTuple_GET_ITEM(f_code->co_varnames, 0)
- );
+ if (locals != nullptr) {
+ PyObject *co_varnames = PyObject_GetAttrString((PyObject *) f_code, "co_varnames");
+ PyObject *self_arg = PyTuple_GET_ITEM(co_varnames, 0);
+ Py_DECREF(co_varnames);
+ PyObject *self_caller = dict_getitem(locals, self_arg);
if (self_caller == self.ptr()) {
Py_DECREF(f_code);
Py_DECREF(frame);
3 changes: 3 additions & 0 deletions tools/workspace/pybind11/repository.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ def pybind11_repository(
sha256 = _SHA256,
build_file = ":package.BUILD.bazel",
mirrors = mirrors,
patches = [
":patches/python-3.11.patch",
],
)

def generate_pybind11_version_py_file(name):
Expand Down

0 comments on commit e7e1edf

Please sign in to comment.