diff options
author | Guido van Rossum <guido@python.org> | 2002-10-29 18:36:40 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2002-10-29 18:36:40 (GMT) |
commit | f740bdf3379046701d23c8849d51aadd8377dc17 (patch) | |
tree | 7179c205a9093b45ba804a1f0ce70fe0acf86cf8 /Objects | |
parent | 3e2c632620e36d46a125d54aea977beb19dbe9af (diff) | |
download | cpython-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.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/classobject.c | 25 |
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); |