diff Modules/arraymodule.c @ 72543:8b4828bcd67a

Fix array.array('u') constructor
author Victor Stinner <victor.stinner@haypocalc.com>
date Fri, 30 Sep 2011 01:54:04 +0200
parents 7fa098f6dc6a
children e88fc377f961
line wrap: on
line diff
--- a/Modules/arraymodule.c	Fri Sep 30 01:44:27 2011 +0200
+++ b/Modules/arraymodule.c	Fri Sep 30 01:54:04 2011 +0200
@@ -2529,19 +2529,25 @@
                 Py_DECREF(v);
             }
             else if (initial != NULL && PyUnicode_Check(initial))  {
-                Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
+                Py_ssize_t n;
+                if (PyUnicode_READY(initial)) {
+                    Py_DECREF(a);
+                    return NULL;
+                }
+                n = PyUnicode_GET_LENGTH(initial);
                 if (n > 0) {
                     arrayobject *self = (arrayobject *)a;
-                    char *item = self->ob_item;
-                    item = (char *)PyMem_Realloc(item, n);
+                    Py_UCS4 *item = (Py_UCS4 *)self->ob_item;
+                    item = (char *)PyMem_Realloc(item, n * sizeof(Py_UCS4));
                     if (item == NULL) {
                         PyErr_NoMemory();
                         Py_DECREF(a);
                         return NULL;
                     }
-                    self->ob_item = item;
-                    Py_SIZE(self) = n / sizeof(Py_UCS4);
-                    memcpy(item, PyUnicode_AS_DATA(initial), n);
+                    self->ob_item = (char*)item;
+                    Py_SIZE(self) = n;
+                    if (!PyUnicode_AsUCS4(initial, item, n, 0))
+                        return NULL;
                     self->allocated = Py_SIZE(self);
                 }
             }