annotate Objects/descrobject.c @ 54294:dba767bc3155 legacy-trunk

remove mention of old ctypes version
author Benjamin Peterson <benjamin@python.org>
date Sat, 23 May 2009 20:59:09 +0000
parents c0d95625f17d
children e38335d4df91 ebe19c4c71f5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1 /* Descriptors -- a new, flexible way to describe attributes */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3 #include "Python.h"
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4 #include "structmember.h" /* Why is this not included in Python.h? */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
6 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
7 descr_dealloc(PyDescrObject *descr)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
8 {
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
9 _PyObject_GC_UNTRACK(descr);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
10 Py_XDECREF(descr->d_type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
11 Py_XDECREF(descr->d_name);
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
12 PyObject_GC_Del(descr);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
13 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
14
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
15 static char *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
16 descr_name(PyDescrObject *descr)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
17 {
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
18 if (descr->d_name != NULL && PyString_Check(descr->d_name))
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
19 return PyString_AS_STRING(descr->d_name);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
20 else
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
21 return "?";
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
22 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
23
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
24 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
25 descr_repr(PyDescrObject *descr, char *format)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
26 {
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
27 return PyString_FromFormat(format, descr_name(descr),
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19467
diff changeset
28 descr->d_type->tp_name);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
29 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
30
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
31 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
32 method_repr(PyMethodDescrObject *descr)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
33 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
34 return descr_repr((PyDescrObject *)descr,
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19467
diff changeset
35 "<method '%s' of '%s' objects>");
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
36 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
37
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
38 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
39 member_repr(PyMemberDescrObject *descr)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
40 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
41 return descr_repr((PyDescrObject *)descr,
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19467
diff changeset
42 "<member '%s' of '%s' objects>");
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
43 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
44
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
45 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
46 getset_repr(PyGetSetDescrObject *descr)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
47 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
48 return descr_repr((PyDescrObject *)descr,
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19467
diff changeset
49 "<attribute '%s' of '%s' objects>");
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
50 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
51
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
52 static PyObject *
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
53 wrapperdescr_repr(PyWrapperDescrObject *descr)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
54 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
55 return descr_repr((PyDescrObject *)descr,
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19467
diff changeset
56 "<slot wrapper '%s' of '%s' objects>");
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
57 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
58
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
59 static int
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
60 descr_check(PyDescrObject *descr, PyObject *obj, PyObject **pres)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
61 {
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
62 if (obj == NULL) {
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
63 Py_INCREF(descr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
64 *pres = (PyObject *)descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
65 return 1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
66 }
24890
d7ef2ba1b6f5 Simple but important optimization for descr_check(): instead of the
Guido van Rossum <guido@python.org>
parents: 24795
diff changeset
67 if (!PyObject_TypeCheck(obj, descr->d_type)) {
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
68 PyErr_Format(PyExc_TypeError,
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19467
diff changeset
69 "descriptor '%s' for '%s' objects "
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19467
diff changeset
70 "doesn't apply to '%s' object",
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
71 descr_name((PyDescrObject *)descr),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
72 descr->d_type->tp_name,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
73 obj->ob_type->tp_name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
74 *pres = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
75 return 1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
76 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
77 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
78 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
79
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
80 static PyObject *
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
81 classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type)
26583
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
82 {
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
83 /* Ensure a valid type. Class methods ignore obj. */
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
84 if (type == NULL) {
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
85 if (obj != NULL)
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
86 type = (PyObject *)obj->ob_type;
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
87 else {
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
88 /* Wot - no type?! */
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
89 PyErr_Format(PyExc_TypeError,
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
90 "descriptor '%s' for type '%s' "
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
91 "needs either an object or a type",
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
92 descr_name((PyDescrObject *)descr),
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
93 descr->d_type->tp_name);
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
94 return NULL;
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
95 }
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
96 }
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
97 if (!PyType_Check(type)) {
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
98 PyErr_Format(PyExc_TypeError,
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
99 "descriptor '%s' for type '%s' "
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
100 "needs a type, not a '%s' as arg 2",
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
101 descr_name((PyDescrObject *)descr),
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
102 descr->d_type->tp_name,
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
103 type->ob_type->tp_name);
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
104 return NULL;
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
105 }
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
106 if (!PyType_IsSubtype((PyTypeObject *)type, descr->d_type)) {
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
107 PyErr_Format(PyExc_TypeError,
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
108 "descriptor '%s' for type '%s' "
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
109 "doesn't apply to type '%s'",
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
110 descr_name((PyDescrObject *)descr),
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
111 descr->d_type->tp_name,
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
112 ((PyTypeObject *)type)->tp_name);
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
113 return NULL;
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
114 }
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
115 return PyCFunction_New(descr->d_method, type);
26583
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
116 }
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
117
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
118 static PyObject *
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
119 method_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
120 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
121 PyObject *res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
122
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
123 if (descr_check((PyDescrObject *)descr, obj, &res))
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
124 return res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
125 return PyCFunction_New(descr->d_method, obj);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
126 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
127
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
128 static PyObject *
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
129 member_get(PyMemberDescrObject *descr, PyObject *obj, PyObject *type)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
130 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
131 PyObject *res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
132
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
133 if (descr_check((PyDescrObject *)descr, obj, &res))
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
134 return res;
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
135 return PyMember_GetOne((char *)obj, descr->d_member);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
136 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
137
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
138 static PyObject *
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
139 getset_get(PyGetSetDescrObject *descr, PyObject *obj, PyObject *type)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
140 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
141 PyObject *res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
142
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
143 if (descr_check((PyDescrObject *)descr, obj, &res))
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
144 return res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
145 if (descr->d_getset->get != NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
146 return descr->d_getset->get(obj, descr->d_getset->closure);
34919
ae25d45f8987 As per discussion on python-dev, descriptors defined in C with a NULL setter
Barry Warsaw <barry@python.org>
parents: 31173
diff changeset
147 PyErr_Format(PyExc_AttributeError,
21430
a029e348304c SF bug #493561: incorrect format string descrobject.c (Neal Norwitz)
Guido van Rossum <guido@python.org>
parents: 21335
diff changeset
148 "attribute '%.300s' of '%.100s' objects is not readable",
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
149 descr_name((PyDescrObject *)descr),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
150 descr->d_type->tp_name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
151 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
152 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
153
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
154 static PyObject *
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
155 wrapperdescr_get(PyWrapperDescrObject *descr, PyObject *obj, PyObject *type)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
156 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
157 PyObject *res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
158
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
159 if (descr_check((PyDescrObject *)descr, obj, &res))
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
160 return res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
161 return PyWrapper_New((PyObject *)descr, obj);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
162 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
163
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
164 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
165 descr_setcheck(PyDescrObject *descr, PyObject *obj, PyObject *value,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
166 int *pres)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
167 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
168 assert(obj != NULL);
45364
557236d752e2 Issue #2115: __slot__ attributes setting was 10x slower.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 44406
diff changeset
169 if (!PyObject_TypeCheck(obj, descr->d_type)) {
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
170 PyErr_Format(PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
171 "descriptor '%.200s' for '%.100s' objects "
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
172 "doesn't apply to '%.100s' object",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
173 descr_name(descr),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
174 descr->d_type->tp_name,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
175 obj->ob_type->tp_name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
176 *pres = -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
177 return 1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
178 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
179 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
180 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
181
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
182 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
183 member_set(PyMemberDescrObject *descr, PyObject *obj, PyObject *value)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
184 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
185 int res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
186
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
187 if (descr_setcheck((PyDescrObject *)descr, obj, value, &res))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
188 return res;
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
189 return PyMember_SetOne((char *)obj, descr->d_member, value);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
190 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
191
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
192 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
193 getset_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *value)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
194 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
195 int res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
196
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
197 if (descr_setcheck((PyDescrObject *)descr, obj, value, &res))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
198 return res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
199 if (descr->d_getset->set != NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
200 return descr->d_getset->set(obj, value,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
201 descr->d_getset->closure);
34919
ae25d45f8987 As per discussion on python-dev, descriptors defined in C with a NULL setter
Barry Warsaw <barry@python.org>
parents: 31173
diff changeset
202 PyErr_Format(PyExc_AttributeError,
21430
a029e348304c SF bug #493561: incorrect format string descrobject.c (Neal Norwitz)
Guido van Rossum <guido@python.org>
parents: 21335
diff changeset
203 "attribute '%.300s' of '%.100s' objects is not writable",
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
204 descr_name((PyDescrObject *)descr),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
205 descr->d_type->tp_name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
206 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
207 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
208
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
209 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
210 methoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
211 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
212 Py_ssize_t argc;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
213 PyObject *self, *func, *result;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
214
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
215 /* Make sure that the first argument is acceptable as 'self' */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
216 assert(PyTuple_Check(args));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
217 argc = PyTuple_GET_SIZE(args);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
218 if (argc < 1) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
219 PyErr_Format(PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
220 "descriptor '%.300s' of '%.100s' "
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
221 "object needs an argument",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
222 descr_name((PyDescrObject *)descr),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
223 descr->d_type->tp_name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
224 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
225 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
226 self = PyTuple_GET_ITEM(args, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
227 if (!PyObject_IsInstance(self, (PyObject *)(descr->d_type))) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
228 PyErr_Format(PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
229 "descriptor '%.200s' "
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
230 "requires a '%.100s' object "
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
231 "but received a '%.100s'",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
232 descr_name((PyDescrObject *)descr),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
233 descr->d_type->tp_name,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
234 self->ob_type->tp_name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
235 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
236 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
237
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
238 func = PyCFunction_New(descr->d_method, self);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
239 if (func == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
240 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
241 args = PyTuple_GetSlice(args, 1, argc);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
242 if (args == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
243 Py_DECREF(func);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
244 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
245 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
246 result = PyEval_CallObjectWithKeywords(func, args, kwds);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
247 Py_DECREF(args);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
248 Py_DECREF(func);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
249 return result;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
250 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
251
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
252 static PyObject *
26583
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
253 classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args,
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
254 PyObject *kwds)
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
255 {
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
256 PyObject *func, *result;
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
257
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
258 func = PyCFunction_New(descr->d_method, (PyObject *)descr->d_type);
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
259 if (func == NULL)
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
260 return NULL;
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
261
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
262 result = PyEval_CallObjectWithKeywords(func, args, kwds);
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
263 Py_DECREF(func);
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
264 return result;
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
265 }
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
266
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
267 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
268 wrapperdescr_call(PyWrapperDescrObject *descr, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
269 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
270 Py_ssize_t argc;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
271 PyObject *self, *func, *result;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
272
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
273 /* Make sure that the first argument is acceptable as 'self' */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
274 assert(PyTuple_Check(args));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
275 argc = PyTuple_GET_SIZE(args);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
276 if (argc < 1) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
277 PyErr_Format(PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
278 "descriptor '%.300s' of '%.100s' "
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
279 "object needs an argument",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
280 descr_name((PyDescrObject *)descr),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
281 descr->d_type->tp_name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
282 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
283 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
284 self = PyTuple_GET_ITEM(args, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
285 if (!PyObject_IsInstance(self, (PyObject *)(descr->d_type))) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
286 PyErr_Format(PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
287 "descriptor '%.200s' "
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
288 "requires a '%.100s' object "
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
289 "but received a '%.100s'",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
290 descr_name((PyDescrObject *)descr),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
291 descr->d_type->tp_name,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
292 self->ob_type->tp_name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
293 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
294 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
295
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
296 func = PyWrapper_New((PyObject *)descr, self);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
297 if (func == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
298 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
299 args = PyTuple_GetSlice(args, 1, argc);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
300 if (args == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
301 Py_DECREF(func);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
302 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
303 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
304 result = PyEval_CallObjectWithKeywords(func, args, kwds);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
305 Py_DECREF(args);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
306 Py_DECREF(func);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
307 return result;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
308 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
309
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
310 static PyObject *
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
311 method_get_doc(PyMethodDescrObject *descr, void *closure)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
312 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
313 if (descr->d_method->ml_doc == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
314 Py_INCREF(Py_None);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
315 return Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
316 }
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
317 return PyString_FromString(descr->d_method->ml_doc);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
318 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
319
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
320 static PyMemberDef descr_members[] = {
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
321 {"__objclass__", T_OBJECT, offsetof(PyDescrObject, d_type), READONLY},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
322 {"__name__", T_OBJECT, offsetof(PyDescrObject, d_name), READONLY},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
323 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
324 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
325
20015
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
326 static PyGetSetDef method_getset[] = {
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
327 {"__doc__", (getter)method_get_doc},
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
328 {0}
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
329 };
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
330
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
331 static PyObject *
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
332 member_get_doc(PyMemberDescrObject *descr, void *closure)
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
333 {
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
334 if (descr->d_member->doc == NULL) {
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
335 Py_INCREF(Py_None);
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
336 return Py_None;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
337 }
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
338 return PyString_FromString(descr->d_member->doc);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
339 }
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
340
20015
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
341 static PyGetSetDef member_getset[] = {
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
342 {"__doc__", (getter)member_get_doc},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
343 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
344 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
345
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
346 static PyObject *
20015
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
347 getset_get_doc(PyGetSetDescrObject *descr, void *closure)
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
348 {
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
349 if (descr->d_getset->doc == NULL) {
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
350 Py_INCREF(Py_None);
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
351 return Py_None;
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
352 }
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
353 return PyString_FromString(descr->d_getset->doc);
20015
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
354 }
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
355
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
356 static PyGetSetDef getset_getset[] = {
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
357 {"__doc__", (getter)getset_get_doc},
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
358 {0}
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
359 };
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
360
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
361 static PyObject *
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
362 wrapperdescr_get_doc(PyWrapperDescrObject *descr, void *closure)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
363 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
364 if (descr->d_base->doc == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
365 Py_INCREF(Py_None);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
366 return Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
367 }
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
368 return PyString_FromString(descr->d_base->doc);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
369 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
370
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
371 static PyGetSetDef wrapperdescr_getset[] = {
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
372 {"__doc__", (getter)wrapperdescr_get_doc},
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
373 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
374 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
375
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
376 static int
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
377 descr_traverse(PyObject *self, visitproc visit, void *arg)
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
378 {
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
379 PyDescrObject *descr = (PyDescrObject *)self;
37756
7b2e436a4a21 Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
Thomas Wouters <thomas@python.org>
parents: 37304
diff changeset
380 Py_VISIT(descr->d_type);
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
381 return 0;
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
382 }
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
383
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
384 static PyTypeObject PyMethodDescr_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 39371
diff changeset
385 PyVarObject_HEAD_INIT(&PyType_Type, 0)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
386 "method_descriptor",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
387 sizeof(PyMethodDescrObject),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
388 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
389 (destructor)descr_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
390 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
391 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
392 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
393 0, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
394 (reprfunc)method_repr, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
395 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
396 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
397 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
398 0, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
399 (ternaryfunc)methoddescr_call, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
400 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
401 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
402 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
403 0, /* tp_as_buffer */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
404 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
405 0, /* tp_doc */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
406 descr_traverse, /* tp_traverse */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
407 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
408 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
409 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
410 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
411 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
412 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
413 descr_members, /* tp_members */
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
414 method_getset, /* tp_getset */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
415 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
416 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
417 (descrgetfunc)method_get, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
418 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
419 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
420
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
421 /* This is for METH_CLASS in C, not for "f = classmethod(f)" in Python! */
26583
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
422 static PyTypeObject PyClassMethodDescr_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 39371
diff changeset
423 PyVarObject_HEAD_INIT(&PyType_Type, 0)
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
424 "classmethod_descriptor",
26583
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
425 sizeof(PyMethodDescrObject),
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
426 0,
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
427 (destructor)descr_dealloc, /* tp_dealloc */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
428 0, /* tp_print */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
429 0, /* tp_getattr */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
430 0, /* tp_setattr */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
431 0, /* tp_compare */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
432 (reprfunc)method_repr, /* tp_repr */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
433 0, /* tp_as_number */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
434 0, /* tp_as_sequence */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
435 0, /* tp_as_mapping */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
436 0, /* tp_hash */
27818
59fbae33a0f9 Put proper tests in classmethod_get(). Remove the type argument to
Guido van Rossum <guido@python.org>
parents: 26818
diff changeset
437 (ternaryfunc)classmethoddescr_call, /* tp_call */
26583
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
438 0, /* tp_str */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
439 PyObject_GenericGetAttr, /* tp_getattro */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
440 0, /* tp_setattro */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
441 0, /* tp_as_buffer */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
442 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
443 0, /* tp_doc */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
444 descr_traverse, /* tp_traverse */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
445 0, /* tp_clear */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
446 0, /* tp_richcompare */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
447 0, /* tp_weaklistoffset */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
448 0, /* tp_iter */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
449 0, /* tp_iternext */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
450 0, /* tp_methods */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
451 descr_members, /* tp_members */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
452 method_getset, /* tp_getset */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
453 0, /* tp_base */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
454 0, /* tp_dict */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
455 (descrgetfunc)classmethod_get, /* tp_descr_get */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
456 0, /* tp_descr_set */
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
457 };
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
458
53273
42bf56e34825 Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47527
diff changeset
459 PyTypeObject PyMemberDescr_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 39371
diff changeset
460 PyVarObject_HEAD_INIT(&PyType_Type, 0)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
461 "member_descriptor",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
462 sizeof(PyMemberDescrObject),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
463 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
464 (destructor)descr_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
465 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
466 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
467 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
468 0, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
469 (reprfunc)member_repr, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
470 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
471 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
472 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
473 0, /* tp_hash */
37304
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36896
diff changeset
474 0, /* tp_call */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
475 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
476 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
477 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
478 0, /* tp_as_buffer */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
479 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
480 0, /* tp_doc */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
481 descr_traverse, /* tp_traverse */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
482 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
483 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
484 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
485 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
486 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
487 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
488 descr_members, /* tp_members */
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
489 member_getset, /* tp_getset */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
490 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
491 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
492 (descrgetfunc)member_get, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
493 (descrsetfunc)member_set, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
494 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
495
53273
42bf56e34825 Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47527
diff changeset
496 PyTypeObject PyGetSetDescr_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 39371
diff changeset
497 PyVarObject_HEAD_INIT(&PyType_Type, 0)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
498 "getset_descriptor",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
499 sizeof(PyGetSetDescrObject),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
500 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
501 (destructor)descr_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
502 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
503 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
504 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
505 0, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
506 (reprfunc)getset_repr, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
507 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
508 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
509 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
510 0, /* tp_hash */
37304
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36896
diff changeset
511 0, /* tp_call */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
512 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
513 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
514 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
515 0, /* tp_as_buffer */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
516 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
517 0, /* tp_doc */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
518 descr_traverse, /* tp_traverse */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
519 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
520 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
521 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
522 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
523 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
524 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
525 descr_members, /* tp_members */
20015
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
526 getset_getset, /* tp_getset */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
527 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
528 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
529 (descrgetfunc)getset_get, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
530 (descrsetfunc)getset_set, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
531 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
532
20229
8bad55edfdf3 *EXPERIMENTAL* speedup of slot_sq_item. This sped up the following
Guido van Rossum <guido@python.org>
parents: 20220
diff changeset
533 PyTypeObject PyWrapperDescr_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 39371
diff changeset
534 PyVarObject_HEAD_INIT(&PyType_Type, 0)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
535 "wrapper_descriptor",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
536 sizeof(PyWrapperDescrObject),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
537 0,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
538 (destructor)descr_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
539 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
540 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
541 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
542 0, /* tp_compare */
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
543 (reprfunc)wrapperdescr_repr, /* tp_repr */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
544 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
545 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
546 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
547 0, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
548 (ternaryfunc)wrapperdescr_call, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
549 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
550 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
551 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
552 0, /* tp_as_buffer */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
553 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
554 0, /* tp_doc */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
555 descr_traverse, /* tp_traverse */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
556 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
557 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
558 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
559 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
560 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
561 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
562 descr_members, /* tp_members */
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
563 wrapperdescr_getset, /* tp_getset */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
564 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
565 0, /* tp_dict */
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
566 (descrgetfunc)wrapperdescr_get, /* tp_descr_get */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
567 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
568 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
569
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
570 static PyDescrObject *
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35841
diff changeset
571 descr_new(PyTypeObject *descrtype, PyTypeObject *type, const char *name)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
572 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
573 PyDescrObject *descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
574
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
575 descr = (PyDescrObject *)PyType_GenericAlloc(descrtype, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
576 if (descr != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
577 Py_XINCREF(type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
578 descr->d_type = type;
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
579 descr->d_name = PyString_InternFromString(name);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
580 if (descr->d_name == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
581 Py_DECREF(descr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
582 descr = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
583 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
584 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
585 return descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
586 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
587
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
588 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
589 PyDescr_NewMethod(PyTypeObject *type, PyMethodDef *method)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
590 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
591 PyMethodDescrObject *descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
592
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
593 descr = (PyMethodDescrObject *)descr_new(&PyMethodDescr_Type,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
594 type, method->ml_name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
595 if (descr != NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
596 descr->d_method = method;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
597 return (PyObject *)descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
598 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
599
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
600 PyObject *
26583
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
601 PyDescr_NewClassMethod(PyTypeObject *type, PyMethodDef *method)
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
602 {
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
603 PyMethodDescrObject *descr;
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
604
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
605 descr = (PyMethodDescrObject *)descr_new(&PyClassMethodDescr_Type,
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
606 type, method->ml_name);
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
607 if (descr != NULL)
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
608 descr->d_method = method;
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
609 return (PyObject *)descr;
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
610 }
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
611
8991f78817c7 SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents: 25086
diff changeset
612 PyObject *
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19786
diff changeset
613 PyDescr_NewMember(PyTypeObject *type, PyMemberDef *member)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
614 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
615 PyMemberDescrObject *descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
616
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
617 descr = (PyMemberDescrObject *)descr_new(&PyMemberDescr_Type,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
618 type, member->name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
619 if (descr != NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
620 descr->d_member = member;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
621 return (PyObject *)descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
622 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
623
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
624 PyObject *
20015
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
625 PyDescr_NewGetSet(PyTypeObject *type, PyGetSetDef *getset)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
626 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
627 PyGetSetDescrObject *descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
628
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
629 descr = (PyGetSetDescrObject *)descr_new(&PyGetSetDescr_Type,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
630 type, getset->name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
631 if (descr != NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
632 descr->d_getset = getset;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
633 return (PyObject *)descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
634 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
635
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
636 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
637 PyDescr_NewWrapper(PyTypeObject *type, struct wrapperbase *base, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
638 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
639 PyWrapperDescrObject *descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
640
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
641 descr = (PyWrapperDescrObject *)descr_new(&PyWrapperDescr_Type,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
642 type, base->name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
643 if (descr != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
644 descr->d_base = base;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
645 descr->d_wrapped = wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
646 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
647 return (PyObject *)descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
648 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
649
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
650
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
651 /* --- Readonly proxy for dictionaries (actually any mapping) --- */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
652
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
653 /* This has no reason to be in this file except that adding new files is a
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
654 bit of a pain */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
655
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
656 typedef struct {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
657 PyObject_HEAD
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
658 PyObject *dict;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
659 } proxyobject;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
660
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
661 static Py_ssize_t
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
662 proxy_len(proxyobject *pp)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
663 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
664 return PyObject_Size(pp->dict);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
665 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
666
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
667 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
668 proxy_getitem(proxyobject *pp, PyObject *key)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
669 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
670 return PyObject_GetItem(pp->dict, key);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
671 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
672
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
673 static PyMappingMethods proxy_as_mapping = {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
674 (lenfunc)proxy_len, /* mp_length */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
675 (binaryfunc)proxy_getitem, /* mp_subscript */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
676 0, /* mp_ass_subscript */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
677 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
678
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
679 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
680 proxy_contains(proxyobject *pp, PyObject *key)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
681 {
31173
c9bbc967ac9f Use PyDict_Contains() instead of PySequence_Contains().
Raymond Hettinger <python@rcn.com>
parents: 30662
diff changeset
682 return PyDict_Contains(pp->dict, key);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
683 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
684
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
685 static PySequenceMethods proxy_as_sequence = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
686 0, /* sq_length */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
687 0, /* sq_concat */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
688 0, /* sq_repeat */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
689 0, /* sq_item */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
690 0, /* sq_slice */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
691 0, /* sq_ass_item */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
692 0, /* sq_ass_slice */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
693 (objobjproc)proxy_contains, /* sq_contains */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
694 0, /* sq_inplace_concat */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
695 0, /* sq_inplace_repeat */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
696 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
697
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
698 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19297
diff changeset
699 proxy_has_key(proxyobject *pp, PyObject *key)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
700 {
31173
c9bbc967ac9f Use PyDict_Contains() instead of PySequence_Contains().
Raymond Hettinger <python@rcn.com>
parents: 30662
diff changeset
701 int res = PyDict_Contains(pp->dict, key);
30662
6ef245136038 SF patch #820195: make object.__contains__() returns True or False instead
Raymond Hettinger <python@rcn.com>
parents: 30265
diff changeset
702 if (res < 0)
6ef245136038 SF patch #820195: make object.__contains__() returns True or False instead
Raymond Hettinger <python@rcn.com>
parents: 30265
diff changeset
703 return NULL;
6ef245136038 SF patch #820195: make object.__contains__() returns True or False instead
Raymond Hettinger <python@rcn.com>
parents: 30265
diff changeset
704 return PyBool_FromLong(res);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
705 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
706
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
707 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
708 proxy_get(proxyobject *pp, PyObject *args)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
709 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
710 PyObject *key, *def = Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
711
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26583
diff changeset
712 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &def))
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
713 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
714 return PyObject_CallMethod(pp->dict, "get", "(OO)", key, def);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
715 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
716
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
717 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19297
diff changeset
718 proxy_keys(proxyobject *pp)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
719 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
720 return PyMapping_Keys(pp->dict);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
721 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
722
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
723 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19297
diff changeset
724 proxy_values(proxyobject *pp)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
725 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
726 return PyMapping_Values(pp->dict);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
727 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
728
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
729 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19297
diff changeset
730 proxy_items(proxyobject *pp)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
731 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
732 return PyMapping_Items(pp->dict);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
733 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
734
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
735 static PyObject *
22552
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
736 proxy_iterkeys(proxyobject *pp)
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
737 {
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
738 return PyObject_CallMethod(pp->dict, "iterkeys", NULL);
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
739 }
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
740
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
741 static PyObject *
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
742 proxy_itervalues(proxyobject *pp)
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
743 {
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
744 return PyObject_CallMethod(pp->dict, "itervalues", NULL);
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
745 }
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
746
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
747 static PyObject *
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
748 proxy_iteritems(proxyobject *pp)
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
749 {
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
750 return PyObject_CallMethod(pp->dict, "iteritems", NULL);
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
751 }
9eb4e62309b0 Add missing methods iterkeys, itervalues and iteritems to
Walter Dörwald <walter@livinglogic.de>
parents: 21430
diff changeset
752 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19297
diff changeset
753 proxy_copy(proxyobject *pp)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
754 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
755 return PyObject_CallMethod(pp->dict, "copy", NULL);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
756 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
757
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
758 static PyMethodDef proxy_methods[] = {
23022
ebe3ce6cbfd7 Fold long lines. (Walter, please take note! :-)
Guido van Rossum <guido@python.org>
parents: 22975
diff changeset
759 {"has_key", (PyCFunction)proxy_has_key, METH_O,
30265
51744279458f SF patch #798467: Update docstring of has_key for bool changes
Raymond Hettinger <python@rcn.com>
parents: 28548
diff changeset
760 PyDoc_STR("D.has_key(k) -> True if D has a key k, else False")},
23022
ebe3ce6cbfd7 Fold long lines. (Walter, please take note! :-)
Guido van Rossum <guido@python.org>
parents: 22975
diff changeset
761 {"get", (PyCFunction)proxy_get, METH_VARARGS,
24795
452d6a916196 Allow more docstrings to be removed during compilation
Neal Norwitz <nnorwitz@gmail.com>
parents: 23868
diff changeset
762 PyDoc_STR("D.get(k[,d]) -> D[k] if D.has_key(k), else d."
452d6a916196 Allow more docstrings to be removed during compilation
Neal Norwitz <nnorwitz@gmail.com>
parents: 23868
diff changeset
763 " d defaults to None.")},
23022
ebe3ce6cbfd7 Fold long lines. (Walter, please take note! :-)
Guido van Rossum <guido@python.org>
parents: 22975
diff changeset
764 {"keys", (PyCFunction)proxy_keys, METH_NOARGS,
24795
452d6a916196 Allow more docstrings to be removed during compilation
Neal Norwitz <nnorwitz@gmail.com>
parents: 23868
diff changeset
765 PyDoc_STR("D.keys() -> list of D's keys")},
23022
ebe3ce6cbfd7 Fold long lines. (Walter, please take note! :-)
Guido van Rossum <guido@python.org>
parents: 22975
diff changeset
766 {"values", (PyCFunction)proxy_values, METH_NOARGS,
24795
452d6a916196 Allow more docstrings to be removed during compilation
Neal Norwitz <nnorwitz@gmail.com>
parents: 23868
diff changeset
767 PyDoc_STR("D.values() -> list of D's values")},
23022
ebe3ce6cbfd7 Fold long lines. (Walter, please take note! :-)
Guido van Rossum <guido@python.org>
parents: 22975
diff changeset
768 {"items", (PyCFunction)proxy_items, METH_NOARGS,
24795
452d6a916196 Allow more docstrings to be removed during compilation
Neal Norwitz <nnorwitz@gmail.com>
parents: 23868
diff changeset
769 PyDoc_STR("D.items() -> list of D's (key, value) pairs, as 2-tuples")},
23022
ebe3ce6cbfd7 Fold long lines. (Walter, please take note! :-)
Guido van Rossum <guido@python.org>
parents: 22975
diff changeset
770 {"iterkeys", (PyCFunction)proxy_iterkeys, METH_NOARGS,
24795
452d6a916196 Allow more docstrings to be removed during compilation
Neal Norwitz <nnorwitz@gmail.com>
parents: 23868
diff changeset
771 PyDoc_STR("D.iterkeys() -> an iterator over the keys of D")},
23022
ebe3ce6cbfd7 Fold long lines. (Walter, please take note! :-)
Guido van Rossum <guido@python.org>
parents: 22975
diff changeset
772 {"itervalues",(PyCFunction)proxy_itervalues, METH_NOARGS,
24795
452d6a916196 Allow more docstrings to be removed during compilation
Neal Norwitz <nnorwitz@gmail.com>
parents: 23868
diff changeset
773 PyDoc_STR("D.itervalues() -> an iterator over the values of D")},
23022
ebe3ce6cbfd7 Fold long lines. (Walter, please take note! :-)
Guido van Rossum <guido@python.org>
parents: 22975
diff changeset
774 {"iteritems", (PyCFunction)proxy_iteritems, METH_NOARGS,
24795
452d6a916196 Allow more docstrings to be removed during compilation
Neal Norwitz <nnorwitz@gmail.com>
parents: 23868
diff changeset
775 PyDoc_STR("D.iteritems() ->"
452d6a916196 Allow more docstrings to be removed during compilation
Neal Norwitz <nnorwitz@gmail.com>
parents: 23868
diff changeset
776 " an iterator over the (key, value) items of D")},
23022
ebe3ce6cbfd7 Fold long lines. (Walter, please take note! :-)
Guido van Rossum <guido@python.org>
parents: 22975
diff changeset
777 {"copy", (PyCFunction)proxy_copy, METH_NOARGS,
24795
452d6a916196 Allow more docstrings to be removed during compilation
Neal Norwitz <nnorwitz@gmail.com>
parents: 23868
diff changeset
778 PyDoc_STR("D.copy() -> a shallow copy of D")},
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
779 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
780 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
781
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
782 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
783 proxy_dealloc(proxyobject *pp)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
784 {
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
785 _PyObject_GC_UNTRACK(pp);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
786 Py_DECREF(pp->dict);
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
787 PyObject_GC_Del(pp);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
788 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
789
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
790 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
791 proxy_getiter(proxyobject *pp)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
792 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
793 return PyObject_GetIter(pp->dict);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
794 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
795
20594
0d5e6fc0481d Adding missing "static" declarations (found by "make smelly").
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20229
diff changeset
796 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
797 proxy_str(proxyobject *pp)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
798 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
799 return PyObject_Str(pp->dict);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
800 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
801
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
802 static int
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
803 proxy_traverse(PyObject *self, visitproc visit, void *arg)
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
804 {
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
805 proxyobject *pp = (proxyobject *)self;
37756
7b2e436a4a21 Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
Thomas Wouters <thomas@python.org>
parents: 37304
diff changeset
806 Py_VISIT(pp->dict);
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
807 return 0;
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
808 }
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
809
25086
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
810 static int
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
811 proxy_compare(proxyobject *v, PyObject *w)
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
812 {
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
813 return PyObject_Compare(v->dict, w);
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
814 }
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
815
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
816 static PyObject *
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
817 proxy_richcompare(proxyobject *v, PyObject *w, int op)
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
818 {
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
819 return PyObject_RichCompare(v->dict, w, op);
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
820 }
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
821
53273
42bf56e34825 Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47527
diff changeset
822 PyTypeObject PyDictProxy_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 39371
diff changeset
823 PyVarObject_HEAD_INIT(&PyType_Type, 0)
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
824 "dictproxy", /* tp_name */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
825 sizeof(proxyobject), /* tp_basicsize */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
826 0, /* tp_itemsize */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
827 /* methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
828 (destructor)proxy_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
829 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
830 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
831 0, /* tp_setattr */
25086
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
832 (cmpfunc)proxy_compare, /* tp_compare */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
833 0, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
834 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
835 &proxy_as_sequence, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
836 &proxy_as_mapping, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
837 0, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
838 0, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
839 (reprfunc)proxy_str, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
840 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
841 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
842 0, /* tp_as_buffer */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
843 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
844 0, /* tp_doc */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
845 proxy_traverse, /* tp_traverse */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
846 0, /* tp_clear */
25086
84bfb8a805fc Added comparison functions to dict proxies.
Raymond Hettinger <python@rcn.com>
parents: 24896
diff changeset
847 (richcmpfunc)proxy_richcompare, /* tp_richcompare */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
848 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
849 (getiterfunc)proxy_getiter, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
850 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
851 proxy_methods, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
852 0, /* tp_members */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
853 0, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
854 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
855 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
856 0, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
857 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
858 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
859
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
860 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
861 PyDictProxy_New(PyObject *dict)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
862 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
863 proxyobject *pp;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
864
53273
42bf56e34825 Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47527
diff changeset
865 pp = PyObject_GC_New(proxyobject, &PyDictProxy_Type);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
866 if (pp != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
867 Py_INCREF(dict);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
868 pp->dict = dict;
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
869 _PyObject_GC_TRACK(pp);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
870 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
871 return (PyObject *)pp;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
872 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
873
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
874
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
875 /* --- Wrapper object for "slot" methods --- */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
876
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
877 /* This has no reason to be in this file except that adding new files is a
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
878 bit of a pain */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
879
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
880 typedef struct {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
881 PyObject_HEAD
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
882 PyWrapperDescrObject *descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
883 PyObject *self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
884 } wrapperobject;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
885
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
886 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
887 wrapper_dealloc(wrapperobject *wp)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
888 {
38995
c5bebcbe4539 Put method-wrappers into trashcan. Fixes #927248.
Martin v. Löwis <martin@v.loewis.de>
parents: 38659
diff changeset
889 PyObject_GC_UnTrack(wp);
c5bebcbe4539 Put method-wrappers into trashcan. Fixes #927248.
Martin v. Löwis <martin@v.loewis.de>
parents: 38659
diff changeset
890 Py_TRASHCAN_SAFE_BEGIN(wp)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
891 Py_XDECREF(wp->descr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
892 Py_XDECREF(wp->self);
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
893 PyObject_GC_Del(wp);
38995
c5bebcbe4539 Put method-wrappers into trashcan. Fixes #927248.
Martin v. Löwis <martin@v.loewis.de>
parents: 38659
diff changeset
894 Py_TRASHCAN_SAFE_END(wp)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
895 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
896
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
897 static int
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
898 wrapper_compare(wrapperobject *a, wrapperobject *b)
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
899 {
38659
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
900 if (a->descr == b->descr)
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
901 return PyObject_Compare(a->self, b->self);
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
902 else
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
903 return (a->descr < b->descr) ? -1 : 1;
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
904 }
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
905
38659
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
906 static long
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
907 wrapper_hash(wrapperobject *wp)
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
908 {
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
909 int x, y;
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
910 x = _Py_HashPointer(wp->descr);
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
911 if (x == -1)
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
912 return -1;
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
913 y = PyObject_Hash(wp->self);
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
914 if (y == -1)
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
915 return -1;
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
916 x = x ^ y;
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
917 if (x == -1)
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
918 x = -2;
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
919 return x;
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
920 }
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
921
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
922 static PyObject *
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
923 wrapper_repr(wrapperobject *wp)
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
924 {
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
925 return PyString_FromFormat("<method-wrapper '%s' of %s object at %p>",
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
926 wp->descr->d_base->name,
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
927 wp->self->ob_type->tp_name,
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
928 wp->self);
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
929 }
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
930
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
931 static PyMemberDef wrapper_members[] = {
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
932 {"__self__", T_OBJECT, offsetof(wrapperobject, self), READONLY},
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
933 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
934 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
935
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
936 static PyObject *
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
937 wrapper_objclass(wrapperobject *wp)
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
938 {
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
939 PyObject *c = (PyObject *)wp->descr->d_type;
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
940
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
941 Py_INCREF(c);
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
942 return c;
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
943 }
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
944
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
945 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
946 wrapper_name(wrapperobject *wp)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
947 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
948 char *s = wp->descr->d_base->name;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
949
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
950 return PyString_FromString(s);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
951 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
952
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
953 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
954 wrapper_doc(wrapperobject *wp)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
955 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
956 char *s = wp->descr->d_base->doc;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
957
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
958 if (s == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
959 Py_INCREF(Py_None);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
960 return Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
961 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
962 else {
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
963 return PyString_FromString(s);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
964 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
965 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
966
20015
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
967 static PyGetSetDef wrapper_getsets[] = {
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
968 {"__objclass__", (getter)wrapper_objclass},
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
969 {"__name__", (getter)wrapper_name},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
970 {"__doc__", (getter)wrapper_doc},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
971 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
972 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
973
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
974 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
975 wrapper_call(wrapperobject *wp, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
976 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
977 wrapperfunc wrapper = wp->descr->d_base->wrapper;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
978 PyObject *self = wp->self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
979
20599
ff57a1a370b3 Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents: 20594
diff changeset
980 if (wp->descr->d_base->flags & PyWrapperFlag_KEYWORDS) {
ff57a1a370b3 Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents: 20594
diff changeset
981 wrapperfunc_kwds wk = (wrapperfunc_kwds)wrapper;
ff57a1a370b3 Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents: 20594
diff changeset
982 return (*wk)(self, args, wp->descr->d_wrapped, kwds);
ff57a1a370b3 Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents: 20594
diff changeset
983 }
ff57a1a370b3 Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents: 20594
diff changeset
984
ff57a1a370b3 Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents: 20594
diff changeset
985 if (kwds != NULL && (!PyDict_Check(kwds) || PyDict_Size(kwds) != 0)) {
ff57a1a370b3 Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents: 20594
diff changeset
986 PyErr_Format(PyExc_TypeError,
ff57a1a370b3 Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents: 20594
diff changeset
987 "wrapper %s doesn't take keyword arguments",
ff57a1a370b3 Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents: 20594
diff changeset
988 wp->descr->d_base->name);
ff57a1a370b3 Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents: 20594
diff changeset
989 return NULL;
ff57a1a370b3 Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents: 20594
diff changeset
990 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
991 return (*wrapper)(self, args, wp->descr->d_wrapped);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
992 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
993
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
994 static int
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
995 wrapper_traverse(PyObject *self, visitproc visit, void *arg)
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
996 {
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
997 wrapperobject *wp = (wrapperobject *)self;
37756
7b2e436a4a21 Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
Thomas Wouters <thomas@python.org>
parents: 37304
diff changeset
998 Py_VISIT(wp->descr);
7b2e436a4a21 Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
Thomas Wouters <thomas@python.org>
parents: 37304
diff changeset
999 Py_VISIT(wp->self);
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1000 return 0;
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1001 }
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1002
20594
0d5e6fc0481d Adding missing "static" declarations (found by "make smelly").
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20229
diff changeset
1003 static PyTypeObject wrappertype = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 39371
diff changeset
1004 PyVarObject_HEAD_INIT(&PyType_Type, 0)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1005 "method-wrapper", /* tp_name */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1006 sizeof(wrapperobject), /* tp_basicsize */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1007 0, /* tp_itemsize */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1008 /* methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1009 (destructor)wrapper_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1010 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1011 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1012 0, /* tp_setattr */
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
1013 (cmpfunc)wrapper_compare, /* tp_compare */
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
1014 (reprfunc)wrapper_repr, /* tp_repr */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1015 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1016 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1017 0, /* tp_as_mapping */
38659
5c58fda95aa5 (arre, arigo) SF bug #1350060
Armin Rigo <arigo@tunes.org>
parents: 37756
diff changeset
1018 (hashfunc)wrapper_hash, /* tp_hash */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1019 (ternaryfunc)wrapper_call, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1020 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1021 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1022 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1023 0, /* tp_as_buffer */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1024 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1025 0, /* tp_doc */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1026 wrapper_traverse, /* tp_traverse */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1027 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1028 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1029 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1030 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1031 0, /* tp_iternext */
35841
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
1032 0, /* tp_methods */
6e2b282434d4 Added proper reflection on instances of <type 'method-wrapper'>, e.g.
Armin Rigo <arigo@tunes.org>
parents: 34919
diff changeset
1033 wrapper_members, /* tp_members */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1034 wrapper_getsets, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1035 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1036 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1037 0, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1038 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1039 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1040
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1041 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1042 PyWrapper_New(PyObject *d, PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1043 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1044 wrapperobject *wp;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1045 PyWrapperDescrObject *descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1046
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1047 assert(PyObject_TypeCheck(d, &PyWrapperDescr_Type));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1048 descr = (PyWrapperDescrObject *)d;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1049 assert(PyObject_IsInstance(self, (PyObject *)(descr->d_type)));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1050
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1051 wp = PyObject_GC_New(wrapperobject, &wrappertype);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1052 if (wp != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1053 Py_INCREF(descr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1054 wp->descr = descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1055 Py_INCREF(self);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1056 wp->self = self;
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1057 _PyObject_GC_TRACK(wp);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1058 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1059 return (PyObject *)wp;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
1060 }
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1061
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1062
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1063 /* A built-in 'property' type */
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1064
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1065 /*
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1066 class property(object):
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1067
21334
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1068 def __init__(self, fget=None, fset=None, fdel=None, doc=None):
36896
435f7f3c8b6d Patch #1434038: property() now uses the getter's docstring if there is
Georg Brandl <georg@python.org>
parents: 36675
diff changeset
1069 if doc is None and fget is not None and hasattr(fget, "__doc__"):
435f7f3c8b6d Patch #1434038: property() now uses the getter's docstring if there is
Georg Brandl <georg@python.org>
parents: 36675
diff changeset
1070 doc = fget.__doc__
21334
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1071 self.__get = fget
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1072 self.__set = fset
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1073 self.__del = fdel
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1074 self.__doc__ = doc
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1075
21334
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1076 def __get__(self, inst, type=None):
21335
18f60810b94a Well what do you know. The Python implementation contained the same
Guido van Rossum <guido@python.org>
parents: 21334
diff changeset
1077 if inst is None:
18f60810b94a Well what do you know. The Python implementation contained the same
Guido van Rossum <guido@python.org>
parents: 21334
diff changeset
1078 return self
21334
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1079 if self.__get is None:
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1080 raise AttributeError, "unreadable attribute"
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1081 return self.__get(inst)
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1082
21334
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1083 def __set__(self, inst, value):
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1084 if self.__set is None:
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1085 raise AttributeError, "can't set attribute"
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1086 return self.__set(inst, value)
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1087
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1088 def __delete__(self, inst):
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1089 if self.__del is None:
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1090 raise AttributeError, "can't delete attribute"
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1091 return self.__del(inst)
cf2fb20a6ce7 Fix the Python property class in a comment right.
Guido van Rossum <guido@python.org>
parents: 21333
diff changeset
1092
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1093 */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1094
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1095 typedef struct {
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1096 PyObject_HEAD
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1097 PyObject *prop_get;
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1098 PyObject *prop_set;
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1099 PyObject *prop_del;
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1100 PyObject *prop_doc;
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1101 int getter_doc;
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1102 } propertyobject;
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1103
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1104 static PyObject * property_copy(PyObject *, PyObject *, PyObject *,
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1105 PyObject *, PyObject *);
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1106
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1107 static PyMemberDef property_members[] = {
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1108 {"fget", T_OBJECT, offsetof(propertyobject, prop_get), READONLY},
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1109 {"fset", T_OBJECT, offsetof(propertyobject, prop_set), READONLY},
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1110 {"fdel", T_OBJECT, offsetof(propertyobject, prop_del), READONLY},
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1111 {"__doc__", T_OBJECT, offsetof(propertyobject, prop_doc), READONLY},
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1112 {0}
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1113 };
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1114
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1115
43814
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1116 PyDoc_STRVAR(getter_doc,
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1117 "Descriptor to change the getter on a property.");
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1118
46452
91b099a7f3e2 Prevent namespace pollution, add static for internal functions
Neal Norwitz <nnorwitz@gmail.com>
parents: 45364
diff changeset
1119 static PyObject *
43814
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1120 property_getter(PyObject *self, PyObject *getter)
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1121 {
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1122 return property_copy(self, getter, NULL, NULL, NULL);
43814
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1123 }
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1124
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1125
43814
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1126 PyDoc_STRVAR(setter_doc,
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1127 "Descriptor to change the setter on a property.");
43814
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1128
46452
91b099a7f3e2 Prevent namespace pollution, add static for internal functions
Neal Norwitz <nnorwitz@gmail.com>
parents: 45364
diff changeset
1129 static PyObject *
43814
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1130 property_setter(PyObject *self, PyObject *setter)
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1131 {
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1132 return property_copy(self, NULL, setter, NULL, NULL);
43814
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1133 }
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1134
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1135
43814
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1136 PyDoc_STRVAR(deleter_doc,
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1137 "Descriptor to change the deleter on a property.");
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1138
46452
91b099a7f3e2 Prevent namespace pollution, add static for internal functions
Neal Norwitz <nnorwitz@gmail.com>
parents: 45364
diff changeset
1139 static PyObject *
43814
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1140 property_deleter(PyObject *self, PyObject *deleter)
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1141 {
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1142 return property_copy(self, NULL, NULL, deleter, NULL);
43814
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1143 }
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1144
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1145
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1146 static PyMethodDef property_methods[] = {
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1147 {"getter", property_getter, METH_O, getter_doc},
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1148 {"setter", property_setter, METH_O, setter_doc},
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1149 {"deleter", property_deleter, METH_O, deleter_doc},
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1150 {0}
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1151 };
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1152
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1153
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1154 static void
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1155 property_dealloc(PyObject *self)
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1156 {
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1157 propertyobject *gs = (propertyobject *)self;
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1158
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1159 _PyObject_GC_UNTRACK(self);
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1160 Py_XDECREF(gs->prop_get);
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1161 Py_XDECREF(gs->prop_set);
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1162 Py_XDECREF(gs->prop_del);
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1163 Py_XDECREF(gs->prop_doc);
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1164 self->ob_type->tp_free(self);
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1165 }
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1166
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1167 static PyObject *
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1168 property_descr_get(PyObject *self, PyObject *obj, PyObject *type)
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1169 {
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1170 propertyobject *gs = (propertyobject *)self;
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1171
21333
6d874a91b58b property_descr_get(): Fix a curious bug in the property() type: when
Guido van Rossum <guido@python.org>
parents: 20599
diff changeset
1172 if (obj == NULL || obj == Py_None) {
6d874a91b58b property_descr_get(): Fix a curious bug in the property() type: when
Guido van Rossum <guido@python.org>
parents: 20599
diff changeset
1173 Py_INCREF(self);
6d874a91b58b property_descr_get(): Fix a curious bug in the property() type: when
Guido van Rossum <guido@python.org>
parents: 20599
diff changeset
1174 return self;
6d874a91b58b property_descr_get(): Fix a curious bug in the property() type: when
Guido van Rossum <guido@python.org>
parents: 20599
diff changeset
1175 }
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1176 if (gs->prop_get == NULL) {
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1177 PyErr_SetString(PyExc_AttributeError, "unreadable attribute");
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1178 return NULL;
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1179 }
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1180 return PyObject_CallFunction(gs->prop_get, "(O)", obj);
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1181 }
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1182
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1183 static int
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1184 property_descr_set(PyObject *self, PyObject *obj, PyObject *value)
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1185 {
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1186 propertyobject *gs = (propertyobject *)self;
19467
6e6fc7b6a360 Change the getset type to take an optional third function argument:
Guido van Rossum <guido@python.org>
parents: 19465
diff changeset
1187 PyObject *func, *res;
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1188
19467
6e6fc7b6a360 Change the getset type to take an optional third function argument:
Guido van Rossum <guido@python.org>
parents: 19465
diff changeset
1189 if (value == NULL)
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1190 func = gs->prop_del;
19467
6e6fc7b6a360 Change the getset type to take an optional third function argument:
Guido van Rossum <guido@python.org>
parents: 19465
diff changeset
1191 else
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1192 func = gs->prop_set;
19467
6e6fc7b6a360 Change the getset type to take an optional third function argument:
Guido van Rossum <guido@python.org>
parents: 19465
diff changeset
1193 if (func == NULL) {
6e6fc7b6a360 Change the getset type to take an optional third function argument:
Guido van Rossum <guido@python.org>
parents: 19465
diff changeset
1194 PyErr_SetString(PyExc_AttributeError,
6e6fc7b6a360 Change the getset type to take an optional third function argument:
Guido van Rossum <guido@python.org>
parents: 19465
diff changeset
1195 value == NULL ?
6e6fc7b6a360 Change the getset type to take an optional third function argument:
Guido van Rossum <guido@python.org>
parents: 19465
diff changeset
1196 "can't delete attribute" :
6e6fc7b6a360 Change the getset type to take an optional third function argument:
Guido van Rossum <guido@python.org>
parents: 19465
diff changeset
1197 "can't set attribute");
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1198 return -1;
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1199 }
19465
4a30ec798e6c getset_descr_set(): guard against deletion (indicated by a set call
Guido van Rossum <guido@python.org>
parents: 19463
diff changeset
1200 if (value == NULL)
19467
6e6fc7b6a360 Change the getset type to take an optional third function argument:
Guido van Rossum <guido@python.org>
parents: 19465
diff changeset
1201 res = PyObject_CallFunction(func, "(O)", obj);
19465
4a30ec798e6c getset_descr_set(): guard against deletion (indicated by a set call
Guido van Rossum <guido@python.org>
parents: 19463
diff changeset
1202 else
19467
6e6fc7b6a360 Change the getset type to take an optional third function argument:
Guido van Rossum <guido@python.org>
parents: 19465
diff changeset
1203 res = PyObject_CallFunction(func, "(OO)", obj, value);
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1204 if (res == NULL)
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1205 return -1;
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1206 Py_DECREF(res);
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1207 return 0;
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1208 }
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1209
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1210 static PyObject *
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1211 property_copy(PyObject *old, PyObject *get, PyObject *set, PyObject *del,
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1212 PyObject *doc)
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1213 {
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1214 propertyobject *pold = (propertyobject *)old;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1215 PyObject *new, *type;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1216
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1217 type = PyObject_Type(old);
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1218 if (type == NULL)
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1219 return NULL;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1220
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1221 if (get == NULL || get == Py_None) {
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1222 Py_XDECREF(get);
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1223 get = pold->prop_get ? pold->prop_get : Py_None;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1224 }
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1225 if (set == NULL || set == Py_None) {
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1226 Py_XDECREF(set);
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1227 set = pold->prop_set ? pold->prop_set : Py_None;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1228 }
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1229 if (del == NULL || del == Py_None) {
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1230 Py_XDECREF(del);
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1231 del = pold->prop_del ? pold->prop_del : Py_None;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1232 }
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1233 if (doc == NULL || doc == Py_None) {
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1234 Py_XDECREF(doc);
53759
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1235 if (pold->getter_doc && get != Py_None) {
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1236 /* make _init use __doc__ from getter */
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1237 doc = Py_None;
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1238 }
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1239 else {
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1240 doc = pold->prop_doc ? pold->prop_doc : Py_None;
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1241 }
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1242 }
53759
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1243
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1244 new = PyObject_CallFunction(type, "OOOO", get, set, del, doc);
44406
eb1207513ee7 Fix refleak
Neal Norwitz <nnorwitz@gmail.com>
parents: 44293
diff changeset
1245 Py_DECREF(type);
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1246 if (new == NULL)
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1247 return NULL;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1248 return new;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1249 }
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1250
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1251 static int
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1252 property_init(PyObject *self, PyObject *args, PyObject *kwds)
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1253 {
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1254 PyObject *get = NULL, *set = NULL, *del = NULL, *doc = NULL;
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36501
diff changeset
1255 static char *kwlist[] = {"fget", "fset", "fdel", "doc", 0};
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1256 propertyobject *prop = (propertyobject *)self;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1257
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1258 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO:property",
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1259 kwlist, &get, &set, &del, &doc))
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1260 return -1;
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1261
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1262 if (get == Py_None)
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1263 get = NULL;
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1264 if (set == Py_None)
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1265 set = NULL;
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1266 if (del == Py_None)
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1267 del = NULL;
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1268
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1269 Py_XINCREF(get);
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1270 Py_XINCREF(set);
19467
6e6fc7b6a360 Change the getset type to take an optional third function argument:
Guido van Rossum <guido@python.org>
parents: 19465
diff changeset
1271 Py_XINCREF(del);
39371
a9c742d6c888 Change fix for segfaulting property(), add a NEWS entry and a test.
Georg Brandl <georg@python.org>
parents: 39369
diff changeset
1272 Py_XINCREF(doc);
a9c742d6c888 Change fix for segfaulting property(), add a NEWS entry and a test.
Georg Brandl <georg@python.org>
parents: 39369
diff changeset
1273
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1274 prop->prop_get = get;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1275 prop->prop_set = set;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1276 prop->prop_del = del;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1277 prop->prop_doc = doc;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1278 prop->getter_doc = 0;
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1279
39371
a9c742d6c888 Change fix for segfaulting property(), add a NEWS entry and a test.
Georg Brandl <georg@python.org>
parents: 39369
diff changeset
1280 /* if no docstring given and the getter has one, use that one */
a9c742d6c888 Change fix for segfaulting property(), add a NEWS entry and a test.
Georg Brandl <georg@python.org>
parents: 39369
diff changeset
1281 if ((doc == NULL || doc == Py_None) && get != NULL) {
a9c742d6c888 Change fix for segfaulting property(), add a NEWS entry and a test.
Georg Brandl <georg@python.org>
parents: 39369
diff changeset
1282 PyObject *get_doc = PyObject_GetAttrString(get, "__doc__");
a9c742d6c888 Change fix for segfaulting property(), add a NEWS entry and a test.
Georg Brandl <georg@python.org>
parents: 39369
diff changeset
1283 if (get_doc != NULL) {
53759
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1284 /* get_doc already INCREF'd by GetAttr */
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1285 if (Py_TYPE(self)==&PyProperty_Type) {
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1286 Py_XDECREF(prop->prop_doc);
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1287 prop->prop_doc = get_doc;
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1288 } else {
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1289 /* Put __doc__ in dict of the subclass instance instead,
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1290 otherwise it gets shadowed by class's __doc__. */
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1291 if (PyObject_SetAttrString(self, "__doc__", get_doc) != 0)
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1292 {
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1293 /* DECREF for props handled by _dealloc */
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1294 Py_DECREF(get_doc);
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1295 return -1;
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1296 }
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1297 Py_DECREF(get_doc);
bba7ee9daee0 Merged revisions 72299 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53273
diff changeset
1298 }
44293
7a62c6d9107d Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
Christian Heimes <christian@cheimes.de>
parents: 43823
diff changeset
1299 prop->getter_doc = 1;
39371
a9c742d6c888 Change fix for segfaulting property(), add a NEWS entry and a test.
Georg Brandl <georg@python.org>
parents: 39369
diff changeset
1300 } else {
a9c742d6c888 Change fix for segfaulting property(), add a NEWS entry and a test.
Georg Brandl <georg@python.org>
parents: 39369
diff changeset
1301 PyErr_Clear();
a9c742d6c888 Change fix for segfaulting property(), add a NEWS entry and a test.
Georg Brandl <georg@python.org>
parents: 39369
diff changeset
1302 }
a9c742d6c888 Change fix for segfaulting property(), add a NEWS entry and a test.
Georg Brandl <georg@python.org>
parents: 39369
diff changeset
1303 }
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1304
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1305 return 0;
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1306 }
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1307
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23022
diff changeset
1308 PyDoc_STRVAR(property_doc,
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1309 "property(fget=None, fset=None, fdel=None, doc=None) -> property attribute\n"
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1310 "\n"
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1311 "fget is a function to be used for getting an attribute value, and likewise\n"
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1312 "fset is a function for setting, and fdel a function for del'ing, an\n"
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1313 "attribute. Typical use is to define a managed attribute x:\n"
19463
0b642d220b02 getset_init(): make the arguments optional.
Guido van Rossum <guido@python.org>
parents: 19456
diff changeset
1314 "class C(object):\n"
43820
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1315 " def getx(self): return self._x\n"
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1316 " def setx(self, value): self._x = value\n"
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1317 " def delx(self): del self._x\n"
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1318 " x = property(getx, setx, delx, \"I'm the 'x' property.\")\n"
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1319 "\n"
43823
55cbd0c7aacf Re-word sentence
Andrew M. Kuchling <amk@amk.ca>
parents: 43820
diff changeset
1320 "Decorators make defining new properties or modifying existing ones easy:\n"
43820
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1321 "class C(object):\n"
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1322 " @property\n"
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1323 " def x(self): return self._x\n"
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1324 " @x.setter\n"
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1325 " def x(self, value): self._x = value\n"
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1326 " @x.deleter\n"
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1327 " def x(self): del self._x\n"
d2f9e20120f9 Added new decorator syntax to property.__doc__
Christian Heimes <christian@cheimes.de>
parents: 43814
diff changeset
1328 );
19463
0b642d220b02 getset_init(): make the arguments optional.
Guido van Rossum <guido@python.org>
parents: 19456
diff changeset
1329
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1330 static int
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1331 property_traverse(PyObject *self, visitproc visit, void *arg)
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1332 {
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1333 propertyobject *pp = (propertyobject *)self;
37756
7b2e436a4a21 Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
Thomas Wouters <thomas@python.org>
parents: 37304
diff changeset
1334 Py_VISIT(pp->prop_get);
7b2e436a4a21 Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
Thomas Wouters <thomas@python.org>
parents: 37304
diff changeset
1335 Py_VISIT(pp->prop_set);
7b2e436a4a21 Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
Thomas Wouters <thomas@python.org>
parents: 37304
diff changeset
1336 Py_VISIT(pp->prop_del);
7b2e436a4a21 Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
Thomas Wouters <thomas@python.org>
parents: 37304
diff changeset
1337 Py_VISIT(pp->prop_doc);
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1338 return 0;
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1339 }
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1340
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1341 PyTypeObject PyProperty_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 39371
diff changeset
1342 PyVarObject_HEAD_INIT(&PyType_Type, 0)
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1343 "property", /* tp_name */
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1344 sizeof(propertyobject), /* tp_basicsize */
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1345 0, /* tp_itemsize */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1346 /* methods */
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1347 property_dealloc, /* tp_dealloc */
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1348 0, /* tp_print */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1349 0, /* tp_getattr */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1350 0, /* tp_setattr */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1351 0, /* tp_compare */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1352 0, /* tp_repr */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1353 0, /* tp_as_number */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1354 0, /* tp_as_sequence */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1355 0, /* tp_as_mapping */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1356 0, /* tp_hash */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1357 0, /* tp_call */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1358 0, /* tp_str */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1359 PyObject_GenericGetAttr, /* tp_getattro */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1360 0, /* tp_setattro */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1361 0, /* tp_as_buffer */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1362 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1363 Py_TPFLAGS_BASETYPE, /* tp_flags */
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1364 property_doc, /* tp_doc */
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20071
diff changeset
1365 property_traverse, /* tp_traverse */
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1366 0, /* tp_clear */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1367 0, /* tp_richcompare */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1368 0, /* tp_weaklistoffset */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1369 0, /* tp_iter */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1370 0, /* tp_iternext */
43814
197ffb996fb8 Issue 1416. Add getter, setter, deleter methods to properties that can be
Guido van Rossum <guido@python.org>
parents: 42333
diff changeset
1371 property_methods, /* tp_methods */
20071
e01de8bc5813 Make properties discoverable from Python:
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1372 property_members, /* tp_members */
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1373 0, /* tp_getset */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1374 0, /* tp_base */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1375 0, /* tp_dict */
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1376 property_descr_get, /* tp_descr_get */
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1377 property_descr_set, /* tp_descr_set */
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1378 0, /* tp_dictoffset */
19786
4abfc176685c Rename 'getset' to 'property'.
Guido van Rossum <guido@python.org>
parents: 19591
diff changeset
1379 property_init, /* tp_init */
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1380 PyType_GenericAlloc, /* tp_alloc */
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1381 PyType_GenericNew, /* tp_new */
22975
29e6cb832497 PyObject_GC_Del can now be used as a function designator.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22552
diff changeset
1382 PyObject_GC_Del, /* tp_free */
19456
3b5f34c5bc6c Add new built-in type 'getset' (PyGetSet_Type).
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1383 };