diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-10-25 15:28:11 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-25 15:28:11 (GMT) |
commit | 18618e652c56e61a134e596b315a13c7cb997a89 (patch) | |
tree | 007e352f7e49a7b78469a1bff62a8a01d1bb2f8d /Include/pyport.h | |
parent | d03b7757811ae51277f8ed399a9a0fd78dfd3425 (diff) | |
download | cpython-18618e652c56e61a134e596b315a13c7cb997a89.zip cpython-18618e652c56e61a134e596b315a13c7cb997a89.tar.gz cpython-18618e652c56e61a134e596b315a13c7cb997a89.tar.bz2 |
bpo-35059: Add Py_STATIC_INLINE() macro (GH-10093)
* Add Py_STATIC_INLINE() macro to declare a "static inline" function.
If the compiler supports it, try to always inline the function even if no
optimization level was specified.
* Modify pydtrace.h to use Py_STATIC_INLINE() when WITH_DTRACE is
not defined.
* Add an unit test on Py_DECREF() to make sure that
_Py_NegativeRefcount() reports the correct filename.
Diffstat (limited to 'Include/pyport.h')
-rw-r--r-- | Include/pyport.h | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/Include/pyport.h b/Include/pyport.h index f4b547a..2f87f53 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -164,20 +164,37 @@ typedef int Py_ssize_clean_t; */ #if defined(_MSC_VER) -#if defined(PY_LOCAL_AGGRESSIVE) -/* enable more aggressive optimization for visual studio */ -#pragma optimize("agtw", on) -#endif -/* ignore warnings if the compiler decides not to inline a function */ -#pragma warning(disable: 4710) -/* fastest possible local call under MSVC */ -#define Py_LOCAL(type) static type __fastcall -#define Py_LOCAL_INLINE(type) static __inline type __fastcall +# if defined(PY_LOCAL_AGGRESSIVE) + /* enable more aggressive optimization for visual studio */ +# pragma optimize("agtw", on) +#endif + /* ignore warnings if the compiler decides not to inline a function */ +# pragma warning(disable: 4710) + /* fastest possible local call under MSVC */ +# define Py_LOCAL(type) static type __fastcall +# define Py_LOCAL_INLINE(type) static __inline type __fastcall #else -#define Py_LOCAL(type) static type -#define Py_LOCAL_INLINE(type) static inline type +# define Py_LOCAL(type) static type +# define Py_LOCAL_INLINE(type) static inline type #endif +/* Declare a "static inline" function. Typical usage: + + Py_STATIC_INLINE(int) add(int a, int b) { return a + b; } + + If the compiler supports it, try to always inline the function even if no + optimization level was specified. */ +#if defined(__GNUC__) || defined(__clang__) +# define Py_STATIC_INLINE(TYPE) \ + __attribute__((always_inline)) static inline TYPE +#elif defined(_MSC_VER) +# define Py_STATIC_INLINE(TYPE) \ + static __forceinline TYPE +#else +# define Py_STATIC_INLINE(TYPE) static inline TYPE +#endif + + /* Py_MEMCPY is kept for backwards compatibility, * see https://bugs.python.org/issue28126 */ #define Py_MEMCPY memcpy |