Kaydet (Commit) f23c41d5 authored tarafından Guido van Rossum's avatar Guido van Rossum

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.
üst 93018760
...@@ -649,15 +649,14 @@ instance_getattr2(register PyInstanceObject *inst, PyObject *name) ...@@ -649,15 +649,14 @@ instance_getattr2(register PyInstanceObject *inst, PyObject *name)
PyClassObject *class; PyClassObject *class;
descrgetfunc f; descrgetfunc f;
class = NULL;
v = PyDict_GetItem(inst->in_dict, name); v = PyDict_GetItem(inst->in_dict, name);
if (v == NULL) { if (v != NULL) {
v = class_lookup(inst->in_class, name, &class); Py_INCREF(v);
if (v == NULL) return v;
return v;
} }
Py_INCREF(v); v = class_lookup(inst->in_class, name, &class);
if (class != NULL) { if (v != NULL) {
Py_INCREF(v);
f = v->ob_type->tp_descr_get; f = v->ob_type->tp_descr_get;
if (f != NULL) { if (f != NULL) {
PyObject *w = f(v, (PyObject *)inst, PyObject *w = f(v, (PyObject *)inst,
...@@ -665,19 +664,6 @@ instance_getattr2(register PyInstanceObject *inst, PyObject *name) ...@@ -665,19 +664,6 @@ instance_getattr2(register PyInstanceObject *inst, PyObject *name)
Py_DECREF(v); Py_DECREF(v);
v = w; 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; return v;
} }
...@@ -2194,16 +2180,19 @@ instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw) ...@@ -2194,16 +2180,19 @@ instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
} }
static PyObject * 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, or an unbound method
/* Don't rebind an already bound 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); Py_INCREF(meth);
return meth; return meth;
} }
if (obj == Py_None) if (obj == Py_None)
obj = NULL; obj = NULL;
return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, type); return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, class);
} }
PyTypeObject PyMethod_Type = { PyTypeObject PyMethod_Type = {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment