[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) {