diff options
author | Guido van Rossum <guido@python.org> | 2001-08-17 13:43:27 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2001-08-17 13:43:27 (GMT) |
commit | f23c41d56a6ae0565619258895a321998328326e (patch) | |
tree | d04df026d2439ee465b68a3022a8afd4275acd7c /Objects/classobject.c | |
parent | 93018760bc597f65e8a94c30546eafafd095f170 (diff) | |
download | cpython-f23c41d56a6ae0565619258895a321998328326e.zip cpython-f23c41d56a6ae0565619258895a321998328326e.tar.gz cpython-f23c41d56a6ae0565619258895a321998328326e.tar.bz2 |
instance_getattr2(): rewritten to remove unnecessary stuff and
streamlined a bit.
instancemethod_descr_get(): don't bind an unbound method of a class
that's not a base class of the argument class.
Diffstat (limited to 'Objects/classobject.c')
-rw-r--r-- | Objects/classobject.c | 37 |
1 files changed, 13 insertions, 24 deletions
diff --git a/Objects/classobject.c b/Objects/classobject.c index b4944f3..9652dfe 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -649,15 +649,14 @@ instance_getattr2(register PyInstanceObject *inst, PyObject *name) PyClassObject *class; descrgetfunc f; - class = NULL; v = PyDict_GetItem(inst->in_dict, name); - if (v == NULL) { - v = class_lookup(inst->in_class, name, &class); - if (v == NULL) - return v; + if (v != NULL) { + Py_INCREF(v); + return v; } - Py_INCREF(v); - if (class != NULL) { + v = class_lookup(inst->in_class, name, &class); + if (v != NULL) { + Py_INCREF(v); f = v->ob_type->tp_descr_get; if (f != NULL) { PyObject *w = f(v, (PyObject *)inst, @@ -665,19 +664,6 @@ instance_getattr2(register PyInstanceObject *inst, PyObject *name) Py_DECREF(v); v = w; } - else if (PyMethod_Check(v)) { - /* XXX This should be a tp_descr_get slot of - PyMethodObjects */ - PyObject *im_class = PyMethod_GET_CLASS(v); - /* Only if classes are compatible */ - if (PyClass_IsSubclass((PyObject *)class, im_class)) { - PyObject *im_func = PyMethod_GET_FUNCTION(v); - PyObject *w = PyMethod_New(im_func, - (PyObject *)inst, im_class); - Py_DECREF(v); - v = w; - } - } } return v; } @@ -2194,16 +2180,19 @@ instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw) } static PyObject * -instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *type) +instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *class) { - if (PyMethod_GET_SELF(meth) != NULL) { - /* Don't rebind an already bound method */ + /* Don't rebind an already bound method, or an unbound method + of a class that's not a base class of class */ + if (PyMethod_GET_SELF(meth) != NULL || + (PyMethod_GET_CLASS(meth) != NULL && + !PyObject_IsSubclass(class, PyMethod_GET_CLASS(meth)))) { Py_INCREF(meth); return meth; } if (obj == Py_None) obj = NULL; - return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, type); + return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, class); } PyTypeObject PyMethod_Type = { |