mirror of https://github.com/python/cpython
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
va_copy, but available on all python platforms. Untabified a few unrelated files.
This commit is contained in:
parent
3a879e8a27
commit
f0f45142d5
|
@ -822,4 +822,14 @@ extern pid_t forkpty(int *, char *, struct termios *, struct winsize *);
|
||||||
#define Py_ULL(x) Py_LL(x##U)
|
#define Py_ULL(x) Py_LL(x##U)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef VA_LIST_IS_ARRAY
|
||||||
|
#define Py_VA_COPY(x, y) Py_MEMCPY((x), (y), sizeof(va_list))
|
||||||
|
#else
|
||||||
|
#ifdef __va_copy
|
||||||
|
#define Py_VA_COPY __va_copy
|
||||||
|
#else
|
||||||
|
#define Py_VA_COPY(x, y) (x) = (y)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* Py_PYPORT_H */
|
#endif /* Py_PYPORT_H */
|
||||||
|
|
|
@ -583,6 +583,10 @@ Core and Builtins
|
||||||
C-API
|
C-API
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
- Issue #2443: A new macro, `Py_VA_COPY`, copies the state of the
|
||||||
|
variable argument list. `Py_VA_COPY` is equivalent to C99
|
||||||
|
`va_copy`, but available on all python platforms.
|
||||||
|
|
||||||
- PySlice_GetIndicesEx now clips the step to [-PY_SSIZE_T_MAX, PY_SSIZE_T_MAX]
|
- PySlice_GetIndicesEx now clips the step to [-PY_SSIZE_T_MAX, PY_SSIZE_T_MAX]
|
||||||
instead of [-PY_SSIZE_T_MAX-1, PY_SSIZE_T_MAX]. This makes it safe to do
|
instead of [-PY_SSIZE_T_MAX-1, PY_SSIZE_T_MAX]. This makes it safe to do
|
||||||
"step = -step" when reversing a slice.
|
"step = -step" when reversing a slice.
|
||||||
|
|
|
@ -2870,15 +2870,15 @@ static PyMethodDef _functions[] = {
|
||||||
|
|
||||||
|
|
||||||
static struct PyModuleDef _elementtreemodule = {
|
static struct PyModuleDef _elementtreemodule = {
|
||||||
PyModuleDef_HEAD_INIT,
|
PyModuleDef_HEAD_INIT,
|
||||||
"_elementtree",
|
"_elementtree",
|
||||||
NULL,
|
NULL,
|
||||||
-1,
|
-1,
|
||||||
_functions,
|
_functions,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
PyMODINIT_FUNC
|
PyMODINIT_FUNC
|
||||||
|
@ -2890,12 +2890,12 @@ PyInit__elementtree(void)
|
||||||
|
|
||||||
/* Initialize object types */
|
/* Initialize object types */
|
||||||
if (PyType_Ready(&TreeBuilder_Type) < 0)
|
if (PyType_Ready(&TreeBuilder_Type) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (PyType_Ready(&Element_Type) < 0)
|
if (PyType_Ready(&Element_Type) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
#if defined(USE_EXPAT)
|
#if defined(USE_EXPAT)
|
||||||
if (PyType_Ready(&XMLParser_Type) < 0)
|
if (PyType_Ready(&XMLParser_Type) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m = PyModule_Create(&_elementtreemodule);
|
m = PyModule_Create(&_elementtreemodule);
|
||||||
|
@ -2905,8 +2905,8 @@ PyInit__elementtree(void)
|
||||||
/* The code below requires that the module gets already added
|
/* The code below requires that the module gets already added
|
||||||
to sys.modules. */
|
to sys.modules. */
|
||||||
PyDict_SetItemString(PyImport_GetModuleDict(),
|
PyDict_SetItemString(PyImport_GetModuleDict(),
|
||||||
_elementtreemodule.m_name,
|
_elementtreemodule.m_name,
|
||||||
m);
|
m);
|
||||||
|
|
||||||
/* python glue code */
|
/* python glue code */
|
||||||
|
|
||||||
|
|
|
@ -559,7 +559,7 @@ static struct PyMethodDef EVP_functions[] = {
|
||||||
CONSTRUCTOR_METH_DEF(sha384),
|
CONSTRUCTOR_METH_DEF(sha384),
|
||||||
CONSTRUCTOR_METH_DEF(sha512),
|
CONSTRUCTOR_METH_DEF(sha512),
|
||||||
#endif
|
#endif
|
||||||
{NULL, NULL} /* Sentinel */
|
{NULL, NULL} /* Sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2311,15 +2311,7 @@ objargs_mktuple(va_list va)
|
||||||
va_list countva;
|
va_list countva;
|
||||||
PyObject *result, *tmp;
|
PyObject *result, *tmp;
|
||||||
|
|
||||||
#ifdef VA_LIST_IS_ARRAY
|
Py_VA_COPY(countva, va);
|
||||||
memcpy(countva, va, sizeof(va_list));
|
|
||||||
#else
|
|
||||||
#ifdef __va_copy
|
|
||||||
__va_copy(countva, va);
|
|
||||||
#else
|
|
||||||
countva = va;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
|
while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
|
||||||
++n;
|
++n;
|
||||||
|
|
|
@ -936,12 +936,12 @@ bytearray_repr(PyByteArrayObject *self)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
bytearray_str(PyObject *op)
|
bytearray_str(PyObject *op)
|
||||||
{
|
{
|
||||||
if (Py_BytesWarningFlag) {
|
if (Py_BytesWarningFlag) {
|
||||||
if (PyErr_WarnEx(PyExc_BytesWarning,
|
if (PyErr_WarnEx(PyExc_BytesWarning,
|
||||||
"str() on a bytearray instance", 1))
|
"str() on a bytearray instance", 1))
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return bytearray_repr((PyByteArrayObject*)op);
|
return bytearray_repr((PyByteArrayObject*)op);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -1458,7 +1458,7 @@ done:
|
||||||
static PyObject *
|
static PyObject *
|
||||||
bytearray_maketrans(PyObject *null, PyObject *args)
|
bytearray_maketrans(PyObject *null, PyObject *args)
|
||||||
{
|
{
|
||||||
return _Py_bytes_maketrans(args);
|
return _Py_bytes_maketrans(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -173,15 +173,7 @@ PyBytes_FromFormatV(const char *format, va_list vargs)
|
||||||
char *s;
|
char *s;
|
||||||
PyObject* string;
|
PyObject* string;
|
||||||
|
|
||||||
#ifdef VA_LIST_IS_ARRAY
|
Py_VA_COPY(count, vargs);
|
||||||
Py_MEMCPY(count, vargs, sizeof(va_list));
|
|
||||||
#else
|
|
||||||
#ifdef __va_copy
|
|
||||||
__va_copy(count, vargs);
|
|
||||||
#else
|
|
||||||
count = vargs;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
/* step 1: figure out how large a buffer we need */
|
/* step 1: figure out how large a buffer we need */
|
||||||
for (f = format; *f; f++) {
|
for (f = format; *f; f++) {
|
||||||
if (*f == '%') {
|
if (*f == '%') {
|
||||||
|
|
|
@ -298,27 +298,27 @@ Python import mechanism to link to one another.\n\
|
||||||
|
|
||||||
PyTypeObject PyCapsule_Type = {
|
PyTypeObject PyCapsule_Type = {
|
||||||
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
||||||
"PyCapsule", /*tp_name*/
|
"PyCapsule", /*tp_name*/
|
||||||
sizeof(PyCapsule), /*tp_basicsize*/
|
sizeof(PyCapsule), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
/* methods */
|
/* methods */
|
||||||
capsule_dealloc, /*tp_dealloc*/
|
capsule_dealloc, /*tp_dealloc*/
|
||||||
0, /*tp_print*/
|
0, /*tp_print*/
|
||||||
0, /*tp_getattr*/
|
0, /*tp_getattr*/
|
||||||
0, /*tp_setattr*/
|
0, /*tp_setattr*/
|
||||||
0, /*tp_reserved*/
|
0, /*tp_reserved*/
|
||||||
capsule_repr, /*tp_repr*/
|
capsule_repr, /*tp_repr*/
|
||||||
0, /*tp_as_number*/
|
0, /*tp_as_number*/
|
||||||
0, /*tp_as_sequence*/
|
0, /*tp_as_sequence*/
|
||||||
0, /*tp_as_mapping*/
|
0, /*tp_as_mapping*/
|
||||||
0, /*tp_hash*/
|
0, /*tp_hash*/
|
||||||
0, /*tp_call*/
|
0, /*tp_call*/
|
||||||
0, /*tp_str*/
|
0, /*tp_str*/
|
||||||
0, /*tp_getattro*/
|
0, /*tp_getattro*/
|
||||||
0, /*tp_setattro*/
|
0, /*tp_setattro*/
|
||||||
0, /*tp_as_buffer*/
|
0, /*tp_as_buffer*/
|
||||||
0, /*tp_flags*/
|
0, /*tp_flags*/
|
||||||
PyCapsule_Type__doc__ /*tp_doc*/
|
PyCapsule_Type__doc__ /*tp_doc*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -775,10 +775,10 @@ static PyMappingMethods memory_as_mapping = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static PySequenceMethods memory_as_sequence = {
|
static PySequenceMethods memory_as_sequence = {
|
||||||
0, /* sq_length */
|
0, /* sq_length */
|
||||||
0, /* sq_concat */
|
0, /* sq_concat */
|
||||||
0, /* sq_repeat */
|
0, /* sq_repeat */
|
||||||
(ssizeargfunc)memory_item, /* sq_item */
|
(ssizeargfunc)memory_item, /* sq_item */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Buffer methods */
|
/* Buffer methods */
|
||||||
|
|
|
@ -63,10 +63,10 @@ Py_UNICODE _PyUnicode_ToTitlecase(register Py_UNICODE ch)
|
||||||
int delta = ctype->title;
|
int delta = ctype->title;
|
||||||
|
|
||||||
if (ctype->flags & NODELTA_MASK)
|
if (ctype->flags & NODELTA_MASK)
|
||||||
return delta;
|
return delta;
|
||||||
|
|
||||||
if (delta >= 32768)
|
if (delta >= 32768)
|
||||||
delta -= 65536;
|
delta -= 65536;
|
||||||
|
|
||||||
return ch + delta;
|
return ch + delta;
|
||||||
}
|
}
|
||||||
|
@ -114,7 +114,7 @@ int _PyUnicode_ToDecimalDigit(Py_UNICODE ch)
|
||||||
int _PyUnicode_IsDecimalDigit(Py_UNICODE ch)
|
int _PyUnicode_IsDecimalDigit(Py_UNICODE ch)
|
||||||
{
|
{
|
||||||
if (_PyUnicode_ToDecimalDigit(ch) < 0)
|
if (_PyUnicode_ToDecimalDigit(ch) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@ int _PyUnicode_ToDigit(Py_UNICODE ch)
|
||||||
int _PyUnicode_IsDigit(Py_UNICODE ch)
|
int _PyUnicode_IsDigit(Py_UNICODE ch)
|
||||||
{
|
{
|
||||||
if (_PyUnicode_ToDigit(ch) < 0)
|
if (_PyUnicode_ToDigit(ch) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,9 +195,9 @@ Py_UNICODE _PyUnicode_ToUppercase(Py_UNICODE ch)
|
||||||
const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
|
const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
|
||||||
int delta = ctype->upper;
|
int delta = ctype->upper;
|
||||||
if (ctype->flags & NODELTA_MASK)
|
if (ctype->flags & NODELTA_MASK)
|
||||||
return delta;
|
return delta;
|
||||||
if (delta >= 32768)
|
if (delta >= 32768)
|
||||||
delta -= 65536;
|
delta -= 65536;
|
||||||
return ch + delta;
|
return ch + delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,9 +209,9 @@ Py_UNICODE _PyUnicode_ToLowercase(Py_UNICODE ch)
|
||||||
const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
|
const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
|
||||||
int delta = ctype->lower;
|
int delta = ctype->lower;
|
||||||
if (ctype->flags & NODELTA_MASK)
|
if (ctype->flags & NODELTA_MASK)
|
||||||
return delta;
|
return delta;
|
||||||
if (delta >= 32768)
|
if (delta >= 32768)
|
||||||
delta -= 65536;
|
delta -= 65536;
|
||||||
return ch + delta;
|
return ch + delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -755,15 +755,7 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
|
||||||
char fmt[61]; /* should be enough for %0width.precisionlld */
|
char fmt[61]; /* should be enough for %0width.precisionlld */
|
||||||
const char *copy;
|
const char *copy;
|
||||||
|
|
||||||
#ifdef VA_LIST_IS_ARRAY
|
Py_VA_COPY(count, vargs);
|
||||||
Py_MEMCPY(count, vargs, sizeof(va_list));
|
|
||||||
#else
|
|
||||||
#ifdef __va_copy
|
|
||||||
__va_copy(count, vargs);
|
|
||||||
#else
|
|
||||||
count = vargs;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
/* step 1: count the number of %S/%R/%A/%s format specifications
|
/* step 1: count the number of %S/%R/%A/%s format specifications
|
||||||
* (we call PyObject_Str()/PyObject_Repr()/PyObject_ASCII()/
|
* (we call PyObject_Str()/PyObject_Repr()/PyObject_ASCII()/
|
||||||
* PyUnicode_DecodeUTF8() for these objects once during step 3 and put the
|
* PyUnicode_DecodeUTF8() for these objects once during step 3 and put the
|
||||||
|
|
|
@ -105,15 +105,7 @@ PyArg_VaParse(PyObject *args, const char *format, va_list va)
|
||||||
{
|
{
|
||||||
va_list lva;
|
va_list lva;
|
||||||
|
|
||||||
#ifdef VA_LIST_IS_ARRAY
|
Py_VA_COPY(lva, va);
|
||||||
memcpy(lva, va, sizeof(va_list));
|
|
||||||
#else
|
|
||||||
#ifdef __va_copy
|
|
||||||
__va_copy(lva, va);
|
|
||||||
#else
|
|
||||||
lva = va;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return vgetargs1(args, format, &lva, 0);
|
return vgetargs1(args, format, &lva, 0);
|
||||||
}
|
}
|
||||||
|
@ -123,15 +115,7 @@ _PyArg_VaParse_SizeT(PyObject *args, char *format, va_list va)
|
||||||
{
|
{
|
||||||
va_list lva;
|
va_list lva;
|
||||||
|
|
||||||
#ifdef VA_LIST_IS_ARRAY
|
Py_VA_COPY(lva, va);
|
||||||
memcpy(lva, va, sizeof(va_list));
|
|
||||||
#else
|
|
||||||
#ifdef __va_copy
|
|
||||||
__va_copy(lva, va);
|
|
||||||
#else
|
|
||||||
lva = va;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return vgetargs1(args, format, &lva, FLAG_SIZE_T);
|
return vgetargs1(args, format, &lva, FLAG_SIZE_T);
|
||||||
}
|
}
|
||||||
|
@ -1376,15 +1360,7 @@ PyArg_VaParseTupleAndKeywords(PyObject *args,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VA_LIST_IS_ARRAY
|
Py_VA_COPY(lva, va);
|
||||||
memcpy(lva, va, sizeof(va_list));
|
|
||||||
#else
|
|
||||||
#ifdef __va_copy
|
|
||||||
__va_copy(lva, va);
|
|
||||||
#else
|
|
||||||
lva = va;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0);
|
retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0);
|
||||||
return retval;
|
return retval;
|
||||||
|
@ -1408,15 +1384,7 @@ _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VA_LIST_IS_ARRAY
|
Py_VA_COPY(lva, va);
|
||||||
memcpy(lva, va, sizeof(va_list));
|
|
||||||
#else
|
|
||||||
#ifdef __va_copy
|
|
||||||
__va_copy(lva, va);
|
|
||||||
#else
|
|
||||||
lva = va;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
retval = vgetargskeywords(args, keywords, format,
|
retval = vgetargskeywords(args, keywords, format,
|
||||||
kwlist, &lva, FLAG_SIZE_T);
|
kwlist, &lva, FLAG_SIZE_T);
|
||||||
|
|
|
@ -456,15 +456,7 @@ va_build_value(const char *format, va_list va, int flags)
|
||||||
int n = countformat(f, '\0');
|
int n = countformat(f, '\0');
|
||||||
va_list lva;
|
va_list lva;
|
||||||
|
|
||||||
#ifdef VA_LIST_IS_ARRAY
|
Py_VA_COPY(lva, va);
|
||||||
memcpy(lva, va, sizeof(va_list));
|
|
||||||
#else
|
|
||||||
#ifdef __va_copy
|
|
||||||
__va_copy(lva, va);
|
|
||||||
#else
|
|
||||||
lva = va;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Reference in New Issue