diff options
| author | shadchin <[email protected]> | 2026-02-03 21:59:07 +0300 |
|---|---|---|
| committer | shadchin <[email protected]> | 2026-02-03 22:28:51 +0300 |
| commit | bce46f28de392862d5c6c3b185d844ee7c623be3 (patch) | |
| tree | 424878b5b90144f98970ce4a2745990c77330ad2 /contrib/tools/python3/Python/modsupport.c | |
| parent | 0e0ee9fa48ce9411b4038aa769493d22ff6c10a2 (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.c | 190 |
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 |
