Merge branch 'pybind:master' into master

This commit is contained in:
Steve R. Sun 2022-02-05 10:37:45 +08:00 committed by GitHub
commit cd2b9d4b09
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 103 additions and 44 deletions

View File

@ -600,11 +600,11 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
centos: centos:
- 7 # GCC 4.8 - centos7 # GCC 4.8
- 8 - stream8
name: "🐍 3 • CentOS ${{ matrix.centos }} • x64" name: "🐍 3 • CentOS ${{ matrix.centos }} • x64"
container: "centos:${{ matrix.centos }}" container: "quay.io/centos/centos:${{ matrix.centos }}"
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
@ -619,22 +619,11 @@ jobs:
run: | run: |
python3 -m pip install cmake -r tests/requirements.txt python3 -m pip install cmake -r tests/requirements.txt
- name: VAR_BUILD_TYPE 7
if: matrix.centos == 7
run: echo MinSizeRel > VAR_BUILD_TYPE
# Using Release to avoid segfault that appeared around 2021-06-04,
# apparently when the gcc version changed from 8.3 to 8.4.
- name: VAR_BUILD_TYPE 8
if: matrix.centos == 8
run: echo Release > VAR_BUILD_TYPE
# Temporally disabling EIGEN due to SSL issue in CentOS 7
- name: Configure - name: Configure
shell: bash shell: bash
run: > run: >
cmake -S . -B build cmake -S . -B build
-DCMAKE_BUILD_TYPE=$(cat VAR_BUILD_TYPE) -DCMAKE_BUILD_TYPE=MinSizeRel
-DPYBIND11_WERROR=ON -DPYBIND11_WERROR=ON
-DDOWNLOAD_CATCH=ON -DDOWNLOAD_CATCH=ON
-DDOWNLOAD_EIGEN=ON -DDOWNLOAD_EIGEN=ON

View File

@ -6,6 +6,65 @@ Changelog
Starting with version 1.8.0, pybind11 releases use a `semantic versioning Starting with version 1.8.0, pybind11 releases use a `semantic versioning
<http://semver.org>`_ policy. <http://semver.org>`_ policy.
IN DEVELOPMENT
--------------
Changes will be added here periodically.
Version 2.9.1 (Feb 2, 2022)
---------------------------
Changes:
* If possible, attach Python exception with ``py::raise_from`` to ``TypeError``
when casting from C++ to Python. This will give additional info if Python
exceptions occur in the caster. Adds a test case of trying to convert a set
from C++ to Python when the hash function is not defined in Python.
`#3605 <https://github.com/pybind/pybind11/pull/3605>`_
* Add a mapping of C++11 nested exceptions to their Python exception
equivalent using ``py::raise_from``. This attaches the nested exceptions in
Python using the ``__cause__`` field.
`#3608 <https://github.com/pybind/pybind11/pull/3608>`_
* Propagate Python exception traceback using ``raise_from`` if a pybind11
function runs out of overloads.
`#3671 <https://github.com/pybind/pybind11/pull/3671>`_
* ``py::multiple_inheritance`` is now only needed when C++ bases are hidden
from pybind11.
`#3650 <https://github.com/pybind/pybind11/pull/3650>`_ and
`#3659 <https://github.com/pybind/pybind11/pull/3659>`_
Bug fixes:
* Remove a boolean cast in ``numpy.h`` that causes MSVC C4800 warnings when
compiling against Python 3.10 or newer.
`#3669 <https://github.com/pybind/pybind11/pull/3669>`_
* Render ``py::bool_`` and ``py::float_`` as ``bool`` and ``float``
respectively.
`#3622 <https://github.com/pybind/pybind11/pull/3622>`_
Build system improvements:
* Fix CMake extension suffix computation on Python 3.10+.
`#3663 <https://github.com/pybind/pybind11/pull/3663>`_
* Allow ``CMAKE_ARGS`` to override CMake args in pybind11's own ``setup.py``.
`#3577 <https://github.com/pybind/pybind11/pull/3577>`_
* Remove a few deprecated c-headers.
`#3610 <https://github.com/pybind/pybind11/pull/3610>`_
* More uniform handling of test targets.
`#3590 <https://github.com/pybind/pybind11/pull/3590>`_
* Add clang-tidy readability check to catch potentially swapped function args.
`#3611 <https://github.com/pybind/pybind11/pull/3611>`_
Version 2.9.0 (Dec 28, 2021) Version 2.9.0 (Dec 28, 2021)
---------------------------- ----------------------------

View File

@ -10,12 +10,12 @@
#pragma once #pragma once
#define PYBIND11_VERSION_MAJOR 2 #define PYBIND11_VERSION_MAJOR 2
#define PYBIND11_VERSION_MINOR 9 #define PYBIND11_VERSION_MINOR 10
#define PYBIND11_VERSION_PATCH 0 #define PYBIND11_VERSION_PATCH 0.dev1
// Similar to Python's convention: https://docs.python.org/3/c-api/apiabiversion.html // Similar to Python's convention: https://docs.python.org/3/c-api/apiabiversion.html
// Additional convention: 0xD = dev // Additional convention: 0xD = dev
#define PYBIND11_VERSION_HEX 0x02090000 #define PYBIND11_VERSION_HEX 0x020A00D1
#define PYBIND11_NAMESPACE_BEGIN(name) namespace name { #define PYBIND11_NAMESPACE_BEGIN(name) namespace name {
#define PYBIND11_NAMESPACE_END(name) } #define PYBIND11_NAMESPACE_END(name) }

View File

@ -991,6 +991,7 @@ protected:
#if PY_VERSION_HEX >= 0x03030000 #if PY_VERSION_HEX >= 0x03030000
// Attach additional error info to the exception if supported // Attach additional error info to the exception if supported
if (PyErr_Occurred()) { if (PyErr_Occurred()) {
// #HelpAppreciated: unit test coverage for this branch.
raise_from(PyExc_TypeError, msg.c_str()); raise_from(PyExc_TypeError, msg.c_str());
return nullptr; return nullptr;
} }

View File

@ -8,5 +8,5 @@ def _to_int(s):
return s return s
__version__ = "2.9.0" __version__ = "2.10.0.dev1"
version_info = tuple(_to_int(s) for s in __version__.split(".")) version_info = tuple(_to_int(s) for s in __version__.split("."))

View File

@ -31,8 +31,15 @@ keywords =
C++11 C++11
Python bindings Python bindings
project_urls =
Documentation = https://pybind11.readthedocs.io/
Bug Tracker = https://github.com/pybind/pybind11/issues
Discussions = https://github.com/pybind/pybind11/discussions
Changelog = https://pybind11.readthedocs.io/en/latest/changelog.html
Chat = https://gitter.im/pybind/Lobby
[options] [options]
python_requires = >=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4 python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
zip_safe = False zip_safe = False
[bdist_wheel] [bdist_wheel]

View File

@ -45,8 +45,11 @@ def build_expected_version_hex(matches):
if serial is None: if serial is None:
msg = 'Invalid PYBIND11_VERSION_PATCH: "{}"'.format(patch_level_serial) msg = 'Invalid PYBIND11_VERSION_PATCH: "{}"'.format(patch_level_serial)
raise RuntimeError(msg) raise RuntimeError(msg)
return "0x{:02x}{:02x}{:02x}{}{:x}".format( return (
major, minor, patch, level[:1].upper(), serial "0x"
+ "{:02x}{:02x}{:02x}{}{:x}".format(
major, minor, patch, level[:1], serial
).upper()
) )

View File

@ -32,8 +32,8 @@ def dt_fmt():
e = "<" if byteorder == "little" else ">" e = "<" if byteorder == "little" else ">"
return ( return (
"{{'names':['bool_','uint_','float_','ldbl_']," "{{'names':['bool_','uint_','float_','ldbl_'],"
" 'formats':['?','" + e + "u4','" + e + "f4','" + e + "f{}']," "'formats':['?','" + e + "u4','" + e + "f4','" + e + "f{}'],"
" 'offsets':[0,4,8,{}], 'itemsize':{}}}" "'offsets':[0,4,8,{}],'itemsize':{}}}"
) )
@ -46,7 +46,7 @@ def simple_dtype_fmt():
def packed_dtype_fmt(): def packed_dtype_fmt():
from sys import byteorder from sys import byteorder
return "[('bool_', '?'), ('uint_', '{e}u4'), ('float_', '{e}f4'), ('ldbl_', '{e}f{}')]".format( return "[('bool_','?'),('uint_','{e}u4'),('float_','{e}f4'),('ldbl_','{e}f{}')]".format(
np.dtype("longdouble").itemsize, e="<" if byteorder == "little" else ">" np.dtype("longdouble").itemsize, e="<" if byteorder == "little" else ">"
) )
@ -77,7 +77,7 @@ def partial_nested_fmt():
partial_size = partial_ld_off + ld.itemsize partial_size = partial_ld_off + ld.itemsize
partial_end_padding = partial_size % np.dtype("uint64").alignment partial_end_padding = partial_size % np.dtype("uint64").alignment
partial_nested_size = partial_nested_off * 2 + partial_size + partial_end_padding partial_nested_size = partial_nested_off * 2 + partial_size + partial_end_padding
return "{{'names':['a'], 'formats':[{}], 'offsets':[{}], 'itemsize':{}}}".format( return "{{'names':['a'],'formats':[{}],'offsets':[{}],'itemsize':{}}}".format(
partial_dtype_fmt(), partial_nested_off, partial_nested_size partial_dtype_fmt(), partial_nested_off, partial_nested_size
) )
@ -123,25 +123,25 @@ def test_dtype(simple_dtype):
e = "<" if byteorder == "little" else ">" e = "<" if byteorder == "little" else ">"
assert m.print_dtypes() == [ assert [x.replace(" ", "") for x in m.print_dtypes()] == [
simple_dtype_fmt(), simple_dtype_fmt(),
packed_dtype_fmt(), packed_dtype_fmt(),
"[('a', {}), ('b', {})]".format(simple_dtype_fmt(), packed_dtype_fmt()), "[('a',{}),('b',{})]".format(simple_dtype_fmt(), packed_dtype_fmt()),
partial_dtype_fmt(), partial_dtype_fmt(),
partial_nested_fmt(), partial_nested_fmt(),
"[('a', 'S3'), ('b', 'S3')]", "[('a','S3'),('b','S3')]",
( (
"{{'names':['a','b','c','d'], " "{{'names':['a','b','c','d'],"
+ "'formats':[('S4', (3,)),('" + "'formats':[('S4',(3,)),('"
+ e + e
+ "i4', (2,)),('u1', (3,)),('" + "i4',(2,)),('u1',(3,)),('"
+ e + e
+ "f4', (4, 2))], " + "f4',(4,2))],"
+ "'offsets':[0,12,20,24], 'itemsize':56}}" + "'offsets':[0,12,20,24],'itemsize':56}}"
).format(e=e), ).format(e=e),
"[('e1', '" + e + "i8'), ('e2', 'u1')]", "[('e1','" + e + "i8'),('e2','u1')]",
"[('x', 'i1'), ('y', '" + e + "u8')]", "[('x','i1'),('y','" + e + "u8')]",
"[('cflt', '" + e + "c8'), ('cdbl', '" + e + "c16')]", "[('cflt','" + e + "c8'),('cdbl','" + e + "c16')]",
] ]
d1 = np.dtype( d1 = np.dtype(
@ -238,7 +238,7 @@ def test_recarray(simple_dtype, packed_dtype):
] ]
arr = m.create_rec_partial(3) arr = m.create_rec_partial(3)
assert str(arr.dtype) == partial_dtype_fmt() assert str(arr.dtype).replace(" ", "") == partial_dtype_fmt()
partial_dtype = arr.dtype partial_dtype = arr.dtype
assert "" not in arr.dtype.fields assert "" not in arr.dtype.fields
assert partial_dtype.itemsize > simple_dtype.itemsize assert partial_dtype.itemsize > simple_dtype.itemsize
@ -246,7 +246,7 @@ def test_recarray(simple_dtype, packed_dtype):
assert_equal(arr, elements, packed_dtype) assert_equal(arr, elements, packed_dtype)
arr = m.create_rec_partial_nested(3) arr = m.create_rec_partial_nested(3)
assert str(arr.dtype) == partial_nested_fmt() assert str(arr.dtype).replace(" ", "") == partial_nested_fmt()
assert "" not in arr.dtype.fields assert "" not in arr.dtype.fields
assert "" not in arr.dtype.fields["a"][0].fields assert "" not in arr.dtype.fields["a"][0].fields
assert arr.dtype.itemsize > partial_dtype.itemsize assert arr.dtype.itemsize > partial_dtype.itemsize
@ -285,12 +285,12 @@ def test_array_array():
e = "<" if byteorder == "little" else ">" e = "<" if byteorder == "little" else ">"
arr = m.create_array_array(3) arr = m.create_array_array(3)
assert str(arr.dtype) == ( assert str(arr.dtype).replace(" ", "") == (
"{{'names':['a','b','c','d'], " "{{'names':['a','b','c','d'],"
+ "'formats':[('S4', (3,)),('" + "'formats':[('S4',(3,)),('"
+ e + e
+ "i4', (2,)),('u1', (3,)),('{e}f4', (4, 2))], " + "i4',(2,)),('u1',(3,)),('{e}f4',(4,2))],"
+ "'offsets':[0,12,20,24], 'itemsize':56}}" + "'offsets':[0,12,20,24],'itemsize':56}}"
).format(e=e) ).format(e=e)
assert m.print_array_array(arr) == [ assert m.print_array_array(arr) == [
"a={{A,B,C,D},{K,L,M,N},{U,V,W,X}},b={0,1}," "a={{A,B,C,D},{K,L,M,N},{U,V,W,X}},b={0,1},"