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:
Alexander Belopolsky 2010-08-11 17:31:17 +00:00
parent 3a879e8a27
commit f0f45142d5
13 changed files with 74 additions and 124 deletions

View File

@ -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 */

View File

@ -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.

View File

@ -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 */

View File

@ -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 */
}; };

View File

@ -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;

View File

@ -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);
} }

View File

@ -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 == '%') {

View File

@ -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*/
}; };

View File

@ -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 */

View File

@ -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;
} }

View File

@ -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

View File

@ -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);

View File

@ -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;