[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 */