[Python-checkins] r87944 - in python/branches/release27-maint: Lib/test/test_array.py Misc/NEWS Modules/arraymodule.c

alexander.belopolsky python-checkins at python.org
Tue Jan 11 23:16:24 CET 2011


Author: alexander.belopolsky
Date: Tue Jan 11 23:16:24 2011
New Revision: 87944

Log:
Merged revisions 87942 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r87942 | alexander.belopolsky | 2011-01-11 16:44:00 -0500 (Tue, 11 Jan 2011) | 3 lines
  
  Issue #5109: array.array constructor will now use fast code when
  initial data is provided in an array object with correct type.
........


Modified:
   python/branches/release27-maint/   (props changed)
   python/branches/release27-maint/Lib/test/test_array.py
   python/branches/release27-maint/Misc/NEWS
   python/branches/release27-maint/Modules/arraymodule.c

Modified: python/branches/release27-maint/Lib/test/test_array.py
==============================================================================
--- python/branches/release27-maint/Lib/test/test_array.py	(original)
+++ python/branches/release27-maint/Lib/test/test_array.py	Tue Jan 11 23:16:24 2011
@@ -239,6 +239,11 @@
         if a.itemsize>1:
             self.assertRaises(ValueError, b.fromstring, "x")
 
+    def test_fromarray(self):
+        a = array.array(self.typecode, self.example)
+        b = array.array(self.typecode, a)
+        self.assertEqual(a, b)
+
     def test_repr(self):
         a = array.array(self.typecode, 2*self.example)
         self.assertEqual(a, eval(repr(a), {"array": array.array}))
@@ -958,6 +963,11 @@
 
         self.assertRaises(AttributeError, setattr, a, "color", "blue")
 
+    def test_frombytearray(self):
+        a = array.array('b', range(10))
+        b = array.array(self.typecode, a)
+        self.assertEqual(a, b)
+
 class SignedNumberTest(NumberTest):
     example = [-1, 0, 1, 42, 0x7f]
     smallerexample = [-1, 0, 1, 42, 0x7e]

Modified: python/branches/release27-maint/Misc/NEWS
==============================================================================
--- python/branches/release27-maint/Misc/NEWS	(original)
+++ python/branches/release27-maint/Misc/NEWS	Tue Jan 11 23:16:24 2011
@@ -973,6 +973,9 @@
 Extension Modules
 -----------------
 
+- Issue #5109: array.array constructor will now use fast code when
+  initial data is provided in an array object with correct type.
+
 - Issue #7384: If the system readline library is linked against ncurses,
   the curses module must be linked against ncurses as well. Otherwise it
   is not safe to load both the readline and curses modules in an application.

Modified: python/branches/release27-maint/Modules/arraymodule.c
==============================================================================
--- python/branches/release27-maint/Modules/arraymodule.c	(original)
+++ python/branches/release27-maint/Modules/arraymodule.c	Tue Jan 11 23:16:24 2011
@@ -1925,7 +1925,10 @@
 
     if (!(initial == NULL || PyList_Check(initial)
           || PyString_Check(initial) || PyTuple_Check(initial)
-          || (c == 'u' && PyUnicode_Check(initial)))) {
+          || PyTuple_Check(initial)
+          || ((c=='u') && PyUnicode_Check(initial))
+          || (array_Check(initial)
+              && c == ((arrayobject*)initial)->ob_descr->typecode))) {
         it = PyObject_GetIter(initial);
         if (it == NULL)
             return NULL;
@@ -1941,17 +1944,20 @@
             PyObject *a;
             Py_ssize_t len;
 
-            if (initial == NULL || !(PyList_Check(initial)
-                || PyTuple_Check(initial)))
+            if (initial == NULL)
                 len = 0;
+            else if (PyList_Check(initial))
+                len = PyList_GET_SIZE(initial);
+            else if (PyTuple_Check(initial) || array_Check(initial))
+                len = Py_SIZE(initial);
             else
-                len = PySequence_Size(initial);
+                len = 0;
 
             a = newarrayobject(type, len, descr);
             if (a == NULL)
                 return NULL;
 
-            if (len > 0) {
+            if (len > 0 && !array_Check(initial)) {
                 Py_ssize_t i;
                 for (i = 0; i < len; i++) {
                     PyObject *v =
@@ -2001,6 +2007,11 @@
                 }
 #endif
             }
+            else if (initial != NULL && array_Check(initial)) {
+                arrayobject *self = (arrayobject *)a;
+                arrayobject *other = (arrayobject *)initial;
+                memcpy(self->ob_item, other->ob_item, len * other->ob_descr->itemsize);
+            }
             if (it != NULL) {
                 if (array_iter_extend((arrayobject *)a, it) == -1) {
                     Py_DECREF(it);


More information about the Python-checkins mailing list