Skip to content

Commit 94c65d9

Browse files
committed
Merged revisions 72907 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r72907 | benjamin.peterson | 2009-05-24 21:40:21 -0500 (Sun, 24 May 2009) | 1 line handle errors from _PyObject_LookupSpecial when __get__ fails ........
1 parent 14a3dd7 commit 94c65d9

File tree

5 files changed

+37
-7
lines changed

5 files changed

+37
-7
lines changed

Lib/test/test_descr.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1595,7 +1595,11 @@ def __init__(self, impl):
15951595
def __get__(self, obj, owner):
15961596
record.append(1)
15971597
return self.impl.__get__(obj, owner)
1598-
1598+
class MyException(Exception):
1599+
pass
1600+
class ErrDescr(object):
1601+
def __get__(self, obj, owner):
1602+
raise MyException
15991603

16001604
for name, runner, meth_impl, ok, env in specials:
16011605
class X(Checker):
@@ -1614,6 +1618,18 @@ class X(Checker):
16141618
runner(X())
16151619
self.assertEqual(record, [1], name)
16161620

1621+
class X(Checker):
1622+
pass
1623+
for attr, obj in env.items():
1624+
setattr(X, attr, obj)
1625+
setattr(X, name, ErrDescr())
1626+
try:
1627+
runner(X())
1628+
except MyException:
1629+
pass
1630+
else:
1631+
self.fail("{0!r} didn't raise".format(name))
1632+
16171633
def test_specials(self):
16181634
# Testing special operators...
16191635
# Test operators like __hash__ for which a built-in default exists

Objects/abstract.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,12 @@ _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
9090

9191
/* try o.__length_hint__() */
9292
hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
93-
if (hintmeth == NULL)
94-
return defaultvalue;
93+
if (hintmeth == NULL) {
94+
if (PyErr_Occurred())
95+
return -1;
96+
else
97+
return defaultvalue;
98+
}
9599
ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
96100
Py_DECREF(hintmeth);
97101
if (ro == NULL) {
@@ -2592,6 +2596,8 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls)
25922596
}
25932597
return ok;
25942598
}
2599+
else if (PyErr_Occurred())
2600+
return -1;
25952601
return recursive_isinstance(inst, cls);
25962602
}
25972603

@@ -2655,6 +2661,8 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls)
26552661
}
26562662
return ok;
26572663
}
2664+
else if (PyErr_Occurred())
2665+
return -1;
26582666
return recursive_issubclass(derived, cls);
26592667
}
26602668

Objects/enumobject.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,8 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
238238
Py_DECREF(reversed_meth);
239239
return res;
240240
}
241+
else if (PyErr_Occurred())
242+
return NULL;
241243

242244
if (!PySequence_Check(seq)) {
243245
PyErr_SetString(PyExc_TypeError,

Objects/object.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,8 @@ PyObject_Bytes(PyObject *v)
497497
}
498498
return result;
499499
}
500+
else if (PyErr_Occurred())
501+
return NULL;
500502
return PyBytes_FromObject(v);
501503
}
502504

Python/sysmodule.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -652,10 +652,12 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
652652

653653
method = _PyObject_LookupSpecial(o, "__sizeof__",
654654
&str__sizeof__);
655-
if (method == NULL)
656-
PyErr_Format(PyExc_TypeError,
657-
"Type %.100s doesn't define __sizeof__",
658-
Py_TYPE(o)->tp_name);
655+
if (method == NULL) {
656+
if (!PyErr_Occurred())
657+
PyErr_Format(PyExc_TypeError,
658+
"Type %.100s doesn't define __sizeof__",
659+
Py_TYPE(o)->tp_name);
660+
}
659661
else {
660662
res = PyObject_CallFunctionObjArgs(method, NULL);
661663
Py_DECREF(method);

0 commit comments

Comments
 (0)