Skip to content

Commit 34d0ac8

Browse files
Issue python#29058: All stable API extensions added after Python 3.2 are now
available only when Py_LIMITED_API is set to the PY_VERSION_HEX value of the minimum Python version supporting this API.
1 parent 5d1111e commit 34d0ac8

19 files changed

+92
-7
lines changed

Include/abstract.h

+4
Original file line numberDiff line numberDiff line change
@@ -750,11 +750,13 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
750750
o1*o2.
751751
*/
752752

753+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
753754
PyAPI_FUNC(PyObject *) PyNumber_MatrixMultiply(PyObject *o1, PyObject *o2);
754755

755756
/*
756757
This is the equivalent of the Python expression: o1 @ o2.
757758
*/
759+
#endif
758760

759761
PyAPI_FUNC(PyObject *) PyNumber_FloorDivide(PyObject *o1, PyObject *o2);
760762

@@ -930,11 +932,13 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
930932
o1 *= o2.
931933
*/
932934

935+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
933936
PyAPI_FUNC(PyObject *) PyNumber_InPlaceMatrixMultiply(PyObject *o1, PyObject *o2);
934937

935938
/*
936939
This is the equivalent of the Python expression: o1 @= o2.
937940
*/
941+
#endif
938942

939943
PyAPI_FUNC(PyObject *) PyNumber_InPlaceFloorDivide(PyObject *o1,
940944
PyObject *o2);

Include/bytesobject.h

+2
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,13 @@ PyAPI_FUNC(PyObject*) _PyBytes_FromHex(
7474
PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t,
7575
const char *, Py_ssize_t,
7676
const char *);
77+
#ifndef Py_LIMITED_API
7778
/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */
7879
PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t,
7980
const char *, Py_ssize_t,
8081
const char *,
8182
const char **);
83+
#endif
8284

8385
/* Macro, trading safety for speed */
8486
#ifndef Py_LIMITED_API

Include/codecs.h

+4
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,14 @@ PyAPI_FUNC(PyObject *) PyCodec_XMLCharRefReplaceErrors(PyObject *exc);
225225
/* replace the unicode encode error with backslash escapes (\x, \u and \U) */
226226
PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc);
227227

228+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
228229
/* replace the unicode encode error with backslash escapes (\N, \x, \u and \U) */
229230
PyAPI_FUNC(PyObject *) PyCodec_NameReplaceErrors(PyObject *exc);
231+
#endif
230232

233+
#ifndef Py_LIMITED_API
231234
PyAPI_DATA(const char *) Py_hexdigits;
235+
#endif
232236

233237
#ifdef __cplusplus
234238
}

Include/fileobject.h

+2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *);
2323
If non-NULL, this is different than the default encoding for strings
2424
*/
2525
PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding;
26+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
2627
PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors;
28+
#endif
2729
PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding;
2830

2931
/* Internal API

Include/fileutils.h

+2
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
extern "C" {
66
#endif
77

8+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
89
PyAPI_FUNC(wchar_t *) Py_DecodeLocale(
910
const char *arg,
1011
size_t *size);
1112

1213
PyAPI_FUNC(char*) Py_EncodeLocale(
1314
const wchar_t *text,
1415
size_t *error_pos);
16+
#endif
1517

1618
#ifndef Py_LIMITED_API
1719

Include/import.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ extern "C" {
99

1010
#ifndef Py_LIMITED_API
1111
PyAPI_FUNC(void) _PyImportZip_Init(void);
12-
#endif /* !Py_LIMITED_API */
1312

1413
PyMODINIT_FUNC PyInit_imp(void);
14+
#endif /* !Py_LIMITED_API */
1515
PyAPI_FUNC(long) PyImport_GetMagicNumber(void);
1616
PyAPI_FUNC(const char *) PyImport_GetMagicTag(void);
1717
PyAPI_FUNC(PyObject *) PyImport_ExecCodeModule(
@@ -29,16 +29,20 @@ PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleWithPathnames(
2929
const char *pathname, /* decoded from the filesystem encoding */
3030
const char *cpathname /* decoded from the filesystem encoding */
3131
);
32+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
3233
PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleObject(
3334
PyObject *name,
3435
PyObject *co,
3536
PyObject *pathname,
3637
PyObject *cpathname
3738
);
39+
#endif
3840
PyAPI_FUNC(PyObject *) PyImport_GetModuleDict(void);
41+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
3942
PyAPI_FUNC(PyObject *) PyImport_AddModuleObject(
4043
PyObject *name
4144
);
45+
#endif
4246
PyAPI_FUNC(PyObject *) PyImport_AddModule(
4347
const char *name /* UTF-8 encoded string */
4448
);
@@ -55,13 +59,15 @@ PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel(
5559
PyObject *fromlist,
5660
int level
5761
);
62+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
5863
PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevelObject(
5964
PyObject *name,
6065
PyObject *globals,
6166
PyObject *locals,
6267
PyObject *fromlist,
6368
int level
6469
);
70+
#endif
6571

6672
#define PyImport_ImportModuleEx(n, g, l, f) \
6773
PyImport_ImportModuleLevel(n, g, l, f, 0)
@@ -70,9 +76,11 @@ PyAPI_FUNC(PyObject *) PyImport_GetImporter(PyObject *path);
7076
PyAPI_FUNC(PyObject *) PyImport_Import(PyObject *name);
7177
PyAPI_FUNC(PyObject *) PyImport_ReloadModule(PyObject *m);
7278
PyAPI_FUNC(void) PyImport_Cleanup(void);
79+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
7380
PyAPI_FUNC(int) PyImport_ImportFrozenModuleObject(
7481
PyObject *name
7582
);
83+
#endif
7684
PyAPI_FUNC(int) PyImport_ImportFrozenModule(
7785
const char *name /* UTF-8 encoded string */
7886
);

Include/memoryobject.h

+2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ PyAPI_DATA(PyTypeObject) PyMemoryView_Type;
2121
#endif
2222

2323
PyAPI_FUNC(PyObject *) PyMemoryView_FromObject(PyObject *base);
24+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
2425
PyAPI_FUNC(PyObject *) PyMemoryView_FromMemory(char *mem, Py_ssize_t size,
2526
int flags);
27+
#endif
2628
#ifndef Py_LIMITED_API
2729
PyAPI_FUNC(PyObject *) PyMemoryView_FromBuffer(Py_buffer *info);
2830
#endif

Include/moduleobject.h

+4
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,18 @@ PyAPI_DATA(PyTypeObject) PyModule_Type;
1212
#define PyModule_Check(op) PyObject_TypeCheck(op, &PyModule_Type)
1313
#define PyModule_CheckExact(op) (Py_TYPE(op) == &PyModule_Type)
1414

15+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
1516
PyAPI_FUNC(PyObject *) PyModule_NewObject(
1617
PyObject *name
1718
);
19+
#endif
1820
PyAPI_FUNC(PyObject *) PyModule_New(
1921
const char *name /* UTF-8 encoded string */
2022
);
2123
PyAPI_FUNC(PyObject *) PyModule_GetDict(PyObject *);
24+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
2225
PyAPI_FUNC(PyObject *) PyModule_GetNameObject(PyObject *);
26+
#endif
2327
PyAPI_FUNC(const char *) PyModule_GetName(PyObject *);
2428
PyAPI_FUNC(const char *) PyModule_GetFilename(PyObject *);
2529
PyAPI_FUNC(PyObject *) PyModule_GetFilenameObject(PyObject *);

Include/object.h

+2
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,9 @@ PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *);
547547
PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *);
548548
PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *,
549549
PyObject *, PyObject *);
550+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
550551
PyAPI_FUNC(int) PyObject_GenericSetDict(PyObject *, PyObject *, void *);
552+
#endif
551553
PyAPI_FUNC(Py_hash_t) PyObject_Hash(PyObject *);
552554
PyAPI_FUNC(Py_hash_t) PyObject_HashNotImplemented(PyObject *);
553555
PyAPI_FUNC(int) PyObject_IsTrue(PyObject *);

Include/objimpl.h

+2
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ PyObject_{New, NewVar, Del}.
9595
the raw memory.
9696
*/
9797
PyAPI_FUNC(void *) PyObject_Malloc(size_t size);
98+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
9899
PyAPI_FUNC(void *) PyObject_Calloc(size_t nelem, size_t elsize);
100+
#endif
99101
PyAPI_FUNC(void *) PyObject_Realloc(void *ptr, size_t new_size);
100102
PyAPI_FUNC(void) PyObject_Free(void *ptr);
101103

Include/odictobject.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@ PyAPI_DATA(PyTypeObject) PyODictKeys_Type;
1717
PyAPI_DATA(PyTypeObject) PyODictItems_Type;
1818
PyAPI_DATA(PyTypeObject) PyODictValues_Type;
1919

20-
#endif /* Py_LIMITED_API */
21-
2220
#define PyODict_Check(op) PyObject_TypeCheck(op, &PyODict_Type)
2321
#define PyODict_CheckExact(op) (Py_TYPE(op) == &PyODict_Type)
2422
#define PyODict_SIZE(op) ((PyDictObject *)op)->ma_used
25-
#define PyODict_HasKey(od, key) (PyMapping_HasKey(PyObject *)od, key)
23+
24+
#endif /* Py_LIMITED_API */
25+
26+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
2627

2728
PyAPI_FUNC(PyObject *) PyODict_New(void);
2829
PyAPI_FUNC(int) PyODict_SetItem(PyObject *od, PyObject *key, PyObject *item);
@@ -37,6 +38,8 @@ PyAPI_FUNC(int) PyODict_DelItem(PyObject *od, PyObject *key);
3738
#define PyODict_GetItemString(od, key) \
3839
PyDict_GetItemString((PyObject *)od, key)
3940

41+
#endif
42+
4043
#ifdef __cplusplus
4144
}
4245
#endif

Include/osmodule.h

+2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
extern "C" {
88
#endif
99

10+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
1011
PyAPI_FUNC(PyObject *) PyOS_FSPath(PyObject *path);
12+
#endif
1113

1214
#ifdef __cplusplus
1315
}

Include/pyerrors.h

+18-3
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,10 @@ PyAPI_FUNC(PyObject *) PyErr_Occurred(void);
8787
PyAPI_FUNC(void) PyErr_Clear(void);
8888
PyAPI_FUNC(void) PyErr_Fetch(PyObject **, PyObject **, PyObject **);
8989
PyAPI_FUNC(void) PyErr_Restore(PyObject *, PyObject *, PyObject *);
90+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
9091
PyAPI_FUNC(void) PyErr_GetExcInfo(PyObject **, PyObject **, PyObject **);
9192
PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *);
93+
#endif
9294

9395
#if defined(__clang__) || \
9496
(defined(__GNUC_MAJOR__) && \
@@ -147,7 +149,9 @@ PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *);
147149

148150
PyAPI_DATA(PyObject *) PyExc_BaseException;
149151
PyAPI_DATA(PyObject *) PyExc_Exception;
152+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
150153
PyAPI_DATA(PyObject *) PyExc_StopAsyncIteration;
154+
#endif
151155
PyAPI_DATA(PyObject *) PyExc_StopIteration;
152156
PyAPI_DATA(PyObject *) PyExc_GeneratorExit;
153157
PyAPI_DATA(PyObject *) PyExc_ArithmeticError;
@@ -160,15 +164,19 @@ PyAPI_DATA(PyObject *) PyExc_EOFError;
160164
PyAPI_DATA(PyObject *) PyExc_FloatingPointError;
161165
PyAPI_DATA(PyObject *) PyExc_OSError;
162166
PyAPI_DATA(PyObject *) PyExc_ImportError;
167+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
163168
PyAPI_DATA(PyObject *) PyExc_ModuleNotFoundError;
169+
#endif
164170
PyAPI_DATA(PyObject *) PyExc_IndexError;
165171
PyAPI_DATA(PyObject *) PyExc_KeyError;
166172
PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt;
167173
PyAPI_DATA(PyObject *) PyExc_MemoryError;
168174
PyAPI_DATA(PyObject *) PyExc_NameError;
169175
PyAPI_DATA(PyObject *) PyExc_OverflowError;
170176
PyAPI_DATA(PyObject *) PyExc_RuntimeError;
177+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
171178
PyAPI_DATA(PyObject *) PyExc_RecursionError;
179+
#endif
172180
PyAPI_DATA(PyObject *) PyExc_NotImplementedError;
173181
PyAPI_DATA(PyObject *) PyExc_SyntaxError;
174182
PyAPI_DATA(PyObject *) PyExc_IndentationError;
@@ -185,6 +193,7 @@ PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError;
185193
PyAPI_DATA(PyObject *) PyExc_ValueError;
186194
PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError;
187195

196+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
188197
PyAPI_DATA(PyObject *) PyExc_BlockingIOError;
189198
PyAPI_DATA(PyObject *) PyExc_BrokenPipeError;
190199
PyAPI_DATA(PyObject *) PyExc_ChildProcessError;
@@ -200,6 +209,7 @@ PyAPI_DATA(PyObject *) PyExc_NotADirectoryError;
200209
PyAPI_DATA(PyObject *) PyExc_PermissionError;
201210
PyAPI_DATA(PyObject *) PyExc_ProcessLookupError;
202211
PyAPI_DATA(PyObject *) PyExc_TimeoutError;
212+
#endif
203213

204214

205215
/* Compatibility aliases */
@@ -232,8 +242,10 @@ PyAPI_FUNC(PyObject *) PyErr_NoMemory(void);
232242
PyAPI_FUNC(PyObject *) PyErr_SetFromErrno(PyObject *);
233243
PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObject(
234244
PyObject *, PyObject *);
245+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000
235246
PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObjects(
236247
PyObject *, PyObject *, PyObject *);
248+
#endif
237249
PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilename(
238250
PyObject *exc,
239251
const char *filename /* decoded from the filesystem encoding */
@@ -279,8 +291,10 @@ PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithUnicodeFilename(
279291
PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErr(int);
280292
PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObject(
281293
PyObject *,int, PyObject *);
294+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000
282295
PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObjects(
283296
PyObject *,int, PyObject *, PyObject *);
297+
#endif
284298
PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilename(
285299
PyObject *exc,
286300
int ierr,
@@ -293,13 +307,14 @@ PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithUnicodeFilename(
293307
PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int);
294308
#endif /* MS_WINDOWS */
295309

296-
PyAPI_FUNC(PyObject *) PyErr_SetExcWithArgsKwargs(PyObject *, PyObject *,
297-
PyObject *);
298-
310+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
299311
PyAPI_FUNC(PyObject *) PyErr_SetImportErrorSubclass(PyObject *, PyObject *,
300312
PyObject *, PyObject *);
313+
#endif
314+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
301315
PyAPI_FUNC(PyObject *) PyErr_SetImportError(PyObject *, PyObject *,
302316
PyObject *);
317+
#endif
303318

304319
/* Export the old function so that the existing API remains available: */
305320
PyAPI_FUNC(void) PyErr_BadInternalCall(void);

Include/pymem.h

+2
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@ PyAPI_FUNC(PyObject*) _PyTraceMalloc_GetTraceback(
101101
*/
102102

103103
PyAPI_FUNC(void *) PyMem_Malloc(size_t size);
104+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
104105
PyAPI_FUNC(void *) PyMem_Calloc(size_t nelem, size_t elsize);
106+
#endif
105107
PyAPI_FUNC(void *) PyMem_Realloc(void *ptr, size_t new_size);
106108
PyAPI_FUNC(void) PyMem_Free(void *ptr);
107109

Include/pythonrun.h

+2
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,11 @@ PyAPI_FUNC(struct _mod *) PyParser_ASTFromFileObject(
9191
#endif
9292
PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlags(const char *, int,
9393
int);
94+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
9495
PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlagsFilename(const char *,
9596
const char *,
9697
int, int);
98+
#endif
9799
PyAPI_FUNC(struct _node *) PyParser_SimpleParseFileFlags(FILE *, const char *,
98100
int, int);
99101

Include/pythread.h

+2
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ PyAPI_FUNC(void) PyThread_release_lock(PyThread_type_lock);
6969
PyAPI_FUNC(size_t) PyThread_get_stacksize(void);
7070
PyAPI_FUNC(int) PyThread_set_stacksize(size_t);
7171

72+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
7273
PyAPI_FUNC(PyObject*) PyThread_GetInfo(void);
74+
#endif
7375

7476
/* Thread Local Storage (TLS) API */
7577
PyAPI_FUNC(int) PyThread_create_key(void);

0 commit comments

Comments
 (0)