]> granicus.if.org Git - python/commitdiff
ceval.c/do_raise(): Tighten the test to disallow raising an instance of
authorTim Peters <tim.peters@gmail.com>
Thu, 18 Apr 2002 18:06:20 +0000 (18:06 +0000)
committerTim Peters <tim.peters@gmail.com>
Thu, 18 Apr 2002 18:06:20 +0000 (18:06 +0000)
a str subclass.

test_descr.py/string_exceptions():  New sub-test.

For 2.3 only.  Guido doesn't want this backported.

Lib/test/test_descr.py
Python/ceval.c

index 308ed44cf040803ffa57a924c24d9d1ebc27fe84..353d0f28b4c02a19399bd91744381852ec5a5407 100644 (file)
@@ -2974,6 +2974,31 @@ def docdescriptor():
     vereq(NewClass.__doc__, 'object=None; type=NewClass')
     vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
 
+def string_exceptions():
+    if verbose:
+        print "Testing string exceptions ..."
+
+    # Ensure builtin strings work OK as exceptions.
+    astring = "An exception string."
+    try:
+        raise astring
+    except astring:
+        pass
+    else:
+        raise TestFailed, "builtin string not usable as exception"
+
+    # Ensure string subclass instances do not.
+    class MyStr(str):
+        pass
+
+    newstring = MyStr("oops -- shouldn't work")
+    try:
+        raise newstring
+    except TypeError:
+        pass
+    except:
+        raise TestFailed, "string subclass allowed as exception"
+
 def test_main():
     class_docstrings()
     lists()
@@ -3039,6 +3064,7 @@ def test_main():
     funnynew()
     imulbug()
     docdescriptor()
+    string_exceptions()
     if verbose: print "All OK"
 
 if __name__ == "__main__":
index a93ceea1284b2a11bea7fe4c286bd2394189bb8a..4e08a2af0a87438509e54e14e6c1ba93a19d8eb3 100644 (file)
@@ -2743,7 +2743,10 @@ do_raise(PyObject *type, PyObject *value, PyObject *tb)
                Py_DECREF(tmp);
        }
 
-       if (PyString_Check(type))
+       if (PyString_CheckExact(type))
+               /* Raising builtin string is deprecated but still allowed --
+                * do nothing.  Raising an instance of a new-style str
+                * subclass is right out. */
                ;
 
        else if (PyClass_Check(type))