Mercurial > cpython-lru_cache-weakref
comparison Modules/arraymodule.c @ 47672:5ebcdeb0cb26 legacy-trunk
Fix some memory dealloc problems when exceptions occur.
It caused: "Fatal Python error: UNREF invalid object" in the DoubleTest.
| author | Neal Norwitz <nnorwitz@gmail.com> |
|---|---|
| date | Fri, 13 Jun 2008 06:02:26 +0000 |
| parents | 1c964ed35ef9 |
| children | a35da94e05fc |
comparison
equal
deleted
inserted
replaced
| 47671:e30af3264a0f | 47672:5ebcdeb0cb26 |
|---|---|
| 430 } | 430 } |
| 431 op = (arrayobject *) type->tp_alloc(type, 0); | 431 op = (arrayobject *) type->tp_alloc(type, 0); |
| 432 if (op == NULL) { | 432 if (op == NULL) { |
| 433 return NULL; | 433 return NULL; |
| 434 } | 434 } |
| 435 op->ob_descr = descr; | |
| 436 op->allocated = size; | |
| 437 op->weakreflist = NULL; | |
| 435 Py_SIZE(op) = size; | 438 Py_SIZE(op) = size; |
| 436 if (size <= 0) { | 439 if (size <= 0) { |
| 437 op->ob_item = NULL; | 440 op->ob_item = NULL; |
| 438 } | 441 } |
| 439 else { | 442 else { |
| 440 op->ob_item = PyMem_NEW(char, nbytes); | 443 op->ob_item = PyMem_NEW(char, nbytes); |
| 441 if (op->ob_item == NULL) { | 444 if (op->ob_item == NULL) { |
| 442 PyObject_Del(op); | 445 Py_DECREF(op); |
| 443 return PyErr_NoMemory(); | 446 return PyErr_NoMemory(); |
| 444 } | 447 } |
| 445 } | 448 } |
| 446 op->ob_descr = descr; | |
| 447 op->allocated = size; | |
| 448 op->weakreflist = NULL; | |
| 449 return (PyObject *) op; | 449 return (PyObject *) op; |
| 450 } | 450 } |
| 451 | 451 |
| 452 static PyObject * | 452 static PyObject * |
| 453 getarrayitem(PyObject *op, Py_ssize_t i) | 453 getarrayitem(PyObject *op, Py_ssize_t i) |
| 824 "can only extend with array of same kind"); | 824 "can only extend with array of same kind"); |
| 825 return -1; | 825 return -1; |
| 826 } | 826 } |
| 827 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) || | 827 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) || |
| 828 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) { | 828 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) { |
| 829 PyErr_NoMemory(); | 829 PyErr_NoMemory(); |
| 830 return -1; | 830 return -1; |
| 831 } | 831 } |
| 832 size = Py_SIZE(self) + Py_SIZE(b); | 832 size = Py_SIZE(self) + Py_SIZE(b); |
| 833 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize); | 833 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize); |
| 834 if (self->ob_item == NULL) { | 834 if (self->ob_item == NULL) { |
| 835 PyObject_Del(self); | 835 PyErr_NoMemory(); |
| 836 PyErr_NoMemory(); | |
| 837 return -1; | 836 return -1; |
| 838 } | 837 } |
| 839 memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize, | 838 memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize, |
| 840 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize); | 839 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize); |
| 841 Py_SIZE(self) = size; | 840 Py_SIZE(self) = size; |
