8000 gh-79315: Add Include/cpython/modsupport.h header (#91797) · python/cpython@6f9addb · GitHub
[go: up one dir, main page]

Skip to content

Commit 6f9addb

Browse files
authored
gh-79315: Add Include/cpython/modsupport.h header (#91797)
1 parent c1474fa commit 6f9addb

File tree

5 files changed

+118
-106
lines changed

5 files changed

+118
-106
lines changed

Include/cpython/modsupport.h

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#ifndef Py_CPYTHON_MODSUPPORT_H
2+
# error "this header file must not be included directly"
3+
#endif
4+
5+
/* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier
6+
to mean Py_ssize_t */
7+
#ifdef PY_SSIZE_T_CLEAN
8+
#define _Py_VaBuildStack _Py_VaBuildStack_SizeT
9+
#else
10+
PyAPI_FUNC(PyObject *) _Py_VaBuildValue_SizeT(const char *, va_list);
11+
PyAPI_FUNC(PyObject **) _Py_VaBuildStack_SizeT(
12+
PyObject **small_stack,
13+
Py_ssize_t small_stack_len,
14+
const char *format,
15+
va_list va,
16+
Py_ssize_t *p_nargs);
17+
#endif
18+
19+
PyAPI_FUNC(int) _PyArg_UnpackStack(
20+
PyObject *const *args,
21+
Py_ssize_t nargs,
22+
const char *name,
23+
Py_ssize_t min,
24+
Py_ssize_t max,
25+
...);
26+
27+
PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kwargs);
28+
PyAPI_FUNC(int) _PyArg_NoKwnames(const char *funcname, PyObject *kwnames);
29+
PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args);
30+
#define _PyArg_NoKeywords(funcname, kwargs) \
31+
((kwargs) == NULL || _PyArg_NoKeywords((funcname), (kwargs)))
32+
#define _PyArg_NoKwnames(funcname, kwnames) \
33+
((kwnames) == NULL || _PyArg_NoKwnames((funcname), (kwnames)))
34+
#define _PyArg_NoPositional(funcname, args) \
35+
((args) == NULL || _PyArg_NoPositional((funcname), (args)))
36+
37+
PyAPI_FUNC(void) _PyArg_BadArgument(const char *, const char *, const char *, PyObject *);
38+
PyAPI_FUNC(int) _PyArg_CheckPositional(const char *, Py_ssize_t,
39+
Py_ssize_t, Py_ssize_t);
40+
#define _PyArg_CheckPositional(funcname, nargs, min, max) \
41+
((!ANY_VARARGS(max) && (min) <= (nargs) && (nargs) <= (max)) \
42+
|| _PyArg_CheckPositional((funcname), (nargs), (min), (max)))
43+
44+
PyAPI_FUNC(PyObject **) _Py_VaBuildStack(
45+
PyObject **small_stack,
46+
Py_ssize_t small_stack_len,
47+
const char *format,
48+
va_list va,
49+
Py_ssize_t *p_nargs);
50+
51+
typedef struct _PyArg_Parser {
52+
const char *format;
53+
const char * const *keywords;
54+
const char *fname;
55+
const char *custom_msg;
56+
int pos; /* number of positional-only arguments */
57+
int min; /* minimal number of arguments */
58+
int max; /* maximal number of positional arguments */
59+
PyObject *kwtuple; /* tuple of keyword parameter names */
60+
struct _PyArg_Parser *next;
61+
} _PyArg_Parser;
62+
63+
#ifdef PY_SSIZE_T_CLEAN
64+
#define _PyArg_ParseTupleAndKeywordsFast _PyArg_ParseTupleAndKeywordsFast_SizeT
65+
#define _PyArg_ParseStack _PyArg_ParseStack_SizeT
66+
#define _PyArg_ParseStackAndKeywords _PyArg_ParseStackAndKeywords_SizeT
67+
#define _PyArg_VaParseTupleAndKeywordsFast _PyArg_VaParseTupleAndKeywordsFast_SizeT
68+
#endif
69+
70+
PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast(PyObject *, PyObject *,
71+
struct _PyArg_Parser *, ...);
72+
PyAPI_FUNC(int) _PyArg_ParseStack(
73+
PyObject *const *args,
74+
Py_ssize_t nargs,
75+
const char *format,
76+
...);
77+
PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords(
78+
PyObject *const *args,
79+
Py_ssize_t nargs,
80+
PyObject *kwnames,
81+
struct _PyArg_Parser *,
82+
...);
83+
PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *,
84+
struct _PyArg_Parser *, va_list);
85+
PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywords(
86+
PyObject *const *args, Py_ssize_t nargs,
87+
PyObject *kwargs, PyObject *kwnames,
88+
struct _PyArg_Parser *parser,
89+
int minpos, int maxpos, int minkw,
90+
PyObject **buf);
91+
92+
PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywordsWithVararg(
93+
PyObject *const *args, Py_ssize_t nargs,
94+
PyObject *kwargs, PyObject *kwnames,
95+
struct _PyArg_Parser *parser,
96+
int minpos, int maxpos, int minkw,
97+
int vararg, PyObject **buf);
98+
99+
#define _PyArg_UnpackKeywords(args, nargs, kwargs, kwnames, parser, minpos, maxpos, minkw, buf) \
100+
(((minkw) == 0 && (kwargs) == NULL && (kwnames) == NULL && \
101+
(minpos) <= (nargs) && (nargs) <= (maxpos) && args != NULL) ? (args) : \
102+
_PyArg_UnpackKeywords((args), (nargs), (kwargs), (kwnames), (parser), \
103+
(minpos), (maxpos), (minkw), (buf)))
104+
105+
PyAPI_FUNC(PyObject *) _PyModule_CreateInitialized(PyModuleDef*, int apiver);
106+
107+
PyAPI_DATA(const char *) _Py_PackageContext;

Include/modsupport.h

Lines changed: 6 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,6 @@ extern "C" {
1919
#define PyArg_VaParseTupleAndKeywords _PyArg_VaParseTupleAndKeywords_SizeT
2020
#define Py_BuildValue _Py_BuildValue_SizeT
2121
#define Py_VaBuildValue _Py_VaBuildValue_SizeT
22-
#ifndef Py_LIMITED_API
23-
#define _Py_VaBuildStack _Py_VaBuildStack_SizeT
24-
#endif
25-
#else
26-
#ifndef Py_LIMITED_API
27-
PyAPI_FUNC(PyObject *) _Py_VaBuildValue_SizeT(const char *, va_list);
28-
PyAPI_FUNC(PyObject **) _Py_VaBuildStack_SizeT(
29-
PyObject **small_stack,
30-
Py_ssize_t small_stack_len,
31-
const char *format,
32-
va_list va,
33-
Py_ssize_t *p_nargs);
34-
#endif /* !Py_LIMITED_API */
3522
#endif
3623

3724
/* Due to a glitch in 3.2, the _SizeT versions weren't exported from the DLL. */
@@ -51,97 +38,8 @@ PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...);
5138

5239

5340
#define ANY_VARARGS(n) (n == PY_SSIZE_T_MAX)
54-
#ifndef Py_LIMITED_API
55-
PyAPI_FUNC(int) _PyArg_UnpackStack(
56-
PyObject *const *args,
57-
Py_ssize_t nargs,
58-
const char *name,
59-
Py_ssize_t min,
60-
Py_ssize_t max,
61-
...);
62-
63-
PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kwargs);
64-
PyAPI_FUNC(int) _PyArg_NoKwnames(const char *funcname, PyObject *kwnames);
65-
PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args);
66-
#define _PyArg_NoKeywords(funcname, kwargs) \
67-
((kwargs) == NULL || _PyArg_NoKeywords((funcname), (kwargs)))
68-
#define _PyArg_NoKwnames(funcname, kwnames) \
69-
((kwnames) == NULL || _PyArg_NoKwnames((funcname), (kwnames)))
70-
#define _PyArg_NoPositional(funcname, args) \
71-
((args) == NULL || _PyArg_NoPositional((funcname), (args)))
72-
73-
PyAPI_FUNC(void) _PyArg_BadArgument(const char *, const char *, const char *, PyObject *);
74-
PyAPI_FUNC(int) _PyArg_CheckPositional(const char *, Py_ssize_t,
75-
Py_ssize_t, Py_ssize_t);
76-
#define _PyArg_CheckPositional(funcname, nargs, min, max) \
77-
((!ANY_VARARGS(max) && (min) <= (nargs) && (nargs) <= (max)) \
78-
|| _PyArg_CheckPositional((funcname), (nargs), (min), (max)))
79-
80-
#endif
8141

8242
PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list);
83-
#ifndef Py_LIMITED_API
84-
PyAPI_FUNC(PyObject **) _Py_VaBuildStack(
85-
PyObject **small_stack,
86-
Py_ssize_t small_stack_len,
87-
const char *format,
88-
va_list va,
89-
Py_ssize_t *p_nargs);
90-
#endif
91-
92-
#ifndef Py_LIMITED_API
93-
typedef struct _PyArg_Parser {
94-
const char *format;
95-
const char * const *keywords;
96-
const char *fname;
97-
const char *custom_msg;
98-
int pos; /* number of positional-only arguments */
99-
int min; /* minimal number of arguments */
100-
int max; /* maximal number of positional arguments */
101-
PyObject *kwtuple; /* tuple of keyword parameter names */
102-
struct _PyArg_Parser *next;
103-
} _PyArg_Parser;
104-
#ifdef PY_SSIZE_T_CLEAN
105-
#define _PyArg_ParseTupleAndKeywordsFast _PyArg_ParseTupleAndKeywordsFast_SizeT
106-
#define _PyArg_ParseStack _PyArg_ParseStack_SizeT
107-
#define _PyArg_ParseStackAndKeywords _PyArg_ParseStackAndKeywords_SizeT
108-
#define _PyArg_VaParseTupleAndKeywordsFast _PyArg_VaParseTupleAndKeywordsFast_SizeT
109-
#endif
110-
PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast(PyObject *, PyObject *,
111-
struct _PyArg_Parser *, ...);
112-
PyAPI_FUNC(int) _PyArg_ParseStack(
113-
PyObject *const *args,
114-
Py_ssize_t nargs,
115-
const char *format,
116-
...);
117-
PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords(
118-
PyObject *const *args,
119-
Py_ssize_t nargs,
120-
PyObject *kwnames,
121-
struct _PyArg_Parser *,
122-
...);
123-
PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *,
124-
struct _PyArg_Parser *, va_list);
125-
PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywords(
126-
PyObject *const *args, Py_ssize_t nargs,
127-
PyObject *kwargs, PyObject *kwnames,
128-
struct _PyArg_Parser *parser,
129-
int minpos, int maxpos, int minkw,
130-
PyObject **buf);
131-
132-
PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywordsWithVararg(
133-
PyObject *const *args, Py_ssize_t nargs,
134-
PyObject *kwargs, PyObject *kwnames,
135-
struct _PyArg_Parser *parser,
136-
int minpos, int maxpos, int minkw,
137-
int vararg, PyObject **buf);
138-
139-
#define _PyArg_UnpackKeywords(args, nargs, kwargs, kwnames, parser, minpos, maxpos, minkw, buf) \
140-
(((minkw) == 0 && (kwargs) == NULL && (kwnames) == NULL && \
141-
(minpos) <= (nargs) && (nargs) <= (maxpos) && args != NULL) ? (args) : \
142-
_PyArg_UnpackKeywords((args), (nargs), (kwargs), (kwnames), (parser), \
143-
(minpos), (maxpos), (minkw), (buf)))
144-
#endif /* Py_LIMITED_API */
14543

14644
// Add an attribute with name 'name' and value 'obj' to the module 'mod.
14745
// On success, return 0 on success.
@@ -154,10 +52,12 @@ PyAPI_FUNC(int) PyModule_AddObject(PyObject *mod, const char *, PyObject *value)
15452

15553
PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long);
15654
PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *);
55+
15756
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000
15857
/* New in 3.9 */
15958
PyAPI_FUNC(int) PyModule_AddType(PyObject *module, PyTypeObject *type);
16059
#endif /* Py_LIMITED_API */
60+
16161
#define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, #c, c)
16262
#define PyModule_AddStringMacro(m, c) PyModule_AddStringConstant(m, #c, c)
16363

@@ -231,9 +131,6 @@ PyAPI_FUNC(int) PyModule_ExecDef(PyObject *module, PyModuleDef *def);
231131
#endif
232132

233133
PyAPI_FUNC(PyObject *) PyModule_Create2(PyModuleDef*, int apiver);
234-
#ifndef Py_LIMITED_API
235-
PyAPI_FUNC(PyObject *) _PyModule_CreateInitialized(PyModuleDef*, int apiver);
236-
#endif
237134

238135
#ifdef Py_LIMITED_API
239136
#define PyModule_Create(module) \
@@ -256,10 +153,13 @@ PyAPI_FUNC(PyObject *) PyModule_FromDefAndSpec2(PyModuleDef *def,
256153
#define PyModule_FromDefAndSpec(module, spec) \
257154
PyModule_FromDefAndSpec2(module, spec, PYTHON_API_VERSION)
258155
#endif /* Py_LIMITED_API */
156+
259157
#endif /* New in 3.5 */
260158

261159
#ifndef Py_LIMITED_API
262-
PyAPI_DATA(const char *) _Py_PackageContext;
160+
# define Py_CPYTHON_MODSUPPORT_H
161+
# include "cpython/modsupport.h"
162+
# undef Py_CPYTHON_MODSUPPORT_H
263163
#endif
264164

265165
#ifdef __cplusplus

Makefile.pre.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,6 +1546,7 @@ PYTHON_HEADERS= \
15461546
$(srcdir)/Include/cpython/longintrepr.h \
15471547
$(srcdir)/Include/cpython/longobject.h \
15481548
$(srcdir)/Include/cpython/methodobject.h \
1549+
$(srcdir)/Include/cpython/modsupport.h \
15491550
$(srcdir)/Include/cpython/object.h \
15501551
$(srcdir)/Include/cpython/objimpl.h \
15511552
$(srcdir)/Include/cpython/odictobject.h \

PCbuild/pythoncore.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@
156156
<ClInclude Include="..\Include\cpython\longintrepr.h" />
157157
<ClInclude Include="..\Include\cpython\longobject.h" />
158158
<ClInclude Include="..\Include\cpython\methodobject.h" />
159+
<ClInclude Include="..\Include\cpython\modsupport.h" />
159160
<ClInclude Include="..\Include\cpython\object.h" />
160161
<ClInclude Include="..\Include\cpython\objimpl.h" />
161162
<ClInclude Include="..\Include\cpython\odictobject.h" />

PCbuild/pythoncore.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,9 @@
402402
<ClInclude Include="..\Include\cpython\methodobject.h">
403403
<Filter>Include\cpython</Filter>
404404
</ClInclude>
405+
<ClInclude Include="..\Include\cpython\modsupport.h">
406+
<Filter>Include\cpython</Filter>
407+
</ClInclude>
405408
<ClInclude Include="..\Include\cpython\objimpl.h">
406409
<Filter>Include\cpython</Filter>
407410
</ClInclude>

0 commit comments

Comments
 (0)
0