summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2002-10-29 18:36:40 (GMT)
committerGuido van Rossum <guido@python.org>2002-10-29 18:36:40 (GMT)
commitf740bdf3379046701d23c8849d51aadd8377dc17 (patch)
tree7179c205a9093b45ba804a1f0ce70fe0acf86cf8
parent3e2c632620e36d46a125d54aea977beb19dbe9af (diff)
downloadcpython-f740bdf3379046701d23c8849d51aadd8377dc17.zip
cpython-f740bdf3379046701d23c8849d51aadd8377dc17.tar.gz
cpython-f740bdf3379046701d23c8849d51aadd8377dc17.tar.bz2
Since properties are supported here, is possible that
instance_getattr2() raises an exception. Fix all code that made this assumption. Backport candidate.
-rw-r--r--Objects/classobject.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/Objects/classobject.c b/Objects/classobject.c
index ff6f11e..f7b442a 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -549,6 +549,10 @@ PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
initstr = PyString_InternFromString("__init__");
init = instance_getattr2(inst, initstr);
if (init == NULL) {
+ if (PyErr_Occurred()) {
+ Py_DECREF(inst);
+ return NULL;
+ }
if ((arg != NULL && (!PyTuple_Check(arg) ||
PyTuple_Size(arg) != 0))
|| (kw != NULL && (!PyDict_Check(kw) ||
@@ -694,7 +698,7 @@ instance_getattr1(register PyInstanceObject *inst, PyObject *name)
}
}
v = instance_getattr2(inst, name);
- if (v == NULL) {
+ if (v == NULL && !PyErr_Occurred()) {
PyErr_Format(PyExc_AttributeError,
"%.50s instance has no attribute '%.400s'",
PyString_AS_STRING(inst->in_class->cl_name), sname);
@@ -1809,25 +1813,20 @@ half_richcompare(PyObject *v, PyObject *w, int op)
/* If the instance doesn't define an __getattr__ method, use
instance_getattr2 directly because it will not set an
exception on failure. */
- if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL) {
+ if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
method = instance_getattr2((PyInstanceObject *)v,
name_op[op]);
- if (method == NULL) {
- assert(!PyErr_Occurred());
- res = Py_NotImplemented;
- Py_INCREF(res);
- return res;
- }
- } else {
+ else
method = PyObject_GetAttr(v, name_op[op]);
- if (method == NULL) {
+ if (method == NULL) {
+ if (PyErr_Occurred()) {
if (!PyErr_ExceptionMatches(PyExc_AttributeError))
return NULL;
PyErr_Clear();
- res = Py_NotImplemented;
- Py_INCREF(res);
- return res;
}
+ res = Py_NotImplemented;
+ Py_INCREF(res);
+ return res;
}
args = Py_BuildValue("(O)", w);