[Python-checkins] r72908 - in python/branches/py3k: Lib/test/test_descr.py Objects/abstract.c Objects/enumobject.c Objects/object.c Python/sysmodule.c

benjamin.peterson python-checkins at python.org
Mon May 25 05:10:48 CEST 2009


Author: benjamin.peterson
Date: Mon May 25 05:10:48 2009
New Revision: 72908
Log:
Merged revisions 72907 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk
........
 r72907 | benjamin.peterson | 2009年05月24日 21:40:21 -0500 (2009年5月24日) | 1 line
 
 handle errors from _PyObject_LookupSpecial when __get__ fails
........
Modified:
 python/branches/py3k/ (props changed)
 python/branches/py3k/Lib/test/test_descr.py
 python/branches/py3k/Objects/abstract.c
 python/branches/py3k/Objects/enumobject.c
 python/branches/py3k/Objects/object.c
 python/branches/py3k/Python/sysmodule.c
Modified: python/branches/py3k/Lib/test/test_descr.py
==============================================================================
--- python/branches/py3k/Lib/test/test_descr.py	(original)
+++ python/branches/py3k/Lib/test/test_descr.py	Mon May 25 05:10:48 2009
@@ -1595,7 +1595,11 @@
 def __get__(self, obj, owner):
 record.append(1)
 return self.impl.__get__(obj, owner)
-
+ class MyException(Exception):
+ pass
+ class ErrDescr(object):
+ def __get__(self, obj, owner):
+ raise MyException
 
 for name, runner, meth_impl, ok, env in specials:
 class X(Checker):
@@ -1614,6 +1618,18 @@
 runner(X())
 self.assertEqual(record, [1], name)
 
+ class X(Checker):
+ pass
+ for attr, obj in env.items():
+ setattr(X, attr, obj)
+ setattr(X, name, ErrDescr())
+ try:
+ runner(X())
+ except MyException:
+ pass
+ else:
+ self.fail("{0!r} didn't raise".format(name))
+
 def test_specials(self):
 # Testing special operators...
 # Test operators like __hash__ for which a built-in default exists
Modified: python/branches/py3k/Objects/abstract.c
==============================================================================
--- python/branches/py3k/Objects/abstract.c	(original)
+++ python/branches/py3k/Objects/abstract.c	Mon May 25 05:10:48 2009
@@ -90,8 +90,12 @@
 
 	/* try o.__length_hint__() */
 hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
-	if (hintmeth == NULL)
-		return defaultvalue;
+	if (hintmeth == NULL) {
+		if (PyErr_Occurred())
+			return -1;
+		else
+			return defaultvalue;
+	}
 	ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
 	Py_DECREF(hintmeth);
 	if (ro == NULL) {
@@ -2592,6 +2596,8 @@
 		}
 		return ok;
 	}
+	else if (PyErr_Occurred())
+		return -1;
 	return recursive_isinstance(inst, cls);
 }
 
@@ -2655,6 +2661,8 @@
 		}
 		return ok;
 	}
+	else if (PyErr_Occurred())
+		return -1;
 	return recursive_issubclass(derived, cls);
 }
 
Modified: python/branches/py3k/Objects/enumobject.c
==============================================================================
--- python/branches/py3k/Objects/enumobject.c	(original)
+++ python/branches/py3k/Objects/enumobject.c	Mon May 25 05:10:48 2009
@@ -238,6 +238,8 @@
 		Py_DECREF(reversed_meth);
 		return res;
 	}
+	else if (PyErr_Occurred())
+		return NULL;
 
 	if (!PySequence_Check(seq)) {
 		PyErr_SetString(PyExc_TypeError,
Modified: python/branches/py3k/Objects/object.c
==============================================================================
--- python/branches/py3k/Objects/object.c	(original)
+++ python/branches/py3k/Objects/object.c	Mon May 25 05:10:48 2009
@@ -497,6 +497,8 @@
 }
 return result;
 	}
+	else if (PyErr_Occurred())
+		return NULL;
 	return PyBytes_FromObject(v);
 }
 
Modified: python/branches/py3k/Python/sysmodule.c
==============================================================================
--- python/branches/py3k/Python/sysmodule.c	(original)
+++ python/branches/py3k/Python/sysmodule.c	Mon May 25 05:10:48 2009
@@ -652,10 +652,12 @@
 
 	method = _PyObject_LookupSpecial(o, "__sizeof__",
 					 &str__sizeof__);
-	if (method == NULL)
-		PyErr_Format(PyExc_TypeError,
-			 "Type %.100s doesn't define __sizeof__",
-			 Py_TYPE(o)->tp_name);
+	if (method == NULL) {
+		if (!PyErr_Occurred())
+			PyErr_Format(PyExc_TypeError,
+				 "Type %.100s doesn't define __sizeof__",
+				 Py_TYPE(o)->tp_name);
+	}
 	else {
 		res = PyObject_CallFunctionObjArgs(method, NULL);
 		Py_DECREF(method);


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /