[Python-checkins] CVS: python/dist/src/Objects descrobject.c,1.1.2.1,1.1.2.2

Guido van Rossum gvanrossum@users.sourceforge.net
Mon, 23 Apr 2001 18:43:08 -0700


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

Modified Files:
      Tag: descr-branch
	descrobject.c 
Log Message:
Implement most descriptor properties from PEP 252: name/__name__,
doc/__doc__, kind, readonly, objclass, get(), set(), call(), bind().

Not yet: default, attrclass, signature.  (I don't know these!)

Incomplete: call() implementation is the same as tp_call and has
undefined effects for data attributes; bind() is the same as get();
there are no docstrings for getset and structmember style attributes.

The Descr_Get and Descr_Set operations should support other
descriptors, using the get/set protocol, but they don't yet.


Index: descrobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/Attic/descrobject.c,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -C2 -r1.1.2.1 -r1.1.2.2
*** descrobject.c	2001/04/24 00:43:30	1.1.2.1
--- descrobject.c	2001/04/24 01:43:06	1.1.2.2
***************
*** 145,193 ****
  
  static PyObject *
! descr_getattr(PyDescrObject *descr, char *name)
  {
! 	char *s;
  
! 	if (strcmp(name, "__name__") == 0) {
! 		s = NULL;
  
! 		switch (descr->d_flavor) {
! 		case DF_METHOD:
! 			s = descr->d_union.d_method->ml_name;
! 			break;
! 		case DF_MEMBER:
! 			s = descr->d_union.d_member->name;
! 			break;
! 		case DF_GETSET:
! 			s = descr->d_union.d_getset->name;
! 			break;
! 		}
! 		if (s != NULL)
! 			return PyString_FromString(s);
! 	}
! 	if (strcmp(name, "__doc__") == 0) {
! 		if (descr->d_flavor == DF_METHOD) {
! 			s = descr->d_union.d_method->ml_doc;
! 
! 			if (s == NULL) {
! 				Py_INCREF(Py_None);
! 				return Py_None;
! 			}
! 			else {
! 				return PyString_FromString(s);
! 			}
! 		}
! 	}
  
! 	s = descr_name(descr);
! 	if (s == NULL)
! 		s = "?";
! 	PyErr_Format(PyExc_AttributeError,
! 		     "descriptor '%.100s' of '%.100s' objects has no "
! 		     "'%.100s' attribute",
! 		     s, descr->d_type->tp_name, name);
  	return NULL;
  }
  
  PyTypeObject PyDescr_Type = {
  	PyObject_HEAD_INIT(&PyType_Type)
--- 145,245 ----
  
  static PyObject *
! descr_get(PyObject *descr, PyObject *args)
  {
! 	PyObject *obj;
  
! 	if (!PyArg_ParseTuple(args, "O:get", &obj))
! 		return NULL;
! 	return PyDescr_Get(descr, obj);
! }
  
! static PyObject *
! descr_set(PyObject *descr, PyObject *args)
! {
! 	PyObject *obj, *val;
! 
! 	if (!PyArg_ParseTuple(args, "OO:set", &obj, &val))
! 		return NULL;
! 	if (PyDescr_Set(descr, obj, val) < 0)
! 		return NULL;
! 	Py_INCREF(Py_None);
! 	return Py_None;
! }
  
! static PyMethodDef descr_methods[] = {
! 	{"get",		descr_get,	METH_VARARGS},
! 	{"set",		descr_set,	METH_VARARGS},
! 	{"call",	descr_call,	METH_VARARGS|METH_KEYWORDS},
! 	{"bind",	descr_get,	METH_VARARGS},
! 	{0}
! };
! 
! static PyObject *
! descr_get_name(PyDescrObject *descr)
! {
! 	char *s = descr_name(descr);
! 
! 	if (s != NULL)
! 		return PyString_FromString(s);
! 	PyErr_SetString(PyExc_AttributeError, "unnamed descriptor");
  	return NULL;
  }
  
+ static PyObject *
+ descr_get_doc(PyDescrObject *descr) {
+ 	char *s = NULL;
+ 
+ 	if (descr->d_flavor == DF_METHOD)
+ 		s = descr->d_union.d_method->ml_doc;
+ 
+ 	if (s != NULL)
+ 		return PyString_FromString(s);
+ 
+ 	Py_INCREF(Py_None);
+ 	return Py_None;
+ }
+ 
+ static PyObject *
+ descr_get_kind(PyDescrObject *descr) {
+ 	char *s = "data";
+ 
+ 	if (descr->d_flavor == DF_METHOD)
+ 		s = "method";
+ 	return PyString_FromString(s);
+ }
+ 
+ static PyObject *
+ descr_get_readonly(PyDescrObject *descr) {
+ 	int readonly = 1;
+ 
+ 	switch (descr->d_flavor) {
+ 	case DF_MEMBER:
+ 		readonly = descr->d_union.d_member->readonly;
+ 		break;
+ 	case DF_GETSET:
+ 		readonly = descr->d_union.d_getset->set == NULL;
+ 		break;
+ 	}
+ 	return PyInt_FromLong(readonly);
+ }
+ 
+ static struct getsetlist descr_getsets[] = {
+ 	{"name",	descr_get_name},
+ 	{"__name__",	descr_get_name},
+ 	{"doc",		descr_get_doc},
+ 	{"__doc__",	descr_get_doc},
+ 	{"kind",	descr_get_kind},
+ 	{"readonly",	descr_get_readonly},
+ 	{0}
+ };
+ 
+ static struct memberlist descr_members[] = {
+ 	{"objclass",	T_OBJECT, offsetof(struct PyDescrObject, d_type),
+ 			READONLY},
+ 	{"_flavor",	T_INT, offsetof(struct PyDescrObject, d_flavor),
+ 			READONLY},
+ 	{0}
+ };
+ 
  PyTypeObject PyDescr_Type = {
  	PyObject_HEAD_INIT(&PyType_Type)
***************
*** 198,202 ****
  	(destructor)descr_dealloc,		/* tp_dealloc */
  	0,					/* tp_print */
! 	(getattrfunc)descr_getattr,		/* tp_getattr */
  	0,					/* tp_setattr */
  	0,					/* tp_compare */
--- 250,254 ----
  	(destructor)descr_dealloc,		/* tp_dealloc */
  	0,					/* tp_print */
! 	0,					/* tp_getattr */
  	0,					/* tp_setattr */
  	0,					/* tp_compare */
***************
*** 219,225 ****
  	0,					/* tp_iter */
  	0,					/* tp_iternext */
! 	0,					/* tp_methods */
! 	0,					/* tp_members */
! 	0,					/* tp_getset */
  	0,					/* tp_base */
  	0,					/* tp_dict */
--- 271,277 ----
  	0,					/* tp_iter */
  	0,					/* tp_iternext */
! 	descr_methods,				/* tp_methods */
! 	descr_members,				/* tp_members */
! 	descr_getsets,				/* tp_getset */
  	0,					/* tp_base */
  	0,					/* tp_dict */