[Python-checkins] CVS: python/dist/src/Objects classobject.c,2.148,2.149 complexobject.c,2.46,2.47 descrobject.c,2.11,2.12 fileobject.c,2.128,2.129 frameobject.c,2.56,2.57 funcobject.c,2.43,2.44 moduleobject.c,2.37,2.38 sliceobject.c,2.8,2.9 typeobject.c,2.65,2.66

Guido van Rossum gvanrossum@users.sourceforge.net
Thu, 20 Sep 2001 13:46:21 -0700


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

Modified Files:
	classobject.c complexobject.c descrobject.c fileobject.c 
	frameobject.c funcobject.c moduleobject.c sliceobject.c 
	typeobject.c 
Log Message:
Add optional docstrings to member descriptors.  For backwards
compatibility, this required all places where an array of "struct
memberlist" structures was declared that is referenced from a type's
tp_members slot to change the type of the structure to PyMemberDef;
"struct memberlist" is now only used by old code that still calls
PyMember_Get/Set.  The code in PyObject_GenericGetAttr/SetAttr now
calls the new APIs PyMember_GetOne/SetOne, which take a PyMemberDef
argument.

As examples, I added actual docstrings to the attributes of a few
types: file, complex, instance method, super, and xxsubtype.spamlist.

Also converted the symtable to new style getattr.


Index: classobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/classobject.c,v
retrieving revision 2.148
retrieving revision 2.149
diff -C2 -d -r2.148 -r2.149
*** classobject.c	2001/09/18 20:23:28	2.148
--- classobject.c	2001/09/20 20:46:18	2.149
***************
*** 2007,2014 ****
  #define OFF(x) offsetof(PyMethodObject, x)
  
! static struct memberlist instancemethod_memberlist[] = {
! 	{"im_class",	T_OBJECT,	OFF(im_class),	READONLY|RESTRICTED},
! 	{"im_func",	T_OBJECT,	OFF(im_func),	READONLY|RESTRICTED},
! 	{"im_self",	T_OBJECT,	OFF(im_self),	READONLY|RESTRICTED},
  	{NULL}	/* Sentinel */
  };
--- 2007,2017 ----
  #define OFF(x) offsetof(PyMethodObject, x)
  
! static PyMemberDef instancemethod_memberlist[] = {
! 	{"im_class",	T_OBJECT,	OFF(im_class),	READONLY|RESTRICTED,
! 	 "the class associated with a method"},
! 	{"im_func",	T_OBJECT,	OFF(im_func),	READONLY|RESTRICTED,
! 	 "the function (or other callable) implementing a method"},
! 	{"im_self",	T_OBJECT,	OFF(im_self),	READONLY|RESTRICTED,
! 	 "the instance to which a method is bound; None for unbound methods"},
  	{NULL}	/* Sentinel */
  };

Index: complexobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/complexobject.c,v
retrieving revision 2.46
retrieving revision 2.47
diff -C2 -d -r2.46 -r2.47
*** complexobject.c	2001/09/19 01:13:10	2.46
--- complexobject.c	2001/09/20 20:46:18	2.47
***************
*** 626,632 ****
  };
  
! static struct memberlist complex_members[] = {
! 	{"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), 0},
! 	{"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), 0},
  	{0},
  };
--- 626,634 ----
  };
  
! static PyMemberDef complex_members[] = {
! 	{"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), 0,
! 	 "the real part of a complex number"},
! 	{"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), 0,
! 	 "the imaginary part of a complex number"},
  	{0},
  };

Index: descrobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/descrobject.c,v
retrieving revision 2.11
retrieving revision 2.12
diff -C2 -d -r2.11 -r2.12
*** descrobject.c	2001/09/06 21:55:04	2.11
--- descrobject.c	2001/09/20 20:46:18	2.12
***************
*** 22,26 ****
  typedef struct {
  	COMMON;
! 	struct memberlist *d_member;
  } PyMemberDescrObject;
  
--- 22,26 ----
  typedef struct {
  	COMMON;
! 	PyMemberDef *d_member;
  } PyMemberDescrObject;
  
***************
*** 127,132 ****
  	if (descr_check((PyDescrObject *)descr, obj, type, &res))
  		return res;
! 	return PyMember_Get((char *)obj, descr->d_member,
! 			    descr->d_member->name);
  }
  
--- 127,131 ----
  	if (descr_check((PyDescrObject *)descr, obj, type, &res))
  		return res;
! 	return PyMember_GetOne((char *)obj, descr->d_member);
  }
  
***************
*** 182,187 ****
  	if (descr_setcheck((PyDescrObject *)descr, obj, value, &res))
  		return res;
! 	return PyMember_Set((char *)obj, descr->d_member,
! 			    descr->d_member->name, value);
  }
  
--- 181,185 ----
  	if (descr_setcheck((PyDescrObject *)descr, obj, value, &res))
  		return res;
! 	return PyMember_SetOne((char *)obj, descr->d_member, value);
  }
  
***************
*** 290,294 ****
  
  static PyObject *
! member_get_doc(PyMethodDescrObject *descr, void *closure)
  {
  	if (descr->d_method->ml_doc == NULL) {
--- 288,292 ----
  
  static PyObject *
! method_get_doc(PyMethodDescrObject *descr, void *closure)
  {
  	if (descr->d_method->ml_doc == NULL) {
***************
*** 299,303 ****
  }
  
! static struct memberlist descr_members[] = {
  	{"__objclass__", T_OBJECT, offsetof(PyDescrObject, d_type), READONLY},
  	{"__name__", T_OBJECT, offsetof(PyDescrObject, d_name), READONLY},
--- 297,301 ----
  }
  
! static PyMemberDef descr_members[] = {
  	{"__objclass__", T_OBJECT, offsetof(PyDescrObject, d_type), READONLY},
  	{"__name__", T_OBJECT, offsetof(PyDescrObject, d_name), READONLY},
***************
*** 305,308 ****
--- 303,321 ----
  };
  
+ static struct getsetlist method_getset[] = {
+ 	{"__doc__", (getter)method_get_doc},
+ 	{0}
+ };
+ 
+ static PyObject *
+ member_get_doc(PyMemberDescrObject *descr, void *closure)
+ {
+ 	if (descr->d_member->doc == NULL) {
+ 		Py_INCREF(Py_None);
+ 		return Py_None;
+ 	}
+ 	return PyString_FromString(descr->d_member->doc);
+ }
+ 
  static struct getsetlist member_getset[] = {
  	{"__doc__", (getter)member_get_doc},
***************
*** 356,360 ****
  	0,					/* tp_methods */
  	descr_members,				/* tp_members */
! 	member_getset,				/* tp_getset */
  	0,					/* tp_base */
  	0,					/* tp_dict */
--- 369,373 ----
  	0,					/* tp_methods */
  	descr_members,				/* tp_members */
! 	method_getset,				/* tp_getset */
  	0,					/* tp_base */
  	0,					/* tp_dict */
***************
*** 394,398 ****
  	0,					/* tp_methods */
  	descr_members,				/* tp_members */
! 	0,					/* tp_getset */
  	0,					/* tp_base */
  	0,					/* tp_dict */
--- 407,411 ----
  	0,					/* tp_methods */
  	descr_members,				/* tp_members */
! 	member_getset,				/* tp_getset */
  	0,					/* tp_base */
  	0,					/* tp_dict */
***************
*** 508,512 ****
  
  PyObject *
! PyDescr_NewMember(PyTypeObject *type, struct memberlist *member)
  {
  	PyMemberDescrObject *descr;
--- 521,525 ----
  
  PyObject *
! PyDescr_NewMember(PyTypeObject *type, PyMemberDef *member)
  {
  	PyMemberDescrObject *descr;

Index: fileobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/fileobject.c,v
retrieving revision 2.128
retrieving revision 2.129
diff -C2 -d -r2.128 -r2.129
*** fileobject.c	2001/09/20 07:55:22	2.128
--- fileobject.c	2001/09/20 20:46:19	2.129
***************
*** 1384,1391 ****
  #define OFF(x) offsetof(PyFileObject, x)
  
! static struct memberlist file_memberlist[] = {
! 	{"softspace",	T_INT,		OFF(f_softspace)},
! 	{"mode",	T_OBJECT,	OFF(f_mode),	RO},
! 	{"name",	T_OBJECT,	OFF(f_name),	RO},
  	/* getattr(f, "closed") is implemented without this table */
  	{NULL}	/* Sentinel */
--- 1384,1394 ----
  #define OFF(x) offsetof(PyFileObject, x)
  
! static PyMemberDef file_memberlist[] = {
! 	{"softspace",	T_INT,		OFF(f_softspace), 0,
! 	 "flag indicating that a space needs to be printed; used by print"},
! 	{"mode",	T_OBJECT,	OFF(f_mode),	RO,
! 	 "file mode ('r', 'w', 'a', possibly with 'b' or '+' added)"},
! 	{"name",	T_OBJECT,	OFF(f_name),	RO,
! 	 "file name"},
  	/* getattr(f, "closed") is implemented without this table */
  	{NULL}	/* Sentinel */

Index: frameobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/frameobject.c,v
retrieving revision 2.56
retrieving revision 2.57
diff -C2 -d -r2.56 -r2.57
*** frameobject.c	2001/08/30 00:32:51	2.56
--- frameobject.c	2001/09/20 20:46:19	2.57
***************
*** 11,15 ****
  #define OFF(x) offsetof(PyFrameObject, x)
  
! static struct memberlist frame_memberlist[] = {
  	{"f_back",	T_OBJECT,	OFF(f_back),	RO},
  	{"f_code",	T_OBJECT,	OFF(f_code),	RO},
--- 11,15 ----
  #define OFF(x) offsetof(PyFrameObject, x)
  
! static PyMemberDef frame_memberlist[] = {
  	{"f_back",	T_OBJECT,	OFF(f_back),	RO},
  	{"f_code",	T_OBJECT,	OFF(f_code),	RO},

Index: funcobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/funcobject.c,v
retrieving revision 2.43
retrieving revision 2.44
diff -C2 -d -r2.43 -r2.44
*** funcobject.c	2001/09/17 23:46:56	2.43
--- funcobject.c	2001/09/20 20:46:19	2.44
***************
*** 130,134 ****
  #define RR ()
  
! static struct memberlist func_memberlist[] = {
          {"func_closure",  T_OBJECT,     OFF(func_closure),
  	 RESTRICTED|READONLY},
--- 130,134 ----
  #define RR ()
  
! static PyMemberDef func_memberlist[] = {
          {"func_closure",  T_OBJECT,     OFF(func_closure),
  	 RESTRICTED|READONLY},

Index: moduleobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/moduleobject.c,v
retrieving revision 2.37
retrieving revision 2.38
diff -C2 -d -r2.37 -r2.38
*** moduleobject.c	2001/08/29 23:53:09	2.37
--- moduleobject.c	2001/09/20 20:46:19	2.38
***************
*** 10,14 ****
  } PyModuleObject;
  
! struct memberlist module_members[] = {
  	{"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
  	{0}
--- 10,14 ----
  } PyModuleObject;
  
! PyMemberDef module_members[] = {
  	{"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
  	{0}

Index: sliceobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/sliceobject.c,v
retrieving revision 2.8
retrieving revision 2.9
diff -C2 -d -r2.8 -r2.9
*** sliceobject.c	2001/08/02 04:15:00	2.8
--- sliceobject.c	2001/09/20 20:46:19	2.9
***************
*** 130,134 ****
  }
  
! static struct memberlist slice_members[] = {
  	{"start", T_OBJECT, offsetof(PySliceObject, start), READONLY},
  	{"stop", T_OBJECT, offsetof(PySliceObject, stop), READONLY},
--- 130,134 ----
  }
  
! static PyMemberDef slice_members[] = {
  	{"start", T_OBJECT, offsetof(PySliceObject, start), READONLY},
  	{"stop", T_OBJECT, offsetof(PySliceObject, stop), READONLY},

Index: typeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/typeobject.c,v
retrieving revision 2.65
retrieving revision 2.66
diff -C2 -d -r2.65 -r2.66
*** typeobject.c	2001/09/18 20:38:53	2.65
--- typeobject.c	2001/09/20 20:46:19	2.66
***************
*** 5,9 ****
  #include "structmember.h"
  
! static struct memberlist type_members[] = {
  	{"__basicsize__", T_INT, offsetof(PyTypeObject,tp_basicsize),READONLY},
  	{"__itemsize__", T_INT, offsetof(PyTypeObject, tp_itemsize), READONLY},
--- 5,9 ----
  #include "structmember.h"
  
! static PyMemberDef type_members[] = {
  	{"__basicsize__", T_INT, offsetof(PyTypeObject,tp_basicsize),READONLY},
  	{"__itemsize__", T_INT, offsetof(PyTypeObject, tp_itemsize), READONLY},
***************
*** 264,268 ****
  	PyBufferProcs as_buffer;
  	PyObject *name, *slots;
! 	struct memberlist members[1];
  } etype;
  
--- 264,268 ----
  	PyBufferProcs as_buffer;
  	PyObject *name, *slots;
! 	PyMemberDef members[1];
  } etype;
  
***************
*** 673,677 ****
  	PyTypeObject *type, *base, *tmptype, *winner;
  	etype *et;
! 	struct memberlist *mp;
  	int i, nbases, nslots, slotoffset, dynamic, add_dict, add_weak;
  
--- 673,677 ----
  	PyTypeObject *type, *base, *tmptype, *winner;
  	etype *et;
! 	PyMemberDef *mp;
  	int i, nbases, nslots, slotoffset, dynamic, add_dict, add_weak;
  
***************
*** 1088,1092 ****
  	"type",					/* tp_name */
  	sizeof(etype),				/* tp_basicsize */
! 	sizeof(struct memberlist),		/* tp_itemsize */
  	(destructor)type_dealloc,		/* tp_dealloc */
  	0,					/* tp_print */
--- 1088,1092 ----
  	"type",					/* tp_name */
  	sizeof(etype),				/* tp_basicsize */
! 	sizeof(PyMemberDef),			/* tp_itemsize */
  	(destructor)type_dealloc,		/* tp_dealloc */
  	0,					/* tp_print */
***************
*** 1193,1197 ****
  }
  
! static struct memberlist object_members[] = {
  	{"__class__", T_OBJECT, offsetof(PyObject, ob_type), READONLY},
  	{0}
--- 1193,1197 ----
  }
  
! static PyMemberDef object_members[] = {
  	{"__class__", T_OBJECT, offsetof(PyObject, ob_type), READONLY},
  	{0}
***************
*** 1264,1268 ****
  
  static int
! add_members(PyTypeObject *type, struct memberlist *memb)
  {
  	PyObject *dict = type->tp_defined;
--- 1264,1268 ----
  
  static int
! add_members(PyTypeObject *type, PyMemberDef *memb)
  {
  	PyObject *dict = type->tp_defined;
***************
*** 3222,3228 ****
  } superobject;
  
! static struct memberlist super_members[] = {
! 	{"__type__", T_OBJECT, offsetof(superobject, type), READONLY},
! 	{"__obj__",  T_OBJECT, offsetof(superobject, obj), READONLY},
  	{0}
  };
--- 3222,3230 ----
  } superobject;
  
! static PyMemberDef super_members[] = {
! 	{"__thisclass__", T_OBJECT, offsetof(superobject, type), READONLY,
! 	 "the class invoking super()"},
! 	{"__self__",  T_OBJECT, offsetof(superobject, obj), READONLY,
! 	 "the instance invoking super(); may be None"},
  	{0}
  };