[Python-checkins] python/dist/src/Objects descrobject.c,2.31,2.32 dictobject.c,2.135,2.136 typeobject.c,2.196,2.197

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
Mon, 09 Dec 2002 14:56:15 -0800


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

Modified Files:
	descrobject.c dictobject.c typeobject.c 
Log Message:
SF 548651:  Fix the METH_CLASS implementation.
Most of these patches are from Thomas Heller, with long lines folded
by Tim.  The change to test_descr.py is from Guido.  See the bug report.

Not a bugfix candidate -- METH_CLASS is new in 2.3.


Index: descrobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/descrobject.c,v
retrieving revision 2.31
retrieving revision 2.32
diff -C2 -d -r2.31 -r2.32
*** descrobject.c	31 Aug 2002 15:51:04 -0000	2.31
--- descrobject.c	9 Dec 2002 22:56:13 -0000	2.32
***************
*** 80,83 ****
--- 80,90 ----
  
  static PyObject *
+ classmethod_get(PyMethodDescrObject *descr, PyObject *obj,
+ 		PyTypeObject *type)
+ {
+ 	return PyCFunction_New(descr->d_method, (PyObject *)type);
+ }
+ 
+ static PyObject *
  method_get(PyMethodDescrObject *descr, PyObject *obj, PyTypeObject *type)
  {
***************
*** 214,217 ****
--- 221,239 ----
  
  static PyObject *
+ classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args,
+ 		      PyObject *kwds)
+ {
+ 	PyObject *func, *result;
+ 
+ 	func = PyCFunction_New(descr->d_method, (PyObject *)descr->d_type);
+ 	if (func == NULL)
+ 		return NULL;
+ 
+ 	result = PyEval_CallObjectWithKeywords(func, args, kwds);
+ 	Py_DECREF(func);
+ 	return result;
+ }
+ 
+ static PyObject *
  wrapperdescr_call(PyWrapperDescrObject *descr, PyObject *args, PyObject *kwds)
  {
***************
*** 374,377 ****
--- 396,437 ----
  };
  
+ static PyTypeObject PyClassMethodDescr_Type = {
+ 	PyObject_HEAD_INIT(&PyType_Type)
+ 	0,
+ 	"special_method_descriptor",
+ 	sizeof(PyMethodDescrObject),
+ 	0,
+ 	(destructor)descr_dealloc,		/* tp_dealloc */
+ 	0,					/* tp_print */
+ 	0,					/* tp_getattr */
+ 	0,					/* tp_setattr */
+ 	0,					/* tp_compare */
+ 	(reprfunc)method_repr,			/* tp_repr */
+ 	0,					/* tp_as_number */
+ 	0,					/* tp_as_sequence */
+ 	0,					/* tp_as_mapping */
+ 	0,					/* tp_hash */
+ 	(ternaryfunc)classmethoddescr_call,		/* tp_call */
+ 	0,					/* tp_str */
+ 	PyObject_GenericGetAttr,		/* tp_getattro */
+ 	0,					/* tp_setattro */
+ 	0,					/* tp_as_buffer */
+ 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
+ 	0,					/* tp_doc */
+ 	descr_traverse,				/* tp_traverse */
+ 	0,					/* tp_clear */
+ 	0,					/* tp_richcompare */
+ 	0,					/* tp_weaklistoffset */
+ 	0,					/* tp_iter */
+ 	0,					/* tp_iternext */
+ 	0,					/* tp_methods */
+ 	descr_members,				/* tp_members */
+ 	method_getset,				/* tp_getset */
+ 	0,					/* tp_base */
+ 	0,					/* tp_dict */
+ 	(descrgetfunc)classmethod_get,		/* tp_descr_get */
+ 	0,					/* tp_descr_set */
+ };
+ 
  static PyTypeObject PyMemberDescr_Type = {
  	PyObject_HEAD_INIT(&PyType_Type)
***************
*** 512,515 ****
--- 572,587 ----
  
  	descr = (PyMethodDescrObject *)descr_new(&PyMethodDescr_Type,
+ 						 type, method->ml_name);
+ 	if (descr != NULL)
+ 		descr->d_method = method;
+ 	return (PyObject *)descr;
+ }
+ 
+ PyObject *
+ PyDescr_NewClassMethod(PyTypeObject *type, PyMethodDef *method)
+ {
+ 	PyMethodDescrObject *descr;
+ 
+ 	descr = (PyMethodDescrObject *)descr_new(&PyClassMethodDescr_Type,
  						 type, method->ml_name);
  	if (descr != NULL)

Index: dictobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/dictobject.c,v
retrieving revision 2.135
retrieving revision 2.136
diff -C2 -d -r2.135 -r2.136
*** dictobject.c	7 Dec 2002 08:10:51 -0000	2.135
--- dictobject.c	9 Dec 2002 22:56:13 -0000	2.136
***************
*** 964,968 ****
  
  static PyObject *
! dict_fromkeys(PyObject *mp, PyObject *args)
  {
  	PyObject *seq;
--- 964,968 ----
  
  static PyObject *
! dict_fromkeys(PyObject *cls, PyObject *args)
  {
  	PyObject *seq;
***************
*** 971,978 ****
  	PyObject *key;
  	PyObject *d;
- 	PyObject *cls;
  	int status;
  
! 	if (!PyArg_ParseTuple(args, "OO|O:fromkeys", &cls, &seq, &value))
  		return NULL;
  
--- 971,977 ----
  	PyObject *key;
  	PyObject *d;
  	int status;
  
! 	if (!PyArg_ParseTuple(args, "O|O:fromkeys", &seq, &value))
  		return NULL;
  

Index: typeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/typeobject.c,v
retrieving revision 2.196
retrieving revision 2.197
diff -C2 -d -r2.196 -r2.197
*** typeobject.c	7 Dec 2002 21:39:16 -0000	2.196
--- typeobject.c	9 Dec 2002 22:56:13 -0000	2.197
***************
*** 2436,2440 ****
  				return -1;
  			}
! 			descr = create_specialmethod(meth, PyClassMethod_New);
  		}
  		else if (meth->ml_flags & METH_STATIC) {
--- 2436,2440 ----
  				return -1;
  			}
! 			descr = PyDescr_NewClassMethod(type, meth);
  		}
  		else if (meth->ml_flags & METH_STATIC) {