]> granicus.if.org Git - python/commitdiff
Issue #10359: Use Py_UNICODE for the typecode in array
authorVictor Stinner <victor.stinner@haypocalc.com>
Tue, 9 Nov 2010 09:38:30 +0000 (09:38 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Tue, 9 Nov 2010 09:38:30 +0000 (09:38 +0000)
And don't create non constant array, invalid in ISO C.

Modules/arraymodule.c

index 6ece49ff2a62bdee69944e22f94751a61b0c3e0b..a4ce80d781c6ca36b38595bac999d3317ebf39bf 100644 (file)
@@ -22,7 +22,7 @@ struct arrayobject; /* Forward */
  * functions aren't visible yet.
  */
 struct arraydescr {
-    int typecode;
+    Py_UNICODE typecode;
     int itemsize;
     PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
     int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
@@ -1428,7 +1428,7 @@ representation.");
 static PyObject *
 array_tostring(arrayobject *self, PyObject *unused)
 {
-    if (PyErr_WarnEx(PyExc_DeprecationWarning, 
+    if (PyErr_WarnEx(PyExc_DeprecationWarning,
             "tostring() is deprecated. Use tobytes() instead.", 2) != 0)
         return NULL;
     return array_tobytes(self, unused);
@@ -1680,17 +1680,16 @@ static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
  * NULL is returned to indicate a failure.
  */
 static PyObject *
-make_array(PyTypeObject *arraytype, int typecode, PyObject *items)
+make_array(PyTypeObject *arraytype, Py_UNICODE typecode, PyObject *items)
 {
     PyObject *new_args;
     PyObject *array_obj;
     PyObject *typecode_obj;
-    Py_UNICODE typecode_str[1] = {typecode};
 
     assert(arraytype != NULL);
     assert(items != NULL);
 
-    typecode_obj = PyUnicode_FromUnicode(typecode_str, 1);
+    typecode_obj = PyUnicode_FromUnicode(&typecode, 1);
     if (typecode_obj == NULL)
         return NULL;
 
@@ -1720,14 +1719,17 @@ array_reconstructor(PyObject *self, PyObject *args)
     PyObject *items;
     PyObject *converted_items;
     PyObject *result;
-    int typecode;
+    int typecode_int;
+    Py_UNICODE typecode;
     enum machine_format_code mformat_code;
     struct arraydescr *descr;
 
     if (!PyArg_ParseTuple(args, "OCiO:array._array_reconstructor",
-                    &arraytype, &typecode, &mformat_code, &items))
+                    &arraytype, &typecode_int, &mformat_code, &items))
         return NULL;
 
+    typecode = (Py_UNICODE)typecode_int;
+
     if (!PyType_Check(arraytype)) {
         PyErr_Format(PyExc_TypeError,
             "first argument must a type object, not %.200s",