[Python-checkins] bpo-37999: Simplify the conversion code for %c, %d, %x, etc. (GH-20437)

Serhiy Storchaka webhook-mailer at python.org
Mon Jun 29 15:36:49 EDT 2020


https://github.com/python/cpython/commit/e67f7db3c34f70536f36c56bb82e33c3512a53a3
commit: e67f7db3c34f70536f36c56bb82e33c3512a53a3
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2020年06月29日T22:36:41+03:00
summary:
bpo-37999: Simplify the conversion code for %c, %d, %x, etc. (GH-20437)
Since PyLong_AsLong() no longer use __int__, explicit call
of PyNumber_Index() before it is no longer needed.
files:
M Objects/bytearrayobject.c
M Objects/bytesobject.c
M Objects/unicodeobject.c
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c
index 5a803be6277c8..83c79b200a0a1 100644
--- a/Objects/bytearrayobject.c
+++ b/Objects/bytearrayobject.c
@@ -22,22 +22,15 @@ char _PyByteArray_empty_string[] = "";
 static int
 _getbytevalue(PyObject* arg, int *value)
 {
- long face_value;
+ int overflow;
+ long face_value = PyLong_AsLongAndOverflow(arg, &overflow);
 
- if (PyLong_Check(arg)) {
- face_value = PyLong_AsLong(arg);
- } else {
- PyObject *index = PyNumber_Index(arg);
- if (index == NULL) {
- *value = -1;
- return 0;
- }
- face_value = PyLong_AsLong(index);
- Py_DECREF(index);
+ if (face_value == -1 && PyErr_Occurred()) {
+ *value = -1;
+ return 0;
 }
-
 if (face_value < 0 || face_value >= 256) {
- /* this includes the OverflowError in case the long is too large */
+ /* this includes an overflow in converting to C long */
 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
 *value = -1;
 return 0;
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index 782bc8e1fa0b7..7632cb5e4ddd9 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -510,17 +510,14 @@ formatlong(PyObject *v, int flags, int prec, int type)
 iobj = _PyNumber_Index(v);
 else
 iobj = PyNumber_Long(v);
- if (iobj == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_TypeError))
- return NULL;
- }
- else if (!PyLong_Check(iobj))
- Py_CLEAR(iobj);
 if (iobj != NULL) {
+ assert(PyLong_Check(iobj));
 result = _PyUnicode_FormatLong(iobj, flags & F_ALT, prec, type);
 Py_DECREF(iobj);
 return result;
 }
+ if (!PyErr_ExceptionMatches(PyExc_TypeError))
+ return NULL;
 }
 PyErr_Format(PyExc_TypeError,
 "%%%c format: %s is required, not %.200s", type,
@@ -542,26 +539,16 @@ byte_converter(PyObject *arg, char *p)
 return 1;
 }
 else {
- PyObject *iobj;
- long ival;
 int overflow;
- /* make sure number is a type of integer */
- if (PyLong_Check(arg)) {
- ival = PyLong_AsLongAndOverflow(arg, &overflow);
- }
- else {
- iobj = PyNumber_Index(arg);
- if (iobj == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_TypeError))
- return 0;
+ long ival = PyLong_AsLongAndOverflow(arg, &overflow);
+ if (ival == -1 && PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_TypeError)) {
 goto onError;
 }
- ival = PyLong_AsLongAndOverflow(iobj, &overflow);
- Py_DECREF(iobj);
+ return 0;
 }
- if (!overflow && ival == -1 && PyErr_Occurred())
- goto onError;
- if (overflow || !(0 <= ival && ival <= 255)) {
+ if (!(0 <= ival && ival <= 255)) {
+ /* this includes an overflow in converting to C long */
 PyErr_SetString(PyExc_OverflowError,
 "%c arg not in range(256)");
 return 0;
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 6fa6c3f6985cd..c46ba4ae57dc6 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -14641,19 +14641,14 @@ mainformatlong(PyObject *v,
 if (!PyLong_Check(v)) {
 if (type == 'o' || type == 'x' || type == 'X') {
 iobj = _PyNumber_Index(v);
- if (iobj == NULL) {
- if (PyErr_ExceptionMatches(PyExc_TypeError))
- goto wrongtype;
- return -1;
- }
 }
 else {
 iobj = PyNumber_Long(v);
- if (iobj == NULL ) {
- if (PyErr_ExceptionMatches(PyExc_TypeError))
- goto wrongtype;
- return -1;
- }
+ }
+ if (iobj == NULL ) {
+ if (PyErr_ExceptionMatches(PyExc_TypeError))
+ goto wrongtype;
+ return -1;
 }
 assert(PyLong_Check(iobj));
 }
@@ -14736,24 +14731,17 @@ formatchar(PyObject *v)
 goto onError;
 }
 else {
- PyObject *iobj;
- long x;
- /* make sure number is a type of integer */
- if (!PyLong_Check(v)) {
- iobj = PyNumber_Index(v);
- if (iobj == NULL) {
+ int overflow;
+ long x = PyLong_AsLongAndOverflow(v, &overflow);
+ if (x == -1 && PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_TypeError)) {
 goto onError;
 }
- x = PyLong_AsLong(iobj);
- Py_DECREF(iobj);
- }
- else {
- x = PyLong_AsLong(v);
+ return (Py_UCS4) -1;
 }
- if (x == -1 && PyErr_Occurred())
- goto onError;
 
 if (x < 0 || x > MAX_UNICODE) {
+ /* this includes an overflow in converting to C long */
 PyErr_SetString(PyExc_OverflowError,
 "%c arg not in range(0x110000)");
 return (Py_UCS4) -1;


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /