mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	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
					
				
					 13 changed files with 74 additions and 124 deletions
				
			
		|  | @ -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 @@ bytearray_translate(PyByteArrayObject *self, PyObject *args) | ||||||
| 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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alexander Belopolsky
						Alexander Belopolsky