From f0f45142d52436d26ce8ed888c73496949caae90 Mon Sep 17 00:00:00 2001 From: Alexander Belopolsky Date: Wed, 11 Aug 2010 17:31:17 +0000 Subject: [PATCH] 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. --- Include/pyport.h | 10 ++++++++++ Misc/NEWS | 4 ++++ Modules/_elementtree.c | 28 +++++++++++++-------------- Modules/_hashopenssl.c | 2 +- Objects/abstract.c | 10 +--------- Objects/bytearrayobject.c | 14 +++++++------- Objects/bytesobject.c | 10 +--------- Objects/capsule.c | 36 +++++++++++++++++------------------ Objects/memoryobject.c | 8 ++++---- Objects/unicodectype.c | 16 ++++++++-------- Objects/unicodeobject.c | 10 +--------- Python/getargs.c | 40 ++++----------------------------------- Python/modsupport.c | 10 +--------- 13 files changed, 74 insertions(+), 124 deletions(-) diff --git a/Include/pyport.h b/Include/pyport.h index 95612851b04..3932dc63722 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -822,4 +822,14 @@ extern pid_t forkpty(int *, char *, struct termios *, struct winsize *); #define Py_ULL(x) Py_LL(x##U) #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 */ diff --git a/Misc/NEWS b/Misc/NEWS index 80d07f514a8..24f9684823f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -583,6 +583,10 @@ Core and Builtins 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] instead of [-PY_SSIZE_T_MAX-1, PY_SSIZE_T_MAX]. This makes it safe to do "step = -step" when reversing a slice. diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 2fad8e2f475..876ab3a7696 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -2870,15 +2870,15 @@ static PyMethodDef _functions[] = { static struct PyModuleDef _elementtreemodule = { - PyModuleDef_HEAD_INIT, - "_elementtree", - NULL, - -1, - _functions, - NULL, - NULL, - NULL, - NULL + PyModuleDef_HEAD_INIT, + "_elementtree", + NULL, + -1, + _functions, + NULL, + NULL, + NULL, + NULL }; PyMODINIT_FUNC @@ -2890,12 +2890,12 @@ PyInit__elementtree(void) /* Initialize object types */ if (PyType_Ready(&TreeBuilder_Type) < 0) - return NULL; + return NULL; if (PyType_Ready(&Element_Type) < 0) - return NULL; + return NULL; #if defined(USE_EXPAT) if (PyType_Ready(&XMLParser_Type) < 0) - return NULL; + return NULL; #endif m = PyModule_Create(&_elementtreemodule); @@ -2905,8 +2905,8 @@ PyInit__elementtree(void) /* The code below requires that the module gets already added to sys.modules. */ PyDict_SetItemString(PyImport_GetModuleDict(), - _elementtreemodule.m_name, - m); + _elementtreemodule.m_name, + m); /* python glue code */ diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index 887de555d4e..9f550a6a0dd 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -559,7 +559,7 @@ static struct PyMethodDef EVP_functions[] = { CONSTRUCTOR_METH_DEF(sha384), CONSTRUCTOR_METH_DEF(sha512), #endif - {NULL, NULL} /* Sentinel */ + {NULL, NULL} /* Sentinel */ }; diff --git a/Objects/abstract.c b/Objects/abstract.c index fa2611aec94..d5a5d3c1299 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2311,15 +2311,7 @@ objargs_mktuple(va_list va) va_list countva; PyObject *result, *tmp; -#ifdef VA_LIST_IS_ARRAY - memcpy(countva, va, sizeof(va_list)); -#else -#ifdef __va_copy - __va_copy(countva, va); -#else - countva = va; -#endif -#endif + Py_VA_COPY(countva, va); while (((PyObject *)va_arg(countva, PyObject *)) != NULL) ++n; diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index cdc860fc32f..be19a82766d 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -936,12 +936,12 @@ bytearray_repr(PyByteArrayObject *self) static PyObject * bytearray_str(PyObject *op) { - if (Py_BytesWarningFlag) { - if (PyErr_WarnEx(PyExc_BytesWarning, - "str() on a bytearray instance", 1)) - return NULL; - } - return bytearray_repr((PyByteArrayObject*)op); + if (Py_BytesWarningFlag) { + if (PyErr_WarnEx(PyExc_BytesWarning, + "str() on a bytearray instance", 1)) + return NULL; + } + return bytearray_repr((PyByteArrayObject*)op); } static PyObject * @@ -1458,7 +1458,7 @@ done: static PyObject * bytearray_maketrans(PyObject *null, PyObject *args) { - return _Py_bytes_maketrans(args); + return _Py_bytes_maketrans(args); } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index c0c82f73a66..41c86d95446 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -173,15 +173,7 @@ PyBytes_FromFormatV(const char *format, va_list vargs) char *s; PyObject* string; -#ifdef VA_LIST_IS_ARRAY - Py_MEMCPY(count, vargs, sizeof(va_list)); -#else -#ifdef __va_copy - __va_copy(count, vargs); -#else - count = vargs; -#endif -#endif + Py_VA_COPY(count, vargs); /* step 1: figure out how large a buffer we need */ for (f = format; *f; f++) { if (*f == '%') { diff --git a/Objects/capsule.c b/Objects/capsule.c index e25af6c2aa8..acd3de637dd 100644 --- a/Objects/capsule.c +++ b/Objects/capsule.c @@ -298,27 +298,27 @@ Python import mechanism to link to one another.\n\ PyTypeObject PyCapsule_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "PyCapsule", /*tp_name*/ - sizeof(PyCapsule), /*tp_basicsize*/ - 0, /*tp_itemsize*/ + "PyCapsule", /*tp_name*/ + sizeof(PyCapsule), /*tp_basicsize*/ + 0, /*tp_itemsize*/ /* methods */ capsule_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_reserved*/ capsule_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - 0, /*tp_flags*/ - PyCapsule_Type__doc__ /*tp_doc*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + 0, /*tp_flags*/ + PyCapsule_Type__doc__ /*tp_doc*/ }; diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 5b3caf272c8..70ae6ccea0c 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -775,10 +775,10 @@ static PyMappingMethods memory_as_mapping = { }; static PySequenceMethods memory_as_sequence = { - 0, /* sq_length */ - 0, /* sq_concat */ - 0, /* sq_repeat */ - (ssizeargfunc)memory_item, /* sq_item */ + 0, /* sq_length */ + 0, /* sq_concat */ + 0, /* sq_repeat */ + (ssizeargfunc)memory_item, /* sq_item */ }; /* Buffer methods */ diff --git a/Objects/unicodectype.c b/Objects/unicodectype.c index 1849831e84d..db4f513d05a 100644 --- a/Objects/unicodectype.c +++ b/Objects/unicodectype.c @@ -63,10 +63,10 @@ Py_UNICODE _PyUnicode_ToTitlecase(register Py_UNICODE ch) int delta = ctype->title; if (ctype->flags & NODELTA_MASK) - return delta; + return delta; if (delta >= 32768) - delta -= 65536; + delta -= 65536; return ch + delta; } @@ -114,7 +114,7 @@ int _PyUnicode_ToDecimalDigit(Py_UNICODE ch) int _PyUnicode_IsDecimalDigit(Py_UNICODE ch) { if (_PyUnicode_ToDecimalDigit(ch) < 0) - return 0; + return 0; return 1; } @@ -131,7 +131,7 @@ int _PyUnicode_ToDigit(Py_UNICODE ch) int _PyUnicode_IsDigit(Py_UNICODE ch) { if (_PyUnicode_ToDigit(ch) < 0) - return 0; + return 0; return 1; } @@ -195,9 +195,9 @@ Py_UNICODE _PyUnicode_ToUppercase(Py_UNICODE ch) const _PyUnicode_TypeRecord *ctype = gettyperecord(ch); int delta = ctype->upper; if (ctype->flags & NODELTA_MASK) - return delta; + return delta; if (delta >= 32768) - delta -= 65536; + delta -= 65536; return ch + delta; } @@ -209,9 +209,9 @@ Py_UNICODE _PyUnicode_ToLowercase(Py_UNICODE ch) const _PyUnicode_TypeRecord *ctype = gettyperecord(ch); int delta = ctype->lower; if (ctype->flags & NODELTA_MASK) - return delta; + return delta; if (delta >= 32768) - delta -= 65536; + delta -= 65536; return ch + delta; } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 478f9a976e1..849f33e0760 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -755,15 +755,7 @@ PyUnicode_FromFormatV(const char *format, va_list vargs) char fmt[61]; /* should be enough for %0width.precisionlld */ const char *copy; -#ifdef VA_LIST_IS_ARRAY - Py_MEMCPY(count, vargs, sizeof(va_list)); -#else -#ifdef __va_copy - __va_copy(count, vargs); -#else - count = vargs; -#endif -#endif + Py_VA_COPY(count, vargs); /* step 1: count the number of %S/%R/%A/%s format specifications * (we call PyObject_Str()/PyObject_Repr()/PyObject_ASCII()/ * PyUnicode_DecodeUTF8() for these objects once during step 3 and put the diff --git a/Python/getargs.c b/Python/getargs.c index e4bd50d7b34..abf55ce041a 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -105,15 +105,7 @@ PyArg_VaParse(PyObject *args, const char *format, va_list va) { va_list lva; -#ifdef VA_LIST_IS_ARRAY - memcpy(lva, va, sizeof(va_list)); -#else -#ifdef __va_copy - __va_copy(lva, va); -#else - lva = va; -#endif -#endif + Py_VA_COPY(lva, va); return vgetargs1(args, format, &lva, 0); } @@ -123,15 +115,7 @@ _PyArg_VaParse_SizeT(PyObject *args, char *format, va_list va) { va_list lva; -#ifdef VA_LIST_IS_ARRAY - memcpy(lva, va, sizeof(va_list)); -#else -#ifdef __va_copy - __va_copy(lva, va); -#else - lva = va; -#endif -#endif + Py_VA_COPY(lva, va); return vgetargs1(args, format, &lva, FLAG_SIZE_T); } @@ -1376,15 +1360,7 @@ PyArg_VaParseTupleAndKeywords(PyObject *args, return 0; } -#ifdef VA_LIST_IS_ARRAY - memcpy(lva, va, sizeof(va_list)); -#else -#ifdef __va_copy - __va_copy(lva, va); -#else - lva = va; -#endif -#endif + Py_VA_COPY(lva, va); retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0); return retval; @@ -1408,15 +1384,7 @@ _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, return 0; } -#ifdef VA_LIST_IS_ARRAY - memcpy(lva, va, sizeof(va_list)); -#else -#ifdef __va_copy - __va_copy(lva, va); -#else - lva = va; -#endif -#endif + Py_VA_COPY(lva, va); retval = vgetargskeywords(args, keywords, format, kwlist, &lva, FLAG_SIZE_T); diff --git a/Python/modsupport.c b/Python/modsupport.c index 5f5d842eea9..85b0d663588 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -456,15 +456,7 @@ va_build_value(const char *format, va_list va, int flags) int n = countformat(f, '\0'); va_list lva; -#ifdef VA_LIST_IS_ARRAY - memcpy(lva, va, sizeof(va_list)); -#else -#ifdef __va_copy - __va_copy(lva, va); -#else - lva = va; -#endif -#endif + Py_VA_COPY(lva, va); if (n < 0) return NULL;