Mercurial > cpython-lru_cache-weakref
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; |
