Merged revisions 56467-56482 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk

................
  r56477 | martin.v.loewis | 2007-07-21 09:04:38 +0200 (Sa, 21 Jul 2007) | 11 lines

  Merged revisions 56466-56476 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk

  ........
    r56476 | martin.v.loewis | 2007-07-21 08:55:02 +0200 (Sa, 21 Jul 2007) | 4 lines

    PEP 3123: Provide forward compatibility with Python 3.0, while keeping
    backwards compatibility. Add Py_Refcnt, Py_Type, Py_Size, and
    PyVarObject_HEAD_INIT.
  ........
................
  r56478 | martin.v.loewis | 2007-07-21 09:47:23 +0200 (Sa, 21 Jul 2007) | 2 lines

  PEP 3123: Use proper C inheritance for PyObject.
................
  r56479 | martin.v.loewis | 2007-07-21 10:06:55 +0200 (Sa, 21 Jul 2007) | 3 lines

  Add longintrepr.h to Python.h, so that the compiler can
  see that PyFalse is really some kind of PyObject*.
................
  r56480 | martin.v.loewis | 2007-07-21 10:47:18 +0200 (Sa, 21 Jul 2007) | 2 lines

  Qualify SHIFT, MASK, BASE.
................
  r56482 | martin.v.loewis | 2007-07-21 19:10:57 +0200 (Sa, 21 Jul 2007) | 2 lines

  Correctly refer to _ob_next.
................
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index ad5f4fe..31db95f 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -25,7 +25,7 @@
     if (nullbytes == NULL)
         return 0;
     nullbytes->ob_bytes = NULL;
-    nullbytes->ob_size = nullbytes->ob_alloc = 0;
+    Py_Size(nullbytes) = nullbytes->ob_alloc = 0;
     return 1;
 }
 
@@ -51,7 +51,7 @@
 Py_ssize_t
 _getbuffer(PyObject *obj, void **ptr)
 {
-    PyBufferProcs *buffer = obj->ob_type->tp_as_buffer;
+    PyBufferProcs *buffer = Py_Type(obj)->tp_as_buffer;
 
     if (buffer == NULL ||
         PyUnicode_Check(obj) ||
@@ -142,7 +142,7 @@
     }
     else if (size < alloc) {
         /* Within allocated size; quick exit */
-        ((PyBytesObject *)self)->ob_size = size;
+        Py_Size(self) = size;
 	((PyBytesObject *)self)->ob_bytes[size] = '\0'; /* Trailing null byte */
         return 0;
     }
@@ -162,7 +162,7 @@
     }
 
     ((PyBytesObject *)self)->ob_bytes = sval;
-    ((PyBytesObject *)self)->ob_size = size;
+    Py_Size(self) = size;
     ((PyBytesObject *)self)->ob_alloc = alloc;
     ((PyBytesObject *)self)->ob_bytes[size] = '\0'; /* Trailing null byte */
 
@@ -180,7 +180,7 @@
     bsize = _getbuffer(b, &bptr);
     if (asize < 0 || bsize < 0) {
         PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
-                     a->ob_type->tp_name, b->ob_type->tp_name);
+                     Py_Type(a)->tp_name, Py_Type(b)->tp_name);
         return NULL;
     }
 
@@ -201,7 +201,7 @@
 static Py_ssize_t
 bytes_length(PyBytesObject *self)
 {
-    return self->ob_size;
+    return Py_Size(self);
 }
 
 static PyObject *
@@ -222,16 +222,16 @@
     osize = _getbuffer(other, &optr);
     if (osize < 0) {
         PyErr_Format(PyExc_TypeError,
-                     "can't concat bytes to %.100s", other->ob_type->tp_name);
+                     "can't concat bytes to %.100s", Py_Type(other)->tp_name);
         return NULL;
     }
 
-    mysize = self->ob_size;
+    mysize = Py_Size(self);
     size = mysize + osize;
     if (size < 0)
         return PyErr_NoMemory();
     if (size < self->ob_alloc) {
-        self->ob_size = size;
+        Py_Size(self) = size;
 	self->ob_bytes[self->ob_size] = '\0'; /* Trailing null byte */
     }
     else if (PyBytes_Resize((PyObject *)self, size) < 0)
@@ -250,7 +250,7 @@
 
     if (count < 0)
         count = 0;
-    mysize = self->ob_size;
+    mysize = Py_Size(self);
     size = mysize * count;
     if (count != 0 && size / count != mysize)
         return PyErr_NoMemory();
@@ -275,12 +275,12 @@
 
     if (count < 0)
         count = 0;
-    mysize = self->ob_size;
+    mysize = Py_Size(self);
     size = mysize * count;
     if (count != 0 && size / count != mysize)
         return PyErr_NoMemory();
     if (size < self->ob_alloc) {
-        self->ob_size = size;
+        Py_Size(self) = size;
 	self->ob_bytes[self->ob_size] = '\0'; /* Trailing null byte */
     }
     else if (PyBytes_Resize((PyObject *)self, size) < 0)
@@ -303,15 +303,15 @@
 {
     Py_ssize_t i;
 
-    if (other->ob_size == 1) {
+    if (Py_Size(other) == 1) {
         return memchr(self->ob_bytes, other->ob_bytes[0],
-                      self->ob_size) != NULL;
+                      Py_Size(self)) != NULL;
     }
-    if (other->ob_size == 0)
+    if (Py_Size(other) == 0)
         return 1; /* Edge case */
-    for (i = 0; i + other->ob_size <= self->ob_size; i++) {
+    for (i = 0; i + Py_Size(other) <= Py_Size(self); i++) {
         /* XXX Yeah, yeah, lots of optimizations possible... */
-        if (memcmp(self->ob_bytes + i, other->ob_bytes, other->ob_size) == 0)
+        if (memcmp(self->ob_bytes + i, other->ob_bytes, Py_Size(other)) == 0)
             return 1;
     }
     return 0;
@@ -333,15 +333,15 @@
         return -1;
     }
 
-    return memchr(self->ob_bytes, ival, self->ob_size) != NULL;
+    return memchr(self->ob_bytes, ival, Py_Size(self)) != NULL;
 }
 
 static PyObject *
 bytes_getitem(PyBytesObject *self, Py_ssize_t i)
 {
     if (i < 0)
-        i += self->ob_size;
-    if (i < 0 || i >= self->ob_size) {
+        i += Py_Size(self);
+    if (i < 0 || i >= Py_Size(self)) {
         PyErr_SetString(PyExc_IndexError, "bytes index out of range");
         return NULL;
     }
@@ -360,7 +360,7 @@
         if (i < 0)
             i += PyBytes_GET_SIZE(self);
 
-        if (i < 0 || i >= self->ob_size) {
+        if (i < 0 || i >= Py_Size(self)) {
             PyErr_SetString(PyExc_IndexError, "bytes index out of range");
             return NULL;
         }
@@ -430,7 +430,7 @@
         if (needed < 0) {
             PyErr_Format(PyExc_TypeError,
                          "can't set bytes slice from %.100s",
-                         values->ob_type->tp_name);
+                         Py_Type(values)->tp_name);
             return -1;
         }
     }
@@ -439,8 +439,8 @@
         lo = 0;
     if (hi < lo)
         hi = lo;
-    if (hi > self->ob_size)
-        hi = self->ob_size;
+    if (hi > Py_Size(self))
+        hi = Py_Size(self);
 
     avail = hi - lo;
     if (avail < 0)
@@ -455,10 +455,10 @@
               0   lo      new_hi              new_size
             */
             memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi,
-                    self->ob_size - hi);
+                    Py_Size(self) - hi);
         }
         if (PyBytes_Resize((PyObject *)self,
-                           self->ob_size + needed - avail) < 0)
+                           Py_Size(self) + needed - avail) < 0)
             return -1;
         if (avail < needed) {
             /*
@@ -468,7 +468,7 @@
               0   lo            new_hi              new_size
              */
             memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi,
-                    self->ob_size - lo - needed);
+                    Py_Size(self) - lo - needed);
         }
     }
 
@@ -484,9 +484,9 @@
     Py_ssize_t ival;
 
     if (i < 0)
-        i += self->ob_size;
+        i += Py_Size(self);
 
-    if (i < 0 || i >= self->ob_size) {
+    if (i < 0 || i >= Py_Size(self)) {
         PyErr_SetString(PyExc_IndexError, "bytes index out of range");
         return -1;
     }
@@ -522,7 +522,7 @@
         if (i < 0)
             i += PyBytes_GET_SIZE(self);
 
-        if (i < 0 || i >= self->ob_size) {
+        if (i < 0 || i >= Py_Size(self)) {
             PyErr_SetString(PyExc_IndexError, "bytes index out of range");
             return -1;
         }
@@ -576,7 +576,7 @@
     else {
         assert(PyBytes_Check(values));
         bytes = ((PyBytesObject *)values)->ob_bytes;
-        needed = ((PyBytesObject *)values)->ob_size;
+        needed = Py_Size(values);
     }
     /* Make sure b[5:2] = ... inserts before 5, not before 2. */
     if ((step < 0 && start < stop) ||
@@ -592,10 +592,10 @@
                   0   lo      new_hi              new_size
                 */
                 memmove(self->ob_bytes + start + needed, self->ob_bytes + stop,
-                        self->ob_size - stop);
+                        Py_Size(self) - stop);
             }
             if (PyBytes_Resize((PyObject *)self,
-                               self->ob_size + needed - slicelen) < 0)
+                               Py_Size(self) + needed - slicelen) < 0)
                 return -1;
             if (slicelen < needed) {
                 /*
@@ -605,7 +605,7 @@
                   0   lo            new_hi              new_size
                  */
                 memmove(self->ob_bytes + start + needed, self->ob_bytes + stop,
-                        self->ob_size - start - needed);
+                        Py_Size(self) - start - needed);
             }
         }
 
@@ -676,7 +676,7 @@
     PyObject *it;
     PyObject *(*iternext)(PyObject *);
 
-    if (self->ob_size != 0) {
+    if (Py_Size(self) != 0) {
         /* Empty previous contents (yes, do this first of all!) */
         if (PyBytes_Resize((PyObject *)self, 0) < 0)
             return -1;
@@ -708,7 +708,7 @@
         if (!PyBytes_Check(encoded) && !PyString_Check(encoded)) {
             PyErr_Format(PyExc_TypeError,
                 "encoder did not return a str8 or bytes object (type=%.400s)",
-                encoded->ob_type->tp_name);
+                Py_Type(encoded)->tp_name);
             Py_DECREF(encoded);
             return -1;
         }
@@ -761,7 +761,7 @@
     it = PyObject_GetIter(arg);
     if (it == NULL)
         return -1;
-    iternext = *it->ob_type->tp_iternext;
+    iternext = *Py_Type(it)->tp_iternext;
 
     /* Run the iterator to exhaustion */
     for (;;) {
@@ -793,11 +793,11 @@
         }
 
         /* Append the byte */
-        if (self->ob_size < self->ob_alloc)
-            self->ob_size++;
-        else if (PyBytes_Resize((PyObject *)self, self->ob_size+1) < 0)
+        if (Py_Size(self) < self->ob_alloc)
+            Py_Size(self)++;
+        else if (PyBytes_Resize((PyObject *)self, Py_Size(self)+1) < 0)
             goto error;
-        self->ob_bytes[self->ob_size-1] = value;
+        self->ob_bytes[Py_Size(self)-1] = value;
     }
 
     /* Clean up and return success */
@@ -818,7 +818,7 @@
     static const char *hexdigits = "0123456789abcdef";
     size_t newsize = 3 + 4 * self->ob_size;
     PyObject *v;
-    if (newsize > PY_SSIZE_T_MAX || newsize / 4 != self->ob_size) {
+    if (newsize > PY_SSIZE_T_MAX || newsize / 4 != Py_Size(self)) {
         PyErr_SetString(PyExc_OverflowError,
             "bytes object is too large to make repr");
         return NULL;
@@ -836,7 +836,7 @@
         p = PyUnicode_AS_UNICODE(v);
         *p++ = 'b';
         *p++ = quote;
-        for (i = 0; i < self->ob_size; i++) {
+        for (i = 0; i < Py_Size(self); i++) {
             /* There's at least enough room for a hex escape
                and a closing quote. */
             assert(newsize - (p - PyUnicode_AS_UNICODE(v)) >= 5);
@@ -874,7 +874,7 @@
 static PyObject *
 bytes_str(PyBytesObject *self)
 {
-    return PyString_FromStringAndSize(self->ob_bytes, self->ob_size);
+    return PyString_FromStringAndSize(self->ob_bytes, Py_Size(self));
 }
 
 static PyObject *
@@ -941,7 +941,7 @@
     if (self->ob_bytes != 0) {
         PyMem_Free(self->ob_bytes);
     }
-    self->ob_type->tp_free((PyObject *)self);
+    Py_Type(self)->tp_free((PyObject *)self);
 }
 
 static Py_ssize_t
@@ -956,14 +956,14 @@
         *ptr = "";
     else
         *ptr = self->ob_bytes;
-    return self->ob_size;
+    return Py_Size(self);
 }
 
 static Py_ssize_t
 bytes_getsegcount(PyStringObject *self, Py_ssize_t *lenp)
 {
     if (lenp)
-        *lenp = self->ob_size;
+        *lenp = Py_Size(self);
     return 1;
 }
 
@@ -2043,7 +2043,7 @@
     count++; }
 
 /* Always force the list to the expected size. */
-#define FIX_PREALLOC_SIZE(list) ((PyListObject *)list)->ob_size = count
+#define FIX_PREALLOC_SIZE(list) Py_Size(list) = count
 
 
 Py_LOCAL_INLINE(PyObject *)
@@ -2307,7 +2307,7 @@
 static PyObject *
 bytes_extend(PyBytesObject *self, PyObject *arg)
 {
-    if (bytes_setslice(self, self->ob_size, self->ob_size, arg) == -1)
+    if (bytes_setslice(self, Py_Size(self), Py_Size(self), arg) == -1)
         return NULL;
     Py_RETURN_NONE;
 }
@@ -2321,7 +2321,7 @@
 bytes_reverse(PyBytesObject *self, PyObject *unused)
 {
     char swap, *head, *tail;
-    Py_ssize_t i, j, n = self->ob_size;
+    Py_ssize_t i, j, n = Py_Size(self);
 
     j = n / 2;
     head = self->ob_bytes;
@@ -2343,7 +2343,7 @@
 bytes_insert(PyBytesObject *self, PyObject *args)
 {
     int value;
-    Py_ssize_t where, n = self->ob_size;
+    Py_ssize_t where, n = Py_Size(self);
 
     if (!PyArg_ParseTuple(args, "ni:insert", &where, &value))
         return NULL;
@@ -2382,7 +2382,7 @@
 bytes_append(PyBytesObject *self, PyObject *arg)
 {
     int value;
-    Py_ssize_t n = self->ob_size;
+    Py_ssize_t n = Py_Size(self);
 
     if (! _getbytevalue(arg, &value))
         return NULL;
@@ -2408,7 +2408,7 @@
 bytes_pop(PyBytesObject *self, PyObject *args)
 {
     int value;
-    Py_ssize_t where = -1, n = self->ob_size;
+    Py_ssize_t where = -1, n = Py_Size(self);
 
     if (!PyArg_ParseTuple(args, "|n:pop", &where))
         return NULL;
@@ -2419,8 +2419,8 @@
         return NULL;
     }
     if (where < 0)
-        where += self->ob_size;
-    if (where < 0 || where >= self->ob_size) {
+        where += Py_Size(self);
+    if (where < 0 || where >= Py_Size(self)) {
         PyErr_SetString(PyExc_IndexError, "pop index out of range");
         return NULL;
     }
@@ -2441,7 +2441,7 @@
 bytes_remove(PyBytesObject *self, PyObject *arg)
 {
     int value;
-    Py_ssize_t where, n = self->ob_size;
+    Py_ssize_t where, n = Py_Size(self);
 
     if (! _getbytevalue(arg, &value))
         return NULL;
@@ -2498,9 +2498,9 @@
         return NULL;
     }
     myptr = self->ob_bytes;
-    mysize = self->ob_size;
+    mysize = Py_Size(self);
     argptr = ((PyBytesObject *)arg)->ob_bytes;
-    argsize = ((PyBytesObject *)arg)->ob_size;
+    argsize = Py_Size(arg);
     left = lstrip_helper(myptr, mysize, argptr, argsize);
     right = rstrip_helper(myptr, mysize, argptr, argsize);
     return PyBytes_FromStringAndSize(self->ob_bytes + left, right - left);
@@ -2520,9 +2520,9 @@
         return NULL;
     }
     myptr = self->ob_bytes;
-    mysize = self->ob_size;
+    mysize = Py_Size(self);
     argptr = ((PyBytesObject *)arg)->ob_bytes;
-    argsize = ((PyBytesObject *)arg)->ob_size;
+    argsize = Py_Size(arg);
     left = lstrip_helper(myptr, mysize, argptr, argsize);
     right = mysize;
     return PyBytes_FromStringAndSize(self->ob_bytes + left, right - left);
@@ -2542,9 +2542,9 @@
         return NULL;
     }
     myptr = self->ob_bytes;
-    mysize = self->ob_size;
+    mysize = Py_Size(self);
     argptr = ((PyBytesObject *)arg)->ob_bytes;
-    argsize = ((PyBytesObject *)arg)->ob_size;
+    argsize = Py_Size(arg);
     left = 0;
     right = rstrip_helper(myptr, mysize, argptr, argsize);
     return PyBytes_FromStringAndSize(self->ob_bytes + left, right - left);
@@ -2616,7 +2616,7 @@
                          "can only join an iterable of bytes "
                          "(item %ld has type '%.100s')",
                          /* XXX %ld isn't right on Win64 */
-                         (long)i, obj->ob_type->tp_name);
+                         (long)i, Py_Type(obj)->tp_name);
             goto error;
         }
         if (i > 0)
@@ -2725,7 +2725,7 @@
 bytes_reduce(PyBytesObject *self)
 {
     return Py_BuildValue("(O(s#s))",
-                         self->ob_type,
+                         Py_Type(self),
                          self->ob_bytes == NULL ? "" : self->ob_bytes,
                          self->ob_size,
                          "latin-1");
@@ -2799,8 +2799,7 @@
 If an argument is given it must be an iterable yielding ints in range(256).");
 
 PyTypeObject PyBytes_Type = {
-    PyObject_HEAD_INIT(&PyType_Type)
-    0,
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "bytes",
     sizeof(PyBytesObject),
     0,