From 949954706b15bc10b00857c77416d4ccf0759118 Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Sun, 2 Feb 2003 19:37:32 +0000 Subject: [PATCH] backport: revision 2.164 date: 2002/10/29 18:36:40; author: gvanrossum; state: Exp; lines: +12 -13 Since properties are supported here, is possible that instance_getattr2() raises an exception. Fix all code that made this assumption. --- Objects/classobject.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Objects/classobject.c b/Objects/classobject.c index 93981daf31b6..c1c4a3ebf507 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -543,6 +543,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) || @@ -674,7 +678,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); @@ -1759,25 +1763,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) { - method = instance_getattr2((PyInstanceObject *)v, + 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); -- 2.47.3