mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 10:26:02 +00:00 
			
		
		
		
	 12af8ec864
			
		
	
	
		12af8ec864
		
			
		
	
	
	
	
		
			
			Fix warnings when using -Wimplicit-fallthrough compiler flag. Annotate explicitly "fall through" switch cases with a new _Py_FALLTHROUGH macro which uses __attribute__((fallthrough)) if available. Replace "fall through" comments with _Py_FALLTHROUGH. Add _Py__has_attribute() macro. No longer define __has_attribute() macro if it's not defined. Move also _Py__has_builtin() at the top of pyport.h. Co-Authored-By: Nikita Sobolev <mail@sobolevn.me>
		
			
				
	
	
		
			105 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef Py_EXPORTS_H
 | |
| #define Py_EXPORTS_H
 | |
| 
 | |
| /* Declarations for symbol visibility.
 | |
| 
 | |
|   PyAPI_FUNC(type): Declares a public Python API function and return type
 | |
|   PyAPI_DATA(type): Declares public Python data and its type
 | |
|   PyMODINIT_FUNC:   A Python module init function.  If these functions are
 | |
|                     inside the Python core, they are private to the core.
 | |
|                     If in an extension module, it may be declared with
 | |
|                     external linkage depending on the platform.
 | |
| 
 | |
|   As a number of platforms support/require "__declspec(dllimport/dllexport)",
 | |
|   we support a HAVE_DECLSPEC_DLL macro to save duplication.
 | |
| */
 | |
| 
 | |
| /*
 | |
|   All windows ports, except cygwin, are handled in PC/pyconfig.h.
 | |
| 
 | |
|   Cygwin is the only other autoconf platform requiring special
 | |
|   linkage handling and it uses __declspec().
 | |
| */
 | |
| #if defined(__CYGWIN__)
 | |
| #       define HAVE_DECLSPEC_DLL
 | |
| #endif
 | |
| 
 | |
| #if defined(_WIN32) || defined(__CYGWIN__)
 | |
|     #if defined(Py_ENABLE_SHARED)
 | |
|         #define Py_IMPORTED_SYMBOL __declspec(dllimport)
 | |
|         #define Py_EXPORTED_SYMBOL __declspec(dllexport)
 | |
|         #define Py_LOCAL_SYMBOL
 | |
|     #else
 | |
|         #define Py_IMPORTED_SYMBOL
 | |
|         #define Py_EXPORTED_SYMBOL
 | |
|         #define Py_LOCAL_SYMBOL
 | |
|     #endif
 | |
| #else
 | |
| /*
 | |
|  * If we only ever used gcc >= 5, we could use __has_attribute(visibility)
 | |
|  * as a cross-platform way to determine if visibility is supported. However,
 | |
|  * we may still need to support gcc >= 4, as some Ubuntu LTS and Centos versions
 | |
|  * have 4 < gcc < 5.
 | |
|  */
 | |
|     #if (defined(__GNUC__) && (__GNUC__ >= 4)) ||\
 | |
|         (defined(__clang__) && _Py__has_attribute(visibility))
 | |
|         #define Py_IMPORTED_SYMBOL __attribute__ ((visibility ("default")))
 | |
|         #define Py_EXPORTED_SYMBOL __attribute__ ((visibility ("default")))
 | |
|         #define Py_LOCAL_SYMBOL  __attribute__ ((visibility ("hidden")))
 | |
|     #else
 | |
|         #define Py_IMPORTED_SYMBOL
 | |
|         #define Py_EXPORTED_SYMBOL
 | |
|         #define Py_LOCAL_SYMBOL
 | |
|     #endif
 | |
| #endif
 | |
| 
 | |
| /* only get special linkage if built as shared or platform is Cygwin */
 | |
| #if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__)
 | |
| #       if defined(HAVE_DECLSPEC_DLL)
 | |
| #               if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
 | |
| #                       define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE
 | |
| #                       define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE
 | |
|         /* module init functions inside the core need no external linkage */
 | |
|         /* except for Cygwin to handle embedding */
 | |
| #                       if defined(__CYGWIN__)
 | |
| #                               define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject*
 | |
| #                       else /* __CYGWIN__ */
 | |
| #                               define PyMODINIT_FUNC PyObject*
 | |
| #                       endif /* __CYGWIN__ */
 | |
| #               else /* Py_BUILD_CORE */
 | |
|         /* Building an extension module, or an embedded situation */
 | |
|         /* public Python functions and data are imported */
 | |
|         /* Under Cygwin, auto-import functions to prevent compilation */
 | |
|         /* failures similar to those described at the bottom of 4.1: */
 | |
|         /* http://docs.python.org/extending/windows.html#a-cookbook-approach */
 | |
| #                       if !defined(__CYGWIN__)
 | |
| #                               define PyAPI_FUNC(RTYPE) Py_IMPORTED_SYMBOL RTYPE
 | |
| #                       endif /* !__CYGWIN__ */
 | |
| #                       define PyAPI_DATA(RTYPE) extern Py_IMPORTED_SYMBOL RTYPE
 | |
|         /* module init functions outside the core must be exported */
 | |
| #                       if defined(__cplusplus)
 | |
| #                               define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject*
 | |
| #                       else /* __cplusplus */
 | |
| #                               define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject*
 | |
| #                       endif /* __cplusplus */
 | |
| #               endif /* Py_BUILD_CORE */
 | |
| #       endif /* HAVE_DECLSPEC_DLL */
 | |
| #endif /* Py_ENABLE_SHARED */
 | |
| 
 | |
| /* If no external linkage macros defined by now, create defaults */
 | |
| #ifndef PyAPI_FUNC
 | |
| #       define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE
 | |
| #endif
 | |
| #ifndef PyAPI_DATA
 | |
| #       define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE
 | |
| #endif
 | |
| #ifndef PyMODINIT_FUNC
 | |
| #       if defined(__cplusplus)
 | |
| #               define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject*
 | |
| #       else /* __cplusplus */
 | |
| #               define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject*
 | |
| #       endif /* __cplusplus */
 | |
| #endif
 | |
| 
 | |
| 
 | |
| #endif /* Py_EXPORTS_H */
 |