[Python-checkins] cpython: Issue #22615: Argument Clinic now supports the "type" argument for the

larry.hastings python-checkins at python.org
Mon Oct 13 11:40:00 CEST 2014


https://hg.python.org/cpython/rev/c0224ff67cdd
changeset:   93023:c0224ff67cdd
parent:      93021:1d5485471457
user:        Larry Hastings <larry at hastings.org>
date:        Mon Oct 13 10:39:41 2014 +0100
summary:
  Issue #22615: Argument Clinic now supports the "type" argument for the
int converter.  This permits using the int converter with enums and
typedefs.

files:
  Misc/NEWS                      |    4 +
  Modules/arraymodule.c          |  111 ++++++++++----------
  Modules/clinic/arraymodule.c.h |    6 +-
  Objects/bytesobject.c          |    2 +-
  Tools/clinic/clinic.py         |    4 +-
  5 files changed, 68 insertions(+), 59 deletions(-)


diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -1263,6 +1263,10 @@
 Tools/Demos
 -----------
 
+- Issue #22615: Argument Clinic now supports the "type" argument for the
+  int converter.  This permits using the int converter with enums and
+  typedefs.
+
 - Issue #20076: The makelocalealias.py script no longer ignores UTF-8 mapping.
 
 - Issue #20079: The makelocalealias.py script now can parse the SUPPORTED file
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -59,7 +59,50 @@
 
 #define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
 
-/* Must come after arrayobject and arrayiterobject definitions. */
+enum machine_format_code {
+    UNKNOWN_FORMAT = -1,
+    /* UNKNOWN_FORMAT is used to indicate that the machine format for an
+     * array type code cannot be interpreted. When this occurs, a list of
+     * Python objects is used to represent the content of the array
+     * instead of using the memory content of the array directly. In that
+     * case, the array_reconstructor mechanism is bypassed completely, and
+     * the standard array constructor is used instead.
+     *
+     * This is will most likely occur when the machine doesn't use IEEE
+     * floating-point numbers.
+     */
+
+    UNSIGNED_INT8 = 0,
+    SIGNED_INT8 = 1,
+    UNSIGNED_INT16_LE = 2,
+    UNSIGNED_INT16_BE = 3,
+    SIGNED_INT16_LE = 4,
+    SIGNED_INT16_BE = 5,
+    UNSIGNED_INT32_LE = 6,
+    UNSIGNED_INT32_BE = 7,
+    SIGNED_INT32_LE = 8,
+    SIGNED_INT32_BE = 9,
+    UNSIGNED_INT64_LE = 10,
+    UNSIGNED_INT64_BE = 11,
+    SIGNED_INT64_LE = 12,
+    SIGNED_INT64_BE = 13,
+    IEEE_754_FLOAT_LE = 14,
+    IEEE_754_FLOAT_BE = 15,
+    IEEE_754_DOUBLE_LE = 16,
+    IEEE_754_DOUBLE_BE = 17,
+    UTF16_LE = 18,
+    UTF16_BE = 19,
+    UTF32_LE = 20,
+    UTF32_BE = 21
+};
+#define MACHINE_FORMAT_CODE_MIN 0
+#define MACHINE_FORMAT_CODE_MAX 21
+
+
+/*
+ * Must come after arrayobject, arrayiterobject,
+ * and enum machine_code_type definitions.
+ */
 #include "clinic/arraymodule.c.h"
 
 #define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
@@ -1712,45 +1755,6 @@
 
 /*********************** Pickling support ************************/
 
-enum machine_format_code {
-    UNKNOWN_FORMAT = -1,
-    /* UNKNOWN_FORMAT is used to indicate that the machine format for an
-     * array type code cannot be interpreted. When this occurs, a list of
-     * Python objects is used to represent the content of the array
-     * instead of using the memory content of the array directly. In that
-     * case, the array_reconstructor mechanism is bypassed completely, and
-     * the standard array constructor is used instead.
-     *
-     * This is will most likely occur when the machine doesn't use IEEE
-     * floating-point numbers.
-     */
-
-    UNSIGNED_INT8 = 0,
-    SIGNED_INT8 = 1,
-    UNSIGNED_INT16_LE = 2,
-    UNSIGNED_INT16_BE = 3,
-    SIGNED_INT16_LE = 4,
-    SIGNED_INT16_BE = 5,
-    UNSIGNED_INT32_LE = 6,
-    UNSIGNED_INT32_BE = 7,
-    SIGNED_INT32_LE = 8,
-    SIGNED_INT32_BE = 9,
-    UNSIGNED_INT64_LE = 10,
-    UNSIGNED_INT64_BE = 11,
-    SIGNED_INT64_LE = 12,
-    SIGNED_INT64_BE = 13,
-    IEEE_754_FLOAT_LE = 14,
-    IEEE_754_FLOAT_BE = 15,
-    IEEE_754_DOUBLE_LE = 16,
-    IEEE_754_DOUBLE_BE = 17,
-    UTF16_LE = 18,
-    UTF16_BE = 19,
-    UTF32_LE = 20,
-    UTF32_BE = 21
-};
-#define MACHINE_FORMAT_CODE_MIN 0
-#define MACHINE_FORMAT_CODE_MAX 21
-
 static const struct mformatdescr {
     size_t size;
     int is_signed;
@@ -1939,13 +1943,12 @@
 [clinic start generated code]*/
 
 static PyObject *
-array__array_reconstructor_impl(PyModuleDef *module, PyTypeObject *arraytype, int typecode, int mformat_code, PyObject *items)
-/*[clinic end generated code: output=a0a4ab61c2fbc17a input=450d59a5373c4eea]*/
+array__array_reconstructor_impl(PyModuleDef *module, PyTypeObject *arraytype, int typecode, enum machine_format_code mformat_code, PyObject *items)
+/*[clinic end generated code: output=c51081ec91caf7e9 input=f72492708c0a1d50]*/
 {
     PyObject *converted_items;
     PyObject *result;
     struct arraydescr *descr;
-    enum machine_format_code mformat_code_enum = mformat_code;
 
     if (!PyType_Check(arraytype)) {
         PyErr_Format(PyExc_TypeError,
@@ -1968,8 +1971,8 @@
                         "second argument must be a valid type code");
         return NULL;
     }
-    if (mformat_code_enum < MACHINE_FORMAT_CODE_MIN ||
-        mformat_code_enum > MACHINE_FORMAT_CODE_MAX) {
+    if (mformat_code < MACHINE_FORMAT_CODE_MIN ||
+        mformat_code > MACHINE_FORMAT_CODE_MAX) {
         PyErr_SetString(PyExc_ValueError,
             "third argument must be a valid machine format code.");
         return NULL;
@@ -1982,8 +1985,8 @@
     }
 
     /* Fast path: No decoding has to be done. */
-    if (mformat_code_enum == typecode_to_mformat_code((char)typecode) ||
-        mformat_code_enum == UNKNOWN_FORMAT) {
+    if (mformat_code == typecode_to_mformat_code((char)typecode) ||
+        mformat_code == UNKNOWN_FORMAT) {
         return make_array(arraytype, (char)typecode, items);
     }
 
@@ -1992,16 +1995,16 @@
      * object is architecturally different from the one that pickled the
      * array.
      */
-    if (Py_SIZE(items) % mformat_descriptors[mformat_code_enum].size != 0) {
+    if (Py_SIZE(items) % mformat_descriptors[mformat_code].size != 0) {
         PyErr_SetString(PyExc_ValueError,
                         "string length not a multiple of item size");
         return NULL;
     }
-    switch (mformat_code_enum) {
+    switch (mformat_code) {
     case IEEE_754_FLOAT_LE:
     case IEEE_754_FLOAT_BE: {
         int i;
-        int le = (mformat_code_enum == IEEE_754_FLOAT_LE) ? 1 : 0;
+        int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0;
         Py_ssize_t itemcount = Py_SIZE(items) / 4;
         const unsigned char *memstr =
             (unsigned char *)PyBytes_AS_STRING(items);
@@ -2023,7 +2026,7 @@
     case IEEE_754_DOUBLE_LE:
     case IEEE_754_DOUBLE_BE: {
         int i;
-        int le = (mformat_code_enum == IEEE_754_DOUBLE_LE) ? 1 : 0;
+        int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0;
         Py_ssize_t itemcount = Py_SIZE(items) / 8;
         const unsigned char *memstr =
             (unsigned char *)PyBytes_AS_STRING(items);
@@ -2044,7 +2047,7 @@
     }
     case UTF16_LE:
     case UTF16_BE: {
-        int byteorder = (mformat_code_enum == UTF16_LE) ? -1 : 1;
+        int byteorder = (mformat_code == UTF16_LE) ? -1 : 1;
         converted_items = PyUnicode_DecodeUTF16(
             PyBytes_AS_STRING(items), Py_SIZE(items),
             "strict", &byteorder);
@@ -2054,7 +2057,7 @@
     }
     case UTF32_LE:
     case UTF32_BE: {
-        int byteorder = (mformat_code_enum == UTF32_LE) ? -1 : 1;
+        int byteorder = (mformat_code == UTF32_LE) ? -1 : 1;
         converted_items = PyUnicode_DecodeUTF32(
             PyBytes_AS_STRING(items), Py_SIZE(items),
             "strict", &byteorder);
@@ -2079,7 +2082,7 @@
     case SIGNED_INT64_BE: {
         int i;
         const struct mformatdescr mf_descr =
-            mformat_descriptors[mformat_code_enum];
+            mformat_descriptors[mformat_code];
         Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size;
         const unsigned char *memstr =
             (unsigned char *)PyBytes_AS_STRING(items);
diff --git a/Modules/clinic/arraymodule.c.h b/Modules/clinic/arraymodule.c.h
--- a/Modules/clinic/arraymodule.c.h
+++ b/Modules/clinic/arraymodule.c.h
@@ -446,7 +446,7 @@
     {"_array_reconstructor", (PyCFunction)array__array_reconstructor, METH_VARARGS, array__array_reconstructor__doc__},
 
 static PyObject *
-array__array_reconstructor_impl(PyModuleDef *module, PyTypeObject *arraytype, int typecode, int mformat_code, PyObject *items);
+array__array_reconstructor_impl(PyModuleDef *module, PyTypeObject *arraytype, int typecode, enum machine_format_code mformat_code, PyObject *items);
 
 static PyObject *
 array__array_reconstructor(PyModuleDef *module, PyObject *args)
@@ -454,7 +454,7 @@
     PyObject *return_value = NULL;
     PyTypeObject *arraytype;
     int typecode;
-    int mformat_code;
+    enum machine_format_code mformat_code;
     PyObject *items;
 
     if (!PyArg_ParseTuple(args,
@@ -502,4 +502,4 @@
 
 #define ARRAY_ARRAYITERATOR___SETSTATE___METHODDEF    \
     {"__setstate__", (PyCFunction)array_arrayiterator___setstate__, METH_O, array_arrayiterator___setstate____doc__},
-/*[clinic end generated code: output=dff8eae01f0ab208 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=e1deb61c6a3bc8c8 input=a9049054013a1b77]*/
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -1819,7 +1819,7 @@
 
 static PyObject *
 bytes_translate_impl(PyBytesObject *self, PyObject *table, int group_right_1, PyObject *deletechars)
-/*[clinic end generated code: output=f0f29a57f41df5d8 input=a90fad893c3c88d7]*/
+/*[clinic end generated code: output=f0f29a57f41df5d8 input=d8fa5519d7cc4be7]*/
 {
     char *input, *output;
     const char *table_chars;
diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -2426,11 +2426,13 @@
     format_unit = 'i'
     c_ignored_default = "0"
 
-    def converter_init(self, *, types='int'):
+    def converter_init(self, *, types='int', type=None):
         if types == 'str':
             self.format_unit = 'C'
         elif types != 'int':
             fail("int_converter: illegal 'types' argument")
+        if type != None:
+            self.type = type
 
 class unsigned_int_converter(CConverter):
     type = 'unsigned int'

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


More information about the Python-checkins mailing list