ceval.c/do_raise(): Tighten the test to disallow raising an instance of

a str subclass.

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

For 2.3 only.  Guido doesn't want this backported.
This commit is contained in:
Tim Peters 2002-04-18 18:06:20 +00:00
parent 16af557ae9
commit afb2c80b29
2 changed files with 30 additions and 1 deletions

View 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__":

View 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))