[Python-checkins] CVS: python/dist/src/Objects classobject.c,2.127.2.6,2.127.2.7

Guido van Rossum gvanrossum@users.sourceforge.net
Mon, 02 Jul 2001 18:14:59 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv23303

Modified Files:
      Tag: descr-branch
	classobject.c 
Log Message:
Support class methods for classic classes.  This is done by using the
tp_descr_get slot in class_getattr() and instance_getattr2() rather
than making explicit check for functions.

This is an important generalization,  apart from the support for class
method!  Any class attribute that supports the tp_descr_get slot is
now allowed to perform its own "bind" operation.  This also opens the
way to supporting computed attributes using "get/set" descriptors
(which requires a only little bit more code I think -- mostly to
create a get/set descriptor from a pair of Python functions).


Index: classobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/classobject.c,v
retrieving revision 2.127.2.6
retrieving revision 2.127.2.7
diff -C2 -r2.127.2.6 -r2.127.2.7
*** classobject.c	2001/06/28 16:46:51	2.127.2.6
--- classobject.c	2001/07/03 01:14:57	2.127.2.7
***************
*** 162,165 ****
--- 162,167 ----
  	register char *sname = PyString_AsString(name);
  	PyClassObject *class;
+ 	descrgetfunc f;
+ 
  	if (sname[0] == '_' && sname[1] == '_') {
  		if (strcmp(sname, "__dict__") == 0) {
***************
*** 191,202 ****
  			     PyString_AS_STRING(op->cl_name), sname);
  		return NULL;
- 	}
- 	Py_INCREF(v);
- 	if (PyFunction_Check(v)) {
- 		PyObject *w = PyMethod_New(v, (PyObject *)NULL,
- 						    (PyObject *)class);
- 		Py_DECREF(v);
- 		v = w;
  	}
  	return v;
  }
--- 193,202 ----
  			     PyString_AS_STRING(op->cl_name), sname);
  		return NULL;
  	}
+ 	f = v->ob_type->tp_descr_get;
+ 	if (f == NULL)
+ 		Py_INCREF(v);
+ 	else
+ 		v = f(v, (PyObject *)NULL, (PyObject *)op);
  	return v;
  }
***************
*** 648,651 ****
--- 648,653 ----
  	register PyObject *v;
  	PyClassObject *class;
+ 	descrgetfunc f;
+ 
  	class = NULL;
  	v = PyDict_GetItem(inst->in_dict, name);
***************
*** 657,663 ****
  	Py_INCREF(v);
  	if (class != NULL) {
! 		if (PyFunction_Check(v)) {
! 			PyObject *w = PyMethod_New(v, (PyObject *)inst,
! 						   (PyObject *)class);
  			Py_DECREF(v);
  			v = w;
--- 659,666 ----
  	Py_INCREF(v);
  	if (class != NULL) {
! 		f = v->ob_type->tp_descr_get;
! 		if (f != NULL) {
! 			PyObject *w = f(v, (PyObject *)inst,
! 					(PyObject *)(inst->in_class));
  			Py_DECREF(v);
  			v = w;
***************
*** 2080,2083 ****
--- 2083,2087 ----
  			sklassname, sfuncname);
  	else {
+ 		/* XXX Shouldn't use repr() here! */
  		PyObject *selfrepr = PyObject_Repr(self);
  		if (selfrepr == NULL)