Make C++ version of _Py_CAST work with 0/NULL
This commit is contained in:
		
							parent
							
								
									3a1b573f2d
								
							
						
					
					
						commit
						a5905dea5f
					
				| @ -0,0 +1,82 @@ | |||||||
|  | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Miss Islington (bot)" | ||||||
|  |  <31488909+miss-islington@users.noreply.github.com> | ||||||
|  | Date: Sat, 4 Jun 2022 22:15:59 -0700 | ||||||
|  | Subject: [PATCH] 00383: gh-93442: Make C++ version of _Py_CAST work with | ||||||
|  |  0/NULL | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  | 
 | ||||||
|  | Add C++ overloads for _Py_CAST_impl() to handle 0/NULL.  This will allow | ||||||
|  | C++ extensions that pass 0 or NULL to macros using _Py_CAST() to | ||||||
|  | continue to compile.  Without this, you get an error like: | ||||||
|  | 
 | ||||||
|  |     invalid ‘static_cast’ from type ‘int’ to type ‘_object*’ | ||||||
|  | 
 | ||||||
|  | The modern way to use a NULL value in C++ is to use nullptr.  However, | ||||||
|  | we want to not break extensions that do things the old way. | ||||||
|  | 
 | ||||||
|  | Co-authored-by: serge-sans-paille | ||||||
|  | (cherry picked from commit 8bcc3fa3453e28511d04eaa0aa7d8e1a3495d518) | ||||||
|  | 
 | ||||||
|  | Co-authored-by: Neil Schemenauer <nas-github@arctrix.com> | ||||||
|  | ---
 | ||||||
|  |  Include/pyport.h                                   | 14 ++++++++++++++ | ||||||
|  |  Lib/test/_testcppext.cpp                           |  4 ++++ | ||||||
|  |  .../2022-06-04-13-15-41.gh-issue-93442.4M4NDb.rst  |  3 +++ | ||||||
|  |  3 files changed, 21 insertions(+) | ||||||
|  |  create mode 100644 Misc/NEWS.d/next/C API/2022-06-04-13-15-41.gh-issue-93442.4M4NDb.rst | ||||||
|  | 
 | ||||||
|  | diff --git a/Include/pyport.h b/Include/pyport.h
 | ||||||
|  | index 5a9adf162b..a78e290931 100644
 | ||||||
|  | --- a/Include/pyport.h
 | ||||||
|  | +++ b/Include/pyport.h
 | ||||||
|  | @@ -24,9 +24,23 @@
 | ||||||
|  |  // | ||||||
|  |  // The type argument must not be a constant type. | ||||||
|  |  #ifdef __cplusplus | ||||||
|  | +#include <cstddef>
 | ||||||
|  |  #  define _Py_STATIC_CAST(type, expr) static_cast<type>(expr) | ||||||
|  |  extern "C++" { | ||||||
|  |      namespace { | ||||||
|  | +        template <typename type>
 | ||||||
|  | +        inline type _Py_CAST_impl(long int ptr) {
 | ||||||
|  | +            return reinterpret_cast<type>(ptr);
 | ||||||
|  | +        }
 | ||||||
|  | +        template <typename type>
 | ||||||
|  | +        inline type _Py_CAST_impl(int ptr) {
 | ||||||
|  | +            return reinterpret_cast<type>(ptr);
 | ||||||
|  | +        }
 | ||||||
|  | +        template <typename type>
 | ||||||
|  | +        inline type _Py_CAST_impl(std::nullptr_t) {
 | ||||||
|  | +            return static_cast<type>(nullptr);
 | ||||||
|  | +        }
 | ||||||
|  | +
 | ||||||
|  |          template <typename type, typename expr_type> | ||||||
|  |              inline type _Py_CAST_impl(expr_type *expr) { | ||||||
|  |                  return reinterpret_cast<type>(expr); | ||||||
|  | diff --git a/Lib/test/_testcppext.cpp b/Lib/test/_testcppext.cpp
 | ||||||
|  | index eade7ccdaa..70f434e678 100644
 | ||||||
|  | --- a/Lib/test/_testcppext.cpp
 | ||||||
|  | +++ b/Lib/test/_testcppext.cpp
 | ||||||
|  | @@ -74,6 +74,10 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
 | ||||||
|  |      Py_INCREF(strong_ref); | ||||||
|  |      Py_DECREF(strong_ref); | ||||||
|  |   | ||||||
|  | +    // gh-93442: Pass 0 as NULL for PyObject*
 | ||||||
|  | +    Py_XINCREF(0);
 | ||||||
|  | +    Py_XDECREF(0);
 | ||||||
|  | +
 | ||||||
|  |      Py_DECREF(obj); | ||||||
|  |      Py_RETURN_NONE; | ||||||
|  |  } | ||||||
|  | diff --git a/Misc/NEWS.d/next/C API/2022-06-04-13-15-41.gh-issue-93442.4M4NDb.rst b/Misc/NEWS.d/next/C API/2022-06-04-13-15-41.gh-issue-93442.4M4NDb.rst
 | ||||||
|  | new file mode 100644 | ||||||
|  | index 0000000000..f48ed37c81
 | ||||||
|  | --- /dev/null
 | ||||||
|  | +++ b/Misc/NEWS.d/next/C API/2022-06-04-13-15-41.gh-issue-93442.4M4NDb.rst	
 | ||||||
|  | @@ -0,0 +1,3 @@
 | ||||||
|  | +Add C++ overloads for _Py_CAST_impl() to handle 0/NULL.  This will allow C++
 | ||||||
|  | +extensions that pass 0 or NULL to macros using _Py_CAST() to continue to
 | ||||||
|  | +compile.
 | ||||||
| @ -17,7 +17,7 @@ URL: https://www.python.org/ | |||||||
| %global prerel b3 | %global prerel b3 | ||||||
| %global upstream_version %{general_version}%{?prerel} | %global upstream_version %{general_version}%{?prerel} | ||||||
| Version: %{general_version}%{?prerel:~%{prerel}} | Version: %{general_version}%{?prerel:~%{prerel}} | ||||||
| Release: 3%{?dist} | Release: 4%{?dist} | ||||||
| License: Python | License: Python | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -310,6 +310,19 @@ Patch251: 00251-change-user-install-location.patch | |||||||
| # Ideally, we should talk to upstream and explain why we don't want this | # Ideally, we should talk to upstream and explain why we don't want this | ||||||
| Patch328: 00328-pyc-timestamp-invalidation-mode.patch | Patch328: 00328-pyc-timestamp-invalidation-mode.patch | ||||||
| 
 | 
 | ||||||
|  | # 00383 # b4e1d3233b9fbcd9a60370d0f29e65012bb9532d | ||||||
|  | # gh-93442: Make C++ version of _Py_CAST work with 0/NULL | ||||||
|  | # | ||||||
|  | # Add C++ overloads for _Py_CAST_impl() to handle 0/NULL.  This will allow | ||||||
|  | # C++ extensions that pass 0 or NULL to macros using _Py_CAST() to | ||||||
|  | # continue to compile.  Without this, you get an error like: | ||||||
|  | # | ||||||
|  | #     invalid ‘static_cast’ from type ‘int’ to type ‘_object*’ | ||||||
|  | # | ||||||
|  | # The modern way to use a NULL value in C++ is to use nullptr.  However, | ||||||
|  | # we want to not break extensions that do things the old way. | ||||||
|  | Patch383: 00383-gh-93442-make-c-version-of-_py_cast-work-with-0-null.patch | ||||||
|  | 
 | ||||||
| # (New patches go here ^^^) | # (New patches go here ^^^) | ||||||
| # | # | ||||||
| # When adding new patches to "python" and "python3" in Fedora, EL, etc., | # When adding new patches to "python" and "python3" in Fedora, EL, etc., | ||||||
| @ -1582,6 +1595,9 @@ CheckPython optimized | |||||||
| # ====================================================== | # ====================================================== | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Tue Jun 21 2022 Miro Hrončok <mhroncok@redhat.com> - 3.11.0~b3-4 | ||||||
|  | - Make C++ version of _Py_CAST work with 0/NULL | ||||||
|  | 
 | ||||||
| * Mon Jun 13 2022 Tomáš Hrnčiar <thrnciar@redhat.com> - 3.11.0~b3-3 | * Mon Jun 13 2022 Tomáš Hrnčiar <thrnciar@redhat.com> - 3.11.0~b3-3 | ||||||
| - Finish bootstrapping for Python 3.11 mass rebuild | - Finish bootstrapping for Python 3.11 mass rebuild | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user