]> granicus.if.org Git - python/commitdiff
More on SF bug [#460020] bug or feature: unicode() and subclasses.
authorTim Peters <tim.peters@gmail.com>
Mon, 10 Sep 2001 23:37:46 +0000 (23:37 +0000)
committerTim Peters <tim.peters@gmail.com>
Mon, 10 Sep 2001 23:37:46 +0000 (23:37 +0000)
tuple(i) repaired to return a true tuple when i is an instance of a
tuple subclass.
Added PyTuple_CheckExact macro.
PySequence_Tuple():  if a tuple-like object isn't exactly a tuple, it's
not safe to return the object as-is -- make a new tuple of it instead.

Include/tupleobject.h
Lib/test/test_descr.py
Objects/abstract.c

index 3da3fe0a490a9eec40b334b5bf897c92ca06fc39..c5ec1c2cec91e09daf47ec4d971d4c990a980f4c 100644 (file)
@@ -27,6 +27,7 @@ typedef struct {
 extern DL_IMPORT(PyTypeObject) PyTuple_Type;
 
 #define PyTuple_Check(op) PyObject_TypeCheck(op, &PyTuple_Type)
+#define PyTuple_CheckExact(op) ((op)->ob_type == &PyTuple_Type)
 
 extern DL_IMPORT(PyObject *) PyTuple_New(int size);
 extern DL_IMPORT(int) PyTuple_Size(PyObject *);
index 0bed6750ee5afe240be0da9ba1f0da56b781afcb..d756dc57d05730cf6a0d208811e41aacdc8fc407 100644 (file)
@@ -1416,7 +1416,7 @@ def inherits():
         verify(v == t)
     a = madtuple((1,2,3,4,5))
     verify(tuple(a) == (1,2,3,4,5))
-    #XXX verify(tuple(a).__class__ is tuple)
+    verify(tuple(a).__class__ is tuple)
     a = madtuple(())
     verify(tuple(a) == ())
     #XXX verify(tuple(a).__class__ is tuple)
index 37f7eeab0528a052946312dbf756bc8326481afe..3609948beef8f526f96076f78d5204dc1a64d9df 100644 (file)
@@ -1235,7 +1235,11 @@ PySequence_Tuple(PyObject *v)
                return null_error();
 
        /* Special-case the common tuple and list cases, for efficiency. */
-       if (PyTuple_Check(v)) {
+       if (PyTuple_CheckExact(v)) {
+               /* Note that we can't know whether it's safe to return
+                  a tuple *subclass* instance as-is, hence the restriction
+                  to exact tuples here.  In contrasts, lists always make
+                  a copy, so there's need for exactness below. */
                Py_INCREF(v);
                return v;
        }