Mercurial > cpython-lru_cache-weakref
annotate Objects/typeobject.c @ 19161:d64e059cd199 legacy-trunk
Add section on PEP 238 changes
Minor grammatical changes, reformattings, and an error fix from Keith Briggs
| author | Andrew M. Kuchling <amk@amk.ca> |
|---|---|
| date | Sat, 11 Aug 2001 03:06:50 +0000 |
| parents | 64d4ad73a887 |
| children | 680232fb61f3 |
| rev | line source |
|---|---|
| 145 | 1 |
| 6 | 2 /* Type object implementation */ |
| 3 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
4 #include "Python.h" |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5 #include "structmember.h" |
| 6 | 6 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
7 static struct memberlist type_members[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
8 {"__name__", T_STRING, offsetof(PyTypeObject, tp_name), READONLY}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
9 {"__basicsize__", T_INT, offsetof(PyTypeObject,tp_basicsize),READONLY}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
10 {"__itemsize__", T_INT, offsetof(PyTypeObject, tp_itemsize), READONLY}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
11 {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
12 {"__doc__", T_STRING, offsetof(PyTypeObject, tp_doc), READONLY}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
13 {"__weaklistoffset__", T_LONG, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
14 offsetof(PyTypeObject, tp_weaklistoffset), READONLY}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
15 {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
16 {"__dictoffset__", T_LONG, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
17 offsetof(PyTypeObject, tp_dictoffset), READONLY}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
18 {"__bases__", T_OBJECT, offsetof(PyTypeObject, tp_bases), READONLY}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
19 {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
20 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
21 }; |
| 6 | 22 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
23 static PyObject * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
24 type_module(PyTypeObject *type, void *context) |
|
2080
c21cc7b3ce28
added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
25 { |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
26 return PyString_FromString("__builtin__"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
27 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
28 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
29 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
30 type_dict(PyTypeObject *type, void *context) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
31 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
32 if (type->tp_dict == NULL) { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
33 Py_INCREF(Py_None); |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
34 return Py_None; |
|
2080
c21cc7b3ce28
added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
35 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
36 if (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
37 Py_INCREF(type->tp_dict); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
38 return type->tp_dict; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
39 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
40 return PyDictProxy_New(type->tp_dict); |
|
2080
c21cc7b3ce28
added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
41 } |
|
c21cc7b3ce28
added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
42 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
43 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
44 type_defined(PyTypeObject *type, void *context) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
45 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
46 if (type->tp_defined == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
47 Py_INCREF(Py_None); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
48 return Py_None; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
49 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
50 if (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
51 Py_INCREF(type->tp_defined); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
52 return type->tp_defined; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
53 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
54 return PyDictProxy_New(type->tp_defined); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
55 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
56 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
57 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
58 type_dynamic(PyTypeObject *type, void *context) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
59 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
60 PyObject *res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
61 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
62 res = (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) ? Py_True : Py_False; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
63 Py_INCREF(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
64 return res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
65 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
66 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
67 struct getsetlist type_getsets[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
68 {"__module__", (getter)type_module, NULL, NULL}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
69 {"__dict__", (getter)type_dict, NULL, NULL}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
70 {"__defined__", (getter)type_defined, NULL, NULL}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
71 {"__dynamic__", (getter)type_dynamic, NULL, NULL}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
72 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
73 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
74 |
|
18063
bbac2a6a5d16
Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents:
14375
diff
changeset
|
75 static int |
|
bbac2a6a5d16
Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents:
14375
diff
changeset
|
76 type_compare(PyObject *v, PyObject *w) |
|
bbac2a6a5d16
Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents:
14375
diff
changeset
|
77 { |
|
bbac2a6a5d16
Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents:
14375
diff
changeset
|
78 /* This is called with type objects only. So we |
|
bbac2a6a5d16
Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents:
14375
diff
changeset
|
79 can just compare the addresses. */ |
|
bbac2a6a5d16
Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents:
14375
diff
changeset
|
80 Py_uintptr_t vv = (Py_uintptr_t)v; |
|
bbac2a6a5d16
Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents:
14375
diff
changeset
|
81 Py_uintptr_t ww = (Py_uintptr_t)w; |
|
bbac2a6a5d16
Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents:
14375
diff
changeset
|
82 return (vv < ww) ? -1 : (vv > ww) ? 1 : 0; |
|
bbac2a6a5d16
Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents:
14375
diff
changeset
|
83 } |
|
bbac2a6a5d16
Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents:
14375
diff
changeset
|
84 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
85 static PyObject * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
86 type_repr(PyTypeObject *type) |
| 6 | 87 { |
| 88 char buf[100]; | |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
89 sprintf(buf, "<type '%.80s'>", type->tp_name); |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
90 return PyString_FromString(buf); |
| 6 | 91 } |
| 92 | |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
93 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
94 type_call(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
95 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
96 PyObject *obj; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
97 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
98 if (type->tp_new == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
99 PyErr_Format(PyExc_TypeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
100 "cannot create '%.100s' instances", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
101 type->tp_name); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
102 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
103 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
104 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
105 obj = type->tp_new(type, args, NULL); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
106 if (obj != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
107 type = obj->ob_type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
108 if (type->tp_init != NULL && |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
109 type->tp_init(obj, args, kwds) < 0) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
110 Py_DECREF(obj); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
111 obj = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
112 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
113 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
114 return obj; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
115 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
116 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
117 PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
118 PyType_GenericAlloc(PyTypeObject *type, int nitems) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
119 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
120 int size; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
121 void *mem; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
122 PyObject *obj; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
123 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
124 /* Inline PyObject_New() so we can zero the memory */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
125 size = _PyObject_VAR_SIZE(type, nitems); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
126 mem = PyObject_MALLOC(size); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
127 if (mem == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
128 return PyErr_NoMemory(); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
129 memset(mem, '\0', size); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
130 if (PyType_IS_GC(type)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
131 obj = PyObject_FROM_GC(mem); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
132 else |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
133 obj = (PyObject *)mem; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
134 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
135 Py_INCREF(type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
136 if (type->tp_itemsize == 0) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
137 PyObject_INIT(obj, type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
138 else |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
139 (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
140 if (PyType_IS_GC(type)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
141 PyObject_GC_Init(obj); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
142 return obj; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
143 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
144 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
145 PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
146 PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
147 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
148 return type->tp_alloc(type, 0); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
149 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
150 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
151 /* Helper for subtyping */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
152 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
153 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
154 subtype_dealloc(PyObject *self) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
155 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
156 int dictoffset = self->ob_type->tp_dictoffset; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
157 PyTypeObject *type, *base; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
158 destructor f; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
159 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
160 /* This exists so we can DECREF self->ob_type */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
161 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
162 /* Find the nearest base with a different tp_dealloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
163 type = self->ob_type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
164 base = type->tp_base; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
165 while ((f = base->tp_dealloc) == subtype_dealloc) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
166 base = base->tp_base; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
167 assert(base); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
168 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
169 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
170 /* If we added a dict, DECREF it */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
171 if (dictoffset && !base->tp_dictoffset) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
172 PyObject **dictptr = (PyObject **) ((char *)self + dictoffset); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
173 PyObject *dict = *dictptr; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
174 if (dict != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
175 Py_DECREF(dict); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
176 *dictptr = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
177 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
178 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
179 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
180 /* Finalize GC if the base doesn't do GC and we do */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
181 if (PyType_IS_GC(type) && !PyType_IS_GC(base)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
182 PyObject_GC_Fini(self); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
183 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
184 /* Call the base tp_dealloc() */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
185 assert(f); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
186 f(self); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
187 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
188 /* Can't reference self beyond this point */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
189 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
190 Py_DECREF(type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
191 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
192 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
193 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
194 staticforward void override_slots(PyTypeObject *type, PyObject *dict); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
195 staticforward PyTypeObject *solid_base(PyTypeObject *type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
196 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
197 typedef struct { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
198 PyTypeObject type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
199 PyNumberMethods as_number; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
200 PySequenceMethods as_sequence; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
201 PyMappingMethods as_mapping; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
202 PyBufferProcs as_buffer; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
203 PyObject *name, *slots; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
204 struct memberlist members[1]; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
205 } etype; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
206 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
207 /* type test with subclassing support */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
208 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
209 int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
210 PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
211 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
212 PyObject *mro; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
213 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
214 mro = a->tp_mro; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
215 if (mro != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
216 /* Deal with multiple inheritance without recursion |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
217 by walking the MRO tuple */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
218 int i, n; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
219 assert(PyTuple_Check(mro)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
220 n = PyTuple_GET_SIZE(mro); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
221 for (i = 0; i < n; i++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
222 if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
223 return 1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
224 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
225 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
226 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
227 else { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
228 /* a is not completely initilized yet; follow tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
229 do { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
230 if (a == b) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
231 return 1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
232 a = a->tp_base; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
233 } while (a != NULL); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
234 return b == &PyBaseObject_Type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
235 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
236 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
237 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
238 /* Method resolution order algorithm from "Putting Metaclasses to Work" |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
239 by Forman and Danforth (Addison-Wesley 1999). */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
240 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
241 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
242 conservative_merge(PyObject *left, PyObject *right) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
243 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
244 int left_size; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
245 int right_size; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
246 int i, j, r, ok; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
247 PyObject *temp, *rr; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
248 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
249 assert(PyList_Check(left)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
250 assert(PyList_Check(right)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
251 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
252 again: |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
253 left_size = PyList_GET_SIZE(left); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
254 right_size = PyList_GET_SIZE(right); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
255 for (i = 0; i < left_size; i++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
256 for (j = 0; j < right_size; j++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
257 if (PyList_GET_ITEM(left, i) == |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
258 PyList_GET_ITEM(right, j)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
259 /* found a merge point */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
260 temp = PyList_New(0); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
261 if (temp == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
262 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
263 for (r = 0; r < j; r++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
264 rr = PyList_GET_ITEM(right, r); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
265 ok = PySequence_Contains(left, rr); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
266 if (ok < 0) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
267 Py_DECREF(temp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
268 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
269 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
270 if (!ok) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
271 ok = PyList_Append(temp, rr); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
272 if (ok < 0) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
273 Py_DECREF(temp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
274 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
275 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
276 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
277 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
278 ok = PyList_SetSlice(left, i, i, temp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
279 Py_DECREF(temp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
280 if (ok < 0) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
281 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
282 ok = PyList_SetSlice(right, 0, j+1, NULL); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
283 if (ok < 0) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
284 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
285 goto again; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
286 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
287 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
288 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
289 return PyList_SetSlice(left, left_size, left_size, right); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
290 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
291 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
292 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
293 serious_order_disagreements(PyObject *left, PyObject *right) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
294 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
295 return 0; /* XXX later -- for now, we cheat: "don't do that" */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
296 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
297 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
298 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
299 mro_implementation(PyTypeObject *type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
300 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
301 int i, n, ok; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
302 PyObject *bases, *result; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
303 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
304 bases = type->tp_bases; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
305 n = PyTuple_GET_SIZE(bases); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
306 result = Py_BuildValue("[O]", (PyObject *)type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
307 if (result == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
308 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
309 for (i = 0; i < n; i++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
310 PyTypeObject *base = |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
311 (PyTypeObject *) PyTuple_GET_ITEM(bases, i); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
312 PyObject *parentMRO = PySequence_List(base->tp_mro); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
313 if (parentMRO == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
314 Py_DECREF(result); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
315 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
316 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
317 if (serious_order_disagreements(result, parentMRO)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
318 Py_DECREF(result); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
319 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
320 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
321 ok = conservative_merge(result, parentMRO); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
322 Py_DECREF(parentMRO); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
323 if (ok < 0) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
324 Py_DECREF(result); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
325 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
326 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
327 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
328 return result; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
329 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
330 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
331 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
332 mro_external(PyObject *self, PyObject *args) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
333 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
334 PyTypeObject *type = (PyTypeObject *)self; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
335 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
336 if (!PyArg_ParseTuple(args, "")) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
337 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
338 return mro_implementation(type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
339 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
340 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
341 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
342 mro_internal(PyTypeObject *type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
343 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
344 PyObject *mro, *result, *tuple; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
345 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
346 if (type->ob_type == &PyType_Type) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
347 result = mro_implementation(type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
348 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
349 else { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
350 mro = PyObject_GetAttrString((PyObject *)type, "mro"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
351 if (mro == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
352 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
353 result = PyObject_CallObject(mro, NULL); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
354 Py_DECREF(mro); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
355 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
356 if (result == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
357 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
358 tuple = PySequence_Tuple(result); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
359 Py_DECREF(result); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
360 type->tp_mro = tuple; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
361 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
362 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
363 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
364 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
365 /* Calculate the best base amongst multiple base classes. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
366 This is the first one that's on the path to the "solid base". */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
367 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
368 static PyTypeObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
369 best_base(PyObject *bases) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
370 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
371 int i, n; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
372 PyTypeObject *base, *winner, *candidate, *base_i; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
373 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
374 assert(PyTuple_Check(bases)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
375 n = PyTuple_GET_SIZE(bases); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
376 assert(n > 0); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
377 base = (PyTypeObject *)PyTuple_GET_ITEM(bases, 0); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
378 winner = &PyBaseObject_Type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
379 for (i = 0; i < n; i++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
380 base_i = (PyTypeObject *)PyTuple_GET_ITEM(bases, i); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
381 if (!PyType_Check((PyObject *)base_i)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
382 PyErr_SetString( |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
383 PyExc_TypeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
384 "bases must be types"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
385 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
386 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
387 if (base_i->tp_dict == NULL) { |
|
19040
4df72ea78ae8
- Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents:
19036
diff
changeset
|
388 if (PyType_Ready(base_i) < 0) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
389 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
390 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
391 candidate = solid_base(base_i); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
392 if (PyType_IsSubtype(winner, candidate)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
393 ; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
394 else if (PyType_IsSubtype(candidate, winner)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
395 winner = candidate; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
396 base = base_i; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
397 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
398 else { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
399 PyErr_SetString( |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
400 PyExc_TypeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
401 "multiple bases have " |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
402 "instance lay-out conflict"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
403 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
404 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
405 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
406 assert(base != NULL); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
407 return base; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
408 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
409 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
410 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
411 extra_ivars(PyTypeObject *type, PyTypeObject *base) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
412 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
413 int t_size = PyType_BASICSIZE(type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
414 int b_size = PyType_BASICSIZE(base); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
415 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
416 assert(t_size >= b_size); /* type smaller than base! */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
417 if (type->tp_itemsize || base->tp_itemsize) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
418 /* If itemsize is involved, stricter rules */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
419 return t_size != b_size || |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
420 type->tp_itemsize != base->tp_itemsize; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
421 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
422 if (t_size == b_size) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
423 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
424 if (type->tp_dictoffset != 0 && base->tp_dictoffset == 0 && |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
425 type->tp_dictoffset == b_size && |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
426 (size_t)t_size == b_size + sizeof(PyObject *)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
427 return 0; /* "Forgive" adding a __dict__ only */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
428 return 1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
429 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
430 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
431 static PyTypeObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
432 solid_base(PyTypeObject *type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
433 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
434 PyTypeObject *base; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
435 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
436 if (type->tp_base) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
437 base = solid_base(type->tp_base); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
438 else |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
439 base = &PyBaseObject_Type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
440 if (extra_ivars(type, base)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
441 return type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
442 else |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
443 return base; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
444 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
445 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
446 staticforward void object_dealloc(PyObject *); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
447 staticforward int object_init(PyObject *, PyObject *, PyObject *); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
448 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
449 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
450 type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
451 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
452 PyObject *name, *bases, *dict; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
453 static char *kwlist[] = {"name", "bases", "dict", 0}; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
454 PyObject *slots, *tmp; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
455 PyTypeObject *type, *base, *tmptype; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
456 etype *et; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
457 struct memberlist *mp; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
458 int i, nbases, nslots, slotoffset, dynamic; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
459 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
460 if (metatype == &PyType_Type && |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
461 PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 && |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
462 (kwds == NULL || (PyDict_Check(kwds) && PyDict_Size(kwds) == 0))) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
463 /* type(x) -> x.__class__ */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
464 PyObject *x = PyTuple_GET_ITEM(args, 0); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
465 Py_INCREF(x->ob_type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
466 return (PyObject *) x->ob_type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
467 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
468 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
469 /* Check arguments */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
470 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SO!O!:type", kwlist, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
471 &name, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
472 &PyTuple_Type, &bases, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
473 &PyDict_Type, &dict)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
474 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
475 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
476 /* Determine the proper metatype to deal with this, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
477 and check for metatype conflicts while we're at it. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
478 Note that if some other metatype wins to contract, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
479 it's possible that its instances are not types. */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
480 nbases = PyTuple_GET_SIZE(bases); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
481 for (i = 0; i < nbases; i++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
482 tmp = PyTuple_GET_ITEM(bases, i); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
483 tmptype = tmp->ob_type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
484 if (PyType_IsSubtype(metatype, tmptype)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
485 continue; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
486 if (PyType_IsSubtype(tmptype, metatype)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
487 metatype = tmptype; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
488 continue; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
489 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
490 PyErr_SetString(PyExc_TypeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
491 "metatype conflict among bases"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
492 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
493 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
494 if (metatype->tp_new != type_new) /* Pass it to the winner */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
495 return metatype->tp_new(metatype, args, kwds); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
496 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
497 /* Adjust for empty tuple bases */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
498 if (nbases == 0) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
499 bases = Py_BuildValue("(O)", &PyBaseObject_Type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
500 if (bases == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
501 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
502 nbases = 1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
503 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
504 else |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
505 Py_INCREF(bases); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
506 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
507 /* XXX From here until type is allocated, "return NULL" leaks bases! */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
508 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
509 /* Calculate best base, and check that all bases are type objects */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
510 base = best_base(bases); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
511 if (base == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
512 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
513 if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
514 PyErr_Format(PyExc_TypeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
515 "type '%.100s' is not an acceptable base type", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
516 base->tp_name); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
517 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
518 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
519 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
520 /* Should this be a dynamic class (i.e. modifiable __dict__)? */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
521 tmp = PyDict_GetItemString(dict, "__dynamic__"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
522 if (tmp != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
523 /* The class author has a preference */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
524 dynamic = PyObject_IsTrue(tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
525 Py_DECREF(tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
526 if (dynamic < 0) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
527 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
528 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
529 else { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
530 /* Make a new class dynamic if any of its bases is dynamic. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
531 This is not always the same as inheriting the __dynamic__ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
532 class attribute! */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
533 dynamic = 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
534 for (i = 0; i < nbases; i++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
535 tmptype = (PyTypeObject *)PyTuple_GET_ITEM(bases, i); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
536 if (tmptype->tp_flags & Py_TPFLAGS_DYNAMICTYPE) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
537 dynamic = 1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
538 break; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
539 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
540 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
541 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
542 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
543 /* Check for a __slots__ sequence variable in dict, and count it */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
544 slots = PyDict_GetItemString(dict, "__slots__"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
545 nslots = 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
546 if (slots != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
547 /* Make it into a tuple */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
548 if (PyString_Check(slots)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
549 slots = Py_BuildValue("(O)", slots); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
550 else |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
551 slots = PySequence_Tuple(slots); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
552 if (slots == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
553 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
554 nslots = PyTuple_GET_SIZE(slots); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
555 for (i = 0; i < nslots; i++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
556 if (!PyString_Check(PyTuple_GET_ITEM(slots, i))) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
557 PyErr_SetString(PyExc_TypeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
558 "__slots__ must be a sequence of strings"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
559 Py_DECREF(slots); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
560 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
561 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
562 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
563 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
564 if (slots == NULL && base->tp_dictoffset == 0 && |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
565 (base->tp_setattro == PyObject_GenericSetAttr || |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
566 base->tp_setattro == NULL)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
567 nslots = 1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
568 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
569 /* XXX From here until type is safely allocated, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
570 "return NULL" may leak slots! */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
571 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
572 /* Allocate the type object */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
573 type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
574 if (type == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
575 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
576 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
577 /* Keep name and slots alive in the extended type object */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
578 et = (etype *)type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
579 Py_INCREF(name); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
580 et->name = name; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
581 et->slots = slots; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
582 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
583 /* Initialize tp_flags */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
584 type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE | |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
585 Py_TPFLAGS_BASETYPE; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
586 if (dynamic) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
587 type->tp_flags |= Py_TPFLAGS_DYNAMICTYPE; |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
588 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
589 /* It's a new-style number unless it specifically inherits any |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
590 old-style numeric behavior */ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
591 if ((base->tp_flags & Py_TPFLAGS_CHECKTYPES) || |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
592 (base->tp_as_number == NULL)) |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
593 type->tp_flags |= Py_TPFLAGS_CHECKTYPES; |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
594 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
595 /* Initialize essential fields */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
596 type->tp_as_number = &et->as_number; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
597 type->tp_as_sequence = &et->as_sequence; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
598 type->tp_as_mapping = &et->as_mapping; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
599 type->tp_as_buffer = &et->as_buffer; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
600 type->tp_name = PyString_AS_STRING(name); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
601 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
602 /* Set tp_base and tp_bases */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
603 type->tp_bases = bases; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
604 Py_INCREF(base); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
605 type->tp_base = base; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
606 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
607 /* Initialize tp_defined from passed-in dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
608 type->tp_defined = dict = PyDict_Copy(dict); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
609 if (dict == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
610 Py_DECREF(type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
611 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
612 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
613 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
614 /* Special-case __new__: if it's a plain function, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
615 make it a static function */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
616 tmp = PyDict_GetItemString(dict, "__new__"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
617 if (tmp != NULL && PyFunction_Check(tmp)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
618 tmp = PyStaticMethod_New(tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
619 if (tmp == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
620 Py_DECREF(type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
621 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
622 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
623 PyDict_SetItemString(dict, "__new__", tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
624 Py_DECREF(tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
625 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
626 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
627 /* Add descriptors for custom slots from __slots__, or for __dict__ */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
628 mp = et->members; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
629 slotoffset = PyType_BASICSIZE(base); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
630 if (slots != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
631 for (i = 0; i < nslots; i++, mp++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
632 mp->name = PyString_AS_STRING( |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
633 PyTuple_GET_ITEM(slots, i)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
634 mp->type = T_OBJECT; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
635 mp->offset = slotoffset; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
636 slotoffset += sizeof(PyObject *); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
637 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
638 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
639 else if (nslots) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
640 type->tp_dictoffset = slotoffset; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
641 mp->name = "__dict__"; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
642 mp->type = T_OBJECT; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
643 mp->offset = slotoffset; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
644 mp->readonly = 1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
645 slotoffset += sizeof(PyObject *); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
646 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
647 type->tp_basicsize = slotoffset; |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
648 type->tp_members = et->members; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
649 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
650 /* Special case some slots */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
651 if (type->tp_dictoffset != 0 || nslots > 0) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
652 if (base->tp_getattr == NULL && base->tp_getattro == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
653 type->tp_getattro = PyObject_GenericGetAttr; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
654 if (base->tp_setattr == NULL && base->tp_setattro == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
655 type->tp_setattro = PyObject_GenericSetAttr; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
656 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
657 type->tp_dealloc = subtype_dealloc; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
658 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
659 /* Always override allocation strategy to use regular heap */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
660 type->tp_alloc = PyType_GenericAlloc; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
661 type->tp_free = _PyObject_Del; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
662 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
663 /* Initialize the rest */ |
|
19040
4df72ea78ae8
- Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents:
19036
diff
changeset
|
664 if (PyType_Ready(type) < 0) { |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
665 Py_DECREF(type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
666 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
667 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
668 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
669 /* Override slots that deserve it */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
670 override_slots(type, type->tp_defined); |
| 19036 | 671 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
672 return (PyObject *)type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
673 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
674 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
675 /* Internal API to look for a name through the MRO. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
676 This returns a borrowed reference, and doesn't set an exception! */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
677 PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
678 _PyType_Lookup(PyTypeObject *type, PyObject *name) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
679 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
680 int i, n; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
681 PyObject *mro, *res, *dict; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
682 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
683 /* For static types, look in tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
684 if (!(type->tp_flags & Py_TPFLAGS_DYNAMICTYPE)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
685 dict = type->tp_dict; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
686 assert(dict && PyDict_Check(dict)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
687 return PyDict_GetItem(dict, name); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
688 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
689 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
690 /* For dynamic types, look in tp_defined of types in MRO */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
691 mro = type->tp_mro; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
692 assert(PyTuple_Check(mro)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
693 n = PyTuple_GET_SIZE(mro); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
694 for (i = 0; i < n; i++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
695 type = (PyTypeObject *) PyTuple_GET_ITEM(mro, i); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
696 assert(PyType_Check(type)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
697 dict = type->tp_defined; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
698 assert(dict && PyDict_Check(dict)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
699 res = PyDict_GetItem(dict, name); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
700 if (res != NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
701 return res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
702 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
703 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
704 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
705 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
706 /* This is similar to PyObject_GenericGetAttr(), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
707 but uses _PyType_Lookup() instead of just looking in type->tp_dict. */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
708 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
709 type_getattro(PyTypeObject *type, PyObject *name) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
710 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
711 PyTypeObject *metatype = type->ob_type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
712 PyObject *descr, *res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
713 descrgetfunc f; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
714 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
715 /* Initialize this type (we'll assume the metatype is initialized) */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
716 if (type->tp_dict == NULL) { |
|
19040
4df72ea78ae8
- Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents:
19036
diff
changeset
|
717 if (PyType_Ready(type) < 0) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
718 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
719 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
720 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
721 /* Get a descriptor from the metatype */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
722 descr = _PyType_Lookup(metatype, name); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
723 f = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
724 if (descr != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
725 f = descr->ob_type->tp_descr_get; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
726 if (f != NULL && PyDescr_IsData(descr)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
727 return f(descr, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
728 (PyObject *)type, (PyObject *)metatype); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
729 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
730 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
731 /* Look in tp_defined of this type and its bases */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
732 res = _PyType_Lookup(type, name); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
733 if (res != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
734 f = res->ob_type->tp_descr_get; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
735 if (f != NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
736 return f(res, (PyObject *)NULL, (PyObject *)type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
737 Py_INCREF(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
738 return res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
739 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
740 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
741 /* Use the descriptor from the metatype */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
742 if (f != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
743 res = f(descr, (PyObject *)type, (PyObject *)metatype); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
744 return res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
745 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
746 if (descr != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
747 Py_INCREF(descr); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
748 return descr; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
749 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
750 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
751 /* Give up */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
752 PyErr_Format(PyExc_AttributeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
753 "type object '%.50s' has no attribute '%.400s'", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
754 type->tp_name, PyString_AS_STRING(name)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
755 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
756 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
757 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
758 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
759 type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
760 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
761 if (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
762 return PyObject_GenericSetAttr((PyObject *)type, name, value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
763 PyErr_SetString(PyExc_TypeError, "can't set type attributes"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
764 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
765 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
766 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
767 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
768 type_dealloc(PyTypeObject *type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
769 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
770 etype *et; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
771 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
772 /* Assert this is a heap-allocated type object */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
773 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
774 et = (etype *)type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
775 Py_XDECREF(type->tp_base); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
776 Py_XDECREF(type->tp_dict); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
777 Py_XDECREF(type->tp_bases); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
778 Py_XDECREF(type->tp_mro); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
779 Py_XDECREF(type->tp_defined); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
780 /* XXX more? */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
781 Py_XDECREF(et->name); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
782 Py_XDECREF(et->slots); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
783 type->ob_type->tp_free((PyObject *)type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
784 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
785 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
786 static PyMethodDef type_methods[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
787 {"mro", mro_external, METH_VARARGS, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
788 "mro() -> list\nreturn a type's method resolution order"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
789 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
790 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
791 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
792 static char type_doc[] = |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
793 "type(object) -> the object's type\n" |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
794 "type(name, bases, dict) -> a new type"; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
795 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
796 PyTypeObject PyType_Type = { |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
797 PyObject_HEAD_INIT(&PyType_Type) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
798 0, /* ob_size */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
799 "type", /* tp_name */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
800 sizeof(etype), /* tp_basicsize */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
801 sizeof(struct memberlist), /* tp_itemsize */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
802 (destructor)type_dealloc, /* tp_dealloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
803 0, /* tp_print */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
804 0, /* tp_getattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
805 0, /* tp_setattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
806 type_compare, /* tp_compare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
807 (reprfunc)type_repr, /* tp_repr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
808 0, /* tp_as_number */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
809 0, /* tp_as_sequence */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
810 0, /* tp_as_mapping */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
811 (hashfunc)_Py_HashPointer, /* tp_hash */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
812 (ternaryfunc)type_call, /* tp_call */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
813 0, /* tp_str */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
814 (getattrofunc)type_getattro, /* tp_getattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
815 (setattrofunc)type_setattro, /* tp_setattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
816 0, /* tp_as_buffer */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
817 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
818 type_doc, /* tp_doc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
819 0, /* tp_traverse */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
820 0, /* tp_clear */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
821 0, /* tp_richcompare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
822 0, /* tp_weaklistoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
823 0, /* tp_iter */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
824 0, /* tp_iternext */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
825 type_methods, /* tp_methods */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
826 type_members, /* tp_members */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
827 type_getsets, /* tp_getset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
828 0, /* tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
829 0, /* tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
830 0, /* tp_descr_get */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
831 0, /* tp_descr_set */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
832 offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
833 0, /* tp_init */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
834 0, /* tp_alloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
835 type_new, /* tp_new */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
836 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
837 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
838 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
839 /* The base type of all types (eventually)... except itself. */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
840 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
841 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
842 object_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
843 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
844 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
845 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
846 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
847 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
848 object_dealloc(PyObject *self) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
849 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
850 self->ob_type->tp_free(self); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
851 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
852 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
853 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
854 object_free(PyObject *self) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
855 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
856 PyObject_Del(self); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
857 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
858 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
859 static struct memberlist object_members[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
860 {"__class__", T_OBJECT, offsetof(PyObject, ob_type), READONLY}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
861 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
862 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
863 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
864 PyTypeObject PyBaseObject_Type = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
865 PyObject_HEAD_INIT(&PyType_Type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
866 0, /* ob_size */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
867 "object", /* tp_name */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
868 sizeof(PyObject), /* tp_basicsize */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
869 0, /* tp_itemsize */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
870 (destructor)object_dealloc, /* tp_dealloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
871 0, /* tp_print */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
872 0, /* tp_getattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
873 0, /* tp_setattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
874 0, /* tp_compare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
875 0, /* tp_repr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
876 0, /* tp_as_number */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
877 0, /* tp_as_sequence */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
878 0, /* tp_as_mapping */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
879 0, /* tp_hash */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
880 0, /* tp_call */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
881 0, /* tp_str */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
882 PyObject_GenericGetAttr, /* tp_getattro */ |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
883 PyObject_GenericSetAttr, /* tp_setattro */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
884 0, /* tp_as_buffer */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
885 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
886 "The most base type", /* tp_doc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
887 0, /* tp_traverse */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
888 0, /* tp_clear */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
889 0, /* tp_richcompare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
890 0, /* tp_weaklistoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
891 0, /* tp_iter */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
892 0, /* tp_iternext */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
893 0, /* tp_methods */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
894 object_members, /* tp_members */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
895 0, /* tp_getset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
896 0, /* tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
897 0, /* tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
898 0, /* tp_descr_get */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
899 0, /* tp_descr_set */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
900 0, /* tp_dictoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
901 object_init, /* tp_init */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
902 PyType_GenericAlloc, /* tp_alloc */ |
|
19108
b7984c9bbf2c
Thinking back to the 2.22 revision, I didn't like what I did there one
Guido van Rossum <guido@python.org>
parents:
19082
diff
changeset
|
903 PyType_GenericNew, /* tp_new */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
904 object_free, /* tp_free */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
905 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
906 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
907 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
908 /* Initialize the __dict__ in a type object */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
909 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
910 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
911 add_methods(PyTypeObject *type, PyMethodDef *meth) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
912 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
913 PyObject *dict = type->tp_defined; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
914 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
915 for (; meth->ml_name != NULL; meth++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
916 PyObject *descr; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
917 if (PyDict_GetItemString(dict, meth->ml_name)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
918 continue; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
919 descr = PyDescr_NewMethod(type, meth); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
920 if (descr == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
921 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
922 if (PyDict_SetItemString(dict,meth->ml_name,descr) < 0) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
923 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
924 Py_DECREF(descr); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
925 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
926 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
927 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
928 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
929 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
930 add_members(PyTypeObject *type, struct memberlist *memb) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
931 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
932 PyObject *dict = type->tp_defined; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
933 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
934 for (; memb->name != NULL; memb++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
935 PyObject *descr; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
936 if (PyDict_GetItemString(dict, memb->name)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
937 continue; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
938 descr = PyDescr_NewMember(type, memb); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
939 if (descr == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
940 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
941 if (PyDict_SetItemString(dict, memb->name, descr) < 0) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
942 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
943 Py_DECREF(descr); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
944 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
945 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
946 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
947 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
948 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
949 add_getset(PyTypeObject *type, struct getsetlist *gsp) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
950 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
951 PyObject *dict = type->tp_defined; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
952 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
953 for (; gsp->name != NULL; gsp++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
954 PyObject *descr; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
955 if (PyDict_GetItemString(dict, gsp->name)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
956 continue; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
957 descr = PyDescr_NewGetSet(type, gsp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
958 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
959 if (descr == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
960 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
961 if (PyDict_SetItemString(dict, gsp->name, descr) < 0) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
962 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
963 Py_DECREF(descr); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
964 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
965 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
966 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
967 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
968 static void |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
969 inherit_special(PyTypeObject *type, PyTypeObject *base) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
970 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
971 int oldsize, newsize; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
972 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
973 /* Special flag magic */ |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
974 if (!type->tp_as_buffer && base->tp_as_buffer) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
975 type->tp_flags &= ~Py_TPFLAGS_HAVE_GETCHARBUFFER; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
976 type->tp_flags |= |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
977 base->tp_flags & Py_TPFLAGS_HAVE_GETCHARBUFFER; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
978 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
979 if (!type->tp_as_sequence && base->tp_as_sequence) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
980 type->tp_flags &= ~Py_TPFLAGS_HAVE_SEQUENCE_IN; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
981 type->tp_flags |= base->tp_flags & Py_TPFLAGS_HAVE_SEQUENCE_IN; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
982 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
983 if ((type->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS) != |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
984 (base->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS)) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
985 if ((!type->tp_as_number && base->tp_as_number) || |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
986 (!type->tp_as_sequence && base->tp_as_sequence)) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
987 type->tp_flags &= ~Py_TPFLAGS_HAVE_INPLACEOPS; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
988 if (!type->tp_as_number && !type->tp_as_sequence) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
989 type->tp_flags |= base->tp_flags & |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
990 Py_TPFLAGS_HAVE_INPLACEOPS; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
991 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
992 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
993 /* Wow */ |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
994 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
995 if (!type->tp_as_number && base->tp_as_number) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
996 type->tp_flags &= ~Py_TPFLAGS_CHECKTYPES; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
997 type->tp_flags |= base->tp_flags & Py_TPFLAGS_CHECKTYPES; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
998 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
999 |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1000 /* Copying basicsize is connected to the GC flags */ |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1001 oldsize = PyType_BASICSIZE(base); |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1002 newsize = type->tp_basicsize ? PyType_BASICSIZE(type) : oldsize; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1003 if (!(type->tp_flags & Py_TPFLAGS_GC) && |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1004 (base->tp_flags & Py_TPFLAGS_GC) && |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1005 (type->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE/*GC slots exist*/) && |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1006 (!type->tp_traverse && !type->tp_clear)) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1007 type->tp_flags |= Py_TPFLAGS_GC; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1008 if (type->tp_traverse == NULL) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1009 type->tp_traverse = base->tp_traverse; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1010 if (type->tp_clear == NULL) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1011 type->tp_clear = base->tp_clear; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1012 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1013 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1014 if (base != &PyBaseObject_Type || |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1015 (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1016 if (type->tp_new == NULL) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1017 type->tp_new = base->tp_new; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1018 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1019 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1020 PyType_SET_BASICSIZE(type, newsize); |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1021 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1022 |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1023 static void |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1024 inherit_slots(PyTypeObject *type, PyTypeObject *base) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1025 { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1026 PyTypeObject *basebase; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1027 |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1028 #undef SLOTDEFINED |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1029 #undef COPYSLOT |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1030 #undef COPYNUM |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1031 #undef COPYSEQ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1032 #undef COPYMAP |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1033 |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1034 #define SLOTDEFINED(SLOT) \ |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1035 (base->SLOT != 0 && \ |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1036 (basebase == NULL || base->SLOT != basebase->SLOT)) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1037 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1038 #define COPYSLOT(SLOT) \ |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1039 if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1040 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1041 #define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1042 #define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1043 #define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1044 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1045 /* This won't inherit indirect slots (from tp_as_number etc.) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1046 if type doesn't provide the space. */ |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1047 |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1048 if (type->tp_as_number != NULL && base->tp_as_number != NULL) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1049 basebase = base->tp_base; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1050 if (basebase->tp_as_number == NULL) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1051 basebase = NULL; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1052 COPYNUM(nb_add); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1053 COPYNUM(nb_subtract); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1054 COPYNUM(nb_multiply); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1055 COPYNUM(nb_divide); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1056 COPYNUM(nb_remainder); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1057 COPYNUM(nb_divmod); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1058 COPYNUM(nb_power); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1059 COPYNUM(nb_negative); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1060 COPYNUM(nb_positive); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1061 COPYNUM(nb_absolute); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1062 COPYNUM(nb_nonzero); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1063 COPYNUM(nb_invert); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1064 COPYNUM(nb_lshift); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1065 COPYNUM(nb_rshift); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1066 COPYNUM(nb_and); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1067 COPYNUM(nb_xor); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1068 COPYNUM(nb_or); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1069 COPYNUM(nb_coerce); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1070 COPYNUM(nb_int); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1071 COPYNUM(nb_long); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1072 COPYNUM(nb_float); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1073 COPYNUM(nb_oct); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1074 COPYNUM(nb_hex); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1075 COPYNUM(nb_inplace_add); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1076 COPYNUM(nb_inplace_subtract); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1077 COPYNUM(nb_inplace_multiply); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1078 COPYNUM(nb_inplace_divide); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1079 COPYNUM(nb_inplace_remainder); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1080 COPYNUM(nb_inplace_power); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1081 COPYNUM(nb_inplace_lshift); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1082 COPYNUM(nb_inplace_rshift); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1083 COPYNUM(nb_inplace_and); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1084 COPYNUM(nb_inplace_xor); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1085 COPYNUM(nb_inplace_or); |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
1086 if (base->tp_flags & Py_TPFLAGS_CHECKTYPES) { |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
1087 COPYNUM(nb_true_divide); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
1088 COPYNUM(nb_floor_divide); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
1089 COPYNUM(nb_inplace_true_divide); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
1090 COPYNUM(nb_inplace_floor_divide); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
1091 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1092 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1093 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1094 if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1095 basebase = base->tp_base; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1096 if (basebase->tp_as_sequence == NULL) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1097 basebase = NULL; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1098 COPYSEQ(sq_length); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1099 COPYSEQ(sq_concat); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1100 COPYSEQ(sq_repeat); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1101 COPYSEQ(sq_item); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1102 COPYSEQ(sq_slice); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1103 COPYSEQ(sq_ass_item); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1104 COPYSEQ(sq_ass_slice); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1105 COPYSEQ(sq_contains); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1106 COPYSEQ(sq_inplace_concat); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1107 COPYSEQ(sq_inplace_repeat); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1108 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1109 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1110 if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1111 basebase = base->tp_base; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1112 if (basebase->tp_as_mapping == NULL) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1113 basebase = NULL; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1114 COPYMAP(mp_length); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1115 COPYMAP(mp_subscript); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1116 COPYMAP(mp_ass_subscript); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1117 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1118 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1119 basebase = base->tp_base; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1120 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1121 COPYSLOT(tp_itemsize); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1122 COPYSLOT(tp_dealloc); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1123 COPYSLOT(tp_print); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1124 if (type->tp_getattr == NULL && type->tp_getattro == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1125 type->tp_getattr = base->tp_getattr; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1126 type->tp_getattro = base->tp_getattro; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1127 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1128 if (type->tp_setattr == NULL && type->tp_setattro == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1129 type->tp_setattr = base->tp_setattr; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1130 type->tp_setattro = base->tp_setattro; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1131 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1132 /* tp_compare see tp_richcompare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1133 COPYSLOT(tp_repr); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1134 COPYSLOT(tp_hash); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1135 COPYSLOT(tp_call); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1136 COPYSLOT(tp_str); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1137 COPYSLOT(tp_as_buffer); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1138 COPYSLOT(tp_flags); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1139 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1140 if (type->tp_compare == NULL && type->tp_richcompare == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1141 type->tp_compare = base->tp_compare; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1142 type->tp_richcompare = base->tp_richcompare; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1143 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1144 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1145 else { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1146 COPYSLOT(tp_compare); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1147 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1148 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_WEAKREFS) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1149 COPYSLOT(tp_weaklistoffset); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1150 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1151 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_ITER) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1152 COPYSLOT(tp_iter); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1153 COPYSLOT(tp_iternext); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1154 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1155 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1156 COPYSLOT(tp_descr_get); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1157 COPYSLOT(tp_descr_set); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1158 COPYSLOT(tp_dictoffset); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1159 COPYSLOT(tp_init); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1160 COPYSLOT(tp_alloc); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1161 COPYSLOT(tp_free); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1162 } |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1163 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1164 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1165 staticforward int add_operators(PyTypeObject *); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1166 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1167 int |
|
19040
4df72ea78ae8
- Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents:
19036
diff
changeset
|
1168 PyType_Ready(PyTypeObject *type) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1169 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1170 PyObject *dict, *bases, *x; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1171 PyTypeObject *base; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1172 int i, n; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1173 |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1174 if (type->tp_flags & Py_TPFLAGS_READY) { |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1175 assert(type->tp_dict != NULL); |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1176 return 0; |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1177 } |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1178 assert((type->tp_flags & Py_TPFLAGS_READYING) == 0); |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1179 assert(type->tp_dict == NULL); |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1180 |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1181 type->tp_flags |= Py_TPFLAGS_READYING; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1182 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1183 /* Initialize tp_base (defaults to BaseObject unless that's us) */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1184 base = type->tp_base; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1185 if (base == NULL && type != &PyBaseObject_Type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1186 base = type->tp_base = &PyBaseObject_Type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1187 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1188 /* Initialize tp_bases */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1189 bases = type->tp_bases; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1190 if (bases == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1191 if (base == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1192 bases = PyTuple_New(0); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1193 else |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1194 bases = Py_BuildValue("(O)", base); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1195 if (bases == NULL) |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1196 goto error; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1197 type->tp_bases = bases; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1198 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1199 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1200 /* Initialize the base class */ |
|
19011
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1201 if (base && base->tp_dict == NULL) { |
|
19040
4df72ea78ae8
- Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents:
19036
diff
changeset
|
1202 if (PyType_Ready(base) < 0) |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1203 goto error; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1204 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1205 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1206 /* Initialize tp_defined */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1207 dict = type->tp_defined; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1208 if (dict == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1209 dict = PyDict_New(); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1210 if (dict == NULL) |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1211 goto error; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1212 type->tp_defined = dict; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1213 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1214 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1215 /* Add type-specific descriptors to tp_defined */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1216 if (add_operators(type) < 0) |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1217 goto error; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1218 if (type->tp_methods != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1219 if (add_methods(type, type->tp_methods) < 0) |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1220 goto error; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1221 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1222 if (type->tp_members != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1223 if (add_members(type, type->tp_members) < 0) |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1224 goto error; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1225 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1226 if (type->tp_getset != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1227 if (add_getset(type, type->tp_getset) < 0) |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1228 goto error; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1229 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1230 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1231 /* Temporarily make tp_dict the same object as tp_defined. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1232 (This is needed to call mro(), and can stay this way for |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1233 dynamic types). */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1234 Py_INCREF(type->tp_defined); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1235 type->tp_dict = type->tp_defined; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1236 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1237 /* Calculate method resolution order */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1238 if (mro_internal(type) < 0) { |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1239 goto error; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1240 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1241 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1242 /* Inherit special flags from dominant base */ |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1243 if (type->tp_base != NULL) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1244 inherit_special(type, type->tp_base); |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1245 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1246 /* Initialize tp_dict properly */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1247 if (!PyType_HasFeature(type, Py_TPFLAGS_DYNAMICTYPE)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1248 /* For a static type, tp_dict is the consolidation |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1249 of the tp_defined of its bases in MRO. */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1250 Py_DECREF(type->tp_dict); |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1251 type->tp_dict = PyDict_Copy(type->tp_defined); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1252 if (type->tp_dict == NULL) |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1253 goto error; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1254 bases = type->tp_mro; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1255 assert(bases != NULL); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1256 assert(PyTuple_Check(bases)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1257 n = PyTuple_GET_SIZE(bases); |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1258 for (i = 1; i < n; i++) { |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1259 base = (PyTypeObject *)PyTuple_GET_ITEM(bases, i); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1260 assert(PyType_Check(base)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1261 x = base->tp_defined; |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1262 if (x != NULL && PyDict_Merge(type->tp_dict, x, 0) < 0) |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1263 goto error; |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1264 inherit_slots(type, base); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1265 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1266 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1267 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1268 /* Some more special stuff */ |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1269 base = type->tp_base; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1270 if (base != NULL) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1271 if (type->tp_as_number == NULL) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1272 type->tp_as_number = base->tp_as_number; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1273 if (type->tp_as_sequence == NULL) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1274 type->tp_as_sequence = base->tp_as_sequence; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1275 if (type->tp_as_mapping == NULL) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1276 type->tp_as_mapping = base->tp_as_mapping; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1277 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1278 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1279 /* All done -- set the ready flag */ |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1280 assert(type->tp_dict != NULL); |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1281 type->tp_flags = |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1282 (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1283 return 0; |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1284 |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1285 error: |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1286 type->tp_flags &= ~Py_TPFLAGS_READYING; |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
1287 return -1; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1288 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1289 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1290 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1291 /* Generic wrappers for overloadable 'operators' such as __getitem__ */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1292 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1293 /* There's a wrapper *function* for each distinct function typedef used |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1294 for type object slots (e.g. binaryfunc, ternaryfunc, etc.). There's a |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1295 wrapper *table* for each distinct operation (e.g. __len__, __add__). |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1296 Most tables have only one entry; the tables for binary operators have two |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1297 entries, one regular and one with reversed arguments. */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1298 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1299 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1300 wrap_inquiry(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1301 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1302 inquiry func = (inquiry)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1303 int res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1304 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1305 if (!PyArg_ParseTuple(args, "")) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1306 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1307 res = (*func)(self); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1308 if (res == -1 && PyErr_Occurred()) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1309 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1310 return PyInt_FromLong((long)res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1311 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1312 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1313 static struct wrapperbase tab_len[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1314 {"__len__", (wrapperfunc)wrap_inquiry, "x.__len__() <==> len(x)"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1315 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1316 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1317 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1318 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1319 wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1320 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1321 binaryfunc func = (binaryfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1322 PyObject *other; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1323 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1324 if (!PyArg_ParseTuple(args, "O", &other)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1325 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1326 return (*func)(self, other); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1327 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1328 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1329 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1330 wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1331 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1332 binaryfunc func = (binaryfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1333 PyObject *other; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1334 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1335 if (!PyArg_ParseTuple(args, "O", &other)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1336 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1337 return (*func)(other, self); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1338 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1339 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1340 #undef BINARY |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1341 #define BINARY(NAME, OP) \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1342 static struct wrapperbase tab_##NAME[] = { \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1343 {"__" #NAME "__", \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1344 (wrapperfunc)wrap_binaryfunc, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1345 "x.__" #NAME "__(y) <==> " #OP}, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1346 {"__r" #NAME "__", \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1347 (wrapperfunc)wrap_binaryfunc_r, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1348 "y.__r" #NAME "__(x) <==> " #OP}, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1349 {0} \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1350 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1351 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1352 BINARY(add, "x+y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1353 BINARY(sub, "x-y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1354 BINARY(mul, "x*y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1355 BINARY(div, "x/y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1356 BINARY(mod, "x%y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1357 BINARY(divmod, "divmod(x,y)"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1358 BINARY(lshift, "x<<y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1359 BINARY(rshift, "x>>y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1360 BINARY(and, "x&y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1361 BINARY(xor, "x^y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1362 BINARY(or, "x|y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1363 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1364 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1365 wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1366 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1367 ternaryfunc func = (ternaryfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1368 PyObject *other; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1369 PyObject *third = Py_None; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1370 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1371 /* Note: This wrapper only works for __pow__() */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1372 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1373 if (!PyArg_ParseTuple(args, "O|O", &other, &third)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1374 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1375 return (*func)(self, other, third); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1376 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1377 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1378 #undef TERNARY |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1379 #define TERNARY(NAME, OP) \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1380 static struct wrapperbase tab_##NAME[] = { \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1381 {"__" #NAME "__", \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1382 (wrapperfunc)wrap_ternaryfunc, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1383 "x.__" #NAME "__(y, z) <==> " #OP}, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1384 {"__r" #NAME "__", \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1385 (wrapperfunc)wrap_ternaryfunc, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1386 "y.__r" #NAME "__(x, z) <==> " #OP}, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1387 {0} \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1388 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1389 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1390 TERNARY(pow, "(x**y) % z"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1391 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1392 #undef UNARY |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1393 #define UNARY(NAME, OP) \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1394 static struct wrapperbase tab_##NAME[] = { \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1395 {"__" #NAME "__", \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1396 (wrapperfunc)wrap_unaryfunc, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1397 "x.__" #NAME "__() <==> " #OP}, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1398 {0} \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1399 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1400 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1401 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1402 wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1403 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1404 unaryfunc func = (unaryfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1405 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1406 if (!PyArg_ParseTuple(args, "")) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1407 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1408 return (*func)(self); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1409 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1410 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1411 UNARY(neg, "-x"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1412 UNARY(pos, "+x"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1413 UNARY(abs, "abs(x)"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1414 UNARY(nonzero, "x != 0"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1415 UNARY(invert, "~x"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1416 UNARY(int, "int(x)"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1417 UNARY(long, "long(x)"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1418 UNARY(float, "float(x)"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1419 UNARY(oct, "oct(x)"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1420 UNARY(hex, "hex(x)"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1421 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1422 #undef IBINARY |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1423 #define IBINARY(NAME, OP) \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1424 static struct wrapperbase tab_##NAME[] = { \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1425 {"__" #NAME "__", \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1426 (wrapperfunc)wrap_binaryfunc, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1427 "x.__" #NAME "__(y) <==> " #OP}, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1428 {0} \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1429 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1430 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1431 IBINARY(iadd, "x+=y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1432 IBINARY(isub, "x-=y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1433 IBINARY(imul, "x*=y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1434 IBINARY(idiv, "x/=y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1435 IBINARY(imod, "x%=y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1436 IBINARY(ilshift, "x<<=y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1437 IBINARY(irshift, "x>>=y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1438 IBINARY(iand, "x&=y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1439 IBINARY(ixor, "x^=y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1440 IBINARY(ior, "x|=y"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1441 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1442 #undef ITERNARY |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1443 #define ITERNARY(NAME, OP) \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1444 static struct wrapperbase tab_##NAME[] = { \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1445 {"__" #NAME "__", \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1446 (wrapperfunc)wrap_ternaryfunc, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1447 "x.__" #NAME "__(y) <==> " #OP}, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1448 {0} \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1449 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1450 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1451 ITERNARY(ipow, "x = (x**y) % z"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1452 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1453 static struct wrapperbase tab_getitem[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1454 {"__getitem__", (wrapperfunc)wrap_binaryfunc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1455 "x.__getitem__(y) <==> x[y]"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1456 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1457 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1458 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1459 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1460 wrap_intargfunc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1461 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1462 intargfunc func = (intargfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1463 int i; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1464 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1465 if (!PyArg_ParseTuple(args, "i", &i)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1466 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1467 return (*func)(self, i); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1468 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1469 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1470 static struct wrapperbase tab_mul_int[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1471 {"__mul__", (wrapperfunc)wrap_intargfunc, "x.__mul__(n) <==> x*n"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1472 {"__rmul__", (wrapperfunc)wrap_intargfunc, "x.__rmul__(n) <==> n*x"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1473 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1474 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1475 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1476 static struct wrapperbase tab_concat[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1477 {"__add__", (wrapperfunc)wrap_binaryfunc, "x.__add__(y) <==> x+y"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1478 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1479 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1480 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1481 static struct wrapperbase tab_imul_int[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1482 {"__imul__", (wrapperfunc)wrap_intargfunc, "x.__imul__(n) <==> x*=n"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1483 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1484 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1485 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1486 static struct wrapperbase tab_getitem_int[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1487 {"__getitem__", (wrapperfunc)wrap_intargfunc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1488 "x.__getitem__(i) <==> x[i]"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1489 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1490 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1491 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1492 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1493 wrap_intintargfunc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1494 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1495 intintargfunc func = (intintargfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1496 int i, j; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1497 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1498 if (!PyArg_ParseTuple(args, "ii", &i, &j)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1499 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1500 return (*func)(self, i, j); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1501 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1502 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1503 static struct wrapperbase tab_getslice[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1504 {"__getslice__", (wrapperfunc)wrap_intintargfunc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1505 "x.__getslice__(i, j) <==> x[i:j]"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1506 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1507 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1508 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1509 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1510 wrap_intobjargproc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1511 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1512 intobjargproc func = (intobjargproc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1513 int i, res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1514 PyObject *value; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1515 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1516 if (!PyArg_ParseTuple(args, "iO", &i, &value)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1517 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1518 res = (*func)(self, i, value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1519 if (res == -1 && PyErr_Occurred()) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1520 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1521 Py_INCREF(Py_None); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1522 return Py_None; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1523 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1524 |
|
18941
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1525 static PyObject * |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1526 wrap_delitem_int(PyObject *self, PyObject *args, void *wrapped) |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1527 { |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1528 intobjargproc func = (intobjargproc)wrapped; |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1529 int i, res; |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1530 |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1531 if (!PyArg_ParseTuple(args, "i", &i)) |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1532 return NULL; |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1533 res = (*func)(self, i, NULL); |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1534 if (res == -1 && PyErr_Occurred()) |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1535 return NULL; |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1536 Py_INCREF(Py_None); |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1537 return Py_None; |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1538 } |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1539 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1540 static struct wrapperbase tab_setitem_int[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1541 {"__setitem__", (wrapperfunc)wrap_intobjargproc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1542 "x.__setitem__(i, y) <==> x[i]=y"}, |
|
18941
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1543 {"__delitem__", (wrapperfunc)wrap_delitem_int, |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1544 "x.__delitem__(y) <==> del x[y]"}, |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1545 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1546 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1547 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1548 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1549 wrap_intintobjargproc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1550 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1551 intintobjargproc func = (intintobjargproc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1552 int i, j, res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1553 PyObject *value; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1554 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1555 if (!PyArg_ParseTuple(args, "iiO", &i, &j, &value)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1556 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1557 res = (*func)(self, i, j, value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1558 if (res == -1 && PyErr_Occurred()) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1559 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1560 Py_INCREF(Py_None); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1561 return Py_None; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1562 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1563 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1564 static struct wrapperbase tab_setslice[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1565 {"__setslice__", (wrapperfunc)wrap_intintobjargproc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1566 "x.__setslice__(i, j, y) <==> x[i:j]=y"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1567 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1568 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1569 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1570 /* XXX objobjproc is a misnomer; should be objargpred */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1571 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1572 wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1573 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1574 objobjproc func = (objobjproc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1575 int res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1576 PyObject *value; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1577 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1578 if (!PyArg_ParseTuple(args, "O", &value)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1579 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1580 res = (*func)(self, value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1581 if (res == -1 && PyErr_Occurred()) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1582 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1583 return PyInt_FromLong((long)res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1584 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1585 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1586 static struct wrapperbase tab_contains[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1587 {"__contains__", (wrapperfunc)wrap_objobjproc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1588 "x.__contains__(y) <==> y in x"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1589 {0} |
| 6 | 1590 }; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1591 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1592 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1593 wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1594 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1595 objobjargproc func = (objobjargproc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1596 int res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1597 PyObject *key, *value; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1598 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1599 if (!PyArg_ParseTuple(args, "OO", &key, &value)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1600 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1601 res = (*func)(self, key, value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1602 if (res == -1 && PyErr_Occurred()) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1603 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1604 Py_INCREF(Py_None); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1605 return Py_None; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1606 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1607 |
|
18941
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1608 static PyObject * |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1609 wrap_delitem(PyObject *self, PyObject *args, void *wrapped) |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1610 { |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1611 objobjargproc func = (objobjargproc)wrapped; |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1612 int res; |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1613 PyObject *key; |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1614 |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1615 if (!PyArg_ParseTuple(args, "O", &key)) |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1616 return NULL; |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1617 res = (*func)(self, key, NULL); |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1618 if (res == -1 && PyErr_Occurred()) |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1619 return NULL; |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1620 Py_INCREF(Py_None); |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1621 return Py_None; |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1622 } |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1623 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1624 static struct wrapperbase tab_setitem[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1625 {"__setitem__", (wrapperfunc)wrap_objobjargproc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1626 "x.__setitem__(y, z) <==> x[y]=z"}, |
|
18941
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1627 {"__delitem__", (wrapperfunc)wrap_delitem, |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1628 "x.__delitem__(y) <==> del x[y]"}, |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1629 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1630 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1631 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1632 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1633 wrap_cmpfunc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1634 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1635 cmpfunc func = (cmpfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1636 int res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1637 PyObject *other; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1638 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1639 if (!PyArg_ParseTuple(args, "O", &other)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1640 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1641 res = (*func)(self, other); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1642 if (PyErr_Occurred()) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1643 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1644 return PyInt_FromLong((long)res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1645 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1646 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1647 static struct wrapperbase tab_cmp[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1648 {"__cmp__", (wrapperfunc)wrap_cmpfunc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1649 "x.__cmp__(y) <==> cmp(x,y)"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1650 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1651 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1652 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1653 static struct wrapperbase tab_repr[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1654 {"__repr__", (wrapperfunc)wrap_unaryfunc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1655 "x.__repr__() <==> repr(x)"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1656 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1657 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1658 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1659 static struct wrapperbase tab_getattr[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1660 {"__getattr__", (wrapperfunc)wrap_binaryfunc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1661 "x.__getattr__('name') <==> x.name"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1662 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1663 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1664 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1665 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1666 wrap_setattr(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1667 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1668 setattrofunc func = (setattrofunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1669 int res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1670 PyObject *name, *value; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1671 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1672 if (!PyArg_ParseTuple(args, "OO", &name, &value)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1673 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1674 res = (*func)(self, name, value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1675 if (res < 0) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1676 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1677 Py_INCREF(Py_None); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1678 return Py_None; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1679 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1680 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1681 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1682 wrap_delattr(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1683 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1684 setattrofunc func = (setattrofunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1685 int res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1686 PyObject *name; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1687 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1688 if (!PyArg_ParseTuple(args, "O", &name)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1689 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1690 res = (*func)(self, name, NULL); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1691 if (res < 0) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1692 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1693 Py_INCREF(Py_None); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1694 return Py_None; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1695 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1696 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1697 static struct wrapperbase tab_setattr[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1698 {"__setattr__", (wrapperfunc)wrap_setattr, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1699 "x.__setattr__('name', value) <==> x.name = value"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1700 {"__delattr__", (wrapperfunc)wrap_delattr, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1701 "x.__delattr__('name') <==> del x.name"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1702 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1703 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1704 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1705 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1706 wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1707 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1708 hashfunc func = (hashfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1709 long res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1710 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1711 if (!PyArg_ParseTuple(args, "")) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1712 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1713 res = (*func)(self); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1714 if (res == -1 && PyErr_Occurred()) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1715 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1716 return PyInt_FromLong(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1717 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1718 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1719 static struct wrapperbase tab_hash[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1720 {"__hash__", (wrapperfunc)wrap_hashfunc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1721 "x.__hash__() <==> hash(x)"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1722 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1723 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1724 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1725 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1726 wrap_call(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1727 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1728 ternaryfunc func = (ternaryfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1729 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1730 /* XXX What about keyword arguments? */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1731 return (*func)(self, args, NULL); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1732 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1733 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1734 static struct wrapperbase tab_call[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1735 {"__call__", (wrapperfunc)wrap_call, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1736 "x.__call__(...) <==> x(...)"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1737 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1738 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1739 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1740 static struct wrapperbase tab_str[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1741 {"__str__", (wrapperfunc)wrap_unaryfunc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1742 "x.__str__() <==> str(x)"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1743 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1744 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1745 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1746 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1747 wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1748 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1749 richcmpfunc func = (richcmpfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1750 PyObject *other; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1751 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1752 if (!PyArg_ParseTuple(args, "O", &other)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1753 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1754 return (*func)(self, other, op); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1755 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1756 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1757 #undef RICHCMP_WRAPPER |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1758 #define RICHCMP_WRAPPER(NAME, OP) \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1759 static PyObject * \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1760 richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1761 { \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1762 return wrap_richcmpfunc(self, args, wrapped, OP); \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1763 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1764 |
|
19070
39a73c6773f1
Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents:
19040
diff
changeset
|
1765 RICHCMP_WRAPPER(lt, Py_LT) |
|
39a73c6773f1
Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents:
19040
diff
changeset
|
1766 RICHCMP_WRAPPER(le, Py_LE) |
|
39a73c6773f1
Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents:
19040
diff
changeset
|
1767 RICHCMP_WRAPPER(eq, Py_EQ) |
|
39a73c6773f1
Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents:
19040
diff
changeset
|
1768 RICHCMP_WRAPPER(ne, Py_NE) |
|
39a73c6773f1
Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents:
19040
diff
changeset
|
1769 RICHCMP_WRAPPER(gt, Py_GT) |
|
39a73c6773f1
Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents:
19040
diff
changeset
|
1770 RICHCMP_WRAPPER(ge, Py_GE) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1771 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1772 #undef RICHCMP_ENTRY |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1773 #define RICHCMP_ENTRY(NAME, EXPR) \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1774 {"__" #NAME "__", (wrapperfunc)richcmp_##NAME, \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1775 "x.__" #NAME "__(y) <==> " EXPR} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1776 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1777 static struct wrapperbase tab_richcmp[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1778 RICHCMP_ENTRY(lt, "x<y"), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1779 RICHCMP_ENTRY(le, "x<=y"), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1780 RICHCMP_ENTRY(eq, "x==y"), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1781 RICHCMP_ENTRY(ne, "x!=y"), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1782 RICHCMP_ENTRY(gt, "x>y"), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1783 RICHCMP_ENTRY(ge, "x>=y"), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1784 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1785 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1786 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1787 static struct wrapperbase tab_iter[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1788 {"__iter__", (wrapperfunc)wrap_unaryfunc, "x.__iter__() <==> iter(x)"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1789 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1790 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1791 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1792 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1793 wrap_next(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1794 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1795 unaryfunc func = (unaryfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1796 PyObject *res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1797 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1798 if (!PyArg_ParseTuple(args, "")) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1799 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1800 res = (*func)(self); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1801 if (res == NULL && !PyErr_Occurred()) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1802 PyErr_SetNone(PyExc_StopIteration); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1803 return res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1804 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1805 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1806 static struct wrapperbase tab_next[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1807 {"next", (wrapperfunc)wrap_next, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1808 "x.next() -> the next value, or raise StopIteration"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1809 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1810 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1811 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1812 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1813 wrap_descr_get(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1814 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1815 descrgetfunc func = (descrgetfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1816 PyObject *obj; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1817 PyObject *type = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1818 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1819 if (!PyArg_ParseTuple(args, "O|O", &obj, &type)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1820 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1821 if (type == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1822 type = (PyObject *)obj->ob_type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1823 return (*func)(self, obj, type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1824 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1825 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1826 static struct wrapperbase tab_descr_get[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1827 {"__get__", (wrapperfunc)wrap_descr_get, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1828 "descr.__get__(obj, type) -> value"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1829 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1830 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1831 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1832 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1833 wrap_descrsetfunc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1834 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1835 descrsetfunc func = (descrsetfunc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1836 PyObject *obj, *value; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1837 int ret; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1838 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1839 if (!PyArg_ParseTuple(args, "OO", &obj, &value)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1840 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1841 ret = (*func)(self, obj, value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1842 if (ret < 0) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1843 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1844 Py_INCREF(Py_None); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1845 return Py_None; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1846 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1847 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1848 static struct wrapperbase tab_descr_set[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1849 {"__set__", (wrapperfunc)wrap_descrsetfunc, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1850 "descr.__set__(obj, value)"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1851 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1852 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1853 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1854 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1855 wrap_init(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1856 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1857 initproc func = (initproc)wrapped; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1858 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1859 /* XXX What about keyword arguments? */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1860 if (func(self, args, NULL) < 0) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1861 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1862 Py_INCREF(Py_None); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1863 return Py_None; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1864 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1865 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1866 static struct wrapperbase tab_init[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1867 {"__init__", (wrapperfunc)wrap_init, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1868 "x.__init__(...) initializes x; " |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1869 "see x.__type__.__doc__ for signature"}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1870 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1871 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1872 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1873 static PyObject * |
|
19011
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1874 tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1875 { |
|
19011
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1876 PyTypeObject *type, *subtype; |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1877 PyObject *arg0, *res; |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1878 |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1879 if (self == NULL || !PyType_Check(self)) |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1880 Py_FatalError("__new__() called with non-type 'self'"); |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1881 type = (PyTypeObject *)self; |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1882 if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) { |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1883 PyErr_SetString(PyExc_TypeError, |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1884 "T.__new__(): not enough arguments"); |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1885 return NULL; |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1886 } |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1887 arg0 = PyTuple_GET_ITEM(args, 0); |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1888 if (!PyType_Check(arg0)) { |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1889 PyErr_SetString(PyExc_TypeError, |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1890 "T.__new__(S): S is not a type object"); |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1891 return NULL; |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1892 } |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1893 subtype = (PyTypeObject *)arg0; |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1894 if (!PyType_IsSubtype(subtype, type)) { |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1895 PyErr_SetString(PyExc_TypeError, |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1896 "T.__new__(S): S is not a subtype of T"); |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1897 return NULL; |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1898 } |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1899 args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args)); |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1900 if (args == NULL) |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1901 return NULL; |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1902 res = type->tp_new(subtype, args, kwds); |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1903 Py_DECREF(args); |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1904 return res; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1905 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1906 |
|
19011
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1907 static struct PyMethodDef tp_new_methoddef[] = { |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1908 {"__new__", (PyCFunction)tp_new_wrapper, METH_KEYWORDS, |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1909 "T.__new__(S, ...) -> a new object with type S, a subtype of T"}, |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1910 {0} |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1911 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1912 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1913 static int |
|
19011
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1914 add_tp_new_wrapper(PyTypeObject *type) |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1915 { |
| 19036 | 1916 PyObject *func; |
|
19011
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1917 |
| 19036 | 1918 if (PyDict_GetItemString(type->tp_defined, "__new__") != NULL) |
| 1919 return 0; | |
| 1920 func = PyCFunction_New(tp_new_methoddef, (PyObject *)type); | |
|
19011
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1921 if (func == NULL) |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1922 return -1; |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1923 return PyDict_SetItemString(type->tp_defined, "__new__", func); |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1924 } |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1925 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1926 static int |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1927 add_wrappers(PyTypeObject *type, struct wrapperbase *wraps, void *wrapped) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1928 { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1929 PyObject *dict = type->tp_defined; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1930 |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1931 for (; wraps->name != NULL; wraps++) { |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1932 PyObject *descr; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1933 if (PyDict_GetItemString(dict, wraps->name)) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1934 continue; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1935 descr = PyDescr_NewWrapper(type, wraps, wrapped); |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1936 if (descr == NULL) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1937 return -1; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1938 if (PyDict_SetItemString(dict, wraps->name, descr) < 0) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1939 return -1; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1940 Py_DECREF(descr); |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1941 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1942 return 0; |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1943 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
1944 |
|
19040
4df72ea78ae8
- Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents:
19036
diff
changeset
|
1945 /* This function is called by PyType_Ready() to populate the type's |
| 19036 | 1946 dictionary with method descriptors for function slots. For each |
| 1947 function slot (like tp_repr) that's defined in the type, one or | |
| 1948 more corresponding descriptors are added in the type's tp_defined | |
| 1949 dictionary under the appropriate name (like __repr__). Some | |
| 1950 function slots cause more than one descriptor to be added (for | |
| 1951 example, the nb_add slot adds both __add__ and __radd__ | |
| 1952 descriptors) and some function slots compete for the same | |
| 1953 descriptor (for example both sq_item and mp_subscript generate a | |
| 1954 __getitem__ descriptor). This only adds new descriptors and | |
| 1955 doesn't overwrite entries in tp_defined that were previously | |
| 1956 defined. The descriptors contain a reference to the C function | |
| 1957 they must call, so that it's safe if they are copied into a | |
| 1958 subtype's __dict__ and the subtype has a different C function in | |
| 1959 its slot -- calling the method defined by the descriptor will call | |
| 1960 the C function that was used to create it, rather than the C | |
| 1961 function present in the slot when it is called. (This is important | |
| 1962 because a subtype may have a C function in the slot that calls the | |
| 1963 method from the dictionary, and we want to avoid infinite recursion | |
| 1964 here.) */ | |
| 1965 | |
|
19011
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
1966 static int |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1967 add_operators(PyTypeObject *type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1968 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1969 PySequenceMethods *sq; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1970 PyMappingMethods *mp; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1971 PyNumberMethods *nb; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1972 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1973 #undef ADD |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1974 #define ADD(SLOT, TABLE) \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1975 if (SLOT) { \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1976 if (add_wrappers(type, TABLE, (void *)(SLOT)) < 0) \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1977 return -1; \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1978 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1979 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1980 if ((sq = type->tp_as_sequence) != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1981 ADD(sq->sq_length, tab_len); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1982 ADD(sq->sq_concat, tab_concat); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1983 ADD(sq->sq_repeat, tab_mul_int); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1984 ADD(sq->sq_item, tab_getitem_int); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1985 ADD(sq->sq_slice, tab_getslice); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1986 ADD(sq->sq_ass_item, tab_setitem_int); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1987 ADD(sq->sq_ass_slice, tab_setslice); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1988 ADD(sq->sq_contains, tab_contains); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1989 ADD(sq->sq_inplace_concat, tab_iadd); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1990 ADD(sq->sq_inplace_repeat, tab_imul_int); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1991 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1992 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1993 if ((mp = type->tp_as_mapping) != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1994 if (sq->sq_length == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1995 ADD(mp->mp_length, tab_len); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1996 ADD(mp->mp_subscript, tab_getitem); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1997 ADD(mp->mp_ass_subscript, tab_setitem); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1998 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1999 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2000 /* We don't support "old-style numbers" because their binary |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2001 operators require that both arguments have the same type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2002 the wrappers here only work for new-style numbers. */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2003 if ((type->tp_flags & Py_TPFLAGS_CHECKTYPES) && |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2004 (nb = type->tp_as_number) != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2005 ADD(nb->nb_add, tab_add); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2006 ADD(nb->nb_subtract, tab_sub); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2007 ADD(nb->nb_multiply, tab_mul); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2008 ADD(nb->nb_divide, tab_div); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2009 ADD(nb->nb_remainder, tab_mod); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2010 ADD(nb->nb_divmod, tab_divmod); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2011 ADD(nb->nb_power, tab_pow); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2012 ADD(nb->nb_negative, tab_neg); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2013 ADD(nb->nb_positive, tab_pos); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2014 ADD(nb->nb_absolute, tab_abs); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2015 ADD(nb->nb_nonzero, tab_nonzero); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2016 ADD(nb->nb_invert, tab_invert); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2017 ADD(nb->nb_lshift, tab_lshift); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2018 ADD(nb->nb_rshift, tab_rshift); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2019 ADD(nb->nb_and, tab_and); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2020 ADD(nb->nb_xor, tab_xor); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2021 ADD(nb->nb_or, tab_or); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2022 /* We don't support coerce() -- see above comment */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2023 ADD(nb->nb_int, tab_int); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2024 ADD(nb->nb_long, tab_long); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2025 ADD(nb->nb_float, tab_float); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2026 ADD(nb->nb_oct, tab_oct); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2027 ADD(nb->nb_hex, tab_hex); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2028 ADD(nb->nb_inplace_add, tab_iadd); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2029 ADD(nb->nb_inplace_subtract, tab_isub); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2030 ADD(nb->nb_inplace_multiply, tab_imul); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2031 ADD(nb->nb_inplace_divide, tab_idiv); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2032 ADD(nb->nb_inplace_remainder, tab_imod); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2033 ADD(nb->nb_inplace_power, tab_ipow); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2034 ADD(nb->nb_inplace_lshift, tab_ilshift); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2035 ADD(nb->nb_inplace_rshift, tab_irshift); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2036 ADD(nb->nb_inplace_and, tab_iand); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2037 ADD(nb->nb_inplace_xor, tab_ixor); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2038 ADD(nb->nb_inplace_or, tab_ior); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2039 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2040 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2041 ADD(type->tp_getattro, tab_getattr); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2042 ADD(type->tp_setattro, tab_setattr); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2043 ADD(type->tp_compare, tab_cmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2044 ADD(type->tp_repr, tab_repr); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2045 ADD(type->tp_hash, tab_hash); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2046 ADD(type->tp_call, tab_call); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2047 ADD(type->tp_str, tab_str); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2048 ADD(type->tp_richcompare, tab_richcmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2049 ADD(type->tp_iter, tab_iter); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2050 ADD(type->tp_iternext, tab_next); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2051 ADD(type->tp_descr_get, tab_descr_get); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2052 ADD(type->tp_descr_set, tab_descr_set); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2053 ADD(type->tp_init, tab_init); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2054 |
| 19036 | 2055 if (type->tp_new != NULL) { |
| 2056 if (add_tp_new_wrapper(type) < 0) | |
| 2057 return -1; | |
| 2058 } | |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2059 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2060 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2061 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2062 |
| 19036 | 2063 /* Slot wrappers that call the corresponding __foo__ slot. See comments |
| 2064 below at override_slots() for more explanation. */ | |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2065 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2066 #define SLOT0(FUNCNAME, OPSTR) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2067 static PyObject * \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2068 FUNCNAME(PyObject *self) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2069 { \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2070 return PyObject_CallMethod(self, OPSTR, ""); \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2071 } |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2072 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2073 #define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2074 static PyObject * \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2075 FUNCNAME(PyObject *self, ARG1TYPE arg1) \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2076 { \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2077 return PyObject_CallMethod(self, OPSTR, ARGCODES, arg1); \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2078 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2079 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2080 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2081 #define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2082 static PyObject * \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2083 FUNCNAME(PyObject *self, PyObject *other) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2084 { \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2085 if (self->ob_type->tp_as_number != NULL && \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2086 self->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2087 PyObject *r; \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2088 r = PyObject_CallMethod( \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2089 self, OPSTR, "O", other); \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2090 if (r != Py_NotImplemented || \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2091 other->ob_type == self->ob_type) \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2092 return r; \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2093 Py_DECREF(r); \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2094 } \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2095 if (other->ob_type->tp_as_number != NULL && \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2096 other->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2097 return PyObject_CallMethod( \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2098 other, ROPSTR, "O", self); \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2099 } \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2100 Py_INCREF(Py_NotImplemented); \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2101 return Py_NotImplemented; \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2102 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2103 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2104 #define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2105 SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR) |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2106 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2107 #define SLOT2(FUNCNAME, OPSTR, ARG1TYPE, ARG2TYPE, ARGCODES) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2108 static PyObject * \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2109 FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2110 { \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2111 return PyObject_CallMethod(self, OPSTR, ARGCODES, arg1, arg2); \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2112 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2113 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2114 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2115 slot_sq_length(PyObject *self) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2116 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2117 PyObject *res = PyObject_CallMethod(self, "__len__", ""); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2118 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2119 if (res == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2120 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2121 return (int)PyInt_AsLong(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2122 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2123 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2124 SLOT1(slot_sq_concat, "__add__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2125 SLOT1(slot_sq_repeat, "__mul__", int, "i") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2126 SLOT1(slot_sq_item, "__getitem__", int, "i") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2127 SLOT2(slot_sq_slice, "__getslice__", int, int, "ii") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2128 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2129 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2130 slot_sq_ass_item(PyObject *self, int index, PyObject *value) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2131 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2132 PyObject *res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2133 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2134 if (value == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2135 res = PyObject_CallMethod(self, "__delitem__", "i", index); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2136 else |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2137 res = PyObject_CallMethod(self, "__setitem__", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2138 "iO", index, value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2139 if (res == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2140 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2141 Py_DECREF(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2142 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2143 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2144 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2145 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2146 slot_sq_ass_slice(PyObject *self, int i, int j, PyObject *value) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2147 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2148 PyObject *res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2149 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2150 if (value == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2151 res = PyObject_CallMethod(self, "__delslice__", "ii", i, j); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2152 else |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2153 res = PyObject_CallMethod(self, "__setslice__", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2154 "iiO", i, j, value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2155 if (res == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2156 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2157 Py_DECREF(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2158 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2159 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2160 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2161 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2162 slot_sq_contains(PyObject *self, PyObject *value) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2163 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2164 PyObject *res = PyObject_CallMethod(self, "__contains__", "O", value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2165 int r; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2166 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2167 if (res == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2168 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2169 r = PyInt_AsLong(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2170 Py_DECREF(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2171 return r; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2172 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2173 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2174 SLOT1(slot_sq_inplace_concat, "__iadd__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2175 SLOT1(slot_sq_inplace_repeat, "__imul__", int, "i") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2176 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2177 #define slot_mp_length slot_sq_length |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2178 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2179 SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2180 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2181 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2182 slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2183 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2184 PyObject *res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2185 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2186 if (value == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2187 res = PyObject_CallMethod(self, "__delitem__", "O", key); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2188 else |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2189 res = PyObject_CallMethod(self, "__setitem__", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2190 "OO", key, value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2191 if (res == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2192 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2193 Py_DECREF(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2194 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2195 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2196 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2197 SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2198 SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2199 SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2200 SLOT1BIN(slot_nb_divide, nb_divide, "__div__", "__rdiv__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2201 SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2202 SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2203 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2204 staticforward PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2205 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2206 SLOT1BINFULL(slot_nb_power_binary, slot_nb_power, |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2207 nb_power, "__pow__", "__rpow__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2208 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2209 static PyObject * |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2210 slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus) |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2211 { |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2212 if (modulus == Py_None) |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2213 return slot_nb_power_binary(self, other); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2214 /* Three-arg power doesn't use __rpow__ */ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2215 return PyObject_CallMethod(self, "__pow__", "OO", other, modulus); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2216 } |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2217 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2218 SLOT0(slot_nb_negative, "__neg__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2219 SLOT0(slot_nb_positive, "__pos__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2220 SLOT0(slot_nb_absolute, "__abs__") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2221 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2222 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2223 slot_nb_nonzero(PyObject *self) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2224 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2225 PyObject *res = PyObject_CallMethod(self, "__nonzero__", ""); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2226 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2227 if (res == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2228 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2229 return (int)PyInt_AsLong(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2230 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2231 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2232 SLOT0(slot_nb_invert, "__invert__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2233 SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2234 SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2235 SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2236 SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2237 SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2238 /* Not coerce() */ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2239 SLOT0(slot_nb_int, "__int__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2240 SLOT0(slot_nb_long, "__long__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2241 SLOT0(slot_nb_float, "__float__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2242 SLOT0(slot_nb_oct, "__oct__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2243 SLOT0(slot_nb_hex, "__hex__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2244 SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2245 SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2246 SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2247 SLOT1(slot_nb_inplace_divide, "__idiv__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2248 SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2249 SLOT2(slot_nb_inplace_power, "__ipow__", PyObject *, PyObject *, "OO") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2250 SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2251 SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2252 SLOT1(slot_nb_inplace_and, "__iand__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2253 SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2254 SLOT1(slot_nb_inplace_or, "__ior__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2255 SLOT1BIN(slot_nb_floor_divide, nb_floor_divide, |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2256 "__floordiv__", "__rfloordiv__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2257 SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2258 SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2259 SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *, "O") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2260 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2261 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2262 slot_tp_compare(PyObject *self, PyObject *other) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2263 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2264 PyObject *res = PyObject_CallMethod(self, "__cmp__", "O", other); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2265 long r; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2266 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2267 if (res == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2268 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2269 r = PyInt_AsLong(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2270 Py_DECREF(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2271 return (int)r; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2272 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2273 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2274 SLOT0(slot_tp_repr, "__repr__") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2275 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2276 static long |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2277 slot_tp_hash(PyObject *self) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2278 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2279 PyObject *res = PyObject_CallMethod(self, "__hash__", ""); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2280 long h; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2281 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2282 if (res == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2283 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2284 h = PyInt_AsLong(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2285 if (h == -1 && !PyErr_Occurred()) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2286 h = -2; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2287 return h; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2288 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2289 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2290 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2291 slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2292 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2293 PyObject *meth = PyObject_GetAttrString(self, "__call__"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2294 PyObject *res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2295 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2296 if (meth == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2297 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2298 res = PyObject_Call(meth, args, kwds); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2299 Py_DECREF(meth); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2300 return res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2301 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2302 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2303 SLOT0(slot_tp_str, "__str__") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2304 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2305 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2306 slot_tp_getattro(PyObject *self, PyObject *name) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2307 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2308 PyTypeObject *tp = self->ob_type; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2309 PyObject *dict = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2310 PyObject *getattr; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2311 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2312 if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2313 dict = tp->tp_dict; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2314 if (dict == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2315 PyErr_Format(PyExc_SystemError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2316 "'%.100s' type object has no __dict__???", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2317 tp->tp_name); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2318 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2319 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2320 getattr = PyDict_GetItemString(dict, "__getattr__"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2321 if (getattr == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2322 PyErr_SetString(PyExc_AttributeError, "__getattr__"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2323 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2324 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2325 return PyObject_CallFunction(getattr, "OO", self, name); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2326 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2327 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2328 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2329 slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2330 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2331 PyObject *res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2332 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2333 if (value == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2334 res = PyObject_CallMethod(self, "__delattr__", "O", name); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2335 else |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2336 res = PyObject_CallMethod(self, "__setattr__", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2337 "OO", name, value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2338 if (res == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2339 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2340 Py_DECREF(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2341 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2342 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2343 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2344 /* Map rich comparison operators to their __xx__ namesakes */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2345 static char *name_op[] = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2346 "__lt__", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2347 "__le__", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2348 "__eq__", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2349 "__ne__", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2350 "__gt__", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2351 "__ge__", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2352 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2353 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2354 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2355 slot_tp_richcompare(PyObject *self, PyObject *other, int op) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2356 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2357 PyObject *meth = PyObject_GetAttrString(self, name_op[op]); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2358 PyObject *res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2359 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2360 if (meth == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2361 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2362 res = PyObject_CallFunction(meth, "O", other); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2363 Py_DECREF(meth); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2364 return res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2365 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2366 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2367 SLOT0(slot_tp_iter, "__iter__") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2368 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2369 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2370 slot_tp_iternext(PyObject *self) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2371 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2372 return PyObject_CallMethod(self, "next", ""); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2373 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2374 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2375 SLOT2(slot_tp_descr_get, "__get__", PyObject *, PyObject *, "OO") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2376 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2377 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2378 slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2379 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2380 PyObject *res = PyObject_CallMethod(self, "__set__", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2381 "OO", target, value); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2382 if (res == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2383 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2384 Py_DECREF(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2385 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2386 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2387 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2388 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2389 slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2390 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2391 PyObject *meth = PyObject_GetAttrString(self, "__init__"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2392 PyObject *res; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2393 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2394 if (meth == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2395 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2396 res = PyObject_Call(meth, args, kwds); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2397 Py_DECREF(meth); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2398 if (res == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2399 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2400 Py_DECREF(res); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2401 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2402 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2403 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2404 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2405 slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2406 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2407 PyObject *func = PyObject_GetAttrString((PyObject *)type, "__new__"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2408 PyObject *newargs, *x; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2409 int i, n; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2410 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2411 if (func == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2412 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2413 assert(PyTuple_Check(args)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2414 n = PyTuple_GET_SIZE(args); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2415 newargs = PyTuple_New(n+1); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2416 if (newargs == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2417 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2418 Py_INCREF(type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2419 PyTuple_SET_ITEM(newargs, 0, (PyObject *)type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2420 for (i = 0; i < n; i++) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2421 x = PyTuple_GET_ITEM(args, i); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2422 Py_INCREF(x); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2423 PyTuple_SET_ITEM(newargs, i+1, x); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2424 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2425 x = PyObject_Call(func, newargs, kwds); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2426 Py_DECREF(func); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2427 return x; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2428 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2429 |
| 19036 | 2430 /* This is called at the very end of type_new() (even after |
|
19040
4df72ea78ae8
- Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents:
19036
diff
changeset
|
2431 PyType_Ready()) to complete the initialization of dynamic types. |
| 19036 | 2432 The dict argument is the dictionary argument passed to type_new(), |
| 2433 which is the local namespace of the class statement, in other | |
| 2434 words, it contains the methods. For each special method (like | |
| 2435 __repr__) defined in the dictionary, the corresponding function | |
| 2436 slot in the type object (like tp_repr) is set to a special function | |
| 2437 whose name is 'slot_' followed by the slot name and whose signature | |
| 2438 is whatever is required for that slot. These slot functions look | |
| 2439 up the corresponding method in the type's dictionary and call it. | |
| 2440 The slot functions have to take care of the various peculiarities | |
| 2441 of the mapping between slots and special methods, such as mapping | |
| 2442 one slot to multiple methods (tp_richcompare <--> __le__, __lt__ | |
| 2443 etc.) or mapping multiple slots to a single method (sq_item, | |
| 2444 mp_subscript <--> __getitem__). */ | |
| 2445 | |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2446 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2447 override_slots(PyTypeObject *type, PyObject *dict) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2448 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2449 PySequenceMethods *sq = type->tp_as_sequence; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2450 PyMappingMethods *mp = type->tp_as_mapping; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2451 PyNumberMethods *nb = type->tp_as_number; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2452 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2453 #define SQSLOT(OPNAME, SLOTNAME, FUNCNAME) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2454 if (PyDict_GetItemString(dict, OPNAME)) { \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2455 sq->SLOTNAME = FUNCNAME; \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2456 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2457 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2458 #define MPSLOT(OPNAME, SLOTNAME, FUNCNAME) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2459 if (PyDict_GetItemString(dict, OPNAME)) { \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2460 mp->SLOTNAME = FUNCNAME; \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2461 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2462 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2463 #define NBSLOT(OPNAME, SLOTNAME, FUNCNAME) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2464 if (PyDict_GetItemString(dict, OPNAME)) { \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2465 nb->SLOTNAME = FUNCNAME; \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2466 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2467 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2468 #define TPSLOT(OPNAME, SLOTNAME, FUNCNAME) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2469 if (PyDict_GetItemString(dict, OPNAME)) { \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2470 type->SLOTNAME = FUNCNAME; \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2471 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2472 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2473 SQSLOT("__len__", sq_length, slot_sq_length); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2474 SQSLOT("__add__", sq_concat, slot_sq_concat); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2475 SQSLOT("__mul__", sq_repeat, slot_sq_repeat); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2476 SQSLOT("__getitem__", sq_item, slot_sq_item); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2477 SQSLOT("__getslice__", sq_slice, slot_sq_slice); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2478 SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2479 SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2480 SQSLOT("__setslice__", sq_ass_slice, slot_sq_ass_slice); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2481 SQSLOT("__delslice__", sq_ass_slice, slot_sq_ass_slice); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2482 SQSLOT("__contains__", sq_contains, slot_sq_contains); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2483 SQSLOT("__iadd__", sq_inplace_concat, slot_sq_inplace_concat); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2484 SQSLOT("__imul__", sq_inplace_repeat, slot_sq_inplace_repeat); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2485 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2486 MPSLOT("__len__", mp_length, slot_mp_length); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2487 MPSLOT("__getitem__", mp_subscript, slot_mp_subscript); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2488 MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2489 MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2490 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2491 NBSLOT("__add__", nb_add, slot_nb_add); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2492 NBSLOT("__sub__", nb_subtract, slot_nb_subtract); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2493 NBSLOT("__mul__", nb_multiply, slot_nb_multiply); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2494 NBSLOT("__div__", nb_divide, slot_nb_divide); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2495 NBSLOT("__mod__", nb_remainder, slot_nb_remainder); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2496 NBSLOT("__divmod__", nb_divmod, slot_nb_divmod); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2497 NBSLOT("__pow__", nb_power, slot_nb_power); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2498 NBSLOT("__neg__", nb_negative, slot_nb_negative); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2499 NBSLOT("__pos__", nb_positive, slot_nb_positive); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2500 NBSLOT("__abs__", nb_absolute, slot_nb_absolute); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2501 NBSLOT("__nonzero__", nb_nonzero, slot_nb_nonzero); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2502 NBSLOT("__invert__", nb_invert, slot_nb_invert); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2503 NBSLOT("__lshift__", nb_lshift, slot_nb_lshift); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2504 NBSLOT("__rshift__", nb_rshift, slot_nb_rshift); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2505 NBSLOT("__and__", nb_and, slot_nb_and); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2506 NBSLOT("__xor__", nb_xor, slot_nb_xor); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2507 NBSLOT("__or__", nb_or, slot_nb_or); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2508 /* Not coerce() */ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2509 NBSLOT("__int__", nb_int, slot_nb_int); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2510 NBSLOT("__long__", nb_long, slot_nb_long); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2511 NBSLOT("__float__", nb_float, slot_nb_float); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2512 NBSLOT("__oct__", nb_oct, slot_nb_oct); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2513 NBSLOT("__hex__", nb_hex, slot_nb_hex); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2514 NBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2515 NBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2516 NBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2517 NBSLOT("__idiv__", nb_inplace_divide, slot_nb_inplace_divide); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2518 NBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2519 NBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2520 NBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2521 NBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2522 NBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2523 NBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2524 NBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2525 NBSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2526 NBSLOT("__truediv__", nb_true_divide, slot_nb_true_divide); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2527 NBSLOT("__ifloordiv__", nb_inplace_floor_divide, |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2528 slot_nb_inplace_floor_divide); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2529 NBSLOT("__itruediv__", nb_inplace_true_divide, |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2530 slot_nb_inplace_true_divide); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2531 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2532 if (PyDict_GetItemString(dict, "__str__") || |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2533 PyDict_GetItemString(dict, "__repr__")) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2534 type->tp_print = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2535 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2536 TPSLOT("__cmp__", tp_compare, slot_tp_compare); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2537 TPSLOT("__repr__", tp_repr, slot_tp_repr); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2538 TPSLOT("__hash__", tp_hash, slot_tp_hash); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2539 TPSLOT("__call__", tp_call, slot_tp_call); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2540 TPSLOT("__str__", tp_str, slot_tp_str); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2541 TPSLOT("__getattr__", tp_getattro, slot_tp_getattro); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2542 TPSLOT("__setattr__", tp_setattro, slot_tp_setattro); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2543 TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2544 TPSLOT("__le__", tp_richcompare, slot_tp_richcompare); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2545 TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2546 TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2547 TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2548 TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2549 TPSLOT("__iter__", tp_iter, slot_tp_iter); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2550 TPSLOT("next", tp_iternext, slot_tp_iternext); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2551 TPSLOT("__get__", tp_descr_get, slot_tp_descr_get); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2552 TPSLOT("__set__", tp_descr_set, slot_tp_descr_set); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2553 TPSLOT("__init__", tp_init, slot_tp_init); |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
2554 TPSLOT("__new__", tp_new, slot_tp_new); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2555 } |
