comparison Modules/arraymodule.c @ 67539:ec96b5b5723b 2.7

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. ........
author Alexander Belopolsky <alexander.belopolsky@gmail.com>
date Tue, 11 Jan 2011 22:16:24 +0000
parents b906e9e5f2a7
children 1b1a64297149
comparison
equal deleted inserted replaced
67532:f827f703ef65 67539:ec96b5b5723b
1923 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial)) 1923 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1924 return NULL; 1924 return NULL;
1925 1925
1926 if (!(initial == NULL || PyList_Check(initial) 1926 if (!(initial == NULL || PyList_Check(initial)
1927 || PyString_Check(initial) || PyTuple_Check(initial) 1927 || PyString_Check(initial) || PyTuple_Check(initial)
1928 || (c == 'u' && PyUnicode_Check(initial)))) { 1928 || PyTuple_Check(initial)
1929 || ((c=='u') && PyUnicode_Check(initial))
1930 || (array_Check(initial)
1931 && c == ((arrayobject*)initial)->ob_descr->typecode))) {
1929 it = PyObject_GetIter(initial); 1932 it = PyObject_GetIter(initial);
1930 if (it == NULL) 1933 if (it == NULL)
1931 return NULL; 1934 return NULL;
1932 /* We set initial to NULL so that the subsequent code 1935 /* We set initial to NULL so that the subsequent code
1933 will create an empty array of the appropriate type 1936 will create an empty array of the appropriate type
1939 for (descr = descriptors; descr->typecode != '\0'; descr++) { 1942 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1940 if (descr->typecode == c) { 1943 if (descr->typecode == c) {
1941 PyObject *a; 1944 PyObject *a;
1942 Py_ssize_t len; 1945 Py_ssize_t len;
1943 1946
1944 if (initial == NULL || !(PyList_Check(initial) 1947 if (initial == NULL)
1945 || PyTuple_Check(initial)))
1946 len = 0; 1948 len = 0;
1949 else if (PyList_Check(initial))
1950 len = PyList_GET_SIZE(initial);
1951 else if (PyTuple_Check(initial) || array_Check(initial))
1952 len = Py_SIZE(initial);
1947 else 1953 else
1948 len = PySequence_Size(initial); 1954 len = 0;
1949 1955
1950 a = newarrayobject(type, len, descr); 1956 a = newarrayobject(type, len, descr);
1951 if (a == NULL) 1957 if (a == NULL)
1952 return NULL; 1958 return NULL;
1953 1959
1954 if (len > 0) { 1960 if (len > 0 && !array_Check(initial)) {
1955 Py_ssize_t i; 1961 Py_ssize_t i;
1956 for (i = 0; i < len; i++) { 1962 for (i = 0; i < len; i++) {
1957 PyObject *v = 1963 PyObject *v =
1958 PySequence_GetItem(initial, i); 1964 PySequence_GetItem(initial, i);
1959 if (v == NULL) { 1965 if (v == NULL) {
1999 memcpy(item, PyUnicode_AS_DATA(initial), n); 2005 memcpy(item, PyUnicode_AS_DATA(initial), n);
2000 self->allocated = Py_SIZE(self); 2006 self->allocated = Py_SIZE(self);
2001 } 2007 }
2002 #endif 2008 #endif
2003 } 2009 }
2010 else if (initial != NULL && array_Check(initial)) {
2011 arrayobject *self = (arrayobject *)a;
2012 arrayobject *other = (arrayobject *)initial;
2013 memcpy(self->ob_item, other->ob_item, len * other->ob_descr->itemsize);
2014 }
2004 if (it != NULL) { 2015 if (it != NULL) {
2005 if (array_iter_extend((arrayobject *)a, it) == -1) { 2016 if (array_iter_extend((arrayobject *)a, it) == -1) {
2006 Py_DECREF(it); 2017 Py_DECREF(it);
2007 Py_DECREF(a); 2018 Py_DECREF(a);
2008 return NULL; 2019 return NULL;