]> granicus.if.org Git - python/commitdiff
* Simplify and speed-up list_resize(). Relying on the newly documented
authorRaymond Hettinger <python@rcn.com>
Thu, 29 Jul 2004 23:31:29 +0000 (23:31 +0000)
committerRaymond Hettinger <python@rcn.com>
Thu, 29 Jul 2004 23:31:29 +0000 (23:31 +0000)
  invariants allows the ob_item != NULL check to be replaced with an
  assertion.

* Added assertions to list_init() which document and verify that the
  tp_new slot establishes the invariants.  This may preclude a future
  bug if a custom tp_new slot is written.

Objects/listobject.c

index 452ffe5a5c3c4e178a3ac5d73c67a45d3dcfc705..61edd45f3b0b1012d877c7cd2a6fdffb2abc306e 100644 (file)
@@ -19,9 +19,8 @@ list_resize(PyListObject *self, int newsize)
           current size, then proceed with the realloc() to shrink the list.
        */
 
-       if (self->allocated >= newsize &&
-           self->ob_size < newsize + 16 &&
-           self->ob_item != NULL) {
+       if (self->allocated >= newsize && self->ob_size < newsize + 16) {
+               assert(self->ob_item != NULL || newsize == 0);
                self->ob_size = newsize;
                return 0;
        }
@@ -2314,6 +2313,11 @@ list_init(PyListObject *self, PyObject *args, PyObject *kw)
 
        if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
                return -1;
+
+       /* Verify list invariants established by PyType_GenericAlloc() */
+       assert(0 <= self->ob_size  &&  self->ob_size <= self->allocated);
+       assert(self->ob_item != NULL  ||  self->allocated == 0);
+
        /* Empty previous contents */
        if (self->ob_item != NULL) {
                (void)list_clear(self);