[Python-checkins] cpython: Factorize _PyBytes_FromList() and _PyBytes_FromTuple() code using a C macro

victor.stinner python-checkins at python.org
Wed Oct 14 09:31:45 EDT 2015


https://hg.python.org/cpython/rev/270378da0396
changeset:   98749:270378da0396
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Wed Oct 14 13:50:40 2015 +0200
summary:
  Factorize _PyBytes_FromList() and _PyBytes_FromTuple() code using a C macro

files:
  Objects/bytesobject.c |  89 ++++++++++++------------------
  1 files changed, 35 insertions(+), 54 deletions(-)


diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -3408,68 +3408,49 @@
     return NULL;
 }
 
+#define _PyBytes_FROM_LIST_BODY(x, GET_ITEM)                                \
+    do {                                                                    \
+        PyObject *bytes;                                                    \
+        Py_ssize_t i;                                                       \
+        Py_ssize_t value;                                                   \
+        char *str;                                                          \
+        PyObject *item;                                                     \
+                                                                            \
+        bytes = PyBytes_FromStringAndSize(NULL, Py_SIZE(x));                \
+        if (bytes == NULL)                                                  \
+            return NULL;                                                    \
+        str = ((PyBytesObject *)bytes)->ob_sval;                            \
+                                                                            \
+        for (i = 0; i < Py_SIZE(x); i++) {                                  \
+            item = GET_ITEM((x), i);                                        \
+            value = PyNumber_AsSsize_t(item, PyExc_ValueError);             \
+            if (value == -1 && PyErr_Occurred())                            \
+                goto error;                                                 \
+                                                                            \
+            if (value < 0 || value >= 256) {                                \
+                PyErr_SetString(PyExc_ValueError,                           \
+                                "bytes must be in range(0, 256)");          \
+                goto error;                                                 \
+            }                                                               \
+            *str++ = (char) value;                                          \
+        }                                                                   \
+        return bytes;                                                       \
+                                                                            \
+    error:                                                                  \
+        Py_DECREF(bytes);                                                   \
+        return NULL;                                                        \
+    } while (0)
+
 static PyObject*
 _PyBytes_FromList(PyObject *x)
 {
-    PyObject *new;
-    Py_ssize_t i;
-    Py_ssize_t value;
-    char *str;
-
-    new = PyBytes_FromStringAndSize(NULL, Py_SIZE(x));
-    if (new == NULL)
-        return NULL;
-    str = ((PyBytesObject *)new)->ob_sval;
-
-    for (i = 0; i < Py_SIZE(x); i++) {
-        value = PyNumber_AsSsize_t(PyList_GET_ITEM(x, i), PyExc_ValueError);
-        if (value == -1 && PyErr_Occurred())
-            goto error;
-
-        if (value < 0 || value >= 256) {
-            PyErr_SetString(PyExc_ValueError,
-                    "bytes must be in range(0, 256)");
-            goto error;
-        }
-        *str++ = (char) value;
-    }
-    return new;
-
-error:
-    Py_DECREF(new);
-    return NULL;
+    _PyBytes_FROM_LIST_BODY(x, PyList_GET_ITEM);
 }
 
 static PyObject*
 _PyBytes_FromTuple(PyObject *x)
 {
-    PyObject *new;
-    Py_ssize_t i;
-    Py_ssize_t value;
-    char *str;
-
-    new = PyBytes_FromStringAndSize(NULL, Py_SIZE(x));
-    if (new == NULL)
-        return NULL;
-    str = ((PyBytesObject *)new)->ob_sval;
-
-    for (i = 0; i < Py_SIZE(x); i++) {
-        value = PyNumber_AsSsize_t(PyTuple_GET_ITEM(x, i), PyExc_ValueError);
-        if (value == -1 && PyErr_Occurred())
-            goto error;
-
-        if (value < 0 || value >= 256) {
-            PyErr_SetString(PyExc_ValueError,
-                    "bytes must be in range(0, 256)");
-            goto error;
-        }
-        *str++ = (char) value;
-    }
-    return new;
-
-error:
-    Py_DECREF(new);
-    return NULL;
+    _PyBytes_FROM_LIST_BODY(x, PyTuple_GET_ITEM);
 }
 
 static PyObject *

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list