summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Python/modsupport.c
diff options
context:
space:
mode:
authorshadchin <[email protected]>2026-02-03 21:59:07 +0300
committershadchin <[email protected]>2026-02-03 22:28:51 +0300
commitbce46f28de392862d5c6c3b185d844ee7c623be3 (patch)
tree424878b5b90144f98970ce4a2745990c77330ad2 /contrib/tools/python3/Python/modsupport.c
parent0e0ee9fa48ce9411b4038aa769493d22ff6c10a2 (diff)
Import Python 3.13.11
commit_hash:bbb53cefb159aa3e7afaa475fd19d5a03b66945f
Diffstat (limited to 'contrib/tools/python3/Python/modsupport.c')
-rw-r--r--contrib/tools/python3/Python/modsupport.c190
1 files changed, 72 insertions, 118 deletions
diff --git a/contrib/tools/python3/Python/modsupport.c b/contrib/tools/python3/Python/modsupport.c
index df4ae35a525..cf4ab39f380 100644
--- a/contrib/tools/python3/Python/modsupport.c
+++ b/contrib/tools/python3/Python/modsupport.c
@@ -5,11 +5,9 @@
#include "pycore_abstract.h" // _PyIndex_Check()
#include "pycore_object.h" // _PyType_IsReady()
-#define FLAG_SIZE_T 1
typedef double va_double;
-static PyObject *va_build_value(const char *, va_list, int);
-static PyObject **va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len, const char *, va_list, int, Py_ssize_t*);
+static PyObject *va_build_value(const char *, va_list);
int
@@ -84,21 +82,39 @@ countformat(const char *format, char endchar)
/* Generic function to create a value -- the inverse of getargs() */
/* After an original idea and first implementation by Steven Miale */
-static PyObject *do_mktuple(const char**, va_list *, char, Py_ssize_t, int);
-static int do_mkstack(PyObject **, const char**, va_list *, char, Py_ssize_t, int);
-static PyObject *do_mklist(const char**, va_list *, char, Py_ssize_t, int);
-static PyObject *do_mkdict(const char**, va_list *, char, Py_ssize_t, int);
-static PyObject *do_mkvalue(const char**, va_list *, int);
+static PyObject *do_mktuple(const char**, va_list *, char, Py_ssize_t);
+static int do_mkstack(PyObject **, const char**, va_list *, char, Py_ssize_t);
+static PyObject *do_mklist(const char**, va_list *, char, Py_ssize_t);
+static PyObject *do_mkdict(const char**, va_list *, char, Py_ssize_t);
+static PyObject *do_mkvalue(const char**, va_list *);
+static int
+check_end(const char **p_format, char endchar)
+{
+ const char *f = *p_format;
+ while (*f != endchar) {
+ if (*f != ' ' && *f != '\t' && *f != ',' && *f != ':') {
+ PyErr_SetString(PyExc_SystemError,
+ "Unmatched paren in format");
+ return 0;
+ }
+ f++;
+ }
+ if (endchar) {
+ f++;
+ }
+ *p_format = f;
+ return 1;
+}
static void
-do_ignore(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
+do_ignore(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n)
{
assert(PyErr_Occurred());
PyObject *v = PyTuple_New(n);
for (Py_ssize_t i = 0; i < n; i++) {
PyObject *exc = PyErr_GetRaisedException();
- PyObject *w = do_mkvalue(p_format, p_va, flags);
+ PyObject *w = do_mkvalue(p_format, p_va);
PyErr_SetRaisedException(exc);
if (w != NULL) {
if (v != NULL) {
@@ -110,18 +126,13 @@ do_ignore(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int
}
}
Py_XDECREF(v);
- if (**p_format != endchar) {
- PyErr_SetString(PyExc_SystemError,
- "Unmatched paren in format");
+ if (!check_end(p_format, endchar)) {
return;
}
- if (endchar) {
- ++*p_format;
- }
}
static PyObject *
-do_mkdict(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
+do_mkdict(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n)
{
PyObject *d;
Py_ssize_t i;
@@ -130,27 +141,27 @@ do_mkdict(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int
if (n % 2) {
PyErr_SetString(PyExc_SystemError,
"Bad dict format");
- do_ignore(p_format, p_va, endchar, n, flags);
+ do_ignore(p_format, p_va, endchar, n);
return NULL;
}
/* Note that we can't bail immediately on error as this will leak
refcounts on any 'N' arguments. */
if ((d = PyDict_New()) == NULL) {
- do_ignore(p_format, p_va, endchar, n, flags);
+ do_ignore(p_format, p_va, endchar, n);
return NULL;
}
for (i = 0; i < n; i+= 2) {
PyObject *k, *v;
- k = do_mkvalue(p_format, p_va, flags);
+ k = do_mkvalue(p_format, p_va);
if (k == NULL) {
- do_ignore(p_format, p_va, endchar, n - i - 1, flags);
+ do_ignore(p_format, p_va, endchar, n - i - 1);
Py_DECREF(d);
return NULL;
}
- v = do_mkvalue(p_format, p_va, flags);
+ v = do_mkvalue(p_format, p_va);
if (v == NULL || PyDict_SetItem(d, k, v) < 0) {
- do_ignore(p_format, p_va, endchar, n - i - 2, flags);
+ do_ignore(p_format, p_va, endchar, n - i - 2);
Py_DECREF(k);
Py_XDECREF(v);
Py_DECREF(d);
@@ -159,19 +170,15 @@ do_mkdict(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int
Py_DECREF(k);
Py_DECREF(v);
}
- if (**p_format != endchar) {
+ if (!check_end(p_format, endchar)) {
Py_DECREF(d);
- PyErr_SetString(PyExc_SystemError,
- "Unmatched paren in format");
return NULL;
}
- if (endchar)
- ++*p_format;
return d;
}
static PyObject *
-do_mklist(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
+do_mklist(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n)
{
PyObject *v;
Py_ssize_t i;
@@ -181,32 +188,28 @@ do_mklist(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int
refcounts on any 'N' arguments. */
v = PyList_New(n);
if (v == NULL) {
- do_ignore(p_format, p_va, endchar, n, flags);
+ do_ignore(p_format, p_va, endchar, n);
return NULL;
}
for (i = 0; i < n; i++) {
- PyObject *w = do_mkvalue(p_format, p_va, flags);
+ PyObject *w = do_mkvalue(p_format, p_va);
if (w == NULL) {
- do_ignore(p_format, p_va, endchar, n - i - 1, flags);
+ do_ignore(p_format, p_va, endchar, n - i - 1);
Py_DECREF(v);
return NULL;
}
PyList_SET_ITEM(v, i, w);
}
- if (**p_format != endchar) {
+ if (!check_end(p_format, endchar)) {
Py_DECREF(v);
- PyErr_SetString(PyExc_SystemError,
- "Unmatched paren in format");
return NULL;
}
- if (endchar)
- ++*p_format;
return v;
}
static int
do_mkstack(PyObject **stack, const char **p_format, va_list *p_va,
- char endchar, Py_ssize_t n, int flags)
+ char endchar, Py_ssize_t n)
{
Py_ssize_t i;
@@ -216,21 +219,16 @@ do_mkstack(PyObject **stack, const char **p_format, va_list *p_va,
/* Note that we can't bail immediately on error as this will leak
refcounts on any 'N' arguments. */
for (i = 0; i < n; i++) {
- PyObject *w = do_mkvalue(p_format, p_va, flags);
+ PyObject *w = do_mkvalue(p_format, p_va);
if (w == NULL) {
- do_ignore(p_format, p_va, endchar, n - i - 1, flags);
+ do_ignore(p_format, p_va, endchar, n - i - 1);
goto error;
}
stack[i] = w;
}
- if (**p_format != endchar) {
- PyErr_SetString(PyExc_SystemError,
- "Unmatched paren in format");
+ if (!check_end(p_format, endchar)) {
goto error;
}
- if (endchar) {
- ++*p_format;
- }
return 0;
error:
@@ -242,7 +240,7 @@ error:
}
static PyObject *
-do_mktuple(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
+do_mktuple(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n)
{
PyObject *v;
Py_ssize_t i;
@@ -251,52 +249,41 @@ do_mktuple(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int
/* Note that we can't bail immediately on error as this will leak
refcounts on any 'N' arguments. */
if ((v = PyTuple_New(n)) == NULL) {
- do_ignore(p_format, p_va, endchar, n, flags);
+ do_ignore(p_format, p_va, endchar, n);
return NULL;
}
for (i = 0; i < n; i++) {
- PyObject *w = do_mkvalue(p_format, p_va, flags);
+ PyObject *w = do_mkvalue(p_format, p_va);
if (w == NULL) {
- do_ignore(p_format, p_va, endchar, n - i - 1, flags);
+ do_ignore(p_format, p_va, endchar, n - i - 1);
Py_DECREF(v);
return NULL;
}
PyTuple_SET_ITEM(v, i, w);
}
- if (**p_format != endchar) {
+ if (!check_end(p_format, endchar)) {
Py_DECREF(v);
- PyErr_SetString(PyExc_SystemError,
- "Unmatched paren in format");
return NULL;
}
- if (endchar)
- ++*p_format;
return v;
}
static PyObject *
-do_mkvalue(const char **p_format, va_list *p_va, int flags)
+do_mkvalue(const char **p_format, va_list *p_va)
{
-#define ERROR_NEED_PY_SSIZE_T_CLEAN \
- { \
- PyErr_SetString(PyExc_SystemError, \
- "PY_SSIZE_T_CLEAN macro must be defined for '#' formats"); \
- return NULL; \
- }
-
for (;;) {
switch (*(*p_format)++) {
case '(':
return do_mktuple(p_format, p_va, ')',
- countformat(*p_format, ')'), flags);
+ countformat(*p_format, ')'));
case '[':
return do_mklist(p_format, p_va, ']',
- countformat(*p_format, ']'), flags);
+ countformat(*p_format, ']'));
case '{':
return do_mkdict(p_format, p_va, '}',
- countformat(*p_format, '}'), flags);
+ countformat(*p_format, '}'));
case 'b':
case 'B':
@@ -333,22 +320,17 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
return PyLong_FromLongLong((long long)va_arg(*p_va, long long));
case 'K':
- return PyLong_FromUnsignedLongLong((long long)va_arg(*p_va, unsigned long long));
+ return PyLong_FromUnsignedLongLong(
+ va_arg(*p_va, unsigned long long));
case 'u':
{
PyObject *v;
- Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
+ const wchar_t *u = va_arg(*p_va, wchar_t*);
Py_ssize_t n;
if (**p_format == '#') {
++*p_format;
- if (flags & FLAG_SIZE_T) {
- n = va_arg(*p_va, Py_ssize_t);
- }
- else {
- n = va_arg(*p_va, int);
- ERROR_NEED_PY_SSIZE_T_CLEAN;
- }
+ n = va_arg(*p_va, Py_ssize_t);
}
else
n = -1;
@@ -392,13 +374,7 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
Py_ssize_t n;
if (**p_format == '#') {
++*p_format;
- if (flags & FLAG_SIZE_T) {
- n = va_arg(*p_va, Py_ssize_t);
- }
- else {
- n = va_arg(*p_va, int);
- ERROR_NEED_PY_SSIZE_T_CLEAN;
- }
+ n = va_arg(*p_va, Py_ssize_t);
}
else
n = -1;
@@ -427,13 +403,7 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
Py_ssize_t n;
if (**p_format == '#') {
++*p_format;
- if (flags & FLAG_SIZE_T) {
- n = va_arg(*p_va, Py_ssize_t);
- }
- else {
- n = va_arg(*p_va, int);
- ERROR_NEED_PY_SSIZE_T_CLEAN;
- }
+ n = va_arg(*p_va, Py_ssize_t);
}
else
n = -1;
@@ -499,8 +469,6 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
}
}
-
-#undef ERROR_NEED_PY_SSIZE_T_CLEAN
}
@@ -510,18 +478,18 @@ Py_BuildValue(const char *format, ...)
va_list va;
PyObject* retval;
va_start(va, format);
- retval = va_build_value(format, va, 0);
+ retval = va_build_value(format, va);
va_end(va);
return retval;
}
-PyObject *
+PyAPI_FUNC(PyObject *) /* abi only */
_Py_BuildValue_SizeT(const char *format, ...)
{
va_list va;
PyObject* retval;
va_start(va, format);
- retval = va_build_value(format, va, FLAG_SIZE_T);
+ retval = va_build_value(format, va);
va_end(va);
return retval;
}
@@ -529,17 +497,17 @@ _Py_BuildValue_SizeT(const char *format, ...)
PyObject *
Py_VaBuildValue(const char *format, va_list va)
{
- return va_build_value(format, va, 0);
+ return va_build_value(format, va);
}
-PyObject *
+PyAPI_FUNC(PyObject *) /* abi only */
_Py_VaBuildValue_SizeT(const char *format, va_list va)
{
- return va_build_value(format, va, FLAG_SIZE_T);
+ return va_build_value(format, va);
}
static PyObject *
-va_build_value(const char *format, va_list va, int flags)
+va_build_value(const char *format, va_list va)
{
const char *f = format;
Py_ssize_t n = countformat(f, '\0');
@@ -553,9 +521,9 @@ va_build_value(const char *format, va_list va, int flags)
}
va_copy(lva, va);
if (n == 1) {
- retval = do_mkvalue(&f, &lva, flags);
+ retval = do_mkvalue(&f, &lva);
} else {
- retval = do_mktuple(&f, &lva, '\0', n, flags);
+ retval = do_mktuple(&f, &lva, '\0', n);
}
va_end(lva);
return retval;
@@ -565,20 +533,6 @@ PyObject **
_Py_VaBuildStack(PyObject **small_stack, Py_ssize_t small_stack_len,
const char *format, va_list va, Py_ssize_t *p_nargs)
{
- return va_build_stack(small_stack, small_stack_len, format, va, 0, p_nargs);
-}
-
-PyObject **
-_Py_VaBuildStack_SizeT(PyObject **small_stack, Py_ssize_t small_stack_len,
- const char *format, va_list va, Py_ssize_t *p_nargs)
-{
- return va_build_stack(small_stack, small_stack_len, format, va, FLAG_SIZE_T, p_nargs);
-}
-
-static PyObject **
-va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len,
- const char *format, va_list va, int flags, Py_ssize_t *p_nargs)
-{
const char *f;
Py_ssize_t n;
va_list lva;
@@ -609,7 +563,7 @@ va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len,
va_copy(lva, va);
f = format;
- res = do_mkstack(stack, &f, &lva, '\0', n, flags);
+ res = do_mkstack(stack, &f, &lva, '\0', n);
va_end(lva);
if (res < 0) {
@@ -653,7 +607,7 @@ PyModule_AddObjectRef(PyObject *mod, const char *name, PyObject *value)
}
int
-_PyModule_Add(PyObject *mod, const char *name, PyObject *value)
+PyModule_Add(PyObject *mod, const char *name, PyObject *value)
{
int res = PyModule_AddObjectRef(mod, name, value);
Py_XDECREF(value);
@@ -673,13 +627,13 @@ PyModule_AddObject(PyObject *mod, const char *name, PyObject *value)
int
PyModule_AddIntConstant(PyObject *m, const char *name, long value)
{
- return _PyModule_Add(m, name, PyLong_FromLong(value));
+ return PyModule_Add(m, name, PyLong_FromLong(value));
}
int
PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
{
- return _PyModule_Add(m, name, PyUnicode_FromString(value));
+ return PyModule_Add(m, name, PyUnicode_FromString(value));
}
int