annotate Objects/descrobject.c @ 79675:c0a2294de787 2.7

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