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;